stimfit-0.15.8/0000775000175000017500000000000013315356572010301 500000000000000stimfit-0.15.8/src/0000775000175000017500000000000013315356572011070 500000000000000stimfit-0.15.8/src/libstfnum/0000775000175000017500000000000013315356572013073 500000000000000stimfit-0.15.8/src/libstfnum/measure.h0000775000175000017500000002201013062445067014620 00000000000000// Header file for the stimfit namespace // Routines for measuring basic event properties // last revision: 24-Jan-2011 // C. Schmidt-Hieber, christsc@gmx.de // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file measure.h * \author Christoph Schmidt-Hieber, Peter Jonas * \date 2011-01-24 * \brief Functions for measuring kinetics of events within waveforms. * * * For an example how to use these functions, see Recording::Measure(). */ #ifndef _MEASLIB_H #define _MEASLIB_H #include #include "../libstfio/stfio.h" namespace stfnum { /*! \addtogroup stfgen * @{ */ //! Calculate the average of all sampling points between and including \e llb and \e ulb. /*! \param method: 0: mean and s.d.; 1: median * \param var Will contain the variance on exit (only when method=0). * \param data The data waveform to be analysed. * \param llb Averaging will be started at this index. * \param ulb Index of the last data point included in the average (legacy of the PASCAL version). * \param llp Lower limit of the peak window (see stfnum::peak()). * \param ulp Upper limit of the peak window (see stfnum::peak()). * \return The baseline value - either the mean or the median depending on method. */ StfioDll double base(enum stfnum::baseline_method method, double& var, const std::vector& data, std::size_t llb, std::size_t ulb); //! Find the peak value of \e data between \e llp and \e ulp. /*! Note that peaks will be detected by measuring from \e base, but the return value * is given from 0. Data points at both \e llp and \e ulp will be included in the search * (legacy of Stimfit for PASCAL). * \param data The data waveform to be analysed. * \param base The baseline value. * \param llp Lower limit of the peak window. * \param ulp Upper limit of the peak window. * \param pM If \e pM > 1, a sliding (boxcar) average of width \e pM will be used * to measure the peak. * \param dir Can be \n * stfnum::up for positive-going peaks, \n * stfnum::down for negative-going peaks or \n * stfnum::both for negative- or positive-going peaks, whichever is larger. * \param maxT On exit, the index of the peak value. May be interpolated if \e pM > 1. * \return The peak value, measured from 0. */ StfioDll double peak( const std::vector& data, double base, std::size_t llp, std::size_t ulp, int pM, stfnum::direction, double& maxT); //! Find the value within \e data between \e llp and \e ulp at which \e slope is exceeded. /*! \param data The data waveform to be analysed. * \param llp Lower limit of the peak window. * \param ulp Upper limit of the peak window. * \param thrT On exit, The interpolated time point of the threshold crossing * in units of sampling points, or a negative value if the threshold wasn't found. * \param windowLength is the distance (in number of samples) used to compute the difference, the default value is 1. * \return The interpolated threshold value. */ StfioDll double threshold( const std::vector& data, std::size_t llp, std::size_t ulp, double slope, double& thrT, std::size_t windowLength ); //! Find 20 to 80% rise time of an event in \e data. /*! Although t80real is not explicitly returned, it can be calculated * from t20Real+risetime. * \param data The data waveform to be analysed. * \param base The baseline value. * \param ampl The amplitude of the event (typically, peak-base). * \param left Delimits the search to the left. * \param right Delimits the search to the right. * \param t20Id On exit, the index wich is closest to the 20%-point. * \param t80Id On exit, the index wich is closest to the 80%-point. * \param t20Real the linearly interpolated 20%-timepoint in * units of sampling points. * \return The rise time. */ StfioDll double risetime(const std::vector& data, double base, double ampl, double left, double right, double frac, std::size_t& tLoId, std::size_t& tHiId, double& tLoReal); //! Find 20 to 80% rise time of an event in \e data. /*! Although t80real is not explicitly returned, it can be calculated * from t20Real+risetime. * \param data The data waveform to be analysed. * \param base The baseline value. * \param ampl The amplitude of the event (typically, peak-base). * \param left Delimits the search to the left. * \param right Delimits the search to the right. * \param innerTLoReal interpolated starting point of the inner risetime * \param innerTHiReal interpolated end point of the inner risetime * \param outerTLoReal interpolated starting point of the outer risetime * \param outerTHiReal interpolated end point of the outer risetime the inner rise time is (innerTHiReal-innerTLoReal), the outer rise time is (outerTHiReal-outerTLoReal), in case of noise free data, inner and outer rise time are the same. * \return The inner rise time. */ StfioDll double risetime2(const std::vector& data, double base, double ampl, double left, double right, double frac, double& innerTLoReal, double& innerTHiReal, double& outerTLoReal, double& outerTHiReal ); //! Find the full width at half-maximal amplitude of an event within \e data. /*! Although t50RightReal is not explicitly returned, it can be calculated * from t50LeftReal+t_half. * \param data The data waveform to be analysed. * \param base The baseline value. * \param ampl The amplitude of the event (typically, peak-base). * \param left Delimits the search to the left. * \param right Delimits the search to the right. * \param center The estimated center of an event from which to start * searching to the left and to the right (typically, the index * of the peak). * \param t50LeftId On exit, the index wich is closest to the left 50%-point. * \param t50RightId On exit, the index wich is closest to the right 50%-point. * \param t50LeftReal the linearly interpolated left 50%-timepoint in * units of sampling points. * \return The full width at half-maximal amplitude. */ StfioDll double t_half( const std::vector& data, double base, double ampl, double left, double right, double center, std::size_t& t50LeftId, std::size_t& t50RightId, double& t50LeftReal ); //! Find the maximal slope during the rising phase of an event within \e data. /*! \param data The data waveform to be analysed. * \param left Delimits the search to the left. * \param right Delimits the search to the right. * \param maxRiseT The interpolated time point of the maximal slope of rise * in units of sampling points. * \param maxRiseY The interpolated value of \e data at \e maxRiseT. * \param windowLength is the distance (in number of samples) used to compute the slope, the default value is 1. * \return The maximal slope during the rising phase. */ StfioDll double maxRise( const std::vector& data, double left, double right, double& maxRiseT, double& maxRiseY, std::size_t windowLength); //! Find the maximal slope during the decaying phase of an event within \e data. /*! \param data The data waveform to be analysed. * \param left Delimits the search to the left. * \param right Delimits the search to the right. * \param maxDecayT The interpolated time point of the maximal slope of decay * in units of sampling points. * \param maxDecayY The interpolated value of \e data at \e maxDecayT. * \param windowLength is the distance (in number of samples) used to compute the slope, the default value is 1. * \return The maximal slope during the decaying phase. */ StfioDll double maxDecay( const std::vector& data, double left, double right, double& maxDecayT, double& maxDecayY, std::size_t windowLength); #ifdef WITH_PSLOPE //! Find the slope an event within \e data. /*! \param data The data waveform to be analysed. * \param left delimits the search to the left. * \param right delimits the search to the right. * \return The slope during the limits defined in left and right. */ double pslope( const std::vector& data, std::size_t left, std::size_t right); #endif /*@}*/ } #endif stimfit-0.15.8/src/libstfnum/Makefile.am0000664000175000017500000000124313062445067015044 00000000000000if BUILD_MODULE if ISDARWIN PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} else PYTHON_TARGET_DIR=${PYTHON_PRE_DIST_PKG} # PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} endif PYTHON_DEST_DIR=${DESTDIR}${PYTHON_TARGET_DIR} pkglibdir = ${PYTHON_TARGET_DIR}/stfio endif pkglib_LTLIBRARIES = libstfnum.la libstfnum_la_SOURCES = ./fit.cpp \ ./levmar/lm.c ./levmar/Axb.c ./levmar/misc.c ./levmar/lmlec.c ./levmar/lmbc.c \ ./funclib.cpp ./stfnum.cpp ./measure.cpp libstfnum_la_LDFLAGS = $(LIBLAPACK_LDFLAGS) libstfnum_la_LIBADD = $(LIBSTF_LDFLAGS) -lfftw3 if ISDARWIN # don't install anything because it has to go into the app bundle if !BUILD_MODULE install: endif endif stimfit-0.15.8/src/libstfnum/measure.cpp0000664000175000017500000004042713062445067015164 00000000000000// Routines for measuring basic event properties // last revision: 24-Jan-2011 // C. Schmidt-Hieber, christsc@gmx.de // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file measlib.cpp * \author Christoph Schmidt-Hieber, Peter Jonas * \date 2011-01-24 * \brief Functions for measuring kinetics of events within waveforms. * * * For an example how to use these functions, see Recording::Measure(). */ #include #ifdef _OPENMP #include #endif #include "./stfnum.h" #include "./measure.h" int compareDouble(const void *a, const void *b) { return ( ( *(double*)a > *(double*)b ) - ( *(double*)a < *(double*)b ) ); } double stfnum::base(enum stfnum::baseline_method base_method, double& var, const std::vector& data, std::size_t llb, std::size_t ulb) { if (data.size()==0) return 0; if (llb>ulb || ulb>=data.size()) { return NAN; } size_t n = ulb - llb + 1; double base; assert(n > 0); assert(n <= data.size()); if (base_method == stfnum::median_iqr) { // make copy of the data for sorting double *a = (double*)malloc(n * sizeof(double)); for (size_t i = 0; i < n; ++i) { a[i] = data[i + llb]; } qsort(a,n,sizeof(double),&compareDouble); // get the median if (n % 2) base = a[(n-1)/2]; else { n /=2; base = (a[n-1] + a[n]) / 2; } /* * compute inter-quartile range (IQR) and return in "var" * interpolate as average of upper and lower bound * and make sure that indices are within [0,n-1] interval */ double Q32 = a[std::min((long)(n-1), (long)ceil(3*n/4.0-1))] + a[std::max(0l, (long)floor(3*n/4.0-1))]; double Q12 = a[std::min((long)(n-1), (long)ceil( n/4.0-1))] + a[std::max(0l, (long)floor( n/4.0-1))]; var = (Q32 - Q12) / 2; free(a); return base; } // else if (method == mean_baseline) double sumY=0.0; //according to the pascal version, every value //within the window shall be summed up: #ifdef _OPENMP #pragma omp parallel for reduction(+:sumY) #endif for (int i=(int)llb; i<=(int)ulb;++i) { sumY+=data[i]; } base=sumY/n; // second pass to calculate the variance: double varS=0.0; double corr=0.0; #ifdef _OPENMP #pragma omp parallel for reduction(+:varS,corr) #endif for (int i=(int)llb; i<=(int)ulb;++i) { double diff=data[i]-base; varS+=diff*diff; // correct for floating point inaccuracies: corr+=diff; } corr=(corr*corr)/n; var = (varS-corr)/(n-1); return base; } double stfnum::peak(const std::vector& data, double base, std::size_t llp, std::size_t ulp, int pM, stfnum::direction dir, double& maxT) { if (llp>ulp || ulp>=data.size()) { maxT = NAN; return NAN; } double max=data[llp]; maxT=(double)llp; double peak=0.0; if (pM > 0) { for (std::size_t i=llp+1; i <=ulp; i++) { //Calculate peak as the average over pM points around the point i peak=0.0; div_t Div1=div((int)pM-1, 2); int counter = 0; int start = i-Div1.quot; if (start < 0) start = 0; for (counter=start; counter <= start+pM-1 && counter < (int)data.size(); counter++) peak+=data[counter]; peak /= (counter-start); //Set peak for BOTH if (dir == stfnum::both && fabs(peak-base) > fabs (max-base)) { max = peak; maxT = (double)i; } //Set peak for UP if (dir == stfnum::up && peak-base > max-base) { max = peak; maxT = (double)i; } //Set peak for DOWN if (dir == stfnum::down && peak-base < max-base) { max = peak; maxT = (double)i; } } //End loop: data points peak = max; //End peak and base calculation //------------------------------- } else { if (pM==-1) { // calculate the average within the peak window double sumY=0; #ifdef _OPENMP #pragma omp parallel for reduction(+:sumY) #endif for (int i=(int)llp; i<=(int)ulp;++i) { sumY+=data[i]; } int n=(int)(ulp-llp+1); peak=sumY/n; maxT=(double)((llp+ulp)/2.0); } else { maxT = NAN; peak = NAN; } } return peak; } double stfnum::threshold( const std::vector& data, std::size_t llp, std::size_t ulp, double slope, double& thrT, std::size_t windowLength ) { thrT = -1; if (data.size()==0) return 0.0; // lower limit peak (ulb) has to be zero at least // upper limit peak (ulb) has to be < data.size()-windowLength (data[i+windowLength] will be used) if (llp > ulp || ulp >= data.size()) { thrT = NAN; return NAN; } if (ulp + windowLength > data.size()) { thrT = NAN; return NAN; } double threshold = 0.0; // find Slope within peak window: for (std::size_t i=llp; i < ulp; ++i) { double diff = data[i + windowLength] - data[i]; if (diff > slope * windowLength) { threshold=(data[i+windowLength] + data[i]) / 2.0; thrT = i + windowLength/2.0; break; } } return threshold; } double stfnum::risetime(const std::vector& data, double base, double ampl, double left, double right, double frac, std::size_t& tLoId, std::size_t& tHiId, double& tLoReal) { if (frac <= 0 || frac >=0.5) { tLoReal = NAN; return NAN; } double lo = frac; double hi = 1.0-frac; //Lo%of peak if (right<0 || left<0 || right>=data.size()) { tLoReal = NAN; return NAN; } tLoId=(int)right>=1? (int)right:1; do { --tLoId; } while (fabs(data[tLoId]-base)>fabs(lo*ampl) && tLoId>left); //Hi%of peak tHiId=tLoId; do { ++tHiId; } while (fabs(data[tHiId]-base)& data, double base, double ampl, double left, double right, double frac, double& innerTLoReal, double& innerTHiReal, double& outerTLoReal, double& outerTHiReal ) { if (frac <= 0 || frac >=0.5) { innerTLoReal = NAN; innerTHiReal = NAN; outerTLoReal = NAN; outerTHiReal = NAN; return NAN; } #define NDEBUG #ifndef NDEBUG fprintf(stdout,"%s %i:RISETIME2\n",__FILE__,__LINE__); #endif double lo = frac; double hi = 1.0-frac; /* outer_tLoId first index from left which is above lo*ampl outer_tHiId last index from left which is below hi*ampl inner_tLoId last index from left which is below lo*ampl inner_tHiId first index from left which is above hi*ampl Note: in noise free case (outer_tHiId==inner_tHiId-1) and (outer_tLoId==inner_tLoId+1) are true. */ long outer_tLoId=-1, outer_tHiId=-1, inner_tLoId=-1, inner_tHiId=-1; long k; //Lo%of peak if (right<0 || left<0 || right>=data.size()) { innerTLoReal = NAN; innerTHiReal = NAN; outerTLoReal = NAN; outerTHiReal = NAN; return NAN; } #ifndef NDEBUG fprintf(stdout,"%s %i:RISETIME2\n",__FILE__,__LINE__); #endif for (k=(long)left; k<=(long)right; k++) { double v = fabs(data[k]-base); if (v < fabs(lo*ampl)) inner_tLoId = k; if (v < fabs(hi*ampl)) outer_tHiId = k; } #ifndef NDEBUG fprintf(stdout,"%s %i:RISETIME2 r:%f l:%f \n",__FILE__,__LINE__,right,left); #endif for (k=(long)right; k>=(long)left; k--) { double v = fabs(data[k]-base); if (v > fabs(lo*ampl)) outer_tLoId = k; if (v > fabs(hi*ampl)) inner_tHiId = k; } #ifndef NDEBUG fprintf(stdout,"%s %i:RISETIME2: %i %i %i %i\n",__FILE__,__LINE__,(int)outer_tLoId,(int)inner_tLoId,(int)inner_tHiId,(int)outer_tHiId); #endif //*** Inner Risetime ***/ if (inner_tLoId < 0) innerTLoReal = NAN; else { double yLong2 = data[inner_tLoId+1]; double yLong1 = data[inner_tLoId]; if (yLong2-yLong1 != 0) innerTLoReal = inner_tLoId + fabs((lo*ampl+base-yLong1)/(yLong2-yLong1)); else innerTLoReal=(double)inner_tLoId; } //Hi%of peak if (inner_tHiId < 1) innerTHiReal = NAN; else { double yLong2 = data[inner_tHiId]; double yLong1 = data[inner_tHiId-1]; if (yLong2 - yLong1 != 0) innerTHiReal = inner_tHiId - fabs(((yLong2-base)-hi*ampl)/(yLong2-yLong1)); else innerTHiReal=(double)inner_tHiId; } #ifndef NDEBUG fprintf(stdout,"%s %i:RISETIME2 %f %s\n",__FILE__,__LINE__,innerTHiReal-innerTLoReal,innerTHiReal& data, double base, double ampl, double left, double right, double center, std::size_t& t50LeftId, std::size_t& t50RightId, double& t50LeftReal) { if (center<0 || center>=data.size() || data.size()<=2 || left<-1) { t50LeftReal = NAN; return NAN; } t50LeftId=(int)center>=1? (int)center:1; if (t50LeftId-1 >= data.size()) { #ifndef NDEBUG std::cout << "t50LeftId-1 >= data.size()" << t50LeftId-1 << " " << data.size() << std::endl; #endif return NAN; } do { --t50LeftId; } while (fabs(data[t50LeftId]-base)>fabs(0.5 * ampl) && t50LeftId > left); //Right side half duration if ((std::size_t)center <= data.size()-2) { t50RightId = center; } else { t50RightId = data.size() >= 2? data.size()-2 : 0; } if (right >= data.size() || t50RightId+1 >= data.size()) { #ifndef NDEBUG std::cout << "right, data.size(), t50RightId+1 " << right << " " << data.size() << " " << t50RightId+1 << std::endl; #endif return NAN; } do { ++t50RightId; } while (fabs(data[t50RightId]-base)>fabs(0.5 * ampl) && t50RightId < right); //calculation of real values by linear interpolation: //Left side double yLong2=data[t50LeftId+1]; double yLong1=data[t50LeftId]; if (yLong2-yLong1 !=0) { t50LeftReal=(double)(t50LeftId+ fabs((0.5*ampl-(yLong1-base))/(yLong2-yLong1))); } else { t50LeftReal=(double)t50LeftId; } //Right side yLong2=data[t50RightId]; yLong1=data[t50RightId-1]; double t50RightReal=0.0; if (yLong2-yLong1 !=0) { t50RightReal=(double)(t50RightId- fabs((0.5*ampl-(yLong2-base))/fabs(yLong2-yLong1))); } else { t50RightReal=(double)t50RightId; } return t50RightReal-t50LeftReal; } double stfnum::maxRise(const std::vector& data, double left, double right, double& maxRiseT, double& maxRiseY, std::size_t windowLength) { size_t rightc = lround(right); size_t leftc = lround(left); if (leftc >= data.size()-windowLength) { leftc = data.size()-windowLength-1; } if (rightc >= data.size() || data.size() < windowLength) { maxRiseY = NAN; maxRiseT = NAN; return NAN; } double maxRise = -INFINITY; // -Infinity maxRiseT = NAN; // non-a-number size_t i,j; for (i = leftc, j = leftc + windowLength; j <= rightc; i++, j++) { double diff = fabs( data[i] - data[j] ); if (maxRise& data, double left, double right, double& maxDecayT, double& maxDecayY, std::size_t windowLength) { size_t rightc = lround(right); size_t leftc = lround(left); if (leftc >= data.size()-windowLength) { leftc = data.size()-windowLength-1; } if (rightc >= data.size() || data.size() < windowLength) { maxDecayT = NAN; maxDecayY = NAN; return NAN; } double maxDecay = -INFINITY; // -Infinity maxDecayT = NAN; // non-a-number size_t i,j; for (j = leftc, i = leftc + windowLength; i < rightc; i++, j++) { double diff = fabs( data[i] - data[j] ); if (maxDecay& data, std::size_t left, std::size_t right) { // data testing not zero //if (!data.size()) return 0; if (data.size()==0) return 0; // cursor testing out of bounds if (left>right || right>data.size()) { return NAN; } // use interpolated data double y2 = ( data[right]+data[right+1] )/(double)2.0; double y1 = ( data[left]+data[left+1] )/(double)2.0; double t2 = (double)(right-0.5); double t1 = (double)(left-0.5); double SlopeVal = (y2-y1)/(t2-t1); return SlopeVal; } #endif // WITH_PSLOPE stimfit-0.15.8/src/libstfnum/stfnum.cpp0000775000175000017500000007360413062445067015045 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // core.cpp // Some definitions of functions declared in the stfnum:: namespace // last revision: 07-23-2006 // C. Schmidt-Hieber #include #include #include #include "stfnum.h" #include "fit.h" #include "funclib.h" int isnan(double x) { return x != x; } int isinf(double x) { return !isnan(x) && isnan(x - x); } stfnum::Table::Table(std::size_t nRows,std::size_t nCols) : values(nRows,std::vector(nCols,1.0)), empty(nRows,std::deque(nCols,false)), rowLabels(nRows, "\0"), colLabels(nCols, "\0") {} stfnum::Table::Table(const std::map< std::string, double >& map) : values(map.size(),std::vector(1,1.0)), empty(map.size(),std::deque(1,false)), rowLabels(map.size(), "\0"), colLabels(1, "Results") { std::map< std::string, double >::const_iterator cit; sst_it it1 = rowLabels.begin(); std::vector< std::vector >::iterator it2 = values.begin(); for (cit = map.begin(); cit != map.end() && it1 != rowLabels.end() && it2 != values.end(); cit++) { (*it1) = cit->first; it2->at(0) = cit->second; it1++; it2++; } } double stfnum::Table::at(std::size_t row,std::size_t col) const { try { return values.at(row).at(col); } catch (...) { throw; } } double& stfnum::Table::at(std::size_t row,std::size_t col) { try { return values.at(row).at(col); } catch (...) { throw; } } bool stfnum::Table::IsEmpty(std::size_t row,std::size_t col) const { try { return empty.at(row).at(col); } catch (...) { throw; } } void stfnum::Table::SetEmpty(std::size_t row,std::size_t col,bool value) { try { empty.at(row).at(col)=value; } catch (...) { throw; } } void stfnum::Table::SetRowLabel(std::size_t row,const std::string& label) { try { rowLabels.at(row)=label; } catch (...) { throw; } } void stfnum::Table::SetColLabel(std::size_t col,const std::string& label) { try { colLabels.at(col)=label; } catch (...) { throw; } } const std::string& stfnum::Table::GetRowLabel(std::size_t row) const { try { return rowLabels.at(row); } catch (...) { throw; } } const std::string& stfnum::Table::GetColLabel(std::size_t col) const { try { return colLabels.at(col); } catch (...) { throw; } } void stfnum::Table::AppendRows(std::size_t nRows_) { std::size_t oldRows=nRows(); rowLabels.resize(oldRows+nRows_); values.resize(oldRows+nRows_); empty.resize(oldRows+nRows_); for (std::size_t nRow = 0; nRow < oldRows + nRows_; ++nRow) { values[nRow].resize(nCols()); empty[nRow].resize(nCols()); } } double stfnum::fboltz(double x, const Vector_double& pars) { double arg=(pars[0]-x)/pars[1]; double ex=exp(arg); return 1/(1+ex); } double stfnum::fbessel(double x, int n) { double sum=0.0; for (int k=0;k<=n;++k) { int fac1=stfnum::fac(2*n-k); int fac2=stfnum::fac(n-k); int fac3=stfnum::fac(k); sum+=fac1/(fac2*fac3)*pow(x,k)/pow2(n-k); } return sum; } double stfnum::fbessel4(double x, const Vector_double& pars) { // normalize so that attenuation is -3dB at cutoff: return fbessel(0,4)/fbessel(x*0.355589/pars[0],4); } double stfnum::fgaussColqu(double x, const Vector_double& pars) { return exp(-0.3466*(x/pars[0])*(x/pars[0])); } int stfnum::fac(int arg) { if (arg<=1) { return 1; } else { return arg*fac(arg-1); } } Vector_double stfnum::filter( const Vector_double& data, std::size_t filter_start, std::size_t filter_end, const Vector_double &a, int SR, stfnum::Func func, bool inverse ) { if (data.size()<=0 || filter_start>=data.size() || filter_end > data.size()) { std::out_of_range e("subscript out of range in stfnum::filter()"); throw e; } std::size_t filter_size=filter_end-filter_start+1; Vector_double data_return(filter_size); double SI=1.0/SR; //the sampling interval double *in; //fftw_complex is a double[2]; hence, out is an array of //double[2] with out[n][0] being the real and out[n][1] being //the imaginary part. fftw_complex *out; fftw_plan p1, p2; //memory allocation as suggested by fftw: in =(double *)fftw_malloc(sizeof(double) * filter_size); out=(fftw_complex *)fftw_malloc(sizeof(fftw_complex) * ((int)(filter_size/2)+1)); // calculate the offset (a straight line between the first and last points): double offset_0=data[filter_start]; double offset_1=data[filter_end]-offset_0; double offset_step=offset_1 / (filter_size-1); //fill the input array with data removing the offset: for (std::size_t n_point=0;n_pointprogCounter) { progDlg.Update( (int)((double)n_data/(double)(data.size()-templ.size())*100.0), "Calculating detection criterion", &skipped ); if (skipped) { detection_criterion.resize(0); return detection_criterion; } progCounter++; } if (n_data!=0) { sum_templ_data=0.0; // The product has to be computed in full length: for (int n_templ=0; n_templ<(int)templ.size();++n_templ) { sum_templ_data+=templ[n_templ]*data[n_data+n_templ]; } // The new value that will be added is: double y_new=data[n_data+templ.size()-1]; double y2_new=data[n_data+templ.size()-1]*data[n_data+templ.size()-1]; sum_data+=y_new-y_old; sum_data_sqr+=y2_new-y2_old; } // The first value that was added (and will have to be subtracted during // the next loop): y_old=data[n_data+0]; y2_old=data[n_data+0]*data[n_data+0]; double scale=(sum_templ_data-sum_templ*sum_data/templ.size())/ (sum_templ_sqr-sum_templ*sum_templ/templ.size()); double offset=(sum_data-scale*sum_templ)/templ.size(); double sse=sum_data_sqr+scale*scale*sum_templ_sqr+templ.size()*offset*offset - 2.0*(scale*sum_templ_data + offset*sum_data-scale*offset*sum_templ); double standard_error=sqrt(sse/(templ.size()-1)); detection_criterion[n_data]=(scale/standard_error); } return detection_criterion; } std::vector stfnum::peakIndices(const Vector_double& data, double threshold, int minDistance) { // to avoid unnecessary copying, we first reserve quite // a bit of space for the vector: std::vector peakInd; peakInd.reserve(data.size()); for (unsigned n_data=0; n_datathreshold) { // ... and if so, find the data point where the threshold // is crossed again in the opposite direction, ... for (;;) { if (n_data>data.size()-2) { ulp=(int)data.size()-1; break; } n_data++; if (data[n_data]minDistance) { // ... making this the upper limit of the peak window: ulp=n_data; break; } } // Now, find the peak within the window: double max=-1e8; int peakIndex=llp; for (int n_p=llp; n_p<=ulp; ++n_p) { if (data[n_p]>max) { max=data[n_p]; peakIndex=n_p; } } peakInd.push_back(peakIndex); } } // Trim peakInd's reserved memory: std::vector(peakInd.begin(),peakInd.end()).swap(peakInd); return peakInd; } Vector_double stfnum::linCorr(const Vector_double& data, const Vector_double& templ, stfio::ProgressInfo& progDlg) { bool skipped = false; // the template has to be smaller than the data waveform: if (data.size()progCounter) { progDlg.Update( (int)((double)n_data/(double)(data.size()-templ.size())*100.0), "Calculating correlation coefficient", &skipped ); if (skipped) { Corr.resize(0); return Corr; } progCounter++; } if (n_data!=0) { sum_templ_data=0.0; // The product has to be computed in full length: for (int n_templ=0; n_templ<(int)templ.size();++n_templ) { sum_templ_data+=templ[n_templ]*data[n_data+n_templ]; } // The new value that will be added is: double y_new=data[n_data+templ.size()-1]; double y2_new=data[n_data+templ.size()-1]*data[n_data+templ.size()-1]; sum_data+=y_new-y_old; sum_data_sqr+=y2_new-y2_old; } // The first value that was added (and will have to be subtracted during // the next loop): y_old=data[n_data+0]; y2_old=data[n_data+0]*data[n_data+0]; double scale=(sum_templ_data-sum_templ*sum_data/templ.size())/ (sum_templ_sqr-sum_templ*sum_templ/templ.size()); double offset=(sum_data-scale*sum_templ)/templ.size(); // Now that the optimal template has been found, // compute the correlation between data and optimal template. // The correlation coefficient is computed in a way that avoids // numerical instability; therefore, the sum of squares // computed above can't be re-used. // Get the means: double mean_data=sum_data/templ.size(); double sum_optTempl=sum_templ*scale+offset*templ.size(); double mean_optTempl=sum_optTempl/templ.size(); // Get SDs: double sd_data=0.0; double sd_templ=0.0; for (int i=0;i<(int)templ.size();++i) { sd_data+=SQR(data[i+n_data]-mean_data); sd_templ+=SQR(templ[i]*scale+offset-mean_optTempl); } sd_data=sqrt(sd_data/templ.size()); sd_templ=sqrt(sd_templ/templ.size()); // Get correlation: double r=0.0; for (int i=0;i<(int)templ.size();++i) { r+=(data[i+n_data]-mean_data)*(templ[i]*scale+offset-mean_optTempl); } r/=((templ.size()-1)*sd_data*sd_templ); Corr[n_data]=r; } return Corr; } double stfnum::integrate_simpson( const Vector_double& input, std::size_t i1, std::size_t i2, double x_scale ) { // Use composite Simpson's rule to approximate the definite integral of f from a to b // check for out-of-range: if (i2>=input.size() || i1>=i2) { throw std::out_of_range( "integration interval out of range in stfnum::integrate_simpson" ); } bool even = std::div((int)i2-(int)i1,2).rem==0; // use Simpson's rule for the even part: if (!even) i2--; std::size_t n=i2-i1; double a=i1*x_scale; double b=i2*x_scale; double sum_2=0.0, sum_4=0.0; for (std::size_t j = 1; j <= n/2; ++j) { if (j=input.size() || i1>=i2) { throw std::out_of_range( "integration interval out of range in stfnum::integrate_trapezium" ); } double a = i1 * x_scale; double b = i2 * x_scale; double sum=input[i1]+input[i2]; for (std::size_t n=i1+1; n= 0. * * N (input) INTEGER * The number of columns of the matrix A. N >= 0. * * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) * On entry, the M-by-N matrix to be factored. * On exit, the factors L and U from the factorization * A = P*L*U; the unit diagonal elements of L are not stored. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,M). * * IPIV (output) INTEGER array, dimension (min(M,N)) * The pivot indices; for 1 <= i <= min(M,N), row i of the * matrix was interchanged with row IPIV(i). * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value * > 0: if INFO = i, U(i,i) is exactly zero. The factorization * has been completed, but the factor U is exactly * singular, and division by zero will occur if it is used * to solve a system of equations. */ int lda_f = m; std::size_t ipiv_size = (m < n) ? m : n; std::vector ipiv(ipiv_size); int info=0; dgetrf_(&m, &n, &A[0], &lda_f, &ipiv[0], &info); if (info<0) { std::ostringstream error_msg; error_msg << "Argument " << -info << " had an illegal value in LAPACK's dgetrf_"; throw std::runtime_error( std::string(error_msg.str())); } if (info>0) { throw std::runtime_error("Singular matrix in LAPACK's dgetrf_; would result in division by zero"); } /* Arguments to dgetrs_ * ==================== * * TRANS (input) CHARACTER*1 * Specifies the form of the system of equations: * = 'N': A * X = B (No transpose) * = 'T': A'* X = B (Transpose) * = 'C': A'* X = B (Conjugate transpose = Transpose) * * N (input) INTEGER * The order of the matrix A. N >= 0. * * NRHS (input) INTEGER * The number of right hand sides, i.e., the number of columns * of the matrix B. NRHS >= 0. * * A (input) DOUBLE PRECISION array, dimension (LDA,N) * The factors L and U from the factorization A = P*L*U * as computed by DGETRF. * * LDA (input) INTEGER * The leading dimension of the array A. LDA >= max(1,N). * * IPIV (input) INTEGER array, dimension (N) * The pivot indices from DGETRF; for 1<=i<=N, row i of the * matrix was interchanged with row IPIV(i). * * B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS) * On entry, the right hand side matrix B. * On exit, the solution matrix X. * * LDB (input) INTEGER * The leading dimension of the array B. LDB >= max(1,N). * * INFO (output) INTEGER * = 0: successful exit * < 0: if INFO = -i, the i-th argument had an illegal value */ char trans='N'; dgetrs_(&trans, &m, &nrhs, &A[0], &m, &ipiv[0], &B[0], &m, &info); if (info<0) { std::ostringstream error_msg; error_msg << "Argument " << -info << " had an illegal value in LAPACK's dgetrs_"; throw std::runtime_error(error_msg.str()); } #endif return 0; } Vector_double stfnum::quad(const Vector_double& data, std::size_t begin, std::size_t end) { // Solve quadratic equations relating 3 sample points a time int n_intervals=std::div((int)end-(int)begin,2).quot; Vector_double quad_p(n_intervals*3); int n_q=0; if (begin-end>1) { for (int n=begin; n<(int)end-1; n+=2) { Vector_double A(9); Vector_double B(3); // solve linear equation system: // use column-major order (Fortran) A[0]=(double)n*(double)n; A[1]=((double)n+1.0)*((double)n+1.0); A[2]=((double)n+2.0)*((double)n+2.0); A[3]=(double)n; A[4]=(double)n+1.0; A[5]=(double)n+2.0; A[6]=1.0; A[7]=1.0; A[8]=1.0; B[0]=data[n]; B[1]=data[n+1]; B[2]=data[n+2]; try { stfnum::linsolv(3,3,1,A,B); } catch (...) { throw; } quad_p[n_q++]=B[0]; quad_p[n_q++]=B[1]; quad_p[n_q++]=B[2]; } } return quad_p; } Vector_double stfnum::nojac(double x, const Vector_double& p) { return Vector_double(0); } double stfnum::noscale(double param, double xscale, double oldx, double yscale, double yoff) { return param; } stfnum::Table stfnum::defaultOutput( const Vector_double& pars, const std::vector& parsInfo, double chisqr ) { if (pars.size()!=parsInfo.size()) { throw std::out_of_range("index out of range in stfnum::defaultOutput"); } stfnum::Table output(pars.size()+1,1); try { output.SetColLabel(0,"Best-fit value"); for (std::size_t n_p=0;n_p stfnum::histogram(const Vector_double& data, int nbins) { if (nbins==-1) { nbins = int(data.size()/100.0); } double fmax = *std::max_element(data.begin(), data.end()); double fmin = *std::min_element(data.begin(), data.end()); fmax += (fmax-fmin)*1e-9; double bin = (fmax-fmin)/nbins; std::map histo; for (int nbin=0; fmin + nbin*bin < fmax; ++nbin) { histo[fmin + nbin*bin] = 0; } for (std::size_t npoint=0; npoint < data.size(); ++npoint) { int nbin = int((data[npoint]-fmin) / bin); histo[fmin + nbin*bin]++; } return histo; } Vector_double stfnum::deconvolve(const Vector_double& dataIn, const Vector_double& templ, int SR, double hipass, double lopass, stfio::ProgressInfo& progDlg) { // Normalize data double fmax = *std::max_element(dataIn.begin(), dataIn.end()); double fmin = *std::min_element(dataIn.begin(), dataIn.end()); Vector_double data = stfio::vec_scal_minus(dataIn, fmin); data = stfio::vec_scal_div(data, fmax-fmin); bool skipped = false; progDlg.Update( 0, "Starting deconvolution...", &skipped ); if (data.size()<=0 || templ.size() <=0 || templ.size() > data.size()) { std::out_of_range e("subscript out of range in stfnum::filter()"); throw e; } /* pad templ */ double* in_templ_padded =(double *)fftw_malloc(sizeof(double) * data.size()); std::copy(templ.begin(), templ.end(), in_templ_padded); if (templ.size() < data.size()) { for (size_t kp=templ.size(); kp 0) { f_c[0] = hipass; rslt_hi = 1.0-fgaussColqu(f, f_c); } /* lowpass filter */ double rslt_lo = 1.0; if (lopass > 0) { f_c[0] = lopass; rslt_lo= fgaussColqu(f, f_c); } /* do the division in place */ double a = out_data[n_point][0]; double b = out_data[n_point][1]; double c = out_templ_padded[n_point][0]; double d = out_templ_padded[n_point][1]; double mag2 = c*c + d*d; out_data[n_point][0] = rslt_hi * rslt_lo * (a*c + b*d)/mag2; out_data[n_point][1] = rslt_hi * rslt_lo * (b*c - a*d)/mag2; } //do the reverse fft: p_inv = fftw_plan_dft_c2r_1d((int)data.size(),out_data, in_data, FFTW_ESTIMATE); fftw_execute(p_inv); //fill the return array, adding the offset, and scaling by data.size() //(because fftw computes an unnormalized transform): for (std::size_t n_point=0; n_point < data.size(); ++n_point) { data_return[n_point]= in_data[n_point]/data.size(); } fftw_destroy_plan(p_data); fftw_destroy_plan(p_templ); fftw_destroy_plan(p_inv); fftw_free(in_data); fftw_free(out_data); fftw_free(in_templ_padded); fftw_free(out_templ_padded); progDlg.Update( 50, "Computing data histogram...", &skipped ); if (skipped) { data_return.resize(0); return data_return; } int nbins = 500; //int(data_return.size()/500.0); std::map histo = histogram(data_return, nbins); double max_value = -1; double max_time = 0; double maxhalf_time = 0; Vector_double histo_fit(0); for (std::map::const_iterator it=histo.begin(); it != histo.end(); ++it) { if (it->second > max_value) { max_value = it->second; max_time = it->first; } histo_fit.push_back(it->second); #ifdef _STFDEBUG std::cout << it->first << "\t" << it->second << std::endl; #endif } for (std::map::const_iterator it=histo.begin(); it != histo.end(); ++it) { if (it->second > 0.5*max_value) { maxhalf_time = it->first; break; } } maxhalf_time = fabs(max_time-maxhalf_time); progDlg.Update( 75, "Fitting Gaussian...", &skipped ); if (skipped) { data_return.resize(0); return data_return; } /* Fit Gaussian to histogram */ double interval = (++histo.begin())->first-histo.begin()->first; if (maxhalf_time==0) { maxhalf_time = interval; } /* Initial parameter guesses */ Vector_double pars(3); pars[0] = max_value; pars[1] = (max_time - histo.begin()->first); pars[2] = maxhalf_time *sqrt(2.0)/2.35482; #ifdef _STFDEBUG std::cout << "nbins: " << nbins << std::endl; std::cout << "initial values:" << std::endl; for (std::size_t np=0; np funcLib = stfnum::GetFuncLib(); std::string info; int warning; #ifdef _STFDEBUG double chisqr = #endif lmFit(histo_fit, interval, funcLib[funcLib.size()-2], opts, true, pars, info, warning ); #ifdef _STFDEBUG std::cout << chisqr << "\t" << interval << std::endl; std::cout << "final values:" << std::endl; for (std::size_t np=0; np #include namespace stfnum { // C-style functions for Lourakis' routines: void c_func_lour(double *p, double* hx, int m, int n, void *adata); void c_jac_lour(double *p, double *j, int m, int n, void *adata); // Helper functions for lmFit to store the function at global scope: void saveFunc(stfnum::Func func); void saveJac(stfnum::Jac jac); // A struct that will be passed as a pointer to // Lourakis' C-functions. It is used to: // (1) specify which parameters are to be fitted, and // (2) pass the constant parameters // (3) the sampling interval struct fitInfo { fitInfo(const std::deque& fit_p_arg, const Vector_double& const_p_arg, double dt_arg) : fit_p(fit_p_arg), const_p(const_p_arg), dt(dt_arg) {} // Specifies for each parameter whether the client // wants to fit it (true) or to keep it constant (false) std::deque fit_p; // A valarray containing the parameters that // will be kept constant: Vector_double const_p; // sampling interval double dt; }; } // Functions stored at global scope to be called by c_func_lour // and c_jac_lour stfnum::Func func_lour; stfnum::Jac jac_lour; void stfnum::saveFunc(stfnum::Func func) { func_lour=func; } void stfnum::saveJac(stfnum::Jac jac) { jac_lour=jac; } void stfnum::c_func_lour(double *p, double* hx, int m, int n, void *adata) { // m: the number of parameters that are to be fitted // adata: pointer to a struct that (1) specifies which parameters are to be fitted // and (2) contains the constant parameters fitInfo *fInfo=static_cast(adata); // total number of parameters, including constants: int tot_p=(int)fInfo->fit_p.size(); // all parameters, including constants: Vector_double p_f(tot_p); for (int n_tp=0, n_p=0, n_f=0;n_tpfit_p[n_tp]) { // ... take it from *p, ... p_f[n_tp] = p[n_p++]; } else { // ... otherwise, take it from the fInfo struct: p_f[n_tp] = fInfo->const_p[n_f++]; } } for (int n_x=0;n_xdt, p_f); } } void stfnum::c_jac_lour(double *p, double *jac, int m, int n, void *adata) { // m: the number of parameters that are to be fitted // adata: pointer to a struct that (1) specifies which parameters are to be fitted // and (2) contains the constant parameters fitInfo *fInfo=static_cast(adata); // total number of parameters, including constants: int tot_p=(int)fInfo->fit_p.size(); // all parameters, including constants: Vector_double p_f(tot_p); for (int n_tp=0,n_p=0,n_f=0;n_tpfit_p[n_tp]) { // ... take it from *p, ... p_f[n_tp] = p[n_p++]; } else { // ... otherwise, take it from the fInfo struct: p_f[n_tp] = fInfo->const_p[n_f++]; } } for (int n_x=0,n_j=0;n_xdt,p_f)); // ... but we only need the derivatives of the non-constants... for (int n_tp=0;n_tpfit_p[n_tp]) { jac[n_j++]=jac_f[n_tp]; } } } } Vector_double stfnum::get_scale(Vector_double& data, double oldx) { Vector_double xyscale(4); if (data.size() == 0) { xyscale[0] = 1.0/oldx; xyscale[1] = 0.0; xyscale[2] = 1.0; xyscale[3] = 0.0; return xyscale; } double ymin,ymax,amp,off; ymin = *data.begin(); ymax = ymin; for (Vector_double::iterator it = data.begin(); it != data.end(); ++it) { double v = *it; if (v < ymin) ymin = v; else if (ymax < v) ymax = v; } amp = ymax - ymin; off = ymin / amp; data = stfio::vec_scal_mul(data, 1.0 / amp); data = stfio::vec_scal_minus(data, off); xyscale[0] = 1.0/(data.size()*oldx); xyscale[1] = 0; xyscale[2] = 1.0/amp; xyscale[3] = off; return xyscale; } double stfnum::lmFit( const Vector_double& data, double dt, const stfnum::storedFunc& fitFunc, const Vector_double& opts, bool use_scaling, Vector_double& p, std::string& info, int& warning ) { // Basic range checking: if (fitFunc.pInfo.size()!=p.size()) { std::string msg("Error in stfnum::lmFit()\n" "function parameters (p_fit) and parameters entered (p) have different sizes"); throw std::runtime_error(msg); } if ( opts.size() != 6 ) { std::string msg("Error in stfnum::lmFit()\n" "wrong number of options"); throw std::runtime_error(msg); } bool constrained = false; std::vector< double > constrains_lm_lb( fitFunc.pInfo.size() ); std::vector< double > constrains_lm_ub( fitFunc.pInfo.size() ); bool can_scale = use_scaling; for ( unsigned n_p=0; n_p < fitFunc.pInfo.size(); ++n_p ) { if ( fitFunc.pInfo[n_p].constrained ) { constrained = true; constrains_lm_lb[n_p] = fitFunc.pInfo[n_p].constr_lb; constrains_lm_ub[n_p] = fitFunc.pInfo[n_p].constr_ub; } else { constrains_lm_lb[n_p] = -DBL_MAX; constrains_lm_ub[n_p] = DBL_MAX; } if ( can_scale ) { if (fitFunc.pInfo[n_p].scale == stfnum::noscale) { can_scale = false; } } } // Store the functions at global scope: saveFunc(fitFunc.func); saveJac(fitFunc.jac); double info_id[LM_INFO_SZ]; Vector_double data_ptr(data); Vector_double xyscale(4); if (can_scale) { xyscale = get_scale(data_ptr, dt); } // The parameters need to be separated into two parts: // Those that are to be fitted and those that the client wants // to keep constant. Since there is no native support to // do so in Lourakis' routines, the workaround is a little // tricky, making (ab)use of the *void pointer: // number of parameters that need to be fitted: int n_fitted=0; for ( unsigned n_p=0; n_p < fitFunc.pInfo.size(); ++n_p ) { n_fitted += fitFunc.pInfo[n_p].toFit; } // parameters that need to be fitted: Vector_double p_toFit(n_fitted); std::deque p_fit_bool( fitFunc.pInfo.size() ); // parameters that are held constant: Vector_double p_const( fitFunc.pInfo.size()-n_fitted ); for ( unsigned n_p=0, n_c=0, n_f=0; n_p < fitFunc.pInfo.size(); ++n_p ) { if (fitFunc.pInfo[n_p].toFit) { p_toFit[n_f++] = p[n_p]; if (can_scale) { p_toFit[n_f-1] = fitFunc.pInfo[n_p].scale(p_toFit[n_f-1], xyscale[0], xyscale[1], xyscale[2], xyscale[3]); } } else { p_const[n_c++] = p[n_p]; if (can_scale) { p_const[n_c-1] = fitFunc.pInfo[n_p].scale(p_const[n_c-1], xyscale[0], xyscale[1], xyscale[2], xyscale[3]); } } p_fit_bool[n_p] = fitFunc.pInfo[n_p].toFit; } // size * dt_new = 1 -> dt_new = 1.0/size double dt_finfo = dt; if (can_scale) dt_finfo = 1.0/data_ptr.size(); fitInfo fInfo( p_fit_bool, p_const, dt_finfo ); // make l-value of opts: Vector_double opts_l(5); for (std::size_t n=0; n < 4; ++n) opts_l[n] = opts[n]; opts_l[4] = -1e-6; int it = 0; if (p_toFit.size()!=0 && data_ptr.size()!=0) { double old_info_id[LM_INFO_SZ]; // initialize with initial parameter guess: Vector_double old_p_toFit(p_toFit); #ifdef _DEBUG std::ostringstream optsMsg; optsMsg << "\nopts: "; for (std::size_t n_p=0; n_p < opts.size(); ++n_p) optsMsg << opts[n_p] << "\t"; optsMsg << "\n" << "data_ptr[" << data_ptr.size()-1 << "]=" << data_ptr[data_ptr.size()-1] << "\n"; optsMsg << "constrains_lm_lb: "; for (std::size_t n_p=0; n_p < constrains_lm_lb.size(); ++n_p) optsMsg << constrains_lm_lb[n_p] << "\t"; optsMsg << "\n" << "constrains_lm_ub: "; for (std::size_t n_p=0; n_p < constrains_lm_ub.size(); ++n_p) optsMsg << constrains_lm_ub[n_p] << "\t"; optsMsg << "\n\n"; std::cout << optsMsg; #endif while ( 1 ) { #ifdef _DEBUG std::ostringstream paramMsg; paramMsg << "Pass: " << it << "\t"; paramMsg << "p_toFit: "; for (std::size_t n_p=0; n_p < p_toFit.size(); ++n_p) paramMsg << p_toFit[n_p] << "\t"; paramMsg << "\n"; std::cout << paramMsg.str().c_str(); #endif if ( !fitFunc.hasJac ) { if ( !constrained ) { dlevmar_dif( c_func_lour, &p_toFit[0], &data_ptr[0], n_fitted, (int)data.size(), (int)opts[4], &opts_l[0], info_id, NULL, NULL, &fInfo ); } else { dlevmar_bc_dif( c_func_lour, &p_toFit[0], &data_ptr[0], n_fitted, (int)data.size(), &constrains_lm_lb[0], &constrains_lm_ub[0], NULL, (int)opts[4], &opts_l[0], info_id, NULL, NULL, &fInfo ); } } else { if ( !constrained ) { dlevmar_der( c_func_lour, c_jac_lour, &p_toFit[0], &data_ptr[0], n_fitted, (int)data.size(), (int)opts[4], &opts_l[0], info_id, NULL, NULL, &fInfo ); } else { dlevmar_bc_der( c_func_lour, c_jac_lour, &p_toFit[0], &data_ptr[0], n_fitted, (int)data.size(), &constrains_lm_lb[0], &constrains_lm_ub[0], NULL, (int)opts[4], &opts_l[0], info_id, NULL, NULL, &fInfo ); } } it++; if ( info_id[1] != info_id[1] ) { // restore previous parameters if new chisqr is NaN: p_toFit = old_p_toFit; } else { double dchisqr = (info_id[0] - info_id[1]) / info_id[1]; // (old chisqr - new chisqr) / new_chisqr if ( dchisqr < 0 ) { // restore previous results and exit if new chisqr is larger: for ( int n_i = 0; n_i < LM_INFO_SZ; ++n_i ) info_id[n_i] = old_info_id[n_i]; p_toFit = old_p_toFit; break; } if ( dchisqr < 1e-5 ) { // Keep current results and exit if change in chisqr is below threshold break; } // otherwise, store results and continue iterating: for ( int n_i = 0; n_i < LM_INFO_SZ; ++n_i ) old_info_id[n_i] = info_id[n_i]; old_p_toFit = p_toFit; } if ( it >= opts[5] ) // Exit if maximal number of iterations is reached break; // decrease initial step size for next iteration: opts_l[0] *= 1e-4; } } else { std::runtime_error e("Array of size zero in lmFit"); throw e; } // copy back the fitted parameters to p: for ( unsigned n_p=0, n_f=0, n_c=0; n_p linParInfo(2); linParInfo[0] = stfnum::parInfo("Slope", true); linParInfo[1] = stfnum::parInfo("Y intersect", true); return stfnum::storedFunc("Linear function", linParInfo, stfnum::flin, stfnum::flin_init, stfnum::nojac, false, stfnum::defaultOutput); } /* options for the implementation of the LM algorithm */ Vector_double stfnum::LM_default_opts() { Vector_double opts(6); //opts[0]=5*1E-3; // initial \mu, default: 1E-03; opts[0]=1E-3; // initial \mu, default: 1E-03; opts[1]=1E-17; // stopping thr for ||J^T e||_inf, default: 1E-17; opts[2]=1E-17; // stopping trh for ||Dp||_2, default: 1E-17; opts[3]=1E-32; // stopping thr for ||e||_2, default: 1E-17; opts[4]=64; // maximal number of iterations/pass, default: 64; opts[5]=16; // maximal number of passes; return opts; } stimfit-0.15.8/src/libstfnum/funclib.cpp0000775000175000017500000005726113240263033015141 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include #include "./fit.h" #include "./measure.h" #include "./funclib.h" std::vector< stfnum::storedFunc > stfnum::GetFuncLib() { std::vector< stfnum::storedFunc > funcList; // Monoexponential function, free fit: std::vector parInfoMExp=getParInfoExp(1); funcList.push_back(stfnum::storedFunc("Monoexponential",parInfoMExp,fexp,fexp_init,fexp_jac,true)); // Monoexponential function, offset fixed to baseline: parInfoMExp[2].toFit=false; funcList.push_back(stfnum::storedFunc("Monoexponential, offset fixed to baseline", parInfoMExp,fexp,fexp_init,fexp_jac,true)); // Monoexponential function, starting with a delay, start fixed to baseline: std::vector parInfoMExpDe(4); parInfoMExpDe[0].toFit=false; parInfoMExpDe[0].desc="Baseline"; parInfoMExpDe[0].scale=stfnum::yscaleoffset; parInfoMExpDe[0].unscale=stfnum::yunscaleoffset; parInfoMExpDe[1].toFit=true; parInfoMExpDe[1].desc="Delay"; parInfoMExpDe[0].scale=stfnum::xscale; parInfoMExpDe[0].unscale=stfnum::xunscale; parInfoMExpDe[2].toFit=true; parInfoMExpDe[2].desc="tau"; parInfoMExpDe[0].scale=stfnum::xscale; parInfoMExpDe[0].unscale=stfnum::xunscale; parInfoMExpDe[3].toFit=true; parInfoMExpDe[3].desc="Peak"; parInfoMExpDe[0].scale=stfnum::yscale; parInfoMExpDe[0].unscale=stfnum::yunscale; funcList.push_back(stfnum::storedFunc("Monoexponential with delay, start fixed to baseline", parInfoMExpDe,fexpde,fexpde_init,stfnum::nojac,false)); // Biexponential function, free fit: std::vector parInfoBExp=getParInfoExp(2); funcList.push_back(stfnum::storedFunc( "Biexponential",parInfoBExp,fexp,fexp_init,fexp_jac,true,outputWTau)); // Biexponential function, offset fixed to baseline: parInfoBExp[4].toFit=false; funcList.push_back(stfnum::storedFunc("Biexponential, offset fixed to baseline", parInfoBExp,fexp,fexp_init,fexp_jac,true,outputWTau)); // Biexponential function, starting with a delay, start fixed to baseline: std::vector parInfoBExpDe(5); parInfoBExpDe[0].toFit=false; parInfoBExpDe[0].desc="Baseline"; parInfoBExpDe[0].scale=stfnum::yscaleoffset; parInfoBExpDe[0].unscale=stfnum::yunscaleoffset; parInfoBExpDe[1].toFit=true; parInfoBExpDe[1].desc="Delay"; parInfoBExpDe[1].scale=stfnum::xscale; parInfoBExpDe[1].unscale=stfnum::xunscale; // parInfoBExpDe[1].constrained = true; parInfoBExpDe[1].constr_lb = 0.0; parInfoBExpDe[1].constr_ub = DBL_MAX; parInfoBExpDe[2].toFit=true; parInfoBExpDe[2].desc="tau1"; parInfoBExpDe[2].scale=stfnum::xscale; parInfoBExpDe[2].unscale=stfnum::xunscale; // parInfoBExpDe[2].constrained = true; parInfoBExpDe[2].constr_lb = 1.0e-16; parInfoBExpDe[2].constr_ub = DBL_MAX; parInfoBExpDe[3].toFit=true; parInfoBExpDe[3].desc="Factor"; parInfoBExpDe[3].scale=stfnum::yscale; parInfoBExpDe[3].unscale=stfnum::yunscale; parInfoBExpDe[4].toFit=true; parInfoBExpDe[4].desc="tau2"; parInfoBExpDe[4].scale=stfnum::xscale; parInfoBExpDe[4].unscale=stfnum::xunscale; // parInfoBExpDe[4].constrained = true; parInfoBExpDe[4].constr_lb = 1.0e-16; parInfoBExpDe[4].constr_ub = DBL_MAX; funcList.push_back(stfnum::storedFunc( "Biexponential with delay, start fixed to baseline, delay constrained to > 0", parInfoBExpDe,fexpbde,fexpbde_init,stfnum::nojac,false)); // Triexponential function, free fit: std::vector parInfoTExp=getParInfoExp(3); funcList.push_back(stfnum::storedFunc( "Triexponential",parInfoTExp,fexp,fexp_init,fexp_jac,true,outputWTau)); // Triexponential function, free fit, different initialization: funcList.push_back(stfnum::storedFunc( "Triexponential, initialize for PSCs/PSPs",parInfoTExp,fexp,fexp_init2,fexp_jac,true,outputWTau)); // Triexponential function, offset fixed to baseline: parInfoTExp[6].toFit=false; funcList.push_back(stfnum::storedFunc( "Triexponential, offset fixed to baseline",parInfoTExp,fexp,fexp_init,fexp_jac,true,outputWTau)); // Alpha function: std::vector parInfoAlpha(3); parInfoAlpha[0].toFit=true; parInfoAlpha[0].desc="Amplitude"; parInfoAlpha[1].toFit=true; parInfoAlpha[1].desc="Rate"; parInfoAlpha[2].toFit=true; parInfoAlpha[2].desc="Offset"; funcList.push_back(stfnum::storedFunc( "Alpha function", parInfoAlpha,falpha,falpha_init,falpha_jac,true)); // HH gNa function: std::vector parInfoHH(4); parInfoHH[0].toFit=true; parInfoHH[0].desc="gprime_na"; parInfoHH[1].toFit=true; parInfoHH[1].desc="tau_m"; parInfoHH[2].toFit=true; parInfoHH[2].desc="tau_h"; parInfoHH[3].toFit=false; parInfoHH[3].desc="offset"; funcList.push_back(stfnum::storedFunc( "Hodgkin-Huxley g_Na function, offset fixed to baseline", parInfoHH, fHH, fHH_init, stfnum::nojac, false)); // power of 1 gNa function: funcList.push_back(stfnum::storedFunc( "power of 1 g_Na function, offset fixed to baseline", parInfoHH, fgnabiexp, fgnabiexp_init, fgnabiexp_jac, true)); // Gaussian std::vector parInfoGauss(3); parInfoGauss[0].toFit=true; parInfoGauss[0].desc="amp"; parInfoGauss[0].scale = stfnum::yscale; parInfoGauss[0].unscale = stfnum::yunscale; parInfoGauss[1].toFit=true; parInfoGauss[1].desc="mean"; parInfoGauss[1].scale = stfnum::xscale; parInfoGauss[1].unscale = stfnum::xunscale; parInfoGauss[2].toFit=true; parInfoGauss[2].constrained=true; parInfoGauss[2].constr_lb=0; parInfoGauss[2].constr_ub=DBL_MAX; parInfoGauss[2].desc="width"; parInfoGauss[2].scale = stfnum::xscale; parInfoGauss[2].unscale = stfnum::xunscale; funcList.push_back(stfnum::storedFunc( "Gaussian", parInfoGauss, fgauss, fgauss_init, fgauss_jac, true)); // Triexponential function, starting with a delay, start fixed to baseline: std::vector parInfoTExpDe(7); parInfoTExpDe[0].toFit=false; parInfoTExpDe[0].desc="Baseline"; parInfoTExpDe[0].scale=stfnum::yscaleoffset; parInfoTExpDe[0].unscale=stfnum::yunscaleoffset; parInfoTExpDe[1].toFit=true; parInfoTExpDe[1].desc="Delay"; parInfoTExpDe[1].scale=stfnum::xscale; parInfoTExpDe[1].unscale=stfnum::xunscale; // parInfoTExpDe[1].constrained = true; parInfoTExpDe[1].constr_lb = 0.0; parInfoTExpDe[1].constr_ub = DBL_MAX; parInfoTExpDe[2].toFit=true; parInfoTExpDe[2].desc="tau1a"; parInfoTExpDe[2].scale=stfnum::xscale; parInfoTExpDe[2].unscale=stfnum::xunscale; // parInfoTExpDe[2].constrained = true; parInfoTExpDe[2].constr_lb = 1.0e-16; parInfoTExpDe[2].constr_ub = DBL_MAX; parInfoTExpDe[3].toFit=true; parInfoTExpDe[3].desc="Factor"; parInfoTExpDe[3].scale=stfnum::yscale; parInfoTExpDe[3].unscale=stfnum::yunscale; parInfoTExpDe[4].toFit=true; parInfoTExpDe[4].desc="tau2"; parInfoTExpDe[4].scale=stfnum::xscale; parInfoTExpDe[4].unscale=stfnum::xunscale; parInfoTExpDe[5].toFit=true; parInfoTExpDe[5].desc="tau1b"; parInfoTExpDe[5].scale=stfnum::xscale; parInfoTExpDe[5].unscale=stfnum::xunscale; parInfoTExpDe[6].toFit=true; parInfoTExpDe[6].desc="ptau1b"; parInfoTExpDe[6].scale=stfnum::noscale; parInfoTExpDe[6].unscale=stfnum::noscale; funcList.push_back(stfnum::storedFunc( "Triexponential with delay, start fixed to baseline, delay constrained to > 0", parInfoTExpDe,fexptde,fexptde_init,stfnum::nojac,false)); return funcList; } double stfnum::fexp(double x, const Vector_double& p) { double sum=0.0; for (std::size_t n_p=0;n_p(pars.size()); for (int i=0; i < npars-1; i += 3) { arg=(x-pars[i+1])/pars[i+2]; ex=exp(-arg*arg); /* fac=pars[i]*ex*2.0*arg; */ y += pars[i] * ex; } return y; } Vector_double stfnum::fgauss_jac(double x, const Vector_double& pars) { double ex=0.0, arg=0.0; int npars=static_cast(pars.size()); Vector_double jac(npars); for (int i=0; i < npars-1; i += 3) { arg=(x-pars[i+1])/pars[i+2]; ex=exp(-arg*arg); jac[i] = ex; jac[i+1] = 2.0*ex*pars[i]*(x-pars[i+1]) / (pars[i+2]*pars[i+2]); jac[i+2] = 2.0*ex*pars[i]*(x-pars[i+1])*(x-pars[i+1]) / (pars[i+2]*pars[i+2]*pars[i+2]); } return jac; } void stfnum::fgauss_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ) { // Find the peak position in data: double maxT = stfnum::whereis( data, peak ) * dt; int npars=static_cast(pInit.size()); for (int i=0; i < npars-1; i += 3) { pInit[i] = peak; pInit[i+1] = maxT; pInit[i+2] = HalfWidth/ 1.65; //approximate t50 to one standard deviation } } void stfnum::fHH_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ) { // Find the peak position in data: double maxT = stfnum::whereis( data, peak ); if ( maxT == 0 ) maxT = data.size() * 0.05; // p[0]: gprime_na // p[1]: tau_m // p[2]: tau_h // p[3]: offset pInit[1] = RTLoHi; pInit[2] = HalfWidth; pInit[3] = base; //offset fixed to baseline double norm = (27.0*pow(pInit[2],3)*exp(-(pInit[1]*log((3.0*pInit[2]+pInit[1])/pInit[1]))/pInit[2])) / (27.0*pow(pInit[2],3)+27.0*pInit[1]*pInit[2]*pInit[2]+9.0*pInit[1]*pInit[1]*pInit[2]+pow(pInit[1],3)); pInit[0] = (peak-base)/norm; //pInit[1] = 0.5 * maxT * dt; //pInit[2] = 3 * maxT * dt; } Vector_double stfnum::fgnabiexp_jac(double x, const Vector_double& p) { Vector_double jac(4); jac[0] = ( 1-exp(-x/p[1]) ) * exp(-x/p[2]); jac[1] = -p[0] * x * exp(-x/p[1] - x/p[2]) /(p[1]*p[1]); jac[2] = p[0] * x * ( 1-exp(-x/p[1]) ) * exp(-x/p[2]) / (p[2]*p[2]); jac[3] = 1.0; return jac; } void stfnum::fgnabiexp_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ) { // Find the peak position in data: double maxT = stfnum::whereis( data, peak ); if ( maxT == 0 ) maxT = data.size() * 0.05; // p[0]: gprime_na // p[1]: tau_m // p[2]: tau_h // p[3]: offset // pInit[1]=0.5 * maxT * dt; // pInit[2]=3 * maxT * dt; pInit[1] = RTLoHi; pInit[2] = HalfWidth; pInit[3] = base; // offset fixed to baseline double tpeak = pInit[1]*log(pInit[2]/pInit[1]+1); double norm = (1-exp(-tpeak/pInit[1]))*exp(-tpeak/pInit[2]); pInit[0] = (peak-base)/norm; } std::vector stfnum::getParInfoExp(int n_exp) { std::vector retParInfo(n_exp*2+1); for (int n_e=0; n_e& parsInfo, double chisqr ) { stfnum::Table output(pars.size()+1,1); // call default version: try { output=defaultOutput(pars,parsInfo,chisqr); } catch (...) { throw; } // add weighted tau: // sum up amplitude terms: double sumAmp=0.0; for (std::size_t n_p=0;n_pvalue) { fromtop=true; } for (std::size_t n=0;n= value) { return n; } } } return 0; } stimfit-0.15.8/src/libstfnum/levmar/0000775000175000017500000000000013315356572014361 500000000000000stimfit-0.15.8/src/libstfnum/levmar/lmbc_core.c0000664000175000017500000012153313062445067016374 00000000000000///////////////////////////////////////////////////////////////////////////////// // // Levenberg - Marquardt non-linear minimization algorithm // Copyright (C) 2004-05 Manolis Lourakis (lourakis at ics forth gr) // Institute of Computer Science, Foundation for Research & Technology - Hellas // Heraklion, Crete, Greece. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // ///////////////////////////////////////////////////////////////////////////////// #ifndef LM_REAL // not included by lmbc.c #error This file should not be compiled directly! #endif /* precision-specific definitions */ #define FUNC_STATE LM_ADD_PREFIX(func_state) #define LNSRCH LM_ADD_PREFIX(lnsrch) #define BOXPROJECT LM_ADD_PREFIX(boxProject) #define BOXSCALE LM_ADD_PREFIX(boxScale) #define LEVMAR_BOX_CHECK LM_ADD_PREFIX(levmar_box_check) #define VECNORM LM_ADD_PREFIX(vecnorm) #define LEVMAR_BC_DER LM_ADD_PREFIX(levmar_bc_der) #define LEVMAR_BC_DIF LM_ADD_PREFIX(levmar_bc_dif) #define LEVMAR_FDIF_FORW_JAC_APPROX LM_ADD_PREFIX(levmar_fdif_forw_jac_approx) #define LEVMAR_FDIF_CENT_JAC_APPROX LM_ADD_PREFIX(levmar_fdif_cent_jac_approx) #define LEVMAR_TRANS_MAT_MAT_MULT LM_ADD_PREFIX(levmar_trans_mat_mat_mult) #define LEVMAR_L2NRMXMY LM_ADD_PREFIX(levmar_L2nrmxmy) #define LEVMAR_COVAR LM_ADD_PREFIX(levmar_covar) #define LMBC_DIF_DATA LM_ADD_PREFIX(lmbc_dif_data) #define LMBC_DIF_FUNC LM_ADD_PREFIX(lmbc_dif_func) #define LMBC_DIF_JACF LM_ADD_PREFIX(lmbc_dif_jacf) #ifdef HAVE_LAPACK #define AX_EQ_B_LU LM_ADD_PREFIX(Ax_eq_b_LU) #define AX_EQ_B_CHOL LM_ADD_PREFIX(Ax_eq_b_Chol) #define AX_EQ_B_QR LM_ADD_PREFIX(Ax_eq_b_QR) #define AX_EQ_B_QRLS LM_ADD_PREFIX(Ax_eq_b_QRLS) #define AX_EQ_B_SVD LM_ADD_PREFIX(Ax_eq_b_SVD) #define AX_EQ_B_BK LM_ADD_PREFIX(Ax_eq_b_BK) #else #define AX_EQ_B_LU LM_ADD_PREFIX(Ax_eq_b_LU_noLapack) #endif /* HAVE_LAPACK */ #ifdef HAVE_PLASMA #define AX_EQ_B_PLASMA_CHOL LM_ADD_PREFIX(Ax_eq_b_PLASMA_Chol) #endif /* find the median of 3 numbers */ #define __MEDIAN3(a, b, c) ( ((a) >= (b))?\ ( ((c) >= (a))? (a) : ( ((c) <= (b))? (b) : (c) ) ) : \ ( ((c) >= (b))? (b) : ( ((c) <= (a))? (a) : (c) ) ) ) /* Projections to feasible set \Omega: P_{\Omega}(y) := arg min { ||x - y|| : x \in \Omega}, y \in R^m */ /* project vector p to a box shaped feasible set. p is a mx1 vector. * Either lb, ub can be NULL. If not NULL, they are mx1 vectors */ static void BOXPROJECT(LM_REAL *p, LM_REAL *lb, LM_REAL *ub, int m) { register int i; if(!lb){ /* no lower bounds */ if(!ub) /* no upper bounds */ return; else{ /* upper bounds only */ for(i=m; i-->0; ) if(p[i]>ub[i]) p[i]=ub[i]; } } else if(!ub){ /* lower bounds only */ for(i=m; i-->0; ) if(p[i]0; ) p[i]=__MEDIAN3(lb[i], p[i], ub[i]); } #undef __MEDIAN3 /* pointwise scaling of bounds with the mx1 vector scl. If div=1 scaling is by 1./scl. * Either lb, ub can be NULL. If not NULL, they are mx1 vectors */ static void BOXSCALE(LM_REAL *lb, LM_REAL *ub, LM_REAL *scl, int m, int div) { register int i; if(!lb){ /* no lower bounds */ if(!ub) /* no upper bounds */ return; else{ /* upper bounds only */ if(div){ for(i=m; i-->0; ) if(ub[i]!=LM_REAL_MAX) ub[i]=ub[i]/scl[i]; }else{ for(i=m; i-->0; ) if(ub[i]!=LM_REAL_MAX) ub[i]=ub[i]*scl[i]; } } } else if(!ub){ /* lower bounds only */ if(div){ for(i=m; i-->0; ) if(lb[i]!=LM_REAL_MIN) lb[i]=lb[i]/scl[i]; }else{ for(i=m; i-->0; ) if(lb[i]!=LM_REAL_MIN) lb[i]=lb[i]*scl[i]; } } else{ /* box bounds */ if(div){ for(i=m; i-->0; ){ if(ub[i]!=LM_REAL_MAX) ub[i]=ub[i]/scl[i]; if(lb[i]!=LM_REAL_MIN) lb[i]=lb[i]/scl[i]; } }else{ for(i=m; i-->0; ){ if(ub[i]!=LM_REAL_MAX) ub[i]=ub[i]*scl[i]; if(lb[i]!=LM_REAL_MIN) lb[i]=lb[i]*scl[i]; } } } } /* compute the norm of a vector in a manner that avoids overflows */ static LM_REAL VECNORM(LM_REAL *x, int n) { #ifdef HAVE_LAPACK #define NRM2 LM_MK_BLAS_NAME(nrm2) extern LM_REAL NRM2(int *n, LM_REAL *dx, int *incx); int one=1; return NRM2(&n, x, &one); #undef NRM2 #else // no LAPACK, use the simple method described by Blue in TOMS78 register int i; LM_REAL max, sum, tmp; for(i=n, max=0.0; i-->0; ) if(x[i]>max) max=x[i]; else if(x[i]<-max) max=-x[i]; for(i=n, sum=0.0; i-->0; ){ tmp=x[i]/max; sum+=tmp*tmp; } return max*(LM_REAL)sqrt(sum); #endif /* HAVE_LAPACK */ } struct FUNC_STATE{ int n, *nfev; LM_REAL *hx, *x; LM_REAL *lb, *ub; void *adata; }; static void LNSRCH(int m, LM_REAL *x, LM_REAL f, LM_REAL *g, LM_REAL *p, LM_REAL alpha, LM_REAL *xpls, LM_REAL *ffpls, void (*func)(LM_REAL *p, LM_REAL *hx, int m, int n, void *adata), struct FUNC_STATE *state, int *mxtake, int *iretcd, LM_REAL stepmx, LM_REAL steptl, LM_REAL *sx) { /* Find a next newton iterate by backtracking line search. * Specifically, finds a \lambda such that for a fixed alpha<0.5 (usually 1e-4), * f(x + \lambda*p) <= f(x) + alpha * \lambda * g^T*p * * Translated (with a few changes) from Schnabel, Koontz & Weiss uncmin.f, v1.3 * Main changes include the addition of box projection and modification of the scaling * logic since uncmin.f operates in the original (unscaled) variable space. * PARAMETERS : * m --> dimension of problem (i.e. number of variables) * x(m) --> old iterate: x[k-1] * f --> function value at old iterate, f(x) * g(m) --> gradient at old iterate, g(x), or approximate * p(m) --> non-zero newton step * alpha --> fixed constant < 0.5 for line search (see above) * xpls(m) <-- new iterate x[k] * ffpls <-- function value at new iterate, f(xpls) * func --> name of subroutine to evaluate function * state <--> information other than x and m that func requires. * state is not modified in xlnsrch (but can be modified by func). * iretcd <-- return code * mxtake <-- boolean flag indicating step of maximum length used * stepmx --> maximum allowable step size * steptl --> relative step size at which successive iterates * considered close enough to terminate algorithm * sx(m) --> diagonal scaling matrix for x, can be NULL * internal variables * sln newton length * rln relative length of newton step */ register int i, j; int firstback = 1; LM_REAL disc; LM_REAL a3, b; LM_REAL t1, t2, t3, lambda, tlmbda, rmnlmb; LM_REAL scl, rln, sln, slp; LM_REAL tmp1, tmp2; LM_REAL fpls, pfpls = 0., plmbda = 0.; /* -Wall */ f*=LM_CNST(0.5); *mxtake = 0; *iretcd = 2; tmp1 = 0.; for (i = m; i-- > 0; ) tmp1 += p[i] * p[i]; sln = (LM_REAL)sqrt(tmp1); if (sln > stepmx) { /* newton step longer than maximum allowed */ scl = stepmx / sln; for (i = m; i-- > 0; ) /* p * scl */ p[i]*=scl; sln = stepmx; } for (i = m, slp = rln = 0.; i-- > 0; ){ slp+=g[i]*p[i]; /* g^T * p */ tmp1 = (FABS(x[i])>=LM_CNST(1.))? FABS(x[i]) : LM_CNST(1.); tmp2 = FABS(p[i])/tmp1; if(rln < tmp2) rln = tmp2; } rmnlmb = steptl / rln; lambda = LM_CNST(1.0); /* check if new iterate satisfactory. generate new lambda if necessary. */ for(j = _LSITMAX_; j-- > 0; ) { for (i = m; i-- > 0; ) xpls[i] = x[i] + lambda * p[i]; BOXPROJECT(xpls, state->lb, state->ub, m); /* project to feasible set */ /* evaluate function at new point */ if(!sx){ (*func)(xpls, state->hx, m, state->n, state->adata); ++(*(state->nfev)); } else{ for (i = m; i-- > 0; ) xpls[i] *= sx[i]; (*func)(xpls, state->hx, m, state->n, state->adata); ++(*(state->nfev)); for (i = m; i-- > 0; ) xpls[i] /= sx[i]; } /* ### state->hx=state->x-state->hx, tmp1=||state->hx|| */ #if 1 tmp1=LEVMAR_L2NRMXMY(state->hx, state->x, state->hx, state->n); #else for(i=0, tmp1=0.0; in; ++i){ state->hx[i]=tmp2=state->x[i]-state->hx[i]; tmp1+=tmp2*tmp2; } #endif fpls=LM_CNST(0.5)*tmp1; *ffpls=tmp1; if (fpls <= f + slp * alpha * lambda) { /* solution found */ *iretcd = 0; if (lambda == LM_CNST(1.) && sln > stepmx * LM_CNST(.99)) *mxtake = 1; return; } /* else : solution not (yet) found */ /* First find a point with a finite value */ if (lambda < rmnlmb) { /* no satisfactory xpls found sufficiently distinct from x */ *iretcd = 1; return; } else { /* calculate new lambda */ /* modifications to cover non-finite values */ if (!LM_FINITE(fpls)) { lambda *= LM_CNST(0.1); firstback = 1; } else { if (firstback) { /* first backtrack: quadratic fit */ tlmbda = -lambda * slp / ((fpls - f - slp) * LM_CNST(2.)); firstback = 0; } else { /* all subsequent backtracks: cubic fit */ t1 = fpls - f - lambda * slp; t2 = pfpls - f - plmbda * slp; t3 = LM_CNST(1.) / (lambda - plmbda); a3 = LM_CNST(3.) * t3 * (t1 / (lambda * lambda) - t2 / (plmbda * plmbda)); b = t3 * (t2 * lambda / (plmbda * plmbda) - t1 * plmbda / (lambda * lambda)); disc = b * b - a3 * slp; if (disc > b * b) /* only one positive critical point, must be minimum */ tlmbda = (-b + ((a3 < 0)? -(LM_REAL)sqrt(disc): (LM_REAL)sqrt(disc))) /a3; else /* both critical points positive, first is minimum */ tlmbda = (-b + ((a3 < 0)? (LM_REAL)sqrt(disc): -(LM_REAL)sqrt(disc))) /a3; if (tlmbda > lambda * LM_CNST(.5)) tlmbda = lambda * LM_CNST(.5); } plmbda = lambda; pfpls = fpls; if (tlmbda < lambda * LM_CNST(.1)) lambda *= LM_CNST(.1); else lambda = tlmbda; } } } /* this point is reached when the iterations limit is exceeded */ *iretcd = 1; /* failed */ return; } /* LNSRCH */ /* * This function seeks the parameter vector p that best describes the measurements * vector x under box constraints. * More precisely, given a vector function func : R^m --> R^n with n>=m, * it finds p s.t. func(p) ~= x, i.e. the squared second order (i.e. L2) norm of * e=x-func(p) is minimized under the constraints lb[i]<=p[i]<=ub[i]. * If no lower bound constraint applies for p[i], use -DBL_MAX/-FLT_MAX for lb[i]; * If no upper bound constraint applies for p[i], use DBL_MAX/FLT_MAX for ub[i]. * * This function requires an analytic Jacobian. In case the latter is unavailable, * use LEVMAR_BC_DIF() bellow * * Returns the number of iterations (>=0) if successful, LM_ERROR if failed * * For details, see C. Kanzow, N. Yamashita and M. Fukushima: "Levenberg-Marquardt * methods for constrained nonlinear equations with strong local convergence properties", * Journal of Computational and Applied Mathematics 172, 2004, pp. 375-397. * Also, see K. Madsen, H.B. Nielsen and O. Tingleff's lecture notes on * unconstrained Levenberg-Marquardt at http://www.imm.dtu.dk/pubdb/views/edoc_download.php/3215/pdf/imm3215.pdf * * The algorithm implemented by this function employs projected gradient steps. Since steepest descent * is very sensitive to poor scaling, diagonal scaling has been implemented through the dscl argument: * Instead of minimizing f(p) for p, f(D*q) is minimized for q=D^-1*p, D being a diagonal scaling * matrix whose diagonal equals dscl (see Nocedal-Wright p.27). dscl should contain "typical" magnitudes * for the parameters p. A NULL value for dscl implies no scaling. i.e. D=I. * To account for scaling, the code divides the starting point and box bounds pointwise by dscl. Moreover, * before calling func and jacf the scaling has to be undone (by multiplying), as should be done with * the final point. Note also that jac_q=jac_p*D, where jac_q, jac_p are the jacobians w.r.t. q & p, resp. */ int LEVMAR_BC_DER( void (*func)(LM_REAL *p, LM_REAL *hx, int m, int n, void *adata), /* functional relation describing measurements. A p \in R^m yields a \hat{x} \in R^n */ void (*jacf)(LM_REAL *p, LM_REAL *j, int m, int n, void *adata), /* function to evaluate the Jacobian \part x / \part p */ LM_REAL *p, /* I/O: initial parameter estimates. On output has the estimated solution */ LM_REAL *x, /* I: measurement vector. NULL implies a zero vector */ int m, /* I: parameter vector dimension (i.e. #unknowns) */ int n, /* I: measurement vector dimension */ LM_REAL *lb, /* I: vector of lower bounds. If NULL, no lower bounds apply */ LM_REAL *ub, /* I: vector of upper bounds. If NULL, no upper bounds apply */ LM_REAL *dscl, /* I: diagonal scaling constants. NULL implies no scaling */ int itmax, /* I: maximum number of iterations */ LM_REAL opts[4], /* I: minim. options [\mu, \epsilon1, \epsilon2, \epsilon3]. Respectively the scale factor for initial \mu, * stopping thresholds for ||J^T e||_inf, ||Dp||_2 and ||e||_2. Set to NULL for defaults to be used. * Note that ||J^T e||_inf is computed on free (not equal to lb[i] or ub[i]) variables only. */ LM_REAL info[LM_INFO_SZ], /* O: information regarding the minimization. Set to NULL if don't care * info[0]= ||e||_2 at initial p. * info[1-4]=[ ||e||_2, ||J^T e||_inf, ||Dp||_2, mu/max[J^T J]_ii ], all computed at estimated p. * info[5]= # iterations, * info[6]=reason for terminating: 1 - stopped by small gradient J^T e * 2 - stopped by small Dp * 3 - stopped by itmax * 4 - singular matrix. Restart from current p with increased mu * 5 - no further error reduction is possible. Restart with increased mu * 6 - stopped by small ||e||_2 * 7 - stopped by invalid (i.e. NaN or Inf) "func" values. This is a user error * info[7]= # function evaluations * info[8]= # Jacobian evaluations * info[9]= # linear systems solved, i.e. # attempts for reducing error */ LM_REAL *work, /* working memory at least LM_BC_DER_WORKSZ() reals large, allocated if NULL */ LM_REAL *covar, /* O: Covariance matrix corresponding to LS solution; mxm. Set to NULL if not needed. */ void *adata) /* pointer to possibly additional data, passed uninterpreted to func & jacf. * Set to NULL if not needed */ { register int i, j, k, l; int worksz, freework=0, issolved; /* temp work arrays */ LM_REAL *e, /* nx1 */ *hx, /* \hat{x}_i, nx1 */ *jacTe, /* J^T e_i mx1 */ *jac, /* nxm */ *jacTjac, /* mxm */ *Dp, /* mx1 */ *diag_jacTjac, /* diagonal of J^T J, mx1 */ *pDp, /* p + Dp, mx1 */ *sp_pDp=NULL; /* dscl*p or dscl*pDp, mx1 */ register LM_REAL mu, /* damping constant */ tmp; /* mainly used in matrix & vector multiplications */ LM_REAL p_eL2, jacTe_inf, pDp_eL2; /* ||e(p)||_2, ||J^T e||_inf, ||e(p+Dp)||_2 */ LM_REAL p_L2, Dp_L2=LM_REAL_MAX, dF, dL; LM_REAL tau, eps1, eps2, eps2_sq, eps3; LM_REAL init_p_eL2; int nu=2, nu2, stop=0, nfev, njev=0, nlss=0; const int nm=n*m; /* variables for constrained LM */ struct FUNC_STATE fstate; LM_REAL alpha=LM_CNST(1e-4), beta=LM_CNST(0.9), gamma=LM_CNST(0.99995), rho=LM_CNST(1e-8); LM_REAL t, t0, jacTeDp; LM_REAL tmin=LM_CNST(1e-12), tming=LM_CNST(1e-18); /* minimum step length for LS and PG steps */ const LM_REAL tini=LM_CNST(1.0); /* initial step length for LS and PG steps */ int nLMsteps=0, nLSsteps=0, nPGsteps=0, gprevtaken=0; int numactive; int (*linsolver)(LM_REAL *A, LM_REAL *B, LM_REAL *x, int m)=NULL; mu=jacTe_inf=t=0.0; tmin=tmin; /* -Wall */ if(n0; ) if(dscl[i]<=0.0){ fprintf(stderr, LCAT(LEVMAR_BC_DER, "(): scaling constants should be positive (scale %d: %g <= 0)\n"), i, dscl[i]); return LM_ERROR; } sp_pDp=(LM_REAL *)malloc(m*sizeof(LM_REAL)); if(!sp_pDp){ fprintf(stderr, LCAT(LEVMAR_BC_DER, "(): memory allocation request failed\n")); return LM_ERROR; } } if(opts){ tau=opts[0]; eps1=opts[1]; eps2=opts[2]; eps2_sq=opts[2]*opts[2]; eps3=opts[3]; } else{ // use default values tau=LM_CNST(LM_INIT_MU); eps1=LM_CNST(LM_STOP_THRESH); eps2=LM_CNST(LM_STOP_THRESH); eps2_sq=LM_CNST(LM_STOP_THRESH)*LM_CNST(LM_STOP_THRESH); eps3=LM_CNST(LM_STOP_THRESH); } if(!work){ worksz=LM_BC_DER_WORKSZ(m, n); //2*n+4*m + n*m + m*m; work=(LM_REAL *)malloc(worksz*sizeof(LM_REAL)); /* allocate a big chunk in one step */ if(!work){ fprintf(stderr, LCAT(LEVMAR_BC_DER, "(): memory allocation request failed\n")); return LM_ERROR; } freework=1; } /* set up work arrays */ e=work; hx=e + n; jacTe=hx + n; jac=jacTe + m; jacTjac=jac + nm; Dp=jacTjac + m*m; diag_jacTjac=Dp + m; pDp=diag_jacTjac + m; fstate.n=n; fstate.hx=hx; fstate.x=x; fstate.lb=lb; fstate.ub=ub; fstate.adata=adata; fstate.nfev=&nfev; /* see if starting point is within the feasible set */ for(i=0; i0; ) p[i]/=dscl[i]; BOXSCALE(lb, ub, dscl, m, 1); } for(k=0; k0; ) sp_pDp[i]=p[i]*dscl[i]; (*jacf)(sp_pDp, jac, m, n, adata); ++njev; /* compute jac*D */ for(i=n; i-->0; ){ register LM_REAL *jacim; jacim=jac+i*m; for(j=m; j-->0; ) jacim[j]*=dscl[j]; // jac[i*m+j]*=dscl[j]; } } /* J^T J, J^T e */ if(nm<__BLOCKSZ__SQ){ // this is a small problem /* J^T*J_ij = \sum_l J^T_il * J_lj = \sum_l J_li * J_lj. * Thus, the product J^T J can be computed using an outer loop for * l that adds J_li*J_lj to each element ij of the result. Note that * with this scheme, the accesses to J and JtJ are always along rows, * therefore induces less cache misses compared to the straightforward * algorithm for computing the product (i.e., l loop is innermost one). * A similar scheme applies to the computation of J^T e. * However, for large minimization problems (i.e., involving a large number * of unknowns and measurements) for which J/J^T J rows are too large to * fit in the L1 cache, even this scheme incures many cache misses. In * such cases, a cache-efficient blocking scheme is preferable. * * Thanks to John Nitao of Lawrence Livermore Lab for pointing out this * performance problem. * * Note that the non-blocking algorithm is faster on small * problems since in this case it avoids the overheads of blocking. */ register LM_REAL alpha, *jaclm, *jacTjacim; /* looping downwards saves a few computations */ for(i=m*m; i-->0; ) jacTjac[i]=0.0; for(i=m; i-->0; ) jacTe[i]=0.0; for(l=n; l-->0; ){ jaclm=jac+l*m; for(i=m; i-->0; ){ jacTjacim=jacTjac+i*m; alpha=jaclm[i]; //jac[l*m+i]; for(j=i+1; j-->0; ) /* j<=i computes lower triangular part only */ jacTjacim[j]+=jaclm[j]*alpha; //jacTjac[i*m+j]+=jac[l*m+j]*alpha /* J^T e */ jacTe[i]+=alpha*e[l]; } } for(i=m; i-->0; ) /* copy to upper part */ for(j=i+1; j0; * if p[i]==lb[i] g[i]<0; otherwise g[i]=0 */ for(i=j=numactive=0, p_L2=jacTe_inf=0.0; i0.0) ++j; } else if(lb && p[i]==lb[i]){ ++numactive; if(jacTe[i]<0.0) ++j; } else if(jacTe_inf < (tmp=FABS(jacTe[i]))) jacTe_inf=tmp; diag_jacTjac[i]=jacTjac[i*m+i]; /* save diagonal entries so that augmentation can be later canceled */ p_L2+=p[i]*p[i]; } //p_L2=sqrt(p_L2); #if 0 if(!(k%100)){ printf("Current estimate: "); for(i=0; itmp) tmp=diag_jacTjac[i]; /* find max diagonal element */ mu=tau*tmp; } else mu=LM_CNST(0.5)*tau*p_eL2; /* use Kanzow's starting mu */ } /* determine increment using a combination of adaptive damping, line search and projected gradient search */ while(1){ /* augment normal equations */ for(i=0; i=(p_L2+eps2)/(LM_CNST(EPSILON)*LM_CNST(EPSILON))){ /* almost singular */ stop=4; break; } if(!dscl){ (*func)(pDp, hx, m, n, adata); ++nfev; /* evaluate function at p + Dp */ } else{ for(i=m; i-->0; ) sp_pDp[i]=pDp[i]*dscl[i]; (*func)(sp_pDp, hx, m, n, adata); ++nfev; /* evaluate function at p + Dp */ } /* ### hx=x-hx, pDp_eL2=||hx|| */ #if 1 pDp_eL2=LEVMAR_L2NRMXMY(hx, x, hx, n); #else for(i=0, pDp_eL2=0.0; i0.0){ dF=p_eL2-pDp_eL2; tmp=(LM_CNST(2.0)*dF/dL-LM_CNST(1.0)); tmp=LM_CNST(1.0)-tmp*tmp*tmp; mu=mu*( (tmp>=LM_CNST(ONE_THIRD))? tmp : LM_CNST(ONE_THIRD) ); } else{ tmp=LM_CNST(0.1)*pDp_eL2; /* pDp_eL2 is the new p_eL2 */ mu=(mu>=tmp)? tmp : mu; } #else tmp=LM_CNST(0.1)*pDp_eL2; /* pDp_eL2 is the new p_eL2 */ mu=(mu>=tmp)? tmp : mu; #endif nu=2; for(i=0 ; i=LM_CNST(1.0))? tmp : LM_CNST(1.0) ); LNSRCH(m, p, p_eL2, jacTe, Dp, alpha, pDp, &pDp_eL2, func, &fstate, &mxtake, &iretcd, stepmx, steptl, dscl); /* NOTE: LNSRCH() updates hx */ if(iretcd!=0 || !LM_FINITE(pDp_eL2)) goto gradproj; /* rather inelegant but effective way to handle LNSRCH() failures... */ } #else /* use the simpler (but slower!) line search described by Kanzow et al */ for(t=tini; t>tmin; t*=beta){ for(i=0; i0; ) sp_pDp[i]=pDp[i]*dscl[i]; (*func)(sp_pDp, hx, m, n, adata); ++nfev; /* evaluate function at p + t*Dp */ } /* compute ||e(pDp)||_2 */ /* ### hx=x-hx, pDp_eL2=||hx|| */ #if 1 pDp_eL2=LEVMAR_L2NRMXMY(hx, x, hx, n); #else for(i=0, pDp_eL2=0.0; itming; t*=beta){ for(i=0; i0; ) sp_pDp[i]=pDp[i]*dscl[i]; (*func)(sp_pDp, hx, m, n, adata); ++nfev; /* evaluate function at p - t*g */ } /* compute ||e(pDp)||_2 */ /* ### hx=x-hx, pDp_eL2=||hx|| */ #if 1 pDp_eL2=LEVMAR_L2NRMXMY(hx, x, hx, n); #else for(i=0, pDp_eL2=0.0; i=itmax) stop=3; for(i=0; i0; ) for(j=m; j-->0; ) covar[i*m+j]*=(dscl[i]*dscl[j]); } } if(freework) free(work); #ifdef LINSOLVERS_RETAIN_MEMORY if(linsolver) (*linsolver)(NULL, NULL, NULL, 0); #endif #if 0 printf("%d LM steps, %d line search, %d projected gradient\n", nLMsteps, nLSsteps, nPGsteps); #endif if(dscl){ /* scale final point and constraints */ for(i=0; ifunc))(p, hx, m, n, dta->adata); } static void LMBC_DIF_JACF(LM_REAL *p, LM_REAL *jac, int m, int n, void *data) { struct LMBC_DIF_DATA *dta=(struct LMBC_DIF_DATA *)data; if(dta->ffdif){ /* evaluate user-supplied function at p */ (*(dta->func))(p, dta->hx, m, n, dta->adata); LEVMAR_FDIF_FORW_JAC_APPROX(dta->func, p, dta->hx, dta->hxx, dta->delta, jac, m, n, dta->adata); } else LEVMAR_FDIF_CENT_JAC_APPROX(dta->func, p, dta->hx, dta->hxx, dta->delta, jac, m, n, dta->adata); } /* No Jacobian version of the LEVMAR_BC_DER() function above: the Jacobian is approximated with * the aid of finite differences (forward or central, see the comment for the opts argument) * Ideally, this function should be implemented with a secant approach. Currently, it just calls * LEVMAR_BC_DER() */ int LEVMAR_BC_DIF( void (*func)(LM_REAL *p, LM_REAL *hx, int m, int n, void *adata), /* functional relation describing measurements. A p \in R^m yields a \hat{x} \in R^n */ LM_REAL *p, /* I/O: initial parameter estimates. On output has the estimated solution */ LM_REAL *x, /* I: measurement vector. NULL implies a zero vector */ int m, /* I: parameter vector dimension (i.e. #unknowns) */ int n, /* I: measurement vector dimension */ LM_REAL *lb, /* I: vector of lower bounds. If NULL, no lower bounds apply */ LM_REAL *ub, /* I: vector of upper bounds. If NULL, no upper bounds apply */ LM_REAL *dscl, /* I: diagonal scaling constants. NULL implies no scaling */ int itmax, /* I: maximum number of iterations */ LM_REAL opts[5], /* I: opts[0-4] = minim. options [\mu, \epsilon1, \epsilon2, \epsilon3, \delta]. Respectively the * scale factor for initial \mu, stopping thresholds for ||J^T e||_inf, ||Dp||_2 and ||e||_2 and * the step used in difference approximation to the Jacobian. Set to NULL for defaults to be used. * If \delta<0, the Jacobian is approximated with central differences which are more accurate * (but slower!) compared to the forward differences employed by default. */ LM_REAL info[LM_INFO_SZ], /* O: information regarding the minimization. Set to NULL if don't care * info[0]= ||e||_2 at initial p. * info[1-4]=[ ||e||_2, ||J^T e||_inf, ||Dp||_2, mu/max[J^T J]_ii ], all computed at estimated p. * info[5]= # iterations, * info[6]=reason for terminating: 1 - stopped by small gradient J^T e * 2 - stopped by small Dp * 3 - stopped by itmax * 4 - singular matrix. Restart from current p with increased mu * 5 - no further error reduction is possible. Restart with increased mu * 6 - stopped by small ||e||_2 * 7 - stopped by invalid (i.e. NaN or Inf) "func" values. This is a user error * info[7]= # function evaluations * info[8]= # Jacobian evaluations * info[9]= # linear systems solved, i.e. # attempts for reducing error */ LM_REAL *work, /* working memory at least LM_BC_DIF_WORKSZ() reals large, allocated if NULL */ LM_REAL *covar, /* O: Covariance matrix corresponding to LS solution; mxm. Set to NULL if not needed. */ void *adata) /* pointer to possibly additional data, passed uninterpreted to func. * Set to NULL if not needed */ { struct LMBC_DIF_DATA data; int ret; //fprintf(stderr, RCAT("\nWarning: current implementation of ", LEVMAR_BC_DIF) "() does not use a secant approach!\n\n"); data.ffdif=!opts || opts[4]>=0.0; data.func=func; data.hx=(LM_REAL *)malloc(2*n*sizeof(LM_REAL)); /* allocate a big chunk in one step */ if(!data.hx){ fprintf(stderr, LCAT(LEVMAR_BC_DIF, "(): memory allocation request failed\n")); return LM_ERROR; } data.hxx=data.hx+n; data.adata=adata; data.delta=(opts)? FABS(opts[4]) : (LM_REAL)LM_DIFF_DELTA; ret=LEVMAR_BC_DER(LMBC_DIF_FUNC, LMBC_DIF_JACF, p, x, m, n, lb, ub, dscl, itmax, opts, info, work, covar, (void *)&data); if(info){ /* correct the number of function calls */ if(data.ffdif) info[7]+=info[8]*(m+1); /* each Jacobian evaluation costs m+1 function calls */ else info[7]+=info[8]*(2*m); /* each Jacobian evaluation costs 2*m function calls */ } free(data.hx); return ret; } /* undefine everything. THIS MUST REMAIN AT THE END OF THE FILE */ #undef FUNC_STATE #undef LNSRCH #undef BOXPROJECT #undef BOXSCALE #undef LEVMAR_BOX_CHECK #undef VECNORM #undef LEVMAR_BC_DER #undef LMBC_DIF_DATA #undef LMBC_DIF_FUNC #undef LMBC_DIF_JACF #undef LEVMAR_BC_DIF #undef LEVMAR_FDIF_FORW_JAC_APPROX #undef LEVMAR_FDIF_CENT_JAC_APPROX #undef LEVMAR_COVAR #undef LEVMAR_TRANS_MAT_MAT_MULT #undef LEVMAR_L2NRMXMY #undef AX_EQ_B_LU #undef AX_EQ_B_CHOL #undef AX_EQ_B_PLASMA_CHOL #undef AX_EQ_B_QR #undef AX_EQ_B_QRLS #undef AX_EQ_B_SVD #undef AX_EQ_B_BK stimfit-0.15.8/src/libstfnum/levmar/LICENSE0000664000175000017500000004311013062445067015302 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. stimfit-0.15.8/src/libstfnum/levmar/README.txt0000664000175000017500000001012713062445067015775 00000000000000 ************************************************************** LEVMAR version 2.6 By Manolis Lourakis Institute of Computer Science Foundation for Research and Technology - Hellas Heraklion, Crete, Greece ************************************************************** GENERAL This is levmar, a copylefted C/C++ implementation of the Levenberg-Marquardt non-linear least squares algorithm. levmar includes double and single precision LM versions, both with analytic and finite difference approximated Jacobians. levmar also has some support for constrained non-linear least squares, allowing linear equation, box and linear inequality constraints. The following options regarding the solution of the underlying augmented normal equations are offered: 1) Assuming that you have LAPACK (or an equivalent vendor library such as ESSL, MKL, NAG, ...) installed, you can use the included LAPACK-based solvers (default). 2) If you don't have LAPACK or decide not to use it, undefine HAVE_LAPACK in levmar.h and a LAPACK-free, LU-based linear systems solver will by used. Also, the line setting the variable LAPACKLIBS in the Makefile should be commented out. It is strongly recommended that you *do* employ LAPACK; if you don't have it already, I suggest getting clapack from http://www.netlib.org/clapack. However, LAPACK's use is not mandatory and the 2nd option makes levmar totally self-contained. See lmdemo.c for examples of use and http://www.ics.forth.gr/~lourakis/levmar for general comments. An example of using levmar for data fitting is in expfit.c The mathematical theory behind levmar is described in the lecture notes entitled "Methods for Non-Linear Least Squares Problems", by K. Madsen, H.B. Nielsen and O. Tingleff, Technical University of Denmark (http://www.imm.dtu.dk/courses/02611/nllsq.pdf). LICENSE levmar is released under the GNU Public License (GPL), which can be found in the included LICENSE file. Note that under the terms of GPL, commercial use is allowed only if a software employing levmar is also published in source under the GPL. However, if you are interested in using levmar in a proprietary commercial application, a commercial license for levmar can be obtained by contacting the author using the email address at the end of this file. COMPILATION - The preferred way to build levmar is through the CMake cross-platform build system. The included CMakeLists.txt file can be used to generate makefiles for Unix systems or project files for Windows systems. CMakeLists.txt defines some configuration variables that control certain aspects of levmar and can be modified from CMake's user interface. The values of these variables are automatically propagated to levmar.h after CMake runs. More information on how to use CMake can be found at http://www.cmake.org - levmar can also be built using the supplied makefiles. Platform-specific instructions are given below. Before compiling, you might consider setting a few configuration options found at the top of levmar.h. See the accompanying comments for more details. -- On a Linux/Unix system, typing "make" will build both levmar and the demo program using gcc. Alternatively, if Intel's C++ compiler is installed, it can be used by typing "make -f Makefile.icc". -- Under Windows and if Visual C is installed & configured for command line use, type "nmake /f Makefile.vc" in a cmd window to build levmar and the demo program. In case of trouble, read the comments on top of Makefile.vc MATLAB INTERFACE Since version 2.2, the levmar distribution includes a matlab mex interface. See the 'matlab' subdirectory for more information and examples of use. Notice that *_core.c files are not to be compiled directly; For example, Axb_core.c is included by Axb.c, to provide single and double precision routine versions. Send your comments/bug reports to lourakis (at) ics (dot) forth (dot) gr stimfit-0.15.8/src/libstfnum/levmar/lm.h0000664000175000017500000000035413062445067015061 00000000000000#ifndef _DEPR_LM_H_ #define _DEPR_LM_H_ #ifdef _MSC_VER #pragma message("lm.h is deprecated, please use levmar.h instead!") #else #error lm.h is deprecated, please use levmar.h instead! #endif /* _MSC_VER */ #endif /* _DEPR_LM_H_ */ stimfit-0.15.8/src/libstfnum/levmar/misc.h0000664000175000017500000001110013062445067015373 00000000000000///////////////////////////////////////////////////////////////////////////////// // // Levenberg - Marquardt non-linear minimization algorithm // Copyright (C) 2004 Manolis Lourakis (lourakis at ics forth gr) // Institute of Computer Science, Foundation for Research & Technology - Hellas // Heraklion, Crete, Greece. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // ///////////////////////////////////////////////////////////////////////////////// #ifndef _MISC_H_ #define _MISC_H_ /* common suffix for LAPACK subroutines. Define empty in case of no prefix. */ #define LM_LAPACK_SUFFIX _ //#define LM_LAPACK_SUFFIX // define empty /* common prefix for BLAS subroutines. Leave undefined in case of no prefix. * You might also need to modify LM_BLAS_PREFIX below */ /* f2c'd BLAS */ //#define LM_BLAS_PREFIX f2c_ /* C BLAS */ //#define LM_BLAS_PREFIX cblas_ /* common suffix for BLAS subroutines */ //#define LM_BLAS_SUFFIX // define empty if a f2c_ or cblas_ prefix was defined for LM_BLAS_PREFIX above #define LM_BLAS_SUFFIX _ // use this in case of no BLAS prefix #define LCAT_(a, b) #a b #define LCAT(a, b) LCAT_(a, b) // force substitution #define RCAT_(a, b) a #b #define RCAT(a, b) RCAT_(a, b) // force substitution #define LM_MK_LAPACK_NAME(s) LM_ADD_PREFIX(LM_CAT_(s, LM_LAPACK_SUFFIX)) #ifdef LM_BLAS_PREFIX #define LM_MK_BLAS_NAME(s) LM_CAT_(LM_BLAS_PREFIX, LM_ADD_PREFIX(LM_CAT_(s, LM_BLAS_SUFFIX))) #else #define LM_MK_BLAS_NAME(s) LM_ADD_PREFIX(LM_CAT_(s, LM_BLAS_SUFFIX)) #endif #define __BLOCKSZ__ 32 /* block size for cache-friendly matrix-matrix multiply. It should be * such that __BLOCKSZ__^2*sizeof(LM_REAL) is smaller than the CPU (L1) * data cache size. Notice that a value of 32 when LM_REAL=double assumes * an 8Kb L1 data cache (32*32*8=8K). This is a concervative choice since * newer Pentium 4s have a L1 data cache of size 16K, capable of holding * up to 45x45 double blocks. */ #define __BLOCKSZ__SQ (__BLOCKSZ__)*(__BLOCKSZ__) /* add a prefix in front of a token */ #define LM_CAT__(a, b) a ## b #define LM_CAT_(a, b) LM_CAT__(a, b) // force substitution #define LM_ADD_PREFIX(s) LM_CAT_(LM_PREFIX, s) #define FABS(x) (((x)>=0.0)? (x) : -(x)) #ifdef __cplusplus extern "C" { #endif /* blocking-based matrix multiply */ extern void slevmar_trans_mat_mat_mult(float *a, float *b, int n, int m); extern void dlevmar_trans_mat_mat_mult(double *a, double *b, int n, int m); /* forward finite differences */ extern void slevmar_fdif_forw_jac_approx(void (*func)(float *p, float *hx, int m, int n, void *adata), float *p, float *hx, float *hxx, float delta, float *jac, int m, int n, void *adata); extern void dlevmar_fdif_forw_jac_approx(void (*func)(double *p, double *hx, int m, int n, void *adata), double *p, double *hx, double *hxx, double delta, double *jac, int m, int n, void *adata); /* central finite differences */ extern void slevmar_fdif_cent_jac_approx(void (*func)(float *p, float *hx, int m, int n, void *adata), float *p, float *hxm, float *hxp, float delta, float *jac, int m, int n, void *adata); extern void dlevmar_fdif_cent_jac_approx(void (*func)(double *p, double *hx, int m, int n, void *adata), double *p, double *hxm, double *hxp, double delta, double *jac, int m, int n, void *adata); /* e=x-y and ||e|| */ extern float slevmar_L2nrmxmy(float *e, float *x, float *y, int n); extern double dlevmar_L2nrmxmy(double *e, double *x, double *y, int n); /* covariance of LS fit */ extern int slevmar_covar(float *JtJ, float *C, float sumsq, int m, int n); extern int dlevmar_covar(double *JtJ, double *C, double sumsq, int m, int n); /* box constraints consistency check */ extern int slevmar_box_check(float *lb, float *ub, int m); extern int dlevmar_box_check(double *lb, double *ub, int m); /* Cholesky */ extern int slevmar_chol(float *C, float *W, int m); extern int dlevmar_chol(double *C, double *W, int m); #ifdef __cplusplus } #endif #endif /* _MISC_H_ */ stimfit-0.15.8/src/libstfnum/levmar/Axb_core.c0000664000175000017500000010704113062445067016167 00000000000000///////////////////////////////////////////////////////////////////////////////// // // Solution of linear systems involved in the Levenberg - Marquardt // minimization algorithm // Copyright (C) 2004 Manolis Lourakis (lourakis at ics forth gr) // Institute of Computer Science, Foundation for Research & Technology - Hellas // Heraklion, Crete, Greece. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // ///////////////////////////////////////////////////////////////////////////////// /* Solvers for the linear systems Ax=b. Solvers should NOT modify their A & B arguments! */ #ifndef LM_REAL // not included by Axb.c #error This file should not be compiled directly! #endif #ifdef LINSOLVERS_RETAIN_MEMORY #define __STATIC__ static #else #define __STATIC__ // empty #endif /* LINSOLVERS_RETAIN_MEMORY */ #ifdef HAVE_LAPACK /* prototypes of LAPACK routines */ #define GEQRF LM_MK_LAPACK_NAME(geqrf) #define ORGQR LM_MK_LAPACK_NAME(orgqr) #define TRTRS LM_MK_LAPACK_NAME(trtrs) #define POTF2 LM_MK_LAPACK_NAME(potf2) #define POTRF LM_MK_LAPACK_NAME(potrf) #define POTRS LM_MK_LAPACK_NAME(potrs) #define GETRF LM_MK_LAPACK_NAME(getrf) #define GETRS LM_MK_LAPACK_NAME(getrs) #define GESVD LM_MK_LAPACK_NAME(gesvd) #define GESDD LM_MK_LAPACK_NAME(gesdd) #define SYTRF LM_MK_LAPACK_NAME(sytrf) #define SYTRS LM_MK_LAPACK_NAME(sytrs) #define PLASMA_POSV LM_CAT_(PLASMA_, LM_ADD_PREFIX(posv)) #ifdef __cplusplus extern "C" { #endif /* QR decomposition */ extern int GEQRF(int *m, int *n, LM_REAL *a, int *lda, LM_REAL *tau, LM_REAL *work, int *lwork, int *info); extern int ORGQR(int *m, int *n, int *k, LM_REAL *a, int *lda, LM_REAL *tau, LM_REAL *work, int *lwork, int *info); /* solution of triangular systems */ extern int TRTRS(char *uplo, char *trans, char *diag, int *n, int *nrhs, LM_REAL *a, int *lda, LM_REAL *b, int *ldb, int *info); /* Cholesky decomposition and systems solution */ extern int POTF2(char *uplo, int *n, LM_REAL *a, int *lda, int *info); extern int POTRF(char *uplo, int *n, LM_REAL *a, int *lda, int *info); /* block version of dpotf2 */ extern int POTRS(char *uplo, int *n, int *nrhs, LM_REAL *a, int *lda, LM_REAL *b, int *ldb, int *info); /* LU decomposition and systems solution */ extern int GETRF(int *m, int *n, LM_REAL *a, int *lda, int *ipiv, int *info); extern int GETRS(char *trans, int *n, int *nrhs, LM_REAL *a, int *lda, int *ipiv, LM_REAL *b, int *ldb, int *info); /* Singular Value Decomposition (SVD) */ extern int GESVD(char *jobu, char *jobvt, int *m, int *n, LM_REAL *a, int *lda, LM_REAL *s, LM_REAL *u, int *ldu, LM_REAL *vt, int *ldvt, LM_REAL *work, int *lwork, int *info); /* lapack 3.0 new SVD routine, faster than xgesvd(). * In case that your version of LAPACK does not include them, use the above two older routines */ extern int GESDD(char *jobz, int *m, int *n, LM_REAL *a, int *lda, LM_REAL *s, LM_REAL *u, int *ldu, LM_REAL *vt, int *ldvt, LM_REAL *work, int *lwork, int *iwork, int *info); /* LDLt/UDUt factorization and systems solution */ extern int SYTRF(char *uplo, int *n, LM_REAL *a, int *lda, int *ipiv, LM_REAL *work, int *lwork, int *info); extern int SYTRS(char *uplo, int *n, int *nrhs, LM_REAL *a, int *lda, int *ipiv, LM_REAL *b, int *ldb, int *info); #ifdef __cplusplus } #endif /* precision-specific definitions */ #define AX_EQ_B_QR LM_ADD_PREFIX(Ax_eq_b_QR) #define AX_EQ_B_QRLS LM_ADD_PREFIX(Ax_eq_b_QRLS) #define AX_EQ_B_CHOL LM_ADD_PREFIX(Ax_eq_b_Chol) #define AX_EQ_B_LU LM_ADD_PREFIX(Ax_eq_b_LU) #define AX_EQ_B_SVD LM_ADD_PREFIX(Ax_eq_b_SVD) #define AX_EQ_B_BK LM_ADD_PREFIX(Ax_eq_b_BK) #define AX_EQ_B_PLASMA_CHOL LM_ADD_PREFIX(Ax_eq_b_PLASMA_Chol) /* * This function returns the solution of Ax = b * * The function is based on QR decomposition with explicit computation of Q: * If A=Q R with Q orthogonal and R upper triangular, the linear system becomes * Q R x = b or R x = Q^T b. * The last equation can be solved directly. * * A is mxm, b is mx1 * * The function returns 0 in case of error, 1 if successful * * This function is often called repetitively to solve problems of identical * dimensions. To avoid repetitive malloc's and free's, allocated memory is * retained between calls and free'd-malloc'ed when not of the appropriate size. * A call with NULL as the first argument forces this memory to be released. */ int AX_EQ_B_QR(LM_REAL *A, LM_REAL *B, LM_REAL *x, int m) { __STATIC__ LM_REAL *buf=NULL; __STATIC__ int buf_sz=0; static int nb=0; /* no __STATIC__ decl. here! */ LM_REAL *a, *tau, *r, *work; int a_sz, tau_sz, r_sz, tot_sz; register int i, j; int info, worksz, nrhs=1; register LM_REAL sum; if(!A) #ifdef LINSOLVERS_RETAIN_MEMORY { if(buf) free(buf); buf=NULL; buf_sz=0; return 1; } #else return 1; /* NOP */ #endif /* LINSOLVERS_RETAIN_MEMORY */ /* calculate required memory size */ a_sz=m*m; tau_sz=m; r_sz=m*m; /* only the upper triangular part really needed */ if(!nb){ LM_REAL tmp; worksz=-1; // workspace query; optimal size is returned in tmp GEQRF((int *)&m, (int *)&m, NULL, (int *)&m, NULL, (LM_REAL *)&tmp, (int *)&worksz, (int *)&info); nb=((int)tmp)/m; // optimal worksize is m*nb } worksz=nb*m; tot_sz=a_sz + tau_sz + r_sz + worksz; #ifdef LINSOLVERS_RETAIN_MEMORY if(tot_sz>buf_sz){ /* insufficient memory, allocate a "big" memory chunk at once */ if(buf) free(buf); /* free previously allocated memory */ buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_QR) "() failed!\n"); exit(1); } } #else buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_QR) "() failed!\n"); exit(1); } #endif /* LINSOLVERS_RETAIN_MEMORY */ a=buf; tau=a+a_sz; r=tau+tau_sz; work=r+r_sz; /* store A (column major!) into a */ for(i=0; ibuf_sz){ /* insufficient memory, allocate a "big" memory chunk at once */ if(buf) free(buf); /* free previously allocated memory */ buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_QRLS) "() failed!\n"); exit(1); } } #else buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_QRLS) "() failed!\n"); exit(1); } #endif /* LINSOLVERS_RETAIN_MEMORY */ a=buf; tau=a+a_sz; r=tau+tau_sz; work=r+r_sz; /* store A (column major!) into a */ for(i=0; ibuf_sz){ /* insufficient memory, allocate a "big" memory chunk at once */ if(buf) free(buf); /* free previously allocated memory */ buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_CHOL) "() failed!\n"); exit(1); } } #else buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_CHOL) "() failed!\n"); exit(1); } #endif /* LINSOLVERS_RETAIN_MEMORY */ a=buf; /* store A into a and B into x. A is assumed symmetric, * hence no transposition is needed */ memcpy(a, A, a_sz*sizeof(LM_REAL)); memcpy(x, B, m*sizeof(LM_REAL)); /* Cholesky decomposition of A */ //POTF2("L", (int *)&m, a, (int *)&m, (int *)&info); POTRF("L", (int *)&m, a, (int *)&m, (int *)&info); /* error treatment */ if(info!=0){ if(info<0){ fprintf(stderr, RCAT(RCAT(RCAT("LAPACK error: illegal value for argument %d of ", POTF2) "/", POTRF) " in ", AX_EQ_B_CHOL) "()\n", -info); exit(1); } else{ fprintf(stderr, RCAT(RCAT(RCAT("LAPACK error: the leading minor of order %d is not positive definite,\nthe factorization could not be completed for ", POTF2) "/", POTRF) " in ", AX_EQ_B_CHOL) "()\n", info); #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 0; } } /* solve using the computed Cholesky in one lapack call */ POTRS("L", (int *)&m, (int *)&nrhs, a, (int *)&m, x, (int *)&m, &info); if(info<0){ fprintf(stderr, RCAT(RCAT("LAPACK error: illegal value for argument %d of ", POTRS) " in ", AX_EQ_B_CHOL) "()\n", -info); exit(1); } #if 0 /* alternative: solve the linear system L y = b ... */ TRTRS("L", "N", "N", (int *)&m, (int *)&nrhs, a, (int *)&m, x, (int *)&m, &info); /* error treatment */ if(info!=0){ if(info<0){ fprintf(stderr, RCAT(RCAT("LAPACK error: illegal value for argument %d of ", TRTRS) " in ", AX_EQ_B_CHOL) "()\n", -info); exit(1); } else{ fprintf(stderr, RCAT("LAPACK error: the %d-th diagonal element of A is zero (singular matrix) in ", AX_EQ_B_CHOL) "()\n", info); #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 0; } } /* ... solve the linear system L^T x = y */ TRTRS("L", "T", "N", (int *)&m, (int *)&nrhs, a, (int *)&m, x, (int *)&m, &info); /* error treatment */ if(info!=0){ if(info<0){ fprintf(stderr, RCAT(RCAT("LAPACK error: illegal value for argument %d of ", TRTRS) "in ", AX_EQ_B_CHOL) "()\n", -info); exit(1); } else{ fprintf(stderr, RCAT("LAPACK error: the %d-th diagonal element of A is zero (singular matrix) in ", AX_EQ_B_CHOL) "()\n", info); #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 0; } } #endif /* 0 */ #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 1; } #ifdef HAVE_PLASMA /* Linear algebra using PLASMA parallel library for multicore CPUs. * http://icl.cs.utk.edu/plasma/ * * WARNING: BLAS multithreading should be disabled, e.g. setenv MKL_NUM_THREADS 1 */ #ifndef _LM_PLASMA_MISC_ /* avoid multiple inclusion of helper code */ #define _LM_PLASMA_MISC_ #include #include #include #include #include /* programmatically determine the number of cores on the current machine */ #ifdef _WIN32 #include #elif __linux #include #endif static int getnbcores() { #ifdef _WIN32 SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return sysinfo.dwNumberOfProcessors; #elif __linux return sysconf(_SC_NPROCESSORS_ONLN); #else // unknown system return 2<<1; // will be halved by right shift below #endif } static int PLASMA_ncores=-(getnbcores()>>1); // >0 if PLASMA initialized, <0 otherwise /* user-specified number of cores */ void levmar_PLASMA_setnbcores(int cores) { PLASMA_ncores=(cores>0)? -cores : ((cores)? cores : -2); } #endif /* _LM_PLASMA_MISC_ */ /* * This function returns the solution of Ax=b * * The function assumes that A is symmetric & positive definite and employs the * Cholesky decomposition implemented by PLASMA for homogeneous multicore processors. * * A is mxm, b is mx1 * * The function returns 0 in case of error, 1 if successfull * * This function is often called repetitively to solve problems of identical * dimensions. To avoid repetitive malloc's and free's, allocated memory is * retained between calls and free'd-malloc'ed when not of the appropriate size. * A call with NULL as the first argument forces this memory to be released. */ int AX_EQ_B_PLASMA_CHOL(LM_REAL *A, LM_REAL *B, LM_REAL *x, int m) { __STATIC__ LM_REAL *buf=NULL; __STATIC__ int buf_sz=0; LM_REAL *a; int a_sz, tot_sz; int info, nrhs=1; if(A==NULL){ #ifdef LINSOLVERS_RETAIN_MEMORY if(buf) free(buf); buf=NULL; buf_sz=0; #endif /* LINSOLVERS_RETAIN_MEMORY */ PLASMA_Finalize(); PLASMA_ncores=-PLASMA_ncores; return 1; } /* calculate required memory size */ a_sz=m*m; tot_sz=a_sz; #ifdef LINSOLVERS_RETAIN_MEMORY if(tot_sz>buf_sz){ /* insufficient memory, allocate a "big" memory chunk at once */ if(buf) free(buf); /* free previously allocated memory */ buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_PLASMA_CHOL) "() failed!\n"); exit(1); } } #else buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_PLASMA_CHOL) "() failed!\n"); exit(1); } #endif /* LINSOLVERS_RETAIN_MEMORY */ a=buf; /* store A into a and B into x; A is assumed to be symmetric, * hence no transposition is needed */ memcpy(a, A, a_sz*sizeof(LM_REAL)); memcpy(x, B, m*sizeof(LM_REAL)); /* initialize PLASMA */ if(PLASMA_ncores<0){ PLASMA_ncores=-PLASMA_ncores; PLASMA_Init(PLASMA_ncores); fprintf(stderr, RCAT("\n", AX_EQ_B_PLASMA_CHOL) "(): PLASMA is running on %d cores.\n\n", PLASMA_ncores); } /* Solve the linear system */ info=PLASMA_POSV(PlasmaLower, m, 1, a, m, x, m); /* error treatment */ if(info!=0){ if(info<0){ fprintf(stderr, RCAT(RCAT("LAPACK error: illegal value for argument %d of ", PLASMA_POSV) " in ", AX_EQ_B_PLASMA_CHOL) "()\n", -info); exit(1); } else{ fprintf(stderr, RCAT(RCAT("LAPACK error: the leading minor of order %d is not positive definite,\n" "the factorization could not be completed for ", PLASMA_POSV) " in ", AX_EQ_B_CHOL) "()\n", info); #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 0; } } #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 1; } #endif /* HAVE_PLASMA */ /* * This function returns the solution of Ax = b * * The function employs LU decomposition: * If A=L U with L lower and U upper triangular, then the original system * amounts to solving * L y = b, U x = y * * A is mxm, b is mx1 * * The function returns 0 in case of error, 1 if successful * * This function is often called repetitively to solve problems of identical * dimensions. To avoid repetitive malloc's and free's, allocated memory is * retained between calls and free'd-malloc'ed when not of the appropriate size. * A call with NULL as the first argument forces this memory to be released. */ int AX_EQ_B_LU(LM_REAL *A, LM_REAL *B, LM_REAL *x, int m) { __STATIC__ LM_REAL *buf=NULL; __STATIC__ int buf_sz=0; int a_sz, ipiv_sz, tot_sz; register int i, j; int info, *ipiv, nrhs=1; LM_REAL *a; if(!A) #ifdef LINSOLVERS_RETAIN_MEMORY { if(buf) free(buf); buf=NULL; buf_sz=0; return 1; } #else return 1; /* NOP */ #endif /* LINSOLVERS_RETAIN_MEMORY */ /* calculate required memory size */ ipiv_sz=m; a_sz=m*m; tot_sz=a_sz*sizeof(LM_REAL) + ipiv_sz*sizeof(int); /* should be arranged in that order for proper doubles alignment */ #ifdef LINSOLVERS_RETAIN_MEMORY if(tot_sz>buf_sz){ /* insufficient memory, allocate a "big" memory chunk at once */ if(buf) free(buf); /* free previously allocated memory */ buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_LU) "() failed!\n"); exit(1); } } #else buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_LU) "() failed!\n"); exit(1); } #endif /* LINSOLVERS_RETAIN_MEMORY */ a=buf; ipiv=(int *)(a+a_sz); /* store A (column major!) into a and B into x */ for(i=0; ibuf_sz){ /* insufficient memory, allocate a "big" memory chunk at once */ if(buf) free(buf); /* free previously allocated memory */ buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_SVD) "() failed!\n"); exit(1); } } #else buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_SVD) "() failed!\n"); exit(1); } #endif /* LINSOLVERS_RETAIN_MEMORY */ a=buf; u=a+a_sz; s=u+u_sz; vt=s+s_sz; work=vt+vt_sz; iwork=(int *)(work+worksz); /* store A (column major!) into a */ for(i=0; i0.0; eps*=LM_CNST(0.5)) ; eps*=LM_CNST(2.0); } /* compute the pseudoinverse in a */ for(i=0; ithresh; rank++){ one_over_denom=LM_CNST(1.0)/s[rank]; for(j=0; jbuf_sz){ /* insufficient memory, allocate a "big" memory chunk at once */ if(buf) free(buf); /* free previously allocated memory */ buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_BK) "() failed!\n"); exit(1); } } #else buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_BK) "() failed!\n"); exit(1); } #endif /* LINSOLVERS_RETAIN_MEMORY */ a=buf; work=a+a_sz; ipiv=(int *)(work+work_sz); /* store A into a and B into x; A is assumed to be symmetric, hence * the column and row major order representations are the same */ memcpy(a, A, a_sz*sizeof(LM_REAL)); memcpy(x, B, m*sizeof(LM_REAL)); /* LDLt factorization for A */ SYTRF("L", (int *)&m, a, (int *)&m, ipiv, work, (int *)&work_sz, (int *)&info); if(info!=0){ if(info<0){ fprintf(stderr, RCAT(RCAT("LAPACK error: illegal value for argument %d of ", SYTRF) " in ", AX_EQ_B_BK) "()\n", -info); exit(1); } else{ fprintf(stderr, RCAT(RCAT("LAPACK error: singular block diagonal matrix D for", SYTRF) " in ", AX_EQ_B_BK)"() [D(%d, %d) is zero]\n", info, info); #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 0; } } /* solve the system with the computed factorization */ SYTRS("L", (int *)&m, (int *)&nrhs, a, (int *)&m, ipiv, x, (int *)&m, (int *)&info); if(info<0){ fprintf(stderr, RCAT(RCAT("LAPACK error: illegal value for argument %d of ", SYTRS) " in ", AX_EQ_B_BK) "()\n", -info); exit(1); } #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 1; } /* undefine all. IT MUST REMAIN IN THIS POSITION IN FILE */ #undef AX_EQ_B_QR #undef AX_EQ_B_QRLS #undef AX_EQ_B_CHOL #undef AX_EQ_B_LU #undef AX_EQ_B_SVD #undef AX_EQ_B_BK #undef AX_EQ_B_PLASMA_CHOL #undef GEQRF #undef ORGQR #undef TRTRS #undef POTF2 #undef POTRF #undef POTRS #undef GETRF #undef GETRS #undef GESVD #undef GESDD #undef SYTRF #undef SYTRS #undef PLASMA_POSV #else // no LAPACK /* precision-specific definitions */ #define AX_EQ_B_LU LM_ADD_PREFIX(Ax_eq_b_LU_noLapack) /* * This function returns the solution of Ax = b * * The function employs LU decomposition followed by forward/back substitution (see * also the LAPACK-based LU solver above) * * A is mxm, b is mx1 * * The function returns 0 in case of error, 1 if successful * * This function is often called repetitively to solve problems of identical * dimensions. To avoid repetitive malloc's and free's, allocated memory is * retained between calls and free'd-malloc'ed when not of the appropriate size. * A call with NULL as the first argument forces this memory to be released. */ int AX_EQ_B_LU(LM_REAL *A, LM_REAL *B, LM_REAL *x, int m) { __STATIC__ void *buf=NULL; __STATIC__ int buf_sz=0; register int i, j, k; int *idx, maxi=-1, idx_sz, a_sz, work_sz, tot_sz; LM_REAL *a, *work, max, sum, tmp; if(!A) #ifdef LINSOLVERS_RETAIN_MEMORY { if(buf) free(buf); buf=NULL; buf_sz=0; return 1; } #else return 1; /* NOP */ #endif /* LINSOLVERS_RETAIN_MEMORY */ /* calculate required memory size */ idx_sz=m; a_sz=m*m; work_sz=m; tot_sz=(a_sz+work_sz)*sizeof(LM_REAL) + idx_sz*sizeof(int); /* should be arranged in that order for proper doubles alignment */ #ifdef LINSOLVERS_RETAIN_MEMORY if(tot_sz>buf_sz){ /* insufficient memory, allocate a "big" memory chunk at once */ if(buf) free(buf); /* free previously allocated memory */ buf_sz=tot_sz; buf=(void *)malloc(tot_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_LU) "() failed!\n"); exit(1); } } #else buf_sz=tot_sz; buf=(void *)malloc(tot_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", AX_EQ_B_LU) "() failed!\n"); exit(1); } #endif /* LINSOLVERS_RETAIN_MEMORY */ a=buf; work=a+a_sz; idx=(int *)(work+work_sz); /* avoid destroying A, B by copying them to a, x resp. */ memcpy(a, A, a_sz*sizeof(LM_REAL)); memcpy(x, B, m*sizeof(LM_REAL)); /* compute the LU decomposition of a row permutation of matrix a; the permutation itself is saved in idx[] */ for(i=0; imax) max=tmp; if(max==0.0){ fprintf(stderr, RCAT("Singular matrix A in ", AX_EQ_B_LU) "()!\n"); #ifndef LINSOLVERS_RETAIN_MEMORY free(buf); #endif return 0; } work[i]=LM_CNST(1.0)/max; } for(j=0; j=max){ max=tmp; maxi=i; } } if(j!=maxi){ for(k=0; k=0; --i){ sum=x[i]; for(j=i+1; jn){ fprintf(stderr, RCAT("matrix of constraints cannot have more rows than columns in", LMLEC_ELIM) "()!\n"); return LM_ERROR; } tm=n; tn=m; // transpose dimensions mintmn=m; /* calculate required memory size */ worksz=-1; // workspace query. Optimal work size is returned in aux //ORGQR((int *)&tm, (int *)&tm, (int *)&mintmn, NULL, (int *)&tm, NULL, (LM_REAL *)&aux, &worksz, &info); GEQP3((int *)&tm, (int *)&tn, NULL, (int *)&tm, NULL, NULL, (LM_REAL *)&aux, (int *)&worksz, &info); worksz=(int)aux; a_sz=tm*tm; // tm*tn is enough for xgeqp3() jpvt_sz=tn; tau_sz=mintmn; r_sz=mintmn*mintmn; // actually smaller if a is not of full row rank Y_sz=(Y)? 0 : tm*tn; tot_sz=(a_sz + tau_sz + r_sz + worksz + Y_sz)*sizeof(LM_REAL) + jpvt_sz*sizeof(int); /* should be arranged in that order for proper doubles alignment */ buf=(LM_REAL *)malloc(tot_sz); /* allocate a "big" memory chunk at once */ if(!buf){ fprintf(stderr, RCAT("Memory allocation request failed in ", LMLEC_ELIM) "()\n"); return LM_ERROR; } a=buf; tau=a+a_sz; r=tau+tau_sz; work=r+r_sz; if(!Y){ Y=work+worksz; jpvt=(int *)(Y+Y_sz); } else jpvt=(int *)(work+worksz); /* copy input array so that LAPACK won't destroy it. Note that copying is * done in row-major order, which equals A^T in column-major */ for(i=0; i0){ fprintf(stderr, RCAT(RCAT("unknown LAPACK error (%d) for ", GEQP3) " in ", LMLEC_ELIM) "()\n", info); } free(buf); return LM_ERROR; } /* the upper triangular part of a now contains the upper triangle of the unpermuted R */ if(eps<0.0){ LM_REAL aux; /* compute machine epsilon. DBL_EPSILON should do also */ for(eps=LM_CNST(1.0); aux=eps+LM_CNST(1.0), aux-LM_CNST(1.0)>0.0; eps*=LM_CNST(0.5)) ; eps*=LM_CNST(2.0); } tmp=tm*LM_CNST(10.0)*eps*FABS(a[0]); // threshold. tm is max(tm, tn) tmp=(tmp>LM_CNST(1E-12))? tmp : LM_CNST(1E-12); // ensure that threshold is not too small /* compute A^T's numerical rank by counting the non-zeros in R's diagonal */ for(i=rank=0; itmp || a[i*(tm+1)]<-tmp) ++rank; /* loop across R's diagonal elements */ else break; /* diagonal is arranged in absolute decreasing order */ if(rank0){ fprintf(stderr, RCAT(RCAT("A(%d, %d) is exactly zero for ", TRTRI) " (singular matrix) in ", LMLEC_ELIM) "()\n", info, info); } free(buf); return LM_ERROR; } /* finally, permute R^-T using Y as intermediate storage */ for(j=0; j0){ fprintf(stderr, RCAT(RCAT("unknown LAPACK error (%d) for ", ORGQR) " in ", LMLEC_ELIM) "()\n", info); } free(buf); return LM_ERROR; } /* compute Y=Q_1*R^-T*P^T. Y is tm x rank */ for(i=0; incnstr; c=data->c; Z=data->Z; p=data->p; /* p=c + Z*pp */ for(i=0; ifunc))(p, hx, m, n, data->adata); } /* constrained Jacobian: given pp, compute the Jacobian at c + Z*pp * Using the chain rule, the Jacobian with respect to pp equals the * product of the Jacobian with respect to p (at c + Z*pp) times Z */ static void LMLEC_JACF(LM_REAL *pp, LM_REAL *jacjac, int mm, int n, void *adata) { struct LMLEC_DATA *data=(struct LMLEC_DATA *)adata; int m; register int i, j, l; register LM_REAL sum, *aux1, *aux2; LM_REAL *c, *Z, *p, *jac; m=mm+data->ncnstr; c=data->c; Z=data->Z; p=data->p; jac=data->jac; /* p=c + Z*pp */ for(i=0; ijacf))(p, jac, m, n, data->adata); /* compute jac*Z in jacjac */ if(n*m<=__BLOCKSZ__SQ){ // this is a small problem /* This is the straightforward way to compute jac*Z. However, due to * its noncontinuous memory access pattern, it incures many cache misses when * applied to large minimization problems (i.e. problems involving a large * number of free variables and measurements), in which jac is too large to * fit in the L1 cache. For such problems, a cache-efficient blocking scheme * is preferable. On the other hand, the straightforward algorithm is faster * on small problems since in this case it avoids the overheads of blocking. */ for(i=0; iLM_CNST(1E-03)) fprintf(stderr, RCAT("Warning: component %d of starting point not feasible in ", LEVMAR_LEC_DER) "()! [%.10g reset to %.10g]\n", i, p0[i], tmp); } if(!info) info=locinfo; /* make sure that LEVMAR_DER() is called with non-null info */ /* note that covariance computation is not requested from LEVMAR_DER() */ ret=LEVMAR_DER(LMLEC_FUNC, LMLEC_JACF, pp, x, mm, n, itmax, opts, info, work, NULL, (void *)&data); /* p=c + Z*pp */ for(i=0; iLM_CNST(1E-03)) fprintf(stderr, RCAT("Warning: component %d of starting point not feasible in ", LEVMAR_LEC_DIF) "()! [%.10g reset to %.10g]\n", i, p0[i], tmp); } if(!info) info=locinfo; /* make sure that LEVMAR_DIF() is called with non-null info */ /* note that covariance computation is not requested from LEVMAR_DIF() */ ret=LEVMAR_DIF(LMLEC_FUNC, pp, x, mm, n, itmax, opts, info, work, NULL, (void *)&data); /* p=c + Z*pp */ for(i=0; i R^n with n>=m, * it finds p s.t. func(p) ~= x, i.e. the squared second order (i.e. L2) norm of * e=x-func(p) is minimized. * * This function requires an analytic Jacobian. In case the latter is unavailable, * use LEVMAR_DIF() bellow * * Returns the number of iterations (>=0) if successful, LM_ERROR if failed * * For more details, see K. Madsen, H.B. Nielsen and O. Tingleff's lecture notes on * non-linear least squares at http://www.imm.dtu.dk/pubdb/views/edoc_download.php/3215/pdf/imm3215.pdf */ int LEVMAR_DER( void (*func)(LM_REAL *p, LM_REAL *hx, int m, int n, void *adata), /* functional relation describing measurements. A p \in R^m yields a \hat{x} \in R^n */ void (*jacf)(LM_REAL *p, LM_REAL *j, int m, int n, void *adata), /* function to evaluate the Jacobian \part x / \part p */ LM_REAL *p, /* I/O: initial parameter estimates. On output has the estimated solution */ LM_REAL *x, /* I: measurement vector. NULL implies a zero vector */ int m, /* I: parameter vector dimension (i.e. #unknowns) */ int n, /* I: measurement vector dimension */ int itmax, /* I: maximum number of iterations */ LM_REAL opts[4], /* I: minim. options [\mu, \epsilon1, \epsilon2, \epsilon3]. Respectively the scale factor for initial \mu, * stopping thresholds for ||J^T e||_inf, ||Dp||_2 and ||e||_2. Set to NULL for defaults to be used */ LM_REAL info[LM_INFO_SZ], /* O: information regarding the minimization. Set to NULL if don't care * info[0]= ||e||_2 at initial p. * info[1-4]=[ ||e||_2, ||J^T e||_inf, ||Dp||_2, mu/max[J^T J]_ii ], all computed at estimated p. * info[5]= # iterations, * info[6]=reason for terminating: 1 - stopped by small gradient J^T e * 2 - stopped by small Dp * 3 - stopped by itmax * 4 - singular matrix. Restart from current p with increased mu * 5 - no further error reduction is possible. Restart with increased mu * 6 - stopped by small ||e||_2 * 7 - stopped by invalid (i.e. NaN or Inf) "func" values. This is a user error * info[7]= # function evaluations * info[8]= # Jacobian evaluations * info[9]= # linear systems solved, i.e. # attempts for reducing error */ LM_REAL *work, /* working memory at least LM_DER_WORKSZ() reals large, allocated if NULL */ LM_REAL *covar, /* O: Covariance matrix corresponding to LS solution; mxm. Set to NULL if not needed. */ void *adata) /* pointer to possibly additional data, passed uninterpreted to func & jacf. * Set to NULL if not needed */ { register int i, j, k, l; int worksz, freework=0, issolved; /* temp work arrays */ LM_REAL *e, /* nx1 */ *hx, /* \hat{x}_i, nx1 */ *jacTe, /* J^T e_i mx1 */ *jac, /* nxm */ *jacTjac, /* mxm */ *Dp, /* mx1 */ *diag_jacTjac, /* diagonal of J^T J, mx1 */ *pDp; /* p + Dp, mx1 */ register LM_REAL mu, /* damping constant */ tmp; /* mainly used in matrix & vector multiplications */ LM_REAL p_eL2, jacTe_inf, pDp_eL2; /* ||e(p)||_2, ||J^T e||_inf, ||e(p+Dp)||_2 */ LM_REAL p_L2, Dp_L2=LM_REAL_MAX, dF, dL; LM_REAL tau, eps1, eps2, eps2_sq, eps3; LM_REAL init_p_eL2; int nu=2, nu2, stop=0, nfev, njev=0, nlss=0; const int nm=n*m; int (*linsolver)(LM_REAL *A, LM_REAL *B, LM_REAL *x, int m)=NULL; mu=jacTe_inf=0.0; /* -Wall */ if(n0; ) jacTjac[i]=0.0; for(i=m; i-->0; ) jacTe[i]=0.0; for(l=n; l-->0; ){ jaclm=jac+l*m; for(i=m; i-->0; ){ jacTjacim=jacTjac+i*m; alpha=jaclm[i]; //jac[l*m+i]; for(j=i+1; j-->0; ) /* j<=i computes lower triangular part only */ jacTjacim[j]+=jaclm[j]*alpha; //jacTjac[i*m+j]+=jac[l*m+j]*alpha /* J^T e */ jacTe[i]+=alpha*e[l]; } } for(i=m; i-->0; ) /* copy to upper part */ for(j=i+1; jtmp) tmp=diag_jacTjac[i]; /* find max diagonal element */ mu=tau*tmp; } /* determine increment using adaptive damping */ while(1){ /* augment normal equations */ for(i=0; i=(p_L2+eps2)/(LM_CNST(EPSILON)*LM_CNST(EPSILON))){ /* almost singular */ //if(Dp_L2>=(p_L2+eps2)/LM_CNST(EPSILON)){ /* almost singular */ stop=4; break; } (*func)(pDp, hx, m, n, adata); ++nfev; /* evaluate function at p + Dp */ /* compute ||e(pDp)||_2 */ /* ### hx=x-hx, pDp_eL2=||hx|| */ #if 1 pDp_eL2=LEVMAR_L2NRMXMY(hx, x, hx, n); #else for(i=0, pDp_eL2=0.0; i0.0 && dF>0.0){ /* reduction in error, increment is accepted */ tmp=(LM_CNST(2.0)*dF/dL-LM_CNST(1.0)); tmp=LM_CNST(1.0)-tmp*tmp*tmp; mu=mu*( (tmp>=LM_CNST(ONE_THIRD))? tmp : LM_CNST(ONE_THIRD) ); nu=2; for(i=0 ; i=itmax) stop=3; for(i=0; i=10)? m: 10, updjac, updp=1, newjac; const int nm=n*m; int (*linsolver)(LM_REAL *A, LM_REAL *B, LM_REAL *x, int m)=NULL; mu=jacTe_inf=p_L2=0.0; /* -Wall */ updjac=newjac=0; /* -Wall */ if(n16) || updjac==K){ /* compute difference approximation to J */ if(using_ffdif){ /* use forward differences */ LEVMAR_FDIF_FORW_JAC_APPROX(func, p, hx, wrk, delta, jac, m, n, adata); ++njap; nfev+=m; } else{ /* use central differences */ LEVMAR_FDIF_CENT_JAC_APPROX(func, p, wrk, wrk2, delta, jac, m, n, adata); ++njap; nfev+=2*m; } nu=2; updjac=0; updp=0; newjac=1; } if(newjac){ /* Jacobian has changed, recompute J^T J, J^t e, etc */ newjac=0; /* J^T J, J^T e */ if(nm<=__BLOCKSZ__SQ){ // this is a small problem /* J^T*J_ij = \sum_l J^T_il * J_lj = \sum_l J_li * J_lj. * Thus, the product J^T J can be computed using an outer loop for * l that adds J_li*J_lj to each element ij of the result. Note that * with this scheme, the accesses to J and JtJ are always along rows, * therefore induces less cache misses compared to the straightforward * algorithm for computing the product (i.e., l loop is innermost one). * A similar scheme applies to the computation of J^T e. * However, for large minimization problems (i.e., involving a large number * of unknowns and measurements) for which J/J^T J rows are too large to * fit in the L1 cache, even this scheme incures many cache misses. In * such cases, a cache-efficient blocking scheme is preferable. * * Thanks to John Nitao of Lawrence Livermore Lab for pointing out this * performance problem. * * Note that the non-blocking algorithm is faster on small * problems since in this case it avoids the overheads of blocking. */ register int l; register LM_REAL alpha, *jaclm, *jacTjacim; /* looping downwards saves a few computations */ for(i=m*m; i-->0; ) jacTjac[i]=0.0; for(i=m; i-->0; ) jacTe[i]=0.0; for(l=n; l-->0; ){ jaclm=jac+l*m; for(i=m; i-->0; ){ jacTjacim=jacTjac+i*m; alpha=jaclm[i]; //jac[l*m+i]; for(j=i+1; j-->0; ) /* j<=i computes lower triangular part only */ jacTjacim[j]+=jaclm[j]*alpha; //jacTjac[i*m+j]+=jac[l*m+j]*alpha /* J^T e */ jacTe[i]+=alpha*e[l]; } } for(i=m; i-->0; ) /* copy to upper part */ for(j=i+1; jtmp) tmp=diag_jacTjac[i]; /* find max diagonal element */ mu=tau*tmp; } /* determine increment using adaptive damping */ /* augment normal equations */ for(i=0; i=(p_L2+eps2)/(LM_CNST(EPSILON)*LM_CNST(EPSILON))){ /* almost singular */ //if(Dp_L2>=(p_L2+eps2)/LM_CNST(EPSILON)){ /* almost singular */ stop=4; break; } (*func)(pDp, wrk, m, n, adata); ++nfev; /* evaluate function at p + Dp */ /* compute ||e(pDp)||_2 */ /* ### wrk2=x-wrk, pDp_eL2=||wrk2|| */ #if 1 pDp_eL2=LEVMAR_L2NRMXMY(wrk2, x, wrk, n); #else for(i=0, pDp_eL2=0.0; i0){ /* update jac */ for(i=0; i0.0 && dF>0.0){ /* reduction in error, increment is accepted */ tmp=(LM_CNST(2.0)*dF/dL-LM_CNST(1.0)); tmp=LM_CNST(1.0)-tmp*tmp*tmp; mu=mu*( (tmp>=LM_CNST(ONE_THIRD))? tmp : LM_CNST(ONE_THIRD) ); nu=2; for(i=0 ; i=itmax) stop=3; for(i=0; i #include #include #include #include "levmar.h" #include "compiler.h" #include "misc.h" #define EPSILON 1E-12 #define ONE_THIRD 0.3333333334 /* 1.0/3.0 */ #if !defined(LM_DBL_PREC) && !defined(LM_SNGL_PREC) #error At least one of LM_DBL_PREC, LM_SNGL_PREC should be defined! #endif #ifdef LM_SNGL_PREC /* single precision (float) definitions */ #define LM_REAL float #define LM_PREFIX s #define LM_REAL_MAX FLT_MAX #define LM_REAL_MIN -FLT_MAX #define LM_REAL_EPSILON FLT_EPSILON #define __SUBCNST(x) x##F #define LM_CNST(x) __SUBCNST(x) // force substitution #include "lm_core.c" // read in core code #undef LM_REAL #undef LM_PREFIX #undef LM_REAL_MAX #undef LM_REAL_EPSILON #undef LM_REAL_MIN #undef __SUBCNST #undef LM_CNST #endif /* LM_SNGL_PREC */ #ifdef LM_DBL_PREC /* double precision definitions */ #define LM_REAL double #define LM_PREFIX d #define LM_REAL_MAX DBL_MAX #define LM_REAL_MIN -DBL_MAX #define LM_REAL_EPSILON DBL_EPSILON #define LM_CNST(x) (x) #include "lm_core.c" // read in core code #undef LM_REAL #undef LM_PREFIX #undef LM_REAL_MAX #undef LM_REAL_EPSILON #undef LM_REAL_MIN #undef LM_CNST #endif /* LM_DBL_PREC */ stimfit-0.15.8/src/libstfnum/levmar/misc_core.c0000664000175000017500000006000513062445067016406 00000000000000///////////////////////////////////////////////////////////////////////////////// // // Levenberg - Marquardt non-linear minimization algorithm // Copyright (C) 2004-05 Manolis Lourakis (lourakis at ics forth gr) // Institute of Computer Science, Foundation for Research & Technology - Hellas // Heraklion, Crete, Greece. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // ///////////////////////////////////////////////////////////////////////////////// #ifndef LM_REAL // not included by misc.c #error This file should not be compiled directly! #endif /* precision-specific definitions */ #define LEVMAR_CHKJAC LM_ADD_PREFIX(levmar_chkjac) #define LEVMAR_FDIF_FORW_JAC_APPROX LM_ADD_PREFIX(levmar_fdif_forw_jac_approx) #define LEVMAR_FDIF_CENT_JAC_APPROX LM_ADD_PREFIX(levmar_fdif_cent_jac_approx) #define LEVMAR_TRANS_MAT_MAT_MULT LM_ADD_PREFIX(levmar_trans_mat_mat_mult) #define LEVMAR_COVAR LM_ADD_PREFIX(levmar_covar) #define LEVMAR_STDDEV LM_ADD_PREFIX(levmar_stddev) #define LEVMAR_CORCOEF LM_ADD_PREFIX(levmar_corcoef) #define LEVMAR_R2 LM_ADD_PREFIX(levmar_R2) #define LEVMAR_BOX_CHECK LM_ADD_PREFIX(levmar_box_check) #define LEVMAR_L2NRMXMY LM_ADD_PREFIX(levmar_L2nrmxmy) #ifdef HAVE_LAPACK #define LEVMAR_PSEUDOINVERSE LM_ADD_PREFIX(levmar_pseudoinverse) static int LEVMAR_PSEUDOINVERSE(LM_REAL *A, LM_REAL *B, int m); #ifdef __cplusplus extern "C" { #endif /* BLAS matrix multiplication, LAPACK SVD & Cholesky routines */ #define GEMM LM_MK_BLAS_NAME(gemm) /* C := alpha*op( A )*op( B ) + beta*C */ extern void GEMM(char *transa, char *transb, int *m, int *n, int *k, LM_REAL *alpha, LM_REAL *a, int *lda, LM_REAL *b, int *ldb, LM_REAL *beta, LM_REAL *c, int *ldc); #define GESVD LM_MK_LAPACK_NAME(gesvd) #define GESDD LM_MK_LAPACK_NAME(gesdd) extern int GESVD(char *jobu, char *jobvt, int *m, int *n, LM_REAL *a, int *lda, LM_REAL *s, LM_REAL *u, int *ldu, LM_REAL *vt, int *ldvt, LM_REAL *work, int *lwork, int *info); /* lapack 3.0 new SVD routine, faster than xgesvd() */ extern int GESDD(char *jobz, int *m, int *n, LM_REAL *a, int *lda, LM_REAL *s, LM_REAL *u, int *ldu, LM_REAL *vt, int *ldvt, LM_REAL *work, int *lwork, int *iwork, int *info); /* Cholesky decomposition */ #define POTF2 LM_MK_LAPACK_NAME(potf2) extern int POTF2(char *uplo, int *n, LM_REAL *a, int *lda, int *info); #ifdef __cplusplus } #endif #define LEVMAR_CHOLESKY LM_ADD_PREFIX(levmar_chol) #else /* !HAVE_LAPACK */ #define LEVMAR_LUINVERSE LM_ADD_PREFIX(levmar_LUinverse_noLapack) static int LEVMAR_LUINVERSE(LM_REAL *A, LM_REAL *B, int m); #endif /* HAVE_LAPACK */ /* blocked multiplication of the transpose of the nxm matrix a with itself (i.e. a^T a) * using a block size of bsize. The product is returned in b. * Since a^T a is symmetric, its computation can be sped up by computing only its * upper triangular part and copying it to the lower part. * * More details on blocking can be found at * http://www-2.cs.cmu.edu/afs/cs/academic/class/15213-f02/www/R07/section_a/Recitation07-SectionA.pdf */ void LEVMAR_TRANS_MAT_MAT_MULT(LM_REAL *a, LM_REAL *b, int n, int m) { #ifdef HAVE_LAPACK /* use BLAS matrix multiply */ LM_REAL alpha=LM_CNST(1.0), beta=LM_CNST(0.0); /* Fool BLAS to compute a^T*a avoiding transposing a: a is equivalent to a^T in column major, * therefore BLAS computes a*a^T with a and a*a^T in column major, which is equivalent to * computing a^T*a in row major! */ GEMM("N", "T", &m, &m, &n, &alpha, a, &m, a, &m, &beta, b, &m); #else /* no LAPACK, use blocking-based multiply */ register int i, j, k, jj, kk; register LM_REAL sum, *bim, *akm; const int bsize=__BLOCKSZ__; #define __MIN__(x, y) (((x)<=(y))? (x) : (y)) #define __MAX__(x, y) (((x)>=(y))? (x) : (y)) /* compute upper triangular part using blocking */ for(jj=0; jj R^n: Given a p in R^m it yields hx in R^n * jacf points to a function implementing the Jacobian of func, whose correctness * is to be tested. Given a p in R^m, jacf computes into the nxm matrix j the * Jacobian of func at p. Note that row i of j corresponds to the gradient of * the i-th component of func, evaluated at p. * p is an input array of length m containing the point of evaluation. * m is the number of variables * n is the number of functions * adata points to possible additional data and is passed uninterpreted * to func, jacf. * err is an array of length n. On output, err contains measures * of correctness of the respective gradients. if there is * no severe loss of significance, then if err[i] is 1.0 the * i-th gradient is correct, while if err[i] is 0.0 the i-th * gradient is incorrect. For values of err between 0.0 and 1.0, * the categorization is less certain. In general, a value of * err[i] greater than 0.5 indicates that the i-th gradient is * probably correct, while a value of err[i] less than 0.5 * indicates that the i-th gradient is probably incorrect. * * * The function does not perform reliably if cancellation or * rounding errors cause a severe loss of significance in the * evaluation of a function. therefore, none of the components * of p should be unusually small (in particular, zero) or any * other value which may cause loss of significance. */ void LEVMAR_CHKJAC( void (*func)(LM_REAL *p, LM_REAL *hx, int m, int n, void *adata), void (*jacf)(LM_REAL *p, LM_REAL *j, int m, int n, void *adata), LM_REAL *p, int m, int n, void *adata, LM_REAL *err) { LM_REAL factor=LM_CNST(100.0); LM_REAL one=LM_CNST(1.0); LM_REAL zero=LM_CNST(0.0); LM_REAL *fvec, *fjac, *pp, *fvecp, *buf; register int i, j; LM_REAL eps, epsf, temp, epsmch; LM_REAL epslog; int fvec_sz=n, fjac_sz=n*m, pp_sz=m, fvecp_sz=n; epsmch=LM_REAL_EPSILON; eps=(LM_REAL)sqrt(epsmch); buf=(LM_REAL *)malloc((fvec_sz + fjac_sz + pp_sz + fvecp_sz)*sizeof(LM_REAL)); if(!buf){ fprintf(stderr, LCAT(LEVMAR_CHKJAC, "(): memory allocation request failed\n")); exit(1); } fvec=buf; fjac=fvec+fvec_sz; pp=fjac+fjac_sz; fvecp=pp+pp_sz; /* compute fvec=func(p) */ (*func)(p, fvec, m, n, adata); /* compute the Jacobian at p */ (*jacf)(p, fjac, m, n, adata); /* compute pp */ for(j=0; j=epsf*FABS(fvec[i])) temp=eps*FABS((fvecp[i]-fvec[i])/eps - err[i])/(FABS(fvec[i])+FABS(fvecp[i])); err[i]=one; if(temp>epsmch && temp=eps) err[i]=zero; } free(buf); return; } #ifdef HAVE_LAPACK /* * This function computes the pseudoinverse of a square matrix A * into B using SVD. A and B can coincide * * The function returns 0 in case of error (e.g. A is singular), * the rank of A if successful * * A, B are mxm * */ static int LEVMAR_PSEUDOINVERSE(LM_REAL *A, LM_REAL *B, int m) { LM_REAL *buf=NULL; int buf_sz=0; static LM_REAL eps=LM_CNST(-1.0); register int i, j; LM_REAL *a, *u, *s, *vt, *work; int a_sz, u_sz, s_sz, vt_sz, tot_sz; LM_REAL thresh, one_over_denom; int info, rank, worksz, *iwork, iworksz; /* calculate required memory size */ worksz=5*m; // min worksize for GESVD //worksz=m*(7*m+4); // min worksize for GESDD iworksz=8*m; a_sz=m*m; u_sz=m*m; s_sz=m; vt_sz=m*m; tot_sz=(a_sz + u_sz + s_sz + vt_sz + worksz)*sizeof(LM_REAL) + iworksz*sizeof(int); /* should be arranged in that order for proper doubles alignment */ buf_sz=tot_sz; buf=(LM_REAL *)malloc(buf_sz); if(!buf){ fprintf(stderr, RCAT("memory allocation in ", LEVMAR_PSEUDOINVERSE) "() failed!\n"); return 0; /* error */ } a=buf; u=a+a_sz; s=u+u_sz; vt=s+s_sz; work=vt+vt_sz; iwork=(int *)(work+worksz); /* store A (column major!) into a */ for(i=0; i0.0; eps*=LM_CNST(0.5)) ; eps*=LM_CNST(2.0); } /* compute the pseudoinverse in B */ for(i=0; ithresh; rank++){ one_over_denom=LM_CNST(1.0)/s[rank]; for(j=0; jmax) max=tmp; if(max==0.0){ fprintf(stderr, RCAT("Singular matrix A in ", LEVMAR_LUINVERSE) "()!\n"); free(buf); return 0; } work[i]=LM_CNST(1.0)/max; } for(j=0; j=max){ max=tmp; maxi=i; } } if(j!=maxi){ for(k=0; k=0; --i){ sum=x[i]; for(j=i+1; j0; ) tmp+=x[i]; xavg=tmp/(LM_REAL)n; if(x) for(i=n, SSerr=SStot=0.0; i-->0; ){ tmp=x[i]-hx[i]; SSerr+=tmp*tmp; tmp=x[i]-xavg; SStot+=tmp*tmp; } else /* x==0 */ for(i=n, SSerr=SStot=0.0; i-->0; ){ tmp=-hx[i]; SSerr+=tmp*tmp; tmp=-xavg; SStot+=tmp*tmp; } free(hx); return LM_CNST(1.0) - SSerr/SStot; } /* check box constraints for consistency */ int LEVMAR_BOX_CHECK(LM_REAL *lb, LM_REAL *ub, int m) { register int i; if(!lb || !ub) return 1; for(i=0; iub[i]) return 0; return 1; } #ifdef HAVE_LAPACK /* compute the Cholesky decomposition of C in W, s.t. C=W^t W and W is upper triangular */ int LEVMAR_CHOLESKY(LM_REAL *C, LM_REAL *W, int m) { register int i, j; int info; /* copy weights array C to W so that LAPACK won't destroy it; * C is assumed symmetric, hence no transposition is needed */ for(i=0, j=m*m; i>bpwr)<0; i-=blocksize){ e[i ]=x[i ]-y[i ]; sum0+=e[i ]*e[i ]; j1=i-1; e[j1]=x[j1]-y[j1]; sum1+=e[j1]*e[j1]; j2=i-2; e[j2]=x[j2]-y[j2]; sum2+=e[j2]*e[j2]; j3=i-3; e[j3]=x[j3]-y[j3]; sum3+=e[j3]*e[j3]; j4=i-4; e[j4]=x[j4]-y[j4]; sum0+=e[j4]*e[j4]; j5=i-5; e[j5]=x[j5]-y[j5]; sum1+=e[j5]*e[j5]; j6=i-6; e[j6]=x[j6]-y[j6]; sum2+=e[j6]*e[j6]; j7=i-7; e[j7]=x[j7]-y[j7]; sum3+=e[j7]*e[j7]; } /* * There may be some left to do. * This could be done as a simple for() loop, * but a switch is faster (and more interesting) */ i=blockn; if(i0; i-=blocksize){ e[i ]=-y[i ]; sum0+=e[i ]*e[i ]; j1=i-1; e[j1]=-y[j1]; sum1+=e[j1]*e[j1]; j2=i-2; e[j2]=-y[j2]; sum2+=e[j2]*e[j2]; j3=i-3; e[j3]=-y[j3]; sum3+=e[j3]*e[j3]; j4=i-4; e[j4]=-y[j4]; sum0+=e[j4]*e[j4]; j5=i-5; e[j5]=-y[j5]; sum1+=e[j5]*e[j5]; j6=i-6; e[j6]=-y[j6]; sum2+=e[j6]*e[j6]; j7=i-7; e[j7]=-y[j7]; sum3+=e[j7]*e[j7]; } /* * There may be some left to do. * This could be done as a simple for() loop, * but a switch is faster (and more interesting) */ i=blockn; if(i #include #include #include #include "levmar.h" #include "misc.h" #if !defined(LM_DBL_PREC) && !defined(LM_SNGL_PREC) #error At least one of LM_DBL_PREC, LM_SNGL_PREC should be defined! #endif #ifdef LM_DBL_PREC /* double precision definitions */ #define LM_REAL double #define LM_PREFIX d #define LM_CNST(x) (x) #ifndef HAVE_LAPACK #include #define LM_REAL_EPSILON DBL_EPSILON #endif #include "Axb_core.c" #undef LM_REAL #undef LM_PREFIX #undef LM_CNST #undef LM_REAL_EPSILON #endif /* LM_DBL_PREC */ #ifdef LM_SNGL_PREC /* single precision (float) definitions */ #define LM_REAL float #define LM_PREFIX s #define __SUBCNST(x) x##F #define LM_CNST(x) __SUBCNST(x) // force substitution #ifndef HAVE_LAPACK #define LM_REAL_EPSILON FLT_EPSILON #endif #include "Axb_core.c" #undef LM_REAL #undef LM_PREFIX #undef __SUBCNST #undef LM_CNST #undef LM_REAL_EPSILON #endif /* LM_SNGL_PREC */ stimfit-0.15.8/src/libstfnum/levmar/lmbc.c0000664000175000017500000000503713062445067015364 00000000000000///////////////////////////////////////////////////////////////////////////////// // // Levenberg - Marquardt non-linear minimization algorithm // Copyright (C) 2004-05 Manolis Lourakis (lourakis at ics forth gr) // Institute of Computer Science, Foundation for Research & Technology - Hellas // Heraklion, Crete, Greece. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // ///////////////////////////////////////////////////////////////////////////////// /******************************************************************************** * Box-constrained Levenberg-Marquardt nonlinear minimization. The same core code * is used with appropriate #defines to derive single and double precision versions, * see also lmbc_core.c ********************************************************************************/ #include #include #include #include #include "levmar.h" #include "compiler.h" #include "misc.h" #define EPSILON 1E-12 #define ONE_THIRD 0.3333333334 /* 1.0/3.0 */ #define _LSITMAX_ 150 /* max #iterations for line search */ #define _POW_ 2.1 #if !defined(LM_DBL_PREC) && !defined(LM_SNGL_PREC) #error At least one of LM_DBL_PREC, LM_SNGL_PREC should be defined! #endif #ifdef LM_SNGL_PREC /* single precision (float) definitions */ #define LM_REAL float #define LM_PREFIX s #define LM_REAL_MAX FLT_MAX #define LM_REAL_MIN -FLT_MAX #define LM_REAL_EPSILON FLT_EPSILON #define __SUBCNST(x) x##F #define LM_CNST(x) __SUBCNST(x) // force substitution #include "lmbc_core.c" // read in core code #undef LM_REAL #undef LM_PREFIX #undef LM_REAL_MAX #undef LM_REAL_MIN #undef LM_REAL_EPSILON #undef __SUBCNST #undef LM_CNST #endif /* LM_SNGL_PREC */ #ifdef LM_DBL_PREC /* double precision definitions */ #define LM_REAL double #define LM_PREFIX d #define LM_REAL_MAX DBL_MAX #define LM_REAL_MIN -DBL_MAX #define LM_REAL_EPSILON DBL_EPSILON #define LM_CNST(x) (x) #include "lmbc_core.c" // read in core code #undef LM_REAL #undef LM_PREFIX #undef LM_REAL_MAX #undef LM_REAL_MIN #undef LM_REAL_EPSILON #undef LM_CNST #endif /* LM_DBL_PREC */ stimfit-0.15.8/src/libstfnum/levmar/lmlec.c0000664000175000017500000000450013062445067015535 00000000000000///////////////////////////////////////////////////////////////////////////////// // // Levenberg - Marquardt non-linear minimization algorithm // Copyright (C) 2004-05 Manolis Lourakis (lourakis at ics forth gr) // Institute of Computer Science, Foundation for Research & Technology - Hellas // Heraklion, Crete, Greece. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // ///////////////////////////////////////////////////////////////////////////////// /******************************************************************************* * Wrappers for linearly constrained Levenberg-Marquardt minimization. The same * core code is used with appropriate #defines to derive single and double * precision versions, see also lmlec_core.c *******************************************************************************/ #include #include #include #include "levmar.h" #include "misc.h" #ifndef HAVE_LAPACK #ifdef _MSC_VER #pragma message("Linearly constrained optimization requires LAPACK and was not compiled!") #else #warning Linearly constrained optimization requires LAPACK and was not compiled! #endif // _MSC_VER #else // LAPACK present #if !defined(LM_DBL_PREC) && !defined(LM_SNGL_PREC) #error At least one of LM_DBL_PREC, LM_SNGL_PREC should be defined! #endif #ifdef LM_SNGL_PREC /* single precision (float) definitions */ #define LM_REAL float #define LM_PREFIX s #define __SUBCNST(x) x##F #define LM_CNST(x) __SUBCNST(x) // force substitution #include "lmlec_core.c" // read in core code #undef LM_REAL #undef LM_PREFIX #undef __SUBCNST #undef LM_CNST #endif /* LM_SNGL_PREC */ #ifdef LM_DBL_PREC /* double precision definitions */ #define LM_REAL double #define LM_PREFIX d #define LM_CNST(x) (x) #include "lmlec_core.c" // read in core code #undef LM_REAL #undef LM_PREFIX #undef LM_CNST #endif /* LM_DBL_PREC */ #endif /* HAVE_LAPACK */ stimfit-0.15.8/src/libstfnum/levmar/misc.c0000664000175000017500000000425313267554447015413 00000000000000///////////////////////////////////////////////////////////////////////////////// // // Levenberg - Marquardt non-linear minimization algorithm // Copyright (C) 2004-05 Manolis Lourakis (lourakis at ics forth gr) // Institute of Computer Science, Foundation for Research & Technology - Hellas // Heraklion, Crete, Greece. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // ///////////////////////////////////////////////////////////////////////////////// /******************************************************************************** * Miscelaneous functions for Levenberg-Marquardt nonlinear minimization. The * same core code is used with appropriate #defines to derive single and double * precision versions, see also misc_core.c ********************************************************************************/ #include #include #include #include #include "levmar.h" #include "misc.h" #if !defined(LM_DBL_PREC) && !defined(LM_SNGL_PREC) #error At least one of LM_DBL_PREC, LM_SNGL_PREC should be defined! #endif #ifdef LM_SNGL_PREC /* single precision (float) definitions */ #define LM_REAL float #define LM_PREFIX s #define LM_REAL_EPSILON FLT_EPSILON #define __SUBCNST(x) x##F #define LM_CNST(x) __SUBCNST(x) // force substitution #include "misc_core.c" // read in core code #undef LM_REAL #undef LM_PREFIX #undef LM_REAL_EPSILON #undef __SUBCNST #undef LM_CNST #endif /* LM_SNGL_PREC */ #ifdef LM_DBL_PREC /* double precision definitions */ #define LM_REAL double #define LM_PREFIX d #define LM_REAL_EPSILON DBL_EPSILON #define LM_CNST(x) (x) #include "misc_core.c" // read in core code #undef LM_REAL #undef LM_PREFIX #undef LM_REAL_EPSILON #undef LM_CNST #endif /* LM_DBL_PREC */ stimfit-0.15.8/src/libstfnum/spline.h0000775000175000017500000000302313062445067014454 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file spline.h * \author John Burkardt, Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Cubic spline interpolation. * * * Based on algorithms by John Burkardt: * http://www.scs.fsu.edu/~burkardt/index.html */ #ifndef _SPLINE_H #define _SPLINE_H namespace stfnum { Vector_double d3_np_fs(Vector_double& a, const Vector_double& b); void dvec_bracket3 (const Vector_double& t, double tval, int& left ); Vector_double spline_cubic_set ( const Vector_double& t, const Vector_double& y, int ibcbeg, double ybcbeg, int ibcend, double ybcend ); double spline_cubic_val (const Vector_double& t, double tval, const Vector_double& y, const Vector_double& ypp, double& ypval, double& yppval ); } #endif stimfit-0.15.8/src/libstfnum/stfnum.h0000775000175000017500000004526613062445067014515 00000000000000// Header file for the stimfit namespace // General-purpose routines // last revision: 08-08-2006 // C. Schmidt-Hieber, christsc@gmx.de // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file stfnum.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Math functions. */ #ifndef _STFNUM_H #define _STFNUM_H #ifdef _WINDOWS #pragma warning( disable : 4251 ) // Disable warning messages #endif #include #include #include #include #ifdef _OPENMP #include #endif #include #ifdef _MSC_VER #define INFINITY (DBL_MAX+DBL_MAX) #ifndef NAN static const unsigned long __nan[2] = {0xffffffff, 0x7fffffff}; #define NAN (*(const float *) __nan) #endif #endif #include "../libstfio/stfio.h" #include "./spline.h" namespace stfnum { /*! \addtogroup stfgen * @{ */ //! A function taking a double and a vector and returning a double. /*! Type definition for a function (or, to be precise, any 'callable entity') * that takes a double (the x-value) and a vector of parameters and returns * the function's result (the y-value). */ typedef boost::function Func; //! The jacobian of a stfnum::Func. typedef boost::function Jac; //! Scaling function for fit parameters typedef boost::function Scale; //! Dummy function, serves as a placeholder to initialize functions without a Jacobian. Vector_double nojac( double x, const Vector_double& p); //! Dummy function, serves as a placeholder to initialize parameters without a scaling function. double noscale(double param, double xscale, double xoff, double yscale, double yoff); //! Information about parameters used in storedFunc /*! Contains information about a function's parameters used * in storedFunc (see below). The client supplies a description * (desc) and determines whether the parameter is to be * fitted (toFit==true) or to be kept constant (toFit==false). */ struct parInfo { //! Default constructor parInfo() : desc(""),toFit(true), constrained(false), constr_lb(0), constr_ub(0), scale(noscale), unscale(noscale) {} //! Constructor /*! \param desc_ Parameter description string * \param toFit_ true if this parameter should be fitted, false if * it should be kept fixed. * \param constrained_ true if this is a constrained fit * \param constr_lb_ lower bound for constrained fit * \param constr_ub_ upper bound for constrained fit * \param scale_ scaling function * \param unscale_ unscaling function */ parInfo( const std::string& desc_, bool toFit_, bool constrained_ = false, double constr_lb_ = 0, double constr_ub_ = 0, Scale scale_ = noscale, Scale unscale_ = noscale) : desc(desc_),toFit(toFit_), constrained(false), constr_lb(constr_lb_), constr_ub(constr_ub_), scale(scale_), unscale(unscale_) {} std::string desc; /*!< Parameter description string */ bool toFit; /*!< true if this parameter should be fitted, false if it should be kept fixed. */ bool constrained; /*!< true if this parameter should be constrained */ double constr_lb; /*!< Lower boundary for box-constrained fits */ double constr_ub; /*!< Upper boundary for box-constrained fits */ Scale scale; /*!< Scaling function for this parameter */ Scale unscale; /*!< Unscaling function for this parameter */ }; //! A table used for printing information. /*! Members will throw std::out_of_range if out of range. */ class StfioDll Table { public: //! Constructor /*! \param nRows Initial number of rows. * \param nCols Initial number of columns. */ Table(std::size_t nRows,std::size_t nCols); //! Constructor /*! \param map A map used to initialise the table. */ Table(const std::map< std::string, double >& map); //! Range-checked access. Returns a copy. Throws std::out_of_range if out of range. /*! \param row 0-based row index. * \param col 0-based column index. * \return A copy of the double at row, col. */ double at(std::size_t row,std::size_t col) const; //! Range-checked access. Returns a reference. Throws std::out_of_range if out of range. /*! \param row 0-based row index. * \param col 0-based column index. * \return A reference to the double at row, col. */ double& at(std::size_t row,std::size_t col); //! Check whether a cell is empty. /*! \param row 0-based row index. * \param col 0-based column index. * \return true if empty, false otherwise. */ bool IsEmpty(std::size_t row,std::size_t col) const; //! Empties or un-empties a cell. /*! \param row 0-based row index. * \param col 0-based column index. * \param value true if the cell should be empty, false otherwise. */ void SetEmpty(std::size_t row,std::size_t col,bool value=true); //! Sets the label of a row. /*! \param row 0-based row index. * \param label Row label string. */ void SetRowLabel(std::size_t row,const std::string& label); //! Sets the label of a column. /*! \param col 0-based column index. * \param label Column label string. */ void SetColLabel(std::size_t col,const std::string& label); //! Retrieves the label of a row. /*! \param row 0-based row index. * \return Row label string. */ const std::string& GetRowLabel(std::size_t row) const; //! Retrieves the label of a column. /*! \param col 0-based column index. * \return Column label string. */ const std::string& GetColLabel(std::size_t col) const; //! Retrieves the number of rows. /*! \return The number of rows. */ std::size_t nRows() const { return rowLabels.size(); } //! Retrieves the number of columns. /*! \return The number of columns. */ std::size_t nCols() const { return colLabels.size(); } //! Appends rows to the table. /*! \param nRows The number of rows to be appended. */ void AppendRows(std::size_t nRows); private: // row major order: std::vector< std::vector > values; std::vector< std::deque< bool > > empty; std::vector< std::string > rowLabels; std::vector< std::string > colLabels; }; //! Print the output of a fit into a stfnum::Table. typedef boost::function,double)> Output; //! Default fit output function, constructing a stfnum::Table from the parameters, their description and chisqr. Table defaultOutput(const Vector_double& pars, const std::vector& parsInfo, double chisqr); //! Initialising function for the parameters in stfnum::Func to start a fit. typedef boost::function Init; //! Function used for least-squares fitting. /*! Objects of this class are used for fitting functions * to data. The client supplies a function (func), its * jacobian (jac), information about the function's parameters * (pInfo) and a function to initialize the parameters (init). */ struct StfioDll storedFunc { //! Constructor /*! \param name_ Plain function name. * \param pInfo_ A vector containing information about the function parameters. * \param func_ The function that will be fitted to the data. * \param jac_ Jacobian of func_. * \param hasJac_ true if a Jacobian is available. * \param init_ A function for initialising the parameters. * \param output_ Output of the fit. */ storedFunc( const std::string& name_, const std::vector& pInfo_, const Func& func_, const Init& init_, const Jac& jac_, bool hasJac_ = true, const Output& output_ = defaultOutput /*, bool hasId_ = true*/ ) : name(name_),pInfo(pInfo_),func(func_),init(init_),jac(jac_),hasJac(hasJac_),output(output_) /*, hasId(hasId_)*/ { /* if (hasId) { id = NextId(); std::string new_name; new_name << id << ": " << name; name = new_name; } else id = 0; */ } //! Destructor ~storedFunc() { } // static int n_funcs; /*!< Static function counter */ // int id; /*!< Function id; set automatically upon construction, so don't touch. */ std::string name; /*!< Function name. */ std::vector pInfo; /*!< A vector containing information about the function parameters. */ Func func; /*!< The function that will be fitted to the data. */ Init init; /*!< A function for initialising the parameters. */ Jac jac; /*!< Jacobian of func. */ bool hasJac; /*!< True if the function has an analytic Jacobian. */ Output output; /*!< Output of the fit. */ // bool hasId; /*!< Determines whether a function should have an id. */ }; //! Calculates the square of a number. /*! \param a Argument of the function. * \return \e a ^2 */ template T SQR (T a); //! Convolves a data set with a filter function. /*! \param toFilter The valarray to be filtered. * \param filter_start The index from which to start filtering. * \param filter_end The index at which to stop filtering. * \param a A valarray of parameters for the filter function. * \param SR The sampling rate. * \param func The filter function in the frequency domain. * \param inverse true if (1- \e func) should be used as the filter function, false otherwise * \return The convolved data set. */ StfioDll Vector_double filter( const Vector_double& toFilter, std::size_t filter_start, std::size_t filter_end, const Vector_double &a, int SR, stfnum::Func func, bool inverse = false ); //! Computes a histogram /*! \param data The signal * \param nbins Number of bins in the histogram. * \return A map with lower bin limits as keys, number of observations as values. */ std::map histogram(const Vector_double& data, int nbins=-1); //! Deconvolves a template from a signal /*! \param data The input signal * \param templ The template * \param SR The sampling rate in kHz. * \param hipass Highpass filter cutoff frequency in kHz * \param lopass Lowpass filter cutoff frequency in kHz * \return The result of the deconvolution */ StfioDll Vector_double deconvolve(const Vector_double& data, const Vector_double& templ, int SR, double hipass, double lopass, stfio::ProgressInfo& progDlg); //! Interpolates a dataset using cubic splines. /*! \param y The valarray to be interpolated. * \param oldF The original sampling frequency. * \param newF The new frequency of the interpolated array. * \return The interpolated data set. */ template std::vector cubicSpline( const std::vector& y, T oldF, T newF ); //! Differentiate data. /* \param input The valarray to be differentiated. * \param x_scale The sampling interval. * \return The result of the differentiation. */ template std::vector diff(const std::vector& input, T x_scale); //! Integration using Simpson's rule. /*! \param input The valarray to be integrated. * \param a Start of the integration interval. * \param b End of the integration interval. * \param x_scale Sampling interval. * \return The integral of \e input between \e a and \e b. */ StfioDll double integrate_simpson( const Vector_double& input, std::size_t a, std::size_t b, double x_scale ); //! Integration using the trapezium rule. /*! \param input The valarray to be integrated. * \param a Start of the integration interval. * \param b End of the integration interval. * \param x_scale Sampling interval. * \return The integral of \e input between \e a and \e b. */ StfioDll double integrate_trapezium( const Vector_double& input, std::size_t a, std::size_t b, double x_scale ); //! Solves a linear equation system using LAPACK. /*! Uses column-major order for matrices. For an example, see * Section::SetIsIntegrated() * \param m Number of rows of the matrix \e A. * \param n Number of columns of the matrix \e A. * \param nrhs Number of columns of the matrix \e B. * \param A On entry, the left-hand-side matrix. On exit, * the factors L and U from the factorization * A = P*L*U; the unit diagonal elements of L are not stored. * \param B On entry, the right-hand-side matrix. On exit, the * solution to the linear equation system. * \return At present, always returns 0. */ int linsolv( int m, int n, int nrhs, Vector_double& A, Vector_double& B ); //! Solve quadratic equations for 3 adjacent sampling points /*! \param data The data vector * \param begin Start of interval to be used * \param end End of interval to be used * \return Parameters of quadratic equation */ StfioDll Vector_double quad(const Vector_double& data, std::size_t begin, std::size_t end); //! Computes the event detection criterion according to Clements & Bekkers (1997). /*! \param data The valarray from which to extract events. * \param templ A template waveform that is used for event detection. * \return The detection criterion for every value of \e data. */ StfioDll Vector_double detectionCriterion( const Vector_double& data, const Vector_double& templ, stfio::ProgressInfo& progDlg ); // TODO: Add negative-going peaks. //! Searches for positive-going peaks. /*! \param data The valarray to be searched for peaks. * \param threshold Minimal amplitude of a peak. * \param minDistance Minimal distance between subsequent peaks. * \return A vector of indices where peaks have occurred in \e data. */ StfioDll std::vector peakIndices(const Vector_double& data, double threshold, int minDistance); //! Computes the linear correlation between two arrays. /*! \param va1 First array. * \param va2 Second array. * \return The linear correlation between the two arrays for each data point of \e va1. */ StfioDll Vector_double linCorr(const Vector_double& va1, const Vector_double& va2, stfio::ProgressInfo& progDlg); //! Computes a Gaussian that can be used as a filter kernel. /*! \f[ * f(x) = \mathrm{e}^{-0.3466 \left( \frac{x}{p_{0}} \right) ^2} * \f] * \param x Argument of the function. * \param p Function parameters, where \n * \e p[0] is the corner frequency (-3 dB according to Colquhoun) * \return The evaluated function. */ StfioDll double fgaussColqu(double x, const Vector_double& p); //! Computes a Boltzmann function. /*! \f[f(x)=\frac{1}{1+\mathrm{e}^{\frac{p_0-x}{p_1}}}\f] * \param x Argument of the function. * \param p Function parameters, where \n * \e p[0] is the midpoint and \n * \e p[1] is the slope of the function. \n * \return The evaluated function. */ double fboltz(double x, const Vector_double& p); //! Computes a Bessel polynomial. /*! \f[ * f(x, n) = \sum_{k=0}^n \frac{ \left( 2n - k \right) ! }{ \left( n - k \right) ! k! } \frac{x^k}{ 2^{n-k} } * \f] * \param x Argument of the function. * \param n Order of the polynomial. \n * \return The evaluated function. */ double fbessel(double x, int n); //! Computes a 4th-order Bessel polynomial that can be used as a filter kernel. /*! \f[ * f(x) = \frac{b(0,4)}{b(\frac{0.355589x}{p_0},4)} * \f] * where \f$ b(a,n) \f$ is the bessel polynomial stfnum::fbessel(). * \param x Argument of the function. * \param p Function parameters, where \n * \e p[0] is the corner frequency (-3 dB attenuation) * \return The evaluated function. */ StfioDll double fbessel4(double x, const Vector_double& p); //! Computes the faculty of an integer. /*! \param arg Argument of the function. * \return The faculty of \e arg. */ int fac(int arg); //! Computes \f$ 2^{arg} \f$. Uses the bitwise-shift operator (<<). /*! \param arg Argument of the function. * \return \f$ 2^{arg} \f$. */ int pow2(int arg); //! The direction of peak calculations enum direction { up, /*!< Find positive-going peaks. */ down, /*!< Find negative-going peaks. */ both, /*!< Find negative- or positive-going peaks, whichever is larger. */ undefined_direction /*!< Undefined direction. */ }; //! Methods for Baseline computation enum baseline_method { mean_sd = 0, /*!< Compute mean and s.d. for Baseline and Base SD. */ median_iqr = 1 /*!< Compute median and IQR for Baseline and Base SD. */ }; /*@}*/ } typedef std::vector< stfnum::storedFunc >::const_iterator c_stfunc_it; /*!< constant stfnum::storedFunc iterator */ inline int stfnum::pow2(int arg) {return 1< void SWAP(T s1, T s2) { T aux=s1; s1=s2; s2=aux; } template std::vector stfnum::cubicSpline(const std::vector& y, T oldF, T newF) { double factor_i=newF/oldF; int size=(int)y.size(); // size of interpolated data: int size_i=(int)(size*factor_i); Vector_double x(size); Vector_double y_d(size); for (int n_p=0; n_p < size; ++n_p) { x[n_p]=n_p; y_d[n_p]=y[n_p]; } Vector_double y_i(stfnum::spline_cubic_set(x,y_d,0,0,0,0)); std::vector y_if(size_i); Vector_double x_i(size_i); //Cubic spline interpolation: for (int n_i=0; n_i < size_i; ++n_i) { x_i[n_i]=(double)n_i * (double)size/(double)size_i; double yp, ypp; y_if[n_i]=(T)stfnum::spline_cubic_val(x,x_i[n_i],y_d,y_i,yp,ypp); } return y_if; } template std::vector stfnum::diff(const std::vector& input, T x_scale) { std::vector diffVA(input.size()-1); for (unsigned n=0;n inline T stfnum::SQR(T a) {return a*a;} #endif stimfit-0.15.8/src/libstfnum/Makefile.in0000664000175000017500000010151113315356052015050 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libstfnum ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acsite.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/stfconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) am__DEPENDENCIES_1 = libstfnum_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libstfnum_la_OBJECTS = fit.lo lm.lo Axb.lo misc.lo lmlec.lo lmbc.lo \ funclib.lo stfnum.lo measure.lo libstfnum_la_OBJECTS = $(am_libstfnum_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libstfnum_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libstfnum_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libstfnum_la_SOURCES) DIST_SOURCES = $(libstfnum_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @BUILD_MODULE_TRUE@pkglibdir = ${PYTHON_TARGET_DIR}/stfio ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GT_CPPFLAGS = @GT_CPPFLAGS@ GT_CXXFLAGS = @GT_CXXFLAGS@ GT_LDFLAGS = @GT_LDFLAGS@ GT_LIBS = @GT_LIBS@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_LIBS = @HDF5_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBBIOSIG_LDFLAGS = @LIBBIOSIG_LDFLAGS@ LIBHDF5_LDFLAGS = @LIBHDF5_LDFLAGS@ LIBLAPACK_LDFLAGS = @LIBLAPACK_LDFLAGS@ LIBNUMPY_INCLUDES = @LIBNUMPY_INCLUDES@ LIBOBJS = @LIBOBJS@ LIBPYTHON_INCLUDES = @LIBPYTHON_INCLUDES@ LIBPYTHON_LDFLAGS = @LIBPYTHON_LDFLAGS@ LIBS = @LIBS@ LIBSTF_LDFLAGS = @LIBSTF_LDFLAGS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MACSETFILE = @MACSETFILE@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSTLINK_COMMAND = @POSTLINK_COMMAND@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_DIST_PKG = @PYTHON_DIST_PKG@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_NUMPY_INCLUDE = @PYTHON_NUMPY_INCLUDE@ PYTHON_PRE_DIST_PKG = @PYTHON_PRE_DIST_PKG@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ PY_AC_VERSION = @PY_AC_VERSION@ RANLIB = @RANLIB@ REZ = @REZ@ SED = @SED@ SETFILE = @SETFILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFIO_PYTHON_LIBNAME = @STFIO_PYTHON_LIBNAME@ STF_PYTHON_LIBNAME = @STF_PYTHON_LIBNAME@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ SWIG_PYTHON_CPPFLAGS = @SWIG_PYTHON_CPPFLAGS@ SWIG_PYTHON_OPT = @SWIG_PYTHON_OPT@ VERSION = @VERSION@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @BUILD_MODULE_TRUE@@ISDARWIN_FALSE@PYTHON_TARGET_DIR = ${PYTHON_PRE_DIST_PKG} @BUILD_MODULE_TRUE@@ISDARWIN_TRUE@PYTHON_TARGET_DIR = ${PYTHON_DIST_PKG} # PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} @BUILD_MODULE_TRUE@PYTHON_DEST_DIR = ${DESTDIR}${PYTHON_TARGET_DIR} pkglib_LTLIBRARIES = libstfnum.la libstfnum_la_SOURCES = ./fit.cpp \ ./levmar/lm.c ./levmar/Axb.c ./levmar/misc.c ./levmar/lmlec.c ./levmar/lmbc.c \ ./funclib.cpp ./stfnum.cpp ./measure.cpp libstfnum_la_LDFLAGS = $(LIBLAPACK_LDFLAGS) libstfnum_la_LIBADD = $(LIBSTF_LDFLAGS) -lfftw3 all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libstfnum/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libstfnum/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libstfnum.la: $(libstfnum_la_OBJECTS) $(libstfnum_la_DEPENDENCIES) $(EXTRA_libstfnum_la_DEPENDENCIES) $(AM_V_CXXLD)$(libstfnum_la_LINK) -rpath $(pkglibdir) $(libstfnum_la_OBJECTS) $(libstfnum_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Axb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/funclib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lmbc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lmlec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/measure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stfnum.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< lm.lo: ./levmar/lm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lm.lo -MD -MP -MF $(DEPDIR)/lm.Tpo -c -o lm.lo `test -f './levmar/lm.c' || echo '$(srcdir)/'`./levmar/lm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lm.Tpo $(DEPDIR)/lm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='./levmar/lm.c' object='lm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lm.lo `test -f './levmar/lm.c' || echo '$(srcdir)/'`./levmar/lm.c Axb.lo: ./levmar/Axb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT Axb.lo -MD -MP -MF $(DEPDIR)/Axb.Tpo -c -o Axb.lo `test -f './levmar/Axb.c' || echo '$(srcdir)/'`./levmar/Axb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Axb.Tpo $(DEPDIR)/Axb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='./levmar/Axb.c' object='Axb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o Axb.lo `test -f './levmar/Axb.c' || echo '$(srcdir)/'`./levmar/Axb.c misc.lo: ./levmar/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT misc.lo -MD -MP -MF $(DEPDIR)/misc.Tpo -c -o misc.lo `test -f './levmar/misc.c' || echo '$(srcdir)/'`./levmar/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/misc.Tpo $(DEPDIR)/misc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='./levmar/misc.c' object='misc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o misc.lo `test -f './levmar/misc.c' || echo '$(srcdir)/'`./levmar/misc.c lmlec.lo: ./levmar/lmlec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lmlec.lo -MD -MP -MF $(DEPDIR)/lmlec.Tpo -c -o lmlec.lo `test -f './levmar/lmlec.c' || echo '$(srcdir)/'`./levmar/lmlec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lmlec.Tpo $(DEPDIR)/lmlec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='./levmar/lmlec.c' object='lmlec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lmlec.lo `test -f './levmar/lmlec.c' || echo '$(srcdir)/'`./levmar/lmlec.c lmbc.lo: ./levmar/lmbc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lmbc.lo -MD -MP -MF $(DEPDIR)/lmbc.Tpo -c -o lmbc.lo `test -f './levmar/lmbc.c' || echo '$(srcdir)/'`./levmar/lmbc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lmbc.Tpo $(DEPDIR)/lmbc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='./levmar/lmbc.c' object='lmbc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lmbc.lo `test -f './levmar/lmbc.c' || echo '$(srcdir)/'`./levmar/lmbc.c .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< fit.lo: ./fit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fit.lo -MD -MP -MF $(DEPDIR)/fit.Tpo -c -o fit.lo `test -f './fit.cpp' || echo '$(srcdir)/'`./fit.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fit.Tpo $(DEPDIR)/fit.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./fit.cpp' object='fit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fit.lo `test -f './fit.cpp' || echo '$(srcdir)/'`./fit.cpp funclib.lo: ./funclib.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT funclib.lo -MD -MP -MF $(DEPDIR)/funclib.Tpo -c -o funclib.lo `test -f './funclib.cpp' || echo '$(srcdir)/'`./funclib.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/funclib.Tpo $(DEPDIR)/funclib.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./funclib.cpp' object='funclib.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o funclib.lo `test -f './funclib.cpp' || echo '$(srcdir)/'`./funclib.cpp stfnum.lo: ./stfnum.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT stfnum.lo -MD -MP -MF $(DEPDIR)/stfnum.Tpo -c -o stfnum.lo `test -f './stfnum.cpp' || echo '$(srcdir)/'`./stfnum.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stfnum.Tpo $(DEPDIR)/stfnum.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./stfnum.cpp' object='stfnum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o stfnum.lo `test -f './stfnum.cpp' || echo '$(srcdir)/'`./stfnum.cpp measure.lo: ./measure.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT measure.lo -MD -MP -MF $(DEPDIR)/measure.Tpo -c -o measure.lo `test -f './measure.cpp' || echo '$(srcdir)/'`./measure.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/measure.Tpo $(DEPDIR)/measure.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./measure.cpp' object='measure.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o measure.lo `test -f './measure.cpp' || echo '$(srcdir)/'`./measure.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done @BUILD_MODULE_TRUE@install: install-am @ISDARWIN_FALSE@install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkglibLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkglibLTLIBRARIES .PRECIOUS: Makefile # don't install anything because it has to go into the app bundle @BUILD_MODULE_FALSE@@ISDARWIN_TRUE@install: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stimfit-0.15.8/src/libstfnum/fit.h0000775000175000017500000001054513062445067013753 00000000000000// Header file for the stimfit namespace // Routines for fitting functions to data // last revision: 08-08-2006 // C. Schmidt-Hieber, christsc@gmx.de // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file fit.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Functions for linear and non-linear regression. */ #ifndef _FITLIB_H #define _FITLIB_H #include "./stfnum.h" #include namespace stfnum { /*! \addtogroup stfgen * @{ */ //! Performs a linear fit. /*! \param x The x- values of the data that are to be fitted. * \param y The y- values of the data that are to be fitted. * \param m On exit, the slope of the regression line. * \param c On exit, the y-intercept of the regression line. * \return A valarray containing the waveform of the fitted function. */ template T linFit( const std::vector& x, const std::vector& y, T& m, T& c ); //! Uses the Levenberg-Marquardt algorithm to perform a non-linear least-squares fit. /*! \param data A valarray containing the data. * \param dt The sampling interval of \e data. * \param fitFunc An stfnum::storedFunc to be fitted to \e data. * \param opts Options controlling Lourakis' implementation of the algorithm. * \param use_scaling Whether to scale x and y-amplitudes to 1.0 * \param p \e func's parameters. Should be set to an initial guess * on entry. Will contain the best-fit values on exit. * \param info Information about why the fit stopped iterating * \param warning A warning code on return. * \return The sum of squred errors between \e data and the best-fit function. */ double StfioDll lmFit(const Vector_double& data, double dt, const stfnum::storedFunc& fitFunc, const Vector_double& opts, bool use_scaling, Vector_double& p, std::string& info, int& warning ); //! Linear function. /*! \f[f(x)=p_0 x + p_1\f] * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the slope and \n * \e p[1] is the y intersection. * \return The evaluated function. */ double flin(double x, const Vector_double& p); //! Dummy function to be passed to stfnum::storedFunc for linear functions. void flin_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ); //! initializes a linear function /*! \return An stfnum::storedFunc that can be used to store a linear function after a fit */ StfioDll stfnum::storedFunc initLinFunc(); //! Compute and perform normalisation /*! \param data Data vector; will be scaled upon return * \param oldx original x interval * \return A vector with \n * [0] x scale * [1] x offset * [2] y scale * [3] y offset */ Vector_double get_scale(Vector_double& data, double oldx); //! Return default LM options /*! \return Default LM options */ Vector_double LM_default_opts(); } template T stfnum::linFit(const std::vector& x, const std::vector& y, T& m, T& c) { double sum_x=0.0; double sum_y=0.0; double sum_xx=0.0; double sum_xy=0.0; for (unsigned n=0;nn+1, where \n * \e n is the number of exponential terms, \n * \e p[2i] is the amplitude term, \n * \e p[2i+1] is the time constant, \n * \e p[2n], the last element, contains the offset and \n * \e i denotes the i -th exponential term (running from 0 to n-1). * \return The evaluated function. */ double fexp(double x, const Vector_double& p); //! Computes the Jacobian of stfnum::fexp(). /*! \f{eqnarray*} * j_{2i}(x) &=& \frac{\partial f(x)}{\partial p_{2i}} = \mathrm{e}^{\left(\frac{-x}{p_{2i+1}}\right)} \\ * j_{2i+1}(x) &=& \frac{\partial f(x)}{\partial p_{2i+1}} = \frac{p_{2i}}{p_{2i+1}^2} x \mathrm{e}^{\left( \frac{-x}{p_{2i+1}}\right)} \\ * j_n(x) &=& \frac{\partial f(x)}{\partial p_{n}} = 1 * \f} * \param x Function argument. * \param p A valarray of parameters of size 2n+1, where \n * \e n is the number of exponential terms, \n * \e p[2i] is the amplitude term, \n * \e p[2i+1] is the time constant, \n * \e p[2n], the last element, contains the offset and \n * \e i denotes the i -th exponential term (running from 0 to n-1). * \return A valarray \e j of size 2n+1 with the evaluated Jacobian, where \n * \e j[2i] contains the derivative with respect to \e p[2i], \n * \e j[2i+1] contains the derivative with respect to \e p[2i+1] and \n * \e j[2n], the last element, contains the derivative with respect to \e p[2n]. */ Vector_double fexp_jac(double x, const Vector_double& p); //! Initialises parameters for fitting stfnum::fexp() to \e data. /*! This needs to be made more robust. * \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 2n+1, where \e n is the * number of exponential functions. On exit, will contain initial parameter * estimates. */ void fexp_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ); //! Yet another initialiser for fitting stfnum::fexp() to \e data. /*! In this case, one of the amplitude terms will have another sign than the others, making * it more suitable for fitting PSCs or PSPs. However, this often fails to work in practice. * \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 2n+1, where \e n is the * number of exponential functions. On exit, will contain initial parameter * estimates. */ void fexp_init2(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ); //! Monoexponential function with delay. /*! \f{eqnarray*} * f(x)= * \begin{cases} * p_0, & \mbox{if }x < p_3 \\ * \left( p_0 - p_2 \right) \mathrm{e}^{\left (\frac{p_3 - x}{p_1}\right )} + p_2, & \mbox{if }x \geq p_3 * \end{cases} * \f} * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the baseline, \n * \e p[1] is the time constant, \n * \e p[2] is the amplitude and \n * \e p[3] is the delay. * \return The evaluated function. */ double fexpde(double x, const Vector_double& p); #if 0 //! Computes the Jacobian of stfnum::fexpde(). /*! \f{eqnarray*} * j_0(x)&=& \frac{df(x)}{dp_0} = * \begin{cases} * 1, & \mbox{if }x < p_3 \\ * \mathrm{e}^{\frac{p_3 - x}{p_1}}, & \mbox{if }x \geq p_3 * \end{cases} \\ * j_1(x)&=& \frac{df(x)}{dp_1} = * \begin{cases} * 0, & \mbox{if }x < p_3 \\ * \left( p_0-p_2 \right) \left( p_3-x \right) \frac{-1}{p_1^2} \mathrm{e}^{\frac{p_3 - x}{p_1}}, & \mbox{if }x \geq p_3 * \end{cases} \\ * j_2(x)&=& \frac{df(x)}{dp_2} = * \begin{cases} * 0, & \mbox{if }x < p_3 \\ * 1 - \mathrm{e}^{\frac{p_3 - x}{p_1}}, & \mbox{if }x \geq p_3 * \end{cases} \\ * j_3(x)&=& \frac{df(x)}{dp_3} = * \begin{cases} * 0, & \mbox{if }x < p_3 \\ * \left( p_0-p_2 \right) \frac{1}{p_1} \mathrm{e}^{\frac{p_3 - x}{p_1}}, & \mbox{if }x \geq p_3 * \end{cases} * \f} * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the baseline, \n * \e p[1] is the time constant, \n * \e p[2] is the amplitude and \n * \e p[3] is the delay. * \return A valarray \e j with the evaluated Jacobian, where \n * \e j[0] contains the derivative with respect to \e p[0], \n * \e j[1] contains the derivative with respect to \e p[1], \n * \e j[2] contains the derivative with respect to \e p[2] and \n * \e j[3] contains the derivative with respect to \e p[3]. */ Vector_double fexpde_jac(double x, const Vector_double& p); #endif //! Initialises parameters for fitting stfnum::fexpde() to \e data. /*! \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 4. * On exit, will contain initial parameter estimates. */ void fexpde_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ); //! Biexponential function with delay. /*! \f{eqnarray*} * f(x)= * \begin{cases} * p_0 & \mbox{if }x < p_1 \\ * p_3 \left( \mathrm{e}^{\frac{p_1 - x}{p_2}} - \mathrm{e}^{\frac{p_1 - x}{p_4}} \right) + p_0 & \mbox{if }x \geq p_1 * \end{cases} * \f} * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the baseline, \n * \e p[1] is the delay, \n * \e p[2] is the later (slower) time constant, \n * \e p[3] is the amplitude and \n * \e p[4] is the earlier (faster) time constant, \n * \return The evaluated function. */ double fexpbde(double x, const Vector_double& p); //! Triexponential function with delay. /*! \f{eqnarray*} * f(x)= * \begin{cases} * p_0 & \mbox{if }x < p_1 \\ * p_3 \left( p_6\mathrm{e}^{\frac{p_1 - x}{p_2}} + (1-p_6)\mathrm{e}^{\frac{p_1 - x}{p_5}} - \mathrm{e}^{\frac{p_1 - x}{p_4}} \right) + p_0 & \mbox{if }x \geq p_1 * \end{cases} * \f} * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the baseline, \n * \e p[1] is the delay, \n * \e p[2] is the first later (slower) time constant, \n * \e p[3] is the amplitude and \n * \e p[4] is the earlier (faster) time constant, \n * \e p[5] is the second later (slower) time constant, \n * \e p[6] is the relative weight of p[2], \n * \return The evaluated function. */ double fexptde(double x, const Vector_double& p); #if 0 //! Computes the Jacobian of stfnum::fexpde(). /*! \f{eqnarray*} * j_0(x)&=& \frac{df(x)}{dp_0} = * \begin{cases} * 1, & \mbox{if }x < p_3 \\ * \mathrm{e}^{\frac{p_3 - x}{p_1}}, & \mbox{if }x \geq p_3 * \end{cases} \\ * j_1(x)&=& \frac{df(x)}{dp_1} = * \begin{cases} * 0, & \mbox{if }x < p_3 \\ * \left( p_0-p_2 \right) \left( p_3-x \right) \frac{-1}{p_1^2} \mathrm{e}^{\frac{p_3 - x}{p_1}}, & \mbox{if }x \geq p_3 * \end{cases} \\ * j_2(x)&=& \frac{df(x)}{dp_2} = * \begin{cases} * 0, & \mbox{if }x < p_3 \\ * 1 - \mathrm{e}^{\frac{p_3 - x}{p_1}}, & \mbox{if }x \geq p_3 * \end{cases} \\ * j_3(x)&=& \frac{df(x)}{dp_3} = * \begin{cases} * 0, & \mbox{if }x < p_3 \\ * \left( p_0-p_2 \right) \frac{1}{p_1} \mathrm{e}^{\frac{p_3 - x}{p_1}}, & \mbox{if }x \geq p_3 * \end{cases} * \f} * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the baseline, \n * \e p[1] is the time constant, \n * \e p[2] is the amplitude and \n * \e p[3] is the delay. * \return A valarray \e j with the evaluated Jacobian, where \n * \e j[0] contains the derivative with respect to \e p[0], \n * \e j[1] contains the derivative with respect to \e p[1], \n * \e j[2] contains the derivative with respect to \e p[2] and \n * \e j[3] contains the derivative with respect to \e p[3]. */ Vector_double fexpbde_jac(double x, const Vector_double& p); #endif //! Initialises parameters for fitting stfnum::fexpde() to \e data. /*! \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 4. * On exit, will contain initial parameter estimates. */ void fexpbde_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ); //! Initialises parameters for fitting stfnum::fexpde() to \e data. /*! \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 4. * On exit, will contain initial parameter estimates. */ void fexptde_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ); //! Alpha function. /*! \f[f(x)=p_0 \frac{x}{p_1} \mathrm{e}^{\left(1 - \frac{x}{p_1} \right)} + p_2\f] * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the amplitude, \n * \e p[1] is the rate and \n * \e p[2] is the offset. * \return The evaluated function. */ double falpha(double x, const Vector_double& p); //! Computes the Jacobian of stfnum::falpha(). /*! \f{eqnarray*} * j_0(x) &=& \frac{\partial f(x)}{\partial p_0} = \frac{x \mathrm{e}^{\left(1 - \frac{x}{p_1} \right)}}{p_1} \\ * j_1(x) &=& \frac{\partial f(x)}{\partial p_1} = \frac{x \mathrm{e}^{\left(1 - \frac{x}{p_1} \right)}}{p_1} \left(\frac{p_0 x}{p_1^2} - \frac{p_0}{p_1} \right) \\ * j_2(x) &=& \frac{\partial f(x)}{\partial p_2} = 1 * \f} * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the amplitude, \n * \e p[1] is the rate and \n * \e p[2] is the offset. * \return A valarray \e j with the evaluated Jacobian, where \n * \e j[0] contains the derivative with respect to \e p[0], \n * \e j[1] contains the derivative with respect to \e p[1] and \n * \e j[2] contains the derivative with respect to \e p[2]. */ Vector_double falpha_jac(double x, const Vector_double& p); //! Hodgkin-Huxley sodium conductance function. /*! \f[f(x)=p_0\left(1-\mathrm{e}^{\frac{-x}{p_1}}\right)^3\mathrm{e}^{\frac{-x}{p_2}} + p_3\f] * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the amplitude \f$g'_{Na}\f$, \n * \e p[1] is \f$\tau_m\f$, \n * \e p[2] is \f$\tau_h\f$ and \n * \e p[3] is the offset. \n * \return The evaluated function. */ double fHH(double x, const Vector_double& p); //! Computes the sum of an arbitrary number of Gaussians. /*! \f[ * f(x) = \sum_{i=0}^{n-1}p_{3i}\mathrm{e}^{- \left( \frac{x-p_{3i+1}}{p_{3i+2}} \right) ^2} * \f] * \param x Argument of the function. * \param p A valarray of function parameters of size 3\e n, where \n * \e p[3i] is the amplitude of the Gaussian \n * \e p[3i+1] is the position of the center of the peak, \n * \e p[3i+2] is the width of the Gaussian, \n * \e n is the number of Gaussian functions and \n * \e i is the 0-based index of the i-th Gaussian. * \return The evaluated function. */ StfioDll double fgauss(double x, const Vector_double& p); //! Computes the Jacobian of a sum of Gaussians. Vector_double fgauss_jac(double x, const Vector_double& p); //! power of 1 sodium conductance function. /*! \f[f(x)=p_0\left(1-\mathrm{e}^{\frac{-x}{p_1}}\right)\mathrm{e}^{\frac{-x}{p_2}} + p_3\f] * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the amplitude \f$g'_{Na}\f$, \n * \e p[1] is \f$\tau_m\f$, \n * \e p[2] is \f$\tau_h\f$ and \n * \e p[3] is the offset. \n * \return The evaluated function. */ double fgnabiexp(double x, const Vector_double& p); //! Computes the Jacobian of stfnum::fgnabiexp(). /*! \f{eqnarray*} * j_0(x) &=& \frac{\partial f(x)}{\partial p_0} = \left(1 -\mathrm{e}^{\frac{-x}{p_1}}\right) \mathrm{e}^{\frac{-x}{p_2}} \\ * j_1(x) &=& \frac{\partial f(x)}{\partial p_1} = p_0 \frac{ -x \mathrm{e}^{\left(-\frac{x}{p_1} - \frac{x}{p_2} \right)}}{p_1^2} \\ * j_2(x) &=& \frac{\partial f(x)}{\partial p_2} = p_0 \frac{ x \left(1 -\mathrm{e}^{\frac{-x}{p_1}}\right) \mathrm{e}^{\frac{-x}{p_2}}} {p_2^2}\\ * j_3(x) &=& \frac{\partial f(x)}{\partial p_3} = 1 * \f} * \param x Function argument. * \param p A valarray of parameters, where \n * \e p[0] is the amplitude \f$g'_{Na}\f$, \n * \e p[1] is \f$\tau_m\f$, \n * \e p[2] is \f$\tau_h\f$ and \n * \e p[3] is the offset. \n * \return A valarray \e j with the evaluated Jacobian, where \n * \e j[0] contains the derivative with respect to \e p[0], \n * \e j[1] contains the derivative with respect to \e p[1], \n * \e j[2] contains the derivative with respect to \e p[2] and \n * \e j[3] contains the derivative with respect to \e p[3]. */ Vector_double fgnabiexp_jac(double x, const Vector_double& p); //! Initialises parameters for fitting stfnum::falpha() to \e data. /*! \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 3. On exit, will contain initial parameter * estimates. */ void falpha_init(const Vector_double& data, double base, double peak, double RTLoHI, double HalfWidth, double dt, Vector_double& pInit ); //! Initialises parameters for fitting stfnum::fgauss() to \e data. /*! \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 3. On exit, will contain initial parameter * estimates. */ void fgauss_init(const Vector_double& data, double base, double peak, double RTLoHI, double HalfWidth, double dt, Vector_double& pInit ); //! Initialises parameters for fitting stfnum::falpha() to \e data. /*! \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 4. On exit, will contain initial parameter * estimates. */ void fHH_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ); //! Initialises parameters for fitting stfnum::falpha() to \e data. /*! \param data The waveform of the data for the fit. * \param base Baseline of \e data. * \param peak Peak value of \e data. * \param dt The sampling interval. * \param pInit On entry, pass a valarray of size 4. On exit, will contain initial parameter * estimates. */ void fgnabiexp_init(const Vector_double& data, double base, double peak, double RTLoHi, double HalfWidth, double dt, Vector_double& pInit ); //! Scales a parameter that linearly depends on x /*! \param The parameter to scale * \param xscale x scaling factor * \param xoff x offset * \param yscale y scaling factor * \param yoff y offset * \return Scaled parameter */ double xscale(double param, double xscale, double xoff, double yscale, double yoff); //! Unscales a parameter that linearly depends on x /*! \param The parameter to scale * \param xscale x scaling factor * \param xoff x offset * \param yscale y scaling factor * \param yoff y offset * \return Unscaled parameter */ double xunscale(double param, double xscale, double xoff, double yscale, double yoff); //! Scales a parameter that linearly depends on y /*! \param The parameter to scale * \param xscale x scaling factor * \param xoff x offset * \param yscale y scaling factor * \param yoff y offset */ double yscale(double param, double xscale, double xoff, double yscale, double yoff); //! Scales a parameter that linearly depends on y and adds an offset /*! \param The parameter to scale * \param xscale x scaling factor * \param xoff x offset * \param yscale y scaling factor * \param yoff y offset */ double yscaleoffset(double param, double xscale, double xoff, double yscale, double yoff); //! Unscales a parameter that linearly depends on y /*! \param The parameter to scale * \param xscale x scaling factor * \param xoff x offset * \param yscale y scaling factor * \param yoff y offset * \return Unscaled parameter */ double yunscale(double param, double xscale, double xoff, double yscale, double yoff); //! Unscales a parameter that linearly depends on y and removes the offset /*! \param The parameter to scale * \param xscale x scaling factor * \param xoff x offset * \param yscale y scaling factor * \param yoff y offset * \return Unscaled parameter */ double yunscaleoffset(double param, double xscale, double xoff, double yscale, double yoff); //! Creates stfnum::parInfo structs for n-exponential functions. /*! \param n_exp Number of exponential terms. * \return A vector of parameter information structs. */ std::vector getParInfoExp(int n_exp); //! Calculates a weighted time constant. /*! \param p Parameters of an exponential function (see stfnum::fexp()). * \param parsInfo Information about the parameters \e p. * \param chisqr The sum of squared errors, as returned from a least-squares fit. * \return A formatted table of results. */ stfnum::Table outputWTau(const Vector_double& p, const std::vector& parsInfo, double chisqr); //! Finds the index of \e data where \e value is encountered for the first time. /*! \param data The waveform to be searched. * \param value The value to be found. * \return The index of \e data right after \e value has been crossed. */ std::size_t whereis(const Vector_double& data, double value); //! Returns the library of functions for non-linear regression. /*! \return A vector of non-linear regression functions. */ StfioDll std::vector GetFuncLib(); /*@}*/ } #endif stimfit-0.15.8/src/Makefile.am0000775000175000017500000000041213062445067013041 00000000000000if WITH_BIOSIGLITE SUBDIRS = libbiosiglite else SUBDIRS = endif # The order is important here because libstimfit.la will be used by stfswig. if BUILD_MODULE SUBDIRS += libstfio libstfnum pystfio else SUBDIRS += libstfio libstfnum stimfit stimfit/py endif stimfit-0.15.8/src/test/0000775000175000017500000000000013315356572012047 500000000000000stimfit-0.15.8/src/test/channel.cpp0000664000175000017500000000245113062445067014102 00000000000000#include "../libstfio/stfio.h" #include TEST(Channel_test, constructors) { Channel ch0; EXPECT_EQ( ch0.size(), 0 ); Section sec(32768); Channel ch1(sec); EXPECT_EQ( ch1.size(), 1 ); EXPECT_EQ( ch1[0].size(), 32768 ); std::deque
sec_list(16, Section(32768)); Channel ch2(sec_list); EXPECT_EQ( ch2.size(), 16 ); EXPECT_EQ( ch2[ch2.size()-1].size(), 32768 ); Channel ch3(16, 32768); EXPECT_EQ( ch3.size(), 16 ); EXPECT_EQ( ch3[ch3.size()-1].size(), 32768 ); } TEST(Channel_test, data_access) { Channel ch1(Section(32768)); EXPECT_EQ( ch1[0][ch1[0].size()-1], 0 ); EXPECT_THROW( ch1.at( ch1.size() ), std::out_of_range ); EXPECT_THROW( ch1[0].at(ch1[0].size()), std::out_of_range ); std::deque
sec_list(16, Section(32768)); Channel ch2(sec_list); EXPECT_EQ( ch2[ch2.size()-1][ch2[ch2.size()-1].size()-1], 0 ); EXPECT_THROW( ch2.at( ch2.size() ), std::out_of_range ); EXPECT_THROW( ch2[ch2.size()-1].at(ch2[ch2.size()-1].size()), std::out_of_range ); Channel ch3(16, 32768); EXPECT_EQ( ch3[ch3.size()-1][ch3[ch3.size()-1].size()-1], 0 ); EXPECT_THROW( ch3.at( ch3.size() ), std::out_of_range ); EXPECT_THROW( ch3[ch3.size()-1].at(ch3[ch3.size()-1].size()), std::out_of_range ); } stimfit-0.15.8/src/test/recording.cpp0000664000175000017500000000420113062445067014441 00000000000000#include "../libstfio/stfio.h" #include TEST(Recording_test, constructors) { Recording rec0; EXPECT_EQ( rec0.size(), 0 ); std::deque
sec_list(16, Section(32768)); Channel ch(sec_list); Recording rec1(ch); EXPECT_EQ( rec1.size(), 1 ); EXPECT_EQ( rec1[0].size(), 16 ); EXPECT_EQ( rec1[0][0].size(), 32768 ); std::deque ch_list(4, Channel(16, 32768)); Recording rec2(ch_list); EXPECT_EQ( rec2.size(), 4 ); EXPECT_EQ( rec2[rec2.size()-1].size(), 16 ); EXPECT_EQ( rec2[rec2.size()-1][rec2[rec2.size()-1].size()-1].size(), 32768 ); Recording rec3(4, 16, 32768); EXPECT_EQ( rec3.size(), 4 ); EXPECT_EQ( rec3[rec3.size()-1].size(), 16 ); EXPECT_EQ( rec3[rec3.size()-1][rec3[rec3.size()-1].size()-1].size(), 32768 ); } TEST(Recording_test, data_access) { std::deque
sec_list(16, Section(32768)); Channel ch(sec_list); Recording rec1(ch); int chsize = rec1[0].size(); int secsize = rec1[0][rec1[0].size()-1].size(); EXPECT_EQ( rec1[0][chsize-1][secsize-1], 0 ); EXPECT_THROW( rec1.at(1), std::out_of_range ); EXPECT_THROW( rec1[0].at(chsize), std::out_of_range ); EXPECT_THROW( rec1[0][chsize-1].at(secsize), std::out_of_range ); std::deque ch_list(4, Channel(16, 32768)); Recording rec2(ch_list); int recsize = rec2.size(); chsize = rec2[recsize-1].size(); secsize = rec2[recsize-1][rec2[recsize-1].size()-1].size(); EXPECT_EQ( rec2[recsize-1][chsize-1][secsize-1], 0 ); EXPECT_THROW( rec2.at(recsize), std::out_of_range ); EXPECT_THROW( rec2[recsize-1].at(chsize), std::out_of_range ); EXPECT_THROW( rec2[recsize-1][chsize-1].at(secsize), std::out_of_range ); Recording rec3(4, 16, 32768); recsize = rec3.size(); chsize = rec3[recsize-1].size(); secsize = rec3[recsize-1][rec3[recsize-1].size()-1].size(); EXPECT_EQ( rec3[recsize-1][chsize-1][secsize-1], 0 ); EXPECT_THROW( rec3.at(recsize), std::out_of_range ); EXPECT_THROW( rec3[recsize-1].at(chsize), std::out_of_range ); EXPECT_THROW( rec3[recsize-1][chsize-1].at(secsize), std::out_of_range ); } stimfit-0.15.8/src/test/measure.cpp0000664000175000017500000007720213062445067014141 00000000000000#include "../stimfit/stf.h" #include "../libstfnum/measure.h" #include #include #include #if (__cplusplus < 201103) #include #include #else #include #endif #define PI 3.14159265f #define N_MAX 1000 /* limit tolerance value to sampling interval since they are related. The higher the sampling interval the lower the tolerance can be, for that reason these values must change accordingly */ const static double dt = 1/100.0; /* sampling interval */ const static double tol = dt; /* 1 sampling interval */ void save_txt(const char *fname, Vector_double &mydata){ std::ofstream output_file; output_file.open(fname); Vector_double::iterator it; for (it = mydata.begin(); it != mydata.end(); ++it){ output_file << *it << std::endl; } output_file.close(); } //========================================================================= // evaluates if the measurement is within the expected value for a given // tolerance level that corresponds to //========================================================================= void pass_test(double measurement, double expected, double tolerance){ EXPECT_NEAR( measurement, expected, fabs(expected*tolerance) ); } //========================================================================= // a sine wave to test basic Stimfit measurements // the sine function has well defined maxima and minima that we use // to test the peak algorithm in both directions. // In addition, because derivative of the sine is known (cosine) // we can test easily the max slope of rise and decay. // The maximal slope of rise correspond to the point where cosine is one // (at 0, 2*PI) and the max slope of decay where the cosine is minus one // (at PI, 3*PI). Finally, the 20-80% rise-time should be 0.7, which // is the result of calculating arcsin(0.8)-arcsin(0.2) and the half-with // is two times the value of arcsin(1)-arcsin(0.5) // // length of the wave in sampling points (e.g long(2*PI)) //========================================================================= std::vector sinwave(long length){ std::vector mydata(length); for(std::vector::size_type x=0; x != mydata.size() ; ++x){ mydata[x] = sin( x*dt ); /* see sampling interval */ } return mydata; } //========================================================================= // sine wave as function of amplitude and lambda //========================================================================= std::vector sinwave(double amp, double lambda, long length){ std::vector mydata(length); for(std::vector::size_type x=0; x != mydata.size() ; ++x){ mydata[x] = amp*sin( 2*PI*x*dt/lambda ); /* see sampling interval */ } return mydata; } //========================================================================= // Exponential function to test the Stimfit threshold measurement // we can easily evalute the value and position of the threshold // because the slope we fix for the threshold is simply the exponential // for example, for a slope of 1.5, we will find that // the obtained threshold obtained is 1.5. The time of the // threshold (thrT) can be evaluated at exp(thrT) and give the slope value // the function starts at x=0 (y=1), therefore, the slope values // to be tested should be greater or equal to ONE!!!. //========================================================================= std::vector expwave(long length){ std::vector mydata(length); for(std::vector::size_type x=0; x != mydata.size() ; ++x){ mydata[x] = exp( x*dt ); /* see sampling interval */ } return mydata; } std::vector expwave(double tau, long length){ std::vector mydata(length); for(std::vector::size_type x=0; x != mydata.size() ; ++x){ mydata[x] = exp( x*dt/tau ); /* see sampling interval */ } return mydata; } //========================================================================= // A vector with random numbers between 0 and 1 //========================================================================= std::vector rand(long size){ /* seed the random number generator */ int seed = time(NULL); srand(seed); std::vector myrand(size); for (int i=0; i uniform(double value, long size){ /* seed the random number generator */ int seed = time(NULL); srand(seed); std::vector myrand(size); for (int i=0; i norm(double mean, double stddev){ std::vector myrand(N_MAX); #if (__cplusplus < 201103) boost::mt19937 rng; /* seed? */ boost::normal_distribution<> norm(mean, stddev); boost::variate_generator > rand_val(rng, norm); for (int i=0; i < myrand.size(); ++i){ myrand[i] = rand_val(); } #else std::random_device rd; std::mt19937 rng(rd()); /* seed? */ std::normal_distribution<> norm(mean, stddev); for (int i=0; i < myrand.size(); ++i){ myrand[i] = norm(rng); } #endif return myrand; } //========================================================================= // test baseline random //========================================================================= TEST(measlib_test, baseline_random) { double var; std::vector mybase(N_MAX); for (int i=0; i myrand = rand(N_MAX); mybase[i] = stfnum::base(stfnum::mean_sd, var, myrand, 0, N_MAX-1); EXPECT_NEAR(mybase[i], 1/2., 0.05); /* expected mean = 1/2 */ EXPECT_NEAR(var, 1/12., (1/12.)*0.1); /* expected var = 1/12 */ } //save_txt("base.out", mybase); } //========================================================================= // test baseline (base) //========================================================================= TEST(measlib_test, baseline_basic) { std::vector data(32768); double var = 0; EXPECT_EQ(stfnum::base(stfnum::mean_sd, var, data, 0, data.size()-1), 0); EXPECT_EQ(var, 0); } //========================================================================= // test baseline out of range //========================================================================= TEST(measlib_test, baseline_out_of_range_exceptions) { std::vector data(32768); double var; /* Out of range: after last point */ EXPECT_TRUE(isnan(stfnum::base(stfnum::mean_sd, var, data, 0, data.size()))); /* Out of range: before first point */ EXPECT_TRUE(isnan(stfnum::base(stfnum::mean_sd, var, data, -1, data.size()-1))); } //========================================================================= // test peak //========================================================================= TEST(measlib_test, peak_basic) { /* 1.- Test with a basic example */ std::vector data(32768); data[16385] = 1.0; double maxT; /* Find positive going peaks */ double peak_up = stfnum::peak(data, 0.0, 0, data.size()-1, \ 1, stfnum::up, maxT); EXPECT_EQ(peak_up, 1.0); /* Find negative going peaks */ double peak_down = stfnum::peak(data, 0.0, 0, data.size()-1, \ 1, stfnum::down, maxT); EXPECT_EQ(peak_down, 0.0); /* Find either positive or negative going peaks */ double peak_both = stfnum::peak(data, 0.0, 0, data.size()-1,\ 1, stfnum::both, maxT); EXPECT_EQ(peak_both, 1.0); /* take larger value */ EXPECT_EQ(maxT, 16385); } //========================================================================= // test peak out of range exceptions //========================================================================= TEST(measlib_test, peak_out_of_range_exceptions) { std::vector data(32768); double maxT; /* Out of range: before first point */ EXPECT_TRUE(isnan(stfnum::peak(data, 0.0, 0, data.size(), 1, stfnum::both, maxT))); /* Out of range: before first point */ EXPECT_TRUE(isnan(stfnum::peak(data, 0.0, -1, data.size()-1, 1, stfnum::both, maxT))); } //========================================================================= // test peak direction //========================================================================= TEST(measlib_test, peak_direction) { /* Sin wave between 0 and 2PI */ std::vector mywave = sinwave( long(2*PI/dt) ); /* positive peak is at one, located at PI/2 */ double maxT; double peak = stfnum::peak(mywave, 0.0, 0, long(2*PI/dt)-1, \ 1, stfnum::up, maxT); double peak_xpted = 1.0; /* peak is at 1.0 */ double maxT_xpted = (PI/2.0)/dt; /* maxT located at PI/2 */ EXPECT_NEAR(peak, peak_xpted, 0.1); EXPECT_NEAR(maxT, maxT_xpted, fabs(maxT_xpted*tol)); /* look for negative peak between zero and 2*PI */ double drop = stfnum::peak(mywave, 0.0, 0, long(2*PI/dt)-1, \ 1, stfnum::down, maxT); peak_xpted = -1.0; /* drop is at -1.0 */ maxT_xpted = (3*PI/2)/dt; /* maxT located at 3*PI/2 */ EXPECT_NEAR(drop, peak_xpted, 0.1); EXPECT_NEAR(maxT, maxT_xpted, fabs(maxT_xpted*tol)); /* Cursors between 0 and PI give only possitive peak values*/ double p1 = stfnum::peak(mywave, 0.0, 0, long(PI/dt)-1, \ 1, stfnum::down, maxT); EXPECT_TRUE(p1 >= 0); /* Cursors between PI and 2*PI give only negative peak values*/ double p2 = stfnum::peak(mywave, 0.0, long(PI/dt), long(2*PI/dt)-1, \ 1, stfnum::down, maxT); EXPECT_TRUE(p2 <= 0); } //========================================================================= // Peak random //========================================================================= TEST(measlib_test, peak_random) { double maxT; std::vector mypeak(N_MAX); std::vector myrand = rand(N_MAX); for (int i=0; i<10; i++){ /* A*sin(2*PI*x/lambda) */ std::vector mywave = sinwave(myrand[i], long(2*PI),long(2*PI/dt) ); mypeak[i] = stfnum::peak(mywave, 0.0, 0, long(2*PI/dt)-1, 1, stfnum::up, maxT); EXPECT_NEAR(mypeak[i], myrand[i], fabs(myrand[i]*tol)); } //save_txt("peaks.out", mypeak); } //========================================================================= // test threshold //========================================================================= TEST(measlib_test, threshold){ /* exp wave between 0 and 1 */ std::vector mywave = expwave(1/dt); double thrT; double slope = 1.2; /* y-units/sample, choose always >= 1 */ int windowLength = 1; /* check threshold value at the given slope */ double threshold = stfnum::threshold(mywave, 1, long(1/dt)-1, slope*dt, thrT, windowLength); /* the threshold should be exactly the slope value */ EXPECT_NEAR(threshold*1, slope, fabs(slope*tol)); /* exp(t) should give the slope value */ EXPECT_NEAR(std::exp(thrT*dt), slope, fabs(slope*tol)); } //========================================================================= // test threshold windowLength exceptions //========================================================================= TEST(measlib_test, threshold_windowLength_exceptions){ std::vector data = expwave(1/dt); double thrT; double slope = 1.2; /* y-units/sample, choose always >= 1 */ int mywindowLength = 10; /* Right peak cursor must be larger than windowLength long myRightPeakCursor = mywindowLength-1; EXPECT_TRUE(isnan(stfnum::threshold(data, 0, myRightPeakCursor, slope*dt, thrT, mywindowLength))); */ /* Left peak cursor must be smaller than data.size()-windowLength */ long myLeftPeakCursor = data.size()-mywindowLength; EXPECT_TRUE(isnan(stfnum::threshold(data, myLeftPeakCursor, data.size()-1, slope*dt, thrT, mywindowLength))); /* Data size itself must be smaller than windowLength */ mywindowLength = data.size()+1; EXPECT_TRUE(isnan(stfnum::threshold(data, 0, data.size()-1, \ slope*dt, thrT, mywindowLength))); } //========================================================================= // test threshold out of range exceptions //========================================================================= TEST(measlib_test, threshold_out_of_range){ std::vector mywave = expwave(1/dt); double thrT; double slope = 0.2; /* y-units/sample, choose always >= 1 */ int windowLength = 1; /* Out of range: after last point*/ EXPECT_TRUE(isnan(stfnum::threshold(mywave, 1, mywave.size(), slope*dt, thrT, windowLength))); EXPECT_TRUE(isnan(thrT)); /* Out of range: before first point*/ EXPECT_TRUE(isnan(stfnum::threshold(mywave, -1, mywave.size()-1, slope*dt, thrT, windowLength))); EXPECT_TRUE(isnan(thrT)); } //========================================================================= // test risetime values //========================================================================= TEST(measlib_test, risetime_values){ /* a sine wave between 0 and PI */ std::vector mywave = sinwave( long(PI/dt) ); std::size_t t20, t80; double t20Real; /* check rise time between 0 and PI/2 */ double risetime = stfnum::risetime(mywave, 0.0, 1.0, 1, long((PI/2)/dt)-1, 0.2, t20, t80, t20Real); /* t20 and t80 correspond to 0.2 and 0.8 respectively */ EXPECT_NEAR( std::sin(t20*dt), 0.2, 0.02 ); /* sin(t20) = 0.2 */ EXPECT_NEAR( std::sin(t80*dt), 0.8, 0.08 ); /* sin(t80) = 0.8 */ /* the risetime is the arcsin(t80)-arcsin(t20) */ double risetime_xpted = std::asin(0.8) - std::asin(0.2); EXPECT_NEAR(risetime*dt, risetime_xpted, \ fabs(risetime_xpted*tol) ); } //========================================================================= // test half_duration //========================================================================= TEST(measlib_test, half_duration){ /* a sine wave between 0 and PI */ std::vector mywave = sinwave( long(PI/dt)+10 ); std::size_t t50LeftId, t50RightId; double t50Real; /* check half duration between 0 and PI */ double half_dur = stfnum::t_half(mywave, 0.0, 1.0, 1, long(PI/dt)-1, long((PI/2)/dt),t50LeftId, t50RightId, t50Real); /* t50Left and t50Right correspond to 0.5 */ EXPECT_NEAR( std::sin(t50LeftId*dt), 0.5, 0.05); /* sin(t50) = 0.5 */ EXPECT_NEAR( std::sin(t50RightId*dt), 0.5, 0.05); /* half-duration is arcsin(0.5)+ arcsin(1) */ double half_dur_xpted = std::asin(0.5)+std::asin(1.0); EXPECT_NEAR(half_dur*dt, half_dur_xpted, fabs(half_dur_xpted*tol) ); } //========================================================================= // test half_duration exceptions //========================================================================= TEST(measlib_test, half_duration_out_of_range_exceptions){ /* a sine wave between 0 and PI */ std::vector mywave = sinwave( long(PI/dt) ); std::size_t t50LeftId, t50RigthId; double t50Real; double center = -1.0; /* index of the peak */ /* Out of range: if center <0 */ EXPECT_TRUE(isnan( stfnum::t_half(mywave, 0.0, 1.0, 1, long(PI/dt)-1, center, t50LeftId, t50RigthId, t50Real))); /* Out of range: if center > recording length */ center = mywave.size(); EXPECT_TRUE(isnan( stfnum::t_half(mywave, 0.0, 1.0, 1, long(PI/dt)-1, center, t50LeftId, t50RigthId, t50Real))); } //========================================================================= // test maximal slope of rise //========================================================================= TEST(measlib_test, maxrise_basic) { std::vector data(32768); data[16385] = 1.0; double maxRiseT, maxRiseY; double maxrise = stfnum::maxRise(data, 1, data.size()-1, \ maxRiseT, maxRiseY, 1); EXPECT_EQ(maxrise, 1.0); EXPECT_EQ(maxRiseT, 16384.5); EXPECT_EQ(maxRiseY, 0.5); } //========================================================================= // test maximal slope of rise out of range exceptions //========================================================================= TEST(measlib_test, maxrise_out_of_range_exceptions) { std::vector data(32768); double maxRiseT, maxRiseY; /* Out of range: peak cursor after last point */ EXPECT_TRUE(isnan(stfnum::maxRise(data, 0, data.size(), \ maxRiseT, maxRiseY, 1))); /* Out of range: peak cursor before first point EXPECT_TRUE(isnan(stfnum::maxRise(data, -1, data.size()-1, \ maxRiseT, maxRiseY, 1)));*/ } //========================================================================= // test maximal slope of rise windowLength exceptions //========================================================================= TEST(measlib_test, maxrise_windowLength_exceptions){ std::vector data(32768); double maxRiseT, maxRiseY; long mywindowLength; /* fixed time interval (in sampling points) */ /* Right peak cursor must be larger than windowLength mywindowLength = 10; long myRightPeakCursor = mywindowLength-1; EXPECT_TRUE(isnan(stfnum::maxRise(data, 0, myRightPeakCursor, \ maxRiseT, maxRiseY, mywindowLength)));*/ /* Left peak cursor must be smaller than data.size()-windowLength long myLeftPeakCursor = data.size()-mywindowLength; EXPECT_TRUE(isnan(stfnum::maxRise(data, myLeftPeakCursor, data.size()-1 , \ maxRiseT, maxRiseY, mywindowLength))); */ /* Data size itself must be smaller than windowLength */ mywindowLength = data.size()+1; EXPECT_TRUE(isnan(stfnum::maxRise(data, 0, data.size()-1, \ maxRiseT, maxRiseY, mywindowLength))); } //========================================================================= // test maximal slope of rise with sine wave //========================================================================= TEST(measlib_test, maxrise_values) { /* sine wave between 0 and 3*PI */ std::vector mywave = sinwave( long(3*PI/dt) ); double maxRiseT, maxRiseY; /* check max rise from peak to peak */ int windowLength = 1; stfnum::maxRise(mywave, long((PI/2)/dt), long((5*PI/2)/dt)-1, maxRiseT, maxRiseY, windowLength); /* Max slope of rise should be in 2*PI and give value 0 */ double maxRiseT_xpkted = 2*PI/dt; EXPECT_NEAR(maxRiseY, 0 , 0.1); EXPECT_NEAR( maxRiseT, maxRiseT_xpkted, fabs(maxRiseT_xpkted*tol) ); } //========================================================================= // test maximal slope of decay //========================================================================= TEST(measlib_test, maxdecay_basic) { std::vector data(32768); data[16385] = 1.0; double maxDecayT, maxDecayY; double maxdecay = stfnum::maxDecay(data, 16385, data.size()-1, \ maxDecayT, maxDecayY, 1); EXPECT_EQ(maxdecay, 1.0); EXPECT_EQ(maxDecayT, 16385.5); EXPECT_EQ(maxDecayY, 0.5); } //========================================================================= // test maximal slope of decay out of range exceptions //========================================================================= TEST(measlib_test, maxdecay_out_of_range_exceptions) { std::vector data(32768); double maxDecayT, maxDecayY; /* Out of range: peak cursor after last point */ EXPECT_TRUE(isnan(stfnum::maxRise(data, 0, data.size(), \ maxDecayT, maxDecayY, 1))); /* Out of range: peak cursor before first point EXPECT_TRUE(isnan(stfnum::maxRise(data, -1, data.size()-1, \ maxDecayT, maxDecayY, 1))); */ } //========================================================================= // test maximal slope of decay windowLength exceptions //========================================================================= TEST(measlib_test, maxdecay_windowLength_exceptions) { std::vector data(32768); double maxDecayT, maxDecayY; long mywindowLength; /* fixed time interval (in sampling points) */ /* Right peak cursor must be larger than windowLength mywindowLength = 10; long myRightPeakCursor = mywindowLength-1; EXPECT_TRUE(isnan(stfnum::maxDecay(data, 0, myRightPeakCursor, \ maxDecayT, maxDecayY, mywindowLength))); */ /* Left peak cursor must be smaller than data.size()-windowLength long myLeftPeakCursor = data.size()-mywindowLength; EXPECT_TRUE(isnan(stfnum::maxRise(data, myLeftPeakCursor, data.size()-1 , \ maxDecayT, maxDecayY, mywindowLength)));*/ /* Data size itself must be smaller than windowLength */ mywindowLength = data.size()+1; EXPECT_TRUE(isnan(stfnum::maxRise(data, 0, data.size()-1, \ maxDecayT, maxDecayY, mywindowLength))); } //========================================================================= // test maximal slope of decay with a sine wave //========================================================================= TEST(measlib_test, maxdecay_values){ /* a sine wave between 0 and 2*PI */ std::vector mywave = sinwave( long(2*PI/dt) ); double maxDecayT, maxDecayY; int windowLength = 1; /* compute max slope of decay between 0 and 3*PI/2 */ long endCursor = (3*PI/2)/dt ; stfnum::maxDecay(mywave, 1, endCursor, \ maxDecayT, maxDecayY, windowLength); /* Max slope of decay should be in PI and give value 0 */ EXPECT_NEAR(maxDecayY, 0 , 0.1); double maxDecayT_xpkted = PI/dt; EXPECT_NEAR(maxDecayT, maxDecayT_xpkted, fabs(maxDecayT_xpkted*tol)); } //========================================================================= // test baseline N_MAX random traces //========================================================================= TEST(measlib_validation, baseline) { double var; double tol = 0.1; /* for this case only, to account for the variance */ /* measurement results for base */ std::vector mybase(N_MAX); /* random values from a normal dist. */ std::vector myrand = norm(0, 1); /* we check the measurement N_MAX times */ for (int i=0; i mytrace = uniform(mean, N_MAX); /* calculate base between start and end */ mybase[i] = stfnum::base(stfnum::mean_sd, var, mytrace, 0, mytrace.size()-1); double mean_xpted = myrand[i]/2.0; /* 1/2*(a+b) */ EXPECT_NEAR(mybase[i], mean_xpted, fabs(mean_xpted*tol)); /* sanity check for variance */ double var_xpted = fabs(myrand[i]*myrand[i]/12.); /* 1/12*(a+b)^2 */ EXPECT_NEAR(var, var_xpted, var_xpted*tol ); } //save_txt("/tmp/base.val", mybase); } //========================================================================= // test peak N_MAX random traces //========================================================================= TEST(measlib_validation, peak) { double maxT; /* measurement results for peak */ std::vector mypeak(N_MAX); /* random values from a normal dist. */ std::vector myrand = norm(10, 1); /* we check the measurement N_MAX times */ for (int i=0; i mytrace = sinwave(peak, 9.5, long(9.5/dt)); /* calculate peak between start and end */ mypeak[i] = stfnum::peak(mytrace, 0.0, 0, mytrace.size()-1, 1, stfnum::up, maxT); EXPECT_NEAR(mypeak[i], myrand[i], fabs(myrand[i]*tol)); } save_txt("/tmp/peak_stf.val", mypeak); save_txt("/tmp/peak_real.val", myrand); } //========================================================================= // test risetime N_MAX random traces //========================================================================= TEST(measlib_validation, risetime) { std::size_t t20, t80; double t20Real; /* measurement results for risetime */ std::vector myrisetime(N_MAX); /* N_MAX random values from a normal dist. */ std::vector myrand = norm(20., 2.); /* we check the measurement N_MAX times */ for (int i=0; i mytrace = sinwave(1.0, lambda, long(lambda/dt)); /* calculate risetime between start and peak (lambda/4) */ myrisetime[i] = stfnum::risetime(mytrace, 0.0, 1.0, 1, long((lambda/4)/dt), 0.2, t20, t80, t20Real); double l = 2*PI/lambda; double risetime_xpted = (std::asin(.8)-std::asin(.2))/l; EXPECT_NEAR(myrisetime[i]*dt, risetime_xpted, fabs(risetime_xpted*tol)); myrisetime[i] *=dt; /* to save real values in a file */ } save_txt("/tmp/risetime.val", myrisetime); } //========================================================================= // test risetime 10-90 N_MAX random traces //========================================================================= TEST(measlib_validation, risetime1090) { std::size_t t10, t90; double t10Real; /* measurement results for risetime */ std::vector myrisetime(N_MAX); /* N_MAX random values from a normal dist. */ std::vector myrand = norm(20., 2.); /* we check the measurement N_MAX times */ for (int i=0; i mytrace = sinwave(1.0, lambda, long(lambda/dt)); /* calculate risetime between start and peak (lambda/4) */ myrisetime[i] = stfnum::risetime(mytrace, 0.0, 1.0, 1, long((lambda/4)/dt), 0.1, t10, t90, t10Real); double l = 2*PI/lambda; double risetime_xpted = (std::asin(.9)-std::asin(.1))/l; EXPECT_NEAR(myrisetime[i]*dt, risetime_xpted, fabs(risetime_xpted*tol)); //myrisetime[i] *=dt; /* to save real values in a file */ } //save_txt("/tmp/risetime.val", myrisetime); } //========================================================================= // test half_t N_MAX random traces //========================================================================= TEST(measlib_validation, half_duration) { std::size_t t50LeftId, t50RightId; double t50Real; /* measurement results for risetime */ std::vector myhalf_width(N_MAX); /* N_MAX random values from a normal dist. */ std::vector myrand = norm(20., 2.); /* we check the measurement N_MAX times */ for (int i=0; i mytrace = sinwave(1.0, lambda, long(lambda/dt)); /* calculate half width starting form start and entering peak (lambda/4) */ myhalf_width[i] = stfnum::t_half(mytrace, 0.0, 1.0, 1, long(lambda/dt)-2, long((lambda/4)/dt), t50LeftId, t50RightId, t50Real); double l = 2*PI/lambda; double half_width_xpted = 2*(std::asin(1.)-std::asin(.5))/l; EXPECT_NEAR(myhalf_width[i]*dt, half_width_xpted, fabs(half_width_xpted*tol)); myhalf_width[i] *=dt; /* to save real values in a file */ } save_txt("/tmp/half_width.val", myhalf_width); } //========================================================================= // test slope_rise N_MAX random traces //========================================================================= TEST(measlib_validation, maxrise) { double maxRiseT, maxRiseY; /* measurement results for maxrise */ std::vector mymaxrise(N_MAX); /* N_MAX random values from a normal dist. */ std::vector myrand = norm(10., 2.); /* we check measurements N_MAX times */ for (int i=0; i mytrace = sinwave(1.0, lambda, long(1.25*lambda/dt)); /* calculate maxrise in the second sine peak */ /* locate the first cursor later that 1st peak at ~(lambda/4) to avoid that this value becomes the max of the rise */ mymaxrise[i] = stfnum::maxRise(mytrace, long(0.75*lambda/dt)+1, mytrace.size()-1, maxRiseT, maxRiseY, 1); double maxRiseT_xpted = lambda; EXPECT_NEAR(maxRiseT*dt, maxRiseT_xpted, fabs(maxRiseT_xpted*tol)); mymaxrise[i] *=dt; /* to save real values in a file */ } save_txt("/tmp/max_rise.val", mymaxrise); } //========================================================================= // test slope_rise N_MAX random traces //========================================================================= TEST(measlib_validation, maxdecay) { double maxDecayT, maxDecayY; /* measurement results for maxrise */ std::vector mymaxdecay(N_MAX); /* N_MAX random values from a normal dist. */ std::vector myrand = norm(10., 2.); /* we check measurements N_MAX times */ for (int i=0; i mytrace = sinwave(1.0, lambda, long(lambda/dt)); mymaxdecay[i] = stfnum::maxDecay(mytrace, 1, long(0.75*lambda/dt), maxDecayT, maxDecayY, 1); double maxDecayT_xpted = lambda/2.0; EXPECT_NEAR(maxDecayT*dt, maxDecayT_xpted, fabs(maxDecayT_xpted*tol)); mymaxdecay[i] *=dt; /* to save real values in a file */ } save_txt("/tmp/max_decay.val", mymaxdecay); } //========================================================================= // test threshold N_MAX random traces //========================================================================= TEST(measlib_validation, threshold) { double thrT; /* measurements results for threshold */ std::vector mythreshold(N_MAX); /* N_MAX random values from a normal dist. */ std::vector myrand = norm(10., 2.); /* fix a slope and to look for it in different traces */ /* this could be any value between 1 and e (2.718281...) */ const double myslope = 2.0; /* we check measurements N_MAX times */ for (int i=0; i mytrace = expwave(tau, 5*long(tau/dt)); /* calculate thresholds */ mythreshold[i] = stfnum::threshold(mytrace, 1, mytrace.size()-1, myslope*dt, thrT, 1); /* Threshold is the slope value times tau */ double thr_xpted = myslope*tau; EXPECT_NEAR(mythreshold[i], thr_xpted, fabs(thr_xpted*tol)); /* sanity check */ /* The differential of the exponential function is e^(x/tau)/tau at x=thrT should give us the slope that we used as threshold */ double slope_xpted = std::exp(thrT*dt/tau)/tau; EXPECT_NEAR(myslope, slope_xpted, fabs(slope_xpted*tol)); } save_txt("/tmp/threshold.val", mythreshold); } stimfit-0.15.8/src/test/fit.cpp0000664000175000017500000007011113062445067013252 00000000000000#include "../stimfit/stf.h" #include "../libstfnum/fit.h" #include "../libstfnum/funclib.h" #include #include #include /* global variables to define our data */ const static int tmax = 100; /* length of data in ms */ const static float dt = 1/100.0; /* sampling interval of data in ms */ //const static double tol = 0.001; /* param-relative tolerance value */ const static float tol = dt; /* 1 sampling interval */ /* list of available fitting functions, see /src/stimfit/math/funclib.cpp */ const static std::vector< stfnum::storedFunc > funcLib = stfnum::GetFuncLib(); /* Fitting options for the LM algorithm, see /src/stimfit/math/fit.h */ const Vector_double opts = stfnum::LM_default_opts(); //========================================================================= // Simple monoexponential function // available for fitting to function 0, and 1 of Stimfit // param is an array of parameters, where // param[0] is the amplitude (peak-offset), // param[1] is the time constant, // param[2] is the end (offset) //========================================================================= Vector_double fexp_simple(const Vector_double ¶m){ Vector_double mydata (int (tmax/dt)); double amp = param[0]; double tau = param[1]; double end = param[2]; for (std::vector::size_type n=0; n != mydata.size() ; ++n){ mydata[n] = amp*exp(-(n*dt)/tau) + end; } return mydata; } //========================================================================= // Monoexponential function with delay, start fixed to baseline // available for fitting to function 2 of Stimfit // param is an array of parameters, where // param[0] is the baseline, // param[1] is the delay, // param[2] is the time constant, // param[3] is the amplitude //========================================================================= Vector_double fexpde(const Vector_double ¶m){ Vector_double mydata (int (tmax/dt)); for (std::vector::size_type n=0; n != mydata.size(); ++n){ mydata[n] = stfnum::fexpde(n*dt, param); } return mydata; } //========================================================================= // Monoexponential function with delay, start fixed to baseline // available for fitting to function 3, 4, 6, 7 and 8 of Stimfit // param is an array of parameters, where // event terms (e.g param[0]) are the amplitudes, // odd terms (e.g param[1]) are the time constants, // param[last] is the offset //========================================================================= Vector_double fexp(const Vector_double ¶m){ Vector_double mydata (int (tmax/dt)); for (std::vector::size_type n=0; n != mydata.size(); ++n){ mydata[n] = stfnum::fexp(n*dt, param); } return mydata; } //========================================================================= // Biexponential function with offset to baseline // corresponding to fitting function 5 of Stimfit // param is an array of parameters, where // param[0] is the baseline, // param[1] is the delay, // param[2] is the slow time constant (e.g tau_h, tau_2) // param[3] is the factor, // param[4] is the fast time constant (e.g tau_m, tau_1) //========================================================================= Vector_double fexpbde(const Vector_double ¶m){ Vector_double mydata (int(tmax/dt)); for (std::vector::size_type n=0; n != mydata.size(); ++n){ mydata[n] = stfnum::fexpbde(n*dt, param); } return mydata; } //========================================================================= // Alpha function with offset to baseline // corresponding to fitting function 9 of Stimfit // param is an array of parameters, where // param[0] is the amplitude, // param[1] is the rate, // param[2] is the offset //========================================================================= Vector_double falpha(const Vector_double ¶m){ Vector_double mydata (int(tmax/dt)); for (std::vector::size_type n=0; n != mydata.size(); ++n){ mydata[n] = stfnum::falpha(n*dt, param); } return mydata; } //========================================================================= // Hodkin-Huxley-like sodium conductance function of the form: // f(v;Na_bar, m, h, base) = Na_bar*m(v)^3*h(v) + base // corresponding to fitting function 10 of Stimfit // param is an array of parameters, where // param[0] is the peak sodium conductance // param[1] is the activation time constant (tau_m) // param[2] is the inactivation time constant (tau_h) // param[3] is the offset //========================================================================= Vector_double fHH(const Vector_double ¶m){ Vector_double mydata (int(tmax/dt)); for (std::vector::size_type n=0; n != mydata.size(); ++n){ mydata[n] = stfnum::fHH(n*dt, param); } return mydata; } //========================================================================= // Hodkin-Huxley-like sodium conductance function of the form: // f(v;Na_bar, m, h, base) = Na_bar*m(v)*h(v) + base // corresponding to fitting function 11 of Stimfit // param is an array of parameters, where // param[0] is the peak sodium conductance // param[1] is the activation time constant (tau_m) // param[2] is the inactivation time constant (tau_h) // param[3] is the offset //========================================================================= Vector_double fgnabiexp(const Vector_double ¶m){ Vector_double mydata (int(tmax/dt)); for (std::vector::size_type n=0; n != mydata.size(); ++n){ mydata[n] = stfnum::fgnabiexp(n*dt, param); } return mydata; } //========================================================================= // A gaussian function of the form // f(x, a, b, c) = a*exp((x-b)^2/2*c^2) // corresponding to the fitting function 12 of Stimfit // param in an array of parameters, where // param[0] is the heigth of the Gaussian function (a) // param[1] is the position of the peak (b) // param[2] is the width of the gaussian (c) //========================================================================= Vector_double fgauss(const Vector_double ¶m){ Vector_double mydata (int(tmax/dt)); for (std::vector::size_type n=0; n != mydata.size(); ++n){ mydata[n] = stfnum::fgauss(n*dt, param); } return mydata; } #if 0 void savetxt(const char *fname, Vector_double &mydata){ std::ofstream output_file; output_file.open(fname); Vector_double::iterator it; for (it = mydata.begin(); it != mydata.end(); ++it){ output_file << *it << std::endl; } output_file.close(); } void debug_stdout(double chisqr, const std::string& info, int warning, const Vector_double &pars){ int fd = open("debug.log", O_WRONLY|O_CREAT|O_TRUNC, 0660); assert(fd >= 0); int ret = dup2(fd, 1); assert(ret >= 0); std::cout << "chisqr = " << chisqr << std::endl; std::cout << "info = " << info << std::endl; std::cout << "warning = " << warning << std::endl; for (std::vector::size_type n = 0; n != pars.size(); ++n) { std::cout << "Pars[" << n << "] = " << pars[n] << std::endl; } close(fd); } #endif void par_test(double value, double expected, double tolerance) { EXPECT_NEAR(value, expected, fabs(expected*tolerance) ); } // Tests fiting to a monoexponential function TEST(fitlib_test, monoexponential) { double tau = 3000.0; Vector_double data(32768); for (int n = 0; n < data.size(); ++n) { data[n] = 1.0-exp(-n/tau); } // Respectively the scale factor for initial \mu, // stopping thresholds for ||J^T e||_inf, ||Dp||_2 and ||e||_2, // maxIter, maxPass Vector_double opts = stfnum::LM_default_opts(); /* Initial parameter guesses */ Vector_double pars(3); pars[0] = -0.1; pars[1] = 3050.0; pars[2] = 1.1; std::string info; int warning; double chisqr = stfnum::lmFit(data, 1.0, funcLib[0], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], -1.0, tol); /* Amplitude */ par_test(pars[1], tau, tol); /* Time constant */ par_test(pars[2], 1.0, tol); /* Baseline */ #if 0 int fd = open("debug.log", O_WRONLY|O_CREAT|O_TRUNC, 0660); assert(fd >= 0); int ret = dup2(fd, 1); assert(ret >= 0); std::cout << "chisqr = " << chisqr << std::endl; std::cout << "info = " << info << std::endl; std::cout << "warning = " << warning << std::endl; for (int n = 0; n < pars.size(); ++n) { std::cout << "Pars[" << n << "] = " << pars[n] << std::endl; } close(fd); #endif } //========================================================================= // Tests fitting to a monoexponential function // Stimfit function with ID = 0 //========================================================================= TEST(fitlib_test, id_00_monoexponential){ /* choose function parameters */ Vector_double mypars(3); mypars[0] = 50.0; /* amplitude */ mypars[1] = 17.0; /* time constant */ mypars[2] = -20.0; /* end */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexp_simple(mypars); /* Initial parameters guesses */ Vector_double pars(3); pars[0] = 0.0; /* Offset */ pars[1] = 5.0; /* Tau_0 */ pars[2] = -35.0; /* Amp_0 */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[0], opts, true, /* use_scaling */ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* Amp_0 */ par_test(pars[1], mypars[1], tol); /* Tau_0 */ par_test(pars[2], mypars[2], tol); /* Offset */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a monoexponential function, offset fixed to baseline // Stimfit function with ID = 1 //========================================================================= TEST(fitlib_test, id_01_monoexponential_offsetfixed){ /* choose function parameters */ Vector_double mypars(3); mypars[0] = 80.0; /* amplitude */ mypars[1] = 34.0; /* time constant */ mypars[2] = -5.52; /* offset */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexp_simple(mypars); #if 0 savetxt("/tmp/monoexp1.out", data); #endif /* Initial parameters guesses */ Vector_double pars(3); pars[0] = 35.5232; /* Amp_0 */ pars[1] = 14.6059; /* Tau_0 */ pars[2] = mypars[2]; /* Offset fixed to baseline */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[1], opts, true, /* use_scaling */ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* Amp_0 */ par_test(pars[1], mypars[1], tol); /* Tau_0 */ EXPECT_EQ(pars[2], mypars[2]); /* Offset to baseline */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a monoexponential function with delay, start to base // Stimfit function with ID = 2 //========================================================================= TEST(fitlib_test, id_02_monoexponential_with_delay){ /* choose function parameters */ Vector_double mypars(4); mypars[0] = 10.0; /* baseline */ mypars[1] = 15.0; /* delay */ mypars[2] = 17.0; /* time constant */ mypars[3] = 90.0; /* amplitude */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexpde(mypars); #if 0 savetxt(data); #endif /* Initial parameter guesses */ Vector_double pars(4); pars[0] = mypars[0]; pars[1] = 5.0; pars[2] = 50.0; pars[3] = 21.0; std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[2], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* baseline */ par_test(pars[1], mypars[1], tol); /* delay */ par_test(pars[2], mypars[2], tol); /* time constant */ par_test(pars[3], mypars[3], tol); /* amplitude */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a biexponential // Stimfit function with ID = 3 //========================================================================= TEST(fitlib_test, id_03_biexponential){ /* choose function parameters */ Vector_double mypars(5); mypars[0] = 9.0; /* first amplitude */ mypars[1] = 2.0; /* first time constant */ mypars[2] = 1.0; /* second amplitude */ mypars[3] = 15.0; /* second time constant */ mypars[4] = 4.0; /* baseline */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexp(mypars); #if 0 savetxt("/tmp/mybiexp3.out", data); #endif /* Initial parameter guesses */ Vector_double pars(5); pars[0] = 4.86764; /* Amp_0 */ pars[1] = 2.44482; /* Tau_0 */ pars[2] = 4.86764; /* Amp_1 */ pars[3] = 19.5586; /* Tau_1 */ pars[4] = 4.26472; /* Offset */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[3], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* Amp_0 */ par_test(pars[1], mypars[1], tol); /* Tau_0 */ par_test(pars[2], mypars[2], tol); /* Amp_1 */ par_test(pars[3], mypars[3], tol); /* Tau_1 */ par_test(pars[4], mypars[4], tol); /* Offset */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a biexponential offset fixed to baseline // Stimfit function with ID = 4 //========================================================================= TEST(fitlib_test, id_04_biexponential_offsetfixed){ /* choose function parameters */ Vector_double mypars(5); mypars[0] = 16.0; /* first amplitude */ mypars[1] = 2.6; /* first time constant */ mypars[2] = 12.0; /* second amplitude */ mypars[3] = 15.0; /* second time constant */ mypars[4] = 4.0; /* baseline */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexp(mypars); #if 0 savetxt("/tmp/mybiexp3.out", data); #endif /* Initial parameter guesses */ Vector_double pars(5); pars[0] = 4.86764; /* Amp_0 */ pars[1] = 2.44482; /* Tau_0 */ pars[2] = 4.86764; /* Amp_1 */ pars[3] = 19.5586; /* Tau_1 */ pars[4] = 4.0; /* Offset */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[4], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* Amp_0 */ par_test(pars[1], mypars[1], tol); /* Tau_0 */ par_test(pars[2], mypars[2], tol); /* Amp_1 */ par_test(pars[3], mypars[3], tol); /* Tau_1 */ EXPECT_EQ(pars[4], mypars[4]); /* Offset */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a biexponential with delay, offset fixed to baseline // Stimfit function with ID = 5 //========================================================================= TEST(fitlib_test, id_05_biexponential_with_delay_offsetfixed){ /* choose function parameters */ Vector_double mypars(5); mypars[0] = 0.0; /* baseline */ mypars[1] = 25.0; /* Delay */ mypars[2] = 10.0; /* fast time constant */ mypars[3] = 25.0; /* Factor */ mypars[4] = 50.0; /* slow time constant */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexpbde(mypars); /* Initial parameter guesses */ Vector_double pars(5); pars[0] = mypars[0]; /* offset fixed to baseline! */ pars[1] = 0.1; /* Delay */ pars[2] = 19.925; /* tau1 */ pars[3] = 20.0; /* Factor */ pars[4] = 24.9875; /* tau2 */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[5], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); EXPECT_EQ(pars[0], mypars[0]); /* Offset fixed to baseline */ par_test(pars[1], mypars[1], tol); /* delay */ par_test(pars[2], mypars[2], tol); /* short time constant */ par_test(pars[3], mypars[3], tol); /* Factor != amplitude */ par_test(pars[4], mypars[4], tol); /* long time constant */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a triexponential // Stimfit function with ID = 6 //========================================================================= TEST(fitlib_test, id_06_triexponential){ /* choose function parameters */ Vector_double mypars(7); mypars[0] = 5.76; /* first amplitude */ mypars[1] = 3.37; /* first time constant */ mypars[2] = 5.76; /* second amplitude */ mypars[3] = 26.9; /* second time constant */ mypars[4] = 5.76; /* third amplitude */ mypars[5] = 91.0; /* third time constant */ mypars[6] = 5.07; /* baseline */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexp(mypars); #if 0 savetxt("/tmp/mytriexp6.out", data); #endif /* Initial parameter guesses */ Vector_double pars(7); pars[0] = 4.86764; /* Amp_0 */ pars[1] = 6.44482; /* Tau_0 */ pars[2] = 4.86764; /* Amp_1 */ pars[3] = 49.5586; /* Tau_1 */ pars[4] = 4.86764; /* Amp_2 */ pars[5] = 165.5586; /* Tau_2 */ pars[6] = 6.55319; /* Offset */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[6], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* Amp_0 */ par_test(pars[1], mypars[1], tol); /* Tau_0 */ par_test(pars[2], mypars[2], tol); /* Amp_1 */ par_test(pars[3], mypars[3], tol); /* Tau_1 */ par_test(pars[4], mypars[4], tol); /* Amp_2 */ par_test(pars[5], mypars[5], tol); /* Tau_2 */ par_test(pars[6], mypars[6], tol); /* Offset */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a triexponential free // Stimfit function with ID = 7 //========================================================================= TEST(fitlib_test, id_07_triexponential_free){ /* choose function parameters */ Vector_double mypars(7); mypars[0] = 15.76; /* first amplitude */ mypars[1] = 3.7; /* first time constant */ mypars[2] = 19.76; /* second amplitude */ mypars[3] = 21.9; /* second time constant */ mypars[4] = 2.76; /* third amplitude */ mypars[5] = 42.2; /* third time constant */ mypars[6] = -45.22; /* baseline */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexp(mypars); #if 0 savetxt("/tmp/mytriexp7.out", data); #endif /* Initial parameter guesses */ Vector_double pars(7); pars[0] = 4.86764; /* Amp_0 */ pars[1] = 6.44482; /* Tau_0 */ pars[2] = 4.86764; /* Amp_1 */ pars[3] = 49.5586; /* Tau_1 */ pars[4] = 4.86764; /* Amp_2 */ pars[5] = 65.5586; /* Tau_2 */ pars[6] = -34.242; /* Offset fixed to baseline */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[7], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* Amp_0 */ par_test(pars[1], mypars[1], tol); /* Tau_0 */ par_test(pars[2], mypars[2], tol); /* Amp_1 */ par_test(pars[3], mypars[3], tol); /* Tau_1 */ par_test(pars[4], mypars[4], tol); /* Amp_2 */ par_test(pars[5], mypars[5], tol); /* Tau_2 */ par_test(pars[6], mypars[6], tol); /* Offset */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a triexponential with offset fixed to baseline // Stimfit function with ID = 8 //========================================================================= TEST(fitlib_test, id_08_triexponential_offsetfixed){ /* choose function parameters */ Vector_double mypars(7); mypars[0] = 5.76; /* first amplitude */ mypars[1] = 3.37; /* first time constant */ mypars[2] = 9.76; /* second amplitude */ mypars[3] = 21.9; /* second time constant */ mypars[4] = 5.76; /* third amplitude */ mypars[5] = 41.0; /* third time constant */ mypars[6] = -5.12; /* baseline */ /* create a 100 ms trace with mypars */ Vector_double data; data = fexp(mypars); #if 0 savetxt("/tmp/mytriexp8.out", data); #endif /* Initial parameter guesses */ Vector_double pars(7); pars[0] = 4.86764; /* Amp_0 */ pars[1] = 6.44482; /* Tau_0 */ pars[2] = 4.86764; /* Amp_1 */ pars[3] = 49.5586; /* Tau_1 */ pars[4] = 4.86764; /* Amp_2 */ pars[5] = 165.5586; /* Tau_2 */ pars[6] = mypars[6]; /* Offset fixed to baseline */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[8], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* Amp_0 */ par_test(pars[1], mypars[1], tol); /* Tau_0 */ par_test(pars[2], mypars[2], tol); /* Amp_1 */ par_test(pars[3], mypars[3], tol); /* Tau_1 */ par_test(pars[4], mypars[4], tol); /* Amp_2 */ par_test(pars[5], mypars[5], tol); /* Tau_2 */ EXPECT_EQ(pars[6], mypars[6]); /* Offset */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to an alpha function, // Stimfit function with ID = 9 //========================================================================= TEST(fitlib_test, id_09_alpha){ /* choose function parameters */ Vector_double mypars(3); mypars[0] = 300.0; /* amplitude */ mypars[1] = 5.7; /* rate */ mypars[2] = 50.0; /* offset */ /* create a 100 ms trace with mypars */ Vector_double data; data = falpha(mypars); #if 0 savetxt(data); #endif /* Initial parameter guesses */ Vector_double pars(3); pars[0] = 350.0; /* amplitude */ pars[1] = 3.7; /* rate */ pars[2] = 0.0; /* Offset */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[9], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* amplitude */ par_test(pars[1], mypars[1], tol); /* rate */ par_test(pars[2], mypars[2], tol); /* offset */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a HH-type sodium conductance, offset fixed to baseline // Stimfit function with ID =10 //========================================================================= TEST(fitlib_test, id_10_HH_gNa_offsetfixed){ /* choose function parameters */ Vector_double mypars(4); mypars[0] = 120.0; /* maximal sodium conductance */ mypars[1] = 130e-3; /* activation time constat (tau_m_) in us */ mypars[2] = 728e-3; /* inactivation time constant in us */ mypars[3] = 0.0; /* offset */ /* create a 100 ms trace with mypars */ /* here the x-units and x-axis values are not relevant */ Vector_double data; data = fHH(mypars); #if 0 savetxt("/tmp/gnabar.out", data); #endif /* Initial parameter guesses */ Vector_double pars(4); pars[0] = 1000.72; /* gprime_na */ pars[1] = 0.2001; /* tau_m */ pars[2] = 8.0; /* tau_h */ pars[3] = mypars[3]; /* offset fixed to baseline */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[10], opts, true, /* use_scaling */ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* gprime_na */ par_test(pars[1], mypars[1], tol); /* tau_m */ par_test(pars[2], mypars[2], tol); /* tau_h */ EXPECT_EQ(pars[3], mypars[3]); /* offset fixed to baseline */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a HH-type SINGLE sodium conductance, offset fixed to // baseline, Stimfit function with ID =11 //========================================================================= TEST(fitlib_test, id_11_HH_gNa_biexpoffsetfixed){ /* choose function parameters */ Vector_double mypars(4); mypars[0] = 120.0; /* maximal sodium conductance */ mypars[1] = 1.3; /* activation time constat (tau_m_) in us */ mypars[2] = 5.2; /* inactivation time constant in us */ mypars[3] = 10.0; /* offset */ /* create a 100 ms trace with mypars */ Vector_double data; data = fgnabiexp(mypars); #if 0 savetxt("/tmp/gnabar_single.out", data); #endif /* Initial parameter guesses */ Vector_double pars(4); pars[0] = 123.284; /* gprime_na */ pars[1] = 2.625; /* tau_m */ pars[2] = 15.75; /* tau_h */ pars[3] = mypars[3]; /* offset fixed to baseline */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[11], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* gprime_na */ par_test(pars[1], mypars[1], tol); /* tau_m */ par_test(pars[2], mypars[2], tol); /* tau_h */ EXPECT_EQ(pars[3], mypars[3]); /* offset fixed to baseline */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif data.clear(); } //========================================================================= // Tests fitting to a gaussian distribution // Stimfit function with ID =12 //========================================================================= TEST(fitlib_test, id_12_fgaussian){ /* choose function parameters */ Vector_double mypars(3); mypars[0] = 1.5; /* height */ mypars[1] = 5.0; /* peak */ mypars[2] = 4.5; /* width */ /* create a trace with mypars */ Vector_double data; data = fgauss(mypars); #if 0 savetxt("/tmp/mygaussian.out", data); #endif /* Initial parameter guesses */ Vector_double pars(3); pars[0] = 1.72; /* amplitude */ pars[1] = 5.5; /* mean */ pars[2] = 2.0; /* width */ std::string info; int warning; double chisqr = stfnum::lmFit(data, dt, funcLib[12], opts, true, /*use_scaling*/ pars, info, warning ); EXPECT_EQ(warning, 0); par_test(pars[0], mypars[0], tol); /* amplitude */ par_test(pars[1], mypars[1], tol); /* peak */ par_test(pars[2], mypars[2], tol); /* witdth */ #if 0 debug_stdout(chisqr, info, warning, pars); #endif //data.clear(); } stimfit-0.15.8/src/test/gtest/0000775000175000017500000000000013315356572013175 500000000000000stimfit-0.15.8/src/test/gtest/src/0000775000175000017500000000000013315356572013764 500000000000000stimfit-0.15.8/src/test/gtest/src/gtest-all.cc0000664000175000017500000000416113062445067016106 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // // Google C++ Testing Framework (Google Test) // // Sometimes it's desirable to build Google Test by compiling a single file. // This file serves this purpose. // This line ensures that gtest.h can be compiled on its own, even // when it's fused. #include "gtest/gtest.h" // The following lines pull in the real gtest *.cc files. #include "src/gtest.cc" #include "src/gtest-death-test.cc" #include "src/gtest-filepath.cc" #include "src/gtest-port.cc" #include "src/gtest-printers.cc" #include "src/gtest-test-part.cc" #include "src/gtest-typed-test.cc" stimfit-0.15.8/src/test/gtest/src/gtest-internal-inl.h0000664000175000017500000013260113062445067017575 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Utility functions and classes used by the Google C++ testing framework. // // Author: wan@google.com (Zhanyong Wan) // // This file contains purely Google Test's internal implementation. Please // DO NOT #INCLUDE IT IN A USER PROGRAM. #ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ #define GTEST_SRC_GTEST_INTERNAL_INL_H_ // GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is // part of Google Test's implementation; otherwise it's undefined. #if !GTEST_IMPLEMENTATION_ // A user is trying to include this from his code - just say no. # error "gtest-internal-inl.h is part of Google Test's internal implementation." # error "It must not be included except by Google Test itself." #endif // GTEST_IMPLEMENTATION_ #ifndef _WIN32_WCE # include #endif // !_WIN32_WCE #include #include // For strtoll/_strtoul64/malloc/free. #include // For memmove. #include #include #include #include "gtest/internal/gtest-port.h" #if GTEST_CAN_STREAM_RESULTS_ # include // NOLINT # include // NOLINT #endif #if GTEST_OS_WINDOWS # include // NOLINT #endif // GTEST_OS_WINDOWS #include "gtest/gtest.h" // NOLINT #include "gtest/gtest-spi.h" namespace testing { // Declares the flags. // // We don't want the users to modify this flag in the code, but want // Google Test's own unit tests to be able to access it. Therefore we // declare it here as opposed to in gtest.h. GTEST_DECLARE_bool_(death_test_use_fork); namespace internal { // The value of GetTestTypeId() as seen from within the Google Test // library. This is solely for testing GetTestTypeId(). GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; // Names of the flags (needed for parsing Google Test flags). const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; const char kBreakOnFailureFlag[] = "break_on_failure"; const char kCatchExceptionsFlag[] = "catch_exceptions"; const char kColorFlag[] = "color"; const char kFilterFlag[] = "filter"; const char kListTestsFlag[] = "list_tests"; const char kOutputFlag[] = "output"; const char kPrintTimeFlag[] = "print_time"; const char kRandomSeedFlag[] = "random_seed"; const char kRepeatFlag[] = "repeat"; const char kShuffleFlag[] = "shuffle"; const char kStackTraceDepthFlag[] = "stack_trace_depth"; const char kStreamResultToFlag[] = "stream_result_to"; const char kThrowOnFailureFlag[] = "throw_on_failure"; // A valid random seed must be in [1, kMaxRandomSeed]. const int kMaxRandomSeed = 99999; // g_help_flag is true iff the --help flag or an equivalent form is // specified on the command line. GTEST_API_ extern bool g_help_flag; // Returns the current time in milliseconds. GTEST_API_ TimeInMillis GetTimeInMillis(); // Returns true iff Google Test should use colors in the output. GTEST_API_ bool ShouldUseColor(bool stdout_is_tty); // Formats the given time in milliseconds as seconds. GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); // Converts the given time in milliseconds to a date string in the ISO 8601 // format, without the timezone information. N.B.: due to the use the // non-reentrant localtime() function, this function is not thread safe. Do // not use it in any code that can be called from multiple threads. GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms); // Parses a string for an Int32 flag, in the form of "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. GTEST_API_ bool ParseInt32Flag( const char* str, const char* flag, Int32* value); // Returns a random seed in range [1, kMaxRandomSeed] based on the // given --gtest_random_seed flag value. inline int GetRandomSeedFromFlag(Int32 random_seed_flag) { const unsigned int raw_seed = (random_seed_flag == 0) ? static_cast(GetTimeInMillis()) : static_cast(random_seed_flag); // Normalizes the actual seed to range [1, kMaxRandomSeed] such that // it's easy to type. const int normalized_seed = static_cast((raw_seed - 1U) % static_cast(kMaxRandomSeed)) + 1; return normalized_seed; } // Returns the first valid random seed after 'seed'. The behavior is // undefined if 'seed' is invalid. The seed after kMaxRandomSeed is // considered to be 1. inline int GetNextRandomSeed(int seed) { GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) << "Invalid random seed " << seed << " - must be in [1, " << kMaxRandomSeed << "]."; const int next_seed = seed + 1; return (next_seed > kMaxRandomSeed) ? 1 : next_seed; } // This class saves the values of all Google Test flags in its c'tor, and // restores them in its d'tor. class GTestFlagSaver { public: // The c'tor. GTestFlagSaver() { also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); break_on_failure_ = GTEST_FLAG(break_on_failure); catch_exceptions_ = GTEST_FLAG(catch_exceptions); color_ = GTEST_FLAG(color); death_test_style_ = GTEST_FLAG(death_test_style); death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); filter_ = GTEST_FLAG(filter); internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); list_tests_ = GTEST_FLAG(list_tests); output_ = GTEST_FLAG(output); print_time_ = GTEST_FLAG(print_time); random_seed_ = GTEST_FLAG(random_seed); repeat_ = GTEST_FLAG(repeat); shuffle_ = GTEST_FLAG(shuffle); stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); stream_result_to_ = GTEST_FLAG(stream_result_to); throw_on_failure_ = GTEST_FLAG(throw_on_failure); } // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. ~GTestFlagSaver() { GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; GTEST_FLAG(break_on_failure) = break_on_failure_; GTEST_FLAG(catch_exceptions) = catch_exceptions_; GTEST_FLAG(color) = color_; GTEST_FLAG(death_test_style) = death_test_style_; GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; GTEST_FLAG(filter) = filter_; GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; GTEST_FLAG(list_tests) = list_tests_; GTEST_FLAG(output) = output_; GTEST_FLAG(print_time) = print_time_; GTEST_FLAG(random_seed) = random_seed_; GTEST_FLAG(repeat) = repeat_; GTEST_FLAG(shuffle) = shuffle_; GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; GTEST_FLAG(stream_result_to) = stream_result_to_; GTEST_FLAG(throw_on_failure) = throw_on_failure_; } private: // Fields for saving the original values of flags. bool also_run_disabled_tests_; bool break_on_failure_; bool catch_exceptions_; std::string color_; std::string death_test_style_; bool death_test_use_fork_; std::string filter_; std::string internal_run_death_test_; bool list_tests_; std::string output_; bool print_time_; internal::Int32 random_seed_; internal::Int32 repeat_; bool shuffle_; internal::Int32 stack_trace_depth_; std::string stream_result_to_; bool throw_on_failure_; } GTEST_ATTRIBUTE_UNUSED_; // Converts a Unicode code point to a narrow string in UTF-8 encoding. // code_point parameter is of type UInt32 because wchar_t may not be // wide enough to contain a code point. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted // to "(Invalid Unicode 0xXXXXXXXX)". GTEST_API_ std::string CodePointToUtf8(UInt32 code_point); // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: // UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) // UTF-32 if sizeof(wchar_t) == 4 (on Linux) // Parameter str points to a null-terminated wide string. // Parameter num_chars may additionally limit the number // of wchar_t characters processed. -1 is used when the entire string // should be processed. // If the string contains code points that are not valid Unicode code points // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding // and contains invalid UTF-16 surrogate pairs, values in those pairs // will be encoded as individual Unicode characters from Basic Normal Plane. GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars); // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file // if the variable is present. If a file already exists at this location, this // function will write over it. If the variable is present, but the file cannot // be created, prints an error and exits. void WriteToShardStatusFileIfNeeded(); // Checks whether sharding is enabled by examining the relevant // environment variable values. If the variables are present, // but inconsistent (e.g., shard_index >= total_shards), prints // an error and exits. If in_subprocess_for_death_test, sharding is // disabled because it must only be applied to the original test // process. Otherwise, we could filter out death tests we intended to execute. GTEST_API_ bool ShouldShard(const char* total_shards_str, const char* shard_index_str, bool in_subprocess_for_death_test); // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error and // and aborts. GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); // Given the total number of shards, the shard index, and the test id, // returns true iff the test should be run on this shard. The test id is // some arbitrary but unique non-negative integer assigned to each test // method. Assumes that 0 <= shard_index < total_shards. GTEST_API_ bool ShouldRunTestOnShard( int total_shards, int shard_index, int test_id); // STL container utilities. // Returns the number of elements in the given container that satisfy // the given predicate. template inline int CountIf(const Container& c, Predicate predicate) { // Implemented as an explicit loop since std::count_if() in libCstd on // Solaris has a non-standard signature. int count = 0; for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) { if (predicate(*it)) ++count; } return count; } // Applies a function/functor to each element in the container. template void ForEach(const Container& c, Functor functor) { std::for_each(c.begin(), c.end(), functor); } // Returns the i-th element of the vector, or default_value if i is not // in range [0, v.size()). template inline E GetElementOr(const std::vector& v, int i, E default_value) { return (i < 0 || i >= static_cast(v.size())) ? default_value : v[i]; } // Performs an in-place shuffle of a range of the vector's elements. // 'begin' and 'end' are element indices as an STL-style range; // i.e. [begin, end) are shuffled, where 'end' == size() means to // shuffle to the end of the vector. template void ShuffleRange(internal::Random* random, int begin, int end, std::vector* v) { const int size = static_cast(v->size()); GTEST_CHECK_(0 <= begin && begin <= size) << "Invalid shuffle range start " << begin << ": must be in range [0, " << size << "]."; GTEST_CHECK_(begin <= end && end <= size) << "Invalid shuffle range finish " << end << ": must be in range [" << begin << ", " << size << "]."; // Fisher-Yates shuffle, from // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle for (int range_width = end - begin; range_width >= 2; range_width--) { const int last_in_range = begin + range_width - 1; const int selected = begin + random->Generate(range_width); std::swap((*v)[selected], (*v)[last_in_range]); } } // Performs an in-place shuffle of the vector's elements. template inline void Shuffle(internal::Random* random, std::vector* v) { ShuffleRange(random, 0, static_cast(v->size()), v); } // A function for deleting an object. Handy for being used as a // functor. template static void Delete(T* x) { delete x; } // A predicate that checks the key of a TestProperty against a known key. // // TestPropertyKeyIs is copyable. class TestPropertyKeyIs { public: // Constructor. // // TestPropertyKeyIs has NO default constructor. explicit TestPropertyKeyIs(const std::string& key) : key_(key) {} // Returns true iff the test name of test property matches on key_. bool operator()(const TestProperty& test_property) const { return test_property.key() == key_; } private: std::string key_; }; // Class UnitTestOptions. // // This class contains functions for processing options the user // specifies when running the tests. It has only static members. // // In most cases, the user can specify an option using either an // environment variable or a command line flag. E.g. you can set the // test filter using either GTEST_FILTER or --gtest_filter. If both // the variable and the flag are present, the latter overrides the // former. class GTEST_API_ UnitTestOptions { public: // Functions for processing the gtest_output flag. // Returns the output format, or "" for normal printed output. static std::string GetOutputFormat(); // Returns the absolute path of the requested output file, or the // default (test_detail.xml in the original working directory) if // none was explicitly specified. static std::string GetAbsolutePathToOutputFile(); // Functions for processing the gtest_filter flag. // Returns true iff the wildcard pattern matches the string. The // first ':' or '\0' character in pattern marks the end of it. // // This recursive algorithm isn't very efficient, but is clear and // works well enough for matching test names, which are short. static bool PatternMatchesString(const char *pattern, const char *str); // Returns true iff the user-specified filter matches the test case // name and the test name. static bool FilterMatchesTest(const std::string &test_case_name, const std::string &test_name); #if GTEST_OS_WINDOWS // Function for supporting the gtest_catch_exception flag. // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. // This function is useful as an __except condition. static int GTestShouldProcessSEH(DWORD exception_code); #endif // GTEST_OS_WINDOWS // Returns true if "name" matches the ':' separated list of glob-style // filters in "filter". static bool MatchesFilter(const std::string& name, const char* filter); }; // Returns the current application's name, removing directory path if that // is present. Used by UnitTestOptions::GetOutputFile. GTEST_API_ FilePath GetCurrentExecutableName(); // The role interface for getting the OS stack trace as a string. class OsStackTraceGetterInterface { public: OsStackTraceGetterInterface() {} virtual ~OsStackTraceGetterInterface() {} // Returns the current OS stack trace as an std::string. Parameters: // // max_depth - the maximum number of stack frames to be included // in the trace. // skip_count - the number of top frames to be skipped; doesn't count // against max_depth. virtual string CurrentStackTrace(int max_depth, int skip_count) = 0; // UponLeavingGTest() should be called immediately before Google Test calls // user code. It saves some information about the current stack that // CurrentStackTrace() will use to find and hide Google Test stack frames. virtual void UponLeavingGTest() = 0; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); }; // A working implementation of the OsStackTraceGetterInterface interface. class OsStackTraceGetter : public OsStackTraceGetterInterface { public: OsStackTraceGetter() : caller_frame_(NULL) {} virtual string CurrentStackTrace(int max_depth, int skip_count) GTEST_LOCK_EXCLUDED_(mutex_); virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_); // This string is inserted in place of stack frames that are part of // Google Test's implementation. static const char* const kElidedFramesMarker; private: Mutex mutex_; // protects all internal state // We save the stack frame below the frame that calls user code. // We do this because the address of the frame immediately below // the user code changes between the call to UponLeavingGTest() // and any calls to CurrentStackTrace() from within the user code. void* caller_frame_; GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); }; // Information about a Google Test trace point. struct TraceInfo { const char* file; int line; std::string message; }; // This is the default global test part result reporter used in UnitTestImpl. // This class should only be used by UnitTestImpl. class DefaultGlobalTestPartResultReporter : public TestPartResultReporterInterface { public: explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); // Implements the TestPartResultReporterInterface. Reports the test part // result in the current test. virtual void ReportTestPartResult(const TestPartResult& result); private: UnitTestImpl* const unit_test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); }; // This is the default per thread test part result reporter used in // UnitTestImpl. This class should only be used by UnitTestImpl. class DefaultPerThreadTestPartResultReporter : public TestPartResultReporterInterface { public: explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); // Implements the TestPartResultReporterInterface. The implementation just // delegates to the current global test part result reporter of *unit_test_. virtual void ReportTestPartResult(const TestPartResult& result); private: UnitTestImpl* const unit_test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); }; // The private implementation of the UnitTest class. We don't protect // the methods under a mutex, as this class is not accessible by a // user and the UnitTest class that delegates work to this class does // proper locking. class GTEST_API_ UnitTestImpl { public: explicit UnitTestImpl(UnitTest* parent); virtual ~UnitTestImpl(); // There are two different ways to register your own TestPartResultReporter. // You can register your own repoter to listen either only for test results // from the current thread or for results from all threads. // By default, each per-thread test result repoter just passes a new // TestPartResult to the global test result reporter, which registers the // test part result for the currently running test. // Returns the global test part result reporter. TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); // Sets the global test part result reporter. void SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter); // Returns the test part result reporter for the current thread. TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); // Sets the test part result reporter for the current thread. void SetTestPartResultReporterForCurrentThread( TestPartResultReporterInterface* reporter); // Gets the number of successful test cases. int successful_test_case_count() const; // Gets the number of failed test cases. int failed_test_case_count() const; // Gets the number of all test cases. int total_test_case_count() const; // Gets the number of all test cases that contain at least one test // that should run. int test_case_to_run_count() const; // Gets the number of successful tests. int successful_test_count() const; // Gets the number of failed tests. int failed_test_count() const; // Gets the number of disabled tests that will be reported in the XML report. int reportable_disabled_test_count() const; // Gets the number of disabled tests. int disabled_test_count() const; // Gets the number of tests to be printed in the XML report. int reportable_test_count() const; // Gets the number of all tests. int total_test_count() const; // Gets the number of tests that should run. int test_to_run_count() const; // Gets the time of the test program start, in ms from the start of the // UNIX epoch. TimeInMillis start_timestamp() const { return start_timestamp_; } // Gets the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns true iff the unit test passed (i.e. all test cases passed). bool Passed() const { return !Failed(); } // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool Failed() const { return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed(); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* GetTestCase(int i) const { const int index = GetElementOr(test_case_indices_, i, -1); return index < 0 ? NULL : test_cases_[i]; } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* GetMutableTestCase(int i) { const int index = GetElementOr(test_case_indices_, i, -1); return index < 0 ? NULL : test_cases_[index]; } // Provides access to the event listener list. TestEventListeners* listeners() { return &listeners_; } // Returns the TestResult for the test that's currently running, or // the TestResult for the ad hoc test if no test is running. TestResult* current_test_result(); // Returns the TestResult for the ad hoc test. const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } // Sets the OS stack trace getter. // // Does nothing if the input and the current OS stack trace getter // are the same; otherwise, deletes the old getter and makes the // input the current getter. void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); // Returns the current OS stack trace getter if it is not NULL; // otherwise, creates an OsStackTraceGetter, makes it the current // getter, and returns it. OsStackTraceGetterInterface* os_stack_trace_getter(); // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // CurrentOsStackTraceExceptTop(1), Foo() will be included in the // trace but Bar() and CurrentOsStackTraceExceptTop() won't. std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_; // Finds and returns a TestCase with the given name. If one doesn't // exist, creates one and returns it. // // Arguments: // // test_case_name: name of the test case // type_param: the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase* GetTestCase(const char* test_case_name, const char* type_param, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc); // Adds a TestInfo to the unit test. // // Arguments: // // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // test_info: the TestInfo object void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc, TestInfo* test_info) { // In order to support thread-safe death tests, we need to // remember the original working directory when the test program // was first invoked. We cannot do this in RUN_ALL_TESTS(), as // the user may have changed the current directory before calling // RUN_ALL_TESTS(). Therefore we capture the current directory in // AddTestInfo(), which is called to register a TEST or TEST_F // before main() is reached. if (original_working_dir_.IsEmpty()) { original_working_dir_.Set(FilePath::GetCurrentDir()); GTEST_CHECK_(!original_working_dir_.IsEmpty()) << "Failed to get the current working directory."; } GetTestCase(test_info->test_case_name(), test_info->type_param(), set_up_tc, tear_down_tc)->AddTestInfo(test_info); } #if GTEST_HAS_PARAM_TEST // Returns ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. internal::ParameterizedTestCaseRegistry& parameterized_test_registry() { return parameterized_test_registry_; } #endif // GTEST_HAS_PARAM_TEST // Sets the TestCase object for the test that's currently running. void set_current_test_case(TestCase* a_current_test_case) { current_test_case_ = a_current_test_case; } // Sets the TestInfo object for the test that's currently running. If // current_test_info is NULL, the assertion results will be stored in // ad_hoc_test_result_. void set_current_test_info(TestInfo* a_current_test_info) { current_test_info_ = a_current_test_info; } // Registers all parameterized tests defined using TEST_P and // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter // combination. This method can be called more then once; it has guards // protecting from registering the tests more then once. If // value-parameterized tests are disabled, RegisterParameterizedTests is // present but does nothing. void RegisterParameterizedTests(); // Runs all tests in this UnitTest object, prints the result, and // returns true if all tests are successful. If any exception is // thrown during a test, this test is considered to be failed, but // the rest of the tests will still be run. bool RunAllTests(); // Clears the results of all tests, except the ad hoc tests. void ClearNonAdHocTestResult() { ForEach(test_cases_, TestCase::ClearTestCaseResult); } // Clears the results of ad-hoc test assertions. void ClearAdHocTestResult() { ad_hoc_test_result_.Clear(); } // Adds a TestProperty to the current TestResult object when invoked in a // context of a test or a test case, or to the global property set. If the // result already contains a property with the same key, the value will be // updated. void RecordProperty(const TestProperty& test_property); enum ReactionToSharding { HONOR_SHARDING_PROTOCOL, IGNORE_SHARDING_PROTOCOL }; // Matches the full name of each test against the user-specified // filter to decide whether the test should run, then records the // result in each TestCase and TestInfo object. // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests // based on sharding variables in the environment. // Returns the number of tests that should run. int FilterTests(ReactionToSharding shard_tests); // Prints the names of the tests matching the user-specified filter flag. void ListTestsMatchingFilter(); const TestCase* current_test_case() const { return current_test_case_; } TestInfo* current_test_info() { return current_test_info_; } const TestInfo* current_test_info() const { return current_test_info_; } // Returns the vector of environments that need to be set-up/torn-down // before/after the tests are run. std::vector& environments() { return environments_; } // Getters for the per-thread Google Test trace stack. std::vector& gtest_trace_stack() { return *(gtest_trace_stack_.pointer()); } const std::vector& gtest_trace_stack() const { return gtest_trace_stack_.get(); } #if GTEST_HAS_DEATH_TEST void InitDeathTestSubprocessControlInfo() { internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); } // Returns a pointer to the parsed --gtest_internal_run_death_test // flag, or NULL if that flag was not specified. // This information is useful only in a death test child process. // Must not be called before a call to InitGoogleTest. const InternalRunDeathTestFlag* internal_run_death_test_flag() const { return internal_run_death_test_flag_.get(); } // Returns a pointer to the current death test factory. internal::DeathTestFactory* death_test_factory() { return death_test_factory_.get(); } void SuppressTestEventsIfInSubprocess(); friend class ReplaceDeathTestFactory; #endif // GTEST_HAS_DEATH_TEST // Initializes the event listener performing XML output as specified by // UnitTestOptions. Must not be called before InitGoogleTest. void ConfigureXmlOutput(); #if GTEST_CAN_STREAM_RESULTS_ // Initializes the event listener for streaming test results to a socket. // Must not be called before InitGoogleTest. void ConfigureStreamingOutput(); #endif // Performs initialization dependent upon flag values obtained in // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest // this function is also called from RunAllTests. Since this function can be // called more than once, it has to be idempotent. void PostFlagParsingInit(); // Gets the random seed used at the start of the current test iteration. int random_seed() const { return random_seed_; } // Gets the random number generator. internal::Random* random() { return &random_; } // Shuffles all test cases, and the tests within each test case, // making sure that death tests are still run first. void ShuffleTests(); // Restores the test cases and tests to their order before the first shuffle. void UnshuffleTests(); // Returns the value of GTEST_FLAG(catch_exceptions) at the moment // UnitTest::Run() starts. bool catch_exceptions() const { return catch_exceptions_; } private: friend class ::testing::UnitTest; // Used by UnitTest::Run() to capture the state of // GTEST_FLAG(catch_exceptions) at the moment it starts. void set_catch_exceptions(bool value) { catch_exceptions_ = value; } // The UnitTest object that owns this implementation object. UnitTest* const parent_; // The working directory when the first TEST() or TEST_F() was // executed. internal::FilePath original_working_dir_; // The default test part result reporters. DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; DefaultPerThreadTestPartResultReporter default_per_thread_test_part_result_reporter_; // Points to (but doesn't own) the global test part result reporter. TestPartResultReporterInterface* global_test_part_result_repoter_; // Protects read and write access to global_test_part_result_reporter_. internal::Mutex global_test_part_result_reporter_mutex_; // Points to (but doesn't own) the per-thread test part result reporter. internal::ThreadLocal per_thread_test_part_result_reporter_; // The vector of environments that need to be set-up/torn-down // before/after the tests are run. std::vector environments_; // The vector of TestCases in their original order. It owns the // elements in the vector. std::vector test_cases_; // Provides a level of indirection for the test case list to allow // easy shuffling and restoring the test case order. The i-th // element of this vector is the index of the i-th test case in the // shuffled order. std::vector test_case_indices_; #if GTEST_HAS_PARAM_TEST // ParameterizedTestRegistry object used to register value-parameterized // tests. internal::ParameterizedTestCaseRegistry parameterized_test_registry_; // Indicates whether RegisterParameterizedTests() has been called already. bool parameterized_tests_registered_; #endif // GTEST_HAS_PARAM_TEST // Index of the last death test case registered. Initially -1. int last_death_test_case_; // This points to the TestCase for the currently running test. It // changes as Google Test goes through one test case after another. // When no test is running, this is set to NULL and Google Test // stores assertion results in ad_hoc_test_result_. Initially NULL. TestCase* current_test_case_; // This points to the TestInfo for the currently running test. It // changes as Google Test goes through one test after another. When // no test is running, this is set to NULL and Google Test stores // assertion results in ad_hoc_test_result_. Initially NULL. TestInfo* current_test_info_; // Normally, a user only writes assertions inside a TEST or TEST_F, // or inside a function called by a TEST or TEST_F. Since Google // Test keeps track of which test is current running, it can // associate such an assertion with the test it belongs to. // // If an assertion is encountered when no TEST or TEST_F is running, // Google Test attributes the assertion result to an imaginary "ad hoc" // test, and records the result in ad_hoc_test_result_. TestResult ad_hoc_test_result_; // The list of event listeners that can be used to track events inside // Google Test. TestEventListeners listeners_; // The OS stack trace getter. Will be deleted when the UnitTest // object is destructed. By default, an OsStackTraceGetter is used, // but the user can set this field to use a custom getter if that is // desired. OsStackTraceGetterInterface* os_stack_trace_getter_; // True iff PostFlagParsingInit() has been called. bool post_flag_parse_init_performed_; // The random number seed used at the beginning of the test run. int random_seed_; // Our random number generator. internal::Random random_; // The time of the test program start, in ms from the start of the // UNIX epoch. TimeInMillis start_timestamp_; // How long the test took to run, in milliseconds. TimeInMillis elapsed_time_; #if GTEST_HAS_DEATH_TEST // The decomposed components of the gtest_internal_run_death_test flag, // parsed when RUN_ALL_TESTS is called. internal::scoped_ptr internal_run_death_test_flag_; internal::scoped_ptr death_test_factory_; #endif // GTEST_HAS_DEATH_TEST // A per-thread stack of traces created by the SCOPED_TRACE() macro. internal::ThreadLocal > gtest_trace_stack_; // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests() // starts. bool catch_exceptions_; GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); }; // class UnitTestImpl // Convenience function for accessing the global UnitTest // implementation object. inline UnitTestImpl* GetUnitTestImpl() { return UnitTest::GetInstance()->impl(); } #if GTEST_USES_SIMPLE_RE // Internal helper functions for implementing the simple regular // expression matcher. GTEST_API_ bool IsInSet(char ch, const char* str); GTEST_API_ bool IsAsciiDigit(char ch); GTEST_API_ bool IsAsciiPunct(char ch); GTEST_API_ bool IsRepeat(char ch); GTEST_API_ bool IsAsciiWhiteSpace(char ch); GTEST_API_ bool IsAsciiWordChar(char ch); GTEST_API_ bool IsValidEscape(char ch); GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); GTEST_API_ bool ValidateRegex(const char* regex); GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); GTEST_API_ bool MatchRepetitionAndRegexAtHead( bool escaped, char ch, char repeat, const char* regex, const char* str); GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); #endif // GTEST_USES_SIMPLE_RE // Parses the command line for Google Test flags, without initializing // other parts of Google Test. GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); #if GTEST_HAS_DEATH_TEST // Returns the message describing the last system error, regardless of the // platform. GTEST_API_ std::string GetLastErrnoDescription(); # if GTEST_OS_WINDOWS // Provides leak-safe Windows kernel handle ownership. class AutoHandle { public: AutoHandle() : handle_(INVALID_HANDLE_VALUE) {} explicit AutoHandle(HANDLE handle) : handle_(handle) {} ~AutoHandle() { Reset(); } HANDLE Get() const { return handle_; } void Reset() { Reset(INVALID_HANDLE_VALUE); } void Reset(HANDLE handle) { if (handle != handle_) { if (handle_ != INVALID_HANDLE_VALUE) ::CloseHandle(handle_); handle_ = handle; } } private: HANDLE handle_; GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); }; # endif // GTEST_OS_WINDOWS // Attempts to parse a string into a positive integer pointed to by the // number parameter. Returns true if that is possible. // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use // it here. template bool ParseNaturalNumber(const ::std::string& str, Integer* number) { // Fail fast if the given string does not begin with a digit; // this bypasses strtoXXX's "optional leading whitespace and plus // or minus sign" semantics, which are undesirable here. if (str.empty() || !IsDigit(str[0])) { return false; } errno = 0; char* end; // BiggestConvertible is the largest integer type that system-provided // string-to-number conversion routines can return. # if GTEST_OS_WINDOWS && !defined(__GNUC__) // MSVC and C++ Builder define __int64 instead of the standard long long. typedef unsigned __int64 BiggestConvertible; const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); # else typedef unsigned long long BiggestConvertible; // NOLINT const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); # endif // GTEST_OS_WINDOWS && !defined(__GNUC__) const bool parse_success = *end == '\0' && errno == 0; // TODO(vladl@google.com): Convert this to compile time assertion when it is // available. GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); const Integer result = static_cast(parsed); if (parse_success && static_cast(result) == parsed) { *number = result; return true; } return false; } #endif // GTEST_HAS_DEATH_TEST // TestResult contains some private methods that should be hidden from // Google Test user but are required for testing. This class allow our tests // to access them. // // This class is supplied only for the purpose of testing Google Test's own // constructs. Do not use it in user tests, either directly or indirectly. class TestResultAccessor { public: static void RecordProperty(TestResult* test_result, const std::string& xml_element, const TestProperty& property) { test_result->RecordProperty(xml_element, property); } static void ClearTestPartResults(TestResult* test_result) { test_result->ClearTestPartResults(); } static const std::vector& test_part_results( const TestResult& test_result) { return test_result.test_part_results(); } }; #if GTEST_CAN_STREAM_RESULTS_ // Streams test results to the given port on the given host machine. class StreamingListener : public EmptyTestEventListener { public: // Abstract base class for writing strings to a socket. class AbstractSocketWriter { public: virtual ~AbstractSocketWriter() {} // Sends a string to the socket. virtual void Send(const string& message) = 0; // Closes the socket. virtual void CloseConnection() {} // Sends a string and a newline to the socket. void SendLn(const string& message) { Send(message + "\n"); } }; // Concrete class for actually writing strings to a socket. class SocketWriter : public AbstractSocketWriter { public: SocketWriter(const string& host, const string& port) : sockfd_(-1), host_name_(host), port_num_(port) { MakeConnection(); } virtual ~SocketWriter() { if (sockfd_ != -1) CloseConnection(); } // Sends a string to the socket. virtual void Send(const string& message) { GTEST_CHECK_(sockfd_ != -1) << "Send() can be called only when there is a connection."; const int len = static_cast(message.length()); if (write(sockfd_, message.c_str(), len) != len) { GTEST_LOG_(WARNING) << "stream_result_to: failed to stream to " << host_name_ << ":" << port_num_; } } private: // Creates a client socket and connects to the server. void MakeConnection(); // Closes the socket. void CloseConnection() { GTEST_CHECK_(sockfd_ != -1) << "CloseConnection() can be called only when there is a connection."; close(sockfd_); sockfd_ = -1; } int sockfd_; // socket file descriptor const string host_name_; const string port_num_; GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter); }; // class SocketWriter // Escapes '=', '&', '%', and '\n' characters in str as "%xx". static string UrlEncode(const char* str); StreamingListener(const string& host, const string& port) : socket_writer_(new SocketWriter(host, port)) { Start(); } explicit StreamingListener(AbstractSocketWriter* socket_writer) : socket_writer_(socket_writer) { Start(); } void OnTestProgramStart(const UnitTest& /* unit_test */) { SendLn("event=TestProgramStart"); } void OnTestProgramEnd(const UnitTest& unit_test) { // Note that Google Test current only report elapsed time for each // test iteration, not for the entire test program. SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed())); // Notify the streaming server to stop. socket_writer_->CloseConnection(); } void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) { SendLn("event=TestIterationStart&iteration=" + StreamableToString(iteration)); } void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) { SendLn("event=TestIterationEnd&passed=" + FormatBool(unit_test.Passed()) + "&elapsed_time=" + StreamableToString(unit_test.elapsed_time()) + "ms"); } void OnTestCaseStart(const TestCase& test_case) { SendLn(std::string("event=TestCaseStart&name=") + test_case.name()); } void OnTestCaseEnd(const TestCase& test_case) { SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) + "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) + "ms"); } void OnTestStart(const TestInfo& test_info) { SendLn(std::string("event=TestStart&name=") + test_info.name()); } void OnTestEnd(const TestInfo& test_info) { SendLn("event=TestEnd&passed=" + FormatBool((test_info.result())->Passed()) + "&elapsed_time=" + StreamableToString((test_info.result())->elapsed_time()) + "ms"); } void OnTestPartResult(const TestPartResult& test_part_result) { const char* file_name = test_part_result.file_name(); if (file_name == NULL) file_name = ""; SendLn("event=TestPartResult&file=" + UrlEncode(file_name) + "&line=" + StreamableToString(test_part_result.line_number()) + "&message=" + UrlEncode(test_part_result.message())); } private: // Sends the given message and a newline to the socket. void SendLn(const string& message) { socket_writer_->SendLn(message); } // Called at the start of streaming to notify the receiver what // protocol we are using. void Start() { SendLn("gtest_streaming_protocol_version=1.0"); } string FormatBool(bool value) { return value ? "1" : "0"; } const scoped_ptr socket_writer_; GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener); }; // class StreamingListener #endif // GTEST_CAN_STREAM_RESULTS_ } // namespace internal } // namespace testing #endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ stimfit-0.15.8/src/test/gtest/src/gtest.cc0000664000175000017500000054751613062445067015360 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) #include "gtest/gtest.h" #include "gtest/gtest-spi.h" #include #include #include #include #include #include #include #include #include #include #include #include // NOLINT #include #include #if GTEST_OS_LINUX // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). # define GTEST_HAS_GETTIMEOFDAY_ 1 # include // NOLINT # include // NOLINT # include // NOLINT // Declares vsnprintf(). This header is not available on Windows. # include // NOLINT # include // NOLINT # include // NOLINT # include // NOLINT # include #elif GTEST_OS_SYMBIAN # define GTEST_HAS_GETTIMEOFDAY_ 1 # include // NOLINT #elif GTEST_OS_ZOS # define GTEST_HAS_GETTIMEOFDAY_ 1 # include // NOLINT // On z/OS we additionally need strings.h for strcasecmp. # include // NOLINT #elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE. # include // NOLINT #elif GTEST_OS_WINDOWS // We are on Windows proper. # include // NOLINT # include // NOLINT # include // NOLINT # include // NOLINT # if GTEST_OS_WINDOWS_MINGW // MinGW has gettimeofday() but not _ftime64(). // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). // TODO(kenton@google.com): There are other ways to get the time on // Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW // supports these. consider using them instead. # define GTEST_HAS_GETTIMEOFDAY_ 1 # include // NOLINT # endif // GTEST_OS_WINDOWS_MINGW // cpplint thinks that the header is already included, so we want to // silence it. # include // NOLINT #else // Assume other platforms have gettimeofday(). // TODO(kenton@google.com): Use autoconf to detect availability of // gettimeofday(). # define GTEST_HAS_GETTIMEOFDAY_ 1 // cpplint thinks that the header is already included, so we want to // silence it. # include // NOLINT # include // NOLINT #endif // GTEST_OS_LINUX #if GTEST_HAS_EXCEPTIONS # include #endif #if GTEST_CAN_STREAM_RESULTS_ # include // NOLINT # include // NOLINT #endif // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #include "src/gtest-internal-inl.h" #undef GTEST_IMPLEMENTATION_ #if GTEST_OS_WINDOWS # define vsnprintf _vsnprintf #endif // GTEST_OS_WINDOWS namespace testing { using internal::CountIf; using internal::ForEach; using internal::GetElementOr; using internal::Shuffle; // Constants. // A test whose test case name or test name matches this filter is // disabled and not run. static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*"; // A test case whose name matches this filter is considered a death // test case and will be run before test cases whose name doesn't // match this filter. static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*"; // A test filter that matches everything. static const char kUniversalFilter[] = "*"; // The default output file for XML output. static const char kDefaultOutputFile[] = "test_detail.xml"; // The environment variable name for the test shard index. static const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; // The environment variable name for the total number of test shards. static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; // The environment variable name for the test shard status file. static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; namespace internal { // The text used in failure messages to indicate the start of the // stack trace. const char kStackTraceMarker[] = "\nStack trace:\n"; // g_help_flag is true iff the --help flag or an equivalent form is // specified on the command line. bool g_help_flag = false; } // namespace internal static const char* GetDefaultFilter() { return kUniversalFilter; } GTEST_DEFINE_bool_( also_run_disabled_tests, internal::BoolFromGTestEnv("also_run_disabled_tests", false), "Run disabled tests too, in addition to the tests normally being run."); GTEST_DEFINE_bool_( break_on_failure, internal::BoolFromGTestEnv("break_on_failure", false), "True iff a failed assertion should be a debugger break-point."); GTEST_DEFINE_bool_( catch_exceptions, internal::BoolFromGTestEnv("catch_exceptions", true), "True iff " GTEST_NAME_ " should catch exceptions and treat them as test failures."); GTEST_DEFINE_string_( color, internal::StringFromGTestEnv("color", "auto"), "Whether to use colors in the output. Valid values: yes, no, " "and auto. 'auto' means to use colors if the output is " "being sent to a terminal and the TERM environment variable " "is set to a terminal type that supports colors."); GTEST_DEFINE_string_( filter, internal::StringFromGTestEnv("filter", GetDefaultFilter()), "A colon-separated list of glob (not regex) patterns " "for filtering the tests to run, optionally followed by a " "'-' and a : separated list of negative patterns (tests to " "exclude). A test is run if it matches one of the positive " "patterns and does not match any of the negative patterns."); GTEST_DEFINE_bool_(list_tests, false, "List all tests without running them."); GTEST_DEFINE_string_( output, internal::StringFromGTestEnv("output", ""), "A format (currently must be \"xml\"), optionally followed " "by a colon and an output file name or directory. A directory " "is indicated by a trailing pathname separator. " "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " "If a directory is specified, output files will be created " "within that directory, with file-names based on the test " "executable's name and, if necessary, made unique by adding " "digits."); GTEST_DEFINE_bool_( print_time, internal::BoolFromGTestEnv("print_time", true), "True iff " GTEST_NAME_ " should display elapsed time in text output."); GTEST_DEFINE_int32_( random_seed, internal::Int32FromGTestEnv("random_seed", 0), "Random number seed to use when shuffling test orders. Must be in range " "[1, 99999], or 0 to use a seed based on the current time."); GTEST_DEFINE_int32_( repeat, internal::Int32FromGTestEnv("repeat", 1), "How many times to repeat each test. Specify a negative number " "for repeating forever. Useful for shaking out flaky tests."); GTEST_DEFINE_bool_( show_internal_stack_frames, false, "True iff " GTEST_NAME_ " should include internal stack frames when " "printing test failure stack traces."); GTEST_DEFINE_bool_( shuffle, internal::BoolFromGTestEnv("shuffle", false), "True iff " GTEST_NAME_ " should randomize tests' order on every run."); GTEST_DEFINE_int32_( stack_trace_depth, internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), "The maximum number of stack frames to print when an " "assertion fails. The valid range is 0 through 100, inclusive."); GTEST_DEFINE_string_( stream_result_to, internal::StringFromGTestEnv("stream_result_to", ""), "This flag specifies the host name and the port number on which to stream " "test results. Example: \"localhost:555\". The flag is effective only on " "Linux."); GTEST_DEFINE_bool_( throw_on_failure, internal::BoolFromGTestEnv("throw_on_failure", false), "When this flag is specified, a failed assertion will throw an exception " "if exceptions are enabled or exit the program with a non-zero code " "otherwise."); namespace internal { // Generates a random number from [0, range), using a Linear // Congruential Generator (LCG). Crashes if 'range' is 0 or greater // than kMaxRange. UInt32 Random::Generate(UInt32 range) { // These constants are the same as are used in glibc's rand(3). state_ = (1103515245U*state_ + 12345U) % kMaxRange; GTEST_CHECK_(range > 0) << "Cannot generate a number in the range [0, 0)."; GTEST_CHECK_(range <= kMaxRange) << "Generation of a number in [0, " << range << ") was requested, " << "but this can only generate numbers in [0, " << kMaxRange << ")."; // Converting via modulus introduces a bit of downward bias, but // it's simple, and a linear congruential generator isn't too good // to begin with. return state_ % range; } // GTestIsInitialized() returns true iff the user has initialized // Google Test. Useful for catching the user mistake of not initializing // Google Test before calling RUN_ALL_TESTS(). // // A user must call testing::InitGoogleTest() to initialize Google // Test. g_init_gtest_count is set to the number of times // InitGoogleTest() has been called. We don't protect this variable // under a mutex as it is only accessed in the main thread. GTEST_API_ int g_init_gtest_count = 0; static bool GTestIsInitialized() { return g_init_gtest_count != 0; } // Iterates over a vector of TestCases, keeping a running sum of the // results of calling a given int-returning method on each. // Returns the sum. static int SumOverTestCaseList(const std::vector& case_list, int (TestCase::*method)() const) { int sum = 0; for (size_t i = 0; i < case_list.size(); i++) { sum += (case_list[i]->*method)(); } return sum; } // Returns true iff the test case passed. static bool TestCasePassed(const TestCase* test_case) { return test_case->should_run() && test_case->Passed(); } // Returns true iff the test case failed. static bool TestCaseFailed(const TestCase* test_case) { return test_case->should_run() && test_case->Failed(); } // Returns true iff test_case contains at least one test that should // run. static bool ShouldRunTestCase(const TestCase* test_case) { return test_case->should_run(); } // AssertHelper constructor. AssertHelper::AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message) : data_(new AssertHelperData(type, file, line, message)) { } AssertHelper::~AssertHelper() { delete data_; } // Message assignment, for assertion streaming support. void AssertHelper::operator=(const Message& message) const { UnitTest::GetInstance()-> AddTestPartResult(data_->type, data_->file, data_->line, AppendUserMessage(data_->message, message), UnitTest::GetInstance()->impl() ->CurrentOsStackTraceExceptTop(1) // Skips the stack frame for this function itself. ); // NOLINT } // Mutex for linked pointers. GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex); // Application pathname gotten in InitGoogleTest. std::string g_executable_path; // Returns the current application's name, removing directory path if that // is present. FilePath GetCurrentExecutableName() { FilePath result; #if GTEST_OS_WINDOWS result.Set(FilePath(g_executable_path).RemoveExtension("exe")); #else result.Set(FilePath(g_executable_path)); #endif // GTEST_OS_WINDOWS return result.RemoveDirectoryName(); } // Functions for processing the gtest_output flag. // Returns the output format, or "" for normal printed output. std::string UnitTestOptions::GetOutputFormat() { const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); if (gtest_output_flag == NULL) return std::string(""); const char* const colon = strchr(gtest_output_flag, ':'); return (colon == NULL) ? std::string(gtest_output_flag) : std::string(gtest_output_flag, colon - gtest_output_flag); } // Returns the name of the requested output file, or the default if none // was explicitly specified. std::string UnitTestOptions::GetAbsolutePathToOutputFile() { const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); if (gtest_output_flag == NULL) return ""; const char* const colon = strchr(gtest_output_flag, ':'); if (colon == NULL) return internal::FilePath::ConcatPaths( internal::FilePath( UnitTest::GetInstance()->original_working_dir()), internal::FilePath(kDefaultOutputFile)).string(); internal::FilePath output_name(colon + 1); if (!output_name.IsAbsolutePath()) // TODO(wan@google.com): on Windows \some\path is not an absolute // path (as its meaning depends on the current drive), yet the // following logic for turning it into an absolute path is wrong. // Fix it. output_name = internal::FilePath::ConcatPaths( internal::FilePath(UnitTest::GetInstance()->original_working_dir()), internal::FilePath(colon + 1)); if (!output_name.IsDirectory()) return output_name.string(); internal::FilePath result(internal::FilePath::GenerateUniqueFileName( output_name, internal::GetCurrentExecutableName(), GetOutputFormat().c_str())); return result.string(); } // Returns true iff the wildcard pattern matches the string. The // first ':' or '\0' character in pattern marks the end of it. // // This recursive algorithm isn't very efficient, but is clear and // works well enough for matching test names, which are short. bool UnitTestOptions::PatternMatchesString(const char *pattern, const char *str) { switch (*pattern) { case '\0': case ':': // Either ':' or '\0' marks the end of the pattern. return *str == '\0'; case '?': // Matches any single character. return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); case '*': // Matches any string (possibly empty) of characters. return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || PatternMatchesString(pattern + 1, str); default: // Non-special character. Matches itself. return *pattern == *str && PatternMatchesString(pattern + 1, str + 1); } } bool UnitTestOptions::MatchesFilter( const std::string& name, const char* filter) { const char *cur_pattern = filter; for (;;) { if (PatternMatchesString(cur_pattern, name.c_str())) { return true; } // Finds the next pattern in the filter. cur_pattern = strchr(cur_pattern, ':'); // Returns if no more pattern can be found. if (cur_pattern == NULL) { return false; } // Skips the pattern separater (the ':' character). cur_pattern++; } } // Returns true iff the user-specified filter matches the test case // name and the test name. bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name, const std::string &test_name) { const std::string& full_name = test_case_name + "." + test_name.c_str(); // Split --gtest_filter at '-', if there is one, to separate into // positive filter and negative filter portions const char* const p = GTEST_FLAG(filter).c_str(); const char* const dash = strchr(p, '-'); std::string positive; std::string negative; if (dash == NULL) { positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter negative = ""; } else { positive = std::string(p, dash); // Everything up to the dash negative = std::string(dash + 1); // Everything after the dash if (positive.empty()) { // Treat '-test1' as the same as '*-test1' positive = kUniversalFilter; } } // A filter is a colon-separated list of patterns. It matches a // test if any pattern in it matches the test. return (MatchesFilter(full_name, positive.c_str()) && !MatchesFilter(full_name, negative.c_str())); } #if GTEST_HAS_SEH // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. // This function is useful as an __except condition. int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { // Google Test should handle a SEH exception if: // 1. the user wants it to, AND // 2. this is not a breakpoint exception, AND // 3. this is not a C++ exception (VC++ implements them via SEH, // apparently). // // SEH exception code for C++ exceptions. // (see http://support.microsoft.com/kb/185294 for more information). const DWORD kCxxExceptionCode = 0xe06d7363; bool should_handle = true; if (!GTEST_FLAG(catch_exceptions)) should_handle = false; else if (exception_code == EXCEPTION_BREAKPOINT) should_handle = false; else if (exception_code == kCxxExceptionCode) should_handle = false; return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH; } #endif // GTEST_HAS_SEH } // namespace internal // The c'tor sets this object as the test part result reporter used by // Google Test. The 'result' parameter specifies where to report the // results. Intercepts only failures from the current thread. ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( TestPartResultArray* result) : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD), result_(result) { Init(); } // The c'tor sets this object as the test part result reporter used by // Google Test. The 'result' parameter specifies where to report the // results. ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( InterceptMode intercept_mode, TestPartResultArray* result) : intercept_mode_(intercept_mode), result_(result) { Init(); } void ScopedFakeTestPartResultReporter::Init() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); if (intercept_mode_ == INTERCEPT_ALL_THREADS) { old_reporter_ = impl->GetGlobalTestPartResultReporter(); impl->SetGlobalTestPartResultReporter(this); } else { old_reporter_ = impl->GetTestPartResultReporterForCurrentThread(); impl->SetTestPartResultReporterForCurrentThread(this); } } // The d'tor restores the test part result reporter used by Google Test // before. ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); if (intercept_mode_ == INTERCEPT_ALL_THREADS) { impl->SetGlobalTestPartResultReporter(old_reporter_); } else { impl->SetTestPartResultReporterForCurrentThread(old_reporter_); } } // Increments the test part result count and remembers the result. // This method is from the TestPartResultReporterInterface interface. void ScopedFakeTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { result_->Append(result); } namespace internal { // Returns the type ID of ::testing::Test. We should always call this // instead of GetTypeId< ::testing::Test>() to get the type ID of // testing::Test. This is to work around a suspected linker bug when // using Google Test as a framework on Mac OS X. The bug causes // GetTypeId< ::testing::Test>() to return different values depending // on whether the call is from the Google Test framework itself or // from user test code. GetTestTypeId() is guaranteed to always // return the same value, as it always calls GetTypeId<>() from the // gtest.cc, which is within the Google Test framework. TypeId GetTestTypeId() { return GetTypeId(); } // The value of GetTestTypeId() as seen from within the Google Test // library. This is solely for testing GetTestTypeId(). extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId(); // This predicate-formatter checks that 'results' contains a test part // failure of the given type and that the failure message contains the // given substring. AssertionResult HasOneFailure(const char* /* results_expr */, const char* /* type_expr */, const char* /* substr_expr */, const TestPartResultArray& results, TestPartResult::Type type, const string& substr) { const std::string expected(type == TestPartResult::kFatalFailure ? "1 fatal failure" : "1 non-fatal failure"); Message msg; if (results.size() != 1) { msg << "Expected: " << expected << "\n" << " Actual: " << results.size() << " failures"; for (int i = 0; i < results.size(); i++) { msg << "\n" << results.GetTestPartResult(i); } return AssertionFailure() << msg; } const TestPartResult& r = results.GetTestPartResult(0); if (r.type() != type) { return AssertionFailure() << "Expected: " << expected << "\n" << " Actual:\n" << r; } if (strstr(r.message(), substr.c_str()) == NULL) { return AssertionFailure() << "Expected: " << expected << " containing \"" << substr << "\"\n" << " Actual:\n" << r; } return AssertionSuccess(); } // The constructor of SingleFailureChecker remembers where to look up // test part results, what type of failure we expect, and what // substring the failure message should contain. SingleFailureChecker:: SingleFailureChecker( const TestPartResultArray* results, TestPartResult::Type type, const string& substr) : results_(results), type_(type), substr_(substr) {} // The destructor of SingleFailureChecker verifies that the given // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. SingleFailureChecker::~SingleFailureChecker() { EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_); } DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter( UnitTestImpl* unit_test) : unit_test_(unit_test) {} void DefaultGlobalTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { unit_test_->current_test_result()->AddTestPartResult(result); unit_test_->listeners()->repeater()->OnTestPartResult(result); } DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter( UnitTestImpl* unit_test) : unit_test_(unit_test) {} void DefaultPerThreadTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result); } // Returns the global test part result reporter. TestPartResultReporterInterface* UnitTestImpl::GetGlobalTestPartResultReporter() { internal::MutexLock lock(&global_test_part_result_reporter_mutex_); return global_test_part_result_repoter_; } // Sets the global test part result reporter. void UnitTestImpl::SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter) { internal::MutexLock lock(&global_test_part_result_reporter_mutex_); global_test_part_result_repoter_ = reporter; } // Returns the test part result reporter for the current thread. TestPartResultReporterInterface* UnitTestImpl::GetTestPartResultReporterForCurrentThread() { return per_thread_test_part_result_reporter_.get(); } // Sets the test part result reporter for the current thread. void UnitTestImpl::SetTestPartResultReporterForCurrentThread( TestPartResultReporterInterface* reporter) { per_thread_test_part_result_reporter_.set(reporter); } // Gets the number of successful test cases. int UnitTestImpl::successful_test_case_count() const { return CountIf(test_cases_, TestCasePassed); } // Gets the number of failed test cases. int UnitTestImpl::failed_test_case_count() const { return CountIf(test_cases_, TestCaseFailed); } // Gets the number of all test cases. int UnitTestImpl::total_test_case_count() const { return static_cast(test_cases_.size()); } // Gets the number of all test cases that contain at least one test // that should run. int UnitTestImpl::test_case_to_run_count() const { return CountIf(test_cases_, ShouldRunTestCase); } // Gets the number of successful tests. int UnitTestImpl::successful_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count); } // Gets the number of failed tests. int UnitTestImpl::failed_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count); } // Gets the number of disabled tests that will be reported in the XML report. int UnitTestImpl::reportable_disabled_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::reportable_disabled_test_count); } // Gets the number of disabled tests. int UnitTestImpl::disabled_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count); } // Gets the number of tests to be printed in the XML report. int UnitTestImpl::reportable_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count); } // Gets the number of all tests. int UnitTestImpl::total_test_count() const { return SumOverTestCaseList(test_cases_, &TestCase::total_test_count); } // Gets the number of tests that should run. int UnitTestImpl::test_to_run_count() const { return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count); } // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // CurrentOsStackTraceExceptTop(1), Foo() will be included in the // trace but Bar() and CurrentOsStackTraceExceptTop() won't. std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { (void)skip_count; return ""; } // Returns the current time in milliseconds. TimeInMillis GetTimeInMillis() { #if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) // Difference between 1970-01-01 and 1601-01-01 in milliseconds. // http://analogous.blogspot.com/2005/04/epoch.html const TimeInMillis kJavaEpochToWinFileTimeDelta = static_cast(116444736UL) * 100000UL; const DWORD kTenthMicrosInMilliSecond = 10000; SYSTEMTIME now_systime; FILETIME now_filetime; ULARGE_INTEGER now_int64; // TODO(kenton@google.com): Shouldn't this just use // GetSystemTimeAsFileTime()? GetSystemTime(&now_systime); if (SystemTimeToFileTime(&now_systime, &now_filetime)) { now_int64.LowPart = now_filetime.dwLowDateTime; now_int64.HighPart = now_filetime.dwHighDateTime; now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - kJavaEpochToWinFileTimeDelta; return now_int64.QuadPart; } return 0; #elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ __timeb64 now; # ifdef _MSC_VER // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 // (deprecated function) there. // TODO(kenton@google.com): Use GetTickCount()? Or use // SystemTimeToFileTime() # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4996) // Temporarily disables warning 4996. _ftime64(&now); # pragma warning(pop) // Restores the warning state. # else _ftime64(&now); # endif // _MSC_VER return static_cast(now.time) * 1000 + now.millitm; #elif GTEST_HAS_GETTIMEOFDAY_ struct timeval now; gettimeofday(&now, NULL); return static_cast(now.tv_sec) * 1000 + now.tv_usec / 1000; #else # error "Don't know how to get the current time on your system." #endif } // Utilities // class String. #if GTEST_OS_WINDOWS_MOBILE // Creates a UTF-16 wide string from the given ANSI string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the wide string, or NULL if the // input is NULL. LPCWSTR String::AnsiToUtf16(const char* ansi) { if (!ansi) return NULL; const int length = strlen(ansi); const int unicode_length = MultiByteToWideChar(CP_ACP, 0, ansi, length, NULL, 0); WCHAR* unicode = new WCHAR[unicode_length + 1]; MultiByteToWideChar(CP_ACP, 0, ansi, length, unicode, unicode_length); unicode[unicode_length] = 0; return unicode; } // Creates an ANSI string from the given wide string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the ANSI string, or NULL if the // input is NULL. const char* String::Utf16ToAnsi(LPCWSTR utf16_str) { if (!utf16_str) return NULL; const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, NULL, 0, NULL, NULL); char* ansi = new char[ansi_length + 1]; WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, NULL, NULL); ansi[ansi_length] = 0; return ansi; } #endif // GTEST_OS_WINDOWS_MOBILE // Compares two C strings. Returns true iff they have the same content. // // Unlike strcmp(), this function can handle NULL argument(s). A NULL // C string is considered different to any non-NULL C string, // including the empty string. bool String::CStringEquals(const char * lhs, const char * rhs) { if ( lhs == NULL ) return rhs == NULL; if ( rhs == NULL ) return false; return strcmp(lhs, rhs) == 0; } #if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING // Converts an array of wide chars to a narrow string using the UTF-8 // encoding, and streams the result to the given Message object. static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length, Message* msg) { for (size_t i = 0; i != length; ) { // NOLINT if (wstr[i] != L'\0') { *msg << WideStringToUtf8(wstr + i, static_cast(length - i)); while (i != length && wstr[i] != L'\0') i++; } else { *msg << '\0'; i++; } } } #endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING } // namespace internal // Constructs an empty Message. // We allocate the stringstream separately because otherwise each use of // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's // stack frame leading to huge stack frames in some cases; gcc does not reuse // the stack space. Message::Message() : ss_(new ::std::stringstream) { // By default, we want there to be enough precision when printing // a double to a Message. *ss_ << std::setprecision(std::numeric_limits::digits10 + 2); } // These two overloads allow streaming a wide C string to a Message // using the UTF-8 encoding. Message& Message::operator <<(const wchar_t* wide_c_str) { return *this << internal::String::ShowWideCString(wide_c_str); } Message& Message::operator <<(wchar_t* wide_c_str) { return *this << internal::String::ShowWideCString(wide_c_str); } #if GTEST_HAS_STD_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& Message::operator <<(const ::std::wstring& wstr) { internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); return *this; } #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_GLOBAL_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& Message::operator <<(const ::wstring& wstr) { internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); return *this; } #endif // GTEST_HAS_GLOBAL_WSTRING // Gets the text streamed to this object so far as an std::string. // Each '\0' character in the buffer is replaced with "\\0". std::string Message::GetString() const { return internal::StringStreamToString(ss_.get()); } // AssertionResult constructors. // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult::AssertionResult(const AssertionResult& other) : success_(other.success_), message_(other.message_.get() != NULL ? new ::std::string(*other.message_) : static_cast< ::std::string*>(NULL)) { } // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. AssertionResult AssertionResult::operator!() const { AssertionResult negation(!success_); if (message_.get() != NULL) negation << *message_; return negation; } // Makes a successful assertion result. AssertionResult AssertionSuccess() { return AssertionResult(true); } // Makes a failed assertion result. AssertionResult AssertionFailure() { return AssertionResult(false); } // Makes a failed assertion result with the given failure message. // Deprecated; use AssertionFailure() << message. AssertionResult AssertionFailure(const Message& message) { return AssertionFailure() << message; } namespace internal { // Constructs and returns the message for an equality assertion // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. // // The first four parameters are the expressions used in the assertion // and their values, as strings. For example, for ASSERT_EQ(foo, bar) // where foo is 5 and bar is 6, we have: // // expected_expression: "foo" // actual_expression: "bar" // expected_value: "5" // actual_value: "6" // // The ignoring_case parameter is true iff the assertion is a // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will // be inserted into the message. AssertionResult EqFailure(const char* expected_expression, const char* actual_expression, const std::string& expected_value, const std::string& actual_value, bool ignoring_case) { Message msg; msg << "Value of: " << actual_expression; if (actual_value != actual_expression) { msg << "\n Actual: " << actual_value; } msg << "\nExpected: " << expected_expression; if (ignoring_case) { msg << " (ignoring case)"; } if (expected_value != expected_expression) { msg << "\nWhich is: " << expected_value; } return AssertionFailure() << msg; } // Constructs a failure message for Boolean assertions such as EXPECT_TRUE. std::string GetBoolAssertionFailureMessage( const AssertionResult& assertion_result, const char* expression_text, const char* actual_predicate_value, const char* expected_predicate_value) { const char* actual_message = assertion_result.message(); Message msg; msg << "Value of: " << expression_text << "\n Actual: " << actual_predicate_value; if (actual_message[0] != '\0') msg << " (" << actual_message << ")"; msg << "\nExpected: " << expected_predicate_value; return msg.GetString(); } // Helper function for implementing ASSERT_NEAR. AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error) { const double diff = fabs(val1 - val2); if (diff <= abs_error) return AssertionSuccess(); // TODO(wan): do not print the value of an expression if it's // already a literal. return AssertionFailure() << "The difference between " << expr1 << " and " << expr2 << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" << expr1 << " evaluates to " << val1 << ",\n" << expr2 << " evaluates to " << val2 << ", and\n" << abs_error_expr << " evaluates to " << abs_error << "."; } // Helper template for implementing FloatLE() and DoubleLE(). template AssertionResult FloatingPointLE(const char* expr1, const char* expr2, RawType val1, RawType val2) { // Returns success if val1 is less than val2, if (val1 < val2) { return AssertionSuccess(); } // or if val1 is almost equal to val2. const FloatingPoint lhs(val1), rhs(val2); if (lhs.AlmostEquals(rhs)) { return AssertionSuccess(); } // Note that the above two checks will both fail if either val1 or // val2 is NaN, as the IEEE floating-point standard requires that // any predicate involving a NaN must return false. ::std::stringstream val1_ss; val1_ss << std::setprecision(std::numeric_limits::digits10 + 2) << val1; ::std::stringstream val2_ss; val2_ss << std::setprecision(std::numeric_limits::digits10 + 2) << val2; return AssertionFailure() << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" << " Actual: " << StringStreamToString(&val1_ss) << " vs " << StringStreamToString(&val2_ss); } } // namespace internal // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. AssertionResult FloatLE(const char* expr1, const char* expr2, float val1, float val2) { return internal::FloatingPointLE(expr1, expr2, val1, val2); } // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. AssertionResult DoubleLE(const char* expr1, const char* expr2, double val1, double val2) { return internal::FloatingPointLE(expr1, expr2, val1, val2); } namespace internal { // The helper function for {ASSERT|EXPECT}_EQ with int or enum // arguments. AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual) { if (expected == actual) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, FormatForComparisonFailureMessage(expected, actual), FormatForComparisonFailureMessage(actual, expected), false); } // A macro for implementing the helper functions needed to implement // ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here // just to avoid copy-and-paste of similar code. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ BiggestInt val1, BiggestInt val2) {\ if (val1 op val2) {\ return AssertionSuccess();\ } else {\ return AssertionFailure() \ << "Expected: (" << expr1 << ") " #op " (" << expr2\ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ << " vs " << FormatForComparisonFailureMessage(val2, val1);\ }\ } // Implements the helper function for {ASSERT|EXPECT}_NE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(NE, !=) // Implements the helper function for {ASSERT|EXPECT}_LE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(LE, <=) // Implements the helper function for {ASSERT|EXPECT}_LT with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(LT, < ) // Implements the helper function for {ASSERT|EXPECT}_GE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(GE, >=) // Implements the helper function for {ASSERT|EXPECT}_GT with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(GT, > ) #undef GTEST_IMPL_CMP_HELPER_ // The helper function for {ASSERT|EXPECT}_STREQ. AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual) { if (String::CStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, PrintToString(expected), PrintToString(actual), false); } // The helper function for {ASSERT|EXPECT}_STRCASEEQ. AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual) { if (String::CaseInsensitiveCStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, PrintToString(expected), PrintToString(actual), true); } // The helper function for {ASSERT|EXPECT}_STRNE. AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2) { if (!String::CStringEquals(s1, s2)) { return AssertionSuccess(); } else { return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << "), actual: \"" << s1 << "\" vs \"" << s2 << "\""; } } // The helper function for {ASSERT|EXPECT}_STRCASENE. AssertionResult CmpHelperSTRCASENE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2) { if (!String::CaseInsensitiveCStringEquals(s1, s2)) { return AssertionSuccess(); } else { return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << ") (ignoring case), actual: \"" << s1 << "\" vs \"" << s2 << "\""; } } } // namespace internal namespace { // Helper functions for implementing IsSubString() and IsNotSubstring(). // This group of overloaded functions return true iff needle is a // substring of haystack. NULL is considered a substring of itself // only. bool IsSubstringPred(const char* needle, const char* haystack) { if (needle == NULL || haystack == NULL) return needle == haystack; return strstr(haystack, needle) != NULL; } bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { if (needle == NULL || haystack == NULL) return needle == haystack; return wcsstr(haystack, needle) != NULL; } // StringType here can be either ::std::string or ::std::wstring. template bool IsSubstringPred(const StringType& needle, const StringType& haystack) { return haystack.find(needle) != StringType::npos; } // This function implements either IsSubstring() or IsNotSubstring(), // depending on the value of the expected_to_be_substring parameter. // StringType here can be const char*, const wchar_t*, ::std::string, // or ::std::wstring. template AssertionResult IsSubstringImpl( bool expected_to_be_substring, const char* needle_expr, const char* haystack_expr, const StringType& needle, const StringType& haystack) { if (IsSubstringPred(needle, haystack) == expected_to_be_substring) return AssertionSuccess(); const bool is_wide_string = sizeof(needle[0]) > 1; const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; return AssertionFailure() << "Value of: " << needle_expr << "\n" << " Actual: " << begin_string_quote << needle << "\"\n" << "Expected: " << (expected_to_be_substring ? "" : "not ") << "a substring of " << haystack_expr << "\n" << "Which is: " << begin_string_quote << haystack << "\""; } } // namespace // IsSubstring() and IsNotSubstring() check whether needle is a // substring of haystack (NULL is considered a substring of itself // only), and return an appropriate error message when they fail. AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } #if GTEST_HAS_STD_WSTRING AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } #endif // GTEST_HAS_STD_WSTRING namespace internal { #if GTEST_OS_WINDOWS namespace { // Helper function for IsHRESULT{SuccessFailure} predicates AssertionResult HRESULTFailureHelper(const char* expr, const char* expected, long hr) { // NOLINT # if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't support FormatMessage. const char error_text[] = ""; # else // Looks up the human-readable system message for the HRESULT code // and since we're not passing any params to FormatMessage, we don't // want inserts expanded. const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; const DWORD kBufSize = 4096; // Gets the system's human readable message string for this HRESULT. char error_text[kBufSize] = { '\0' }; DWORD message_length = ::FormatMessageA(kFlags, 0, // no source, we're asking system hr, // the error 0, // no line width restrictions error_text, // output buffer kBufSize, // buf size NULL); // no arguments for inserts // Trims tailing white space (FormatMessage leaves a trailing CR-LF) for (; message_length && IsSpace(error_text[message_length - 1]); --message_length) { error_text[message_length - 1] = '\0'; } # endif // GTEST_OS_WINDOWS_MOBILE const std::string error_hex("0x" + String::FormatHexInt(hr)); return ::testing::AssertionFailure() << "Expected: " << expr << " " << expected << ".\n" << " Actual: " << error_hex << " " << error_text << "\n"; } } // namespace AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT if (SUCCEEDED(hr)) { return AssertionSuccess(); } return HRESULTFailureHelper(expr, "succeeds", hr); } AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT if (FAILED(hr)) { return AssertionSuccess(); } return HRESULTFailureHelper(expr, "fails", hr); } #endif // GTEST_OS_WINDOWS // Utility functions for encoding Unicode text (wide strings) in // UTF-8. // A Unicode code-point can have upto 21 bits, and is encoded in UTF-8 // like this: // // Code-point length Encoding // 0 - 7 bits 0xxxxxxx // 8 - 11 bits 110xxxxx 10xxxxxx // 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx // 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx // The maximum code-point a one-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint1 = (static_cast(1) << 7) - 1; // The maximum code-point a two-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint2 = (static_cast(1) << (5 + 6)) - 1; // The maximum code-point a three-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint3 = (static_cast(1) << (4 + 2*6)) - 1; // The maximum code-point a four-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint4 = (static_cast(1) << (3 + 3*6)) - 1; // Chops off the n lowest bits from a bit pattern. Returns the n // lowest bits. As a side effect, the original bit pattern will be // shifted to the right by n bits. inline UInt32 ChopLowBits(UInt32* bits, int n) { const UInt32 low_bits = *bits & ((static_cast(1) << n) - 1); *bits >>= n; return low_bits; } // Converts a Unicode code point to a narrow string in UTF-8 encoding. // code_point parameter is of type UInt32 because wchar_t may not be // wide enough to contain a code point. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted // to "(Invalid Unicode 0xXXXXXXXX)". std::string CodePointToUtf8(UInt32 code_point) { if (code_point > kMaxCodePoint4) { return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")"; } char str[5]; // Big enough for the largest valid code point. if (code_point <= kMaxCodePoint1) { str[1] = '\0'; str[0] = static_cast(code_point); // 0xxxxxxx } else if (code_point <= kMaxCodePoint2) { str[2] = '\0'; str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xC0 | code_point); // 110xxxxx } else if (code_point <= kMaxCodePoint3) { str[3] = '\0'; str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xE0 | code_point); // 1110xxxx } else { // code_point <= kMaxCodePoint4 str[4] = '\0'; str[3] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xF0 | code_point); // 11110xxx } return str; } // The following two functions only make sense if the the system // uses UTF-16 for wide string encoding. All supported systems // with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16. // Determines if the arguments constitute UTF-16 surrogate pair // and thus should be combined into a single Unicode code point // using CreateCodePointFromUtf16SurrogatePair. inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { return sizeof(wchar_t) == 2 && (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00; } // Creates a Unicode code point from UTF16 surrogate pair. inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, wchar_t second) { const UInt32 mask = (1 << 10) - 1; return (sizeof(wchar_t) == 2) ? (((first & mask) << 10) | (second & mask)) + 0x10000 : // This function should not be called when the condition is // false, but we provide a sensible default in case it is. static_cast(first); } // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: // UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) // UTF-32 if sizeof(wchar_t) == 4 (on Linux) // Parameter str points to a null-terminated wide string. // Parameter num_chars may additionally limit the number // of wchar_t characters processed. -1 is used when the entire string // should be processed. // If the string contains code points that are not valid Unicode code points // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding // and contains invalid UTF-16 surrogate pairs, values in those pairs // will be encoded as individual Unicode characters from Basic Normal Plane. std::string WideStringToUtf8(const wchar_t* str, int num_chars) { if (num_chars == -1) num_chars = static_cast(wcslen(str)); ::std::stringstream stream; for (int i = 0; i < num_chars; ++i) { UInt32 unicode_code_point; if (str[i] == L'\0') { break; } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) { unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i], str[i + 1]); i++; } else { unicode_code_point = static_cast(str[i]); } stream << CodePointToUtf8(unicode_code_point); } return StringStreamToString(&stream); } // Converts a wide C string to an std::string using the UTF-8 encoding. // NULL will be converted to "(null)". std::string String::ShowWideCString(const wchar_t * wide_c_str) { if (wide_c_str == NULL) return "(null)"; return internal::WideStringToUtf8(wide_c_str, -1); } // Compares two wide C strings. Returns true iff they have the same // content. // // Unlike wcscmp(), this function can handle NULL argument(s). A NULL // C string is considered different to any non-NULL C string, // including the empty string. bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { if (lhs == NULL) return rhs == NULL; if (rhs == NULL) return false; return wcscmp(lhs, rhs) == 0; } // Helper function for *_STREQ on wide strings. AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const wchar_t* expected, const wchar_t* actual) { if (String::WideCStringEquals(expected, actual)) { return AssertionSuccess(); } return EqFailure(expected_expression, actual_expression, PrintToString(expected), PrintToString(actual), false); } // Helper function for *_STRNE on wide strings. AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2) { if (!String::WideCStringEquals(s1, s2)) { return AssertionSuccess(); } return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << "), actual: " << PrintToString(s1) << " vs " << PrintToString(s2); } // Compares two C strings, ignoring case. Returns true iff they have // the same content. // // Unlike strcasecmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { if (lhs == NULL) return rhs == NULL; if (rhs == NULL) return false; return posix::StrCaseCmp(lhs, rhs) == 0; } // Compares two wide C strings, ignoring case. Returns true iff they // have the same content. // // Unlike wcscasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL wide C string, // including the empty string. // NB: The implementations on different platforms slightly differ. // On windows, this method uses _wcsicmp which compares according to LC_CTYPE // environment variable. On GNU platform this method uses wcscasecmp // which compares according to LC_CTYPE category of the current locale. // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the // current locale. bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs, const wchar_t* rhs) { if (lhs == NULL) return rhs == NULL; if (rhs == NULL) return false; #if GTEST_OS_WINDOWS return _wcsicmp(lhs, rhs) == 0; #elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID return wcscasecmp(lhs, rhs) == 0; #else // Android, Mac OS X and Cygwin don't define wcscasecmp. // Other unknown OSes may not define it either. wint_t left, right; do { left = towlower(*lhs++); right = towlower(*rhs++); } while (left && left == right); return left == right; #endif // OS selector } // Returns true iff str ends with the given suffix, ignoring case. // Any string is considered to end with an empty suffix. bool String::EndsWithCaseInsensitive( const std::string& str, const std::string& suffix) { const size_t str_len = str.length(); const size_t suffix_len = suffix.length(); return (str_len >= suffix_len) && CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len, suffix.c_str()); } // Formats an int value as "%02d". std::string String::FormatIntWidth2(int value) { std::stringstream ss; ss << std::setfill('0') << std::setw(2) << value; return ss.str(); } // Formats an int value as "%X". std::string String::FormatHexInt(int value) { std::stringstream ss; ss << std::hex << std::uppercase << value; return ss.str(); } // Formats a byte as "%02X". std::string String::FormatByte(unsigned char value) { std::stringstream ss; ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase << static_cast(value); return ss.str(); } // Converts the buffer in a stringstream to an std::string, converting NUL // bytes to "\\0" along the way. std::string StringStreamToString(::std::stringstream* ss) { const ::std::string& str = ss->str(); const char* const start = str.c_str(); const char* const end = start + str.length(); std::string result; result.reserve(2 * (end - start)); for (const char* ch = start; ch != end; ++ch) { if (*ch == '\0') { result += "\\0"; // Replaces NUL with "\\0"; } else { result += *ch; } } return result; } // Appends the user-supplied message to the Google-Test-generated message. std::string AppendUserMessage(const std::string& gtest_msg, const Message& user_msg) { // Appends the user message if it's non-empty. const std::string user_msg_string = user_msg.GetString(); if (user_msg_string.empty()) { return gtest_msg; } return gtest_msg + "\n" + user_msg_string; } } // namespace internal // class TestResult // Creates an empty TestResult. TestResult::TestResult() : death_test_count_(0), elapsed_time_(0) { } // D'tor. TestResult::~TestResult() { } // Returns the i-th test part result among all the results. i can // range from 0 to total_part_count() - 1. If i is not in that range, // aborts the program. const TestPartResult& TestResult::GetTestPartResult(int i) const { if (i < 0 || i >= total_part_count()) internal::posix::Abort(); return test_part_results_.at(i); } // Returns the i-th test property. i can range from 0 to // test_property_count() - 1. If i is not in that range, aborts the // program. const TestProperty& TestResult::GetTestProperty(int i) const { if (i < 0 || i >= test_property_count()) internal::posix::Abort(); return test_properties_.at(i); } // Clears the test part results. void TestResult::ClearTestPartResults() { test_part_results_.clear(); } // Adds a test part result to the list. void TestResult::AddTestPartResult(const TestPartResult& test_part_result) { test_part_results_.push_back(test_part_result); } // Adds a test property to the list. If a property with the same key as the // supplied property is already represented, the value of this test_property // replaces the old value for that key. void TestResult::RecordProperty(const std::string& xml_element, const TestProperty& test_property) { if (!ValidateTestProperty(xml_element, test_property)) { return; } internal::MutexLock lock(&test_properites_mutex_); const std::vector::iterator property_with_matching_key = std::find_if(test_properties_.begin(), test_properties_.end(), internal::TestPropertyKeyIs(test_property.key())); if (property_with_matching_key == test_properties_.end()) { test_properties_.push_back(test_property); return; } property_with_matching_key->SetValue(test_property.value()); } // The list of reserved attributes used in the element of XML // output. static const char* const kReservedTestSuitesAttributes[] = { "disabled", "errors", "failures", "name", "random_seed", "tests", "time", "timestamp" }; // The list of reserved attributes used in the element of XML // output. static const char* const kReservedTestSuiteAttributes[] = { "disabled", "errors", "failures", "name", "tests", "time" }; // The list of reserved attributes used in the element of XML output. static const char* const kReservedTestCaseAttributes[] = { "classname", "name", "status", "time", "type_param", "value_param" }; template std::vector ArrayAsVector(const char* const (&array)[kSize]) { return std::vector(array, array + kSize); } static std::vector GetReservedAttributesForElement( const std::string& xml_element) { if (xml_element == "testsuites") { return ArrayAsVector(kReservedTestSuitesAttributes); } else if (xml_element == "testsuite") { return ArrayAsVector(kReservedTestSuiteAttributes); } else if (xml_element == "testcase") { return ArrayAsVector(kReservedTestCaseAttributes); } else { GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element; } // This code is unreachable but some compilers may not realizes that. return std::vector(); } static std::string FormatWordList(const std::vector& words) { Message word_list; for (size_t i = 0; i < words.size(); ++i) { if (i > 0 && words.size() > 2) { word_list << ", "; } if (i == words.size() - 1) { word_list << "and "; } word_list << "'" << words[i] << "'"; } return word_list.GetString(); } bool ValidateTestPropertyName(const std::string& property_name, const std::vector& reserved_names) { if (std::find(reserved_names.begin(), reserved_names.end(), property_name) != reserved_names.end()) { ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name << " (" << FormatWordList(reserved_names) << " are reserved by " << GTEST_NAME_ << ")"; return false; } return true; } // Adds a failure if the key is a reserved attribute of the element named // xml_element. Returns true if the property is valid. bool TestResult::ValidateTestProperty(const std::string& xml_element, const TestProperty& test_property) { return ValidateTestPropertyName(test_property.key(), GetReservedAttributesForElement(xml_element)); } // Clears the object. void TestResult::Clear() { test_part_results_.clear(); test_properties_.clear(); death_test_count_ = 0; elapsed_time_ = 0; } // Returns true iff the test failed. bool TestResult::Failed() const { for (int i = 0; i < total_part_count(); ++i) { if (GetTestPartResult(i).failed()) return true; } return false; } // Returns true iff the test part fatally failed. static bool TestPartFatallyFailed(const TestPartResult& result) { return result.fatally_failed(); } // Returns true iff the test fatally failed. bool TestResult::HasFatalFailure() const { return CountIf(test_part_results_, TestPartFatallyFailed) > 0; } // Returns true iff the test part non-fatally failed. static bool TestPartNonfatallyFailed(const TestPartResult& result) { return result.nonfatally_failed(); } // Returns true iff the test has a non-fatal failure. bool TestResult::HasNonfatalFailure() const { return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0; } // Gets the number of all test parts. This is the sum of the number // of successful test parts and the number of failed test parts. int TestResult::total_part_count() const { return static_cast(test_part_results_.size()); } // Returns the number of the test properties. int TestResult::test_property_count() const { return static_cast(test_properties_.size()); } // class Test // Creates a Test object. // The c'tor saves the values of all Google Test flags. Test::Test() : gtest_flag_saver_(new internal::GTestFlagSaver) { } // The d'tor restores the values of all Google Test flags. Test::~Test() { delete gtest_flag_saver_; } // Sets up the test fixture. // // A sub-class may override this. void Test::SetUp() { } // Tears down the test fixture. // // A sub-class may override this. void Test::TearDown() { } // Allows user supplied key value pairs to be recorded for later output. void Test::RecordProperty(const std::string& key, const std::string& value) { UnitTest::GetInstance()->RecordProperty(key, value); } // Allows user supplied key value pairs to be recorded for later output. void Test::RecordProperty(const std::string& key, int value) { Message value_message; value_message << value; RecordProperty(key, value_message.GetString().c_str()); } namespace internal { void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const std::string& message) { // This function is a friend of UnitTest and as such has access to // AddTestPartResult. UnitTest::GetInstance()->AddTestPartResult( result_type, NULL, // No info about the source file where the exception occurred. -1, // We have no info on which line caused the exception. message, ""); // No stack trace, either. } } // namespace internal // Google Test requires all tests in the same test case to use the same test // fixture class. This function checks if the current test has the // same fixture class as the first test in the current test case. If // yes, it returns true; otherwise it generates a Google Test failure and // returns false. bool Test::HasSameFixtureClass() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); const TestCase* const test_case = impl->current_test_case(); // Info about the first test in the current test case. const TestInfo* const first_test_info = test_case->test_info_list()[0]; const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_; const char* const first_test_name = first_test_info->name(); // Info about the current test. const TestInfo* const this_test_info = impl->current_test_info(); const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_; const char* const this_test_name = this_test_info->name(); if (this_fixture_id != first_fixture_id) { // Is the first test defined using TEST? const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId(); // Is this test defined using TEST? const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId(); if (first_is_TEST || this_is_TEST) { // The user mixed TEST and TEST_F in this test case - we'll tell // him/her how to fix it. // Gets the name of the TEST and the name of the TEST_F. Note // that first_is_TEST and this_is_TEST cannot both be true, as // the fixture IDs are different for the two tests. const char* const TEST_name = first_is_TEST ? first_test_name : this_test_name; const char* const TEST_F_name = first_is_TEST ? this_test_name : first_test_name; ADD_FAILURE() << "All tests in the same test case must use the same test fixture\n" << "class, so mixing TEST_F and TEST in the same test case is\n" << "illegal. In test case " << this_test_info->test_case_name() << ",\n" << "test " << TEST_F_name << " is defined using TEST_F but\n" << "test " << TEST_name << " is defined using TEST. You probably\n" << "want to change the TEST to TEST_F or move it to another test\n" << "case."; } else { // The user defined two fixture classes with the same name in // two namespaces - we'll tell him/her how to fix it. ADD_FAILURE() << "All tests in the same test case must use the same test fixture\n" << "class. However, in test case " << this_test_info->test_case_name() << ",\n" << "you defined test " << first_test_name << " and test " << this_test_name << "\n" << "using two different test fixture classes. This can happen if\n" << "the two classes are from different namespaces or translation\n" << "units and have the same name. You should probably rename one\n" << "of the classes to put the tests into different test cases."; } return false; } return true; } #if GTEST_HAS_SEH // Adds an "exception thrown" fatal failure to the current test. This // function returns its result via an output parameter pointer because VC++ // prohibits creation of objects with destructors on stack in functions // using __try (see error C2712). static std::string* FormatSehExceptionMessage(DWORD exception_code, const char* location) { Message message; message << "SEH exception with code 0x" << std::setbase(16) << exception_code << std::setbase(10) << " thrown in " << location << "."; return new std::string(message.GetString()); } #endif // GTEST_HAS_SEH namespace internal { #if GTEST_HAS_EXCEPTIONS // Adds an "exception thrown" fatal failure to the current test. static std::string FormatCxxExceptionMessage(const char* description, const char* location) { Message message; if (description != NULL) { message << "C++ exception with description \"" << description << "\""; } else { message << "Unknown C++ exception"; } message << " thrown in " << location << "."; return message.GetString(); } static std::string PrintTestPartResultToString( const TestPartResult& test_part_result); GoogleTestFailureException::GoogleTestFailureException( const TestPartResult& failure) : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {} #endif // GTEST_HAS_EXCEPTIONS // We put these helper functions in the internal namespace as IBM's xlC // compiler rejects the code if they were declared static. // Runs the given method and handles SEH exceptions it throws, when // SEH is supported; returns the 0-value for type Result in case of an // SEH exception. (Microsoft compilers cannot handle SEH and C++ // exceptions in the same function. Therefore, we provide a separate // wrapper function for handling SEH exceptions.) template Result HandleSehExceptionsInMethodIfSupported( T* object, Result (T::*method)(), const char* location) { #if GTEST_HAS_SEH __try { return (object->*method)(); } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT GetExceptionCode())) { // We create the exception message on the heap because VC++ prohibits // creation of objects with destructors on stack in functions using __try // (see error C2712). std::string* exception_message = FormatSehExceptionMessage( GetExceptionCode(), location); internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure, *exception_message); delete exception_message; return static_cast(0); } #else (void)location; return (object->*method)(); #endif // GTEST_HAS_SEH } // Runs the given method and catches and reports C++ and/or SEH-style // exceptions, if they are supported; returns the 0-value for type // Result in case of an SEH exception. template Result HandleExceptionsInMethodIfSupported( T* object, Result (T::*method)(), const char* location) { // NOTE: The user code can affect the way in which Google Test handles // exceptions by setting GTEST_FLAG(catch_exceptions), but only before // RUN_ALL_TESTS() starts. It is technically possible to check the flag // after the exception is caught and either report or re-throw the // exception based on the flag's value: // // try { // // Perform the test method. // } catch (...) { // if (GTEST_FLAG(catch_exceptions)) // // Report the exception as failure. // else // throw; // Re-throws the original exception. // } // // However, the purpose of this flag is to allow the program to drop into // the debugger when the exception is thrown. On most platforms, once the // control enters the catch block, the exception origin information is // lost and the debugger will stop the program at the point of the // re-throw in this function -- instead of at the point of the original // throw statement in the code under test. For this reason, we perform // the check early, sacrificing the ability to affect Google Test's // exception handling in the method where the exception is thrown. if (internal::GetUnitTestImpl()->catch_exceptions()) { #if GTEST_HAS_EXCEPTIONS try { return HandleSehExceptionsInMethodIfSupported(object, method, location); } catch (const internal::GoogleTestFailureException&) { // NOLINT // This exception type can only be thrown by a failed Google // Test assertion with the intention of letting another testing // framework catch it. Therefore we just re-throw it. throw; } catch (const std::exception& e) { // NOLINT internal::ReportFailureInUnknownLocation( TestPartResult::kFatalFailure, FormatCxxExceptionMessage(e.what(), location)); } catch (...) { // NOLINT internal::ReportFailureInUnknownLocation( TestPartResult::kFatalFailure, FormatCxxExceptionMessage(NULL, location)); } return static_cast(0); #else return HandleSehExceptionsInMethodIfSupported(object, method, location); #endif // GTEST_HAS_EXCEPTIONS } else { return (object->*method)(); } } } // namespace internal // Runs the test and updates the test result. void Test::Run() { if (!HasSameFixtureClass()) return; internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()"); // We will run the test only if SetUp() was successful. if (!HasFatalFailure()) { impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &Test::TestBody, "the test body"); } // However, we want to clean up as much as possible. Hence we will // always call TearDown(), even if SetUp() or the test body has // failed. impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &Test::TearDown, "TearDown()"); } // Returns true iff the current test has a fatal failure. bool Test::HasFatalFailure() { return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); } // Returns true iff the current test has a non-fatal failure. bool Test::HasNonfatalFailure() { return internal::GetUnitTestImpl()->current_test_result()-> HasNonfatalFailure(); } // class TestInfo // Constructs a TestInfo object. It assumes ownership of the test factory // object. TestInfo::TestInfo(const std::string& a_test_case_name, const std::string& a_name, const char* a_type_param, const char* a_value_param, internal::TypeId fixture_class_id, internal::TestFactoryBase* factory) : test_case_name_(a_test_case_name), name_(a_name), type_param_(a_type_param ? new std::string(a_type_param) : NULL), value_param_(a_value_param ? new std::string(a_value_param) : NULL), fixture_class_id_(fixture_class_id), should_run_(false), is_disabled_(false), matches_filter_(false), factory_(factory), result_() {} // Destructs a TestInfo object. TestInfo::~TestInfo() { delete factory_; } namespace internal { // Creates a new TestInfo object and registers it with Google Test; // returns the created object. // // Arguments: // // test_case_name: name of the test case // name: name of the test // type_param: the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // value_param: text representation of the test's value parameter, // or NULL if this is not a value-parameterized test. // fixture_class_id: ID of the test fixture class // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // factory: pointer to the factory that creates a test object. // The newly created TestInfo instance will assume // ownership of the factory object. TestInfo* MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* type_param, const char* value_param, TypeId fixture_class_id, SetUpTestCaseFunc set_up_tc, TearDownTestCaseFunc tear_down_tc, TestFactoryBase* factory) { TestInfo* const test_info = new TestInfo(test_case_name, name, type_param, value_param, fixture_class_id, factory); GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); return test_info; } #if GTEST_HAS_PARAM_TEST void ReportInvalidTestCaseType(const char* test_case_name, const char* file, int line) { Message errors; errors << "Attempted redefinition of test case " << test_case_name << ".\n" << "All tests in the same test case must use the same test fixture\n" << "class. However, in test case " << test_case_name << ", you tried\n" << "to define a test using a fixture class different from the one\n" << "used earlier. This can happen if the two fixture classes are\n" << "from different namespaces and have the same name. You should\n" << "probably rename one of the classes to put the tests into different\n" << "test cases."; fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), errors.GetString().c_str()); } #endif // GTEST_HAS_PARAM_TEST } // namespace internal namespace { // A predicate that checks the test name of a TestInfo against a known // value. // // This is used for implementation of the TestCase class only. We put // it in the anonymous namespace to prevent polluting the outer // namespace. // // TestNameIs is copyable. class TestNameIs { public: // Constructor. // // TestNameIs has NO default constructor. explicit TestNameIs(const char* name) : name_(name) {} // Returns true iff the test name of test_info matches name_. bool operator()(const TestInfo * test_info) const { return test_info && test_info->name() == name_; } private: std::string name_; }; } // namespace namespace internal { // This method expands all parameterized tests registered with macros TEST_P // and INSTANTIATE_TEST_CASE_P into regular tests and registers those. // This will be done just once during the program runtime. void UnitTestImpl::RegisterParameterizedTests() { #if GTEST_HAS_PARAM_TEST if (!parameterized_tests_registered_) { parameterized_test_registry_.RegisterTests(); parameterized_tests_registered_ = true; } #endif } } // namespace internal // Creates the test object, runs it, records its result, and then // deletes it. void TestInfo::Run() { if (!should_run_) return; // Tells UnitTest where to store test result. internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->set_current_test_info(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); // Notifies the unit test event listeners that a test is about to start. repeater->OnTestStart(*this); const TimeInMillis start = internal::GetTimeInMillis(); impl->os_stack_trace_getter()->UponLeavingGTest(); // Creates the test object. Test* const test = internal::HandleExceptionsInMethodIfSupported( factory_, &internal::TestFactoryBase::CreateTest, "the test fixture's constructor"); // Runs the test only if the test object was created and its // constructor didn't generate a fatal failure. if ((test != NULL) && !Test::HasFatalFailure()) { // This doesn't throw as all user code that can throw are wrapped into // exception handling code. test->Run(); } // Deletes the test object. impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( test, &Test::DeleteSelf_, "the test fixture's destructor"); result_.set_elapsed_time(internal::GetTimeInMillis() - start); // Notifies the unit test event listener that a test has just finished. repeater->OnTestEnd(*this); // Tells UnitTest to stop associating assertion results to this // test. impl->set_current_test_info(NULL); } // class TestCase // Gets the number of successful tests in this test case. int TestCase::successful_test_count() const { return CountIf(test_info_list_, TestPassed); } // Gets the number of failed tests in this test case. int TestCase::failed_test_count() const { return CountIf(test_info_list_, TestFailed); } // Gets the number of disabled tests that will be reported in the XML report. int TestCase::reportable_disabled_test_count() const { return CountIf(test_info_list_, TestReportableDisabled); } // Gets the number of disabled tests in this test case. int TestCase::disabled_test_count() const { return CountIf(test_info_list_, TestDisabled); } // Gets the number of tests to be printed in the XML report. int TestCase::reportable_test_count() const { return CountIf(test_info_list_, TestReportable); } // Get the number of tests in this test case that should run. int TestCase::test_to_run_count() const { return CountIf(test_info_list_, ShouldRunTest); } // Gets the number of all tests. int TestCase::total_test_count() const { return static_cast(test_info_list_.size()); } // Creates a TestCase with the given name. // // Arguments: // // name: name of the test case // a_type_param: the name of the test case's type parameter, or NULL if // this is not a typed or a type-parameterized test case. // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase::TestCase(const char* a_name, const char* a_type_param, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc) : name_(a_name), type_param_(a_type_param ? new std::string(a_type_param) : NULL), set_up_tc_(set_up_tc), tear_down_tc_(tear_down_tc), should_run_(false), elapsed_time_(0) { } // Destructor of TestCase. TestCase::~TestCase() { // Deletes every Test in the collection. ForEach(test_info_list_, internal::Delete); } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. const TestInfo* TestCase::GetTestInfo(int i) const { const int index = GetElementOr(test_indices_, i, -1); return index < 0 ? NULL : test_info_list_[index]; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. TestInfo* TestCase::GetMutableTestInfo(int i) { const int index = GetElementOr(test_indices_, i, -1); return index < 0 ? NULL : test_info_list_[index]; } // Adds a test to this test case. Will delete the test upon // destruction of the TestCase object. void TestCase::AddTestInfo(TestInfo * test_info) { test_info_list_.push_back(test_info); test_indices_.push_back(static_cast(test_indices_.size())); } // Runs every test in this TestCase. void TestCase::Run() { if (!should_run_) return; internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->set_current_test_case(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); repeater->OnTestCaseStart(*this); impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestCase::RunSetUpTestCase, "SetUpTestCase()"); const internal::TimeInMillis start = internal::GetTimeInMillis(); for (int i = 0; i < total_test_count(); i++) { GetMutableTestInfo(i)->Run(); } elapsed_time_ = internal::GetTimeInMillis() - start; impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestCase::RunTearDownTestCase, "TearDownTestCase()"); repeater->OnTestCaseEnd(*this); impl->set_current_test_case(NULL); } // Clears the results of all tests in this test case. void TestCase::ClearResult() { ad_hoc_test_result_.Clear(); ForEach(test_info_list_, TestInfo::ClearTestResult); } // Shuffles the tests in this test case. void TestCase::ShuffleTests(internal::Random* random) { Shuffle(random, &test_indices_); } // Restores the test order to before the first shuffle. void TestCase::UnshuffleTests() { for (size_t i = 0; i < test_indices_.size(); i++) { test_indices_[i] = static_cast(i); } } // Formats a countable noun. Depending on its quantity, either the // singular form or the plural form is used. e.g. // // FormatCountableNoun(1, "formula", "formuli") returns "1 formula". // FormatCountableNoun(5, "book", "books") returns "5 books". static std::string FormatCountableNoun(int count, const char * singular_form, const char * plural_form) { return internal::StreamableToString(count) + " " + (count == 1 ? singular_form : plural_form); } // Formats the count of tests. static std::string FormatTestCount(int test_count) { return FormatCountableNoun(test_count, "test", "tests"); } // Formats the count of test cases. static std::string FormatTestCaseCount(int test_case_count) { return FormatCountableNoun(test_case_count, "test case", "test cases"); } // Converts a TestPartResult::Type enum to human-friendly string // representation. Both kNonFatalFailure and kFatalFailure are translated // to "Failure", as the user usually doesn't care about the difference // between the two when viewing the test result. static const char * TestPartResultTypeToString(TestPartResult::Type type) { switch (type) { case TestPartResult::kSuccess: return "Success"; case TestPartResult::kNonFatalFailure: case TestPartResult::kFatalFailure: #ifdef _MSC_VER return "error: "; #else return "Failure\n"; #endif default: return "Unknown result type"; } } namespace internal { // Prints a TestPartResult to an std::string. static std::string PrintTestPartResultToString( const TestPartResult& test_part_result) { return (Message() << internal::FormatFileLocation(test_part_result.file_name(), test_part_result.line_number()) << " " << TestPartResultTypeToString(test_part_result.type()) << test_part_result.message()).GetString(); } // Prints a TestPartResult. static void PrintTestPartResult(const TestPartResult& test_part_result) { const std::string& result = PrintTestPartResultToString(test_part_result); printf("%s\n", result.c_str()); fflush(stdout); // If the test program runs in Visual Studio or a debugger, the // following statements add the test part result message to the Output // window such that the user can double-click on it to jump to the // corresponding source code location; otherwise they do nothing. #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // We don't call OutputDebugString*() on Windows Mobile, as printing // to stdout is done by OutputDebugString() there already - we don't // want the same message printed twice. ::OutputDebugStringA(result.c_str()); ::OutputDebugStringA("\n"); #endif } // class PrettyUnitTestResultPrinter enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW }; #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // Returns the character attribute for the given color. WORD GetColorAttribute(GTestColor color) { switch (color) { case COLOR_RED: return FOREGROUND_RED; case COLOR_GREEN: return FOREGROUND_GREEN; case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; default: return 0; } } #else // Returns the ANSI color code for the given color. COLOR_DEFAULT is // an invalid input. const char* GetAnsiColorCode(GTestColor color) { switch (color) { case COLOR_RED: return "1"; case COLOR_GREEN: return "2"; case COLOR_YELLOW: return "3"; default: return NULL; }; } #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // Returns true iff Google Test should use colors in the output. bool ShouldUseColor(bool stdout_is_tty) { const char* const gtest_color = GTEST_FLAG(color).c_str(); if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { #if GTEST_OS_WINDOWS // On Windows the TERM variable is usually not set, but the // console there does support colors. return stdout_is_tty; #else // On non-Windows platforms, we rely on the TERM variable. const char* const term = posix::GetEnv("TERM"); const bool term_supports_color = String::CStringEquals(term, "xterm") || String::CStringEquals(term, "xterm-color") || String::CStringEquals(term, "xterm-256color") || String::CStringEquals(term, "screen") || String::CStringEquals(term, "screen-256color") || String::CStringEquals(term, "linux") || String::CStringEquals(term, "cygwin"); return stdout_is_tty && term_supports_color; #endif // GTEST_OS_WINDOWS } return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || String::CaseInsensitiveCStringEquals(gtest_color, "true") || String::CaseInsensitiveCStringEquals(gtest_color, "t") || String::CStringEquals(gtest_color, "1"); // We take "yes", "true", "t", and "1" as meaning "yes". If the // value is neither one of these nor "auto", we treat it as "no" to // be conservative. } // Helpers for printing colored strings to stdout. Note that on Windows, we // cannot simply emit special characters and have the terminal change colors. // This routine must actually emit the characters rather than return a string // that would be colored when printed, as can be done on Linux. void ColoredPrintf(GTestColor color, const char* fmt, ...) { va_list args; va_start(args, fmt); #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS const bool use_color = false; #else static const bool in_color_mode = ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); const bool use_color = in_color_mode && (color != COLOR_DEFAULT); #endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS // The '!= 0' comparison is necessary to satisfy MSVC 7.1. if (!use_color) { vprintf(fmt, args); va_end(args); return; } #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); // Gets the current text color. CONSOLE_SCREEN_BUFFER_INFO buffer_info; GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); const WORD old_color_attrs = buffer_info.wAttributes; // We need to flush the stream buffers into the console before each // SetConsoleTextAttribute call lest it affect the text that is already // printed but has not yet reached the console. fflush(stdout); SetConsoleTextAttribute(stdout_handle, GetColorAttribute(color) | FOREGROUND_INTENSITY); vprintf(fmt, args); fflush(stdout); // Restores the text color. SetConsoleTextAttribute(stdout_handle, old_color_attrs); #else printf("\033[0;3%sm", GetAnsiColorCode(color)); vprintf(fmt, args); printf("\033[m"); // Resets the terminal to default. #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE va_end(args); } // Text printed in Google Test's text output and --gunit_list_tests // output to label the type parameter and value parameter for a test. static const char kTypeParamLabel[] = "TypeParam"; static const char kValueParamLabel[] = "GetParam()"; void PrintFullTestCommentIfPresent(const TestInfo& test_info) { const char* const type_param = test_info.type_param(); const char* const value_param = test_info.value_param(); if (type_param != NULL || value_param != NULL) { printf(", where "); if (type_param != NULL) { printf("%s = %s", kTypeParamLabel, type_param); if (value_param != NULL) printf(" and "); } if (value_param != NULL) { printf("%s = %s", kValueParamLabel, value_param); } } } // This class implements the TestEventListener interface. // // Class PrettyUnitTestResultPrinter is copyable. class PrettyUnitTestResultPrinter : public TestEventListener { public: PrettyUnitTestResultPrinter() {} static void PrintTestName(const char * test_case, const char * test) { printf("%s.%s", test_case, test); } // The following methods override what's in the TestEventListener class. virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestCaseStart(const TestCase& test_case); virtual void OnTestStart(const TestInfo& test_info); virtual void OnTestPartResult(const TestPartResult& result); virtual void OnTestEnd(const TestInfo& test_info); virtual void OnTestCaseEnd(const TestCase& test_case); virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} private: static void PrintFailedTests(const UnitTest& unit_test); }; // Fired before each iteration of tests starts. void PrettyUnitTestResultPrinter::OnTestIterationStart( const UnitTest& unit_test, int iteration) { if (GTEST_FLAG(repeat) != 1) printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1); const char* const filter = GTEST_FLAG(filter).c_str(); // Prints the filter if it's not *. This reminds the user that some // tests may be skipped. if (!String::CStringEquals(filter, kUniversalFilter)) { ColoredPrintf(COLOR_YELLOW, "Note: %s filter = %s\n", GTEST_NAME_, filter); } if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1); ColoredPrintf(COLOR_YELLOW, "Note: This is test shard %d of %s.\n", static_cast(shard_index) + 1, internal::posix::GetEnv(kTestTotalShards)); } if (GTEST_FLAG(shuffle)) { ColoredPrintf(COLOR_YELLOW, "Note: Randomizing tests' orders with a seed of %d .\n", unit_test.random_seed()); } ColoredPrintf(COLOR_GREEN, "[==========] "); printf("Running %s from %s.\n", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); fflush(stdout); } void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( const UnitTest& /*unit_test*/) { ColoredPrintf(COLOR_GREEN, "[----------] "); printf("Global test environment set-up.\n"); fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { const std::string counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s", counts.c_str(), test_case.name()); if (test_case.type_param() == NULL) { printf("\n"); } else { printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param()); } fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { ColoredPrintf(COLOR_GREEN, "[ RUN ] "); PrintTestName(test_info.test_case_name(), test_info.name()); printf("\n"); fflush(stdout); } // Called after an assertion failure. void PrettyUnitTestResultPrinter::OnTestPartResult( const TestPartResult& result) { // If the test part succeeded, we don't need to do anything. if (result.type() == TestPartResult::kSuccess) return; // Print failure message from the assertion (e.g. expected this and got that). PrintTestPartResult(result); fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { if (test_info.result()->Passed()) { ColoredPrintf(COLOR_GREEN, "[ OK ] "); } else { ColoredPrintf(COLOR_RED, "[ FAILED ] "); } PrintTestName(test_info.test_case_name(), test_info.name()); if (test_info.result()->Failed()) PrintFullTestCommentIfPresent(test_info); if (GTEST_FLAG(print_time)) { printf(" (%s ms)\n", internal::StreamableToString( test_info.result()->elapsed_time()).c_str()); } else { printf("\n"); } fflush(stdout); } void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { if (!GTEST_FLAG(print_time)) return; const std::string counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_case.name(), internal::StreamableToString(test_case.elapsed_time()).c_str()); fflush(stdout); } void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( const UnitTest& /*unit_test*/) { ColoredPrintf(COLOR_GREEN, "[----------] "); printf("Global test environment tear-down\n"); fflush(stdout); } // Internal helper for printing the list of failed tests. void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { const int failed_test_count = unit_test.failed_test_count(); if (failed_test_count == 0) { return; } for (int i = 0; i < unit_test.total_test_case_count(); ++i) { const TestCase& test_case = *unit_test.GetTestCase(i); if (!test_case.should_run() || (test_case.failed_test_count() == 0)) { continue; } for (int j = 0; j < test_case.total_test_count(); ++j) { const TestInfo& test_info = *test_case.GetTestInfo(j); if (!test_info.should_run() || test_info.result()->Passed()) { continue; } ColoredPrintf(COLOR_RED, "[ FAILED ] "); printf("%s.%s", test_case.name(), test_info.name()); PrintFullTestCommentIfPresent(test_info); printf("\n"); } } } void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { ColoredPrintf(COLOR_GREEN, "[==========] "); printf("%s from %s ran.", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); if (GTEST_FLAG(print_time)) { printf(" (%s ms total)", internal::StreamableToString(unit_test.elapsed_time()).c_str()); } printf("\n"); ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); int num_failures = unit_test.failed_test_count(); if (!unit_test.Passed()) { const int failed_test_count = unit_test.failed_test_count(); ColoredPrintf(COLOR_RED, "[ FAILED ] "); printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); PrintFailedTests(unit_test); printf("\n%2d FAILED %s\n", num_failures, num_failures == 1 ? "TEST" : "TESTS"); } int num_disabled = unit_test.reportable_disabled_test_count(); if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { if (!num_failures) { printf("\n"); // Add a spacer if no FAILURE banner is displayed. } ColoredPrintf(COLOR_YELLOW, " YOU HAVE %d DISABLED %s\n\n", num_disabled, num_disabled == 1 ? "TEST" : "TESTS"); } // Ensure that Google Test output is printed before, e.g., heapchecker output. fflush(stdout); } // End PrettyUnitTestResultPrinter // class TestEventRepeater // // This class forwards events to other event listeners. class TestEventRepeater : public TestEventListener { public: TestEventRepeater() : forwarding_enabled_(true) {} virtual ~TestEventRepeater(); void Append(TestEventListener *listener); TestEventListener* Release(TestEventListener* listener); // Controls whether events will be forwarded to listeners_. Set to false // in death test child processes. bool forwarding_enabled() const { return forwarding_enabled_; } void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; } virtual void OnTestProgramStart(const UnitTest& unit_test); virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test); virtual void OnTestCaseStart(const TestCase& test_case); virtual void OnTestStart(const TestInfo& test_info); virtual void OnTestPartResult(const TestPartResult& result); virtual void OnTestEnd(const TestInfo& test_info); virtual void OnTestCaseEnd(const TestCase& test_case); virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test); virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); virtual void OnTestProgramEnd(const UnitTest& unit_test); private: // Controls whether events will be forwarded to listeners_. Set to false // in death test child processes. bool forwarding_enabled_; // The list of listeners that receive events. std::vector listeners_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater); }; TestEventRepeater::~TestEventRepeater() { ForEach(listeners_, Delete); } void TestEventRepeater::Append(TestEventListener *listener) { listeners_.push_back(listener); } // TODO(vladl@google.com): Factor the search functionality into Vector::Find. TestEventListener* TestEventRepeater::Release(TestEventListener *listener) { for (size_t i = 0; i < listeners_.size(); ++i) { if (listeners_[i] == listener) { listeners_.erase(listeners_.begin() + i); return listener; } } return NULL; } // Since most methods are very similar, use macros to reduce boilerplate. // This defines a member that forwards the call to all listeners. #define GTEST_REPEATER_METHOD_(Name, Type) \ void TestEventRepeater::Name(const Type& parameter) { \ if (forwarding_enabled_) { \ for (size_t i = 0; i < listeners_.size(); i++) { \ listeners_[i]->Name(parameter); \ } \ } \ } // This defines a member that forwards the call to all listeners in reverse // order. #define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ void TestEventRepeater::Name(const Type& parameter) { \ if (forwarding_enabled_) { \ for (int i = static_cast(listeners_.size()) - 1; i >= 0; i--) { \ listeners_[i]->Name(parameter); \ } \ } \ } GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest) GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest) GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase) GTEST_REPEATER_METHOD_(OnTestStart, TestInfo) GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult) GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo) GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase) GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest) #undef GTEST_REPEATER_METHOD_ #undef GTEST_REVERSE_REPEATER_METHOD_ void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test, int iteration) { if (forwarding_enabled_) { for (size_t i = 0; i < listeners_.size(); i++) { listeners_[i]->OnTestIterationStart(unit_test, iteration); } } } void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, int iteration) { if (forwarding_enabled_) { for (int i = static_cast(listeners_.size()) - 1; i >= 0; i--) { listeners_[i]->OnTestIterationEnd(unit_test, iteration); } } } // End TestEventRepeater // This class generates an XML output file. class XmlUnitTestResultPrinter : public EmptyTestEventListener { public: explicit XmlUnitTestResultPrinter(const char* output_file); virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); private: // Is c a whitespace character that is normalized to a space character // when it appears in an XML attribute value? static bool IsNormalizableWhitespace(char c) { return c == 0x9 || c == 0xA || c == 0xD; } // May c appear in a well-formed XML document? static bool IsValidXmlCharacter(char c) { return IsNormalizableWhitespace(c) || c >= 0x20; } // Returns an XML-escaped copy of the input string str. If // is_attribute is true, the text is meant to appear as an attribute // value, and normalizable whitespace is preserved by replacing it // with character references. static std::string EscapeXml(const std::string& str, bool is_attribute); // Returns the given string with all characters invalid in XML removed. static std::string RemoveInvalidXmlCharacters(const std::string& str); // Convenience wrapper around EscapeXml when str is an attribute value. static std::string EscapeXmlAttribute(const std::string& str) { return EscapeXml(str, true); } // Convenience wrapper around EscapeXml when str is not an attribute value. static std::string EscapeXmlText(const char* str) { return EscapeXml(str, false); } // Verifies that the given attribute belongs to the given element and // streams the attribute as XML. static void OutputXmlAttribute(std::ostream* stream, const std::string& element_name, const std::string& name, const std::string& value); // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. static void OutputXmlCDataSection(::std::ostream* stream, const char* data); // Streams an XML representation of a TestInfo object. static void OutputXmlTestInfo(::std::ostream* stream, const char* test_case_name, const TestInfo& test_info); // Prints an XML representation of a TestCase object static void PrintXmlTestCase(::std::ostream* stream, const TestCase& test_case); // Prints an XML summary of unit_test to output stream out. static void PrintXmlUnitTest(::std::ostream* stream, const UnitTest& unit_test); // Produces a string representing the test properties in a result as space // delimited XML attributes based on the property key="value" pairs. // When the std::string is not empty, it includes a space at the beginning, // to delimit this attribute from prior attributes. static std::string TestPropertiesAsXmlAttributes(const TestResult& result); // The output file. const std::string output_file_; GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter); }; // Creates a new XmlUnitTestResultPrinter. XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) : output_file_(output_file) { if (output_file_.c_str() == NULL || output_file_.empty()) { fprintf(stderr, "XML output file may not be null\n"); fflush(stderr); exit(EXIT_FAILURE); } } // Called after the unit test ends. void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { FILE* xmlout = NULL; FilePath output_file(output_file_); FilePath output_dir(output_file.RemoveFileName()); if (output_dir.CreateDirectoriesRecursively()) { xmlout = posix::FOpen(output_file_.c_str(), "w"); } if (xmlout == NULL) { // TODO(wan): report the reason of the failure. // // We don't do it for now as: // // 1. There is no urgent need for it. // 2. It's a bit involved to make the errno variable thread-safe on // all three operating systems (Linux, Windows, and Mac OS). // 3. To interpret the meaning of errno in a thread-safe way, // we need the strerror_r() function, which is not available on // Windows. fprintf(stderr, "Unable to open file \"%s\"\n", output_file_.c_str()); fflush(stderr); exit(EXIT_FAILURE); } std::stringstream stream; PrintXmlUnitTest(&stream, unit_test); fprintf(xmlout, "%s", StringStreamToString(&stream).c_str()); fclose(xmlout); } // Returns an XML-escaped copy of the input string str. If is_attribute // is true, the text is meant to appear as an attribute value, and // normalizable whitespace is preserved by replacing it with character // references. // // Invalid XML characters in str, if any, are stripped from the output. // It is expected that most, if not all, of the text processed by this // module will consist of ordinary English text. // If this module is ever modified to produce version 1.1 XML output, // most invalid characters can be retained using character references. // TODO(wan): It might be nice to have a minimally invasive, human-readable // escaping scheme for invalid characters, rather than dropping them. std::string XmlUnitTestResultPrinter::EscapeXml( const std::string& str, bool is_attribute) { Message m; for (size_t i = 0; i < str.size(); ++i) { const char ch = str[i]; switch (ch) { case '<': m << "<"; break; case '>': m << ">"; break; case '&': m << "&"; break; case '\'': if (is_attribute) m << "'"; else m << '\''; break; case '"': if (is_attribute) m << """; else m << '"'; break; default: if (IsValidXmlCharacter(ch)) { if (is_attribute && IsNormalizableWhitespace(ch)) m << "&#x" << String::FormatByte(static_cast(ch)) << ";"; else m << ch; } break; } } return m.GetString(); } // Returns the given string with all characters invalid in XML removed. // Currently invalid characters are dropped from the string. An // alternative is to replace them with certain characters such as . or ?. std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters( const std::string& str) { std::string output; output.reserve(str.size()); for (std::string::const_iterator it = str.begin(); it != str.end(); ++it) if (IsValidXmlCharacter(*it)) output.push_back(*it); return output; } // The following routines generate an XML representation of a UnitTest // object. // // This is how Google Test concepts map to the DTD: // // <-- corresponds to a UnitTest object // <-- corresponds to a TestCase object // <-- corresponds to a TestInfo object // ... // ... // ... // <-- individual assertion failures // // // // Formats the given time in milliseconds as seconds. std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { ::std::stringstream ss; ss << ms/1000.0; return ss.str(); } // Converts the given epoch time in milliseconds to a date string in the ISO // 8601 format, without the timezone information. std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) { // Using non-reentrant version as localtime_r is not portable. time_t seconds = static_cast(ms / 1000); #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4996) // Temporarily disables warning 4996 // (function or variable may be unsafe). const struct tm* const time_struct = localtime(&seconds); // NOLINT # pragma warning(pop) // Restores the warning state again. #else const struct tm* const time_struct = localtime(&seconds); // NOLINT #endif if (time_struct == NULL) return ""; // Invalid ms value // YYYY-MM-DDThh:mm:ss return StreamableToString(time_struct->tm_year + 1900) + "-" + String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" + String::FormatIntWidth2(time_struct->tm_mday) + "T" + String::FormatIntWidth2(time_struct->tm_hour) + ":" + String::FormatIntWidth2(time_struct->tm_min) + ":" + String::FormatIntWidth2(time_struct->tm_sec); } // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, const char* data) { const char* segment = data; *stream << ""); if (next_segment != NULL) { stream->write( segment, static_cast(next_segment - segment)); *stream << "]]>]]>"); } else { *stream << segment; break; } } *stream << "]]>"; } void XmlUnitTestResultPrinter::OutputXmlAttribute( std::ostream* stream, const std::string& element_name, const std::string& name, const std::string& value) { const std::vector& allowed_names = GetReservedAttributesForElement(element_name); GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) != allowed_names.end()) << "Attribute " << name << " is not allowed for element <" << element_name << ">."; *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\""; } // Prints an XML representation of a TestInfo object. // TODO(wan): There is also value in printing properties with the plain printer. void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, const char* test_case_name, const TestInfo& test_info) { const TestResult& result = *test_info.result(); const std::string kTestcase = "testcase"; *stream << " \n"; } const string location = internal::FormatCompilerIndependentFileLocation( part.file_name(), part.line_number()); const string summary = location + "\n" + part.summary(); *stream << " "; const string detail = location + "\n" + part.message(); OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str()); *stream << "\n"; } } if (failures == 0) *stream << " />\n"; else *stream << " \n"; } // Prints an XML representation of a TestCase object void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream, const TestCase& test_case) { const std::string kTestsuite = "testsuite"; *stream << " <" << kTestsuite; OutputXmlAttribute(stream, kTestsuite, "name", test_case.name()); OutputXmlAttribute(stream, kTestsuite, "tests", StreamableToString(test_case.reportable_test_count())); OutputXmlAttribute(stream, kTestsuite, "failures", StreamableToString(test_case.failed_test_count())); OutputXmlAttribute( stream, kTestsuite, "disabled", StreamableToString(test_case.reportable_disabled_test_count())); OutputXmlAttribute(stream, kTestsuite, "errors", "0"); OutputXmlAttribute(stream, kTestsuite, "time", FormatTimeInMillisAsSeconds(test_case.elapsed_time())); *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result()) << ">\n"; for (int i = 0; i < test_case.total_test_count(); ++i) { if (test_case.GetTestInfo(i)->is_reportable()) OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i)); } *stream << " \n"; } // Prints an XML summary of unit_test to output stream out. void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream, const UnitTest& unit_test) { const std::string kTestsuites = "testsuites"; *stream << "\n"; *stream << "<" << kTestsuites; OutputXmlAttribute(stream, kTestsuites, "tests", StreamableToString(unit_test.reportable_test_count())); OutputXmlAttribute(stream, kTestsuites, "failures", StreamableToString(unit_test.failed_test_count())); OutputXmlAttribute( stream, kTestsuites, "disabled", StreamableToString(unit_test.reportable_disabled_test_count())); OutputXmlAttribute(stream, kTestsuites, "errors", "0"); OutputXmlAttribute( stream, kTestsuites, "timestamp", FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp())); OutputXmlAttribute(stream, kTestsuites, "time", FormatTimeInMillisAsSeconds(unit_test.elapsed_time())); if (GTEST_FLAG(shuffle)) { OutputXmlAttribute(stream, kTestsuites, "random_seed", StreamableToString(unit_test.random_seed())); } *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result()); OutputXmlAttribute(stream, kTestsuites, "name", "AllTests"); *stream << ">\n"; for (int i = 0; i < unit_test.total_test_case_count(); ++i) { if (unit_test.GetTestCase(i)->reportable_test_count() > 0) PrintXmlTestCase(stream, *unit_test.GetTestCase(i)); } *stream << "\n"; } // Produces a string representing the test properties in a result as space // delimited XML attributes based on the property key="value" pairs. std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( const TestResult& result) { Message attributes; for (int i = 0; i < result.test_property_count(); ++i) { const TestProperty& property = result.GetTestProperty(i); attributes << " " << property.key() << "=" << "\"" << EscapeXmlAttribute(property.value()) << "\""; } return attributes.GetString(); } // End XmlUnitTestResultPrinter #if GTEST_CAN_STREAM_RESULTS_ // Checks if str contains '=', '&', '%' or '\n' characters. If yes, // replaces them by "%xx" where xx is their hexadecimal value. For // example, replaces "=" with "%3D". This algorithm is O(strlen(str)) // in both time and space -- important as the input str may contain an // arbitrarily long test failure message and stack trace. string StreamingListener::UrlEncode(const char* str) { string result; result.reserve(strlen(str) + 1); for (char ch = *str; ch != '\0'; ch = *++str) { switch (ch) { case '%': case '=': case '&': case '\n': result.append("%" + String::FormatByte(static_cast(ch))); break; default: result.push_back(ch); break; } } return result; } void StreamingListener::SocketWriter::MakeConnection() { GTEST_CHECK_(sockfd_ == -1) << "MakeConnection() can't be called when there is already a connection."; addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses. hints.ai_socktype = SOCK_STREAM; addrinfo* servinfo = NULL; // Use the getaddrinfo() to get a linked list of IP addresses for // the given host name. const int error_num = getaddrinfo( host_name_.c_str(), port_num_.c_str(), &hints, &servinfo); if (error_num != 0) { GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: " << gai_strerror(error_num); } // Loop through all the results and connect to the first we can. for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL; cur_addr = cur_addr->ai_next) { sockfd_ = socket( cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol); if (sockfd_ != -1) { // Connect the client socket to the server socket. if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) { close(sockfd_); sockfd_ = -1; } } } freeaddrinfo(servinfo); // all done with this structure if (sockfd_ == -1) { GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to " << host_name_ << ":" << port_num_; } } // End of class Streaming Listener #endif // GTEST_CAN_STREAM_RESULTS__ // Class ScopedTrace // Pushes the given source file location and message onto a per-thread // trace stack maintained by Google Test. ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) { TraceInfo trace; trace.file = file; trace.line = line; trace.message = message.GetString(); UnitTest::GetInstance()->PushGTestTrace(trace); } // Pops the info pushed by the c'tor. ScopedTrace::~ScopedTrace() GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) { UnitTest::GetInstance()->PopGTestTrace(); } // class OsStackTraceGetter // Returns the current OS stack trace as an std::string. Parameters: // // max_depth - the maximum number of stack frames to be included // in the trace. // skip_count - the number of top frames to be skipped; doesn't count // against max_depth. // string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */, int /* skip_count */) GTEST_LOCK_EXCLUDED_(mutex_) { return ""; } void OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) { } const char* const OsStackTraceGetter::kElidedFramesMarker = "... " GTEST_NAME_ " internal frames ..."; // A helper class that creates the premature-exit file in its // constructor and deletes the file in its destructor. class ScopedPrematureExitFile { public: explicit ScopedPrematureExitFile(const char* premature_exit_filepath) : premature_exit_filepath_(premature_exit_filepath) { // If a path to the premature-exit file is specified... if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') { // create the file with a single "0" character in it. I/O // errors are ignored as there's nothing better we can do and we // don't want to fail the test because of this. FILE* pfile = posix::FOpen(premature_exit_filepath, "w"); fwrite("0", 1, 1, pfile); fclose(pfile); } } ~ScopedPrematureExitFile() { if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') { remove(premature_exit_filepath_); } } private: const char* const premature_exit_filepath_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile); }; } // namespace internal // class TestEventListeners TestEventListeners::TestEventListeners() : repeater_(new internal::TestEventRepeater()), default_result_printer_(NULL), default_xml_generator_(NULL) { } TestEventListeners::~TestEventListeners() { delete repeater_; } // Returns the standard listener responsible for the default console // output. Can be removed from the listeners list to shut down default // console output. Note that removing this object from the listener list // with Release transfers its ownership to the user. void TestEventListeners::Append(TestEventListener* listener) { repeater_->Append(listener); } // Removes the given event listener from the list and returns it. It then // becomes the caller's responsibility to delete the listener. Returns // NULL if the listener is not found in the list. TestEventListener* TestEventListeners::Release(TestEventListener* listener) { if (listener == default_result_printer_) default_result_printer_ = NULL; else if (listener == default_xml_generator_) default_xml_generator_ = NULL; return repeater_->Release(listener); } // Returns repeater that broadcasts the TestEventListener events to all // subscribers. TestEventListener* TestEventListeners::repeater() { return repeater_; } // Sets the default_result_printer attribute to the provided listener. // The listener is also added to the listener list and previous // default_result_printer is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) { if (default_result_printer_ != listener) { // It is an error to pass this method a listener that is already in the // list. delete Release(default_result_printer_); default_result_printer_ = listener; if (listener != NULL) Append(listener); } } // Sets the default_xml_generator attribute to the provided listener. The // listener is also added to the listener list and previous // default_xml_generator is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) { if (default_xml_generator_ != listener) { // It is an error to pass this method a listener that is already in the // list. delete Release(default_xml_generator_); default_xml_generator_ = listener; if (listener != NULL) Append(listener); } } // Controls whether events will be forwarded by the repeater to the // listeners in the list. bool TestEventListeners::EventForwardingEnabled() const { return repeater_->forwarding_enabled(); } void TestEventListeners::SuppressEventForwarding() { repeater_->set_forwarding_enabled(false); } // class UnitTest // Gets the singleton UnitTest object. The first time this method is // called, a UnitTest object is constructed and returned. Consecutive // calls will return the same object. // // We don't protect this under mutex_ as a user is not supposed to // call this before main() starts, from which point on the return // value will never change. UnitTest* UnitTest::GetInstance() { // When compiled with MSVC 7.1 in optimized mode, destroying the // UnitTest object upon exiting the program messes up the exit code, // causing successful tests to appear failed. We have to use a // different implementation in this case to bypass the compiler bug. // This implementation makes the compiler happy, at the cost of // leaking the UnitTest object. // CodeGear C++Builder insists on a public destructor for the // default implementation. Use this implementation to keep good OO // design with private destructor. #if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) static UnitTest* const instance = new UnitTest; return instance; #else static UnitTest instance; return &instance; #endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) } // Gets the number of successful test cases. int UnitTest::successful_test_case_count() const { return impl()->successful_test_case_count(); } // Gets the number of failed test cases. int UnitTest::failed_test_case_count() const { return impl()->failed_test_case_count(); } // Gets the number of all test cases. int UnitTest::total_test_case_count() const { return impl()->total_test_case_count(); } // Gets the number of all test cases that contain at least one test // that should run. int UnitTest::test_case_to_run_count() const { return impl()->test_case_to_run_count(); } // Gets the number of successful tests. int UnitTest::successful_test_count() const { return impl()->successful_test_count(); } // Gets the number of failed tests. int UnitTest::failed_test_count() const { return impl()->failed_test_count(); } // Gets the number of disabled tests that will be reported in the XML report. int UnitTest::reportable_disabled_test_count() const { return impl()->reportable_disabled_test_count(); } // Gets the number of disabled tests. int UnitTest::disabled_test_count() const { return impl()->disabled_test_count(); } // Gets the number of tests to be printed in the XML report. int UnitTest::reportable_test_count() const { return impl()->reportable_test_count(); } // Gets the number of all tests. int UnitTest::total_test_count() const { return impl()->total_test_count(); } // Gets the number of tests that should run. int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); } // Gets the time of the test program start, in ms from the start of the // UNIX epoch. internal::TimeInMillis UnitTest::start_timestamp() const { return impl()->start_timestamp(); } // Gets the elapsed time, in milliseconds. internal::TimeInMillis UnitTest::elapsed_time() const { return impl()->elapsed_time(); } // Returns true iff the unit test passed (i.e. all test cases passed). bool UnitTest::Passed() const { return impl()->Passed(); } // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool UnitTest::Failed() const { return impl()->Failed(); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* UnitTest::GetTestCase(int i) const { return impl()->GetTestCase(i); } // Returns the TestResult containing information on test failures and // properties logged outside of individual test cases. const TestResult& UnitTest::ad_hoc_test_result() const { return *impl()->ad_hoc_test_result(); } // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* UnitTest::GetMutableTestCase(int i) { return impl()->GetMutableTestCase(i); } // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& UnitTest::listeners() { return *impl()->listeners(); } // Registers and returns a global test environment. When a test // program is run, all global test environments will be set-up in the // order they were registered. After all tests in the program have // finished, all global test environments will be torn-down in the // *reverse* order they were registered. // // The UnitTest object takes ownership of the given environment. // // We don't protect this under mutex_, as we only support calling it // from the main thread. Environment* UnitTest::AddEnvironment(Environment* env) { if (env == NULL) { return NULL; } impl_->environments().push_back(env); return env; } // Adds a TestPartResult to the current TestResult object. All Google Test // assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call // this to report their results. The user code should use the // assertion macros instead of calling this directly. void UnitTest::AddTestPartResult( TestPartResult::Type result_type, const char* file_name, int line_number, const std::string& message, const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) { Message msg; msg << message; internal::MutexLock lock(&mutex_); if (impl_->gtest_trace_stack().size() > 0) { msg << "\n" << GTEST_NAME_ << " trace:"; for (int i = static_cast(impl_->gtest_trace_stack().size()); i > 0; --i) { const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) << " " << trace.message; } } if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) { msg << internal::kStackTraceMarker << os_stack_trace; } const TestPartResult result = TestPartResult(result_type, file_name, line_number, msg.GetString().c_str()); impl_->GetTestPartResultReporterForCurrentThread()-> ReportTestPartResult(result); if (result_type != TestPartResult::kSuccess) { // gtest_break_on_failure takes precedence over // gtest_throw_on_failure. This allows a user to set the latter // in the code (perhaps in order to use Google Test assertions // with another testing framework) and specify the former on the // command line for debugging. if (GTEST_FLAG(break_on_failure)) { #if GTEST_OS_WINDOWS // Using DebugBreak on Windows allows gtest to still break into a debugger // when a failure happens and both the --gtest_break_on_failure and // the --gtest_catch_exceptions flags are specified. DebugBreak(); #else // Dereference NULL through a volatile pointer to prevent the compiler // from removing. We use this rather than abort() or __builtin_trap() for // portability: Symbian doesn't implement abort() well, and some debuggers // don't correctly trap abort(). *static_cast(NULL) = 1; #endif // GTEST_OS_WINDOWS } else if (GTEST_FLAG(throw_on_failure)) { #if GTEST_HAS_EXCEPTIONS throw internal::GoogleTestFailureException(result); #else // We cannot call abort() as it generates a pop-up in debug mode // that cannot be suppressed in VC 7.1 or below. exit(1); #endif } } } // Adds a TestProperty to the current TestResult object when invoked from // inside a test, to current TestCase's ad_hoc_test_result_ when invoked // from SetUpTestCase or TearDownTestCase, or to the global property set // when invoked elsewhere. If the result already contains a property with // the same key, the value will be updated. void UnitTest::RecordProperty(const std::string& key, const std::string& value) { impl_->RecordProperty(TestProperty(key, value)); } // Runs all tests in this UnitTest object and prints the result. // Returns 0 if successful, or 1 otherwise. // // We don't protect this under mutex_, as we only support calling it // from the main thread. int UnitTest::Run() { const bool in_death_test_child_process = internal::GTEST_FLAG(internal_run_death_test).length() > 0; // Google Test implements this protocol for catching that a test // program exits before returning control to Google Test: // // 1. Upon start, Google Test creates a file whose absolute path // is specified by the environment variable // TEST_PREMATURE_EXIT_FILE. // 2. When Google Test has finished its work, it deletes the file. // // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before // running a Google-Test-based test program and check the existence // of the file at the end of the test execution to see if it has // exited prematurely. // If we are in the child process of a death test, don't // create/delete the premature exit file, as doing so is unnecessary // and will confuse the parent process. Otherwise, create/delete // the file upon entering/leaving this function. If the program // somehow exits before this function has a chance to return, the // premature-exit file will be left undeleted, causing a test runner // that understands the premature-exit-file protocol to report the // test as having failed. const internal::ScopedPrematureExitFile premature_exit_file( in_death_test_child_process ? NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE")); // Captures the value of GTEST_FLAG(catch_exceptions). This value will be // used for the duration of the program. impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions)); #if GTEST_HAS_SEH // Either the user wants Google Test to catch exceptions thrown by the // tests or this is executing in the context of death test child // process. In either case the user does not want to see pop-up dialogs // about crashes - they are expected. if (impl()->catch_exceptions() || in_death_test_child_process) { # if !GTEST_OS_WINDOWS_MOBILE // SetErrorMode doesn't exist on CE. SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); # endif // !GTEST_OS_WINDOWS_MOBILE # if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE // Death test children can be terminated with _abort(). On Windows, // _abort() can show a dialog with a warning message. This forces the // abort message to go to stderr instead. _set_error_mode(_OUT_TO_STDERR); # endif # if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE // In the debug version, Visual Studio pops up a separate dialog // offering a choice to debug the aborted program. We need to suppress // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement // executed. Google Test will notify the user of any unexpected // failure via stderr. // // VC++ doesn't define _set_abort_behavior() prior to the version 8.0. // Users of prior VC versions shall suffer the agony and pain of // clicking through the countless debug dialogs. // TODO(vladl@google.com): find a way to suppress the abort dialog() in the // debug mode when compiled with VC 7.1 or lower. if (!GTEST_FLAG(break_on_failure)) _set_abort_behavior( 0x0, // Clear the following flags: _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. # endif } #endif // GTEST_HAS_SEH return internal::HandleExceptionsInMethodIfSupported( impl(), &internal::UnitTestImpl::RunAllTests, "auxiliary test code (environments or event listeners)") ? 0 : 1; } // Returns the working directory when the first TEST() or TEST_F() was // executed. const char* UnitTest::original_working_dir() const { return impl_->original_working_dir_.c_str(); } // Returns the TestCase object for the test that's currently running, // or NULL if no test is running. const TestCase* UnitTest::current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); return impl_->current_test_case(); } // Returns the TestInfo object for the test that's currently running, // or NULL if no test is running. const TestInfo* UnitTest::current_test_info() const GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); return impl_->current_test_info(); } // Returns the random seed used at the start of the current test run. int UnitTest::random_seed() const { return impl_->random_seed(); } #if GTEST_HAS_PARAM_TEST // Returns ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. internal::ParameterizedTestCaseRegistry& UnitTest::parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_) { return impl_->parameterized_test_registry(); } #endif // GTEST_HAS_PARAM_TEST // Creates an empty UnitTest. UnitTest::UnitTest() { impl_ = new internal::UnitTestImpl(this); } // Destructor of UnitTest. UnitTest::~UnitTest() { delete impl_; } // Pushes a trace defined by SCOPED_TRACE() on to the per-thread // Google Test trace stack. void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); impl_->gtest_trace_stack().push_back(trace); } // Pops a trace from the per-thread Google Test trace stack. void UnitTest::PopGTestTrace() GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); impl_->gtest_trace_stack().pop_back(); } namespace internal { UnitTestImpl::UnitTestImpl(UnitTest* parent) : parent_(parent), #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4355) // Temporarily disables warning 4355 // (using this in initializer). default_global_test_part_result_reporter_(this), default_per_thread_test_part_result_reporter_(this), # pragma warning(pop) // Restores the warning state again. #else default_global_test_part_result_reporter_(this), default_per_thread_test_part_result_reporter_(this), #endif // _MSC_VER global_test_part_result_repoter_( &default_global_test_part_result_reporter_), per_thread_test_part_result_reporter_( &default_per_thread_test_part_result_reporter_), #if GTEST_HAS_PARAM_TEST parameterized_test_registry_(), parameterized_tests_registered_(false), #endif // GTEST_HAS_PARAM_TEST last_death_test_case_(-1), current_test_case_(NULL), current_test_info_(NULL), ad_hoc_test_result_(), os_stack_trace_getter_(NULL), post_flag_parse_init_performed_(false), random_seed_(0), // Will be overridden by the flag before first use. random_(0), // Will be reseeded before first use. start_timestamp_(0), elapsed_time_(0), #if GTEST_HAS_DEATH_TEST death_test_factory_(new DefaultDeathTestFactory), #endif // Will be overridden by the flag before first use. catch_exceptions_(false) { listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter); } UnitTestImpl::~UnitTestImpl() { // Deletes every TestCase. ForEach(test_cases_, internal::Delete); // Deletes every Environment. ForEach(environments_, internal::Delete); delete os_stack_trace_getter_; } // Adds a TestProperty to the current TestResult object when invoked in a // context of a test, to current test case's ad_hoc_test_result when invoke // from SetUpTestCase/TearDownTestCase, or to the global property set // otherwise. If the result already contains a property with the same key, // the value will be updated. void UnitTestImpl::RecordProperty(const TestProperty& test_property) { std::string xml_element; TestResult* test_result; // TestResult appropriate for property recording. if (current_test_info_ != NULL) { xml_element = "testcase"; test_result = &(current_test_info_->result_); } else if (current_test_case_ != NULL) { xml_element = "testsuite"; test_result = &(current_test_case_->ad_hoc_test_result_); } else { xml_element = "testsuites"; test_result = &ad_hoc_test_result_; } test_result->RecordProperty(xml_element, test_property); } #if GTEST_HAS_DEATH_TEST // Disables event forwarding if the control is currently in a death test // subprocess. Must not be called before InitGoogleTest. void UnitTestImpl::SuppressTestEventsIfInSubprocess() { if (internal_run_death_test_flag_.get() != NULL) listeners()->SuppressEventForwarding(); } #endif // GTEST_HAS_DEATH_TEST // Initializes event listeners performing XML output as specified by // UnitTestOptions. Must not be called before InitGoogleTest. void UnitTestImpl::ConfigureXmlOutput() { const std::string& output_format = UnitTestOptions::GetOutputFormat(); if (output_format == "xml") { listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter( UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); } else if (output_format != "") { printf("WARNING: unrecognized output format \"%s\" ignored.\n", output_format.c_str()); fflush(stdout); } } #if GTEST_CAN_STREAM_RESULTS_ // Initializes event listeners for streaming test results in string form. // Must not be called before InitGoogleTest. void UnitTestImpl::ConfigureStreamingOutput() { const std::string& target = GTEST_FLAG(stream_result_to); if (!target.empty()) { const size_t pos = target.find(':'); if (pos != std::string::npos) { listeners()->Append(new StreamingListener(target.substr(0, pos), target.substr(pos+1))); } else { printf("WARNING: unrecognized streaming target \"%s\" ignored.\n", target.c_str()); fflush(stdout); } } } #endif // GTEST_CAN_STREAM_RESULTS_ // Performs initialization dependent upon flag values obtained in // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest // this function is also called from RunAllTests. Since this function can be // called more than once, it has to be idempotent. void UnitTestImpl::PostFlagParsingInit() { // Ensures that this function does not execute more than once. if (!post_flag_parse_init_performed_) { post_flag_parse_init_performed_ = true; #if GTEST_HAS_DEATH_TEST InitDeathTestSubprocessControlInfo(); SuppressTestEventsIfInSubprocess(); #endif // GTEST_HAS_DEATH_TEST // Registers parameterized tests. This makes parameterized tests // available to the UnitTest reflection API without running // RUN_ALL_TESTS. RegisterParameterizedTests(); // Configures listeners for XML output. This makes it possible for users // to shut down the default XML output before invoking RUN_ALL_TESTS. ConfigureXmlOutput(); #if GTEST_CAN_STREAM_RESULTS_ // Configures listeners for streaming test results to the specified server. ConfigureStreamingOutput(); #endif // GTEST_CAN_STREAM_RESULTS_ } } // A predicate that checks the name of a TestCase against a known // value. // // This is used for implementation of the UnitTest class only. We put // it in the anonymous namespace to prevent polluting the outer // namespace. // // TestCaseNameIs is copyable. class TestCaseNameIs { public: // Constructor. explicit TestCaseNameIs(const std::string& name) : name_(name) {} // Returns true iff the name of test_case matches name_. bool operator()(const TestCase* test_case) const { return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0; } private: std::string name_; }; // Finds and returns a TestCase with the given name. If one doesn't // exist, creates one and returns it. It's the CALLER'S // RESPONSIBILITY to ensure that this function is only called WHEN THE // TESTS ARE NOT SHUFFLED. // // Arguments: // // test_case_name: name of the test case // type_param: the name of the test case's type parameter, or NULL if // this is not a typed or a type-parameterized test case. // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase* UnitTestImpl::GetTestCase(const char* test_case_name, const char* type_param, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc) { // Can we find a TestCase with the given name? const std::vector::const_iterator test_case = std::find_if(test_cases_.begin(), test_cases_.end(), TestCaseNameIs(test_case_name)); if (test_case != test_cases_.end()) return *test_case; // No. Let's create one. TestCase* const new_test_case = new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc); // Is this a death test case? if (internal::UnitTestOptions::MatchesFilter(test_case_name, kDeathTestCaseFilter)) { // Yes. Inserts the test case after the last death test case // defined so far. This only works when the test cases haven't // been shuffled. Otherwise we may end up running a death test // after a non-death test. ++last_death_test_case_; test_cases_.insert(test_cases_.begin() + last_death_test_case_, new_test_case); } else { // No. Appends to the end of the list. test_cases_.push_back(new_test_case); } test_case_indices_.push_back(static_cast(test_case_indices_.size())); return new_test_case; } // Helpers for setting up / tearing down the given environment. They // are for use in the ForEach() function. static void SetUpEnvironment(Environment* env) { env->SetUp(); } static void TearDownEnvironment(Environment* env) { env->TearDown(); } // Runs all tests in this UnitTest object, prints the result, and // returns true if all tests are successful. If any exception is // thrown during a test, the test is considered to be failed, but the // rest of the tests will still be run. // // When parameterized tests are enabled, it expands and registers // parameterized tests first in RegisterParameterizedTests(). // All other functions called from RunAllTests() may safely assume that // parameterized tests are ready to be counted and run. bool UnitTestImpl::RunAllTests() { // Makes sure InitGoogleTest() was called. if (!GTestIsInitialized()) { printf("%s", "\nThis test program did NOT call ::testing::InitGoogleTest " "before calling RUN_ALL_TESTS(). Please fix it.\n"); return false; } // Do not run any test if the --help flag was specified. if (g_help_flag) return true; // Repeats the call to the post-flag parsing initialization in case the // user didn't call InitGoogleTest. PostFlagParsingInit(); // Even if sharding is not on, test runners may want to use the // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding // protocol. internal::WriteToShardStatusFileIfNeeded(); // True iff we are in a subprocess for running a thread-safe-style // death test. bool in_subprocess_for_death_test = false; #if GTEST_HAS_DEATH_TEST in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL); #endif // GTEST_HAS_DEATH_TEST const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex, in_subprocess_for_death_test); // Compares the full test names with the filter to decide which // tests to run. const bool has_tests_to_run = FilterTests(should_shard ? HONOR_SHARDING_PROTOCOL : IGNORE_SHARDING_PROTOCOL) > 0; // Lists the tests and exits if the --gtest_list_tests flag was specified. if (GTEST_FLAG(list_tests)) { // This must be called *after* FilterTests() has been called. ListTestsMatchingFilter(); return true; } random_seed_ = GTEST_FLAG(shuffle) ? GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0; // True iff at least one test has failed. bool failed = false; TestEventListener* repeater = listeners()->repeater(); start_timestamp_ = GetTimeInMillis(); repeater->OnTestProgramStart(*parent_); // How many times to repeat the tests? We don't want to repeat them // when we are inside the subprocess of a death test. const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); // Repeats forever if the repeat count is negative. const bool forever = repeat < 0; for (int i = 0; forever || i != repeat; i++) { // We want to preserve failures generated by ad-hoc test // assertions executed before RUN_ALL_TESTS(). ClearNonAdHocTestResult(); const TimeInMillis start = GetTimeInMillis(); // Shuffles test cases and tests if requested. if (has_tests_to_run && GTEST_FLAG(shuffle)) { random()->Reseed(random_seed_); // This should be done before calling OnTestIterationStart(), // such that a test event listener can see the actual test order // in the event. ShuffleTests(); } // Tells the unit test event listeners that the tests are about to start. repeater->OnTestIterationStart(*parent_, i); // Runs each test case if there is at least one test to run. if (has_tests_to_run) { // Sets up all environments beforehand. repeater->OnEnvironmentsSetUpStart(*parent_); ForEach(environments_, SetUpEnvironment); repeater->OnEnvironmentsSetUpEnd(*parent_); // Runs the tests only if there was no fatal failure during global // set-up. if (!Test::HasFatalFailure()) { for (int test_index = 0; test_index < total_test_case_count(); test_index++) { GetMutableTestCase(test_index)->Run(); } } // Tears down all environments in reverse order afterwards. repeater->OnEnvironmentsTearDownStart(*parent_); std::for_each(environments_.rbegin(), environments_.rend(), TearDownEnvironment); repeater->OnEnvironmentsTearDownEnd(*parent_); } elapsed_time_ = GetTimeInMillis() - start; // Tells the unit test event listener that the tests have just finished. repeater->OnTestIterationEnd(*parent_, i); // Gets the result and clears it. if (!Passed()) { failed = true; } // Restores the original test order after the iteration. This // allows the user to quickly repro a failure that happens in the // N-th iteration without repeating the first (N - 1) iterations. // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in // case the user somehow changes the value of the flag somewhere // (it's always safe to unshuffle the tests). UnshuffleTests(); if (GTEST_FLAG(shuffle)) { // Picks a new random seed for each iteration. random_seed_ = GetNextRandomSeed(random_seed_); } } repeater->OnTestProgramEnd(*parent_); return !failed; } // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file // if the variable is present. If a file already exists at this location, this // function will write over it. If the variable is present, but the file cannot // be created, prints an error and exits. void WriteToShardStatusFileIfNeeded() { const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile); if (test_shard_file != NULL) { FILE* const file = posix::FOpen(test_shard_file, "w"); if (file == NULL) { ColoredPrintf(COLOR_RED, "Could not write to the test shard status file \"%s\" " "specified by the %s environment variable.\n", test_shard_file, kTestShardStatusFile); fflush(stdout); exit(EXIT_FAILURE); } fclose(file); } } // Checks whether sharding is enabled by examining the relevant // environment variable values. If the variables are present, // but inconsistent (i.e., shard_index >= total_shards), prints // an error and exits. If in_subprocess_for_death_test, sharding is // disabled because it must only be applied to the original test // process. Otherwise, we could filter out death tests we intended to execute. bool ShouldShard(const char* total_shards_env, const char* shard_index_env, bool in_subprocess_for_death_test) { if (in_subprocess_for_death_test) { return false; } const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); if (total_shards == -1 && shard_index == -1) { return false; } else if (total_shards == -1 && shard_index != -1) { const Message msg = Message() << "Invalid environment variables: you have " << kTestShardIndex << " = " << shard_index << ", but have left " << kTestTotalShards << " unset.\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (total_shards != -1 && shard_index == -1) { const Message msg = Message() << "Invalid environment variables: you have " << kTestTotalShards << " = " << total_shards << ", but have left " << kTestShardIndex << " unset.\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (shard_index < 0 || shard_index >= total_shards) { const Message msg = Message() << "Invalid environment variables: we require 0 <= " << kTestShardIndex << " < " << kTestTotalShards << ", but you have " << kTestShardIndex << "=" << shard_index << ", " << kTestTotalShards << "=" << total_shards << ".\n"; ColoredPrintf(COLOR_RED, msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } return total_shards > 1; } // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error // and aborts. Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) { const char* str_val = posix::GetEnv(var); if (str_val == NULL) { return default_val; } Int32 result; if (!ParseInt32(Message() << "The value of environment variable " << var, str_val, &result)) { exit(EXIT_FAILURE); } return result; } // Given the total number of shards, the shard index, and the test id, // returns true iff the test should be run on this shard. The test id is // some arbitrary but unique non-negative integer assigned to each test // method. Assumes that 0 <= shard_index < total_shards. bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { return (test_id % total_shards) == shard_index; } // Compares the name of each test with the user-specified filter to // decide whether the test should be run, then records the result in // each TestCase and TestInfo object. // If shard_tests == true, further filters tests based on sharding // variables in the environment - see // http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide. // Returns the number of tests that should run. int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestTotalShards, -1) : -1; const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestShardIndex, -1) : -1; // num_runnable_tests are the number of tests that will // run across all shards (i.e., match filter and are not disabled). // num_selected_tests are the number of tests to be run on // this shard. int num_runnable_tests = 0; int num_selected_tests = 0; for (size_t i = 0; i < test_cases_.size(); i++) { TestCase* const test_case = test_cases_[i]; const std::string &test_case_name = test_case->name(); test_case->set_should_run(false); for (size_t j = 0; j < test_case->test_info_list().size(); j++) { TestInfo* const test_info = test_case->test_info_list()[j]; const std::string test_name(test_info->name()); // A test is disabled if test case name or test name matches // kDisableTestFilter. const bool is_disabled = internal::UnitTestOptions::MatchesFilter(test_case_name, kDisableTestFilter) || internal::UnitTestOptions::MatchesFilter(test_name, kDisableTestFilter); test_info->is_disabled_ = is_disabled; const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest(test_case_name, test_name); test_info->matches_filter_ = matches_filter; const bool is_runnable = (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) && matches_filter; const bool is_selected = is_runnable && (shard_tests == IGNORE_SHARDING_PROTOCOL || ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests)); num_runnable_tests += is_runnable; num_selected_tests += is_selected; test_info->should_run_ = is_selected; test_case->set_should_run(test_case->should_run() || is_selected); } } return num_selected_tests; } // Prints the given C-string on a single line by replacing all '\n' // characters with string "\\n". If the output takes more than // max_length characters, only prints the first max_length characters // and "...". static void PrintOnOneLine(const char* str, int max_length) { if (str != NULL) { for (int i = 0; *str != '\0'; ++str) { if (i >= max_length) { printf("..."); break; } if (*str == '\n') { printf("\\n"); i += 2; } else { printf("%c", *str); ++i; } } } } // Prints the names of the tests matching the user-specified filter flag. void UnitTestImpl::ListTestsMatchingFilter() { // Print at most this many characters for each type/value parameter. const int kMaxParamLength = 250; for (size_t i = 0; i < test_cases_.size(); i++) { const TestCase* const test_case = test_cases_[i]; bool printed_test_case_name = false; for (size_t j = 0; j < test_case->test_info_list().size(); j++) { const TestInfo* const test_info = test_case->test_info_list()[j]; if (test_info->matches_filter_) { if (!printed_test_case_name) { printed_test_case_name = true; printf("%s.", test_case->name()); if (test_case->type_param() != NULL) { printf(" # %s = ", kTypeParamLabel); // We print the type parameter on a single line to make // the output easy to parse by a program. PrintOnOneLine(test_case->type_param(), kMaxParamLength); } printf("\n"); } printf(" %s", test_info->name()); if (test_info->value_param() != NULL) { printf(" # %s = ", kValueParamLabel); // We print the value parameter on a single line to make the // output easy to parse by a program. PrintOnOneLine(test_info->value_param(), kMaxParamLength); } printf("\n"); } } } fflush(stdout); } // Sets the OS stack trace getter. // // Does nothing if the input and the current OS stack trace getter are // the same; otherwise, deletes the old getter and makes the input the // current getter. void UnitTestImpl::set_os_stack_trace_getter( OsStackTraceGetterInterface* getter) { if (os_stack_trace_getter_ != getter) { delete os_stack_trace_getter_; os_stack_trace_getter_ = getter; } } // Returns the current OS stack trace getter if it is not NULL; // otherwise, creates an OsStackTraceGetter, makes it the current // getter, and returns it. OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { if (os_stack_trace_getter_ == NULL) { os_stack_trace_getter_ = new OsStackTraceGetter; } return os_stack_trace_getter_; } // Returns the TestResult for the test that's currently running, or // the TestResult for the ad hoc test if no test is running. TestResult* UnitTestImpl::current_test_result() { return current_test_info_ ? &(current_test_info_->result_) : &ad_hoc_test_result_; } // Shuffles all test cases, and the tests within each test case, // making sure that death tests are still run first. void UnitTestImpl::ShuffleTests() { // Shuffles the death test cases. ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_); // Shuffles the non-death test cases. ShuffleRange(random(), last_death_test_case_ + 1, static_cast(test_cases_.size()), &test_case_indices_); // Shuffles the tests inside each test case. for (size_t i = 0; i < test_cases_.size(); i++) { test_cases_[i]->ShuffleTests(random()); } } // Restores the test cases and tests to their order before the first shuffle. void UnitTestImpl::UnshuffleTests() { for (size_t i = 0; i < test_cases_.size(); i++) { // Unshuffles the tests in each test case. test_cases_[i]->UnshuffleTests(); // Resets the index of each test case. test_case_indices_[i] = static_cast(i); } } // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/, int skip_count) { // We pass skip_count + 1 to skip this wrapper function in addition // to what the user really wants to skip. return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1); } // Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to // suppress unreachable code warnings. namespace { class ClassUniqueToAlwaysTrue {}; } bool IsTrue(bool condition) { return condition; } bool AlwaysTrue() { #if GTEST_HAS_EXCEPTIONS // This condition is always false so AlwaysTrue() never actually throws, // but it makes the compiler think that it may throw. if (IsTrue(false)) throw ClassUniqueToAlwaysTrue(); #endif // GTEST_HAS_EXCEPTIONS return true; } // If *pstr starts with the given prefix, modifies *pstr to be right // past the prefix and returns true; otherwise leaves *pstr unchanged // and returns false. None of pstr, *pstr, and prefix can be NULL. bool SkipPrefix(const char* prefix, const char** pstr) { const size_t prefix_len = strlen(prefix); if (strncmp(*pstr, prefix, prefix_len) == 0) { *pstr += prefix_len; return true; } return false; } // Parses a string as a command line flag. The string should have // the format "--flag=value". When def_optional is true, the "=value" // part can be omitted. // // Returns the value of the flag, or NULL if the parsing failed. const char* ParseFlagValue(const char* str, const char* flag, bool def_optional) { // str and flag must not be NULL. if (str == NULL || flag == NULL) return NULL; // The flag must start with "--" followed by GTEST_FLAG_PREFIX_. const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag; const size_t flag_len = flag_str.length(); if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; // Skips the flag name. const char* flag_end = str + flag_len; // When def_optional is true, it's OK to not have a "=value" part. if (def_optional && (flag_end[0] == '\0')) { return flag_end; } // If def_optional is true and there are more characters after the // flag name, or if def_optional is false, there must be a '=' after // the flag name. if (flag_end[0] != '=') return NULL; // Returns the string after "=". return flag_end + 1; } // Parses a string for a bool flag, in the form of either // "--flag=value" or "--flag". // // In the former case, the value is taken as true as long as it does // not start with '0', 'f', or 'F'. // // In the latter case, the value is taken as true. // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseBoolFlag(const char* str, const char* flag, bool* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, true); // Aborts if the parsing failed. if (value_str == NULL) return false; // Converts the string value to a bool. *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); return true; } // Parses a string for an Int32 flag, in the form of // "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseInt32Flag(const char* str, const char* flag, Int32* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == NULL) return false; // Sets *value to the value of the flag. return ParseInt32(Message() << "The value of flag --" << flag, value_str, value); } // Parses a string for a string flag, in the form of // "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseStringFlag(const char* str, const char* flag, std::string* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == NULL) return false; // Sets *value to the value of the flag. *value = value_str; return true; } // Determines whether a string has a prefix that Google Test uses for its // flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_. // If Google Test detects that a command line flag has its prefix but is not // recognized, it will print its help message. Flags starting with // GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test // internal flags and do not trigger the help message. static bool HasGoogleTestFlagPrefix(const char* str) { return (SkipPrefix("--", &str) || SkipPrefix("-", &str) || SkipPrefix("/", &str)) && !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) && (SkipPrefix(GTEST_FLAG_PREFIX_, &str) || SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str)); } // Prints a string containing code-encoded text. The following escape // sequences can be used in the string to control the text color: // // @@ prints a single '@' character. // @R changes the color to red. // @G changes the color to green. // @Y changes the color to yellow. // @D changes to the default terminal text color. // // TODO(wan@google.com): Write tests for this once we add stdout // capturing to Google Test. static void PrintColorEncoded(const char* str) { GTestColor color = COLOR_DEFAULT; // The current color. // Conceptually, we split the string into segments divided by escape // sequences. Then we print one segment at a time. At the end of // each iteration, the str pointer advances to the beginning of the // next segment. for (;;) { const char* p = strchr(str, '@'); if (p == NULL) { ColoredPrintf(color, "%s", str); return; } ColoredPrintf(color, "%s", std::string(str, p).c_str()); const char ch = p[1]; str = p + 2; if (ch == '@') { ColoredPrintf(color, "@"); } else if (ch == 'D') { color = COLOR_DEFAULT; } else if (ch == 'R') { color = COLOR_RED; } else if (ch == 'G') { color = COLOR_GREEN; } else if (ch == 'Y') { color = COLOR_YELLOW; } else { --str; } } } static const char kColorEncodedHelpMessage[] = "This program contains tests written using " GTEST_NAME_ ". You can use the\n" "following command line flags to control its behavior:\n" "\n" "Test Selection:\n" " @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" " List the names of all tests instead of running them. The name of\n" " TEST(Foo, Bar) is \"Foo.Bar\".\n" " @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" "[@G-@YNEGATIVE_PATTERNS]@D\n" " Run only the tests whose name matches one of the positive patterns but\n" " none of the negative patterns. '?' matches any single character; '*'\n" " matches any substring; ':' separates two patterns.\n" " @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" " Run all disabled tests too.\n" "\n" "Test Execution:\n" " @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" " Run the tests repeatedly; use a negative count to repeat forever.\n" " @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" " Randomize tests' orders on every iteration.\n" " @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" " Random number seed to use for shuffling test orders (between 1 and\n" " 99999, or 0 to use a seed based on the current time).\n" "\n" "Test Output:\n" " @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" " Enable/disable colored output. The default is @Gauto@D.\n" " -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" " Don't print the elapsed time of each test.\n" " @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G" GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" " Generate an XML report in the given directory or with the given file\n" " name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n" #if GTEST_CAN_STREAM_RESULTS_ " @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n" " Stream test results to the given server.\n" #endif // GTEST_CAN_STREAM_RESULTS_ "\n" "Assertion Behavior:\n" #if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" " Set the default death test style.\n" #endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" " Turn assertion failures into debugger break-points.\n" " @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" " Turn assertion failures into C++ exceptions.\n" " @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n" " Do not report exceptions as test failures. Instead, allow them\n" " to crash the program or throw a pop-up (on Windows).\n" "\n" "Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " "the corresponding\n" "environment variable of a flag (all letters in upper-case). For example, to\n" "disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ "color=no@D or set\n" "the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" "\n" "For more information, please read the " GTEST_NAME_ " documentation at\n" "@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" "(not one in your own code or tests), please report it to\n" "@G<" GTEST_DEV_EMAIL_ ">@D.\n"; // Parses the command line for Google Test flags, without initializing // other parts of Google Test. The type parameter CharType can be // instantiated to either char or wchar_t. template void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { for (int i = 1; i < *argc; i++) { const std::string arg_string = StreamableToString(argv[i]); const char* const arg = arg_string.c_str(); using internal::ParseBoolFlag; using internal::ParseInt32Flag; using internal::ParseStringFlag; // Do we see a Google Test flag? if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, >EST_FLAG(also_run_disabled_tests)) || ParseBoolFlag(arg, kBreakOnFailureFlag, >EST_FLAG(break_on_failure)) || ParseBoolFlag(arg, kCatchExceptionsFlag, >EST_FLAG(catch_exceptions)) || ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || ParseStringFlag(arg, kDeathTestStyleFlag, >EST_FLAG(death_test_style)) || ParseBoolFlag(arg, kDeathTestUseFork, >EST_FLAG(death_test_use_fork)) || ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || ParseStringFlag(arg, kInternalRunDeathTestFlag, >EST_FLAG(internal_run_death_test)) || ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || ParseInt32Flag(arg, kStackTraceDepthFlag, >EST_FLAG(stack_trace_depth)) || ParseStringFlag(arg, kStreamResultToFlag, >EST_FLAG(stream_result_to)) || ParseBoolFlag(arg, kThrowOnFailureFlag, >EST_FLAG(throw_on_failure)) ) { // Yes. Shift the remainder of the argv list left by one. Note // that argv has (*argc + 1) elements, the last one always being // NULL. The following loop moves the trailing NULL element as // well. for (int j = i; j != *argc; j++) { argv[j] = argv[j + 1]; } // Decrements the argument count. (*argc)--; // We also need to decrement the iterator as we just removed // an element. i--; } else if (arg_string == "--help" || arg_string == "-h" || arg_string == "-?" || arg_string == "/?" || HasGoogleTestFlagPrefix(arg)) { // Both help flag and unrecognized Google Test flags (excluding // internal ones) trigger help display. g_help_flag = true; } } if (g_help_flag) { // We print the help here instead of in RUN_ALL_TESTS(), as the // latter may not be called at all if the user is using Google // Test with another testing framework. PrintColorEncoded(kColorEncodedHelpMessage); } } // Parses the command line for Google Test flags, without initializing // other parts of Google Test. void ParseGoogleTestFlagsOnly(int* argc, char** argv) { ParseGoogleTestFlagsOnlyImpl(argc, argv); } void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) { ParseGoogleTestFlagsOnlyImpl(argc, argv); } // The internal implementation of InitGoogleTest(). // // The type parameter CharType can be instantiated to either char or // wchar_t. template void InitGoogleTestImpl(int* argc, CharType** argv) { g_init_gtest_count++; // We don't want to run the initialization code twice. if (g_init_gtest_count != 1) return; if (*argc <= 0) return; internal::g_executable_path = internal::StreamableToString(argv[0]); #if GTEST_HAS_DEATH_TEST g_argvs.clear(); for (int i = 0; i != *argc; i++) { g_argvs.push_back(StreamableToString(argv[i])); } #endif // GTEST_HAS_DEATH_TEST ParseGoogleTestFlagsOnly(argc, argv); GetUnitTestImpl()->PostFlagParsingInit(); } } // namespace internal // Initializes Google Test. This must be called before calling // RUN_ALL_TESTS(). In particular, it parses a command line for the // flags that Google Test recognizes. Whenever a Google Test flag is // seen, it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Test flag variables are // updated. // // Calling the function for the second time has no user-visible effect. void InitGoogleTest(int* argc, char** argv) { internal::InitGoogleTestImpl(argc, argv); } // This overloaded version can be used in Windows programs compiled in // UNICODE mode. void InitGoogleTest(int* argc, wchar_t** argv) { internal::InitGoogleTestImpl(argc, argv); } } // namespace testing stimfit-0.15.8/src/test/gtest/src/gtest-filepath.cc0000664000175000017500000003363613062445067017143 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: keith.ray@gmail.com (Keith Ray) #include "gtest/gtest-message.h" #include "gtest/internal/gtest-filepath.h" #include "gtest/internal/gtest-port.h" #include #if GTEST_OS_WINDOWS_MOBILE # include #elif GTEST_OS_WINDOWS # include # include #elif GTEST_OS_SYMBIAN // Symbian OpenC has PATH_MAX in sys/syslimits.h # include #else # include # include // Some Linux distributions define PATH_MAX here. #endif // GTEST_OS_WINDOWS_MOBILE #if GTEST_OS_WINDOWS # define GTEST_PATH_MAX_ _MAX_PATH #elif defined(PATH_MAX) # define GTEST_PATH_MAX_ PATH_MAX #elif defined(_XOPEN_PATH_MAX) # define GTEST_PATH_MAX_ _XOPEN_PATH_MAX #else # define GTEST_PATH_MAX_ _POSIX_PATH_MAX #endif // GTEST_OS_WINDOWS #include "gtest/internal/gtest-string.h" namespace testing { namespace internal { #if GTEST_OS_WINDOWS // On Windows, '\\' is the standard path separator, but many tools and the // Windows API also accept '/' as an alternate path separator. Unless otherwise // noted, a file path can contain either kind of path separators, or a mixture // of them. const char kPathSeparator = '\\'; const char kAlternatePathSeparator = '/'; const char kPathSeparatorString[] = "\\"; const char kAlternatePathSeparatorString[] = "/"; # if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't have a current directory. You should not use // the current directory in tests on Windows CE, but this at least // provides a reasonable fallback. const char kCurrentDirectoryString[] = "\\"; // Windows CE doesn't define INVALID_FILE_ATTRIBUTES const DWORD kInvalidFileAttributes = 0xffffffff; # else const char kCurrentDirectoryString[] = ".\\"; # endif // GTEST_OS_WINDOWS_MOBILE #else const char kPathSeparator = '/'; const char kPathSeparatorString[] = "/"; const char kCurrentDirectoryString[] = "./"; #endif // GTEST_OS_WINDOWS // Returns whether the given character is a valid path separator. static bool IsPathSeparator(char c) { #if GTEST_HAS_ALT_PATH_SEP_ return (c == kPathSeparator) || (c == kAlternatePathSeparator); #else return c == kPathSeparator; #endif } // Returns the current working directory, or "" if unsuccessful. FilePath FilePath::GetCurrentDir() { #if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't have a current directory, so we just return // something reasonable. return FilePath(kCurrentDirectoryString); #elif GTEST_OS_WINDOWS char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); #else char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); #endif // GTEST_OS_WINDOWS_MOBILE } // Returns a copy of the FilePath with the case-insensitive extension removed. // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns // FilePath("dir/file"). If a case-insensitive extension is not // found, returns a copy of the original FilePath. FilePath FilePath::RemoveExtension(const char* extension) const { const std::string dot_extension = std::string(".") + extension; if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) { return FilePath(pathname_.substr( 0, pathname_.length() - dot_extension.length())); } return *this; } // Returns a pointer to the last occurence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FilePath::FindLastPathSeparator() const { const char* const last_sep = strrchr(c_str(), kPathSeparator); #if GTEST_HAS_ALT_PATH_SEP_ const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator); // Comparing two pointers of which only one is NULL is undefined. if (last_alt_sep != NULL && (last_sep == NULL || last_alt_sep > last_sep)) { return last_alt_sep; } #endif return last_sep; } // Returns a copy of the FilePath with the directory part removed. // Example: FilePath("path/to/file").RemoveDirectoryName() returns // FilePath("file"). If there is no directory part ("just_a_file"), it returns // the FilePath unmodified. If there is no file part ("just_a_dir/") it // returns an empty FilePath (""). // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath FilePath::RemoveDirectoryName() const { const char* const last_sep = FindLastPathSeparator(); return last_sep ? FilePath(last_sep + 1) : *this; } // RemoveFileName returns the directory path with the filename removed. // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". // If the FilePath is "a_file" or "/a_file", RemoveFileName returns // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does // not have a file, like "just/a/dir/", it returns the FilePath unmodified. // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath FilePath::RemoveFileName() const { const char* const last_sep = FindLastPathSeparator(); std::string dir; if (last_sep) { dir = std::string(c_str(), last_sep + 1 - c_str()); } else { dir = kCurrentDirectoryString; } return FilePath(dir); } // Helper functions for naming files in a directory for xml output. // Given directory = "dir", base_name = "test", number = 0, // extension = "xml", returns "dir/test.xml". If number is greater // than zero (e.g., 12), returns "dir/test_12.xml". // On Windows platform, uses \ as the separator rather than /. FilePath FilePath::MakeFileName(const FilePath& directory, const FilePath& base_name, int number, const char* extension) { std::string file; if (number == 0) { file = base_name.string() + "." + extension; } else { file = base_name.string() + "_" + StreamableToString(number) + "." + extension; } return ConcatPaths(directory, FilePath(file)); } // Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml". // On Windows, uses \ as the separator rather than /. FilePath FilePath::ConcatPaths(const FilePath& directory, const FilePath& relative_path) { if (directory.IsEmpty()) return relative_path; const FilePath dir(directory.RemoveTrailingPathSeparator()); return FilePath(dir.string() + kPathSeparator + relative_path.string()); } // Returns true if pathname describes something findable in the file-system, // either a file, directory, or whatever. bool FilePath::FileOrDirectoryExists() const { #if GTEST_OS_WINDOWS_MOBILE LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str()); const DWORD attributes = GetFileAttributes(unicode); delete [] unicode; return attributes != kInvalidFileAttributes; #else posix::StatStruct file_stat; return posix::Stat(pathname_.c_str(), &file_stat) == 0; #endif // GTEST_OS_WINDOWS_MOBILE } // Returns true if pathname describes a directory in the file-system // that exists. bool FilePath::DirectoryExists() const { bool result = false; #if GTEST_OS_WINDOWS // Don't strip off trailing separator if path is a root directory on // Windows (like "C:\\"). const FilePath& path(IsRootDirectory() ? *this : RemoveTrailingPathSeparator()); #else const FilePath& path(*this); #endif #if GTEST_OS_WINDOWS_MOBILE LPCWSTR unicode = String::AnsiToUtf16(path.c_str()); const DWORD attributes = GetFileAttributes(unicode); delete [] unicode; if ((attributes != kInvalidFileAttributes) && (attributes & FILE_ATTRIBUTE_DIRECTORY)) { result = true; } #else posix::StatStruct file_stat; result = posix::Stat(path.c_str(), &file_stat) == 0 && posix::IsDir(file_stat); #endif // GTEST_OS_WINDOWS_MOBILE return result; } // Returns true if pathname describes a root directory. (Windows has one // root directory per disk drive.) bool FilePath::IsRootDirectory() const { #if GTEST_OS_WINDOWS // TODO(wan@google.com): on Windows a network share like // \\server\share can be a root directory, although it cannot be the // current directory. Handle this properly. return pathname_.length() == 3 && IsAbsolutePath(); #else return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]); #endif } // Returns true if pathname describes an absolute path. bool FilePath::IsAbsolutePath() const { const char* const name = pathname_.c_str(); #if GTEST_OS_WINDOWS return pathname_.length() >= 3 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z')) && name[1] == ':' && IsPathSeparator(name[2]); #else return IsPathSeparator(name[0]); #endif } // Returns a pathname for a file that does not currently exist. The pathname // will be directory/base_name.extension or // directory/base_name_.extension if directory/base_name.extension // already exists. The number will be incremented until a pathname is found // that does not already exist. // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. // There could be a race condition if two or more processes are calling this // function at the same time -- they could both pick the same filename. FilePath FilePath::GenerateUniqueFileName(const FilePath& directory, const FilePath& base_name, const char* extension) { FilePath full_pathname; int number = 0; do { full_pathname.Set(MakeFileName(directory, base_name, number++, extension)); } while (full_pathname.FileOrDirectoryExists()); return full_pathname; } // Returns true if FilePath ends with a path separator, which indicates that // it is intended to represent a directory. Returns false otherwise. // This does NOT check that a directory (or file) actually exists. bool FilePath::IsDirectory() const { return !pathname_.empty() && IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]); } // Create directories so that path exists. Returns true if successful or if // the directories already exist; returns false if unable to create directories // for any reason. bool FilePath::CreateDirectoriesRecursively() const { if (!this->IsDirectory()) { return false; } if (pathname_.length() == 0 || this->DirectoryExists()) { return true; } const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName()); return parent.CreateDirectoriesRecursively() && this->CreateFolder(); } // Create the directory so that path exists. Returns true if successful or // if the directory already exists; returns false if unable to create the // directory for any reason, including if the parent directory does not // exist. Not named "CreateDirectory" because that's a macro on Windows. bool FilePath::CreateFolder() const { #if GTEST_OS_WINDOWS_MOBILE FilePath removed_sep(this->RemoveTrailingPathSeparator()); LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str()); int result = CreateDirectory(unicode, NULL) ? 0 : -1; delete [] unicode; #elif GTEST_OS_WINDOWS int result = _mkdir(pathname_.c_str()); #else int result = mkdir(pathname_.c_str(), 0777); #endif // GTEST_OS_WINDOWS_MOBILE if (result == -1) { return this->DirectoryExists(); // An error is OK if the directory exists. } return true; // No error. } // If input name has a trailing separator character, remove it and return the // name, otherwise return the name string unmodified. // On Windows platform, uses \ as the separator, other platforms use /. FilePath FilePath::RemoveTrailingPathSeparator() const { return IsDirectory() ? FilePath(pathname_.substr(0, pathname_.length() - 1)) : *this; } // Removes any redundant separators that might be in the pathname. // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". // TODO(wan@google.com): handle Windows network shares (e.g. \\server\share). void FilePath::Normalize() { if (pathname_.c_str() == NULL) { pathname_ = ""; return; } const char* src = pathname_.c_str(); char* const dest = new char[pathname_.length() + 1]; char* dest_ptr = dest; memset(dest_ptr, 0, pathname_.length() + 1); while (*src != '\0') { *dest_ptr = *src; if (!IsPathSeparator(*src)) { src++; } else { #if GTEST_HAS_ALT_PATH_SEP_ if (*dest_ptr == kAlternatePathSeparator) { *dest_ptr = kPathSeparator; } #endif while (IsPathSeparator(*src)) src++; } dest_ptr++; } *dest_ptr = '\0'; pathname_ = dest; delete[] dest; } } // namespace internal } // namespace testing stimfit-0.15.8/src/test/gtest/src/gtest-test-part.cc0000664000175000017500000001007713062445067017264 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // // The Google C++ Testing Framework (Google Test) #include "gtest/gtest-test-part.h" // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #include "src/gtest-internal-inl.h" #undef GTEST_IMPLEMENTATION_ namespace testing { using internal::GetUnitTestImpl; // Gets the summary of the failure message by omitting the stack trace // in it. std::string TestPartResult::ExtractSummary(const char* message) { const char* const stack_trace = strstr(message, internal::kStackTraceMarker); return stack_trace == NULL ? message : std::string(message, stack_trace); } // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result) { return os << result.file_name() << ":" << result.line_number() << ": " << (result.type() == TestPartResult::kSuccess ? "Success" : result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : "Non-fatal failure") << ":\n" << result.message() << std::endl; } // Appends a TestPartResult to the array. void TestPartResultArray::Append(const TestPartResult& result) { array_.push_back(result); } // Returns the TestPartResult at the given index (0-based). const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { if (index < 0 || index >= size()) { printf("\nInvalid index (%d) into TestPartResultArray.\n", index); internal::posix::Abort(); } return array_[index]; } // Returns the number of TestPartResult objects in the array. int TestPartResultArray::size() const { return static_cast(array_.size()); } namespace internal { HasNewFatalFailureHelper::HasNewFatalFailureHelper() : has_new_fatal_failure_(false), original_reporter_(GetUnitTestImpl()-> GetTestPartResultReporterForCurrentThread()) { GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); } HasNewFatalFailureHelper::~HasNewFatalFailureHelper() { GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( original_reporter_); } void HasNewFatalFailureHelper::ReportTestPartResult( const TestPartResult& result) { if (result.fatally_failed()) has_new_fatal_failure_ = true; original_reporter_->ReportTestPartResult(result); } } // namespace internal } // namespace testing stimfit-0.15.8/src/test/gtest/src/gtest-death-test.cc0000664000175000017500000014340513062445067017405 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev) // // This file implements death tests. #include "gtest/gtest-death-test.h" #include "gtest/internal/gtest-port.h" #if GTEST_HAS_DEATH_TEST # if GTEST_OS_MAC # include # endif // GTEST_OS_MAC # include # include # include # if GTEST_OS_LINUX # include # endif // GTEST_OS_LINUX # include # if GTEST_OS_WINDOWS # include # else # include # include # endif // GTEST_OS_WINDOWS # if GTEST_OS_QNX # include # endif // GTEST_OS_QNX #endif // GTEST_HAS_DEATH_TEST #include "gtest/gtest-message.h" #include "gtest/internal/gtest-string.h" // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #include "src/gtest-internal-inl.h" #undef GTEST_IMPLEMENTATION_ namespace testing { // Constants. // The default death test style. static const char kDefaultDeathTestStyle[] = "fast"; GTEST_DEFINE_string_( death_test_style, internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle), "Indicates how to run a death test in a forked child process: " "\"threadsafe\" (child process re-executes the test binary " "from the beginning, running only the specific death test) or " "\"fast\" (child process runs the death test immediately " "after forking)."); GTEST_DEFINE_bool_( death_test_use_fork, internal::BoolFromGTestEnv("death_test_use_fork", false), "Instructs to use fork()/_exit() instead of clone() in death tests. " "Ignored and always uses fork() on POSIX systems where clone() is not " "implemented. Useful when running under valgrind or similar tools if " "those do not support clone(). Valgrind 3.3.1 will just fail if " "it sees an unsupported combination of clone() flags. " "It is not recommended to use this flag w/o valgrind though it will " "work in 99% of the cases. Once valgrind is fixed, this flag will " "most likely be removed."); namespace internal { GTEST_DEFINE_string_( internal_run_death_test, "", "Indicates the file, line number, temporal index of " "the single death test to run, and a file descriptor to " "which a success code may be sent, all separated by " "the '|' characters. This flag is specified if and only if the current " "process is a sub-process launched for running a thread-safe " "death test. FOR INTERNAL USE ONLY."); } // namespace internal #if GTEST_HAS_DEATH_TEST namespace internal { // Valid only for fast death tests. Indicates the code is running in the // child process of a fast style death test. static bool g_in_fast_death_test_child = false; // Returns a Boolean value indicating whether the caller is currently // executing in the context of the death test child process. Tools such as // Valgrind heap checkers may need this to modify their behavior in death // tests. IMPORTANT: This is an internal utility. Using it may break the // implementation of death tests. User code MUST NOT use it. bool InDeathTestChild() { # if GTEST_OS_WINDOWS // On Windows, death tests are thread-safe regardless of the value of the // death_test_style flag. return !GTEST_FLAG(internal_run_death_test).empty(); # else if (GTEST_FLAG(death_test_style) == "threadsafe") return !GTEST_FLAG(internal_run_death_test).empty(); else return g_in_fast_death_test_child; #endif } } // namespace internal // ExitedWithCode constructor. ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) { } // ExitedWithCode function-call operator. bool ExitedWithCode::operator()(int exit_status) const { # if GTEST_OS_WINDOWS return exit_status == exit_code_; # else return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_; # endif // GTEST_OS_WINDOWS } # if !GTEST_OS_WINDOWS // KilledBySignal constructor. KilledBySignal::KilledBySignal(int signum) : signum_(signum) { } // KilledBySignal function-call operator. bool KilledBySignal::operator()(int exit_status) const { return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_; } # endif // !GTEST_OS_WINDOWS namespace internal { // Utilities needed for death tests. // Generates a textual description of a given exit code, in the format // specified by wait(2). static std::string ExitSummary(int exit_code) { Message m; # if GTEST_OS_WINDOWS m << "Exited with exit status " << exit_code; # else if (WIFEXITED(exit_code)) { m << "Exited with exit status " << WEXITSTATUS(exit_code); } else if (WIFSIGNALED(exit_code)) { m << "Terminated by signal " << WTERMSIG(exit_code); } # ifdef WCOREDUMP if (WCOREDUMP(exit_code)) { m << " (core dumped)"; } # endif # endif // GTEST_OS_WINDOWS return m.GetString(); } // Returns true if exit_status describes a process that was terminated // by a signal, or exited normally with a nonzero exit code. bool ExitedUnsuccessfully(int exit_status) { return !ExitedWithCode(0)(exit_status); } # if !GTEST_OS_WINDOWS // Generates a textual failure message when a death test finds more than // one thread running, or cannot determine the number of threads, prior // to executing the given statement. It is the responsibility of the // caller not to pass a thread_count of 1. static std::string DeathTestThreadWarning(size_t thread_count) { Message msg; msg << "Death tests use fork(), which is unsafe particularly" << " in a threaded context. For this test, " << GTEST_NAME_ << " "; if (thread_count == 0) msg << "couldn't detect the number of threads."; else msg << "detected " << thread_count << " threads."; return msg.GetString(); } # endif // !GTEST_OS_WINDOWS // Flag characters for reporting a death test that did not die. static const char kDeathTestLived = 'L'; static const char kDeathTestReturned = 'R'; static const char kDeathTestThrew = 'T'; static const char kDeathTestInternalError = 'I'; // An enumeration describing all of the possible ways that a death test can // conclude. DIED means that the process died while executing the test // code; LIVED means that process lived beyond the end of the test code; // RETURNED means that the test statement attempted to execute a return // statement, which is not allowed; THREW means that the test statement // returned control by throwing an exception. IN_PROGRESS means the test // has not yet concluded. // TODO(vladl@google.com): Unify names and possibly values for // AbortReason, DeathTestOutcome, and flag characters above. enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }; // Routine for aborting the program which is safe to call from an // exec-style death test child process, in which case the error // message is propagated back to the parent process. Otherwise, the // message is simply printed to stderr. In either case, the program // then exits with status 1. void DeathTestAbort(const std::string& message) { // On a POSIX system, this function may be called from a threadsafe-style // death test child process, which operates on a very small stack. Use // the heap for any additional non-minuscule memory requirements. const InternalRunDeathTestFlag* const flag = GetUnitTestImpl()->internal_run_death_test_flag(); if (flag != NULL) { FILE* parent = posix::FDOpen(flag->write_fd(), "w"); fputc(kDeathTestInternalError, parent); fprintf(parent, "%s", message.c_str()); fflush(parent); _exit(1); } else { fprintf(stderr, "%s", message.c_str()); fflush(stderr); posix::Abort(); } } // A replacement for CHECK that calls DeathTestAbort if the assertion // fails. # define GTEST_DEATH_TEST_CHECK_(expression) \ do { \ if (!::testing::internal::IsTrue(expression)) { \ DeathTestAbort( \ ::std::string("CHECK failed: File ") + __FILE__ + ", line " \ + ::testing::internal::StreamableToString(__LINE__) + ": " \ + #expression); \ } \ } while (::testing::internal::AlwaysFalse()) // This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for // evaluating any system call that fulfills two conditions: it must return // -1 on failure, and set errno to EINTR when it is interrupted and // should be tried again. The macro expands to a loop that repeatedly // evaluates the expression as long as it evaluates to -1 and sets // errno to EINTR. If the expression evaluates to -1 but errno is // something other than EINTR, DeathTestAbort is called. # define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \ do { \ int gtest_retval; \ do { \ gtest_retval = (expression); \ } while (gtest_retval == -1 && errno == EINTR); \ if (gtest_retval == -1) { \ DeathTestAbort( \ ::std::string("CHECK failed: File ") + __FILE__ + ", line " \ + ::testing::internal::StreamableToString(__LINE__) + ": " \ + #expression + " != -1"); \ } \ } while (::testing::internal::AlwaysFalse()) // Returns the message describing the last system error in errno. std::string GetLastErrnoDescription() { return errno == 0 ? "" : posix::StrError(errno); } // This is called from a death test parent process to read a failure // message from the death test child process and log it with the FATAL // severity. On Windows, the message is read from a pipe handle. On other // platforms, it is read from a file descriptor. static void FailFromInternalError(int fd) { Message error; char buffer[256]; int num_read; do { while ((num_read = posix::Read(fd, buffer, 255)) > 0) { buffer[num_read] = '\0'; error << buffer; } } while (num_read == -1 && errno == EINTR); if (num_read == 0) { GTEST_LOG_(FATAL) << error.GetString(); } else { const int last_error = errno; GTEST_LOG_(FATAL) << "Error while reading death test internal: " << GetLastErrnoDescription() << " [" << last_error << "]"; } } // Death test constructor. Increments the running death test count // for the current test. DeathTest::DeathTest() { TestInfo* const info = GetUnitTestImpl()->current_test_info(); if (info == NULL) { DeathTestAbort("Cannot run a death test outside of a TEST or " "TEST_F construct"); } } // Creates and returns a death test by dispatching to the current // death test factory. bool DeathTest::Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) { return GetUnitTestImpl()->death_test_factory()->Create( statement, regex, file, line, test); } const char* DeathTest::LastMessage() { return last_death_test_message_.c_str(); } void DeathTest::set_last_death_test_message(const std::string& message) { last_death_test_message_ = message; } std::string DeathTest::last_death_test_message_; // Provides cross platform implementation for some death functionality. class DeathTestImpl : public DeathTest { protected: DeathTestImpl(const char* a_statement, const RE* a_regex) : statement_(a_statement), regex_(a_regex), spawned_(false), status_(-1), outcome_(IN_PROGRESS), read_fd_(-1), write_fd_(-1) {} // read_fd_ is expected to be closed and cleared by a derived class. ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); } void Abort(AbortReason reason); virtual bool Passed(bool status_ok); const char* statement() const { return statement_; } const RE* regex() const { return regex_; } bool spawned() const { return spawned_; } void set_spawned(bool is_spawned) { spawned_ = is_spawned; } int status() const { return status_; } void set_status(int a_status) { status_ = a_status; } DeathTestOutcome outcome() const { return outcome_; } void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; } int read_fd() const { return read_fd_; } void set_read_fd(int fd) { read_fd_ = fd; } int write_fd() const { return write_fd_; } void set_write_fd(int fd) { write_fd_ = fd; } // Called in the parent process only. Reads the result code of the death // test child process via a pipe, interprets it to set the outcome_ // member, and closes read_fd_. Outputs diagnostics and terminates in // case of unexpected codes. void ReadAndInterpretStatusByte(); private: // The textual content of the code this object is testing. This class // doesn't own this string and should not attempt to delete it. const char* const statement_; // The regular expression which test output must match. DeathTestImpl // doesn't own this object and should not attempt to delete it. const RE* const regex_; // True if the death test child process has been successfully spawned. bool spawned_; // The exit status of the child process. int status_; // How the death test concluded. DeathTestOutcome outcome_; // Descriptor to the read end of the pipe to the child process. It is // always -1 in the child process. The child keeps its write end of the // pipe in write_fd_. int read_fd_; // Descriptor to the child's write end of the pipe to the parent process. // It is always -1 in the parent process. The parent keeps its end of the // pipe in read_fd_. int write_fd_; }; // Called in the parent process only. Reads the result code of the death // test child process via a pipe, interprets it to set the outcome_ // member, and closes read_fd_. Outputs diagnostics and terminates in // case of unexpected codes. void DeathTestImpl::ReadAndInterpretStatusByte() { char flag; int bytes_read; // The read() here blocks until data is available (signifying the // failure of the death test) or until the pipe is closed (signifying // its success), so it's okay to call this in the parent before // the child process has exited. do { bytes_read = posix::Read(read_fd(), &flag, 1); } while (bytes_read == -1 && errno == EINTR); if (bytes_read == 0) { set_outcome(DIED); } else if (bytes_read == 1) { switch (flag) { case kDeathTestReturned: set_outcome(RETURNED); break; case kDeathTestThrew: set_outcome(THREW); break; case kDeathTestLived: set_outcome(LIVED); break; case kDeathTestInternalError: FailFromInternalError(read_fd()); // Does not return. break; default: GTEST_LOG_(FATAL) << "Death test child process reported " << "unexpected status byte (" << static_cast(flag) << ")"; } } else { GTEST_LOG_(FATAL) << "Read from death test child process failed: " << GetLastErrnoDescription(); } GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd())); set_read_fd(-1); } // Signals that the death test code which should have exited, didn't. // Should be called only in a death test child process. // Writes a status byte to the child's status file descriptor, then // calls _exit(1). void DeathTestImpl::Abort(AbortReason reason) { // The parent process considers the death test to be a failure if // it finds any data in our pipe. So, here we write a single flag byte // to the pipe, then exit. const char status_ch = reason == TEST_DID_NOT_DIE ? kDeathTestLived : reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned; GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1)); // We are leaking the descriptor here because on some platforms (i.e., // when built as Windows DLL), destructors of global objects will still // run after calling _exit(). On such systems, write_fd_ will be // indirectly closed from the destructor of UnitTestImpl, causing double // close if it is also closed here. On debug configurations, double close // may assert. As there are no in-process buffers to flush here, we are // relying on the OS to close the descriptor after the process terminates // when the destructors are not run. _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) } // Returns an indented copy of stderr output for a death test. // This makes distinguishing death test output lines from regular log lines // much easier. static ::std::string FormatDeathTestOutput(const ::std::string& output) { ::std::string ret; for (size_t at = 0; ; ) { const size_t line_end = output.find('\n', at); ret += "[ DEATH ] "; if (line_end == ::std::string::npos) { ret += output.substr(at); break; } ret += output.substr(at, line_end + 1 - at); at = line_end + 1; } return ret; } // Assesses the success or failure of a death test, using both private // members which have previously been set, and one argument: // // Private data members: // outcome: An enumeration describing how the death test // concluded: DIED, LIVED, THREW, or RETURNED. The death test // fails in the latter three cases. // status: The exit status of the child process. On *nix, it is in the // in the format specified by wait(2). On Windows, this is the // value supplied to the ExitProcess() API or a numeric code // of the exception that terminated the program. // regex: A regular expression object to be applied to // the test's captured standard error output; the death test // fails if it does not match. // // Argument: // status_ok: true if exit_status is acceptable in the context of // this particular death test, which fails if it is false // // Returns true iff all of the above conditions are met. Otherwise, the // first failing condition, in the order given above, is the one that is // reported. Also sets the last death test message string. bool DeathTestImpl::Passed(bool status_ok) { if (!spawned()) return false; const std::string error_message = GetCapturedStderr(); bool success = false; Message buffer; buffer << "Death test: " << statement() << "\n"; switch (outcome()) { case LIVED: buffer << " Result: failed to die.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case THREW: buffer << " Result: threw an exception.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case RETURNED: buffer << " Result: illegal return in test statement.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case DIED: if (status_ok) { const bool matched = RE::PartialMatch(error_message.c_str(), *regex()); if (matched) { success = true; } else { buffer << " Result: died but not with expected error.\n" << " Expected: " << regex()->pattern() << "\n" << "Actual msg:\n" << FormatDeathTestOutput(error_message); } } else { buffer << " Result: died but not with expected exit code:\n" << " " << ExitSummary(status()) << "\n" << "Actual msg:\n" << FormatDeathTestOutput(error_message); } break; case IN_PROGRESS: default: GTEST_LOG_(FATAL) << "DeathTest::Passed somehow called before conclusion of test"; } DeathTest::set_last_death_test_message(buffer.GetString()); return success; } # if GTEST_OS_WINDOWS // WindowsDeathTest implements death tests on Windows. Due to the // specifics of starting new processes on Windows, death tests there are // always threadsafe, and Google Test considers the // --gtest_death_test_style=fast setting to be equivalent to // --gtest_death_test_style=threadsafe there. // // A few implementation notes: Like the Linux version, the Windows // implementation uses pipes for child-to-parent communication. But due to // the specifics of pipes on Windows, some extra steps are required: // // 1. The parent creates a communication pipe and stores handles to both // ends of it. // 2. The parent starts the child and provides it with the information // necessary to acquire the handle to the write end of the pipe. // 3. The child acquires the write end of the pipe and signals the parent // using a Windows event. // 4. Now the parent can release the write end of the pipe on its side. If // this is done before step 3, the object's reference count goes down to // 0 and it is destroyed, preventing the child from acquiring it. The // parent now has to release it, or read operations on the read end of // the pipe will not return when the child terminates. // 5. The parent reads child's output through the pipe (outcome code and // any possible error messages) from the pipe, and its stderr and then // determines whether to fail the test. // // Note: to distinguish Win32 API calls from the local method and function // calls, the former are explicitly resolved in the global namespace. // class WindowsDeathTest : public DeathTestImpl { public: WindowsDeathTest(const char* a_statement, const RE* a_regex, const char* file, int line) : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {} // All of these virtual functions are inherited from DeathTest. virtual int Wait(); virtual TestRole AssumeRole(); private: // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; // Handle to the write end of the pipe to the child process. AutoHandle write_handle_; // Child process handle. AutoHandle child_handle_; // Event the child process uses to signal the parent that it has // acquired the handle to the write end of the pipe. After seeing this // event the parent can release its own handles to make sure its // ReadFile() calls return when the child terminates. AutoHandle event_handle_; }; // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int WindowsDeathTest::Wait() { if (!spawned()) return 0; // Wait until the child either signals that it has acquired the write end // of the pipe or it dies. const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() }; switch (::WaitForMultipleObjects(2, wait_handles, FALSE, // Waits for any of the handles. INFINITE)) { case WAIT_OBJECT_0: case WAIT_OBJECT_0 + 1: break; default: GTEST_DEATH_TEST_CHECK_(false); // Should not get here. } // The child has acquired the write end of the pipe or exited. // We release the handle on our side and continue. write_handle_.Reset(); event_handle_.Reset(); ReadAndInterpretStatusByte(); // Waits for the child process to exit if it haven't already. This // returns immediately if the child has already exited, regardless of // whether previous calls to WaitForMultipleObjects synchronized on this // handle or not. GTEST_DEATH_TEST_CHECK_( WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(), INFINITE)); DWORD status_code; GTEST_DEATH_TEST_CHECK_( ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE); child_handle_.Reset(); set_status(static_cast(status_code)); return status(); } // The AssumeRole process for a Windows death test. It creates a child // process with the same executable as the current process to run the // death test. The child process is given the --gtest_filter and // --gtest_internal_run_death_test flags such that it knows to run the // current death test only. DeathTest::TestRole WindowsDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != NULL) { // ParseInternalRunDeathTestFlag() has performed all the necessary // processing. set_write_fd(flag->write_fd()); return EXECUTE_TEST; } // WindowsDeathTest uses an anonymous pipe to communicate results of // a death test. SECURITY_ATTRIBUTES handles_are_inheritable = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; HANDLE read_handle, write_handle; GTEST_DEATH_TEST_CHECK_( ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable, 0) // Default buffer size. != FALSE); set_read_fd(::_open_osfhandle(reinterpret_cast(read_handle), O_RDONLY)); write_handle_.Reset(write_handle); event_handle_.Reset(::CreateEvent( &handles_are_inheritable, TRUE, // The event will automatically reset to non-signaled state. FALSE, // The initial state is non-signalled. NULL)); // The even is unnamed. GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL); const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" + info->test_case_name() + "." + info->name(); const std::string internal_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "=" + file_ + "|" + StreamableToString(line_) + "|" + StreamableToString(death_test_index) + "|" + StreamableToString(static_cast(::GetCurrentProcessId())) + // size_t has the same width as pointers on both 32-bit and 64-bit // Windows platforms. // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx. "|" + StreamableToString(reinterpret_cast(write_handle)) + "|" + StreamableToString(reinterpret_cast(event_handle_.Get())); char executable_path[_MAX_PATH + 1]; // NOLINT GTEST_DEATH_TEST_CHECK_( _MAX_PATH + 1 != ::GetModuleFileNameA(NULL, executable_path, _MAX_PATH)); std::string command_line = std::string(::GetCommandLineA()) + " " + filter_flag + " \"" + internal_flag + "\""; DeathTest::set_last_death_test_message(""); CaptureStderr(); // Flush the log buffers since the log streams are shared with the child. FlushInfoLog(); // The child process will share the standard handles with the parent. STARTUPINFOA startup_info; memset(&startup_info, 0, sizeof(STARTUPINFO)); startup_info.dwFlags = STARTF_USESTDHANDLES; startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE); startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE); PROCESS_INFORMATION process_info; GTEST_DEATH_TEST_CHECK_(::CreateProcessA( executable_path, const_cast(command_line.c_str()), NULL, // Retuned process handle is not inheritable. NULL, // Retuned thread handle is not inheritable. TRUE, // Child inherits all inheritable handles (for write_handle_). 0x0, // Default creation flags. NULL, // Inherit the parent's environment. UnitTest::GetInstance()->original_working_dir(), &startup_info, &process_info) != FALSE); child_handle_.Reset(process_info.hProcess); ::CloseHandle(process_info.hThread); set_spawned(true); return OVERSEE_TEST; } # else // We are not on Windows. // ForkingDeathTest provides implementations for most of the abstract // methods of the DeathTest interface. Only the AssumeRole method is // left undefined. class ForkingDeathTest : public DeathTestImpl { public: ForkingDeathTest(const char* statement, const RE* regex); // All of these virtual functions are inherited from DeathTest. virtual int Wait(); protected: void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; } private: // PID of child process during death test; 0 in the child process itself. pid_t child_pid_; }; // Constructs a ForkingDeathTest. ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex) : DeathTestImpl(a_statement, a_regex), child_pid_(-1) {} // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int ForkingDeathTest::Wait() { if (!spawned()) return 0; ReadAndInterpretStatusByte(); int status_value; GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0)); set_status(status_value); return status_value; } // A concrete death test class that forks, then immediately runs the test // in the child process. class NoExecDeathTest : public ForkingDeathTest { public: NoExecDeathTest(const char* a_statement, const RE* a_regex) : ForkingDeathTest(a_statement, a_regex) { } virtual TestRole AssumeRole(); }; // The AssumeRole process for a fork-and-run death test. It implements a // straightforward fork, with a simple pipe to transmit the status byte. DeathTest::TestRole NoExecDeathTest::AssumeRole() { const size_t thread_count = GetThreadCount(); if (thread_count != 1) { GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count); } int pipe_fd[2]; GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); DeathTest::set_last_death_test_message(""); CaptureStderr(); // When we fork the process below, the log file buffers are copied, but the // file descriptors are shared. We flush all log files here so that closing // the file descriptors in the child process doesn't throw off the // synchronization between descriptors and buffers in the parent process. // This is as close to the fork as possible to avoid a race condition in case // there are multiple threads running before the death test, and another // thread writes to the log file. FlushInfoLog(); const pid_t child_pid = fork(); GTEST_DEATH_TEST_CHECK_(child_pid != -1); set_child_pid(child_pid); if (child_pid == 0) { GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0])); set_write_fd(pipe_fd[1]); // Redirects all logging to stderr in the child process to prevent // concurrent writes to the log files. We capture stderr in the parent // process and append the child process' output to a log. LogToStderr(); // Event forwarding to the listeners of event listener API mush be shut // down in death test subprocesses. GetUnitTestImpl()->listeners()->SuppressEventForwarding(); g_in_fast_death_test_child = true; return EXECUTE_TEST; } else { GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_read_fd(pipe_fd[0]); set_spawned(true); return OVERSEE_TEST; } } // A concrete death test class that forks and re-executes the main // program from the beginning, with command-line flags set that cause // only this specific death test to be run. class ExecDeathTest : public ForkingDeathTest { public: ExecDeathTest(const char* a_statement, const RE* a_regex, const char* file, int line) : ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { } virtual TestRole AssumeRole(); private: static ::std::vector GetArgvsForDeathTestChildProcess() { ::std::vector args = GetInjectableArgvs(); return args; } // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; }; // Utility class for accumulating command-line arguments. class Arguments { public: Arguments() { args_.push_back(NULL); } ~Arguments() { for (std::vector::iterator i = args_.begin(); i != args_.end(); ++i) { free(*i); } } void AddArgument(const char* argument) { args_.insert(args_.end() - 1, posix::StrDup(argument)); } template void AddArguments(const ::std::vector& arguments) { for (typename ::std::vector::const_iterator i = arguments.begin(); i != arguments.end(); ++i) { args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); } } char* const* Argv() { return &args_[0]; } private: std::vector args_; }; // A struct that encompasses the arguments to the child process of a // threadsafe-style death test process. struct ExecDeathTestArgs { char* const* argv; // Command-line arguments for the child's call to exec int close_fd; // File descriptor to close; the read end of a pipe }; # if GTEST_OS_MAC inline char** GetEnviron() { // When Google Test is built as a framework on MacOS X, the environ variable // is unavailable. Apple's documentation (man environ) recommends using // _NSGetEnviron() instead. return *_NSGetEnviron(); } # else // Some POSIX platforms expect you to declare environ. extern "C" makes // it reside in the global namespace. extern "C" char** environ; inline char** GetEnviron() { return environ; } # endif // GTEST_OS_MAC # if !GTEST_OS_QNX // The main function for a threadsafe-style death test child process. // This function is called in a clone()-ed process and thus must avoid // any potentially unsafe operations like malloc or libc functions. static int ExecDeathTestChildMain(void* child_arg) { ExecDeathTestArgs* const args = static_cast(child_arg); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd)); // We need to execute the test program in the same environment where // it was originally invoked. Therefore we change to the original // working directory first. const char* const original_dir = UnitTest::GetInstance()->original_working_dir(); // We can safely call chdir() as it's a direct system call. if (chdir(original_dir) != 0) { DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " + GetLastErrnoDescription()); return EXIT_FAILURE; } // We can safely call execve() as it's a direct system call. We // cannot use execvp() as it's a libc function and thus potentially // unsafe. Since execve() doesn't search the PATH, the user must // invoke the test program via a valid path that contains at least // one path separator. execve(args->argv[0], args->argv, GetEnviron()); DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " + original_dir + " failed: " + GetLastErrnoDescription()); return EXIT_FAILURE; } # endif // !GTEST_OS_QNX // Two utility routines that together determine the direction the stack // grows. // This could be accomplished more elegantly by a single recursive // function, but we want to guard against the unlikely possibility of // a smart compiler optimizing the recursion away. // // GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining // StackLowerThanAddress into StackGrowsDown, which then doesn't give // correct answer. void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_; void StackLowerThanAddress(const void* ptr, bool* result) { int dummy; *result = (&dummy < ptr); } bool StackGrowsDown() { int dummy; bool result; StackLowerThanAddress(&dummy, &result); return result; } // Spawns a child process with the same executable as the current process in // a thread-safe manner and instructs it to run the death test. The // implementation uses fork(2) + exec. On systems where clone(2) is // available, it is used instead, being slightly more thread-safe. On QNX, // fork supports only single-threaded environments, so this function uses // spawn(2) there instead. The function dies with an error message if // anything goes wrong. static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) { ExecDeathTestArgs args = { argv, close_fd }; pid_t child_pid = -1; # if GTEST_OS_QNX // Obtains the current directory and sets it to be closed in the child // process. const int cwd_fd = open(".", O_RDONLY); GTEST_DEATH_TEST_CHECK_(cwd_fd != -1); GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC)); // We need to execute the test program in the same environment where // it was originally invoked. Therefore we change to the original // working directory first. const char* const original_dir = UnitTest::GetInstance()->original_working_dir(); // We can safely call chdir() as it's a direct system call. if (chdir(original_dir) != 0) { DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " + GetLastErrnoDescription()); return EXIT_FAILURE; } int fd_flags; // Set close_fd to be closed after spawn. GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD)); GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD, fd_flags | FD_CLOEXEC)); struct inheritance inherit = {0}; // spawn is a system call. child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron()); // Restores the current working directory. GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd)); # else // GTEST_OS_QNX # if GTEST_OS_LINUX // When a SIGPROF signal is received while fork() or clone() are executing, // the process may hang. To avoid this, we ignore SIGPROF here and re-enable // it after the call to fork()/clone() is complete. struct sigaction saved_sigprof_action; struct sigaction ignore_sigprof_action; memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action)); sigemptyset(&ignore_sigprof_action.sa_mask); ignore_sigprof_action.sa_handler = SIG_IGN; GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction( SIGPROF, &ignore_sigprof_action, &saved_sigprof_action)); # endif // GTEST_OS_LINUX # if GTEST_HAS_CLONE const bool use_fork = GTEST_FLAG(death_test_use_fork); if (!use_fork) { static const bool stack_grows_down = StackGrowsDown(); const size_t stack_size = getpagesize(); // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED); // Maximum stack alignment in bytes: For a downward-growing stack, this // amount is subtracted from size of the stack space to get an address // that is within the stack space and is aligned on all systems we care // about. As far as I know there is no ABI with stack alignment greater // than 64. We assume stack and stack_size already have alignment of // kMaxStackAlignment. const size_t kMaxStackAlignment = 64; void* const stack_top = static_cast(stack) + (stack_grows_down ? stack_size - kMaxStackAlignment : 0); GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment && reinterpret_cast(stack_top) % kMaxStackAlignment == 0); child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args); GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1); } # else const bool use_fork = true; # endif // GTEST_HAS_CLONE if (use_fork && (child_pid = fork()) == 0) { ExecDeathTestChildMain(&args); _exit(0); } # endif // GTEST_OS_QNX # if GTEST_OS_LINUX GTEST_DEATH_TEST_CHECK_SYSCALL_( sigaction(SIGPROF, &saved_sigprof_action, NULL)); # endif // GTEST_OS_LINUX GTEST_DEATH_TEST_CHECK_(child_pid != -1); return child_pid; } // The AssumeRole process for a fork-and-exec death test. It re-executes the // main program from the beginning, setting the --gtest_filter // and --gtest_internal_run_death_test flags to cause only the current // death test to be re-run. DeathTest::TestRole ExecDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != NULL) { set_write_fd(flag->write_fd()); return EXECUTE_TEST; } int pipe_fd[2]; GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); // Clear the close-on-exec flag on the write end of the pipe, lest // it be closed when the child process does an exec: GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1); const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" + info->test_case_name() + "." + info->name(); const std::string internal_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "=" + file_ + "|" + StreamableToString(line_) + "|" + StreamableToString(death_test_index) + "|" + StreamableToString(pipe_fd[1]); Arguments args; args.AddArguments(GetArgvsForDeathTestChildProcess()); args.AddArgument(filter_flag.c_str()); args.AddArgument(internal_flag.c_str()); DeathTest::set_last_death_test_message(""); CaptureStderr(); // See the comment in NoExecDeathTest::AssumeRole for why the next line // is necessary. FlushInfoLog(); const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_child_pid(child_pid); set_read_fd(pipe_fd[0]); set_spawned(true); return OVERSEE_TEST; } # endif // !GTEST_OS_WINDOWS // Creates a concrete DeathTest-derived class that depends on the // --gtest_death_test_style flag, and sets the pointer pointed to // by the "test" argument to its address. If the test should be // skipped, sets that pointer to NULL. Returns true, unless the // flag is set to an invalid value. bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) { UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const int death_test_index = impl->current_test_info() ->increment_death_test_count(); if (flag != NULL) { if (death_test_index > flag->index()) { DeathTest::set_last_death_test_message( "Death test count (" + StreamableToString(death_test_index) + ") somehow exceeded expected maximum (" + StreamableToString(flag->index()) + ")"); return false; } if (!(flag->file() == file && flag->line() == line && flag->index() == death_test_index)) { *test = NULL; return true; } } # if GTEST_OS_WINDOWS if (GTEST_FLAG(death_test_style) == "threadsafe" || GTEST_FLAG(death_test_style) == "fast") { *test = new WindowsDeathTest(statement, regex, file, line); } # else if (GTEST_FLAG(death_test_style) == "threadsafe") { *test = new ExecDeathTest(statement, regex, file, line); } else if (GTEST_FLAG(death_test_style) == "fast") { *test = new NoExecDeathTest(statement, regex); } # endif // GTEST_OS_WINDOWS else { // NOLINT - this is more readable than unbalanced brackets inside #if. DeathTest::set_last_death_test_message( "Unknown death test style \"" + GTEST_FLAG(death_test_style) + "\" encountered"); return false; } return true; } // Splits a given string on a given delimiter, populating a given // vector with the fields. GTEST_HAS_DEATH_TEST implies that we have // ::std::string, so we can use it here. static void SplitString(const ::std::string& str, char delimiter, ::std::vector< ::std::string>* dest) { ::std::vector< ::std::string> parsed; ::std::string::size_type pos = 0; while (::testing::internal::AlwaysTrue()) { const ::std::string::size_type colon = str.find(delimiter, pos); if (colon == ::std::string::npos) { parsed.push_back(str.substr(pos)); break; } else { parsed.push_back(str.substr(pos, colon - pos)); pos = colon + 1; } } dest->swap(parsed); } # if GTEST_OS_WINDOWS // Recreates the pipe and event handles from the provided parameters, // signals the event, and returns a file descriptor wrapped around the pipe // handle. This function is called in the child process only. int GetStatusFileDescriptor(unsigned int parent_process_id, size_t write_handle_as_size_t, size_t event_handle_as_size_t) { AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE, FALSE, // Non-inheritable. parent_process_id)); if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) { DeathTestAbort("Unable to open parent process " + StreamableToString(parent_process_id)); } // TODO(vladl@google.com): Replace the following check with a // compile-time assertion when available. GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t)); const HANDLE write_handle = reinterpret_cast(write_handle_as_size_t); HANDLE dup_write_handle; // The newly initialized handle is accessible only in in the parent // process. To obtain one accessible within the child, we need to use // DuplicateHandle. if (!::DuplicateHandle(parent_process_handle.Get(), write_handle, ::GetCurrentProcess(), &dup_write_handle, 0x0, // Requested privileges ignored since // DUPLICATE_SAME_ACCESS is used. FALSE, // Request non-inheritable handler. DUPLICATE_SAME_ACCESS)) { DeathTestAbort("Unable to duplicate the pipe handle " + StreamableToString(write_handle_as_size_t) + " from the parent process " + StreamableToString(parent_process_id)); } const HANDLE event_handle = reinterpret_cast(event_handle_as_size_t); HANDLE dup_event_handle; if (!::DuplicateHandle(parent_process_handle.Get(), event_handle, ::GetCurrentProcess(), &dup_event_handle, 0x0, FALSE, DUPLICATE_SAME_ACCESS)) { DeathTestAbort("Unable to duplicate the event handle " + StreamableToString(event_handle_as_size_t) + " from the parent process " + StreamableToString(parent_process_id)); } const int write_fd = ::_open_osfhandle(reinterpret_cast(dup_write_handle), O_APPEND); if (write_fd == -1) { DeathTestAbort("Unable to convert pipe handle " + StreamableToString(write_handle_as_size_t) + " to a file descriptor"); } // Signals the parent that the write end of the pipe has been acquired // so the parent can release its own write end. ::SetEvent(dup_event_handle); return write_fd; } # endif // GTEST_OS_WINDOWS // Returns a newly created InternalRunDeathTestFlag object with fields // initialized from the GTEST_FLAG(internal_run_death_test) flag if // the flag is specified; otherwise returns NULL. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() { if (GTEST_FLAG(internal_run_death_test) == "") return NULL; // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we // can use it here. int line = -1; int index = -1; ::std::vector< ::std::string> fields; SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields); int write_fd = -1; # if GTEST_OS_WINDOWS unsigned int parent_process_id = 0; size_t write_handle_as_size_t = 0; size_t event_handle_as_size_t = 0; if (fields.size() != 6 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index) || !ParseNaturalNumber(fields[3], &parent_process_id) || !ParseNaturalNumber(fields[4], &write_handle_as_size_t) || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) { DeathTestAbort("Bad --gtest_internal_run_death_test flag: " + GTEST_FLAG(internal_run_death_test)); } write_fd = GetStatusFileDescriptor(parent_process_id, write_handle_as_size_t, event_handle_as_size_t); # else if (fields.size() != 4 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index) || !ParseNaturalNumber(fields[3], &write_fd)) { DeathTestAbort("Bad --gtest_internal_run_death_test flag: " + GTEST_FLAG(internal_run_death_test)); } # endif // GTEST_OS_WINDOWS return new InternalRunDeathTestFlag(fields[0], line, index, write_fd); } } // namespace internal #endif // GTEST_HAS_DEATH_TEST } // namespace testing stimfit-0.15.8/src/test/gtest/src/gtest_main.cc0000664000175000017500000000334513062445067016347 00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include "gtest/gtest.h" GTEST_API_ int main(int argc, char **argv) { printf("Running main() from gtest_main.cc\n"); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } stimfit-0.15.8/src/test/gtest/src/gtest-typed-test.cc0000664000175000017500000000726213062445067017445 00000000000000// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #include "gtest/gtest-typed-test.h" #include "gtest/gtest.h" namespace testing { namespace internal { #if GTEST_HAS_TYPED_TEST_P // Skips to the first non-space char in str. Returns an empty string if str // contains only whitespace characters. static const char* SkipSpaces(const char* str) { while (IsSpace(*str)) str++; return str; } // Verifies that registered_tests match the test names in // defined_test_names_; returns registered_tests if successful, or // aborts the program otherwise. const char* TypedTestCasePState::VerifyRegisteredTestNames( const char* file, int line, const char* registered_tests) { typedef ::std::set::const_iterator DefinedTestIter; registered_ = true; // Skip initial whitespace in registered_tests since some // preprocessors prefix stringizied literals with whitespace. registered_tests = SkipSpaces(registered_tests); Message errors; ::std::set tests; for (const char* names = registered_tests; names != NULL; names = SkipComma(names)) { const std::string name = GetPrefixUntilComma(names); if (tests.count(name) != 0) { errors << "Test " << name << " is listed more than once.\n"; continue; } bool found = false; for (DefinedTestIter it = defined_test_names_.begin(); it != defined_test_names_.end(); ++it) { if (name == *it) { found = true; break; } } if (found) { tests.insert(name); } else { errors << "No test named " << name << " can be found in this test case.\n"; } } for (DefinedTestIter it = defined_test_names_.begin(); it != defined_test_names_.end(); ++it) { if (tests.count(*it) == 0) { errors << "You forgot to list test " << *it << ".\n"; } } const std::string& errors_str = errors.GetString(); if (errors_str != "") { fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), errors_str.c_str()); fflush(stderr); posix::Abort(); } return registered_tests; } #endif // GTEST_HAS_TYPED_TEST_P } // namespace internal } // namespace testing stimfit-0.15.8/src/test/gtest/src/gtest-printers.cc0000664000175000017500000002776313062445067017221 00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Test - The Google C++ Testing Framework // // This file implements a universal value printer that can print a // value of any type T: // // void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); // // It uses the << operator when possible, and prints the bytes in the // object otherwise. A user can override its behavior for a class // type Foo by defining either operator<<(::std::ostream&, const Foo&) // or void PrintTo(const Foo&, ::std::ostream*) in the namespace that // defines Foo. #include "gtest/gtest-printers.h" #include #include #include // NOLINT #include #include "gtest/internal/gtest-port.h" namespace testing { namespace { using ::std::ostream; // Prints a segment of bytes in the given object. void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start, size_t count, ostream* os) { char text[5] = ""; for (size_t i = 0; i != count; i++) { const size_t j = start + i; if (i != 0) { // Organizes the bytes into groups of 2 for easy parsing by // human. if ((j % 2) == 0) *os << ' '; else *os << '-'; } GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]); *os << text; } } // Prints the bytes in the given value to the given ostream. void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, ostream* os) { // Tells the user how big the object is. *os << count << "-byte object <"; const size_t kThreshold = 132; const size_t kChunkSize = 64; // If the object size is bigger than kThreshold, we'll have to omit // some details by printing only the first and the last kChunkSize // bytes. // TODO(wan): let the user control the threshold using a flag. if (count < kThreshold) { PrintByteSegmentInObjectTo(obj_bytes, 0, count, os); } else { PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os); *os << " ... "; // Rounds up to 2-byte boundary. const size_t resume_pos = (count - kChunkSize + 1)/2*2; PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os); } *os << ">"; } } // namespace namespace internal2 { // Delegates to PrintBytesInObjectToImpl() to print the bytes in the // given object. The delegation simplifies the implementation, which // uses the << operator and thus is easier done outside of the // ::testing::internal namespace, which contains a << operator that // sometimes conflicts with the one in STL. void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, ostream* os) { PrintBytesInObjectToImpl(obj_bytes, count, os); } } // namespace internal2 namespace internal { // Depending on the value of a char (or wchar_t), we print it in one // of three formats: // - as is if it's a printable ASCII (e.g. 'a', '2', ' '), // - as a hexidecimal escape sequence (e.g. '\x7F'), or // - as a special escape sequence (e.g. '\r', '\n'). enum CharFormat { kAsIs, kHexEscape, kSpecialEscape }; // Returns true if c is a printable ASCII character. We test the // value of c directly instead of calling isprint(), which is buggy on // Windows Mobile. inline bool IsPrintableAscii(wchar_t c) { return 0x20 <= c && c <= 0x7E; } // Prints a wide or narrow char c as a character literal without the // quotes, escaping it when necessary; returns how c was formatted. // The template argument UnsignedChar is the unsigned version of Char, // which is the type of c. template static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { switch (static_cast(c)) { case L'\0': *os << "\\0"; break; case L'\'': *os << "\\'"; break; case L'\\': *os << "\\\\"; break; case L'\a': *os << "\\a"; break; case L'\b': *os << "\\b"; break; case L'\f': *os << "\\f"; break; case L'\n': *os << "\\n"; break; case L'\r': *os << "\\r"; break; case L'\t': *os << "\\t"; break; case L'\v': *os << "\\v"; break; default: if (IsPrintableAscii(c)) { *os << static_cast(c); return kAsIs; } else { *os << "\\x" + String::FormatHexInt(static_cast(c)); return kHexEscape; } } return kSpecialEscape; } // Prints a wchar_t c as if it's part of a string literal, escaping it when // necessary; returns how c was formatted. static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) { switch (c) { case L'\'': *os << "'"; return kAsIs; case L'"': *os << "\\\""; return kSpecialEscape; default: return PrintAsCharLiteralTo(c, os); } } // Prints a char c as if it's part of a string literal, escaping it when // necessary; returns how c was formatted. static CharFormat PrintAsStringLiteralTo(char c, ostream* os) { return PrintAsStringLiteralTo( static_cast(static_cast(c)), os); } // Prints a wide or narrow character c and its code. '\0' is printed // as "'\\0'", other unprintable characters are also properly escaped // using the standard C++ escape sequence. The template argument // UnsignedChar is the unsigned version of Char, which is the type of c. template void PrintCharAndCodeTo(Char c, ostream* os) { // First, print c as a literal in the most readable form we can find. *os << ((sizeof(c) > 1) ? "L'" : "'"); const CharFormat format = PrintAsCharLiteralTo(c, os); *os << "'"; // To aid user debugging, we also print c's code in decimal, unless // it's 0 (in which case c was printed as '\\0', making the code // obvious). if (c == 0) return; *os << " (" << static_cast(c); // For more convenience, we print c's code again in hexidecimal, // unless c was already printed in the form '\x##' or the code is in // [1, 9]. if (format == kHexEscape || (1 <= c && c <= 9)) { // Do nothing. } else { *os << ", 0x" << String::FormatHexInt(static_cast(c)); } *os << ")"; } void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); } void PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); } // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its code. L'\0' is printed as "L'\\0'". void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo(wc, os); } // Prints the given array of characters to the ostream. CharType must be either // char or wchar_t. // The array starts at begin, the length is len, it may include '\0' characters // and may not be NUL-terminated. template static void PrintCharsAsStringTo( const CharType* begin, size_t len, ostream* os) { const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\""; *os << kQuoteBegin; bool is_previous_hex = false; for (size_t index = 0; index < len; ++index) { const CharType cur = begin[index]; if (is_previous_hex && IsXDigit(cur)) { // Previous character is of '\x..' form and this character can be // interpreted as another hexadecimal digit in its number. Break string to // disambiguate. *os << "\" " << kQuoteBegin; } is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape; } *os << "\""; } // Prints a (const) char/wchar_t array of 'len' elements, starting at address // 'begin'. CharType must be either char or wchar_t. template static void UniversalPrintCharArray( const CharType* begin, size_t len, ostream* os) { // The code // const char kFoo[] = "foo"; // generates an array of 4, not 3, elements, with the last one being '\0'. // // Therefore when printing a char array, we don't print the last element if // it's '\0', such that the output matches the string literal as it's // written in the source code. if (len > 0 && begin[len - 1] == '\0') { PrintCharsAsStringTo(begin, len - 1, os); return; } // If, however, the last element in the array is not '\0', e.g. // const char kFoo[] = { 'f', 'o', 'o' }; // we must print the entire array. We also print a message to indicate // that the array is not NUL-terminated. PrintCharsAsStringTo(begin, len, os); *os << " (no terminating NUL)"; } // Prints a (const) char array of 'len' elements, starting at address 'begin'. void UniversalPrintArray(const char* begin, size_t len, ostream* os) { UniversalPrintCharArray(begin, len, os); } // Prints a (const) wchar_t array of 'len' elements, starting at address // 'begin'. void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) { UniversalPrintCharArray(begin, len, os); } // Prints the given C string to the ostream. void PrintTo(const char* s, ostream* os) { if (s == NULL) { *os << "NULL"; } else { *os << ImplicitCast_(s) << " pointing to "; PrintCharsAsStringTo(s, strlen(s), os); } } // MSVC compiler can be configured to define whar_t as a typedef // of unsigned short. Defining an overload for const wchar_t* in that case // would cause pointers to unsigned shorts be printed as wide strings, // possibly accessing more memory than intended and causing invalid // memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when // wchar_t is implemented as a native type. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Prints the given wide C string to the ostream. void PrintTo(const wchar_t* s, ostream* os) { if (s == NULL) { *os << "NULL"; } else { *os << ImplicitCast_(s) << " pointing to "; PrintCharsAsStringTo(s, wcslen(s), os); } } #endif // wchar_t is native // Prints a ::string object. #if GTEST_HAS_GLOBAL_STRING void PrintStringTo(const ::string& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_GLOBAL_STRING void PrintStringTo(const ::std::string& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } // Prints a ::wstring object. #if GTEST_HAS_GLOBAL_WSTRING void PrintWideStringTo(const ::wstring& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_GLOBAL_WSTRING #if GTEST_HAS_STD_WSTRING void PrintWideStringTo(const ::std::wstring& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_STD_WSTRING } // namespace internal } // namespace testing stimfit-0.15.8/src/test/gtest/src/gtest-port.cc0000664000175000017500000006551213062445067016331 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #include "gtest/internal/gtest-port.h" #include #include #include #include #if GTEST_OS_WINDOWS_MOBILE # include // For TerminateProcess() #elif GTEST_OS_WINDOWS # include # include #else # include #endif // GTEST_OS_WINDOWS_MOBILE #if GTEST_OS_MAC # include # include # include #endif // GTEST_OS_MAC #if GTEST_OS_QNX # include # include #endif // GTEST_OS_QNX #include "gtest/gtest-spi.h" #include "gtest/gtest-message.h" #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-string.h" // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to // prevent a user from accidentally including gtest-internal-inl.h in // his code. #define GTEST_IMPLEMENTATION_ 1 #include "src/gtest-internal-inl.h" #undef GTEST_IMPLEMENTATION_ namespace testing { namespace internal { #if defined(_MSC_VER) || defined(__BORLANDC__) // MSVC and C++Builder do not provide a definition of STDERR_FILENO. const int kStdOutFileno = 1; const int kStdErrFileno = 2; #else const int kStdOutFileno = STDOUT_FILENO; const int kStdErrFileno = STDERR_FILENO; #endif // _MSC_VER #if GTEST_OS_MAC // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. size_t GetThreadCount() { const task_t task = mach_task_self(); mach_msg_type_number_t thread_count; thread_act_array_t thread_list; const kern_return_t status = task_threads(task, &thread_list, &thread_count); if (status == KERN_SUCCESS) { // task_threads allocates resources in thread_list and we need to free them // to avoid leaks. vm_deallocate(task, reinterpret_cast(thread_list), sizeof(thread_t) * thread_count); return static_cast(thread_count); } else { return 0; } } #elif GTEST_OS_QNX // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. size_t GetThreadCount() { const int fd = open("/proc/self/as", O_RDONLY); if (fd < 0) { return 0; } procfs_info process_info; const int status = devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL); close(fd); if (status == EOK) { return static_cast(process_info.num_threads); } else { return 0; } } #else size_t GetThreadCount() { // There's no portable way to detect the number of threads, so we just // return 0 to indicate that we cannot detect it. return 0; } #endif // GTEST_OS_MAC #if GTEST_USES_POSIX_RE // Implements RE. Currently only needed for death tests. RE::~RE() { if (is_valid_) { // regfree'ing an invalid regex might crash because the content // of the regex is undefined. Since the regex's are essentially // the same, one cannot be valid (or invalid) without the other // being so too. regfree(&partial_regex_); regfree(&full_regex_); } free(const_cast(pattern_)); } // Returns true iff regular expression re matches the entire str. bool RE::FullMatch(const char* str, const RE& re) { if (!re.is_valid_) return false; regmatch_t match; return regexec(&re.full_regex_, str, 1, &match, 0) == 0; } // Returns true iff regular expression re matches a substring of str // (including str itself). bool RE::PartialMatch(const char* str, const RE& re) { if (!re.is_valid_) return false; regmatch_t match; return regexec(&re.partial_regex_, str, 1, &match, 0) == 0; } // Initializes an RE from its string representation. void RE::Init(const char* regex) { pattern_ = posix::StrDup(regex); // Reserves enough bytes to hold the regular expression used for a // full match. const size_t full_regex_len = strlen(regex) + 10; char* const full_pattern = new char[full_regex_len]; snprintf(full_pattern, full_regex_len, "^(%s)$", regex); is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0; // We want to call regcomp(&partial_regex_, ...) even if the // previous expression returns false. Otherwise partial_regex_ may // not be properly initialized can may cause trouble when it's // freed. // // Some implementation of POSIX regex (e.g. on at least some // versions of Cygwin) doesn't accept the empty string as a valid // regex. We change it to an equivalent form "()" to be safe. if (is_valid_) { const char* const partial_regex = (*regex == '\0') ? "()" : regex; is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0; } EXPECT_TRUE(is_valid_) << "Regular expression \"" << regex << "\" is not a valid POSIX Extended regular expression."; delete[] full_pattern; } #elif GTEST_USES_SIMPLE_RE // Returns true iff ch appears anywhere in str (excluding the // terminating '\0' character). bool IsInSet(char ch, const char* str) { return ch != '\0' && strchr(str, ch) != NULL; } // Returns true iff ch belongs to the given classification. Unlike // similar functions in , these aren't affected by the // current locale. bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; } bool IsAsciiPunct(char ch) { return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"); } bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); } bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); } bool IsAsciiWordChar(char ch) { return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9') || ch == '_'; } // Returns true iff "\\c" is a supported escape sequence. bool IsValidEscape(char c) { return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW")); } // Returns true iff the given atom (specified by escaped and pattern) // matches ch. The result is undefined if the atom is invalid. bool AtomMatchesChar(bool escaped, char pattern_char, char ch) { if (escaped) { // "\\p" where p is pattern_char. switch (pattern_char) { case 'd': return IsAsciiDigit(ch); case 'D': return !IsAsciiDigit(ch); case 'f': return ch == '\f'; case 'n': return ch == '\n'; case 'r': return ch == '\r'; case 's': return IsAsciiWhiteSpace(ch); case 'S': return !IsAsciiWhiteSpace(ch); case 't': return ch == '\t'; case 'v': return ch == '\v'; case 'w': return IsAsciiWordChar(ch); case 'W': return !IsAsciiWordChar(ch); } return IsAsciiPunct(pattern_char) && pattern_char == ch; } return (pattern_char == '.' && ch != '\n') || pattern_char == ch; } // Helper function used by ValidateRegex() to format error messages. std::string FormatRegexSyntaxError(const char* regex, int index) { return (Message() << "Syntax error at index " << index << " in simple regular expression \"" << regex << "\": ").GetString(); } // Generates non-fatal failures and returns false if regex is invalid; // otherwise returns true. bool ValidateRegex(const char* regex) { if (regex == NULL) { // TODO(wan@google.com): fix the source file location in the // assertion failures to match where the regex is used in user // code. ADD_FAILURE() << "NULL is not a valid simple regular expression."; return false; } bool is_valid = true; // True iff ?, *, or + can follow the previous atom. bool prev_repeatable = false; for (int i = 0; regex[i]; i++) { if (regex[i] == '\\') { // An escape sequence i++; if (regex[i] == '\0') { ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) << "'\\' cannot appear at the end."; return false; } if (!IsValidEscape(regex[i])) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) << "invalid escape sequence \"\\" << regex[i] << "\"."; is_valid = false; } prev_repeatable = true; } else { // Not an escape sequence. const char ch = regex[i]; if (ch == '^' && i > 0) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'^' can only appear at the beginning."; is_valid = false; } else if (ch == '$' && regex[i + 1] != '\0') { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'$' can only appear at the end."; is_valid = false; } else if (IsInSet(ch, "()[]{}|")) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'" << ch << "' is unsupported."; is_valid = false; } else if (IsRepeat(ch) && !prev_repeatable) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'" << ch << "' can only follow a repeatable token."; is_valid = false; } prev_repeatable = !IsInSet(ch, "^$?*+"); } } return is_valid; } // Matches a repeated regex atom followed by a valid simple regular // expression. The regex atom is defined as c if escaped is false, // or \c otherwise. repeat is the repetition meta character (?, *, // or +). The behavior is undefined if str contains too many // characters to be indexable by size_t, in which case the test will // probably time out anyway. We are fine with this limitation as // std::string has it too. bool MatchRepetitionAndRegexAtHead( bool escaped, char c, char repeat, const char* regex, const char* str) { const size_t min_count = (repeat == '+') ? 1 : 0; const size_t max_count = (repeat == '?') ? 1 : static_cast(-1) - 1; // We cannot call numeric_limits::max() as it conflicts with the // max() macro on Windows. for (size_t i = 0; i <= max_count; ++i) { // We know that the atom matches each of the first i characters in str. if (i >= min_count && MatchRegexAtHead(regex, str + i)) { // We have enough matches at the head, and the tail matches too. // Since we only care about *whether* the pattern matches str // (as opposed to *how* it matches), there is no need to find a // greedy match. return true; } if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i])) return false; } return false; } // Returns true iff regex matches a prefix of str. regex must be a // valid simple regular expression and not start with "^", or the // result is undefined. bool MatchRegexAtHead(const char* regex, const char* str) { if (*regex == '\0') // An empty regex matches a prefix of anything. return true; // "$" only matches the end of a string. Note that regex being // valid guarantees that there's nothing after "$" in it. if (*regex == '$') return *str == '\0'; // Is the first thing in regex an escape sequence? const bool escaped = *regex == '\\'; if (escaped) ++regex; if (IsRepeat(regex[1])) { // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so // here's an indirect recursion. It terminates as the regex gets // shorter in each recursion. return MatchRepetitionAndRegexAtHead( escaped, regex[0], regex[1], regex + 2, str); } else { // regex isn't empty, isn't "$", and doesn't start with a // repetition. We match the first atom of regex with the first // character of str and recurse. return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) && MatchRegexAtHead(regex + 1, str + 1); } } // Returns true iff regex matches any substring of str. regex must be // a valid simple regular expression, or the result is undefined. // // The algorithm is recursive, but the recursion depth doesn't exceed // the regex length, so we won't need to worry about running out of // stack space normally. In rare cases the time complexity can be // exponential with respect to the regex length + the string length, // but usually it's must faster (often close to linear). bool MatchRegexAnywhere(const char* regex, const char* str) { if (regex == NULL || str == NULL) return false; if (*regex == '^') return MatchRegexAtHead(regex + 1, str); // A successful match can be anywhere in str. do { if (MatchRegexAtHead(regex, str)) return true; } while (*str++ != '\0'); return false; } // Implements the RE class. RE::~RE() { free(const_cast(pattern_)); free(const_cast(full_pattern_)); } // Returns true iff regular expression re matches the entire str. bool RE::FullMatch(const char* str, const RE& re) { return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str); } // Returns true iff regular expression re matches a substring of str // (including str itself). bool RE::PartialMatch(const char* str, const RE& re) { return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str); } // Initializes an RE from its string representation. void RE::Init(const char* regex) { pattern_ = full_pattern_ = NULL; if (regex != NULL) { pattern_ = posix::StrDup(regex); } is_valid_ = ValidateRegex(regex); if (!is_valid_) { // No need to calculate the full pattern when the regex is invalid. return; } const size_t len = strlen(regex); // Reserves enough bytes to hold the regular expression used for a // full match: we need space to prepend a '^', append a '$', and // terminate the string with '\0'. char* buffer = static_cast(malloc(len + 3)); full_pattern_ = buffer; if (*regex != '^') *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'. // We don't use snprintf or strncpy, as they trigger a warning when // compiled with VC++ 8.0. memcpy(buffer, regex, len); buffer += len; if (len == 0 || regex[len - 1] != '$') *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'. *buffer = '\0'; } #endif // GTEST_USES_POSIX_RE const char kUnknownFile[] = "unknown file"; // Formats a source file path and a line number as they would appear // in an error message from the compiler used to compile this code. GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) { const std::string file_name(file == NULL ? kUnknownFile : file); if (line < 0) { return file_name + ":"; } #ifdef _MSC_VER return file_name + "(" + StreamableToString(line) + "):"; #else return file_name + ":" + StreamableToString(line) + ":"; #endif // _MSC_VER } // Formats a file location for compiler-independent XML output. // Although this function is not platform dependent, we put it next to // FormatFileLocation in order to contrast the two functions. // Note that FormatCompilerIndependentFileLocation() does NOT append colon // to the file location it produces, unlike FormatFileLocation(). GTEST_API_ ::std::string FormatCompilerIndependentFileLocation( const char* file, int line) { const std::string file_name(file == NULL ? kUnknownFile : file); if (line < 0) return file_name; else return file_name + ":" + StreamableToString(line); } GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) : severity_(severity) { const char* const marker = severity == GTEST_INFO ? "[ INFO ]" : severity == GTEST_WARNING ? "[WARNING]" : severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]"; GetStream() << ::std::endl << marker << " " << FormatFileLocation(file, line).c_str() << ": "; } // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. GTestLog::~GTestLog() { GetStream() << ::std::endl; if (severity_ == GTEST_FATAL) { fflush(stderr); posix::Abort(); } } // Disable Microsoft deprecation warnings for POSIX functions called from // this class (creat, dup, dup2, and close) #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable: 4996) #endif // _MSC_VER #if GTEST_HAS_STREAM_REDIRECTION // Object that captures an output stream (stdout/stderr). class CapturedStream { public: // The ctor redirects the stream to a temporary file. explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) { # if GTEST_OS_WINDOWS char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path); const UINT success = ::GetTempFileNameA(temp_dir_path, "gtest_redir", 0, // Generate unique file name. temp_file_path); GTEST_CHECK_(success != 0) << "Unable to create a temporary file in " << temp_dir_path; const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file " << temp_file_path; filename_ = temp_file_path; # else // There's no guarantee that a test has write access to the current // directory, so we create the temporary file in the /tmp directory // instead. We use /tmp on most systems, and /sdcard on Android. // That's because Android doesn't have /tmp. # if GTEST_OS_LINUX_ANDROID // Note: Android applications are expected to call the framework's // Context.getExternalStorageDirectory() method through JNI to get // the location of the world-writable SD Card directory. However, // this requires a Context handle, which cannot be retrieved // globally from native code. Doing so also precludes running the // code as part of a regular standalone executable, which doesn't // run in a Dalvik process (e.g. when running it through 'adb shell'). // // The location /sdcard is directly accessible from native code // and is the only location (unofficially) supported by the Android // team. It's generally a symlink to the real SD Card mount point // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or // other OEM-customized locations. Never rely on these, and always // use /sdcard. char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX"; # else char name_template[] = "/tmp/captured_stream.XXXXXX"; # endif // GTEST_OS_LINUX_ANDROID const int captured_fd = mkstemp(name_template); filename_ = name_template; # endif // GTEST_OS_WINDOWS fflush(NULL); dup2(captured_fd, fd_); close(captured_fd); } ~CapturedStream() { remove(filename_.c_str()); } std::string GetCapturedString() { if (uncaptured_fd_ != -1) { // Restores the original stream. fflush(NULL); dup2(uncaptured_fd_, fd_); close(uncaptured_fd_); uncaptured_fd_ = -1; } FILE* const file = posix::FOpen(filename_.c_str(), "r"); const std::string content = ReadEntireFile(file); posix::FClose(file); return content; } private: // Reads the entire content of a file as an std::string. static std::string ReadEntireFile(FILE* file); // Returns the size (in bytes) of a file. static size_t GetFileSize(FILE* file); const int fd_; // A stream to capture. int uncaptured_fd_; // Name of the temporary file holding the stderr output. ::std::string filename_; GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); }; // Returns the size (in bytes) of a file. size_t CapturedStream::GetFileSize(FILE* file) { fseek(file, 0, SEEK_END); return static_cast(ftell(file)); } // Reads the entire content of a file as a string. std::string CapturedStream::ReadEntireFile(FILE* file) { const size_t file_size = GetFileSize(file); char* const buffer = new char[file_size]; size_t bytes_last_read = 0; // # of bytes read in the last fread() size_t bytes_read = 0; // # of bytes read so far fseek(file, 0, SEEK_SET); // Keeps reading the file until we cannot read further or the // pre-determined file size is reached. do { bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); bytes_read += bytes_last_read; } while (bytes_last_read > 0 && bytes_read < file_size); const std::string content(buffer, bytes_read); delete[] buffer; return content; } # ifdef _MSC_VER # pragma warning(pop) # endif // _MSC_VER static CapturedStream* g_captured_stderr = NULL; static CapturedStream* g_captured_stdout = NULL; // Starts capturing an output stream (stdout/stderr). void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) { if (*stream != NULL) { GTEST_LOG_(FATAL) << "Only one " << stream_name << " capturer can exist at a time."; } *stream = new CapturedStream(fd); } // Stops capturing the output stream and returns the captured string. std::string GetCapturedStream(CapturedStream** captured_stream) { const std::string content = (*captured_stream)->GetCapturedString(); delete *captured_stream; *captured_stream = NULL; return content; } // Starts capturing stdout. void CaptureStdout() { CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout); } // Starts capturing stderr. void CaptureStderr() { CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr); } // Stops capturing stdout and returns the captured string. std::string GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); } // Stops capturing stderr and returns the captured string. std::string GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); } #endif // GTEST_HAS_STREAM_REDIRECTION #if GTEST_HAS_DEATH_TEST // A copy of all command line arguments. Set by InitGoogleTest(). ::std::vector g_argvs; static const ::std::vector* g_injected_test_argvs = NULL; // Owned. void SetInjectableArgvs(const ::std::vector* argvs) { if (g_injected_test_argvs != argvs) delete g_injected_test_argvs; g_injected_test_argvs = argvs; } const ::std::vector& GetInjectableArgvs() { if (g_injected_test_argvs != NULL) { return *g_injected_test_argvs; } return g_argvs; } #endif // GTEST_HAS_DEATH_TEST #if GTEST_OS_WINDOWS_MOBILE namespace posix { void Abort() { DebugBreak(); TerminateProcess(GetCurrentProcess(), 1); } } // namespace posix #endif // GTEST_OS_WINDOWS_MOBILE // Returns the name of the environment variable corresponding to the // given flag. For example, FlagToEnvVar("foo") will return // "GTEST_FOO" in the open-source version. static std::string FlagToEnvVar(const char* flag) { const std::string full_flag = (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); Message env_var; for (size_t i = 0; i != full_flag.length(); i++) { env_var << ToUpper(full_flag.c_str()[i]); } return env_var.GetString(); } // Parses 'str' for a 32-bit signed integer. If successful, writes // the result to *value and returns true; otherwise leaves *value // unchanged and returns false. bool ParseInt32(const Message& src_text, const char* str, Int32* value) { // Parses the environment variable as a decimal integer. char* end = NULL; const long long_value = strtol(str, &end, 10); // NOLINT // Has strtol() consumed all characters in the string? if (*end != '\0') { // No - an invalid character was encountered. Message msg; msg << "WARNING: " << src_text << " is expected to be a 32-bit integer, but actually" << " has value \"" << str << "\".\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; } // Is the parsed value in the range of an Int32? const Int32 result = static_cast(long_value); if (long_value == LONG_MAX || long_value == LONG_MIN || // The parsed value overflows as a long. (strtol() returns // LONG_MAX or LONG_MIN when the input overflows.) result != long_value // The parsed value overflows as an Int32. ) { Message msg; msg << "WARNING: " << src_text << " is expected to be a 32-bit integer, but actually" << " has value " << str << ", which overflows.\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; } *value = result; return true; } // Reads and returns the Boolean environment variable corresponding to // the given flag; if it's not set, returns default_value. // // The value is considered true iff it's not "0". bool BoolFromGTestEnv(const char* flag, bool default_value) { const std::string env_var = FlagToEnvVar(flag); const char* const string_value = posix::GetEnv(env_var.c_str()); return string_value == NULL ? default_value : strcmp(string_value, "0") != 0; } // Reads and returns a 32-bit integer stored in the environment // variable corresponding to the given flag; if it isn't set or // doesn't represent a valid 32-bit integer, returns default_value. Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { const std::string env_var = FlagToEnvVar(flag); const char* const string_value = posix::GetEnv(env_var.c_str()); if (string_value == NULL) { // The environment variable is not set. return default_value; } Int32 result = default_value; if (!ParseInt32(Message() << "Environment variable " << env_var, string_value, &result)) { printf("The default value %s is used.\n", (Message() << default_value).GetString().c_str()); fflush(stdout); return default_value; } return result; } // Reads and returns the string environment variable corresponding to // the given flag; if it's not set, returns default_value. const char* StringFromGTestEnv(const char* flag, const char* default_value) { const std::string env_var = FlagToEnvVar(flag); const char* const value = posix::GetEnv(env_var.c_str()); return value == NULL ? default_value : value; } } // namespace internal } // namespace testing stimfit-0.15.8/src/test/gtest/COPYING0000664000175000017500000000270313062445067014147 00000000000000Copyright 2008, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. stimfit-0.15.8/src/test/gtest/README0000664000175000017500000003733213062445067014002 00000000000000Google C++ Testing Framework ============================ http://code.google.com/p/googletest/ Overview -------- Google's framework for writing C++ tests on a variety of platforms (Linux, Mac OS X, Windows, Windows CE, Symbian, etc). Based on the xUnit architecture. Supports automatic test discovery, a rich set of assertions, user-defined assertions, death tests, fatal and non-fatal failures, various options for running the tests, and XML test report generation. Please see the project page above for more information as well as the mailing list for questions, discussions, and development. There is also an IRC channel on OFTC (irc.oftc.net) #gtest available. Please join us! Requirements for End Users -------------------------- Google Test is designed to have fairly minimal requirements to build and use with your projects, but there are some. Currently, we support Linux, Windows, Mac OS X, and Cygwin. We will also make our best effort to support other platforms (e.g. Solaris, AIX, and z/OS). However, since core members of the Google Test project have no access to these platforms, Google Test may have outstanding issues there. If you notice any problems on your platform, please notify googletestframework@googlegroups.com. Patches for fixing them are even more welcome! ### Linux Requirements ### These are the base requirements to build and use Google Test from a source package (as described below): * GNU-compatible Make or gmake * POSIX-standard shell * POSIX(-2) Regular Expressions (regex.h) * A C++98-standard-compliant compiler ### Windows Requirements ### * Microsoft Visual C++ 7.1 or newer ### Cygwin Requirements ### * Cygwin 1.5.25-14 or newer ### Mac OS X Requirements ### * Mac OS X 10.4 Tiger or newer * Developer Tools Installed Also, you'll need CMake 2.6.4 or higher if you want to build the samples using the provided CMake script, regardless of the platform. Requirements for Contributors ----------------------------- We welcome patches. If you plan to contribute a patch, you need to build Google Test and its own tests from an SVN checkout (described below), which has further requirements: * Python version 2.3 or newer (for running some of the tests and re-generating certain source files from templates) * CMake 2.6.4 or newer Getting the Source ------------------ There are two primary ways of getting Google Test's source code: you can download a stable source release in your preferred archive format, or directly check out the source from our Subversion (SVN) repositary. The SVN checkout requires a few extra steps and some extra software packages on your system, but lets you track the latest development and make patches much more easily, so we highly encourage it. ### Source Package ### Google Test is released in versioned source packages which can be downloaded from the download page [1]. Several different archive formats are provided, but the only difference is the tools used to manipulate them, and the size of the resulting file. Download whichever you are most comfortable with. [1] http://code.google.com/p/googletest/downloads/list Once the package is downloaded, expand it using whichever tools you prefer for that type. This will result in a new directory with the name "gtest-X.Y.Z" which contains all of the source code. Here are some examples on Linux: tar -xvzf gtest-X.Y.Z.tar.gz tar -xvjf gtest-X.Y.Z.tar.bz2 unzip gtest-X.Y.Z.zip ### SVN Checkout ### To check out the main branch (also known as the "trunk") of Google Test, run the following Subversion command: svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn Setting up the Build -------------------- To build Google Test and your tests that use it, you need to tell your build system where to find its headers and source files. The exact way to do it depends on which build system you use, and is usually straightforward. ### Generic Build Instructions ### Suppose you put Google Test in directory ${GTEST_DIR}. To build it, create a library build target (or a project as called by Visual Studio and Xcode) to compile ${GTEST_DIR}/src/gtest-all.cc with ${GTEST_DIR}/include in the system header search path and ${GTEST_DIR} in the normal header search path. Assuming a Linux-like system and gcc, something like the following will do: g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \ -pthread -c ${GTEST_DIR}/src/gtest-all.cc ar -rv libgtest.a gtest-all.o (We need -pthread as Google Test uses threads.) Next, you should compile your test source file with ${GTEST_DIR}/include in the system header search path, and link it with gtest and any other necessary libraries: g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a \ -o your_test As an example, the make/ directory contains a Makefile that you can use to build Google Test on systems where GNU make is available (e.g. Linux, Mac OS X, and Cygwin). It doesn't try to build Google Test's own tests. Instead, it just builds the Google Test library and a sample test. You can use it as a starting point for your own build script. If the default settings are correct for your environment, the following commands should succeed: cd ${GTEST_DIR}/make make ./sample1_unittest If you see errors, try to tweak the contents of make/Makefile to make them go away. There are instructions in make/Makefile on how to do it. ### Using CMake ### Google Test comes with a CMake build script (CMakeLists.txt) that can be used on a wide range of platforms ("C" stands for cross-platofrm.). If you don't have CMake installed already, you can download it for free from http://www.cmake.org/. CMake works by generating native makefiles or build projects that can be used in the compiler environment of your choice. The typical workflow starts with: mkdir mybuild # Create a directory to hold the build output. cd mybuild cmake ${GTEST_DIR} # Generate native build scripts. If you want to build Google Test's samples, you should replace the last command with cmake -Dgtest_build_samples=ON ${GTEST_DIR} If you are on a *nix system, you should now see a Makefile in the current directory. Just type 'make' to build gtest. If you use Windows and have Vistual Studio installed, a gtest.sln file and several .vcproj files will be created. You can then build them using Visual Studio. On Mac OS X with Xcode installed, a .xcodeproj file will be generated. ### Legacy Build Scripts ### Before settling on CMake, we have been providing hand-maintained build projects/scripts for Visual Studio, Xcode, and Autotools. While we continue to provide them for convenience, they are not actively maintained any more. We highly recommend that you follow the instructions in the previous two sections to integrate Google Test with your existing build system. If you still need to use the legacy build scripts, here's how: The msvc\ folder contains two solutions with Visual C++ projects. Open the gtest.sln or gtest-md.sln file using Visual Studio, and you are ready to build Google Test the same way you build any Visual Studio project. Files that have names ending with -md use DLL versions of Microsoft runtime libraries (the /MD or the /MDd compiler option). Files without that suffix use static versions of the runtime libraries (the /MT or the /MTd option). Please note that one must use the same option to compile both gtest and the test code. If you use Visual Studio 2005 or above, we recommend the -md version as /MD is the default for new projects in these versions of Visual Studio. On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using Xcode. Build the "gtest" target. The universal binary framework will end up in your selected build directory (selected in the Xcode "Preferences..." -> "Building" pane and defaults to xcode/build). Alternatively, at the command line, enter: xcodebuild This will build the "Release" configuration of gtest.framework in your default build location. See the "xcodebuild" man page for more information about building different configurations and building in different locations. If you wish to use the Google Test Xcode project with Xcode 4.x and above, you need to either: * update the SDK configuration options in xcode/Config/General.xconfig. Comment options SDKROOT, MACOS_DEPLOYMENT_TARGET, and GCC_VERSION. If you choose this route you lose the ability to target earlier versions of MacOS X. * Install an SDK for an earlier version. This doesn't appear to be supported by Apple, but has been reported to work (http://stackoverflow.com/questions/5378518). Tweaking Google Test -------------------- Google Test can be used in diverse environments. The default configuration may not work (or may not work well) out of the box in some environments. However, you can easily tweak Google Test by defining control macros on the compiler command line. Generally, these macros are named like GTEST_XYZ and you define them to either 1 or 0 to enable or disable a certain feature. We list the most frequently used macros below. For a complete list, see file include/gtest/internal/gtest-port.h. ### Choosing a TR1 Tuple Library ### Some Google Test features require the C++ Technical Report 1 (TR1) tuple library, which is not yet available with all compilers. The good news is that Google Test implements a subset of TR1 tuple that's enough for its own need, and will automatically use this when the compiler doesn't provide TR1 tuple. Usually you don't need to care about which tuple library Google Test uses. However, if your project already uses TR1 tuple, you need to tell Google Test to use the same TR1 tuple library the rest of your project uses, or the two tuple implementations will clash. To do that, add -DGTEST_USE_OWN_TR1_TUPLE=0 to the compiler flags while compiling Google Test and your tests. If you want to force Google Test to use its own tuple library, just add -DGTEST_USE_OWN_TR1_TUPLE=1 to the compiler flags instead. If you don't want Google Test to use tuple at all, add -DGTEST_HAS_TR1_TUPLE=0 and all features using tuple will be disabled. ### Multi-threaded Tests ### Google Test is thread-safe where the pthread library is available. After #include "gtest/gtest.h", you can check the GTEST_IS_THREADSAFE macro to see whether this is the case (yes if the macro is #defined to 1, no if it's undefined.). If Google Test doesn't correctly detect whether pthread is available in your environment, you can force it with -DGTEST_HAS_PTHREAD=1 or -DGTEST_HAS_PTHREAD=0 When Google Test uses pthread, you may need to add flags to your compiler and/or linker to select the pthread library, or you'll get link errors. If you use the CMake script or the deprecated Autotools script, this is taken care of for you. If you use your own build script, you'll need to read your compiler and linker's manual to figure out what flags to add. ### As a Shared Library (DLL) ### Google Test is compact, so most users can build and link it as a static library for the simplicity. You can choose to use Google Test as a shared library (known as a DLL on Windows) if you prefer. To compile *gtest* as a shared library, add -DGTEST_CREATE_SHARED_LIBRARY=1 to the compiler flags. You'll also need to tell the linker to produce a shared library instead - consult your linker's manual for how to do it. To compile your *tests* that use the gtest shared library, add -DGTEST_LINKED_AS_SHARED_LIBRARY=1 to the compiler flags. Note: while the above steps aren't technically necessary today when using some compilers (e.g. GCC), they may become necessary in the future, if we decide to improve the speed of loading the library (see http://gcc.gnu.org/wiki/Visibility for details). Therefore you are recommended to always add the above flags when using Google Test as a shared library. Otherwise a future release of Google Test may break your build script. ### Avoiding Macro Name Clashes ### In C++, macros don't obey namespaces. Therefore two libraries that both define a macro of the same name will clash if you #include both definitions. In case a Google Test macro clashes with another library, you can force Google Test to rename its macro to avoid the conflict. Specifically, if both Google Test and some other code define macro FOO, you can add -DGTEST_DONT_DEFINE_FOO=1 to the compiler flags to tell Google Test to change the macro's name from FOO to GTEST_FOO. Currently FOO can be FAIL, SUCCEED, or TEST. For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write GTEST_TEST(SomeTest, DoesThis) { ... } instead of TEST(SomeTest, DoesThis) { ... } in order to define a test. Upgrating from an Earlier Version --------------------------------- We strive to keep Google Test releases backward compatible. Sometimes, though, we have to make some breaking changes for the users' long-term benefits. This section describes what you'll need to do if you are upgrading from an earlier version of Google Test. ### Upgrading from 1.3.0 or Earlier ### You may need to explicitly enable or disable Google Test's own TR1 tuple library. See the instructions in section "Choosing a TR1 Tuple Library". ### Upgrading from 1.4.0 or Earlier ### The Autotools build script (configure + make) is no longer officially supportted. You are encouraged to migrate to your own build system or use CMake. If you still need to use Autotools, you can find instructions in the README file from Google Test 1.4.0. On platforms where the pthread library is available, Google Test uses it in order to be thread-safe. See the "Multi-threaded Tests" section for what this means to your build script. If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google Test will no longer compile. This should affect very few people, as a large portion of STL (including ) doesn't compile in this mode anyway. We decided to stop supporting it in order to greatly simplify Google Test's implementation. Developing Google Test ---------------------- This section discusses how to make your own changes to Google Test. ### Testing Google Test Itself ### To make sure your changes work as intended and don't break existing functionality, you'll want to compile and run Google Test's own tests. For that you can use CMake: mkdir mybuild cd mybuild cmake -Dgtest_build_tests=ON ${GTEST_DIR} Make sure you have Python installed, as some of Google Test's tests are written in Python. If the cmake command complains about not being able to find Python ("Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)"), try telling it explicitly where your Python executable can be found: cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR} Next, you can build Google Test and all of its own tests. On *nix, this is usually done by 'make'. To run the tests, do make test All tests should pass. ### Regenerating Source Files ### Some of Google Test's source files are generated from templates (not in the C++ sense) using a script. A template file is named FOO.pump, where FOO is the name of the file it will generate. For example, the file include/gtest/internal/gtest-type-util.h.pump is used to generate gtest-type-util.h in the same directory. Normally you don't need to worry about regenerating the source files, unless you need to modify them. In that case, you should modify the corresponding .pump files instead and run the pump.py Python script to regenerate them. You can find pump.py in the scripts/ directory. Read the Pump manual [2] for how to use it. [2] http://code.google.com/p/googletest/wiki/PumpManual ### Contributing a Patch ### We welcome patches. Please read the Google Test developer's guide [3] for how you can contribute. In particular, make sure you have signed the Contributor License Agreement, or we won't be able to accept the patch. [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide Happy testing! stimfit-0.15.8/src/test/gtest/CONTRIBUTORS0000664000175000017500000000251613062445067014776 00000000000000# This file contains a list of people who've made non-trivial # contribution to the Google C++ Testing Framework project. People # who commit code to the project are encouraged to add their names # here. Please keep the list sorted by first names. Ajay Joshi Balázs Dán Bharat Mediratta Chandler Carruth Chris Prince Chris Taylor Dan Egnor Eric Roman Hady Zalek Jeffrey Yasskin Jói Sigurðsson Keir Mierle Keith Ray Kenton Varda Manuel Klimek Markus Heule Mika Raento Miklós Fazekas Pasi Valminen Patrick Hanna Patrick Riley Peter Kaminski Preston Jackson Rainer Klaffenboeck Russ Cox Russ Rufer Sean Mcafee Sigurður Ãsgeirsson Tracy Bialik Vadim Berman Vlad Losev Zhanyong Wan stimfit-0.15.8/src/test/gtest/include/0000775000175000017500000000000013315356571014617 500000000000000stimfit-0.15.8/src/test/gtest/include/gtest/0000775000175000017500000000000013315356571015745 500000000000000stimfit-0.15.8/src/test/gtest/include/gtest/gtest_prod.h0000664000175000017500000000442413062445067020212 00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // Google C++ Testing Framework definitions useful in production code. #ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ #define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ // When you need to test the private or protected members of a class, // use the FRIEND_TEST macro to declare your tests as friends of the // class. For example: // // class MyClass { // private: // void MyMethod(); // FRIEND_TEST(MyClassTest, MyMethod); // }; // // class MyClassTest : public testing::Test { // // ... // }; // // TEST_F(MyClassTest, MyMethod) { // // Can call MyClass::MyMethod() here. // } #define FRIEND_TEST(test_case_name, test_name)\ friend class test_case_name##_##test_name##_Test #endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest.h0000664000175000017500000025456213062445067017200 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the public API for Google Test. It should be // included by any test program that uses Google Test. // // IMPORTANT NOTE: Due to limitation of the C++ language, we have to // leave some internal implementation details in this header file. // They are clearly marked by comments like this: // // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // // Such code is NOT meant to be used by a user directly, and is subject // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user // program! // // Acknowledgment: Google Test borrowed the idea of automatic test // registration from Barthelemy Dagenais' (barthelemy@prologique.com) // easyUnit framework. #ifndef GTEST_INCLUDE_GTEST_GTEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_H_ #include #include #include #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-string.h" #include "gtest/gtest-death-test.h" #include "gtest/gtest-message.h" #include "gtest/gtest-param-test.h" #include "gtest/gtest-printers.h" #include "gtest/gtest_prod.h" #include "gtest/gtest-test-part.h" #include "gtest/gtest-typed-test.h" // Depending on the platform, different string classes are available. // On Linux, in addition to ::std::string, Google also makes use of // class ::string, which has the same interface as ::std::string, but // has a different implementation. // // The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that // ::string is available AND is a distinct type to ::std::string, or // define it to 0 to indicate otherwise. // // If the user's ::std::string and ::string are the same class due to // aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0. // // If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined // heuristically. namespace testing { // Declares the flags. // This flag temporary enables the disabled tests. GTEST_DECLARE_bool_(also_run_disabled_tests); // This flag brings the debugger on an assertion failure. GTEST_DECLARE_bool_(break_on_failure); // This flag controls whether Google Test catches all test-thrown exceptions // and logs them as failures. GTEST_DECLARE_bool_(catch_exceptions); // This flag enables using colors in terminal output. Available values are // "yes" to enable colors, "no" (disable colors), or "auto" (the default) // to let Google Test decide. GTEST_DECLARE_string_(color); // This flag sets up the filter to select by name using a glob pattern // the tests to run. If the filter is not given all tests are executed. GTEST_DECLARE_string_(filter); // This flag causes the Google Test to list tests. None of the tests listed // are actually run if the flag is provided. GTEST_DECLARE_bool_(list_tests); // This flag controls whether Google Test emits a detailed XML report to a file // in addition to its normal textual output. GTEST_DECLARE_string_(output); // This flags control whether Google Test prints the elapsed time for each // test. GTEST_DECLARE_bool_(print_time); // This flag specifies the random number seed. GTEST_DECLARE_int32_(random_seed); // This flag sets how many times the tests are repeated. The default value // is 1. If the value is -1 the tests are repeating forever. GTEST_DECLARE_int32_(repeat); // This flag controls whether Google Test includes Google Test internal // stack frames in failure stack traces. GTEST_DECLARE_bool_(show_internal_stack_frames); // When this flag is specified, tests' order is randomized on every iteration. GTEST_DECLARE_bool_(shuffle); // This flag specifies the maximum number of stack frames to be // printed in a failure message. GTEST_DECLARE_int32_(stack_trace_depth); // When this flag is specified, a failed assertion will throw an // exception if exceptions are enabled, or exit the program with a // non-zero code otherwise. GTEST_DECLARE_bool_(throw_on_failure); // When this flag is set with a "host:port" string, on supported // platforms test results are streamed to the specified port on // the specified host machine. GTEST_DECLARE_string_(stream_result_to); // The upper limit for valid stack trace depths. const int kMaxStackTraceDepth = 100; namespace internal { class AssertHelper; class DefaultGlobalTestPartResultReporter; class ExecDeathTest; class NoExecDeathTest; class FinalSuccessChecker; class GTestFlagSaver; class StreamingListenerTest; class TestResultAccessor; class TestEventListenersAccessor; class TestEventRepeater; class UnitTestRecordPropertyTestHelper; class WindowsDeathTest; class UnitTestImpl* GetUnitTestImpl(); void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const std::string& message); } // namespace internal // The friend relationship of some of these classes is cyclic. // If we don't forward declare them the compiler might confuse the classes // in friendship clauses with same named classes on the scope. class Test; class TestCase; class TestInfo; class UnitTest; // A class for indicating whether an assertion was successful. When // the assertion wasn't successful, the AssertionResult object // remembers a non-empty message that describes how it failed. // // To create an instance of this class, use one of the factory functions // (AssertionSuccess() and AssertionFailure()). // // This class is useful for two purposes: // 1. Defining predicate functions to be used with Boolean test assertions // EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts // 2. Defining predicate-format functions to be // used with predicate assertions (ASSERT_PRED_FORMAT*, etc). // // For example, if you define IsEven predicate: // // testing::AssertionResult IsEven(int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess(); // else // return testing::AssertionFailure() << n << " is odd"; // } // // Then the failed expectation EXPECT_TRUE(IsEven(Fib(5))) // will print the message // // Value of: IsEven(Fib(5)) // Actual: false (5 is odd) // Expected: true // // instead of a more opaque // // Value of: IsEven(Fib(5)) // Actual: false // Expected: true // // in case IsEven is a simple Boolean predicate. // // If you expect your predicate to be reused and want to support informative // messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up // about half as often as positive ones in our tests), supply messages for // both success and failure cases: // // testing::AssertionResult IsEven(int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess() << n << " is even"; // else // return testing::AssertionFailure() << n << " is odd"; // } // // Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print // // Value of: IsEven(Fib(6)) // Actual: true (8 is even) // Expected: false // // NB: Predicates that support negative Boolean assertions have reduced // performance in positive ones so be careful not to use them in tests // that have lots (tens of thousands) of positive Boolean assertions. // // To use this class with EXPECT_PRED_FORMAT assertions such as: // // // Verifies that Foo() returns an even number. // EXPECT_PRED_FORMAT1(IsEven, Foo()); // // you need to define: // // testing::AssertionResult IsEven(const char* expr, int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess(); // else // return testing::AssertionFailure() // << "Expected: " << expr << " is even\n Actual: it's " << n; // } // // If Foo() returns 5, you will see the following message: // // Expected: Foo() is even // Actual: it's 5 // class GTEST_API_ AssertionResult { public: // Copy constructor. // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult(const AssertionResult& other); // Used in the EXPECT_TRUE/FALSE(bool_expression). explicit AssertionResult(bool success) : success_(success) {} // Returns true iff the assertion succeeded. operator bool() const { return success_; } // NOLINT // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. AssertionResult operator!() const; // Returns the text streamed into this AssertionResult. Test assertions // use it when they fail (i.e., the predicate's outcome doesn't match the // assertion's expectation). When nothing has been streamed into the // object, returns an empty string. const char* message() const { return message_.get() != NULL ? message_->c_str() : ""; } // TODO(vladl@google.com): Remove this after making sure no clients use it. // Deprecated; please use message() instead. const char* failure_message() const { return message(); } // Streams a custom failure message into this object. template AssertionResult& operator<<(const T& value) { AppendMessage(Message() << value); return *this; } // Allows streaming basic output manipulators such as endl or flush into // this object. AssertionResult& operator<<( ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) { AppendMessage(Message() << basic_manipulator); return *this; } private: // Appends the contents of message to message_. void AppendMessage(const Message& a_message) { if (message_.get() == NULL) message_.reset(new ::std::string); message_->append(a_message.GetString().c_str()); } // Stores result of the assertion predicate. bool success_; // Stores the message describing the condition in case the expectation // construct is not satisfied with the predicate's outcome. // Referenced via a pointer to avoid taking too much stack frame space // with test assertions. internal::scoped_ptr< ::std::string> message_; GTEST_DISALLOW_ASSIGN_(AssertionResult); }; // Makes a successful assertion result. GTEST_API_ AssertionResult AssertionSuccess(); // Makes a failed assertion result. GTEST_API_ AssertionResult AssertionFailure(); // Makes a failed assertion result with the given failure message. // Deprecated; use AssertionFailure() << msg. GTEST_API_ AssertionResult AssertionFailure(const Message& msg); // The abstract class that all tests inherit from. // // In Google Test, a unit test program contains one or many TestCases, and // each TestCase contains one or many Tests. // // When you define a test using the TEST macro, you don't need to // explicitly derive from Test - the TEST macro automatically does // this for you. // // The only time you derive from Test is when defining a test fixture // to be used a TEST_F. For example: // // class FooTest : public testing::Test { // protected: // virtual void SetUp() { ... } // virtual void TearDown() { ... } // ... // }; // // TEST_F(FooTest, Bar) { ... } // TEST_F(FooTest, Baz) { ... } // // Test is not copyable. class GTEST_API_ Test { public: friend class TestInfo; // Defines types for pointers to functions that set up and tear down // a test case. typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc; typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc; // The d'tor is virtual as we intend to inherit from Test. virtual ~Test(); // Sets up the stuff shared by all tests in this test case. // // Google Test will call Foo::SetUpTestCase() before running the first // test in test case Foo. Hence a sub-class can define its own // SetUpTestCase() method to shadow the one defined in the super // class. static void SetUpTestCase() {} // Tears down the stuff shared by all tests in this test case. // // Google Test will call Foo::TearDownTestCase() after running the last // test in test case Foo. Hence a sub-class can define its own // TearDownTestCase() method to shadow the one defined in the super // class. static void TearDownTestCase() {} // Returns true iff the current test has a fatal failure. static bool HasFatalFailure(); // Returns true iff the current test has a non-fatal failure. static bool HasNonfatalFailure(); // Returns true iff the current test has a (either fatal or // non-fatal) failure. static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); } // Logs a property for the current test, test case, or for the entire // invocation of the test program when used outside of the context of a // test case. Only the last value for a given key is remembered. These // are public static so they can be called from utility functions that are // not members of the test fixture. Calls to RecordProperty made during // lifespan of the test (from the moment its constructor starts to the // moment its destructor finishes) will be output in XML as attributes of // the element. Properties recorded from fixture's // SetUpTestCase or TearDownTestCase are logged as attributes of the // corresponding element. Calls to RecordProperty made in the // global context (before or after invocation of RUN_ALL_TESTS and from // SetUp/TearDown method of Environment objects registered with Google // Test) will be output as attributes of the element. static void RecordProperty(const std::string& key, const std::string& value); static void RecordProperty(const std::string& key, int value); protected: // Creates a Test object. Test(); // Sets up the test fixture. virtual void SetUp(); // Tears down the test fixture. virtual void TearDown(); private: // Returns true iff the current test has the same fixture class as // the first test in the current test case. static bool HasSameFixtureClass(); // Runs the test after the test fixture has been set up. // // A sub-class must implement this to define the test logic. // // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM. // Instead, use the TEST or TEST_F macro. virtual void TestBody() = 0; // Sets up, executes, and tears down the test. void Run(); // Deletes self. We deliberately pick an unusual name for this // internal method to avoid clashing with names used in user TESTs. void DeleteSelf_() { delete this; } // Uses a GTestFlagSaver to save and restore all Google Test flags. const internal::GTestFlagSaver* const gtest_flag_saver_; // Often a user mis-spells SetUp() as Setup() and spends a long time // wondering why it is never called by Google Test. The declaration of // the following method is solely for catching such an error at // compile time: // // - The return type is deliberately chosen to be not void, so it // will be a conflict if a user declares void Setup() in his test // fixture. // // - This method is private, so it will be another compiler error // if a user calls it from his test fixture. // // DO NOT OVERRIDE THIS FUNCTION. // // If you see an error about overriding the following function or // about it being private, you have mis-spelled SetUp() as Setup(). struct Setup_should_be_spelled_SetUp {}; virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; } // We disallow copying Tests. GTEST_DISALLOW_COPY_AND_ASSIGN_(Test); }; typedef internal::TimeInMillis TimeInMillis; // A copyable object representing a user specified test property which can be // output as a key/value string pair. // // Don't inherit from TestProperty as its destructor is not virtual. class TestProperty { public: // C'tor. TestProperty does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestProperty object. TestProperty(const std::string& a_key, const std::string& a_value) : key_(a_key), value_(a_value) { } // Gets the user supplied key. const char* key() const { return key_.c_str(); } // Gets the user supplied value. const char* value() const { return value_.c_str(); } // Sets a new value, overriding the one supplied in the constructor. void SetValue(const std::string& new_value) { value_ = new_value; } private: // The key supplied by the user. std::string key_; // The value supplied by the user. std::string value_; }; // The result of a single Test. This includes a list of // TestPartResults, a list of TestProperties, a count of how many // death tests there are in the Test, and how much time it took to run // the Test. // // TestResult is not copyable. class GTEST_API_ TestResult { public: // Creates an empty TestResult. TestResult(); // D'tor. Do not inherit from TestResult. ~TestResult(); // Gets the number of all test parts. This is the sum of the number // of successful test parts and the number of failed test parts. int total_part_count() const; // Returns the number of the test properties. int test_property_count() const; // Returns true iff the test passed (i.e. no test part failed). bool Passed() const { return !Failed(); } // Returns true iff the test failed. bool Failed() const; // Returns true iff the test fatally failed. bool HasFatalFailure() const; // Returns true iff the test has a non-fatal failure. bool HasNonfatalFailure() const; // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns the i-th test part result among all the results. i can range // from 0 to test_property_count() - 1. If i is not in that range, aborts // the program. const TestPartResult& GetTestPartResult(int i) const; // Returns the i-th test property. i can range from 0 to // test_property_count() - 1. If i is not in that range, aborts the // program. const TestProperty& GetTestProperty(int i) const; private: friend class TestInfo; friend class TestCase; friend class UnitTest; friend class internal::DefaultGlobalTestPartResultReporter; friend class internal::ExecDeathTest; friend class internal::TestResultAccessor; friend class internal::UnitTestImpl; friend class internal::WindowsDeathTest; // Gets the vector of TestPartResults. const std::vector& test_part_results() const { return test_part_results_; } // Gets the vector of TestProperties. const std::vector& test_properties() const { return test_properties_; } // Sets the elapsed time. void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; } // Adds a test property to the list. The property is validated and may add // a non-fatal failure if invalid (e.g., if it conflicts with reserved // key names). If a property is already recorded for the same key, the // value will be updated, rather than storing multiple values for the same // key. xml_element specifies the element for which the property is being // recorded and is used for validation. void RecordProperty(const std::string& xml_element, const TestProperty& test_property); // Adds a failure if the key is a reserved attribute of Google Test // testcase tags. Returns true if the property is valid. // TODO(russr): Validate attribute names are legal and human readable. static bool ValidateTestProperty(const std::string& xml_element, const TestProperty& test_property); // Adds a test part result to the list. void AddTestPartResult(const TestPartResult& test_part_result); // Returns the death test count. int death_test_count() const { return death_test_count_; } // Increments the death test count, returning the new count. int increment_death_test_count() { return ++death_test_count_; } // Clears the test part results. void ClearTestPartResults(); // Clears the object. void Clear(); // Protects mutable state of the property vector and of owned // properties, whose values may be updated. internal::Mutex test_properites_mutex_; // The vector of TestPartResults std::vector test_part_results_; // The vector of TestProperties std::vector test_properties_; // Running count of death tests. int death_test_count_; // The elapsed time, in milliseconds. TimeInMillis elapsed_time_; // We disallow copying TestResult. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult); }; // class TestResult // A TestInfo object stores the following information about a test: // // Test case name // Test name // Whether the test should be run // A function pointer that creates the test object when invoked // Test result // // The constructor of TestInfo registers itself with the UnitTest // singleton such that the RUN_ALL_TESTS() macro knows which tests to // run. class GTEST_API_ TestInfo { public: // Destructs a TestInfo object. This function is not virtual, so // don't inherit from TestInfo. ~TestInfo(); // Returns the test case name. const char* test_case_name() const { return test_case_name_.c_str(); } // Returns the test name. const char* name() const { return name_.c_str(); } // Returns the name of the parameter type, or NULL if this is not a typed // or a type-parameterized test. const char* type_param() const { if (type_param_.get() != NULL) return type_param_->c_str(); return NULL; } // Returns the text representation of the value parameter, or NULL if this // is not a value-parameterized test. const char* value_param() const { if (value_param_.get() != NULL) return value_param_->c_str(); return NULL; } // Returns true if this test should run, that is if the test is not // disabled (or it is disabled but the also_run_disabled_tests flag has // been specified) and its full name matches the user-specified filter. // // Google Test allows the user to filter the tests by their full names. // The full name of a test Bar in test case Foo is defined as // "Foo.Bar". Only the tests that match the filter will run. // // A filter is a colon-separated list of glob (not regex) patterns, // optionally followed by a '-' and a colon-separated list of // negative patterns (tests to exclude). A test is run if it // matches one of the positive patterns and does not match any of // the negative patterns. // // For example, *A*:Foo.* is a filter that matches any string that // contains the character 'A' or starts with "Foo.". bool should_run() const { return should_run_; } // Returns true iff this test will appear in the XML report. bool is_reportable() const { // For now, the XML report includes all tests matching the filter. // In the future, we may trim tests that are excluded because of // sharding. return matches_filter_; } // Returns the result of the test. const TestResult* result() const { return &result_; } private: #if GTEST_HAS_DEATH_TEST friend class internal::DefaultDeathTestFactory; #endif // GTEST_HAS_DEATH_TEST friend class Test; friend class TestCase; friend class internal::UnitTestImpl; friend class internal::StreamingListenerTest; friend TestInfo* internal::MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* type_param, const char* value_param, internal::TypeId fixture_class_id, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc, internal::TestFactoryBase* factory); // Constructs a TestInfo object. The newly constructed instance assumes // ownership of the factory object. TestInfo(const std::string& test_case_name, const std::string& name, const char* a_type_param, // NULL if not a type-parameterized test const char* a_value_param, // NULL if not a value-parameterized test internal::TypeId fixture_class_id, internal::TestFactoryBase* factory); // Increments the number of death tests encountered in this test so // far. int increment_death_test_count() { return result_.increment_death_test_count(); } // Creates the test object, runs it, records its result, and then // deletes it. void Run(); static void ClearTestResult(TestInfo* test_info) { test_info->result_.Clear(); } // These fields are immutable properties of the test. const std::string test_case_name_; // Test case name const std::string name_; // Test name // Name of the parameter type, or NULL if this is not a typed or a // type-parameterized test. const internal::scoped_ptr type_param_; // Text representation of the value parameter, or NULL if this is not a // value-parameterized test. const internal::scoped_ptr value_param_; const internal::TypeId fixture_class_id_; // ID of the test fixture class bool should_run_; // True iff this test should run bool is_disabled_; // True iff this test is disabled bool matches_filter_; // True if this test matches the // user-specified filter. internal::TestFactoryBase* const factory_; // The factory that creates // the test object // This field is mutable and needs to be reset before running the // test for the second time. TestResult result_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo); }; // A test case, which consists of a vector of TestInfos. // // TestCase is not copyable. class GTEST_API_ TestCase { public: // Creates a TestCase with the given name. // // TestCase does NOT have a default constructor. Always use this // constructor to create a TestCase object. // // Arguments: // // name: name of the test case // a_type_param: the name of the test's type parameter, or NULL if // this is not a type-parameterized test. // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case TestCase(const char* name, const char* a_type_param, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc); // Destructor of TestCase. virtual ~TestCase(); // Gets the name of the TestCase. const char* name() const { return name_.c_str(); } // Returns the name of the parameter type, or NULL if this is not a // type-parameterized test case. const char* type_param() const { if (type_param_.get() != NULL) return type_param_->c_str(); return NULL; } // Returns true if any test in this test case should run. bool should_run() const { return should_run_; } // Gets the number of successful tests in this test case. int successful_test_count() const; // Gets the number of failed tests in this test case. int failed_test_count() const; // Gets the number of disabled tests that will be reported in the XML report. int reportable_disabled_test_count() const; // Gets the number of disabled tests in this test case. int disabled_test_count() const; // Gets the number of tests to be printed in the XML report. int reportable_test_count() const; // Get the number of tests in this test case that should run. int test_to_run_count() const; // Gets the number of all tests in this test case. int total_test_count() const; // Returns true iff the test case passed. bool Passed() const { return !Failed(); } // Returns true iff the test case failed. bool Failed() const { return failed_test_count() > 0; } // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. const TestInfo* GetTestInfo(int i) const; // Returns the TestResult that holds test properties recorded during // execution of SetUpTestCase and TearDownTestCase. const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; } private: friend class Test; friend class internal::UnitTestImpl; // Gets the (mutable) vector of TestInfos in this TestCase. std::vector& test_info_list() { return test_info_list_; } // Gets the (immutable) vector of TestInfos in this TestCase. const std::vector& test_info_list() const { return test_info_list_; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. TestInfo* GetMutableTestInfo(int i); // Sets the should_run member. void set_should_run(bool should) { should_run_ = should; } // Adds a TestInfo to this test case. Will delete the TestInfo upon // destruction of the TestCase object. void AddTestInfo(TestInfo * test_info); // Clears the results of all tests in this test case. void ClearResult(); // Clears the results of all tests in the given test case. static void ClearTestCaseResult(TestCase* test_case) { test_case->ClearResult(); } // Runs every test in this TestCase. void Run(); // Runs SetUpTestCase() for this TestCase. This wrapper is needed // for catching exceptions thrown from SetUpTestCase(). void RunSetUpTestCase() { (*set_up_tc_)(); } // Runs TearDownTestCase() for this TestCase. This wrapper is // needed for catching exceptions thrown from TearDownTestCase(). void RunTearDownTestCase() { (*tear_down_tc_)(); } // Returns true iff test passed. static bool TestPassed(const TestInfo* test_info) { return test_info->should_run() && test_info->result()->Passed(); } // Returns true iff test failed. static bool TestFailed(const TestInfo* test_info) { return test_info->should_run() && test_info->result()->Failed(); } // Returns true iff the test is disabled and will be reported in the XML // report. static bool TestReportableDisabled(const TestInfo* test_info) { return test_info->is_reportable() && test_info->is_disabled_; } // Returns true iff test is disabled. static bool TestDisabled(const TestInfo* test_info) { return test_info->is_disabled_; } // Returns true iff this test will appear in the XML report. static bool TestReportable(const TestInfo* test_info) { return test_info->is_reportable(); } // Returns true if the given test should run. static bool ShouldRunTest(const TestInfo* test_info) { return test_info->should_run(); } // Shuffles the tests in this test case. void ShuffleTests(internal::Random* random); // Restores the test order to before the first shuffle. void UnshuffleTests(); // Name of the test case. std::string name_; // Name of the parameter type, or NULL if this is not a typed or a // type-parameterized test. const internal::scoped_ptr type_param_; // The vector of TestInfos in their original order. It owns the // elements in the vector. std::vector test_info_list_; // Provides a level of indirection for the test list to allow easy // shuffling and restoring the test order. The i-th element in this // vector is the index of the i-th test in the shuffled test list. std::vector test_indices_; // Pointer to the function that sets up the test case. Test::SetUpTestCaseFunc set_up_tc_; // Pointer to the function that tears down the test case. Test::TearDownTestCaseFunc tear_down_tc_; // True iff any test in this test case should run. bool should_run_; // Elapsed time, in milliseconds. TimeInMillis elapsed_time_; // Holds test properties recorded during execution of SetUpTestCase and // TearDownTestCase. TestResult ad_hoc_test_result_; // We disallow copying TestCases. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase); }; // An Environment object is capable of setting up and tearing down an // environment. The user should subclass this to define his own // environment(s). // // An Environment object does the set-up and tear-down in virtual // methods SetUp() and TearDown() instead of the constructor and the // destructor, as: // // 1. You cannot safely throw from a destructor. This is a problem // as in some cases Google Test is used where exceptions are enabled, and // we may want to implement ASSERT_* using exceptions where they are // available. // 2. You cannot use ASSERT_* directly in a constructor or // destructor. class Environment { public: // The d'tor is virtual as we need to subclass Environment. virtual ~Environment() {} // Override this to define how to set up the environment. virtual void SetUp() {} // Override this to define how to tear down the environment. virtual void TearDown() {} private: // If you see an error about overriding the following function or // about it being private, you have mis-spelled SetUp() as Setup(). struct Setup_should_be_spelled_SetUp {}; virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; } }; // The interface for tracing execution of tests. The methods are organized in // the order the corresponding events are fired. class TestEventListener { public: virtual ~TestEventListener() {} // Fired before any test activity starts. virtual void OnTestProgramStart(const UnitTest& unit_test) = 0; // Fired before each iteration of tests starts. There may be more than // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration // index, starting from 0. virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration) = 0; // Fired before environment set-up for each iteration of tests starts. virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0; // Fired after environment set-up for each iteration of tests ends. virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0; // Fired before the test case starts. virtual void OnTestCaseStart(const TestCase& test_case) = 0; // Fired before the test starts. virtual void OnTestStart(const TestInfo& test_info) = 0; // Fired after a failed assertion or a SUCCEED() invocation. virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0; // Fired after the test ends. virtual void OnTestEnd(const TestInfo& test_info) = 0; // Fired after the test case ends. virtual void OnTestCaseEnd(const TestCase& test_case) = 0; // Fired before environment tear-down for each iteration of tests starts. virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0; // Fired after environment tear-down for each iteration of tests ends. virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0; // Fired after each iteration of tests finishes. virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration) = 0; // Fired after all test activities have ended. virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0; }; // The convenience class for users who need to override just one or two // methods and are not concerned that a possible change to a signature of // the methods they override will not be caught during the build. For // comments about each method please see the definition of TestEventListener // above. class EmptyTestEventListener : public TestEventListener { public: virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationStart(const UnitTest& /*unit_test*/, int /*iteration*/) {} virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {} virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestCaseStart(const TestCase& /*test_case*/) {} virtual void OnTestStart(const TestInfo& /*test_info*/) {} virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {} virtual void OnTestEnd(const TestInfo& /*test_info*/) {} virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {} virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {} virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/, int /*iteration*/) {} virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} }; // TestEventListeners lets users add listeners to track events in Google Test. class GTEST_API_ TestEventListeners { public: TestEventListeners(); ~TestEventListeners(); // Appends an event listener to the end of the list. Google Test assumes // the ownership of the listener (i.e. it will delete the listener when // the test program finishes). void Append(TestEventListener* listener); // Removes the given event listener from the list and returns it. It then // becomes the caller's responsibility to delete the listener. Returns // NULL if the listener is not found in the list. TestEventListener* Release(TestEventListener* listener); // Returns the standard listener responsible for the default console // output. Can be removed from the listeners list to shut down default // console output. Note that removing this object from the listener list // with Release transfers its ownership to the caller and makes this // function return NULL the next time. TestEventListener* default_result_printer() const { return default_result_printer_; } // Returns the standard listener responsible for the default XML output // controlled by the --gtest_output=xml flag. Can be removed from the // listeners list by users who want to shut down the default XML output // controlled by this flag and substitute it with custom one. Note that // removing this object from the listener list with Release transfers its // ownership to the caller and makes this function return NULL the next // time. TestEventListener* default_xml_generator() const { return default_xml_generator_; } private: friend class TestCase; friend class TestInfo; friend class internal::DefaultGlobalTestPartResultReporter; friend class internal::NoExecDeathTest; friend class internal::TestEventListenersAccessor; friend class internal::UnitTestImpl; // Returns repeater that broadcasts the TestEventListener events to all // subscribers. TestEventListener* repeater(); // Sets the default_result_printer attribute to the provided listener. // The listener is also added to the listener list and previous // default_result_printer is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void SetDefaultResultPrinter(TestEventListener* listener); // Sets the default_xml_generator attribute to the provided listener. The // listener is also added to the listener list and previous // default_xml_generator is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void SetDefaultXmlGenerator(TestEventListener* listener); // Controls whether events will be forwarded by the repeater to the // listeners in the list. bool EventForwardingEnabled() const; void SuppressEventForwarding(); // The actual list of listeners. internal::TestEventRepeater* repeater_; // Listener responsible for the standard result output. TestEventListener* default_result_printer_; // Listener responsible for the creation of the XML output file. TestEventListener* default_xml_generator_; // We disallow copying TestEventListeners. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners); }; // A UnitTest consists of a vector of TestCases. // // This is a singleton class. The only instance of UnitTest is // created when UnitTest::GetInstance() is first called. This // instance is never deleted. // // UnitTest is not copyable. // // This class is thread-safe as long as the methods are called // according to their specification. class GTEST_API_ UnitTest { public: // Gets the singleton UnitTest object. The first time this method // is called, a UnitTest object is constructed and returned. // Consecutive calls will return the same object. static UnitTest* GetInstance(); // Runs all tests in this UnitTest object and prints the result. // Returns 0 if successful, or 1 otherwise. // // This method can only be called from the main thread. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. int Run() GTEST_MUST_USE_RESULT_; // Returns the working directory when the first TEST() or TEST_F() // was executed. The UnitTest object owns the string. const char* original_working_dir() const; // Returns the TestCase object for the test that's currently running, // or NULL if no test is running. const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_); // Returns the TestInfo object for the test that's currently running, // or NULL if no test is running. const TestInfo* current_test_info() const GTEST_LOCK_EXCLUDED_(mutex_); // Returns the random seed used at the start of the current test run. int random_seed() const; #if GTEST_HAS_PARAM_TEST // Returns the ParameterizedTestCaseRegistry object used to keep track of // value-parameterized tests and instantiate and register them. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. internal::ParameterizedTestCaseRegistry& parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_); #endif // GTEST_HAS_PARAM_TEST // Gets the number of successful test cases. int successful_test_case_count() const; // Gets the number of failed test cases. int failed_test_case_count() const; // Gets the number of all test cases. int total_test_case_count() const; // Gets the number of all test cases that contain at least one test // that should run. int test_case_to_run_count() const; // Gets the number of successful tests. int successful_test_count() const; // Gets the number of failed tests. int failed_test_count() const; // Gets the number of disabled tests that will be reported in the XML report. int reportable_disabled_test_count() const; // Gets the number of disabled tests. int disabled_test_count() const; // Gets the number of tests to be printed in the XML report. int reportable_test_count() const; // Gets the number of all tests. int total_test_count() const; // Gets the number of tests that should run. int test_to_run_count() const; // Gets the time of the test program start, in ms from the start of the // UNIX epoch. TimeInMillis start_timestamp() const; // Gets the elapsed time, in milliseconds. TimeInMillis elapsed_time() const; // Returns true iff the unit test passed (i.e. all test cases passed). bool Passed() const; // Returns true iff the unit test failed (i.e. some test case failed // or something outside of all tests failed). bool Failed() const; // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. const TestCase* GetTestCase(int i) const; // Returns the TestResult containing information on test failures and // properties logged outside of individual test cases. const TestResult& ad_hoc_test_result() const; // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& listeners(); private: // Registers and returns a global test environment. When a test // program is run, all global test environments will be set-up in // the order they were registered. After all tests in the program // have finished, all global test environments will be torn-down in // the *reverse* order they were registered. // // The UnitTest object takes ownership of the given environment. // // This method can only be called from the main thread. Environment* AddEnvironment(Environment* env); // Adds a TestPartResult to the current TestResult object. All // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) // eventually call this to report their results. The user code // should use the assertion macros instead of calling this directly. void AddTestPartResult(TestPartResult::Type result_type, const char* file_name, int line_number, const std::string& message, const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_); // Adds a TestProperty to the current TestResult object when invoked from // inside a test, to current TestCase's ad_hoc_test_result_ when invoked // from SetUpTestCase or TearDownTestCase, or to the global property set // when invoked elsewhere. If the result already contains a property with // the same key, the value will be updated. void RecordProperty(const std::string& key, const std::string& value); // Gets the i-th test case among all the test cases. i can range from 0 to // total_test_case_count() - 1. If i is not in that range, returns NULL. TestCase* GetMutableTestCase(int i); // Accessors for the implementation object. internal::UnitTestImpl* impl() { return impl_; } const internal::UnitTestImpl* impl() const { return impl_; } // These classes and funcions are friends as they need to access private // members of UnitTest. friend class Test; friend class internal::AssertHelper; friend class internal::ScopedTrace; friend class internal::StreamingListenerTest; friend class internal::UnitTestRecordPropertyTestHelper; friend Environment* AddGlobalTestEnvironment(Environment* env); friend internal::UnitTestImpl* internal::GetUnitTestImpl(); friend void internal::ReportFailureInUnknownLocation( TestPartResult::Type result_type, const std::string& message); // Creates an empty UnitTest. UnitTest(); // D'tor virtual ~UnitTest(); // Pushes a trace defined by SCOPED_TRACE() on to the per-thread // Google Test trace stack. void PushGTestTrace(const internal::TraceInfo& trace) GTEST_LOCK_EXCLUDED_(mutex_); // Pops a trace from the per-thread Google Test trace stack. void PopGTestTrace() GTEST_LOCK_EXCLUDED_(mutex_); // Protects mutable state in *impl_. This is mutable as some const // methods need to lock it too. mutable internal::Mutex mutex_; // Opaque implementation object. This field is never changed once // the object is constructed. We don't mark it as const here, as // doing so will cause a warning in the constructor of UnitTest. // Mutable state in *impl_ is protected by mutex_. internal::UnitTestImpl* impl_; // We disallow copying UnitTest. GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest); }; // A convenient wrapper for adding an environment for the test // program. // // You should call this before RUN_ALL_TESTS() is called, probably in // main(). If you use gtest_main, you need to call this before main() // starts for it to take effect. For example, you can define a global // variable like this: // // testing::Environment* const foo_env = // testing::AddGlobalTestEnvironment(new FooEnvironment); // // However, we strongly recommend you to write your own main() and // call AddGlobalTestEnvironment() there, as relying on initialization // of global variables makes the code harder to read and may cause // problems when you register multiple environments from different // translation units and the environments have dependencies among them // (remember that the compiler doesn't guarantee the order in which // global variables from different translation units are initialized). inline Environment* AddGlobalTestEnvironment(Environment* env) { return UnitTest::GetInstance()->AddEnvironment(env); } // Initializes Google Test. This must be called before calling // RUN_ALL_TESTS(). In particular, it parses a command line for the // flags that Google Test recognizes. Whenever a Google Test flag is // seen, it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Test flag variables are // updated. // // Calling the function for the second time has no user-visible effect. GTEST_API_ void InitGoogleTest(int* argc, char** argv); // This overloaded version can be used in Windows programs compiled in // UNICODE mode. GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv); namespace internal { // FormatForComparison::Format(value) formats a // value of type ToPrint that is an operand of a comparison assertion // (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in // the comparison, and is used to help determine the best way to // format the value. In particular, when the value is a C string // (char pointer) and the other operand is an STL string object, we // want to format the C string as a string, since we know it is // compared by value with the string object. If the value is a char // pointer but the other operand is not an STL string object, we don't // know whether the pointer is supposed to point to a NUL-terminated // string, and thus want to print it as a pointer to be safe. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // The default case. template class FormatForComparison { public: static ::std::string Format(const ToPrint& value) { return ::testing::PrintToString(value); } }; // Array. template class FormatForComparison { public: static ::std::string Format(const ToPrint* value) { return FormatForComparison::Format(value); } }; // By default, print C string as pointers to be safe, as we don't know // whether they actually point to a NUL-terminated string. #define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \ template \ class FormatForComparison { \ public: \ static ::std::string Format(CharType* value) { \ return ::testing::PrintToString(static_cast(value)); \ } \ } GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_ // If a C string is compared with an STL string object, we know it's meant // to point to a NUL-terminated string, and thus can print it as a string. #define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \ template <> \ class FormatForComparison { \ public: \ static ::std::string Format(CharType* value) { \ return ::testing::PrintToString(value); \ } \ } GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string); #if GTEST_HAS_GLOBAL_STRING GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string); #endif #if GTEST_HAS_GLOBAL_WSTRING GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring); #endif #if GTEST_HAS_STD_WSTRING GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring); #endif #undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_ // Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc) // operand to be used in a failure message. The type (but not value) // of the other operand may affect the format. This allows us to // print a char* as a raw pointer when it is compared against another // char* or void*, and print it as a C string when it is compared // against an std::string object, for example. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. template std::string FormatForComparisonFailureMessage( const T1& value, const T2& /* other_operand */) { return FormatForComparison::Format(value); } // The helper function for {ASSERT|EXPECT}_EQ. template AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual) { #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4389) // Temporarily disables warning on // signed/unsigned mismatch. #endif if (expected == actual) { return AssertionSuccess(); } #ifdef _MSC_VER # pragma warning(pop) // Restores the warning state. #endif return EqFailure(expected_expression, actual_expression, FormatForComparisonFailureMessage(expected, actual), FormatForComparisonFailureMessage(actual, expected), false); } // With this overloaded version, we allow anonymous enums to be used // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums // can be implicitly cast to BiggestInt. GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual); // The helper class for {ASSERT|EXPECT}_EQ. The template argument // lhs_is_null_literal is true iff the first argument to ASSERT_EQ() // is a null pointer literal. The following default implementation is // for lhs_is_null_literal being false. template class EqHelper { public: // This templatized version is for the general case. template static AssertionResult Compare(const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } // With this overloaded version, we allow anonymous enums to be used // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous // enums can be implicitly cast to BiggestInt. // // Even though its body looks the same as the above version, we // cannot merge the two, as it will make anonymous enums unhappy. static AssertionResult Compare(const char* expected_expression, const char* actual_expression, BiggestInt expected, BiggestInt actual) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } }; // This specialization is used when the first argument to ASSERT_EQ() // is a null pointer literal, like NULL, false, or 0. template <> class EqHelper { public: // We define two overloaded versions of Compare(). The first // version will be picked when the second argument to ASSERT_EQ() is // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or // EXPECT_EQ(false, a_bool). template static AssertionResult Compare( const char* expected_expression, const char* actual_expression, const T1& expected, const T2& actual, // The following line prevents this overload from being considered if T2 // is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr) // expands to Compare("", "", NULL, my_ptr), which requires a conversion // to match the Secret* in the other overload, which would otherwise make // this template match better. typename EnableIf::value>::type* = 0) { return CmpHelperEQ(expected_expression, actual_expression, expected, actual); } // This version will be picked when the second argument to ASSERT_EQ() is a // pointer, e.g. ASSERT_EQ(NULL, a_pointer). template static AssertionResult Compare( const char* expected_expression, const char* actual_expression, // We used to have a second template parameter instead of Secret*. That // template parameter would deduce to 'long', making this a better match // than the first overload even without the first overload's EnableIf. // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to // non-pointer argument" (even a deduced integral argument), so the old // implementation caused warnings in user code. Secret* /* expected (NULL) */, T* actual) { // We already know that 'expected' is a null pointer. return CmpHelperEQ(expected_expression, actual_expression, static_cast(NULL), actual); } }; // A macro for implementing the helper functions needed to implement // ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste // of similar code. // // For each templatized helper function, we also define an overloaded // version for BiggestInt in order to reduce code bloat and allow // anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled // with gcc 4. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ template \ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ const T1& val1, const T2& val2) {\ if (val1 op val2) {\ return AssertionSuccess();\ } else {\ return AssertionFailure() \ << "Expected: (" << expr1 << ") " #op " (" << expr2\ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ << " vs " << FormatForComparisonFailureMessage(val2, val1);\ }\ }\ GTEST_API_ AssertionResult CmpHelper##op_name(\ const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2) // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // Implements the helper function for {ASSERT|EXPECT}_NE GTEST_IMPL_CMP_HELPER_(NE, !=); // Implements the helper function for {ASSERT|EXPECT}_LE GTEST_IMPL_CMP_HELPER_(LE, <=); // Implements the helper function for {ASSERT|EXPECT}_LT GTEST_IMPL_CMP_HELPER_(LT, <); // Implements the helper function for {ASSERT|EXPECT}_GE GTEST_IMPL_CMP_HELPER_(GE, >=); // Implements the helper function for {ASSERT|EXPECT}_GT GTEST_IMPL_CMP_HELPER_(GT, >); #undef GTEST_IMPL_CMP_HELPER_ // The helper function for {ASSERT|EXPECT}_STREQ. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual); // The helper function for {ASSERT|EXPECT}_STRCASEEQ. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, const char* actual_expression, const char* expected, const char* actual); // The helper function for {ASSERT|EXPECT}_STRNE. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // The helper function for {ASSERT|EXPECT}_STRCASENE. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // Helper function for *_STREQ on wide strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression, const char* actual_expression, const wchar_t* expected, const wchar_t* actual); // Helper function for *_STRNE on wide strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2); } // namespace internal // IsSubstring() and IsNotSubstring() are intended to be used as the // first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by // themselves. They check whether needle is a substring of haystack // (NULL is considered a substring of itself only), and return an // appropriate error message when they fail. // // The {needle,haystack}_expr arguments are the stringified // expressions that generated the two real arguments. GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack); GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack); GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack); #if GTEST_HAS_STD_WSTRING GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack); #endif // GTEST_HAS_STD_WSTRING namespace internal { // Helper template function for comparing floating-points. // // Template parameter: // // RawType: the raw floating-point type (either float or double) // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. template AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression, const char* actual_expression, RawType expected, RawType actual) { const FloatingPoint lhs(expected), rhs(actual); if (lhs.AlmostEquals(rhs)) { return AssertionSuccess(); } ::std::stringstream expected_ss; expected_ss << std::setprecision(std::numeric_limits::digits10 + 2) << expected; ::std::stringstream actual_ss; actual_ss << std::setprecision(std::numeric_limits::digits10 + 2) << actual; return EqFailure(expected_expression, actual_expression, StringStreamToString(&expected_ss), StringStreamToString(&actual_ss), false); } // Helper function for implementing ASSERT_NEAR. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error); // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // A class that enables one to stream messages to assertion macros class GTEST_API_ AssertHelper { public: // Constructor. AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message); ~AssertHelper(); // Message assignment is a semantic trick to enable assertion // streaming; see the GTEST_MESSAGE_ macro below. void operator=(const Message& message) const; private: // We put our data in a struct so that the size of the AssertHelper class can // be as small as possible. This is important because gcc is incapable of // re-using stack space even for temporary variables, so every EXPECT_EQ // reserves stack space for another AssertHelper. struct AssertHelperData { AssertHelperData(TestPartResult::Type t, const char* srcfile, int line_num, const char* msg) : type(t), file(srcfile), line(line_num), message(msg) { } TestPartResult::Type const type; const char* const file; int const line; std::string const message; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData); }; AssertHelperData* const data_; GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper); }; } // namespace internal #if GTEST_HAS_PARAM_TEST // The pure interface class that all value-parameterized tests inherit from. // A value-parameterized class must inherit from both ::testing::Test and // ::testing::WithParamInterface. In most cases that just means inheriting // from ::testing::TestWithParam, but more complicated test hierarchies // may need to inherit from Test and WithParamInterface at different levels. // // This interface has support for accessing the test parameter value via // the GetParam() method. // // Use it with one of the parameter generator defining functions, like Range(), // Values(), ValuesIn(), Bool(), and Combine(). // // class FooTest : public ::testing::TestWithParam { // protected: // FooTest() { // // Can use GetParam() here. // } // virtual ~FooTest() { // // Can use GetParam() here. // } // virtual void SetUp() { // // Can use GetParam() here. // } // virtual void TearDown { // // Can use GetParam() here. // } // }; // TEST_P(FooTest, DoesBar) { // // Can use GetParam() method here. // Foo foo; // ASSERT_TRUE(foo.DoesBar(GetParam())); // } // INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); template class WithParamInterface { public: typedef T ParamType; virtual ~WithParamInterface() {} // The current parameter value. Is also available in the test fixture's // constructor. This member function is non-static, even though it only // references static data, to reduce the opportunity for incorrect uses // like writing 'WithParamInterface::GetParam()' for a test that // uses a fixture whose parameter type is int. const ParamType& GetParam() const { GTEST_CHECK_(parameter_ != NULL) << "GetParam() can only be called inside a value-parameterized test " << "-- did you intend to write TEST_P instead of TEST_F?"; return *parameter_; } private: // Sets parameter value. The caller is responsible for making sure the value // remains alive and unchanged throughout the current test. static void SetParam(const ParamType* parameter) { parameter_ = parameter; } // Static value used for accessing parameter during a test lifetime. static const ParamType* parameter_; // TestClass must be a subclass of WithParamInterface and Test. template friend class internal::ParameterizedTestFactory; }; template const T* WithParamInterface::parameter_ = NULL; // Most value-parameterized classes can ignore the existence of // WithParamInterface, and can just inherit from ::testing::TestWithParam. template class TestWithParam : public Test, public WithParamInterface { }; #endif // GTEST_HAS_PARAM_TEST // Macros for indicating success/failure in test code. // ADD_FAILURE unconditionally adds a failure to the current test. // SUCCEED generates a success - it doesn't automatically make the // current test successful, as a test is only successful when it has // no failure. // // EXPECT_* verifies that a certain condition is satisfied. If not, // it behaves like ADD_FAILURE. In particular: // // EXPECT_TRUE verifies that a Boolean condition is true. // EXPECT_FALSE verifies that a Boolean condition is false. // // FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except // that they will also abort the current function on failure. People // usually want the fail-fast behavior of FAIL and ASSERT_*, but those // writing data-driven tests often find themselves using ADD_FAILURE // and EXPECT_* more. // Generates a nonfatal failure with a generic message. #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed") // Generates a nonfatal failure at the given source file location with // a generic message. #define ADD_FAILURE_AT(file, line) \ GTEST_MESSAGE_AT_(file, line, "Failed", \ ::testing::TestPartResult::kNonFatalFailure) // Generates a fatal failure with a generic message. #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed") // Define this macro to 1 to omit the definition of FAIL(), which is a // generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_FAIL # define FAIL() GTEST_FAIL() #endif // Generates a success with a generic message. #define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded") // Define this macro to 1 to omit the definition of SUCCEED(), which // is a generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_SUCCEED # define SUCCEED() GTEST_SUCCEED() #endif // Macros for testing exceptions. // // * {ASSERT|EXPECT}_THROW(statement, expected_exception): // Tests that the statement throws the expected exception. // * {ASSERT|EXPECT}_NO_THROW(statement): // Tests that the statement doesn't throw any exception. // * {ASSERT|EXPECT}_ANY_THROW(statement): // Tests that the statement throws an exception. #define EXPECT_THROW(statement, expected_exception) \ GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_) #define EXPECT_NO_THROW(statement) \ GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_) #define EXPECT_ANY_THROW(statement) \ GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_) #define ASSERT_THROW(statement, expected_exception) \ GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_) #define ASSERT_NO_THROW(statement) \ GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_) #define ASSERT_ANY_THROW(statement) \ GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_) // Boolean assertions. Condition can be either a Boolean expression or an // AssertionResult. For more information on how to use AssertionResult with // these macros see comments on that class. #define EXPECT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_NONFATAL_FAILURE_) #define EXPECT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_NONFATAL_FAILURE_) #define ASSERT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_FATAL_FAILURE_) #define ASSERT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_FATAL_FAILURE_) // Includes the auto-generated header that implements a family of // generic predicate assertion macros. #include "gtest/gtest_pred_impl.h" // Macros for testing equalities and inequalities. // // * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual // * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2 // * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2 // * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2 // * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2 // * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2 // // When they are not, Google Test prints both the tested expressions and // their actual values. The values must be compatible built-in types, // or you will get a compiler error. By "compatible" we mean that the // values can be compared by the respective operator. // // Note: // // 1. It is possible to make a user-defined type work with // {ASSERT|EXPECT}_??(), but that requires overloading the // comparison operators and is thus discouraged by the Google C++ // Usage Guide. Therefore, you are advised to use the // {ASSERT|EXPECT}_TRUE() macro to assert that two objects are // equal. // // 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on // pointers (in particular, C strings). Therefore, if you use it // with two C strings, you are testing how their locations in memory // are related, not how their content is related. To compare two C // strings by content, use {ASSERT|EXPECT}_STR*(). // // 3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to // {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you // what the actual value is when it fails, and similarly for the // other comparisons. // // 4. Do not depend on the order in which {ASSERT|EXPECT}_??() // evaluate their arguments, which is undefined. // // 5. These macros evaluate their arguments exactly once. // // Examples: // // EXPECT_NE(5, Foo()); // EXPECT_EQ(NULL, a_pointer); // ASSERT_LT(i, array_size); // ASSERT_GT(records.size(), 0) << "There is no record left."; #define EXPECT_EQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal:: \ EqHelper::Compare, \ expected, actual) #define EXPECT_NE(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual) #define EXPECT_LE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) #define EXPECT_LT(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) #define EXPECT_GE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) #define EXPECT_GT(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) #define GTEST_ASSERT_EQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal:: \ EqHelper::Compare, \ expected, actual) #define GTEST_ASSERT_NE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) #define GTEST_ASSERT_LE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) #define GTEST_ASSERT_LT(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) #define GTEST_ASSERT_GE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) #define GTEST_ASSERT_GT(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) // Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of // ASSERT_XY(), which clashes with some users' own code. #if !GTEST_DONT_DEFINE_ASSERT_EQ # define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_NE # define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_LE # define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_LT # define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_GE # define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_GT # define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2) #endif // C-string Comparisons. All tests treat NULL and any non-NULL string // as different. Two NULLs are equal. // // * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2 // * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2 // * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case // * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case // // For wide or narrow string objects, you can use the // {ASSERT|EXPECT}_??() macros. // // Don't depend on the order in which the arguments are evaluated, // which is undefined. // // These macros evaluate their arguments exactly once. #define EXPECT_STREQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual) #define EXPECT_STRNE(s1, s2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) #define EXPECT_STRCASEEQ(expected, actual) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual) #define EXPECT_STRCASENE(s1, s2)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) #define ASSERT_STREQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual) #define ASSERT_STRNE(s1, s2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) #define ASSERT_STRCASEEQ(expected, actual) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual) #define ASSERT_STRCASENE(s1, s2)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) // Macros for comparing floating-point numbers. // // * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual): // Tests that two float values are almost equal. // * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual): // Tests that two double values are almost equal. // * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error): // Tests that v1 and v2 are within the given distance to each other. // // Google Test uses ULP-based comparison to automatically pick a default // error bound that is appropriate for the operands. See the // FloatingPoint template class in gtest-internal.h if you are // interested in the implementation details. #define EXPECT_FLOAT_EQ(expected, actual)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ expected, actual) #define EXPECT_DOUBLE_EQ(expected, actual)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ expected, actual) #define ASSERT_FLOAT_EQ(expected, actual)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ expected, actual) #define ASSERT_DOUBLE_EQ(expected, actual)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ expected, actual) #define EXPECT_NEAR(val1, val2, abs_error)\ EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ val1, val2, abs_error) #define ASSERT_NEAR(val1, val2, abs_error)\ ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ val1, val2, abs_error) // These predicate format functions work on floating-point values, and // can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g. // // EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0); // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2, float val1, float val2); GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2, double val1, double val2); #if GTEST_OS_WINDOWS // Macros that test for HRESULT failure and success, these are only useful // on Windows, and rely on Windows SDK macros and APIs to compile. // // * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr) // // When expr unexpectedly fails or succeeds, Google Test prints the // expected result and the actual result with both a human-readable // string representation of the error, if available, as well as the // hex result code. # define EXPECT_HRESULT_SUCCEEDED(expr) \ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) # define ASSERT_HRESULT_SUCCEEDED(expr) \ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) # define EXPECT_HRESULT_FAILED(expr) \ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) # define ASSERT_HRESULT_FAILED(expr) \ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) #endif // GTEST_OS_WINDOWS // Macros that execute statement and check that it doesn't generate new fatal // failures in the current thread. // // * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement); // // Examples: // // EXPECT_NO_FATAL_FAILURE(Process()); // ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed"; // #define ASSERT_NO_FATAL_FAILURE(statement) \ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_) #define EXPECT_NO_FATAL_FAILURE(statement) \ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_) // Causes a trace (including the source file path, the current line // number, and the given message) to be included in every test failure // message generated by code in the current scope. The effect is // undone when the control leaves the current scope. // // The message argument can be anything streamable to std::ostream. // // In the implementation, we include the current line number as part // of the dummy variable name, thus allowing multiple SCOPED_TRACE()s // to appear in the same block - as long as they are on different // lines. #define SCOPED_TRACE(message) \ ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\ __FILE__, __LINE__, ::testing::Message() << (message)) // Compile-time assertion for type equality. // StaticAssertTypeEq() compiles iff type1 and type2 are // the same type. The value it returns is not interesting. // // Instead of making StaticAssertTypeEq a class template, we make it a // function template that invokes a helper class template. This // prevents a user from misusing StaticAssertTypeEq by // defining objects of that type. // // CAVEAT: // // When used inside a method of a class template, // StaticAssertTypeEq() is effective ONLY IF the method is // instantiated. For example, given: // // template class Foo { // public: // void Bar() { testing::StaticAssertTypeEq(); } // }; // // the code: // // void Test1() { Foo foo; } // // will NOT generate a compiler error, as Foo::Bar() is never // actually instantiated. Instead, you need: // // void Test2() { Foo foo; foo.Bar(); } // // to cause a compiler error. template bool StaticAssertTypeEq() { (void)internal::StaticAssertTypeEqHelper(); return true; } // Defines a test. // // The first parameter is the name of the test case, and the second // parameter is the name of the test within the test case. // // The convention is to end the test case name with "Test". For // example, a test case for the Foo class can be named FooTest. // // The user should put his test code between braces after using this // macro. Example: // // TEST(FooTest, InitializesCorrectly) { // Foo foo; // EXPECT_TRUE(foo.StatusIsOK()); // } // Note that we call GetTestTypeId() instead of GetTypeId< // ::testing::Test>() here to get the type ID of testing::Test. This // is to work around a suspected linker bug when using Google Test as // a framework on Mac OS X. The bug causes GetTypeId< // ::testing::Test>() to return different values depending on whether // the call is from the Google Test framework itself or from user test // code. GetTestTypeId() is guaranteed to always return the same // value, as it always calls GetTypeId<>() from the Google Test // framework. #define GTEST_TEST(test_case_name, test_name)\ GTEST_TEST_(test_case_name, test_name, \ ::testing::Test, ::testing::internal::GetTestTypeId()) // Define this macro to 1 to omit the definition of TEST(), which // is a generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_TEST # define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name) #endif // Defines a test that uses a test fixture. // // The first parameter is the name of the test fixture class, which // also doubles as the test case name. The second parameter is the // name of the test within the test case. // // A test fixture class must be declared earlier. The user should put // his test code between braces after using this macro. Example: // // class FooTest : public testing::Test { // protected: // virtual void SetUp() { b_.AddElement(3); } // // Foo a_; // Foo b_; // }; // // TEST_F(FooTest, InitializesCorrectly) { // EXPECT_TRUE(a_.StatusIsOK()); // } // // TEST_F(FooTest, ReturnsElementCountCorrectly) { // EXPECT_EQ(0, a_.size()); // EXPECT_EQ(1, b_.size()); // } #define TEST_F(test_fixture, test_name)\ GTEST_TEST_(test_fixture, test_name, test_fixture, \ ::testing::internal::GetTypeId()) } // namespace testing // Use this function in main() to run all tests. It returns 0 if all // tests are successful, or 1 otherwise. // // RUN_ALL_TESTS() should be invoked after the command line has been // parsed by InitGoogleTest(). // // This function was formerly a macro; thus, it is in the global // namespace and has an all-caps name. int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_; inline int RUN_ALL_TESTS() { return ::testing::UnitTest::GetInstance()->Run(); } #endif // GTEST_INCLUDE_GTEST_GTEST_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/0000775000175000017500000000000013315356571017561 500000000000000stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-linked_ptr.h0000664000175000017500000001764513062445067023144 00000000000000// Copyright 2003 Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: Dan Egnor (egnor@google.com) // // A "smart" pointer type with reference tracking. Every pointer to a // particular object is kept on a circular linked list. When the last pointer // to an object is destroyed or reassigned, the object is deleted. // // Used properly, this deletes the object when the last reference goes away. // There are several caveats: // - Like all reference counting schemes, cycles lead to leaks. // - Each smart pointer is actually two pointers (8 bytes instead of 4). // - Every time a pointer is assigned, the entire list of pointers to that // object is traversed. This class is therefore NOT SUITABLE when there // will often be more than two or three pointers to a particular object. // - References are only tracked as long as linked_ptr<> objects are copied. // If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS // will happen (double deletion). // // A good use of this class is storing object references in STL containers. // You can safely put linked_ptr<> in a vector<>. // Other uses may not be as good. // // Note: If you use an incomplete type with linked_ptr<>, the class // *containing* linked_ptr<> must have a constructor and destructor (even // if they do nothing!). // // Bill Gibbons suggested we use something like this. // // Thread Safety: // Unlike other linked_ptr implementations, in this implementation // a linked_ptr object is thread-safe in the sense that: // - it's safe to copy linked_ptr objects concurrently, // - it's safe to copy *from* a linked_ptr and read its underlying // raw pointer (e.g. via get()) concurrently, and // - it's safe to write to two linked_ptrs that point to the same // shared object concurrently. // TODO(wan@google.com): rename this to safe_linked_ptr to avoid // confusion with normal linked_ptr. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ #include #include #include "gtest/internal/gtest-port.h" namespace testing { namespace internal { // Protects copying of all linked_ptr objects. GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex); // This is used internally by all instances of linked_ptr<>. It needs to be // a non-template class because different types of linked_ptr<> can refer to // the same object (linked_ptr(obj) vs linked_ptr(obj)). // So, it needs to be possible for different types of linked_ptr to participate // in the same circular linked list, so we need a single class type here. // // DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr. class linked_ptr_internal { public: // Create a new circle that includes only this instance. void join_new() { next_ = this; } // Many linked_ptr operations may change p.link_ for some linked_ptr // variable p in the same circle as this object. Therefore we need // to prevent two such operations from occurring concurrently. // // Note that different types of linked_ptr objects can coexist in a // circle (e.g. linked_ptr, linked_ptr, and // linked_ptr). Therefore we must use a single mutex to // protect all linked_ptr objects. This can create serious // contention in production code, but is acceptable in a testing // framework. // Join an existing circle. void join(linked_ptr_internal const* ptr) GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) { MutexLock lock(&g_linked_ptr_mutex); linked_ptr_internal const* p = ptr; while (p->next_ != ptr) p = p->next_; p->next_ = this; next_ = ptr; } // Leave whatever circle we're part of. Returns true if we were the // last member of the circle. Once this is done, you can join() another. bool depart() GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) { MutexLock lock(&g_linked_ptr_mutex); if (next_ == this) return true; linked_ptr_internal const* p = next_; while (p->next_ != this) p = p->next_; p->next_ = next_; return false; } private: mutable linked_ptr_internal const* next_; }; template class linked_ptr { public: typedef T element_type; // Take over ownership of a raw pointer. This should happen as soon as // possible after the object is created. explicit linked_ptr(T* ptr = NULL) { capture(ptr); } ~linked_ptr() { depart(); } // Copy an existing linked_ptr<>, adding ourselves to the list of references. template linked_ptr(linked_ptr const& ptr) { copy(&ptr); } linked_ptr(linked_ptr const& ptr) { // NOLINT assert(&ptr != this); copy(&ptr); } // Assignment releases the old value and acquires the new. template linked_ptr& operator=(linked_ptr const& ptr) { depart(); copy(&ptr); return *this; } linked_ptr& operator=(linked_ptr const& ptr) { if (&ptr != this) { depart(); copy(&ptr); } return *this; } // Smart pointer members. void reset(T* ptr = NULL) { depart(); capture(ptr); } T* get() const { return value_; } T* operator->() const { return value_; } T& operator*() const { return *value_; } bool operator==(T* p) const { return value_ == p; } bool operator!=(T* p) const { return value_ != p; } template bool operator==(linked_ptr const& ptr) const { return value_ == ptr.get(); } template bool operator!=(linked_ptr const& ptr) const { return value_ != ptr.get(); } private: template friend class linked_ptr; T* value_; linked_ptr_internal link_; void depart() { if (link_.depart()) delete value_; } void capture(T* ptr) { value_ = ptr; link_.join_new(); } template void copy(linked_ptr const* ptr) { value_ = ptr->get(); if (value_) link_.join(&ptr->link_); else link_.join_new(); } }; template inline bool operator==(T* ptr, const linked_ptr& x) { return ptr == x.get(); } template inline bool operator!=(T* ptr, const linked_ptr& x) { return ptr != x.get(); } // A function to convert T* into linked_ptr // Doing e.g. make_linked_ptr(new FooBarBaz(arg)) is a shorter notation // for linked_ptr >(new FooBarBaz(arg)) template linked_ptr make_linked_ptr(T* ptr) { return linked_ptr(ptr); } } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-param-util.h0000664000175000017500000005717713062445067023070 00000000000000// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vladl@google.com (Vlad Losev) // Type and function utilities for implementing parameterized tests. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #include #include #include // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-linked_ptr.h" #include "gtest/internal/gtest-port.h" #include "gtest/gtest-printers.h" #if GTEST_HAS_PARAM_TEST namespace testing { namespace internal { // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Outputs a message explaining invalid registration of different // fixture class for the same test case. This may happen when // TEST_P macro is used to define two tests with the same name // but in different namespaces. GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name, const char* file, int line); template class ParamGeneratorInterface; template class ParamGenerator; // Interface for iterating over elements provided by an implementation // of ParamGeneratorInterface. template class ParamIteratorInterface { public: virtual ~ParamIteratorInterface() {} // A pointer to the base generator instance. // Used only for the purposes of iterator comparison // to make sure that two iterators belong to the same generator. virtual const ParamGeneratorInterface* BaseGenerator() const = 0; // Advances iterator to point to the next element // provided by the generator. The caller is responsible // for not calling Advance() on an iterator equal to // BaseGenerator()->End(). virtual void Advance() = 0; // Clones the iterator object. Used for implementing copy semantics // of ParamIterator. virtual ParamIteratorInterface* Clone() const = 0; // Dereferences the current iterator and provides (read-only) access // to the pointed value. It is the caller's responsibility not to call // Current() on an iterator equal to BaseGenerator()->End(). // Used for implementing ParamGenerator::operator*(). virtual const T* Current() const = 0; // Determines whether the given iterator and other point to the same // element in the sequence generated by the generator. // Used for implementing ParamGenerator::operator==(). virtual bool Equals(const ParamIteratorInterface& other) const = 0; }; // Class iterating over elements provided by an implementation of // ParamGeneratorInterface. It wraps ParamIteratorInterface // and implements the const forward iterator concept. template class ParamIterator { public: typedef T value_type; typedef const T& reference; typedef ptrdiff_t difference_type; // ParamIterator assumes ownership of the impl_ pointer. ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} ParamIterator& operator=(const ParamIterator& other) { if (this != &other) impl_.reset(other.impl_->Clone()); return *this; } const T& operator*() const { return *impl_->Current(); } const T* operator->() const { return impl_->Current(); } // Prefix version of operator++. ParamIterator& operator++() { impl_->Advance(); return *this; } // Postfix version of operator++. ParamIterator operator++(int /*unused*/) { ParamIteratorInterface* clone = impl_->Clone(); impl_->Advance(); return ParamIterator(clone); } bool operator==(const ParamIterator& other) const { return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); } bool operator!=(const ParamIterator& other) const { return !(*this == other); } private: friend class ParamGenerator; explicit ParamIterator(ParamIteratorInterface* impl) : impl_(impl) {} scoped_ptr > impl_; }; // ParamGeneratorInterface is the binary interface to access generators // defined in other translation units. template class ParamGeneratorInterface { public: typedef T ParamType; virtual ~ParamGeneratorInterface() {} // Generator interface definition virtual ParamIteratorInterface* Begin() const = 0; virtual ParamIteratorInterface* End() const = 0; }; // Wraps ParamGeneratorInterface and provides general generator syntax // compatible with the STL Container concept. // This class implements copy initialization semantics and the contained // ParamGeneratorInterface instance is shared among all copies // of the original object. This is possible because that instance is immutable. template class ParamGenerator { public: typedef ParamIterator iterator; explicit ParamGenerator(ParamGeneratorInterface* impl) : impl_(impl) {} ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} ParamGenerator& operator=(const ParamGenerator& other) { impl_ = other.impl_; return *this; } iterator begin() const { return iterator(impl_->Begin()); } iterator end() const { return iterator(impl_->End()); } private: linked_ptr > impl_; }; // Generates values from a range of two comparable values. Can be used to // generate sequences of user-defined types that implement operator+() and // operator<(). // This class is used in the Range() function. template class RangeGenerator : public ParamGeneratorInterface { public: RangeGenerator(T begin, T end, IncrementT step) : begin_(begin), end_(end), step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} virtual ~RangeGenerator() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, begin_, 0, step_); } virtual ParamIteratorInterface* End() const { return new Iterator(this, end_, end_index_, step_); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, T value, int index, IncrementT step) : base_(base), value_(value), index_(index), step_(step) {} virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } virtual void Advance() { value_ = value_ + step_; index_++; } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const T* Current() const { return &value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const int other_index = CheckedDowncastToActualType(&other)->index_; return index_ == other_index; } private: Iterator(const Iterator& other) : ParamIteratorInterface(), base_(other.base_), value_(other.value_), index_(other.index_), step_(other.step_) {} // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; T value_; int index_; const IncrementT step_; }; // class RangeGenerator::Iterator static int CalculateEndIndex(const T& begin, const T& end, const IncrementT& step) { int end_index = 0; for (T i = begin; i < end; i = i + step) end_index++; return end_index; } // No implementation - assignment is unsupported. void operator=(const RangeGenerator& other); const T begin_; const T end_; const IncrementT step_; // The index for the end() iterator. All the elements in the generated // sequence are indexed (0-based) to aid iterator comparison. const int end_index_; }; // class RangeGenerator // Generates values from a pair of STL-style iterators. Used in the // ValuesIn() function. The elements are copied from the source range // since the source can be located on the stack, and the generator // is likely to persist beyond that stack frame. template class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface { public: template ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) : container_(begin, end) {} virtual ~ValuesInIteratorRangeGenerator() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, container_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, container_.end()); } private: typedef typename ::std::vector ContainerType; class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, typename ContainerType::const_iterator iterator) : base_(base), iterator_(iterator) {} virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } virtual void Advance() { ++iterator_; value_.reset(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } // We need to use cached value referenced by iterator_ because *iterator_ // can return a temporary object (and of type other then T), so just // having "return &*iterator_;" doesn't work. // value_ is updated here and not in Advance() because Advance() // can advance iterator_ beyond the end of the range, and we cannot // detect that fact. The client code, on the other hand, is // responsible for not calling Current() on an out-of-range iterator. virtual const T* Current() const { if (value_.get() == NULL) value_.reset(new T(*iterator_)); return value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; return iterator_ == CheckedDowncastToActualType(&other)->iterator_; } private: Iterator(const Iterator& other) // The explicit constructor call suppresses a false warning // emitted by gcc when supplied with the -Wextra option. : ParamIteratorInterface(), base_(other.base_), iterator_(other.iterator_) {} const ParamGeneratorInterface* const base_; typename ContainerType::const_iterator iterator_; // A cached value of *iterator_. We keep it here to allow access by // pointer in the wrapping iterator's operator->(). // value_ needs to be mutable to be accessed in Current(). // Use of scoped_ptr helps manage cached value's lifetime, // which is bound by the lifespan of the iterator itself. mutable scoped_ptr value_; }; // class ValuesInIteratorRangeGenerator::Iterator // No implementation - assignment is unsupported. void operator=(const ValuesInIteratorRangeGenerator& other); const ContainerType container_; }; // class ValuesInIteratorRangeGenerator // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Stores a parameter value and later creates tests parameterized with that // value. template class ParameterizedTestFactory : public TestFactoryBase { public: typedef typename TestClass::ParamType ParamType; explicit ParameterizedTestFactory(ParamType parameter) : parameter_(parameter) {} virtual Test* CreateTest() { TestClass::SetParam(¶meter_); return new TestClass(); } private: const ParamType parameter_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // TestMetaFactoryBase is a base class for meta-factories that create // test factories for passing into MakeAndRegisterTestInfo function. template class TestMetaFactoryBase { public: virtual ~TestMetaFactoryBase() {} virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // TestMetaFactory creates test factories for passing into // MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives // ownership of test factory pointer, same factory object cannot be passed // into that method twice. But ParameterizedTestCaseInfo is going to call // it for each Test/Parameter value combination. Thus it needs meta factory // creator class. template class TestMetaFactory : public TestMetaFactoryBase { public: typedef typename TestCase::ParamType ParamType; TestMetaFactory() {} virtual TestFactoryBase* CreateTestFactory(ParamType parameter) { return new ParameterizedTestFactory(parameter); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseInfoBase is a generic interface // to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase // accumulates test information provided by TEST_P macro invocations // and generators provided by INSTANTIATE_TEST_CASE_P macro invocations // and uses that information to register all resulting test instances // in RegisterTests method. The ParameterizeTestCaseRegistry class holds // a collection of pointers to the ParameterizedTestCaseInfo objects // and calls RegisterTests() on each of them when asked. class ParameterizedTestCaseInfoBase { public: virtual ~ParameterizedTestCaseInfoBase() {} // Base part of test case name for display purposes. virtual const string& GetTestCaseName() const = 0; // Test case id to verify identity. virtual TypeId GetTestCaseTypeId() const = 0; // UnitTest class invokes this method to register tests in this // test case right before running them in RUN_ALL_TESTS macro. // This method should not be called more then once on any single // instance of a ParameterizedTestCaseInfoBase derived class. virtual void RegisterTests() = 0; protected: ParameterizedTestCaseInfoBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseInfo accumulates tests obtained from TEST_P // macro invocations for a particular test case and generators // obtained from INSTANTIATE_TEST_CASE_P macro invocations for that // test case. It registers tests with all values generated by all // generators when asked. template class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase { public: // ParamType and GeneratorCreationFunc are private types but are required // for declarations of public methods AddTestPattern() and // AddTestCaseInstantiation(). typedef typename TestCase::ParamType ParamType; // A function that returns an instance of appropriate generator type. typedef ParamGenerator(GeneratorCreationFunc)(); explicit ParameterizedTestCaseInfo(const char* name) : test_case_name_(name) {} // Test case base name for display purposes. virtual const string& GetTestCaseName() const { return test_case_name_; } // Test case id to verify identity. virtual TypeId GetTestCaseTypeId() const { return GetTypeId(); } // TEST_P macro uses AddTestPattern() to record information // about a single test in a LocalTestInfo structure. // test_case_name is the base name of the test case (without invocation // prefix). test_base_name is the name of an individual test without // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is // test case base name and DoBar is test base name. void AddTestPattern(const char* test_case_name, const char* test_base_name, TestMetaFactoryBase* meta_factory) { tests_.push_back(linked_ptr(new TestInfo(test_case_name, test_base_name, meta_factory))); } // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information // about a generator. int AddTestCaseInstantiation(const string& instantiation_name, GeneratorCreationFunc* func, const char* /* file */, int /* line */) { instantiations_.push_back(::std::make_pair(instantiation_name, func)); return 0; // Return value used only to run this method in namespace scope. } // UnitTest class invokes this method to register tests in this test case // test cases right before running tests in RUN_ALL_TESTS macro. // This method should not be called more then once on any single // instance of a ParameterizedTestCaseInfoBase derived class. // UnitTest has a guard to prevent from calling this method more then once. virtual void RegisterTests() { for (typename TestInfoContainer::iterator test_it = tests_.begin(); test_it != tests_.end(); ++test_it) { linked_ptr test_info = *test_it; for (typename InstantiationContainer::iterator gen_it = instantiations_.begin(); gen_it != instantiations_.end(); ++gen_it) { const string& instantiation_name = gen_it->first; ParamGenerator generator((*gen_it->second)()); string test_case_name; if ( !instantiation_name.empty() ) test_case_name = instantiation_name + "/"; test_case_name += test_info->test_case_base_name; int i = 0; for (typename ParamGenerator::iterator param_it = generator.begin(); param_it != generator.end(); ++param_it, ++i) { Message test_name_stream; test_name_stream << test_info->test_base_name << "/" << i; MakeAndRegisterTestInfo( test_case_name.c_str(), test_name_stream.GetString().c_str(), NULL, // No type parameter. PrintToString(*param_it).c_str(), GetTestCaseTypeId(), TestCase::SetUpTestCase, TestCase::TearDownTestCase, test_info->test_meta_factory->CreateTestFactory(*param_it)); } // for param_it } // for gen_it } // for test_it } // RegisterTests private: // LocalTestInfo structure keeps information about a single test registered // with TEST_P macro. struct TestInfo { TestInfo(const char* a_test_case_base_name, const char* a_test_base_name, TestMetaFactoryBase* a_test_meta_factory) : test_case_base_name(a_test_case_base_name), test_base_name(a_test_base_name), test_meta_factory(a_test_meta_factory) {} const string test_case_base_name; const string test_base_name; const scoped_ptr > test_meta_factory; }; typedef ::std::vector > TestInfoContainer; // Keeps pairs of // received from INSTANTIATE_TEST_CASE_P macros. typedef ::std::vector > InstantiationContainer; const string test_case_name_; TestInfoContainer tests_; InstantiationContainer instantiations_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo); }; // class ParameterizedTestCaseInfo // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase // classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P // macros use it to locate their corresponding ParameterizedTestCaseInfo // descriptors. class ParameterizedTestCaseRegistry { public: ParameterizedTestCaseRegistry() {} ~ParameterizedTestCaseRegistry() { for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { delete *it; } } // Looks up or creates and returns a structure containing information about // tests and instantiations of a particular test case. template ParameterizedTestCaseInfo* GetTestCasePatternHolder( const char* test_case_name, const char* file, int line) { ParameterizedTestCaseInfo* typed_test_info = NULL; for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { if ((*it)->GetTestCaseName() == test_case_name) { if ((*it)->GetTestCaseTypeId() != GetTypeId()) { // Complain about incorrect usage of Google Test facilities // and terminate the program since we cannot guaranty correct // test case setup and tear-down in this case. ReportInvalidTestCaseType(test_case_name, file, line); posix::Abort(); } else { // At this point we are sure that the object we found is of the same // type we are looking for, so we downcast it to that type // without further checks. typed_test_info = CheckedDowncastToActualType< ParameterizedTestCaseInfo >(*it); } break; } } if (typed_test_info == NULL) { typed_test_info = new ParameterizedTestCaseInfo(test_case_name); test_case_infos_.push_back(typed_test_info); } return typed_test_info; } void RegisterTests() { for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); it != test_case_infos_.end(); ++it) { (*it)->RegisterTests(); } } private: typedef ::std::vector TestCaseInfoContainer; TestCaseInfoContainer test_case_infos_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry); }; } // namespace internal } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-port.h0000664000175000017500000020627413062445067021773 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan) // // Low-level types and utilities for porting Google Test to various // platforms. They are subject to change without notice. DO NOT USE // THEM IN USER CODE. // // This file is fundamental to Google Test. All other Google Test source // files are expected to #include this. Therefore, it cannot #include // any other Google Test header. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ // The user can define the following macros in the build script to // control Google Test's behavior. If the user doesn't define a macro // in this list, Google Test will define it. // // GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) // is/isn't available. // GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions // are enabled. // GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string // is/isn't available (some systems define // ::string, which is different to std::string). // GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string // is/isn't available (some systems define // ::wstring, which is different to std::wstring). // GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular // expressions are/aren't available. // GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that // is/isn't available. // GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't // enabled. // GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that // std::wstring does/doesn't work (Google Test can // be used where std::wstring is unavailable). // GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple // is/isn't available. // GTEST_HAS_SEH - Define it to 1/0 to indicate whether the // compiler supports Microsoft's "Structured // Exception Handling". // GTEST_HAS_STREAM_REDIRECTION // - Define it to 1/0 to indicate whether the // platform supports I/O stream redirection using // dup() and dup2(). // GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google // Test's own tr1 tuple implementation should be // used. Unused when the user sets // GTEST_HAS_TR1_TUPLE to 0. // GTEST_LANG_CXX11 - Define it to 1/0 to indicate that Google Test // is building in C++11/C++98 mode. // GTEST_LINKED_AS_SHARED_LIBRARY // - Define to 1 when compiling tests that use // Google Test as a shared library (known as // DLL on Windows). // GTEST_CREATE_SHARED_LIBRARY // - Define to 1 when compiling Google Test itself // as a shared library. // This header defines the following utilities: // // Macros indicating the current platform (defined to 1 if compiled on // the given platform; otherwise undefined): // GTEST_OS_AIX - IBM AIX // GTEST_OS_CYGWIN - Cygwin // GTEST_OS_HPUX - HP-UX // GTEST_OS_LINUX - Linux // GTEST_OS_LINUX_ANDROID - Google Android // GTEST_OS_MAC - Mac OS X // GTEST_OS_IOS - iOS // GTEST_OS_IOS_SIMULATOR - iOS simulator // GTEST_OS_NACL - Google Native Client (NaCl) // GTEST_OS_OPENBSD - OpenBSD // GTEST_OS_QNX - QNX // GTEST_OS_SOLARIS - Sun Solaris // GTEST_OS_SYMBIAN - Symbian // GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) // GTEST_OS_WINDOWS_DESKTOP - Windows Desktop // GTEST_OS_WINDOWS_MINGW - MinGW // GTEST_OS_WINDOWS_MOBILE - Windows Mobile // GTEST_OS_ZOS - z/OS // // Among the platforms, Cygwin, Linux, Max OS X, and Windows have the // most stable support. Since core members of the Google Test project // don't have access to other platforms, support for them may be less // stable. If you notice any problems on your platform, please notify // googletestframework@googlegroups.com (patches for fixing them are // even more welcome!). // // Note that it is possible that none of the GTEST_OS_* macros are defined. // // Macros indicating available Google Test features (defined to 1 if // the corresponding feature is supported; otherwise undefined): // GTEST_HAS_COMBINE - the Combine() function (for value-parameterized // tests) // GTEST_HAS_DEATH_TEST - death tests // GTEST_HAS_PARAM_TEST - value-parameterized tests // GTEST_HAS_TYPED_TEST - typed tests // GTEST_HAS_TYPED_TEST_P - type-parameterized tests // GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with // GTEST_HAS_POSIX_RE (see above) which users can // define themselves. // GTEST_USES_SIMPLE_RE - our own simple regex is used; // the above two are mutually exclusive. // GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ(). // // Macros for basic C++ coding: // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a // variable don't have to be used. // GTEST_DISALLOW_ASSIGN_ - disables operator=. // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. // // Synchronization: // Mutex, MutexLock, ThreadLocal, GetThreadCount() // - synchronization primitives. // GTEST_IS_THREADSAFE - defined to 1 to indicate that the above // synchronization primitives have real implementations // and Google Test is thread-safe; or 0 otherwise. // // Template meta programming: // is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only. // IteratorTraits - partial implementation of std::iterator_traits, which // is not available in libCstd when compiled with Sun C++. // // Smart pointers: // scoped_ptr - as in TR2. // // Regular expressions: // RE - a simple regular expression class using the POSIX // Extended Regular Expression syntax on UNIX-like // platforms, or a reduced regular exception syntax on // other platforms, including Windows. // // Logging: // GTEST_LOG_() - logs messages at the specified severity level. // LogToStderr() - directs all log messages to stderr. // FlushInfoLog() - flushes informational log messages. // // Stdout and stderr capturing: // CaptureStdout() - starts capturing stdout. // GetCapturedStdout() - stops capturing stdout and returns the captured // string. // CaptureStderr() - starts capturing stderr. // GetCapturedStderr() - stops capturing stderr and returns the captured // string. // // Integer types: // TypeWithSize - maps an integer to a int type. // Int32, UInt32, Int64, UInt64, TimeInMillis // - integers of known sizes. // BiggestInt - the biggest signed integer type. // // Command-line utilities: // GTEST_FLAG() - references a flag. // GTEST_DECLARE_*() - declares a flag. // GTEST_DEFINE_*() - defines a flag. // GetInjectableArgvs() - returns the command line as a vector of strings. // // Environment variable utilities: // GetEnv() - gets the value of an environment variable. // BoolFromGTestEnv() - parses a bool environment variable. // Int32FromGTestEnv() - parses an Int32 environment variable. // StringFromGTestEnv() - parses a string environment variable. #include // for isspace, etc #include // for ptrdiff_t #include #include #include #ifndef _WIN32_WCE # include # include #endif // !_WIN32_WCE #if defined __APPLE__ # include # include #endif #include // NOLINT #include // NOLINT #include // NOLINT #define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" #define GTEST_FLAG_PREFIX_ "gtest_" #define GTEST_FLAG_PREFIX_DASH_ "gtest-" #define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" #define GTEST_NAME_ "Google Test" #define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/" // Determines the version of gcc that is used to compile this. #ifdef __GNUC__ // 40302 means version 4.3.2. # define GTEST_GCC_VER_ \ (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) #endif // __GNUC__ // Determines the platform on which Google Test is compiled. #ifdef __CYGWIN__ # define GTEST_OS_CYGWIN 1 #elif defined __SYMBIAN32__ # define GTEST_OS_SYMBIAN 1 #elif defined _WIN32 # define GTEST_OS_WINDOWS 1 # ifdef _WIN32_WCE # define GTEST_OS_WINDOWS_MOBILE 1 # elif defined(__MINGW__) || defined(__MINGW32__) # define GTEST_OS_WINDOWS_MINGW 1 # else # define GTEST_OS_WINDOWS_DESKTOP 1 # endif // _WIN32_WCE #elif defined __APPLE__ # define GTEST_OS_MAC 1 # if TARGET_OS_IPHONE # define GTEST_OS_IOS 1 # if TARGET_IPHONE_SIMULATOR # define GTEST_OS_IOS_SIMULATOR 1 # endif # endif #elif defined __linux__ # define GTEST_OS_LINUX 1 # if defined __ANDROID__ # define GTEST_OS_LINUX_ANDROID 1 # endif #elif defined __MVS__ # define GTEST_OS_ZOS 1 #elif defined(__sun) && defined(__SVR4) # define GTEST_OS_SOLARIS 1 #elif defined(_AIX) # define GTEST_OS_AIX 1 #elif defined(__hpux) # define GTEST_OS_HPUX 1 #elif defined __native_client__ # define GTEST_OS_NACL 1 #elif defined __OpenBSD__ # define GTEST_OS_OPENBSD 1 #elif defined __QNX__ # define GTEST_OS_QNX 1 #endif // __CYGWIN__ #ifndef GTEST_LANG_CXX11 // gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when // -std={c,gnu}++{0x,11} is passed. The C++11 standard specifies a // value for __cplusplus, and recent versions of clang, gcc, and // probably other compilers set that too in C++11 mode. # if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L // Compiling in at least C++11 mode. # define GTEST_LANG_CXX11 1 # else # define GTEST_LANG_CXX11 0 # endif #endif // Brings in definitions for functions used in the testing::internal::posix // namespace (read, write, close, chdir, isatty, stat). We do not currently // use them on Windows Mobile. #if !GTEST_OS_WINDOWS // This assumes that non-Windows OSes provide unistd.h. For OSes where this // is not the case, we need to include headers that provide the functions // mentioned above. # include # include #elif !GTEST_OS_WINDOWS_MOBILE # include # include #endif #if GTEST_OS_LINUX_ANDROID // Used to define __ANDROID_API__ matching the target NDK API level. # include // NOLINT #endif // Defines this to true iff Google Test can use POSIX regular expressions. #ifndef GTEST_HAS_POSIX_RE # if GTEST_OS_LINUX_ANDROID // On Android, is only available starting with Gingerbread. # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) # else # define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) # endif #endif #if GTEST_HAS_POSIX_RE // On some platforms, needs someone to define size_t, and // won't compile otherwise. We can #include it here as we already // included , which is guaranteed to define size_t through // . # include // NOLINT # define GTEST_USES_POSIX_RE 1 #elif GTEST_OS_WINDOWS // is not available on Windows. Use our own simple regex // implementation instead. # define GTEST_USES_SIMPLE_RE 1 #else // may not be available on this platform. Use our own // simple regex implementation instead. # define GTEST_USES_SIMPLE_RE 1 #endif // GTEST_HAS_POSIX_RE #ifndef GTEST_HAS_EXCEPTIONS // The user didn't tell us whether exceptions are enabled, so we need // to figure it out. # if defined(_MSC_VER) || defined(__BORLANDC__) // MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS // macro to enable exceptions, so we'll do the same. // Assumes that exceptions are enabled by default. # ifndef _HAS_EXCEPTIONS # define _HAS_EXCEPTIONS 1 # endif // _HAS_EXCEPTIONS # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS # elif defined(__GNUC__) && __EXCEPTIONS // gcc defines __EXCEPTIONS to 1 iff exceptions are enabled. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__SUNPRO_CC) // Sun Pro CC supports exceptions. However, there is no compile-time way of // detecting whether they are enabled or not. Therefore, we assume that // they are enabled unless the user tells us otherwise. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__IBMCPP__) && __EXCEPTIONS // xlC defines __EXCEPTIONS to 1 iff exceptions are enabled. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__HP_aCC) // Exception handling is in effect by default in HP aCC compiler. It has to // be turned of by +noeh compiler option if desired. # define GTEST_HAS_EXCEPTIONS 1 # else // For other compilers, we assume exceptions are disabled to be // conservative. # define GTEST_HAS_EXCEPTIONS 0 # endif // defined(_MSC_VER) || defined(__BORLANDC__) #endif // GTEST_HAS_EXCEPTIONS #if !defined(GTEST_HAS_STD_STRING) // Even though we don't use this macro any longer, we keep it in case // some clients still depend on it. # define GTEST_HAS_STD_STRING 1 #elif !GTEST_HAS_STD_STRING // The user told us that ::std::string isn't available. # error "Google Test cannot be used where ::std::string isn't available." #endif // !defined(GTEST_HAS_STD_STRING) #ifndef GTEST_HAS_GLOBAL_STRING // The user didn't tell us whether ::string is available, so we need // to figure it out. # define GTEST_HAS_GLOBAL_STRING 0 #endif // GTEST_HAS_GLOBAL_STRING #ifndef GTEST_HAS_STD_WSTRING // The user didn't tell us whether ::std::wstring is available, so we need // to figure it out. // TODO(wan@google.com): uses autoconf to detect whether ::std::wstring // is available. // Cygwin 1.7 and below doesn't support ::std::wstring. // Solaris' libc++ doesn't support it either. Android has // no support for it at least as recent as Froyo (2.2). # define GTEST_HAS_STD_WSTRING \ (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS)) #endif // GTEST_HAS_STD_WSTRING #ifndef GTEST_HAS_GLOBAL_WSTRING // The user didn't tell us whether ::wstring is available, so we need // to figure it out. # define GTEST_HAS_GLOBAL_WSTRING \ (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) #endif // GTEST_HAS_GLOBAL_WSTRING // Determines whether RTTI is available. #ifndef GTEST_HAS_RTTI // The user didn't tell us whether RTTI is enabled, so we need to // figure it out. # ifdef _MSC_VER # ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. # define GTEST_HAS_RTTI 1 # else # define GTEST_HAS_RTTI 0 # endif // Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled. # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302) # ifdef __GXX_RTTI // When building against STLport with the Android NDK and with // -frtti -fno-exceptions, the build fails at link time with undefined // references to __cxa_bad_typeid. Note sure if STL or toolchain bug, // so disable RTTI when detected. # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \ !defined(__EXCEPTIONS) # define GTEST_HAS_RTTI 0 # else # define GTEST_HAS_RTTI 1 # endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS # else # define GTEST_HAS_RTTI 0 # endif // __GXX_RTTI // Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends // using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the // first version with C++ support. # elif defined(__clang__) # define GTEST_HAS_RTTI __has_feature(cxx_rtti) // Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if // both the typeid and dynamic_cast features are present. # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) # ifdef __RTTI_ALL__ # define GTEST_HAS_RTTI 1 # else # define GTEST_HAS_RTTI 0 # endif # else // For all other compilers, we assume RTTI is enabled. # define GTEST_HAS_RTTI 1 # endif // _MSC_VER #endif // GTEST_HAS_RTTI // It's this header's responsibility to #include when RTTI // is enabled. #if GTEST_HAS_RTTI # include #endif // Determines whether Google Test can use the pthreads library. #ifndef GTEST_HAS_PTHREAD // The user didn't tell us explicitly, so we assume pthreads support is // available on Linux and Mac. // // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 // to your compiler flags. # define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \ || GTEST_OS_QNX) #endif // GTEST_HAS_PTHREAD #if GTEST_HAS_PTHREAD // gtest-port.h guarantees to #include when GTEST_HAS_PTHREAD is // true. # include // NOLINT // For timespec and nanosleep, used below. # include // NOLINT #endif // Determines whether Google Test can use tr1/tuple. You can define // this macro to 0 to prevent Google Test from using tuple (any // feature depending on tuple with be disabled in this mode). #ifndef GTEST_HAS_TR1_TUPLE # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) // STLport, provided with the Android NDK, has neither or . # define GTEST_HAS_TR1_TUPLE 0 # else // The user didn't tell us not to do it, so we assume it's OK. # define GTEST_HAS_TR1_TUPLE 1 # endif #endif // GTEST_HAS_TR1_TUPLE // Determines whether Google Test's own tr1 tuple implementation // should be used. #ifndef GTEST_USE_OWN_TR1_TUPLE // The user didn't tell us, so we need to figure it out. // We use our own TR1 tuple if we aren't sure the user has an // implementation of it already. At this time, libstdc++ 4.0.0+ and // MSVC 2010 are the only mainstream standard libraries that come // with a TR1 tuple implementation. NVIDIA's CUDA NVCC compiler // pretends to be GCC by defining __GNUC__ and friends, but cannot // compile GCC's tuple implementation. MSVC 2008 (9.0) provides TR1 // tuple in a 323 MB Feature Pack download, which we cannot assume the // user has. QNX's QCC compiler is a modified GCC but it doesn't // support TR1 tuple. libc++ only provides std::tuple, in C++11 mode, // and it can be used with some compilers that define __GNUC__. # if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \ && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600 # define GTEST_ENV_HAS_TR1_TUPLE_ 1 # endif // C++11 specifies that provides std::tuple. Use that if gtest is used // in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6 // can build with clang but need to use gcc4.2's libstdc++). # if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325) # define GTEST_ENV_HAS_STD_TUPLE_ 1 # endif # if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_ # define GTEST_USE_OWN_TR1_TUPLE 0 # else # define GTEST_USE_OWN_TR1_TUPLE 1 # endif #endif // GTEST_USE_OWN_TR1_TUPLE // To avoid conditional compilation everywhere, we make it // gtest-port.h's responsibility to #include the header implementing // tr1/tuple. #if GTEST_HAS_TR1_TUPLE # if GTEST_USE_OWN_TR1_TUPLE # include "gtest/internal/gtest-tuple.h" # elif GTEST_ENV_HAS_STD_TUPLE_ # include // C++11 puts its tuple into the ::std namespace rather than // ::std::tr1. gtest expects tuple to live in ::std::tr1, so put it there. // This causes undefined behavior, but supported compilers react in // the way we intend. namespace std { namespace tr1 { using ::std::get; using ::std::make_tuple; using ::std::tuple; using ::std::tuple_element; using ::std::tuple_size; } } # elif GTEST_OS_SYMBIAN // On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to // use STLport's tuple implementation, which unfortunately doesn't // work as the copy of STLport distributed with Symbian is incomplete. // By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to // use its own tuple implementation. # ifdef BOOST_HAS_TR1_TUPLE # undef BOOST_HAS_TR1_TUPLE # endif // BOOST_HAS_TR1_TUPLE // This prevents , which defines // BOOST_HAS_TR1_TUPLE, from being #included by Boost's . # define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED # include # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) // GCC 4.0+ implements tr1/tuple in the header. This does // not conform to the TR1 spec, which requires the header to be . # if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 // Until version 4.3.2, gcc has a bug that causes , // which is #included by , to not compile when RTTI is // disabled. _TR1_FUNCTIONAL is the header guard for // . Hence the following #define is a hack to prevent // from being included. # define _TR1_FUNCTIONAL 1 # include # undef _TR1_FUNCTIONAL // Allows the user to #include // if he chooses to. # else # include // NOLINT # endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 # else // If the compiler is not GCC 4.0+, we assume the user is using a // spec-conforming TR1 implementation. # include // NOLINT # endif // GTEST_USE_OWN_TR1_TUPLE #endif // GTEST_HAS_TR1_TUPLE // Determines whether clone(2) is supported. // Usually it will only be available on Linux, excluding // Linux on the Itanium architecture. // Also see http://linux.die.net/man/2/clone. #ifndef GTEST_HAS_CLONE // The user didn't tell us, so we need to figure it out. # if GTEST_OS_LINUX && !defined(__ia64__) # if GTEST_OS_LINUX_ANDROID // On Android, clone() is only available on ARM starting with Gingerbread. # if defined(__arm__) && __ANDROID_API__ >= 9 # define GTEST_HAS_CLONE 1 # else # define GTEST_HAS_CLONE 0 # endif # else # define GTEST_HAS_CLONE 1 # endif # else # define GTEST_HAS_CLONE 0 # endif // GTEST_OS_LINUX && !defined(__ia64__) #endif // GTEST_HAS_CLONE // Determines whether to support stream redirection. This is used to test // output correctness and to implement death tests. #ifndef GTEST_HAS_STREAM_REDIRECTION // By default, we assume that stream redirection is supported on all // platforms except known mobile ones. # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN # define GTEST_HAS_STREAM_REDIRECTION 0 # else # define GTEST_HAS_STREAM_REDIRECTION 1 # endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN #endif // GTEST_HAS_STREAM_REDIRECTION // Determines whether to support death tests. // Google Test does not support death tests for VC 7.1 and earlier as // abort() in a VC 7.1 application compiled as GUI in debug config // pops up a dialog window that cannot be suppressed programmatically. #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \ (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \ GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \ GTEST_OS_OPENBSD || GTEST_OS_QNX) # define GTEST_HAS_DEATH_TEST 1 # include // NOLINT #endif // We don't support MSVC 7.1 with exceptions disabled now. Therefore // all the compilers we care about are adequate for supporting // value-parameterized tests. #define GTEST_HAS_PARAM_TEST 1 // Determines whether to support type-driven tests. // Typed tests need and variadic macros, which GCC, VC++ 8.0, // Sun Pro CC, IBM Visual Age, and HP aCC support. #if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \ defined(__IBMCPP__) || defined(__HP_aCC) # define GTEST_HAS_TYPED_TEST 1 # define GTEST_HAS_TYPED_TEST_P 1 #endif // Determines whether to support Combine(). This only makes sense when // value-parameterized tests are enabled. The implementation doesn't // work on Sun Studio since it doesn't understand templated conversion // operators. #if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC) # define GTEST_HAS_COMBINE 1 #endif // Determines whether the system compiler uses UTF-16 for encoding wide strings. #define GTEST_WIDE_STRING_USES_UTF16_ \ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX) // Determines whether test results can be streamed to a socket. #if GTEST_OS_LINUX # define GTEST_CAN_STREAM_RESULTS_ 1 #endif // Defines some utility macros. // The GNU compiler emits a warning if nested "if" statements are followed by // an "else" statement and braces are not used to explicitly disambiguate the // "else" binding. This leads to problems with code like: // // if (gate) // ASSERT_*(condition) << "Some message"; // // The "switch (0) case 0:" idiom is used to suppress this. #ifdef __INTEL_COMPILER # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ #else # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT #endif // Use this annotation at the end of a struct/class definition to // prevent the compiler from optimizing away instances that are never // used. This is useful when all interesting logic happens inside the // c'tor and / or d'tor. Example: // // struct Foo { // Foo() { ... } // } GTEST_ATTRIBUTE_UNUSED_; // // Also use it after a variable or parameter declaration to tell the // compiler the variable/parameter does not have to be used. #if defined(__GNUC__) && !defined(COMPILER_ICC) # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) #else # define GTEST_ATTRIBUTE_UNUSED_ #endif // A macro to disallow operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_ASSIGN_(type)\ void operator=(type const &) // A macro to disallow copy constructor and operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\ type(type const &);\ GTEST_DISALLOW_ASSIGN_(type) // Tell the compiler to warn about unused return values for functions declared // with this macro. The macro should be used on function declarations // following the argument list: // // Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; #if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC) # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) #else # define GTEST_MUST_USE_RESULT_ #endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC // Determine whether the compiler supports Microsoft's Structured Exception // Handling. This is supported by several Windows compilers but generally // does not exist on any other system. #ifndef GTEST_HAS_SEH // The user didn't tell us, so we need to figure it out. # if defined(_MSC_VER) || defined(__BORLANDC__) // These two compilers are known to support SEH. # define GTEST_HAS_SEH 1 # else // Assume no SEH. # define GTEST_HAS_SEH 0 # endif #endif // GTEST_HAS_SEH #ifdef _MSC_VER # if GTEST_LINKED_AS_SHARED_LIBRARY # define GTEST_API_ __declspec(dllimport) # elif GTEST_CREATE_SHARED_LIBRARY # define GTEST_API_ __declspec(dllexport) # endif #endif // _MSC_VER #ifndef GTEST_API_ # define GTEST_API_ #endif #ifdef __GNUC__ // Ask the compiler to never inline a given function. # define GTEST_NO_INLINE_ __attribute__((noinline)) #else # define GTEST_NO_INLINE_ #endif // _LIBCPP_VERSION is defined by the libc++ library from the LLVM project. #if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION) # define GTEST_HAS_CXXABI_H_ 1 #else # define GTEST_HAS_CXXABI_H_ 0 #endif namespace testing { class Message; namespace internal { // A secret type that Google Test users don't know about. It has no // definition on purpose. Therefore it's impossible to create a // Secret object, which is what we want. class Secret; // The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time // expression is true. For example, you could use it to verify the // size of a static array: // // GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES, // content_type_names_incorrect_size); // // or to make sure a struct is smaller than a certain size: // // GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large); // // The second argument to the macro is the name of the variable. If // the expression is false, most compilers will issue a warning/error // containing the name of the variable. template struct CompileAssert { }; #define GTEST_COMPILE_ASSERT_(expr, msg) \ typedef ::testing::internal::CompileAssert<(static_cast(expr))> \ msg[static_cast(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_ // Implementation details of GTEST_COMPILE_ASSERT_: // // - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1 // elements (and thus is invalid) when the expression is false. // // - The simpler definition // // #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1] // // does not work, as gcc supports variable-length arrays whose sizes // are determined at run-time (this is gcc's extension and not part // of the C++ standard). As a result, gcc fails to reject the // following code with the simple definition: // // int foo; // GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is // // not a compile-time constant. // // - By using the type CompileAssert<(bool(expr))>, we ensures that // expr is a compile-time constant. (Template arguments must be // determined at compile-time.) // // - The outter parentheses in CompileAssert<(bool(expr))> are necessary // to work around a bug in gcc 3.4.4 and 4.0.1. If we had written // // CompileAssert // // instead, these compilers will refuse to compile // // GTEST_COMPILE_ASSERT_(5 > 0, some_message); // // (They seem to think the ">" in "5 > 0" marks the end of the // template argument list.) // // - The array size is (bool(expr) ? 1 : -1), instead of simply // // ((expr) ? 1 : -1). // // This is to avoid running into a bug in MS VC 7.1, which // causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. // StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h. // // This template is declared, but intentionally undefined. template struct StaticAssertTypeEqHelper; template struct StaticAssertTypeEqHelper {}; #if GTEST_HAS_GLOBAL_STRING typedef ::string string; #else typedef ::std::string string; #endif // GTEST_HAS_GLOBAL_STRING #if GTEST_HAS_GLOBAL_WSTRING typedef ::wstring wstring; #elif GTEST_HAS_STD_WSTRING typedef ::std::wstring wstring; #endif // GTEST_HAS_GLOBAL_WSTRING // A helper for suppressing warnings on constant condition. It just // returns 'condition'. GTEST_API_ bool IsTrue(bool condition); // Defines scoped_ptr. // This implementation of scoped_ptr is PARTIAL - it only contains // enough stuff to satisfy Google Test's need. template class scoped_ptr { public: typedef T element_type; explicit scoped_ptr(T* p = NULL) : ptr_(p) {} ~scoped_ptr() { reset(); } T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } T* get() const { return ptr_; } T* release() { T* const ptr = ptr_; ptr_ = NULL; return ptr; } void reset(T* p = NULL) { if (p != ptr_) { if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type. delete ptr_; } ptr_ = p; } } private: T* ptr_; GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr); }; // Defines RE. // A simple C++ wrapper for . It uses the POSIX Extended // Regular Expression syntax. class GTEST_API_ RE { public: // A copy constructor is required by the Standard to initialize object // references from r-values. RE(const RE& other) { Init(other.pattern()); } // Constructs an RE from a string. RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT #if GTEST_HAS_GLOBAL_STRING RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT #endif // GTEST_HAS_GLOBAL_STRING RE(const char* regex) { Init(regex); } // NOLINT ~RE(); // Returns the string representation of the regex. const char* pattern() const { return pattern_; } // FullMatch(str, re) returns true iff regular expression re matches // the entire str. // PartialMatch(str, re) returns true iff regular expression re // matches a substring of str (including str itself). // // TODO(wan@google.com): make FullMatch() and PartialMatch() work // when str contains NUL characters. static bool FullMatch(const ::std::string& str, const RE& re) { return FullMatch(str.c_str(), re); } static bool PartialMatch(const ::std::string& str, const RE& re) { return PartialMatch(str.c_str(), re); } #if GTEST_HAS_GLOBAL_STRING static bool FullMatch(const ::string& str, const RE& re) { return FullMatch(str.c_str(), re); } static bool PartialMatch(const ::string& str, const RE& re) { return PartialMatch(str.c_str(), re); } #endif // GTEST_HAS_GLOBAL_STRING static bool FullMatch(const char* str, const RE& re); static bool PartialMatch(const char* str, const RE& re); private: void Init(const char* regex); // We use a const char* instead of an std::string, as Google Test used to be // used where std::string is not available. TODO(wan@google.com): change to // std::string. const char* pattern_; bool is_valid_; #if GTEST_USES_POSIX_RE regex_t full_regex_; // For FullMatch(). regex_t partial_regex_; // For PartialMatch(). #else // GTEST_USES_SIMPLE_RE const char* full_pattern_; // For FullMatch(); #endif GTEST_DISALLOW_ASSIGN_(RE); }; // Formats a source file path and a line number as they would appear // in an error message from the compiler used to compile this code. GTEST_API_ ::std::string FormatFileLocation(const char* file, int line); // Formats a file location for compiler-independent XML output. // Although this function is not platform dependent, we put it next to // FormatFileLocation in order to contrast the two functions. GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file, int line); // Defines logging utilities: // GTEST_LOG_(severity) - logs messages at the specified severity level. The // message itself is streamed into the macro. // LogToStderr() - directs all log messages to stderr. // FlushInfoLog() - flushes informational log messages. enum GTestLogSeverity { GTEST_INFO, GTEST_WARNING, GTEST_ERROR, GTEST_FATAL }; // Formats log entry severity, provides a stream object for streaming the // log message, and terminates the message with a newline when going out of // scope. class GTEST_API_ GTestLog { public: GTestLog(GTestLogSeverity severity, const char* file, int line); // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. ~GTestLog(); ::std::ostream& GetStream() { return ::std::cerr; } private: const GTestLogSeverity severity_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); }; #define GTEST_LOG_(severity) \ ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ __FILE__, __LINE__).GetStream() inline void LogToStderr() {} inline void FlushInfoLog() { fflush(NULL); } // INTERNAL IMPLEMENTATION - DO NOT USE. // // GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition // is not satisfied. // Synopsys: // GTEST_CHECK_(boolean_condition); // or // GTEST_CHECK_(boolean_condition) << "Additional message"; // // This checks the condition and if the condition is not satisfied // it prints message about the condition violation, including the // condition itself, plus additional message streamed into it, if any, // and then it aborts the program. It aborts the program irrespective of // whether it is built in the debug mode or not. #define GTEST_CHECK_(condition) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::IsTrue(condition)) \ ; \ else \ GTEST_LOG_(FATAL) << "Condition " #condition " failed. " // An all-mode assert to verify that the given POSIX-style function // call returns 0 (indicating success). Known limitation: this // doesn't expand to a balanced 'if' statement, so enclose the macro // in {} if you need to use it as the only statement in an 'if' // branch. #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ if (const int gtest_error = (posix_call)) \ GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ << gtest_error // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Use ImplicitCast_ as a safe version of static_cast for upcasting in // the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a // const Foo*). When you use ImplicitCast_, the compiler checks that // the cast is safe. Such explicit ImplicitCast_s are necessary in // surprisingly many situations where C++ demands an exact type match // instead of an argument type convertable to a target type. // // The syntax for using ImplicitCast_ is the same as for static_cast: // // ImplicitCast_(expr) // // ImplicitCast_ would have been part of the C++ standard library, // but the proposal was submitted too late. It will probably make // its way into the language in the future. // // This relatively ugly name is intentional. It prevents clashes with // similar functions users may have (e.g., implicit_cast). The internal // namespace alone is not enough because the function can be found by ADL. template inline To ImplicitCast_(To x) { return x; } // When you upcast (that is, cast a pointer from type Foo to type // SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts // always succeed. When you downcast (that is, cast a pointer from // type Foo to type SubclassOfFoo), static_cast<> isn't safe, because // how do you know the pointer is really of type SubclassOfFoo? It // could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, // when you downcast, you should use this macro. In debug mode, we // use dynamic_cast<> to double-check the downcast is legal (we die // if it's not). In normal mode, we do the efficient static_cast<> // instead. Thus, it's important to test in debug mode to make sure // the cast is legal! // This is the only place in the code we should use dynamic_cast<>. // In particular, you SHOULDN'T be using dynamic_cast<> in order to // do RTTI (eg code like this: // if (dynamic_cast(foo)) HandleASubclass1Object(foo); // if (dynamic_cast(foo)) HandleASubclass2Object(foo); // You should design the code some other way not to need this. // // This relatively ugly name is intentional. It prevents clashes with // similar functions users may have (e.g., down_cast). The internal // namespace alone is not enough because the function can be found by ADL. template // use like this: DownCast_(foo); inline To DownCast_(From* f) { // so we only accept pointers // Ensures that To is a sub-type of From *. This test is here only // for compile-time type checking, and has no overhead in an // optimized build at run-time, as it will be optimized away // completely. if (false) { const To to = NULL; ::testing::internal::ImplicitCast_(to); } #if GTEST_HAS_RTTI // RTTI: debug mode only! GTEST_CHECK_(f == NULL || dynamic_cast(f) != NULL); #endif return static_cast(f); } // Downcasts the pointer of type Base to Derived. // Derived must be a subclass of Base. The parameter MUST // point to a class of type Derived, not any subclass of it. // When RTTI is available, the function performs a runtime // check to enforce this. template Derived* CheckedDowncastToActualType(Base* base) { #if GTEST_HAS_RTTI GTEST_CHECK_(typeid(*base) == typeid(Derived)); return dynamic_cast(base); // NOLINT #else return static_cast(base); // Poor man's downcast. #endif } #if GTEST_HAS_STREAM_REDIRECTION // Defines the stderr capturer: // CaptureStdout - starts capturing stdout. // GetCapturedStdout - stops capturing stdout and returns the captured string. // CaptureStderr - starts capturing stderr. // GetCapturedStderr - stops capturing stderr and returns the captured string. // GTEST_API_ void CaptureStdout(); GTEST_API_ std::string GetCapturedStdout(); GTEST_API_ void CaptureStderr(); GTEST_API_ std::string GetCapturedStderr(); #endif // GTEST_HAS_STREAM_REDIRECTION #if GTEST_HAS_DEATH_TEST const ::std::vector& GetInjectableArgvs(); void SetInjectableArgvs(const ::std::vector* new_argvs); // A copy of all command line arguments. Set by InitGoogleTest(). extern ::std::vector g_argvs; #endif // GTEST_HAS_DEATH_TEST // Defines synchronization primitives. #if GTEST_HAS_PTHREAD // Sleeps for (roughly) n milli-seconds. This function is only for // testing Google Test's own constructs. Don't use it in user tests, // either directly or indirectly. inline void SleepMilliseconds(int n) { const timespec time = { 0, // 0 seconds. n * 1000L * 1000L, // And n ms. }; nanosleep(&time, NULL); } // Allows a controller thread to pause execution of newly created // threads until notified. Instances of this class must be created // and destroyed in the controller thread. // // This class is only for testing Google Test's own constructs. Do not // use it in user tests, either directly or indirectly. class Notification { public: Notification() : notified_(false) { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); } ~Notification() { pthread_mutex_destroy(&mutex_); } // Notifies all threads created with this notification to start. Must // be called from the controller thread. void Notify() { pthread_mutex_lock(&mutex_); notified_ = true; pthread_mutex_unlock(&mutex_); } // Blocks until the controller thread notifies. Must be called from a test // thread. void WaitForNotification() { for (;;) { pthread_mutex_lock(&mutex_); const bool notified = notified_; pthread_mutex_unlock(&mutex_); if (notified) break; SleepMilliseconds(10); } } private: pthread_mutex_t mutex_; bool notified_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); }; // As a C-function, ThreadFuncWithCLinkage cannot be templated itself. // Consequently, it cannot select a correct instantiation of ThreadWithParam // in order to call its Run(). Introducing ThreadWithParamBase as a // non-templated base class for ThreadWithParam allows us to bypass this // problem. class ThreadWithParamBase { public: virtual ~ThreadWithParamBase() {} virtual void Run() = 0; }; // pthread_create() accepts a pointer to a function type with the C linkage. // According to the Standard (7.5/1), function types with different linkages // are different even if they are otherwise identical. Some compilers (for // example, SunStudio) treat them as different types. Since class methods // cannot be defined with C-linkage we need to define a free C-function to // pass into pthread_create(). extern "C" inline void* ThreadFuncWithCLinkage(void* thread) { static_cast(thread)->Run(); return NULL; } // Helper class for testing Google Test's multi-threading constructs. // To use it, write: // // void ThreadFunc(int param) { /* Do things with param */ } // Notification thread_can_start; // ... // // The thread_can_start parameter is optional; you can supply NULL. // ThreadWithParam thread(&ThreadFunc, 5, &thread_can_start); // thread_can_start.Notify(); // // These classes are only for testing Google Test's own constructs. Do // not use them in user tests, either directly or indirectly. template class ThreadWithParam : public ThreadWithParamBase { public: typedef void (*UserThreadFunc)(T); ThreadWithParam( UserThreadFunc func, T param, Notification* thread_can_start) : func_(func), param_(param), thread_can_start_(thread_can_start), finished_(false) { ThreadWithParamBase* const base = this; // The thread can be created only after all fields except thread_ // have been initialized. GTEST_CHECK_POSIX_SUCCESS_( pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base)); } ~ThreadWithParam() { Join(); } void Join() { if (!finished_) { GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0)); finished_ = true; } } virtual void Run() { if (thread_can_start_ != NULL) thread_can_start_->WaitForNotification(); func_(param_); } private: const UserThreadFunc func_; // User-supplied thread function. const T param_; // User-supplied parameter to the thread function. // When non-NULL, used to block execution until the controller thread // notifies. Notification* const thread_can_start_; bool finished_; // true iff we know that the thread function has finished. pthread_t thread_; // The native thread object. GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); }; // MutexBase and Mutex implement mutex on pthreads-based platforms. They // are used in conjunction with class MutexLock: // // Mutex mutex; // ... // MutexLock lock(&mutex); // Acquires the mutex and releases it at the end // // of the current scope. // // MutexBase implements behavior for both statically and dynamically // allocated mutexes. Do not use MutexBase directly. Instead, write // the following to define a static mutex: // // GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); // // You can forward declare a static mutex like this: // // GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); // // To create a dynamic mutex, just define an object of type Mutex. class MutexBase { public: // Acquires this mutex. void Lock() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); owner_ = pthread_self(); has_owner_ = true; } // Releases this mutex. void Unlock() { // Since the lock is being released the owner_ field should no longer be // considered valid. We don't protect writing to has_owner_ here, as it's // the caller's responsibility to ensure that the current thread holds the // mutex when this is called. has_owner_ = false; GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); } // Does nothing if the current thread holds the mutex. Otherwise, crashes // with high probability. void AssertHeld() const { GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self())) << "The current thread is not holding the mutex @" << this; } // A static mutex may be used before main() is entered. It may even // be used before the dynamic initialization stage. Therefore we // must be able to initialize a static mutex object at link time. // This means MutexBase has to be a POD and its member variables // have to be public. public: pthread_mutex_t mutex_; // The underlying pthread mutex. // has_owner_ indicates whether the owner_ field below contains a valid thread // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All // accesses to the owner_ field should be protected by a check of this field. // An alternative might be to memset() owner_ to all zeros, but there's no // guarantee that a zero'd pthread_t is necessarily invalid or even different // from pthread_self(). bool has_owner_; pthread_t owner_; // The thread holding the mutex. }; // Forward-declares a static mutex. # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::MutexBase mutex // Defines and statically (i.e. at link time) initializes a static mutex. // The initialization list here does not explicitly initialize each field, // instead relying on default initialization for the unspecified fields. In // particular, the owner_ field (a pthread_t) is not explicitly initialized. // This allows initialization to work whether pthread_t is a scalar or struct. // The flag -Wmissing-field-initializers must not be specified for this to work. # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false } // The Mutex class can only be used for mutexes created at runtime. It // shares its API with MutexBase otherwise. class Mutex : public MutexBase { public: Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); has_owner_ = false; } ~Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); }; // We cannot name this class MutexLock as the ctor declaration would // conflict with a macro named MutexLock, which is defined on some // platforms. Hence the typedef trick below. class GTestMutexLock { public: explicit GTestMutexLock(MutexBase* mutex) : mutex_(mutex) { mutex_->Lock(); } ~GTestMutexLock() { mutex_->Unlock(); } private: MutexBase* const mutex_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); }; typedef GTestMutexLock MutexLock; // Helpers for ThreadLocal. // pthread_key_create() requires DeleteThreadLocalValue() to have // C-linkage. Therefore it cannot be templatized to access // ThreadLocal. Hence the need for class // ThreadLocalValueHolderBase. class ThreadLocalValueHolderBase { public: virtual ~ThreadLocalValueHolderBase() {} }; // Called by pthread to delete thread-local data stored by // pthread_setspecific(). extern "C" inline void DeleteThreadLocalValue(void* value_holder) { delete static_cast(value_holder); } // Implements thread-local storage on pthreads-based systems. // // // Thread 1 // ThreadLocal tl(100); // 100 is the default value for each thread. // // // Thread 2 // tl.set(150); // Changes the value for thread 2 only. // EXPECT_EQ(150, tl.get()); // // // Thread 1 // EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. // tl.set(200); // EXPECT_EQ(200, tl.get()); // // The template type argument T must have a public copy constructor. // In addition, the default ThreadLocal constructor requires T to have // a public default constructor. // // An object managed for a thread by a ThreadLocal instance is deleted // when the thread exits. Or, if the ThreadLocal instance dies in // that thread, when the ThreadLocal dies. It's the user's // responsibility to ensure that all other threads using a ThreadLocal // have exited when it dies, or the per-thread objects for those // threads will not be deleted. // // Google Test only uses global ThreadLocal objects. That means they // will die after main() has returned. Therefore, no per-thread // object managed by Google Test will be leaked as long as all threads // using Google Test have exited when main() returns. template class ThreadLocal { public: ThreadLocal() : key_(CreateKey()), default_() {} explicit ThreadLocal(const T& value) : key_(CreateKey()), default_(value) {} ~ThreadLocal() { // Destroys the managed object for the current thread, if any. DeleteThreadLocalValue(pthread_getspecific(key_)); // Releases resources associated with the key. This will *not* // delete managed objects for other threads. GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); } T* pointer() { return GetOrCreateValue(); } const T* pointer() const { return GetOrCreateValue(); } const T& get() const { return *pointer(); } void set(const T& value) { *pointer() = value; } private: // Holds a value of type T. class ValueHolder : public ThreadLocalValueHolderBase { public: explicit ValueHolder(const T& value) : value_(value) {} T* pointer() { return &value_; } private: T value_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); }; static pthread_key_t CreateKey() { pthread_key_t key; // When a thread exits, DeleteThreadLocalValue() will be called on // the object managed for that thread. GTEST_CHECK_POSIX_SUCCESS_( pthread_key_create(&key, &DeleteThreadLocalValue)); return key; } T* GetOrCreateValue() const { ThreadLocalValueHolderBase* const holder = static_cast(pthread_getspecific(key_)); if (holder != NULL) { return CheckedDowncastToActualType(holder)->pointer(); } ValueHolder* const new_holder = new ValueHolder(default_); ThreadLocalValueHolderBase* const holder_base = new_holder; GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); return new_holder->pointer(); } // A key pthreads uses for looking up per-thread values. const pthread_key_t key_; const T default_; // The default value for each thread. GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); }; # define GTEST_IS_THREADSAFE 1 #else // GTEST_HAS_PTHREAD // A dummy implementation of synchronization primitives (mutex, lock, // and thread-local variable). Necessary for compiling Google Test where // mutex is not supported - using Google Test in multiple threads is not // supported on such platforms. class Mutex { public: Mutex() {} void Lock() {} void Unlock() {} void AssertHeld() const {} }; # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::Mutex mutex # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex class GTestMutexLock { public: explicit GTestMutexLock(Mutex*) {} // NOLINT }; typedef GTestMutexLock MutexLock; template class ThreadLocal { public: ThreadLocal() : value_() {} explicit ThreadLocal(const T& value) : value_(value) {} T* pointer() { return &value_; } const T* pointer() const { return &value_; } const T& get() const { return value_; } void set(const T& value) { value_ = value; } private: T value_; }; // The above synchronization primitives have dummy implementations. // Therefore Google Test is not thread-safe. # define GTEST_IS_THREADSAFE 0 #endif // GTEST_HAS_PTHREAD // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. GTEST_API_ size_t GetThreadCount(); // Passing non-POD classes through ellipsis (...) crashes the ARM // compiler and generates a warning in Sun Studio. The Nokia Symbian // and the IBM XL C/C++ compiler try to instantiate a copy constructor // for objects passed through ellipsis (...), failing for uncopyable // objects. We define this to ensure that only POD is passed through // ellipsis on these systems. #if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC) // We lose support for NULL detection where the compiler doesn't like // passing non-POD classes through ellipsis (...). # define GTEST_ELLIPSIS_NEEDS_POD_ 1 #else # define GTEST_CAN_COMPARE_NULL 1 #endif // The Nokia Symbian and IBM XL C/C++ compilers cannot decide between // const T& and const T* in a function template. These compilers // _can_ decide between class template specializations for T and T*, // so a tr1::type_traits-like is_pointer works. #if defined(__SYMBIAN32__) || defined(__IBMCPP__) # define GTEST_NEEDS_IS_POINTER_ 1 #endif template struct bool_constant { typedef bool_constant type; static const bool value = bool_value; }; template const bool bool_constant::value; typedef bool_constant false_type; typedef bool_constant true_type; template struct is_pointer : public false_type {}; template struct is_pointer : public true_type {}; template struct IteratorTraits { typedef typename Iterator::value_type value_type; }; template struct IteratorTraits { typedef T value_type; }; template struct IteratorTraits { typedef T value_type; }; #if GTEST_OS_WINDOWS # define GTEST_PATH_SEP_ "\\" # define GTEST_HAS_ALT_PATH_SEP_ 1 // The biggest signed integer type the compiler supports. typedef __int64 BiggestInt; #else # define GTEST_PATH_SEP_ "/" # define GTEST_HAS_ALT_PATH_SEP_ 0 typedef long long BiggestInt; // NOLINT #endif // GTEST_OS_WINDOWS // Utilities for char. // isspace(int ch) and friends accept an unsigned char or EOF. char // may be signed, depending on the compiler (or compiler flags). // Therefore we need to cast a char to unsigned char before calling // isspace(), etc. inline bool IsAlpha(char ch) { return isalpha(static_cast(ch)) != 0; } inline bool IsAlNum(char ch) { return isalnum(static_cast(ch)) != 0; } inline bool IsDigit(char ch) { return isdigit(static_cast(ch)) != 0; } inline bool IsLower(char ch) { return islower(static_cast(ch)) != 0; } inline bool IsSpace(char ch) { return isspace(static_cast(ch)) != 0; } inline bool IsUpper(char ch) { return isupper(static_cast(ch)) != 0; } inline bool IsXDigit(char ch) { return isxdigit(static_cast(ch)) != 0; } inline bool IsXDigit(wchar_t ch) { const unsigned char low_byte = static_cast(ch); return ch == low_byte && isxdigit(low_byte) != 0; } inline char ToLower(char ch) { return static_cast(tolower(static_cast(ch))); } inline char ToUpper(char ch) { return static_cast(toupper(static_cast(ch))); } // The testing::internal::posix namespace holds wrappers for common // POSIX functions. These wrappers hide the differences between // Windows/MSVC and POSIX systems. Since some compilers define these // standard functions as macros, the wrapper cannot have the same name // as the wrapped function. namespace posix { // Functions with a different name on Windows. #if GTEST_OS_WINDOWS typedef struct _stat StatStruct; # ifdef __BORLANDC__ inline int IsATTY(int fd) { return isatty(fd); } inline int StrCaseCmp(const char* s1, const char* s2) { return stricmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } # else // !__BORLANDC__ # if GTEST_OS_WINDOWS_MOBILE inline int IsATTY(int /* fd */) { return 0; } # else inline int IsATTY(int fd) { return _isatty(fd); } # endif // GTEST_OS_WINDOWS_MOBILE inline int StrCaseCmp(const char* s1, const char* s2) { return _stricmp(s1, s2); } inline char* StrDup(const char* src) { return _strdup(src); } # endif // __BORLANDC__ # if GTEST_OS_WINDOWS_MOBILE inline int FileNo(FILE* file) { return reinterpret_cast(_fileno(file)); } // Stat(), RmDir(), and IsDir() are not needed on Windows CE at this // time and thus not defined there. # else inline int FileNo(FILE* file) { return _fileno(file); } inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } inline int RmDir(const char* dir) { return _rmdir(dir); } inline bool IsDir(const StatStruct& st) { return (_S_IFDIR & st.st_mode) != 0; } # endif // GTEST_OS_WINDOWS_MOBILE #else typedef struct stat StatStruct; inline int FileNo(FILE* file) { return fileno(file); } inline int IsATTY(int fd) { return isatty(fd); } inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } inline int StrCaseCmp(const char* s1, const char* s2) { return strcasecmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } inline int RmDir(const char* dir) { return rmdir(dir); } inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } #endif // GTEST_OS_WINDOWS // Functions deprecated by MSVC 8.0. #ifdef _MSC_VER // Temporarily disable warning 4996 (deprecated function). # pragma warning(push) # pragma warning(disable:4996) #endif inline const char* StrNCpy(char* dest, const char* src, size_t n) { return strncpy(dest, src, n); } // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and // StrError() aren't needed on Windows CE at this time and thus not // defined there. #if !GTEST_OS_WINDOWS_MOBILE inline int ChDir(const char* dir) { return chdir(dir); } #endif inline FILE* FOpen(const char* path, const char* mode) { return fopen(path, mode); } #if !GTEST_OS_WINDOWS_MOBILE inline FILE *FReopen(const char* path, const char* mode, FILE* stream) { return freopen(path, mode, stream); } inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } #endif inline int FClose(FILE* fp) { return fclose(fp); } #if !GTEST_OS_WINDOWS_MOBILE inline int Read(int fd, void* buf, unsigned int count) { return static_cast(read(fd, buf, count)); } inline int Write(int fd, const void* buf, unsigned int count) { return static_cast(write(fd, buf, count)); } inline int Close(int fd) { return close(fd); } inline const char* StrError(int errnum) { return strerror(errnum); } #endif inline const char* GetEnv(const char* name) { #if GTEST_OS_WINDOWS_MOBILE // We are on Windows CE, which has no environment variables. return NULL; #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) // Environment variables which we programmatically clear will be set to the // empty string rather than unset (NULL). Handle that case. const char* const env = getenv(name); return (env != NULL && env[0] != '\0') ? env : NULL; #else return getenv(name); #endif } #ifdef _MSC_VER # pragma warning(pop) // Restores the warning state. #endif #if GTEST_OS_WINDOWS_MOBILE // Windows CE has no C library. The abort() function is used in // several places in Google Test. This implementation provides a reasonable // imitation of standard behaviour. void Abort(); #else inline void Abort() { abort(); } #endif // GTEST_OS_WINDOWS_MOBILE } // namespace posix // MSVC "deprecates" snprintf and issues warnings wherever it is used. In // order to avoid these warnings, we need to use _snprintf or _snprintf_s on // MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate // function in order to achieve that. We use macro definition here because // snprintf is a variadic function. #if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE // MSVC 2005 and above support variadic macros. # define GTEST_SNPRINTF_(buffer, size, format, ...) \ _snprintf_s(buffer, size, size, format, __VA_ARGS__) #elif defined(_MSC_VER) // Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't // complain about _snprintf. # define GTEST_SNPRINTF_ _snprintf #else # define GTEST_SNPRINTF_ snprintf #endif // The maximum number a BiggestInt can represent. This definition // works no matter BiggestInt is represented in one's complement or // two's complement. // // We cannot rely on numeric_limits in STL, as __int64 and long long // are not part of standard C++ and numeric_limits doesn't need to be // defined for them. const BiggestInt kMaxBiggestInt = ~(static_cast(1) << (8*sizeof(BiggestInt) - 1)); // This template class serves as a compile-time function from size to // type. It maps a size in bytes to a primitive type with that // size. e.g. // // TypeWithSize<4>::UInt // // is typedef-ed to be unsigned int (unsigned integer made up of 4 // bytes). // // Such functionality should belong to STL, but I cannot find it // there. // // Google Test uses this class in the implementation of floating-point // comparison. // // For now it only handles UInt (unsigned int) as that's all Google Test // needs. Other types can be easily added in the future if need // arises. template class TypeWithSize { public: // This prevents the user from using TypeWithSize with incorrect // values of N. typedef void UInt; }; // The specialization for size 4. template <> class TypeWithSize<4> { public: // unsigned int has size 4 in both gcc and MSVC. // // As base/basictypes.h doesn't compile on Windows, we cannot use // uint32, uint64, and etc here. typedef int Int; typedef unsigned int UInt; }; // The specialization for size 8. template <> class TypeWithSize<8> { public: #if GTEST_OS_WINDOWS typedef __int64 Int; typedef unsigned __int64 UInt; #else typedef long long Int; // NOLINT typedef unsigned long long UInt; // NOLINT #endif // GTEST_OS_WINDOWS }; // Integer types of known sizes. typedef TypeWithSize<4>::Int Int32; typedef TypeWithSize<4>::UInt UInt32; typedef TypeWithSize<8>::Int Int64; typedef TypeWithSize<8>::UInt UInt64; typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. // Utilities for command line flags and environment variables. // Macro for referencing flags. #define GTEST_FLAG(name) FLAGS_gtest_##name // Macros for declaring flags. #define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) #define GTEST_DECLARE_int32_(name) \ GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) #define GTEST_DECLARE_string_(name) \ GTEST_API_ extern ::std::string GTEST_FLAG(name) // Macros for defining flags. #define GTEST_DEFINE_bool_(name, default_val, doc) \ GTEST_API_ bool GTEST_FLAG(name) = (default_val) #define GTEST_DEFINE_int32_(name, default_val, doc) \ GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) #define GTEST_DEFINE_string_(name, default_val, doc) \ GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) // Thread annotations #define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks) #define GTEST_LOCK_EXCLUDED_(locks) // Parses 'str' for a 32-bit signed integer. If successful, writes the result // to *value and returns true; otherwise leaves *value unchanged and returns // false. // TODO(chandlerc): Find a better way to refactor flag and environment parsing // out of both gtest-port.cc and gtest.cc to avoid exporting this utility // function. bool ParseInt32(const Message& src_text, const char* str, Int32* value); // Parses a bool/Int32/string from the environment variable // corresponding to the given Google Test flag. bool BoolFromGTestEnv(const char* flag, bool default_val); GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); const char* StringFromGTestEnv(const char* flag, const char* default_val); } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump0000664000175000017500000002231013062445067025761 00000000000000$$ -*- mode: c++; -*- $var n = 50 $$ Maximum length of Values arguments we want to support. $var maxtuple = 10 $$ Maximum number of Combine arguments we want to support. // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vladl@google.com (Vlad Losev) // Type and function utilities for implementing parameterized tests. // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently Google Test supports at most $n arguments in Values, // and at most $maxtuple arguments in Combine. Please contact // googletestframework@googlegroups.com if you need more. // Please note that the number of arguments to Combine is limited // by the maximum arity of the implementation of tr1::tuple which is // currently set at $maxtuple. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include "gtest/internal/gtest-param-util.h" #include "gtest/internal/gtest-port.h" #if GTEST_HAS_PARAM_TEST namespace testing { // Forward declarations of ValuesIn(), which is implemented in // include/gtest/gtest-param-test.h. template internal::ParamGenerator< typename ::testing::internal::IteratorTraits::value_type> ValuesIn(ForwardIterator begin, ForwardIterator end); template internal::ParamGenerator ValuesIn(const T (&array)[N]); template internal::ParamGenerator ValuesIn( const Container& container); namespace internal { // Used in the Values() function to provide polymorphic capabilities. template class ValueArray1 { public: explicit ValueArray1(T1 v1) : v1_(v1) {} template operator ParamGenerator() const { return ValuesIn(&v1_, &v1_ + 1); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray1& other); const T1 v1_; }; $range i 2..n $for i [[ $range j 1..i template <$for j, [[typename T$j]]> class ValueArray$i { public: ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {} template operator ParamGenerator() const { const T array[] = {$for j, [[static_cast(v$(j)_)]]}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray$i& other); $for j [[ const T$j v$(j)_; ]] }; ]] # if GTEST_HAS_COMBINE // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Generates values from the Cartesian product of values produced // by the argument generators. // $range i 2..maxtuple $for i [[ $range j 1..i $range k 2..i template <$for j, [[typename T$j]]> class CartesianProductGenerator$i : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > { public: typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType; CartesianProductGenerator$i($for j, [[const ParamGenerator& g$j]]) : $for j, [[g$(j)_(g$j)]] {} virtual ~CartesianProductGenerator$i() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]); } virtual ParamIteratorInterface* End() const { return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, $for j, [[ const ParamGenerator& g$j, const typename ParamGenerator::iterator& current$(j)]]) : base_(base), $for j, [[ begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j) ]] { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current$(i)_; $for k [[ if (current$(i+2-k)_ == end$(i+2-k)_) { current$(i+2-k)_ = begin$(i+2-k)_; ++current$(i+2-k-1)_; } ]] ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ($for j && [[ current$(j)_ == typed_other->current$(j)_ ]]); } private: Iterator(const Iterator& other) : base_(other.base_), $for j, [[ begin$(j)_(other.begin$(j)_), end$(j)_(other.end$(j)_), current$(j)_(other.current$(j)_) ]] { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType($for j, [[*current$(j)_]]); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return $for j || [[ current$(j)_ == end$(j)_ ]]; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. $for j [[ const typename ParamGenerator::iterator begin$(j)_; const typename ParamGenerator::iterator end$(j)_; typename ParamGenerator::iterator current$(j)_; ]] ParamType current_value_; }; // class CartesianProductGenerator$i::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator$i& other); $for j [[ const ParamGenerator g$(j)_; ]] }; // class CartesianProductGenerator$i ]] // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Helper classes providing Combine() with polymorphic features. They allow // casting CartesianProductGeneratorN to ParamGenerator if T is // convertible to U. // $range i 2..maxtuple $for i [[ $range j 1..i template <$for j, [[class Generator$j]]> class CartesianProductHolder$i { public: CartesianProductHolder$i($for j, [[const Generator$j& g$j]]) : $for j, [[g$(j)_(g$j)]] {} template <$for j, [[typename T$j]]> operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const { return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >( new CartesianProductGenerator$i<$for j, [[T$j]]>( $for j,[[ static_cast >(g$(j)_) ]])); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder$i& other); $for j [[ const Generator$j g$(j)_; ]] }; // class CartesianProductHolder$i ]] # endif // GTEST_HAS_COMBINE } // namespace internal } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-death-test-internal.h0000664000175000017500000003216513062445067024657 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file defines internal utilities needed for implementing // death tests. They are subject to change without notice. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #include "gtest/internal/gtest-internal.h" #include namespace testing { namespace internal { GTEST_DECLARE_string_(internal_run_death_test); // Names of the flags (needed for parsing Google Test flags). const char kDeathTestStyleFlag[] = "death_test_style"; const char kDeathTestUseFork[] = "death_test_use_fork"; const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; #if GTEST_HAS_DEATH_TEST // DeathTest is a class that hides much of the complexity of the // GTEST_DEATH_TEST_ macro. It is abstract; its static Create method // returns a concrete class that depends on the prevailing death test // style, as defined by the --gtest_death_test_style and/or // --gtest_internal_run_death_test flags. // In describing the results of death tests, these terms are used with // the corresponding definitions: // // exit status: The integer exit information in the format specified // by wait(2) // exit code: The integer code passed to exit(3), _exit(2), or // returned from main() class GTEST_API_ DeathTest { public: // Create returns false if there was an error determining the // appropriate action to take for the current death test; for example, // if the gtest_death_test_style flag is set to an invalid value. // The LastMessage method will return a more detailed message in that // case. Otherwise, the DeathTest pointer pointed to by the "test" // argument is set. If the death test should be skipped, the pointer // is set to NULL; otherwise, it is set to the address of a new concrete // DeathTest object that controls the execution of the current test. static bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test); DeathTest(); virtual ~DeathTest() { } // A helper class that aborts a death test when it's deleted. class ReturnSentinel { public: explicit ReturnSentinel(DeathTest* test) : test_(test) { } ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } private: DeathTest* const test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); } GTEST_ATTRIBUTE_UNUSED_; // An enumeration of possible roles that may be taken when a death // test is encountered. EXECUTE means that the death test logic should // be executed immediately. OVERSEE means that the program should prepare // the appropriate environment for a child process to execute the death // test, then wait for it to complete. enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; // An enumeration of the three reasons that a test might be aborted. enum AbortReason { TEST_ENCOUNTERED_RETURN_STATEMENT, TEST_THREW_EXCEPTION, TEST_DID_NOT_DIE }; // Assumes one of the above roles. virtual TestRole AssumeRole() = 0; // Waits for the death test to finish and returns its status. virtual int Wait() = 0; // Returns true if the death test passed; that is, the test process // exited during the test, its exit status matches a user-supplied // predicate, and its stderr output matches a user-supplied regular // expression. // The user-supplied predicate may be a macro expression rather // than a function pointer or functor, or else Wait and Passed could // be combined. virtual bool Passed(bool exit_status_ok) = 0; // Signals that the death test did not die as expected. virtual void Abort(AbortReason reason) = 0; // Returns a human-readable outcome message regarding the outcome of // the last death test. static const char* LastMessage(); static void set_last_death_test_message(const std::string& message); private: // A string containing a description of the outcome of the last death test. static std::string last_death_test_message_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); }; // Factory interface for death tests. May be mocked out for testing. class DeathTestFactory { public: virtual ~DeathTestFactory() { } virtual bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test) = 0; }; // A concrete DeathTestFactory implementation for normal use. class DefaultDeathTestFactory : public DeathTestFactory { public: virtual bool Create(const char* statement, const RE* regex, const char* file, int line, DeathTest** test); }; // Returns true if exit_status describes a process that was terminated // by a signal, or exited normally with a nonzero exit code. GTEST_API_ bool ExitedUnsuccessfully(int exit_status); // Traps C++ exceptions escaping statement and reports them as test // failures. Note that trapping SEH exceptions is not implemented here. # if GTEST_HAS_EXCEPTIONS # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } catch (const ::std::exception& gtest_exception) { \ fprintf(\ stderr, \ "\n%s: Caught std::exception-derived exception escaping the " \ "death test statement. Exception message: %s\n", \ ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ gtest_exception.what()); \ fflush(stderr); \ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ } catch (...) { \ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ } # else # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) # endif // This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, // ASSERT_EXIT*, and EXPECT_EXIT*. # define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ const ::testing::internal::RE& gtest_regex = (regex); \ ::testing::internal::DeathTest* gtest_dt; \ if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ __FILE__, __LINE__, >est_dt)) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ } \ if (gtest_dt != NULL) { \ ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ gtest_dt_ptr(gtest_dt); \ switch (gtest_dt->AssumeRole()) { \ case ::testing::internal::DeathTest::OVERSEE_TEST: \ if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ } \ break; \ case ::testing::internal::DeathTest::EXECUTE_TEST: { \ ::testing::internal::DeathTest::ReturnSentinel \ gtest_sentinel(gtest_dt); \ GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ break; \ } \ default: \ break; \ } \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ fail(::testing::internal::DeathTest::LastMessage()) // The symbol "fail" here expands to something into which a message // can be streamed. // This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in // NDEBUG mode. In this case we need the statements to be executed, the regex is // ignored, and the macro must accept a streamed message even though the message // is never printed. # define GTEST_EXECUTE_STATEMENT_(statement, regex) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } else \ ::testing::Message() // A class representing the parsed contents of the // --gtest_internal_run_death_test flag, as it existed when // RUN_ALL_TESTS was called. class InternalRunDeathTestFlag { public: InternalRunDeathTestFlag(const std::string& a_file, int a_line, int an_index, int a_write_fd) : file_(a_file), line_(a_line), index_(an_index), write_fd_(a_write_fd) {} ~InternalRunDeathTestFlag() { if (write_fd_ >= 0) posix::Close(write_fd_); } const std::string& file() const { return file_; } int line() const { return line_; } int index() const { return index_; } int write_fd() const { return write_fd_; } private: std::string file_; int line_; int index_; int write_fd_; GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); }; // Returns a newly created InternalRunDeathTestFlag object with fields // initialized from the GTEST_FLAG(internal_run_death_test) flag if // the flag is specified; otherwise returns NULL. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); #else // GTEST_HAS_DEATH_TEST // This macro is used for implementing macros such as // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where // death tests are not supported. Those macros must compile on such systems // iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on // systems that support death tests. This allows one to write such a macro // on a system that does not support death tests and be sure that it will // compile on a death-test supporting system. // // Parameters: // statement - A statement that a macro such as EXPECT_DEATH would test // for program termination. This macro has to make sure this // statement is compiled but not executed, to ensure that // EXPECT_DEATH_IF_SUPPORTED compiles with a certain // parameter iff EXPECT_DEATH compiles with it. // regex - A regex that a macro such as EXPECT_DEATH would use to test // the output of statement. This parameter has to be // compiled but not evaluated by this macro, to ensure that // this macro only accepts expressions that a macro such as // EXPECT_DEATH would accept. // terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED // and a return statement for ASSERT_DEATH_IF_SUPPORTED. // This ensures that ASSERT_DEATH_IF_SUPPORTED will not // compile inside functions where ASSERT_DEATH doesn't // compile. // // The branch that has an always false condition is used to ensure that // statement and regex are compiled (and thus syntactically correct) but // never executed. The unreachable code macro protects the terminator // statement from generating an 'unreachable code' warning in case // statement unconditionally returns or throws. The Message constructor at // the end allows the syntax of streaming additional messages into the // macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. # define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ GTEST_LOG_(WARNING) \ << "Death tests are not supported on this platform.\n" \ << "Statement '" #statement "' cannot be verified."; \ } else if (::testing::internal::AlwaysFalse()) { \ ::testing::internal::RE::PartialMatch(".*", (regex)); \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ terminator; \ } else \ ::testing::Message() #endif // GTEST_HAS_DEATH_TEST } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-type-util.h.pump0000664000175000017500000002214513062445067023714 00000000000000$$ -*- mode: c++; -*- $var n = 50 $$ Maximum length of type lists we want to support. // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Type utilities needed for implementing typed and type-parameterized // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently we support at most $n types in a list, and at most $n // type-parameterized tests in one type-parameterized test case. // Please contact googletestframework@googlegroups.com if you need // more. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #include "gtest/internal/gtest-port.h" // #ifdef __GNUC__ is too general here. It is possible to use gcc without using // libstdc++ (which is where cxxabi.h comes from). # if GTEST_HAS_CXXABI_H_ # include # elif defined(__HP_aCC) # include # endif // GTEST_HASH_CXXABI_H_ namespace testing { namespace internal { // GetTypeName() returns a human-readable name of type T. // NB: This function is also used in Google Mock, so don't move it inside of // the typed-test-only section below. template std::string GetTypeName() { # if GTEST_HAS_RTTI const char* const name = typeid(T).name(); # if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) int status = 0; // gcc's implementation of typeid(T).name() mangles the type name, // so we have to demangle it. # if GTEST_HAS_CXXABI_H_ using abi::__cxa_demangle; # endif // GTEST_HAS_CXXABI_H_ char* const readable_name = __cxa_demangle(name, 0, 0, &status); const std::string name_str(status == 0 ? readable_name : name); free(readable_name); return name_str; # else return name; # endif // GTEST_HAS_CXXABI_H_ || __HP_aCC # else return ""; # endif // GTEST_HAS_RTTI } #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // AssertyTypeEq::type is defined iff T1 and T2 are the same // type. This can be used as a compile-time assertion to ensure that // two types are equal. template struct AssertTypeEq; template struct AssertTypeEq { typedef bool type; }; // A unique type used as the default value for the arguments of class // template Types. This allows us to simulate variadic templates // (e.g. Types, Type, and etc), which C++ doesn't // support directly. struct None {}; // The following family of struct and struct templates are used to // represent type lists. In particular, TypesN // represents a type list with N types (T1, T2, ..., and TN) in it. // Except for Types0, every struct in the family has two member types: // Head for the first type in the list, and Tail for the rest of the // list. // The empty type list. struct Types0 {}; // Type lists of length 1, 2, 3, and so on. template struct Types1 { typedef T1 Head; typedef Types0 Tail; }; $range i 2..n $for i [[ $range j 1..i $range k 2..i template <$for j, [[typename T$j]]> struct Types$i { typedef T1 Head; typedef Types$(i-1)<$for k, [[T$k]]> Tail; }; ]] } // namespace internal // We don't want to require the users to write TypesN<...> directly, // as that would require them to count the length. Types<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Types // will appear as Types in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Types, and Google Test will translate // that to TypesN internally to make error messages // readable. The translation is done by the 'type' member of the // Types template. $range i 1..n template <$for i, [[typename T$i = internal::None]]> struct Types { typedef internal::Types$n<$for i, [[T$i]]> type; }; template <> struct Types<$for i, [[internal::None]]> { typedef internal::Types0 type; }; $range i 1..n-1 $for i [[ $range j 1..i $range k i+1..n template <$for j, [[typename T$j]]> struct Types<$for j, [[T$j]]$for k[[, internal::None]]> { typedef internal::Types$i<$for j, [[T$j]]> type; }; ]] namespace internal { # define GTEST_TEMPLATE_ template class // The template "selector" struct TemplateSel is used to // represent Tmpl, which must be a class template with one type // parameter, as a type. TemplateSel::Bind::type is defined // as the type Tmpl. This allows us to actually instantiate the // template "selected" by TemplateSel. // // This trick is necessary for simulating typedef for class templates, // which C++ doesn't support directly. template struct TemplateSel { template struct Bind { typedef Tmpl type; }; }; # define GTEST_BIND_(TmplSel, T) \ TmplSel::template Bind::type // A unique struct template used as the default value for the // arguments of class template Templates. This allows us to simulate // variadic templates (e.g. Templates, Templates, // and etc), which C++ doesn't support directly. template struct NoneT {}; // The following family of struct and struct templates are used to // represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except // for Templates0, every struct in the family has two member types: // Head for the selector of the first template in the list, and Tail // for the rest of the list. // The empty template list. struct Templates0 {}; // Template lists of length 1, 2, 3, and so on. template struct Templates1 { typedef TemplateSel Head; typedef Templates0 Tail; }; $range i 2..n $for i [[ $range j 1..i $range k 2..i template <$for j, [[GTEST_TEMPLATE_ T$j]]> struct Templates$i { typedef TemplateSel Head; typedef Templates$(i-1)<$for k, [[T$k]]> Tail; }; ]] // We don't want to require the users to write TemplatesN<...> directly, // as that would require them to count the length. Templates<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Templates // will appear as Templates in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Templates, and Google Test will translate // that to TemplatesN internally to make error messages // readable. The translation is done by the 'type' member of the // Templates template. $range i 1..n template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]> struct Templates { typedef Templates$n<$for i, [[T$i]]> type; }; template <> struct Templates<$for i, [[NoneT]]> { typedef Templates0 type; }; $range i 1..n-1 $for i [[ $range j 1..i $range k i+1..n template <$for j, [[GTEST_TEMPLATE_ T$j]]> struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> { typedef Templates$i<$for j, [[T$j]]> type; }; ]] // The TypeList template makes it possible to use either a single type // or a Types<...> list in TYPED_TEST_CASE() and // INSTANTIATE_TYPED_TEST_CASE_P(). template struct TypeList { typedef Types1 type; }; $range i 1..n template <$for i, [[typename T$i]]> struct TypeList > { typedef typename Types<$for i, [[T$i]]>::type type; }; #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-tuple.h.pump0000664000175000017500000002201213062445067023102 00000000000000$$ -*- mode: c++; -*- $var n = 10 $$ Maximum number of tuple fields we want to support. $$ This meta comment fixes auto-indentation in Emacs. }} // Copyright 2009 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Implements a subset of TR1 tuple needed by Google Test and Google Mock. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #include // For ::std::pair. // The compiler used in Symbian has a bug that prevents us from declaring the // tuple template as a friend (it complains that tuple is redefined). This // hack bypasses the bug by declaring the members that should otherwise be // private as public. // Sun Studio versions < 12 also have the above bug. #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) # define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: #else # define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ template friend class tuple; \ private: #endif $range i 0..n-1 $range j 0..n $range k 1..n // GTEST_n_TUPLE_(T) is the type of an n-tuple. #define GTEST_0_TUPLE_(T) tuple<> $for k [[ $range m 0..k-1 $range m2 k..n-1 #define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]> ]] // GTEST_n_TYPENAMES_(T) declares a list of n typenames. $for j [[ $range m 0..j-1 #define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]] ]] // In theory, defining stuff in the ::std namespace is undefined // behavior. We can do this as we are playing the role of a standard // library vendor. namespace std { namespace tr1 { template <$for i, [[typename T$i = void]]> class tuple; // Anything in namespace gtest_internal is Google Test's INTERNAL // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. namespace gtest_internal { // ByRef::type is T if T is a reference; otherwise it's const T&. template struct ByRef { typedef const T& type; }; // NOLINT template struct ByRef { typedef T& type; }; // NOLINT // A handy wrapper for ByRef. #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef::type // AddRef::type is T if T is a reference; otherwise it's T&. This // is the same as tr1::add_reference::type. template struct AddRef { typedef T& type; }; // NOLINT template struct AddRef { typedef T& type; }; // NOLINT // A handy wrapper for AddRef. #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef::type // A helper for implementing get(). template class Get; // A helper for implementing tuple_element. kIndexValid is true // iff k < the number of fields in tuple type T. template struct TupleElement; $for i [[ template struct TupleElement { typedef T$i type; }; ]] } // namespace gtest_internal template <> class tuple<> { public: tuple() {} tuple(const tuple& /* t */) {} tuple& operator=(const tuple& /* t */) { return *this; } }; $for k [[ $range m 0..k-1 template class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] { public: template friend class gtest_internal::Get; tuple() : $for m, [[f$(m)_()]] {} explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]] $for m, [[f$(m)_(f$m)]] {} tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} template tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} $if k == 2 [[ template tuple(const ::std::pair& p) : f0_(p.first), f1_(p.second) {} ]] tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) { return CopyFrom(t); } $if k == 2 [[ template tuple& operator=(const ::std::pair& p) { f0_ = p.first; f1_ = p.second; return *this; } ]] GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) { $for m [[ f$(m)_ = t.f$(m)_; ]] return *this; } $for m [[ T$m f$(m)_; ]] }; ]] // 6.1.3.2 Tuple creation functions. // Known limitations: we don't support passing an // std::tr1::reference_wrapper to make_tuple(). And we don't // implement tie(). inline tuple<> make_tuple() { return tuple<>(); } $for k [[ $range m 0..k-1 template inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) { return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]); } ]] // 6.1.3.3 Tuple helper classes. template struct tuple_size; $for j [[ template struct tuple_size { static const int value = $j; }; ]] template struct tuple_element { typedef typename gtest_internal::TupleElement< k < (tuple_size::value), k, Tuple>::type type; }; #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element::type // 6.1.3.4 Element access. namespace gtest_internal { $for i [[ template <> class Get<$i> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) Field(Tuple& t) { return t.f$(i)_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) ConstField(const Tuple& t) { return t.f$(i)_; } }; ]] } // namespace gtest_internal template GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) get(GTEST_$(n)_TUPLE_(T)& t) { return gtest_internal::Get::Field(t); } template GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) get(const GTEST_$(n)_TUPLE_(T)& t) { return gtest_internal::Get::ConstField(t); } // 6.1.3.5 Relational operators // We only implement == and !=, as we don't have a need for the rest yet. namespace gtest_internal { // SameSizeTuplePrefixComparator::Eq(t1, t2) returns true if the // first k fields of t1 equals the first k fields of t2. // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if // k1 != k2. template struct SameSizeTuplePrefixComparator; template <> struct SameSizeTuplePrefixComparator<0, 0> { template static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { return true; } }; template struct SameSizeTuplePrefixComparator { template static bool Eq(const Tuple1& t1, const Tuple2& t2) { return SameSizeTuplePrefixComparator::Eq(t1, t2) && ::std::tr1::get(t1) == ::std::tr1::get(t2); } }; } // namespace gtest_internal template inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t, const GTEST_$(n)_TUPLE_(U)& u) { return gtest_internal::SameSizeTuplePrefixComparator< tuple_size::value, tuple_size::value>::Eq(t, u); } template inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t, const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); } // 6.1.4 Pairs. // Unimplemented. } // namespace tr1 } // namespace std $for j [[ #undef GTEST_$(j)_TUPLE_ ]] $for j [[ #undef GTEST_$(j)_TYPENAMES_ ]] #undef GTEST_DECLARE_TUPLE_AS_FRIEND_ #undef GTEST_BY_REF_ #undef GTEST_ADD_REF_ #undef GTEST_TUPLE_ELEMENT_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-param-util-generated.h0000664000175000017500000056726013062445067025023 00000000000000// This file was GENERATED by command: // pump.py gtest-param-util-generated.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: vladl@google.com (Vlad Losev) // Type and function utilities for implementing parameterized tests. // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently Google Test supports at most 50 arguments in Values, // and at most 10 arguments in Combine. Please contact // googletestframework@googlegroups.com if you need more. // Please note that the number of arguments to Combine is limited // by the maximum arity of the implementation of tr1::tuple which is // currently set at 10. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include "gtest/internal/gtest-param-util.h" #include "gtest/internal/gtest-port.h" #if GTEST_HAS_PARAM_TEST namespace testing { // Forward declarations of ValuesIn(), which is implemented in // include/gtest/gtest-param-test.h. template internal::ParamGenerator< typename ::testing::internal::IteratorTraits::value_type> ValuesIn(ForwardIterator begin, ForwardIterator end); template internal::ParamGenerator ValuesIn(const T (&array)[N]); template internal::ParamGenerator ValuesIn( const Container& container); namespace internal { // Used in the Values() function to provide polymorphic capabilities. template class ValueArray1 { public: explicit ValueArray1(T1 v1) : v1_(v1) {} template operator ParamGenerator() const { return ValuesIn(&v1_, &v1_ + 1); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray1& other); const T1 v1_; }; template class ValueArray2 { public: ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray2& other); const T1 v1_; const T2 v2_; }; template class ValueArray3 { public: ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray3& other); const T1 v1_; const T2 v2_; const T3 v3_; }; template class ValueArray4 { public: ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3), v4_(v4) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray4& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; }; template class ValueArray5 { public: ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray5& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; }; template class ValueArray6 { public: ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray6& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; }; template class ValueArray7 { public: ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray7& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; }; template class ValueArray8 { public: ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray8& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; }; template class ValueArray9 { public: ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray9& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; }; template class ValueArray10 { public: ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray10& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; }; template class ValueArray11 { public: ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray11& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; }; template class ValueArray12 { public: ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray12& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; }; template class ValueArray13 { public: ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray13& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; }; template class ValueArray14 { public: ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray14& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; }; template class ValueArray15 { public: ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray15& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; }; template class ValueArray16 { public: ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray16& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; }; template class ValueArray17 { public: ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray17& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; }; template class ValueArray18 { public: ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray18& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; }; template class ValueArray19 { public: ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray19& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; }; template class ValueArray20 { public: ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray20& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; }; template class ValueArray21 { public: ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray21& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; }; template class ValueArray22 { public: ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray22& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; }; template class ValueArray23 { public: ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray23& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; }; template class ValueArray24 { public: ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray24& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; }; template class ValueArray25 { public: ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray25& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; }; template class ValueArray26 { public: ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray26& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; }; template class ValueArray27 { public: ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray27& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; }; template class ValueArray28 { public: ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray28& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; }; template class ValueArray29 { public: ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray29& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; }; template class ValueArray30 { public: ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray30& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; }; template class ValueArray31 { public: ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray31& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; }; template class ValueArray32 { public: ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray32& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; }; template class ValueArray33 { public: ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray33& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; }; template class ValueArray34 { public: ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray34& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; }; template class ValueArray35 { public: ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray35& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; }; template class ValueArray36 { public: ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray36& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; }; template class ValueArray37 { public: ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray37& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; }; template class ValueArray38 { public: ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray38& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; }; template class ValueArray39 { public: ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray39& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; }; template class ValueArray40 { public: ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray40& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; }; template class ValueArray41 { public: ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray41& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; }; template class ValueArray42 { public: ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray42& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; }; template class ValueArray43 { public: ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray43& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; }; template class ValueArray44 { public: ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray44& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; }; template class ValueArray45 { public: ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray45& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; }; template class ValueArray46 { public: ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray46& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; }; template class ValueArray47 { public: ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_), static_cast(v47_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray47& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; }; template class ValueArray48 { public: ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_), static_cast(v47_), static_cast(v48_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray48& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; }; template class ValueArray49 { public: ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_), static_cast(v47_), static_cast(v48_), static_cast(v49_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray49& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; const T49 v49_; }; template class ValueArray50 { public: ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_), static_cast(v47_), static_cast(v48_), static_cast(v49_), static_cast(v50_)}; return ValuesIn(array); } private: // No implementation - assignment is unsupported. void operator=(const ValueArray50& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; const T49 v49_; const T50 v50_; }; # if GTEST_HAS_COMBINE // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Generates values from the Cartesian product of values produced // by the argument generators. // template class CartesianProductGenerator2 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator2(const ParamGenerator& g1, const ParamGenerator& g2) : g1_(g1), g2_(g2) {} virtual ~CartesianProductGenerator2() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current2_; if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; ParamType current_value_; }; // class CartesianProductGenerator2::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator2& other); const ParamGenerator g1_; const ParamGenerator g2_; }; // class CartesianProductGenerator2 template class CartesianProductGenerator3 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator3(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3) : g1_(g1), g2_(g2), g3_(g3) {} virtual ~CartesianProductGenerator3() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current3_; if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; ParamType current_value_; }; // class CartesianProductGenerator3::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator3& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; }; // class CartesianProductGenerator3 template class CartesianProductGenerator4 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator4(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4) : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} virtual ~CartesianProductGenerator4() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current4_; if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; ParamType current_value_; }; // class CartesianProductGenerator4::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator4& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; }; // class CartesianProductGenerator4 template class CartesianProductGenerator5 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator5(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} virtual ~CartesianProductGenerator5() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current5_; if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; ParamType current_value_; }; // class CartesianProductGenerator5::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator5& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; }; // class CartesianProductGenerator5 template class CartesianProductGenerator6 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator6(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} virtual ~CartesianProductGenerator6() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current6_; if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; ParamType current_value_; }; // class CartesianProductGenerator6::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator6& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; }; // class CartesianProductGenerator6 template class CartesianProductGenerator7 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator7(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} virtual ~CartesianProductGenerator7() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current7_; if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; ParamType current_value_; }; // class CartesianProductGenerator7::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator7& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; }; // class CartesianProductGenerator7 template class CartesianProductGenerator8 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator8(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8) {} virtual ~CartesianProductGenerator8() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current8_; if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; ParamType current_value_; }; // class CartesianProductGenerator8::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator8& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; }; // class CartesianProductGenerator8 template class CartesianProductGenerator9 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator9(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8, const ParamGenerator& g9) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9) {} virtual ~CartesianProductGenerator9() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end(), g9_, g9_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8, const ParamGenerator& g9, const typename ParamGenerator::iterator& current9) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8), begin9_(g9.begin()), end9_(g9.end()), current9_(current9) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current9_; if (current9_ == end9_) { current9_ = begin9_; ++current8_; } if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_ && current9_ == typed_other->current9_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_), begin9_(other.begin9_), end9_(other.end9_), current9_(other.current9_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_, *current9_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_ || current9_ == end9_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; const typename ParamGenerator::iterator begin9_; const typename ParamGenerator::iterator end9_; typename ParamGenerator::iterator current9_; ParamType current_value_; }; // class CartesianProductGenerator9::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator9& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; const ParamGenerator g9_; }; // class CartesianProductGenerator9 template class CartesianProductGenerator10 : public ParamGeneratorInterface< ::std::tr1::tuple > { public: typedef ::std::tr1::tuple ParamType; CartesianProductGenerator10(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8, const ParamGenerator& g9, const ParamGenerator& g10) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9), g10_(g10) {} virtual ~CartesianProductGenerator10() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end(), g9_, g9_.end(), g10_, g10_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8, const ParamGenerator& g9, const typename ParamGenerator::iterator& current9, const ParamGenerator& g10, const typename ParamGenerator::iterator& current10) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8), begin9_(g9.begin()), end9_(g9.end()), current9_(current9), begin10_(g10.begin()), end10_(g10.end()), current10_(current10) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current10_; if (current10_ == end10_) { current10_ = begin10_; ++current9_; } if (current9_ == end9_) { current9_ = begin9_; ++current8_; } if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return ¤t_value_; } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_ && current9_ == typed_other->current9_ && current10_ == typed_other->current10_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_), begin9_(other.begin9_), end9_(other.end9_), current9_(other.current9_), begin10_(other.begin10_), end10_(other.end10_), current10_(other.current10_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_, *current9_, *current10_); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_ || current9_ == end9_ || current10_ == end10_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; const typename ParamGenerator::iterator begin9_; const typename ParamGenerator::iterator end9_; typename ParamGenerator::iterator current9_; const typename ParamGenerator::iterator begin10_; const typename ParamGenerator::iterator end10_; typename ParamGenerator::iterator current10_; ParamType current_value_; }; // class CartesianProductGenerator10::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator10& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; const ParamGenerator g9_; const ParamGenerator g10_; }; // class CartesianProductGenerator10 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Helper classes providing Combine() with polymorphic features. They allow // casting CartesianProductGeneratorN to ParamGenerator if T is // convertible to U. // template class CartesianProductHolder2 { public: CartesianProductHolder2(const Generator1& g1, const Generator2& g2) : g1_(g1), g2_(g2) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator2( static_cast >(g1_), static_cast >(g2_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder2& other); const Generator1 g1_; const Generator2 g2_; }; // class CartesianProductHolder2 template class CartesianProductHolder3 { public: CartesianProductHolder3(const Generator1& g1, const Generator2& g2, const Generator3& g3) : g1_(g1), g2_(g2), g3_(g3) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator3( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder3& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; }; // class CartesianProductHolder3 template class CartesianProductHolder4 { public: CartesianProductHolder4(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4) : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator4( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder4& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; }; // class CartesianProductHolder4 template class CartesianProductHolder5 { public: CartesianProductHolder5(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator5( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder5& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; }; // class CartesianProductHolder5 template class CartesianProductHolder6 { public: CartesianProductHolder6(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator6( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder6& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; }; // class CartesianProductHolder6 template class CartesianProductHolder7 { public: CartesianProductHolder7(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator7( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder7& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; }; // class CartesianProductHolder7 template class CartesianProductHolder8 { public: CartesianProductHolder8(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator8( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder8& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; }; // class CartesianProductHolder8 template class CartesianProductHolder9 { public: CartesianProductHolder9(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator9( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_), static_cast >(g9_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder9& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; const Generator9 g9_; }; // class CartesianProductHolder9 template class CartesianProductHolder10 { public: CartesianProductHolder10(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9, const Generator10& g10) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9), g10_(g10) {} template operator ParamGenerator< ::std::tr1::tuple >() const { return ParamGenerator< ::std::tr1::tuple >( new CartesianProductGenerator10( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_), static_cast >(g9_), static_cast >(g10_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder10& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; const Generator9 g9_; const Generator10 g10_; }; // class CartesianProductHolder10 # endif // GTEST_HAS_COMBINE } // namespace internal } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-internal.h0000664000175000017500000012616113062445067022617 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file declares functions and macros used internally by // Google Test. They are subject to change without notice. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ #include "gtest/internal/gtest-port.h" #if GTEST_OS_LINUX # include # include # include # include #endif // GTEST_OS_LINUX #if GTEST_HAS_EXCEPTIONS # include #endif #include #include #include #include #include #include #include "gtest/gtest-message.h" #include "gtest/internal/gtest-string.h" #include "gtest/internal/gtest-filepath.h" #include "gtest/internal/gtest-type-util.h" // Due to C++ preprocessor weirdness, we need double indirection to // concatenate two tokens when one of them is __LINE__. Writing // // foo ## __LINE__ // // will result in the token foo__LINE__, instead of foo followed by // the current line number. For more details, see // http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar class ProtocolMessage; namespace proto2 { class Message; } namespace testing { // Forward declarations. class AssertionResult; // Result of an assertion. class Message; // Represents a failure message. class Test; // Represents a test. class TestInfo; // Information about a test. class TestPartResult; // Result of a test part. class UnitTest; // A collection of test cases. template ::std::string PrintToString(const T& value); namespace internal { struct TraceInfo; // Information about a trace point. class ScopedTrace; // Implements scoped trace. class TestInfoImpl; // Opaque implementation of TestInfo class UnitTestImpl; // Opaque implementation of UnitTest // How many times InitGoogleTest() has been called. GTEST_API_ extern int g_init_gtest_count; // The text used in failure messages to indicate the start of the // stack trace. GTEST_API_ extern const char kStackTraceMarker[]; // Two overloaded helpers for checking at compile time whether an // expression is a null pointer literal (i.e. NULL or any 0-valued // compile-time integral constant). Their return values have // different sizes, so we can use sizeof() to test which version is // picked by the compiler. These helpers have no implementations, as // we only need their signatures. // // Given IsNullLiteralHelper(x), the compiler will pick the first // version if x can be implicitly converted to Secret*, and pick the // second version otherwise. Since Secret is a secret and incomplete // type, the only expression a user can write that has type Secret* is // a null pointer literal. Therefore, we know that x is a null // pointer literal if and only if the first version is picked by the // compiler. char IsNullLiteralHelper(Secret* p); char (&IsNullLiteralHelper(...))[2]; // NOLINT // A compile-time bool constant that is true if and only if x is a // null pointer literal (i.e. NULL or any 0-valued compile-time // integral constant). #ifdef GTEST_ELLIPSIS_NEEDS_POD_ // We lose support for NULL detection where the compiler doesn't like // passing non-POD classes through ellipsis (...). # define GTEST_IS_NULL_LITERAL_(x) false #else # define GTEST_IS_NULL_LITERAL_(x) \ (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) #endif // GTEST_ELLIPSIS_NEEDS_POD_ // Appends the user-supplied message to the Google-Test-generated message. GTEST_API_ std::string AppendUserMessage( const std::string& gtest_msg, const Message& user_msg); #if GTEST_HAS_EXCEPTIONS // This exception is thrown by (and only by) a failed Google Test // assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions // are enabled). We derive it from std::runtime_error, which is for // errors presumably detectable only at run time. Since // std::runtime_error inherits from std::exception, many testing // frameworks know how to extract and print the message inside it. class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error { public: explicit GoogleTestFailureException(const TestPartResult& failure); }; #endif // GTEST_HAS_EXCEPTIONS // A helper class for creating scoped traces in user programs. class GTEST_API_ ScopedTrace { public: // The c'tor pushes the given source file location and message onto // a trace stack maintained by Google Test. ScopedTrace(const char* file, int line, const Message& message); // The d'tor pops the info pushed by the c'tor. // // Note that the d'tor is not virtual in order to be efficient. // Don't inherit from ScopedTrace! ~ScopedTrace(); private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); } GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its // c'tor and d'tor. Therefore it doesn't // need to be used otherwise. // Constructs and returns the message for an equality assertion // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. // // The first four parameters are the expressions used in the assertion // and their values, as strings. For example, for ASSERT_EQ(foo, bar) // where foo is 5 and bar is 6, we have: // // expected_expression: "foo" // actual_expression: "bar" // expected_value: "5" // actual_value: "6" // // The ignoring_case parameter is true iff the assertion is a // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will // be inserted into the message. GTEST_API_ AssertionResult EqFailure(const char* expected_expression, const char* actual_expression, const std::string& expected_value, const std::string& actual_value, bool ignoring_case); // Constructs a failure message for Boolean assertions such as EXPECT_TRUE. GTEST_API_ std::string GetBoolAssertionFailureMessage( const AssertionResult& assertion_result, const char* expression_text, const char* actual_predicate_value, const char* expected_predicate_value); // This template class represents an IEEE floating-point number // (either single-precision or double-precision, depending on the // template parameters). // // The purpose of this class is to do more sophisticated number // comparison. (Due to round-off error, etc, it's very unlikely that // two floating-points will be equal exactly. Hence a naive // comparison by the == operation often doesn't work.) // // Format of IEEE floating-point: // // The most-significant bit being the leftmost, an IEEE // floating-point looks like // // sign_bit exponent_bits fraction_bits // // Here, sign_bit is a single bit that designates the sign of the // number. // // For float, there are 8 exponent bits and 23 fraction bits. // // For double, there are 11 exponent bits and 52 fraction bits. // // More details can be found at // http://en.wikipedia.org/wiki/IEEE_floating-point_standard. // // Template parameter: // // RawType: the raw floating-point type (either float or double) template class FloatingPoint { public: // Defines the unsigned integer type that has the same size as the // floating point number. typedef typename TypeWithSize::UInt Bits; // Constants. // # of bits in a number. static const size_t kBitCount = 8*sizeof(RawType); // # of fraction bits in a number. static const size_t kFractionBitCount = std::numeric_limits::digits - 1; // # of exponent bits in a number. static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; // The mask for the sign bit. static const Bits kSignBitMask = static_cast(1) << (kBitCount - 1); // The mask for the fraction bits. static const Bits kFractionBitMask = ~static_cast(0) >> (kExponentBitCount + 1); // The mask for the exponent bits. static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); // How many ULP's (Units in the Last Place) we want to tolerate when // comparing two numbers. The larger the value, the more error we // allow. A 0 value means that two numbers must be exactly the same // to be considered equal. // // The maximum error of a single floating-point operation is 0.5 // units in the last place. On Intel CPU's, all floating-point // calculations are done with 80-bit precision, while double has 64 // bits. Therefore, 4 should be enough for ordinary use. // // See the following article for more details on ULP: // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ static const size_t kMaxUlps = 4; // Constructs a FloatingPoint from a raw floating-point number. // // On an Intel CPU, passing a non-normalized NAN (Not a Number) // around may change its bits, although the new value is guaranteed // to be also a NAN. Therefore, don't expect this constructor to // preserve the bits in x when x is a NAN. explicit FloatingPoint(const RawType& x) { u_.value_ = x; } // Static methods // Reinterprets a bit pattern as a floating-point number. // // This function is needed to test the AlmostEquals() method. static RawType ReinterpretBits(const Bits bits) { FloatingPoint fp(0); fp.u_.bits_ = bits; return fp.u_.value_; } // Returns the floating-point number that represent positive infinity. static RawType Infinity() { return ReinterpretBits(kExponentBitMask); } // Returns the maximum representable finite floating-point number. static RawType Max(); // Non-static methods // Returns the bits that represents this number. const Bits &bits() const { return u_.bits_; } // Returns the exponent bits of this number. Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } // Returns the fraction bits of this number. Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } // Returns the sign bit of this number. Bits sign_bit() const { return kSignBitMask & u_.bits_; } // Returns true iff this is NAN (not a number). bool is_nan() const { // It's a NAN if the exponent bits are all ones and the fraction // bits are not entirely zeros. return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); } // Returns true iff this number is at most kMaxUlps ULP's away from // rhs. In particular, this function: // // - returns false if either number is (or both are) NAN. // - treats really large numbers as almost equal to infinity. // - thinks +0.0 and -0.0 are 0 DLP's apart. bool AlmostEquals(const FloatingPoint& rhs) const { // The IEEE standard says that any comparison operation involving // a NAN must return false. if (is_nan() || rhs.is_nan()) return false; return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) <= kMaxUlps; } private: // The data type used to store the actual floating-point number. union FloatingPointUnion { RawType value_; // The raw floating-point number. Bits bits_; // The bits that represent the number. }; // Converts an integer from the sign-and-magnitude representation to // the biased representation. More precisely, let N be 2 to the // power of (kBitCount - 1), an integer x is represented by the // unsigned number x + N. // // For instance, // // -N + 1 (the most negative number representable using // sign-and-magnitude) is represented by 1; // 0 is represented by N; and // N - 1 (the biggest number representable using // sign-and-magnitude) is represented by 2N - 1. // // Read http://en.wikipedia.org/wiki/Signed_number_representations // for more details on signed number representations. static Bits SignAndMagnitudeToBiased(const Bits &sam) { if (kSignBitMask & sam) { // sam represents a negative number. return ~sam + 1; } else { // sam represents a positive number. return kSignBitMask | sam; } } // Given two numbers in the sign-and-magnitude representation, // returns the distance between them as an unsigned number. static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, const Bits &sam2) { const Bits biased1 = SignAndMagnitudeToBiased(sam1); const Bits biased2 = SignAndMagnitudeToBiased(sam2); return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); } FloatingPointUnion u_; }; // We cannot use std::numeric_limits::max() as it clashes with the max() // macro defined by . template <> inline float FloatingPoint::Max() { return FLT_MAX; } template <> inline double FloatingPoint::Max() { return DBL_MAX; } // Typedefs the instances of the FloatingPoint template class that we // care to use. typedef FloatingPoint Float; typedef FloatingPoint Double; // In order to catch the mistake of putting tests that use different // test fixture classes in the same test case, we need to assign // unique IDs to fixture classes and compare them. The TypeId type is // used to hold such IDs. The user should treat TypeId as an opaque // type: the only operation allowed on TypeId values is to compare // them for equality using the == operator. typedef const void* TypeId; template class TypeIdHelper { public: // dummy_ must not have a const type. Otherwise an overly eager // compiler (e.g. MSVC 7.1 & 8.0) may try to merge // TypeIdHelper::dummy_ for different Ts as an "optimization". static bool dummy_; }; template bool TypeIdHelper::dummy_ = false; // GetTypeId() returns the ID of type T. Different values will be // returned for different types. Calling the function twice with the // same type argument is guaranteed to return the same ID. template TypeId GetTypeId() { // The compiler is required to allocate a different // TypeIdHelper::dummy_ variable for each T used to instantiate // the template. Therefore, the address of dummy_ is guaranteed to // be unique. return &(TypeIdHelper::dummy_); } // Returns the type ID of ::testing::Test. Always call this instead // of GetTypeId< ::testing::Test>() to get the type ID of // ::testing::Test, as the latter may give the wrong result due to a // suspected linker bug when compiling Google Test as a Mac OS X // framework. GTEST_API_ TypeId GetTestTypeId(); // Defines the abstract factory interface that creates instances // of a Test object. class TestFactoryBase { public: virtual ~TestFactoryBase() {} // Creates a test instance to run. The instance is both created and destroyed // within TestInfoImpl::Run() virtual Test* CreateTest() = 0; protected: TestFactoryBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); }; // This class provides implementation of TeastFactoryBase interface. // It is used in TEST and TEST_F macros. template class TestFactoryImpl : public TestFactoryBase { public: virtual Test* CreateTest() { return new TestClass; } }; #if GTEST_OS_WINDOWS // Predicate-formatters for implementing the HRESULT checking macros // {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} // We pass a long instead of HRESULT to avoid causing an // include dependency for the HRESULT type. GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, long hr); // NOLINT GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, long hr); // NOLINT #endif // GTEST_OS_WINDOWS // Types of SetUpTestCase() and TearDownTestCase() functions. typedef void (*SetUpTestCaseFunc)(); typedef void (*TearDownTestCaseFunc)(); // Creates a new TestInfo object and registers it with Google Test; // returns the created object. // // Arguments: // // test_case_name: name of the test case // name: name of the test // type_param the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // value_param text representation of the test's value parameter, // or NULL if this is not a type-parameterized test. // fixture_class_id: ID of the test fixture class // set_up_tc: pointer to the function that sets up the test case // tear_down_tc: pointer to the function that tears down the test case // factory: pointer to the factory that creates a test object. // The newly created TestInfo instance will assume // ownership of the factory object. GTEST_API_ TestInfo* MakeAndRegisterTestInfo( const char* test_case_name, const char* name, const char* type_param, const char* value_param, TypeId fixture_class_id, SetUpTestCaseFunc set_up_tc, TearDownTestCaseFunc tear_down_tc, TestFactoryBase* factory); // If *pstr starts with the given prefix, modifies *pstr to be right // past the prefix and returns true; otherwise leaves *pstr unchanged // and returns false. None of pstr, *pstr, and prefix can be NULL. GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // State of the definition of a type-parameterized test case. class GTEST_API_ TypedTestCasePState { public: TypedTestCasePState() : registered_(false) {} // Adds the given test name to defined_test_names_ and return true // if the test case hasn't been registered; otherwise aborts the // program. bool AddTestName(const char* file, int line, const char* case_name, const char* test_name) { if (registered_) { fprintf(stderr, "%s Test %s must be defined before " "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n", FormatFileLocation(file, line).c_str(), test_name, case_name); fflush(stderr); posix::Abort(); } defined_test_names_.insert(test_name); return true; } // Verifies that registered_tests match the test names in // defined_test_names_; returns registered_tests if successful, or // aborts the program otherwise. const char* VerifyRegisteredTestNames( const char* file, int line, const char* registered_tests); private: bool registered_; ::std::set defined_test_names_; }; // Skips to the first non-space char after the first comma in 'str'; // returns NULL if no comma is found in 'str'. inline const char* SkipComma(const char* str) { const char* comma = strchr(str, ','); if (comma == NULL) { return NULL; } while (IsSpace(*(++comma))) {} return comma; } // Returns the prefix of 'str' before the first comma in it; returns // the entire string if it contains no comma. inline std::string GetPrefixUntilComma(const char* str) { const char* comma = strchr(str, ','); return comma == NULL ? str : std::string(str, comma); } // TypeParameterizedTest::Register() // registers a list of type-parameterized tests with Google Test. The // return value is insignificant - we just need to return something // such that we can call this function in a namespace scope. // // Implementation note: The GTEST_TEMPLATE_ macro declares a template // template parameter. It's defined in gtest-type-util.h. template class TypeParameterizedTest { public: // 'index' is the index of the test in the type list 'Types' // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase, // Types). Valid values for 'index' are [0, N - 1] where N is the // length of Types. static bool Register(const char* prefix, const char* case_name, const char* test_names, int index) { typedef typename Types::Head Type; typedef Fixture FixtureClass; typedef typename GTEST_BIND_(TestSel, Type) TestClass; // First, registers the first type-parameterized test in the type // list. MakeAndRegisterTestInfo( (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/" + StreamableToString(index)).c_str(), GetPrefixUntilComma(test_names).c_str(), GetTypeName().c_str(), NULL, // No value parameter. GetTypeId(), TestClass::SetUpTestCase, TestClass::TearDownTestCase, new TestFactoryImpl); // Next, recurses (at compile time) with the tail of the type list. return TypeParameterizedTest ::Register(prefix, case_name, test_names, index + 1); } }; // The base case for the compile time recursion. template class TypeParameterizedTest { public: static bool Register(const char* /*prefix*/, const char* /*case_name*/, const char* /*test_names*/, int /*index*/) { return true; } }; // TypeParameterizedTestCase::Register() // registers *all combinations* of 'Tests' and 'Types' with Google // Test. The return value is insignificant - we just need to return // something such that we can call this function in a namespace scope. template class TypeParameterizedTestCase { public: static bool Register(const char* prefix, const char* case_name, const char* test_names) { typedef typename Tests::Head Head; // First, register the first test in 'Test' for each type in 'Types'. TypeParameterizedTest::Register( prefix, case_name, test_names, 0); // Next, recurses (at compile time) with the tail of the test list. return TypeParameterizedTestCase ::Register(prefix, case_name, SkipComma(test_names)); } }; // The base case for the compile time recursion. template class TypeParameterizedTestCase { public: static bool Register(const char* /*prefix*/, const char* /*case_name*/, const char* /*test_names*/) { return true; } }; #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. GTEST_API_ std::string GetCurrentOsStackTraceExceptTop( UnitTest* unit_test, int skip_count); // Helpers for suppressing warnings on unreachable code or constant // condition. // Always returns true. GTEST_API_ bool AlwaysTrue(); // Always returns false. inline bool AlwaysFalse() { return !AlwaysTrue(); } // Helper for suppressing false warning from Clang on a const char* // variable declared in a conditional expression always being NULL in // the else branch. struct GTEST_API_ ConstCharPtr { ConstCharPtr(const char* str) : value(str) {} operator bool() const { return true; } const char* value; }; // A simple Linear Congruential Generator for generating random // numbers with a uniform distribution. Unlike rand() and srand(), it // doesn't use global state (and therefore can't interfere with user // code). Unlike rand_r(), it's portable. An LCG isn't very random, // but it's good enough for our purposes. class GTEST_API_ Random { public: static const UInt32 kMaxRange = 1u << 31; explicit Random(UInt32 seed) : state_(seed) {} void Reseed(UInt32 seed) { state_ = seed; } // Generates a random number from [0, range). Crashes if 'range' is // 0 or greater than kMaxRange. UInt32 Generate(UInt32 range); private: UInt32 state_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); }; // Defining a variable of type CompileAssertTypesEqual will cause a // compiler error iff T1 and T2 are different types. template struct CompileAssertTypesEqual; template struct CompileAssertTypesEqual { }; // Removes the reference from a type if it is a reference type, // otherwise leaves it unchanged. This is the same as // tr1::remove_reference, which is not widely available yet. template struct RemoveReference { typedef T type; }; // NOLINT template struct RemoveReference { typedef T type; }; // NOLINT // A handy wrapper around RemoveReference that works when the argument // T depends on template parameters. #define GTEST_REMOVE_REFERENCE_(T) \ typename ::testing::internal::RemoveReference::type // Removes const from a type if it is a const type, otherwise leaves // it unchanged. This is the same as tr1::remove_const, which is not // widely available yet. template struct RemoveConst { typedef T type; }; // NOLINT template struct RemoveConst { typedef T type; }; // NOLINT // MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above // definition to fail to remove the const in 'const int[3]' and 'const // char[3][4]'. The following specialization works around the bug. template struct RemoveConst { typedef typename RemoveConst::type type[N]; }; #if defined(_MSC_VER) && _MSC_VER < 1400 // This is the only specialization that allows VC++ 7.1 to remove const in // 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC // and thus needs to be conditionally compiled. template struct RemoveConst { typedef typename RemoveConst::type type[N]; }; #endif // A handy wrapper around RemoveConst that works when the argument // T depends on template parameters. #define GTEST_REMOVE_CONST_(T) \ typename ::testing::internal::RemoveConst::type // Turns const U&, U&, const U, and U all into U. #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) // Adds reference to a type if it is not a reference type, // otherwise leaves it unchanged. This is the same as // tr1::add_reference, which is not widely available yet. template struct AddReference { typedef T& type; }; // NOLINT template struct AddReference { typedef T& type; }; // NOLINT // A handy wrapper around AddReference that works when the argument T // depends on template parameters. #define GTEST_ADD_REFERENCE_(T) \ typename ::testing::internal::AddReference::type // Adds a reference to const on top of T as necessary. For example, // it transforms // // char ==> const char& // const char ==> const char& // char& ==> const char& // const char& ==> const char& // // The argument T must depend on some template parameters. #define GTEST_REFERENCE_TO_CONST_(T) \ GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T)) // ImplicitlyConvertible::value is a compile-time bool // constant that's true iff type From can be implicitly converted to // type To. template class ImplicitlyConvertible { private: // We need the following helper functions only for their types. // They have no implementations. // MakeFrom() is an expression whose type is From. We cannot simply // use From(), as the type From may not have a public default // constructor. static From MakeFrom(); // These two functions are overloaded. Given an expression // Helper(x), the compiler will pick the first version if x can be // implicitly converted to type To; otherwise it will pick the // second version. // // The first version returns a value of size 1, and the second // version returns a value of size 2. Therefore, by checking the // size of Helper(x), which can be done at compile time, we can tell // which version of Helper() is used, and hence whether x can be // implicitly converted to type To. static char Helper(To); static char (&Helper(...))[2]; // NOLINT // We have to put the 'public' section after the 'private' section, // or MSVC refuses to compile the code. public: // MSVC warns about implicitly converting from double to int for // possible loss of data, so we need to temporarily disable the // warning. #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4244) // Temporarily disables warning 4244. static const bool value = sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; # pragma warning(pop) // Restores the warning state. #elif defined(__BORLANDC__) // C++Builder cannot use member overload resolution during template // instantiation. The simplest workaround is to use its C++0x type traits // functions (C++Builder 2009 and above only). static const bool value = __is_convertible(From, To); #else static const bool value = sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; #endif // _MSV_VER }; template const bool ImplicitlyConvertible::value; // IsAProtocolMessage::value is a compile-time bool constant that's // true iff T is type ProtocolMessage, proto2::Message, or a subclass // of those. template struct IsAProtocolMessage : public bool_constant< ImplicitlyConvertible::value || ImplicitlyConvertible::value> { }; // When the compiler sees expression IsContainerTest(0), if C is an // STL-style container class, the first overload of IsContainerTest // will be viable (since both C::iterator* and C::const_iterator* are // valid types and NULL can be implicitly converted to them). It will // be picked over the second overload as 'int' is a perfect match for // the type of argument 0. If C::iterator or C::const_iterator is not // a valid type, the first overload is not viable, and the second // overload will be picked. Therefore, we can determine whether C is // a container class by checking the type of IsContainerTest(0). // The value of the expression is insignificant. // // Note that we look for both C::iterator and C::const_iterator. The // reason is that C++ injects the name of a class as a member of the // class itself (e.g. you can refer to class iterator as either // 'iterator' or 'iterator::iterator'). If we look for C::iterator // only, for example, we would mistakenly think that a class named // iterator is an STL container. // // Also note that the simpler approach of overloading // IsContainerTest(typename C::const_iterator*) and // IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++. typedef int IsContainer; template IsContainer IsContainerTest(int /* dummy */, typename C::iterator* /* it */ = NULL, typename C::const_iterator* /* const_it */ = NULL) { return 0; } typedef char IsNotContainer; template IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; } // EnableIf::type is void when 'Cond' is true, and // undefined when 'Cond' is false. To use SFINAE to make a function // overload only apply when a particular expression is true, add // "typename EnableIf::type* = 0" as the last parameter. template struct EnableIf; template<> struct EnableIf { typedef void type; }; // NOLINT // Utilities for native arrays. // ArrayEq() compares two k-dimensional native arrays using the // elements' operator==, where k can be any integer >= 0. When k is // 0, ArrayEq() degenerates into comparing a single pair of values. template bool ArrayEq(const T* lhs, size_t size, const U* rhs); // This generic version is used when k is 0. template inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } // This overload is used when k >= 1. template inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { return internal::ArrayEq(lhs, N, rhs); } // This helper reduces code bloat. If we instead put its logic inside // the previous ArrayEq() function, arrays with different sizes would // lead to different copies of the template code. template bool ArrayEq(const T* lhs, size_t size, const U* rhs) { for (size_t i = 0; i != size; i++) { if (!internal::ArrayEq(lhs[i], rhs[i])) return false; } return true; } // Finds the first element in the iterator range [begin, end) that // equals elem. Element may be a native array type itself. template Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { for (Iter it = begin; it != end; ++it) { if (internal::ArrayEq(*it, elem)) return it; } return end; } // CopyArray() copies a k-dimensional native array using the elements' // operator=, where k can be any integer >= 0. When k is 0, // CopyArray() degenerates into copying a single value. template void CopyArray(const T* from, size_t size, U* to); // This generic version is used when k is 0. template inline void CopyArray(const T& from, U* to) { *to = from; } // This overload is used when k >= 1. template inline void CopyArray(const T(&from)[N], U(*to)[N]) { internal::CopyArray(from, N, *to); } // This helper reduces code bloat. If we instead put its logic inside // the previous CopyArray() function, arrays with different sizes // would lead to different copies of the template code. template void CopyArray(const T* from, size_t size, U* to) { for (size_t i = 0; i != size; i++) { internal::CopyArray(from[i], to + i); } } // The relation between an NativeArray object (see below) and the // native array it represents. enum RelationToSource { kReference, // The NativeArray references the native array. kCopy // The NativeArray makes a copy of the native array and // owns the copy. }; // Adapts a native array to a read-only STL-style container. Instead // of the complete STL container concept, this adaptor only implements // members useful for Google Mock's container matchers. New members // should be added as needed. To simplify the implementation, we only // support Element being a raw type (i.e. having no top-level const or // reference modifier). It's the client's responsibility to satisfy // this requirement. Element can be an array type itself (hence // multi-dimensional arrays are supported). template class NativeArray { public: // STL-style container typedefs. typedef Element value_type; typedef Element* iterator; typedef const Element* const_iterator; // Constructs from a native array. NativeArray(const Element* array, size_t count, RelationToSource relation) { Init(array, count, relation); } // Copy constructor. NativeArray(const NativeArray& rhs) { Init(rhs.array_, rhs.size_, rhs.relation_to_source_); } ~NativeArray() { // Ensures that the user doesn't instantiate NativeArray with a // const or reference type. static_cast(StaticAssertTypeEqHelper()); if (relation_to_source_ == kCopy) delete[] array_; } // STL-style container methods. size_t size() const { return size_; } const_iterator begin() const { return array_; } const_iterator end() const { return array_ + size_; } bool operator==(const NativeArray& rhs) const { return size() == rhs.size() && ArrayEq(begin(), size(), rhs.begin()); } private: // Initializes this object; makes a copy of the input array if // 'relation' is kCopy. void Init(const Element* array, size_t a_size, RelationToSource relation) { if (relation == kReference) { array_ = array; } else { Element* const copy = new Element[a_size]; CopyArray(array, a_size, copy); array_ = copy; } size_ = a_size; relation_to_source_ = relation; } const Element* array_; size_t size_; RelationToSource relation_to_source_; GTEST_DISALLOW_ASSIGN_(NativeArray); }; } // namespace internal } // namespace testing #define GTEST_MESSAGE_AT_(file, line, message, result_type) \ ::testing::internal::AssertHelper(result_type, file, line, message) \ = ::testing::Message() #define GTEST_MESSAGE_(message, result_type) \ GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) #define GTEST_FATAL_FAILURE_(message) \ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) #define GTEST_NONFATAL_FAILURE_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) #define GTEST_SUCCESS_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) // Suppresses MSVC warnings 4072 (unreachable code) for the code following // statement if it returns or throws (or doesn't return or throw in some // situations). #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ if (::testing::internal::AlwaysTrue()) { statement; } #define GTEST_TEST_THROW_(statement, expected_exception, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::ConstCharPtr gtest_msg = "") { \ bool gtest_caught_expected = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (expected_exception const&) { \ gtest_caught_expected = true; \ } \ catch (...) { \ gtest_msg.value = \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws a different type."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ if (!gtest_caught_expected) { \ gtest_msg.value = \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws nothing."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ fail(gtest_msg.value) #define GTEST_TEST_NO_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (...) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ fail("Expected: " #statement " doesn't throw an exception.\n" \ " Actual: it throws.") #define GTEST_TEST_ANY_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ bool gtest_caught_any = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (...) { \ gtest_caught_any = true; \ } \ if (!gtest_caught_any) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ fail("Expected: " #statement " throws an exception.\n" \ " Actual: it doesn't.") // Implements Boolean test assertions such as EXPECT_TRUE. expression can be // either a boolean expression or an AssertionResult. text is a textual // represenation of expression as it was passed into the EXPECT_TRUE. #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar_ = \ ::testing::AssertionResult(expression)) \ ; \ else \ fail(::testing::internal::GetBoolAssertionFailureMessage(\ gtest_ar_, text, #actual, #expected).c_str()) #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ fail("Expected: " #statement " doesn't generate new fatal " \ "failures in the current thread.\n" \ " Actual: it does.") // Expands to the name of the class that implements the given test. #define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ test_case_name##_##test_name##_Test // Helper macro for defining tests. #define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ public:\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ private:\ virtual void TestBody();\ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ };\ \ ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\ ::test_info_ =\ ::testing::internal::MakeAndRegisterTestInfo(\ #test_case_name, #test_name, NULL, NULL, \ (parent_id), \ parent_class::SetUpTestCase, \ parent_class::TearDownTestCase, \ new ::testing::internal::TestFactoryImpl<\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-tuple.h0000664000175000017500000006707713062445067022146 00000000000000// This file was GENERATED by command: // pump.py gtest-tuple.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2009 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Implements a subset of TR1 tuple needed by Google Test and Google Mock. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #include // For ::std::pair. // The compiler used in Symbian has a bug that prevents us from declaring the // tuple template as a friend (it complains that tuple is redefined). This // hack bypasses the bug by declaring the members that should otherwise be // private as public. // Sun Studio versions < 12 also have the above bug. #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) # define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: #else # define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ template friend class tuple; \ private: #endif // GTEST_n_TUPLE_(T) is the type of an n-tuple. #define GTEST_0_TUPLE_(T) tuple<> #define GTEST_1_TUPLE_(T) tuple #define GTEST_2_TUPLE_(T) tuple #define GTEST_3_TUPLE_(T) tuple #define GTEST_4_TUPLE_(T) tuple #define GTEST_5_TUPLE_(T) tuple #define GTEST_6_TUPLE_(T) tuple #define GTEST_7_TUPLE_(T) tuple #define GTEST_8_TUPLE_(T) tuple #define GTEST_9_TUPLE_(T) tuple #define GTEST_10_TUPLE_(T) tuple // GTEST_n_TYPENAMES_(T) declares a list of n typenames. #define GTEST_0_TYPENAMES_(T) #define GTEST_1_TYPENAMES_(T) typename T##0 #define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1 #define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2 #define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3 #define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4 #define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5 #define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6 #define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, typename T##7 #define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, \ typename T##7, typename T##8 #define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, \ typename T##7, typename T##8, typename T##9 // In theory, defining stuff in the ::std namespace is undefined // behavior. We can do this as we are playing the role of a standard // library vendor. namespace std { namespace tr1 { template class tuple; // Anything in namespace gtest_internal is Google Test's INTERNAL // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. namespace gtest_internal { // ByRef::type is T if T is a reference; otherwise it's const T&. template struct ByRef { typedef const T& type; }; // NOLINT template struct ByRef { typedef T& type; }; // NOLINT // A handy wrapper for ByRef. #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef::type // AddRef::type is T if T is a reference; otherwise it's T&. This // is the same as tr1::add_reference::type. template struct AddRef { typedef T& type; }; // NOLINT template struct AddRef { typedef T& type; }; // NOLINT // A handy wrapper for AddRef. #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef::type // A helper for implementing get(). template class Get; // A helper for implementing tuple_element. kIndexValid is true // iff k < the number of fields in tuple type T. template struct TupleElement; template struct TupleElement { typedef T0 type; }; template struct TupleElement { typedef T1 type; }; template struct TupleElement { typedef T2 type; }; template struct TupleElement { typedef T3 type; }; template struct TupleElement { typedef T4 type; }; template struct TupleElement { typedef T5 type; }; template struct TupleElement { typedef T6 type; }; template struct TupleElement { typedef T7 type; }; template struct TupleElement { typedef T8 type; }; template struct TupleElement { typedef T9 type; }; } // namespace gtest_internal template <> class tuple<> { public: tuple() {} tuple(const tuple& /* t */) {} tuple& operator=(const tuple& /* t */) { return *this; } }; template class GTEST_1_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_() {} explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {} tuple(const tuple& t) : f0_(t.f0_) {} template tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_1_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) { f0_ = t.f0_; return *this; } T0 f0_; }; template class GTEST_2_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0), f1_(f1) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {} template tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {} template tuple(const ::std::pair& p) : f0_(p.first), f1_(p.second) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_2_TUPLE_(U)& t) { return CopyFrom(t); } template tuple& operator=(const ::std::pair& p) { f0_ = p.first; f1_ = p.second; return *this; } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; return *this; } T0 f0_; T1 f1_; }; template class GTEST_3_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} template tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_3_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; return *this; } T0 f0_; T1 f1_; T2 f2_; }; template class GTEST_4_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2), f3_(f3) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} template tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_4_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; }; template class GTEST_5_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_) {} template tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_5_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; }; template class GTEST_6_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} template tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_6_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; }; template class GTEST_7_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} template tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_7_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; }; template class GTEST_8_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} template tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_8_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; }; template class GTEST_9_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} template tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_9_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; f8_ = t.f8_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; T8 f8_; }; template class tuple { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(), f9_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} template tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_10_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; f8_ = t.f8_; f9_ = t.f9_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; T8 f8_; T9 f9_; }; // 6.1.3.2 Tuple creation functions. // Known limitations: we don't support passing an // std::tr1::reference_wrapper to make_tuple(). And we don't // implement tie(). inline tuple<> make_tuple() { return tuple<>(); } template inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) { return GTEST_1_TUPLE_(T)(f0); } template inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) { return GTEST_2_TUPLE_(T)(f0, f1); } template inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) { return GTEST_3_TUPLE_(T)(f0, f1, f2); } template inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3) { return GTEST_4_TUPLE_(T)(f0, f1, f2, f3); } template inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4) { return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4); } template inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5) { return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5); } template inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6) { return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6); } template inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) { return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7); } template inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, const T8& f8) { return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8); } template inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, const T8& f8, const T9& f9) { return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9); } // 6.1.3.3 Tuple helper classes. template struct tuple_size; template struct tuple_size { static const int value = 0; }; template struct tuple_size { static const int value = 1; }; template struct tuple_size { static const int value = 2; }; template struct tuple_size { static const int value = 3; }; template struct tuple_size { static const int value = 4; }; template struct tuple_size { static const int value = 5; }; template struct tuple_size { static const int value = 6; }; template struct tuple_size { static const int value = 7; }; template struct tuple_size { static const int value = 8; }; template struct tuple_size { static const int value = 9; }; template struct tuple_size { static const int value = 10; }; template struct tuple_element { typedef typename gtest_internal::TupleElement< k < (tuple_size::value), k, Tuple>::type type; }; #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element::type // 6.1.3.4 Element access. namespace gtest_internal { template <> class Get<0> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) Field(Tuple& t) { return t.f0_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) ConstField(const Tuple& t) { return t.f0_; } }; template <> class Get<1> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) Field(Tuple& t) { return t.f1_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) ConstField(const Tuple& t) { return t.f1_; } }; template <> class Get<2> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) Field(Tuple& t) { return t.f2_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) ConstField(const Tuple& t) { return t.f2_; } }; template <> class Get<3> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) Field(Tuple& t) { return t.f3_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) ConstField(const Tuple& t) { return t.f3_; } }; template <> class Get<4> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) Field(Tuple& t) { return t.f4_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) ConstField(const Tuple& t) { return t.f4_; } }; template <> class Get<5> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) Field(Tuple& t) { return t.f5_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) ConstField(const Tuple& t) { return t.f5_; } }; template <> class Get<6> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) Field(Tuple& t) { return t.f6_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) ConstField(const Tuple& t) { return t.f6_; } }; template <> class Get<7> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) Field(Tuple& t) { return t.f7_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) ConstField(const Tuple& t) { return t.f7_; } }; template <> class Get<8> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) Field(Tuple& t) { return t.f8_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) ConstField(const Tuple& t) { return t.f8_; } }; template <> class Get<9> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) Field(Tuple& t) { return t.f9_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) ConstField(const Tuple& t) { return t.f9_; } }; } // namespace gtest_internal template GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) get(GTEST_10_TUPLE_(T)& t) { return gtest_internal::Get::Field(t); } template GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) get(const GTEST_10_TUPLE_(T)& t) { return gtest_internal::Get::ConstField(t); } // 6.1.3.5 Relational operators // We only implement == and !=, as we don't have a need for the rest yet. namespace gtest_internal { // SameSizeTuplePrefixComparator::Eq(t1, t2) returns true if the // first k fields of t1 equals the first k fields of t2. // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if // k1 != k2. template struct SameSizeTuplePrefixComparator; template <> struct SameSizeTuplePrefixComparator<0, 0> { template static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { return true; } }; template struct SameSizeTuplePrefixComparator { template static bool Eq(const Tuple1& t1, const Tuple2& t2) { return SameSizeTuplePrefixComparator::Eq(t1, t2) && ::std::tr1::get(t1) == ::std::tr1::get(t2); } }; } // namespace gtest_internal template inline bool operator==(const GTEST_10_TUPLE_(T)& t, const GTEST_10_TUPLE_(U)& u) { return gtest_internal::SameSizeTuplePrefixComparator< tuple_size::value, tuple_size::value>::Eq(t, u); } template inline bool operator!=(const GTEST_10_TUPLE_(T)& t, const GTEST_10_TUPLE_(U)& u) { return !(t == u); } // 6.1.4 Pairs. // Unimplemented. } // namespace tr1 } // namespace std #undef GTEST_0_TUPLE_ #undef GTEST_1_TUPLE_ #undef GTEST_2_TUPLE_ #undef GTEST_3_TUPLE_ #undef GTEST_4_TUPLE_ #undef GTEST_5_TUPLE_ #undef GTEST_6_TUPLE_ #undef GTEST_7_TUPLE_ #undef GTEST_8_TUPLE_ #undef GTEST_9_TUPLE_ #undef GTEST_10_TUPLE_ #undef GTEST_0_TYPENAMES_ #undef GTEST_1_TYPENAMES_ #undef GTEST_2_TYPENAMES_ #undef GTEST_3_TYPENAMES_ #undef GTEST_4_TYPENAMES_ #undef GTEST_5_TYPENAMES_ #undef GTEST_6_TYPENAMES_ #undef GTEST_7_TYPENAMES_ #undef GTEST_8_TYPENAMES_ #undef GTEST_9_TYPENAMES_ #undef GTEST_10_TYPENAMES_ #undef GTEST_DECLARE_TUPLE_AS_FRIEND_ #undef GTEST_BY_REF_ #undef GTEST_ADD_REF_ #undef GTEST_TUPLE_ELEMENT_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-type-util.h0000664000175000017500000055250213062445067022741 00000000000000// This file was GENERATED by command: // pump.py gtest-type-util.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Type utilities needed for implementing typed and type-parameterized // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently we support at most 50 types in a list, and at most 50 // type-parameterized tests in one type-parameterized test case. // Please contact googletestframework@googlegroups.com if you need // more. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #include "gtest/internal/gtest-port.h" // #ifdef __GNUC__ is too general here. It is possible to use gcc without using // libstdc++ (which is where cxxabi.h comes from). # if GTEST_HAS_CXXABI_H_ # include # elif defined(__HP_aCC) # include # endif // GTEST_HASH_CXXABI_H_ namespace testing { namespace internal { // GetTypeName() returns a human-readable name of type T. // NB: This function is also used in Google Mock, so don't move it inside of // the typed-test-only section below. template std::string GetTypeName() { # if GTEST_HAS_RTTI const char* const name = typeid(T).name(); # if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) int status = 0; // gcc's implementation of typeid(T).name() mangles the type name, // so we have to demangle it. # if GTEST_HAS_CXXABI_H_ using abi::__cxa_demangle; # endif // GTEST_HAS_CXXABI_H_ char* const readable_name = __cxa_demangle(name, 0, 0, &status); const std::string name_str(status == 0 ? readable_name : name); free(readable_name); return name_str; # else return name; # endif // GTEST_HAS_CXXABI_H_ || __HP_aCC # else return ""; # endif // GTEST_HAS_RTTI } #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // AssertyTypeEq::type is defined iff T1 and T2 are the same // type. This can be used as a compile-time assertion to ensure that // two types are equal. template struct AssertTypeEq; template struct AssertTypeEq { typedef bool type; }; // A unique type used as the default value for the arguments of class // template Types. This allows us to simulate variadic templates // (e.g. Types, Type, and etc), which C++ doesn't // support directly. struct None {}; // The following family of struct and struct templates are used to // represent type lists. In particular, TypesN // represents a type list with N types (T1, T2, ..., and TN) in it. // Except for Types0, every struct in the family has two member types: // Head for the first type in the list, and Tail for the rest of the // list. // The empty type list. struct Types0 {}; // Type lists of length 1, 2, 3, and so on. template struct Types1 { typedef T1 Head; typedef Types0 Tail; }; template struct Types2 { typedef T1 Head; typedef Types1 Tail; }; template struct Types3 { typedef T1 Head; typedef Types2 Tail; }; template struct Types4 { typedef T1 Head; typedef Types3 Tail; }; template struct Types5 { typedef T1 Head; typedef Types4 Tail; }; template struct Types6 { typedef T1 Head; typedef Types5 Tail; }; template struct Types7 { typedef T1 Head; typedef Types6 Tail; }; template struct Types8 { typedef T1 Head; typedef Types7 Tail; }; template struct Types9 { typedef T1 Head; typedef Types8 Tail; }; template struct Types10 { typedef T1 Head; typedef Types9 Tail; }; template struct Types11 { typedef T1 Head; typedef Types10 Tail; }; template struct Types12 { typedef T1 Head; typedef Types11 Tail; }; template struct Types13 { typedef T1 Head; typedef Types12 Tail; }; template struct Types14 { typedef T1 Head; typedef Types13 Tail; }; template struct Types15 { typedef T1 Head; typedef Types14 Tail; }; template struct Types16 { typedef T1 Head; typedef Types15 Tail; }; template struct Types17 { typedef T1 Head; typedef Types16 Tail; }; template struct Types18 { typedef T1 Head; typedef Types17 Tail; }; template struct Types19 { typedef T1 Head; typedef Types18 Tail; }; template struct Types20 { typedef T1 Head; typedef Types19 Tail; }; template struct Types21 { typedef T1 Head; typedef Types20 Tail; }; template struct Types22 { typedef T1 Head; typedef Types21 Tail; }; template struct Types23 { typedef T1 Head; typedef Types22 Tail; }; template struct Types24 { typedef T1 Head; typedef Types23 Tail; }; template struct Types25 { typedef T1 Head; typedef Types24 Tail; }; template struct Types26 { typedef T1 Head; typedef Types25 Tail; }; template struct Types27 { typedef T1 Head; typedef Types26 Tail; }; template struct Types28 { typedef T1 Head; typedef Types27 Tail; }; template struct Types29 { typedef T1 Head; typedef Types28 Tail; }; template struct Types30 { typedef T1 Head; typedef Types29 Tail; }; template struct Types31 { typedef T1 Head; typedef Types30 Tail; }; template struct Types32 { typedef T1 Head; typedef Types31 Tail; }; template struct Types33 { typedef T1 Head; typedef Types32 Tail; }; template struct Types34 { typedef T1 Head; typedef Types33 Tail; }; template struct Types35 { typedef T1 Head; typedef Types34 Tail; }; template struct Types36 { typedef T1 Head; typedef Types35 Tail; }; template struct Types37 { typedef T1 Head; typedef Types36 Tail; }; template struct Types38 { typedef T1 Head; typedef Types37 Tail; }; template struct Types39 { typedef T1 Head; typedef Types38 Tail; }; template struct Types40 { typedef T1 Head; typedef Types39 Tail; }; template struct Types41 { typedef T1 Head; typedef Types40 Tail; }; template struct Types42 { typedef T1 Head; typedef Types41 Tail; }; template struct Types43 { typedef T1 Head; typedef Types42 Tail; }; template struct Types44 { typedef T1 Head; typedef Types43 Tail; }; template struct Types45 { typedef T1 Head; typedef Types44 Tail; }; template struct Types46 { typedef T1 Head; typedef Types45 Tail; }; template struct Types47 { typedef T1 Head; typedef Types46 Tail; }; template struct Types48 { typedef T1 Head; typedef Types47 Tail; }; template struct Types49 { typedef T1 Head; typedef Types48 Tail; }; template struct Types50 { typedef T1 Head; typedef Types49 Tail; }; } // namespace internal // We don't want to require the users to write TypesN<...> directly, // as that would require them to count the length. Types<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Types // will appear as Types in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Types, and Google Test will translate // that to TypesN internally to make error messages // readable. The translation is done by the 'type' member of the // Types template. template struct Types { typedef internal::Types50 type; }; template <> struct Types { typedef internal::Types0 type; }; template struct Types { typedef internal::Types1 type; }; template struct Types { typedef internal::Types2 type; }; template struct Types { typedef internal::Types3 type; }; template struct Types { typedef internal::Types4 type; }; template struct Types { typedef internal::Types5 type; }; template struct Types { typedef internal::Types6 type; }; template struct Types { typedef internal::Types7 type; }; template struct Types { typedef internal::Types8 type; }; template struct Types { typedef internal::Types9 type; }; template struct Types { typedef internal::Types10 type; }; template struct Types { typedef internal::Types11 type; }; template struct Types { typedef internal::Types12 type; }; template struct Types { typedef internal::Types13 type; }; template struct Types { typedef internal::Types14 type; }; template struct Types { typedef internal::Types15 type; }; template struct Types { typedef internal::Types16 type; }; template struct Types { typedef internal::Types17 type; }; template struct Types { typedef internal::Types18 type; }; template struct Types { typedef internal::Types19 type; }; template struct Types { typedef internal::Types20 type; }; template struct Types { typedef internal::Types21 type; }; template struct Types { typedef internal::Types22 type; }; template struct Types { typedef internal::Types23 type; }; template struct Types { typedef internal::Types24 type; }; template struct Types { typedef internal::Types25 type; }; template struct Types { typedef internal::Types26 type; }; template struct Types { typedef internal::Types27 type; }; template struct Types { typedef internal::Types28 type; }; template struct Types { typedef internal::Types29 type; }; template struct Types { typedef internal::Types30 type; }; template struct Types { typedef internal::Types31 type; }; template struct Types { typedef internal::Types32 type; }; template struct Types { typedef internal::Types33 type; }; template struct Types { typedef internal::Types34 type; }; template struct Types { typedef internal::Types35 type; }; template struct Types { typedef internal::Types36 type; }; template struct Types { typedef internal::Types37 type; }; template struct Types { typedef internal::Types38 type; }; template struct Types { typedef internal::Types39 type; }; template struct Types { typedef internal::Types40 type; }; template struct Types { typedef internal::Types41 type; }; template struct Types { typedef internal::Types42 type; }; template struct Types { typedef internal::Types43 type; }; template struct Types { typedef internal::Types44 type; }; template struct Types { typedef internal::Types45 type; }; template struct Types { typedef internal::Types46 type; }; template struct Types { typedef internal::Types47 type; }; template struct Types { typedef internal::Types48 type; }; template struct Types { typedef internal::Types49 type; }; namespace internal { # define GTEST_TEMPLATE_ template class // The template "selector" struct TemplateSel is used to // represent Tmpl, which must be a class template with one type // parameter, as a type. TemplateSel::Bind::type is defined // as the type Tmpl. This allows us to actually instantiate the // template "selected" by TemplateSel. // // This trick is necessary for simulating typedef for class templates, // which C++ doesn't support directly. template struct TemplateSel { template struct Bind { typedef Tmpl type; }; }; # define GTEST_BIND_(TmplSel, T) \ TmplSel::template Bind::type // A unique struct template used as the default value for the // arguments of class template Templates. This allows us to simulate // variadic templates (e.g. Templates, Templates, // and etc), which C++ doesn't support directly. template struct NoneT {}; // The following family of struct and struct templates are used to // represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except // for Templates0, every struct in the family has two member types: // Head for the selector of the first template in the list, and Tail // for the rest of the list. // The empty template list. struct Templates0 {}; // Template lists of length 1, 2, 3, and so on. template struct Templates1 { typedef TemplateSel Head; typedef Templates0 Tail; }; template struct Templates2 { typedef TemplateSel Head; typedef Templates1 Tail; }; template struct Templates3 { typedef TemplateSel Head; typedef Templates2 Tail; }; template struct Templates4 { typedef TemplateSel Head; typedef Templates3 Tail; }; template struct Templates5 { typedef TemplateSel Head; typedef Templates4 Tail; }; template struct Templates6 { typedef TemplateSel Head; typedef Templates5 Tail; }; template struct Templates7 { typedef TemplateSel Head; typedef Templates6 Tail; }; template struct Templates8 { typedef TemplateSel Head; typedef Templates7 Tail; }; template struct Templates9 { typedef TemplateSel Head; typedef Templates8 Tail; }; template struct Templates10 { typedef TemplateSel Head; typedef Templates9 Tail; }; template struct Templates11 { typedef TemplateSel Head; typedef Templates10 Tail; }; template struct Templates12 { typedef TemplateSel Head; typedef Templates11 Tail; }; template struct Templates13 { typedef TemplateSel Head; typedef Templates12 Tail; }; template struct Templates14 { typedef TemplateSel Head; typedef Templates13 Tail; }; template struct Templates15 { typedef TemplateSel Head; typedef Templates14 Tail; }; template struct Templates16 { typedef TemplateSel Head; typedef Templates15 Tail; }; template struct Templates17 { typedef TemplateSel Head; typedef Templates16 Tail; }; template struct Templates18 { typedef TemplateSel Head; typedef Templates17 Tail; }; template struct Templates19 { typedef TemplateSel Head; typedef Templates18 Tail; }; template struct Templates20 { typedef TemplateSel Head; typedef Templates19 Tail; }; template struct Templates21 { typedef TemplateSel Head; typedef Templates20 Tail; }; template struct Templates22 { typedef TemplateSel Head; typedef Templates21 Tail; }; template struct Templates23 { typedef TemplateSel Head; typedef Templates22 Tail; }; template struct Templates24 { typedef TemplateSel Head; typedef Templates23 Tail; }; template struct Templates25 { typedef TemplateSel Head; typedef Templates24 Tail; }; template struct Templates26 { typedef TemplateSel Head; typedef Templates25 Tail; }; template struct Templates27 { typedef TemplateSel Head; typedef Templates26 Tail; }; template struct Templates28 { typedef TemplateSel Head; typedef Templates27 Tail; }; template struct Templates29 { typedef TemplateSel Head; typedef Templates28 Tail; }; template struct Templates30 { typedef TemplateSel Head; typedef Templates29 Tail; }; template struct Templates31 { typedef TemplateSel Head; typedef Templates30 Tail; }; template struct Templates32 { typedef TemplateSel Head; typedef Templates31 Tail; }; template struct Templates33 { typedef TemplateSel Head; typedef Templates32 Tail; }; template struct Templates34 { typedef TemplateSel Head; typedef Templates33 Tail; }; template struct Templates35 { typedef TemplateSel Head; typedef Templates34 Tail; }; template struct Templates36 { typedef TemplateSel Head; typedef Templates35 Tail; }; template struct Templates37 { typedef TemplateSel Head; typedef Templates36 Tail; }; template struct Templates38 { typedef TemplateSel Head; typedef Templates37 Tail; }; template struct Templates39 { typedef TemplateSel Head; typedef Templates38 Tail; }; template struct Templates40 { typedef TemplateSel Head; typedef Templates39 Tail; }; template struct Templates41 { typedef TemplateSel Head; typedef Templates40 Tail; }; template struct Templates42 { typedef TemplateSel Head; typedef Templates41 Tail; }; template struct Templates43 { typedef TemplateSel Head; typedef Templates42 Tail; }; template struct Templates44 { typedef TemplateSel Head; typedef Templates43 Tail; }; template struct Templates45 { typedef TemplateSel Head; typedef Templates44 Tail; }; template struct Templates46 { typedef TemplateSel Head; typedef Templates45 Tail; }; template struct Templates47 { typedef TemplateSel Head; typedef Templates46 Tail; }; template struct Templates48 { typedef TemplateSel Head; typedef Templates47 Tail; }; template struct Templates49 { typedef TemplateSel Head; typedef Templates48 Tail; }; template struct Templates50 { typedef TemplateSel Head; typedef Templates49 Tail; }; // We don't want to require the users to write TemplatesN<...> directly, // as that would require them to count the length. Templates<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Templates // will appear as Templates in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Templates, and Google Test will translate // that to TemplatesN internally to make error messages // readable. The translation is done by the 'type' member of the // Templates template. template struct Templates { typedef Templates50 type; }; template <> struct Templates { typedef Templates0 type; }; template struct Templates { typedef Templates1 type; }; template struct Templates { typedef Templates2 type; }; template struct Templates { typedef Templates3 type; }; template struct Templates { typedef Templates4 type; }; template struct Templates { typedef Templates5 type; }; template struct Templates { typedef Templates6 type; }; template struct Templates { typedef Templates7 type; }; template struct Templates { typedef Templates8 type; }; template struct Templates { typedef Templates9 type; }; template struct Templates { typedef Templates10 type; }; template struct Templates { typedef Templates11 type; }; template struct Templates { typedef Templates12 type; }; template struct Templates { typedef Templates13 type; }; template struct Templates { typedef Templates14 type; }; template struct Templates { typedef Templates15 type; }; template struct Templates { typedef Templates16 type; }; template struct Templates { typedef Templates17 type; }; template struct Templates { typedef Templates18 type; }; template struct Templates { typedef Templates19 type; }; template struct Templates { typedef Templates20 type; }; template struct Templates { typedef Templates21 type; }; template struct Templates { typedef Templates22 type; }; template struct Templates { typedef Templates23 type; }; template struct Templates { typedef Templates24 type; }; template struct Templates { typedef Templates25 type; }; template struct Templates { typedef Templates26 type; }; template struct Templates { typedef Templates27 type; }; template struct Templates { typedef Templates28 type; }; template struct Templates { typedef Templates29 type; }; template struct Templates { typedef Templates30 type; }; template struct Templates { typedef Templates31 type; }; template struct Templates { typedef Templates32 type; }; template struct Templates { typedef Templates33 type; }; template struct Templates { typedef Templates34 type; }; template struct Templates { typedef Templates35 type; }; template struct Templates { typedef Templates36 type; }; template struct Templates { typedef Templates37 type; }; template struct Templates { typedef Templates38 type; }; template struct Templates { typedef Templates39 type; }; template struct Templates { typedef Templates40 type; }; template struct Templates { typedef Templates41 type; }; template struct Templates { typedef Templates42 type; }; template struct Templates { typedef Templates43 type; }; template struct Templates { typedef Templates44 type; }; template struct Templates { typedef Templates45 type; }; template struct Templates { typedef Templates46 type; }; template struct Templates { typedef Templates47 type; }; template struct Templates { typedef Templates48 type; }; template struct Templates { typedef Templates49 type; }; // The TypeList template makes it possible to use either a single type // or a Types<...> list in TYPED_TEST_CASE() and // INSTANTIATE_TYPED_TEST_CASE_P(). template struct TypeList { typedef Types1 type; }; template struct TypeList > { typedef typename Types::type type; }; #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-string.h0000664000175000017500000001547013062445067022311 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) // // The Google C++ Testing Framework (Google Test) // // This header file declares the String class and functions used internally by // Google Test. They are subject to change without notice. They should not used // by code external to Google Test. // // This header file is #included by . // It should not be #included by other files. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #ifdef __BORLANDC__ // string.h is not guaranteed to provide strcpy on C++ Builder. # include #endif #include #include #include "gtest/internal/gtest-port.h" namespace testing { namespace internal { // String - an abstract class holding static string utilities. class GTEST_API_ String { public: // Static utility methods // Clones a 0-terminated C string, allocating memory using new. The // caller is responsible for deleting the return value using // delete[]. Returns the cloned string, or NULL if the input is // NULL. // // This is different from strdup() in string.h, which allocates // memory using malloc(). static const char* CloneCString(const char* c_str); #if GTEST_OS_WINDOWS_MOBILE // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be // able to pass strings to Win32 APIs on CE we need to convert them // to 'Unicode', UTF-16. // Creates a UTF-16 wide string from the given ANSI string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the wide string, or NULL if the // input is NULL. // // The wide string is created using the ANSI codepage (CP_ACP) to // match the behaviour of the ANSI versions of Win32 calls and the // C runtime. static LPCWSTR AnsiToUtf16(const char* c_str); // Creates an ANSI string from the given wide string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the ANSI string, or NULL if the // input is NULL. // // The returned string is created using the ANSI codepage (CP_ACP) to // match the behaviour of the ANSI versions of Win32 calls and the // C runtime. static const char* Utf16ToAnsi(LPCWSTR utf16_str); #endif // Compares two C strings. Returns true iff they have the same content. // // Unlike strcmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. static bool CStringEquals(const char* lhs, const char* rhs); // Converts a wide C string to a String using the UTF-8 encoding. // NULL will be converted to "(null)". If an error occurred during // the conversion, "(failed to convert from wide string)" is // returned. static std::string ShowWideCString(const wchar_t* wide_c_str); // Compares two wide C strings. Returns true iff they have the same // content. // // Unlike wcscmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); // Compares two C strings, ignoring case. Returns true iff they // have the same content. // // Unlike strcasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL C string, // including the empty string. static bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs); // Compares two wide C strings, ignoring case. Returns true iff they // have the same content. // // Unlike wcscasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL wide C string, // including the empty string. // NB: The implementations on different platforms slightly differ. // On windows, this method uses _wcsicmp which compares according to LC_CTYPE // environment variable. On GNU platform this method uses wcscasecmp // which compares according to LC_CTYPE category of the current locale. // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the // current locale. static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); // Returns true iff the given string ends with the given suffix, ignoring // case. Any string is considered to end with an empty suffix. static bool EndsWithCaseInsensitive( const std::string& str, const std::string& suffix); // Formats an int value as "%02d". static std::string FormatIntWidth2(int value); // "%02d" for width == 2 // Formats an int value as "%X". static std::string FormatHexInt(int value); // Formats a byte as "%02X". static std::string FormatByte(unsigned char value); private: String(); // Not meant to be instantiated. }; // class String // Gets the content of the stringstream's buffer as an std::string. Each '\0' // character in the buffer is replaced with "\\0". GTEST_API_ std::string StringStreamToString(::std::stringstream* stream); } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ stimfit-0.15.8/src/test/gtest/include/gtest/internal/gtest-filepath.h0000664000175000017500000002260313062445067022573 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: keith.ray@gmail.com (Keith Ray) // // Google Test filepath utilities // // This header file declares classes and functions used internally by // Google Test. They are subject to change without notice. // // This file is #included in . // Do not include this header file separately! #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #include "gtest/internal/gtest-string.h" namespace testing { namespace internal { // FilePath - a class for file and directory pathname manipulation which // handles platform-specific conventions (like the pathname separator). // Used for helper functions for naming files in a directory for xml output. // Except for Set methods, all methods are const or static, which provides an // "immutable value object" -- useful for peace of mind. // A FilePath with a value ending in a path separator ("like/this/") represents // a directory, otherwise it is assumed to represent a file. In either case, // it may or may not represent an actual file or directory in the file system. // Names are NOT checked for syntax correctness -- no checking for illegal // characters, malformed paths, etc. class GTEST_API_ FilePath { public: FilePath() : pathname_("") { } FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } explicit FilePath(const std::string& pathname) : pathname_(pathname) { Normalize(); } FilePath& operator=(const FilePath& rhs) { Set(rhs); return *this; } void Set(const FilePath& rhs) { pathname_ = rhs.pathname_; } const std::string& string() const { return pathname_; } const char* c_str() const { return pathname_.c_str(); } // Returns the current working directory, or "" if unsuccessful. static FilePath GetCurrentDir(); // Given directory = "dir", base_name = "test", number = 0, // extension = "xml", returns "dir/test.xml". If number is greater // than zero (e.g., 12), returns "dir/test_12.xml". // On Windows platform, uses \ as the separator rather than /. static FilePath MakeFileName(const FilePath& directory, const FilePath& base_name, int number, const char* extension); // Given directory = "dir", relative_path = "test.xml", // returns "dir/test.xml". // On Windows, uses \ as the separator rather than /. static FilePath ConcatPaths(const FilePath& directory, const FilePath& relative_path); // Returns a pathname for a file that does not currently exist. The pathname // will be directory/base_name.extension or // directory/base_name_.extension if directory/base_name.extension // already exists. The number will be incremented until a pathname is found // that does not already exist. // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. // There could be a race condition if two or more processes are calling this // function at the same time -- they could both pick the same filename. static FilePath GenerateUniqueFileName(const FilePath& directory, const FilePath& base_name, const char* extension); // Returns true iff the path is "". bool IsEmpty() const { return pathname_.empty(); } // If input name has a trailing separator character, removes it and returns // the name, otherwise return the name string unmodified. // On Windows platform, uses \ as the separator, other platforms use /. FilePath RemoveTrailingPathSeparator() const; // Returns a copy of the FilePath with the directory part removed. // Example: FilePath("path/to/file").RemoveDirectoryName() returns // FilePath("file"). If there is no directory part ("just_a_file"), it returns // the FilePath unmodified. If there is no file part ("just_a_dir/") it // returns an empty FilePath (""). // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath RemoveDirectoryName() const; // RemoveFileName returns the directory path with the filename removed. // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". // If the FilePath is "a_file" or "/a_file", RemoveFileName returns // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does // not have a file, like "just/a/dir/", it returns the FilePath unmodified. // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath RemoveFileName() const; // Returns a copy of the FilePath with the case-insensitive extension removed. // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns // FilePath("dir/file"). If a case-insensitive extension is not // found, returns a copy of the original FilePath. FilePath RemoveExtension(const char* extension) const; // Creates directories so that path exists. Returns true if successful or if // the directories already exist; returns false if unable to create // directories for any reason. Will also return false if the FilePath does // not represent a directory (that is, it doesn't end with a path separator). bool CreateDirectoriesRecursively() const; // Create the directory so that path exists. Returns true if successful or // if the directory already exists; returns false if unable to create the // directory for any reason, including if the parent directory does not // exist. Not named "CreateDirectory" because that's a macro on Windows. bool CreateFolder() const; // Returns true if FilePath describes something in the file-system, // either a file, directory, or whatever, and that something exists. bool FileOrDirectoryExists() const; // Returns true if pathname describes a directory in the file-system // that exists. bool DirectoryExists() const; // Returns true if FilePath ends with a path separator, which indicates that // it is intended to represent a directory. Returns false otherwise. // This does NOT check that a directory (or file) actually exists. bool IsDirectory() const; // Returns true if pathname describes a root directory. (Windows has one // root directory per disk drive.) bool IsRootDirectory() const; // Returns true if pathname describes an absolute path. bool IsAbsolutePath() const; private: // Replaces multiple consecutive separators with a single separator. // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". // // A pathname with multiple consecutive separators may occur either through // user error or as a result of some scripts or APIs that generate a pathname // with a trailing separator. On other platforms the same API or script // may NOT generate a pathname with a trailing "/". Then elsewhere that // pathname may have another "/" and pathname components added to it, // without checking for the separator already being there. // The script language and operating system may allow paths like "foo//bar" // but some of the functions in FilePath will not handle that correctly. In // particular, RemoveTrailingPathSeparator() only removes one separator, and // it is called in CreateDirectoriesRecursively() assuming that it will change // a pathname from directory syntax (trailing separator) to filename syntax. // // On Windows this method also replaces the alternate path separator '/' with // the primary path separator '\\', so that for example "bar\\/\\foo" becomes // "bar\\foo". void Normalize(); // Returns a pointer to the last occurence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FindLastPathSeparator() const; std::string pathname_; }; // class FilePath } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest-param-test.h.pump0000664000175000017500000004455413062445067022231 00000000000000$$ -*- mode: c++; -*- $var n = 50 $$ Maximum length of Values arguments we want to support. $var maxtuple = 10 $$ Maximum number of Combine arguments we want to support. // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: vladl@google.com (Vlad Losev) // // Macros and functions for implementing parameterized tests // in Google C++ Testing Framework (Google Test) // // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ // Value-parameterized tests allow you to test your code with different // parameters without writing multiple copies of the same test. // // Here is how you use value-parameterized tests: #if 0 // To write value-parameterized tests, first you should define a fixture // class. It is usually derived from testing::TestWithParam (see below for // another inheritance scheme that's sometimes useful in more complicated // class hierarchies), where the type of your parameter values. // TestWithParam is itself derived from testing::Test. T can be any // copyable type. If it's a raw pointer, you are responsible for managing the // lifespan of the pointed values. class FooTest : public ::testing::TestWithParam { // You can implement all the usual class fixture members here. }; // Then, use the TEST_P macro to define as many parameterized tests // for this fixture as you want. The _P suffix is for "parameterized" // or "pattern", whichever you prefer to think. TEST_P(FooTest, DoesBlah) { // Inside a test, access the test parameter with the GetParam() method // of the TestWithParam class: EXPECT_TRUE(foo.Blah(GetParam())); ... } TEST_P(FooTest, HasBlahBlah) { ... } // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test // case with any set of parameters you want. Google Test defines a number // of functions for generating test parameters. They return what we call // (surprise!) parameter generators. Here is a summary of them, which // are all in the testing namespace: // // // Range(begin, end [, step]) - Yields values {begin, begin+step, // begin+step+step, ...}. The values do not // include end. step defaults to 1. // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. // ValuesIn(container) - Yields values from a C-style array, an STL // ValuesIn(begin,end) container, or an iterator range [begin, end). // Bool() - Yields sequence {false, true}. // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product // for the math savvy) of the values generated // by the N generators. // // For more details, see comments at the definitions of these functions below // in this file. // // The following statement will instantiate tests from the FooTest test case // each with parameter values "meeny", "miny", and "moe". INSTANTIATE_TEST_CASE_P(InstantiationName, FooTest, Values("meeny", "miny", "moe")); // To distinguish different instances of the pattern, (yes, you // can instantiate it more then once) the first argument to the // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the // actual test case name. Remember to pick unique prefixes for different // instantiations. The tests from the instantiation above will have // these names: // // * InstantiationName/FooTest.DoesBlah/0 for "meeny" // * InstantiationName/FooTest.DoesBlah/1 for "miny" // * InstantiationName/FooTest.DoesBlah/2 for "moe" // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" // * InstantiationName/FooTest.HasBlahBlah/1 for "miny" // * InstantiationName/FooTest.HasBlahBlah/2 for "moe" // // You can use these names in --gtest_filter. // // This statement will instantiate all tests from FooTest again, each // with parameter values "cat" and "dog": const char* pets[] = {"cat", "dog"}; INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); // The tests from the instantiation above will have these names: // // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" // // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests // in the given test case, whether their definitions come before or // AFTER the INSTANTIATE_TEST_CASE_P statement. // // Please also note that generator expressions (including parameters to the // generators) are evaluated in InitGoogleTest(), after main() has started. // This allows the user on one hand, to adjust generator parameters in order // to dynamically determine a set of tests to run and on the other hand, // give the user a chance to inspect the generated tests with Google Test // reflection API before RUN_ALL_TESTS() is executed. // // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc // for more examples. // // In the future, we plan to publish the API for defining new parameter // generators. But for now this interface remains part of the internal // implementation and is subject to change. // // // A parameterized test fixture must be derived from testing::Test and from // testing::WithParamInterface, where T is the type of the parameter // values. Inheriting from TestWithParam satisfies that requirement because // TestWithParam inherits from both Test and WithParamInterface. In more // complicated hierarchies, however, it is occasionally useful to inherit // separately from Test and WithParamInterface. For example: class BaseTest : public ::testing::Test { // You can inherit all the usual members for a non-parameterized test // fixture here. }; class DerivedTest : public BaseTest, public ::testing::WithParamInterface { // The usual test fixture members go here too. }; TEST_F(BaseTest, HasFoo) { // This is an ordinary non-parameterized test. } TEST_P(DerivedTest, DoesBlah) { // GetParam works just the same here as if you inherit from TestWithParam. EXPECT_TRUE(foo.Blah(GetParam())); } #endif // 0 #include "gtest/internal/gtest-port.h" #if !GTEST_OS_SYMBIAN # include #endif // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-param-util.h" #include "gtest/internal/gtest-param-util-generated.h" #if GTEST_HAS_PARAM_TEST namespace testing { // Functions producing parameter generators. // // Google Test uses these generators to produce parameters for value- // parameterized tests. When a parameterized test case is instantiated // with a particular generator, Google Test creates and runs tests // for each element in the sequence produced by the generator. // // In the following sample, tests from test case FooTest are instantiated // each three times with parameter values 3, 5, and 8: // // class FooTest : public TestWithParam { ... }; // // TEST_P(FooTest, TestThis) { // } // TEST_P(FooTest, TestThat) { // } // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); // // Range() returns generators providing sequences of values in a range. // // Synopsis: // Range(start, end) // - returns a generator producing a sequence of values {start, start+1, // start+2, ..., }. // Range(start, end, step) // - returns a generator producing a sequence of values {start, start+step, // start+step+step, ..., }. // Notes: // * The generated sequences never include end. For example, Range(1, 5) // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) // returns a generator producing {1, 3, 5, 7}. // * start and end must have the same type. That type may be any integral or // floating-point type or a user defined type satisfying these conditions: // * It must be assignable (have operator=() defined). // * It must have operator+() (operator+(int-compatible type) for // two-operand version). // * It must have operator<() defined. // Elements in the resulting sequences will also have that type. // * Condition start < end must be satisfied in order for resulting sequences // to contain any elements. // template internal::ParamGenerator Range(T start, T end, IncrementT step) { return internal::ParamGenerator( new internal::RangeGenerator(start, end, step)); } template internal::ParamGenerator Range(T start, T end) { return Range(start, end, 1); } // ValuesIn() function allows generation of tests with parameters coming from // a container. // // Synopsis: // ValuesIn(const T (&array)[N]) // - returns a generator producing sequences with elements from // a C-style array. // ValuesIn(const Container& container) // - returns a generator producing sequences with elements from // an STL-style container. // ValuesIn(Iterator begin, Iterator end) // - returns a generator producing sequences with elements from // a range [begin, end) defined by a pair of STL-style iterators. These // iterators can also be plain C pointers. // // Please note that ValuesIn copies the values from the containers // passed in and keeps them to generate tests in RUN_ALL_TESTS(). // // Examples: // // This instantiates tests from test case StringTest // each with C-string values of "foo", "bar", and "baz": // // const char* strings[] = {"foo", "bar", "baz"}; // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); // // This instantiates tests from test case StlStringTest // each with STL strings with values "a" and "b": // // ::std::vector< ::std::string> GetParameterStrings() { // ::std::vector< ::std::string> v; // v.push_back("a"); // v.push_back("b"); // return v; // } // // INSTANTIATE_TEST_CASE_P(CharSequence, // StlStringTest, // ValuesIn(GetParameterStrings())); // // // This will also instantiate tests from CharTest // each with parameter values 'a' and 'b': // // ::std::list GetParameterChars() { // ::std::list list; // list.push_back('a'); // list.push_back('b'); // return list; // } // ::std::list l = GetParameterChars(); // INSTANTIATE_TEST_CASE_P(CharSequence2, // CharTest, // ValuesIn(l.begin(), l.end())); // template internal::ParamGenerator< typename ::testing::internal::IteratorTraits::value_type> ValuesIn(ForwardIterator begin, ForwardIterator end) { typedef typename ::testing::internal::IteratorTraits ::value_type ParamType; return internal::ParamGenerator( new internal::ValuesInIteratorRangeGenerator(begin, end)); } template internal::ParamGenerator ValuesIn(const T (&array)[N]) { return ValuesIn(array, array + N); } template internal::ParamGenerator ValuesIn( const Container& container) { return ValuesIn(container.begin(), container.end()); } // Values() allows generating tests from explicitly specified list of // parameters. // // Synopsis: // Values(T v1, T v2, ..., T vN) // - returns a generator producing sequences with elements v1, v2, ..., vN. // // For example, this instantiates tests from test case BarTest each // with values "one", "two", and "three": // // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); // // This instantiates tests from test case BazTest each with values 1, 2, 3.5. // The exact type of values will depend on the type of parameter in BazTest. // // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); // // Currently, Values() supports from 1 to $n parameters. // $range i 1..n $for i [[ $range j 1..i template <$for j, [[typename T$j]]> internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) { return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]); } ]] // Bool() allows generating tests with parameters in a set of (false, true). // // Synopsis: // Bool() // - returns a generator producing sequences with elements {false, true}. // // It is useful when testing code that depends on Boolean flags. Combinations // of multiple flags can be tested when several Bool()'s are combined using // Combine() function. // // In the following example all tests in the test case FlagDependentTest // will be instantiated twice with parameters false and true. // // class FlagDependentTest : public testing::TestWithParam { // virtual void SetUp() { // external_flag = GetParam(); // } // } // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); // inline internal::ParamGenerator Bool() { return Values(false, true); } # if GTEST_HAS_COMBINE // Combine() allows the user to combine two or more sequences to produce // values of a Cartesian product of those sequences' elements. // // Synopsis: // Combine(gen1, gen2, ..., genN) // - returns a generator producing sequences with elements coming from // the Cartesian product of elements from the sequences generated by // gen1, gen2, ..., genN. The sequence elements will have a type of // tuple where T1, T2, ..., TN are the types // of elements from sequences produces by gen1, gen2, ..., genN. // // Combine can have up to $maxtuple arguments. This number is currently limited // by the maximum number of elements in the tuple implementation used by Google // Test. // // Example: // // This will instantiate tests in test case AnimalTest each one with // the parameter values tuple("cat", BLACK), tuple("cat", WHITE), // tuple("dog", BLACK), and tuple("dog", WHITE): // // enum Color { BLACK, GRAY, WHITE }; // class AnimalTest // : public testing::TestWithParam > {...}; // // TEST_P(AnimalTest, AnimalLooksNice) {...} // // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, // Combine(Values("cat", "dog"), // Values(BLACK, WHITE))); // // This will instantiate tests in FlagDependentTest with all variations of two // Boolean flags: // // class FlagDependentTest // : public testing::TestWithParam > { // virtual void SetUp() { // // Assigns external_flag_1 and external_flag_2 values from the tuple. // tie(external_flag_1, external_flag_2) = GetParam(); // } // }; // // TEST_P(FlagDependentTest, TestFeature1) { // // Test your code using external_flag_1 and external_flag_2 here. // } // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, // Combine(Bool(), Bool())); // $range i 2..maxtuple $for i [[ $range j 1..i template <$for j, [[typename Generator$j]]> internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine( $for j, [[const Generator$j& g$j]]) { return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>( $for j, [[g$j]]); } ]] # endif // GTEST_HAS_COMBINE # define TEST_P(test_case_name, test_name) \ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ : public test_case_name { \ public: \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ virtual void TestBody(); \ private: \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ #test_case_name, \ #test_name, \ new ::testing::internal::TestMetaFactory< \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ return 0; \ } \ static int gtest_registering_dummy_; \ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ }; \ int GTEST_TEST_CLASS_NAME_(test_case_name, \ test_name)::gtest_registering_dummy_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ ::testing::internal::ParamGenerator \ gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ int gtest_##prefix##test_case_name##_dummy_ = \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ #prefix, \ >est_##prefix##test_case_name##_EvalGenerator_, \ __FILE__, __LINE__) } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest_pred_impl.h0000664000175000017500000003545113062445067021225 00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // This file is AUTOMATICALLY GENERATED on 10/31/2011 by command // 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! // // Implements a family of generic predicate assertion macros. #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ #define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ // Makes sure this header is not included before gtest.h. #ifndef GTEST_INCLUDE_GTEST_GTEST_H_ # error Do not include gtest_pred_impl.h directly. Include gtest.h instead. #endif // GTEST_INCLUDE_GTEST_GTEST_H_ // This header implements a family of generic predicate assertion // macros: // // ASSERT_PRED_FORMAT1(pred_format, v1) // ASSERT_PRED_FORMAT2(pred_format, v1, v2) // ... // // where pred_format is a function or functor that takes n (in the // case of ASSERT_PRED_FORMATn) values and their source expression // text, and returns a testing::AssertionResult. See the definition // of ASSERT_EQ in gtest.h for an example. // // If you don't care about formatting, you can use the more // restrictive version: // // ASSERT_PRED1(pred, v1) // ASSERT_PRED2(pred, v1, v2) // ... // // where pred is an n-ary function or functor that returns bool, // and the values v1, v2, ..., must support the << operator for // streaming to std::ostream. // // We also define the EXPECT_* variations. // // For now we only support predicates whose arity is at most 5. // Please email googletestframework@googlegroups.com if you need // support for higher arities. // GTEST_ASSERT_ is the basic statement to which all of the assertions // in this file reduce. Don't use this in your code. #define GTEST_ASSERT_(expression, on_failure) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar = (expression)) \ ; \ else \ on_failure(gtest_ar.failure_message()) // Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use // this in your code. template AssertionResult AssertPred1Helper(const char* pred_text, const char* e1, Pred pred, const T1& v1) { if (pred(v1)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1. // Don't use this in your code. #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ GTEST_ASSERT_(pred_format(#v1, v1), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use // this in your code. #define GTEST_PRED1_(pred, v1, on_failure)\ GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ #v1, \ pred, \ v1), on_failure) // Unary predicate assertion macros. #define EXPECT_PRED_FORMAT1(pred_format, v1) \ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED1(pred, v1) \ GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT1(pred_format, v1) \ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) #define ASSERT_PRED1(pred, v1) \ GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use // this in your code. template AssertionResult AssertPred2Helper(const char* pred_text, const char* e1, const char* e2, Pred pred, const T1& v1, const T2& v2) { if (pred(v1, v2)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2. // Don't use this in your code. #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use // this in your code. #define GTEST_PRED2_(pred, v1, v2, on_failure)\ GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ #v1, \ #v2, \ pred, \ v1, \ v2), on_failure) // Binary predicate assertion macros. #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED2(pred, v1, v2) \ GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) #define ASSERT_PRED2(pred, v1, v2) \ GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use // this in your code. template AssertionResult AssertPred3Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, Pred pred, const T1& v1, const T2& v2, const T3& v3) { if (pred(v1, v2, v3)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3. // Don't use this in your code. #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use // this in your code. #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ #v1, \ #v2, \ #v3, \ pred, \ v1, \ v2, \ v3), on_failure) // Ternary predicate assertion macros. #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED3(pred, v1, v2, v3) \ GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) #define ASSERT_PRED3(pred, v1, v2, v3) \ GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use // this in your code. template AssertionResult AssertPred4Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, const char* e4, Pred pred, const T1& v1, const T2& v2, const T3& v3, const T4& v4) { if (pred(v1, v2, v3, v4)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3 << "\n" << e4 << " evaluates to " << v4; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4. // Don't use this in your code. #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use // this in your code. #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ #v1, \ #v2, \ #v3, \ #v4, \ pred, \ v1, \ v2, \ v3, \ v4), on_failure) // 4-ary predicate assertion macros. #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED4(pred, v1, v2, v3, v4) \ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) #define ASSERT_PRED4(pred, v1, v2, v3, v4) \ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use // this in your code. template AssertionResult AssertPred5Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, const char* e4, const char* e5, Pred pred, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5) { if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 << ", " << e5 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << v1 << "\n" << e2 << " evaluates to " << v2 << "\n" << e3 << " evaluates to " << v3 << "\n" << e4 << " evaluates to " << v4 << "\n" << e5 << " evaluates to " << v5; } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5. // Don't use this in your code. #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use // this in your code. #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ #v1, \ #v2, \ #v3, \ #v4, \ #v5, \ pred, \ v1, \ v2, \ v3, \ v4, \ v5), on_failure) // 5-ary predicate assertion macros. #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) #endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest-death-test.h0000664000175000017500000002640313062445067021227 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the public API for death tests. It is // #included by gtest.h so a user doesn't need to include this // directly. #ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ #include "gtest/internal/gtest-death-test-internal.h" namespace testing { // This flag controls the style of death tests. Valid values are "threadsafe", // meaning that the death test child process will re-execute the test binary // from the start, running only a single death test, or "fast", // meaning that the child process will execute the test logic immediately // after forking. GTEST_DECLARE_string_(death_test_style); #if GTEST_HAS_DEATH_TEST namespace internal { // Returns a Boolean value indicating whether the caller is currently // executing in the context of the death test child process. Tools such as // Valgrind heap checkers may need this to modify their behavior in death // tests. IMPORTANT: This is an internal utility. Using it may break the // implementation of death tests. User code MUST NOT use it. GTEST_API_ bool InDeathTestChild(); } // namespace internal // The following macros are useful for writing death tests. // Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is // executed: // // 1. It generates a warning if there is more than one active // thread. This is because it's safe to fork() or clone() only // when there is a single thread. // // 2. The parent process clone()s a sub-process and runs the death // test in it; the sub-process exits with code 0 at the end of the // death test, if it hasn't exited already. // // 3. The parent process waits for the sub-process to terminate. // // 4. The parent process checks the exit code and error message of // the sub-process. // // Examples: // // ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); // for (int i = 0; i < 5; i++) { // EXPECT_DEATH(server.ProcessRequest(i), // "Invalid request .* in ProcessRequest()") // << "Failed to die on request " << i; // } // // ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); // // bool KilledBySIGHUP(int exit_code) { // return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; // } // // ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); // // On the regular expressions used in death tests: // // On POSIX-compliant systems (*nix), we use the library, // which uses the POSIX extended regex syntax. // // On other platforms (e.g. Windows), we only support a simple regex // syntax implemented as part of Google Test. This limited // implementation should be enough most of the time when writing // death tests; though it lacks many features you can find in PCRE // or POSIX extended regex syntax. For example, we don't support // union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and // repetition count ("x{5,7}"), among others. // // Below is the syntax that we do support. We chose it to be a // subset of both PCRE and POSIX extended regex, so it's easy to // learn wherever you come from. In the following: 'A' denotes a // literal character, period (.), or a single \\ escape sequence; // 'x' and 'y' denote regular expressions; 'm' and 'n' are for // natural numbers. // // c matches any literal character c // \\d matches any decimal digit // \\D matches any character that's not a decimal digit // \\f matches \f // \\n matches \n // \\r matches \r // \\s matches any ASCII whitespace, including \n // \\S matches any character that's not a whitespace // \\t matches \t // \\v matches \v // \\w matches any letter, _, or decimal digit // \\W matches any character that \\w doesn't match // \\c matches any literal character c, which must be a punctuation // . matches any single character except \n // A? matches 0 or 1 occurrences of A // A* matches 0 or many occurrences of A // A+ matches 1 or many occurrences of A // ^ matches the beginning of a string (not that of each line) // $ matches the end of a string (not that of each line) // xy matches x followed by y // // If you accidentally use PCRE or POSIX extended regex features // not implemented by us, you will get a run-time failure. In that // case, please try to rewrite your regular expression within the // above syntax. // // This implementation is *not* meant to be as highly tuned or robust // as a compiled regex library, but should perform well enough for a // death test, which already incurs significant overhead by launching // a child process. // // Known caveats: // // A "threadsafe" style death test obtains the path to the test // program from argv[0] and re-executes it in the sub-process. For // simplicity, the current implementation doesn't search the PATH // when launching the sub-process. This means that the user must // invoke the test program via a path that contains at least one // path separator (e.g. path/to/foo_test and // /absolute/path/to/bar_test are fine, but foo_test is not). This // is rarely a problem as people usually don't put the test binary // directory in PATH. // // TODO(wan@google.com): make thread-safe death tests search the PATH. // Asserts that a given statement causes the program to exit, with an // integer exit status that satisfies predicate, and emitting error output // that matches regex. # define ASSERT_EXIT(statement, predicate, regex) \ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) // Like ASSERT_EXIT, but continues on to successive tests in the // test case, if any: # define EXPECT_EXIT(statement, predicate, regex) \ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) // Asserts that a given statement causes the program to exit, either by // explicitly exiting with a nonzero exit code or being killed by a // signal, and emitting error output that matches regex. # define ASSERT_DEATH(statement, regex) \ ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) // Like ASSERT_DEATH, but continues on to successive tests in the // test case, if any: # define EXPECT_DEATH(statement, regex) \ EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: // Tests that an exit code describes a normal exit with a given exit code. class GTEST_API_ ExitedWithCode { public: explicit ExitedWithCode(int exit_code); bool operator()(int exit_status) const; private: // No implementation - assignment is unsupported. void operator=(const ExitedWithCode& other); const int exit_code_; }; # if !GTEST_OS_WINDOWS // Tests that an exit code describes an exit due to termination by a // given signal. class GTEST_API_ KilledBySignal { public: explicit KilledBySignal(int signum); bool operator()(int exit_status) const; private: const int signum_; }; # endif // !GTEST_OS_WINDOWS // EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. // The death testing framework causes this to have interesting semantics, // since the sideeffects of the call are only visible in opt mode, and not // in debug mode. // // In practice, this can be used to test functions that utilize the // LOG(DFATAL) macro using the following style: // // int DieInDebugOr12(int* sideeffect) { // if (sideeffect) { // *sideeffect = 12; // } // LOG(DFATAL) << "death"; // return 12; // } // // TEST(TestCase, TestDieOr12WorksInDgbAndOpt) { // int sideeffect = 0; // // Only asserts in dbg. // EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); // // #ifdef NDEBUG // // opt-mode has sideeffect visible. // EXPECT_EQ(12, sideeffect); // #else // // dbg-mode no visible sideeffect. // EXPECT_EQ(0, sideeffect); // #endif // } // // This will assert that DieInDebugReturn12InOpt() crashes in debug // mode, usually due to a DCHECK or LOG(DFATAL), but returns the // appropriate fallback value (12 in this case) in opt mode. If you // need to test that a function has appropriate side-effects in opt // mode, include assertions against the side-effects. A general // pattern for this is: // // EXPECT_DEBUG_DEATH({ // // Side-effects here will have an effect after this statement in // // opt mode, but none in debug mode. // EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); // }, "death"); // # ifdef NDEBUG # define EXPECT_DEBUG_DEATH(statement, regex) \ GTEST_EXECUTE_STATEMENT_(statement, regex) # define ASSERT_DEBUG_DEATH(statement, regex) \ GTEST_EXECUTE_STATEMENT_(statement, regex) # else # define EXPECT_DEBUG_DEATH(statement, regex) \ EXPECT_DEATH(statement, regex) # define ASSERT_DEBUG_DEATH(statement, regex) \ ASSERT_DEATH(statement, regex) # endif // NDEBUG for EXPECT_DEBUG_DEATH #endif // GTEST_HAS_DEATH_TEST // EXPECT_DEATH_IF_SUPPORTED(statement, regex) and // ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if // death tests are supported; otherwise they just issue a warning. This is // useful when you are combining death test assertions with normal test // assertions in one test. #if GTEST_HAS_DEATH_TEST # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ EXPECT_DEATH(statement, regex) # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ ASSERT_DEATH(statement, regex) #else # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, ) # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return) #endif } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest-message.h0000664000175000017500000002174213062445067020612 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // The Google C++ Testing Framework (Google Test) // // This header file defines the Message class. // // IMPORTANT NOTE: Due to limitation of the C++ language, we have to // leave some internal implementation details in this header file. // They are clearly marked by comments like this: // // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // // Such code is NOT meant to be used by a user directly, and is subject // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user // program! #ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #include #include "gtest/internal/gtest-port.h" // Ensures that there is at least one operator<< in the global namespace. // See Message& operator<<(...) below for why. void operator<<(const testing::internal::Secret&, int); namespace testing { // The Message class works like an ostream repeater. // // Typical usage: // // 1. You stream a bunch of values to a Message object. // It will remember the text in a stringstream. // 2. Then you stream the Message object to an ostream. // This causes the text in the Message to be streamed // to the ostream. // // For example; // // testing::Message foo; // foo << 1 << " != " << 2; // std::cout << foo; // // will print "1 != 2". // // Message is not intended to be inherited from. In particular, its // destructor is not virtual. // // Note that stringstream behaves differently in gcc and in MSVC. You // can stream a NULL char pointer to it in the former, but not in the // latter (it causes an access violation if you do). The Message // class hides this difference by treating a NULL char pointer as // "(null)". class GTEST_API_ Message { private: // The type of basic IO manipulators (endl, ends, and flush) for // narrow streams. typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); public: // Constructs an empty Message. Message(); // Copy constructor. Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT *ss_ << msg.GetString(); } // Constructs a Message from a C-string. explicit Message(const char* str) : ss_(new ::std::stringstream) { *ss_ << str; } #if GTEST_OS_SYMBIAN // Streams a value (either a pointer or not) to this object. template inline Message& operator <<(const T& value) { StreamHelper(typename internal::is_pointer::type(), value); return *this; } #else // Streams a non-pointer value to this object. template inline Message& operator <<(const T& val) { // Some libraries overload << for STL containers. These // overloads are defined in the global namespace instead of ::std. // // C++'s symbol lookup rule (i.e. Koenig lookup) says that these // overloads are visible in either the std namespace or the global // namespace, but not other namespaces, including the testing // namespace which Google Test's Message class is in. // // To allow STL containers (and other types that has a << operator // defined in the global namespace) to be used in Google Test // assertions, testing::Message must access the custom << operator // from the global namespace. With this using declaration, // overloads of << defined in the global namespace and those // visible via Koenig lookup are both exposed in this function. using ::operator <<; *ss_ << val; return *this; } // Streams a pointer value to this object. // // This function is an overload of the previous one. When you // stream a pointer to a Message, this definition will be used as it // is more specialized. (The C++ Standard, section // [temp.func.order].) If you stream a non-pointer, then the // previous definition will be used. // // The reason for this overload is that streaming a NULL pointer to // ostream is undefined behavior. Depending on the compiler, you // may get "0", "(nil)", "(null)", or an access violation. To // ensure consistent result across compilers, we always treat NULL // as "(null)". template inline Message& operator <<(T* const& pointer) { // NOLINT if (pointer == NULL) { *ss_ << "(null)"; } else { *ss_ << pointer; } return *this; } #endif // GTEST_OS_SYMBIAN // Since the basic IO manipulators are overloaded for both narrow // and wide streams, we have to provide this specialized definition // of operator <<, even though its body is the same as the // templatized version above. Without this definition, streaming // endl or other basic IO manipulators to Message will confuse the // compiler. Message& operator <<(BasicNarrowIoManip val) { *ss_ << val; return *this; } // Instead of 1/0, we want to see true/false for bool values. Message& operator <<(bool b) { return *this << (b ? "true" : "false"); } // These two overloads allow streaming a wide C string to a Message // using the UTF-8 encoding. Message& operator <<(const wchar_t* wide_c_str); Message& operator <<(wchar_t* wide_c_str); #if GTEST_HAS_STD_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& operator <<(const ::std::wstring& wstr); #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_GLOBAL_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& operator <<(const ::wstring& wstr); #endif // GTEST_HAS_GLOBAL_WSTRING // Gets the text streamed to this object so far as an std::string. // Each '\0' character in the buffer is replaced with "\\0". // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. std::string GetString() const; private: #if GTEST_OS_SYMBIAN // These are needed as the Nokia Symbian Compiler cannot decide between // const T& and const T* in a function template. The Nokia compiler _can_ // decide between class template specializations for T and T*, so a // tr1::type_traits-like is_pointer works, and we can overload on that. template inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) { if (pointer == NULL) { *ss_ << "(null)"; } else { *ss_ << pointer; } } template inline void StreamHelper(internal::false_type /*is_pointer*/, const T& value) { // See the comments in Message& operator <<(const T&) above for why // we need this using statement. using ::operator <<; *ss_ << value; } #endif // GTEST_OS_SYMBIAN // We'll hold the text streamed to this object here. const internal::scoped_ptr< ::std::stringstream> ss_; // We declare (but don't implement) this to prevent the compiler // from implementing the assignment operator. void operator=(const Message&); }; // Streams a Message to an ostream. inline std::ostream& operator <<(std::ostream& os, const Message& sb) { return os << sb.GetString(); } namespace internal { // Converts a streamable value to an std::string. A NULL pointer is // converted to "(null)". When the input value is a ::string, // ::std::string, ::wstring, or ::std::wstring object, each NUL // character in it is replaced with "\\0". template std::string StreamableToString(const T& streamable) { return (Message() << streamable).GetString(); } } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest-param-test.h0000664000175000017500000022413013062445067021237 00000000000000// This file was GENERATED by command: // pump.py gtest-param-test.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: vladl@google.com (Vlad Losev) // // Macros and functions for implementing parameterized tests // in Google C++ Testing Framework (Google Test) // // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ // Value-parameterized tests allow you to test your code with different // parameters without writing multiple copies of the same test. // // Here is how you use value-parameterized tests: #if 0 // To write value-parameterized tests, first you should define a fixture // class. It is usually derived from testing::TestWithParam (see below for // another inheritance scheme that's sometimes useful in more complicated // class hierarchies), where the type of your parameter values. // TestWithParam is itself derived from testing::Test. T can be any // copyable type. If it's a raw pointer, you are responsible for managing the // lifespan of the pointed values. class FooTest : public ::testing::TestWithParam { // You can implement all the usual class fixture members here. }; // Then, use the TEST_P macro to define as many parameterized tests // for this fixture as you want. The _P suffix is for "parameterized" // or "pattern", whichever you prefer to think. TEST_P(FooTest, DoesBlah) { // Inside a test, access the test parameter with the GetParam() method // of the TestWithParam class: EXPECT_TRUE(foo.Blah(GetParam())); ... } TEST_P(FooTest, HasBlahBlah) { ... } // Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test // case with any set of parameters you want. Google Test defines a number // of functions for generating test parameters. They return what we call // (surprise!) parameter generators. Here is a summary of them, which // are all in the testing namespace: // // // Range(begin, end [, step]) - Yields values {begin, begin+step, // begin+step+step, ...}. The values do not // include end. step defaults to 1. // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. // ValuesIn(container) - Yields values from a C-style array, an STL // ValuesIn(begin,end) container, or an iterator range [begin, end). // Bool() - Yields sequence {false, true}. // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product // for the math savvy) of the values generated // by the N generators. // // For more details, see comments at the definitions of these functions below // in this file. // // The following statement will instantiate tests from the FooTest test case // each with parameter values "meeny", "miny", and "moe". INSTANTIATE_TEST_CASE_P(InstantiationName, FooTest, Values("meeny", "miny", "moe")); // To distinguish different instances of the pattern, (yes, you // can instantiate it more then once) the first argument to the // INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the // actual test case name. Remember to pick unique prefixes for different // instantiations. The tests from the instantiation above will have // these names: // // * InstantiationName/FooTest.DoesBlah/0 for "meeny" // * InstantiationName/FooTest.DoesBlah/1 for "miny" // * InstantiationName/FooTest.DoesBlah/2 for "moe" // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" // * InstantiationName/FooTest.HasBlahBlah/1 for "miny" // * InstantiationName/FooTest.HasBlahBlah/2 for "moe" // // You can use these names in --gtest_filter. // // This statement will instantiate all tests from FooTest again, each // with parameter values "cat" and "dog": const char* pets[] = {"cat", "dog"}; INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); // The tests from the instantiation above will have these names: // // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" // // Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests // in the given test case, whether their definitions come before or // AFTER the INSTANTIATE_TEST_CASE_P statement. // // Please also note that generator expressions (including parameters to the // generators) are evaluated in InitGoogleTest(), after main() has started. // This allows the user on one hand, to adjust generator parameters in order // to dynamically determine a set of tests to run and on the other hand, // give the user a chance to inspect the generated tests with Google Test // reflection API before RUN_ALL_TESTS() is executed. // // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc // for more examples. // // In the future, we plan to publish the API for defining new parameter // generators. But for now this interface remains part of the internal // implementation and is subject to change. // // // A parameterized test fixture must be derived from testing::Test and from // testing::WithParamInterface, where T is the type of the parameter // values. Inheriting from TestWithParam satisfies that requirement because // TestWithParam inherits from both Test and WithParamInterface. In more // complicated hierarchies, however, it is occasionally useful to inherit // separately from Test and WithParamInterface. For example: class BaseTest : public ::testing::Test { // You can inherit all the usual members for a non-parameterized test // fixture here. }; class DerivedTest : public BaseTest, public ::testing::WithParamInterface { // The usual test fixture members go here too. }; TEST_F(BaseTest, HasFoo) { // This is an ordinary non-parameterized test. } TEST_P(DerivedTest, DoesBlah) { // GetParam works just the same here as if you inherit from TestWithParam. EXPECT_TRUE(foo.Blah(GetParam())); } #endif // 0 #include "gtest/internal/gtest-port.h" #if !GTEST_OS_SYMBIAN # include #endif // scripts/fuse_gtest.py depends on gtest's own header being #included // *unconditionally*. Therefore these #includes cannot be moved // inside #if GTEST_HAS_PARAM_TEST. #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-param-util.h" #include "gtest/internal/gtest-param-util-generated.h" #if GTEST_HAS_PARAM_TEST namespace testing { // Functions producing parameter generators. // // Google Test uses these generators to produce parameters for value- // parameterized tests. When a parameterized test case is instantiated // with a particular generator, Google Test creates and runs tests // for each element in the sequence produced by the generator. // // In the following sample, tests from test case FooTest are instantiated // each three times with parameter values 3, 5, and 8: // // class FooTest : public TestWithParam { ... }; // // TEST_P(FooTest, TestThis) { // } // TEST_P(FooTest, TestThat) { // } // INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); // // Range() returns generators providing sequences of values in a range. // // Synopsis: // Range(start, end) // - returns a generator producing a sequence of values {start, start+1, // start+2, ..., }. // Range(start, end, step) // - returns a generator producing a sequence of values {start, start+step, // start+step+step, ..., }. // Notes: // * The generated sequences never include end. For example, Range(1, 5) // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) // returns a generator producing {1, 3, 5, 7}. // * start and end must have the same type. That type may be any integral or // floating-point type or a user defined type satisfying these conditions: // * It must be assignable (have operator=() defined). // * It must have operator+() (operator+(int-compatible type) for // two-operand version). // * It must have operator<() defined. // Elements in the resulting sequences will also have that type. // * Condition start < end must be satisfied in order for resulting sequences // to contain any elements. // template internal::ParamGenerator Range(T start, T end, IncrementT step) { return internal::ParamGenerator( new internal::RangeGenerator(start, end, step)); } template internal::ParamGenerator Range(T start, T end) { return Range(start, end, 1); } // ValuesIn() function allows generation of tests with parameters coming from // a container. // // Synopsis: // ValuesIn(const T (&array)[N]) // - returns a generator producing sequences with elements from // a C-style array. // ValuesIn(const Container& container) // - returns a generator producing sequences with elements from // an STL-style container. // ValuesIn(Iterator begin, Iterator end) // - returns a generator producing sequences with elements from // a range [begin, end) defined by a pair of STL-style iterators. These // iterators can also be plain C pointers. // // Please note that ValuesIn copies the values from the containers // passed in and keeps them to generate tests in RUN_ALL_TESTS(). // // Examples: // // This instantiates tests from test case StringTest // each with C-string values of "foo", "bar", and "baz": // // const char* strings[] = {"foo", "bar", "baz"}; // INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); // // This instantiates tests from test case StlStringTest // each with STL strings with values "a" and "b": // // ::std::vector< ::std::string> GetParameterStrings() { // ::std::vector< ::std::string> v; // v.push_back("a"); // v.push_back("b"); // return v; // } // // INSTANTIATE_TEST_CASE_P(CharSequence, // StlStringTest, // ValuesIn(GetParameterStrings())); // // // This will also instantiate tests from CharTest // each with parameter values 'a' and 'b': // // ::std::list GetParameterChars() { // ::std::list list; // list.push_back('a'); // list.push_back('b'); // return list; // } // ::std::list l = GetParameterChars(); // INSTANTIATE_TEST_CASE_P(CharSequence2, // CharTest, // ValuesIn(l.begin(), l.end())); // template internal::ParamGenerator< typename ::testing::internal::IteratorTraits::value_type> ValuesIn(ForwardIterator begin, ForwardIterator end) { typedef typename ::testing::internal::IteratorTraits ::value_type ParamType; return internal::ParamGenerator( new internal::ValuesInIteratorRangeGenerator(begin, end)); } template internal::ParamGenerator ValuesIn(const T (&array)[N]) { return ValuesIn(array, array + N); } template internal::ParamGenerator ValuesIn( const Container& container) { return ValuesIn(container.begin(), container.end()); } // Values() allows generating tests from explicitly specified list of // parameters. // // Synopsis: // Values(T v1, T v2, ..., T vN) // - returns a generator producing sequences with elements v1, v2, ..., vN. // // For example, this instantiates tests from test case BarTest each // with values "one", "two", and "three": // // INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); // // This instantiates tests from test case BazTest each with values 1, 2, 3.5. // The exact type of values will depend on the type of parameter in BazTest. // // INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); // // Currently, Values() supports from 1 to 50 parameters. // template internal::ValueArray1 Values(T1 v1) { return internal::ValueArray1(v1); } template internal::ValueArray2 Values(T1 v1, T2 v2) { return internal::ValueArray2(v1, v2); } template internal::ValueArray3 Values(T1 v1, T2 v2, T3 v3) { return internal::ValueArray3(v1, v2, v3); } template internal::ValueArray4 Values(T1 v1, T2 v2, T3 v3, T4 v4) { return internal::ValueArray4(v1, v2, v3, v4); } template internal::ValueArray5 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) { return internal::ValueArray5(v1, v2, v3, v4, v5); } template internal::ValueArray6 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) { return internal::ValueArray6(v1, v2, v3, v4, v5, v6); } template internal::ValueArray7 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) { return internal::ValueArray7(v1, v2, v3, v4, v5, v6, v7); } template internal::ValueArray8 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) { return internal::ValueArray8(v1, v2, v3, v4, v5, v6, v7, v8); } template internal::ValueArray9 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) { return internal::ValueArray9(v1, v2, v3, v4, v5, v6, v7, v8, v9); } template internal::ValueArray10 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) { return internal::ValueArray10(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10); } template internal::ValueArray11 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11) { return internal::ValueArray11(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11); } template internal::ValueArray12 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12) { return internal::ValueArray12(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12); } template internal::ValueArray13 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13) { return internal::ValueArray13(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13); } template internal::ValueArray14 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) { return internal::ValueArray14(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14); } template internal::ValueArray15 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) { return internal::ValueArray15(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15); } template internal::ValueArray16 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) { return internal::ValueArray16(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16); } template internal::ValueArray17 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17) { return internal::ValueArray17(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17); } template internal::ValueArray18 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18) { return internal::ValueArray18(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18); } template internal::ValueArray19 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) { return internal::ValueArray19(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19); } template internal::ValueArray20 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) { return internal::ValueArray20(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20); } template internal::ValueArray21 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) { return internal::ValueArray21(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21); } template internal::ValueArray22 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) { return internal::ValueArray22(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22); } template internal::ValueArray23 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) { return internal::ValueArray23(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23); } template internal::ValueArray24 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) { return internal::ValueArray24(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24); } template internal::ValueArray25 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) { return internal::ValueArray25(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25); } template internal::ValueArray26 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26) { return internal::ValueArray26(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26); } template internal::ValueArray27 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27) { return internal::ValueArray27(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27); } template internal::ValueArray28 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28) { return internal::ValueArray28(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28); } template internal::ValueArray29 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29) { return internal::ValueArray29(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29); } template internal::ValueArray30 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) { return internal::ValueArray30(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30); } template internal::ValueArray31 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) { return internal::ValueArray31(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31); } template internal::ValueArray32 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) { return internal::ValueArray32(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32); } template internal::ValueArray33 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33) { return internal::ValueArray33(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33); } template internal::ValueArray34 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34) { return internal::ValueArray34(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34); } template internal::ValueArray35 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) { return internal::ValueArray35(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35); } template internal::ValueArray36 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) { return internal::ValueArray36(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36); } template internal::ValueArray37 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37) { return internal::ValueArray37(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37); } template internal::ValueArray38 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) { return internal::ValueArray38(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38); } template internal::ValueArray39 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) { return internal::ValueArray39(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39); } template internal::ValueArray40 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) { return internal::ValueArray40(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40); } template internal::ValueArray41 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) { return internal::ValueArray41(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41); } template internal::ValueArray42 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42) { return internal::ValueArray42(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42); } template internal::ValueArray43 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43) { return internal::ValueArray43(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43); } template internal::ValueArray44 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44) { return internal::ValueArray44(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44); } template internal::ValueArray45 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) { return internal::ValueArray45(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45); } template internal::ValueArray46 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) { return internal::ValueArray46(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46); } template internal::ValueArray47 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) { return internal::ValueArray47(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47); } template internal::ValueArray48 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) { return internal::ValueArray48(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48); } template internal::ValueArray49 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49) { return internal::ValueArray49(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49); } template internal::ValueArray50 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) { return internal::ValueArray50(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50); } // Bool() allows generating tests with parameters in a set of (false, true). // // Synopsis: // Bool() // - returns a generator producing sequences with elements {false, true}. // // It is useful when testing code that depends on Boolean flags. Combinations // of multiple flags can be tested when several Bool()'s are combined using // Combine() function. // // In the following example all tests in the test case FlagDependentTest // will be instantiated twice with parameters false and true. // // class FlagDependentTest : public testing::TestWithParam { // virtual void SetUp() { // external_flag = GetParam(); // } // } // INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); // inline internal::ParamGenerator Bool() { return Values(false, true); } # if GTEST_HAS_COMBINE // Combine() allows the user to combine two or more sequences to produce // values of a Cartesian product of those sequences' elements. // // Synopsis: // Combine(gen1, gen2, ..., genN) // - returns a generator producing sequences with elements coming from // the Cartesian product of elements from the sequences generated by // gen1, gen2, ..., genN. The sequence elements will have a type of // tuple where T1, T2, ..., TN are the types // of elements from sequences produces by gen1, gen2, ..., genN. // // Combine can have up to 10 arguments. This number is currently limited // by the maximum number of elements in the tuple implementation used by Google // Test. // // Example: // // This will instantiate tests in test case AnimalTest each one with // the parameter values tuple("cat", BLACK), tuple("cat", WHITE), // tuple("dog", BLACK), and tuple("dog", WHITE): // // enum Color { BLACK, GRAY, WHITE }; // class AnimalTest // : public testing::TestWithParam > {...}; // // TEST_P(AnimalTest, AnimalLooksNice) {...} // // INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, // Combine(Values("cat", "dog"), // Values(BLACK, WHITE))); // // This will instantiate tests in FlagDependentTest with all variations of two // Boolean flags: // // class FlagDependentTest // : public testing::TestWithParam > { // virtual void SetUp() { // // Assigns external_flag_1 and external_flag_2 values from the tuple. // tie(external_flag_1, external_flag_2) = GetParam(); // } // }; // // TEST_P(FlagDependentTest, TestFeature1) { // // Test your code using external_flag_1 and external_flag_2 here. // } // INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, // Combine(Bool(), Bool())); // template internal::CartesianProductHolder2 Combine( const Generator1& g1, const Generator2& g2) { return internal::CartesianProductHolder2( g1, g2); } template internal::CartesianProductHolder3 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3) { return internal::CartesianProductHolder3( g1, g2, g3); } template internal::CartesianProductHolder4 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4) { return internal::CartesianProductHolder4( g1, g2, g3, g4); } template internal::CartesianProductHolder5 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5) { return internal::CartesianProductHolder5( g1, g2, g3, g4, g5); } template internal::CartesianProductHolder6 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6) { return internal::CartesianProductHolder6( g1, g2, g3, g4, g5, g6); } template internal::CartesianProductHolder7 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7) { return internal::CartesianProductHolder7( g1, g2, g3, g4, g5, g6, g7); } template internal::CartesianProductHolder8 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8) { return internal::CartesianProductHolder8( g1, g2, g3, g4, g5, g6, g7, g8); } template internal::CartesianProductHolder9 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9) { return internal::CartesianProductHolder9( g1, g2, g3, g4, g5, g6, g7, g8, g9); } template internal::CartesianProductHolder10 Combine( const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9, const Generator10& g10) { return internal::CartesianProductHolder10( g1, g2, g3, g4, g5, g6, g7, g8, g9, g10); } # endif // GTEST_HAS_COMBINE # define TEST_P(test_case_name, test_name) \ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ : public test_case_name { \ public: \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ virtual void TestBody(); \ private: \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ #test_case_name, \ #test_name, \ new ::testing::internal::TestMetaFactory< \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ return 0; \ } \ static int gtest_registering_dummy_; \ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ }; \ int GTEST_TEST_CLASS_NAME_(test_case_name, \ test_name)::gtest_registering_dummy_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() # define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ ::testing::internal::ParamGenerator \ gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ int gtest_##prefix##test_case_name##_dummy_ = \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ #prefix, \ >est_##prefix##test_case_name##_EvalGenerator_, \ __FILE__, __LINE__) } // namespace testing #endif // GTEST_HAS_PARAM_TEST #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest-spi.h0000664000175000017500000002334013062445067017755 00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // // Utilities for testing Google Test itself and code that uses Google Test // (e.g. frameworks built on top of Google Test). #ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #include "gtest/gtest.h" namespace testing { // This helper class can be used to mock out Google Test failure reporting // so that we can test Google Test or code that builds on Google Test. // // An object of this class appends a TestPartResult object to the // TestPartResultArray object given in the constructor whenever a Google Test // failure is reported. It can either intercept only failures that are // generated in the same thread that created this object or it can intercept // all generated failures. The scope of this mock object can be controlled with // the second argument to the two arguments constructor. class GTEST_API_ ScopedFakeTestPartResultReporter : public TestPartResultReporterInterface { public: // The two possible mocking modes of this object. enum InterceptMode { INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. INTERCEPT_ALL_THREADS // Intercepts all failures. }; // The c'tor sets this object as the test part result reporter used // by Google Test. The 'result' parameter specifies where to report the // results. This reporter will only catch failures generated in the current // thread. DEPRECATED explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); // Same as above, but you can choose the interception scope of this object. ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, TestPartResultArray* result); // The d'tor restores the previous test part result reporter. virtual ~ScopedFakeTestPartResultReporter(); // Appends the TestPartResult object to the TestPartResultArray // received in the constructor. // // This method is from the TestPartResultReporterInterface // interface. virtual void ReportTestPartResult(const TestPartResult& result); private: void Init(); const InterceptMode intercept_mode_; TestPartResultReporterInterface* old_reporter_; TestPartResultArray* const result_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); }; namespace internal { // A helper class for implementing EXPECT_FATAL_FAILURE() and // EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. class GTEST_API_ SingleFailureChecker { public: // The constructor remembers the arguments. SingleFailureChecker(const TestPartResultArray* results, TestPartResult::Type type, const string& substr); ~SingleFailureChecker(); private: const TestPartResultArray* const results_; const TestPartResult::Type type_; const string substr_; GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); }; } // namespace internal } // namespace testing // A set of macros for testing Google Test assertions or code that's expected // to generate Google Test fatal failures. It verifies that the given // statement will cause exactly one fatal Google Test failure with 'substr' // being part of the failure message. // // There are two different versions of this macro. EXPECT_FATAL_FAILURE only // affects and considers failures generated in the current thread and // EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. // // The verification of the assertion is done correctly even when the statement // throws an exception or aborts the current function. // // Known restrictions: // - 'statement' cannot reference local non-static variables or // non-static members of the current object. // - 'statement' cannot return a value. // - You cannot stream a failure message to this macro. // // Note that even though the implementations of the following two // macros are much alike, we cannot refactor them to use a common // helper macro, due to some peculiarity in how the preprocessor // works. The AcceptsMacroThatExpandsToUnprotectedComma test in // gtest_unittest.cc will fail to compile if we do that. #define EXPECT_FATAL_FAILURE(statement, substr) \ do { \ class GTestExpectFatalFailureHelper {\ public:\ static void Execute() { statement; }\ };\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ GTestExpectFatalFailureHelper::Execute();\ }\ } while (::testing::internal::AlwaysFalse()) #define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ do { \ class GTestExpectFatalFailureHelper {\ public:\ static void Execute() { statement; }\ };\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ALL_THREADS, >est_failures);\ GTestExpectFatalFailureHelper::Execute();\ }\ } while (::testing::internal::AlwaysFalse()) // A macro for testing Google Test assertions or code that's expected to // generate Google Test non-fatal failures. It asserts that the given // statement will cause exactly one non-fatal Google Test failure with 'substr' // being part of the failure message. // // There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only // affects and considers failures generated in the current thread and // EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. // // 'statement' is allowed to reference local variables and members of // the current object. // // The verification of the assertion is done correctly even when the statement // throws an exception or aborts the current function. // // Known restrictions: // - You cannot stream a failure message to this macro. // // Note that even though the implementations of the following two // macros are much alike, we cannot refactor them to use a common // helper macro, due to some peculiarity in how the preprocessor // works. If we do that, the code won't compile when the user gives // EXPECT_NONFATAL_FAILURE() a statement that contains a macro that // expands to code containing an unprotected comma. The // AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc // catches that. // // For the same reason, we have to write // if (::testing::internal::AlwaysTrue()) { statement; } // instead of // GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) // to avoid an MSVC warning on unreachable code. #define EXPECT_NONFATAL_FAILURE(statement, substr) \ do {\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ if (::testing::internal::AlwaysTrue()) { statement; }\ }\ } while (::testing::internal::AlwaysFalse()) #define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ do {\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \ >est_failures);\ if (::testing::internal::AlwaysTrue()) { statement; }\ }\ } while (::testing::internal::AlwaysFalse()) #endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest-test-part.h0000664000175000017500000001455513062445067021115 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: mheule@google.com (Markus Heule) // #ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #include #include #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-string.h" namespace testing { // A copyable object representing the result of a test part (i.e. an // assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). // // Don't inherit from TestPartResult as its destructor is not virtual. class GTEST_API_ TestPartResult { public: // The possible outcomes of a test part (i.e. an assertion or an // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). enum Type { kSuccess, // Succeeded. kNonFatalFailure, // Failed but the test can continue. kFatalFailure // Failed and the test should be terminated. }; // C'tor. TestPartResult does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestPartResult object. TestPartResult(Type a_type, const char* a_file_name, int a_line_number, const char* a_message) : type_(a_type), file_name_(a_file_name == NULL ? "" : a_file_name), line_number_(a_line_number), summary_(ExtractSummary(a_message)), message_(a_message) { } // Gets the outcome of the test part. Type type() const { return type_; } // Gets the name of the source file where the test part took place, or // NULL if it's unknown. const char* file_name() const { return file_name_.empty() ? NULL : file_name_.c_str(); } // Gets the line in the source file where the test part took place, // or -1 if it's unknown. int line_number() const { return line_number_; } // Gets the summary of the failure message. const char* summary() const { return summary_.c_str(); } // Gets the message associated with the test part. const char* message() const { return message_.c_str(); } // Returns true iff the test part passed. bool passed() const { return type_ == kSuccess; } // Returns true iff the test part failed. bool failed() const { return type_ != kSuccess; } // Returns true iff the test part non-fatally failed. bool nonfatally_failed() const { return type_ == kNonFatalFailure; } // Returns true iff the test part fatally failed. bool fatally_failed() const { return type_ == kFatalFailure; } private: Type type_; // Gets the summary of the failure message by omitting the stack // trace in it. static std::string ExtractSummary(const char* message); // The name of the source file where the test part took place, or // "" if the source file is unknown. std::string file_name_; // The line in the source file where the test part took place, or -1 // if the line number is unknown. int line_number_; std::string summary_; // The test failure summary. std::string message_; // The test failure message. }; // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result); // An array of TestPartResult objects. // // Don't inherit from TestPartResultArray as its destructor is not // virtual. class GTEST_API_ TestPartResultArray { public: TestPartResultArray() {} // Appends the given TestPartResult to the array. void Append(const TestPartResult& result); // Returns the TestPartResult at the given index (0-based). const TestPartResult& GetTestPartResult(int index) const; // Returns the number of TestPartResult objects in the array. int size() const; private: std::vector array_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); }; // This interface knows how to report a test part result. class TestPartResultReporterInterface { public: virtual ~TestPartResultReporterInterface() {} virtual void ReportTestPartResult(const TestPartResult& result) = 0; }; namespace internal { // This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a // statement generates new fatal failures. To do so it registers itself as the // current test part result reporter. Besides checking if fatal failures were // reported, it only delegates the reporting to the former result reporter. // The original result reporter is restored in the destructor. // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. class GTEST_API_ HasNewFatalFailureHelper : public TestPartResultReporterInterface { public: HasNewFatalFailureHelper(); virtual ~HasNewFatalFailureHelper(); virtual void ReportTestPartResult(const TestPartResult& result); bool has_new_fatal_failure() const { return has_new_fatal_failure_; } private: bool has_new_fatal_failure_; TestPartResultReporterInterface* original_reporter_; GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); }; } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest-typed-test.h0000664000175000017500000002400213062445067021260 00000000000000// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ // This header implements typed tests and type-parameterized tests. // Typed (aka type-driven) tests repeat the same test for types in a // list. You must know which types you want to test with when writing // typed tests. Here's how you do it: #if 0 // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template class FooTest : public testing::Test { public: ... typedef std::list List; static T shared_; T value_; }; // Next, associate a list of types with the test case, which will be // repeated for each type in the list. The typedef is necessary for // the macro to parse correctly. typedef testing::Types MyTypes; TYPED_TEST_CASE(FooTest, MyTypes); // If the type list contains only one type, you can write that type // directly without Types<...>: // TYPED_TEST_CASE(FooTest, int); // Then, use TYPED_TEST() instead of TEST_F() to define as many typed // tests for this test case as you want. TYPED_TEST(FooTest, DoesBlah) { // Inside a test, refer to TypeParam to get the type parameter. // Since we are inside a derived class template, C++ requires use to // visit the members of FooTest via 'this'. TypeParam n = this->value_; // To visit static members of the fixture, add the TestFixture:: // prefix. n += TestFixture::shared_; // To refer to typedefs in the fixture, add the "typename // TestFixture::" prefix. typename TestFixture::List values; values.push_back(n); ... } TYPED_TEST(FooTest, HasPropertyA) { ... } #endif // 0 // Type-parameterized tests are abstract test patterns parameterized // by a type. Compared with typed tests, type-parameterized tests // allow you to define the test pattern without knowing what the type // parameters are. The defined pattern can be instantiated with // different types any number of times, in any number of translation // units. // // If you are designing an interface or concept, you can define a // suite of type-parameterized tests to verify properties that any // valid implementation of the interface/concept should have. Then, // each implementation can easily instantiate the test suite to verify // that it conforms to the requirements, without having to write // similar tests repeatedly. Here's an example: #if 0 // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template class FooTest : public testing::Test { ... }; // Next, declare that you will define a type-parameterized test case // (the _P suffix is for "parameterized" or "pattern", whichever you // prefer): TYPED_TEST_CASE_P(FooTest); // Then, use TYPED_TEST_P() to define as many type-parameterized tests // for this type-parameterized test case as you want. TYPED_TEST_P(FooTest, DoesBlah) { // Inside a test, refer to TypeParam to get the type parameter. TypeParam n = 0; ... } TYPED_TEST_P(FooTest, HasPropertyA) { ... } // Now the tricky part: you need to register all test patterns before // you can instantiate them. The first argument of the macro is the // test case name; the rest are the names of the tests in this test // case. REGISTER_TYPED_TEST_CASE_P(FooTest, DoesBlah, HasPropertyA); // Finally, you are free to instantiate the pattern with the types you // want. If you put the above code in a header file, you can #include // it in multiple C++ source files and instantiate it multiple times. // // To distinguish different instances of the pattern, the first // argument to the INSTANTIATE_* macro is a prefix that will be added // to the actual test case name. Remember to pick unique prefixes for // different instances. typedef testing::Types MyTypes; INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes); // If the type list contains only one type, you can write that type // directly without Types<...>: // INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int); #endif // 0 #include "gtest/internal/gtest-port.h" #include "gtest/internal/gtest-type-util.h" // Implements typed tests. #if GTEST_HAS_TYPED_TEST // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the typedef for the type parameters of the // given test case. # define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_ // The 'Types' template argument below must have spaces around it // since some compilers may choke on '>>' when passing a template // instance (e.g. Types) # define TYPED_TEST_CASE(CaseName, Types) \ typedef ::testing::internal::TypeList< Types >::type \ GTEST_TYPE_PARAMS_(CaseName) # define TYPED_TEST(CaseName, TestName) \ template \ class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ : public CaseName { \ private: \ typedef CaseName TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ virtual void TestBody(); \ }; \ bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::internal::TypeParameterizedTest< \ CaseName, \ ::testing::internal::TemplateSel< \ GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \ GTEST_TYPE_PARAMS_(CaseName)>::Register(\ "", #CaseName, #TestName, 0); \ template \ void GTEST_TEST_CLASS_NAME_(CaseName, TestName)::TestBody() #endif // GTEST_HAS_TYPED_TEST // Implements type-parameterized tests. #if GTEST_HAS_TYPED_TEST_P // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the namespace name that the type-parameterized tests for // the given type-parameterized test case are defined in. The exact // name of the namespace is subject to change without notice. # define GTEST_CASE_NAMESPACE_(TestCaseName) \ gtest_case_##TestCaseName##_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the variable used to remember the names of // the defined tests in the given test case. # define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \ gtest_typed_test_case_p_state_##TestCaseName##_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY. // // Expands to the name of the variable used to remember the names of // the registered tests in the given test case. # define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \ gtest_registered_test_names_##TestCaseName##_ // The variables defined in the type-parameterized test macros are // static as typically these macros are used in a .h file that can be // #included in multiple translation units linked together. # define TYPED_TEST_CASE_P(CaseName) \ static ::testing::internal::TypedTestCasePState \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName) # define TYPED_TEST_P(CaseName, TestName) \ namespace GTEST_CASE_NAMESPACE_(CaseName) { \ template \ class TestName : public CaseName { \ private: \ typedef CaseName TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ virtual void TestBody(); \ }; \ static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\ __FILE__, __LINE__, #CaseName, #TestName); \ } \ template \ void GTEST_CASE_NAMESPACE_(CaseName)::TestName::TestBody() # define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \ namespace GTEST_CASE_NAMESPACE_(CaseName) { \ typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ } \ static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\ __FILE__, __LINE__, #__VA_ARGS__) // The 'Types' template argument below must have spaces around it // since some compilers may choke on '>>' when passing a template // instance (e.g. Types) # define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \ bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::internal::TypeParameterizedTestCase::type>::Register(\ #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName)) #endif // GTEST_HAS_TYPED_TEST_P #endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ stimfit-0.15.8/src/test/gtest/include/gtest/gtest-printers.h0000664000175000017500000007557113062445067021045 00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wan@google.com (Zhanyong Wan) // Google Test - The Google C++ Testing Framework // // This file implements a universal value printer that can print a // value of any type T: // // void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); // // A user can teach this function how to print a class type T by // defining either operator<<() or PrintTo() in the namespace that // defines T. More specifically, the FIRST defined function in the // following list will be used (assuming T is defined in namespace // foo): // // 1. foo::PrintTo(const T&, ostream*) // 2. operator<<(ostream&, const T&) defined in either foo or the // global namespace. // // If none of the above is defined, it will print the debug string of // the value if it is a protocol buffer, or print the raw bytes in the // value otherwise. // // To aid debugging: when T is a reference type, the address of the // value is also printed; when T is a (const) char pointer, both the // pointer value and the NUL-terminated string it points to are // printed. // // We also provide some convenient wrappers: // // // Prints a value to a string. For a (const or not) char // // pointer, the NUL-terminated string (but not the pointer) is // // printed. // std::string ::testing::PrintToString(const T& value); // // // Prints a value tersely: for a reference type, the referenced // // value (but not the address) is printed; for a (const or not) char // // pointer, the NUL-terminated string (but not the pointer) is // // printed. // void ::testing::internal::UniversalTersePrint(const T& value, ostream*); // // // Prints value using the type inferred by the compiler. The difference // // from UniversalTersePrint() is that this function prints both the // // pointer and the NUL-terminated string for a (const or not) char pointer. // void ::testing::internal::UniversalPrint(const T& value, ostream*); // // // Prints the fields of a tuple tersely to a string vector, one // // element for each field. Tuple support must be enabled in // // gtest-port.h. // std::vector UniversalTersePrintTupleFieldsToStrings( // const Tuple& value); // // Known limitation: // // The print primitives print the elements of an STL-style container // using the compiler-inferred type of *iter where iter is a // const_iterator of the container. When const_iterator is an input // iterator but not a forward iterator, this inferred type may not // match value_type, and the print output may be incorrect. In // practice, this is rarely a problem as for most containers // const_iterator is a forward iterator. We'll fix this if there's an // actual need for it. Note that this fix cannot rely on value_type // being defined as many user-defined container types don't have // value_type. #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #include // NOLINT #include #include #include #include #include "gtest/internal/gtest-port.h" #include "gtest/internal/gtest-internal.h" namespace testing { // Definitions in the 'internal' and 'internal2' name spaces are // subject to change without notice. DO NOT USE THEM IN USER CODE! namespace internal2 { // Prints the given number of bytes in the given object to the given // ostream. GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, ::std::ostream* os); // For selecting which printer to use when a given type has neither << // nor PrintTo(). enum TypeKind { kProtobuf, // a protobuf type kConvertibleToInteger, // a type implicitly convertible to BiggestInt // (e.g. a named or unnamed enum type) kOtherType // anything else }; // TypeWithoutFormatter::PrintValue(value, os) is called // by the universal printer to print a value of type T when neither // operator<< nor PrintTo() is defined for T, where kTypeKind is the // "kind" of T as defined by enum TypeKind. template class TypeWithoutFormatter { public: // This default version is called when kTypeKind is kOtherType. static void PrintValue(const T& value, ::std::ostream* os) { PrintBytesInObjectTo(reinterpret_cast(&value), sizeof(value), os); } }; // We print a protobuf using its ShortDebugString() when the string // doesn't exceed this many characters; otherwise we print it using // DebugString() for better readability. const size_t kProtobufOneLinerMaxLength = 50; template class TypeWithoutFormatter { public: static void PrintValue(const T& value, ::std::ostream* os) { const ::testing::internal::string short_str = value.ShortDebugString(); const ::testing::internal::string pretty_str = short_str.length() <= kProtobufOneLinerMaxLength ? short_str : ("\n" + value.DebugString()); *os << ("<" + pretty_str + ">"); } }; template class TypeWithoutFormatter { public: // Since T has no << operator or PrintTo() but can be implicitly // converted to BiggestInt, we print it as a BiggestInt. // // Most likely T is an enum type (either named or unnamed), in which // case printing it as an integer is the desired behavior. In case // T is not an enum, printing it as an integer is the best we can do // given that it has no user-defined printer. static void PrintValue(const T& value, ::std::ostream* os) { const internal::BiggestInt kBigInt = value; *os << kBigInt; } }; // Prints the given value to the given ostream. If the value is a // protocol message, its debug string is printed; if it's an enum or // of a type implicitly convertible to BiggestInt, it's printed as an // integer; otherwise the bytes in the value are printed. This is // what UniversalPrinter::Print() does when it knows nothing about // type T and T has neither << operator nor PrintTo(). // // A user can override this behavior for a class type Foo by defining // a << operator in the namespace where Foo is defined. // // We put this operator in namespace 'internal2' instead of 'internal' // to simplify the implementation, as much code in 'internal' needs to // use << in STL, which would conflict with our own << were it defined // in 'internal'. // // Note that this operator<< takes a generic std::basic_ostream type instead of the more restricted std::ostream. If // we define it to take an std::ostream instead, we'll get an // "ambiguous overloads" compiler error when trying to print a type // Foo that supports streaming to std::basic_ostream, as the compiler cannot tell whether // operator<<(std::ostream&, const T&) or // operator<<(std::basic_stream, const Foo&) is more // specific. template ::std::basic_ostream& operator<<( ::std::basic_ostream& os, const T& x) { TypeWithoutFormatter::value ? kProtobuf : internal::ImplicitlyConvertible::value ? kConvertibleToInteger : kOtherType)>::PrintValue(x, &os); return os; } } // namespace internal2 } // namespace testing // This namespace MUST NOT BE NESTED IN ::testing, or the name look-up // magic needed for implementing UniversalPrinter won't work. namespace testing_internal { // Used to print a value that is not an STL-style container when the // user doesn't define PrintTo() for it. template void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { // With the following statement, during unqualified name lookup, // testing::internal2::operator<< appears as if it was declared in // the nearest enclosing namespace that contains both // ::testing_internal and ::testing::internal2, i.e. the global // namespace. For more details, refer to the C++ Standard section // 7.3.4-1 [namespace.udir]. This allows us to fall back onto // testing::internal2::operator<< in case T doesn't come with a << // operator. // // We cannot write 'using ::testing::internal2::operator<<;', which // gcc 3.3 fails to compile due to a compiler bug. using namespace ::testing::internal2; // NOLINT // Assuming T is defined in namespace foo, in the next statement, // the compiler will consider all of: // // 1. foo::operator<< (thanks to Koenig look-up), // 2. ::operator<< (as the current namespace is enclosed in ::), // 3. testing::internal2::operator<< (thanks to the using statement above). // // The operator<< whose type matches T best will be picked. // // We deliberately allow #2 to be a candidate, as sometimes it's // impossible to define #1 (e.g. when foo is ::std, defining // anything in it is undefined behavior unless you are a compiler // vendor.). *os << value; } } // namespace testing_internal namespace testing { namespace internal { // UniversalPrinter::Print(value, ostream_ptr) prints the given // value to the given ostream. The caller must ensure that // 'ostream_ptr' is not NULL, or the behavior is undefined. // // We define UniversalPrinter as a class template (as opposed to a // function template), as we need to partially specialize it for // reference types, which cannot be done with function templates. template class UniversalPrinter; template void UniversalPrint(const T& value, ::std::ostream* os); // Used to print an STL-style container when the user doesn't define // a PrintTo() for it. template void DefaultPrintTo(IsContainer /* dummy */, false_type /* is not a pointer */, const C& container, ::std::ostream* os) { const size_t kMaxCount = 32; // The maximum number of elements to print. *os << '{'; size_t count = 0; for (typename C::const_iterator it = container.begin(); it != container.end(); ++it, ++count) { if (count > 0) { *os << ','; if (count == kMaxCount) { // Enough has been printed. *os << " ..."; break; } } *os << ' '; // We cannot call PrintTo(*it, os) here as PrintTo() doesn't // handle *it being a native array. internal::UniversalPrint(*it, os); } if (count > 0) { *os << ' '; } *os << '}'; } // Used to print a pointer that is neither a char pointer nor a member // pointer, when the user doesn't define PrintTo() for it. (A member // variable pointer or member function pointer doesn't really point to // a location in the address space. Their representation is // implementation-defined. Therefore they will be printed as raw // bytes.) template void DefaultPrintTo(IsNotContainer /* dummy */, true_type /* is a pointer */, T* p, ::std::ostream* os) { if (p == NULL) { *os << "NULL"; } else { // C++ doesn't allow casting from a function pointer to any object // pointer. // // IsTrue() silences warnings: "Condition is always true", // "unreachable code". if (IsTrue(ImplicitlyConvertible::value)) { // T is not a function type. We just call << to print p, // relying on ADL to pick up user-defined << for their pointer // types, if any. *os << p; } else { // T is a function type, so '*os << p' doesn't do what we want // (it just prints p as bool). We want to print p as a const // void*. However, we cannot cast it to const void* directly, // even using reinterpret_cast, as earlier versions of gcc // (e.g. 3.4.5) cannot compile the cast when p is a function // pointer. Casting to UInt64 first solves the problem. *os << reinterpret_cast( reinterpret_cast(p)); } } } // Used to print a non-container, non-pointer value when the user // doesn't define PrintTo() for it. template void DefaultPrintTo(IsNotContainer /* dummy */, false_type /* is not a pointer */, const T& value, ::std::ostream* os) { ::testing_internal::DefaultPrintNonContainerTo(value, os); } // Prints the given value using the << operator if it has one; // otherwise prints the bytes in it. This is what // UniversalPrinter::Print() does when PrintTo() is not specialized // or overloaded for type T. // // A user can override this behavior for a class type Foo by defining // an overload of PrintTo() in the namespace where Foo is defined. We // give the user this option as sometimes defining a << operator for // Foo is not desirable (e.g. the coding style may prevent doing it, // or there is already a << operator but it doesn't do what the user // wants). template void PrintTo(const T& value, ::std::ostream* os) { // DefaultPrintTo() is overloaded. The type of its first two // arguments determine which version will be picked. If T is an // STL-style container, the version for container will be called; if // T is a pointer, the pointer version will be called; otherwise the // generic version will be called. // // Note that we check for container types here, prior to we check // for protocol message types in our operator<<. The rationale is: // // For protocol messages, we want to give people a chance to // override Google Mock's format by defining a PrintTo() or // operator<<. For STL containers, other formats can be // incompatible with Google Mock's format for the container // elements; therefore we check for container types here to ensure // that our format is used. // // The second argument of DefaultPrintTo() is needed to bypass a bug // in Symbian's C++ compiler that prevents it from picking the right // overload between: // // PrintTo(const T& x, ...); // PrintTo(T* x, ...); DefaultPrintTo(IsContainerTest(0), is_pointer(), value, os); } // The following list of PrintTo() overloads tells // UniversalPrinter::Print() how to print standard types (built-in // types, strings, plain arrays, and pointers). // Overloads for various char types. GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os); GTEST_API_ void PrintTo(signed char c, ::std::ostream* os); inline void PrintTo(char c, ::std::ostream* os) { // When printing a plain char, we always treat it as unsigned. This // way, the output won't be affected by whether the compiler thinks // char is signed or not. PrintTo(static_cast(c), os); } // Overloads for other simple built-in types. inline void PrintTo(bool x, ::std::ostream* os) { *os << (x ? "true" : "false"); } // Overload for wchar_t type. // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its decimal code (except for L'\0'). // The L'\0' char is printed as "L'\\0'". The decimal code is printed // as signed integer when wchar_t is implemented by the compiler // as a signed type and is printed as an unsigned integer when wchar_t // is implemented as an unsigned type. GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); // Overloads for C strings. GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); inline void PrintTo(char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } // signed/unsigned char is often used for representing binary data, so // we print pointers to it as void* to be safe. inline void PrintTo(const signed char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } inline void PrintTo(signed char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } inline void PrintTo(const unsigned char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } inline void PrintTo(unsigned char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } // MSVC can be configured to define wchar_t as a typedef of unsigned // short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native // type. When wchar_t is a typedef, defining an overload for const // wchar_t* would cause unsigned short* be printed as a wide string, // possibly causing invalid memory accesses. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Overloads for wide C strings GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os); inline void PrintTo(wchar_t* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } #endif // Overload for C arrays. Multi-dimensional arrays are printed // properly. // Prints the given number of elements in an array, without printing // the curly braces. template void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) { UniversalPrint(a[0], os); for (size_t i = 1; i != count; i++) { *os << ", "; UniversalPrint(a[i], os); } } // Overloads for ::string and ::std::string. #if GTEST_HAS_GLOBAL_STRING GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os); inline void PrintTo(const ::string& s, ::std::ostream* os) { PrintStringTo(s, os); } #endif // GTEST_HAS_GLOBAL_STRING GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os); inline void PrintTo(const ::std::string& s, ::std::ostream* os) { PrintStringTo(s, os); } // Overloads for ::wstring and ::std::wstring. #if GTEST_HAS_GLOBAL_WSTRING GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os); inline void PrintTo(const ::wstring& s, ::std::ostream* os) { PrintWideStringTo(s, os); } #endif // GTEST_HAS_GLOBAL_WSTRING #if GTEST_HAS_STD_WSTRING GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { PrintWideStringTo(s, os); } #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_TR1_TUPLE // Overload for ::std::tr1::tuple. Needed for printing function arguments, // which are packed as tuples. // Helper function for printing a tuple. T must be instantiated with // a tuple type. template void PrintTupleTo(const T& t, ::std::ostream* os); // Overloaded PrintTo() for tuples of various arities. We support // tuples of up-to 10 fields. The following implementation works // regardless of whether tr1::tuple is implemented using the // non-standard variadic template feature or not. inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo(const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } template void PrintTo( const ::std::tr1::tuple& t, ::std::ostream* os) { PrintTupleTo(t, os); } #endif // GTEST_HAS_TR1_TUPLE // Overload for std::pair. template void PrintTo(const ::std::pair& value, ::std::ostream* os) { *os << '('; // We cannot use UniversalPrint(value.first, os) here, as T1 may be // a reference type. The same for printing value.second. UniversalPrinter::Print(value.first, os); *os << ", "; UniversalPrinter::Print(value.second, os); *os << ')'; } // Implements printing a non-reference type T by letting the compiler // pick the right overload of PrintTo() for T. template class UniversalPrinter { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4180) // Temporarily disables warning 4180. #endif // _MSC_VER // Note: we deliberately don't call this PrintTo(), as that name // conflicts with ::testing::internal::PrintTo in the body of the // function. static void Print(const T& value, ::std::ostream* os) { // By default, ::testing::internal::PrintTo() is used for printing // the value. // // Thanks to Koenig look-up, if T is a class and has its own // PrintTo() function defined in its namespace, that function will // be visible here. Since it is more specific than the generic ones // in ::testing::internal, it will be picked by the compiler in the // following statement - exactly what we want. PrintTo(value, os); } #ifdef _MSC_VER # pragma warning(pop) // Restores the warning state. #endif // _MSC_VER }; // UniversalPrintArray(begin, len, os) prints an array of 'len' // elements, starting at address 'begin'. template void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) { if (len == 0) { *os << "{}"; } else { *os << "{ "; const size_t kThreshold = 18; const size_t kChunkSize = 8; // If the array has more than kThreshold elements, we'll have to // omit some details by printing only the first and the last // kChunkSize elements. // TODO(wan@google.com): let the user control the threshold using a flag. if (len <= kThreshold) { PrintRawArrayTo(begin, len, os); } else { PrintRawArrayTo(begin, kChunkSize, os); *os << ", ..., "; PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os); } *os << " }"; } } // This overload prints a (const) char array compactly. GTEST_API_ void UniversalPrintArray( const char* begin, size_t len, ::std::ostream* os); // This overload prints a (const) wchar_t array compactly. GTEST_API_ void UniversalPrintArray( const wchar_t* begin, size_t len, ::std::ostream* os); // Implements printing an array type T[N]. template class UniversalPrinter { public: // Prints the given array, omitting some elements when there are too // many. static void Print(const T (&a)[N], ::std::ostream* os) { UniversalPrintArray(a, N, os); } }; // Implements printing a reference type T&. template class UniversalPrinter { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. #ifdef _MSC_VER # pragma warning(push) // Saves the current warning state. # pragma warning(disable:4180) // Temporarily disables warning 4180. #endif // _MSC_VER static void Print(const T& value, ::std::ostream* os) { // Prints the address of the value. We use reinterpret_cast here // as static_cast doesn't compile when T is a function type. *os << "@" << reinterpret_cast(&value) << " "; // Then prints the value itself. UniversalPrint(value, os); } #ifdef _MSC_VER # pragma warning(pop) // Restores the warning state. #endif // _MSC_VER }; // Prints a value tersely: for a reference type, the referenced value // (but not the address) is printed; for a (const) char pointer, the // NUL-terminated string (but not the pointer) is printed. template class UniversalTersePrinter { public: static void Print(const T& value, ::std::ostream* os) { UniversalPrint(value, os); } }; template class UniversalTersePrinter { public: static void Print(const T& value, ::std::ostream* os) { UniversalPrint(value, os); } }; template class UniversalTersePrinter { public: static void Print(const T (&value)[N], ::std::ostream* os) { UniversalPrinter::Print(value, os); } }; template <> class UniversalTersePrinter { public: static void Print(const char* str, ::std::ostream* os) { if (str == NULL) { *os << "NULL"; } else { UniversalPrint(string(str), os); } } }; template <> class UniversalTersePrinter { public: static void Print(char* str, ::std::ostream* os) { UniversalTersePrinter::Print(str, os); } }; #if GTEST_HAS_STD_WSTRING template <> class UniversalTersePrinter { public: static void Print(const wchar_t* str, ::std::ostream* os) { if (str == NULL) { *os << "NULL"; } else { UniversalPrint(::std::wstring(str), os); } } }; #endif template <> class UniversalTersePrinter { public: static void Print(wchar_t* str, ::std::ostream* os) { UniversalTersePrinter::Print(str, os); } }; template void UniversalTersePrint(const T& value, ::std::ostream* os) { UniversalTersePrinter::Print(value, os); } // Prints a value using the type inferred by the compiler. The // difference between this and UniversalTersePrint() is that for a // (const) char pointer, this prints both the pointer and the // NUL-terminated string. template void UniversalPrint(const T& value, ::std::ostream* os) { // A workarond for the bug in VC++ 7.1 that prevents us from instantiating // UniversalPrinter with T directly. typedef T T1; UniversalPrinter::Print(value, os); } #if GTEST_HAS_TR1_TUPLE typedef ::std::vector Strings; // This helper template allows PrintTo() for tuples and // UniversalTersePrintTupleFieldsToStrings() to be defined by // induction on the number of tuple fields. The idea is that // TuplePrefixPrinter::PrintPrefixTo(t, os) prints the first N // fields in tuple t, and can be defined in terms of // TuplePrefixPrinter. // The inductive case. template struct TuplePrefixPrinter { // Prints the first N fields of a tuple. template static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { TuplePrefixPrinter::PrintPrefixTo(t, os); *os << ", "; UniversalPrinter::type> ::Print(::std::tr1::get(t), os); } // Tersely prints the first N fields of a tuple to a string vector, // one element for each field. template static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { TuplePrefixPrinter::TersePrintPrefixToStrings(t, strings); ::std::stringstream ss; UniversalTersePrint(::std::tr1::get(t), &ss); strings->push_back(ss.str()); } }; // Base cases. template <> struct TuplePrefixPrinter<0> { template static void PrintPrefixTo(const Tuple&, ::std::ostream*) {} template static void TersePrintPrefixToStrings(const Tuple&, Strings*) {} }; // We have to specialize the entire TuplePrefixPrinter<> class // template here, even though the definition of // TersePrintPrefixToStrings() is the same as the generic version, as // Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't // support specializing a method template of a class template. template <> struct TuplePrefixPrinter<1> { template static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) { UniversalPrinter::type>:: Print(::std::tr1::get<0>(t), os); } template static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) { ::std::stringstream ss; UniversalTersePrint(::std::tr1::get<0>(t), &ss); strings->push_back(ss.str()); } }; // Helper function for printing a tuple. T must be instantiated with // a tuple type. template void PrintTupleTo(const T& t, ::std::ostream* os) { *os << "("; TuplePrefixPrinter< ::std::tr1::tuple_size::value>:: PrintPrefixTo(t, os); *os << ")"; } // Prints the fields of a tuple tersely to a string vector, one // element for each field. See the comment before // UniversalTersePrint() for how we define "tersely". template Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { Strings result; TuplePrefixPrinter< ::std::tr1::tuple_size::value>:: TersePrintPrefixToStrings(value, &result); return result; } #endif // GTEST_HAS_TR1_TUPLE } // namespace internal template ::std::string PrintToString(const T& value) { ::std::stringstream ss; internal::UniversalTersePrinter::Print(value, &ss); return ss.str(); } } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ stimfit-0.15.8/src/test/gtest/CHANGES0000664000175000017500000001476513062445067014122 00000000000000Changes for 1.7.0: * New feature: death tests are supported on OpenBSD and in iOS simulator now. * New feature: Google Test now implements a protocol to allow a test runner to detect that a test program has exited prematurely and report it as a failure (before it would be falsely reported as a success if the exit code is 0). * New feature: Test::RecordProperty() can now be used outside of the lifespan of a test method, in which case it will be attributed to the current test case or the test program in the XML report. * New feature (potentially breaking): --gtest_list_tests now prints the type parameters and value parameters for each test. * Improvement: char pointers and char arrays are now escaped properly in failure messages. * Improvement: failure summary in XML reports now includes file and line information. * Improvement: the XML element now has a timestamp attribute. * Improvement: When --gtest_filter is specified, XML report now doesn't contain information about tests that are filtered out. * Fixed the bug where long --gtest_filter flag values are truncated in death tests. * Potentially breaking change: RUN_ALL_TESTS() is now implemented as a function instead of a macro in order to work better with Clang. * Compatibility fixes with C++ 11 and various platforms. * Bug/warning fixes. Changes for 1.6.0: * New feature: ADD_FAILURE_AT() for reporting a test failure at the given source location -- useful for writing testing utilities. * New feature: the universal value printer is moved from Google Mock to Google Test. * New feature: type parameters and value parameters are reported in the XML report now. * A gtest_disable_pthreads CMake option. * Colored output works in GNU Screen sessions now. * Parameters of value-parameterized tests are now printed in the textual output. * Failures from ad hoc test assertions run before RUN_ALL_TESTS() are now correctly reported. * Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to ostream. * More complete handling of exceptions. * GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter name is already used by another library. * --gtest_catch_exceptions is now true by default, allowing a test program to continue after an exception is thrown. * Value-parameterized test fixtures can now derive from Test and WithParamInterface separately, easing conversion of legacy tests. * Death test messages are clearly marked to make them more distinguishable from other messages. * Compatibility fixes for Android, Google Native Client, MinGW, HP UX, PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear), IBM XL C++ (Visual Age C++), and C++0x. * Bug fixes and implementation clean-ups. * Potentially incompatible changes: disables the harmful 'make install' command in autotools. Changes for 1.5.0: * New feature: assertions can be safely called in multiple threads where the pthreads library is available. * New feature: predicates used inside EXPECT_TRUE() and friends can now generate custom failure messages. * New feature: Google Test can now be compiled as a DLL. * New feature: fused source files are included. * New feature: prints help when encountering unrecognized Google Test flags. * Experimental feature: CMake build script (requires CMake 2.6.4+). * Experimental feature: the Pump script for meta programming. * double values streamed to an assertion are printed with enough precision to differentiate any two different values. * Google Test now works on Solaris and AIX. * Build and test script improvements. * Bug fixes and implementation clean-ups. Potentially breaking changes: * Stopped supporting VC++ 7.1 with exceptions disabled. * Dropped support for 'make install'. Changes for 1.4.0: * New feature: the event listener API * New feature: test shuffling * New feature: the XML report format is closer to junitreport and can be parsed by Hudson now. * New feature: when a test runs under Visual Studio, its failures are integrated in the IDE. * New feature: /MD(d) versions of VC++ projects. * New feature: elapsed time for the tests is printed by default. * New feature: comes with a TR1 tuple implementation such that Boost is no longer needed for Combine(). * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends. * New feature: the Xcode project can now produce static gtest libraries in addition to a framework. * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile, Symbian, gcc, and C++Builder. * Bug fixes and implementation clean-ups. Changes for 1.3.0: * New feature: death tests on Windows, Cygwin, and Mac. * New feature: ability to use Google Test assertions in other testing frameworks. * New feature: ability to run disabled test via --gtest_also_run_disabled_tests. * New feature: the --help flag for printing the usage. * New feature: access to Google Test flag values in user code. * New feature: a script that packs Google Test into one .h and one .cc file for easy deployment. * New feature: support for distributing test functions to multiple machines (requires support from the test runner). * Bug fixes and implementation clean-ups. Changes for 1.2.1: * Compatibility fixes for Linux IA-64 and IBM z/OS. * Added support for using Boost and other TR1 implementations. * Changes to the build scripts to support upcoming release of Google C++ Mocking Framework. * Added Makefile to the distribution package. * Improved build instructions in README. Changes for 1.2.0: * New feature: value-parameterized tests. * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS) macros. * Changed the XML report format to match JUnit/Ant's. * Added tests to the Xcode project. * Added scons/SConscript for building with SCons. * Added src/gtest-all.cc for building Google Test from a single file. * Fixed compatibility with Solaris and z/OS. * Enabled running Python tests on systems with python 2.3 installed, e.g. Mac OS X 10.4. * Bug fixes. Changes for 1.1.0: * New feature: type-parameterized tests. * New feature: exception assertions. * New feature: printing elapsed time of tests. * Improved the robustness of death tests. * Added an Xcode project and samples. * Adjusted the output format on Windows to be understandable by Visual Studio. * Minor bug fixes. Changes for 1.0.1: * Added project files for Visual Studio 7.1. * Fixed issues with compiling on Mac OS X. * Fixed issues with compiling on Cygwin. Changes for 1.0.0: * Initial Open Source release of Google Test stimfit-0.15.8/src/test/section.cpp0000664000175000017500000000123413062445067014134 00000000000000#include "../libstfio/stfio.h" #include TEST(Section_test, constructors) { Section sec0; EXPECT_EQ( sec0.size(), 0 ); Section sec1(Vector_double(32768, 0), "Test section"); EXPECT_EQ( sec1.size(), 32768 ); Section sec2(32768, "Test section"); EXPECT_EQ( sec2.size(), 32768 ); } TEST(Section_test, data_access) { Section sec1(Vector_double(32768, 0), "Test section"); EXPECT_EQ( sec1[sec1.size()-1], 0 ); EXPECT_THROW( sec1.at( sec1.size() ), std::out_of_range ); Section sec2(32768, "Test section"); EXPECT_EQ( sec2[sec2.size()-1], 0 ); EXPECT_THROW( sec2.at( sec2.size() ), std::out_of_range ); } stimfit-0.15.8/src/stimfit/0000775000175000017500000000000013315356572012547 500000000000000stimfit-0.15.8/src/stimfit/py/0000775000175000017500000000000013315356572013177 500000000000000stimfit-0.15.8/src/stimfit/py/extensions.py0000664000175000017500000000216313062445067015667 00000000000000""" User-defined Python extensions that can be called from the menu. """ import spells # class to create a submenu of Extensions class Extension(object): """ A Python extension that can be added as a submenu in the Extensions menu of Stimfit. """ def __init__(self, menuEntryString, pyFunc, description="", requiresFile=True, parentEntry=None): """ Arguments: menuEntryString -- This will be shown as a menu entry. pyFunc -- The Python function that is to be called. Takes no arguments and returns a boolean. description -- A more verbose description of the function. requiresFile -- Whether pyFunc requires a file to be opened. """ self.menuEntryString = menuEntryString self.pyFunc = pyFunc self.description = description self.requiresFile = requiresFile self.parentEntry = parentEntry # define an Extension: it will appear as a submenu in the Extensions Menu myExt = Extension("Count APs", spells.count_aps, "Count events >0 mV in selected files", True) extensionList = [myExt,] stimfit-0.15.8/src/stimfit/py/mintools.py0000775000175000017500000000200413062445067015331 00000000000000""" 2008-04-11, C. Schmidt-Hieber Some helper functions for least-squares mimization using SciPy """ from scipy.optimize import leastsq import numpy as np import stf def fexpbde(p,x): tpeak = p[3]*p[1]*np.log(p[3]/p[1])/(p[3]-p[1]) adjust = 1.0/((1.0-np.exp(-tpeak/p[3]))-(1.0-np.exp(-tpeak/p[1]))); e1=np.exp((p[0]-x)/p[1]); e2=np.exp((p[0]-x)/p[3]); # normalize the amplitude so that the peak really is the peak: ret = adjust*p[2]*e1 - adjust*p[2]*e2 + stf.get_base(); start_index = 0 for elem in x: if ( elem < p[0] ): start_index = start_index+1 else: break ret[ 0 : start_index ] = stf.get_base() return ret def leastsq_stf(p,y,lsfunc,x): return y - lsfunc(p,x) def stf_fit( p0, lsfunc ): data = stf.get_trace()[ stf.get_fit_start() : stf.get_fit_end() ] dt = stf.get_sampling_interval() x = np.arange(0, len(data)*dt, dt) plsq = leastsq(leastsq_stf, p0, args=(data, lsfunc, x)) return plsq[0] stimfit-0.15.8/src/stimfit/py/natools.py0000775000175000017500000004457513062445067015167 00000000000000""" 2008-04-11, C. Schmidt-Hieber Batch analysis of Na IVs """ import numpy as np from scipy.io import write_array def dens_batch( nFunc = 0 ): """Fits activation and inactivation of 15 iv pulses using a biexponential funtion with a delay, creates a table showing the results. Keyword argument: nFunc -- Index of function used for fitting. At present, 10 is the HH gNa function, 5 is a sum of two exponentials with a delay.""" stf = __import__("stf") # Some ugly definitions for the time being gFitStart = 70.56 gFSelect = nFunc # HH function gDictSize = stf.leastsq_param_size( gFSelect ) + 2 # Parameters, chisqr, peak value gBaseStartCtrl = 69.5 # Start and end of the baseline before the control pulse, in ms gBaseEndCtrl = 70.5 gPeakStartCtrl = 70.64 # Start and end of the peak cursors for the control pulse, in ms gPeakWindowSize = 0.8 gFitEnd = gFitStart+4.5 dt = stf.get_sampling_interval() if ( gDictSize < 0 ): print("Couldn\'t retrieve function id=%d; aborting now." % gFSelect) return False if ( not(stf.check_doc()) ): print("Couldn\'t find an open file; aborting now.") return False # set cursors: if ( not(stf.set_peak_start( gPeakStartCtrl/dt )) ): return False if ( not(stf.set_base_start( gBaseStartCtrl/dt )) ): return False if ( not(stf.set_base_end( gBaseEndCtrl/dt )) ): return False if ( not(stf.set_peak_mean( 3 )) ): return False if ( not(stf.set_peak_direction( "both" )) ): return False # A list for dictionary keys and values: dict_keys = [] dict_values = np.empty( (gDictSize, 1) ) if ( not(stf.set_peak_end( (gPeakStartCtrl + gPeakWindowSize)/dt )) ): return False stf.measure() # set the fit window cursors: if ( not(stf.set_fit_start( stf.peak_index()+1 )) ): return False if ( not(stf.set_fit_end( gFitEnd/dt )) ): return False # Least-squares fitting: p_dict = stf.leastsq( gFSelect ) if ( p_dict == 0 ): print('Couldn\'t perform a fit; aborting now.') return False # Create an empty list: tempdict_entry = [] row = 0 for k, v in p_dict.iteritems(): dict_keys.append( k ) dict_values[row][0] = v row = row+1 dict_keys.append( "Peak amplitude" ) dict_values[row][0] = stf.get_peak()-stf.get_base() retDict = dict() # Create the dictionary for the table: entry = 0 for elem in dict_keys: retDict[ elem ] = dict_values[entry].tolist() entry = entry+1 if not stf.show_table_dictlist( retDict ): return False # divide by inactivation part: trace = stf.get_trace()[gFitStart/dt:gFitEnd/dt] l = np.empty( (3, len(trace)) ) l[1] = trace - stf.get_base() t = np.arange(0,len(l[1]))*dt l[2] = np.exp(-t/p_dict['Tau_0']) l[0] = l[1] / l[2] stf.new_window_matrix( l ) stf.set_base_start(0) stf.set_base_end(0) stf.set_peak_mean(-1) stf.set_peak_start(10) stf.set_peak_end(32) stf.measure() def act_batch( nFunc = 5, filename="", lat=60 ): """Fits activation and inactivation of 15 iv pulses using a biexponential funtion with a delay, creates a table showing the results. Keyword argument: nFunc -- Index of function used for fitting. At present, 10 is the HH gNa function, 5 is a sum of two exponentials with a delay. filename -- If not an empty string, stores the best-fit parameters in this file.""" stf = __import__("stf") # Some ugly definitions for the time being gFitStart = 70.5 + lat/1000.0 # fit end cursor is variable gFSelect = nFunc # HH function gDictSize = stf.leastsq_param_size( gFSelect ) + 2 # Parameters, chisqr, peak value gBaseStartCtrl = 69.5 # Start and end of the baseline before the control pulse, in ms gBaseEndCtrl = 70.5 gPeakStartCtrl = 70.64 # Start and end of the peak cursors for the control pulse, in ms gPeakWindowSizes = ( 2.5, 2, 1.5, 1, 1, 0.8, 0.8, 0.8, 0.6, 0.6, 0.5, 0.5, 0.4, 0.4, 0.4 ) gFitDurations = ( 8, 8, 7, 6, 5.5, 5, 4.5, 3.5, 2.5, 2, 1.5, 1.5, 1.0, 0.8, 0.8 ) gPulses = len( gFitDurations ) # Number of traces if ( gDictSize < 0 ): print("Couldn\'t retrieve function id=%d; aborting now." % gFSelect) return False if ( not(stf.check_doc()) ): print("Couldn\'t find an open file; aborting now.") return False # set cursors: if ( not(stf.set_peak_start( gPeakStartCtrl, True )) ): return False if ( not(stf.set_peak_end( stf.get_size_trace(0)-1 )) ): return False if ( not(stf.set_base_start( gBaseStartCtrl, True )) ): return False if ( not(stf.set_base_end( gBaseEndCtrl, True )) ): return False if ( not(stf.set_peak_mean( 3 )) ): return False if ( not(stf.set_peak_direction( "both" )) ): return False firstpass = True # A list for dictionary keys and values: dict_keys = [] dict_values = np.empty( (gDictSize, stf.get_size_channel()) ) if not filename=="": ls_file=np.empty((gPulses,stf.leastsq_param_size(nFunc))) for n in range( 0, gPulses ): if ( stf.set_trace( n ) == False ): print('Couldn\'t set a new trace; aborting now.') return False print('Analyzing trace %d of %d'%( n+1, stf.get_size_channel())) # set the fit window cursors: if ( not(stf.set_peak_end( gPeakStartCtrl + gPeakWindowSizes[n], True )) ): return False if ( not(stf.set_fit_start( gFitStart, True )) ): return False if ( not(stf.set_fit_end( gFitStart + gFitDurations[n], True )) ): return False stf.measure() # Least-squares fitting: p_dict = stf.leastsq( gFSelect ) if not filename=="": ls_file[n][0]=p_dict["gprime_na"] ls_file[n][1]=p_dict["tau_m"] ls_file[n][2]=p_dict["tau_h"] ls_file[n][3]=p_dict["offset"] if ( p_dict == 0 ): print('Couldn\'t perform a fit; aborting now.') return False # Create an empty list: tempdict_entry = [] row = 0 for k, v in p_dict.iteritems(): if ( firstpass == True ): dict_keys.append( k ) dict_values[row][n] = v row = row+1 if ( firstpass ): dict_keys.append( "Peak amplitude" ) dict_values[row][n] = stf.get_peak()-stf.get_base() firstpass = False if not filename=="": write_array(file(filename,'w'), ls_file, precision=15) retDict = dict() # Create the dictionary for the table: entry = 0 for elem in dict_keys: retDict[ elem ] = dict_values[entry].tolist() entry = entry+1 return stf.show_table_dictlist( retDict ) def inact_batch(): """Determines peak amplitudes for inactivation protocol.""" stf = __import__("stf") # Some ugly definitions for the time being gDictSize = 1 # Parameters, chisqr, peak value gBaseStartCtrl = 69 # Start and end of the baseline before the control pulse, in ms gBaseEndCtrl = 70 gPeakStartCtrl = 70.12 # Start and end of the peak cursors for the control pulse, in ms gPeakWindowSize = 0.2 gPeakEndCtrl = gPeakStartCtrl + gPeakWindowSize gPulses = 11 # Number of traces if ( not(stf.check_doc()) ): print('Couldn\'t find an open file; aborting now.') return False # set cursors: if ( not(stf.set_peak_start( gPeakStartCtrl, True )) ): return False if ( not(stf.set_peak_end( gPeakEndCtrl, True )) ): return False if ( not(stf.set_base_start( gBaseStartCtrl, True )) ): return False if ( not(stf.set_base_end( gBaseEndCtrl, True )) ): return False if ( not(stf.set_peak_mean( 4 )) ): return False if ( not(stf.set_peak_direction( "both" )) ): return False # A list for dictionary keys and values: dict_keys = [ "Peak amplitude", ] dict_values = np.empty( (gDictSize, gPulses) ) for n in range( 0, gPulses ): if ( stf.set_trace( n ) == False ): print('Couldn\'t set a new trace; aborting now.') return False print('Analyzing pulse %d of %d'%( n+1, stf.get_size_channel())) # Update calculations: stf.measure() # Store values: dict_values[0][n] = stf.get_peak() - stf.get_base() inactDict = dict() # Create the dictionary for the table: entry = 0 for elem in dict_keys: inactDict[ elem ] = dict_values[entry].tolist() entry = entry+1 return stf.show_table_dictlist( inactDict ) def deact_batch( filename="" ): """Fits deactivation time constants: Monoexponential until <=-70, biexponential for >-70 mV. filename -- If not an empty string, stores the best-fit parameters in this file.""" stf = __import__("stf") # Some ugly definitions for the time being gNMono = 5 # Monoexponential fits gNBi = 4 # Biexponential fits gFMono = 0 # id of monoexponential function gFBi = 3 # id of biexponential function gMonoDictSize = stf.leastsq_param_size( gFMono ) + 1 # Parameters, chisqr gBiDictSize = stf.leastsq_param_size( gFBi ) + 1 # Parameters, chisqr if ( gMonoDictSize < 0 or gBiDictSize < 0 ): print('Couldn\'t retrieve function; aborting now.') return False if ( not(stf.check_doc()) ): print('Couldn\'t find an open file; aborting now.') return False # set the test pulse window cursors: if ( not(stf.set_peak_start( 70.84, True )) ): return False if ( not(stf.set_peak_end( 74.84, True )) ): return False if ( not(stf.set_base_start( 69.5, True )) ): return False if ( not(stf.set_base_end( 70.5, True )) ): return False if ( not(stf.set_peak_mean( 1 )) ): return False if ( not(stf.set_peak_direction( "down" )) ): return False # Monoexponential loop --------------------------------------------------- firstpass = True # A list for dictionary keys... mono_keys = [] # ... and values: mono_values = np.empty( (gMonoDictSize, gNMono) ) if not filename=="": ls_file=np.empty((gNMono,stf.leastsq_param_size(gFMono))) # Monoexponential fits: for n in range( 0, gNMono ): if ( stf.set_trace( n ) == False ): print("Couldn't set a new trace; aborting now.") return False print('Analyzing trace %d of %d'%( n+1, stf.get_size_channel())) # set the fit window cursors: # use the index for the start cursor: if ( not(stf.set_fit_start( stf.peak_index( True ) )) ): return False # fit 1.5 ms: fit_end_time = stf.get_fit_start( True )+1.0 if ( not(stf.set_fit_end( fit_end_time, True)) ): return False # Least-squares fitting: p_dict = stf.leastsq( gFMono ) if not filename=="": ls_file[n][0]=p_dict["Amp_0"] ls_file[n][1]=p_dict["Tau_0"] ls_file[n][2]=p_dict["Offset"] if ( p_dict == 0 ): print('Couldn\'t perform a fit; aborting now.') return False # Create an empty list: tempdict_entry = [] row = 0 for k, v in p_dict.iteritems(): if ( firstpass == True ): mono_keys.append( k ) mono_values[row][n] = v row = row+1 firstpass = False monoDict = dict() # Create the dictionary for the table: entry = 0 for elem in mono_keys: monoDict[ elem ] = mono_values[entry].tolist() entry = entry+1 if ( not(stf.show_table_dictlist( monoDict )) ): return False # Biexponential loop --------------------------------------------------- firstpass = True # A list for dictionary keys... bi_keys = [] # ... and values: bi_values = np.empty( (gBiDictSize, gNBi) ) # Monoexponential fits: for n in range( gNMono, gNBi+gNMono ): if ( stf.set_trace( n ) == False ): print('Couldn\'t set a new trace; aborting now.') return False print('Analyzing trace %d of %d'%( n+1, stf.get_size_channel())) # set the fit window cursors: # use the index for the start cursor: if ( not(stf.set_fit_start( stf.peak_index( True ) )) ): return False # fit 4 ms: fit_end_time = stf.get_fit_start( True )+3.5 if ( not(stf.set_fit_end( fit_end_time, True)) ): return False # Least-squares fitting: p_dict = stf.leastsq( gFBi ) if ( p_dict == 0 ): print('Couldn\'t perform a fit; aborting now.') return False # Create an empty list: tempdict_entry = [] row = 0 for k, v in p_dict.iteritems(): if ( firstpass == True ): bi_keys.append( k ) bi_values[row][n-gNMono] = v row = row+1 firstpass = False biDict = dict() # Create the dictionary for the table: entry = 0 for elem in bi_keys: biDict[ elem ] = bi_values[entry].tolist() entry = entry+1 if not filename=="": write_array(file(filename,'w'), ls_file, precision=15) if ( not(stf.show_table_dictlist( biDict )) ): return False return True def inact_recov_batch( show_table = True ): """Determines recovery from inactivation.""" stf = __import__("stf") if ( not(stf.check_doc()) ): print('Couldn\'t find an open file; aborting now.') return False # Some ugly definitions for the time being gBaseStartCtrl = 69 # Start and end of the baseline before the control pulse, in ms gBaseEndCtrl = 70 gPeakStartCtrl = 70.12 # Start and end of the peak cursors for the control pulse, in ms gPeakWindowSize = 0.5 gPeakEndCtrl = gPeakStartCtrl + gPeakWindowSize gDictSize = 2 # Control peak amplitude, test peak amplitude gDurations = ( 0, 1, 2, 3, 5, 7, 9, 13, 20, 30, 50, 100 ) # Durations of the pulses gPulses = len( gDurations ) # Number of pulses # A list for dictionary keys... dict_keys = [ "Control amplitude", "Test amplitude" ] # ... and values: dict_values = np.empty( (gDictSize, gPulses) ) if ( not(stf.set_peak_mean( 3 )) ): return False if ( not(stf.set_peak_direction( "down" )) ): return False for n in range( 0, gPulses ): if ( stf.set_trace( n ) == False ): print('Couldn\'t set a new trace; aborting now.') return False # set the control pulse window cursors: if ( not(stf.set_peak_start( gPeakStartCtrl, True )) ): return False if ( not(stf.set_peak_end( gPeakEndCtrl, True )) ): return False if ( not(stf.set_base_start( gBaseStartCtrl, True )) ): return False if ( not(stf.set_base_end( gBaseEndCtrl, True )) ): return False # Update calculations: stf.measure() # Store values: dict_values[0][n] = stf.get_peak() - stf.get_base() # set the test pulse window cursors: if ( not(stf.set_peak_start( gDurations[n]+100.16, True )) ): return False if ( not(stf.set_peak_end( gDurations[n]+100.16+gPeakWindowSize, True )) ): return False if ( not(stf.set_base_start( gDurations[n]+100-1, True )) ): return False if ( not(stf.set_base_end( gDurations[n]+100, True )) ): return False # Update calculations: stf.measure() # Store values: dict_values[1][n] = stf.get_peak() - stf.get_base() inactDict = dict() # Create the dictionary for the table: entry = 0 for elem in dict_keys: inactDict[ elem ] = dict_values[entry].tolist() entry = entry+1 if show_table: if not stf.show_table_dictlist( inactDict ): return -1 return dict_values def inact_onset_batch( show_table = True ): """Determines onset of inactivation.""" stf = __import__("stf") if ( not(stf.check_doc()) ): print('Couldn\'t find an open file; aborting now.') return -1 # Some ugly definitions for the time being gPeakWindowSize = 0.5 gDictSize = 1 # Control peak amplitude, test peak amplitude gDurations = ( 0, 1, 2, 3, 5, 7, 9, 13, 20, 25, 30 ) # Durations of the pulses gPulses = len( gDurations ) # Number of pulses # A list for dictionary keys... dict_keys = [ "Test amplitude", ] # ... and values: dict_values = np.empty( (gDictSize, gPulses) ) if ( not(stf.set_peak_mean( 4 )) ): return -1 if ( not(stf.set_peak_direction( "down" )) ): return -1 for n in range( 0, gPulses ): if ( stf.set_trace( n ) == False ): print('Couldn\'t set a new trace; aborting now.') return -1 print('Analyzing pulse %d of %d'%( n+1, stf.get_size_channel())) # set the test pulse window cursors: if ( not(stf.set_peak_start( gDurations[n]+70.12, True )) ): return -1 if ( not(stf.set_peak_end( gDurations[n]+70.12+gPeakWindowSize, True )) ): return -1 if ( not(stf.set_base_start( gDurations[n]+70-1, True )) ): return -1 if ( not(stf.set_base_end( gDurations[n]+70, True )) ): return -1 # Update calculations: stf.measure() # Store values: dict_values[0][n] = stf.get_peak() - stf.get_base() inactDict = dict() # Create the dictionary for the table: entry = 0 for elem in dict_keys: inactDict[ elem ] = dict_values[entry].tolist() entry = entry+1 if show_table: if not stf.show_table_dictlist( inactDict ): return -1 return dict_values[0] stimfit-0.15.8/src/stimfit/py/pystf.h0000775000175000017500000001126313062445067014440 00000000000000#ifndef _PYSTF_H #define _PYSTF_H #undef _DEBUG #include #undef _DEBUG #include std::string get_versionstring( ); #ifdef WITH_PYTHON PyObject* get_trace(int trace=-1, int channel=-1); #endif bool new_window( double* invec, int size ); bool new_window_matrix( double* inarr, int traces, int size ); bool new_window_selected_this( ); bool new_window_selected_all( ); #ifdef WITH_PYTHON bool show_table( PyObject* dict, const char* caption = "Python table" ); bool show_table_dictlist( PyObject* dict, const char* caption = "Python table", bool reverse = true ); #endif int get_size_trace( int trace = -1, int channel = -1 ); int get_size_channel( int channel = -1 ); int get_size_recording( ); double get_sampling_interval( ); bool set_sampling_interval( double si ); const char* get_xunits( ); const char* get_yunits( int trace = -1, int channel = -1 ); bool set_xunits( const char* units ); bool set_yunits( const char* units, int trace = -1, int channel = -1 ); double get_maxdecay(); double get_maxrise(); const char* get_recording_time( ); const char* get_recording_date( ); std::string get_recording_comment( ); bool set_recording_comment( const char* comment ); bool set_recording_time( const char* time ); bool set_recording_date( const char* date ); bool select_trace( int trace = -1 ); void select_all( ); void unselect_all( ); #ifdef WITH_PYTHON PyObject* get_selected_indices( ); #endif bool set_trace( int trace ); int get_trace_index(); const char* get_trace_name( int trace = -1, int channel = -1 ); bool set_channel( int channel); int get_channel_index( bool active = true ); const char* get_channel_name( int index = -1 ); bool set_channel_name( const char* name, int index = -1 ); void align_selected( double (*alignment)( bool ), bool active = false ); bool subtract_base( ); int leastsq_param_size( int fselect ); #ifdef WITH_PYTHON PyObject* leastsq( int fselect, bool refresh = true ); PyObject* get_fit( int trace = -1, int channel = -1 ); #endif bool check_doc( bool show_dialog = true ); std::string get_filename( ); bool file_open( const char* filename ); bool file_save( const char* filename ); bool close_all( ); bool close_this( ); bool measure( ); double get_base( bool active = true ); double get_base_SD( ); double get_peak( ); double get_halfwidth (bool active = true); #ifdef WITH_PSLOPE double get_pslope(); #endif double get_threshold_time( bool is_time = false ); double get_threshold_value( ); double get_latency(); double get_risetime(); double peak_index( bool active = true ); double maxrise_index( bool active = true ); double maxdecay_index( ); double foot_index( bool active = true ); double rtlow_index( bool active = true ); double rthigh_index( bool active = true ); double t50left_index( bool active = true ); double t50right_index( bool active = true ); double get_risetime_factor(); bool set_risetime_factor(double factor); bool set_marker(double x, double y); bool erase_markers(); double get_fit_start( bool is_time = false ); bool set_fit_start( double pos, bool is_time = false ); double get_fit_end( bool is_time = false ); bool set_fit_end( double pos, bool is_time = false ); double get_peak_start( bool is_time = false ); bool set_peak_start( double pos, bool is_time = false ); double get_peak_end( bool is_time = false ); bool set_peak_end( double pos, bool is_time = false ); int get_peak_mean( ); bool set_peak_mean( int pts ); const char* get_peak_direction( ); bool set_peak_direction( const char* direction ); double get_base_start( bool is_time = false ); bool set_base_start( double pos, bool is_time = false ); double get_base_end( bool is_time = false ); bool set_base_end( double pos, bool is_time = false ); const char* get_baseline_method( ); bool set_baseline_method( const char* method); const char* get_latency_start_mode( ); bool set_latency_start_mode( const char* direction ); const char* get_latency_end_mode( ); bool set_latency_end_mode( const char* direction ); double get_latency_start( bool is_time = false ); bool set_latency_start( double pos, bool is_time = false ); double get_latency_end( bool is_time = false ); bool set_latency_end( double pos, bool is_time = false ); bool set_slope(double slope); double plot_xmin(); double plot_xmax(); double plot_ymin(); double plot_ymax(); double plot_y2min(); double plot_y2max(); void _gMatrix_resize( std::size_t channels, std::size_t sections ); void _gNames_resize( std::size_t channels ); void _gMatrix_at( double* invec, int size, int channel, int section ); void _gNames_at( const char* name, int channel ); bool _new_window_gMatrix( ); extern double _figsize[]; #ifdef WITH_PYTHON PyObject* mpl_panel(const std::vector& figsize = std::vector(_figsize, _figsize+2)); #endif #endif stimfit-0.15.8/src/stimfit/py/Makefile.am0000775000175000017500000000422613062445067015157 00000000000000if BUILD_PYTHON pkglib_LTLIBRARIES = libpystf.la $(srcdir)/pystf_wrap.cxx $(srcdir)/stf.py: $(srcdir)/pystf.i $(SWIG) $(SWIG_PYTHON_OPT) -o $@ $< cat $(srcdir)/gccwarn $(srcdir)/pystf_wrap.cxx > $(srcdir)/pystf_wrap_tmp.cxx mv $(srcdir)/pystf_wrap_tmp.cxx $(srcdir)/pystf_wrap.cxx nodist_libpystf_la_SOURCES = $(srcdir)/pystf_wrap.cxx libpystf_la_SOURCES = $(srcdir)/pystf.cxx # $(SWIG_SOURCES) noinst_HEADERS = pystf.h INCLUDES = $(LIBNUMPY_INCLUDES) libpystf_la_CPPFLAGS = $(SWIG_PYTHON_CPPFLAGS) -I$(top_srcdir)/src libpystf_la_CXXFLAGS = $(OPT_CXXFLAGS) $(WX_CXXFLAGS) libpystf_la_LDFLAGS = $(LIBPYTHON_LDFLAGS) $(LIBSTF_LDFLAGS) $(LIBBIOSIG_LDFLAGS) libpystf_la_LIBADD = ../libstimfit.la ../../libstfio/libstfio.la $(WX_LIBS) if WITH_BIOSIGLITE libpystf_la_LIBADD += ../../libbiosiglite/libbiosiglite.la endif EXTRA_DIST = pystf.i numpy.i ivtools.py mintools.py natools.py minidemo.py charlie.py mintools.py hdf5tools.py spells.py tdms.py embedded_init.py embedded_stf.py embedded_mpl.py embedded_ipython.py heka.py extensions.py gccwarn install-exec-hook: cd ${prefix}/lib/stimfit && ln -sf ${STF_PYTHON_LIBNAME} _stf.so rm -f ${prefix}/lib/stimfit/*.la rm -f ${prefix}/lib/stimfit/*.a cp -p $(srcdir)/ivtools.py ${prefix}/lib/stimfit cp -p $(srcdir)/mintools.py ${prefix}/lib/stimfit cp -p $(srcdir)/natools.py ${prefix}/lib/stimfit cp -p $(srcdir)/minidemo.py ${prefix}/lib/stimfit cp -p $(srcdir)/charlie.py ${prefix}/lib/stimfit cp -p $(srcdir)/hdf5tools.py ${prefix}/lib/stimfit cp -p $(srcdir)/stf.py ${prefix}/lib/stimfit cp -p $(srcdir)/spells.py ${prefix}/lib/stimfit cp -p $(srcdir)/tdms.py ${prefix}/lib/stimfit cp -p $(srcdir)/embedded_init.py ${prefix}/lib/stimfit cp -p $(srcdir)/embedded_stf.py ${prefix}/lib/stimfit cp -p $(srcdir)/embedded_mpl.py ${prefix}/lib/stimfit cp -p $(srcdir)/embedded_ipython.py ${prefix}/lib/stimfit cp -p $(srcdir)/heka.py ${prefix}/lib/stimfit cp -p $(srcdir)/extensions.py ${prefix}/lib/stimfit cp -p $(srcdir)/../../pystfio/stfio_plot.py ${prefix}/lib/stimfit chmod -x ${prefix}/lib/stimfit/*.py uninstall-hook: rm -rf ${prefix}/lib/stimfit clean_local: rm -f $(srcdir)/pystf_wrap.cxx $(srcdir)/stf.py endif stimfit-0.15.8/src/stimfit/py/pystf.i0000775000175000017500000020342613062445067014445 00000000000000#if defined(__WXMAC__) || defined(__WXGTK__) #pragma GCC diagnostic ignored "-Wwrite-strings" #endif %define DOCSTRING "The stf module allows to access a running stimfit application from the embedded python shell." %enddef %module(docstring=DOCSTRING) stf %{ #define SWIG_FILE_WITH_INIT #include "pystf.h" %} %include "numpy.i" %include "std_string.i" %include "std_vector.i" namespace std { %template(vectord) vector; }; %init %{ import_array(); %} %define %apply_numpy_typemaps(TYPE) %apply (TYPE* IN_ARRAY1, int DIM1) {(TYPE* invec, int size)}; %apply (TYPE* IN_ARRAY2, int DIM1, int DIM2) {(TYPE* inarr, int traces, int size)}; %enddef /* %apply_numpy_typemaps() macro */ %apply_numpy_typemaps(double) //-------------------------------------------------------------------- %feature("autodoc", 0) get_versionstring; %feature("docstring", "Returns the current version of Stimfit.") get_versionstring; std::string get_versionstring( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_trace; %feature("kwargs") get_trace; %feature("docstring", """Returns a trace as a 1-dimensional NumPy array. Arguments: trace -- ZERO-BASED index of the trace within the channel. Note that this is one less than what is shown in the drop-down box. The default value of -1 returns the currently displayed trace. channel -- ZERO-BASED index of the channel. This is independent of whether a channel is active or not. The default value of -1 returns the currently active channel. Returns: The trace as a 1D NumPy array.""") get_trace; PyObject* get_trace(int trace=-1, int channel=-1); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) new_window; %feature("docstring", "Creates a new window showing a 1D NumPy array. Arguments: invec -- The NumPy array to be shown. Returns: True upon successful completion, false otherwise.") new_window; bool new_window( double* invec, int size ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) _new_window_gMatrix; %feature("docstring", "Creates a new window from the global matrix. Do not use directly.") _new_window_gMatrix; bool _new_window_gMatrix( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) new_window_matrix; %feature("docstring", "Creates a new window showing a 2D NumPy array. Arguments: inarr -- The NumPy array to be shown. First dimension are the traces, second dimension the sampling points within the traces. Returns: True upon successful completion, false otherwise.") new_window_matrix; bool new_window_matrix( double* inarr, int traces, int size ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) new_window_selected_this; %feature("docstring", "Creates a new window showing the selected traces of the current file. Returns: True if successful.") new_window_selected_this; bool new_window_selected_this( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) new_window_selected_all; %feature("docstring", "Creates a new window showing the selected traces of all open files. Returns: True if successful.") new_window_selected_all; bool new_window_selected_all( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) show_table; %feature("kwargs") show_table; %feature("docstring", "Shows a python dictionary in a results table. The dictionary has to have the form \"string\" : float Arguments: dict -- A dictionary with strings as key values and floating point numbers as values. caption -- An optional caption for the table. Returns: True if successful.") show_table; bool show_table( PyObject* dict, const char* caption = "Python table" ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) show_table_dictlist; %feature("kwargs") show_table_dictlist; %feature("docstring", "Shows a python dictionary in a results table. The dictionary has to have the form \"string\" : list. Arguments: dict -- A dictionary with strings as key values and lists of floating point numbers as values. caption -- An optional caption for the table. reverse -- If True, The table will be filled in column-major order, i.e. dictionary keys will become column titles. Setting it to False has not been implemented yet. Returns: True if successful.") show_table_dictlist; bool show_table_dictlist( PyObject* dict, const char* caption = "Python table", bool reverse = true ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_size_trace; %feature("kwargs") get_size_trace; %feature("docstring", "Retrieves the number of sample points of a trace. Arguments: trace -- ZERO-BASED index of the trace. Default value of -1 will use the currently displayed trace. Note that this is one less than what is displayed in the drop- down list. channel -- ZERO-BASED index of the channel. Default value of -1 will use the current channel. Returns: The number of sample points.") get_size_trace; int get_size_trace( int trace = -1, int channel = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_size_channel; %feature("kwargs") get_size_channel; %feature("docstring", "Retrieves the number of traces in a channel. Note that at present, stimfit only supports equal-sized channels, i.e. all channels within a file need to have the same number of traces. The channel argument is only for future extensions. Arguments: channel -- ZERO-BASED index of the channel. Default value of -1 will use the current channel. Returns: The number traces in a channel.") get_size_channel; int get_size_channel( int channel = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_maxdecay; %feature("docstring", "Retrieves the maximal slope of the decay between the peak cursors in the current trace. Uses the currently measured values, i.e. does not update measurements if the peak window cursors have changed. Returns: The maximal slope of the decay, -1.0 upon failure.") get_maxdecay; double get_maxdecay( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_maxrise; %feature("docstring", "Retrieves the maximal slope of the rise between the peak cursors in the current trace. Uses the currently measured values, i.e. does not update measurements if the peak window cursors have changed. Returns: The maximal slope of the rise, -1.0 upon failure.") get_maxrise; double get_maxrise( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_size_recording; %feature("docstring", "Retrieves the number of channels in a recording. Returns: The number of channels in a recording.") get_size_recording; int get_size_recording( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_sampling_interval; %feature("docstring", "Returns the sampling interval. Returns: The sampling interval.") get_sampling_interval; double get_sampling_interval( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_xunits; %feature("docstring", "Returns the x units of the specified section. X units are assumed to be the same for the entire file. Returns: The x units as a string.") get_xunits; const char* get_xunits( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_yunits; %feature("kwargs") get_yunits; %feature("docstring", "Returns the y units of the specified trace. Y units are not allowed to change between traces at present. Arguments: trace -- The zero-based index of the trace of interest. If < 0, the name of the active trace will be returned. channel -- The zero-based index of the channel of interest. If < 0, the active channel will be used. Returns: The x units as a string.") get_yunits; const char* get_yunits( int trace = -1, int channel = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_yunits; %feature("kwargs") set_yunits; %feature("docstring", "Sets the y unit string of the specified trace. Y units are not allowed to change between traces at present. Arguments: units -- The new y unit string. trace -- The zero-based index of the trace of interest. If < 0, the name of the active trace will be returned. channel -- The zero-based index of the channel of interest. If < 0, the active channel will be used. Returns: True if successful.") set_yunits; bool set_yunits( const char* units, int trace = -1, int channel = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_xunits; %feature("kwargs") set_xunits; %feature("docstring", "Sets the x unit string for the entire file. Arguments: units -- The new x unit string. Returns: True if successful.") set_xunits; bool set_xunits( const char* units ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_sampling_interval; %feature("docstring", "Sets a new sampling interval. Argument: si -- The new sampling interval. Returns: False upon failure.") set_sampling_interval; bool set_sampling_interval( double si ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) select_trace; %feature("kwargs") select_trace; %feature("docstring", "Selects a trace. Checks for out-of-range indices and stores the baseline along with the trace index. Arguments: trace -- ZERO-BASED index of the trace. Default value of -1 will select the currently displayed trace. Note that this is one less than what is displayed in the drop- down list. Returns: True if the trace could be selected, False otherwise.") select_trace; bool select_trace( int trace = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) select_all; %feature("docstring", "Selects all traces in the current file. Stores the baseline along with the trace index.") select_all; void select_all( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) unselect_all; %feature("docstring", "Unselects all previously selected traces in the current file.") unselect_all; void unselect_all( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) subtract_base; %feature("docstring", "Subtracts the baseline from the selected traces of the current file, then displays the subtracted traces in a new window. Returns: True if the subtraction was successful, False otherwise.") subtract_base; bool subtract_base( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) subtract_base; %feature("docstring", "Subtracts the baseline from the selected traces of the current file, then displays the subtracted traces in a new window. Returns: True if the subtraction was successful, False otherwise.") subtract_base; bool subtract_base( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) leastsq; %feature("kwargs") leastsq; %feature("docstring", "Fits a function to the data between the current fit cursors. Arguments: fselect -- Zero-based index of the function as it appears in the fit selection dialog. refresh -- To avoid flicker during batch analysis, this may be set to False so that the fitted function will not immediately be drawn. Returns: A dictionary with the best-fit parameters and the least-squared error, or a null pointer upon failure.") leastsq; PyObject* leastsq( int fselect, bool refresh = true ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_fit; %feature("kwargs") get_fit; %feature("docstring", "Get the waveform resulted from the fitting, if available. Arguments: trace -- The zero-based index of the trace of interest. If < 0, the name of the active trace will be returned. channel -- The zero-based index of the channel of interest. If < 0, the active channel will be used. Returns: A 2D Numpy array with the x-values of the fit in the first dimension, and the y-values in the second dimension. None if no fit is available.") get_fit; PyObject* get_fit( int trace = -1, int channel = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) leastsq_param_size; %feature("docstring", "Retrieves the number of parameters for a function. Arguments: fselect -- Zero-based index of the function as it appears in the fit selection dialog. Returns: The number of parameters for the function with index fselect, or a negative value upon failure.") leastsq_param_size; int leastsq_param_size( int fselect ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) check_doc; %feature("docstring", "Checks whether a file is open. Arguments: show_dialog -- True if an error dialog should be shown if no file is open. Returns: True if a file is open, False otherwise.") check_doc; bool check_doc( bool show_dialog=true ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_filename; %feature("docstring", "Returns the name of the current file.") get_filename; std::string get_filename( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) _gMatrix_resize; %feature("docstring", "Resizes the global matrix. Do not use directly. Arguments: channels -- New number of channels of the global matrix. sections -- New number of sections of the global matrix. ") _gMatrix_resize; void _gMatrix_resize( std::size_t channels, std::size_t sections ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) _gMatrix_at; %feature("docstring", "Sets the valarray at the specified position of the global matrix. Do not use directly. Arguments: invec -- The NumPy array to be used. channel -- The channel index within the global matrix. section -- The seciton index within the global matrix. ") _gMatrix_at; void _gMatrix_at( double* invec, int size, int channel, int section ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) _gNames_resize; %feature("docstring", "Resizes the global names. Do not use directly. Arguments: channels -- New number of channels of the global names. ") _gNames_resize; void _gNames_resize( std::size_t channels ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) _gNames_at; %feature("docstring", "Sets the channel name of the specifies channel. Do not use directly. Arguments: name -- The new channel name channel -- The channel index within the global names. ") _gNames_at; void _gNames_at( const char* name, int channel ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) file_open; %feature("docstring", "Opens a file. Arguments: filename -- The file to be opened. On Windows, use double back- slashes (\"\\\\\\\\\") between directories to avoid con- version to special characters such as \"\\\\t\" or \"\\\\n\". Example usage in Windows: file_open(\"C:\\\\\\data\\\\\\datafile.dat\") Example usage in Linux: file_open(\"/home/cs/data/datafile.dat\") This is surprisingly slow when called from python. Haven't figured out the reason yet. Returns: True if the file could be opened, False otherwise.") file_open; bool file_open( const char* filename ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) file_save; %feature("docstring", "Saves a file. Arguments: filename -- The file to be saved. On Windows, use double back- slashes (\"\\\\\\\\\") between directories to avoid con- version to special characters such as \"\\\\t\" or \"\\\\n\". Example usage in Windows: file_save(\"C:\\\\\\data\\\\\\datafile.dat\") Example usage in Linux: file_save(\"/home/cs/data/datafile.dat\") This is surprisingly slow when called from python. Haven't figured out the reason yet. Returns: True if the file could be saved, False otherwise.") file_save; bool file_save( const char* filename ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_recording_time; %feature("docstring", "Returns the time at which the recording was started as a string.") get_recording_time; const char* get_recording_time( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_recording_date; %feature("docstring", "Returns the date at which the recording was started as a string.") get_recording_date; const char* get_recording_date( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_recording_comment; %feature("docstring", "Returns a comment about the recording. ") get_recording_comment; std::string get_recording_comment( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_recording_date; %feature("docstring", "Sets a date about the recording. Argument: date -- A date string. Returns: True upon successful completion.") set_recording_date; bool set_recording_date( const char* date ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_recording_time; %feature("docstring", "Sets a time about the recording. Argument: time -- A time string. Returns: True upon successful completion.") set_recording_time; bool set_recording_time( const char* time ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_recording_comment; %feature("docstring", "Sets a comment about the recording. Argument: comment -- A comment string. Returns: True upon successful completion.") set_recording_comment; bool set_recording_comment( const char* comment ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_recording_comment; %feature("docstring", "Sets a comment about the recording. Argument: comment -- A comment string. Returns: True upon successful completion.") set_recording_comment; bool set_recording_comment( const char* comment ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) close_all; %feature("docstring", "Closes all open files. Returns: True if all files could be closed.") close_all; bool close_all( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) close_this; %feature("docstring", "Closes the currently active file. Returns: True if the file could be closed.") close_this; bool close_this( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_base; %feature("kwargs") get_base; %feature("docstring", "Returns the current baseline value. Uses the currently measured values, i.e. does not update measurements if the peak or base window cursors have changed. Arguments: active -- If True, returns the baseline in the active channel. If False returns the baseline within the reference channel. Returns: The current baseline.") get_base; double get_base( bool active = true); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_peak; %feature("docstring", "Returns the current peak value, measured from zero (!). Uses the currently measured values, i.e. does not update measurements if the peak or base window cursors have changed. Returns: The current peak value, measured from zero (again: !).") get_peak; double get_peak( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- #ifdef WITH_PSLOPE %feature("autodoc", 0) get_pslope; %feature("docstring", "Returns the slope, measured from slope cursor values defined in the cursors settings menu(!). This option is only available under GNU/Linux. Returns: The current slope value.") get_pslope; double get_pslope( ); #endif //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) peak_index; %feature("kwargs") peak_index; %feature("docstring", "Returns the zero-based index of the current peak position in the specified channel. Uses the currently measured values, i.e. does not update measurements if the peak window cursors have changed. Arguments: active -- If True, returns the current peak index of the active channel. Otherwise, returns the current peak index of the reference channel. Returns: The zero-based index in units of sampling points. May be interpolated if more than one point is used for the peak calculation. Returns a negative value upon failure.") peak_index; %callback("%s_cb"); double peak_index( bool active = true ); %nocallback; //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) maxrise_index; %feature("kwargs") maxrise_index; %feature("docstring", "Returns the zero-based index of the maximal slope of rise in the specified channel. Uses the currently measured values, i.e. does not update measurements if the peak window cursors have changed. Arguments: active -- If True, returns the current index of the maximal slope of rise within the active channel. Otherwise, returns the current index of the maximal slope of rise within the reference channel. Returns: The zero-based index of the maximal slope of rise in units of sampling points interpolated between adjacent sampling points. Returns a negative value upon failure.") maxrise_index; %callback("%s_cb"); double maxrise_index( bool active = true ); %nocallback; //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) maxdecay_index; %feature("docstring", "Returns the zero-based index of the maximal slope of decay in the current channel. Uses the currently measured values, i.e. does not update measurements if the peak window cursors have changed. Note that in contrast to maxrise_index, this function only works on the active channel. Returns: The zero-based index of the maximal slope of decay in units of sampling points interpolated between adjacent sampling points. Returns a negative value upon failure.") maxdecay_index; double maxdecay_index( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) foot_index; %feature("kwargs") foot_index; %feature("docstring", "Returns the zero-based index of the foot of an event in the active channel. The foot is the intersection of an interpolated line through the points of 20 and 80% rise with the baseline. Uses the currently measured values, i.e. does not update measurements if the peak or base window cursors have changed. Arguments: active -- If True, returns the current index of the foot within the active channel. Only implemented for the active channel at this time. Will return a negative value and show an error message if active == False. Returns: The zero-based index of the foot of an event in units of sampling points. Interpolates between sampling points. Returns a negative value upon failure.") foot_index; %callback("%s_cb"); double foot_index( bool active = true ); %nocallback; //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) t50left_index; %feature("kwargs") t50left_index; %feature("docstring", "Returns the zero-based index of the left half- maximal amplitude of an event in the specified channel. Uses the currently measured values, i.e. does not update measurements if the peak or base window cursors have changed. Arguments: active -- If True, returns the current index of the left half- maximal amplitude within the active channel. If False, returns the current index of the left half-maximal amplitude within the reference channel. Returns: The zero-based index of the left half-maximal amplitude in units of sampling points. Interpolates between sampling points. Returns a negative value upon failure.") t50left_index; %callback("%s_cb"); double t50left_index( bool active = true ); %nocallback; //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) t50right_index; %feature("kwargs") t50right_index; %feature("docstring", "Returns the zero-based index of the right half- maximal amplitude of an event in the active channel. Uses the currently measured values, i.e. does not update measurements if the peak or base window cursors have changed. Arguments: active -- If True, returns the current index of the right half- maximal amplitude within the active channel. Only implemented for the active channel at this time. Will return a negative value and show an error message if active == False. Returns: The zero-based index of the right half-maximal amplitude in units of sampling points. Interpolates between sampling points. Returns a negative value upon failure.") t50right_index; %callback("%s_cb"); double t50right_index( bool active = true ); %nocallback; //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_halfwidth; %feature("kwargs") get_halfwidth; %feature("docstring", "Returns the half-maximal amplitude of an event in the specified channel. Uses the currently measured values, i.e. does not update measurements if the peak or base window cursors have changed. Only implemented for the active channel. Arguments: active -- If True, returns the current half-maximal amplitude within the active channel. Returns: The half-maximal amplitude in units of x-units. Returns a negative value upon failure.") get_halfwidth; %callback("%s_cb"); double get_halfwidth( bool active = true ); %nocallback; //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) rtlow_index; %feature("kwargs") rtlow_index; %feature("docstring", "Returns the zero-based index of the lower rise- time of an event in the specified channel. Uses the currently measured values, i.e. does not update measurements if the peak or base window cursors have changed. Arguments: active -- If True, returns the current index within the active channel. If False, returns the current index within the reference channel. Returns: The zero-based index of the lower rise time in units of sampling points. Interpolates between sampling points. Returns a negative value upon failure.") rtlow_index; %callback("%s_cb"); double rtlow_index( bool active = true ); %nocallback; //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) rthigh_index; %feature("kwargs") rthigh_index; %feature("docstring", "Returns the zero-based index of the higher rise time of an event in the specified channel. Uses the currently measured values, i.e. does not update measurements if the peak or base window cursors have changed. Arguments: active -- If True, returns the current index within the active channel. If False, returns the current index within the reference channel. Returns: The zero-based index of the higher rise time in units of sampling points. Interpolates between sampling points. Returns a negative value upon failure.") rthigh_index; %callback("%s_cb"); double rthigh_index( bool active = true ); %nocallback; //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_threshold_time; %feature("kwargs") get_threshold_time; %feature("docstring", "Returns the crossing value of the threshold slope. Note that this value is not updated after changing the AP threshold. Call measure() or hit enter to update the cursors. Arguments: is_time -- If False (default), returns the zero-based index at which the threshold slope is crossed (e.g in mV). If True, returns the time point at which the threshold slope is crossed. A negative number is returned upon failure. ") get_threshold_time; double get_threshold_time( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_latency; %feature("docstring", "Returns the latency value (in x-units) determined by the latency cursors set in the cursors settings menu. Call measure() or hit enter to update the cursors. ") get_latency; double get_latency( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_risetime; %feature("docstring", "Returns the rise time (in x-units) determined by the linear interpolation between sampling points (e.g at 20% and 80% of the peak amplitude. ) Call measure() or hit enter to update the cursors. ") get_risetime; double get_risetime( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_risetime_factor; %feature("docstring", "Returns the lower proportion factor used to calculate the rise time (e.g 0.2 if we calculate the 20--80% rise time. ) ") get_risetime_factor; double get_risetime_factor( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_risetime_factor; %feature("kwargs") set_risetime_factor; %feature("docstring", "Sets the lower proportion factor to calculate the rise time (e.g 0.2 if we want to calculate the 20--80% rise time. ) It will update the rise time measurement. Arguments: factor -- the low proportion factor to calculate rise time Returns: False upon failure (such as factor lower than 0.05 or larger than 0.5) ") set_risetime_factor; bool set_risetime_factor(double factor); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_threshold_value; %feature("docstring", "Returns the value found at the threshold slope. Note that this value is not updated after changing the AP threshold. Call measure or hit enter to update the threshold. ") get_threshold_value; double get_threshold_value( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_fit_start; %feature("kwargs") get_fit_start; %feature("docstring", "Returns the zero-based index or the time point of the fit start cursor. Arguments: is_time -- If False (default), returns the zero-based index. If True, returns the time from the beginning of the trace to the cursor position. ") get_fit_start; double get_fit_start( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_fit_end; %feature("kwargs") get_fit_end; %feature("docstring", "Returns the zero-based index or the time point of the fit end cursor. Arguments: is_time -- If False (default), returns the zero-based index. If True, returns the time from the beginning of the trace to the cursor position. ") get_fit_end; double get_fit_end( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_fit_start; %feature("kwargs") set_fit_start; %feature("docstring", "Sets the fit start cursor to a new position. Arguments: pos -- The new cursor position, either in units of sampling points if is_time == False (default) or in units of time if is_time == True. is_time -- see above. Returns: False upon failure (such as out-of-range).") set_fit_start; bool set_fit_start( double pos, bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_fit_end; %feature("kwargs") set_fit_end; %feature("docstring", "Sets the fit end cursor to a new position. Arguments: pos -- The new cursor position, either in units of sampling points if is_time == False (default) or in units of time if is_time == True. is_time -- see above. Returns: False upon failure (such as out-of-range).") set_fit_end; bool set_fit_end( double pos, bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_peak_start; %feature("kwargs") get_peak_start; %feature("docstring", "Returns the zero-based index or the time point of the peak start cursor. Arguments: is_time -- If False (default), returns the zero-based index. If True, returns the time from the beginning of the trace to the cursor position. ") get_peak_start; double get_peak_start( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_peak_end; %feature("kwargs") get_peak_end; %feature("docstring", "Returns the zero-based index or the time point of the peak end cursor. Arguments: is_time -- If False (default), returns the zero-based index. If True, returns the time from the beginning of the trace to the cursor position. ") get_peak_end; double get_peak_end( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_peak_start; %feature("kwargs") set_peak_start; %feature("docstring", "Sets the peak start cursor to a new position. This will NOT update the peak calculation. You have to either call measure() or hit enter in the main window to achieve that. Arguments: pos -- The new cursor position, either in units of sampling points if is_time == False (default) or in units of time if is_time == True. is_time -- see above. Returns: False upon failure (such as out-of-range).") set_peak_start; bool set_peak_start( double pos, bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_peak_end; %feature("kwargs") set_peak_end; %feature("docstring", "Sets the peak end cursor to a new position. This will NOT update the peak calculation. You have to either call measure() or hit enter in the main window to achieve that. Arguments: pos -- The new cursor position, either in units of sampling points if is_time == False (default) or in units of time if is_time == True. is_time -- see above. Returns: False upon failure (such as out-of-range).") set_peak_end; bool set_peak_end( double pos, bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_peak_mean; %feature("docstring", "Sets the number of points used for the peak calculation. Arguments: pts -- A moving average (aka sliding, boxcar or running average) is used to determine the peak value. Pts specifies the number of sampling points used for the moving window. Passing a value of -1 will calculate the average of all sampling points within the peak window. Returns: False upon failure (such as out-of-range).") set_peak_mean; bool set_peak_mean( int pts ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_peak_mean; %feature("docstring", "Returns the number of sampling points used for the peak calculation. Returns: 0 upon failure (i.e no file opened). -1 means average of all sampling points within the peak window.") get_peak_mean; int get_peak_mean( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_peak_direction; %feature("docstring", "Sets the direction of the peak detection. Arguments: direction -- A string specifying the peak direction. Can be one of: \"up\", \"down\" or \"both\" Returns: False upon failure.") set_peak_direction; bool set_peak_direction( const char* direction ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_peak_direction; %feature("docstring", "Gets the current direction of the detection for the peak cursors. Returns: A string specifying the peak direction. Can be one of: \"up\", \"down\" or \"both\"") get_peak_direction; const char* get_peak_direction( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_latency_start; %feature("kwargs") set_latency_start; %feature("docstring", "Sets the first latency cursor to a new position. Arguments: pos -- The new cursor position, either in units of sampling points if is_time == False (default) or in units of time if is_time == True. is_time -- see above. Returns: False upon failure (such as out-of-range).") set_latency_start; bool set_latency_start( double pos, bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_latency_start_mode; %feature("docstring", "Sets the mode of the latency start cursor. Arguments: direction -- A string specifying the mode for the latency start cursor. Can be one of \"manual\", \"peak\", \"rise\" or \"half\" Returns: False upon failure.") set_latency_start_mode; bool set_latency_start_mode( const char* mode ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_baseline_method; %feature("docstring", "Gets the method used to compute the baseline Returns: A string specifying the method to compute the baseline. Can be one of \"mean\" or \"median\"") get_baseline_method; const char* get_baseline_method( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_baseline_method; %feature("docstring", "Sets the method to compute the baseline. Arguments: method -- A string specifying the method to calculate the baseline. Can be one of \"mean\" or \"median\" Returns: False upon failure.") set_baseline_method; bool set_baseline_method( const char* method ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_latency_start_mode; %feature("docstring", "Gets the latency start mode Returns: A string specifying the latency start mode. Can be one of \"manual\", \"peak\", \"rise\" or \"half\"") get_latency_start_mode; const char* get_latency_start_mode( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_latency_end; %feature("kwargs") set_latency_end; %feature("docstring", "Sets the second latency cursor to a new position. Arguments: pos -- The new cursor position, either in units of sampling points if is_time == False (default) or in units of time if is_time == True. is_time -- see above. Returns: False upon failure (such as out-of-range).") set_latency_end; bool set_latency_end( double pos, bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_latency_end_mode; %feature("docstring", "Sets the mode of the latency end cursor. Arguments: direction -- A string specifying the mode for the latency end cursor. Can be one of \"manual\", \"peak\", \"rise\", \"foot\" or \"half\" Returns: False upon failure.") set_latency_end_mode; bool set_latency_end_mode( const char* mode ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_latency_end_mode; %feature("docstring", "Gets the latency end mode Returns: A string specifying the latency end mode. Can be one of \"manual\", \"peak\", \"rise\", \"foot\" or \"half\"") get_latency_end_mode; const char* get_latency_end_mode( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_latency_start; %feature("kwargs") get_latency_start; %feature("docstring", "Returns the zero-based index or the time point of the latency start cursor. Arguments: is_time -- If False (default), returns the zero-based index. If True, returns the time from the beginning of the trace to the cursor position.") get_latency_start; double get_latency_start( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_latency_end; %feature("kwargs") get_latency_end; %feature("docstring", "Returns the zero-based index or the time point of the latency end cursor. Arguments: is_time -- If False (default), returns the zero-based index. If True, returns the time from the beginning of the trace to the cursor position.") get_latency_end; double get_latency_end( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_base_SD; %feature("docstring", "Returns the standard deviation of the baseline in the current (active) channel. Uses the currently measured values, i.e. does not update measurements if the baseline cursors have changed. Returns: 0.0 upon failure (i.e no file opened), otherwise, the standard deviation of the baseline.") get_base_SD; double get_base_SD( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_base_start; %feature("kwargs") get_base_start; %feature("docstring", "Returns the zero-based index or the time point of the base start cursor. Arguments: is_time -- If False (default), returns the zero-based index. If True, returns the time from the beginning of the trace to the cursor position.") get_base_start; double get_base_start( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_base_end; %feature("kwargs") get_base_end; %feature("docstring", "Returns the zero-based index or the time point of the base end cursor. Arguments: is_time -- If False (default), returns the zero-based index. If True, returns the time from the beginning of the trace to the cursor position.") get_base_end; double get_base_end( bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_base_start; %feature("kwargs") set_base_start; %feature("docstring", "Sets the base start cursor to a new position. This will NOT update the baseline calculation. You have to either call measure() or hit enter in the main window to achieve that. Arguments: pos -- The new cursor position, either in units of sampling points if is_time == False (default) or in units of time if is_time == True. is_time -- see above. Returns: False upon failure (such as out-of-range).") set_base_start; bool set_base_start( double pos, bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_base_end; %feature("kwargs") set_base_end; %feature("docstring", "Sets the base end cursor to a new position. This will NOT update the baseline calculation. You have to either call measure() or hit enter in the main window to achieve that. Arguments: pos -- The new cursor position, either in units of sampling points if is_time == False (default) or in units of time if is_time == True. is_time -- see above. Returns: False upon failure (such as out-of-range).") set_base_end; bool set_base_end( double pos, bool is_time = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_slope; %feature("docstring", "Sets the AP threshold to the value given by the slope and takes it as reference for AP kinetic measurements. Note that you have to either call measure() or hit enter to update calculations. Arguments: slope -- slope value in mV/ms Returns: False upon failure (such as out-of-range).") set_slope; bool set_slope( double slope); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) measure; %feature("docstring", "Updates all measurements (e.g. peak, baseline, latency) according to the current cursor settings. As if you had pressed \"Enter\" in the main window. Returns: False upon failure, True otherwise.") measure; bool measure( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_selected_indices; %feature("docstring", "Returns a tuple with the indices (ZERO-BASED) of the selected traces.") get_selected_indices; PyObject* get_selected_indices( ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_trace; %feature("docstring", "Sets the currently displayed trace to a new index. Subsequently updates all measurements (e.g. peak, base, latency, i.e. you don't need to call measure() yourself.) Arguments: trace -- The zero-based index of the new trace to be displayed. Returns: True upon success, false otherwise (such as out-of-range).") set_trace; bool set_trace( int trace ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_trace_index; %feature("docstring", "Returns the ZERO-BASED index of the currently displayed trace (this is one less than what is shown in the combo box). ") get_trace_index; int get_trace_index(); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_channel_index; %feature("kwargs") get_channel_index; %feature("docstring", "Returns the ZERO-BASED index of the specified channel. Arguments: active -- If True, returns the index of the active (black) channel. If False, returns the index of the reference (red) channel. ") get_channel_index; int get_channel_index( bool active = true ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_channel_name; %feature("kwargs") get_channel_name; %feature("docstring", "Returns the name of the channel with the specified index. Arguments: index -- The zero-based index of the channel of interest. If < 0, the name of the active channel will be returned. Returns: the name of the channel with the specified index.") get_channel_name; const char* get_channel_name( int index = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_channel; %feature("docstring", "Sets the currently displayed channel to a new index. Subsequently updates all measurements (e.g. peak, base, latency, i.e. you don't need to call measure() yourself.) Arguments: channel -- The zero-based index of the new trace to be displayed. Returns: True upon success, false otherwise (such as out-of-range).") set_channel; bool set_channel( int channel); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_channel_name; %feature("kwargs") set_channel_name; %feature("docstring", "Sets the name of the channel with the specified index. Arguments: name -- The new name of the channel. index -- The zero-based index of the channel of interest. If < 0, the active channel will be used. Returns: True upon success.") set_channel_name; bool set_channel_name( const char* name, int index = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) get_trace_name; %feature("kwargs") get_trace_name; %feature("docstring", "Returns the name of the trace with the specified index. Arguments: trace -- The zero-based index of the trace of interest. If < 0, the name of the active trace will be returned. channel -- The zero-based index of the channel of interest. If < 0, the active channel will be used. Returns: the name of the trace with the specified index.") get_trace_name; const char* get_trace_name( int trace = -1, int channel = -1 ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) align_selected; %feature("kwargs") align_selected; %feature("docstring", "Aligns the selected traces to the index that is returned by the alignment function, and then creates a new window showing the aligned traces. This function requires to select the traces of interest and the presence of a second (i.e reference) channel. Arguments: alignment -- The alignment function to be used. Accepts any function returning a valid index within a trace. These are some predefined possibilities: maxrise_index (default; maximal slope during rising phase) peak_index (Peak of an event) foot_index (Beginning of an event) t50left_index t50right_index (Left/right half-maximal amplitude) active -- If True, the alignment function will be applied to the active channel. If False (default), it will be applied to the reference channel. zeropad -- Not yet implemented: If True, missing parts at the beginning or end of a trace will be padded with zeros after the alignment. If False (default), traces will be cropped so that all traces have equal sizes. ") align_selected; void align_selected( double (*alignment)( bool ), bool active = false ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) set_marker; %feature("docstring", "Sets a marker to the specified position in the current trace. Arguments: x -- The horizontal marker position in units of sampling points. y -- The vertical marker position in measurement units (e.g. mV). Returns: False upon failure (such as out-of-range).") set_marker; bool set_marker( double x, double y ); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) erase_markers; %feature("docstring", "Erases all markers in the current trace. Returns: False upon failure.") erase_marker; bool erase_markers(); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) plot_xmin; %feature("docstring", "Returns x value of the left screen border") plot_xmin; double plot_xmin(); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) plot_xmax; %feature("docstring", "Returns x value of the right screen border") plot_xmax; double plot_xmax(); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) plot_ymin; %feature("docstring", "Returns y value of the bottom screen border") plot_ymin; double plot_ymin(); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) plot_ymax; %feature("docstring", "Returns y value of the top screen border") plot_ymax; double plot_ymax(); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) plot_y2min; %feature("docstring", "Returns y value of the bottom screen border for the reference channel") plot_y2min; double plot_y2min(); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) plot_y2max; %feature("docstring", "Returns y value of the top screen border for the reference channel") plot_y2max; double plot_y2max(); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) mpl_panel; %feature("kwargs") mpl_panel; %feature("docstring", "Returns a pointer to the parent window") mpl_panel; PyObject* mpl_panel(const std::vector& figsize = std::vector(_figsize, _figsize+2)); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %pythoncode { class StfException(Exception): """ raises Exceptions for the Stfio module """ def __init__(self, error_msg): self.msg = error_msg def __str__(self): return repr(self.msg) def new_window_list( array_list ): """Creates a new window showing a sequence of 1D NumPy arrays, or a sequence of a sequence of 1D NumPy arrays. As opposed to new_window_matrix(), this has the advantage that the arrays need not have equal sizes. Arguments: array_list -- A sequence (e.g. list or tuple) of numpy arrays, or a sequence of a sequence of numpy arrays. Returns: True upon successful completion, false otherwise. """ try: it = iter(array_list) except TypeError: print( "Argument is not a sequence" ) return False try: it = iter(array_list[0]) except TypeError: print( "Argument is not a sequence of sequences." ) print( "You can either pass a sequence of 1D NumPy arrays," ) print( "Or a sequence of sequences of 1D NumPy arrays." ) return False is_3d = True try: it = iter(array_list[0][0]) except TypeError: is_3d = False n_channels = 1 if is_3d: n_channels = len(array_list) _gMatrix_resize( n_channels, len(array_list[0]) ) for (n_c, c) in enumerate(array_list): for (n_s, s) in enumerate(c): _gMatrix_at( s, n_c, n_s ) else: _gMatrix_resize( n_channels, len(array_list) ) for (n, a) in enumerate(array_list): _gMatrix_at( a, 0, n ) return _new_window_gMatrix( ) def stfio_open(stfio_rec): """Open an stfio recording object with Stimfit Arguments: stfio_rec -- An stfio recording object, e.g. opened with stfio.read("filename") Returns: True upon successful completion, false otherwise. """ n_channels = len(stfio_rec) _gMatrix_resize( n_channels, len(stfio_rec[0]) ) for n_c, c in enumerate(stfio_rec): for n_s, s in enumerate(c): _gMatrix_at( c[n_s].asarray(), n_c, n_s ) succ = _new_window_gMatrix( ) if not succ: return False for n_c, c in enumerate(stfio_rec): set_channel_name(c.name, n_c) set_yunits(c.yunits, n_c) set_recording_date(stfio_rec.date) set_recording_time(stfio_rec.time) set_recording_comment(stfio_rec.comment) set_xunits(stfio_rec.xunits) set_sampling_interval(stfio_rec.dt) measure() return True def cut_traces( pt ): """Cuts the selected traces at the sampling point pt, and shows the cut traces in a new window. Returns True upon success, False upon failure.""" if not get_selected_indices(): print( "Trace is not selected!" ) return False new_list = list() for n in get_selected_indices(): if not set_trace(n): return False if pt < get_size_trace(): new_list.append( get_trace()[:pt] ) new_list.append( get_trace()[pt:] ) else: print( "Cutting point %d is out of range" %pt ) if len(new_list) > 0: new_window_list( new_list ) return True def cut_traces_multi( pt_list ): """Cuts the selected traces at the sampling points in pt_list and shows the cut traces in a new window. Returns True upon success, False upon failure.""" if not get_selected_indices(): print( "Trace is not selected!" ) return False new_list = list() for n in get_selected_indices(): if not set_trace(n): return False old_pt = 0 for pt in pt_list: if pt < get_size_trace(): new_list.append( get_trace()[old_pt:pt] ) old_pt = pt else: print( "Cutting point %d is out of range" %pt ) if len(new_list) > 0: new_list.append( get_trace()[old_pt:] ) new_window_list( new_list ) return True def template_matching(template, mode="criterion", norm=True, lowpass=0.5, highpass=0.0001): import sys sys.stderr.write("template_matching is deprecated. Use detect_events instead.\n") return detect_events(template, mode, norm, lowpass, highpass) def detect_events(template, mode="criterion", norm=True, lowpass=0.5, highpass=0.0001): if not check_doc(): return None import stfio return stfio.detect_events(get_trace(), template, get_sampling_interval(), mode, norm, lowpass, highpass) def peak_detection(data, threshold, min_distance): import stfio return stfio.peak_detection(data, threshold, min_distance) class _cursor_pair(object): def __init__(self, get_start, set_start, get_end, set_end, get_value=None, index=None): self._get_start = get_start self._set_start = set_start self._get_end = get_end self._set_end = set_end self._get_value = get_value self._index = index def _get_cursors(self, is_time): if not check_doc(show_dialog=False): raise StfException("Couldn't find open file") return (self._get_start(is_time=is_time), self._get_end(is_time=is_time)) def _set_cursors(self, cursors, is_time): if not check_doc(show_dialog=False): raise StfException("Couldn't find open file") try: if len(cursors) != 2: raise ValueError("cursors has to have length 2 when setting the time value") except TypeError: raise TypeError("cursors has to be a tuple or list of length 2") if cursors[0] is not None: self._set_start(cursors[0], is_time=is_time) if cursors[1] is not None: self._set_end(cursors[1], is_time=is_time) @property def cursor_time(self): return self._get_cursors(True) @cursor_time.setter def cursor_time(self, cursors): self._set_cursors(cursors, True) @property def cursor_index(self): return self._get_cursors(False) @cursor_index.setter def cursor_index(self, cursors): self._set_cursors(cursors, False) @property def value(self): if self._get_value is None: raise AttributeError("Missing _get_value function") return self._get_value() @property def index(self): if self._index is None: raise AttributeError("Missing _index function") return self._index() base = _cursor_pair(get_base_start, set_base_start, get_base_end, set_base_end, get_base) peak = _cursor_pair(get_peak_start, set_peak_start, get_peak_end, set_peak_end, get_peak, peak_index) fit = _cursor_pair(get_fit_start, set_fit_start, get_fit_end, set_fit_end) latency = _cursor_pair( get_latency_start, set_latency_start, get_latency_end, set_latency_end, get_latency) } //-------------------------------------------------------------------- stimfit-0.15.8/src/stimfit/py/heka.py0000664000175000017500000000530213062445067014376 00000000000000import sys import numpy as np def read_heka(filename): ascfile = open(filename) nchannels = 0 nsweeps = 0 newsweep = True header = True channels = [] channelnames = [] channelunits = [] channeldt = [] istext=False sys.stdout.write("Reading") sys.stdout.flush() for line in ascfile: words = line.replace('\r','').replace('\n','').split(",") try: np = int(words[0]) istext=False except: istext = True if not header: newsweep=True else: prevline = words if not istext: if header: nchannels = (len(words)-1)/2 channels = [list() for i in range(nchannels)] for nc in range(nchannels): channelnames.append( prevline[nc*2+2].replace("\"",'').strip()[:-3]) channelunits.append( prevline[nc*2+2][prevline[nc*2+2].find('[')+1: \ prevline[nc*2+2].find(']')]) header=False if newsweep: for channel in channels: channel.append(list()) nsweeps += 1 sys.stdout.write(".") sys.stdout.flush() newsweep=False if len(channels[-1][-1])==0: dt0 = float(words[1]) if len(channels[-1][-1])==1: dt1 = float(words[1]) channeldt.append(dt1-dt0) for nc, channel in enumerate(channels): channel[-1].append(float(words[nc*2+2])) return channels, channelnames, channelunits, channeldt def read_heka_stf(filename): channels, channelnames, channelunits, channeldt = read_heka(filename) for nc, channel in enumerate(channels): if channelunits[nc]=="V": for ns, sweep in enumerate(channel): channels[nc][ns] = np.array(channels[nc][ns]) channels[nc][ns] *= 1.0e3 channelunits[nc]="mV" if channelunits[nc]=="A": for ns, sweep in enumerate(channel): channels[nc][ns] = np.array(channels[nc][ns]) channels[nc][ns] *= 1.0e12 channelunits[nc]="pA" import stf stf.new_window_list(channels) for nc, name in enumerate(channelnames): stf.set_channel_name(name, nc) for nc, units in enumerate(channelunits): for ns in range(stf.get_size_channel()): stf.set_yunits(units, ns, nc) stf.set_sampling_interval(channeldt[0]*1e3) if __name__=="__main__": read_heka("JK100205aa.asc") stimfit-0.15.8/src/stimfit/py/embedded_init.py0000664000175000017500000000235713062445067016251 00000000000000#========================================================================= # embedded_init.py # 2009.12.31 # # This file loads both Numpy and stf modules into the current namespace. # Additionally, it loads the custom initialization script (stf_init.py) # # 2010.06.12 # Major stf classes were added (Recording, Channel, Section) # # It is used by embedded_stf.py and embedded_ipython.py # Please, do not modify this file unless you know what you are doing # #========================================================================= import numpy as np import stf from stf import * from os.path import basename try: from stf_init import * except ImportError: # let the user know stf_init does not work! pass except SyntaxError: pass else: pass def intro_msg(): """ this is the starting message of the embedded Python shell. Contains the current Stimfit version, together with the NumPy and wxPython version. """ # access current versions of wxWidgets and NumPy from wx import version as wx_version from numpy.version import version as numpy_version version_s = 'NumPy %s, wxPython %s' % (numpy_version, wx_version()) intro = '%s, using %s' % (stf.get_versionstring(), version_s) return intro stimfit-0.15.8/src/stimfit/py/embedded_mpl.py0000775000175000017500000001001713062445067016071 00000000000000#=========================================================================== # embedded_mpl.py # 2011.02.05 # Don't modify this file unless you know what you are doing!!! #=========================================================================== """ embedded_mpl.py starting code to embed a matplotlib wx figure into the stf application. """ import sys if 'linux' in sys.platform: import wxversion try: wxversion.select('2.8') except: pass import wx import matplotlib if sys.version_info[0] < 3: matplotlib.use('WXAgg') from matplotlib.backends.backend_wxagg import \ FigureCanvasWxAgg as FigCanvas, \ NavigationToolbar2WxAgg as NavigationToolbar from matplotlib.figure import Figure import matplotlib.mlab as mlab import numpy as np try: import stfio_plot except: from stfio import plot as stfio_plot class MplPanel(wx.Panel): """The matplotlib figure""" def __init__(self, parent, figsize=(8.0, 6.0)): super(MplPanel, self).__init__(parent, -1) self.fig = Figure(figsize, dpi=72) self.canvas = FigCanvas(self, -1, self.fig) # Since we have only one plot, we can use add_axes # instead of add_subplot, but then the subplot # configuration tool in the navigation toolbar wouldn't # work. # self.axes = self.fig.add_subplot(111) # Create the navigation toolbar, tied to the canvas # self.toolbar = NavigationToolbar(self.canvas) # # Layout with box sizers # self.vbox = wx.BoxSizer(wx.VERTICAL) self.vbox.Add(self.canvas, 1, wx.EXPAND | wx.BOTTOM | wx.LEFT | wx.RIGHT, 10) self.vbox.Add(self.toolbar, 0, wx.EXPAND) self.SetSizer(self.vbox) def plot_screen(self): import stf tsl = [] try: l = stf.get_selected_indices() for idx in l: tsl.append(stfio_plot.Timeseries(stf.get_trace(idx), stf.get_sampling_interval(), yunits = stf.get_yunits(), color='0.2')) fit = stf.get_fit(idx) if fit is not None: self.axes.plot(fit[0], fit[1], color='0.4', alpha=0.5, lw=5.0) except: pass tsl.append(stfio_plot.Timeseries(stf.get_trace(), stf.get_sampling_interval(), yunits = stf.get_yunits())) if stf.get_size_recording()>1: tsl2 = [stfio_plot.Timeseries(stf.get_trace(trace=-1, channel=stf.get_channel_index(False)), stf.get_sampling_interval(), yunits = stf.get_yunits(trace=-1, channel=stf.get_channel_index(False)), color='r', linestyle='-r')] stfio_plot.plot_traces(tsl, traces2=tsl2, ax=self.axes, textcolor2 = 'r', xmin=stf.plot_xmin(), xmax=stf.plot_xmax(), ymin=stf.plot_ymin(), ymax=stf.plot_ymax(), y2min=stf.plot_y2min(), y2max=stf.plot_y2max()) else: stfio_plot.plot_traces(tsl, ax=self.axes, xmin=stf.plot_xmin(), xmax=stf.plot_xmax(), ymin=stf.plot_ymin(), ymax=stf.plot_ymax()) fit = stf.get_fit() if fit is not None: self.axes.plot(fit[0], fit[1], color='0.2', alpha=0.5, lw=5.0) def plot_spectrum(self): import stf Pow, freq = mlab.psd(stf.get_trace(), Fs=(1.0/stf.get_sampling_interval())*1e3, detrend=mlab.detrend_linear) self.axes.plot(freq, 10*np.log10(Pow)) self.axes.set_xlabel("Frequency (Hz)") self.axes.set_ylabel("Power spectral density (dB/Hz)") stimfit-0.15.8/src/stimfit/py/tdms.py0000664000175000017500000000026413152223421014423 00000000000000import numpy as np import stf import stfio def tdms_open(fn): record = stfio.read_tdms(fn) if record is None: return None return record['data'], record['dt'] stimfit-0.15.8/src/stimfit/py/minidemo.py0000775000175000017500000000203713062445067015274 00000000000000"""Performs fits as decribed in the manual to create preliminary and final templates from minis.dat. last revision: May 09, 2008 C. Schmidt-Hieber """ import stf def preliminary(): """Creates a preliminary template""" stf.set_peak_start(209900) stf.set_peak_end(210500) stf.set_fit_start(209900) stf.set_fit_end(210400) stf.set_peak_mean(3) stf.set_base_start(209600) stf.set_base_end(209900) stf.measure() return stf.leastsq(5) def final(): """Creates a final template""" stf.set_peak_start(100) stf.set_peak_end(599) stf.set_fit_start(100) stf.set_fit_end(599) stf.set_peak_mean(3) stf.set_base_start(0) stf.set_base_end(100) stf.measure() return stf.leastsq(5) def batch_cursors(): """Sets appropriate cursor positions for analysing the extracted events.""" stf.set_peak_start(100) stf.set_peak_end(598) stf.set_fit_start(120) stf.set_fit_end(598) stf.set_peak_mean(3) stf.set_base_start(0) stf.set_base_end(100) stf.measure() stimfit-0.15.8/src/stimfit/py/numpy.i0000664000175000017500000015174213062445067014450 00000000000000/* -*- C -*- (not really, but good for syntax highlighting) */ #ifdef SWIGPYTHON %{ #ifndef SWIG_FILE_WITH_INIT # define NO_IMPORT_ARRAY #endif #include "stdio.h" #include %} /**********************************************************************/ /* The following code originally appeared in * enthought/kiva/agg/src/numeric.i written by Eric Jones. It was * translated from C++ to C by John Hunter. Bill Spotz has modified * it to fix some minor bugs, upgrade from Numeric to numpy (all * versions), add some comments and functionality, and convert from * direct code insertion to SWIG fragments. */ %fragment("NumPy_Macros", "header") { /* Macros to extract array attributes. */ %#define is_array(a) ((a) && PyArray_Check((PyArrayObject *)a)) %#define array_type(a) (int)(PyArray_TYPE(a)) %#define array_numdims(a) (((PyArrayObject *)a)->nd) %#define array_dimensions(a) (((PyArrayObject *)a)->dimensions) %#define array_size(a,i) (((PyArrayObject *)a)->dimensions[i]) %#define array_data(a) (((PyArrayObject *)a)->data) %#define array_is_contiguous(a) (PyArray_ISCONTIGUOUS(a)) %#define array_is_native(a) (PyArray_ISNOTSWAPPED(a)) %#define array_is_fortran(a) (PyArray_ISFORTRAN(a)) } /**********************************************************************/ %fragment("NumPy_Utilities", "header") { /* Given a PyObject, return a string describing its type. */ const char* pytype_string(PyObject* py_obj) { if (py_obj == NULL ) return "C NULL value"; if (py_obj == Py_None ) return "Python None" ; if (PyCallable_Check(py_obj)) return "callable" ; if (PyString_Check( py_obj)) return "string" ; if (PyInt_Check( py_obj)) return "int" ; if (PyFloat_Check( py_obj)) return "float" ; if (PyDict_Check( py_obj)) return "dict" ; if (PyList_Check( py_obj)) return "list" ; if (PyTuple_Check( py_obj)) return "tuple" ; if (PyModule_Check( py_obj)) return "module" ; %#if PY_MAJOR_VERSION < 3 if (PyFile_Check( py_obj)) return "file" ; if (PyInstance_Check(py_obj)) return "instance" ; %#endif return "unkown type"; } /* Given a NumPy typecode, return a string describing the type. */ const char* typecode_string(int typecode) { static const char* type_names[25] = {"bool", "byte", "unsigned byte", "short", "unsigned short", "int", "unsigned int", "long", "unsigned long", "long long", "unsigned long long", "float", "double", "long double", "complex float", "complex double", "complex long double", "object", "string", "unicode", "void", "ntypes", "notype", "char", "unknown"}; return typecode < 24 ? type_names[typecode] : type_names[24]; } /* Make sure input has correct numpy type. Allow character and byte * to match. Also allow int and long to match. This is deprecated. * You should use PyArray_EquivTypenums() instead. */ int type_match(int actual_type, int desired_type) { return PyArray_EquivTypenums(actual_type, desired_type); } } /**********************************************************************/ %fragment("NumPy_Object_to_Array", "header", fragment="NumPy_Backward_Compatibility", fragment="NumPy_Macros", fragment="NumPy_Utilities") { /* Given a PyObject pointer, cast it to a PyArrayObject pointer if * legal. If not, set the python error string appropriately and * return NULL. */ PyArrayObject* obj_to_array_no_conversion(PyObject* input, int typecode) { PyArrayObject* ary = NULL; if (is_array(input) && (typecode == NPY_NOTYPE || PyArray_EquivTypenums(array_type(input), typecode))) { ary = (PyArrayObject*) input; } else if is_array(input) { const char* desired_type = typecode_string(typecode); const char* actual_type = typecode_string(array_type(input)); PyErr_Format(PyExc_TypeError, "Array of type '%s' required. Array of type '%s' given", desired_type, actual_type); ary = NULL; } else { const char * desired_type = typecode_string(typecode); const char * actual_type = pytype_string(input); PyErr_Format(PyExc_TypeError, "Array of type '%s' required. A '%s' was given", desired_type, actual_type); ary = NULL; } return ary; } /* Convert the given PyObject to a NumPy array with the given * typecode. On success, return a valid PyArrayObject* with the * correct type. On failure, the python error string will be set and * the routine returns NULL. */ PyArrayObject* obj_to_array_allow_conversion(PyObject* input, int typecode, int* is_new_object) { PyArrayObject* ary = NULL; PyObject* py_obj; if (is_array(input) && (typecode == NPY_NOTYPE || PyArray_EquivTypenums(array_type(input),typecode))) { ary = (PyArrayObject*) input; *is_new_object = 0; } else { py_obj = PyArray_FROMANY(input, typecode, 0, 0, NPY_DEFAULT); /* If NULL, PyArray_FromObject will have set python error value.*/ ary = (PyArrayObject*) py_obj; *is_new_object = 1; } return ary; } /* Given a PyArrayObject, check to see if it is contiguous. If so, * return the input pointer and flag it as not a new object. If it is * not contiguous, create a new PyArrayObject using the original data, * flag it as a new object and return the pointer. */ PyArrayObject* make_contiguous(PyArrayObject* ary, int* is_new_object, int min_dims, int max_dims) { PyArrayObject* result; if (array_is_contiguous(ary)) { result = ary; *is_new_object = 0; } else { result = (PyArrayObject*) PyArray_ContiguousFromObject((PyObject*)ary, array_type(ary), min_dims, max_dims); *is_new_object = 1; } return result; } /* Given a PyArrayObject, check to see if it is Fortran-contiguous. * If so, return the input pointer, but do not flag it as not a new * object. If it is not Fortran-contiguous, create a new * PyArrayObject using the original data, flag it as a new object * and return the pointer. */ PyArrayObject* make_fortran(PyArrayObject* ary, int* is_new_object, int min_dims, int max_dims) { PyArrayObject* result; if (array_is_fortran(ary)) { result = ary; *is_new_object = 0; } else { Py_INCREF(ary->descr); result = (PyArrayObject*) PyArray_FromArray(ary, ary->descr, NPY_FORTRAN); *is_new_object = 1; } return result; } /* Convert a given PyObject to a contiguous PyArrayObject of the * specified type. If the input object is not a contiguous * PyArrayObject, a new one will be created and the new object flag * will be set. */ PyArrayObject* obj_to_array_contiguous_allow_conversion(PyObject* input, int typecode, int* is_new_object) { int is_new1 = 0; int is_new2 = 0; PyArrayObject* ary2; PyArrayObject* ary1 = obj_to_array_allow_conversion(input, typecode, &is_new1); if (ary1) { ary2 = make_contiguous(ary1, &is_new2, 0, 0); if ( is_new1 && is_new2) { Py_DECREF(ary1); } ary1 = ary2; } *is_new_object = is_new1 || is_new2; return ary1; } /* Convert a given PyObject to a Fortran-ordered PyArrayObject of the * specified type. If the input object is not a Fortran-ordered * PyArrayObject, a new one will be created and the new object flag * will be set. */ PyArrayObject* obj_to_array_fortran_allow_conversion(PyObject* input, int typecode, int* is_new_object) { int is_new1 = 0; int is_new2 = 0; PyArrayObject* ary2; PyArrayObject* ary1 = obj_to_array_allow_conversion(input, typecode, &is_new1); if (ary1) { ary2 = make_fortran(ary1, &is_new2, 0, 0); if (is_new1 && is_new2) { Py_DECREF(ary1); } ary1 = ary2; } *is_new_object = is_new1 || is_new2; return ary1; } } /* end fragment */ /**********************************************************************/ %fragment("NumPy_Array_Requirements", "header", fragment="NumPy_Backward_Compatibility", fragment="NumPy_Macros") { /* Test whether a python object is contiguous. If array is * contiguous, return 1. Otherwise, set the python error string and * return 0. */ int require_contiguous(PyArrayObject* ary) { int contiguous = 1; if (!array_is_contiguous(ary)) { PyErr_SetString(PyExc_TypeError, "Array must be contiguous. A non-contiguous array was given"); contiguous = 0; } return contiguous; } /* Require that a numpy array is not byte-swapped. If the array is * not byte-swapped, return 1. Otherwise, set the python error string * and return 0. */ int require_native(PyArrayObject* ary) { int native = 1; if (!array_is_native(ary)) { PyErr_SetString(PyExc_TypeError, "Array must have native byteorder. " "A byte-swapped array was given"); native = 0; } return native; } /* Require the given PyArrayObject to have a specified number of * dimensions. If the array has the specified number of dimensions, * return 1. Otherwise, set the python error string and return 0. */ int require_dimensions(PyArrayObject* ary, int exact_dimensions) { int success = 1; if (array_numdims(ary) != exact_dimensions) { PyErr_Format(PyExc_TypeError, "Array must have %d dimensions. Given array has %d dimensions", exact_dimensions, array_numdims(ary)); success = 0; } return success; } /* Require the given PyArrayObject to have one of a list of specified * number of dimensions. If the array has one of the specified number * of dimensions, return 1. Otherwise, set the python error string * and return 0. */ int require_dimensions_n(PyArrayObject* ary, int* exact_dimensions, int n) { int success = 0; int i; char dims_str[255] = ""; char s[255]; for (i = 0; i < n && !success; i++) { if (array_numdims(ary) == exact_dimensions[i]) { success = 1; } } if (!success) { for (i = 0; i < n-1; i++) { sprintf(s, "%d, ", exact_dimensions[i]); strcat(dims_str,s); } sprintf(s, " or %d", exact_dimensions[n-1]); strcat(dims_str,s); PyErr_Format(PyExc_TypeError, "Array must have %s dimensions. Given array has %d dimensions", dims_str, array_numdims(ary)); } return success; } /* Require the given PyArrayObject to have a specified shape. If the * array has the specified shape, return 1. Otherwise, set the python * error string and return 0. */ int require_size(PyArrayObject* ary, npy_intp* size, int n) { int i; int success = 1; int len; char desired_dims[255] = "["; char s[255]; char actual_dims[255] = "["; for(i=0; i < n;i++) { if (size[i] != -1 && size[i] != array_size(ary,i)) { success = 0; } } if (!success) { for (i = 0; i < n; i++) { if (size[i] == -1) { sprintf(s, "*,"); } else { sprintf(s, "%ld,", (long int)size[i]); } strcat(desired_dims,s); } len = strlen(desired_dims); desired_dims[len-1] = ']'; for (i = 0; i < n; i++) { sprintf(s, "%ld,", (long int)array_size(ary,i)); strcat(actual_dims,s); } len = strlen(actual_dims); actual_dims[len-1] = ']'; PyErr_Format(PyExc_TypeError, "Array must have shape of %s. Given array has shape of %s", desired_dims, actual_dims); } return success; } /* Require the given PyArrayObject to to be FORTRAN ordered. If the * the PyArrayObject is already FORTRAN ordered, do nothing. Else, * set the FORTRAN ordering flag and recompute the strides. */ int require_fortran(PyArrayObject* ary) { int success = 1; int nd = array_numdims(ary); int i; if (array_is_fortran(ary)) return success; /* Set the FORTRAN ordered flag */ ary->flags = NPY_FARRAY; /* Recompute the strides */ ary->strides[0] = ary->strides[nd-1]; for (i=1; i < nd; ++i) ary->strides[i] = ary->strides[i-1] * array_size(ary,i-1); return success; } } /* Combine all NumPy fragments into one for convenience */ %fragment("NumPy_Fragments", "header", fragment="NumPy_Backward_Compatibility", fragment="NumPy_Macros", fragment="NumPy_Utilities", fragment="NumPy_Object_to_Array", fragment="NumPy_Array_Requirements") { } /* End John Hunter translation (with modifications by Bill Spotz) */ /* %numpy_typemaps() macro * * This macro defines a family of 41 typemaps that allow C arguments * of the form * * (DATA_TYPE IN_ARRAY1[ANY]) * (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) * (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) * * (DATA_TYPE IN_ARRAY2[ANY][ANY]) * (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) * (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) * * (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) * (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) * (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3) * * (DATA_TYPE INPLACE_ARRAY1[ANY]) * (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) * (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) * * (DATA_TYPE INPLACE_ARRAY2[ANY][ANY]) * (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) * (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2) * * (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) * (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3) * (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3) * * (DATA_TYPE ARGOUT_ARRAY1[ANY]) * (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) * (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) * * (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) * * (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) * * (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) * (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1) * * (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) * (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2) * (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) * (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2) * * (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) * (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3) * (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) * (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3) * * where "DATA_TYPE" is any type supported by the NumPy module, and * "DIM_TYPE" is any int-like type suitable for specifying dimensions. * The difference between "ARRAY" typemaps and "FARRAY" typemaps is * that the "FARRAY" typemaps expect FORTRAN ordering of * multidimensional arrays. In python, the dimensions will not need * to be specified (except for the "DATA_TYPE* ARGOUT_ARRAY1" * typemaps). The IN_ARRAYs can be a numpy array or any sequence that * can be converted to a numpy array of the specified type. The * INPLACE_ARRAYs must be numpy arrays of the appropriate type. The * ARGOUT_ARRAYs will be returned as new numpy arrays of the * appropriate type. * * These typemaps can be applied to existing functions using the * %apply directive. For example: * * %apply (double* IN_ARRAY1, int DIM1) {(double* series, int length)}; * double prod(double* series, int length); * * %apply (int DIM1, int DIM2, double* INPLACE_ARRAY2) * {(int rows, int cols, double* matrix )}; * void floor(int rows, int cols, double* matrix, double f); * * %apply (double IN_ARRAY3[ANY][ANY][ANY]) * {(double tensor[2][2][2] )}; * %apply (double ARGOUT_ARRAY3[ANY][ANY][ANY]) * {(double low[2][2][2] )}; * %apply (double ARGOUT_ARRAY3[ANY][ANY][ANY]) * {(double upp[2][2][2] )}; * void luSplit(double tensor[2][2][2], * double low[2][2][2], * double upp[2][2][2] ); * * or directly with * * double prod(double* IN_ARRAY1, int DIM1); * * void floor(int DIM1, int DIM2, double* INPLACE_ARRAY2, double f); * * void luSplit(double IN_ARRAY3[ANY][ANY][ANY], * double ARGOUT_ARRAY3[ANY][ANY][ANY], * double ARGOUT_ARRAY3[ANY][ANY][ANY]); */ %define %numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE) /************************/ /* Input Array Typemaps */ /************************/ /* Typemap suite for (DATA_TYPE IN_ARRAY1[ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE IN_ARRAY1[ANY]) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE IN_ARRAY1[ANY]) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[1] = { $1_dim0 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 1) || !require_size(array, size, 1)) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(freearg) (DATA_TYPE IN_ARRAY1[ANY]) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[1] = { -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 1) || !require_size(array, size, 1)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); } %typemap(freearg) (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[1] = {-1}; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 1) || !require_size(array, size, 1)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE IN_ARRAY2[ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE IN_ARRAY2[ANY][ANY]) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE IN_ARRAY2[ANY][ANY]) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { $1_dim0, $1_dim1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2)) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(freearg) (DATA_TYPE IN_ARRAY2[ANY][ANY]) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); } %typemap(freearg) (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { -1, -1 }; array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); } %typemap(freearg) (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[2] = { -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3)) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(freearg) (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { -1, -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); } %typemap(freearg) (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* IN_ARRAY3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { -1, -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { -1, -1, -1 }; array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3) | !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); } %typemap(freearg) (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* IN_FARRAY3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3) { $1 = is_array($input) || PySequence_Check($input); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3) (PyArrayObject* array=NULL, int is_new_object=0) { npy_intp size[3] = { -1, -1, -1 }; array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE, &is_new_object); if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DATA_TYPE*) array_data(array); } %typemap(freearg) (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3) { if (is_new_object$argnum && array$argnum) { Py_DECREF(array$argnum); } } /***************************/ /* In-Place Array Typemaps */ /***************************/ /* Typemap suite for (DATA_TYPE INPLACE_ARRAY1[ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE INPLACE_ARRAY1[ANY]) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE INPLACE_ARRAY1[ANY]) (PyArrayObject* array=NULL) { npy_intp size[1] = { $1_dim0 }; array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,1) || !require_size(array, size, 1) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = ($1_ltype) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) (PyArrayObject* array=NULL, int i=1) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,1) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = 1; for (i=0; i < array_numdims(array); ++i) $2 *= array_size(array,i); } /* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) (PyArrayObject* array=NULL, int i=0) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,1) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = 1; for (i=0; i < array_numdims(array); ++i) $1 *= array_size(array,i); $2 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE INPLACE_ARRAY2[ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE INPLACE_ARRAY2[ANY][ANY]) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE INPLACE_ARRAY2[ANY][ANY]) (PyArrayObject* array=NULL) { npy_intp size[2] = { $1_dim0, $1_dim1 }; array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_size(array, size, 2) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = ($1_ltype) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,2) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) (PyArrayObject* array=NULL) { npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 }; array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_size(array, size, 3) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = ($1_ltype) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* INPLACE_ARRAY3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_contiguous(array) || !require_native(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DATA_TYPE*) array_data(array); } /* Typemap suite for (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, * DIM_TYPE DIM3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); $2 = (DIM_TYPE) array_size(array,0); $3 = (DIM_TYPE) array_size(array,1); $4 = (DIM_TYPE) array_size(array,2); } /* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, * DATA_TYPE* INPLACE_FARRAY3) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3) (PyArrayObject* array=NULL) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array || !require_dimensions(array,3) || !require_contiguous(array) || !require_native(array) || !require_fortran(array)) SWIG_fail; $1 = (DIM_TYPE) array_size(array,0); $2 = (DIM_TYPE) array_size(array,1); $3 = (DIM_TYPE) array_size(array,2); $4 = (DATA_TYPE*) array_data(array); } /*************************/ /* Argout Array Typemaps */ /*************************/ /* Typemap suite for (DATA_TYPE ARGOUT_ARRAY1[ANY]) */ %typemap(in,numinputs=0, fragment="NumPy_Backward_Compatibility,NumPy_Macros") (DATA_TYPE ARGOUT_ARRAY1[ANY]) (PyObject * array = NULL) { npy_intp dims[1] = { $1_dim0 }; array = PyArray_SimpleNew(1, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(argout) (DATA_TYPE ARGOUT_ARRAY1[ANY]) { $result = SWIG_Python_AppendOutput($result,array$argnum); } /* Typemap suite for (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) */ %typemap(in,numinputs=1, fragment="NumPy_Fragments") (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) (PyObject * array = NULL) { npy_intp dims[1]; if (!PyInt_Check($input)) { const char* typestring = pytype_string($input); PyErr_Format(PyExc_TypeError, "Int dimension expected. '%s' given.", typestring); SWIG_fail; } $2 = (DIM_TYPE) PyInt_AsLong($input); dims[0] = (npy_intp) $2; array = PyArray_SimpleNew(1, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = (DATA_TYPE*) array_data(array); } %typemap(argout) (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) { $result = SWIG_Python_AppendOutput($result,array$argnum); } /* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) */ %typemap(in,numinputs=1, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) (PyObject * array = NULL) { npy_intp dims[1]; if (!PyInt_Check($input)) { const char* typestring = pytype_string($input); PyErr_Format(PyExc_TypeError, "Int dimension expected. '%s' given.", typestring); SWIG_fail; } $1 = (DIM_TYPE) PyInt_AsLong($input); dims[0] = (npy_intp) $1; array = PyArray_SimpleNew(1, dims, DATA_TYPECODE); if (!array) SWIG_fail; $2 = (DATA_TYPE*) array_data(array); } %typemap(argout) (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) { $result = SWIG_Python_AppendOutput($result,array$argnum); } /* Typemap suite for (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) */ %typemap(in,numinputs=0, fragment="NumPy_Backward_Compatibility,NumPy_Macros") (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) (PyObject * array = NULL) { npy_intp dims[2] = { $1_dim0, $1_dim1 }; array = PyArray_SimpleNew(2, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(argout) (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) { $result = SWIG_Python_AppendOutput($result,array$argnum); } /* Typemap suite for (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) */ %typemap(in,numinputs=0, fragment="NumPy_Backward_Compatibility,NumPy_Macros") (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) (PyObject * array = NULL) { npy_intp dims[3] = { $1_dim0, $1_dim1, $1_dim2 }; array = PyArray_SimpleNew(3, dims, DATA_TYPECODE); if (!array) SWIG_fail; $1 = ($1_ltype) array_data(array); } %typemap(argout) (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) { $result = SWIG_Python_AppendOutput($result,array$argnum); } /*****************************/ /* Argoutview Array Typemaps */ /*****************************/ /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1 ) (DATA_TYPE* data_temp , DIM_TYPE dim_temp) { $1 = &data_temp; $2 = &dim_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) { npy_intp dims[1] = { *$2 }; PyObject * array = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$1)); if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,array); } /* Typemap suite for (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DATA_TYPE** ARGOUTVIEW_ARRAY1) (DIM_TYPE dim_temp, DATA_TYPE* data_temp ) { $1 = &dim_temp; $2 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1) { npy_intp dims[1] = { *$1 }; PyObject * array = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$2)); if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,array); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 ) (DATA_TYPE* data_temp , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) { npy_intp dims[2] = { *$2, *$3 }; PyObject * array = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1)); if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,array); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DATA_TYPE** ARGOUTVIEW_ARRAY2) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DATA_TYPE* data_temp ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2) { npy_intp dims[2] = { *$1, *$2 }; PyObject * array = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3)); if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,array); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1 , DIM_TYPE* DIM2 ) (DATA_TYPE* data_temp , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2) { npy_intp dims[2] = { *$2, *$3 }; PyObject * obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject * array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1 , DIM_TYPE* DIM2 , DATA_TYPE** ARGOUTVIEW_FARRAY2) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DATA_TYPE* data_temp ) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2) { npy_intp dims[2] = { *$1, *$2 }; PyObject * obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3)); PyArrayObject * array = (PyArrayObject*) obj; if (!array || !require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) (DATA_TYPE* data_temp, DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) { npy_intp dims[3] = { *$2, *$3, *$4 }; PyObject * array = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1)); if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,array); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3) { npy_intp dims[3] = { *$1, *$2, *$3 }; PyObject * array = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$3)); if (!array) SWIG_fail; $result = SWIG_Python_AppendOutput($result,array); } /* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) */ %typemap(in,numinputs=0) (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) (DATA_TYPE* data_temp, DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp) { $1 = &data_temp; $2 = &dim1_temp; $3 = &dim2_temp; $4 = &dim3_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3) { npy_intp dims[3] = { *$2, *$3, *$4 }; PyObject * obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1)); PyArrayObject * array = (PyArrayObject*) obj; if (!array || require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } /* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3) */ %typemap(in,numinputs=0) (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3) (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp) { $1 = &dim1_temp; $2 = &dim2_temp; $3 = &dim3_temp; $4 = &data_temp; } %typemap(argout, fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements") (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3) { npy_intp dims[3] = { *$1, *$2, *$3 }; PyObject * obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$3)); PyArrayObject * array = (PyArrayObject*) obj; if (!array || require_fortran(array)) SWIG_fail; $result = SWIG_Python_AppendOutput($result,obj); } %enddef /* %numpy_typemaps() macro */ /* *************************************************************** */ /* Concrete instances of the %numpy_typemaps() macro: Each invocation * below applies all of the typemaps above to the specified data type. */ %numpy_typemaps(signed char , NPY_BYTE , int) %numpy_typemaps(unsigned char , NPY_UBYTE , int) %numpy_typemaps(short , NPY_SHORT , int) %numpy_typemaps(unsigned short , NPY_USHORT , int) %numpy_typemaps(int , NPY_INT , int) %numpy_typemaps(unsigned int , NPY_UINT , int) %numpy_typemaps(long , NPY_LONG , int) %numpy_typemaps(unsigned long , NPY_ULONG , int) %numpy_typemaps(long long , NPY_LONGLONG , int) %numpy_typemaps(unsigned long long, NPY_ULONGLONG, int) %numpy_typemaps(float , NPY_FLOAT , int) %numpy_typemaps(double , NPY_DOUBLE , int) /* *************************************************************** * The follow macro expansion does not work, because C++ bool is 4 * bytes and NPY_BOOL is 1 byte * * %numpy_typemaps(bool, NPY_BOOL, int) */ /* *************************************************************** * On my Mac, I get the following warning for this macro expansion: * 'swig/python detected a memory leak of type 'long double *', no destructor found.' * * %numpy_typemaps(long double, NPY_LONGDOUBLE, int) */ /* *************************************************************** * Swig complains about a syntax error for the following macro * expansions: * * %numpy_typemaps(complex float, NPY_CFLOAT , int) * * %numpy_typemaps(complex double, NPY_CDOUBLE, int) * * %numpy_typemaps(complex long double, NPY_CLONGDOUBLE, int) */ #endif /* SWIGPYTHON */ stimfit-0.15.8/src/stimfit/py/ivtools.py0000775000175000017500000000756613062445067015206 00000000000000""" Some functions to create I-V curves 2008-03-26, C. Schmidt-Hieber Indices are zero-based! """ import numpy as np # stimfit python module: import stf def analyze_iv( pulses, trace_start = 0, factor = 1.0 ): """Creates an IV for the currently active channel. Keyword arguments: pulses -- Number of pulses for the IV. trace_start -- ZERO-BASED index of the first trace to be used for the IV. Note that this is one less than what is diplayed in the drop-down box. factor -- Multiply result with an optional factor, typically from some external scaling. Returns: True upon success, False otherwise. """ if (stf.check_doc() == False): print("Couldn\'t find an open file; aborting now.") return False if (pulses < 1): print("Number of pulses has to be greater or equal 1.") return False # create an empty array (will contain random numbers) channel = list() for m in range(pulses): # A temporary array to calculate the average: set = np.empty( (int((stf.get_size_channel()-m-1-trace_start)/pulses)+1, stf.get_size_trace( trace_start+m )) ) n_set = 0 for n in range( trace_start+m, stf.get_size_channel(), pulses ): # Add this trace to set: set[n_set,:] = stf.get_trace( n ) n_set = n_set+1 # calculate average and create a new section from it, multiply: channel.append( np.average(set, 0) * factor ) stf.new_window_list( channel ) return True def select_pon( pon_pulses = 8 ): """Selects correction-subtracted pulses from FPulse-generated files. Keyword arguments: pon_pulses -- Number of p-over-n correction pulses. This is typically 4 (for PoN=5 in the FPulse script) or 8 (for PoN=9). Returns: True upon success, False otherwise. """ # Zero-based indices! Hence, for P over N = 8, the first corrected # trace index is 9. for n in range( pon_pulses+1, stf.get_size_channel(), pon_pulses+2 ): if ( stf.select_trace( n ) == False ): # Unselect everything and break if there was an error: stf.unselect_all() return False return True def pon_batch( iv_pulses, pon_pulses = 8, trace_start = 0, subtract_base = False, factor = 1.0 ): """Extracts p-over-n corrected traces in FPulse-generated files, and then creates an IV for the currently active channel. Keyword arguments: iv_pulses -- Number of pulses for the IV. pon_pulses -- Number of p-over-n correction pulses. This is typically 4 (for PoN=5 in the FPulse script) or 8 (for PoN=9). trace_start -- ZERO-BASED index of the first trace to be used for the IV. Note that this is one less than what is diplayed in the drop-down box. subtract_base -- Set to True if you want to subtract the baseline at the end. You will need to set the baseline cursors in the original file to appropriate positions if you want to do this. factor -- Multiply result with an optional factor, typically from some external scaling. Returns: True upon success, False otherwise. """ # Extract corrected pulses: if ( select_pon( pon_pulses ) == False ): return False if ( stf.new_window_selected_this( ) == False ): return False # Create IV: if ( analyze_iv( iv_pulses, trace_start, factor ) == False ): return False # Subtract base: if ( subtract_base == True ): stf.select_all( ) if ( stf.subtract_base( ) == False ): return False return True stimfit-0.15.8/src/stimfit/py/pystf.cxx0000775000175000017500000015163713062445067015025 00000000000000#include #include #ifndef WX_PRECOMP #include "wx/wx.h" #endif #ifdef _WINDOWS #ifdef _DEBUG #undef _DEBUG #define _UNDEBUG #endif #endif #ifdef _POSIX_C_SOURCE #define _POSIX_C_SOURCE_WAS_DEF #undef _POSIX_C_SOURCE #endif #ifdef _XOPEN_SOURCE #define _XOPEN_SOURCE_WAS_DEF #undef _XOPEN_SOURCE #endif #ifdef WITH_PYTHON #include #endif #ifdef _POSIX_C_SOURCE_WAS_DEF #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE #endif #endif #ifdef _XOPEN_SOURCE_WAS_DEF #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE #endif #endif #if defined(__WXMAC__) || defined(__WXGTK__) #pragma GCC diagnostic ignored "-Wwrite-strings" #endif #ifdef WITH_PYTHON #if PY_MAJOR_VERSION >= 3 #include #define PyInt_FromLong PyLong_FromLong #define PyString_AsString PyBytes_AsString #else #include #endif #endif // revert to previous behaviour #if defined(__WXMAC__) || defined(__WXGTK__) #pragma GCC diagnostic warning "-Wwrite-strings" #endif #ifdef _WINDOWS #ifdef _UNDEBUG #define _DEBUG #endif #endif #ifdef WITH_PYTHON #include #endif #include "pystf.h" #include "./../gui/app.h" #include "./../gui/doc.h" #include "./../gui/view.h" #include "./../gui/graph.h" #include "./../gui/parentframe.h" #include "./../gui/childframe.h" #include "./../gui/dlgs/cursorsdlg.h" #include "./../../libstfnum/fit.h" #ifdef WITH_PYTHON #define array_data(a) (((PyArrayObject *)a)->data) #endif std::vector< std::vector< Vector_double > > gMatrix; std::vector< std::string > gNames; double _figsize[] = {8.0,6.0}; #if PY_MAJOR_VERSION >= 3 int wrap_array() { #ifdef WITH_PYTHON import_array(); return 0; #else return 0; #endif } #else void wrap_array() { #ifdef WITH_PYTHON import_array(); #endif } #endif void ShowExcept(const std::exception& e) { wxString msg; msg << wxT("Caught an exception in the python module:\n") << wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg( msg ); return; } void ShowError( const wxString& msg ) { wxString fullmsg; fullmsg << wxT("Error in the python module:\n") << msg; wxGetApp().ErrorMsg( msg ); return; } wxStfDoc* actDoc() { return wxGetApp().GetActiveDoc(); } wxStfGraph* actGraph() { if ( !check_doc() ) return NULL; wxStfView* pView=(wxStfView*)actDoc()->GetFirstView(); if ( !pView ) return NULL; return pView->GetGraph(); } bool refresh_graph() { wxStfGraph* pGraph = actGraph(); if ( !pGraph ) { ShowError( wxT("Pointer to graph is zero") ); return false; } pGraph->Refresh(); return true; } // update data and labels in the results box bool update_results_table(){ wxStfChildFrame* pFrame = (wxStfChildFrame*)actDoc()->GetDocumentWindow(); if (!pFrame) { ShowError( wxT("Error in update_results_table()") ); return false; } wxGetApp().OnPeakcalcexecMsg(); pFrame->UpdateResults(); return true; } void write_stf_registry(const wxString& item, int value){ wxGetApp().wxWriteProfileInt(wxT("Settings"), item, value); } bool update_cursor_dialog( ) { if (wxGetApp().GetCursorsDialog()!=NULL && wxGetApp().GetCursorsDialog()->IsShown()) { try { wxGetApp().GetCursorsDialog()->UpdateCursors(); } catch (const std::runtime_error& e) { ShowExcept( e ); // We don't necessarily need to return false here. } } return refresh_graph(); } bool check_doc( bool show_dialog ) { if (actDoc() == NULL) { if (show_dialog) ShowError( wxT("Couldn't find open file") ); return false; } return true; } std::string get_filename( ) { if ( !check_doc() ) return 0; #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) return std::string(actDoc()->GetFilename()); #else return std::string(actDoc()->GetFilename().mb_str()); #endif } std::string get_versionstring() { #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) return std::string(wxGetApp().GetVersionString()); #else return std::string(wxGetApp().GetVersionString().mb_str()); #endif } #ifdef WITH_PYTHON PyObject* get_trace(int trace, int channel) { wrap_array(); if ( !check_doc() ) return NULL; if ( trace == -1 ) { trace = actDoc()->GetCurSecIndex(); } if ( channel == -1 ) { channel = actDoc()->GetCurChIndex(); } npy_intp dims[1] = {(int)actDoc()->at(channel).at(trace).size()}; PyObject* np_array = PyArray_SimpleNew(1, dims, NPY_DOUBLE); double* gDataP = (double*)array_data(np_array); /* fill */ std::copy( (*actDoc())[channel][trace].get().begin(), (*actDoc())[channel][trace].get().end(), gDataP); return np_array; } #endif bool new_window( double* invec, int size ) { bool open_doc = actDoc() != NULL; std::vector< double > va(size); std::copy( &invec[0], &invec[size], va.begin() ); Section sec(va); Channel ch(sec); if (open_doc) { ch.SetYUnits( actDoc()->at( actDoc()->GetCurChIndex() ).GetYUnits() ); } Recording new_rec( ch ); if (open_doc) { new_rec.SetXScale( actDoc()->GetXScale() ); } wxStfDoc* testDoc = wxGetApp().NewChild( new_rec, actDoc(), wxT("From python") ); if ( testDoc == NULL ) { ShowError( wxT("Failed to create a new window.") ); return false; } return true; } bool _new_window_gMatrix( ) { bool open_doc = actDoc() != NULL; Recording new_rec( gMatrix.size() ); for (std::size_t n_c=0; n_c < new_rec.size(); ++n_c) { Channel ch( gMatrix[n_c].size() ); for ( std::size_t n_s = 0; n_s < ch.size(); ++n_s ) { ch.InsertSection( Section(gMatrix[n_c][n_s]), n_s ); } std::string yunits = ""; if (open_doc) { yunits = actDoc()->at( actDoc()->GetCurChIndex() ).GetYUnits(); } ch.SetYUnits( yunits ); if ( !gNames.empty() ) { ch.SetChannelName(gNames[n_c]); } new_rec.InsertChannel( ch, n_c ); } gNames.resize(0); double xscale = 1.0; if (open_doc) { xscale = actDoc()->GetXScale(); } new_rec.SetXScale( xscale ); wxStfDoc* pDoc = NULL; if ( open_doc ) { pDoc = actDoc(); } wxStfDoc* testDoc = wxGetApp().NewChild( new_rec, pDoc, wxT("From python") ); if ( testDoc == NULL ) { ShowError( wxT("Failed to create a new window.") ); return false; } return true; } bool new_window_matrix( double* invec, int traces, int size ) { bool open_doc = actDoc() != NULL; Channel ch( traces ); for (int n = 0; n < traces; ++n) { std::size_t offset = n * size; std::vector< double > va(size); std::copy( &invec[offset], &invec[offset+size], &va[0] ); Section sec(va); ch.InsertSection(sec, n); } if (open_doc) { ch.SetYUnits( actDoc()->at( actDoc()->GetCurChIndex() ).GetYUnits() ); } Recording new_rec( ch ); if (open_doc) { new_rec.SetXScale( actDoc()->GetXScale() ); } wxStfDoc* testDoc = wxGetApp().NewChild( new_rec, actDoc(), wxT("From python") ); if ( testDoc == NULL ) { ShowError( wxT("Failed to create a new window.") ); return false; } return true; } bool new_window_selected_this( ) { if ( !check_doc() ) return false; if ( !actDoc()->OnNewfromselectedThis( ) ) { return false; } return true; } bool new_window_selected_all( ) { if ( !check_doc() ) return false; try { wxCommandEvent wce; wxGetApp().OnNewfromselected( wce ); } catch ( const std::exception& e) { ShowExcept( e ); return false; } return true; } int get_size_trace( int trace, int channel ) { if ( !check_doc() ) return 0; if ( trace == -1 ) { trace = actDoc()->GetCurSecIndex(); } if ( channel == -1 ) { channel = actDoc()->GetCurChIndex(); } int size = 0; try { size = actDoc()->at(channel).at(trace).size(); } catch ( const std::out_of_range& e) { ShowExcept( e ); return 0; } return size; } int get_size_channel( int channel ) { if ( !check_doc() ) return 0; if ( channel == -1 ) { channel = actDoc()->GetCurChIndex(); } int size = 0; try { size = actDoc()->at(channel).size(); } catch ( const std::out_of_range& e) { ShowExcept( e ); return 0; } return size; } int get_size_recording( ) { if ( !check_doc() ) return 0; return actDoc()->size(); } double get_maxdecay() { if ( !check_doc() ) return -1.0; return actDoc()->GetMaxDecay(); } double get_maxrise() { if ( !check_doc() ) return -1.0; return actDoc()->GetMaxRise(); } const char* get_recording_time( ) { if ( !check_doc() ) return 0; return actDoc()->GetTime().c_str(); } const char* get_recording_date( ) { if ( !check_doc() ) return 0; return actDoc()->GetDate().c_str(); } std::string get_recording_comment( ) { if ( !check_doc() ) return ""; std::ostringstream comment; comment << actDoc()->GetFileDescription() << actDoc()->GetGlobalSectionDescription(); return comment.str(); } bool set_recording_comment( const char* comment ) { if ( !check_doc() ) return false; actDoc()->SetFileDescription(comment); return true; } bool set_recording_date( const char* date ) { if ( !check_doc() ) return false; actDoc()->SetDate(date); return true; } bool set_recording_time( const char* time ) { if ( !check_doc() ) return false; actDoc()->SetTime(time); return true; } bool select_trace( int trace ) { if ( !check_doc() ) return false; int max_size = (int)actDoc()->at(actDoc()->GetCurChIndex()).size(); if (trace < -1 || trace >= max_size) { wxString msg; msg << wxT("Select a trace with a zero-based index between 0 and ") << max_size-1; ShowError( msg ); return false; } if ((int)actDoc()->GetSelectedSections().size() == max_size) { ShowError(wxT("No more traces can be selected\nAll traces are selected")); return false; } if ( trace == -1 ) { trace = actDoc()->GetCurSecIndex(); } // control whether trace has already been selected: bool already=false; for (c_st_it cit = actDoc()->GetSelectedSections().begin(); cit != actDoc()->GetSelectedSections().end() && !already; ++cit) { if ((int)*cit == trace) { already = true; } } // add trace number to selected numbers, print number of selected traces if (!already) { actDoc()->SelectTrace(trace, actDoc()->GetBaseBeg(), actDoc()->GetBaseEnd()); //String output in the trace navigator wxStfChildFrame* pFrame = (wxStfChildFrame*)actDoc()->GetDocumentWindow(); if ( !pFrame ) { ShowError( wxT("Pointer to frame is zero") ); return false; } pFrame->SetSelected(actDoc()->GetSelectedSections().size()); } else { ShowError( wxT("Trace is already selected") ); return false; } return true; } void select_all( ) { if ( !check_doc() ) return; wxCommandEvent wce; actDoc()->Selectall( wce ); } void unselect_all( ) { if ( !check_doc() ) return; wxCommandEvent wce; actDoc()->Deleteselected( wce ); } #ifdef WITH_PYTHON PyObject* get_selected_indices() { if ( !check_doc() ) return NULL; PyObject* retObj = PyTuple_New( (int)actDoc()->GetSelectedSections().size() ); c_st_it cit; int n=0; for ( cit = actDoc()->GetSelectedSections().begin(); cit != actDoc()->GetSelectedSections().end(); ++cit ) { PyTuple_SetItem(retObj, n++, PyInt_FromLong( (long)*cit ) ); } // The main program apparently takes the ownership of the tuple; // no reference count decrement should be performed here. return retObj; } #endif bool set_trace( int trace ) { if ( !check_doc() ) return false; // use only with open document if ( !actDoc()->SetSection( trace ) ) { return false; } wxGetApp().OnPeakcalcexecMsg(); wxStfChildFrame* pFrame = (wxStfChildFrame*)actDoc()->GetDocumentWindow(); if ( !pFrame ) { ShowError( wxT("Pointer to frame is zero") ); return false; } pFrame->SetCurTrace( trace ); return refresh_graph(); } int get_trace_index() { if ( !check_doc() ) return -1; return actDoc()->GetCurSecIndex(); } int get_channel_index( bool active ) { if ( !check_doc() ) return -1; if ( active ) return actDoc()->GetCurChIndex(); else return actDoc()->GetSecChIndex(); } bool set_channel(int channel) { if ( !check_doc() ) return false; // use only with open document // channel negative if (channel<0) { ShowError( wxT("Negative value is not allowed") ); return false; } // only if we want to change the active channel if ((unsigned int)channel == actDoc()->GetCurChIndex() ) { return true; } int reference_ch = actDoc()->GetCurChIndex(); // catch exceptions (i.e out of range) try { actDoc()->SetCurChIndex(channel); } catch (const std::out_of_range& e) { ShowError( wxT("Value exceeds the number of available channels") ); return false; } // Pointer to wxStfChildFrame to access Channel selection combo wxStfChildFrame* pFrame = (wxStfChildFrame*)actDoc()->GetDocumentWindow(); if (!pFrame) { ShowError( wxT("Pointer to frame is zero") ); return false; } // set the channel selection combo //pFrame->SetChannels( actDoc()->GetCurChIndex(), actDoc()->GetSecChIndex()); pFrame->SetChannels( actDoc()->GetCurChIndex(), reference_ch); pFrame->UpdateChannels(); // update according to the combo return refresh_graph(); } const char* get_channel_name( int index ) { if ( !check_doc() ) return ""; if (index < 0) { index = actDoc()->GetCurChIndex(); } try { return actDoc()->at( index ).GetChannelName().c_str(); } catch (const std::out_of_range& e) { wxString msg(wxT("Index out of range in get_channel_name:\n")); msg+=wxString( e.what(), wxConvLocal ); ShowError( msg ); return ""; } } bool set_channel_name( const char* name, int index ) { if ( !check_doc() ) return ""; if (index < 0) { index = actDoc()->GetCurChIndex(); } try { actDoc()->at( index ).SetChannelName(name); } catch (const std::out_of_range& e) { wxString msg(wxT("Index out of range in get_channel_name:\n")); msg+=wxString( e.what(), wxConvLocal ); ShowError( msg ); return false; } return true; } const char* get_trace_name( int trace, int channel ) { if ( !check_doc() ) return ""; if (channel < 0) { channel = actDoc()->GetCurChIndex(); } if (trace < 0) { trace = actDoc()->GetCurSecIndex(); } try { return actDoc()->at( channel ).at( trace ).GetSectionDescription().c_str(); } catch (const std::out_of_range& e) { wxString msg(wxT("Index out of range in get_trace_name:\n")); msg+=wxString( e.what(), wxConvLocal ); ShowError( msg ); return ""; } } bool subtract_base( ) { if ( !check_doc() ) return false; return actDoc()->SubtractBase(); } bool file_open( const char* filename ) { wxString wxFilename( filename, wxConvLocal ); return wxGetApp().OpenFilePy( wxFilename ); } bool file_save( const char* filename ) { if ( !check_doc() ) return false; wxString wxFilename( filename, wxConvLocal ); return actDoc()->OnSaveDocument( wxFilename ); } bool close_all( ) { return wxGetApp().CloseAll(); } bool close_this( ) { if ( !check_doc() ) return false; return actDoc()->DeleteAllViews( ); } double peak_index( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { return actDoc()->GetMaxT(); } else { // Test whether a second channel is available at all: if ( actDoc()->size() < 2 ) { ShowError( wxT("No second channel found") ); return -1.0; } return actDoc()->GetAPMaxT(); } } double maxrise_index( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { return actDoc()->GetMaxRiseT(); } else { // Test whether a second channel is available at all: if ( actDoc()->size() < 2 ) { ShowError( wxT("No second channel found") ); return -1.0; } return actDoc()->GetAPMaxRiseT(); } } double maxdecay_index( ) { if ( !check_doc() ) return -1.0; return actDoc()->GetMaxDecayT(); } double foot_index( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { return actDoc()->GetTLoReal() - (actDoc()->GetTHiReal() - actDoc()->GetTLoReal()) / 3.0; } else { ShowError( wxT("At this time, foot_index() is only implemented for the active channel") ); return -1.0; } } double t50left_index( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { return actDoc()->GetT50LeftReal(); } else { // Test whether a second channel is available at all: if ( actDoc()->size() < 2 ) { ShowError( wxT("No second channel found") ); return -1.0; } return actDoc()->GetAPT50LeftReal(); } } double t50right_index( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { return actDoc()->GetT50RightReal(); } else { ShowError( wxT("At this time, t50right_index() is only implemented for the active channel") ); return -1.0; } } double get_halfwidth( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { double dt = actDoc()->GetXScale(); double t50left = actDoc()->GetT50LeftReal(); double t50right = actDoc()->GetT50RightReal(); return ( t50right-t50left )*dt; } else { ShowError( wxT("At this time, halfwidth is only implemented for the active channel") ); return -1.0; } } double rtlow_index( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { return actDoc()->GetTLoReal(); } else { ShowError( wxT("At this time, rtlow_index() is only implemented for the active channel") ); return -1.0; } } double rthigh_index( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { return actDoc()->GetTHiReal(); } else { ShowError( wxT("At this time, rthigh_index() is only implemented for the active channel") ); return -1.0; } } double get_threshold_time( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetThrT(); else return (double)actDoc()->GetThrT() * actDoc()->GetXScale(); } double get_threshold_value( ) { if ( !check_doc() ) return -1; return actDoc()->GetThreshold(); } double get_latency( ) { if ( !check_doc() ) return -1.0; double dt = actDoc()->GetXScale(); return ( actDoc()->GetLatency() )*dt; } double get_risetime( ) { if ( !check_doc() ) return -1.0; double dt = actDoc()->GetXScale(); return ( actDoc()->GetTHiReal()-actDoc()->GetTLoReal() )*dt; } double get_risetime_factor() { if ( !check_doc() ) return -1.0; return actDoc()->GetRTFactor()/100.; } double get_fit_start( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetFitBeg(); else return (double)actDoc()->GetFitBeg() * actDoc()->GetXScale(); } bool set_risetime_factor(double factor) { if ( !check_doc() ) return false; if (factor > 0.45 || factor < 0.05) { ShowError( wxT("Value out of range (0.05-0.45) in set_risetime_factor()") ); return false; } int RTFactor = (int)(factor*100); actDoc()->SetRTFactor(RTFactor); // defined in wxStfApp::OnPeakcalcexecMsg update_cursor_dialog(); update_results_table(); write_stf_registry(wxT("RTFactor"), RTFactor); return true; } bool set_fit_start( double pos, bool is_time ) { if ( !check_doc() ) return false; if ( is_time ) pos /= actDoc()->GetXScale(); int posInt = stf::round( pos ); // range check: if ( posInt < 0 || posInt >= (int)actDoc()->cursec().size() ) { ShowError( wxT("Value out of range in set_fit_start()") ); return false; } //conversion of pixel on screen to time (inversion of xFormat()) if (wxGetApp().GetCursorsDialog() != NULL && wxGetApp().GetCursorsDialog()->GetStartFitAtPeak()) { ShowError( wxT("Fit will start at the peak. Change cursor settings (Edit->Cursor settings) to set manually.") ); return false; } actDoc()->SetFitBeg( posInt ); return update_cursor_dialog(); } double get_fit_end( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetFitEnd(); else return (double)actDoc()->GetFitEnd() * actDoc()->GetXScale(); } bool set_fit_end( double pos, bool is_time ) { if ( !check_doc() ) return false; if ( is_time ) pos /= actDoc()->GetXScale(); int posInt = stf::round( pos ); // range check: if ( posInt < 0 || posInt >= (int)actDoc()->cursec().size() ) { ShowError( wxT("Value out of range in set_fit_end()") ); return false; } //conversion of pixel on screen to time (inversion of xFormat()) if (wxGetApp().GetCursorsDialog() != NULL && wxGetApp().GetCursorsDialog()->GetStartFitAtPeak()) { ShowError( wxT("Fit will start at the peak. Change cursor settings (Edit->Cursor settings) to set manually.") ); return false; } actDoc()->SetFitEnd( posInt ); return update_cursor_dialog(); } double get_peak_start( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetPeakBeg(); else return (double)actDoc()->GetPeakBeg() * actDoc()->GetXScale(); } bool set_peak_start( double pos, bool is_time ) { if ( !check_doc() ) return false; if ( is_time ) pos /= actDoc()->GetXScale(); int posInt = stf::round( pos ); // range check: if ( posInt < 0 || posInt >= (int)actDoc()->cursec().size() ) { ShowError( wxT("Value out of range in set_peak_start()") ); return false; } actDoc()->SetPeakBeg( posInt ); return update_cursor_dialog(); } double get_peak_end( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetPeakEnd(); else return (double)actDoc()->GetPeakEnd() * actDoc()->GetXScale(); } bool set_peak_end( double pos, bool is_time ) { if ( !check_doc() ) return false; if ( is_time ) pos /= actDoc()->GetXScale(); int posInt = stf::round( pos ); // range check: if ( posInt < 0 || posInt >= (int)actDoc()->cursec().size() ) { ShowError( wxT("Value out of range in set_peak_end()") ); return false; } actDoc()->SetPeakEnd( posInt ); return update_cursor_dialog(); } bool set_peak_mean( int pts ) { if ( !check_doc() ) return false; // range check (-1 is a legal value!): if ( pts == 0 || pts < -1 ) { ShowError( wxT("Value out of range in set_peak_mean()") ); return false; } actDoc()->SetPM( pts ); return update_cursor_dialog(); } int get_peak_mean() { if ( !check_doc() ) return 0; return (int)actDoc()->GetPM(); } const char* get_peak_direction( ) { if ( !check_doc() ) return ""; const char *direction = "both"; if ( actDoc()->GetDirection() == stfnum::up ) direction = "up"; else if ( actDoc()->GetDirection() == stfnum::down ) direction = "down"; else if ( actDoc()->GetDirection() == stfnum::both ) direction = "both"; return direction; } bool set_peak_direction( const char* direction ) { if ( !check_doc() ) return false; if ( strcmp( direction, "up" ) == 0 ) { actDoc()->SetDirection( stfnum::up ); return update_cursor_dialog(); } if ( strcmp( direction, "down" ) == 0 ) { actDoc()->SetDirection( stfnum::down ); return update_cursor_dialog(); } if ( strcmp( direction, "both" ) == 0 ) { actDoc()->SetDirection( stfnum::both ); return update_cursor_dialog(); } wxString msg; msg << wxT("\"") << wxString::FromAscii(direction) << wxT("\" is not a valid direction\n"); msg << wxT("Use \"up\", \"down\" or \"both\""); ShowError( msg ); return false; } const char* get_baseline_method() { if ( !check_doc() ) return ""; const char *method=" "; if ( actDoc()->GetBaselineMethod() == stfnum::mean_sd ) method = "mean"; else if ( actDoc()->GetBaselineMethod() == stfnum::median_iqr ) method = "median"; return method; } bool set_baseline_method( const char* method ) { if ( !check_doc() ) return false; const wxString myitem = wxT("BaselineMethod"); if ( strcmp( method, "mean" ) == 0 ) { actDoc()->SetBaselineMethod( stfnum::mean_sd ); update_cursor_dialog(); update_results_table(); write_stf_registry(myitem, stfnum::mean_sd); return true; } else if ( strcmp( method, "median" ) == 0 ) { actDoc()->SetBaselineMethod( stfnum::median_iqr ); update_cursor_dialog(); // update wxStfCursorsDlg update_results_table(); // update results and labels in the table write_stf_registry(myitem, stfnum::median_iqr); // write in .Stimfit return true; } else { wxString msg; msg << wxT("\"") << wxString::FromAscii(method) << wxT("\" is not a valid method\n"); msg << wxT("Use \"mean\" or \"median\""); ShowError( msg ); return false; } } const char* get_latency_start_mode( ) { if ( !check_doc() ) return ""; const char *mode = "undefined"; if ( actDoc()->GetLatencyStartMode() == stf::manualMode ) mode = "manual"; else if ( actDoc()->GetLatencyStartMode() == stf::peakMode ) mode = "peak"; else if ( actDoc()->GetLatencyStartMode() == stf::riseMode ) mode = "rise"; else if ( actDoc()->GetLatencyStartMode() == stf::halfMode ) mode = "half"; return mode; } bool set_latency_start(double pos, bool is_time) { if ( !check_doc() ) return false; if (is_time) pos /= actDoc()->GetXScale(); int posInt = stf::round( pos ); /* range check */ if ( posInt < 0 || posInt >= (int)actDoc()->cursec().size() ){ ShowError( wxT("Value out of range in set_latency_start()") ); return false; } actDoc()->SetLatencyStartMode( stf::manualMode ); actDoc()->SetLatencyBeg( posInt ); /* set start latency mode to manual and write in registry */ const wxString myitem = wxT("LatencyStartMode"); bool dlg_OK, result_OK; dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::manualMode); return true; } return false; } bool set_latency_start_mode( const char* mode ) { if ( !check_doc() ) return false; const wxString myitem = wxT("LatencyStartMode"); bool dlg_OK, result_OK; if ( strcmp( mode, "manual" ) == 0 ) { actDoc()->SetLatencyStartMode( stf::manualMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::manualMode); return true; } return false; } else if ( strcmp( mode, "peak" ) == 0 ) { actDoc()->SetLatencyStartMode( stf::peakMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::peakMode); return true; } return false; } else if ( strcmp( mode, "rise" ) == 0 ) { actDoc()->SetLatencyStartMode( stf::riseMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::riseMode); return true; } return false; } else if ( strcmp( mode, "half" ) == 0 ) { actDoc()->SetLatencyStartMode( stf::halfMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::halfMode); return true; } return false; } else { wxString msg; msg << wxT("\"") << wxString::FromAscii(mode) << wxT("\" is not a valid start latency mode\n"); msg << wxT("Use \"manual\", \"peak\", \"rise\" or \"half\""); ShowError( msg ); return false; } } const char* get_latency_end_mode( ) { if ( !check_doc() ) return ""; const char *mode = "undefined"; if ( actDoc()->GetLatencyEndMode() == stf::manualMode ) mode = "manual"; else if ( actDoc()->GetLatencyEndMode() == stf::peakMode ) mode = "peak"; else if ( actDoc()->GetLatencyEndMode() == stf::riseMode ) mode = "rise"; else if ( actDoc()->GetLatencyEndMode() == stf::halfMode ) mode = "half"; else if ( actDoc()->GetLatencyEndMode() == stf::footMode ) mode = "foot"; return mode; } bool set_latency_end(double pos, bool is_time) { if ( !check_doc() ) return false; if (is_time) pos /= actDoc()->GetXScale(); int posInt = stf::round( pos ); /* range check */ if ( posInt < 0 || posInt >= (int)actDoc()->cursec().size() ){ ShowError( wxT("Value out of range in set_latency_start()") ); return false; } actDoc()->SetLatencyEndMode( stf::manualMode ); actDoc()->SetLatencyEnd( posInt ); /* set start latency mode to manual and write in registry */ const wxString myitem = wxT("LatencyEndMode"); bool dlg_OK, result_OK; dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::manualMode); return true; } return false; } bool set_latency_end_mode( const char* mode ) { if ( !check_doc() ) return false; const wxString myitem = wxT("LatencyEndMode"); bool dlg_OK, result_OK; if ( strcmp( mode, "manual" ) == 0 ) { actDoc()->SetLatencyEndMode( stf::manualMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::manualMode); return true; } return false; } else if ( strcmp( mode, "peak" ) == 0 ) { actDoc()->SetLatencyEndMode( stf::peakMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::peakMode); return true; } return false; } else if ( strcmp( mode, "rise" ) == 0 ) { actDoc()->SetLatencyEndMode( stf::riseMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::riseMode); return true; } return false; } else if ( strcmp( mode, "half" ) == 0 ) { actDoc()->SetLatencyEndMode( stf::halfMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::halfMode); return true; } return false; } else if ( strcmp( mode, "foot" ) == 0 ) { actDoc()->SetLatencyEndMode( stf::footMode ); dlg_OK = update_cursor_dialog(); result_OK = update_results_table(); if (dlg_OK && result_OK) { write_stf_registry(myitem, stf::footMode); return true; } return false; } else { wxString msg; msg << wxT("\"") << wxString::FromAscii(mode) << wxT("\" is not a valid end latency mode\n"); msg << wxT("Use \"manual\", \"peak\", \"rise\", \"half\" or \"foot\""); ShowError( msg ); return false; } } double get_latency_start( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetLatencyBeg(); else return (double)actDoc()->GetLatencyBeg() * actDoc()->GetXScale(); } double get_latency_end( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetLatencyEnd(); else return (double)actDoc()->GetLatencyEnd() * actDoc()->GetXScale(); } double get_base_SD() { if ( !check_doc() ) return 0.0; return actDoc()->GetBaseSD(); } double get_base_start( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetBaseBeg(); else return (double)actDoc()->GetBaseBeg() * actDoc()->GetXScale(); } bool set_base_start( double pos, bool is_time ) { if ( !check_doc() ) return false; if ( is_time ) pos /= actDoc()->GetXScale(); int posInt = stf::round( pos ); // range check: if ( posInt < 0 || posInt >= (int)actDoc()->cursec().size() ) { ShowError( wxT("Value out of range in set_base_start()") ); return false; } actDoc()->SetBaseBeg( posInt ); return update_cursor_dialog(); } double get_base_end( bool is_time ) { if ( !check_doc() ) return -1; if ( !is_time ) return actDoc()->GetBaseEnd(); else return (double)actDoc()->GetBaseEnd() * actDoc()->GetXScale(); } bool set_base_end( double pos, bool is_time ) { if ( !check_doc() ) return false; if ( is_time ) pos /= actDoc()->GetXScale(); int posInt = stf::round( pos ); // range check: if ( posInt < 0 || posInt >= (int)actDoc()->cursec().size() ) { ShowError( wxT("Value out of range in set_base_end()") ); return false; } actDoc()->SetBaseEnd( posInt ); return update_cursor_dialog(); } bool set_slope(double slope) { if ( !check_doc() ) return false; actDoc()->SetSlopeForThreshold( slope ); actDoc()->SetFromBase( false ); return update_cursor_dialog(); } double get_sampling_interval( ) { if ( !check_doc() ) return -1.0; return actDoc()->GetXScale(); } const char* get_xunits( ) { if ( !check_doc() ) return ""; return actDoc()->GetXUnits().c_str(); } const char* get_yunits( int trace, int channel ) { if ( !check_doc() ) return ""; if (channel < 0) { channel = actDoc()->GetCurChIndex(); } if (trace < 0) { trace = actDoc()->GetCurSecIndex(); } try { return actDoc()->at( channel ).GetYUnits().c_str(); } catch (const std::out_of_range& e) { wxString msg(wxT("Index out of range in get_yunits:\n")); msg+=wxString( e.what(), wxConvLocal ); ShowError( msg ); return ""; } } bool set_xunits( const char* units ) { if ( !check_doc() ) return false; actDoc()->SetXUnits(units); return true; } bool set_yunits( const char* units, int trace, int channel ) { if ( !check_doc() ) return false; if (channel < 0) { channel = actDoc()->GetCurChIndex(); } if (trace < 0) { trace = actDoc()->GetCurSecIndex(); } try { actDoc()->at( channel ).SetYUnits(units); } catch (const std::out_of_range& e) { wxString msg(wxT("Index out of range in set_yunits:\n")); msg+=wxString( e.what(), wxConvLocal ); ShowError( msg ); return false; } return true; } bool set_sampling_interval( double si ) { if ( !check_doc() ) return false; if (si <= 0) { ShowError( wxT("New sampling interval needs to be greater than 0.") ); return false; } actDoc()->SetXScale( si ); return refresh_graph(); } bool measure( ) { if ( !check_doc() ) return false; // check cursor positions: if ( actDoc()->GetPeakBeg() > actDoc()->GetPeakEnd() ) { ShowError( wxT("Peak window cursors are reversed; will abort now.") ); return false; } if ( actDoc()->GetBaseBeg() > actDoc()->GetBaseEnd() ) { ShowError( wxT("Base window cursors are reversed; will abort now.") ); return false; } if ( actDoc()->GetFitBeg() > actDoc()->GetFitEnd() ) { ShowError( wxT("Fit window cursors are reversed; will abort now.") ); return false; } wxStfChildFrame* pFrame = (wxStfChildFrame*)actDoc()->GetDocumentWindow(); if ( !pFrame ) { ShowError( wxT("Pointer to frame is zero") ); return false; } wxGetApp().OnPeakcalcexecMsg(); pFrame->UpdateResults(); return true; } double get_base( bool active ) { if ( !check_doc() ) return -1.0; if ( active ) { return actDoc()->GetBase(); } else { // Test wheter a second channel is available at all: if ( actDoc()->size() < 2) { ShowError( wxT("No second channel was found") ); return -1.0; } return actDoc()->GetAPBase(); } } #ifdef WITH_PSLOPE double get_pslope() { if (!check_doc() ) return 0.0; return actDoc()->GetPSlope(); } #endif double get_peak( ) { if ( !check_doc() ) return 0.0; return actDoc()->GetPeak(); } void _gMatrix_resize( std::size_t channels, std::size_t sections ) { gMatrix.resize( channels ); std::vector< std::vector< Vector_double > >::iterator it; for (it = gMatrix.begin(); it != gMatrix.end(); ++it) { it->resize( sections ); } } void _gMatrix_at( double* invec, int size, int channel, int section ) { std::vector< double > va(size); std::copy( &invec[0], &invec[size], va.begin() ); try{ gMatrix.at(channel).at(section).resize( va.size() ); gMatrix[channel][section] = va; } catch (const std::out_of_range& e) { wxString msg(wxT("Out of range exception in _gMatrix_at:\n")); msg+=wxString( e.what(), wxConvLocal ); ShowError( msg ); return; } } void _gNames_resize( std::size_t channels ) { gNames.resize( channels ); } void _gNames_at( const char* name, int channel ) { try{ gNames.at(channel) = std::string(name); } catch (const std::out_of_range& e) { wxString msg(wxT("Out of range exception in _gNames_at:\n")); msg+=wxString( e.what(), wxConvLocal ); ShowError( msg ); return; } } void align_selected( double (*alignment)( bool ), bool active ) { if ( !check_doc() ) return; wxStfDoc* pDoc = actDoc(); //store current section: std::size_t section_old = pDoc->GetCurSecIndex(); if ( pDoc->GetSelectedSections().empty() ) { ShowError( wxT("No selected traces") ); return; } // check for a second channel if ( actDoc()->size() < 2 ) { ShowError( wxT("No second channel found") ); return; } //initialize the lowest and the highest index: std::size_t min_index=0; try { min_index=pDoc->get()[pDoc->GetSecChIndex()].at(pDoc->GetSelectedSections().at(0)).size()-1; } catch (const std::out_of_range& e) { wxString msg(wxT("Error while aligning\nIt is safer to re-start the program\n")); msg+=wxString( e.what(), wxConvLocal ); ShowError( msg ); return; } std::size_t max_index=0; std::vector shift( pDoc->GetSelectedSections().size(), 0 ); int_it it = shift.begin(); //loop through all selected sections: for (c_st_it cit = pDoc->GetSelectedSections().begin(); cit != pDoc->GetSelectedSections().end() && it != shift.end(); cit++) { //Set the selected section as the current section temporarily: pDoc->SetSection(*cit); if ( pDoc->GetPeakAtEnd() ) { pDoc->SetPeakEnd((int)pDoc->get()[pDoc->GetSecChIndex()][*cit].size()-1); } // Calculate all variables for the current settings // APMaxSlopeT will be calculated for the second (==reference) // channel, so channels may not be changed! try { pDoc->Measure(); } catch (const std::out_of_range& e) { ShowExcept( e ); return; } //check whether the current index is a max or a min, //and if so, store it: double alignIndex = alignment( active ); *it = stf::round( alignIndex ); if (alignIndex > max_index) { max_index=alignIndex; } if (alignIndex < min_index) { min_index=alignIndex; } it++; } // now that max and min indices are known, calculate the number of // points that need to be shifted: for (int_it it2 = shift.begin(); it2 != shift.end(); it2++) { (*it2) -= (int)min_index; } //restore section and channel settings: pDoc->SetSection( section_old ); int new_size=(int)(pDoc->get()[0][pDoc->GetSelectedSections()[0]].size()-(max_index-min_index)); Recording Aligned( pDoc->size(), pDoc->GetSelectedSections().size(), new_size ); ch_it chan_it; // Channel iterator std::size_t n_ch = 0; for ( ch_it chan_it = pDoc->get().begin(); chan_it != pDoc->get().end(); ++chan_it ) { Channel ch( pDoc->GetSelectedSections().size() ); ch.SetChannelName( pDoc->at(n_ch).GetChannelName() ); ch.SetYUnits( pDoc->at(n_ch).GetYUnits() ); std::size_t n_sec = 0; int_it it3 = shift.begin(); for ( c_st_it sel_it = pDoc->GetSelectedSections().begin(); sel_it != pDoc->GetSelectedSections().end() && it3 != shift.end(); ++sel_it ) { Vector_double va( new_size ); std::copy( &(chan_it->at( *sel_it ).get_w()[ 0 + (*it3) ]), &(chan_it->at( *sel_it ).get_w()[ (*it3) + new_size ]), &va[0] ); Section sec(va); ch.InsertSection(sec, n_sec++); ++it3; } Aligned.InsertChannel( ch, n_ch++ ); } wxString title( pDoc->GetTitle() ); title += wxT(", aligned"); Aligned.CopyAttributes( *pDoc ); wxStfDoc* testDoc = wxGetApp().NewChild(Aligned, pDoc, title); if ( testDoc == NULL ) { ShowError( wxT("Failed to create a new window.") ); } return; } int leastsq_param_size( int fselect ) { int npar = 0; try { npar = (int)wxGetApp().GetFuncLib().at(fselect).pInfo.size(); } catch (const std::out_of_range& e) { wxString msg( wxT("Could not retrieve function from library:\n") ); msg << wxString( e.what(), wxConvLocal ); ShowError(msg); return -1; } return npar; } PyObject* leastsq( int fselect, bool refresh ) { if ( !check_doc() ) return NULL; wxStfDoc* pDoc = actDoc(); wxCommandEvent wce; int n_params = 0; try { n_params=(int)wxGetApp().GetFuncLib().at(fselect).pInfo.size(); } catch (const std::out_of_range& e) { wxString msg( wxT("Could not retrieve function from library:\n") ); msg << wxString( e.what(), wxConvLocal ); ShowError(msg); return NULL; } std::vector< double > x( pDoc->GetFitEnd() - pDoc->GetFitBeg() ); //fill array: std::copy(&pDoc->cursec()[pDoc->GetFitBeg()], &pDoc->cursec()[pDoc->GetFitEnd()], &x[0]); std::vector< double > params( n_params ); // initialize parameters from init function, wxGetApp().GetFuncLib().at(fselect).init( x, pDoc->GetBase(), pDoc->GetPeak(), pDoc->GetRTLoHi(), pDoc->GetHalfDuration(), pDoc->GetXScale(), params ); std::string fitInfo; int fitWarning = 0; std::vector< double > opts( 6 ); // check values in src/stimfit/gui/dlgs/fitseldlg.cpp // Respectively the scale factor for initial damping term \mu, // stopping thresholds for ||J^T e||_inf, ||Dp||_2 and ||e||_2, // maxIter, maxPass //opts[0]=5*1E-3; //default: 1E-03; opts[0] = 1E-05; //default: 1E-03; opts[1] = 1E-17; //default: 1E-17; opts[2] = 1E-17; //default: 1E-17; opts[3] = 1E-32; //default: 1E-17; opts[4] = 64; //default: 64; opts[5] = 16; double chisqr = 0.0; try { chisqr = stfnum::lmFit( x, pDoc->GetXScale(), wxGetApp().GetFuncLib().at(fselect), opts, true, params, fitInfo, fitWarning ); pDoc->SetIsFitted( pDoc->GetCurChIndex(), pDoc->GetCurSecIndex(), params, wxGetApp().GetFuncLibPtr(fselect), chisqr, pDoc->GetFitBeg(), pDoc->GetFitEnd() ); } catch (const std::out_of_range& e) { ShowExcept( e ); return NULL; } catch (const std::runtime_error& e) { ShowExcept( e ); return NULL; } catch (const std::exception& e) { ShowExcept( e ); return NULL; } if ( refresh ) { if ( !refresh_graph() ) return NULL; } // Dictionaries apparently grow as needed; no initial size is required. PyObject* retDict = PyDict_New( ); for ( std::size_t n_dict = 0; n_dict < params.size(); ++n_dict ) { PyDict_SetItemString( retDict, wxGetApp().GetFuncLib()[fselect].pInfo.at(n_dict).desc.c_str(), PyFloat_FromDouble( params[n_dict] ) ); } PyDict_SetItemString( retDict, "SSE", PyFloat_FromDouble( chisqr ) ); return retDict; } #ifdef WITH_PYTHON PyObject* get_fit( int trace, int channel ) { wrap_array(); if ( !check_doc() ) return NULL; if ( trace == -1 ) { trace = actDoc()->GetCurSecIndex(); } if ( channel == -1 ) { channel = actDoc()->GetCurChIndex(); } /* Does the specified section contain a fit at all? */ stf::SectionAttributes sec_attr; try { sec_attr = actDoc()->GetSectionAttributes(channel, trace); } catch (const std::out_of_range& e) { return NULL; } if (!sec_attr.isFitted) { return Py_None; } unsigned int size = sec_attr.storeFitEnd - sec_attr.storeFitBeg; Vector_double xy_fit(2*size); for (unsigned int x = 0; x < size; ++x) { xy_fit[x] = (x+sec_attr.storeFitBeg) * actDoc()->GetXScale(); xy_fit[x+size] = sec_attr.fitFunc->func(x*actDoc()->GetXScale(), sec_attr.bestFitP); } npy_intp dims[2] = {2, size}; PyObject* np_array = PyArray_SimpleNew(2, dims, NPY_DOUBLE); double* gDataP = (double*)array_data(np_array); /* fill */ std::copy(xy_fit.begin(), xy_fit.end(), gDataP); return np_array; } #endif bool show_table( PyObject* dict, const char* caption ) { if ( !check_doc() ) return false; // Check whether the dictionary is intact: if ( !PyDict_Check( dict ) ) { ShowError( wxT("First argument to ShowTable() is not a dictionary.") ); return false; } std::map< std::string, double > pyMap; Py_ssize_t n_dict = 0; PyObject *pkey = NULL, *pvalue = NULL; while ( PyDict_Next( dict, &n_dict, &pkey, &pvalue ) ) { if ( !pkey || !pvalue ) { ShowError( wxT("Couldn't read from dictionary in ShowTable().") ); return false; } std::string key = PyString_AsString( pkey ); double value = PyFloat_AsDouble( pvalue ); pyMap[key] = value; } stfnum::Table pyTable( pyMap ); wxStfChildFrame* pFrame = (wxStfChildFrame*)actDoc()->GetDocumentWindow(); if ( !pFrame ) { ShowError( wxT("Pointer to frame is zero") ); return false; } pFrame->ShowTable( pyTable, wxString( caption, wxConvLocal ) ); return true; } bool show_table_dictlist( PyObject* dict, const char* caption, bool reverse ) { if ( !check_doc() ) return false; if ( !reverse ) { ShowError( wxT("Row-major order (reverse = False) has not been implemented yet.") ); return false; } // Check whether the dictionary is intact: if ( !PyDict_Check( dict ) ) { ShowError( wxT("First argument to ShowTable() is not a dictionary.") ); return false; } Py_ssize_t n_dict = 0; PyObject *pkey = NULL, *pvalue = NULL; std::vector< Vector_double > pyVector; std::vector< std::string > pyStrings; while ( PyDict_Next( dict, &n_dict, &pkey, &pvalue ) ) { if ( !pkey || !pvalue ) { ShowError( wxT("Couldn't read from dictionary in ShowTable().") ); return false; } pyStrings.push_back(PyString_AsString( pkey )); if ( !PyList_Check( pvalue ) ) { ShowError( wxT("Dictionary values are not (consistently) lists.") ); return false; } Vector_double values( PyList_Size( pvalue ) ); for (int n_list = 0; n_list < (int)values.size(); ++n_list ) { PyObject* plistvalue = PyList_GetItem( pvalue, n_list ); if ( !plistvalue ) { ShowError( wxT("Can't read list elements in show_table().") ); return false; } values[n_list] = PyFloat_AsDouble( plistvalue ); } pyVector.push_back( values ); } if ( pyVector.empty() ) { ShowError( wxT("Dictionary was empty in show_table().") ); return false; } stfnum::Table pyTable( pyVector[0].size(), pyVector.size() ); std::vector< std::vector< double > >::const_iterator c_va_it; std::size_t n_col = 0; for ( c_va_it = pyVector.begin(); c_va_it != pyVector.end(); ++c_va_it ) { try { pyTable.SetColLabel( n_col, pyStrings[n_col] ); for ( std::size_t n_va=0; n_va < (*c_va_it).size(); ++n_va ) { pyTable.at( n_va, n_col ) = (*c_va_it)[n_va]; } } catch ( const std::out_of_range& e ) { ShowExcept( e ); return false; } n_col++; } wxStfChildFrame* pFrame = (wxStfChildFrame*)actDoc()->GetDocumentWindow(); if ( !pFrame ) { ShowError( wxT("Pointer to frame is zero") ); return false; } pFrame->ShowTable( pyTable, wxString( caption, wxConvLocal ) ); return true; } bool set_marker(double x, double y) { if ( !check_doc() ) return false; try { actDoc()->GetCurrentSectionAttributesW().pyMarkers. push_back(stf::PyMarker(x,y)); } catch (const std::out_of_range& e) { wxString msg( wxT("Could not set the marker:\n") ); msg << wxString( e.what(), wxConvLocal ); ShowError(msg); return false; } return refresh_graph(); } bool erase_markers() { if ( !check_doc() ) return false; try { actDoc()->GetCurrentSectionAttributesW().pyMarkers.clear(); } catch (const std::out_of_range& e) { wxString msg( wxT("Could not erase markers:\n") ); msg << wxString( e.what(), wxConvLocal ); ShowError(msg); return false; } return refresh_graph(); } double plot_xmin() { wxStfGraph* pGraph = actGraph(); if ( !pGraph ) { ShowError( wxT("Pointer to graph is zero") ); return 0; } return pGraph->get_plot_xmin(); } double plot_xmax() { wxStfGraph* pGraph = actGraph(); if ( !pGraph ) { ShowError( wxT("Pointer to graph is zero") ); return 0; } return pGraph->get_plot_xmax(); } double plot_ymin() { wxStfGraph* pGraph = actGraph(); if ( !pGraph ) { ShowError( wxT("Pointer to graph is zero") ); return 0; } return pGraph->get_plot_ymin(); } double plot_ymax() { wxStfGraph* pGraph = actGraph(); if ( !pGraph ) { ShowError( wxT("Pointer to graph is zero") ); return 0; } return pGraph->get_plot_ymax(); } double plot_y2min() { wxStfGraph* pGraph = actGraph(); if ( !pGraph ) { ShowError( wxT("Pointer to graph is zero") ); return 0; } return pGraph->get_plot_y2min(); } double plot_y2max() { wxStfGraph* pGraph = actGraph(); if ( !pGraph ) { ShowError( wxT("Pointer to graph is zero") ); return 0; } return pGraph->get_plot_y2max(); } PyObject* mpl_panel(const std::vector& figsize) { if ( !check_doc() ) return NULL; if (figsize.size() < 2) { ShowError( wxT("figsize has to have length 2") ); } wxStfParentFrame* parent = GetMainFrame(); if ( !parent ) { ShowError( wxT("Parent window is NULL") ); return 0; } std::ostringstream mpl_name; mpl_name << "mpl" << parent->GetMplFigNo(); int width = 800 * figsize[0]/8.0; int height = 600 * figsize[1]/6.0; PyObject* result = parent->MakePythonWindow("makeWindowMpl", mpl_name.str(), "Matplotlib", true, false, true, width, height, figsize[0], figsize[1]).pyWindow; return result; } stimfit-0.15.8/src/stimfit/py/Makefile.in0000664000175000017500000006632513315356052015171 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_PYTHON_TRUE@@WITH_BIOSIGLITE_TRUE@am__append_1 = ../../libbiosiglite/libbiosiglite.la subdir = src/stimfit/py ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acsite.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__noinst_HEADERS_DIST) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/stfconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) am__DEPENDENCIES_1 = @BUILD_PYTHON_TRUE@libpystf_la_DEPENDENCIES = ../libstimfit.la \ @BUILD_PYTHON_TRUE@ ../../libstfio/libstfio.la \ @BUILD_PYTHON_TRUE@ $(am__DEPENDENCIES_1) $(am__append_1) am__libpystf_la_SOURCES_DIST = $(srcdir)/pystf.cxx @BUILD_PYTHON_TRUE@am_libpystf_la_OBJECTS = libpystf_la-pystf.lo @BUILD_PYTHON_TRUE@nodist_libpystf_la_OBJECTS = \ @BUILD_PYTHON_TRUE@ libpystf_la-pystf_wrap.lo libpystf_la_OBJECTS = $(am_libpystf_la_OBJECTS) \ $(nodist_libpystf_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libpystf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(libpystf_la_CXXFLAGS) \ $(CXXFLAGS) $(libpystf_la_LDFLAGS) $(LDFLAGS) -o $@ @BUILD_PYTHON_TRUE@am_libpystf_la_rpath = -rpath $(pkglibdir) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libpystf_la_SOURCES) $(nodist_libpystf_la_SOURCES) DIST_SOURCES = $(am__libpystf_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__noinst_HEADERS_DIST = pystf.h HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GT_CPPFLAGS = @GT_CPPFLAGS@ GT_CXXFLAGS = @GT_CXXFLAGS@ GT_LDFLAGS = @GT_LDFLAGS@ GT_LIBS = @GT_LIBS@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_LIBS = @HDF5_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBBIOSIG_LDFLAGS = @LIBBIOSIG_LDFLAGS@ LIBHDF5_LDFLAGS = @LIBHDF5_LDFLAGS@ LIBLAPACK_LDFLAGS = @LIBLAPACK_LDFLAGS@ LIBNUMPY_INCLUDES = @LIBNUMPY_INCLUDES@ LIBOBJS = @LIBOBJS@ LIBPYTHON_INCLUDES = @LIBPYTHON_INCLUDES@ LIBPYTHON_LDFLAGS = @LIBPYTHON_LDFLAGS@ LIBS = @LIBS@ LIBSTF_LDFLAGS = @LIBSTF_LDFLAGS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MACSETFILE = @MACSETFILE@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSTLINK_COMMAND = @POSTLINK_COMMAND@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_DIST_PKG = @PYTHON_DIST_PKG@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_NUMPY_INCLUDE = @PYTHON_NUMPY_INCLUDE@ PYTHON_PRE_DIST_PKG = @PYTHON_PRE_DIST_PKG@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ PY_AC_VERSION = @PY_AC_VERSION@ RANLIB = @RANLIB@ REZ = @REZ@ SED = @SED@ SETFILE = @SETFILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFIO_PYTHON_LIBNAME = @STFIO_PYTHON_LIBNAME@ STF_PYTHON_LIBNAME = @STF_PYTHON_LIBNAME@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ SWIG_PYTHON_CPPFLAGS = @SWIG_PYTHON_CPPFLAGS@ SWIG_PYTHON_OPT = @SWIG_PYTHON_OPT@ VERSION = @VERSION@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @BUILD_PYTHON_TRUE@pkglib_LTLIBRARIES = libpystf.la @BUILD_PYTHON_TRUE@nodist_libpystf_la_SOURCES = $(srcdir)/pystf_wrap.cxx @BUILD_PYTHON_TRUE@libpystf_la_SOURCES = $(srcdir)/pystf.cxx # $(SWIG_SOURCES) @BUILD_PYTHON_TRUE@noinst_HEADERS = pystf.h @BUILD_PYTHON_TRUE@INCLUDES = $(LIBNUMPY_INCLUDES) @BUILD_PYTHON_TRUE@libpystf_la_CPPFLAGS = $(SWIG_PYTHON_CPPFLAGS) -I$(top_srcdir)/src @BUILD_PYTHON_TRUE@libpystf_la_CXXFLAGS = $(OPT_CXXFLAGS) $(WX_CXXFLAGS) @BUILD_PYTHON_TRUE@libpystf_la_LDFLAGS = $(LIBPYTHON_LDFLAGS) $(LIBSTF_LDFLAGS) $(LIBBIOSIG_LDFLAGS) @BUILD_PYTHON_TRUE@libpystf_la_LIBADD = ../libstimfit.la \ @BUILD_PYTHON_TRUE@ ../../libstfio/libstfio.la $(WX_LIBS) \ @BUILD_PYTHON_TRUE@ $(am__append_1) @BUILD_PYTHON_TRUE@EXTRA_DIST = pystf.i numpy.i ivtools.py mintools.py natools.py minidemo.py charlie.py mintools.py hdf5tools.py spells.py tdms.py embedded_init.py embedded_stf.py embedded_mpl.py embedded_ipython.py heka.py extensions.py gccwarn all: all-am .SUFFIXES: .SUFFIXES: .cxx .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/stimfit/py/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/stimfit/py/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libpystf.la: $(libpystf_la_OBJECTS) $(libpystf_la_DEPENDENCIES) $(EXTRA_libpystf_la_DEPENDENCIES) $(AM_V_CXXLD)$(libpystf_la_LINK) $(am_libpystf_la_rpath) $(libpystf_la_OBJECTS) $(libpystf_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpystf_la-pystf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpystf_la-pystf_wrap.Plo@am__quote@ .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libpystf_la-pystf.lo: $(srcdir)/pystf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpystf_la_CPPFLAGS) $(CPPFLAGS) $(libpystf_la_CXXFLAGS) $(CXXFLAGS) -MT libpystf_la-pystf.lo -MD -MP -MF $(DEPDIR)/libpystf_la-pystf.Tpo -c -o libpystf_la-pystf.lo `test -f '$(srcdir)/pystf.cxx' || echo '$(srcdir)/'`$(srcdir)/pystf.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpystf_la-pystf.Tpo $(DEPDIR)/libpystf_la-pystf.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(srcdir)/pystf.cxx' object='libpystf_la-pystf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpystf_la_CPPFLAGS) $(CPPFLAGS) $(libpystf_la_CXXFLAGS) $(CXXFLAGS) -c -o libpystf_la-pystf.lo `test -f '$(srcdir)/pystf.cxx' || echo '$(srcdir)/'`$(srcdir)/pystf.cxx libpystf_la-pystf_wrap.lo: $(srcdir)/pystf_wrap.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpystf_la_CPPFLAGS) $(CPPFLAGS) $(libpystf_la_CXXFLAGS) $(CXXFLAGS) -MT libpystf_la-pystf_wrap.lo -MD -MP -MF $(DEPDIR)/libpystf_la-pystf_wrap.Tpo -c -o libpystf_la-pystf_wrap.lo `test -f '$(srcdir)/pystf_wrap.cxx' || echo '$(srcdir)/'`$(srcdir)/pystf_wrap.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpystf_la-pystf_wrap.Tpo $(DEPDIR)/libpystf_la-pystf_wrap.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(srcdir)/pystf_wrap.cxx' object='libpystf_la-pystf_wrap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpystf_la_CPPFLAGS) $(CPPFLAGS) $(libpystf_la_CXXFLAGS) $(CXXFLAGS) -c -o libpystf_la-pystf_wrap.lo `test -f '$(srcdir)/pystf_wrap.cxx' || echo '$(srcdir)/'`$(srcdir)/pystf_wrap.cxx mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @BUILD_PYTHON_FALSE@install-exec-hook: @BUILD_PYTHON_FALSE@uninstall-hook: clean: clean-am clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-exec-am install-strip uninstall-am .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-exec-hook install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-pkglibLTLIBRARIES install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-hook uninstall-pkglibLTLIBRARIES .PRECIOUS: Makefile @BUILD_PYTHON_TRUE@$(srcdir)/pystf_wrap.cxx $(srcdir)/stf.py: $(srcdir)/pystf.i @BUILD_PYTHON_TRUE@ $(SWIG) $(SWIG_PYTHON_OPT) -o $@ $< @BUILD_PYTHON_TRUE@ cat $(srcdir)/gccwarn $(srcdir)/pystf_wrap.cxx > $(srcdir)/pystf_wrap_tmp.cxx @BUILD_PYTHON_TRUE@ mv $(srcdir)/pystf_wrap_tmp.cxx $(srcdir)/pystf_wrap.cxx @BUILD_PYTHON_TRUE@install-exec-hook: @BUILD_PYTHON_TRUE@ cd ${prefix}/lib/stimfit && ln -sf ${STF_PYTHON_LIBNAME} _stf.so @BUILD_PYTHON_TRUE@ rm -f ${prefix}/lib/stimfit/*.la @BUILD_PYTHON_TRUE@ rm -f ${prefix}/lib/stimfit/*.a @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/ivtools.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/mintools.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/natools.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/minidemo.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/charlie.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/hdf5tools.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/stf.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/spells.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/tdms.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/embedded_init.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/embedded_stf.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/embedded_mpl.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/embedded_ipython.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/heka.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/extensions.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ cp -p $(srcdir)/../../pystfio/stfio_plot.py ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@ chmod -x ${prefix}/lib/stimfit/*.py @BUILD_PYTHON_TRUE@uninstall-hook: @BUILD_PYTHON_TRUE@ rm -rf ${prefix}/lib/stimfit @BUILD_PYTHON_TRUE@clean_local: @BUILD_PYTHON_TRUE@ rm -f $(srcdir)/pystf_wrap.cxx $(srcdir)/stf.py # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stimfit-0.15.8/src/stimfit/py/gccwarn0000664000175000017500000000023413062445067014462 00000000000000#if defined(__WXMAC__) || defined(__WXGTK__) #pragma GCC diagnostic ignored "-Wuninitialized" #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif stimfit-0.15.8/src/stimfit/py/embedded_stf.py0000664000175000017500000000320013062445067016066 00000000000000#=========================================================================== # embedded_stf.py # 2009.09.14 # Don't modify this file unless you know what you are doing!!! #=========================================================================== """ embedded_stf.py starting code to embed wxPython into the stf application. """ import sys if 'win' in sys.platform: import wxversion wxversion.select('3.0-msw') import wx from wx.py import shell # to access the current versions of Stimfit, NumPy and wxPython from embedded_init import intro_msg # test if stf_init was loaded try: import stf_init except ImportError: LOADED = " " except SyntaxError: LOADED = " Syntax error in custom initialization script stf_init.py" else: LOADED = " Successfully loaded custom initializaton script stf_init.py" class MyPanel(wx.Panel): """ The wxPython shell application """ def __init__(self, parent): # super makes the same as wx.Panel.__init__(self, parent, etc..) # but prepares for Python 3.0 among other things... super(MyPanel, self).__init__(parent, -1, \ style = wx.BORDER_NONE | wx.MAXIMIZE) # the Pycrust shell object self.pycrust = shell.Shell(self,-1, \ introText = intro_msg() + LOADED) # Workaround for http://trac.wxwidgets.org/ticket/15008 if "darwin" in sys.platform: self.pycrust.autoCallTip = False self.pycrust.push('from embedded_init import *', silent = True) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.pycrust, 1, wx.EXPAND | wx.BOTTOM | wx.LEFT | wx.RIGHT, 10) self.SetSizer(sizer) stimfit-0.15.8/src/stimfit/py/charlie.py0000775000175000017500000001276213062445067015110 00000000000000""" Calculates resistances 2008-05-06, C. Schmidt-Hieber Indices are zero-based! """ import numpy as np # stimfit python module: import stf # import iv tools: import ivtools def resistance( base_start, base_end, peak_start, peak_end, amplitude ): """Calculates the resistance from a series of voltage clamp traces. Keyword arguments: base_start -- Starting index (zero-based) of the baseline cursors. base_end -- End index (zero-based) of the baseline cursors. peak_start -- Starting index (zero-based) of the peak cursors. peak_end -- End index (zero-based) of the peak cursors. amplitude -- Amplitude of the voltage command. Returns: The resistance. """ if (stf.check_doc() == False): print('Couldn\'t find an open file; aborting now.') return 0 # A temporary array to calculate the average: set = np.empty( (stf.get_size_channel(), stf.get_size_trace()) ) for n in range( 0, stf.get_size_channel() ): # Add this trace to set: set[n] = stf.get_trace( n ) # calculate average and create a new section from it: stf.new_window( np.average(set,0) ) # set peak cursors: if ( not(stf.set_peak_mean(-1)) ): return False # -1 means all points within peak window. if ( not(stf.set_peak_start(peak_start)) ): return False if ( not(stf.set_peak_end(peak_end)) ): return False # set base cursors: if ( not(stf.set_base_start(base_start)) ): return False if ( not(stf.set_base_end(base_end)) ): return False # measure everything: stf.measure() # calculate r_seal and return: return amplitude / (stf.get_peak()-stf.get_base()) def r_seal( amplitude=50 ): """Calculates the seal resistance from a series of voltage clamp traces. Keyword arguments: amplitude -- Amplitude of the voltage command. Defaults to 50 mV. Returns: The seal resistance. """ return resistance( 0, 199, 1050, 1199, amplitude ) def r_in( amplitude=-5 ): """Calculates the input resistance from a series of voltage clamp traces. Keyword arguments: amplitude -- Amplitude of the voltage command. Defaults to -5 mV. Returns: The input resistance. """ return resistance( 0, 999, 10700, 10999, amplitude ) def glu_iv( pulses = 13, subtract_base=True ): """Calculates an iv from a repeated series of fast application and voltage pulses. Keyword arguments: pulses -- Number of pulses for the iv. subtract_base -- If True (default), baseline will be subtracted. Returns: True if successful. """ # Some ugly definitions for the time being # Cursors are in ms here. gFitEnd = 330.6 # fit end cursor is variable gFSelect = 0 # Monoexp gDictSize = stf.leastsq_param_size( gFSelect ) + 2 # Parameters, chisqr, peak value gBaseStart = 220.5 # Start and end of the baseline before the control pulse, in ms gBaseEnd = 223.55 gPeakStart = 223.55 # Start and end of the peak cursors for the control pulse, in ms gPeakEnd = 253.55 if ( gDictSize < 0 ): print('Couldn\'t retrieve function id=%d, aborting now.'%gFSelect) return False if ( not(stf.check_doc()) ): print('Couldn\'t find an open file; aborting now.') return False # analyse iv, subtract baseline if requested: ivtools.analyze_iv( pulses ) if ( subtract_base == True ): if ( not(stf.set_base_start( gBaseStart, True )) ): return False if ( not(stf.set_base_end( gBaseEnd, True )) ): return False stf.measure() stf.select_all() stf.subtract_base() # set cursors: if ( not(stf.set_peak_start( gPeakStart, True )) ): return False if ( not(stf.set_peak_end( gPeakEnd, True )) ): return False if ( not(stf.set_base_start( gBaseStart, True )) ): return False if ( not(stf.set_base_end( gBaseEnd, True )) ): return False if ( not(stf.set_fit_end( gFitEnd, True )) ): return False if ( not(stf.set_peak_mean( 3 )) ): return False if ( not(stf.set_peak_direction( "both" )) ): return False # A list for dictionary keys and values: dict_keys = [] dict_values = np.empty( (gDictSize, stf.get_size_channel()) ) firstpass = True for n in range( 0, stf.get_size_channel() ): if ( stf.set_trace( n ) == False ): print('Couldn\'t set a new trace; aborting now.') return False print('Analyzing trace %d of %d'%( n+1, stf.get_size_channel() ) ) # set the fit window cursors: if ( not(stf.set_fit_start( stf.peak_index() )) ): return False # Least-squares fitting: p_dict = stf.leastsq( gFSelect ) if ( p_dict == 0 ): print('Couldn\'t perform a fit; aborting now.') return False # Create an empty list: tempdict_entry = [] row = 0 for k, v in p_dict.iteritems(): if ( firstpass == True ): dict_keys.append( k ) dict_values[row][n] = v row = row+1 if ( firstpass ): dict_keys.append( "Peak amplitude" ) dict_values[row][n] = stf.get_peak()-stf.get_base() firstpass = False retDict = dict() # Create the dictionary for the table: entry = 0 for elem in dict_keys: retDict[ elem ] = dict_values[entry].tolist() entry = entry+1 return stf.show_table_dictlist( retDict ) stimfit-0.15.8/src/stimfit/py/embedded_ipython.py0000664000175000017500000000364113062445067016775 00000000000000#=========================================================================== # embedded_ipython.py # 2009.09.14 # Don't modify this file unless you know what you are doing!!! #=========================================================================== """ embedded_ipython.py starting code to embed wxPython into the stf application. """ import wx from IPython.frontend.wx.wx_frontend import WxController # from IPython.gui.wx.ipython_view import IPShellWidget import IPython.ipapi # test if stf_init was loaded try: import stf_init except ImportError: LOADED = " " except SyntaxError: LOADED = " Syntax error in custom initialization script stf_init.py" else: LOADED = " Successfully loaded custom initializaton script stf_init.py" class MyPanel(wx.Panel): """ The wxPython shell application """ def __init__(self, parent): # super makes the same as wx.Panel.__init__(self, parent, etc..) # but prepares for Python 3.0 among other things... super(MyPanel, self).__init__(parent, -1, \ style = wx.BORDER_NONE | wx.MAXIMIZE) # ipython_shell is the shell object # WxController provides a Wx frontend for the IPython interpreter # see in /usr/lib/pymodules/python2.5/IPython/frontend/wx # see an example in /usr/lib/modules/python2.5/IPython/gui/wx ipython_shell = WxController(self) # ipython_shell = IPShellWidget(self,background_color = "BLACK") # ipython_shell = IPShellWidget(self) ipython_shell.clear_screen() # the ip object will access the IPython functionality ip = IPython.ipapi.get() # Stimfit and NumPy are visible to the interactive sesion. # see embedded_init for details ip.ex('from embedded_init import *') sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(ipython_shell, 1, wx.EXPAND | wx.BOTTOM | wx.LEFT | wx.RIGHT, 10) self.SetSizer(sizer) stimfit-0.15.8/src/stimfit/py/hdf5tools.py0000775000175000017500000002150113062445067015377 00000000000000import sys sys.argv = "" import tables import numpy as np class Recording(): def __init__(self, channels, comment, date, time): self.channels = channels self.comment = comment self.date = date self.time = time def __getitem__( self, i ): return self.channels[i] def get_list( self ): return [ [ s.data for s in c.sections ] for c in self.channels ] def __len__( self ): return len( self.channels ) class Channel(): def __init__(self, sections, name): self.sections = sections self.name = name def __len__( self ): return len( self.sections ) def __getitem__( self, i ): return self.sections[i] class Section(): def __init__(self, data, dt, xunits, yunits): self.data = data self.dt = dt self.xunits = xunits self.yunits = yunits def __len__( self ): return len( self.data ) def __getitem__( self, i ): return self.data[i] class RecordingDescription(tables.IsDescription): channels = tables.Int32Col() date = tables.StringCol(128) time = tables.StringCol(128) class ChannelDescription(tables.IsDescription): n_sections = tables.Int32Col() class SectionDescription(tables.IsDescription): dt = tables.Float64Col() xunits = tables.StringCol(16) yunits = tables.StringCol(16) def save_hdf5( rec, filename ): h5file = tables.openFile(filename, mode = "w", title = "%s, converted to hdf5" % filename) # write global file description root_table = h5file.createTable(h5file.root, "description", RecordingDescription, "Description of %s" % filename) root_row = root_table.row root_row['channels'] = len(rec) root_row['date'] = rec.date root_row['time'] = rec.time root_row.append() root_table.flush() # write comment comment_group = h5file.createGroup("/", "comment", "multiline file comment") strarray = h5file.createArray(comment_group, "comment", [rec.comment,], "multiline file comment") # create group for channel names: chroot_group = h5file.createGroup("/", "channels", "channel names") # loop through channels: for n_c in range(len(rec)): channel_name = rec[n_c].name if channel_name == "": channel_name = "ch%d" % (n_c) channel_group = h5file.createGroup("/", channel_name, "channel%d" % (n_c)) # write channel name to root group: strarray = h5file.createArray(chroot_group, "ch%d" % n_c, [channel_name,], "channel name") channel_table = h5file.createTable(channel_group, "description", ChannelDescription, "Description of %s" % channel_name) channel_row = channel_table.row channel_row['n_sections'] = len(rec[n_c]) channel_row.append() channel_table.flush() if len(rec[n_c])==1: max_log10 = 0 else: max_log10 = int(np.log10(len(rec[n_c])-1)) for n_s in range(len(rec[n_c])): # construct a number with leading zeros: if n_s==0: n10 = 0 else: n10 = int(np.log10(n_s)) strZero = "" for n_z in range(n10,max_log10): strZero += "0" # construct a section name: section_name = "sec%d" % (n_s) # create a child group in the channel: section_group = h5file.createGroup(channel_group, "section_%s%d" % (strZero, n_s), section_name) # add data and description: array = h5file.createArray(section_group, "data", np.array(rec[n_c][n_s].data, dtype=np.float32), "data in %s" % section_name) desc_table = h5file.createTable(section_group, "description", SectionDescription, "description of %s" % section_name) desc_row = desc_table.row desc_row['dt'] = rec[n_c][n_s].dt desc_row['xunits'] = rec[n_c][n_s].xunits desc_row['yunits'] = rec[n_c][n_s].yunits desc_row.append() desc_table.flush() h5file.close() return True def export_hdf5( filename="" ): """ Exports a file in hdf5 format using PyTables. """ stf = __import__("stf") if filename=="": filename = "%s.h5" % (stf.get_filename()) # loop through channels: channel_list = list() for n_c in range(stf.get_size_recording()): section_list = [ Section( stf.get_trace(n_s, n_c), stf.get_sampling_interval(), stf.get_xunits(n_s, n_c), stf.get_yunits(n_s, n_c) ) \ for n_s in range(stf.get_size_channel(n_c)) ] channel_list.append( Channel( section_list, stf.get_channel_name() ) ) rec = Recording( channel_list, stf.get_recording_comment(), stf.get_recording_date(), stf.get_recording_time() ) save_hdf5( rec, filename ) return True def import_hdf5( filename ): """ Imports a file in hdf5 format stored by stimfit using PyTables, returns a Recording object. """ h5file = tables.openFile( filename, mode='r' ) # read global file description root_node = h5file.getNode("/", "description") date = root_node.col("date")[0] time = root_node.col("time")[0] n_channels = root_node.col("channels")[0] # read comment com = h5file.getNode("/", "comment") comment = "" for entry in h5file.walkNodes(com,classname='Array'): comment += "%s" % entry.read()[0] # read channel names channel_names = list() chan = h5file.getNode("/", "channels") for entry in h5file.walkNodes(chan, classname='Array'): channel_names.append( "%s" % entry.read()[0] ) # read data from channels: channel_list = list() for n_c in range(n_channels): channel_node = h5file.getNode("/", channel_names[n_c]) chdesc_node = h5file.getNode( channel_node, "description" ) n_sections = chdesc_node.col("n_sections")[0] # required number of zeros: if n_sections==1: max_log10 = 0 else: max_log10 = int(np.log10(n_sections-1)) # loop through sections: section_list = list() for n_s in range(n_sections): # construct a number with leading zeros: if n_s==0: n10 = 0 else: n10 = int(np.log10(n_s)) strZero = "" for n_z in range(n10,max_log10): strZero += "0" section_name = "section_%s%d" % ( strZero, n_s) section_node = h5file.getNode( channel_node, section_name ) secdesc_node = h5file.getNode( section_node, "description" ) dt = secdesc_node.col("dt")[0] xunits = secdesc_node.col("xunits")[0] yunits = secdesc_node.col("yunits")[0] data = h5file.getNode( section_node, "data").read() section_list.append( Section(data, dt, xunits, yunits) ) channel_list.append( Channel(section_list, channel_names[n_c]) ) h5file.close() return Recording( channel_list, comment, date, time ) def open_hdf5( filename ): """ Opens and shows an hdf5 file with stimfit """ rec = import_hdf5( filename ) stf = __import__("stf") stf._gNames_resize( len(rec.channels) ) for n_c in range(len(rec.channels)): stf._gNames_at( rec.channels[n_c].name, n_c ) stf.new_window_list( rec.get_list() ) n_channels = stf.get_size_recording() dt = rec.channels[0].sections[0].dt stf.set_sampling_interval( dt ) stf.set_recording_comment( rec.comment ) stf.set_recording_date( rec.date ) stf.set_recording_time( rec.time ) for n_c in range(stf.get_size_recording()): for n_s in range(stf.get_size_channel(n_c)): xunits = rec.channels[n_c].sections[n_s].xunits yunits = rec.channels[n_c].sections[n_s].yunits stf.set_xunits( xunits ) stf.set_yunits( yunits, n_s, n_c ) return True def show_rec( rec ): """ Shows recording object in a new stimfit window """ stf = __import__("stf") stf._gNames_resize( len(rec.channels) ) for n_c in range(len(rec.channels)): stf._gNames_at( rec.channels[n_c].name, n_c ) stf.new_window_list( rec.get_list() ) n_channels = stf.get_size_recording() dt = rec.channels[0].sections[0].dt stf.set_sampling_interval( dt ) stf.set_recording_comment( rec.comment ) stf.set_recording_date( rec.date ) stf.set_recording_time( rec.time ) for n_c in range(stf.get_size_recording()): for n_s in range(stf.get_size_channel(n_c)): xunits = rec.channels[n_c].sections[n_s].xunits yunits = rec.channels[n_c].sections[n_s].yunits stf.set_xunits( xunits ) stf.set_yunits( yunits, n_s, n_c ) return True def test(): export_hdf5() open_hdf5("/home/cs/data/EE07_04_11_2AC.dat.h5") stimfit-0.15.8/src/stimfit/py/spells.py0000664000175000017500000004327213062445067015000 00000000000000""" spells.py Python recipes to solve frequently requested tasks with Stimfit. You can find a complete description of these functions in the Stimfit online documentation (http://www.stimfit.org/doc/sphinx/index.html) Check "The Stimfit Book of Spells" for details. Authors: Jose Guzman, Alois Schloegl and Christoph Schmidt-Hieber Last change: Tue Dec 16 10:50:15 CET 2014 """ import numpy as np # stimfit python module: import stf import wx # see APFrame class import wx.grid # see APFrame class from math import ceil, floor def resistance( base_start, base_end, peak_start, peak_end, amplitude): """Calculates the resistance from a series of voltage clamp traces. Keyword arguments: base_start -- Starting index (zero-based) of the baseline cursors. base_end -- End index (zero-based) of the baseline cursors. peak_start -- Starting index (zero-based) of the peak cursors. peak_end -- End index (zero-based) of the peak cursors. amplitude -- Amplitude of the voltage command. Returns: The resistance. """ if not stf.check_doc(): print('Couldn\'t find an open file; aborting now.') return 0 #A temporary array to calculate the average: array = np.empty( (stf.get_size_channel(), stf.get_size_trace()) ) for n in range( 0, stf.get_size_channel() ): # Add this trace to set: array[n] = stf.get_trace( n ) # calculate average and create a new section from it: stf.new_window( np.average(set, 0) ) # set peak cursors: # -1 means all points within peak window. if not stf.set_peak_mean(-1): return 0 if not stf.set_peak_start(peak_start): return 0 if not stf.set_peak_end(peak_end): return 0 # set base cursors: if not stf.set_base_start(base_start): return 0 if not stf.set_base_end(base_end): return 0 # measure everything: stf.measure() # calculate r_seal and return: return amplitude / (stf.get_peak()-stf.get_base()) def rmean(binwidth, trace=-1, channel=-1): """ Calculates a running mean of a single trace Arguments: binwidth -- size of the bin in sampling points (pt). Obviously, it should be smaller than the length of the trace. trace: -- ZERO-BASED index of the trace within the channel. Note that this is one less than what is shown in the drop-down box. The default value of -1 returns the currently displayed trace. channel -- ZERO-BASED index of the channel. This is independent of whether a channel is active or not. The default value of -1 returns the currently active channel. Returns: A smoothed traced in a new stf window. """ # loads the current trace of the channel in a 1D Numpy Array sweep = stf.get_trace(trace, channel) # creates a destination python list to append the data dsweep = np.empty((len(sweep))) # running mean algorithm for i in range(len(sweep)): if (len(sweep)-i) > binwidth: # append to list the running mean of `binwidth` values # np.mean(sweep) calculates the mean of list dsweep[i] = np.mean( sweep[i:(binwidth+i)] ) else: # use all remaining points for the average: dsweep[i] = np.mean( sweep[i:] ) stf.new_window(dsweep) def get_amplitude(base, peak, delta, trace=None): """ Calculates the amplitude deviation (peak-base) in units of the Y-axis Arguments: base -- Starting point (in ms) of the baseline cursor. peak -- Starting point (in ms) of the peak cursor. delta -- Time interval to calculate baseline/find the peak. trace -- Zero-based index of the trace to be processed, if None then current trace is computed. Returns: A float with the variation of the amplitude. False if Example: get_amplitude(980,1005,10,i) returns the variation of the Y unit of the trace i between peak value (10050+10) msec and baseline (980+10) msec """ # sets the current trace or the one given in trace if trace is None: sweep = stf.get_trace_index() else: if type(trace) != int: print('trace argument admits only intergers') return False sweep = trace # set base cursors: if not(stf.set_base_start(base, True)): return False # out-of range if not(stf.set_base_end(base+delta, True)): return False # set peak cursors: if not(stf.set_peak_start(peak, True)): return False # out-of range if not(stf.set_peak_end(peak+delta, True)): return False # update measurements stf.set_trace(sweep) amplitude = stf.get_peak()-stf.get_base() return amplitude def cut_sweeps(start, delta, sequence=None): """ Cuts a sequence of traces and present them in a new window. Arguments: start -- starting point (in ms) to cut. delta -- time interval (in ms) to cut sequence -- list of indices to be cut. If None, every trace in the channel will be cut. Returns: A new window with the traced cut. Examples: cut_sweeps(200,300) cut the traces between t=200 ms and t=500 ms within the whole channel. cut_sweeps(200,300,range(30,60)) the same as above, but only between traces 30 and 60. cut_sweeps(200,300,stf.get_selected_indices()) cut between 200 ms and 500 ms only in the selected traces. """ # select every trace in the channel if not selection is given in sequence if sequence is None: sequence = range(stf.get_size_channel()) # transform time into sampling points dt = stf.get_sampling_interval() pstart = int( round(start/dt) ) pdelta = int( round(delta/dt) ) # creates a destination python list dlist = [ stf.get_trace(i)[pstart:(pstart+pdelta)] for i in sequence ] return stf.new_window_list(dlist) def count_events(start, delta, threshold=0, up=True, trace=None, mark=True): """ Counts the number of events (e.g action potentials (AP)) in the current trace. Arguments: start -- starting time (in ms) to look for events. delta -- time interval (in ms) to look for events. threshold -- (optional) detection threshold (default = 0). up -- (optional) True (default) will look for upward events, False downwards. trace -- (optional) zero-based index of the trace in the current channel, if None, the current trace is selected. mark -- (optional) if True (default), set a mark at the point of threshold crossing Returns: An integer with the number of events. Examples: count_events(500,1000) returns the number of events found between t=500 ms and t=1500 ms above 0 in the current trace and shows a stf marker. count_events(500,1000,0,False,-10,i) returns the number of events found below -10 in the trace i and shows the corresponding stf markers. """ # sets the current trace or the one given in trace. if trace is None: sweep = stf.get_trace_index() else: if type(trace) !=int: print('trace argument admits only integers') return False sweep = trace # set the trace described in sweep stf.set_trace(sweep) # transform time into sampling points dt = stf.get_sampling_interval() pstart = int( round(start/dt) ) pdelta = int( round(delta/dt) ) # select the section of interest within the trace selection = stf.get_trace()[pstart:(pstart+pdelta)] # algorithm to detect events event_counter, i = 0, 0 # set counter and index to zero # choose comparator according to direction: if up: comp = lambda a, b: a > b else: comp = lambda a, b: a < b # run the loop while i < len(selection): if comp(selection[i], threshold): event_counter += 1 if mark: stf.set_marker(pstart+i, selection[i]) while i < len(selection) and comp(selection[i], threshold): i += 1 # skip until value is below/above threshold else: i += 1 return event_counter class Spike(object): """ A collection of methods to calculate AP properties from threshold (see Stuart et al., 1997). Note that all calculations are performed in the active/current channel!!! """ def __init__(self,threshold): """ Create a Spike instance with sampling rate and threshold measurements are performed in the current/active channel!!! Arguments: threshold -- slope threshold to measure AP kinetics """ self._thr = threshold # set all the necessary AP parameters at construction self._updateattributes() def _updateattributes(self): """ update base, peak, t50, max_rise and tamplitude """ self.base = self.get_base() # in Stimfit is baseline self.peak = self.get_peak() # in Stimfit peak (from threshold) self.t50 = self.get_t50() # in Stimfit t50 self.max_rise = self.get_max_rise() # in Stimfit Slope (rise) self.thr = self.get_threshold_value() # in Stimit Threshold # attributes necessary to calculate latencies self.tonset = self.get_threshold_time() self.tpeak = self.get_tamplitude() self.t50_left = self.get_t50left() def update(self): """ update current trace sampling rate, cursors position and measurements (peak, baseline & AP kinetics) according to the threshold value set at construction or when the object is called with a threshold argument. """ # set slope stf.set_slope(self._thr) # on stf v0.93 or above # update sampling rate self._dt = stf.get_sampling_interval() # update cursors and AP kinetics (peak and half-width) stf.measure() def __call__(self, threshold=None ): """ update AP kinetic parameters to a new threshold in the current trace/channel threshold (optional) -- the new threshold value Examples : dend = Spike(40) # set the spike threshold at 40mV/ms dend(20) # now we set the spike threshold at 20mV/ms The AP parameters will be thereby updated in the current trace/channel. This method allow us to use the same object to calculate AP latencies in different traces. """ if threshold is not None: self._thr = threshold # set a new threshold self.update() # update dt and sampling rate self._updateattributes() def get_base(self): """ Get baseline according to cursor possition in the given current channel/trace """ self.update() return stf.get_trace(trace = -1 ,channel = -1)[stf.get_base_start():stf.get_base_end()+1].mean() def get_peak(self): """ calculate peak measured from threshold in the current trace, (see Stuart et al (1997) """ stf.set_peak_mean(1) # a single point for the peak value stf.set_peak_direction("up") # peak direction up self.update() peak = stf.get_peak()-stf.get_threshold_value() return peak def get_t50(self): """ calculates the half-widht in ms in the current trace""" self.update() # current t50's difference to calculate half-width (t50) return (stf.t50right_index()-stf.t50left_index())*self._dt def get_max_rise(self): """ maximum rate of rise (dV/dt) of AP in the current trace, which depends on the available Na+ conductance, see Mainen et al, 1995, Schmidt-Hieber et al, 2008 """ self.update() pmaxrise = stf.maxrise_index() # in active channel trace = stf.get_trace(trace = -1, channel =-1) # current trace dV = trace[int(ceil(pmaxrise))]-trace[(int(floor(pmaxrise)))] return dV/self._dt def get_tamplitude(self): """ return the time a the peak in the current trace""" #stf.peak_index() does not update cursors!!! self.update() return stf.peak_index()*self._dt def get_t50left(self): """ return the time at the half-width """ self.update() return stf.t50left_index()*self._dt def show_threshold(self): """ return the threshold value (in mV/ms) set at construction or when the object was called""" return self._thr def get_threshold_value(self): """ return the value (in y-units) at the threshold """ self.update() # stf.get_threshold_value does not update return stf.get_threshold_value() def get_threshold_time(self): """ return the value (in x-units) at the threshold """ self.update() return stf.get_threshold_time('True') # TODO # how to get the name of the object as string # Latencies according to Schmidt-Hieber need revision!!! class APFrame(wx.Frame): def __init__(self, soma, dend): """ creates a grid and fill it with AP kinetics from soma and dendrites Arguments: soma_AP -- Spike object for the soma dend_AP -- Spike object for the dendrite see Spike() class for more details """ # first check that both soma and dend are Spike() instances if not isinstance(soma,Spike) or not isinstance(dend,Spike): print('wrong argument, did you create a Spike object???') return 0 # initialize the wxframe wx.Frame.__init__(self, None, \ title = "AP parameters (from threshold)", size = (740,135)) # wxgrid columns self.col = ["Threshold\n (mV/ms)", "Onset\n (ms)", "Onset\n (mV)", "Baseline\n (mV)", "AP Peak\n (mV)", "AP Peak\n (ms)", "Half-width\n (ms)","Vmax\n (mV/ms)"] # wxgrid rows self.row = ["Soma", "Dend", "latency"] # Grid grid = wx.grid.Grid(self) grid.CreateGrid(len(self.row), len(self.col)) # Set grid labels for i in range(len(self.col)): grid.SetColLabelValue(i, self.col[i]) for i in range(len(self.row)): grid.SetRowLabelValue(i, self.row[i]) # Create a list with the AP parameters for the dendrite somalist = [soma.show_threshold(), soma.tonset, soma.thr, soma.base, soma.peak, soma.tpeak, soma.t50, soma.max_rise] # Fill soma values in the grid for i in range(len(self.col)): grid.SetCellValue(0,i, "%.4f"%somalist[i]) # Create a list with the AP parameters for the dendrite dendlist = [dend.show_threshold(), dend.tonset, dend.thr, dend.base, dend.peak, dend.tpeak, dend.t50, dend.max_rise] # Fill dend values in the grid for i in range(len(self.col)): grid.SetCellValue(1,i, "%.4f"%dendlist[i]) # Calculate latencies with different methods # onset latency grid.SetCellValue(2,1, "%.4f"%(dend.tonset - soma.tonset)) # peak latency grid.SetCellValue(2,5, "%.4f"%(dend.tpeak - soma.tpeak)) # half-width latency grid.SetCellValue(2,6, "%.4f"%(dend.t50_left -soma.t50_left)) def latency(soma, dend): """ Shows a results table with the latencies between the somatic and dendritic object Arguments: soma -- Spike Object of a trace containing the somatic AP dend -- Spike Object of a trace containing the dendritic AP see Spike() class for more details """ frame = APFrame(soma, dend) frame.Show() def count_aps(): """ Shows a result table with the number of action potentials (i.e events whose potential is above 0 mV) in selected traces. If no trace is selected, then the current trace is analyzed. Returns: False if document is not open. """ if not stf.check_doc(): print("Open file first") return False if len( stf.get_selected_indices() )==0: sel_trace = [ stf.get_trace_index()] else: sel_trace = stf.get_selected_indices() mytable = dict() for trace in sel_trace: tstart = 0 tend = stf.get_size_trace(trace)*stf.get_sampling_interval() threshold = 0 spikes = count_events(tstart, tend, threshold, True, trace, True) mytable["Trace %.3d" %trace] = spikes stf.show_table(mytable) return True def loadnrn( file ): """ Load a NEURON datafile and opens a new Stimfit window with a trace with the default units (e.g ms and mV) Arguments: file -- (string) file to be read """ time, trace = np.loadtxt(fname = file, skiprows = 2, unpack =1) dt = time[1] # the second temporal sampling point is the sampling stf.new_window( trace ) stf.set_sampling_interval( dt ) def loadtxt(freq=400): """ Loads an ASCII file with extension *.GoR. This file contains ratiometric fluorescent measurements (i.e Green over Red fluorescence) saved in one column. This function opens a new Stimfit window and sets the x-units to "ms" and y-units to "Delta G over R". Arguments: freq -- (float) the sampling rate (in Hz) for fluorescence acquistion. the default value is 400 Hz """ fname = wx.FileSelector("Import Ca transients" , default_extension="Ratiometric" , default_path="." , wildcard = "Ratiometric fluorescence (*.GoR)|*.GoR" , flags = wx.OPEN | wx.FILE_MUST_EXIST) stf.new_window( np.loadtxt(fname) ) stf.set_xunits('ms') stf.set_yunits('Delta G/R') stf.set_sampling_interval(1.0/freq*1000) # acquisition at 400 Hz stimfit-0.15.8/src/stimfit/Makefile.am0000775000175000017500000000175513062445067014533 00000000000000pkglib_LTLIBRARIES = libstimfit.la libstimfit_la_SOURCES = ./stf.cpp \ ./gui/app.cpp ./gui/unopt.cpp ./gui/doc.cpp ./gui/copygrid.cpp ./gui/graph.cpp \ ./gui/printout.cpp ./gui/parentframe.cpp ./gui/childframe.cpp ./gui/view.cpp ./gui/table.cpp ./gui/zoom.cpp \ ./gui/dlgs/convertdlg.cpp ./gui/dlgs/cursorsdlg.cpp ./gui/dlgs/eventdlg.cpp \ ./gui/dlgs/fitseldlg.cpp ./gui/dlgs/smalldlgs.cpp \ ./gui/usrdlg/usrdlg.cpp libstimfit_la_CPPFLAGS = libstimfit_la_CXXFLAGS = $(OPT_CXXFLAGS) $(WX_CXXFLAGS) libstimfit_la_LDFLAGS = $(LIBPYTHON_LDFLAGS) $(LIBSTF_LDFLAGS) libstimfit_la_LIBADD = $(WX_LIBS) ../libstfio/libstfio.la ../libstfnum/libstfnum.la if WITH_BIOSIGLITE libstimfit_la_LIBADD += ../libbiosiglite/libbiosiglite.la endif # the application source, library search path, and link libraries if BUILD_PYTHON PYTHON_ADDINCLUDES = $(LIBNUMPY_INCLUDES) $(LIBPYTHON_INCLUDES) else PYTHON_ADDINCLUDES = endif INCLUDES = $(PYTHON_ADDINCLUDES) stimfit-0.15.8/src/stimfit/res/0000775000175000017500000000000013315356572013340 500000000000000stimfit-0.15.8/src/stimfit/res/ch2.xpm0000775000175000017500000000104413062445067014461 00000000000000/* XPM */ static const char * ch2_[] = { /* columns rows colors chars-per-pixel */ "16 16 8 1", "0 c #FF0000", "1 c #FF2A2A", "2 c #FF3333", "3 c #FF2000", "4 c #FF1000", "5 c #FF6347", "X c #E9967A", ". c None", /* pixels */ "................", "................", "......0000......", ".....00..00.....", "....55...X55....", "....44....44....", "..........44....", ".........44.....", "........44......", "......33........", ".....33.........", "....22222000....", "....00001111....", "................", "................", "................" }; stimfit-0.15.8/src/stimfit/res/latency_lim.xpm0000775000175000017500000000107713062445067016313 00000000000000/* XPM */ static const char * latency_lim[] = { "16 16 13 1", " c None", ". c #678FB1", "+ c #97B4CD", "@ c #DCE9F5", "# c #97BDE1", "$ c #DBE8F4", "% c #95B2CC", "& c #72A6D6", "* c #EBF2F9", "= c #AFCCE8", "- c #96BCE0", "; c #D6E5F2", "> c #96B3CC", " ", " ", " .. .. ", " .+@..@+. ", " .+@@..@@+. ", " .+@#@..$#$%. ", " .+@#&#**#&#$+. ", ".+@#&&&==&&&-@+.", ".+@#&&&==&&&-@+.", " .+@#&#**#&#$+. ", " .+@#@..$-;>. ", " .+@@..@@+. ", " .+@..@+. ", " .. .. ", " ", " "}; stimfit-0.15.8/src/stimfit/res/16-em-down.xpm0000775000175000017500000000111013062445067015571 00000000000000/* XPM */ static const char *___em_down[] = { /* columns rows colors chars-per-pixel */ "16 16 10 1", " c #678FB1", ". c #72A6D6", "X c #B8B7AD", "o c #97B4CD", "O c #9DB8CF", "+ c #97BDE1", "@ c #AFCCE8", "# c #DCE9F5", "$ c #EBF2F9", "% c None", /* pixels */ "%%%%%%%%%%%%%%%%", "%%%%% %%%%%", "%%%%% $$$$ %%%%%", "%%%%% $@@$ %%%%%", "%%%%% $@@$ %%%%%", "%%%%% $@@$ %%%%%", "%% O$@@$O %%", "%% ###+..+### %%", "%% o#+....+#o %%", "%%X o#+..+#o X%%", "%%%X o#++#o X%%%", "%%%%X o##o X%%%%", "%%%%%X oo X%%%%%", "%%%%%%X X%%%%%%", "%%%%%%%XX%%%%%%%", "%%%%%%%%%%%%%%%%" }; stimfit-0.15.8/src/stimfit/res/event.xpm0000775000175000017500000000074513062445067015135 00000000000000/* XPM */ static const char *event[] = { /* columns rows colors chars-per-pixel */ "16 16 4 1", " c grey32", "x c grey48", "X c grey64", ". c None", /* pixels */ "................", " X......... x", "... X........ x.", "... X....... x..", "... X...... x...", "... X..... x....", "... X....X X....", "... X.... X.....", "... X...X ......", "... X..X .......", "... X.X X.......", "...x X X.......", "...X X........", "....X ..........", "................", "................" }; stimfit-0.15.8/src/stimfit/res/fit.xpm0000775000175000017500000000074313062445067014574 00000000000000/* XPM */ static const char *fit[] = { /* columns rows colors chars-per-pixel */ "16 16 4 1", " c grey32", "x c grey48", "X c grey64", ". c None", /* pixels */ "................", ".............xx.", "............. .", "............. .", "............X .", "...xx xx.... .", "..X ..X ..", ".. XX ..", ".. .... ...", ".. ......xx....", ".X ............", ". X............", ". .............", ". .............", ".xx.............", "................" }; stimfit-0.15.8/src/stimfit/res/resultset_first.xpm0000775000175000017500000000314713062445067017254 00000000000000/* XPM */ static const char *resultset_first[] = { /* columns rows colors chars-per-pixel */ "16 16 80 1", " c #1233B2", ". c #1239B6", "X c #133CB7", "o c #143EB6", "O c #1441BB", "+ c #164ABD", "@ c #1752C0", "# c #1855C4", "$ c #195AC4", "% c #1859C6", "& c #195CC6", "* c #1A62C8", "= c #1E69CB", "- c #1E6BCD", "; c #3364C6", ": c #386BCA", "> c #2C74CF", ", c #3D77D0", "< c #397BD2", "1 c #4481D3", "2 c #4180D4", "3 c #4384D6", "4 c #4784D6", "5 c #4A85D6", "6 c #4584D8", "7 c #4A89D9", "8 c #4C89D8", "9 c #5089D9", "0 c #528BD9", "q c #538DD9", "w c #5E91D8", "e c #5C92DF", "r c #6397DA", "t c #6297DB", "y c #6597DB", "u c #6497DD", "i c #669ADF", "p c #6A9BDC", "a c #6B9CDD", "s c #699DDF", "d c #6E9FDD", "f c #6D9DDE", "g c #6D9EDE", "h c #709FDE", "j c #71A1DF", "k c #76A3DF", "l c #659BE1", "z c #73A2E1", "x c #70A0E2", "c c #77A4E1", "v c #77A6E6", "b c #79A7E1", "n c #7AA7E0", "m c #7BA8E1", "M c #7EA8E1", "N c #7EA9E2", "B c #7EA9E8", "V c #83ACE3", "C c #85ADE4", "Z c #86AEE4", "A c #80ABE8", "S c #80ABEA", "D c #8AB1E5", "F c #8DB2E6", "G c #8EB3E6", "H c #8FB5E7", "J c #8FB4E8", "K c #90B5E6", "L c #90B4E7", "P c #91B6E8", "I c #96B9EA", "U c #98BBE9", "Y c #9DBEEC", "T c #9EC0EB", "R c #A2C1EE", "E c #A5C4ED", "W c #ABC8EF", "Q c #B0CBF0", "! c #B4CEF2", "~ c None", /* pixels */ "~~~~~~~~~~~~~~~~", "~~~~~~~~~~~~~~~~", "~~~SSBv~~~~q0~~~", "~~~S!Rx~~~876~~~", "~~~vQYl~~5aP<~~~", "~~~xWIe~4lJF>~~~", "~~~lEJ01uKMC-~~~", "~~~eTU3xFbaM*~~~", "~~~0UF=1mrh@~~~", "~~~Vy*~~+:rO~~~", "~~~-mw%~~~o;X~~~", "~~~*&#@~~~~ .~~~", "~~~~~~~~~~~~~~~~", "~~~~~~~~~~~~~~~~" }; stimfit-0.15.8/src/stimfit/res/cursor.xpm0000775000175000017500000000250613062445067015326 00000000000000/* XPM */ static const char *cursor[] = { /* columns rows colors chars-per-pixel */ "16 16 63 1", " c gray46", ". c gray47", "X c #797979", "o c #7C7C7C", "O c gray49", "+ c #848484", "@ c #868686", "# c #888888", "$ c #898989", "% c #8D8D8D", "& c #8E8E8E", "* c gray57", "= c gray58", "- c #959595", "; c gray59", ": c gray61", "> c #9D9D9D", ", c gray62", "< c #A0A0A0", "1 c #A4A4A4", "2 c #A7A7A7", "3 c #A9A9A9", "4 c #AAAAAA", "5 c gray68", "6 c #AFAFAF", "7 c #B1B1B1", "8 c gray71", "9 c #B6B6B6", "0 c #B7B7B7", "q c #B9B9B9", "w c #BBBBBB", "e c gray74", "r c gray", "t c #C1C1C1", "y c gray77", "u c #C5C5C5", "i c #C6C6C6", "p c #C8C8C8", "a c #CBCBCB", "s c #D0D0D0", "d c #D5D5D5", "f c #D7D7D7", "g c gray85", "h c gray86", "j c #DFDFDF", "k c gray88", "l c #E1E1E1", "z c #E2E2E2", "x c gray89", "c c #E4E4E4", "v c gray90", "b c #E7E7E7", "n c gray91", "m c #EAEAEA", "M c #ECECEC", "N c gray93", "B c #EEEEEE", "V c #EFEFEF", "C c gray94", "Z c gray95", "A c #F4F4F4", "S c gray97", "D c None", /* pixels */ "DDDDDDDDDDDDDDDD", "DDDDpuDDDDDDDDDD", "DDDDugeDDDDDDDDD", "DDDDtSdqDDDDDDDD", "DDDDeSVa6DDDDDDD", "DDDD0SVVp2DDDDDD", "DDDD0ZncVu,DDDDD", "DDDD6Vczzct;DDDD", "DDDD6Vzzzccq%DDD", "DDDD2Zzcc;*%$$DD", "DDDD1d,aV*DDDDDD", "DDDD,,D;gt$DDDDD", "DDDD,DDD6Z@DDDDD", "DDDDDDDD@gqODDDD", "DDDDDDDDD4g.DDDD", "DDDDDDDDDO. DDDD" }; stimfit-0.15.8/src/stimfit/res/zoom.xpm0000775000175000017500000000263113062445067014774 00000000000000/* XPM */ static const char *zoom[] = { /* columns rows colors chars-per-pixel */ "16 16 67 1", " c #874828", ". c #9B5830", "X c #A55C33", "o c #AB6437", "O c #AB6737", "+ c #AB643D", "@ c #BE7340", "# c #B67943", "$ c #B77E47", "% c #B87F47", "& c #B98048", "* c #B98149", "= c #BC854A", "- c #BC844B", "; c #BB814C", ": c #BC834F", "> c #BC864C", ", c #BD864C", "< c #BD894C", "1 c #BE894D", "2 c #BE8A4D", "3 c #BE8A4F", "4 c #BC8451", "5 c #C18E4F", "6 c #C18F4F", "7 c #C28F50", "8 c #C18C52", "9 c #C18E58", "0 c #C39150", "q c #C39153", "w c #C39255", "e c #C39156", "r c #C49555", "t c #C69655", "y c #C79757", "u c #C69956", "i c #C79A57", "p c #C89C57", "a c #C99F5B", "s c #CDA45B", "d c #CCA15D", "f c #CDA55E", "g c #CDA65E", "h c #CEA65E", "j c #CEA75E", "k c #C99B61", "l c #CDA561", "z c #CEA660", "x c #CEA761", "c c #CEA662", "v c #CFA762", "b c #CFA861", "n c #CFA864", "m c #D2AB6F", "M c #D6B479", "N c #D7B57D", "B c #D6B57F", "V c #DABB80", "C c #DBBF87", "Z c #DEC48D", "A c #DFC58F", "S c #E0C793", "D c #E3CC99", "F c #E7D3A0", "G c #E8D5A3", "H c #E9D7A5", "J c None", /* pixels */ "JJJjxnxdaJJJJJJJ", "JJxjJJJJuyJJJJJJ", "JxsJJJJJJ00JJJJJ", "jjJJJJJJJJ7 c #2C74CF", ", c #397BD1", "< c #397BD2", "1 c #4281D3", "2 c #4481D3", "3 c #4685D6", "4 c #4E80D2", "5 c #4B87D6", "6 c #4584D8", "7 c #4E89D8", "8 c #5385D4", "9 c #578BD6", "0 c #528BD9", "q c #5E92D9", "w c #5E94D8", "e c #5990DD", "r c #5C92DF", "t c #6397DA", "y c #6095DF", "u c #6297DF", "i c #6699DD", "p c #6A9BDC", "a c #699DDF", "s c #6E9DDF", "d c #709FDE", "f c #74A3DF", "g c #76A3DF", "h c #659BE1", "j c #73A2E0", "k c #70A0E2", "l c #72A2E2", "z c #77A6E6", "x c #7AA6E5", "c c #7BA8E3", "v c #7EA8E1", "b c #7FA9E3", "n c #7FAAE3", "m c #7BA7E8", "M c #7EA9E8", "N c #81ABE2", "B c #82ABE3", "V c #83ACE3", "C c #85ADE4", "Z c #84AEE4", "A c #86AEE4", "S c #80ABE8", "D c #87B0E6", "F c #89B1E4", "G c #8AB1E5", "H c #8BB2E5", "J c #89B1E6", "K c #8BB3E7", "L c #8DB2E6", "P c #88B0E8", "I c #91B6E8", "U c #92B7E8", "Y c #94B7E8", "T c #97BAEA", "R c #98BBE9", "E c #9ABCEA", "W c #9EBEEA", "Q c #9EC0EB", "! c #A6C3EE", "~ c #A5C4ED", "^ c #ABC8EF", "/ c #ADC8EF", "( c None", /* pixels */ "((((((((((((((((", "((((((((((((((((", "(((SM((((hue0(((", "(((SMk(((rJE6(((", "(((z/Pu((0AY<(((", "(((k^!x7(3cL>(((", "(((h~TWa<V2&((@8tO(((", "(((;1%(((+4tO(((", "(((=#((((Oo (((", "((((((((((((((((", "((((((((((((((((" }; stimfit-0.15.8/src/stimfit/res/arrow_left.xpm0000775000175000017500000000212513062445067016152 00000000000000/* XPM */ static const char *arrow_left[] = { /* columns rows colors chars-per-pixel */ "16 16 45 1", " c #205E1D", ". c #246321", "X c #296925", "o c #2F702A", "O c #35782F", "+ c #3B8035", "@ c #42883B", "# c #499141", "$ c #4F9947", "% c #56A14D", "& c #5CA953", "* c #64AA5B", "= c #62B158", "- c #68B85D", "; c #7BBE71", ": c #78BD72", "> c #7CBE76", ", c #71C365", "< c #74C768", "1 c #7EC078", "2 c #80C17A", "3 c #83C17A", "4 c #82C27D", "5 c #84C37E", "6 c #86C87B", "7 c #87C97C", "8 c #8ACC7F", "9 c #87C581", "0 c #89C682", "q c #8BC785", "w c #8BCD80", "e c #8EC987", "r c #90CA89", "t c #93CB8B", "y c #95CC8E", "u c #98CE90", "i c #9ACF93", "p c #9DD094", "a c #9FD296", "s c #A1D398", "d c #A3D49A", "f c #A5D59C", "g c #A7D69E", "h c #ABD8A2", "j c None", /* pixels */ "jjjjjjjjjjjjjjjj", "jjjjjjjjjjjjjjjj", "jjjjjjjjjjjjjjjj", "jjjjjjjjjjjjjjjj", "jjjj:.j", "jj-;3*$#@+OoX. j", "jjj&%jjjjjjjjjjj", "jjjj$jjjjjjjjjjj", "jjjjjjjjjjjjjjjj", "jjjjjjjjjjjjjjjj", "jjjjjjjjjjjjjjjj", "jjjjjjjjjjjjjjjj" }; stimfit-0.15.8/src/stimfit/res/table.xpm0000775000175000017500000000435613062445067015105 00000000000000/* XPM */ static const char *table[] = { /* columns rows colors chars-per-pixel */ "16 16 100 2", " c #7CBE76", ". c #80C17A", "X c #84C37E", "o c #4277BB", "O c #5284C3", "+ c #5486C4", "@ c #5586C6", "# c #5687C7", "$ c #5D8AC5", "% c #5C8AC6", "& c #5F8CC6", "* c #598AC8", "= c #5B8AC9", "- c #5F8DC8", "; c #5E8ECB", ": c #5F8FCB", "> c #6392CE", ", c #6493CE", "< c #6896D1", "1 c #6A97D1", "2 c #6E99D3", "3 c #6F9BD4", "4 c #729ED6", "5 c #74A0D7", "6 c #75A1D7", "7 c #7AA3DA", "8 c #7AA4D9", "9 c #7DA5DC", "0 c #7EA8DD", "q c #89C682", "w c #8EC987", "e c #93CB8B", "r c #98CE90", "t c #9DD094", "y c #A1D398", "u c #A5D59C", "i c #80A9DD", "p c #82AADF", "a c #84ACE0", "s c #87AEE1", "d c #88AFE2", "f c #8CB1E3", "g c #8CB2E4", "h c #8FB4E5", "j c #90B5E6", "k c #93B7E7", "l c #94B7E7", "z c #96BAE9", "x c #98BAE9", "c c #9ABCEB", "v c #9BBDEB", "b c #9DBEEB", "n c #9EBFEC", "m c #9FC0ED", "M c #A6C3E9", "N c #A1C1EE", "B c #A2C1EF", "V c #A9C4E8", "C c #AAC6E9", "Z c #ACC7E8", "A c #ACC6E9", "S c #ADC7E9", "D c #ACC7EA", "F c #ADC7EA", "G c #AEC8E8", "H c #AEC9E9", "J c #AEC9EA", "K c #B0C8E8", "L c #B0C9E9", "P c #B0C9EA", "I c #B2CBEA", "U c #B3CCEA", "Y c #B5CCE8", "T c #B5CDEA", "R c #B7CEEA", "E c #BACFEA", "W c #BAD0EB", "Q c #BBD0EB", "! c #BDD1EB", "~ c #BED2EB", "^ c #BFD3EB", "/ c #D8E2F0", "( c #DBE4F1", ") c #DBE5F1", "_ c #DEE7F2", "` c #DEE7F3", "' c #E2EAF4", "] c #E6EDF6", "[ c #EAF0F7", "{ c #EBF1F7", "} c #EDF2F8", "| c #EEF3F9", " . c #EFF3F9", ".. c #F0F4FA", "X. c #F1F6FA", "o. c #F2F6FA", "O. c #F2F6FB", "+. c #F4F7FB", "@. c gray100", "#. c None", /* pixels */ "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.", "#.#.B m b v z k k g d a i 9 7 #.", "#.B +.+.+.+.+.+.o.o.+.+.+.+.5 #.", "#.n +.u y t r e w q X . o.4 #.", "#.v +.@.@.@.@.@.@.@.@.@.@.+.1 #.", "#.x +.M M M M M M M M M M +., #.", "#.l +.M @.C @.@.@.A @.@.@.{ : #.", "#.h o.C A A A H K Z K K Y _ * #.", "#.g O.J @.K @.@.@.H @.@.@.) @ #.", "#.a o.U U U U U Y Z A K H / @ #.", "#.a .Y @.W @.@.@.W O.@.@./ & #.", "#.9 .W E ! W E ! Y Y T Y / % #.", "#.8 .^ @.! @.@.@.A @.@.@./ & #.", "#.5 .[ ] ' ` _ / / / / / / % #.", "#.4 2 < , ; = @ O O O O O O o #.", "#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#." }; stimfit-0.15.8/src/stimfit/res/arrow_up.xpm0000775000175000017500000000246413062445067015652 00000000000000/* XPM */ static const char *arrow_up[] = { /* columns rows colors chars-per-pixel */ "16 16 60 1", " c #22601E", ". c #256421", "X c #266522", "o c #296925", "O c #2B6B26", "+ c #2D6E28", "@ c #30722B", "# c #33752D", "$ c #367A31", "% c #397D33", "& c #3D8236", "* c #3F8539", "= c #438A3C", "- c #468D3F", "; c #4A9242", ": c #4C9545", "> c #509A48", ", c #539E4A", "< c #58A44F", "1 c #59A650", "2 c #5EAC55", "3 c #5FAD56", "4 c #65AC5D", "5 c #65B45B", "6 c #68B85D", "7 c #6EBF62", "8 c #78BD72", "9 c #7ABD74", "0 c #7CBF76", "q c #70C265", "w c #71C365", "e c #72C466", "r c #72C566", "t c #73C667", "y c #7DC073", "u c #7EC079", "i c #80C17A", "p c #83C679", "a c #82C27D", "s c #86C37D", "d c #85C37E", "f c #85C87B", "g c #87CA7C", "h c #88CA7E", "j c #87C581", "k c #89C682", "l c #8CC785", "z c #8EC987", "x c #91CA8A", "c c #93CB8B", "v c #95CC8E", "b c #98CE90", "n c #9ACF93", "m c #9CD094", "M c #9FD296", "N c #A1D398", "B c #A3D49A", "V c #A5D49C", "C c #A7D69E", "Z c None", /* pixels */ "ZZZZZZZZZZZZZZZZ", "ZZZZZZZrwZZZZZZZ", "ZZZZZZrhg6ZZZZZZ", "ZZZZZrgCV93ZZZZZ", "ZZZZw7pBNs<,ZZZZ", "ZZZZZZ5MM4ZZZZZZ", "ZZZZZZ3nv>ZZZZZZ", "ZZZZZZ1vc;ZZZZZZ", "ZZZZZZ,cz=ZZZZZZ", "ZZZZZZ:lk&ZZZZZZ", "ZZZZZZ-js$ZZZZZZ", "ZZZZZZ*au@ZZZZZZ", "ZZZZZZ%uuOZZZZZZ", "ZZZZZZ#98XZZZZZZ", "ZZZZZZ+oX ZZZZZZ", "ZZZZZZZZZZZZZZZZ" }; stimfit-0.15.8/src/stimfit/res/arrow_right.xpm0000775000175000017500000000210713062445067016335 00000000000000/* XPM */ static const char *arrow_right[] = { /* columns rows colors chars-per-pixel */ "16 16 44 1", " c #246321", ". c #296925", "X c #35782F", "o c #3B8035", "O c #42883B", "+ c #45883F", "@ c #498B44", "# c #4A8C45", "$ c #499141", "% c #4F9947", "& c #50914A", "* c #5C9D55", "= c #56A14D", "- c #5CA953", "; c #5EA159", ": c #62A35A", "> c #62B158", ", c #68B85D", "< c #6DBE61", "1 c #7CBE76", "2 c #71C365", "3 c #74C768", "4 c #80C17A", "5 c #82C27D", "6 c #84C37E", "7 c #87C581", "8 c #89C682", "9 c #8BC785", "0 c #8EC987", "q c #90CA89", "w c #93CB8B", "e c #95CC8E", "r c #98CE90", "t c #9ACF93", "y c #9DD094", "u c #9FD296", "i c #A1D398", "p c #A3D49A", "a c #A5D59C", "s c #A7D69E", "d c #A9D7A0", "f c #ABD8A2", "g c #AEDAA5", "h c None", /* pixels */ "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhh%hhhh", "hhhhhhhhhhh$Ohhh", "h332<,>-=%$:*Xhh", "h3gfsputeq975&.h", "h2ssiytq08641# h", "h<,>-=%$Oo+;@ hh", "hhhhhhhhhhh. hhh", "hhhhhhhhhhh hhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh" }; stimfit-0.15.8/src/stimfit/res/stimfit.png0000664000175000017500000000507613062445067015452 00000000000000‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ 6lþ±‡ ¾IDATxÚå›mŒUÇÏ™™û¶wߺK¥µ°EZ ”ByRhR"«ÅhÊ5QÐP1¾Æ‰  ÄH DAø€F° FH€ÚÀ¥H×Rû–m·»{÷Þ½wfÎyü0³õvmÙ.ÜÝî­g÷dfîdrïù?ÿçuÎ#yÈ$׳}è$×G\”¤Ó¤G¯î¼€¨_¨;ÌÔ#0~î>à‹ 2A¾3+b|Uõ@ÕÙ.yAĉÄq­Ú¨\âtÚ%]hýðȰèSóœ}ÕÙ\ûœ|¦è{ÆC›„û8çãªVjC¥ÒÀ›7¾ýÔ×§Â S ” ´ö€ŒˆWX°ü«Ëç.þôãm Ô‹ŠjYTRF„ÑáÒ»RÚ·å¦7ÿþÝÀX B¨©ÀrªÖt-\õë\¡[«ˆ„ªâT¥I¦$Óg%_èÖ–9‹oÎw,œäÓµz€˜:ƒç¹Î/ r§‰ŸDi6ã_GUŒ1Xñ3~üúë “®™z@¾mÞ9çÔ9ƒæ…'‚ˆŸm]š2 SÏ€qË9u¶ ƤÆT9n†EñS‚‰ 0ãFPm4ËŸªsPdSu7õ6à PœÇñ8T©3€¦^8í©šÆd:Ë`ÀÔ1ÿ#˜NmïUuM#G ¤21öùŸH°1 ·[¢ôΓ´õ\Jç’+2ÅY˜ÕQ¡QÃx{^üC¯ü¯ô.¥×ïgç#×V‡f¥ih8qX¦Ò÷­ÙÚ²ítä:È»½Oüg£Ù¡ Ó€ª2ºãiòAžB'Ÿ)дОm#_f߆_L°»Ç"Buo/™ €o|ã“ñ2äü<­Ù¼7ÝþÙc®bp•`Œ‡1_ðu BÎÏÑ–›CØ{/qudÖä €Z IibÙ1wYŠ'†|&OÑÏ1òÌÏo1 XÐ@ KxbPçÈO$RGñ 2-& ˜i!_=ÀØîuœ ( QDPux§"À;Q…Œ«d½,Ål+ñæ{ˆ«Ž/ˆFv#ª‚â0§ Iq‘ýsÏ¢sþ…ü­™"•ÞûAÌ1U…†P܆ˆ(ê^ç)ï•£ vé•XbÄÐâú7QÙõÂ15ˆ  ܆˜¤pìP¤õ£ŒW‘E„pÊŠoaÕâ{Ål'ñ«÷bm|ÌX0- Pñ³„j¡^ºªôçãºqêÈúYòjyþVDRÒ¬¨*áÈN@pêP/ª‡¾x¡Š¥ãâïâÒë\Ђ·£»_JlÇ 3¡±¡° Q§‚ªî0¾BØnCº–|Ž(®â‰¡䩼p;ÑØÐŒÛƒ?’4XQœs¨Ÿ?b1Ĉ°ïäK(vŽSG`òAÁ ·à\Ü|¨ ¨ÃÙÎ9bQè\Èû½F«ÄUZ/º(eMÆËàìbxë_˜ÉZdCÚÈ.\jÍ­ ÉvŸù¾t¶ÇUzV|›0ªà‰!ãg)¿v£ïnj6ô=¢Xµ„ñ…yçÕ—÷ÏYDÏk‰\Œ'†\ÐÂþçI–g¤œØ0#xàí¿¡ V-¹|a®ãè\§ )/þ ™|'ÖYŒñð⻟üQƒª“3@T"ª %ôw–|÷"[;ê°‹9sõI6©Šoìþ·è½?ɧ‘ æÃ?1 ï|ƒSGdCZç]6šR!å­¨ÌÙ«n"Œ«x~†Á×î£VÚƒ L—>˜¸ò4ý7ÔJýlúfT‡# GéZ´zÊþ\UÙÑÞÃÉ‹V»AðDèûëu8%žf¶ ¥÷Þàß/ßÃëë¯I¥ŸÐÙò¯0âg>P9Í©£ýÂoÐÞÞƒU›¤ØÑ[$y_9 Puôoù#¯QÄh­¼oµi¬Í¬ÛÕ5å’]º4U'6*—˜Ð;dêq€Øöho•Q©:×´ýšlªu1Ά î|îY’ž¡qÔ£®]†d+y[¶8/›o?y©O#ͺk<Ù®c£ •Á¾¾í/Üö;`(‘´ÎD~ôc  ”ßÙxÇzcü9] /ý„ççTŒ/ÍÆEQgÕÙPÆFvíýÑn%éï²õ1Cä€`.0˜W<áÌ3ºzV—-žxbº£©iÚ¦4GKûw<»yh×s½@?°;=e ¬ïÌôÓtÝ)]@+PHAòhŽÆÉqF¥ ÞÒóPìáT`8ý,*@‘CÛLf{3‘NXÏ(0’J}(%7„~ÝC6Õñë0}8OÒfâ5,IoàX*ÈJz^¥®qÒŸð`\Ljñ‡êúìšÄ¸:Æ›$ëÛgÆGjžï©?š AÓlW‰Lpýÿd ‘IŽÍýëáBýúñG–®ÎzS‚‚IEND®B`‚stimfit-0.15.8/src/stimfit/res/camera.xpm0000775000175000017500000000560113062445067015240 00000000000000/* XPM */ static const char *camera[] = { /* columns rows colors chars-per-pixel */ "16 16 143 2", " c #2A2A2A", ". c gray17", "X c #2C2C2C", "o c #2D2D2D", "O c #313131", "+ c gray20", "@ c #343434", "# c #353535", "$ c #373737", "% c #393939", "& c gray23", "* c #3C3C3C", "= c #3E3E3E", "- c #3F3F3F", "; c gray25", ": c #414141", "> c gray26", ", c #444444", "< c #464646", "1 c gray28", "2 c gray29", "3 c #4E4E4E", "4 c #505050", "5 c #535353", "6 c #565656", "7 c gray34", "8 c #585858", "9 c #5A5A5A", "0 c #5B5B5B", "q c gray36", "w c gray37", "e c #5F5F5F", "r c #606060", "t c gray38", "y c #626262", "u c #646464", "i c #656565", "p c #676767", "a c #686868", "s c DimGray", "d c #6A6A6A", "f c #6C6C6C", "g c #6D6D6D", "h c gray43", "j c #6F6F6F", "k c #717171", "l c #727272", "z c #747474", "x c gray46", "c c #767676", "v c gray47", "b c gray48", "n c #7C7C7C", "m c #7E7E7E", "M c #857C69", "N c #9B937F", "B c #F3BE41", "V c #5C96D5", "C c #5E96D5", "Z c #5E97D6", "A c #5F98D6", "S c #6496CE", "D c #6899CE", "F c #689ACE", "G c #6397D0", "H c #6397D1", "J c #6496D0", "K c #6099D6", "L c #6299D6", "P c #609AD6", "I c #629AD7", "U c #639BD7", "Y c #669BD7", "T c #649CD7", "R c #659CD7", "E c #699AD4", "W c #6A9AD4", "Q c #619AD8", "! c #659BD8", "~ c #669CD8", "^ c #679CD8", "/ c #679DD8", "( c #669DD9", ") c #699ED9", "_ c #6A9FD9", "` c #6AA0D9", "' c #808080", "] c #818181", "[ c #848484", "{ c gray52", "} c #868686", "| c gray53", " . c #888888", ".. c #8B8B8B", "X. c gray55", "o. c #8D8D8D", "O. c #8E8E8E", "+. c #909090", "@. c #929292", "#. c #939392", "$. c #939393", "%. c gray58", "&. c #959595", "*. c gray59", "=. c #979797", "-. c #989898", ";. c #9A9A9A", ":. c #9B9B9B", ">. c #9D9D9D", ",. c gray62", "<. c #9F9F9F", "1. c #8393A3", "2. c #95A5B8", "3. c gray64", "4. c #A5A5A5", "5. c gray65", "6. c #A9A9A9", "7. c #AAAAAA", "8. c gray68", "9. c #AEAEAE", "0. c gray69", "q. c #B4B4B4", "w. c #B7B7B7", "e. c #B9B9B9", "r. c gray73", "t. c #BCBCBC", "y. c #F9E0A4", "u. c #A2B3C5", "i. c #B7C7DA", "p. c #C0C0C0", "a. c gray77", "s. c #C6C6C6", "d. c gray78", "f. c #C8C8C8", "g. c gray79", "h. c gray80", "j. c #D0D0D0", "k. c #D2D2D2", "l. c #D5D5D5", "z. c #D7D7D7", "x. c #D8D8D8", "c. c #DDDDDD", "v. c None", /* pixels */ "v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.", "v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.", "v.-.+... .] v k h c ..v.v.v.v.v.", "v.-.f.f.s.a.N y.B M +.v.q q q v.", "h 9.k.0.5.,.w.=.4.u.7.l a a a 5 ", "h t.5.t.c.z.z.h.5.[ =.q.,.o...: ", "a 5.r.i.W C V H u.=.k 9.-.a N # ", "p -.x.W L Y T A S 9.w 6.@.w b $ ", "i %.j.C ! ` ) R L 4.5 5.X.7 c % ", "y o.d.A ! ) ` ) L :.4 ,.{ 3 h $ ", "r | r.S U ! ! ! D X.2 -.' 1 a $ ", "w m ..2.S T ! D 1.0 : =.n : u O ", "7 j a b :.-.$.{ 8 ; p +.z t 9 O ", "v.$ $ , , : - * @ o . . . ", "v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.", "v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v." }; stimfit-0.15.8/src/stimfit/res/stimfit32x32.xpm0000664000175000017500000001145713062445067016174 00000000000000/* XPM */ static char *stimfit_32x32[] = { /* columns rows colors chars-per-pixel */ "32 32 164 2 ", " c black", ". c #020000", "X c #050305", "o c #090000", "O c #110000", "+ c #130103", "@ c #19070E", "# c #1E080F", "$ c #0D0D1B", "% c #160E1C", "& c #290B17", "* c #220F1E", "= c #2E0D1A", "- c #1A1021", "; c #111D3A", ": c #111E3D", "> c #201124", ", c #2E1327", "< c #2F1327", "1 c #29172E", "2 c #37152A", "3 c #30172E", "4 c #261D3A", "5 c #211F3F", "6 c #361933", "7 c #391A34", "8 c #3F1A34", "9 c #301D3A", "0 c #441831", "q c #16254B", "w c #17264B", "e c #17254C", "r c #17264C", "t c #182850", "y c #182851", "u c #182951", "i c #182952", "p c #192B56", "a c #1E2B57", "s c #232143", "d c #2D2346", "f c #2B284F", "g c #302449", "h c #2A2953", "j c #2A2F5E", "k c #2E2E5C", "l c #2F2F5E", "z c #302E5C", "x c #382C58", "c c #3D2F5E", "v c #2C305F", "b c #252F60", "n c #2A3265", "m c #2E3264", "M c #303060", "N c #313162", "B c #283871", "V c #293B77", "C c #283C78", "Z c #323C77", "A c #303C79", "S c #323F7D", "D c #4C2040", "F c #462D5B", "G c #4D2D5B", "H c #4B3264", "J c #2E468C", "K c #354284", "L c #354285", "P c #32478F", "I c #3A478E", "U c #3E478E", "Y c #3E478F", "T c #3E4C98", "R c #384E9C", "E c #3152A3", "W c #3253A6", "Q c #3253A7", "! c #3A52A4", "~ c #3454A8", "^ c #3455AA", "/ c #3356AD", "( c #3457AE", ") c #3757AE", "_ c #3857AF", "` c #3458AF", "' c #3558B1", "] c #3559B1", "[ c #3658B0", "{ c #365BB7", "} c #385DBA", "| c #385FBE", " . c #3A5FBF", ".. c #48458A", "X. c #4F458A", "o. c #4554A9", "O. c #4559B2", "+. c #4958B1", "@. c #4A5CB7", "#. c #3A62C3", "$. c #3B62C4", "%. c #3D63C8", "&. c #3B65C9", "*. c #3B67CD", "=. c #3C66CC", "-. c #3D66CC", ";. c #3C66CD", ":. c #3D66CD", ">. c #3C67CD", ",. c #3D67CD", "<. c #3C67CE", "1. c #3D67CE", "2. c #3C67CF", "3. c #3D67CF", "4. c #3E67CF", "5. c #3E68CF", "6. c #3D68D0", "7. c #3C69D1", "8. c #3E68D0", "9. c #3E68D1", "0. c #3D69D3", "q. c #3E69D2", "w. c #3F69D2", "e. c #3F69D3", "r. c #3C6AD3", "t. c #3F6AD2", "y. c #3E6AD3", "u. c #3F6AD3", "i. c #3E6AD4", "p. c #3F6AD4", "a. c #3E6AD5", "s. c #3E6BD5", "d. c #3F6BD5", "f. c #3E6BD6", "g. c #3F6BD6", "h. c #3E6BD7", "j. c #3F6BD7", "k. c #3E6CD7", "l. c #3F6CD8", "z. c #4262C3", "x. c #4562C3", "c. c #4063C7", "v. c #4466CC", "b. c #4369D3", "n. c #4468D0", "m. c #4469D3", "M. c #406BD5", "N. c #426BD5", "B. c #406BD6", "V. c #406BD7", "C. c #436BD6", "Z. c #426BD7", "A. c #436BD7", "S. c #406CD7", "D. c #426CD7", "F. c #486BD5", "G. c #406CD8", "H. c #416DDA", "J. c #446DDA", "K. c #456DDA", "L. c #426EDC", "P. c #426FDE", "I. c #4270DF", "U. c None", /* pixels */ "U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.", "U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.", "U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.", "U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.", "U.U.U.U.^ J.B.J.B.B.F.B.B.B.B.B.B.J.B.B.F.B.B.B.B.B.J.~ U.U.U.U.", "U.U.U.q B.:.:.:.:.:.v.:.v.:.v.:.:.:.:.:.:.v.%.:.v.:.:.B.t U.U.U.", "U.U.U.u n.:.:.:.:.:.:.7.:.:.:.:.:.:.:.:.:.:.%.,.:.:.:.B.u U.U.U.", "U.U.U.t 7.:.:.:.:.:.:.7.7.,.:.:.:.:.%.:.:.:.,.,.:.:.:.B.u U.U.U.", "U.U.U.u n.,.:.%.,.,.,.C b %.,.:.,.,.:.,.,.,.,.,.:.:.,.B.t U.U.U.", "U.U.U.t B.,.:.:.,.,.` * & h ,.,.:.,.%.,.,.%.:.,.%.:.,.7.t U.U.U.", "U.U.U.u B.,.:.:.,.7.P , G 3 A l.%.,.%.,.:.%.:.%.,.:.:.7.u U.U.U.", "U.U.U.t 7.,.%.:.,.B.A , O.H 7 ^ ,.,.:.,.,.,.,.,.,.:.:.n.u U.U.U.", "U.U.U.u 7.:.%.:.,.B.N 3 %.@.D x ,.7.,.,.,.,.,.,.%.:.:.B.u U.U.U.", "U.U.U.t B.:.:.:.,.7.f 9 %.7.X.0 K 7.,.,.%.:.:.%.:.:.:.7.u U.U.U.", "U.U.U.t B.:.:.:.,.:.4 d ,.,.v.G 9 ) B.:.,.,.:.:.:.:.:.B.u U.U.U.", "U.U.U.u B.:.%.:.7.%.> z B.:.7.@.0 d :.,.,.%.:.,.%.:.:.B.y U.U.U.", "U.U.U.t 7.:.:.:.B.^ @ Z 7.,.,.7...= n 7.:.:.:.:.:.:.,.B.t U.U.U.", "U.U.U.t B.:.:.:.I.V O R 7.,.,.,.n.c # J J.:.:.:.%.:.,.B.t U.U.U.", "U.U.U.t B.:.,.7.~ $ - :.7.,.:.%.,.x.1 % | 7.:.:.:.:.:.7.u U.U.U.", "U.U.U.t B.7.:.i X o U B.:.,.,.,.,.J.T O u J.:.:.:.:.:.,.u U.U.U.", "U.U.U.u 7.| ; X 5 o.B.:.,.,.,.,.:.:.B.s X ` l.7.B.7.7.B.u U.U.U.", "U.U.U.t I.B X j B.7.:.v.%.:.:.%.:.:.7.! X ; ` ^ ^ ^ | 7.y U.U.U.", "U.U.U.u B.x.U B.,.:.:.:.,.,.,.,.:.:.:.B.j X X X X X ; J.u U.U.U.", "U.U.U.t 7.:.B.:.:.:.%.:.,.%.:.,.:.:.:.,.n.U k k k k K B.u U.U.U.", "U.U.U.u B.:.:.:.:.:.:.,.,.,.:.%.:.:.:.:.:.B.J.J.J.J.B.B.t U.U.U.", "U.U.U.u B.:.:.%.%.:.:.%.%.:.:.:.:.:.:.:.:.:.:.:.:.:.:.B.t U.U.U.", "U.U.U.q B.:.:.:.:.:.:.:.,.,.,.,.:.:.:.:.:.:.:.:.:.:.:.B.t U.U.U.", "U.U.U.U.~ B.B.7.B.B.B.7.7.B.B.n.7.n.7.7.n.B.7.B.7.7.B.^ U.U.U.U.", "U.U.U.U.U.q u t u t t u t u t u t t t t u t t u u u q U.U.U.U.U.", "U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.", "U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.", "U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U.U." }; stimfit-0.15.8/src/stimfit/res/zoom_in.xpm0000775000175000017500000000323313062445067015461 00000000000000/* XPM */ static const char *zoom_in[] = { /* columns rows colors chars-per-pixel */ "16 16 84 1", " c #2A6B26", ". c #2E6F29", "X c #30712B", "o c #32742C", "O c #33762E", "+ c #357930", "@ c #874828", "# c #A55C33", "$ c #AB6437", "% c #AB6737", "& c #AB643D", "* c #3E8337", "= c #448B3D", "- c #4D9645", "; c #539E4B", ": c #5A9B53", "> c #5CA852", ", c #5EAB54", "< c #5FAD56", "1 c #65A75E", "2 c #61B057", "3 c #63B259", "4 c #67B65C", "5 c #6BAC63", "6 c #76B76D", "7 c #B98048", "8 c #BC854A", "9 c #BC844B", "0 c #BC834F", "q c #BC864C", "w c #BD864C", "e c #BD894C", "r c #BE894D", "t c #BE8A4D", "y c #BE8A4F", "u c #BC8451", "i c #C18E4F", "p c #C18F4F", "a c #C28F50", "s c #C18E58", "d c #C39150", "f c #C39153", "g c #C39156", "h c #C49555", "j c #C69655", "k c #C79757", "l c #C69956", "z c #C79A57", "x c #C89C57", "c c #C99F5B", "v c #CDA45B", "b c #CCA15D", "n c #CDA55E", "m c #CDA65E", "M c #CEA65E", "N c #CEA75E", "B c #C99B61", "V c #CDA561", "C c #CEA660", "Z c #CEA761", "A c #CEA662", "S c #CFA762", "D c #CFA861", "F c #CFA864", "G c #D7B57D", "H c #D6B57F", "J c #82C27D", "K c #86C57D", "L c #DABB80", "P c #8BC683", "I c #8BC785", "U c #90CA88", "Y c #9ACF92", "T c #9ED195", "R c #9FD297", "E c #A6D59D", "W c #DEC48D", "Q c #DFC58F", "! c #E0C793", "~ c #E3CC99", "^ c #E7D3A0", "/ c #E8D5A3", "( c #E9D7A5", ") c None", /* pixels */ "))))))))))))))))", ")))NCFFbc)))))))", "))DN))))lk))))))", ")Dv))))))dd)))))", "NN))))))))iy))))", "C))))))))))y))))", "C))))))42>)y))))", "C))))))TYKUP+))))", ")ki));-1I:o.))))", "))dy)))*Jo~Q0)))", ")))9ww9+X /(L&))", ")))))))))sQ^!B@)", "))))))))))uHHg%)", ")))))))))))#7%))" }; stimfit-0.15.8/src/stimfit/res/fit_lim.xpm0000775000175000017500000000074713062445067015441 00000000000000/* XPM */ static const char *fit_lim[] = { /* columns rows colors chars-per-pixel */ "16 16 4 1", " c grey32", "x c grey48", "X c grey64", ". c None", /* pixels */ "x...............", "x............xx.", "x............ .", "x............ .", "x...........X .", "x..xx xx.... .", "x.X ..X .x", "x. XX .x", "x. .... ..x", "x. ......xx...x", "xX ...........x", ". X...........x", ". ............x", ". ............x", ".xx............x", "...............x" }; stimfit-0.15.8/src/stimfit/res/stimfit16x16.xpm0000664000175000017500000000317613062445067016177 00000000000000/* XPM */ static char *stimfit_16x16[] = { /* columns rows colors chars-per-pixel */ "16 16 82 1 ", " c #14162D", ". c #0F1830", "X c #0F1A33", "o c #151A34", "O c #141B37", "+ c #1C1F3E", "@ c #241E3C", "# c #1C203F", "$ c #25274E", "% c #3E264B", "& c #2B2850", "* c #302D5A", "= c #382C58", "- c #2D3060", "; c #2E376D", ": c #323060", "> c #3B366C", ", c #2A3870", "< c #452E5D", "1 c #304183", "2 c #32458B", "3 c #3A458A", "4 c #354992", "5 c #334A95", "6 c #324E9D", "7 c #3150A1", "8 c #3351A2", "9 c #3155A9", "0 c #3358AF", "q c #3658B0", "w c #3459B2", "e c #3A5AB4", "r c #395EBC", "t c #395EBD", "y c #3A5FBD", "u c #395FBE", "i c #3E5DBC", "p c #4650A1", "a c #425AB5", "s c #3961C2", "d c #3C61C2", "f c #3C65C9", "g c #3E64C9", "h c #3E65CA", "j c #3C66CC", "k c #3D66CC", "l c #3D67CD", "z c #3F66CD", "x c #3D67CE", "c c #3C67CF", "v c #3D67CF", "b c #3E67CE", "n c #3E67CF", "m c #3D68CF", "M c #3E68CF", "N c #3D68D0", "B c #3D68D1", "V c #3E68D0", "C c #3E68D1", "Z c #3D69D2", "A c #3D69D3", "S c #3E69D2", "D c #3F69D2", "F c #3D6AD3", "G c #3F6AD3", "H c #3F6AD4", "J c #3E6AD5", "K c #3F6BD6", "L c #3D6CD7", "P c #3F6CD7", "I c #3F6CD8", "U c #4167CC", "Y c #4268D1", "T c #4369D2", "R c #406AD3", "E c #406AD4", "W c #406AD5", "Q c #416BD7", "! c #406CD8", "~ c #416DDB", "^ c #426FDE", "/ c None", /* pixels */ "////////////////", "////////////////", "//rzzfzzzzfzzr//", "//SMMzMzzzzMMS//", "//MzS1-SjjjzzM//", "//zMS-%3SzjjMz//", "//zzz*e;!MMM//", "//!7.2IjU@7~SM//", "//qo5!jjI5Ow9f//", "//frSzzjMS,#+6//", "//S!zzMzMz!Y!U//", "//rSzzzMzzzz!r//", "///XX..XX.X.X///", "////////////////" }; stimfit-0.15.8/src/stimfit/res/camera_ps.xpm0000775000175000017500000000604313062445067015743 00000000000000/* XPM */ static const char *camera_ps[] = { /* columns rows colors chars-per-pixel */ "16 16 143 2", " c #2A2A2A", ". c gray17", "X c #2C2C2C", "o c #2D2D2D", "O c #313131", "+ c gray20", "@ c #343434", "# c #353535", "$ c #373737", "% c #393939", "& c gray23", "* c #3C3C3C", "= c #3E3E3E", "- c #3F3F3F", "; c gray25", ": c #414141", "> c gray26", ", c #444444", "< c #464646", "1 c gray28", "2 c gray29", "3 c #4E4E4E", "4 c #505050", "5 c #535353", "6 c #565656", "7 c gray34", "8 c #585858", "9 c #5A5A5A", "0 c #5B5B5B", "q c gray36", "w c gray37", "e c #5F5F5F", "r c #606060", "t c gray38", "y c #626262", "u c #646464", "i c #656565", "p c #676767", "a c #686868", "s c DimGray", "d c #6A6A6A", "f c #6C6C6C", "g c #6D6D6D", "h c gray43", "j c #6F6F6F", "k c #717171", "l c #727272", "z c #747474", "x c gray46", "c c #767676", "v c gray47", "b c gray48", "n c #7C7C7C", "m c #7E7E7E", "M c #857C69", "N c #9B937F", "B c #F3BE41", "V c #5C96D5", "C c #5E96D5", "Z c #5E97D6", "A c #5F98D6", "S c #6496CE", "D c #6899CE", "F c #689ACE", "G c #6397D0", "H c #6397D1", "J c #6496D0", "K c #6099D6", "L c #6299D6", "P c #609AD6", "I c #629AD7", "U c #639BD7", "Y c #669BD7", "T c #649CD7", "R c #659CD7", "E c #699AD4", "W c #6A9AD4", "Q c #619AD8", "! c #659BD8", "~ c #669CD8", "^ c #679CD8", "/ c #679DD8", "( c #669DD9", ") c #699ED9", "_ c #6A9FD9", "` c #6AA0D9", "' c #808080", "] c #818181", "[ c #848484", "{ c gray52", "} c #868686", "| c gray53", " . c #888888", ".. c #8B8B8B", "X. c gray55", "o. c #8D8D8D", "O. c #8E8E8E", "+. c #909090", "@. c #929292", "#. c #939392", "$. c #939393", "%. c gray58", "&. c #959595", "*. c gray59", "=. c #979797", "-. c #989898", ";. c #9A9A9A", ":. c #9B9B9B", ">. c #9D9D9D", ",. c gray62", "<. c #9F9F9F", "1. c #8393A3", "2. c #95A5B8", "3. c gray64", "4. c #A5A5A5", "5. c gray65", "6. c #A9A9A9", "7. c #AAAAAA", "8. c gray68", "9. c #AEAEAE", "0. c gray69", "q. c #B4B4B4", "w. c #B7B7B7", "e. c #B9B9B9", "r. c gray73", "t. c #BCBCBC", "y. c #F9E0A4", "u. c #A2B3C5", "i. c #B7C7DA", "p. c #C0C0C0", "a. c gray77", "s. c #C6C6C6", "d. c gray78", "f. c #C8C8C8", "g. c gray79", "h. c gray80", "j. c #D0D0D0", "k. c #D2D2D2", "l. c #D5D5D5", "z. c #D7D7D7", "x. c #D8D8D8", "c. c #DDDDDD", "v. c None", /* pixels */ "v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.", "v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.", "v.-.+... .] v k h c ..v.v.v.v.v.", "v.-.f.f.s.a.N y.B M +.v.q q q v.", "h 9.k.0.5.,.w.=.4.u.7.l a a a 5 ", "h t.5.t.c.z.z.h.5.[ =.q.,.o...: ", "a 5.r.i.W C V H u.=.k 9.-.a N # ", "p -.x.W L Y T A S 9.w 6.@.w b $ ", "i %.j.C ! ` ) R L 4.5 5.X.7 c % ", "y o.d.A ! ) ` v.v.v.v.v.v.v.v.v.", "r | r.S U ! ! v.. . . . v.. . . ", "w m ..2.S T ! v.. v.v.. v.. v.v.", "7 j a b :.-.$.v.. v.v.. v.. . v.", "v.$ $ , , : - v.. . . . v.v.. . ", "v.v.v.v.v.v.v.v.. v.v.v.v.v.v.. ", "v.v.v.v.v.v.v.v.. v.v.v.v.. . . " }; stimfit-0.15.8/src/stimfit/res/accept.xpm0000775000175000017500000000546213062445067015254 00000000000000/* XPM */ static const char *acceptbmp[] = { /* columns rows colors chars-per-pixel */ "16 16 136 2", " c #1D6C1A", ". c #1E6E1A", "X c #1E701A", "o c #1E711A", "O c #1F711B", "+ c #1E731A", "@ c #1F781B", "# c #1E7A1B", "$ c #1F7A1B", "% c #1E7F1B", "& c #1F831B", "* c #208A1B", "= c #20881C", "- c #2D961C", "; c #2F961C", ": c #329D1D", "> c #42A91F", ", c #42AB1F", "< c #42AD1F", "1 c #4C973D", "2 c #4BB426", "3 c #52B92B", "4 c #52BB2D", "5 c #54BB2D", "6 c #54BD31", "7 c #55BE34", "8 c #55C034", "9 c #59C236", "0 c #5BC239", "q c #4E9B41", "w c #52A042", "e c #5EA948", "r c #64B04C", "t c #6CB656", "y c #6DB757", "u c #6AB950", "i c #6EB558", "p c #6FB558", "a c #6FB559", "s c #70BF57", "d c #74B75B", "f c #74B75C", "g c #70B859", "h c #71B95B", "j c #72B95B", "k c #73BA5C", "l c #71BE5F", "z c #7DB766", "x c #77BC60", "c c #7CBA64", "v c #7DBC66", "b c #7DBE67", "n c #7FB869", "m c #74C259", "M c #6FC261", "N c #6FC361", "B c #6EC461", "V c #6EC462", "C c #6EC563", "Z c #6FC664", "A c #70C163", "S c #71C463", "D c #74C364", "F c #70C765", "G c #73C766", "H c #79C164", "J c #7EC169", "K c #7EC76F", "L c #72C868", "P c #74C868", "I c #75C868", "U c #76C969", "Y c #76CA6A", "T c #79C96B", "R c #7ACC6D", "E c #7FCA70", "W c #83BE6D", "Q c #87C272", "! c #85C575", "~ c #89C476", "^ c #80CA73", "/ c #80CC72", "( c #83CE77", ") c #87C979", "_ c #8BC878", "` c #90CE7F", "' c #96C783", "] c #9AC787", "[ c #96CB86", "{ c #97CC85", "} c #98CB86", "| c #9ACA87", " . c #98CC87", ".. c #96CD88", "X. c #99CD8A", "o. c #9DCE8B", "O. c #99D18B", "+. c #99D08C", "@. c #9AD48D", "#. c #9FD291", "$. c #9BD791", "%. c #9DD892", "&. c #A1D695", "*. c #A1D795", "=. c #A3D796", "-. c #ABD29B", ";. c #ABD39B", ":. c #AFD7A0", ">. c #AED7A1", ",. c #AEDCA5", "<. c #AFDCA6", "1. c #B3D9A5", "2. c #B4D9A5", "3. c #B4DAA6", "4. c #B1DDA7", "5. c #B2DBA8", "6. c #B5DBA8", "7. c #B4DDAA", "8. c #B4DFAC", "9. c #B5DFAC", "0. c #B5E1AE", "q. c #B7E1AF", "w. c #B7E1B0", "e. c #BEE3B6", "r. c #BFE3B8", "t. c #C0E4B9", "y. c #D6EED2", "u. c #D9ECD4", "i. c #E6F4E3", "p. c #EDF7EB", "a. c #F1F9F0", "s. c #F4FAF2", "d. c #FCFDFB", "f. c #FDFEFD", "g. c gray100", "h. c None", /* pixels */ "h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.", "h.h.h.h.h.h.0 6 4 3 h.h.h.h.h.h.", "h.h.h.h.9 m =.,.,.*.u < h.h.h.h.", "h.h.h.8 ` q.%.( ( %.q.~ : h.h.h.", "h.h.7 ` q.R I L I I T 8.~ - h.h.", "h.h.s q.R L Z Z Z S e.K q.e h.h.", "h.5 *.$.I Z Z M M r.g.i.O.o.= h.", "h.2 4./ L q.y.M e.g.d.+.J >.% h.", "h., ,./ ^ a.g.p.g.d...j b :.$ h.", "h.> &.+.D ) s.g.g.[ t j [ ] $ h.", "h.h.r 7.H l ! u.X.t i f 3.q h.h.", "h.h.; Q 5.x k j i i d 1.n o h.h.", "h.h.h.* W 3. .c c | 3.c h.h.h.", "h.h.h.h.= w .-.-.' 1 h.h.h.h.", "h.h.h.h.h.h.$ + O h.h.h.h.h.h.", "h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h." }; stimfit-0.15.8/src/stimfit/res/resultset_previous.xpm0000775000175000017500000000234413062445067017777 00000000000000/* XPM */ static const char *resultset_previous[] = { /* columns rows colors chars-per-pixel */ "16 16 54 1", " c #1130B0", ". c #1233B4", "X c #1339B4", "o c #1339B7", "O c #1440B9", "+ c #1547BD", "@ c #164ABD", "# c #1752C0", "$ c #195CC4", "% c #195CC6", "& c #315FC4", "* c #1B65C9", "= c #276ECD", "- c #376BC9", "; c #2A72CF", ": c #3D77D0", "> c #3A7CD4", ", c #4180D6", "< c #4885D6", "1 c #4A87D9", "2 c #5089D9", "3 c #538DD9", "4 c #5A90DB", "5 c #5990DD", "6 c #5F95DC", "7 c #6295DA", "8 c #6095DD", "9 c #6698DB", "0 c #679ADC", "q c #6599DF", "w c #699BDC", "e c #6E9FDD", "r c #71A1DE", "t c #72A1DF", "y c #6297E1", "u c #6599E1", "i c #6B9BE1", "p c #6B9DE0", "a c #71A0E0", "s c #77A4E0", "d c #75A4E3", "f c #7AA6E1", "g c #7AA6E5", "h c #7CA9E1", "j c #81ABE3", "k c #83ADE3", "l c #86AFE5", "z c #8BB3E5", "x c #8DB2E6", "c c #95B8E8", "v c #95B9E8", "b c #99BBE9", "n c #9ABDEA", "m c None", /* pixels */ "mmmmmmmmmmmmmmmm", "mmmmmmmmmmmmmmmm", "mmmmmmmmmiummmmm", "mmmmmmmmqy5mmmmm", "mmmmmmm8gn1mmmmm", "mmmmmm4dnc>mmmmm", "mmmmm3ablx;mmmmm", "mmmm2pcjrk*mmmmm", "mmmm,7xtqt%mmmmm", "mmmmm; c #4C9545", ", c #50924B", "< c #509A48", "1 c #539E4A", "2 c #559A4E", "3 c #579951", "4 c #57A24E", "5 c #59A650", "6 c #5DAA53", "7 c #5FAD56", "8 c #63B259", "9 c #65B45B", "0 c #68B85D", "q c #6ABB5F", "w c #6CAD65", "e c #6DBE62", "r c #7CBF76", "t c #6FC063", "y c #70C265", "u c #72C566", "i c #73C667", "p c #74C768", "a c #7EC079", "s c #80C17A", "d c #82C27D", "f c #85C37E", "g c #87C581", "h c #89C682", "j c #8CC785", "k c #8EC987", "l c #91CA8A", "z c #93CB8B", "x c #95CC8E", "c c #98CE90", "v c #9ACF93", "b c #9CD094", "n c #9FD296", "m c #A1D398", "M c #A3D49A", "N c #A5D49C", "B c #A7D69E", "V c #A9D7A0", "C c #ABD8A2", "Z c None", /* pixels */ "ZZZZZZZZZZZZZZZZ", "ZZZZZZpuyeZZZZZZ", "ZZZZZZuCC0ZZZZZZ", "ZZZZZZtBN8ZZZZZZ", "ZZZZZZqMm6ZZZZZZ", "ZZZZZZ9nn4ZZZZZZ", "ZZZZZZ7vxjh$ZZZZZZ", "ZZZZZZ2gf#ZZZZZZ", "ZZZZ:*wds,+oZZZZ", "ZZZZZ%3ar=XZZZZZ", "ZZZZZZ@;=XZZZZZZ", "ZZZZZZZoXZZZZZZZ", "ZZZZZZZZZZZZZZZZ" }; stimfit-0.15.8/src/stimfit/res/slope.xpm0000775000175000017500000000164013062445067015131 00000000000000/* XPM */ static const char *slope[] = { "16 16 37 1", " c None", ". c #5297DA", "+ c #3E678F", "@ c #2A80D3", "# c #6D9BC8", "$ c #2981D5", "% c #2485E1", "& c #3176B8", "* c #318AE0", "= c #2C7DCB", "- c #2A7ED0", "; c #5998D5", "> c #2A7ECF", ", c #5897D5", "' c #6099D1", ") c #6F9BC6", "! c #287FD3", "~ c #1E90FF", "{ c #2C7BC8", "] c #2783DA", "^ c #5F99D0", "/ c #2581D8", "( c #5196D8", "_ c #2E7BC6", ": c #2C8AE5", "< c #2F7AC3", "[ c #328AE0", "} c #2782DA", "| c #3488DB", "1 c #2882D7", "2 c #348ADD", "3 c #2B7FCF", "4 c #2980D4", "5 c #2486E4", "6 c #1F8DF7", "7 c #3E94E8", "8 c #4B85BC", " ", " ", " .+@ ", " #$%&# ", " *=#@-; ", " @;@#>,@ ", " @'@@)!~@ ", " @'@ @){~@ ", " @'@ @]^~@ ", " @'@ #/(@@ ", " @'@ _:~@@ ", " @'@ <[~@@", " @'@ }|@@", "@@@1'@ =2@", "34567@ @8", " "}; stimfit-0.15.8/src/stimfit/res/sum_new_aligned.xpm0000775000175000017500000000216513062445067017152 00000000000000/* XPM */ static const char *sum_new_aligned[] = { /* columns rows colors chars-per-pixel */ "16 16 48 1", " c black", ". c gray8", "X c gray16", "o c #2A2A2A", "O c #2D2D2D", "+ c gray18", "@ c #2F2F2F", "# c #313131", "$ c #323232", "% c #343434", "& c #353535", "* c #373737", "= c #3A3A3A", "- c gray25", "; c gray27", ": c gray28", "> c #484848", ", c #494949", "< c #4C4C4C", "1 c #4E4E4E", "2 c gray31", "3 c #515151", "4 c gray32", "5 c #555555", "6 c #565656", "7 c #585858", "8 c #5D5D5D", "9 c gray39", "0 c #646464", "q c gray40", "w c #686868", "e c #6A6A6A", "r c #6D6D6D", "t c #6F6F6F", "y c gray44", "u c #727272", "i c gray45", "p c #767676", "a c #777777", "s c #7B7B7B", "d c #7E7E7E", "f c #818181", "g c #8B8B8B", "h c gray56", "j c #9A9A9A", "k c gray62", "l c gray74", "z c None", /* pixels */ "zzzzzzzzzzzzzzzz", "zzzzzzzzzzzzzzzz", "zzfdspytw9zzzzz ", "zzdlsytwq8zz zz ", "zzzghzzzz6zzz z ", "zzzykqzzzzz ", "zzzzqjzzzzzzz z ", "zzzzz74zzzzz zz ", "zzzz64zzzzzzz z ", "zzz64,zzz%zz zzz", "zzz<:zzzz+z zzzz", "zz<::%%$+oz ---z", "zz:==%$+o. -zzz-", "zzzzzzzzz z-zzz-", "zzzzzzzz zz-zzz-", "zzzzzzz zzz-zzz-" }; stimfit-0.15.8/src/stimfit/res/ch1.xpm0000775000175000017500000000110513062445067014456 00000000000000/* XPM */ static const char *ch_[] = { /* columns rows colors chars-per-pixel */ "16 16 11 1", "1 c grey8", "2 c grey12", "3 c grey16", "4 c grey20", "5 c grey24", "6 c grey28", "7 c grey32", "8 c grey36", "9 c grey40", "0 c grey44", ". c None", /* pixels */ "................", "................", "......000.......", ".......00.......", ".......99.......", ".......99.......", ".......88.......", ".......88.......", ".......88.......", ".......77.......", ".......44.......", ".......33.......", ".....111111.....", "................", "................", "................" }; stimfit-0.15.8/src/stimfit/res/arrow_out.xpm0000775000175000017500000000426113062445067016032 00000000000000/* XPM */ static const char *arrow_out[] = { /* columns rows colors chars-per-pixel */ "16 16 96 2", " c #418A3E", ". c #428B3F", "X c #428C3F", "o c #438D40", "O c #448D40", "+ c #458E41", "@ c #458F41", "# c #469042", "$ c #479143", "% c #499445", "& c #4A9545", "* c #4C9447", "= c #4D9948", "- c #4E9948", "; c #4F9B4A", ": c #509C4A", "> c #529F4C", ", c #54A14E", "< c #55A24E", "1 c #56A34F", "2 c #57A450", "3 c #57A550", "4 c #58A651", "5 c #59A752", "6 c #5BA654", "7 c #5AA852", "8 c #5AA853", "9 c #5BA953", "0 c #5CAA54", "q c #5CAB54", "w c #5DAC55", "e c #5EAD56", "r c #5FAD56", "t c #5FAE57", "y c #5EA05A", "u c #61A55D", "i c #63A45F", "p c #64A65E", "a c #64A75F", "s c #60AF58", "d c #61B058", "f c #61B159", "g c #62B159", "h c #62B259", "j c #63B35A", "k c #64B45B", "l c #66B65C", "z c #67B45F", "x c #68B95E", "c c #69B95F", "v c #67A862", "b c #70AD6C", "n c #71AD6D", "m c #73AE6E", "M c #6ABB60", "N c #6BBC60", "B c #6DBF63", "V c #71B46A", "C c #73B46C", "Z c #73B56C", "A c #73B66C", "S c #73B66D", "D c #74B56E", "F c #75B86E", "G c #7AB773", "H c #79B375", "J c #7DBD75", "K c #7EBD76", "L c #6EC063", "P c #70C365", "I c #71C365", "U c #72C466", "Y c #72C566", "T c #73C667", "R c #74C768", "E c #75C56B", "W c #83BB7D", "Q c #82C479", "! c #84C77B", "~ c #86C07E", "^ c #87CA7E", "/ c #89BF83", "( c #8AC083", ") c #8AC084", "_ c #89C980", "` c #8CCC83", "' c #90C58A", "] c #93C78C", "[ c #94C88D", "{ c #95C98E", "} c #9BD192", "| c #A4D39B", " . c #A5D69D", ".. c #A7D69E", "X. c #A9D8A1", "o. c None", /* pixels */ "R R T T P o.o.o.o.o.o.l l g t t ", "R X...P o.o.o.o.o.o.o.o.z ] { 0 ", "U ..} ^ L o.o.o.o.o.o.g K ~ ' 8 ", "P R ` | ! N o.o.o.o.g K ] S 5 3 ", "P o.B _ Q N o.o.o.o.s F S 5 o.< ", "o.o.o.N x o.o.o.o.o.o.8 5 o.o.o.", "o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.", "o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.", "o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.", "o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.", "o.o.o.t t o.o.o.o.o.o.: ; o.o.o.", "g o.t S V 5 o.o.o.o.; a v & o.$ ", "g t V ) D 2 o.o.o.o.= p H i * O ", "t ( G D 3 o.o.o.o.o.o.& y p n X ", "q / W 6 o.o.o.o.o.o.o.o.$ n m X ", "8 5 < < > o.o.o.o.o.o.$ O X X " }; stimfit-0.15.8/src/stimfit/res/zoom_out.xpm0000775000175000017500000000300613062445067015660 00000000000000/* XPM */ static const char *zoom_out[] = { /* columns rows colors chars-per-pixel */ "16 16 74 1", " c #EA111C", ". c #EC1A23", "X c #EE262E", "o c #F1353A", "O c #874828", "+ c #A55C33", "@ c #AB6437", "# c #AB6737", "$ c #AB643D", "% c #B77E47", "& c #F44548", "* c #F75456", "= c #FA6362", "- c #FC6F6D", "; c #FE7874", ": c #B98048", "> c #BC854A", ", c #BC844B", "< c #BB814C", "1 c #BC834F", "2 c #BC864C", "3 c #BD864C", "4 c #BD894C", "5 c #BE894D", "6 c #BE8A4D", "7 c #BE8A4F", "8 c #BC8451", "9 c #C18E4F", "0 c #C18F4F", "q c #C28F50", "w c #C18C52", "e c #C18E58", "r c #C39150", "t c #C39153", "y c #C39156", "u c #C49555", "i c #C69655", "p c #C79757", "a c #C69956", "s c #C79A57", "d c #C89C57", "f c #C99F5B", "g c #CDA45B", "h c #CCA15D", "j c #CDA55E", "k c #CDA65E", "l c #CEA65E", "z c #CEA75E", "x c #C99B61", "c c #CDA561", "v c #CEA660", "b c #CEA761", "n c #CEA662", "m c #CFA762", "M c #CFA861", "N c #CFA864", "B c #D6B479", "V c #D7B57D", "C c #D6B57F", "Z c #DABB80", "A c #DBBF87", "S c #F3A09B", "D c #F4ABA4", "F c #F6B6AE", "G c #DEC48D", "H c #DFC58F", "J c #E0C793", "K c #E3CC99", "L c #E7D3A0", "P c #E8D5A3", "I c #E9D7A5", "U c #F7C0B7", "Y c #F8C8BF", "T c None", /* pixels */ "TTTTTTTTTTTTTTTT", "TTTzvNNhfTTTTTTT", "TTMzTTTTapTTTTTT", "TMgTTTTTTrrTTTTT", "zzTTTTTTTT97TTTT", "vTTTTTTTTTT7TTTT", "vTTTTTTTTTT7TTTT", "vTTTTTTTTTT3TTTT", "fTTTT;-=*&oXTTTT", "apTTT-YUFDS.TTTT", "Tp0TT=*&oX. TTTT", "TT97TTTTwBKG1TTT", "TTT>33,%1APIZ$TT", "TTTTTTTTTeHLJxOT", "TTTTTTTTTT8VVe#T", "TTTTTTTTTTT+:#TT" }; stimfit-0.15.8/src/stimfit/res/resultset_next.xpm0000775000175000017500000000235713062445067017105 00000000000000/* XPM */ static const char *resultset_next[] = { /* columns rows colors chars-per-pixel */ "16 16 55 1", " c #1441B7", ". c #1545B9", "X c #164ABD", "o c #1750BD", "O c #164EC0", "+ c #1853C0", "@ c #1859C4", "# c #1959C6", "$ c #1A62C6", "% c #1A62C9", "& c #236ECD", "* c #2C72CD", "= c #3B71CC", "- c #3C74CF", "; c #3577D2", ": c #3D77D0", "> c #3F7AD0", ", c #437FD3", "< c #4384D6", "1 c #4784D6", "2 c #4B88D6", "3 c #538EDB", "4 c #6095DD", "5 c #6197DD", "6 c #72A1DF", "7 c #75A3DF", "8 c #6297E1", "9 c #6EA0E2", "0 c #74A3E0", "q c #74A2E2", "w c #77A4E0", "e c #75A4E3", "r c #79A6E0", "t c #79A7E6", "y c #7CA9E1", "u c #7EA8E1", "i c #7CA9E8", "p c #7EA9E8", "a c #81ABE2", "s c #80AAE3", "d c #81ABE3", "f c #87AFE4", "g c #80ABE8", "h c #80ABEA", "j c #8AB1E4", "k c #87B0E8", "l c #90B5E7", "z c #92B7E8", "x c #99BBE9", "c c #99BBEA", "v c #A1C1EC", "b c #A3C2ED", "n c #A8C7EE", "m c #ADC8EF", "M c None", /* pixels */ "MMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMM", "MMMMhpMMMMMMMMMM", "MMMMhiqMMMMMMMMM", "MMMMtmk4MMMMMMMM", "MMMM9nbe1MMMMMMM", "MMMM8vzx5*MMMMMM", "MMMM3cssj2$MMMMM", "MMMM c #484848", ", c #494949", "< c #4C4C4C", "1 c #4E4E4E", "2 c gray31", "3 c #515151", "4 c gray32", "5 c #555555", "6 c #565656", "7 c #585858", "8 c #5D5D5D", "9 c gray39", "0 c #646464", "q c gray40", "w c #686868", "e c #6A6A6A", "r c #6D6D6D", "t c #6F6F6F", "y c gray44", "u c #727272", "i c gray45", "p c #767676", "a c #777777", "s c #7B7B7B", "d c #7E7E7E", "f c #818181", "g c #8B8B8B", "h c gray56", "j c #9A9A9A", "k c gray62", "l c gray74", "z c None", /* pixels */ "zzzzzzzzzzzzzzzz", "zzzzzzzzzzzzzzzz", "zzfdspytw9zzzzzz", "zzdlsytwq8zzzzzz", "zzzghzzzz6zzzzzz", "zzzykqzzzzzzzzzz", "zzzzqjzzzzzzzzzz", "zzzzz74zzzzzzzzz", "zzzz64zzzzzzz zz", "zzz64,zzz%zz zzz", "zzz<:zzzz+z zzzz", "zz<::%%$+oz ---z", "zz:==%$+o. -zzz-", "zzzzzzzzz z-zzz-", "zzzzzzzz zz-zzz-", "zzzzzzz zzz-zzz-" }; stimfit-0.15.8/src/stimfit/stf.cpp0000664000175000017500000000620213062445067013764 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file stf.cpp * \author Christoph Schmidt-Hieber * \date 2011-10-01 * \brief General functions for stf * * * Implements some general functions within the stf namespace */ #include "stf.h" #if 0 wxString stf::sectionToString(const Section& section) { wxString retString; retString << (int)section.size() << wxT("\n"); for (int n=0;n<(int)section.size();++n) { retString << section.GetXScale()*n << wxT("\t") << section[n] << wxT("\n"); } return retString; } wxString stf::CreatePreview(const wxString& fName) { ifstreamMan ASCIIfile( fName ); // Stop reading if we are either at the end or at line 100: wxString preview; ASCIIfile.myStream.ReadAll( &preview ); return preview; } #endif stf::wxProgressInfo::wxProgressInfo(const std::string& title, const std::string& message, int maximum, bool verbose) : ProgressInfo(title, message, maximum, verbose), pd(stf::std2wx(title), stf::std2wx(message), maximum, NULL, wxPD_SMOOTH | wxPD_AUTO_HIDE | wxPD_APP_MODAL ) { } bool stf::wxProgressInfo::Update(int value, const std::string& newmsg, bool* skip) { return pd.Update(value, stf::std2wx(newmsg), skip); } std::string stf::wx2std(const wxString& wxs) { #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) return wxs.ToStdString(); #else return std::string(wxs.mb_str()); #endif } wxString stf::std2wx(const std::string& sst) { #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) /* Problems with direct constructor; copying each character for the time being. return wxString(sst); */ wxString wxs; std::string::const_iterator it; for (it = sst.begin(); it != sst.end(); ++it) { if (*it < 0) wxs += ' '; else wxs += (char)*it; } return wxs; #else return wxString(sst.c_str(), wxConvUTF8); #endif } stf::SectionAttributes::SectionAttributes() : eventList(),pyMarkers(),isFitted(false), isIntegrated(false),fitFunc(NULL),bestFitP(0),quad_p(0),storeFitBeg(0),storeFitEnd(0), storeIntBeg(0),storeIntEnd(0),bestFit(0,0) {} stf::SectionPointer::SectionPointer(Section* pSec, const stf::SectionAttributes& sa) : pSection(pSec), sec_attr(sa) {} stf::Event::Event(std::size_t start, std::size_t peak, std::size_t size, wxCheckBox* cb) : eventStartIndex(start), eventPeakIndex(peak), eventSize(size), checkBox(cb) { checkBox->Show(true); checkBox->SetValue(true); } stf::Event::~Event() { } stimfit-0.15.8/src/stimfit/stf.h0000664000175000017500000004266713152223421013434 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file stimdefs.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Common definitions and classes. * * * Header file for common definitions and classes. */ #ifndef _STF_H_ #define _STF_H_ #ifndef _WINDOWS #if (__cplusplus < 201103) #include #endif #endif #if (__GNUC__ > 5) #include #endif #include #include #include #include "./gui/zoom.h" #ifdef _MSC_VER #pragma warning( disable : 4251 ) // Disable warning messages #pragma warning( disable : 4996 ) // Disable warning messages #endif //! Defines dll export or import functions for Windows #if defined(_WINDOWS) && !defined(__MINGW32__) #ifdef STFDLL #define StfDll __declspec( dllexport ) #else #define StfDll __declspec( dllimport ) #endif #else #define StfDll #endif #ifndef MODULE_ONLY #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #include #include #else typedef std::string wxString; typedef int wxWindow; #define wxT(x) x #define wxCHECK_VERSION(major,minor,release) 0 #endif #include "../libstfio/stfio.h" #include "../libstfnum/stfnum.h" //! The stimfit namespace. /*! All essential core functions and classes are in this namespace. * Its purpose is to reduce name mangling problems. */ namespace stf { /*! \addtogroup stfgen * @{ */ //! Progress Info interface adapter; maps to wxProgressDialog class wxProgressInfo : public stfio::ProgressInfo { public: wxProgressInfo(const std::string& title, const std::string& message, int maximum, bool verbose=true); bool Update(int value, const std::string& newmsg="", bool* skip=NULL); private: wxProgressDialog pd; }; std::string wx2std(const wxString& wxs); wxString std2wx(const std::string& sst); //! Converts a Section to a wxString. /*! \param section The Section to be written to a string. * \return A string containing the x- and y-values of the section in two columns. */ wxString sectionToString(const Section& section); //! Creates a preview of a text file. /*! \param fName Full path name of the file. * \return A string showing at most the initial 100 lines of the text file. */ wxString CreatePreview(const wxString& fName); //! Strips the directory off a full path name, returns only the filename. /*! \param fName The full path of a file. * \return The file name without the directory. */ wxString noPath(const wxString& fName); //! Get a Recording, do something with it, return the new Recording. #if (__cplusplus < 201103) typedef boost::function&)> PluginFunc; #else typedef std::function&)> PluginFunc; #endif //! Represents user input from dialogs that can be used in plugins. struct UserInput { std::vector labels; /*!< Dialog entry labels. */ Vector_double defaults; /*!< Default dialog entries. */ std::string title; /*!< Dialog title. */ //! Constructor. /*! \param labels_ A vector of dialog entry label strings. * \param defaults_ A vector of default dialog entries. * \param title_ Dialog title. */ UserInput( const std::vector& labels_=std::vector(0), const Vector_double& defaults_=Vector_double(0), std::string title_="\0" ) : labels(labels_),defaults(defaults_),title(title_) { if (defaults.size()!=labels.size()) { defaults.resize(labels.size()); std::fill(defaults.begin(), defaults.end(), 0.0); } } }; //! User-defined plugin /*! Class used for extending Stimfit's functionality: * The client supplies a new menu entry and an ExtFunc * that will be called upon selection of that entry. */ struct Plugin { //! Constructor /*! \param menuEntry_ Menu entry string for this plugin. * \param pluginFunc_ Function to be executed by this plugin. * \param input_ Dialog entries required by this plugin. */ Plugin( const wxString& menuEntry_, const PluginFunc& pluginFunc_, const UserInput& input_=UserInput() ) : menuEntry(menuEntry_),pluginFunc(pluginFunc_),input(input_) { id = n_plugins; n_plugins++; } //! Destructor ~Plugin() { } int id; /*!< The plugin id; set automatically upon construction, so don't touch. */ static int n_plugins; /*!< Static plugin counter. Initialised in plugins/plugins.cpp. */ wxString menuEntry; /*!< Menu entry string for this plugin. */ PluginFunc pluginFunc; /*!< The function to be executed by this plugin. */ UserInput input; /*!< Dialog entries */ }; //! User-defined Python extension /*! Class used for extending Stimfit's functionality: * The client supplies a new menu entry and a Python function * that will be called upon selection of that entry. */ struct Extension { //! Constructor /*! \param menuEntry_ Menu entry string for this extension. * \param pyFunc_ Python function to be called. * \param description_ Description for this function. * \param requiresFile_ Whether a file needs to be open for this function to work */ Extension(const std::string& menuEntry_, void* pyFunc_, const std::string& description_, bool requiresFile_) : menuEntry(menuEntry_), pyFunc(pyFunc_), description(description_), requiresFile(requiresFile_) { id = n_extensions; n_extensions++; } //! Destructor ~Extension() { } int id; /*!< The extension id; set automatically upon construction, so don't touch. */ static int n_extensions; /*!< Static extension counter. Initialised in extensions/extensions.cpp. */ std::string menuEntry; /*!< Menu entry string for this extension. */ void* pyFunc; /*!< Python function to be called. */ std::string description; /*!< Description for this function. */ bool requiresFile; /*!< Whether a file needs to be open for this function to work */ }; //! Resource manager for ifstream objects. struct ifstreamMan { //! Constructor /*! See fstream documentation for details */ ifstreamMan( const wxString& filename ) : myStream( filename, wxT("r") ) {} //! Destructor ~ifstreamMan() { myStream.Close(); } //! The managed stream. wxFFile myStream; }; //! Resource manager for ofstream objects. struct ofstreamMan { //! Constructor /*! See fstream documentation for details */ ofstreamMan( const wxString& filename ) : myStream( filename, wxT("w") ) {} //! Destructor ~ofstreamMan() { myStream.Close(); } //! The managed stream. wxFFile myStream; }; //! Describes the attributes of an event. class Event { public: //! Constructor explicit Event(std::size_t start, std::size_t peak, std::size_t size, wxCheckBox* cb); //! Destructor ~Event(); //! Retrieves the start index of an event. /*! \return The start index of an event within a section. */ std::size_t GetEventStartIndex() const { return eventStartIndex; } //! Retrieves the index of an event's peak. /*! \return The index of an event's peak within a section. */ std::size_t GetEventPeakIndex() const { return eventPeakIndex; } //! Retrieves the size of an event. /*! \return The size of an event in units of data points. */ std::size_t GetEventSize() const { return eventSize; } //! Indicates whether an event should be discarded. /*! \return true if it should be discarded, false otherwise. */ bool GetDiscard() const { return !checkBox->GetValue(); } //! Get the check box associated with this event /*! \return The wxCheckBox associated with this event */ wxCheckBox* GetCheckBox() {return checkBox;} //! Sets the start index of an event. /*! \param value The start index of an event within a section. */ void SetEventStartIndex( std::size_t value ) { eventStartIndex = value; } //! Sets the index of an event's peak. /*! \param value The index of an event's peak within a section. */ void SetEventPeakIndex( std::size_t value ) { eventPeakIndex = value; } //! Sets the size of an event. /*! \param value The size of an event in units of data points. */ void SetEventSize( std::size_t value ) { eventSize = value; } //! Determines whether an event should be discarded. /*! \param true if it should be discarded, false otherwise. */ /*void SetDiscard( bool value ) { discard = value; }*/ //! Sets discard to true if it was false and vice versa. /*void ToggleStatus() { discard = !discard; }*/ private: std::size_t eventStartIndex; std::size_t eventPeakIndex; std::size_t eventSize; wxCheckBox* checkBox; }; //! A marker that can be set from Python /*! A pair of x,y coordinates */ struct PyMarker { //! Constructor /*! \param xv x-coordinate. * \param yv y-coordinate. */ PyMarker( double xv, double yv ) : x(xv), y(yv) {} double x; /*!< x-coordinate in units of sampling points */ double y; /*!< y-coordinate in trace units (e.g. mV) */ }; struct StfDll SectionAttributes { SectionAttributes(); std::vector eventList; std::vector pyMarkers; bool isFitted,isIntegrated; stfnum::storedFunc *fitFunc; Vector_double bestFitP; Vector_double quad_p; std::size_t storeFitBeg; std::size_t storeFitEnd; std::size_t storeIntBeg; std::size_t storeIntEnd; stfnum::Table bestFit; }; struct SectionPointer { SectionPointer(Section* pSec=NULL, const SectionAttributes& sa=SectionAttributes()); Section* pSection; SectionAttributes sec_attr; }; //! Add decimals if you are not satisfied. const double PI=3.14159265358979323846; //! Does what it says. /*! \param toRound The double to be rounded. * \return The rounded integer. */ int round(double toRound); //! Mouse cursor types enum cursor_type { measure_cursor, /*!< Measurement cursor (crosshair). */ peak_cursor, /*!< Peak calculation limits cursor. */ base_cursor, /*!< Baseline calculation limits cursor. */ decay_cursor, /*!< Fit limits cursor. */ latency_cursor, /*!< Latency cursor. */ zoom_cursor, /*!< Zoom rectangle cursor. */ event_cursor, /*!< Event mode cursor. */ #ifdef WITH_PSLOPE pslope_cursor, /*!< PSlope mode cursor. */ #endif undefined_cursor /*!< Undefined cursor. */ }; //! Determines which channels to scale enum zoom_channels { zoomch1, /*!< Scaling applies to channel 1 only. */ zoomch2, /*!< Scaling applies to channel 2 only. */ zoomboth /*!< Scaling applies to both channels. */ }; //! Latency cursor settings enum latency_mode { manualMode = 0, /*!< Set the corresponding latency cursor manually (by clicking on the graph). */ peakMode = 1, /*!< Set the corresponding latency cursor to the peak. */ riseMode = 2, /*!< Set the corresponding latency cursor to the maximal slope of rise. */ halfMode = 3, /*!< Set the corresponding latency cursor to the half-maximal amplitude. */ footMode = 4, /*!< Set the corresponding latency cursor to the beginning of an event. */ undefinedMode /*!< undefined mode. */ }; //! Latency window settings enum latency_window_mode { defaultMode = 0, /*!< Use the current peak cursor window for the active channel. */ windowMode = 1 /*!< Use a window of 100 sampling points around the peak. */ }; #ifdef WITH_PSLOPE //! PSlope start cursor settings enum pslope_mode_beg { psBeg_manualMode =0, /*< Set the start Slope cursor manually. */ psBeg_footMode =1, /*< Set the start Slope cursor to the beginning of an event. */ psBeg_thrMode =2, /*< Set the start Slope cursor to a threshold. */ psBeg_t50Mode =3, /*< Set the start Slope cursor to the half-width of an event*/ psBeg_undefined }; //! PSlope end cursor settings enum pslope_mode_end { psEnd_manualMode =0, /*< Set the end Slope cursor manually. */ psEnd_t50Mode =1, /*< Set the Slope cursor to the half-width of an event. */ psEnd_DeltaTMode =2, /*< Set the Slope cursor to a given distance from the first cursor. */ psEnd_peakMode =3, /*< Set the Slope cursor to the peak. */ psEnd_undefined }; #endif // WITH_PSLOPE //! Deconvolution enum extraction_mode { criterion, /*!< Clements & Bekkers criterion. */ correlation, /*!< Jonas et al. correlation coefficient. */ deconvolution /*!< Pernia-Andrade et al. deconvolution. */ }; /*@}*/ } // end of namespace inline int stf::round(double toRound) { return toRound <= 0.0 ? int(toRound-0.5) : int(toRound+0.5); } typedef std::vector< wxString >::iterator wxs_it; /*!< std::string iterator */ typedef std::vector< wxString >::const_iterator c_wxs_it; /*!< constant std::string iterator */ typedef std::vector< stf::Event >::iterator event_it; /*!< stf::Event iterator */ typedef std::vector< stf::Event >::const_iterator c_event_it; /*!< constant stf::Event iterator */ typedef std::vector< stf::PyMarker >::iterator marker_it; /*!< stf::PyMarker iterator */ typedef std::vector< stf::PyMarker >::const_iterator c_marker_it; /*!< constant stf::PyMarker iterator */ // Doxygen-links to documentation of frequently used wxWidgets-classes /*! \defgroup wxwidgets wxWidgets classes * @{ */ /*! \class wxApp * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxapp.html (wxWidgets documentation) */ /*! \class wxCheckBox * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxcheckbox.html (wxWidgets documentation) */ /*! \class wxCommandEvent * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxcommandevent.html (wxWidgets documentation) */ /*! \class wxDialog * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxdialog.html (wxWidgets documentation) */ /*! \class wxDocMDIChildFrame * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxdocmdichildframe.html (wxWidgets documentation) */ /*! \class wxDocMDIParentFrame * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxdocmdiparentframe.html (wxWidgets documentation) */ /*! \class wxDocument * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxdocument.html (wxWidgets documentation) */ /*! \class wxGrid * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxgrid.html (wxWidgets documentation) */ /*! \class wxGridCellCoordsArray * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxgridcellcoordsarray.html (wxWidgets documentation) */ /*! \class wxGridTableBase * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxgridtablebase.html (wxWidgets documentation) */ /*! \class wxPoint * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxpoint.html (wxWidgets documentation) */ /*! \class wxPrintout * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxprintout.html (wxWidgets documentation) */ /*! \class wxSize * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxsize.html (wxWidgets documentation) */ /*! \class wxString * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxstring.html (wxWidgets documentation) */ /*! \class wxThread * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxthread.html (wxWidgets documentation) */ /*! \class wxView * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxview.html (wxWidgets documentation) */ /*! \class wxWindow * \brief See http://www.wxwidgets.org/manuals/stable/wx_wxwindow.html (wxWidgets documentation) */ /*@}*/ /*! \defgroup stdcpp C++ standard library classes * @{ */ /*! \namespace std * \brief The namespace of the C++ standard library (libstdc++). */ /*! \class std::map * \brief See http://www.sgi.com/tech/stl/Map.html (SGI's STL documentation) */ /*! \class std::vector * \brief See http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/classstd_1_1valarray.html (gcc's libstdc++ documentation) */ /*! \class std::vector * \brief See http://www.sgi.com/tech/stl/Vector.html (SGI's STL documentation) */ /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/0000775000175000017500000000000013315356572013333 500000000000000stimfit-0.15.8/src/stimfit/gui/dlgs/0000775000175000017500000000000013315356572014264 500000000000000stimfit-0.15.8/src/stimfit/gui/dlgs/eventdlg.h0000775000175000017500000000654013062445067016172 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file eventdlg.h * \author Christoph Schmidt-Hieber * \date 2008-01-18 * \brief Declares wxStfEventDlg. */ #ifndef _EVENTDLG_H #define _EVENTDLG_H /*! \addtogroup wxstf * @{ */ #include class SectionPointer; //! Dialog for event-detection settings. class wxStfEventDlg : public wxDialog { DECLARE_EVENT_TABLE() private: double m_threshold; stf::extraction_mode m_mode; bool isExtract; int m_minDistance; int m_template; wxStdDialogButtonSizer* m_sdbSizer; wxTextCtrl *m_textCtrlThr, *m_textCtrlDist; wxRadioBox* m_radioBox; wxComboBox* m_comboBoxTemplates; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param templateSections A vector of pointers to sections that contain fits * which might be used as a template. * \param isExtract true if events are to be detected for later extraction * (rather than just plotting the detection criterion or * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfEventDlg( wxWindow* parent, const std::vector& templateSections, bool isExtract, int id = wxID_ANY, wxString title = wxT("Event detection settings"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Get the event detection threshold. /*! \return The event detection threshold. */ double GetThreshold() const {return m_threshold;} //! Indicates the selected extraction algorithm /*! \return The extraction algorithm. */ stf::extraction_mode GetMode() const {return m_mode;} //! Get the minimal distance between events. /*! \return The minimal distance between events in units of sampling points. */ int GetMinDistance() const {return m_minDistance;} //! Get the selected template. /*! \return The index of the template fit to be used for event detection. */ int GetTemplate() const {return m_template;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; /* @} */ #endif stimfit-0.15.8/src/stimfit/gui/dlgs/convertdlg.h0000664000175000017500000000635613062445067016533 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file convertdlg.h * \author Christoph Schmidt-Hieber * \date 2015-05-04 * \brief Batch conversion of files */ #ifndef _CONVERTDLG_H #define _CONVERTDLG_H /*! \addtogroup wxstf * @{ */ #include #include #include #include "./../../stf.h" //! Dialog for batch conversion of files.from cfs to atf. class wxStfConvertDlg : public wxDialog { DECLARE_EVENT_TABLE() private: wxGenericDirCtrl *mySrcDirCtrl, *myDestDirCtrl; wxString srcDir,destDir; wxString srcFilter; wxCheckBox* myCheckBoxSubdirs; stfio::filetype srcFilterExt, destFilterExt; wxArrayString srcFileNames; bool ReadPath(const wxString& path); void OnComboBoxSrcExt(wxCommandEvent& event); void OnComboBoxDestExt(wxCommandEvent& event); //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfConvertDlg( wxWindow* parent, int id = wxID_ANY, wxString title = wxT("Convert file series"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Get the source directory. /*! \return The source directory. */ wxString GetSrcDir() const {return srcDir;} //! Get the destination directory. /*! \return The destination directory. */ wxString GetDestDir() const {return destDir;} //! Get the source extension filter. /*! \return The source extension filter. */ wxString GetSrcFilter() const {return srcFilter;} //! Get the source extension as stfio::filetype. /*! \return The source extension as stfio::filetype. */ stfio::filetype GetSrcFileExt() const {return srcFilterExt;} //! Get the destination extension as stfio::filetype. /*! \return The destination extension as stfio::filetype. */ stfio::filetype GetDestFileExt() const {return destFilterExt;} //! Get the list of file names. /*! \return A vector with source file names. */ wxArrayString GetSrcFileNames() const {return srcFileNames;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; /* @} */ #endif stimfit-0.15.8/src/stimfit/gui/dlgs/cursorsdlg.cpp0000775000175000017500000024103013062445067017077 00000000000000#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "./../app.h" #include "./cursorsdlg.h" #include "./../doc.h" enum { wxLOADCRS, wxSAVECRS, wxCOMBOUM, wxCOMBOU1P, wxCOMBOU2P, wxCOMBOU1B, wxCOMBOU2B, wxCOMBOU1D, wxCOMBOU2D, wxCOMBOU1L, wxCOMBOU2L, #ifdef WITH_PSLOPE wxCOMBOU1PS, wxCOMBOU2PS, #endif wxTEXTM, wxTEXT1P, wxTEXT2P, wxTEXT1B, wxTEXT2B, wxTEXT1D, wxTEXT2D, wxTEXT1L, wxTEXT2L, #ifdef WITH_PSLOPE wxTEXT1PS, wxTEXT2PS, wxTEXT_PSDELTAT, #endif wxTEXTPM, wxRADIOALL, wxRADIOMEAN, wxRADIO_BASELINE_METHOD, // 0: mean + s.d.; 1: median + iqr wxRADIO_LAT_MAXSLOPE1, wxRADIO_LAT_HALFWIDTH1, wxRADIO_LAT_PEAK1, wxRADIO_LAT_MANUAL1, wxRADIO_LAT_EVENT2, wxRADIO_LAT_MAXSLOPE2, wxRADIO_LAT_HALFWIDTH2, wxRADIO_LAT_PEAK2, wxRADIO_LAT_MANUAL2, #ifdef WITH_PSLOPE // Slope radio boxes wxRADIO_PSManBeg, wxRADIO_PSEventBeg, wxRADIO_PSThrBeg, wxRADIO_PSt50Beg, wxRADIO_PSManEnd, wxRADIO_PSt50End, wxRADIO_PSDeltaT, wxRADIO_PSPeakEnd, #endif //WITH_PSLOPE wxMEASCURSOR, wxPEAKATEND, wxPEAKMEAN, wxDIRECTION, wxSLOPE, wxSLOPEUNITS, wxREFERENCE, wxSTARTFITATPEAK, //wxID_STARTFITATPEAK, wxRT_LABEL, wxRT_SLIDER, wxIDNOTEBOOK }; BEGIN_EVENT_TABLE( wxStfCursorsDlg, wxDialog ) EVT_NOTEBOOK_PAGE_CHANGED(wxIDNOTEBOOK, wxStfCursorsDlg::OnPageChanged) EVT_COMBOBOX( wxCOMBOUM, wxStfCursorsDlg::OnComboBoxUM ) EVT_COMBOBOX( wxCOMBOU1P, wxStfCursorsDlg::OnComboBoxU1P ) EVT_COMBOBOX( wxCOMBOU2P, wxStfCursorsDlg::OnComboBoxU2P ) EVT_COMBOBOX( wxCOMBOU1B, wxStfCursorsDlg::OnComboBoxU1B ) EVT_COMBOBOX( wxCOMBOU2B, wxStfCursorsDlg::OnComboBoxU2B ) EVT_COMBOBOX( wxCOMBOU1D, wxStfCursorsDlg::OnComboBoxU1D ) EVT_COMBOBOX( wxCOMBOU2D, wxStfCursorsDlg::OnComboBoxU2D ) EVT_COMBOBOX( wxCOMBOU1L, wxStfCursorsDlg::OnComboBoxU1L ) EVT_COMBOBOX( wxCOMBOU2L, wxStfCursorsDlg::OnComboBoxU2L ) #ifdef WITH_PSLOPE EVT_COMBOBOX( wxCOMBOU1PS, wxStfCursorsDlg::OnComboBoxU1PS ) EVT_COMBOBOX( wxCOMBOU2PS, wxStfCursorsDlg::OnComboBoxU2PS ) #endif EVT_BUTTON( wxID_APPLY, wxStfCursorsDlg::OnPeakcalcexec ) EVT_BUTTON( wxID_OPEN, wxStfCursorsDlg::OnLoadCursorConf ) EVT_BUTTON( wxID_SAVE, wxStfCursorsDlg::OnSaveCursorConf ) // bindings radio buttons EVT_RADIOBUTTON( wxRADIOALL, wxStfCursorsDlg::OnRadioAll ) EVT_RADIOBUTTON( wxRADIOMEAN, wxStfCursorsDlg::OnRadioMean ) EVT_RADIOBUTTON( wxRADIO_LAT_MANUAL1, wxStfCursorsDlg::OnRadioLatManualBeg ) EVT_RADIOBUTTON( wxRADIO_LAT_MAXSLOPE1, wxStfCursorsDlg::OnRadioLatNonManualBeg ) EVT_RADIOBUTTON( wxRADIO_LAT_HALFWIDTH1, wxStfCursorsDlg::OnRadioLatNonManualBeg ) EVT_RADIOBUTTON( wxRADIO_LAT_PEAK1, wxStfCursorsDlg::OnRadioLatNonManualBeg ) EVT_RADIOBUTTON( wxRADIO_LAT_MANUAL2, wxStfCursorsDlg::OnRadioLatManualEnd ) EVT_RADIOBUTTON( wxRADIO_LAT_HALFWIDTH2, wxStfCursorsDlg::OnRadioLatNonManualEnd ) EVT_RADIOBUTTON( wxRADIO_LAT_PEAK2, wxStfCursorsDlg::OnRadioLatNonManualEnd ) EVT_RADIOBUTTON( wxRADIO_LAT_MAXSLOPE2, wxStfCursorsDlg::OnRadioLatNonManualEnd ) EVT_RADIOBUTTON( wxRADIO_LAT_EVENT2, wxStfCursorsDlg::OnRadioLatNonManualEnd ) EVT_COMMAND_SCROLL( wxRT_SLIDER, wxStfCursorsDlg::OnRTSlider ) EVT_CHECKBOX (wxPEAKATEND, wxStfCursorsDlg::OnPeakAtEnd ) EVT_CHECKBOX (wxSTARTFITATPEAK, wxStfCursorsDlg::OnStartFitAtPeak ) #ifdef WITH_PSLOPE EVT_RADIOBUTTON( wxRADIO_PSManBeg, wxStfCursorsDlg::OnRadioPSManBeg ) EVT_RADIOBUTTON( wxRADIO_PSEventBeg, wxStfCursorsDlg::OnRadioPSEventBeg ) EVT_RADIOBUTTON( wxRADIO_PSThrBeg, wxStfCursorsDlg::OnRadioPSThrBeg ) EVT_RADIOBUTTON( wxRADIO_PSt50Beg, wxStfCursorsDlg::OnRadioPSt50Beg ) EVT_RADIOBUTTON( wxRADIO_PSManEnd, wxStfCursorsDlg::OnRadioPSManEnd ) EVT_RADIOBUTTON( wxRADIO_PSt50End, wxStfCursorsDlg::OnRadioPSt50End ) EVT_RADIOBUTTON( wxRADIO_PSDeltaT, wxStfCursorsDlg::OnRadioPSDeltaT ) EVT_RADIOBUTTON( wxRADIO_PSPeakEnd, wxStfCursorsDlg::OnRadioPSPeakEnd ) #endif END_EVENT_TABLE() wxStfCursorsDlg::wxStfCursorsDlg(wxWindow* parent, wxStfDoc* initDoc, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), cursorMIsTime(true), cursor1PIsTime(true), cursor2PIsTime(true), cursor1BIsTime(true), cursor2BIsTime(true), cursor1DIsTime(true), cursor2DIsTime(true), #ifdef WITH_PSLOPE cursor1PSIsTime(true), cursor2PSIsTime(true), #endif cursor1LIsTime(true), cursor2LIsTime(true), actDoc(initDoc) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); m_notebook = new wxNotebook( this, wxIDNOTEBOOK, wxDefaultPosition, wxDefaultSize, 0 ); m_notebook->AddPage( CreateMeasurePage(), wxT("Measure")); m_notebook->AddPage( CreatePeakPage(), wxT("Peak")); m_notebook->AddPage( CreateBasePage(), wxT("Base")); m_notebook->AddPage( CreateDecayPage(), wxT("Decay")); m_notebook->AddPage( CreateLatencyPage(), wxT("Latency")); #ifdef WITH_PSLOPE m_notebook->AddPage( CreatePSlopePage(), wxT("PSlope")); #endif topSizer->Add( m_notebook, 1, wxEXPAND | wxALL, 5 ); wxButton* bClose = new wxButton( this, wxID_CANCEL, wxT("Close") ); wxButton* bApply = new wxButton( this, wxID_APPLY, wxT("Apply") ); wxButton* bLoad = new wxButton( this, wxID_OPEN, wxT("Load") ); wxButton* bSave = new wxButton( this, wxID_SAVE, wxT("Save") ); wxBoxSizer* pSdbSizer = new wxBoxSizer(wxHORIZONTAL); pSdbSizer->Add( bClose, 0, wxALL, 1); pSdbSizer->Add( bApply, 0, wxALL, 1); pSdbSizer->Add( bLoad, 0, wxALL, 1); pSdbSizer->Add( bSave, 0, wxALL, 1); //pSdbSizer->Realize(); topSizer->Add( pSdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); if (actDoc!=NULL) { try { UpdateCursors(); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal )); } } } bool wxStfCursorsDlg::TransferDataFromWindow() { // Apply settings before closing dialog: wxCommandEvent unusedEvent; return wxWindow::TransferDataFromWindow(); } void wxStfCursorsDlg::EndModal(int retCode) { wxCommandEvent unusedEvent; // similar to overriding OnOK in MFC (I hope...) switch (retCode) { case wxID_OK: if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } OnPeakcalcexec(unusedEvent); break; case wxID_CANCEL: break; default: ; } wxDialog::EndModal(retCode); } bool wxStfCursorsDlg::IsCSRSyntax( wxFileConfig* csr_file) { wxString msg = wxT("Syntax Error: "); // Check groups wxString CSR_Group[] = { wxT("__CSR_HEADER__"), wxT("__MEASURE__"), wxT("__PEAK__"), wxT("__BASE__"), wxT("__DECAY__"), wxT("__LATENCY__") }; unsigned int nGroups = sizeof(CSR_Group)/sizeof(wxString); for (std::vector::size_type i=0; iHasGroup(CSR_Group[i])) { wxGetApp().ErrorMsg( msg + CSR_Group[i] + wxT(" not found !") ); return false; } } // check entry in every group // Other checkings... number of Groups if (nGroups != csr_file->GetNumberOfGroups()) { wxGetApp().ErrorMsg( wxT("Unexpected number of groups") ); return false; } return true; } bool wxStfCursorsDlg::OnOK() { //wxCommandEvent unusedEvent; //OnPeakcalcexec(unusedEvent); return true; } wxNotebookPage* wxStfCursorsDlg::CreateMeasurePage() { wxPanel* nbPage; nbPage=new wxPanel(m_notebook); wxBoxSizer* pageSizer; pageSizer=new wxBoxSizer(wxVERTICAL); pageSizer->Add( CreateCursorInput( nbPage, wxTEXTM, -1, wxCOMBOUM, -1, 1, 10 ), 0, wxALIGN_CENTER | wxALL, 2 ); wxCheckBox* pMeasCursor=new wxCheckBox( nbPage, wxMEASCURSOR, wxT("Show vertical ruler through cursor"), wxDefaultPosition, wxDefaultSize, 0 ); pageSizer->Add( pMeasCursor, 0, wxALIGN_CENTER | wxALL, 2); pageSizer->SetSizeHints( nbPage ); nbPage->SetSizer( pageSizer ); nbPage->Layout(); return nbPage; } wxNotebookPage* wxStfCursorsDlg::CreatePeakPage() { wxPanel* nbPage; nbPage=new wxPanel(m_notebook); wxBoxSizer* pageSizer; pageSizer=new wxBoxSizer(wxVERTICAL); pageSizer->Add( CreateCursorInput( nbPage, wxTEXT1P, wxTEXT2P, wxCOMBOU1P, wxCOMBOU2P, 1, 10 ), 0, wxALIGN_CENTER | wxALL, 2 ); wxCheckBox* pPeakAtEnd=new wxCheckBox( nbPage, wxPEAKATEND, wxT("Peak window ends at end of trace"), wxDefaultPosition, wxDefaultSize, 0 ); pPeakAtEnd->SetValue(false); pageSizer->Add( pPeakAtEnd, 0, wxALIGN_CENTER | wxALL, 2); wxFlexGridSizer* peakSettingsGrid; peakSettingsGrid=new wxFlexGridSizer(1,2,0,0); // rows, cols // START: Number of points for peak calculation: wxFlexGridSizer* CommonGrid; CommonGrid = new wxFlexGridSizer(1,2,0,0); wxFlexGridSizer* LeftGrid; LeftGrid = new wxFlexGridSizer(1,0,0); wxStaticBoxSizer* peakPointsSizer = new wxStaticBoxSizer( wxVERTICAL, nbPage, wxT("Number of points for peak") ); wxRadioButton* pAllPoints = new wxRadioButton( nbPage, wxRADIOALL, wxT("All points within peak window"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); wxRadioButton* pMeanPoints = new wxRadioButton( nbPage, wxRADIOMEAN, wxT("User-defined:"), wxDefaultPosition, wxDefaultSize ); wxFlexGridSizer* usrdefGrid; usrdefGrid = new wxFlexGridSizer(1,2,0,0); usrdefGrid->Add(pMeanPoints, 0, wxALIGN_RIGHT |wxALIGN_CENTER_VERTICAL | wxALL, 2); wxTextCtrl* textMeanPoints=new wxTextCtrl( nbPage, wxTEXTPM, wxT("1"), wxDefaultPosition, wxSize(44,20), wxTE_RIGHT ); usrdefGrid->Add(textMeanPoints, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 2); peakPointsSizer->Add( pAllPoints, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2 ); peakPointsSizer->Add( usrdefGrid, 0, wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 2 ); peakSettingsGrid->Add( peakPointsSizer, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2 ); LeftGrid->Add(peakSettingsGrid, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2); /** Rise time slider **/ wxFlexGridSizer* RTGrid; RTGrid = new wxFlexGridSizer(1,2,0,0); wxStaticText* pRTLabel = new wxStaticText( nbPage, wxRT_LABEL, wxT("Rise time 20-80%"), wxDefaultPosition, wxDefaultSize, wxTE_LEFT ); wxSlider *RTSlider = new wxSlider( nbPage, wxRT_SLIDER, 20, 5, 45, wxDefaultPosition, wxSize(100, wxDefaultCoord), wxSL_HORIZONTAL | wxSL_AUTOTICKS, wxDefaultValidator, wxT("")); #if (wxCHECK_VERSION(2, 9, 0)) RTSlider->SetTickFreq(5); #else RTSlider->SetTickFreq(5,1); #endif RTGrid->Add(pRTLabel, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); RTGrid->Add(RTSlider, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); LeftGrid->Add(RTGrid, 1, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL | wxALL, 2); CommonGrid->Add(LeftGrid, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2); // END: Number of points for peak calculation: // START: Peak direction wxFlexGridSizer* RigthGrid; RigthGrid = new wxFlexGridSizer(1,0,0); wxString directionChoices[] = { wxT("Up"), wxT("Down"), wxT("Both") }; int directionNChoices = sizeof( directionChoices ) / sizeof( wxString ); wxRadioBox* pDirection = new wxRadioBox( nbPage, wxDIRECTION, wxT("Peak direction"), wxDefaultPosition, wxDefaultSize, directionNChoices, directionChoices, 0, wxRA_SPECIFY_ROWS ); pDirection->SetSelection(1); //peakSettingsGrid->Add( pDirection, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2 ); RigthGrid->Add( pDirection, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2 ); CommonGrid->Add(RigthGrid, 0, wxALIGN_RIGHT | wxALIGN_TOP | wxALL, 2); pageSizer->Add(CommonGrid, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2); //pageSizer->Add(peakSettingsGrid, 0, wxALIGN_CENTER | wxALL, 2); // END: Peak direction wxFlexGridSizer* slopeSettingsGrid = new wxFlexGridSizer(1,2,0,0); // Threshold slope wxStaticBoxSizer* slopeSizer = new wxStaticBoxSizer( wxVERTICAL, nbPage, wxT("Threshold slope ") ); wxFlexGridSizer* slopeGrid = new wxFlexGridSizer(1,2,0,0); // user entry wxTextCtrl* pSlope=new wxTextCtrl( nbPage, wxSLOPE, wxT(""), wxDefaultPosition, wxSize(64,20), wxTE_RIGHT ); slopeGrid->Add( pSlope, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Units wxStaticText* pSlopeUnits=new wxStaticText( nbPage, wxSLOPEUNITS, wxT(" "), wxDefaultPosition, wxDefaultSize, wxTE_LEFT ); slopeGrid->Add( pSlopeUnits, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); slopeSizer->Add( slopeGrid, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); slopeSettingsGrid->Add( slopeSizer, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // START: Measure peak kinetics wxString referenceChoices[] = { wxT("From baseline"), wxT("From threshold") }; int referenceNChoices = sizeof( referenceChoices ) / sizeof( wxString ); wxRadioBox* pReference = new wxRadioBox( nbPage, wxREFERENCE, wxT("Measure peak kinetics "), wxDefaultPosition, wxDefaultSize, referenceNChoices, referenceChoices, 0, wxRA_SPECIFY_ROWS ); pReference->SetSelection(0); slopeSettingsGrid->Add( pReference, 0, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); pageSizer->Add( slopeSettingsGrid, 0, wxALIGN_CENTER | wxALL, 2 ); // END: Measure peak kinetics pageSizer->SetSizeHints(nbPage); nbPage->SetSizer( pageSizer ); nbPage->Layout(); return nbPage; } wxNotebookPage* wxStfCursorsDlg::CreateBasePage() { wxPanel* nbPage; nbPage=new wxPanel(m_notebook); wxBoxSizer* pageSizer; pageSizer=new wxBoxSizer(wxVERTICAL); pageSizer->Add( CreateCursorInput( nbPage, wxTEXT1B, wxTEXT2B, wxCOMBOU1B, wxCOMBOU2B, 1, 10 ), 0, wxALIGN_CENTER | wxALL, 2 ); // Grid wxFlexGridSizer* BaseMethodSizer = new wxFlexGridSizer(1, 0, 0); wxString BaselineMethods[] = { wxT("Mean and Standard Deviation (SD)"), wxT("Median and InterQuartil Ratio (IQR)") }; int iBaselineMethods = sizeof(BaselineMethods) / sizeof(wxString); //**** Radio options for baseline methods "mean, or median " **** wxRadioBox* pBaselineMethod = new wxRadioBox( nbPage, wxRADIO_BASELINE_METHOD, wxT("Method to compute the baseline"), wxDefaultPosition, wxDefaultSize, iBaselineMethods, BaselineMethods, 0, wxRA_SPECIFY_ROWS ); pBaselineMethod->SetSelection(0); BaseMethodSizer->Add(pBaselineMethod, 0, wxALIGN_CENTER | wxALIGN_TOP | wxALL, 2); pageSizer->Add( BaseMethodSizer, 0, wxALIGN_CENTER | wxALL, 2 ); pageSizer->SetSizeHints(nbPage); nbPage->SetSizer( pageSizer ); nbPage->Layout(); return nbPage; } wxNotebookPage* wxStfCursorsDlg::CreateDecayPage() { wxPanel* nbPage; nbPage=new wxPanel(m_notebook); wxBoxSizer* pageSizer; pageSizer=new wxBoxSizer(wxVERTICAL); pageSizer->Add( CreateCursorInput( nbPage, wxTEXT1D, wxTEXT2D, wxCOMBOU1D, wxCOMBOU2D, 1, 10 ), 0, wxALIGN_CENTER | wxALL, 2 ); wxFlexGridSizer* decaySettingsGrid = new wxFlexGridSizer(1,3,0,0); wxCheckBox* pStartFitAtPeak = new wxCheckBox( nbPage, wxSTARTFITATPEAK, wxT("Start fit at peak"), wxDefaultPosition, wxDefaultSize, 0 ); decaySettingsGrid->Add( pStartFitAtPeak, 0, wxALIGN_CENTER | wxALL, 2); pageSizer->Add( decaySettingsGrid, 0, wxALIGN_CENTER | wxALL, 2 ); pageSizer->SetSizeHints(nbPage); nbPage->SetSizer( pageSizer ); nbPage->Layout(); return nbPage; } wxNotebookPage* wxStfCursorsDlg:: CreateLatencyPage(){ wxPanel* nbPage; nbPage = new wxPanel(m_notebook); wxBoxSizer* pageSizer; pageSizer = new wxBoxSizer(wxVERTICAL); pageSizer->Add(CreateCursorInput(nbPage, wxTEXT1L, wxTEXT2L, wxCOMBOU1L, wxCOMBOU2L, 1, 10), 0, wxALIGN_CENTER | wxALL, 2); // Checkbox for using peak window for latency cursors wxStaticText *pUsePeak = new wxStaticText(nbPage, wxID_ANY, wxT("If not manual, latencies are within peak cursors"), wxDefaultPosition, wxDefaultSize, 0); pageSizer->Add(pUsePeak, 0 , wxALIGN_CENTER | wxALL, 2); // Grid wxFlexGridSizer* LatBegEndGrid; LatBegEndGrid = new wxFlexGridSizer(1,2,0,0); // rows, cols //**** Radio options "Measure from" **** wxStaticBoxSizer* LeftBoxSizer = new wxStaticBoxSizer( wxVERTICAL, nbPage, wxT("Reference channel") ); LeftBoxSizer->GetStaticBox()->SetForegroundColour(*wxRED); // Latency from: Manual wxRadioButton* wxRadio_Lat_Manual1 = new wxRadioButton( nbPage, wxRADIO_LAT_MANUAL1, wxT("Manual"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); // Latency from: Peak wxRadioButton* wxRadio_Lat_Peak1 = new wxRadioButton( nbPage, wxRADIO_LAT_PEAK1, wxT("Peak"), wxDefaultPosition, wxDefaultSize); // Latency from: Maximal slope wxRadioButton* wxRadio_Lat_MaxSlope1 = new wxRadioButton( nbPage, wxRADIO_LAT_MAXSLOPE1, wxT("Maximal slope"), wxDefaultPosition, wxDefaultSize ); // Latency from: Half-maximal amplitude wxRadioButton* wxRadio_Lat_HalfWidth1 = new wxRadioButton( nbPage, wxRADIO_LAT_HALFWIDTH1, wxT("Half-width (t50)"), wxDefaultPosition, wxDefaultSize ); // Sizer to group the radio options LeftBoxSizer->Add( wxRadio_Lat_Manual1, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); LeftBoxSizer->Add( wxRadio_Lat_Peak1, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); LeftBoxSizer->Add( wxRadio_Lat_MaxSlope1, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); LeftBoxSizer->Add( wxRadio_Lat_HalfWidth1, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); // Add to LatBegEndGrid LatBegEndGrid->Add(LeftBoxSizer, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2); //**** Radio options "Latency to" **** wxStaticBoxSizer* RightBoxSizer = new wxStaticBoxSizer( wxVERTICAL, nbPage, wxT("To active channel") ); // Latency to: Manual wxRadioButton* wxRadio_Lat_Manual2 = new wxRadioButton( nbPage, wxRADIO_LAT_MANUAL2, wxT("Manual"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); //wxRadio_Lat_Manual2->SetValue(true); // Latency to: Peak wxRadioButton* wxRadio_Lat_Peak2 = new wxRadioButton( nbPage, wxRADIO_LAT_PEAK2, wxT("Peak"), wxDefaultPosition, wxDefaultSize); // Latency to: Half-maximal amplitude wxRadioButton* wxRadio_Lat_HalfWidth2 = new wxRadioButton( nbPage, wxRADIO_LAT_HALFWIDTH2, wxT("Half-width (t50)"), wxDefaultPosition, wxDefaultSize); // Latency to: Maximal slope wxRadioButton* wxRadio_Lat_MaxSlope2 = new wxRadioButton( nbPage, wxRADIO_LAT_MAXSLOPE2, wxT("Maximal slope"), wxDefaultPosition, wxDefaultSize); // Latency to: Beginning of event wxRadioButton* wxRadio_Lat_Event2 = new wxRadioButton( nbPage, wxRADIO_LAT_EVENT2, wxT("Beginning of event"), wxDefaultPosition, wxDefaultSize ); // Sizer to group the radio options RightBoxSizer->Add( wxRadio_Lat_Manual2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); RightBoxSizer->Add( wxRadio_Lat_Peak2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); RightBoxSizer->Add( wxRadio_Lat_MaxSlope2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); RightBoxSizer->Add( wxRadio_Lat_HalfWidth2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); RightBoxSizer->Add( wxRadio_Lat_Event2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); // Add to LatBegEndGrid LatBegEndGrid->Add(RightBoxSizer, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2); pageSizer->Add(LatBegEndGrid, 0, wxALIGN_CENTER | wxALL, 2); nbPage->SetSizer(pageSizer); nbPage->Layout(); return nbPage; } #ifdef WITH_PSLOPE wxNotebookPage* wxStfCursorsDlg::CreatePSlopePage() { wxPanel* nbPage; nbPage=new wxPanel(m_notebook); // Sizer wxBoxSizer* pageSizer; pageSizer=new wxBoxSizer(wxVERTICAL); pageSizer->Add( CreateCursorInput( nbPage, wxTEXT1PS, wxTEXT2PS, wxCOMBOU1PS, wxCOMBOU2PS, 1, 10 ), 0, wxALIGN_CENTER | wxALL, 2 ); // Grid wxFlexGridSizer* PSBegEndGrid; PSBegEndGrid = new wxFlexGridSizer(1,2,0,0); // rows, cols //**** Radio options "Slope from" **** wxStaticBoxSizer* LeftBoxSizer = new wxStaticBoxSizer( wxVERTICAL, nbPage, wxT("Slope from") ); // Slope from: Manual wxRadioButton* pPSManBeg = new wxRadioButton( nbPage, wxRADIO_PSManBeg, wxT("Manual"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); //pPSManBeg->SetValue(true); // Slope from: Beginning of event wxRadioButton* pPSEventBeg = new wxRadioButton( nbPage, wxRADIO_PSEventBeg, wxT("Beginning of event"), wxDefaultPosition, wxDefaultSize ); // Slope from: Threshold slope wxFlexGridSizer* thrGrid; thrGrid = new wxFlexGridSizer(1,2,0,0); wxRadioButton* pPSThrBeg = new wxRadioButton( nbPage, wxRADIO_PSThrBeg, wxT("Threshold"), wxDefaultPosition, wxDefaultSize); thrGrid->Add(pPSThrBeg, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 2); // Slope from: t50 wxRadioButton* pPSt50Beg = new wxRadioButton( nbPage, wxRADIO_PSt50Beg, wxT("Half-width (t50)"), wxDefaultPosition, wxDefaultSize); // activate radio buttons according to the PSlope mode of the active document wxTextCtrl* pCursor1PS = (wxTextCtrl*)FindWindow(wxTEXT1PS); if ( pCursor1PS == NULL ){ wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::CreatePSlopePage()")); } switch( actDoc->GetPSlopeBegMode()){ case 1: pPSEventBeg->SetValue(true); pCursor1PS->Enable(false); break; case 2: pPSThrBeg->SetValue(true); pCursor1PS->Enable(false); break; case 3: pPSt50Beg->SetValue(true); pCursor1PS->Enable(false); break; case 0: default: pPSManBeg->SetValue(true); pCursor1PS->Enable(true); } // Sizer to group the radio options LeftBoxSizer->Add( pPSManBeg, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); LeftBoxSizer->Add( pPSEventBeg, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); LeftBoxSizer->Add( thrGrid, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); LeftBoxSizer->Add( pPSt50Beg, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); // Add to PSBegEndGrid PSBegEndGrid->Add(LeftBoxSizer, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2); //**** Radio options "Slope to" **** wxStaticBoxSizer* RightBoxSizer = new wxStaticBoxSizer( wxVERTICAL, nbPage, wxT("Slope to") ); // Slope to: Manual wxRadioButton* pPSManEnd = new wxRadioButton( nbPage, wxRADIO_PSManEnd, wxT("Manual"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); // Slope to: Half-width wxRadioButton* pPSt50End = new wxRadioButton( nbPage, wxRADIO_PSt50End, wxT("Half-width (t50)"), wxDefaultPosition, wxDefaultSize); // Slope to: DeltaT wxFlexGridSizer* DeltaTGrid; DeltaTGrid = new wxFlexGridSizer(1,2,0,0); wxRadioButton* pPSDeltaT = new wxRadioButton( nbPage, wxRADIO_PSDeltaT, wxT("Delta t"), wxDefaultPosition, wxDefaultSize); DeltaTGrid->Add(pPSDeltaT, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 2); wxTextCtrl* pTextPSDeltaT = new wxTextCtrl(nbPage, wxTEXT_PSDELTAT, wxT(""), wxDefaultPosition, wxSize(44,20), wxTE_RIGHT); pTextPSDeltaT->Enable(false); DeltaTGrid->Add(pTextPSDeltaT, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxALL, 2); // Slope to: Peak wxRadioButton* pPSPeakEnd = new wxRadioButton( nbPage, wxRADIO_PSPeakEnd, wxT("Peak"), wxDefaultPosition, wxDefaultSize); // activate radio buttons according to the PSlope mode of the active document wxTextCtrl* pCursor2PS = (wxTextCtrl*)FindWindow(wxTEXT2PS); if (pCursor2PS == NULL){ wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::CreatePSlopePage()")); } switch( actDoc->GetPSlopeEndMode()){ case 1: pPSt50End->SetValue(true); pCursor2PS->Enable(false); break; case 2: pPSDeltaT->SetValue(true); pTextPSDeltaT->Enable(true); pCursor2PS->Enable(false); break; case 3: pPSPeakEnd->SetValue(true); pCursor2PS->Enable(false); break; case 0: default: pPSManEnd->SetValue(true); pCursor2PS->Enable(true); } // Sizer to group the radio options RightBoxSizer->Add( pPSManEnd, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); RightBoxSizer->Add( pPSt50End, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); RightBoxSizer->Add( DeltaTGrid, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); RightBoxSizer->Add( pPSPeakEnd, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); // Add to PSBegEndGrid PSBegEndGrid->Add(RightBoxSizer, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2); pageSizer->Add(PSBegEndGrid, 0, wxALIGN_CENTER | wxALL, 2); nbPage->SetSizer(pageSizer); nbPage->Layout(); return nbPage; } #endif // WITH_PSLOPE wxFlexGridSizer* wxStfCursorsDlg::CreateCursorInput( wxPanel* nbPage, wxWindowID textC1id, wxWindowID textC2id, wxWindowID comboU1id, wxWindowID comboU2id, std::size_t c1, std::size_t c2 ) { wxFlexGridSizer* cursorGrid=new wxFlexGridSizer(2,3,0,0); // Cursor 1: // Description wxStaticText *Cursor1; Cursor1 = new wxStaticText( nbPage, wxID_ANY, wxT("First cursor:"), wxDefaultPosition, wxDefaultSize, wxTE_LEFT ); cursorGrid->Add( Cursor1, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // user entry wxString strc1,strc2; strc1 << (int)c1; wxTextCtrl* textC1 = new wxTextCtrl( nbPage, textC1id, strc1, wxDefaultPosition, wxSize(64,20), wxTE_RIGHT ); cursorGrid->Add( textC1, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // units #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) wxString szUnits[] = { actDoc->GetXUnits(), wxT("pts") }; int szUnitsSize = sizeof( szUnits ) / sizeof( wxString ); wxComboBox* comboU1 = new wxComboBox( nbPage, comboU1id, actDoc->GetXUnits(), wxDefaultPosition, #else wxString szUnits[] = { wxString(actDoc->GetXUnits().c_str(), wxConvUTF8), wxT("pts") }; int szUnitsSize = sizeof( szUnits ) / sizeof( wxString ); wxComboBox* comboU1 = new wxComboBox( nbPage, comboU1id, wxString(actDoc->GetXUnits().c_str(), wxConvUTF8), wxDefaultPosition, #endif wxSize(64,20), szUnitsSize, szUnits, wxCB_DROPDOWN | wxCB_READONLY ); cursorGrid->Add( comboU1, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Cursor 2: if (textC2id >= 0) { wxStaticText *Cursor2; // Description Cursor2 = new wxStaticText( nbPage, wxID_ANY, wxT("Second cursor:"), wxDefaultPosition, wxDefaultSize, wxTE_LEFT ); cursorGrid->Add( Cursor2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // user entry strc2 << (int)c2; wxTextCtrl* textC2 = new wxTextCtrl( nbPage, textC2id, strc2, wxDefaultPosition, wxSize(64,20), wxTE_RIGHT ); cursorGrid->Add( textC2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // units #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) wxComboBox* comboU2 = new wxComboBox( nbPage, comboU2id, actDoc->GetXUnits(), wxDefaultPosition, #else wxComboBox* comboU2 = new wxComboBox( nbPage, comboU2id, wxString(actDoc->GetXUnits().c_str(), wxConvUTF8), wxDefaultPosition, #endif wxSize(64,20), szUnitsSize, szUnits, wxCB_DROPDOWN | wxCB_READONLY ); cursorGrid->Add( comboU2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); } return cursorGrid; } void wxStfCursorsDlg::OnPeakcalcexec( wxCommandEvent& event ) { event.Skip(); // Update the results table (see wxStfApp in app.cpp) wxGetApp().OnPeakcalcexecMsg(actDoc); } bool wxStfCursorsDlg::LoadCursorConf(const wxString& filepath ){ // When loading the configuration we'll write directly in the active document // loading a cursor file will also update measurements, cursors, the graph and result table. // It will write the registry as well, since it is similar to pressing "Apply". // see wxStfApp::OnPeakcalcexeMsg() for details. if (actDoc == NULL) { wxGetApp().ErrorMsg(wxT("No active document found")); return false; } wxFileConfig* csr_config = new wxFileConfig(wxT(""), wxT(""), filepath ); // minimal syntax check if ( !IsCSRSyntax( csr_config ) ) { return false; } wxString CursorValue; long start_csr, end_csr; // *** update controls in __MEASURE__ tab **** csr_config->Read( wxT("__MEASURE__/Cursor"), &start_csr ); // read from file wxTextCtrl *pMeasureCursor = (wxTextCtrl*)FindWindow(wxTEXTM); if (pMeasureCursor == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::LoadCursorConf()")); return false; } if (cursorMIsTime) { float fvalue = start_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), start_csr ); pMeasureCursor->SetValue( CursorValue ); actDoc->SetMeasCursor( GetCursorM() ); int show_ruler; csr_config->Read( wxT("__MEASURE__/ShowRuler"), &show_ruler ); // read from file SetRuler( show_ruler ); actDoc->SetMeasRuler( show_ruler ); // **** update controls in __PEAK__ tab **** csr_config->Read( wxT("__PEAK__/LeftCursor"), &start_csr ); // read from file csr_config->Read( wxT("__PEAK__/RightCursor"), &end_csr ); // read from file wxTextCtrl *pPeak1Cursor = (wxTextCtrl*)FindWindow(wxTEXT1P); wxTextCtrl *pPeak2Cursor = (wxTextCtrl*)FindWindow(wxTEXT2P); if (pPeak1Cursor == NULL || pPeak2Cursor == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::LoadCursorConf()")); return false; } if (cursor1PIsTime) { float fvalue = start_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), start_csr ); pPeak1Cursor->SetValue( CursorValue ); actDoc->SetPeakBeg( GetCursor1P() ); if (cursor2PIsTime) { float fvalue = end_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), end_csr ); pPeak2Cursor->SetValue( CursorValue ); actDoc->SetPeakEnd( GetCursor2P() ); bool is_end; csr_config->Read( wxT("__PEAK__/PeakAtEnd"), &is_end ); // read from file SetPeakAtEnd( is_end ); actDoc->SetPeakAtEnd( is_end ); int npoints; csr_config->Read( wxT("__PEAK__/NumberOfPoints"), &npoints ); // read from file SetPeakPoints( npoints); actDoc->SetPM( npoints ); int direction; csr_config->Read( wxT("__PEAK__/Direction"), &direction ); // read from file stfnum::direction mydirection; switch (direction) { case 0: mydirection = stfnum::up; break; case 1: mydirection = stfnum::down; break; case 2: mydirection = stfnum::both; break; default: mydirection = stfnum::undefined_direction; } SetDirection( mydirection ); actDoc->SetDirection ( mydirection ); bool confbase; csr_config->Read( wxT("__PEAK__/FromBase"), &confbase ); // read from file SetFromBase( confbase ); actDoc->SetFromBase( confbase ); int rt_factor; csr_config->Read( wxT("__PEAK__/RTFactor"), &rt_factor ); // read from file SetRTFactor( rt_factor ); actDoc->SetRTFactor( rt_factor ); double slope; wxString wxSlope; csr_config->Read( wxT("__PEAK__/Slope"), &wxSlope); // read from file wxSlope.ToDouble(&slope); SetSlope( slope ); actDoc->SetSlopeForThreshold( slope ); // **** update controls in __BASE__ tab **** csr_config->Read( wxT("__BASE__/LeftCursor"), &start_csr ); // read from file csr_config->Read( wxT("__BASE__/RightCursor"), &end_csr ); // read from file wxTextCtrl *pBase1Cursor = (wxTextCtrl*)FindWindow(wxTEXT1B); wxTextCtrl *pBase2Cursor = (wxTextCtrl*)FindWindow(wxTEXT2B); if (pBase1Cursor == NULL || pBase2Cursor == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::LoadCursorConf()")); return false; } if (cursor1BIsTime) { float fvalue = start_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), start_csr ); pBase1Cursor->SetValue( CursorValue ); actDoc->SetBaseBeg( GetCursor1B() ); if (cursor2BIsTime) { float fvalue = end_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), end_csr ); pBase2Cursor->SetValue( CursorValue ); actDoc->SetBaseEnd( GetCursor2B() ); int base_method; csr_config->Read( wxT("__BASE__/BaselineMethod"), &base_method ); // read from file stfnum::baseline_method mybase_method; switch( base_method ) { case 0: mybase_method = stfnum::mean_sd; break; case 1: mybase_method = stfnum::median_iqr; break; default: mybase_method = stfnum::mean_sd; } SetBaselineMethod ( mybase_method ); actDoc->SetBaselineMethod( mybase_method ); // **** update controls in __DECAY__ tab **** csr_config->Read( wxT("__DECAY__/LeftCursor"), &start_csr ); // read from file csr_config->Read( wxT("__DECAY__/RightCursor"), &end_csr ); // read from file wxTextCtrl *pFit1Cursor = (wxTextCtrl*)FindWindow(wxTEXT1D); wxTextCtrl *pFit2Cursor = (wxTextCtrl*)FindWindow(wxTEXT2D); if (pBase1Cursor == NULL || pBase2Cursor == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::LoadCursorConf()")); return false; } if (cursor1DIsTime) { float fvalue = start_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), start_csr ); pFit1Cursor->SetValue( CursorValue ); actDoc->SetFitBeg( GetCursor1D() ); if (cursor2DIsTime) { float fvalue = end_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), end_csr ); pFit2Cursor->SetValue( CursorValue ); actDoc->SetFitEnd( GetCursor2D() ); bool is_peak; csr_config->Read(wxT("__DECAY__/StartFitAtPeak"), &is_peak); SetStartFitAtPeak( is_peak); actDoc->SetStartFitAtPeak( is_peak ); // **** update controls in LATENCY tab **** csr_config->Read( wxT("__LATENCY__/LeftCursor"), &start_csr ); // read from file csr_config->Read( wxT("__LATENCY__/RightCursor"), &end_csr ); // read from file wxTextCtrl *pLatency1Cursor = (wxTextCtrl*)FindWindow(wxTEXT1L); wxTextCtrl *pLatency2Cursor = (wxTextCtrl*)FindWindow(wxTEXT2L); if (pLatency1Cursor == NULL || pLatency2Cursor == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::LoadCursorConf()")); return false; } if (cursor1LIsTime) { float fvalue = start_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), start_csr ); pLatency1Cursor->SetValue( CursorValue ); actDoc->SetLatencyBeg( GetCursor1L() ); if (cursor2LIsTime) { float fvalue = end_csr*actDoc->GetXScale() ; CursorValue = wxString::Format( wxT("%f"), fvalue ); } else CursorValue = wxString::Format( wxT("%i"), end_csr ); pLatency2Cursor->SetValue( CursorValue ); actDoc->SetLatencyEnd( GetCursor2L() ); int mode; csr_config->Read( wxT("__LATENCY__/LeftMode"), &mode ); // read from file stf::latency_mode latency_mode; switch( mode ) { case 0: latency_mode =stf::manualMode; break; case 1: latency_mode = stf::peakMode; break; case 2: latency_mode = stf::riseMode; break; case 3: latency_mode = stf::halfMode; break; case 4: latency_mode = stf::footMode; break; default: latency_mode = stf::undefinedMode; } SetLatencyStartMode( latency_mode ); actDoc->SetLatencyStartMode( latency_mode ); csr_config->Read( wxT("__LATENCY__/RightMode"), &mode ); // read from file switch( mode ) { case 0: latency_mode =stf::manualMode; break; case 1: latency_mode = stf::peakMode; break; case 2: latency_mode = stf::riseMode; break; case 3: latency_mode = stf::halfMode; break; case 4: latency_mode = stf::footMode; break; default: latency_mode = stf::undefinedMode; } SetLatencyEndMode( latency_mode ); actDoc->SetLatencyEndMode( latency_mode ); delete csr_config; // we use wxStfApp::OnPeakcalcexec() here basically to update the results table. // Because wxStfApp::OnPeakcalcexec() only updates the properties of wxStfDoc in the current tab // of the cursor dialog, we need to call the methods from actDoc() to update the cursors which // are not currently visible, but stored in the csr file. wxGetApp().OnPeakcalcexecMsg(actDoc); return true; } void wxStfCursorsDlg::OnLoadCursorConf( wxCommandEvent& event ) { event.Skip(); wxString csrFilter = wxT("Cursor conf (*.csr)|*csr"); wxFileDialog* LoadCursorDialog = new wxFileDialog(this, wxT("Load Cursor configuration"), wxT(""), wxT(""), csrFilter, wxFD_OPEN | wxFD_PREVIEW); if (LoadCursorDialog->ShowModal() == wxID_OK ){ wxString mypath = LoadCursorDialog->GetPath(); LoadCursorConf( mypath ); } } bool wxStfCursorsDlg::SaveCursorConf(const wxString& mypath ){ // Read cursor configuration from active document! if (actDoc == NULL){ throw std::runtime_error("No active document found"); return false; } wxDateTime now = wxDateTime::Now(); wxFileConfig* csr_config = new wxFileConfig(wxT(""), wxT(""), mypath ); csr_config->SetPath( wxT("__CSR_HEADER__") ); //csr_config->Write( wxT("Date"), now.Format( wxT("%Y/%M/%d"), wxDateTime::CET) ); csr_config->Write( wxT("Date"), now.Format( wxT("%A, %d %B, %Y"), wxDateTime::CET) ); csr_config->Write( wxT("Time"), now.Format( wxT("%H:%M:%S %p"), wxDateTime::CET) ); csr_config->SetPath( wxT("../__MEASURE__") ); csr_config->Write( wxT("Cursor"), (int)actDoc->GetMeasCursor() ); csr_config->Write( wxT("ShowRuler"), (int)actDoc->GetMeasRuler() ); csr_config->SetPath( wxT("../__PEAK__") ); csr_config->Write( wxT("LeftCursor"), (int)actDoc->GetPeakBeg() ); csr_config->Write( wxT("Rightcursor"), (int)actDoc->GetPeakEnd() ); csr_config->Write( wxT("PeakAtEnd"), (int)actDoc->GetPeakAtEnd() ); csr_config->Write( wxT("NumberOfPoints"), (int)actDoc->GetPM() ); csr_config->Write( wxT("Direction"), (int)actDoc->GetDirection() ); csr_config->Write( wxT("FromBase"), (int)actDoc->GetFromBase() ); csr_config->Write( wxT("RTFactor"), (int)actDoc->GetRTFactor() ); wxString mySlope; mySlope << actDoc->GetSlopeForThreshold(); csr_config->Write( wxT("Slope"), mySlope ); csr_config->SetPath( wxT("../__BASE__") ); csr_config->Write( wxT("LeftCursor"), (int)actDoc->GetBaseBeg() ); csr_config->Write( wxT("RightCursor"),(int)actDoc->GetBaseEnd() ); csr_config->Write( wxT("BaselineMethod"), (int)actDoc->GetBaselineMethod() ); csr_config->SetPath( wxT("../__DECAY__") ); csr_config->Write( wxT("LeftCursor"), (int)actDoc->GetFitBeg() ); csr_config->Write( wxT("RightCursor"),(int)actDoc->GetFitEnd() ); csr_config->Write( wxT("StartFitAtPeak"),(int)actDoc->GetStartFitAtPeak() ); csr_config->SetPath( wxT("../__LATENCY__") ); csr_config->Write( wxT("LeftCursor"), (int)actDoc->GetLatencyBeg() ); csr_config->Write( wxT("RightCursor"),(int)actDoc->GetLatencyEnd() ); csr_config->Write( wxT("LeftMode"),(int)actDoc->GetLatencyStartMode() ); csr_config->Write( wxT("RightMode"),(int)actDoc->GetLatencyEndMode() ); csr_config->Flush(); // write all changes return true; } void wxStfCursorsDlg::OnSaveCursorConf( wxCommandEvent& event ) { event.Skip(); wxString crsFilter = wxT("Cursor conf (*.csr)|*csr"); wxFileDialog* SaveCursorDialog = new wxFileDialog(this, wxT("Save Cursor configuration"), wxT(""), wxT(""), crsFilter, wxFD_SAVE | wxFD_PREVIEW); if (SaveCursorDialog->ShowModal() == wxID_OK ){ wxString mypath = SaveCursorDialog->GetPath(); SaveCursorConf( mypath ); } } int wxStfCursorsDlg::ReadCursor(wxWindowID textId, bool isTime) const { // always returns in units of sampling points, // conversion is necessary if it's in units of time: long cursor; wxString strEdit; wxTextCtrl *pText = (wxTextCtrl*)FindWindow(textId); if (pText == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::ReadCursor()")); return 0; } strEdit << pText->GetValue(); if (isTime) { double fEdit; strEdit.ToDouble( &fEdit ); cursor=stf::round(fEdit/actDoc->GetXScale()); } else { strEdit.ToLong ( &cursor ); } return (int)cursor; } void wxStfCursorsDlg::WriteCursor(wxWindowID textId, bool isTime, long value) const { wxString myvalue; wxTextCtrl *pText = (wxTextCtrl*)FindWindow(textId); if (pText == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::SetCursor()")); return; } if (isTime){ float fvalue = stf::round( value/actDoc->GetXScale() ); myvalue = wxString::Format(wxT("%f"), fvalue); } else { myvalue = wxString::Format(wxT("%i"), value); } pText->SetValue(myvalue); } #ifdef WITH_PSLOPE int wxStfCursorsDlg::ReadDeltaT(wxWindowID textID) const { // returns DeltaT entered in the textBox in units of sampling points long cursorpos=0; wxString strDeltaT; wxTextCtrl *pText = (wxTextCtrl*)FindWindow(textID); if (pText == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::ReadDeltaT()")); return 0; } strDeltaT << pText->GetValue(); double DeltaTval; strDeltaT.ToDouble(&DeltaTval); cursorpos = stf::round(DeltaTval/actDoc->GetXScale()); return (int)cursorpos; } #endif // WITH_PSLOPE int wxStfCursorsDlg::GetCursorM() const { return ReadCursor(wxTEXTM,cursorMIsTime); } int wxStfCursorsDlg::GetCursor1P() const { return ReadCursor(wxTEXT1P,cursor1PIsTime); } int wxStfCursorsDlg::GetCursor2P() const { return ReadCursor(wxTEXT2P,cursor2PIsTime); } int wxStfCursorsDlg::GetCursor1B() const { return ReadCursor(wxTEXT1B,cursor1BIsTime); } int wxStfCursorsDlg::GetCursor2B() const { return ReadCursor(wxTEXT2B,cursor2BIsTime); } int wxStfCursorsDlg::GetCursor1D() const { return ReadCursor(wxTEXT1D,cursor1DIsTime); } int wxStfCursorsDlg::GetCursor2D() const { return ReadCursor(wxTEXT2D,cursor2DIsTime); } int wxStfCursorsDlg::GetCursor1L() const { return ReadCursor(wxTEXT1L, cursor1LIsTime); } int wxStfCursorsDlg::GetCursor2L() const { return ReadCursor(wxTEXT2L, cursor2LIsTime); } #ifdef WITH_PSLOPE int wxStfCursorsDlg::GetCursor1PS() const { return ReadCursor(wxTEXT1PS, cursor1PSIsTime); } int wxStfCursorsDlg::GetCursor2PS() const { return ReadCursor(wxTEXT2PS, cursor2PSIsTime); } #endif int wxStfCursorsDlg::GetPeakPoints() const { wxRadioButton* pRadioButtonAll = (wxRadioButton*)FindWindow(wxRADIOALL); wxRadioButton* pRadioButtonMean = (wxRadioButton*)FindWindow(wxRADIOMEAN); if (pRadioButtonAll==NULL || pRadioButtonMean==NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetPeakPoints()")); return 0; } if (pRadioButtonAll->GetValue()) { return -1; } else { if (pRadioButtonMean->GetValue()) { return ReadCursor(wxTEXTPM,false); } else { wxGetApp().ErrorMsg(wxT("nothing selected in wxStfCursorsDlg::GetPeakPoints()")); return 0; } } } int wxStfCursorsDlg::GetRTFactor() const { wxSlider *pRTSlider = (wxSlider*)FindWindow(wxRT_SLIDER); if (pRTSlider == NULL ) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg:GetRTFactor()")); return -1; } return pRTSlider->GetValue(); } #ifdef WITH_PSLOPE int wxStfCursorsDlg::GetDeltaT() const { return ReadDeltaT(wxTEXT_PSDELTAT); } #endif #ifdef WITH_PSLOPE void wxStfCursorsDlg::SetDeltaT (int DeltaT) { wxRadioButton* pRadPSDeltaT = (wxRadioButton*)FindWindow(wxRADIO_PSDeltaT); wxTextCtrl* pTextPSDeltaT = (wxTextCtrl*)FindWindow(wxTEXT_PSDELTAT); if (pRadPSDeltaT == NULL || pTextPSDeltaT == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::wxSetDeltaT()")); return; } // transform sampling points into x-units double fDeltaT; fDeltaT =DeltaT*actDoc->GetXScale(); wxString strDeltaTval; strDeltaTval << fDeltaT; pTextPSDeltaT->SetValue(strDeltaTval); } #endif // WITH_PSLOPE void wxStfCursorsDlg::SetPeakPoints(int peakPoints) { wxRadioButton* pRadioButtonAll = (wxRadioButton*)FindWindow(wxRADIOALL); wxRadioButton* pRadioButtonMean = (wxRadioButton*)FindWindow(wxRADIOMEAN); wxTextCtrl* pTextPM = (wxTextCtrl*)FindWindow(wxTEXTPM); if (pRadioButtonAll==NULL || pRadioButtonMean==NULL || pTextPM==NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::SetPeakPoints()")); return; } if (peakPoints==0 || peakPoints<-1) { throw std::runtime_error("peak points out of range in wxStfCursorsDlg::SetPeakPoints()"); } else if (peakPoints == -1) { pRadioButtonAll->SetValue(true); pRadioButtonMean->SetValue(false); pTextPM->Enable(false); } else { wxString entry; entry << peakPoints; pRadioButtonAll->SetValue(false); pRadioButtonMean->SetValue(true); pTextPM->Enable(true); pTextPM->SetValue( entry ); } } stfnum::direction wxStfCursorsDlg::GetDirection() const { wxRadioBox* pDirection = (wxRadioBox*)FindWindow(wxDIRECTION); if (pDirection == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetDirection()")); return stfnum::undefined_direction; } switch (pDirection->GetSelection()) { case 0: return stfnum::up; case 1: return stfnum::down; case 2: return stfnum::both; default: return stfnum::undefined_direction; } } void wxStfCursorsDlg::SetDirection(stfnum::direction direction) { wxRadioBox* pDirection = (wxRadioBox*)FindWindow(wxDIRECTION); if (pDirection == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetDirection()")); return; } switch (direction) { case stfnum::up: pDirection->SetSelection(0); break; case stfnum::down: pDirection->SetSelection(1); break; case stfnum::both: case stfnum::undefined_direction: pDirection->SetSelection(2); break; } } bool wxStfCursorsDlg::GetFromBase() const { wxRadioBox* pReference = (wxRadioBox*)FindWindow(wxREFERENCE); if (pReference == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetFromBase()")); return true; } switch (pReference->GetSelection()) { case 0: return true; case 1: return false; default: return true; } } void wxStfCursorsDlg::SetRTFactor(int RTFactor) { wxSlider *pRTSlider = (wxSlider*)FindWindow(wxRT_SLIDER); wxStaticText *pRTLabel = (wxStaticText*)FindWindow(wxRT_LABEL); if (pRTSlider == NULL || pRTLabel == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg:SetRTFactor()")); return; } pRTSlider->SetValue(RTFactor); wxString label(wxT("Rise time ")); label << pRTSlider->GetValue() << wxT("-"); label << 100-pRTSlider->GetValue() << wxT("\%"); pRTLabel->SetLabel(label); } void wxStfCursorsDlg::SetFromBase(bool fromBase) { wxRadioBox* pReference = (wxRadioBox*)FindWindow(wxREFERENCE); if (pReference == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::SetFromBase()")); return; } if (fromBase) { pReference->SetSelection(0); } else { pReference->SetSelection(1); } } enum stfnum::baseline_method wxStfCursorsDlg::GetBaselineMethod() const { wxRadioBox* pBaselineMethod = (wxRadioBox*)FindWindow(wxRADIO_BASELINE_METHOD); if (pBaselineMethod == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetBaseSelection()")); return stfnum::mean_sd; //default value mean and standard deviation } switch( pBaselineMethod->GetSelection() ) { case 0: return stfnum::mean_sd; case 1: return stfnum::median_iqr; default: return stfnum::mean_sd; } } void wxStfCursorsDlg::SetBaselineMethod(stfnum::baseline_method base_method) { wxRadioBox* pBaselineMethod = (wxRadioBox*)FindWindow(wxRADIO_BASELINE_METHOD); if (pBaselineMethod == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::SetBaselineMethod()")); return; } switch(base_method) { case stfnum::median_iqr: pBaselineMethod->SetSelection(1); break; case stfnum::mean_sd: pBaselineMethod->SetSelection(0); break; } } bool wxStfCursorsDlg::GetPeakAtEnd() const { //Check if 'Upper limit at end of trace' is selected wxCheckBox* pPeakAtEnd = (wxCheckBox*)FindWindow(wxPEAKATEND); if (pPeakAtEnd == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetPeakAtEnd()")); return false; } return pPeakAtEnd->IsChecked(); } void wxStfCursorsDlg::OnPeakAtEnd( wxCommandEvent& event) { event.Skip(); wxCheckBox* pPeakAtEnd = (wxCheckBox*)FindWindow(wxPEAKATEND); wxTextCtrl* pCursor2P = (wxTextCtrl*)FindWindow(wxTEXT2P); if (pPeakAtEnd == NULL || pCursor2P == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnPeakAtEnd()")); return; } // second peak cursor is inactive if the peak at the end checkbox is checked pCursor2P->Enable(! pPeakAtEnd->IsChecked() ); } void wxStfCursorsDlg::SetPeakAtEnd( bool is_end ) { wxCheckBox* pPeakAtEnd = (wxCheckBox*)FindWindow(wxPEAKATEND); wxTextCtrl* pCursor2P = (wxTextCtrl*)FindWindow(wxTEXT2P); if (pPeakAtEnd == NULL || pCursor2P == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::SetPeakAtEnd()")); return; } pCursor2P->Enable( ! is_end ); pPeakAtEnd->SetValue( is_end ); } bool wxStfCursorsDlg::GetStartFitAtPeak() const { //Check if 'Start fit at peak' is selected wxCheckBox* pStartFitAtPeak = (wxCheckBox*)FindWindow(wxSTARTFITATPEAK); if (pStartFitAtPeak == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetStartFitAtPeak()")); return false; } return pStartFitAtPeak->IsChecked(); } void wxStfCursorsDlg::SetStartFitAtPeak(bool is_peak){ wxCheckBox* pStartFitAtPeak = (wxCheckBox*)FindWindow(wxSTARTFITATPEAK); wxTextCtrl* pCursor1D = (wxTextCtrl*)FindWindow(wxTEXT1D); if (pStartFitAtPeak == NULL || pCursor1D == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetStartFitAtPeak()")); return; } pCursor1D->Enable( ! is_peak ); pStartFitAtPeak->SetValue( is_peak); } void wxStfCursorsDlg::OnStartFitAtPeak( wxCommandEvent& event) { event.Skip(); wxCheckBox* pStartFitAtPeak = (wxCheckBox*)FindWindow(wxSTARTFITATPEAK); wxTextCtrl* pCursor1D = (wxTextCtrl*)FindWindow(wxTEXT1D); if (pStartFitAtPeak == NULL || pCursor1D == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnStartFitAtEnd()")); return; } // left decay cursor is inactive if the start fit at peak is checked pCursor1D->Enable(! pStartFitAtPeak->IsChecked() ); } void wxStfCursorsDlg::OnPageChanged(wxNotebookEvent& event) { event.Skip(); if (actDoc!=NULL) { try { UpdateCursors(); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal )); } } } void wxStfCursorsDlg::OnComboBoxUM( wxCommandEvent& event ) { event.Skip(); UpdateUnits(wxCOMBOUM,cursorMIsTime,wxTEXTM); } void wxStfCursorsDlg::OnComboBoxU1P( wxCommandEvent& event ) { event.Skip(); UpdateUnits(wxCOMBOU1P,cursor1PIsTime,wxTEXT1P); } void wxStfCursorsDlg::OnComboBoxU2P( wxCommandEvent& event ) { event.Skip(); UpdateUnits(wxCOMBOU2P,cursor2PIsTime,wxTEXT2P); } void wxStfCursorsDlg::OnComboBoxU1B( wxCommandEvent& event ) { event.Skip(); UpdateUnits(wxCOMBOU1B,cursor1BIsTime,wxTEXT1B); } void wxStfCursorsDlg::OnComboBoxU2B( wxCommandEvent& event ) { event.Skip(); UpdateUnits(wxCOMBOU2B,cursor2BIsTime,wxTEXT2B); } void wxStfCursorsDlg::OnComboBoxU1D( wxCommandEvent& event ) { event.Skip(); UpdateUnits(wxCOMBOU1D,cursor1DIsTime,wxTEXT1D); } void wxStfCursorsDlg::OnComboBoxU2D( wxCommandEvent& event ) { event.Skip(); UpdateUnits(wxCOMBOU2D,cursor2DIsTime,wxTEXT2D); } void wxStfCursorsDlg::OnComboBoxU1L( wxCommandEvent& event ) { event.Skip(); wxRadioButton* wxRadio_Lat_Manual1 = (wxRadioButton*)FindWindow(wxRADIO_LAT_MANUAL1); if (wxRadio_Lat_Manual1 == NULL){ wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::OnComboBoxU1LS()")); return; } else wxRadio_Lat_Manual1->SetValue(true); UpdateUnits(wxCOMBOU1L,cursor1LIsTime,wxTEXT1L); } void wxStfCursorsDlg::OnComboBoxU2L( wxCommandEvent& event ) { event.Skip(); wxRadioButton* wxRadio_Lat_Manual2 = (wxRadioButton*)FindWindow(wxRADIO_LAT_MANUAL2); if (wxRadio_Lat_Manual2 == NULL){ wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::OnComboBoxU2LS()")); return; } else wxRadio_Lat_Manual2->SetValue(true); UpdateUnits(wxCOMBOU2L,cursor2LIsTime,wxTEXT2L); } void wxStfCursorsDlg::OnRadioLatManualBeg( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor1L = (wxTextCtrl*)FindWindow(wxTEXT1L); if (pCursor1L == NULL ) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioLatManBeg()")); return; } // if cursor wxTextCtrl is NOT enable2 if (!pCursor1L->IsEnabled()) pCursor1L->Enable(true); } void wxStfCursorsDlg::OnRadioLatManualEnd( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor2L = (wxTextCtrl*)FindWindow(wxTEXT2L); if (pCursor2L == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioLatManEnd()")); return; } // if cursor wxTextCtrl is NOT enabled if (!pCursor2L->IsEnabled()) pCursor2L->Enable(true); } void wxStfCursorsDlg::OnRadioLatNonManualBeg( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor1L = (wxTextCtrl*)FindWindow(wxTEXT1L); wxRadioButton* pLatencyManualEnd = (wxRadioButton*)FindWindow(wxRADIO_LAT_MANUAL2); if (pCursor1L == NULL || pLatencyManualEnd == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioLatt50Beg()")); return; } // disable cursor wxTextCtrl if it is enabled if (pCursor1L->IsEnabled()) pCursor1L->Enable(false); } void wxStfCursorsDlg::OnRadioLatNonManualEnd( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor2L = (wxTextCtrl*)FindWindow(wxTEXT2L); wxRadioButton* pLatencyManualBeg = (wxRadioButton*)FindWindow(wxRADIO_LAT_MANUAL1); if (pCursor2L == NULL || pLatencyManualBeg == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioNonManualEnd()")); return; } // disable cursor wxTextCtrl if it is enabled if (pCursor2L->IsEnabled()) pCursor2L->Enable(false); } #ifdef WITH_PSLOPE void wxStfCursorsDlg::OnComboBoxU1PS( wxCommandEvent& event ) { event.Skip(); // select manual option in "measurement from" box wxRadioButton* pPSManBeg = (wxRadioButton*)FindWindow(wxRADIO_PSManBeg); if (pPSManBeg == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::OnComboBoxU1PS()")); return; } else pPSManBeg->SetValue(true); UpdateUnits(wxCOMBOU1PS,cursor1PSIsTime,wxTEXT1PS); } void wxStfCursorsDlg::OnComboBoxU2PS( wxCommandEvent& event ) { event.Skip(); // select manual option in "measurement to" box wxRadioButton* pPSManEnd = (wxRadioButton*)FindWindow(wxRADIO_PSManEnd); if (pPSManEnd == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::OnComboBoxU2PS()")); return; } else pPSManEnd->SetValue(true); UpdateUnits(wxCOMBOU2PS,cursor2PSIsTime,wxTEXT2PS); } void wxStfCursorsDlg::OnRadioPSManBeg( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor1PS = (wxTextCtrl*)FindWindow(wxTEXT1PS); if (pCursor1PS == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioManBeg()")); return; } // if cursor wxTextCtrl is NOT enabled if (!pCursor1PS->IsEnabled()) pCursor1PS->Enable(true); } void wxStfCursorsDlg::OnRadioPSEventBeg( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor1PS = (wxTextCtrl*)FindWindow(wxTEXT1PS); if ( pCursor1PS == NULL ) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioPSEventBeg()")); return; } // disable cursor wxTextCtrl if it is enabled if (pCursor1PS->IsEnabled()) pCursor1PS->Enable(false); } void wxStfCursorsDlg::OnRadioPSThrBeg( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor1PS = (wxTextCtrl*)FindWindow(wxTEXT1PS); if (pCursor1PS == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioThrBeg()")); return; } // disable cursor wxTextCtrl if it is enabled if (pCursor1PS->IsEnabled()) pCursor1PS->Enable(false); } void wxStfCursorsDlg::OnRadioPSt50Beg( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor1PS = (wxTextCtrl*)FindWindow(wxTEXT1PS); if ( pCursor1PS == NULL ) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioPSt50Beg()")); return; } // disable cursor wxTextCtrl if it is enabled if (pCursor1PS->IsEnabled()) pCursor1PS->Enable(false); } void wxStfCursorsDlg::OnRadioPSManEnd( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor2PS = (wxTextCtrl*)FindWindow(wxTEXT2PS); wxTextCtrl* pTextPSDeltaT = (wxTextCtrl*)FindWindow(wxTEXT_PSDELTAT); if (pCursor2PS == NULL || pTextPSDeltaT == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioManEnd()")); return; } // if cursor wxTextCtrl is NOT enabled if (!pCursor2PS->IsEnabled()) pCursor2PS->Enable(true); if (pTextPSDeltaT->IsEnabled()) pTextPSDeltaT->Enable(false); } void wxStfCursorsDlg::OnRadioPSt50End( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor2PS = (wxTextCtrl*)FindWindow(wxTEXT2PS); wxTextCtrl* pTextPSDeltaT = (wxTextCtrl*)FindWindow(wxTEXT_PSDELTAT); if (pCursor2PS == NULL || pTextPSDeltaT == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioPSt50End()")); return; } // disable cursor wxTextCtrl if it is enabled if (pCursor2PS->IsEnabled()) pCursor2PS->Enable(false); if (pTextPSDeltaT->IsEnabled()) pTextPSDeltaT->Enable(false); SetPSlopeEndMode(stf::psEnd_t50Mode); } void wxStfCursorsDlg::OnRadioPSDeltaT( wxCommandEvent& event) { event.Skip(); wxTextCtrl* pCursor2PS = (wxTextCtrl*)FindWindow(wxTEXT2PS); wxTextCtrl* pTextPSDeltaT = (wxTextCtrl*)FindWindow(wxTEXT_PSDELTAT); if (pCursor2PS == NULL || pTextPSDeltaT == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioPSDeltaT")); return; } // disable cursor wxTextCtrl if it is enabled if (pCursor2PS->IsEnabled()) pCursor2PS->Enable(false); // enable text control if (!pTextPSDeltaT->IsEnabled()) pTextPSDeltaT->Enable(true); SetPSlopeEndMode(stf::psEnd_DeltaTMode); } void wxStfCursorsDlg::OnRadioPSPeakEnd( wxCommandEvent& event ) { event.Skip(); wxTextCtrl* pCursor2PS = (wxTextCtrl*)FindWindow(wxTEXT2PS); wxTextCtrl* pTextPSDeltaT = (wxTextCtrl*)FindWindow(wxTEXT_PSDELTAT); if (pCursor2PS == NULL || pTextPSDeltaT == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioPeakEnd()")); return; } // disable cursor wxTextCtrl if is enabled if (pCursor2PS->IsEnabled()) pCursor2PS->Enable(false); if (pTextPSDeltaT->IsEnabled()) pTextPSDeltaT->Enable(false); SetPSlopeEndMode(stf::psEnd_peakMode); } #endif // WITH_PSLOPE void wxStfCursorsDlg::OnRadioAll( wxCommandEvent& event ) { event.Skip(); wxRadioButton* pRadioAll = (wxRadioButton*)FindWindow(wxRADIOALL); wxRadioButton* pRadioMean = (wxRadioButton*)FindWindow(wxRADIOMEAN); wxTextCtrl* pTextPM = (wxTextCtrl*)FindWindow(wxTEXTPM); if (pTextPM==NULL || pRadioMean==NULL || pRadioAll==NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioAll()")); return; } pTextPM->Enable(false); pRadioMean->SetValue(false); } void wxStfCursorsDlg::OnRadioMean( wxCommandEvent& event ) { event.Skip(); wxRadioButton* pRadioAll = (wxRadioButton*)FindWindow(wxRADIOALL); wxRadioButton* pRadioMean = (wxRadioButton*)FindWindow(wxRADIOMEAN); wxTextCtrl* pTextPM = (wxTextCtrl*)FindWindow(wxTEXTPM); if (pTextPM==NULL || pRadioMean==NULL || pRadioAll==NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::OnRadioMean()")); return; } pTextPM->Enable(true); pRadioAll->SetValue(false); } void wxStfCursorsDlg::OnRTSlider( wxScrollEvent& event ) { event.Skip(); wxSlider *pRTSlider = (wxSlider*)FindWindow(wxRT_SLIDER); wxStaticText *pRTLabel = (wxStaticText*)FindWindow(wxRT_LABEL); if (pRTSlider==NULL || pRTLabel == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg:OnRTSlider()")); return; } wxString label(wxT("Rise time ")); label << pRTSlider->GetValue() << wxT("-"); label << 100-pRTSlider->GetValue() << wxT("\%"); pRTLabel->SetLabel(label); } stf::latency_mode wxStfCursorsDlg::GetLatencyStartMode() const { wxRadioButton* pManual = (wxRadioButton*)FindWindow(wxRADIO_LAT_MANUAL1); wxRadioButton* pPeak = (wxRadioButton*)FindWindow(wxRADIO_LAT_PEAK1); wxRadioButton* pMaxSlope = (wxRadioButton*)FindWindow(wxRADIO_LAT_MAXSLOPE1); wxRadioButton* pt50 = (wxRadioButton*)FindWindow(wxRADIO_LAT_HALFWIDTH1); if (pManual == NULL || pPeak == NULL || pMaxSlope == NULL || pt50 == NULL ) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::GetLatencyStartMode()")); return stf::undefinedMode; } if (pManual->GetValue() ) return stf::manualMode; else if (pPeak->GetValue()) return stf::peakMode; else if (pMaxSlope->GetValue()) return stf::riseMode; else if (pt50->GetValue()) return stf::halfMode; else return stf::undefinedMode; } stf::latency_mode wxStfCursorsDlg::GetLatencyEndMode() const { wxRadioButton* pEvent = (wxRadioButton*)FindWindow(wxRADIO_LAT_EVENT2); wxRadioButton* pManual = (wxRadioButton*)FindWindow(wxRADIO_LAT_MANUAL2); wxRadioButton* pPeak = (wxRadioButton*)FindWindow(wxRADIO_LAT_PEAK2); wxRadioButton* pMaxSlope = (wxRadioButton*)FindWindow(wxRADIO_LAT_MAXSLOPE2); wxRadioButton* pt50 = (wxRadioButton*)FindWindow(wxRADIO_LAT_HALFWIDTH2); if (pEvent == NULL || pManual == NULL || pPeak == NULL || pMaxSlope == NULL || pt50 == NULL ) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::GetLatencyEndMode()")); return stf::undefinedMode; } if (pManual->GetValue() ) { return stf::manualMode; } else { if (pEvent->GetValue()) { return stf::footMode; } else { if (pPeak->GetValue()) { return stf::peakMode; } else { if (pMaxSlope->GetValue()) { return stf::riseMode; } else { if (pt50->GetValue()) { return stf::halfMode; } else { return stf::undefinedMode; } } } } } } void wxStfCursorsDlg::SetLatencyStartMode(stf::latency_mode latencyBegMode){ wxRadioButton* pManual = (wxRadioButton*)FindWindow(wxRADIO_LAT_MANUAL1); wxRadioButton* pPeak = (wxRadioButton*)FindWindow(wxRADIO_LAT_PEAK1); wxRadioButton* pMaxSlope = (wxRadioButton*)FindWindow(wxRADIO_LAT_MAXSLOPE1); wxRadioButton* pt50 = (wxRadioButton*)FindWindow(wxRADIO_LAT_HALFWIDTH1); if (pManual == NULL || pPeak == NULL || pMaxSlope == NULL || pt50 == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::SetLatencyStartMode()")); } switch (latencyBegMode) { case stf::manualMode: pManual->SetValue(true); break; case stf::peakMode: pPeak->SetValue(true); break; case stf::riseMode: pMaxSlope->SetValue(true); break; case stf::halfMode: pt50->SetValue(true); break; default: break; } } void wxStfCursorsDlg::SetLatencyEndMode(stf::latency_mode latencyEndMode){ wxRadioButton* pManual = (wxRadioButton*)FindWindow(wxRADIO_LAT_MANUAL2); wxRadioButton* pPeak = (wxRadioButton*)FindWindow(wxRADIO_LAT_PEAK2); wxRadioButton* pMaxSlope = (wxRadioButton*)FindWindow(wxRADIO_LAT_MAXSLOPE2); wxRadioButton* pt50 = (wxRadioButton*)FindWindow(wxRADIO_LAT_HALFWIDTH2); wxRadioButton* pEvent = (wxRadioButton*)FindWindow(wxRADIO_LAT_EVENT2); if (pManual == NULL || pPeak == NULL || pMaxSlope == NULL || pt50 == NULL || pEvent == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::SetLatencyEndtMode()")); } switch (latencyEndMode) { case stf::manualMode: pManual->SetValue(true); break; case stf::peakMode: pPeak->SetValue(true); break; case stf::riseMode: pMaxSlope->SetValue(true); break; case stf::halfMode: pt50->SetValue(true); break; case stf::footMode: pEvent->SetValue(true); break; default: break; } } #ifdef WITH_PSLOPE stf::pslope_mode_beg wxStfCursorsDlg::GetPSlopeBegMode() const { wxRadioButton* pPSManBeg = (wxRadioButton*)FindWindow(wxRADIO_PSManBeg); wxRadioButton* pPSEventBeg = (wxRadioButton*)FindWindow(wxRADIO_PSEventBeg); wxRadioButton* pPSThrBeg = (wxRadioButton*)FindWindow(wxRADIO_PSThrBeg); wxRadioButton* pPSt50Beg = (wxRadioButton*)FindWindow(wxRADIO_PSt50Beg); if (pPSManBeg == NULL || pPSEventBeg == NULL || pPSThrBeg == NULL || pPSt50Beg == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::OnRadioPSBeg()")); return stf::psBeg_undefined; } if ( pPSManBeg->GetValue() ) return stf::psBeg_manualMode; else if ( pPSEventBeg->GetValue() ) return stf::psBeg_footMode; else if( pPSThrBeg->GetValue() ) return stf::psBeg_thrMode; else if ( pPSt50Beg->GetValue() ) return stf::psBeg_t50Mode; else return stf::psBeg_undefined; } stf::pslope_mode_end wxStfCursorsDlg::GetPSlopeEndMode() const { wxRadioButton* pPSManEnd = (wxRadioButton*)FindWindow(wxRADIO_PSManEnd); wxRadioButton* pPSt50End = (wxRadioButton*)FindWindow(wxRADIO_PSt50End); wxRadioButton* pPSDeltaT = (wxRadioButton*)FindWindow(wxRADIO_PSDeltaT); wxRadioButton* pPSPeakEnd = (wxRadioButton*)FindWindow(wxRADIO_PSPeakEnd); if (pPSManEnd == NULL || pPSt50End == NULL || pPSDeltaT == NULL || pPSPeakEnd == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::GetPSlopeEndMode()")); } if ( pPSManEnd->GetValue() ) return stf::psEnd_manualMode; else if ( pPSt50End->GetValue() ) return stf::psEnd_t50Mode; else if( pPSDeltaT->GetValue() ) return stf::psEnd_DeltaTMode; else if ( pPSPeakEnd->GetValue() ) return stf::psEnd_peakMode; else return stf::psEnd_undefined; // return dlgPSlopeModeEnd; } void wxStfCursorsDlg::SetPSlopeEndMode(stf::pslope_mode_end pslopeEndMode) { wxRadioButton* pPSManBeg = (wxRadioButton*)FindWindow(wxRADIO_PSManBeg); wxRadioButton* pPSEventBeg = (wxRadioButton*)FindWindow(wxRADIO_PSEventBeg); wxRadioButton* pPSThrBeg = (wxRadioButton*)FindWindow(wxRADIO_PSThrBeg); wxRadioButton* pPSt50Beg = (wxRadioButton*)FindWindow(wxRADIO_PSThrBeg); if (pPSManBeg == NULL || pPSEventBeg == NULL || pPSThrBeg == NULL || pPSt50Beg == NULL){ wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::SetPSlopeEndMode()")); return; } switch (pslopeEndMode) { case stf::psBeg_manualMode: pPSManBeg->Enable(true); break; case stf::psBeg_footMode: pPSEventBeg->Enable(true); break; case stf::psBeg_thrMode: pPSThrBeg->Enable(true); break; case stf::psBeg_t50Mode: pPSt50Beg->Enable(true); default: break; } } void wxStfCursorsDlg::SetPSlopeBegMode(stf::pslope_mode_beg pslopeBegMode) { wxRadioButton* pPSManBeg = (wxRadioButton*)FindWindow(wxRADIO_PSManBeg); wxRadioButton* pPSEventBeg = (wxRadioButton*)FindWindow(wxRADIO_PSEventBeg); wxRadioButton* pPSThrBeg = (wxRadioButton*)FindWindow(wxRADIO_PSThrBeg); wxRadioButton* pPSt50Beg = (wxRadioButton*)FindWindow(wxRADIO_PSThrBeg); if (pPSManBeg == NULL || pPSEventBeg == NULL || pPSThrBeg == NULL || pPSt50Beg == NULL){ wxGetApp().ErrorMsg(wxT("Null pointer in wxStfCursorsDlg::SetPSlopeBegMode()")); return; } switch (pslopeBegMode) { case stf::psBeg_manualMode: pPSManBeg->Enable(true); break; case stf::psBeg_footMode: pPSEventBeg->Enable(true); break; case stf::psBeg_thrMode: pPSThrBeg->Enable(true); break; case stf::psBeg_t50Mode: pPSt50Beg->Enable(true); default: break; } } #endif // WITH_PSLOPE void wxStfCursorsDlg::UpdateUnits(wxWindowID comboId, bool& setTime, wxWindowID textId) { // Read current entry: wxString strRead; wxTextCtrl* pText = (wxTextCtrl*)FindWindow(textId); if (pText == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::UpdateUnits()")); return; } strRead << pText->GetValue(); double fEntry=0.0; strRead.ToDouble( &fEntry ); wxComboBox* pCombo = (wxComboBox*)FindWindow(comboId); if (pCombo == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::UpdateUnits()")); return; } bool isTimeNow=(pCombo->GetCurrentSelection()==0); // switched from pts to time: if (!setTime&&isTimeNow) { // switched from pts to time: double fNewValue=fEntry*actDoc->GetXScale(); wxString strNewValue;strNewValue << fNewValue; pText->SetValue( strNewValue ); setTime=true; } if (setTime&&!isTimeNow) { // switched from time to pts: int iNewValue = stf::round(fEntry/actDoc->GetXScale()); wxString strNewValue; strNewValue << iNewValue; pText->SetValue( strNewValue ); setTime=false; } } void wxStfCursorsDlg::UpdateCursors() { stf::cursor_type select = CurrentCursor(); int iNewValue1=0, iNewValue2=0; bool cursor2isTime=true, cursor1isTime=true; wxTextCtrl* pText1=NULL, *pText2=NULL; if (actDoc == NULL) { throw std::runtime_error("No active document found"); } switch (select) { case stf::measure_cursor: // Measure iNewValue1=(int)actDoc->GetMeasCursor(); cursor1isTime=cursorMIsTime; pText1=(wxTextCtrl*)FindWindow(wxTEXTM); // update Show ruler SetRuler( actDoc->GetMeasRuler() ); break; case stf::peak_cursor: // Peak iNewValue1=(int)actDoc->GetPeakBeg(); iNewValue2=(int)actDoc->GetPeakEnd(); cursor1isTime=cursor1PIsTime; cursor2isTime=cursor2PIsTime; pText1=(wxTextCtrl*)FindWindow(wxTEXT1P); pText2=(wxTextCtrl*)FindWindow(wxTEXT2P); // Update peak at the end SetPeakAtEnd( actDoc->GetPeakAtEnd() ); // Update the mean peak points and direction: SetPeakPoints( actDoc->GetPM() ); SetDirection( actDoc->GetDirection() ); SetFromBase( actDoc->GetFromBase() ); // Update rise time factor SetRTFactor( actDoc->GetRTFactor() ); // Update threshold slope SetSlope( actDoc->GetSlopeForThreshold() ); break; case stf::base_cursor: // Base iNewValue1=(int)actDoc->GetBaseBeg(); iNewValue2=(int)actDoc->GetBaseEnd(); cursor1isTime=cursor1BIsTime; cursor2isTime=cursor2BIsTime; pText1=(wxTextCtrl*)FindWindow(wxTEXT1B); pText2=(wxTextCtrl*)FindWindow(wxTEXT2B); SetBaselineMethod( actDoc->GetBaselineMethod() ); break; case stf::decay_cursor: // Decay iNewValue1=(int)actDoc->GetFitBeg(); iNewValue2=(int)actDoc->GetFitEnd(); cursor1isTime=cursor1DIsTime; cursor2isTime=cursor2DIsTime; pText1=(wxTextCtrl*)FindWindow(wxTEXT1D); pText2=(wxTextCtrl*)FindWindow(wxTEXT2D); // Update left decay cursor to peak SetStartFitAtPeak( actDoc->GetStartFitAtPeak() ); break; case stf::latency_cursor: // Latency iNewValue1= (int)actDoc->GetLatencyBeg(); iNewValue2= (int)actDoc->GetLatencyEnd(); cursor1isTime=cursor1LIsTime; cursor2isTime=cursor2LIsTime; // if GetLatencyStartmode() is zero, textbox is enabled pText1=(wxTextCtrl*)FindWindow(wxTEXT1L); pText1->Enable(!actDoc->GetLatencyStartMode()); // if GetLatencyEndmode() is zero, textbox is enabled pText2=(wxTextCtrl*)FindWindow(wxTEXT2L); pText2->Enable(!actDoc->GetLatencyEndMode()); // use peak for latency measurements? //SetPeak4Latency ( actDoc->GetLatencyWindowMode() ); // Update RadioButton options SetLatencyStartMode( actDoc->GetLatencyStartMode() ); SetLatencyEndMode( actDoc->GetLatencyEndMode() ); break; #ifdef WITH_PSLOPE case stf::pslope_cursor: iNewValue1=(int)actDoc->GetPSlopeBeg(); iNewValue2=(int)actDoc->GetPSlopeEnd(); cursor1isTime = cursor1PSIsTime; cursor2isTime = cursor2PSIsTime; pText1=(wxTextCtrl*)FindWindow(wxTEXT1PS); pText2=(wxTextCtrl*)FindWindow(wxTEXT2PS); // Update PSlope Beg and End radio options SetPSlopeBegMode( actDoc->GetPSlopeBegMode() ); SetPSlopeEndMode( actDoc->GetPSlopeEndMode() ); SetDeltaT( actDoc->GetDeltaT() ); break; #endif default: break; } double fNewValue1=iNewValue1*actDoc->GetXScale(); double fNewValue2=iNewValue2*actDoc->GetXScale(); wxString strNewValue; if (cursor1isTime) { strNewValue << fNewValue1; } else { strNewValue << iNewValue1; } if (pText1 != NULL) { pText1->SetValue( strNewValue ); } if (select!=stf::measure_cursor && pText2 != NULL) { wxString strNewValue2; if (cursor2isTime) { strNewValue2 << fNewValue2; } else { strNewValue2 << iNewValue2; } pText2->SetValue( strNewValue2 ); } //SetSlope( actDoc->GetSlopeForThreshold() ); wxString slopeUnits; slopeUnits += stf::std2wx( actDoc->at(actDoc->GetCurChIndex()).GetYUnits() ); slopeUnits += wxT("/"); slopeUnits += stf::std2wx( actDoc->GetXUnits() ); SetSlopeUnits(slopeUnits); } stf::cursor_type wxStfCursorsDlg::CurrentCursor() const { if (m_notebook == NULL) return stf::undefined_cursor; switch (m_notebook->GetSelection()) { case 0: return stf::measure_cursor; case 1: return stf::peak_cursor; case 2: return stf::base_cursor; case 3: return stf::decay_cursor; case 4: return stf::latency_cursor; #ifdef WITH_PSLOPE case 5: return stf::pslope_cursor; #endif default: return stf::undefined_cursor; } } double wxStfCursorsDlg::GetSlope() const { double f=0.0; wxTextCtrl* pSlope =(wxTextCtrl*) FindWindow(wxSLOPE); if (pSlope == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetSlope()")); return 0; } wxString entry; entry << pSlope->GetValue(); entry.ToDouble( &f ); return f; } void wxStfCursorsDlg::SetSlope( double fSlope ) { wxTextCtrl* pSlope = (wxTextCtrl*)FindWindow(wxSLOPE); wxString wxsSlope; wxsSlope << fSlope; if ( pSlope != NULL ) pSlope->SetValue( wxsSlope ); } void wxStfCursorsDlg::SetSlopeUnits(const wxString& units) { wxStaticText* pSlopeUnits = (wxStaticText*)FindWindow(wxSLOPEUNITS); if (pSlopeUnits != NULL) { pSlopeUnits->SetLabel(units); } } bool wxStfCursorsDlg::GetRuler() const { wxCheckBox* pMeasCursor = (wxCheckBox*)FindWindow(wxMEASCURSOR); if (pMeasCursor == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::GetRuler()")); return false; } return pMeasCursor->IsChecked(); } void wxStfCursorsDlg::SetRuler(bool value) { wxCheckBox* pMeasCursor = (wxCheckBox*)FindWindow( wxMEASCURSOR ); if (pMeasCursor == NULL) { wxGetApp().ErrorMsg(wxT("null pointer in wxStfCursorsDlg::SetRuler()")); return; } pMeasCursor->SetValue(value); } stimfit-0.15.8/src/stimfit/gui/dlgs/fitseldlg.h0000775000175000017500000000747413062445067016346 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file fitseldlg.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfFitSelDlg. */ #ifndef _FITSELDLG_H #define _FITSELDLG_H /*! \addtogroup wxstf * @{ */ #include #include #include "./../../stf.h" //! Non-linear regression settings dialog class wxStfFitSelDlg : public wxDialog { DECLARE_EVENT_TABLE() private: int m_fselect; Vector_double init_p; Vector_double opts; bool noInput, use_scaling; void SetPars(); void SetOpts(); void InitOptions(wxFlexGridSizer* optionsGrid); void Update_fselect(); void read_init_p(); void read_opts(); static const int MAXPAR=20; void OnListItemSelected( wxListEvent& event ); void OnButtonClick( wxCommandEvent& event ); wxStdDialogButtonSizer* m_sdbSizer; wxListCtrl* m_listCtrl; wxTextCtrl *m_textCtrlMu,*m_textCtrlJTE,*m_textCtrlDP,*m_textCtrlE2, *m_textCtrlMaxiter, *m_textCtrlMaxpasses; wxCheckBox *m_checkBox; std::vector< wxStaticText* > paramDescArray; std::vector< wxTextCtrl* > paramEntryArray; wxStfDoc* pDoc; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param doc Pointer to the document the call originated from. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfFitSelDlg( wxWindow* parent, wxStfDoc* doc, int id = wxID_ANY, wxString title = wxT("Non-linear regression"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); //! Get the selected fit function. /*! \return The index of the selected fit function. */ int GetFSelect() const {return m_fselect;} //! Get the initial parameters. /*! \return A valarray containing the initial parameter set to start the fit. */ Vector_double GetInitP() const {return init_p;} //! Get options for the algorithm. /*! \return A valarray containing the initial parameters for the algorithm. */ Vector_double GetOpts() const {return opts;} //! Scale x- and y-amplitudes to 1.0 before fit /*! \return True if scaling should be used */ bool UseScaling() const {return use_scaling;} //! Determines whether user-defined initial parameters are allowed. /*! \param noInput_ Set to true if the user may set the initial parameters, false otherwise. * Needed for batch analysis. */ void SetNoInput(bool noInput_) {noInput=noInput_;} }; /* @} */ #endif stimfit-0.15.8/src/stimfit/gui/dlgs/convertdlg.cpp0000664000175000017500000002444113062445067017061 00000000000000#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include "convertdlg.h" #include "./../app.h" enum { wxCOMBOBOX_SRC, wxCOMBOBOX_DEST, wxGENERICDIRCTRL_SRC, wxGENERICDIRCTRL_DEST }; BEGIN_EVENT_TABLE( wxStfConvertDlg, wxDialog ) EVT_COMBOBOX( wxCOMBOBOX_SRC, wxStfConvertDlg::OnComboBoxSrcExt) EVT_COMBOBOX( wxCOMBOBOX_DEST, wxStfConvertDlg::OnComboBoxDestExt) END_EVENT_TABLE() // wxStfConvertDlg constructor wxStfConvertDlg::wxStfConvertDlg(wxWindow* parent, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), srcDir(wxT("")), destDir(wxT("")), srcFilter(wxT("")), myCheckBoxSubdirs(NULL), srcFilterExt(stfio::cfs), destFilterExt(stfio::igor), srcFileNames(0) { if (srcDir == wxT("")) { srcDir = wxGetApp().wxGetProfileString( wxT("Settings"), wxT("Most recent batch source directory"), wxT("")); if (srcDir == wxT("") || !wxFileName::DirExists(srcDir)) { srcDir = wxStandardPaths::Get().GetDocumentsDir(); } } if (destDir == wxT("")) { destDir = wxGetApp().wxGetProfileString( wxT("Settings"), wxT("Most recent batch target directory"), wxT("")); if (destDir == wxT("") || !wxFileName::DirExists(destDir)) { destDir = wxStandardPaths::Get().GetDocumentsDir(); } } wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); //wxFlexGridSizer *gridSizer; //gridSizer = new wxFlexGridSizer(2,2,0,10); wxFlexGridSizer *gridSizer; gridSizer = new wxFlexGridSizer(1,2,0,0); // SOURCE dir ------------------------------------------------------ // wxFlexGridSizer to place a 1) combo + 2) directory listing wxFlexGridSizer *myLeftSizer; // this is a sizer for the left side myLeftSizer = new wxFlexGridSizer(3, 1, 0, 0); // SOURCE 1.- wxComboBox to select the source file extension wxFlexGridSizer *mySrcComboSizer; // a sizer for my Combo mySrcComboSizer = new wxFlexGridSizer(1, 2, 0, 0); wxStaticText* staticTextExt; staticTextExt = new wxStaticText( this, wxID_ANY, wxT("Origin filetype:"), wxDefaultPosition, wxDefaultSize, 0 ); wxArrayString myextensions; myextensions.Add(wxT("CFS binary [*.dat ]")); myextensions.Add(wxT("Axon binary [*.abf ]")); myextensions.Add(wxT("Axograph [*.axgd]")); myextensions.Add(wxT("Axon textfile [*.atf ]")); myextensions.Add(wxT("ASCII [*.* ]")); myextensions.Add(wxT("HDF5 [*.h5 ]")); myextensions.Add(wxT("HEKA files [*.dat ]")); #if (BIOSIG_VERSION >= 10404) myextensions.Add(wxT("Igor files [*.ibw ]")); #endif wxComboBox* myComboBoxExt; myComboBoxExt = new wxComboBox(this, wxCOMBOBOX_SRC, myextensions[0], wxDefaultPosition, wxDefaultSize, myextensions, wxCB_READONLY); // add to mySrcComboSizer mySrcComboSizer->Add( staticTextExt, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); mySrcComboSizer->Add( myComboBoxExt, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // add to myLeftSizer myLeftSizer->Add( mySrcComboSizer, 0, wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // ---- wxComboBox to select the source file extension // SOURCE 2.- A wxGenericDirCtrl to select the source directory: //wxGenericDirCtrl *mySrcDirCtrl; mySrcDirCtrl = new wxGenericDirCtrl(this, wxGENERICDIRCTRL_SRC, srcDir, wxDefaultPosition, wxSize(300,300), wxDIRCTRL_DIR_ONLY); // add to myLeftSizer myLeftSizer->Add( mySrcDirCtrl, 0, wxEXPAND | wxALL , 2 ); // ---- A wxGenericDirCtrl to select the source directory: myCheckBoxSubdirs = new wxCheckBox( this, wxID_ANY, wxT("Include subdirectories"), wxDefaultPosition, wxDefaultSize, 0 ); myCheckBoxSubdirs->SetValue(false); myLeftSizer->Add( myCheckBoxSubdirs, 0, wxALIGN_LEFT | wxALL, 2 ); // Finally add myLeftSizer to the gridSizer gridSizer->Add( myLeftSizer, 0, wxALIGN_LEFT, 5 ); //topSizer->Add( gridSizer, 0, wxALIGN_CENTER, 5 ); // DESTINATION dir ---------------------------------------------------------- // wxFlexGridSizer to place a 1) combo + 2) directory listing wxFlexGridSizer *myRightSizer; // this is a sizer for the right side myRightSizer = new wxFlexGridSizer(2, 1, 0, 0); // DESTINATION 1.- wxComboBox to select the destiny file extension wxFlexGridSizer *myDestComboSizer; // a sizer for my Combo myDestComboSizer = new wxFlexGridSizer(1, 2, 0, 0); wxStaticText* staticTextDestExt; staticTextDestExt = new wxStaticText( this, wxID_ANY, wxT("Destination filetype:"), wxDefaultPosition, wxDefaultSize, 0 ); wxArrayString mydestextensions; //ordered by importance mydestextensions.Add(wxT("Igor binary [*.ibw ]")); mydestextensions.Add(wxT("Axon textfile [*.atf ]")); #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) mydestextensions.Add(wxT("GDF (Biosig) [*.gdf ]")); #endif wxComboBox* myComboBoxDestExt; myComboBoxDestExt = new wxComboBox(this, wxCOMBOBOX_DEST, mydestextensions[0], wxDefaultPosition, wxDefaultSize, mydestextensions, wxCB_READONLY); // add to mySrcComboSizer myDestComboSizer->Add( staticTextDestExt, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); myDestComboSizer->Add( myComboBoxDestExt, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // add to myRightSizer myRightSizer->Add( myDestComboSizer, 0, wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // ---- wxComboBox to select the source file extension // DESTINATION 2.- A wxGenericDirCtrl to select the destiny directory: myDestDirCtrl = new wxGenericDirCtrl(this, wxGENERICDIRCTRL_DEST, destDir, wxDefaultPosition, wxSize(300,300), wxDIRCTRL_DIR_ONLY); // add to myLeftSizer myRightSizer->Add( myDestDirCtrl, 0, wxEXPAND | wxALL, 2 ); // ---- A wxGenericDirCtrl to select the source directory: // Finally add myRightSizer to gridSizer and this to topSizer gridSizer->Add( myRightSizer, 0, wxALIGN_RIGHT, 5); topSizer->Add( gridSizer, 0, wxALIGN_CENTER, 5 ); // OK / Cancel buttons----------------------------------------------- wxStdDialogButtonSizer* sdbSizer = new wxStdDialogButtonSizer(); wxButton *myConvertButton; myConvertButton = new wxButton( this, wxID_OK, wxT("C&onvert")); // this for wxWidgets 2.9.1 //myConvertButton->SetBitmap(wxBitmap(wxT("icon_cross.png"), wxBITMAP_TYPE_PNG)); sdbSizer->AddButton(myConvertButton); sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); sdbSizer->Realize(); topSizer->Add( sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfConvertDlg::OnComboBoxDestExt(wxCommandEvent& event){ event.Skip(); wxComboBox* pComboBox = (wxComboBox*)FindWindow(wxCOMBOBOX_DEST); if (pComboBox == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfConvertDlg::OnComboBoxDestExt()")); return; } // update destFilterExt switch(pComboBox->GetSelection()){ case 0: destFilterExt = stfio::igor; break; case 1: destFilterExt = stfio::atf; break; #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) case 2: destFilterExt = stfio::biosig; break; #endif default: destFilterExt = stfio::igor; } } void wxStfConvertDlg::OnComboBoxSrcExt(wxCommandEvent& event){ event.Skip(); wxComboBox* pComboBox = (wxComboBox*)FindWindow(wxCOMBOBOX_SRC); if (pComboBox == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfConvertDlg::OnComboBoxSrcExt()")); return; } // update srcFilterExt and srcFilter // see index of wxArrayString myextensions to evaluate case switch(pComboBox->GetSelection()){ case 0: srcFilterExt = stfio::cfs; break; case 1: srcFilterExt = stfio::abf; break; case 2: srcFilterExt = stfio::axg; break; case 3: srcFilterExt = stfio::atf; break; case 4: break; case 5: srcFilterExt = stfio::hdf5; break; case 6: srcFilterExt = stfio::heka; break; #if (BIOSIG_VERSION >= 10404) case 7: srcFilterExt = stfio::igor; break; #endif default: srcFilterExt = stfio::none; } srcFilter = wxT("*") + stf::std2wx(stfio::findExtension(srcFilterExt)); } void wxStfConvertDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { return; } } wxDialog::EndModal(retCode); } bool wxStfConvertDlg::OnOK() { srcDir = mySrcDirCtrl->GetPath(); destDir = myDestDirCtrl->GetPath(); if (!wxDir::Exists(srcDir)) { wxString msg; msg << srcDir << wxT(" doesn't exist"); wxLogMessage(msg); return false; } if (!wxDir::Exists(destDir)) { wxString msg; msg << destDir << wxT(" doesn't exist"); wxLogMessage(msg); return false; } if (!ReadPath(srcDir)) { wxString msg; msg << srcFilter << wxT(" not found in ") << srcDir; wxLogMessage(msg); return false; } wxGetApp().wxWriteProfileString( wxT("Settings"), wxT("Most recent batch source directory"), srcDir); wxGetApp().wxWriteProfileString( wxT("Settings"), wxT("Most recent batch target directory"), destDir); return true; } bool wxStfConvertDlg::ReadPath(const wxString& path) { // Walk through path: wxDir dir(path); if ( !dir.IsOpened() ) { return false; } if (!dir.HasFiles(srcFilter)) { return false; } int dir_flags = myCheckBoxSubdirs->IsChecked() ? wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN : wxDIR_FILES | wxDIR_HIDDEN; wxDir::GetAllFiles(path, &srcFileNames, srcFilter, dir_flags); return true; } stimfit-0.15.8/src/stimfit/gui/dlgs/eventdlg.cpp0000775000175000017500000001316213062445067016523 00000000000000#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "./../../stf.h" #include "./eventdlg.h" enum {wxID_COMBOTEMPLATES}; BEGIN_EVENT_TABLE( wxStfEventDlg, wxDialog ) END_EVENT_TABLE() wxStfEventDlg::wxStfEventDlg(wxWindow* parent, const std::vector& templateSections, bool isExtract_, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), m_threshold(4.0), m_mode(stf::criterion), isExtract(isExtract_), m_minDistance(150), m_template(-1) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); wxFlexGridSizer* templateSizer = new wxFlexGridSizer(2,1,0,0); wxStaticText* staticTextTempl = new wxStaticText( this, wxID_ANY, wxT("Select template fit from section:"), wxDefaultPosition, wxDefaultSize, 0 ); templateSizer->Add( staticTextTempl, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxArrayString templateNames; templateNames.Alloc(templateSections.size()); int max_w = 0; for (std::size_t n_templ=0;n_templGetSectionDescription()); if (sec_desc.empty()) { sec_desc = wxT("Section "); sec_desc << n_templ; } int w, h; GetTextExtent( sec_desc, &w, &h ); if ( w > max_w ) max_w = w; templateNames.Add( sec_desc ); } } m_comboBoxTemplates = new wxComboBox( this, wxID_COMBOTEMPLATES, wxT("1"), wxDefaultPosition, wxSize( max_w + 36, 24 ), templateNames, wxCB_DROPDOWN | wxCB_READONLY ); if (templateSections.size()>0) { m_comboBoxTemplates->SetSelection(0); } templateSizer->Add( m_comboBoxTemplates, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); topSizer->Add( templateSizer, 0, wxALIGN_CENTER | wxALL, 5 ); if (isExtract) { wxFlexGridSizer* gridSizer; gridSizer=new wxFlexGridSizer(2,2,0,0); wxStaticText* staticTextThr; staticTextThr = new wxStaticText( this, wxID_ANY, wxT("Threshold:"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextThr, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString def; def << m_threshold; m_textCtrlThr = new wxTextCtrl( this, wxID_ANY, def, wxDefaultPosition, wxSize(40,20), wxTE_RIGHT ); gridSizer->Add( m_textCtrlThr, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxStaticText* staticTextDist; staticTextDist = new wxStaticText( this, wxID_ANY, wxT("Min. distance between events (# points):"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextDist, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString def2; def2 << m_minDistance; m_textCtrlDist = new wxTextCtrl( this, wxID_ANY, def2, wxDefaultPosition, wxSize(40,20), wxTE_RIGHT ); gridSizer->Add( m_textCtrlDist, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); topSizer->Add( gridSizer, 0, wxALIGN_CENTER | wxALL, 5 ); wxString m_radioBoxChoices[] = { wxT("Use template scaling (Clements && Bekkers)"), wxT("Use correlation coefficient (Jonas et al.)"), wxT("Use deconvolution (Pernia-Andrade et al.)") }; int m_radioBoxNChoices = sizeof( m_radioBoxChoices ) / sizeof( wxString ); m_radioBox = new wxRadioBox( this, wxID_ANY, wxT("Select method"), wxDefaultPosition, wxDefaultSize, m_radioBoxNChoices, m_radioBoxChoices, 0, wxRA_SPECIFY_ROWS ); m_radioBox->SetSelection(0); topSizer->Add( m_radioBox, 0, wxALIGN_CENTER | wxALL, 5 ); } m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfEventDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { return; } } wxDialog::EndModal(retCode); } bool wxStfEventDlg::OnOK() { // Read template: m_template=m_comboBoxTemplates->GetCurrentSelection(); if (m_template<0) { wxLogMessage(wxT("Please select a valid template")); return false; } if (isExtract) { // Read entry to string: m_textCtrlThr->GetValue().ToDouble( &m_threshold ); long tempLong; m_textCtrlDist->GetValue().ToLong( &tempLong ); m_minDistance = (int)tempLong; switch (m_radioBox->GetSelection()) { case 0: m_mode = stf::criterion; break; case 1: m_mode = stf::correlation; break; case 2: m_mode = stf::deconvolution; break; } if (m_mode==stf::correlation && (m_threshold<0 || m_threshold>1)) { wxLogMessage(wxT("Please select a value between 0 and 1 for the correlation coefficient")); return false; } } return true; } stimfit-0.15.8/src/stimfit/gui/dlgs/smalldlgs.h0000775000175000017500000006022013062445067016337 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file smalldlgs.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares several small dialogs. */ #ifndef _SMALLDLGS_H #define _SMALLDLGS_H /*! \addtogroup wxstf * @{ */ #include #include #include #include "./../../stf.h" //! Dialog showing file information. class wxStfFileInfoDlg : public wxDialog { DECLARE_EVENT_TABLE() private: wxStdDialogButtonSizer* m_sdbSizer; public: //! Constructor /*! \param parent Pointer to parent window. * \param szGeneral General information. * \param szFile File variables information. * \param szSection Section variable information. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfFileInfoDlg( wxWindow* parent, const std::string& szGeneral, const std::string& szFile, const std::string& szSection, int id = wxID_ANY, wxString title = wxT("File information"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); }; //! Dialog for selecting channels class wxStfChannelSelDlg : public wxDialog { DECLARE_EVENT_TABLE() private: int m_selChannel1, m_selChannel2; wxStdDialogButtonSizer* m_sdbSizer; wxComboBox *m_comboBoxCh1,*m_comboBoxCh2; void OnComboCh1( wxCommandEvent& event ); void OnComboCh2( wxCommandEvent& event ); //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param channelNames A vector containing the channel names. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfChannelSelDlg( wxWindow* parent, const std::vector& channelNames= std::vector(0), int id = wxID_ANY, wxString title = wxT("Select channels"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); //! Get selection for channel 1 /*! \return The index of the first (active) channel */ int GetSelCh1() const {return m_selChannel1;} //! Get selection for channel 2 /*! \return The index of the second (reference) channel */ int GetSelCh2() const {return m_selChannel2;} }; //! Dialog for selecting alignment mode class wxStfAlignDlg : public wxDialog { DECLARE_EVENT_TABLE() private: int m_alignRise; bool m_useReference, m_hasReference; wxCheckBox* m_checkBox; wxRadioBox* m_radioBox; wxStdDialogButtonSizer* m_sdbSizer; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfAlignDlg( wxWindow* parent, bool hasReference, int id = wxID_ANY, wxString title = wxT("Alignment mode"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Indicates whether the average should be aligned to the steepest rise. /*! \return true if it should be aligned to the steepest rise, false if it should be * aligned to the peak. */ int AlignRise() const {return m_alignRise;} //! Indicates whether the reference channel should be used for alignment /*! \return true if the reference channel should be used, false if the active * channel should be used */ bool UseReference() const {return m_useReference;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; //! Dialog for selecting a filter function class wxStfFilterSelDlg : public wxDialog { DECLARE_EVENT_TABLE() private: int m_filterSelect; wxRadioBox* m_radioBox; wxStdDialogButtonSizer* m_sdbSizer; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfFilterSelDlg( wxWindow* parent, int id = wxID_ANY, wxString title = wxT("Filter function"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Get the selected filter function. /*! \return The index of the selected filter function. */ int GetFilterSelect() const {return m_filterSelect;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; //! Dialog for selecting a transform function class wxStfTransformDlg : public wxDialog { DECLARE_EVENT_TABLE() private: int m_fSelect; wxRadioBox* m_radioBox; wxStdDialogButtonSizer* m_sdbSizer; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfTransformDlg( wxWindow* parent, int id = wxID_ANY, wxString title = wxT("Choose function"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Get the selected transform function. /*! \return The index of the selected transform function. */ int GetFSelect() const {return m_fSelect;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; //! Dialog showing information about a fit. class wxStfFitInfoDlg : public wxDialog { DECLARE_EVENT_TABLE() private: wxStdDialogButtonSizer* m_sdbSizer; public: //! Constructor /*! \param parent Pointer to parent window. * \param info A string containing information about the fit. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfFitInfoDlg( wxWindow* parent, const wxString& info, int id = wxID_ANY, wxString title = wxT("Fit information"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); }; //! small struct representing a batch dialog option struct BatchOption { //! Default constructor BatchOption( ) : label( wxT("\0") ), selection(false), index(-1) {} //! Constructor //! \param lab Checkbox label //! \param sel Checkbox status //! \param id Index in dialog BatchOption(const wxString& lab, bool sel, int id) : label(lab), selection(sel), index(id) {} wxString label; //! Checkbox label bool selection; //! Checkbox status int index; //! Index within dialog }; //! Dialog for batch analysis settings. class wxStfBatchDlg : public wxDialog { DECLARE_EVENT_TABLE() private: std::vector batchOptions; wxCheckListBox* m_checkList; wxStdDialogButtonSizer* m_sdbSizer; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); BatchOption LookUp( int index ) const; enum { id_base=0, id_basesd, id_threshold, id_slopethresholdtime, id_peakzero, id_peakbase, id_peakthreshold, id_peaktime, id_rtLoHi, id_innerLoHi, id_outerLoHi, id_t50, id_t50se, id_slopes, id_slopetimes, id_latencies, id_fit, #ifdef WITH_PSLOPE id_pslopes, #endif id_crossings }; public: //! Constructor /*! \param parent Pointer to parent window. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfBatchDlg( wxWindow* parent, int id = wxID_ANY, wxString title = wxT("Choose values"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Indicates whether the baseline should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintBase() const {return LookUp(id_base).selection;} //! Indicates whether the standard deviation of the baseline should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintBaseSD() const {return LookUp(id_basesd).selection;} //! Indicates whether the threshold should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintThreshold() const {return LookUp(id_threshold).selection;} //! Indicates whether the time of slope threshold crossing should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintSlopeThresholdTime() const {return LookUp(id_slopethresholdtime).selection;} //! Indicates whether the peak (from 0) value should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintPeakZero() const {return LookUp(id_peakzero).selection;} //! Indicates whether the peak (from baseline) value should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintPeakBase() const {return LookUp(id_peakbase).selection;} //! Indicates whether the peak value (from threshold) should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintPeakThreshold() const {return LookUp(id_peakthreshold).selection;} //! Indicates whether the peak value (from threshold) should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintPeakTime() const {return LookUp(id_peaktime).selection;} //! Indicates whether the Lo-Hi% rise time should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintRTLoHi() const {return LookUp(id_rtLoHi).selection;} //! Indicates whether the Lo-Hi% inner rise time should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintInnerRTLoHi() const {return LookUp(id_innerLoHi).selection;} //! Indicates whether the Lo-Hi% inner rise time should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintOuterRTLoHi() const {return LookUp(id_outerLoHi).selection;} //! Indicates whether the half amplitude duration should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintT50() const {return LookUp(id_t50).selection;} //! Indicates whether the start and end time for half amplitude should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintT50SE() const {return LookUp(id_t50se).selection;} //! Indicates whether the maximal slopes should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintSlopes() const {return LookUp(id_slopes).selection;} //! Indicates whether the peak value (from threshold) should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintSlopeTimes() const {return LookUp(id_slopetimes).selection;} #ifdef WITH_PSLOPE //! Indicates whether the slopes should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintPSlopes() const {return LookUp(id_pslopes).selection;} #endif //! Indicates whether a threshold crossing should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintThr() const {return LookUp(id_crossings).selection;} //! Indicates whether the latency should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintLatencies() const {return LookUp(id_latencies).selection;} //! Indicates whether the fit results should be printed in the batch analysis table. /*! \return true if it should be printed, false otherwise. */ bool PrintFitResults() const {return LookUp(id_fit).selection;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; //! Dialog for setting printout options. class wxStfPreprintDlg : public wxDialog { DECLARE_EVENT_TABLE() private: bool m_gimmicks,m_isFile; int m_downsampling; wxStdDialogButtonSizer* m_sdbSizer; wxCheckBox* m_checkBox; wxTextCtrl* m_textCtrl; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param isFile Set this to true if something should be printed to a file. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfPreprintDlg( wxWindow* parent, bool isFile=false, int id = wxID_ANY, wxString title = wxT("Settings"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Indicates whether gimmicks (cursors, results table etc.) sould be printed. /*! \return true if gimmicks should be printed. */ bool GetGimmicks() const {return m_gimmicks;} //! Prints every n-th point. /*! \return If the return value \e n > 1, every n-th point will be printed. */ int GetDownSampling() const {return m_downsampling;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; //! Dialog for setting the parameters of a Gaussian function. class wxStfGaussianDlg : public wxDialog { DECLARE_EVENT_TABLE() private: double m_width; double m_center; double m_amp; wxStdDialogButtonSizer* m_sdbSizer; wxSlider* m_slider; wxTextCtrl *m_textCtrlCenter, *m_textCtrlWidth; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfGaussianDlg( wxWindow* parent, int id = wxID_ANY, wxString title = wxT("Settings for Gaussian function"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Get the width of the Gaussian. /*! \return The width of the Gaussian. */ double Width() const {return m_width;} //! Get the center of the Gaussian. /*! \return The center of the Gaussian. */ double Center() const {return m_center;} //! Get the amplitude of the Gaussian. /*! \return The amplitude of the Gaussian. */ double Amp() const {return m_amp;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; //! Dialog for text import filter settings. class wxStfTextImportDlg : public wxDialog { DECLARE_EVENT_TABLE() private: int m_hLines; bool m_toSection; bool m_firstIsTime; bool m_isSeries; int m_ncolumns; double m_sr; wxString m_yUnits; wxString m_yUnitsCh2; wxString m_xUnits; bool m_applyToAll; void disableSenseless(); wxStdDialogButtonSizer* m_sdbSizer; wxTextCtrl *m_textCtrlHLines, *m_textCtrlYUnits, *m_textCtrlYUnitsCh2, *m_textCtrlXUnits, *m_textCtrlSR; wxComboBox *m_comboBoxNcolumns,*m_comboBoxFirsttime,*m_comboBoxSecorch; wxCheckBox *m_checkBoxApplyToAll; void OnComboNcolumns( wxCommandEvent& event ); void OnComboFirsttime( wxCommandEvent& event ); void OnComboSecorch( wxCommandEvent& event ); //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param textPreview The preview text to be shown. * \param hLines_ The number of header lines that are initially set. * \param isSeries Set this to true for file series so that they can * be batch-opened. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfTextImportDlg( wxWindow* parent, const wxString& textPreview=wxT("\0"), int hLines_=1, bool isSeries=false, int id = wxID_ANY, wxString title = wxT("Text file import settings"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Get the number of header lines. /*! \return The number of header lines. */ int GetHLines() const {return m_hLines;} //! Indicates whether columns should be put into section or into channels. /*! \return true if they should be put into sections. */ bool ToSection() const {return m_toSection;} //! Indicates whether the first column contains time values. /*! \return true is the first column contains time values. */ bool FirstIsTime() const {return m_firstIsTime;} //! Get the number of columns. /*! \return The number of columns. */ int GetNColumns() const {return m_ncolumns;} //! Get the sampling rate. /*! \return The sampling rate. */ double GetSR() const {return m_sr;} //! Get the y units of the first channel. /*! \return The y units of the first channel. */ const wxString& GetYUnits() const {return m_yUnits;} //! Get the y units of the second channel. /*! \return The y units of the second channel. */ const wxString& GetYUnitsCh2() const {return m_yUnitsCh2;} //! Get the x units. /*! \return The x units. */ const wxString& GetXUnits() const {return m_xUnits;} //! Indicates whether the settings apply to all files in a series. /*! \return true if the settings apply to all files. */ bool ApplyToAll() const {return m_applyToAll;} //! Get the text import filter settings struct. /*! \return The stf::txtImportSettings struct. */ stfio::txtImportSettings GetTxtImport() const; //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; class wxDirPickerCtrl; class wxListCtrl; //! Dialog for re-ordering channels before saving to file class wxStfOrderChannelsDlg : public wxDialog { DECLARE_EVENT_TABLE() private: wxListCtrl* m_List; std::vector channelOrder; void OnUparrow( wxCommandEvent& event ); void OnDownarrow( wxCommandEvent& event ); void SwapItems(long itemId1, long itemId2); //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param channelNames A vector containing channel names. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfOrderChannelsDlg( wxWindow* parent, const std::vector& channelNames= std::vector(0), int id = wxID_ANY, wxString title = wxT("Re-order channels"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Get the new channel order. /*! \return A vector of newly ordered channel indices. */ std::vector GetChannelOrder() const {return channelOrder;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; /* @} */ #endif stimfit-0.15.8/src/stimfit/gui/dlgs/cursorsdlg.h0000775000175000017500000003353013062445067016550 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file cursorsdlg.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfCursorsDlg. */ #ifndef _CURSORSDLG_H #define _CURSORSDLG_H /*! \addtogroup wxstf * @{ */ #include "./../../stf.h" #include #include #include #include #include class wxStfDoc; //! Cursor settings non-modal dialog class StfDll wxStfCursorsDlg : public wxDialog { DECLARE_EVENT_TABLE() private: wxNotebookPage* CreateMeasurePage(); wxNotebookPage* CreatePeakPage(); wxNotebookPage* CreateBasePage(); wxNotebookPage* CreateDecayPage(); wxNotebookPage* CreateLatencyPage(); #ifdef WITH_PSLOPE wxNotebookPage* CreatePSlopePage(); #endif wxFlexGridSizer* CreateCursorInput( wxPanel* nbPage, wxWindowID textC1, wxWindowID textC2, wxWindowID comboU1, wxWindowID comboU2, std::size_t c1, std::size_t c2 ); int ReadCursor(wxWindowID textId, bool isTime) const; void WriteCursor(wxWindowID textID, bool isTime, long cursor) const; int ReadDeltaT(wxWindowID textId) const; void UpdateUnits(wxWindowID comboId, bool& setTime, wxWindowID textID); bool cursorMIsTime, cursor1PIsTime,cursor2PIsTime, cursor1BIsTime,cursor2BIsTime, cursor1DIsTime,cursor2DIsTime, #ifdef WITH_PSLOPE cursor1PSIsTime,cursor2PSIsTime, #endif cursor1LIsTime,cursor2LIsTime; wxStfDoc* actDoc; wxNotebook* m_notebook; void OnPageChanged( wxNotebookEvent& event ); void OnComboBoxUM( wxCommandEvent& event ); void OnComboBoxU1P( wxCommandEvent& event ); void OnComboBoxU2P( wxCommandEvent& event ); void OnComboBoxU1B( wxCommandEvent& event ); void OnComboBoxU2B( wxCommandEvent& event ); void OnComboBoxU1D( wxCommandEvent& event ); void OnComboBoxU2D( wxCommandEvent& event ); void OnComboBoxU1L( wxCommandEvent& event ); void OnComboBoxU2L( wxCommandEvent& event ); #ifdef WITH_PSLOPE void OnComboBoxU1PS( wxCommandEvent& event ); void OnComboBoxU2PS( wxCommandEvent& event ); #endif void OnRadioLatManualBeg( wxCommandEvent& event ); void OnRadioLatManualEnd( wxCommandEvent& event ); void OnRadioLatNonManualBeg( wxCommandEvent& event ); void OnRadioLatNonManualEnd( wxCommandEvent& event ); #ifdef WITH_PSLOPE void OnRadioPSManBeg( wxCommandEvent& event ); void OnRadioPSEventBeg( wxCommandEvent& event ); void OnRadioPSThrBeg( wxCommandEvent& event ); void OnRadioPSt50Beg( wxCommandEvent& event ); void OnRadioPSManEnd( wxCommandEvent& event ); void OnRadioPSt50End( wxCommandEvent& event ); void OnRadioPSDeltaT( wxCommandEvent& event ); void OnRadioPSPeakEnd( wxCommandEvent& event ); #endif void OnRadioAll( wxCommandEvent& event ); void OnRadioMean( wxCommandEvent& event ); void OnPeakcalcexec( wxCommandEvent& event ); void OnLoadCursorConf( wxCommandEvent& event ); void OnSaveCursorConf( wxCommandEvent& event ); void OnBasetoslope( wxCommandEvent& event ); void OnRTSlider( wxScrollEvent& event ); void OnPeakAtEnd( wxCommandEvent& event ); void OnStartFitAtPeak( wxCommandEvent& event ); //! check the syntax of csr config files and return true if the syntax is correct. /*! \param crs_file, a crs config file */ bool IsCSRSyntax( wxFileConfig* crs_file ); //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param initDoc Pointer to the document the call originated from. * \param id Window id. * \param title Dialog title. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfCursorsDlg( wxWindow* parent, wxStfDoc* initDoc, int id = wxID_ANY, wxString title = wxT("Cursor settings"), wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); //! Called when data should be transferred from the non-modal dialog (e.g. when OK is pressed) /*! Note that a non-modal dialog won't be destroyed when OK is clicked, * it will only disappear from sight. This function will then apply the current * cursor settings and update the results table. * \return The return value of the base class version wxWindow::TransferDataFromWindow() */ virtual bool TransferDataFromWindow(); //! Get the measurement cursor x-position /*! \return The measurement cursor x-position in units of sampling points. */ int GetCursorM() const; //! Get the left peak cursor x-position /*! \return The left peak cursor x-position in units of sampling points. */ int GetCursor1P() const; //! Get the right peak cursor x-position /*! \return The right peak cursor x-position in units of sampling points. */ int GetCursor2P() const; //! Get the left base cursor x-position /*! \return The left base cursor x-position in units of sampling points. */ int GetCursor1B() const; //! Get the right base cursor x-position /*! \return The right base cursor x-position in units of sampling points. */ int GetCursor2B() const; //! Get the left fit cursor x-position /*! \return The left fit cursor x-position in units of sampling points. */ int GetCursor1D() const; //! Get the right fit cursor x-position /*! \return The right fit cursor x-position in units of sampling points. */ int GetCursor2D() const; //! Get the left latency cursor x-position /*! \return The left fit cursor x-position in units of sampling points. */ int GetCursor1L() const; //! Get the right latency cursor x-position /*! \return The right fit cursor x-position in units of sampling points. */ int GetCursor2L() const; #ifdef WITH_PSLOPE //! Get the left PSlope cursor x-position /*! \return The left fit cursor x-position in units of sampling points. */ int GetCursor1PS() const; //! Get the right PSlope cursor x-position /*! \return The right fit cursor x-position in units of sampling points. */ int GetCursor2PS() const; #endif //! Gets the number of points used for the binned average during peak detection. /*! \return The number of points used for the binned average during peak detection. */ int GetPeakPoints() const; //! Gets the lower factor (e.g 20) used to calculate the rise time. /*! \return The lower value of the percentage (e.g 20) to calculate the rise time. */ int GetRTFactor() const; //! Sets whether the right peak cursor should be at the end of the trace. /*! \param is_end true if the peak cursor is at the end of the trace, false otherwise. */ void SetPeakAtEnd( bool is_end); //! Sets the number of points used for the binned average during peak detection. /*! \param peakPoints The number of points used for the binned average during peak detection. */ void SetPeakPoints(int peakPoints); //! Set the lower value (e.g 20) to compute the rise-time. The high value is simply 100-lower value. /*! \param RTFactor is the lower value (e.g 20) . */ void SetRTFactor(int RTFactor); //! Gets the distance to the first PSlope cursor in number of points. /*! \return The distance to the first PSlope cursor in number of points. */ int GetDeltaT() const; //! Sets the number of points used for the distance from the first PSlope cursor. /*! \param peakPoints The number of points used for the distance from the first PSlope cursor. */ void SetDeltaT(int DeltaT); //! Sets whether the left decay cursor should be at the peak of the trace. /*! \param is_peak true if the decay cursor is at the peak of the trace, false otherwise. */ void SetStartFitAtPeak( bool is_peak); //! Gets the direction of peak calculations. /*! \return The current direction of peak calculations. */ stfnum::direction GetDirection() const; //! Gets the mode of Latency for the beginning of the latency cursor. /*! \return The current mode for the beginning latency cursor. */ stf::latency_mode GetLatencyStartMode() const; //! Gets the mode of Latency of the last latency cursor. /*! \return The current mode of the last latency cursor. */ stf::latency_mode GetLatencyEndMode() const; //! Sets the latency mode of the left latency cursor. /*! \param latencyBegMode: the new mode for the left latency cursor. */ void SetLatencyStartMode(stf::latency_mode latencyBegMode); //! Sets the latency mode of the right latency cursor. /*! \param latencyEndMode: the new mode for the right latency cursor. */ void SetLatencyEndMode(stf::latency_mode latencyEndMode); #ifdef WITH_PSLOPE //! Gets the mode of measure for the beginning of the slope cursor. /*! \return The current mode for the beginning slope cursor. */ stf::pslope_mode_beg GetPSlopeBegMode() const; //! Gets the mode of measure for the end of the slope cursor. /*! \return The current mode for the end slope cursor. */ stf::pslope_mode_end GetPSlopeEndMode() const; #endif // WITH_PSLOPE //! Indicates whether to use the baseline as a reference for AP kinetics. /*! \return true if the baseline should be used, false if the threshold should be used. */ bool GetFromBase() const; //! Sets the direction of peak calculations. /*! \param direction The new direction of peak calculations. */ void SetDirection(stfnum::direction direction); #ifdef WITH_PSLOPE //! Sets the mode of the right slope cursor. /*! \param pslopeEndMode The new mode for the slope cursor. */ void SetPSlopeEndMode(stf::pslope_mode_end pslopeEndMode); //! Sets the mode of the left slope cursor. /*! \param pslopeBegMode The new mode for the slope cursor. */ void SetPSlopeBegMode(stf::pslope_mode_beg pslopeBegMode); #endif // WITH_PSLOPE //! Sets the reference for AP kinetics measurements. /*! \param frombase true if the baseline should be used, false if the threshold should be used. */ void SetFromBase(bool frombase); //! Sets the reference for baseline measurement. /*! \param median true if the median should be used, false if the average is used. */ void SetBaselineMethod(enum stfnum::baseline_method); //! Indiates whether baseline is computed as mean or as median. /*! \param false indicates computing average (mean & s.d.), 1 indicates median & iqr. */ enum stfnum::baseline_method GetBaselineMethod() const; //! Indicates whether the right peak cursor should always be at the end of the trace. /*! \return true if the peak cursor should always be at the end of the trace. */ bool GetPeakAtEnd() const; //! Indicates whether to always start a fit at the current peak position. /*! \return true if the fit should always be started at the current peak position. */ bool GetStartFitAtPeak() const; //! Updates the cursor entries in the Cursors Settings menu. void UpdateCursors(); //! Retrieve the current cursor notebook page. /*! \return The cursor corresponding to the currently selected notebook page. */ stf::cursor_type CurrentCursor() const; //! Get the slope at which the baseline should be fixed. /*! \return The slope at which the baseline should be fixed. */ double GetSlope() const; //! Set the threshold slope. /*! \param slope The new threshold slope. */ void SetSlope( double slope ); //! Set the units of the slope. /*! \param units The units of the slope. */ void SetSlopeUnits(const wxString& units); //! Indicates whether the baseline should be fixed to a certain slope. /*! \return true if the baseline should be fixed, false otherwise. */ bool GetBaseToSlope() const; //! Indicates whether an additional vertical ruler is drawn through the measurement cursor. /*! \return true if an additional ruler should be drawn. */ bool GetRuler() const; //! Sets whether an additional vertical ruler should be drawn through the measurement cursor. /*! \param value true if an additional ruler should be drawn, false otherwise. */ void SetRuler(bool value); //! Load a cursor configuration file (*csr) in the Cursor Settings menu. /*! \param filepath The path where the csr file is located. */ bool LoadCursorConf( const wxString& filepath ); //! Save a cursor configuration file (*csr) from the Cursor Settings menu. /*! \param filepath The path where the csr file will be saved */ bool SaveCursorConf( const wxString& filepath ); //! Sets the currently active document. /*! \param actDoc_ A pointer to the currently active document. */ void SetActiveDoc(wxStfDoc* actDoc_) { actDoc = actDoc_; } }; /* @} */ #endif stimfit-0.15.8/src/stimfit/gui/dlgs/smalldlgs.cpp0000775000175000017500000011514313062445067016677 00000000000000#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "./../../res/arrow_down.xpm" #include "./../../res/arrow_up.xpm" #include "./../app.h" #include "./smalldlgs.h" BEGIN_EVENT_TABLE( wxStfFileInfoDlg, wxDialog ) END_EVENT_TABLE() wxStfFileInfoDlg::wxStfFileInfoDlg( wxWindow* parent, const std::string& szGeneral, const std::string& szFile, const std::string& szSection, int id, wxString title, wxPoint pos, wxSize size, int style ) : wxDialog( parent, id, title, pos, size, style ) { // this->SetSize(464,464); wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); wxString wxs = stf::std2wx(szGeneral); wxTextCtrl* textCtrlGeneral = new wxTextCtrl( this, wxID_ANY, wxs, wxDefaultPosition, wxSize(640,100), wxTE_MULTILINE | wxTE_DONTWRAP | wxTE_READONLY ); topSizer->Add( textCtrlGeneral, 0, wxALL, 5 ); wxBoxSizer* subSizer; subSizer = new wxBoxSizer( wxHORIZONTAL ); wxTextCtrl* textCtrlFile = new wxTextCtrl( this, wxID_ANY, stf::std2wx(szFile), wxDefaultPosition, wxSize(416,400), wxTE_MULTILINE | wxTE_DONTWRAP | wxTE_READONLY ); subSizer->Add( textCtrlFile, 0, wxALL, 5 ); wxTextCtrl* textCtrlSection = new wxTextCtrl( this, wxID_ANY, stf::std2wx(szSection), wxDefaultPosition, wxSize(214,400), wxTE_MULTILINE | wxTE_DONTWRAP | wxTE_READONLY ); subSizer->Add( textCtrlSection, 0, wxALL, 5 ); topSizer->Add( subSizer, 0, wxALIGN_CENTER, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } #define wxCOMBOCH1 1000 #define wxCOMBOCH2 1001 BEGIN_EVENT_TABLE( wxStfChannelSelDlg, wxDialog ) EVT_COMBOBOX( wxCOMBOCH1, wxStfChannelSelDlg::OnComboCh1 ) EVT_COMBOBOX( wxCOMBOCH2, wxStfChannelSelDlg::OnComboCh2 ) END_EVENT_TABLE() wxStfChannelSelDlg::wxStfChannelSelDlg( wxWindow* parent, const std::vector& channelNames, int id, wxString title, wxPoint pos, wxSize size, int style ) : wxDialog( parent, id, title, pos, size, style ), m_selChannel1(0), m_selChannel2(1) { wxArrayString strArray; strArray.Alloc(channelNames.size()); for (c_wxs_it cit = channelNames.begin(); cit != channelNames.end(); cit++) { strArray.Add( *cit ); } wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); // Add static boxes and combo boxes: wxStaticBoxSizer* ch1Sizer; ch1Sizer = new wxStaticBoxSizer( new wxStaticBox( this, -1, wxT("Select active channel:") ), wxVERTICAL ); m_comboBoxCh1 = new wxComboBox( this, wxCOMBOCH1, channelNames[0], wxDefaultPosition, wxSize(128,20), strArray, wxCB_DROPDOWN | wxCB_READONLY ); ch1Sizer->Add( m_comboBoxCh1, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); topSizer->Add( ch1Sizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); wxStaticBoxSizer* ch2Sizer; ch2Sizer = new wxStaticBoxSizer( new wxStaticBox( this, -1, wxT("Select second channel:") ), wxVERTICAL ); m_comboBoxCh2 = new wxComboBox( this, wxCOMBOCH2, channelNames[1], wxDefaultPosition, wxSize(128,20), strArray, wxCB_DROPDOWN | wxCB_READONLY ); ch2Sizer->Add( m_comboBoxCh2, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); topSizer->Add( ch2Sizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); m_comboBoxCh1->SetSelection(0); m_comboBoxCh2->SetSelection(1); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfChannelSelDlg::OnComboCh1( wxCommandEvent& event ) { event.Skip(); if (m_comboBoxCh1->GetCurrentSelection()==m_comboBoxCh2->GetCurrentSelection()) { // correct selection: for (int n_c=0;n_c<(int)m_comboBoxCh1->GetCount();++n_c) { if (n_c!=m_comboBoxCh1->GetCurrentSelection()) { m_comboBoxCh2->SetSelection(n_c); break; } } } } void wxStfChannelSelDlg::OnComboCh2( wxCommandEvent& event ) { event.Skip(); if (m_comboBoxCh2->GetCurrentSelection()==m_comboBoxCh1->GetCurrentSelection()) { // correct selection: for (int n_c=0;n_c<(int)m_comboBoxCh2->GetCount();++n_c) { if (n_c!=m_comboBoxCh2->GetCurrentSelection()) { m_comboBoxCh1->SetSelection(n_c); break; } } } } void wxStfChannelSelDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxGetApp().ErrorMsg(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfChannelSelDlg::OnOK() { m_selChannel1 = m_comboBoxCh1->GetCurrentSelection(); m_selChannel2 = m_comboBoxCh2->GetCurrentSelection(); return true; } BEGIN_EVENT_TABLE( wxStfAlignDlg, wxDialog ) END_EVENT_TABLE() wxStfAlignDlg::wxStfAlignDlg(wxWindow* parent, bool hasReference, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), m_alignRise(0), m_useReference(true), m_hasReference(hasReference) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); if (m_hasReference) { m_checkBox=new wxCheckBox( this, wxID_ANY, wxT("Use reference channel"), wxDefaultPosition, wxDefaultSize, 0 ); m_checkBox->SetValue(true); topSizer->Add( m_checkBox, 0, wxALIGN_LEFT | wxALL, 5 ); } wxString m_radioBoxChoices[] = { wxT("peak"), wxT("steepest slope during rise"), wxT("half amplitude"), wxT("onset") }; int m_radioBoxNChoices = sizeof( m_radioBoxChoices ) / sizeof( wxString ); m_radioBox = new wxRadioBox( this, wxID_ANY, wxT("Alignment point"), wxDefaultPosition, wxDefaultSize, m_radioBoxNChoices, m_radioBoxChoices, m_radioBoxNChoices, wxRA_SPECIFY_ROWS); topSizer->Add( m_radioBox, 0, wxALL, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfAlignDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfAlignDlg::OnOK() { m_alignRise = m_radioBox->GetSelection(); if (m_hasReference) { m_useReference = m_checkBox->IsChecked(); } else { m_useReference = false; } return true; } BEGIN_EVENT_TABLE( wxStfFilterSelDlg, wxDialog ) END_EVENT_TABLE() wxStfFilterSelDlg::wxStfFilterSelDlg(wxWindow* parent, int id, wxString title, wxPoint pos, wxSize size,int style) : wxDialog( parent, id, title, pos, size, style ), m_filterSelect(0) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); wxString m_radioBoxChoices[] = { wxT("Notch (inverted Gaussian)"), wxT("Low pass (4th-order Bessel)"), wxT("Low pass (Gaussian)") }; int m_radioBoxNChoices = sizeof( m_radioBoxChoices ) / sizeof( wxString ); m_radioBox = new wxRadioBox( this, wxID_ANY, wxT("Select filter function"), wxDefaultPosition, wxDefaultSize, m_radioBoxNChoices, m_radioBoxChoices, 3, wxRA_SPECIFY_ROWS ); topSizer->Add( m_radioBox, 0, wxALL, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfFilterSelDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfFilterSelDlg::OnOK() { m_filterSelect=m_radioBox->GetSelection()+1; return true; } BEGIN_EVENT_TABLE( wxStfTransformDlg, wxDialog ) END_EVENT_TABLE() wxStfTransformDlg::wxStfTransformDlg(wxWindow* parent, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), m_fSelect(0) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); wxString m_radioBoxChoices[] = { wxT(" ln(x) ") }; int m_radioBoxNChoices = sizeof( m_radioBoxChoices ) / sizeof( wxString ); m_radioBox = new wxRadioBox( this, wxID_ANY, wxT("Select function"), wxDefaultPosition, wxDefaultSize, m_radioBoxNChoices, m_radioBoxChoices, 0, wxRA_SPECIFY_ROWS ); topSizer->Add( m_radioBox, 0, wxALIGN_CENTER | wxALL, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfTransformDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfTransformDlg::OnOK() { m_fSelect=m_radioBox->GetSelection()+1; return true; } BEGIN_EVENT_TABLE( wxStfFitInfoDlg, wxDialog ) END_EVENT_TABLE() wxStfFitInfoDlg::wxStfFitInfoDlg(wxWindow* parent, const wxString& info, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); wxTextCtrl* m_textCtrl; m_textCtrl=new wxTextCtrl( this, wxID_ANY, info, wxDefaultPosition, wxSize(320,120), wxTE_MULTILINE | wxTE_READONLY | wxTE_DONTWRAP ); topSizer->Add( m_textCtrl, 0, wxALIGN_CENTER | wxALL, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } BEGIN_EVENT_TABLE( wxStfBatchDlg, wxDialog ) END_EVENT_TABLE() wxStfBatchDlg::wxStfBatchDlg(wxWindow* parent, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, wxT("Choose values"), pos, size, style ), batchOptions( 0 ) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); batchOptions.push_back( BatchOption( wxT("Base"), true, id_base ) ); batchOptions.push_back( BatchOption( wxT("Base SD"), false, id_basesd ) ); batchOptions.push_back( BatchOption( wxT("Threshold"), true, id_threshold ) ); batchOptions.push_back( BatchOption( wxT("time of slope threshold crossing"), false, id_slopethresholdtime ) ); batchOptions.push_back( BatchOption( wxT("Peak (from 0)"), true, id_peakzero ) ); batchOptions.push_back( BatchOption( wxT("Peak (from base)"), true, id_peakbase ) ); batchOptions.push_back( BatchOption( wxT("Peak (from threshold)"), true, id_peakthreshold ) ); batchOptions.push_back( BatchOption( wxT("Peak time"), true, id_peaktime ) ); batchOptions.push_back( BatchOption( wxT("Lo-Hi% risetime"), false, id_rtLoHi ) ); batchOptions.push_back( BatchOption( wxT("inner risetime"), false, id_innerLoHi ) ); batchOptions.push_back( BatchOption( wxT("outer risetime"), false, id_outerLoHi ) ); batchOptions.push_back( BatchOption( wxT("Half amplitude duration"), false, id_t50 ) ); batchOptions.push_back( BatchOption( wxT("start and end time of half amplitude"), false, id_t50se ) ); batchOptions.push_back( BatchOption( wxT("Max slopes"), false, id_slopes ) ); batchOptions.push_back( BatchOption( wxT("Max slope times"), false, id_slopetimes ) ); batchOptions.push_back( BatchOption( wxT("Latencies"), false, id_latencies ) ); batchOptions.push_back( BatchOption( wxT("Fit results"), false, id_fit ) ); #ifdef WITH_PSLOPE batchOptions.push_back( BatchOption( wxT("pSlope"), false, id_pslopes ) ); #endif batchOptions.push_back( BatchOption( wxT("Threshold crossings"), false, id_crossings ) ); std::vector::const_iterator bo_it; std::vector checkListChoices(batchOptions.size()); for (bo_it = batchOptions.begin(); bo_it != batchOptions.end(); ++bo_it) { try { checkListChoices.at(bo_it->index) = bo_it->label; } catch (const std::out_of_range& e) { wxString errorMsg( wxT("Error while populating checkbox list:\n") ); errorMsg += wxString(e.what(), wxConvLocal); wxGetApp().ExceptMsg( errorMsg ); } }; m_checkList = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxSize(280,350), checkListChoices.size(), &checkListChoices[0], 0 ); for (bo_it = batchOptions.begin(); bo_it != batchOptions.end(); ++bo_it) { m_checkList->Check(bo_it->index, wxGetApp().wxGetProfileInt( wxT("Batch Dialog"), bo_it->label, bo_it->selection) ); } topSizer->Add( m_checkList, 0, wxALIGN_CENTER | wxALL, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfBatchDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfBatchDlg::OnOK() { std::vector::iterator bo_it; for (bo_it = batchOptions.begin(); bo_it != batchOptions.end(); ++bo_it) { bo_it->selection = m_checkList->IsChecked( bo_it->index ); wxGetApp().wxWriteProfileInt( wxT("Batch Dialog"), bo_it->label, bo_it->selection ); } return true; } BatchOption wxStfBatchDlg::LookUp( int index ) const { std::vector::const_iterator bo_it; for (bo_it = batchOptions.begin(); bo_it != batchOptions.end(); ++bo_it) { if ( bo_it->index == index ) { return *bo_it; } } return BatchOption( wxT(""), false, -1 ); } BEGIN_EVENT_TABLE( wxStfPreprintDlg, wxDialog ) END_EVENT_TABLE() wxStfPreprintDlg::wxStfPreprintDlg(wxWindow* parent, bool isFile_, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), m_gimmicks(true), m_isFile(isFile_), m_downsampling(1) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); if (!m_isFile) { m_checkBox=new wxCheckBox( this, wxID_ANY, wxT("Print gimmicks (Cursors etc.)"), wxDefaultPosition, wxDefaultSize, 0 ); m_checkBox->SetValue(true); topSizer->Add( m_checkBox, 0, wxALIGN_LEFT | wxALL, 5 ); } wxFlexGridSizer* gridSizer; gridSizer=new wxFlexGridSizer(1,2,0,0); wxStaticText* staticText; staticText=new wxStaticText( this, wxID_ANY, wxT("Print every n-th point:"), wxDefaultPosition, wxSize(112,20), 0 ); gridSizer->Add( staticText, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString def; def << 1; m_textCtrl=new wxTextCtrl( this, wxID_ANY, def, wxDefaultPosition, wxSize(32,20), wxTE_RIGHT ); gridSizer->Add( m_textCtrl, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); topSizer->Add( gridSizer, 0, wxALIGN_CENTER | wxALL, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfPreprintDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfPreprintDlg::OnOK() { if (!m_isFile) { m_gimmicks=m_checkBox->IsChecked(); } else { m_gimmicks=false; } // Read entry to string: wxString entry = m_textCtrl->GetValue(); long tempLong; entry.ToLong( &tempLong ); m_downsampling = (int) tempLong; return true; } BEGIN_EVENT_TABLE( wxStfGaussianDlg, wxDialog ) END_EVENT_TABLE() wxStfGaussianDlg::wxStfGaussianDlg(wxWindow* parent, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), m_width(0.001), m_center(0.05), m_amp(1.0) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); wxFlexGridSizer *gridSizer; gridSizer=new wxFlexGridSizer(3,2,0,0); wxStaticText* staticTextAmp; staticTextAmp=new wxStaticText( this, wxID_ANY, wxT("Amplitude:"), wxDefaultPosition, wxDefaultSize, 0); gridSizer->Add( staticTextAmp, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); m_slider = new wxSlider( this, wxID_ANY, 100, 0, 100, wxDefaultPosition, wxSize(128,-1), wxSL_HORIZONTAL ); gridSizer->Add( m_slider, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxStaticText* staticTextCenter; staticTextCenter=new wxStaticText( this, wxID_ANY, wxT("Center (kHz):"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextCenter, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString def; def << m_center; m_textCtrlCenter=new wxTextCtrl( this, wxID_ANY, def, wxDefaultPosition, wxSize(40,20), wxTE_RIGHT ); gridSizer->Add( m_textCtrlCenter, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxStaticText* staticTextWidth; staticTextWidth=new wxStaticText( this, wxID_ANY, wxT("Width (kHz):"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextWidth, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString def2; def2 << m_width; m_textCtrlWidth=new wxTextCtrl( this, wxID_ANY, def2, wxDefaultPosition, wxSize(40,20), wxTE_RIGHT ); gridSizer->Add( m_textCtrlWidth, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); topSizer->Add( gridSizer, 0, wxALIGN_CENTER | wxALL, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfGaussianDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfGaussianDlg::OnOK() { m_amp=m_slider->GetValue() / 100.0; // Read entry to string: wxString entryCenter = m_textCtrlCenter->GetValue(); entryCenter.ToDouble( &m_center ); wxString entryWidth = m_textCtrlWidth->GetValue(); entryWidth.ToDouble( &m_width ); return true; } #define wxCOMBONCOLUMNS 1000 #define wxCOMBOFIRSTTIME 1001 #define wxCOMBOSECORCH 1002 BEGIN_EVENT_TABLE( wxStfTextImportDlg, wxDialog ) EVT_COMBOBOX( wxCOMBONCOLUMNS, wxStfTextImportDlg::OnComboNcolumns ) EVT_COMBOBOX( wxCOMBOFIRSTTIME, wxStfTextImportDlg::OnComboFirsttime ) EVT_COMBOBOX( wxCOMBOSECORCH, wxStfTextImportDlg::OnComboSecorch ) END_EVENT_TABLE() wxStfTextImportDlg::wxStfTextImportDlg(wxWindow* parent, const wxString& textPreview, int hLines_, bool isSeries, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), m_hLines(hLines_),m_toSection(true), m_firstIsTime(true),m_isSeries(isSeries),m_ncolumns(2), m_sr(20),m_yUnits(wxT("mV")),m_yUnitsCh2(wxT("pA")),m_xUnits(wxT("ms")) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); wxFlexGridSizer *gridSizer; gridSizer=new wxFlexGridSizer(4,4,0,10); // Header lines------------------------------------------------------ wxStaticText* staticTextHLines; staticTextHLines=new wxStaticText( this, wxID_ANY, wxT("Header lines to skip:"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextHLines, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString strHLines; strHLines << m_hLines; m_textCtrlHLines=new wxTextCtrl( this, wxID_ANY, strHLines, wxDefaultPosition, wxSize(64,20), wxTE_RIGHT ); gridSizer->Add( m_textCtrlHLines, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Number of columns------------------------------------------------- wxStaticText* staticTextNcolumns; staticTextNcolumns=new wxStaticText( this, wxID_ANY, wxT("Number of columns:"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextNcolumns, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString szNcolumns[] = { wxT("1"), wxT("2"), wxT("3") }; int szNcolumnsSize = sizeof( szNcolumns ) / sizeof( wxString ); m_comboBoxNcolumns = new wxComboBox( this, wxCOMBONCOLUMNS, wxT("1"), wxDefaultPosition, wxSize(64,20), szNcolumnsSize, szNcolumns, wxCB_DROPDOWN | wxCB_READONLY ); gridSizer->Add( m_comboBoxNcolumns, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Type of first column--------------------------------------------- wxStaticText* staticTextFirsttime; staticTextFirsttime=new wxStaticText( this, wxID_ANY, wxT("First column is time:"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextFirsttime, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString szFirsttime[] = { wxT("Yes"), wxT("No"), }; int szFirsttimeSize = sizeof( szFirsttime ) / sizeof( wxString ); m_comboBoxFirsttime = new wxComboBox( this, wxCOMBOFIRSTTIME, wxT("Yes"), wxDefaultPosition, wxSize(64,20), szFirsttimeSize, szFirsttime, wxCB_DROPDOWN | wxCB_READONLY ); gridSizer->Add( m_comboBoxFirsttime, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Read into sections or channels----------------------------------- wxStaticText* staticTextSecorch; staticTextSecorch=new wxStaticText( this, wxID_ANY, wxT("Read columns into:"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextSecorch, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString szSecorch[] = { wxT("Sections"), wxT("Channels"), }; int szSecorchSize = sizeof( szSecorch ) / sizeof( wxString ); m_comboBoxSecorch = new wxComboBox( this, wxCOMBOSECORCH, wxT("Sections"), wxDefaultPosition, wxSize(64,20), szSecorchSize, szSecorch, wxCB_DROPDOWN | wxCB_READONLY ); gridSizer->Add( m_comboBoxSecorch, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Y units----------------------------------------------------------- wxStaticText* staticTextYUnits; staticTextYUnits=new wxStaticText( this, wxID_ANY, wxT("Y units:"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextYUnits, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); m_textCtrlYUnits=new wxTextCtrl( this, wxID_ANY, m_yUnits, wxDefaultPosition, wxSize(64,20), wxTE_LEFT ); gridSizer->Add( m_textCtrlYUnits, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Y units of channel 2---------------------------------------------- wxStaticText* staticTextYUnitsCh2; staticTextYUnitsCh2=new wxStaticText( this, wxID_ANY, wxT("Y units, channel 2:"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextYUnitsCh2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); m_textCtrlYUnitsCh2=new wxTextCtrl( this, wxID_ANY, m_yUnitsCh2, wxDefaultPosition, wxSize(64,20), wxTE_LEFT ); gridSizer->Add( m_textCtrlYUnitsCh2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // X units----------------------------------------------------------- wxStaticText* staticTextXUnits; staticTextXUnits=new wxStaticText( this, wxID_ANY, wxT("X units:"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextXUnits, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); m_textCtrlXUnits=new wxTextCtrl( this, wxID_ANY, m_xUnits, wxDefaultPosition, wxSize(64,20), wxTE_LEFT ); gridSizer->Add( m_textCtrlXUnits, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Sampling rate----------------------------------------------------- wxStaticText* staticTextSR; staticTextSR=new wxStaticText( this, wxID_ANY, wxT("Sampling rate (kHz):"), wxDefaultPosition, wxDefaultSize, 0 ); gridSizer->Add( staticTextSR, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString strSR; strSR << m_sr; m_textCtrlSR=new wxTextCtrl( this, wxID_ANY, strSR, wxDefaultPosition, wxSize(64,20), wxTE_RIGHT ); gridSizer->Add( m_textCtrlSR, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); topSizer->Add( gridSizer, 0, wxALIGN_CENTER, 5 ); // Check box for batch import---------------------------------------- if (m_isSeries) { m_checkBoxApplyToAll=new wxCheckBox( this, wxID_ANY, wxT("Apply settings to all files in series"), wxDefaultPosition, wxDefaultSize, 0 ); m_checkBoxApplyToAll->SetValue(false); topSizer->Add( m_checkBoxApplyToAll, 0, wxALIGN_CENTER | wxALL, 5 ); } // OK / Cancel buttons----------------------------------------------- m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); // Text preview------------------------------------------------------ wxTextCtrl* previewCtrl; previewCtrl=new wxTextCtrl( this, wxID_ANY, textPreview, wxDefaultPosition, wxSize(368,160), wxTE_MULTILINE | wxTE_DONTWRAP | wxTE_READONLY ); topSizer->Add( previewCtrl, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); disableSenseless(); this->Layout(); } void wxStfTextImportDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfTextImportDlg::OnOK() { long tempLong; m_textCtrlHLines->GetValue().ToLong( &tempLong ); m_hLines = tempLong; m_toSection=(m_comboBoxSecorch->GetCurrentSelection()==0); m_firstIsTime=(m_comboBoxFirsttime->GetCurrentSelection()==0); m_ncolumns=m_comboBoxNcolumns->GetCurrentSelection()+1; m_yUnits = m_textCtrlYUnits->GetValue(); m_yUnitsCh2 = m_textCtrlYUnitsCh2->GetValue(); m_xUnits = m_textCtrlXUnits->GetValue(); double tempDouble; m_textCtrlSR->GetValue().ToDouble ( &tempDouble ); m_sr = tempDouble; if (m_isSeries) { m_applyToAll=m_checkBoxApplyToAll->IsChecked(); } return true; } stfio::txtImportSettings wxStfTextImportDlg::GetTxtImport() const { stfio::txtImportSettings retTxtImport; retTxtImport.firstIsTime=m_firstIsTime; retTxtImport.hLines=m_hLines; retTxtImport.ncolumns=m_ncolumns; retTxtImport.sr=m_sr; retTxtImport.toSection=m_toSection; retTxtImport.xUnits = stf::wx2std(m_xUnits); retTxtImport.yUnits = stf::wx2std(m_yUnits); retTxtImport.yUnitsCh2 = stf::wx2std(m_yUnitsCh2); return retTxtImport; } void wxStfTextImportDlg::disableSenseless() { // if there is only one column, it can't be time: if (m_comboBoxNcolumns->GetCurrentSelection()==0) { m_firstIsTime=false; m_comboBoxFirsttime->SetSelection(1); m_comboBoxFirsttime->Enable(false); } else { m_comboBoxFirsttime->Enable(); } // if the first column is time, disable manual sampling rate settings: if (m_comboBoxFirsttime->GetCurrentSelection()==0) { m_textCtrlSR->Enable(false); } else { m_textCtrlSR->Enable(); } // if there is only one data column, // it doesn't make sense to choose between channels and sections int temp_nColumns=m_comboBoxNcolumns->GetCurrentSelection()+1; int temp_nTime=(m_comboBoxFirsttime->GetCurrentSelection()==0)? 1:0; int nData=temp_nColumns-temp_nTime; if (nData<2) { m_comboBoxSecorch->Enable(false); } else { m_comboBoxSecorch->Enable(); } // Enable units of second channel only if // there is a second channel at all: if (nData>1 && m_comboBoxSecorch->GetCurrentSelection()==1) { m_textCtrlYUnitsCh2->Enable(); } else { m_textCtrlYUnitsCh2->Enable(false); } } void wxStfTextImportDlg::OnComboNcolumns( wxCommandEvent& event ) { event.Skip(); m_ncolumns=m_comboBoxNcolumns->GetCurrentSelection()+1; disableSenseless(); } void wxStfTextImportDlg::OnComboFirsttime( wxCommandEvent& event ) { event.Skip(); m_firstIsTime=(m_comboBoxFirsttime->GetCurrentSelection()==0); disableSenseless(); } void wxStfTextImportDlg::OnComboSecorch( wxCommandEvent& event ) { event.Skip(); m_toSection=(m_comboBoxSecorch->GetCurrentSelection()==0); disableSenseless(); } enum { wxID_BUP, wxID_BDOWN, wxID_LISTCH }; BEGIN_EVENT_TABLE( wxStfOrderChannelsDlg, wxDialog ) EVT_BUTTON( wxID_BUP, wxStfOrderChannelsDlg::OnUparrow ) EVT_BUTTON( wxID_BDOWN, wxStfOrderChannelsDlg::OnDownarrow ) END_EVENT_TABLE() wxStfOrderChannelsDlg::wxStfOrderChannelsDlg(wxWindow* parent, const std::vector& channelNames, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), channelOrder(channelNames.size()) { wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); // 2-column sizer for funcs (left) and settings (right) wxFlexGridSizer* mainGrid; mainGrid=new wxFlexGridSizer(1,2,0,5); m_List = new wxListCtrl( this, wxID_LISTCH, wxDefaultPosition, wxSize(240,(int)channelNames.size()*24), wxLC_LIST | wxLC_SINGLE_SEL ); for (long n_c=0;n_c<(long)channelNames.size();++n_c) { m_List->InsertItem( n_c, channelNames[n_c] ); channelOrder[n_c]=n_c; } mainGrid->Add( m_List, 0, wxALIGN_CENTER_HORIZONTAL, 2 ); // Add up and down arrows: wxBoxSizer* arrowSizer; arrowSizer = new wxBoxSizer( wxVERTICAL ); wxBitmapButton *bUp, *bDown; bUp = new wxBitmapButton(this,wxID_BUP,arrow_up); bDown = new wxBitmapButton(this,wxID_BDOWN,arrow_down); arrowSizer->Add(bUp, 0, wxALIGN_CENTER | wxALL, 2 ); arrowSizer->Add(bDown, 0, wxALIGN_CENTER | wxALL, 2 ); mainGrid->Add( arrowSizer, 0, wxALIGN_CENTER_HORIZONTAL, 2 ); topSizer->Add( mainGrid, 0, wxALIGN_CENTER_HORIZONTAL| wxALL, 5 ); wxStdDialogButtonSizer* sdbSizer = new wxStdDialogButtonSizer(); sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); sdbSizer->Realize(); topSizer->Add( sdbSizer, 0, wxALIGN_CENTER | wxALL, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfOrderChannelsDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxGetApp().ErrorMsg(wxT("Please select a valid function")); return; } } wxDialog::EndModal(retCode); } bool wxStfOrderChannelsDlg::OnOK() { return true; } void wxStfOrderChannelsDlg::OnUparrow( wxCommandEvent& event ) { event.Skip(); // Get currently selected item in list: if (m_List->GetSelectedItemCount()>0) { // Get first selected item: long item = -1; item=m_List->GetNextItem(item,wxLIST_NEXT_ALL,wxLIST_STATE_SELECTED); // Return if this is already the topmost item: if (item <= 0) return; // Otherwise, move this item up by swapping with the previous item: SwapItems(item-1,item); // Focus on list: m_List->SetFocus(); } } void wxStfOrderChannelsDlg::OnDownarrow( wxCommandEvent& event ) { event.Skip(); // Get currently selected item in list: if (m_List->GetSelectedItemCount()>0) { // Get first selected item: long item = -1; item=m_List->GetNextItem(item,wxLIST_NEXT_ALL,wxLIST_STATE_SELECTED); // Return if this is the last item: if (item >= m_List->GetItemCount()-1) return; // Otherwise, move this item down by swapping with the next item: SwapItems(item,item+1); // Focus on list: m_List->SetFocus(); } } void wxStfOrderChannelsDlg::SwapItems(long itemId1, long itemId2) { // Store the first item: wxString labelFirst=m_List->GetItemText(itemId1); int orderFirst=channelOrder[itemId1]; // Change first item label: m_List->SetItemText(itemId1,m_List->GetItemText(itemId2)); // Change second item label: m_List->SetItemText(itemId2,labelFirst); // Update channel order: channelOrder[itemId1]=channelOrder[itemId2]; channelOrder[itemId2]=orderFirst; } stimfit-0.15.8/src/stimfit/gui/dlgs/fitseldlg.cpp0000775000175000017500000003500713062445067016672 00000000000000#include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "./../app.h" #include "./../doc.h" #include "./../view.h" #include "./../graph.h" #include "./fitseldlg.h" #define wxID_LIST 1001 #define wxID_PREVIEW 1002 BEGIN_EVENT_TABLE( wxStfFitSelDlg, wxDialog ) EVT_LIST_ITEM_SELECTED( wxID_LIST, wxStfFitSelDlg::OnListItemSelected ) EVT_BUTTON( wxID_PREVIEW, wxStfFitSelDlg::OnButtonClick ) END_EVENT_TABLE() wxStfFitSelDlg::wxStfFitSelDlg(wxWindow* parent, wxStfDoc* doc, int id, wxString title, wxPoint pos, wxSize size, int style) : wxDialog( parent, id, title, pos, size, style ), m_fselect(18), init_p(0), opts(6), noInput(false), use_scaling(false), paramDescArray(MAXPAR), paramEntryArray(MAXPAR), pDoc(doc) { // Check www.ics.forth.gr/~lourakis/levmar/levmar.pdf for details // if you change values here, please change src/stimfit/py/pystf.cxx accordingly //opts[0]=5*1E-3; //default: 1E-03; opts[0] = 1E-05; //scale for initial damping term, default: 1E-03; opts[1] = 1E-17; //stopping thr. for ||J^T e||, default: 1E-17; opts[2] = 1E-17; //stopping thr. for ||Dp||_2, default: 1E-17; opts[3] = 1E-32; //stopping thr. for squared diff ||e||_2, default: 1E-17; opts[4] = 64; //max number of iterations (Kmax), default: 64; opts[5] = 16; //max number of pass per iteration; wxBoxSizer* topSizer; topSizer = new wxBoxSizer( wxVERTICAL ); // 2-column sizer for funcs (left) and settings (right) wxFlexGridSizer* mainGrid = new wxFlexGridSizer(1,2,0,5); wxStaticBoxSizer* m_listSizer = new wxStaticBoxSizer( wxVERTICAL, this, wxT("Available functions") ); m_listCtrl = new wxListCtrl( this, wxID_LIST, wxDefaultPosition, wxSize(550,400), wxLC_LIST ); int n_f = 0; for (c_stfunc_it cit = wxGetApp().GetFuncLib().begin(); cit != wxGetApp().GetFuncLib().end(); cit++) { wxString funcName; funcName << wxString::Format(wxT("%2d: "), n_f) << stf::std2wx(cit->name); m_listCtrl->InsertItem( n_f++, funcName ); } m_listSizer->Add( m_listCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2 ); mainGrid->Add( m_listSizer, 0, wxALIGN_CENTER_HORIZONTAL, 2 ); // vertical sizer for initial parameters (top) and options (bottom) wxBoxSizer* settingsSizer; settingsSizer=new wxBoxSizer(wxVERTICAL); wxStaticBoxSizer* paramSizer = new wxStaticBoxSizer( wxVERTICAL, this, wxT("Initial parameters") ); // grid for parameters: wxFlexGridSizer* paramGrid; paramGrid=new wxFlexGridSizer(0,4,0,4); // add parameter boxes: std::vector< wxStaticText* >::iterator it1; std::vector< wxTextCtrl* >::iterator it2 = paramEntryArray.begin(); for (it1 = paramDescArray.begin(); it1 != paramDescArray.end() && it2 != paramEntryArray.end(); it1++) { *it1 = new wxStaticText( this, wxID_ANY, wxT(" "), wxDefaultPosition, wxSize(74,20), wxTE_LEFT ); paramGrid->Add( *it1, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2 ); *it2 = new wxTextCtrl( this, wxID_ANY, wxT(" "), wxDefaultPosition, wxSize(74,20), wxTE_RIGHT ); paramGrid->SetFlexibleDirection(wxHORIZONTAL); paramGrid->Add( *it2, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2 ); it2++; } //settingsSizer->Add( paramGrid, 0, wxALIGN_CENTER_HORIZONTAL, 2 ); paramSizer->Add( paramGrid, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2 ); settingsSizer->Add( paramSizer, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 2 ); // Fit options: // grid for parameters: wxFlexGridSizer* optionsGrid; optionsGrid=new wxFlexGridSizer(opts.size()+1, 2, 0, 0); wxStaticBoxSizer* fitoptSizer = new wxStaticBoxSizer( wxVERTICAL, this, wxT("Fitting options") ); InitOptions(optionsGrid); // add the options grid to the settings sizer: fitoptSizer->Add( optionsGrid, 0, wxEXPAND | wxALL, 2 ); settingsSizer->Add( fitoptSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_BOTTOM, 2 ); //settingsSizer->Add( optionsGrid, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_BOTTOM, 2 ); // add the settings sizer to the main grid: mainGrid->Add( settingsSizer, 0, wxALIGN_CENTER_HORIZONTAL, 2 ); // add the main grid to the dialog: topSizer->Add( mainGrid, 0, wxALIGN_CENTER_HORIZONTAL| wxALL, 5 ); // Ok / Cancel / Preview: wxButton* previewButton; previewButton = new wxButton( this, wxID_PREVIEW, wxT("Preview"), wxDefaultPosition, wxDefaultSize, 0 ); topSizer->Add( previewButton, 0, wxALIGN_CENTER | wxALL, 2 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER| wxALL, 2 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); // select first function: if (m_listCtrl->GetItemCount()>0) { m_listCtrl->SetItemState(0,wxLIST_STATE_SELECTED,wxLIST_STATE_SELECTED); } } void wxStfFitSelDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) switch (retCode) { case wxID_OK: if (!OnOK()) { wxLogMessage(wxT("Please select a valid function")); return; } break; case wxID_CANCEL: try { pDoc->DeleteFit(pDoc->GetCurChIndex(), pDoc->GetCurSecIndex()); } catch (const std::out_of_range& e) { } break; default: ; } wxDialog::EndModal(retCode); } bool wxStfFitSelDlg::OnOK() { Update_fselect(); read_init_p(); read_opts(); // wxStfDoc* pDoc=pDoc; // pDoc->cur().SetIsFitted(false); // pDoc->cur().SetFit(Vector_double(0)); return true; } void wxStfFitSelDlg::InitOptions(wxFlexGridSizer* optionsGrid) { // Number of passes-------------------------------------------------- wxStaticText* staticTextNPasses; staticTextNPasses=new wxStaticText( this, wxID_ANY, wxT("Max. number of passes:"), wxDefaultPosition, wxDefaultSize, 0 ); optionsGrid->Add( staticTextNPasses, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString strNPasses; strNPasses << opts[5]; m_textCtrlMaxpasses = new wxTextCtrl( this, wxID_ANY, strNPasses, wxDefaultPosition, wxSize(74,20), wxTE_RIGHT ); optionsGrid->Add( m_textCtrlMaxpasses, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Number of iterations---------------------------------------------- wxStaticText* staticTextNIter; staticTextNIter=new wxStaticText( this, wxID_ANY, wxT("Max. number of iterations per pass:"), wxDefaultPosition, wxDefaultSize, 0 ); optionsGrid->Add( staticTextNIter, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString strNIter; strNIter << opts[4]; m_textCtrlMaxiter=new wxTextCtrl( this, wxID_ANY, strNIter, wxDefaultPosition, wxSize(74,20), wxTE_RIGHT ); optionsGrid->Add( m_textCtrlMaxiter, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Initial scaling factor-------------------------------------------- wxStaticText* staticTextMu; staticTextMu=new wxStaticText( this, wxID_ANY, wxT("Initial scaling factor:"), wxDefaultPosition, wxDefaultSize, 0 ); optionsGrid->Add( staticTextMu, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString strMu; strMu << opts[0]; m_textCtrlMu=new wxTextCtrl( this, wxID_ANY, strMu, wxDefaultPosition, wxSize(74,20), wxTE_RIGHT ); optionsGrid->Add( m_textCtrlMu, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Gradient of squared error----------------------------------- wxStaticText* staticTextJTE; staticTextJTE=new wxStaticText( this, wxID_ANY, wxT("Stop. thresh. for gradient of squared error:"), wxDefaultPosition, wxDefaultSize, 0 ); optionsGrid->Add( staticTextJTE, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString strJTE; strJTE << opts[1]; m_textCtrlJTE=new wxTextCtrl( this, wxID_ANY, strJTE, wxDefaultPosition, wxSize(74,20), wxTE_RIGHT ); optionsGrid->Add( m_textCtrlJTE, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Parameter gradient------------------------------------------------ wxStaticText* staticTextDP; staticTextDP=new wxStaticText( this, wxID_ANY, wxT("Stop. thresh. for rel. parameter change:"), wxDefaultPosition, wxDefaultSize, 0 ); optionsGrid->Add( staticTextDP, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString strDP; strDP << opts[2]; m_textCtrlDP=new wxTextCtrl( this, wxID_ANY, strDP, wxDefaultPosition, wxSize(74,20), wxTE_RIGHT ); optionsGrid->Add( m_textCtrlDP, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Squared error----------------------------------------------------- wxStaticText* staticTextE2; staticTextE2=new wxStaticText( this, wxID_ANY, wxT("Stop. thresh. for squared error:"), wxDefaultPosition, wxDefaultSize, 0 ); optionsGrid->Add( staticTextE2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString strE2; strE2 << opts[3]; m_textCtrlE2=new wxTextCtrl( this, wxID_ANY, strE2, wxDefaultPosition, wxSize(74,20), wxTE_RIGHT ); optionsGrid->Add( m_textCtrlE2, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); // Use scaling------------------------------------------------------- m_checkBox = new wxCheckBox(this, wxID_ANY, wxT("Scale data amplitude to 1.0"), wxDefaultPosition, wxDefaultSize, 0); m_checkBox->SetValue(true); optionsGrid->Add( m_checkBox, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2 ); } void wxStfFitSelDlg::OnButtonClick( wxCommandEvent& event ) { event.Skip(); // Make sure we are up-to-date: Update_fselect(); // read in parameters: read_init_p(); // tell the document that a fit has been performed: if (pDoc==0) { wxGetApp().ErrorMsg(wxT("Couldn't connect to document")); return; } // calculate a graph from the current parameters: std::size_t fitSize= pDoc->GetFitEnd()-pDoc->GetFitBeg(); Vector_double fit(fitSize); for (std::size_t n_f=0;n_fGetXScale()*n_f,init_p ); } catch (const std::out_of_range& e) { wxString msg(wxT("Could not retrieve selected function from library:\n")); msg += wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(msg); m_fselect=-1; return; } } try { pDoc->SetIsFitted(pDoc->GetCurChIndex(), pDoc->GetCurSecIndex(), init_p, wxGetApp().GetFuncLibPtr(m_fselect), 0, pDoc->GetFitBeg(), pDoc->GetFitEnd() ); } catch (const std::out_of_range& e) { } // tell the view to draw the fit: wxStfView* pView = (wxStfView*)pDoc->GetFirstView(); if (pView != NULL) if (pView->GetGraph() != NULL) pView->GetGraph()->Refresh(); } void wxStfFitSelDlg::SetPars() { Update_fselect(); // get parameter names from selected function: try { // fill a temporary array: if (pDoc==NULL) return; std::size_t fitSize= pDoc->GetFitEnd()-pDoc->GetFitBeg(); if (fitSize<=0) { wxGetApp().ErrorMsg(wxT("Check fit cursor settings")); return; } Vector_double x(fitSize); //fill array: std::copy(&pDoc->cursec()[pDoc->GetFitBeg()], &pDoc->cursec()[pDoc->GetFitBeg()+fitSize], &x[0]); Vector_double initPars(wxGetApp().GetFuncLib().at(m_fselect).pInfo.size()); wxGetApp().GetFuncLib().at(m_fselect).init( x, pDoc->GetBase(), pDoc->GetPeak(), pDoc->GetRTLoHi(), pDoc->GetHalfDuration(), pDoc->GetXScale(), initPars); std::vector< wxStaticText* >::iterator it1; std::vector< wxTextCtrl* >::iterator it2 = paramEntryArray.begin(); std::size_t n_p = 0; for (it1 = paramDescArray.begin(); it1 != paramDescArray.end() && it2 != paramEntryArray.end(); it1++) { if (n_p < wxGetApp().GetFuncLib().at(m_fselect).pInfo.size()) { (*it1)->Show(); (*it2)->Show(); // Parameter label: (*it1)->SetLabel(stf::std2wx(wxGetApp().GetFuncLib().at(m_fselect).pInfo[n_p].desc)); // Initial parameter values: wxString strInit; strInit << initPars[n_p]; (*it2)->SetValue(strInit); (*it2)->Enable(!noInput); } else { (*it1)->Show(false); (*it2)->Show(false); } it2++; n_p++; } } catch (const std::out_of_range& e) { wxString msg(wxT("Could not retrieve selected function from library:\n")); msg += wxString( e.what(), wxConvLocal ); wxLogMessage(msg); m_fselect = -1; return; } this->Layout(); } void wxStfFitSelDlg::Update_fselect() { // Update currently selected function: if (m_listCtrl->GetSelectedItemCount()>0) { // Get first selected item: long item = -1; item=m_listCtrl->GetNextItem(item,wxLIST_NEXT_ALL,wxLIST_STATE_SELECTED); if (item==-1) return; m_fselect = item; } } void wxStfFitSelDlg::OnListItemSelected( wxListEvent& event ) { event.Skip(); SetPars(); } void wxStfFitSelDlg::read_init_p() { init_p.resize(wxGetApp().GetFuncLib().at(m_fselect).pInfo.size()); for (std::size_t n_p=0;n_pGetValue(); entryInit.ToDouble( &init_p[n_p] ); } } void wxStfFitSelDlg::read_opts() { // Read entry to string: wxString entryMu = m_textCtrlMu->GetValue(); entryMu.ToDouble( &opts[0] ); wxString entryJTE = m_textCtrlJTE->GetValue(); entryJTE.ToDouble( &opts[1] ); wxString entryDP = m_textCtrlDP->GetValue(); entryDP.ToDouble( &opts[2] ); wxString entryE2 = m_textCtrlE2->GetValue(); entryE2.ToDouble( &opts[3] ); wxString entryMaxiter = m_textCtrlMaxiter->GetValue(); entryMaxiter.ToDouble( &opts[4] ); wxString entryMaxpasses = m_textCtrlMaxpasses->GetValue(); entryMaxpasses.ToDouble( &opts[5] ); use_scaling = m_checkBox->GetValue(); } stimfit-0.15.8/src/stimfit/gui/copygrid.h0000775000175000017500000000650513062445067015252 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file copygrid.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfGrid. Derived from wxGrid to allow copying to clipboard. */ #ifndef _COPYGRID_H #define _COPYGRID_H /*! \addtogroup wxstf * @{ */ //! Derived from wxGrid. Allows to copy cells to the clipboard. class wxStfGrid : public wxGrid { DECLARE_CLASS(wxStfGrid) public: //! Constructor /*! \param parent Pointer to the parent window. * \param id Window id. * \param pos Initial window position. * \param size Initial window size. * \param style Grid style. * \param name Name of this grid. */ wxStfGrid( wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxWANTS_CHARS, const wxString& name = wxGridNameStr ); //! Get the selection. /*! \return The selected cells as a string. */ wxString GetSelection() const {return selection;} // Get the context menu. /*! \return A pointer to the context menu. */ wxMenu* get_labelMenu() {return m_labelContext.get();} //! Updates the context menu. void ViewResults(); private: wxString selection; void Copy(wxCommandEvent& event); void OnRClick(wxGridEvent& event); void OnLabelRClick(wxGridEvent& event); void OnKeyDown(wxKeyEvent& event); void ViewCrosshair(wxCommandEvent& event); void ViewBaseline(wxCommandEvent& event); void ViewBaseSD(wxCommandEvent& event); void ViewThreshold(wxCommandEvent& event); void ViewPeakzero(wxCommandEvent& event); void ViewPeakbase(wxCommandEvent& event); void ViewPeakthreshold(wxCommandEvent& event); void ViewRTLoHi(wxCommandEvent& event); void ViewInnerRiseTime(wxCommandEvent& event); void ViewOuterRiseTime(wxCommandEvent& event); void ViewT50(wxCommandEvent& event); void ViewRD(wxCommandEvent& event); void ViewSloperise(wxCommandEvent& event); void ViewSlopedecay(wxCommandEvent& event); void ViewLatency(wxCommandEvent& event); #ifdef WITH_PSLOPE void ViewPSlope(wxCommandEvent& event); #endif void ViewCursors(wxCommandEvent& event); void SetCheckmark(const wxString& RegEntry, int id); #if (__cplusplus < 201103) boost::shared_ptr m_context; boost::shared_ptr m_labelContext; #else std::shared_ptr m_context; std::shared_ptr m_labelContext; #endif DECLARE_EVENT_TABLE() }; /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/app.h0000775000175000017500000004266213315356003014206 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file app.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfApp. */ #ifndef _APP_H #define _APP_H /*! \defgroup wxstf Stimfit classes and functions derived from wxWidgets * @{ */ //! Event ids enum { ID_TOOL_FIRST, // = wxID_HIGHEST+1, resulted in wrong events being fired ID_TOOL_NEXT, ID_TOOL_PREVIOUS, ID_TOOL_LAST, ID_TOOL_XENL, ID_TOOL_XSHRINK, ID_TOOL_YENL, ID_TOOL_YSHRINK, ID_TOOL_UP, ID_TOOL_DOWN, ID_TOOL_FIT, ID_TOOL_LEFT, ID_TOOL_RIGHT, ID_TOOL_SELECT, ID_TOOL_REMOVE, ID_TOOL_MEASURE, ID_TOOL_PEAK, ID_TOOL_BASE, ID_TOOL_DECAY, ID_TOOL_LATENCY, #ifdef WITH_PSLOPE ID_TOOL_PSLOPE, #endif ID_TOOL_ZOOM, ID_TOOL_EVENT, ID_TOOL_CH1, ID_TOOL_CH2, ID_TOOL_SNAPSHOT, ID_TOOL_SNAPSHOT_WMF, ID_TOOL_FITDECAY, #ifdef WITH_PYTHON ID_IMPORTPYTHON, #endif ID_VIEW_RESULTS, ID_VIEW_MEASURE, ID_VIEW_BASELINE, ID_VIEW_BASESD, ID_VIEW_THRESHOLD, ID_VIEW_PEAKZERO, ID_VIEW_PEAKBASE, ID_VIEW_PEAKTHRESHOLD, ID_VIEW_RTLOHI, ID_VIEW_INNERRISETIME, ID_VIEW_OUTERRISETIME, ID_VIEW_T50, ID_VIEW_RD, ID_VIEW_SLOPERISE, ID_VIEW_SLOPEDECAY, ID_VIEW_LATENCY, #ifdef WITH_PSLOPE ID_VIEW_PSLOPE, #endif ID_VIEW_CURSORS, ID_VIEW_SHELL, ID_FILEINFO, ID_EXPORTIMAGE, ID_EXPORTPS, ID_EXPORTLATEX, ID_EXPORTSVG, ID_TRACES, ID_PLOTSELECTED, ID_SHOWSECOND, ID_CURSORS, ID_AVERAGE, ID_ALIGNEDAVERAGE, ID_FIT, ID_LFIT, ID_LOG, ID_VIEWTABLE, ID_BATCH, ID_INTEGRATE, ID_DIFFERENTIATE, ID_CH2BASE, ID_CH2POS, ID_CH2ZOOM, ID_CH2BASEZOOM, ID_SWAPCHANNELS, ID_SCALE, ID_ZOOMHV, ID_ZOOMH, ID_ZOOMV, ID_EVENTADD, ID_EVENTEXTRACT, ID_APPLYTOALL, ID_UPDATE, ID_CONVERT, #if 0 ID_LATENCYSTART_MAXSLOPE, ID_LATENCYSTART_HALFRISE, ID_LATENCYSTART_PEAK, ID_LATENCYSTART_MANUAL, ID_LATENCYEND_FOOT, ID_LATENCYEND_MAXSLOPE, ID_LATENCYEND_HALFRISE, ID_LATENCYEND_PEAK, ID_LATENCYEND_MANUAL, ID_LATENCYWINDOW, #endif ID_PRINT_PRINT, ID_MPL, ID_MPL_SPECTRUM, ID_PRINT_PAGE_SETUP, ID_PRINT_PREVIEW, ID_COPYINTABLE, ID_MULTIPLY, ID_SELECTSOME, ID_UNSELECTSOME, ID_MYSELECTALL, ID_UNSELECTALL, ID_SELECT_AND_ADD, ID_SELECT_AND_REMOVE, ID_NEWFROMSELECTED, ID_NEWFROMSELECTEDTHIS, ID_NEWFROMALL, ID_CONCATENATE_MULTICHANNEL, ID_SUBTRACTBASE, ID_FILTER, ID_POVERN, ID_PLOTCRITERION, ID_PLOTCORRELATION, ID_PLOTDECONVOLUTION, ID_EXTRACT, ID_THRESHOLD, ID_LOADPERSPECTIVE, ID_SAVEPERSPECTIVE, ID_RESTOREPERSPECTIVE, ID_STFCHECKBOX, ID_EVENT_ADDEVENT, ID_EVENT_EXTRACT, ID_EVENT_ERASE, ID_COMBOTRACES, ID_SPINCTRLTRACES, ID_ZERO_INDEX, ID_COMBOACTCHANNEL, ID_COMBOINACTCHANNEL, #ifdef WITH_PYTHON ID_USERDEF, // this should be the last ID event #endif }; #include #include #include #include #include #include #include "./../stf.h" #include "./../../libstfnum/stfnum.h" #ifdef WITH_PYTHON #ifdef _POSIX_C_SOURCE #define _POSIX_C_SOURCE_WAS_DEF #undef _POSIX_C_SOURCE #endif #ifdef _XOPEN_SOURCE #define _XOPEN_SOURCE_WAS_DEF #undef _XOPEN_SOURCE #endif #include #ifdef _POSIX_C_SOURCE_WAS_DEF #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE #endif #endif #ifdef _XOPEN_SOURCE_WAS_DEF #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE #endif #endif #if defined(__WXMAC__) || defined(__WXGTK__) #pragma GCC diagnostic ignored "-Wwrite-strings" #endif #ifdef WITH_PYTHON #if PY_MAJOR_VERSION >= 3 #include #else #include #endif #endif // revert to previous behaviour #if defined(__WXMAC__) || defined(__WXGTK__) #pragma GCC diagnostic warning "-Wwrite-strings" #endif #endif // WITH_PYTHON #if (__cplusplus < 201103) #include #endif class wxDocManager; class wxStfDoc; class wxStfView; class wxStfCursorsDlg; class wxStfParentFrame; class wxStfChildFrame; class Section; //! The application, derived from wxApp /*! This class is used to set and get application-wide properties, * implement the windowing system message or event loop, * initiate application processing via OnInit, and * allow default processing of events not handled by other objects in the application. */ class StfDll wxStfApp: public wxApp { public: //! Constructor wxStfApp(); //! Initialise the application /*! Initialises the document manager and the file-independent menu items, * loads the user-defined extension library and the least-squares function library, * parses the command line and attempts to open a file if one was given * at program startup by either double-clicking it or as a command-line * argument. * \return true upon successful initialisation, false otherwise. */ virtual bool OnInit(); //! Exit the application /*! Does nothing but calling the base class's wxApp::OnExit(). * \return The return value of wxApp::OnExit(). */ virtual int OnExit(); //! Creates a new child frame /*! This is called from view.cpp whenever a child frame is created. If you * want to pop up a new frame showing a new document, use NewChild() instead; this * function will then be called by the newly created view. * \param doc A pointer to the document that the new child frame should contain. * \param view A pointer to the view corresponding to the document. * \return A pointer to the newly created child frame. */ wxStfChildFrame *CreateChildFrame(wxDocument *doc, wxView *view); //! Retrieves the currently active document. /*! \return A pointer to the currently active document. */ wxStfDoc* GetActiveDoc() const; //! Retrieves the currently active view. /*! \return A pointer to the currently active view. */ wxStfView* GetActiveView() const; //! Displays a message box when an error has occured. /*! You can use this function from almost anywhere using * wxGetApp().ErrorMsg( wxT( "Error abc: xyz" ) ); * \param msg The message string to be shown. */ void ErrorMsg(const wxString& msg) const { wxMessageBox(msg,wxT("An error has occured"),wxOK | wxICON_EXCLAMATION,NULL); } //! Displays a message box when an exception has occured. /*! You can use this function from almost anywhere using * wxGetApp().ExceptMsg( wxT( "Exception description xyz" ) ); * \param msg The message string to be shown. */ void ExceptMsg(const wxString& msg) const { wxMessageBox(msg,wxT("An exception was caught"),wxOK | wxICON_HAND,NULL); } //! Displays a message box with information. /*! You can use this function from almost anywhere using * wxGetApp().InfoMsg( wxT( "Info xyz" ) ); * \param msg The message string to be shown. */ void InfoMsg(const wxString& msg) const { wxMessageBox(msg,wxT("Information"), wxOK | wxICON_INFORMATION, NULL); } //! Indicates whether text files should be imported directly without showing an import settings dialog. /*! \return true if text files should be imported directly, false otherwise. */ bool get_directTxtImport() const { return directTxtImport; } //! Determines whether text files should be imported directly without showing an import filter settings dialog. /*! \param directTxtImport_ Set to true if text files should be imported directly, false otherwise. */ void set_directTxtImport(bool directTxtImport_) { directTxtImport=directTxtImport_; } //! Retrieves the text import filter settings. /*! \return A struct with the current text import filter settings. */ const stfio::txtImportSettings& GetTxtImport() const { return txtImport; } //! Sets the text import filter settings. /*! \param txtImport_ A struct with the new text import filter settings. */ void set_txtImportSettings(const stfio::txtImportSettings& txtImport_) { txtImport=txtImport_; } //! Retrieves the functions that are available for least-squares minimisation. /*! \return A vector containing the available functions. */ const std::vector& GetFuncLib() const { return funcLib; } //! Retrieves a pointer to a function for least-squares minimisation. /*! \return A vector containing the available functions. */ stfnum::storedFunc* GetFuncLibPtr(std::size_t at) { return &funcLib.at(at); } //! Retrieves a pointer to a function for least-squares minimisation. /*! \return A vector containing the available functions. */ stfnum::storedFunc* GetLinFuncPtr( ) { return &storedLinFunc; } #ifdef WITH_PYTHON //! Retrieves the user-defined extension functions. /*! \return A vector containing the user-defined functions. */ const std::vector< stf::Extension >& GetExtensionLib() const { return extensionLib; } #endif //! Retrieves the cursor settings dialog. /*! \return A pointer to the cursor settings dialog. */ wxStfCursorsDlg* GetCursorsDialog() const { return CursorsDialog; } //! Retrieves all sections with fits /*! \return A vector containing pointers to all sections in which fits have been performed */ std::vector GetSectionsWithFits() const; //! Writes an integer value to the configuration. /*! \param main The main path within the configuration. * \param sub The sub-path within the configuration. * \param value The integer to write to the configuration. */ void wxWriteProfileInt(const wxString& main,const wxString& sub, int value) const; //! Retrieves an integer value from the configuration. /*! \param main The main path within the configuration. * \param sub The sub-path within the configuration. * \param default_ The default integer to return if the configuration entry can't be read. * \return The integer that is stored in /main/sub, or default_ if the entry couldn't * be read. */ int wxGetProfileInt(const wxString& main,const wxString& sub, int default_) const; //! Writes a string to the configuration. /*! \param main The main path within the configuration. * \param sub The sub-path within the configuration. * \param value The string to write to the configuration. */ void wxWriteProfileString( const wxString& main, const wxString& sub, const wxString& value ) const; //! Retrieves a string from the configuration. /*! \param main The main path within the configuration. * \param sub The sub-path within the configuration. * \param default_ The default string to return if the configuration entry can't be read. * \return The string that is stored in /main/sub, or default_ if the entry couldn't * be read. */ wxString wxGetProfileString( const wxString& main, const wxString& sub, const wxString& default_ ) const; //! Creates a new child window showing a new document. /*! \param NewData The new data to be shown in the new window. * \param Sender The document that was at the origin of this new window. * \param title A title for the new document. * \return A pointer to the newly created document. */ wxStfDoc* NewChild( const Recording& NewData, const wxStfDoc* Sender, const wxString& title = wxT("\0") ); //! Execute all pending calculations. /*! Whenever settings that have an effect on measurements, such as * cursor positions or trace selections, are modified, this function * needs to be called to update the results table. */ void OnPeakcalcexecMsg(wxStfDoc* actDoc = 0); //! Sets the currently active document. /*! \param pDoc A pointer to the currently active document. */ void SetMRActiveDoc(wxStfDoc* pDoc) {mrActiveDoc = pDoc;} //! Destroys the last cursor settings dialog when the last document is closed /*! Do not use this function directly. It only needs to be called from wxStfDoc::OnCloseDocument(). * \param pDoc Pointer to the document that is being closed. */ void CleanupDocument(wxStfDoc* pDoc); //! Closes all documents bool CloseAll() { return GetDocManager()->CloseDocuments(); } //! Opens a series of files. Optionally, files can be put into a single window. /*! \param fNameArray An array of file names to be opened. * \return true upon successful opening of all files, false otherwise. */ bool OpenFileSeries(const wxArrayString& fNameArray); //! Returns the number of currently opened documents. /*! \return The number of currently opened documents. */ int GetDocCount() { return (int)GetDocManager()->GetDocuments().GetCount(); } //! Determine whether scale bars or coordinates should be shown. /*! \param value Set to true for scale bars, false for coordinates. */ void set_isBars(bool value) { isBars=value; } //! Indicates whether scale bars or coordinates are shown. /*! \return true for scale bars, false for coordinates. */ bool get_isBars() const { return isBars; } //! Get a formatted version string. /*! \return A version string (stimfit x.y.z, release/debug build, date). */ wxString GetVersionString() const; //! Open a new window showing all selected traces from all open files /*! \param event The associated menu event */ void OnNewfromselected( wxCommandEvent& event ); //! Access the document manager /*! \return A pointer to the document manager. */ wxDocManager* GetDocManager() const { return wxDocManager::GetDocumentManager(); } virtual void OnInitCmdLine(wxCmdLineParser& parser); virtual bool OnCmdLineParsed(wxCmdLineParser& parser); #ifdef WITH_PYTHON //! Opens a file in a new window, to be called from Python. /*! \param fNameArray An array of file names to be opened. * \return true upon successful opening, false otherwise. */ bool OpenFilePy(const wxString& fNameArray); //! Opens a dialog to import a Python module /*! \param event The associated menu event */ void OnPythonImport( wxCommandEvent& event ); #endif protected: private: void OnCursorSettings( wxCommandEvent& event ); void OnNewfromall( wxCommandEvent& event ); void OnApplytoall( wxCommandEvent& event ); void OnProcessCustom( wxCommandEvent& event ); void OnKeyDown( wxKeyEvent& event ); #ifdef WITH_PYTHON void ImportPython(const wxString& modulelocation); void OnUserdef(wxCommandEvent& event); bool Init_wxPython(); bool Exit_wxPython(); std::vector LoadExtensions(); #endif // WITH_PYTHON wxMenuBar* CreateUnifiedMenuBar(wxStfDoc* doc=NULL); #ifdef _WINDOWS #pragma optimize( "", off ) #endif #ifdef _WINDOWS #pragma optimize( "", on ) #endif bool directTxtImport,isBars; stfio::txtImportSettings txtImport; // Registry: #if (__cplusplus < 201103) boost::shared_ptr config; #else std::shared_ptr config; #endif std::vector funcLib; #ifdef WITH_PYTHON std::vector< stf::Extension > extensionLib; #endif // Pointer to the cursors settings dialog box wxStfCursorsDlg* CursorsDialog; wxDocTemplate* m_cfsTemplate, *m_hdf5Template, *m_txtTemplate,*m_abfTemplate, *m_atfTemplate,*m_axgTemplate,*m_sonTemplate, *m_hekaTemplate, *m_intanTemplate, *m_tdmsTemplate, *m_biosigTemplate; stfnum::storedFunc storedLinFunc; // wxMenu* m_file_menu; wxString m_fileToLoad; /*std::list activeDoc;*/ wxStfDoc* mrActiveDoc; #ifdef WITH_PYTHON PyThreadState* m_mainTState; #endif DECLARE_EVENT_TABLE() }; #ifdef _WINDOWS //! Returns a reference to the application. extern StfDll wxStfApp& wxGetApp(); #else DECLARE_APP(wxStfApp) #endif //! Retrieve the application's top-level frame /*! \return A pointer to the top-level frame. */ extern StfDll wxStfParentFrame *GetMainFrame(); //! true if in single-window mode extern bool singleWindowMode; /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/doc.h0000775000175000017500000012536413062445067014204 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file doc.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfDoc. */ #ifndef _DOC_H #define _DOC_H /*! \addtogroup wxstf * @{ */ #include "./../stf.h" //! The document class, derived from both wxDocument and Recording. /*! The document class can be used to model an application’s file-based data. * It is part of the document/view framework supported by wxWidgets. */ class StfDll wxStfDoc: public wxDocument, public Recording { #ifndef FROM_PYTHON DECLARE_DYNAMIC_CLASS(wxStfDoc) #endif private: bool peakAtEnd, startFitAtPeak, initialized, progress; Recording Average; int InitCursors(); void PostInit(); bool ChannelSelDlg(); void WriteToReg(); bool outOfRange(std::size_t check) { return (check >= cursec().size()); } void Focus(); void OnNewfromselectedThisMenu( wxCommandEvent& event ) { OnNewfromselectedThis( ); } void Selectsome(wxCommandEvent& event); void Unselectsome(wxCommandEvent& event); void SelectTracesOfType(wxCommandEvent& event); void UnselectTracesOfType(wxCommandEvent& event); void ConcatenateMultiChannel(wxCommandEvent& event); void OnAnalysisBatch( wxCommandEvent& event ); void OnAnalysisIntegrate( wxCommandEvent& event ); void OnAnalysisDifferentiate( wxCommandEvent& event ); //void OnSwapChannels( wxCommandEvent& event ); void Multiply(wxCommandEvent& event); void SubtractBaseMenu( wxCommandEvent& event ) { SubtractBase( ); } void LFit(wxCommandEvent& event); void LnTransform(wxCommandEvent& event); void Filter(wxCommandEvent& event); void P_over_N(wxCommandEvent& event); void Plotextraction(stf::extraction_mode mode); void Plotcriterion(wxCommandEvent& event); void Plotcorrelation(wxCommandEvent& event); void Plotdeconvolution(wxCommandEvent& event); void MarkEvents(wxCommandEvent& event); void Threshold(wxCommandEvent& event); void Viewtable(wxCommandEvent& event); void Fileinfo(wxCommandEvent& event); Recording ReorderChannels(); wxMenu* doc_file_menu; stf::latency_mode latencyStartMode, latencyEndMode; stf::latency_window_mode latencyWindowMode; stfnum::direction direction; //of peak detection: UP, DOWN or BOTH #ifdef WITH_PSLOPE stf::pslope_mode_beg pslopeBegMode; // for left mode PSlope cursor stf::pslope_mode_end pslopeEndMode; // for right mode PSlope cursor #endif std::size_t baseBeg, baseEnd, peakBeg, peakEnd, fitBeg, fitEnd; stfnum::baseline_method baselineMethod; // method for calculating baseline #ifdef WITH_PSLOPE std::size_t PSlopeBeg, PSlopeEnd; int DeltaT; // distance (number of points) from the first cursor bool viewPSlope; #endif std::size_t measCursor; bool ShowRuler; // show a ruler throught the measurement cursor? double latencyStartCursor, latencyEndCursor, latency, //time from latency cursor to beginning of event base, APBase, baseSD, threshold, slopeForThreshold, peak, APPeak, tLoReal, tHiReal, t50LeftReal, t50RightReal, maxT, thrT, maxRiseY, maxRiseT, maxDecayY, maxDecayT, maxRise, maxDecay, t50Y, APMaxT, APMaxRiseY, APMaxRiseT, APt50LeftReal, APrtLoHi, APtLoReal, APtHiReal, APt0Real, #ifdef WITH_PSLOPE PSlope, #endif rtLoHi, InnerLoRT, InnerHiRT, OuterLoRT, OuterHiRT, halfDuration, slopeRatio, t0Real; // cursor windows: int pM; //peakMean, number of points used for averaging int RTFactor; // Lower point for the rise-time calculation std::size_t tLoIndex, tHiIndex, t50LeftIndex, t50RightIndex, APt50LeftIndex, APt50RightIndex, APtLoIndex, APtHiIndex; bool fromBase, viewCrosshair,viewBaseline,viewBaseSD,viewThreshold, viewPeakzero,viewPeakbase,viewPeakthreshold, viewRTLoHi, viewInnerRiseTime, viewOuterRiseTime, viewT50,viewRD,viewSloperise,viewSlopedecay,viewLatency, viewCursors; XZoom xzoom; std::vector yzoom; std::vector< std::vector > sec_attr; public: //! Constructor. /*! Does nothing but initialising the member list. */ wxStfDoc(); //! Destructor. ~wxStfDoc(); //! Swaps active and inactive channel /*! \param event The menu event that made the call. */ void OnSwapChannels( wxCommandEvent& event ); //! Override default file opening. /*! Attempts to identify the file type from the filter extension (such as "*.dat") * \param filename Full path of the file. * \return true if successfully opened, false otherwise. */ virtual bool OnOpenDocument(const wxString& filename); //! Open document without progress dialog. /*! Attempts to identify the file type from the filter extension (such as "*.dat") * \param filename Full path of the file. * \return true if successfully opened, false otherwise. */ virtual bool OnOpenPyDocument(const wxString& filename); //! Override default file saving. /*! \return true if successfully saved, false otherwise. */ virtual bool SaveAs(); #ifndef TEST_MINIMAL //! Override default file saving. /*! \param filename Full path of the file. * \return true if successfully saved, false otherwise. */ virtual bool DoSaveDocument(const wxString& filename); #endif //! Override default file closing. /*! Writes settings to the config file or registry before closing. * \return true if successfully closed, false otherwise. */ virtual bool OnCloseDocument(); //! Override default file creation. /*! \return true if successfully closed, false otherwise. */ virtual bool OnNewDocument(); //! Sets the content of a newly created file. /*! \param c_Data The data that is used for the new file. * \param Sender Pointer to the document that generated this file. * \param title Title of the new document. */ void SetData( const Recording& c_Data, const wxStfDoc* Sender, const wxString& title ); //! Indicates whether an average has been created. /*! \return true if an average has been created, false otherwise. */ bool GetIsAverage() const { return !Average.get().empty(); } //! Indicates whether the left decay cursor should always be at the peak of the trace. /*! \return true if the left decay cursor should be at the end of the trace, false otherwise. */ bool GetStartFitAtPeak() const { return startFitAtPeak; } //! Indicates whether the right peak cursor should always be at the end of a trace. /*! \return true if the right peak cursor should be at the end, false otherwise. */ bool GetPeakAtEnd() const { return peakAtEnd; } //! Indicates whether the the document is fully initialised. /*! The document has to be fully initialized before other parts of the * program start accessing it; for example, the graph might start reading out values * before they exist. * \return true if the document is fully initialised, false otherwise. */ bool IsInitialized() const { return initialized; } //! Sets the right peak cursor to the end of a trace. /*! \param value determines whether the peak cursor should be at the end of a trace. */ void SetPeakAtEnd(bool value) { peakAtEnd=value; } //! Sets the left decay cursor to the peak of the trace. /*! \param value determines whether the left decay cursor should be at the peak of the trace. */ void SetStartFitAtPeak(bool value) { startFitAtPeak=value; } //! Retrieves the average trace(s). /*! \return The average trace as a Recording object. */ const Recording& GetAverage() const { return Average; } //! Checks whether any cursor is reversed or out of range and corrects it if required. void CheckBoundaries(); //! Sets the current section to the specified value /*! Checks for out-of-range errors * \param section The 0-based index of the new section */ bool SetSection(std::size_t section); //! Creates a new window containing the selected sections of this file. /*! \return true upon success, false otherwise. */ bool OnNewfromselectedThis( ); //! Selects all sections /*! \param event The menu event that made the call. */ void Selectall(wxCommandEvent& event); //! Unselects all sections /*! \param event The menu event that made the call. */ void Deleteselected(wxCommandEvent& event); //! Updates the status of the selection button void UpdateSelectedButton(); //! Creates an average trace from the selected sections /*! \param calcSD Set to true if the standard deviation should be calculated as well, false otherwise * \param align Set to true if traces should be aligned to the point of steepest rise of the reference channel, * false otherwise. */ void CreateAverage( bool calcSD, bool align ); #if 0 //! Applies a user-defined function to the current data set /*! \param id The id of the user-defined function */ void Userdef(std::size_t id); #endif //! Toggles the selection status of the current section void ToggleSelect( ); //! Selects the current section if previously unselected void Select(); //! Unselects the current section if previously selected void Remove(); //! Creates a new document from the checked events /*! \param event The menu event that made the call. */ void Extract(wxCommandEvent& event); //! Erases all events, independent of whether they are checked or not /*! \param event The menu event that made the call. */ void InteractiveEraseEvents(wxCommandEvent& event); //! Adds an event at the current eventPos /*! \param event The menu event that made the call. */ void AddEvent( wxCommandEvent& event ); //! Subtracts the baseline of all selected traces. /*! \return true upon success, false otherwise. */ bool SubtractBase( ); //! Fit a function to the data. /*! \param event The menu event that made the call. */ void FitDecay(wxCommandEvent& event); //! Sets a pointer to the file menu attached to this document. /*! \param menu The menu to be attached. */ void SetFileMenu( wxMenu* menu ) { doc_file_menu = menu; } //! Measure everything using functions defined in measlib.h /*! This will measure the baseline, peak values, Lo to Hi% rise time, * half duration, maximal slopes during rise and decay, the ratio of these slopes * and the latency. */ void Measure(); //! Put the current measurement results into a text table. stfnum::Table CurResultsTable(); //! Retrieves the position of the measurement cursor (crosshair). /*! \return The index of the measurement cursor within the current section. */ std::size_t GetMeasCursor() const { return measCursor; } //! Retrieves the computation mode for baseline. /*! \return The current mode for computing the baseline. */ stfnum::baseline_method GetBaselineMethod() const { return baselineMethod; } //! Retrieves the position of the left baseline cursor. /*! \return The index of the left baseline cursor within the current section. */ std::size_t GetBaseBeg() const { return baseBeg; } //! Retrieves the position of the right baseline cursor /*! \return The index of the left baseline cursor within the current section. */ std::size_t GetBaseEnd() const { return baseEnd; } //! Retrieves the position of the left peak cursor. /*! \return The index of the left peak cursor within the current section. */ std::size_t GetPeakBeg() const { return peakBeg; } //! Retrieves the position of the right peak cursor. /*! \return The index of the right peak cursor within the current section. */ std::size_t GetPeakEnd() const { return peakEnd; } //! Retrieves the position of the left fitting cursor. /*! \return The index of the left fitting cursor within the current section. */ std::size_t GetFitBeg() const { return fitBeg; } //! Retrieves the position of the right fitting cursor. /*! \return The index of the right fitting cursor within the current section. */ std::size_t GetFitEnd() const { return fitEnd; } #ifdef WITH_PSLOPE //! Retrieves the position of the left PSlope cursor. /*! \return The index of the left PSlope cursor within the current section. */ std::size_t GetPSlopeBeg() const { return PSlopeBeg; } //! Retrieves the position of the right PSlope cursor. /*! \return The index of the right PSlope cursor within the current section. */ std::size_t GetPSlopeEnd() const { return PSlopeEnd; } #endif // WITH_PSLOPE //! Retrieves the number of points used for averaging during peak calculation. /*! \return The number of points to be used. */ int GetPM() const { return pM; } #ifdef WITH_PSLOPE //! Retrieves the number of points used for distance from the first cursor. /*! \return The number of points to be used. */ int GetDeltaT() const { return DeltaT; } #endif //! Retrieves the position of the left latency cursor. /*! \return The index of the left latency cursor within the current section. Note that by contrast * to the other cursors, this is a double because the latency cursor may be set to an interpolated * position between two data points. */ double GetLatencyBeg() const { return latencyStartCursor; } //! Retrieves the position of the right latency cursor. /*! \return The interpolated index of the right latency cursor within the current section. Note that * by contrast to the other cursors, this is a double because the latency cursor may be set to an * interpolated position between two data points. */ double GetLatencyEnd() const { return latencyEndCursor; } //! Retrieves the latency. /*! \return The latency, expressed in units of data points. */ double GetLatency() const { return latency; } //! Retrieves the time point at which Lo% of the maximal amplitude have been reached. /*! \return The time point at which Lo% of the maximal amplitude have been reached, expressed in * units of data points. */ double GetTLoReal() const { return tLoReal; } //! Retrieves the time point at which Hi% of the maximal amplitude have been reached. /*! \return The time point at which Hi% of the maximal amplitude have been reached, expressed in * units of data points. */ double GetTHiReal() const { return tHiReal; } //! Retrieves the time point at which Lo% of the maximal amplitude have been reached. /*! \return The time point at which Lo% of the maximal amplitude have been reached, expressed in * units of data points. */ double GetInnerLoRT() const { return InnerLoRT; } //! Retrieves the time point at which Hi% of the maximal amplitude have been reached. /*! \return The time point at which Hi% of the maximal amplitude have been reached, expressed in * units of data points. */ double GetInnerHiRT() const { return InnerHiRT; } //! Retrieves the time point at which Lo% of the maximal amplitude have been reached. /*! \return The time point at which Lo% of the maximal amplitude have been reached, expressed in * units of data points. */ double GetOuterLoRT() const { return OuterLoRT; } //! Retrieves the time point at which Hi% of the maximal amplitude have been reached. /*! \return The time point at which Hi% of the maximal amplitude have been reached, expressed in * units of data points. */ double GetOuterHiRT() const { return OuterHiRT; } //! Retrieves the extrapolated onset time point of an event in the active channel. /*! \return The onset time point of an event, extrapolated from the crossing of a line through * 20 and 80% of the event amplitude with the baseline. Expressed in units of data points. */ double GetT0Real() const { return t0Real; } //! Retrieves the time point at which 50% of the maximal amplitude have been reached from the left of the peak. /*! \return The time point at which 50% of the maximal amplitude have been reached from the left of the peak, * expressed in units of data points. */ double GetT50LeftReal() const { return t50LeftReal; } //! Retrieves the time point at which 50% of the maximal amplitude have been reached from the right of the peak. /*! \return The time point at which 50% of the maximal amplitude have been reached from the right of the peak, * expressed in units of data points. */ double GetT50RightReal() const { return t50RightReal; } //! Retrieves the y value at 50% of the maximal amplitude. /*! \return The y value at 50% of the maximal amplitude. */ double GetT50Y() const { return t50Y; } //! Retrieves the maximal slope of the rising phase. /*! \return The maximal slope during the rising phase. */ double GetMaxRise() const { return maxRise; } //! Retrieves the maximal slope of the decaying phase. /*! \return The maximal slope of rise. */ double GetMaxDecay() const { return maxDecay; } //! Retrieves the time point of the maximal slope of the rising phase in the second channel. /*! This time point is needed as a reference for the latency calculation and for aligned averages. * \return The time point at which the maximal slope of the rising phase is reached in the second channel, * expressed in units of data points.. */ double GetAPMaxRiseT() const { return APMaxRiseT; } //! Retrieves the time point of the peak in the second channel. /*! \return The time point at which the peak is found in the second channel, * expressed in units of data points. */ double GetAPMaxT() const { return APMaxT; } //! Retrieves the time point at which 50% of the max. amplitude have been reached from the left of the peak in the reference channel. /*! \return The time point at which 50% of the maximal amplitude have been reached from the left of the peak * in the reference channel, expressed in units of data points. */ double GetAPT50LeftReal() const { return APt50LeftReal; } //! Retrieves the extrapolated onset time point of an event in the reference channel. /*! \return The onset time point of an event, extrapolated from the crossing of a line through * 20 and 80% of the event amplitude with the baseline. Expressed in units of data points. */ double GetAPT0Real() const { return APt0Real; } //! Retrieves the time point of the maximal slope during the rising phase. /*! \return The time point of the maximal slope during the rising phase, expressed in units of data points. */ double GetMaxRiseT() const { return maxRiseT; } //! Retrieves the y-value at the time point of the maximal slope during the rising phase. /*! \return The y-value at the time point of the maximal slope during the rising phase. */ double GetMaxRiseY() const { return maxRiseY; } //! Retrieves the time point of the maximal slope during the decaying phase. /*! \return The time point of the maximal slope during the decaying phase, expressed in units of data points. */ double GetMaxDecayT() const { return maxDecayT; } //! Retrieves the y-value at the time point of the maximal slope during the decaying phase. /*! \return The y-value at the time point of the maximal slope during the decaying phase. */ double GetMaxDecayY() const { return maxDecayY; } //! Retrieves the y-value at the measurement cursor (crosshair). Will update measCursor if out of range. /*! \return The y-value at the measurement cursor. */ double GetMeasValue(); //! Retrieves the peak value. /*! \return The peak value. */ double GetPeak() const { return peak; } //! Retrieves the peak time value. /*! \return The peak time value. */ double GetPeakTime() const { return maxT; } //! Retrieves the baseline. /*! \return The baseline value. */ double GetBase() const { return base; } //! Retrieves the baseline in the second channel. /*! \return The baseline value in the second channel. */ double GetAPBase() const { return APBase; } //! Retrieves the standard deviation of the baseline. /*! \return The standard deviation of the baseline. */ double GetBaseSD() const { return baseSD; } //! Retrieves the value at which the threshold slope is crossed. /*! \return The standard deviation of the baseline. */ double GetThreshold() const { return threshold; } //! Retrieves the time point at which the peak is found. /*! \return The time point at which the peak is found, expressed in units of data points. */ double GetMaxT() const { return maxT; } //! Retrieves the time point at which the threshold slope is crossed. /*! \return The time point at which the threshold slope is crossed, or * a negative value if the threshold is not attained. */ double GetThrT() const { return thrT; } //! Retrieves the Lo to Hi% rise time. /*! \return The difference between GetTHiReal() and GetTLoReal(), expressed in units o data points. */ double GetRTLoHi() const { return rtLoHi; } //! Retrieves the inner rise time. /*! expressed in units o data points. */ double GetInnerRiseTime() const { return (InnerHiRT-InnerLoRT); } //! Retrieves the outer rise time. /*! expressed in units o data points. */ double GetOuterRiseTime() const { return (OuterHiRT-OuterLoRT); } //! Retrieves the full width at half-maximal amplitude ("half duration"). /*! \return The difference between GetT50RightReal() and GetT50LeftReal(), expressed in units of data points. */ double GetHalfDuration() const { return halfDuration; } //! Retrieves ratio of the maximal slopes during the rising and decaying phase. /*! \return The ratio of GetMaxRise() and GetMaxDecay(). */ double GetSlopeRatio() const { return slopeRatio; } //! Retrieves lower factor (e.g 20) for the rise time calculation. /*! \return lower factor value for rise time calculation expressed in percentage (e.g 20). */ int GetRTFactor() const { return RTFactor; } #ifdef WITH_PSLOPE //! Retrieves the value of the Slope /*! \return slope value in y-units/x-units. */ double GetPSlope() const { return PSlope; } #endif //! Retrieves the mode of the latency start cursor. /*! \return The current mode of the latency start cursor. */ stf::latency_mode GetLatencyStartMode() const { return latencyStartMode; } //! Retrieves the mode of the latency end cursor. /*! \return The current mode of the latency end cursor. */ stf::latency_mode GetLatencyEndMode() const { return latencyEndMode; } //! Retrieves the mode of the latency window. /*! \return The current mode of the latency window. */ stf::latency_window_mode GetLatencyWindowMode() const { return latencyWindowMode; } //! Retrieves the direction of peak calculations. /*! \return The current direction of peak calculations. */ stfnum::direction GetDirection() const { return direction; } #ifdef WITH_PSLOPE //! Retrieves the mode of the left PSlope cursor. /*! \return The current mode of the left PSlope cursor. */ stf::pslope_mode_beg GetPSlopeBegMode() const { return pslopeBegMode; } //! Retrieves the mode of the right PSlope cursor. /*! \return The current mode of the right PSlope cursor. */ stf::pslope_mode_end GetPSlopeEndMode() const { return pslopeEndMode; } #endif // WITH_PSLOPE //! Indicates whether to use the baseline as a reference for AP kinetics. /*! \return true if the baseline should be used, false if the threshold should be used. */ bool GetFromBase() const { return fromBase; } //! Indicates whether the measurement cursor (crosshair) value should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewCrosshair() const { return viewCrosshair; } //! Indicates whether the baseline value should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewBaseline() const { return viewBaseline; } //! Indicates whether the baseline's standard deviation should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewBaseSD() const { return viewBaseSD; } //! Indicates whether the threshold should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewThreshold() const { return viewThreshold; } //! Indicates whether the peak value (measured from zero) should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewPeakZero() const { return viewPeakzero; } //! Indicates whether the peak value (measured from baseline) should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewPeakBase() const { return viewPeakbase; } //! Indicates whether the peak value (measured from threshold) should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewPeakThreshold() const { return viewPeakthreshold; } //! Indicates whether the Lo to Hi% rise time should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewRTLoHi() const { return viewRTLoHi; } //! Indicates whether the inner rise time should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewInnerRiseTime() const { return viewInnerRiseTime; } //! Indicates whether the outer rise time should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewOuterRiseTime() const { return viewOuterRiseTime; } //! Indicates whether the half duration should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewT50() const { return viewT50; } //! Indicates whether the ratio of the maximal slopes during rise and decay should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewRD() const { return viewRD; } //! Indicates whether the maximal slope during the rising phase should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewSlopeRise() const { return viewSloperise; } //! Indicates whether the maximal slope during the decaying phase should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewSlopeDecay() const { return viewSlopedecay; } //! Indicates whether the latency should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewLatency() const { return viewLatency; } #ifdef WITH_PSLOPE //! Indicates whether the Slope should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewPSlope() const { return viewPSlope; } #endif //! Indicates whether two additional rows showing the positions of start and end cursors should be shown in the results table. /*! \return true if it should be shown, false otherwise. */ bool GetViewCursors() const { return viewCursors; } //! Returns the slope for threshold detection. /*! \return The slope value for threshold detection. */ double GetSlopeForThreshold() const { return slopeForThreshold; } //! Returns the current zoom settings for this channel (read-only). /*! \return The current zoom settings. */ const XZoom& GetXZoom() { return xzoom; } //! Returns the current zoom settings for this channel (read & write). /*! \return The current zoom settings. */ XZoom& GetXZoomW() { return xzoom; } //! Returns the current zoom settings for this channel (read-only). /*! \return The current zoom settings. */ const YZoom& GetYZoom(int ch) { return yzoom.at(ch); } //! Returns the current zoom settings for this channel (read & write). /*! \return The current zoom settings. */ YZoom& GetYZoomW(int ch) { return yzoom.at(ch); } //! Sets the position of the measurement cursor (crosshair). /*! \param value The index of the measurement cursor within the current section. */ void SetMeasCursor(int value); //! Sets whether the measurement cursor (crosshair) should be visible. /*! \param value is true if the ruler will be visible, false otherwirse.. */ void SetMeasRuler(bool value) { ShowRuler = value; } //! Retrieves whether the measurement cursor (crosshair) is visible. /*! \param true if the ruler is visible, false otherwirse.. */ bool GetMeasRuler() const { return ShowRuler;} //! Sets the method to compute the baseline. /*! \param value The new method to calculate the baseline. */ void SetBaselineMethod(stfnum::baseline_method value) { baselineMethod = value; } //! Sets the position of the left baseline cursor. /*! \param value The index of the left baseline cursor within the current section. */ void SetBaseBeg(int value); //! Sets the position of the right baseline cursor /*! \param value The index of the left baseline cursor within the current section. */ void SetBaseEnd(int value); //! Sets the position of the left peak cursor. /*! \param value The index of the left peak cursor within the current section. */ void SetPeakBeg(int value); //! Sets the position of the right peak cursor. /*! \param value The index of the right peak cursor within the current section. */ void SetPeakEnd(int value); //! Sets the position of the left fitting cursor. /*! \param value The index of the left fitting cursor within the current section. */ void SetFitBeg(int value); //! Sets the position of the right fitting cursor. /*! \param value The index of the right fitting cursor within the current section. */ void SetFitEnd(int value); //! Sets the position of the left latency cursor. /*! \param value The index of the left latency cursor within the current section. Note that by contrast * to the other cursors, this is a double because the latency cursor may be set to an interpolated * position between two data points. */ void SetLatencyBeg(double value); //! Sets the position of the right latency cursor. /*! \param value The index of the right latency cursor within the current section. Note that by contrast * to the other cursors, this is a double because the latency cursor may be set to an interpolated * position between two data points. */ void SetLatencyEnd(double value); //! Sets the latency. /*! \param value The latency, expressed in units of data points. */ void SetLatency(double value) { latency=value; } #ifdef WITH_PSLOPE //! Sets the position of the left PSlope cursor. /*! \param value The index of the left PSlope cursor within the current section. */ void SetPSlopeBeg(int value); //! Sets the position of the right PSlope cursor. /*! \param value The index of the right PSlope cursor within the current section. */ void SetPSlopeEnd(int value); //! Sets the PSlope. /*! \param value The slope, expressed in y-units/x-units. */ void SetPSlope(double value) { PSlope=value; } //! Set the position mode of the left PSlope cursor. /*! \param value The new mode of the left PSlope cursor. */ void SetPSlopeBegMode(stf::pslope_mode_beg value) { pslopeBegMode=value; } //! Set the position mode of the right PSlope cursor. /*! \param value The new mode of the right PSlope cursor. */ void SetPSlopeEndMode(stf::pslope_mode_end value) { pslopeEndMode=value; } //! Sets the number of points used for the distance from the first cursor. /*! \param value The number of points to be used. */ void SetDeltaT(int value) { DeltaT=value; } #endif // WITH_PSLOPE //! Sets the number of points used for averaging during peak calculation. /*! \param value The number of points to be used. */ void SetPM(int value) { pM=value; } //! Sets the lower value (e.g 20) to calculate the rise time. /*! \param value The lower percentage (e.g 20) to be used to c calculate the rise time. */ void SetRTFactor(int value); //! Sets the mode of the latency start cursor. /*! \param value The new mode of the latency start cursor. */ void SetLatencyStartMode(stf::latency_mode value) { latencyStartMode=value; } //! Sets the mode of the latency end cursor. /*! \param value The new mode of the latency end cursor. */ void SetLatencyEndMode(stf::latency_mode value) { latencyEndMode=value; } //! Sets the mode of the latency end cursor. /*! \param value The new mode of the latency end cursor.. */ void SetLatencyWindowMode(stf::latency_window_mode value) { latencyWindowMode=value; } //! Sets the mode of the latency start cursor. /*! \param value The new mode of the latency start cursor.. */ void SetLatencyStartMode(int value); //! Sets the mode of the latency end cursor. /*! \param value The new mode of the latency end cursor.. */ void SetLatencyEndMode(int value); //! Sets the mode of the latency end cursor. /*! \param value The new mode of the latency end cursor.. */ void SetLatencyWindowMode(int value); //! Sets the direction of peak calculations. /*! \param value The new direction of peak calculations. */ void SetDirection(stfnum::direction value) { direction=value; } //! Sets the reference for AP kinetics measurements. /*! \param frombase true if the baseline should be used, false if the threshold should be used. */ void SetFromBase(bool frombase) { fromBase = frombase; } //! Determines whether the measurement cursor (crosshair) value should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewCrosshair(bool value) { viewCrosshair=value; } //! Determines whether the baseline value should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewBaseline(bool value) { viewBaseline=value; } //! Determines whether the baseline's standard deviation should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewBaseSD(bool value) { viewBaseSD=value; } //! Determines whether the threshold should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewThreshold(bool value) { viewThreshold=value; } //! Determines whether the peak value (measured from zero) should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewPeakZero(bool value) { viewPeakzero=value; } //! Determines whether the peak value (measured from baseline) should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewPeakBase(bool value) { viewPeakbase=value; } //! Determines whether the peak value (measured from threshold) should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewPeakThreshold(bool value) { viewPeakthreshold=value; } //! Determines whether the Lo to Hi% rise time should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewRTLoHi(bool value) { viewRTLoHi=value; } //! Determines whether the inner rise time should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewInnerRiseTime(bool value) { viewInnerRiseTime=value; } //! Determines whether the outer rise time should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewOuterRiseTime(bool value) { viewOuterRiseTime=value; } //! Determines whether the half duration should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewT50(bool value) { viewT50=value; } //! Determines whether the ratio of the maximal slopes during rise and decay should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewRD(bool value) { viewRD=value; } //! Determines whether the maximal slope during the rising phase should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewSlopeRise(bool value) { viewSloperise=value; } //! Determines whether the maximal slope during the decaying phase should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewSlopeDecay(bool value) { viewSlopedecay=value; } //! Determines whether the latency should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewLatency(bool value) { viewLatency=value; } #ifdef WITH_PSLOPE //! Determines whether the slope should be shown in the results table. /*! \param value Set to true if it should be shown, false otherwise. */ void SetViewPSlope(bool value) { viewPSlope=value; } #endif //! Determines whether two additional rows showing the positions of start and end cursors should be shown in the results table. /*! \param value Set to true if they should be shown, false otherwise. */ void SetViewCursors(bool value) { viewCursors=value; } //! Sets the slope where the baseline should be set. /*! \param value The slope value where the baseline shoudl be set. */ void SetSlopeForThreshold(double value) { slopeForThreshold=value; } //! Put the current trace into a text table. stfnum::Table CurAsTable() const; //! Copies the cursor positions from another Recording to this Recording. /*! This will copy the crosshair, base, peak and fit cursors positions as * well as the number of points for peak averaging from another Recording * and correct the new values if they are out of range. The latency cursors * will not be copied. * \param c_Recording The Recording from which to copy the cursor positions. */ void CopyCursors(const wxStfDoc& c_Recording); //! Resize the Recording to a new number of channels. /*! Resizes both the channel and the global y units arrays. * \param c_n_channels The new number of channels. */ virtual void resize(std::size_t c_n_channels); //! Insert a Channel at a given position. /*! Will throw std::out_of_range if range check fails. * \param c_Channel The Channel to be inserted. * \param pos The position at which to insert the channel (0-based). */ virtual void InsertChannel(Channel& c_Channel, std::size_t pos); const stf::SectionAttributes& GetSectionAttributes(std::size_t nchannel, std::size_t nsection) const; const stf::SectionAttributes& GetCurrentSectionAttributes() const; stf::SectionAttributes& GetCurrentSectionAttributesW(); //! Deletes the current fit, sets isFitted to false; void DeleteFit(std::size_t nchannel, std::size_t nsection); //! Sets the best-fit parameters when a fit has been performed on this section. /*! \param bestFitP_ The best-fit parameters \param fitFunc_ The function used for fitting \param chisqr The sum of squared errors \param fitBeg Sampling point index where the fit starts \param fitEnd Sampling point index where the fit ends */ void SetIsFitted( std::size_t nchannel, std::size_t nsection, const Vector_double& bestFitP_, stfnum::storedFunc* fitFunc_, double chisqr, std::size_t fitBeg, std::size_t fitEnd ); //! Determines whether an integral has been calculated in this section. /*! \return true if an integral has been calculated, false otherwise. */ void SetIsIntegrated(std::size_t nchannel, std::size_t nsection, bool value, std::size_t begin, std::size_t end, const Vector_double& quad_p_); //! Erases all events. void ClearEvents(std::size_t nchannel, std::size_t nsection); void correctRangeR(int& value); void correctRangeR(std::size_t& value); bool LoadTDMS(const std::string& filename, Recording& ReturnData); DECLARE_EVENT_TABLE() }; /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/copygrid.cpp0000775000175000017500000003332613062445067015606 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // copygrid.cpp // Derived from wxGrid to allow copying to clipboard // 2007-12-27, Christoph Schmidt-Hieber, University of Freiburg #include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "wx/grid.h" #include "wx/clipbrd.h" #include "./app.h" #include "./doc.h" #include "./parentframe.h" #include "./childframe.h" #include "./view.h" #include "./graph.h" #include "./copygrid.h" IMPLEMENT_CLASS(wxStfGrid, wxGrid) BEGIN_EVENT_TABLE(wxStfGrid, wxGrid) EVT_MENU(ID_COPYINTABLE,wxStfGrid::Copy) EVT_MENU(ID_VIEW_MEASURE,wxStfGrid::ViewCrosshair) EVT_MENU(ID_VIEW_BASELINE,wxStfGrid::ViewBaseline) EVT_MENU(ID_VIEW_BASESD,wxStfGrid::ViewBaseSD) EVT_MENU(ID_VIEW_THRESHOLD,wxStfGrid::ViewThreshold) EVT_MENU(ID_VIEW_PEAKZERO,wxStfGrid::ViewPeakzero) EVT_MENU(ID_VIEW_PEAKBASE,wxStfGrid::ViewPeakbase) EVT_MENU(ID_VIEW_PEAKTHRESHOLD,wxStfGrid::ViewPeakthreshold) EVT_MENU(ID_VIEW_RTLOHI,wxStfGrid::ViewRTLoHi) EVT_MENU(ID_VIEW_INNERRISETIME,wxStfGrid::ViewInnerRiseTime) EVT_MENU(ID_VIEW_OUTERRISETIME,wxStfGrid::ViewOuterRiseTime) EVT_MENU(ID_VIEW_T50,wxStfGrid::ViewT50) EVT_MENU(ID_VIEW_RD,wxStfGrid::ViewRD) EVT_MENU(ID_VIEW_SLOPERISE,wxStfGrid::ViewSloperise) EVT_MENU(ID_VIEW_SLOPEDECAY,wxStfGrid::ViewSlopedecay) EVT_MENU(ID_VIEW_LATENCY,wxStfGrid::ViewLatency) #ifdef WITH_PSLOPE EVT_MENU(ID_VIEW_PSLOPE,wxStfGrid::ViewPSlope) #endif EVT_MENU(ID_VIEW_CURSORS,wxStfGrid::ViewCursors) EVT_GRID_CELL_RIGHT_CLICK(wxStfGrid::OnRClick) EVT_GRID_LABEL_RIGHT_CLICK(wxStfGrid::OnLabelRClick) EVT_KEY_DOWN( wxStfGrid::OnKeyDown ) END_EVENT_TABLE() wxStfGrid::wxStfGrid( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxGrid(parent,id,pos,size,style,name), selection(wxT("")) { m_context.reset(new wxMenu()); m_context->Append(ID_COPYINTABLE, wxT("Copy selection")); m_labelContext.reset(new wxMenu()); m_labelContext->AppendCheckItem(ID_VIEW_MEASURE,wxT("Crosshair")); m_labelContext->AppendCheckItem(ID_VIEW_BASELINE,wxT("Baseline")); m_labelContext->AppendCheckItem(ID_VIEW_BASESD,wxT("Base SD")); m_labelContext->AppendCheckItem(ID_VIEW_THRESHOLD,wxT("Threshold")); m_labelContext->AppendCheckItem(ID_VIEW_PEAKZERO,wxT("Peak (from 0)")); m_labelContext->AppendCheckItem(ID_VIEW_PEAKBASE,wxT("Peak (from base)")); m_labelContext->AppendCheckItem(ID_VIEW_PEAKTHRESHOLD,wxT("Peak (from threshold)")); m_labelContext->AppendCheckItem(ID_VIEW_RTLOHI,wxT("RT (Lo-Hi%)")); m_labelContext->AppendCheckItem(ID_VIEW_INNERRISETIME,wxT("inner Rise Time (experimental)")); m_labelContext->AppendCheckItem(ID_VIEW_OUTERRISETIME,wxT("outer Rise Time (experimental)")); m_labelContext->AppendCheckItem(ID_VIEW_T50,wxT("t50")); m_labelContext->AppendCheckItem(ID_VIEW_RD,wxT("Rise/Decay")); m_labelContext->AppendCheckItem(ID_VIEW_SLOPERISE,wxT("Slope (rise)")); m_labelContext->AppendCheckItem(ID_VIEW_SLOPEDECAY,wxT("Slope (decay)")); m_labelContext->AppendCheckItem(ID_VIEW_LATENCY,wxT("Latency")); #ifdef WITH_PSLOPE m_labelContext->AppendCheckItem(ID_VIEW_PSLOPE,wxT("PSlope")); #endif m_labelContext->AppendSeparator(); m_labelContext->AppendCheckItem(ID_VIEW_CURSORS,wxT("Cursors")); } void wxStfGrid::Copy(wxCommandEvent& WXUNUSED(event)) { if (!IsSelection()) { wxGetApp().ErrorMsg( wxT("Select cells first") ); return; } // Write some text to the clipboard // These data objects are held by the clipboard, // so do not delete them in the app. selection.Clear(); bool newline=true; for (int nRow=0;nRowOpen()) { wxTheClipboard->SetData( new wxTextDataObject(selection) ); wxTheClipboard->Close(); } } void wxStfGrid::OnRClick(wxGridEvent& event) { event.Skip(); PopupMenu(m_context.get()); } void wxStfGrid::OnLabelRClick(wxGridEvent& event) { event.Skip(); // Update checkmarks: m_labelContext->Check(ID_VIEW_MEASURE,wxGetApp().GetActiveDoc()->GetViewCrosshair()); m_labelContext->Check(ID_VIEW_BASELINE,wxGetApp().GetActiveDoc()->GetViewBaseline()); m_labelContext->Check(ID_VIEW_BASESD,wxGetApp().GetActiveDoc()->GetViewBaseSD()); m_labelContext->Check(ID_VIEW_THRESHOLD,wxGetApp().GetActiveDoc()->GetViewThreshold()); m_labelContext->Check(ID_VIEW_PEAKZERO,wxGetApp().GetActiveDoc()->GetViewPeakZero()); m_labelContext->Check(ID_VIEW_PEAKBASE,wxGetApp().GetActiveDoc()->GetViewPeakBase()); m_labelContext->Check(ID_VIEW_PEAKTHRESHOLD,wxGetApp().GetActiveDoc()->GetViewPeakThreshold()); m_labelContext->Check(ID_VIEW_RTLOHI,wxGetApp().GetActiveDoc()->GetViewRTLoHi()); m_labelContext->Check(ID_VIEW_INNERRISETIME,wxGetApp().GetActiveDoc()->GetViewInnerRiseTime()); m_labelContext->Check(ID_VIEW_OUTERRISETIME,wxGetApp().GetActiveDoc()->GetViewOuterRiseTime()); m_labelContext->Check(ID_VIEW_T50,wxGetApp().GetActiveDoc()->GetViewT50()); m_labelContext->Check(ID_VIEW_RD,wxGetApp().GetActiveDoc()->GetViewRD()); m_labelContext->Check(ID_VIEW_SLOPERISE,wxGetApp().GetActiveDoc()->GetViewSlopeRise()); m_labelContext->Check(ID_VIEW_SLOPEDECAY,wxGetApp().GetActiveDoc()->GetViewSlopeDecay()); m_labelContext->Check(ID_VIEW_LATENCY,wxGetApp().GetActiveDoc()->GetViewLatency()); #ifdef WITH_PSLOPE m_labelContext->Check(ID_VIEW_PSLOPE,wxGetApp().GetActiveDoc()->GetViewPSlope()); #endif m_labelContext->Check(ID_VIEW_CURSORS,wxGetApp().GetActiveDoc()->GetViewCursors()); PopupMenu(m_labelContext.get()); } void wxStfGrid::OnKeyDown(wxKeyEvent& event) { // Handle CTRL + 'c' //event.Skip(); switch (event.GetKeyCode()) { case 67: case 99: { if (event.ControlDown()) { wxCommandEvent dEvent; Copy(dEvent); } break; } default: // pipe everything else to the graph if (wxGetApp().GetActiveView()!=NULL && wxGetApp().GetActiveView()->GetGraph()!=NULL) wxGetApp().GetActiveView()->GetGraph()->OnKeyDown(event); } } void wxStfGrid::ViewResults() { // Update checkmarks: m_labelContext->Check(ID_VIEW_MEASURE,wxGetApp().GetActiveDoc()->GetViewCrosshair()); m_labelContext->Check(ID_VIEW_BASELINE,wxGetApp().GetActiveDoc()->GetViewBaseline()); m_labelContext->Check(ID_VIEW_BASESD,wxGetApp().GetActiveDoc()->GetViewBaseSD()); m_labelContext->Check(ID_VIEW_THRESHOLD,wxGetApp().GetActiveDoc()->GetViewThreshold()); m_labelContext->Check(ID_VIEW_PEAKZERO,wxGetApp().GetActiveDoc()->GetViewPeakZero()); m_labelContext->Check(ID_VIEW_PEAKBASE,wxGetApp().GetActiveDoc()->GetViewPeakBase()); m_labelContext->Check(ID_VIEW_PEAKTHRESHOLD,wxGetApp().GetActiveDoc()->GetViewPeakThreshold()); m_labelContext->Check(ID_VIEW_RTLOHI,wxGetApp().GetActiveDoc()->GetViewRTLoHi()); m_labelContext->Check(ID_VIEW_INNERRISETIME,wxGetApp().GetActiveDoc()->GetViewInnerRiseTime()); m_labelContext->Check(ID_VIEW_OUTERRISETIME,wxGetApp().GetActiveDoc()->GetViewOuterRiseTime()); m_labelContext->Check(ID_VIEW_T50,wxGetApp().GetActiveDoc()->GetViewT50()); m_labelContext->Check(ID_VIEW_RD,wxGetApp().GetActiveDoc()->GetViewRD()); m_labelContext->Check(ID_VIEW_SLOPERISE,wxGetApp().GetActiveDoc()->GetViewSlopeRise()); m_labelContext->Check(ID_VIEW_SLOPEDECAY,wxGetApp().GetActiveDoc()->GetViewSlopeDecay()); m_labelContext->Check(ID_VIEW_LATENCY,wxGetApp().GetActiveDoc()->GetViewLatency()); #ifdef WITH_PSLOPE m_labelContext->Check(ID_VIEW_PSLOPE,wxGetApp().GetActiveDoc()->GetViewPSlope()); #endif m_labelContext->Check(ID_VIEW_CURSORS,wxGetApp().GetActiveDoc()->GetViewCursors()); PopupMenu(m_labelContext.get()); } void wxStfGrid::ViewCrosshair(wxCommandEvent& event) { event.Skip(); // Toggle on or off: wxGetApp().GetActiveDoc()->SetViewCrosshair(m_labelContext->IsChecked(ID_VIEW_MEASURE)); SetCheckmark(wxT("ViewCrosshair"),ID_VIEW_MEASURE); } void wxStfGrid::ViewBaseline(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewBaseline(m_labelContext->IsChecked(ID_VIEW_BASELINE)); SetCheckmark(wxT("ViewBaseline"),ID_VIEW_BASELINE); } void wxStfGrid::ViewBaseSD(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewBaseSD(m_labelContext->IsChecked(ID_VIEW_BASESD)); SetCheckmark(wxT("ViewBaseSD"),ID_VIEW_BASESD); } void wxStfGrid::ViewThreshold(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewThreshold(m_labelContext->IsChecked(ID_VIEW_THRESHOLD)); SetCheckmark(wxT("ViewThreshold"),ID_VIEW_THRESHOLD); } void wxStfGrid::ViewPeakzero(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewPeakZero(m_labelContext->IsChecked(ID_VIEW_PEAKZERO)); SetCheckmark(wxT("ViewPeakzero"),ID_VIEW_PEAKZERO); } void wxStfGrid::ViewPeakbase(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewPeakBase(m_labelContext->IsChecked(ID_VIEW_PEAKBASE)); SetCheckmark(wxT("ViewPeakbase"),ID_VIEW_PEAKBASE); } void wxStfGrid::ViewPeakthreshold(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewPeakThreshold(m_labelContext->IsChecked(ID_VIEW_PEAKTHRESHOLD)); SetCheckmark(wxT("ViewPeakthreshold"),ID_VIEW_PEAKTHRESHOLD); } void wxStfGrid::ViewRTLoHi(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewRTLoHi(m_labelContext->IsChecked(ID_VIEW_RTLOHI)); SetCheckmark(wxT("ViewRTLoHi"),ID_VIEW_RTLOHI); } void wxStfGrid::ViewInnerRiseTime(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewInnerRiseTime(m_labelContext->IsChecked(ID_VIEW_INNERRISETIME)); SetCheckmark(wxT("ViewInnerRiseTime"),ID_VIEW_INNERRISETIME); } void wxStfGrid::ViewOuterRiseTime(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewOuterRiseTime(m_labelContext->IsChecked(ID_VIEW_OUTERRISETIME)); SetCheckmark(wxT("ViewOuterRiseTime"),ID_VIEW_OUTERRISETIME); } void wxStfGrid::ViewT50(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewT50(m_labelContext->IsChecked(ID_VIEW_T50)); SetCheckmark(wxT("ViewT50"),ID_VIEW_T50); } void wxStfGrid::ViewRD(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewRD(m_labelContext->IsChecked(ID_VIEW_RD)); SetCheckmark(wxT("ViewRD"),ID_VIEW_RD); } void wxStfGrid::ViewSloperise(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewSlopeRise(m_labelContext->IsChecked(ID_VIEW_SLOPERISE)); SetCheckmark(wxT("ViewSloperise"),ID_VIEW_SLOPERISE); } void wxStfGrid::ViewSlopedecay(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewSlopeDecay(m_labelContext->IsChecked(ID_VIEW_SLOPEDECAY)); SetCheckmark(wxT("ViewSlopedecay"),ID_VIEW_SLOPEDECAY); } void wxStfGrid::ViewLatency(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewLatency(m_labelContext->IsChecked(ID_VIEW_LATENCY)); SetCheckmark(wxT("ViewLatency"),ID_VIEW_LATENCY); } #ifdef WITH_PSLOPE void wxStfGrid::ViewPSlope(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewPSlope(m_labelContext->IsChecked(ID_VIEW_PSLOPE)); SetCheckmark(wxT("ViewPSlope"),ID_VIEW_PSLOPE); } #endif void wxStfGrid::ViewCursors(wxCommandEvent& event) { event.Skip(); wxGetApp().GetActiveDoc()->SetViewCursors(m_labelContext->IsChecked(ID_VIEW_CURSORS)); SetCheckmark(wxT("ViewCursors"),ID_VIEW_CURSORS); } void wxStfGrid::SetCheckmark(const wxString& RegEntry, int id) { // Toggle on or off: if (m_labelContext->IsChecked(id)) { wxGetApp().wxWriteProfileInt(wxT("Settings"),RegEntry,1); } else { wxGetApp().wxWriteProfileInt(wxT("Settings"),RegEntry,0); } // Update table: wxStfChildFrame* pChild=(wxStfChildFrame*)GetMainFrame()->GetActiveChild(); pChild->UpdateResults(); } stimfit-0.15.8/src/stimfit/gui/usrdlg/0000775000175000017500000000000013315356572014633 500000000000000stimfit-0.15.8/src/stimfit/gui/usrdlg/usrdlg.cpp0000775000175000017500000000471113062445067016562 00000000000000#include #ifndef WX_PRECOMP #include #endif #include "./usrdlg.h" BEGIN_EVENT_TABLE( wxStfUsrDlg, wxDialog ) END_EVENT_TABLE() wxStfUsrDlg::wxStfUsrDlg( wxWindow* parent, const stf::UserInput& input_, int id, wxPoint pos, wxSize size, int style #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) ) : wxDialog( parent, id, input_.title, pos, size, style ), #else ) : wxDialog( parent, id, wxString(input_.title.c_str(), wxConvUTF8), pos, size, style ), #endif input(input_), retVec(input_.labels.size()), m_textCtrlArray(input_.labels.size()), m_staticTextArray(input_.labels.size()) { wxFlexGridSizer* gSizer; gSizer = new wxFlexGridSizer( (int)input.labels.size(), 2, 0, 0 ); for (std::size_t nRow=0;nRowAdd( m_staticTextArray[nRow], 0, wxALIGN_CENTER_VERTICAL | wxALL, 2 ); wxString defLabel; defLabel << input.defaults[nRow]; m_textCtrlArray[nRow]= new wxTextCtrl( this, wxID_ANY, defLabel, wxDefaultPosition, wxSize(64,20), wxTE_RIGHT ); gSizer->Add( m_textCtrlArray[nRow], 0, wxALIGN_CENTER_VERTICAL | wxALL, 2 ); } wxSizer* topSizer; topSizer=new wxBoxSizer(wxVERTICAL); topSizer->Add(gSizer,0,wxALIGN_CENTER,5); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizer->AddButton( new wxButton( this, wxID_OK ) ); m_sdbSizer->AddButton( new wxButton( this, wxID_CANCEL ) ); m_sdbSizer->Realize(); topSizer->Add( m_sdbSizer, 0, wxALIGN_CENTER, 5 ); topSizer->SetSizeHints(this); this->SetSizer( topSizer ); this->Layout(); } void wxStfUsrDlg::EndModal(int retCode) { // similar to overriding OnOK in MFC (I hope...) if (retCode==wxID_OK) { if (!OnOK()) { wxLogMessage(wxT("Check your entries")); return; } } wxDialog::EndModal(retCode); } bool wxStfUsrDlg::OnOK() { try { for (std::size_t n=0;nGetValue(); entry.ToDouble( &retVec[n] ); } } catch (const std::out_of_range&) { return false; } return true; } stimfit-0.15.8/src/stimfit/gui/usrdlg/usrdlg.h0000775000175000017500000000474313062445067016234 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file usrdlg.h * \author Christoph Schmidt-Hieber * \date 2008-01-20 * \brief Declares wxStfUsrDlg. */ #ifndef _USRDLG_H #define _USRDLG_H /*! \addtogroup wxstf * @{ */ #ifdef _MSC_VER #pragma warning( disable : 4251 ) // Disable warning messages #endif #include #include #include #include "./../../stf.h" //! A user-defined dialog for entering floating-point numbers. class wxStfUsrDlg : public wxDialog { DECLARE_EVENT_TABLE() private: stf::UserInput input; Vector_double retVec; wxStdDialogButtonSizer* m_sdbSizer; std::vector m_textCtrlArray; std::vector m_staticTextArray; //! Only called when a modal dialog is closed with the OK button. /*! \return true if all dialog entries could be read successfully */ bool OnOK(); public: //! Constructor /*! \param parent Pointer to parent window. * \param input_ A stf::UserInput struct. * \param id Window id. * \param pos Initial position. * \param size Initial size. * \param style Dialog style. */ wxStfUsrDlg( wxWindow* parent, const stf::UserInput& input_, int id = wxID_ANY, wxPoint pos = wxDefaultPosition, wxSize size = wxDefaultSize, int style = wxCAPTION ); //! Get the user entries. /*! \return The user entries as a vector of doubles. */ Vector_double readInput() const {return retVec;} //! Called upon ending a modal dialog. /*! \param retCode The dialog button id that ended the dialog * (e.g. wxID_OK) */ virtual void EndModal(int retCode); }; /*! @} */ #endif stimfit-0.15.8/src/stimfit/gui/doc.cpp0000775000175000017500000036414013315356003014524 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // doc.cpp // The document class, derived from both wxDocument and recording // 2007-12-27, Christoph Schmidt-Hieber, University of Freiburg // For compilers that support precompilation, includes "wx/wx.h". #include #include #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #if !wxUSE_DOC_VIEW_ARCHITECTURE #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! #endif #include "./app.h" #include "./view.h" #include "./parentframe.h" #include "./childframe.h" #include "./dlgs/smalldlgs.h" #include "./dlgs/fitseldlg.h" #include "./dlgs/eventdlg.h" #include "./dlgs/cursorsdlg.h" #include "./../../libstfnum/stfnum.h" #include "./../../libstfnum/fit.h" #include "./../../libstfnum/funclib.h" #include "./../../libstfnum/measure.h" #include "./../../libstfio/stfio.h" #ifdef WITH_PYTHON #include "./../../pystfio/pystfio.h" #endif #include "./usrdlg/usrdlg.h" #include "./doc.h" #include "./graph.h" IMPLEMENT_DYNAMIC_CLASS(wxStfDoc, wxDocument) BEGIN_EVENT_TABLE( wxStfDoc, wxDocument ) EVT_MENU( ID_SWAPCHANNELS, wxStfDoc::OnSwapChannels ) EVT_MENU( ID_FILEINFO, wxStfDoc::Fileinfo) EVT_MENU( ID_NEWFROMSELECTEDTHIS, wxStfDoc::OnNewfromselectedThisMenu ) EVT_MENU( ID_MYSELECTALL, wxStfDoc::Selectall ) EVT_MENU( ID_UNSELECTALL, wxStfDoc::Deleteselected ) EVT_MENU( ID_SELECTSOME, wxStfDoc::Selectsome ) EVT_MENU( ID_UNSELECTSOME, wxStfDoc::Unselectsome ) EVT_MENU( ID_SELECT_AND_ADD, wxStfDoc::SelectTracesOfType ) EVT_MENU( ID_SELECT_AND_REMOVE, wxStfDoc::UnselectTracesOfType ) EVT_MENU( ID_CONCATENATE_MULTICHANNEL, wxStfDoc::ConcatenateMultiChannel ) EVT_MENU( ID_BATCH, wxStfDoc::OnAnalysisBatch ) EVT_MENU( ID_INTEGRATE, wxStfDoc::OnAnalysisIntegrate ) EVT_MENU( ID_DIFFERENTIATE, wxStfDoc::OnAnalysisDifferentiate ) EVT_MENU( ID_MULTIPLY, wxStfDoc::Multiply) EVT_MENU( ID_SUBTRACTBASE, wxStfDoc::SubtractBaseMenu ) EVT_MENU( ID_FIT, wxStfDoc::FitDecay) EVT_MENU( ID_LFIT, wxStfDoc::LFit) EVT_MENU( ID_LOG, wxStfDoc::LnTransform) EVT_MENU( ID_FILTER,wxStfDoc::Filter) EVT_MENU( ID_POVERN,wxStfDoc::P_over_N) EVT_MENU( ID_PLOTCRITERION,wxStfDoc::Plotcriterion) EVT_MENU( ID_PLOTCORRELATION,wxStfDoc::Plotcorrelation) EVT_MENU( ID_PLOTDECONVOLUTION,wxStfDoc::Plotdeconvolution) EVT_MENU( ID_EXTRACT,wxStfDoc::MarkEvents ) EVT_MENU( ID_THRESHOLD,wxStfDoc::Threshold) EVT_MENU( ID_VIEWTABLE, wxStfDoc::Viewtable) EVT_MENU( ID_EVENT_EXTRACT, wxStfDoc::Extract ) EVT_MENU( ID_EVENT_ERASE, wxStfDoc::InteractiveEraseEvents ) EVT_MENU( ID_EVENT_ADDEVENT, wxStfDoc::AddEvent ) END_EVENT_TABLE() static const int baseline=100; // static const double rtfrac = 0.2; // now expressed in percentage, see RTFactor wxStfDoc::wxStfDoc() : Recording(),peakAtEnd(false), startFitAtPeak(false), initialized(false),progress(true), Average(0), latencyStartMode(stf::riseMode), latencyEndMode(stf::footMode), latencyWindowMode(stf::defaultMode), direction(stfnum::both), #ifdef WITH_PSLOPE pslopeBegMode(stf::psBeg_manualMode), pslopeEndMode(stf::psEnd_manualMode), #endif baseBeg(0), baseEnd(0), peakBeg(0), peakEnd(0), fitBeg(0), fitEnd(0), baselineMethod(stfnum::mean_sd), #ifdef WITH_PSLOPE PSlopeBeg(0), PSlopeEnd(0), DeltaT(0), viewPSlope(true), #endif measCursor(0), ShowRuler(false), latencyStartCursor(0.0), latencyEndCursor(0.0), latency(0.0), base(0.0), APBase(0.0), baseSD(0.0), threshold(0.0), slopeForThreshold(20.0), peak(0.0), APPeak(0.0), tLoReal(0), tHiReal(0), t50LeftReal(0), t50RightReal(0), maxT(0.0), thrT(-1.0), maxRiseY(0.0), maxRiseT(0.0), maxDecayY(0.0), maxDecayT(0.0), maxRise(0.0), maxDecay(0.0), t50Y(0.0), APMaxT(0.0), APMaxRiseY(0.0), APMaxRiseT(0.0), APt50LeftReal(0.0), APrtLoHi(0.0), APtLoReal(0.0), APtHiReal(0.0), APt0Real(0.0), #ifdef WITH_PSLOPE PSlope(0.0), #endif rtLoHi(0.0), InnerLoRT(NAN), InnerHiRT(NAN), OuterLoRT(NAN), OuterHiRT(NAN), halfDuration(0.0), slopeRatio(0.0), t0Real(0.0), pM(1), RTFactor(20), tLoIndex(0), tHiIndex(0), t50LeftIndex(0), t50RightIndex(0), APt50LeftIndex(0), APt50RightIndex(0), APtLoIndex(0), APtHiIndex(0), fromBase(true), viewCrosshair(true), viewBaseline(true), viewBaseSD(true), viewThreshold(false), viewPeakzero(true), viewPeakbase(true), viewPeakthreshold(false), viewRTLoHi(true), viewInnerRiseTime(false), viewOuterRiseTime(false), viewT50(true), viewRD(true), viewSloperise(true), viewSlopedecay(true), viewLatency(true), viewCursors(true), xzoom(XZoom(0, 0.1, false)), yzoom(size(), YZoom(500,0.1,false)), sec_attr(size()) { for (std::size_t nchannel=0; nchannel < sec_attr.size(); ++nchannel) { sec_attr[nchannel].resize(at(nchannel).size()); } } wxStfDoc::~wxStfDoc() {} bool wxStfDoc::OnOpenPyDocument(const wxString& filename) { progress = false; bool success = OnOpenDocument( filename ); progress = true; return success; } bool wxStfDoc::OnOpenDocument(const wxString& filename) { // Check whether the file exists: if ( !wxFileName::FileExists( filename ) ) { wxString msg; msg << wxT("Couldn't find ") << filename; wxGetApp().ErrorMsg( msg ); return false; } // Store directory: wxFileName wxfFilename( filename ); wxGetApp().wxWriteProfileString( wxT("Settings"), wxT("Last directory"), wxfFilename.GetPath() ); if (wxDocument::OnOpenDocument(filename)) { //calls base class function #ifndef TEST_MINIMAL #if 0 //(defined(WITH_BIOSIG) || defined(WITH_BIOSIG2) && !defined(__WXMAC__)) // Detect type of file according to filter: wxString filter(GetDocumentTemplate()->GetFileFilter()); #else wxString filter(wxT("*.") + wxfFilename.GetExt()); #endif stfio::filetype type = stfio::findType(stf::wx2std(filter)); #else stfio::filetype type = stfio::none; #endif #if 0 // TODO: backport ascii if (type==stf::ascii) { if (!wxGetApp().get_directTxtImport()) { wxStfTextImportDlg ImportDlg( GetDocumentWindow(), stf::CreatePreview(filename), 1, false ); if (ImportDlg.ShowModal()!=wxID_OK) { get().clear(); return false; } // store settings in application: wxGetApp().set_txtImportSettings(ImportDlg.GetTxtImport()); } } #endif if (type == stfio::tdms) { #ifdef WITH_PYTHON if (!LoadTDMS(stf::wx2std(filename), *this)) { wxString errorMsg(wxT("Error opening file\n")); #else { wxString errorMsg(wxT("Error opening file - TDMS requires python \n")); #endif wxGetApp().ExceptMsg(errorMsg); get().clear(); return false; } } else { try { if (progress) { stf::wxProgressInfo progDlg("Reading file", "Opening file", 100); stfio::importFile(stf::wx2std(filename), type, *this, wxGetApp().GetTxtImport(), progDlg); } else { stfio::StdoutProgressInfo progDlg("Reading file", "Opening file", 100, true); stfio::importFile(stf::wx2std(filename), type, *this, wxGetApp().GetTxtImport(), progDlg); } } catch (const std::runtime_error& e) { wxString errorMsg(wxT("Error opening file\n")); errorMsg += wxString( e.what(),wxConvLocal ); wxGetApp().ExceptMsg(errorMsg); get().clear(); return false; } catch (const std::exception& e) { wxString errorMsg(wxT("Error opening file\n")); errorMsg += wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(errorMsg); get().clear(); return false; } catch (...) { wxString errorMsg(wxT("Error opening file\n")); wxGetApp().ExceptMsg(errorMsg); get().clear(); return false; } } if (get().empty()) { wxGetApp().ErrorMsg(wxT("File is probably empty\n")); get().clear(); return false; } if (get()[0].get().empty()) { wxGetApp().ErrorMsg(wxT("File is probably empty\n")); get().clear(); return false; } if (get()[0][0].get().empty()) { wxGetApp().ErrorMsg(wxT("File is probably empty\n")); get().clear(); return false; } wxStfParentFrame* pFrame = GetMainFrame(); if (pFrame == NULL) { throw std::runtime_error("pFrame is 0 in wxStfDoc::OnOpenDocument"); } pFrame->SetSingleChannel( size() <= 1 ); if (InitCursors()!=wxID_OK) { get().clear(); wxGetApp().ErrorMsg(wxT( "Couldn't initialize cursors\n" )); return false; } //Select active channel to be displayed if (get().size()>1) { try { if (ChannelSelDlg() != true) { wxGetApp().ErrorMsg(wxT( "File is probably empty\n" )); get().clear(); return false; } } catch (const std::out_of_range& e) { wxString msg(wxT( "Channel could not be selected:" )); msg += wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(msg); get().clear(); return false; } } } else { wxGetApp().ErrorMsg(wxT( "Failure in wxDocument::OnOpenDocument\n" )); get().clear(); return false; } // Make sure curChannel and secondChannel are not out of range // so that we can use them safely without range checking: wxString msg(wxT( "Error while checking range:\nParts of the file might be empty\nClosing file now" )); if (!(get().size()>1)) { if (cursec().size()==0) { wxGetApp().ErrorMsg(msg); get().clear(); return false; } } else { if (cursec().size()==0 || secsec().size()==0) { wxGetApp().ErrorMsg(msg); get().clear(); return false; } } wxFileName fn(GetFilename()); SetTitle(fn.GetFullName()); PostInit(); return true; } void wxStfDoc::SetData( const Recording& c_Data, const wxStfDoc* Sender, const wxString& title ) { resize(c_Data.size()); std::copy(c_Data.get().begin(),c_Data.get().end(),get().begin()); CopyAttributes(c_Data); // Make sure curChannel and curSection are not out of range: std::out_of_range e("Data empty in wxStimfitDoc::SetData()"); if (get().empty()) { throw e; } wxStfParentFrame* pFrame = GetMainFrame(); if (pFrame == NULL) { throw std::runtime_error("pFrame is 0 in wxStfDoc::SetData"); } pFrame->SetSingleChannel( size() <= 1 ); // If the title is not a zero string... if (title != wxT("\0")) { // ... reset its title ... SetTitle(title); } //Read object variables and ensure correct and appropriate values: if (Sender!=NULL) { CopyCursors(*Sender); SetLatencyBeg( Sender->GetLatencyBeg() ); SetLatencyEnd( Sender->GetLatencyEnd() ); //Get value of the reset latency cursor box //0=Off, 1=Peak, 2=Rise SetLatencyStartMode( Sender->GetLatencyStartMode() ); SetLatencyEndMode( Sender->GetLatencyEndMode() ); //SetLatencyWindowMode( Sender->GetLatencyWindowMode() ); #ifdef WITH_PSLOPE SetPSlopeBegMode ( Sender->GetPSlopeBegMode() ); SetPSlopeEndMode ( Sender->GetPSlopeEndMode() ); #endif // Update menu checks: // UpdateMenuCheckmarks(); //Get value of the peak direction dialog box SetDirection( Sender->GetDirection() ); SetFromBase( Sender->GetFromBase() ); CheckBoundaries(); } else { if (InitCursors()!=wxID_OK) { get().clear(); return; } } //Number of channels to display (1 or 2 only!) if (get().size()>1) { //Select active channel to be displayed try { if (ChannelSelDlg()!=true) { get().clear(); throw std::runtime_error("Couldn't select channels"); } } catch (...) { throw; } } //Latency Cursor: OFF-Mode only if one channel is selected! if (!(get().size()>1) && GetLatencyStartMode()!=stf::manualMode && GetLatencyEndMode()!=stf::manualMode) { SetLatencyStartMode(stf::manualMode); SetLatencyEndMode(stf::manualMode); // UpdateMenuCheckmarks(); } // Make sure once again curChannel and curSection are not out of range: if (!(get().size()>1)) { if (cursec().size()==0) { throw e; } } else { if (cursec().size()==0 || secsec().size()==0) { throw e; } } PostInit(); } //Dialog box to display the specific settings of the current CFS file. int wxStfDoc::InitCursors() { //Get values from .Stimfit and ensure proper settings SetMeasCursor(wxGetApp().wxGetProfileInt(wxT("Settings"), wxT("MeasureCursor"), 1)); SetMeasRuler( wxGetApp().wxGetProfileInt(wxT("Settings"), wxT("ShowRuler"), 0) ); SetBaseBeg(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("BaseBegin"), 1)); SetBaseEnd(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("BaseEnd"), 20)); int ibase_method = wxGetApp().wxGetProfileInt(wxT("Settings"), wxT("BaselineMethod"),0); switch (ibase_method) { case 0: SetBaselineMethod(stfnum::mean_sd); break; case 1: SetBaselineMethod(stfnum::median_iqr); break; default: SetBaselineMethod(stfnum::mean_sd); } SetPeakBeg(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("PeakBegin"), (int)cursec().size()-100)); SetPeakEnd(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("PeakEnd"), (int)cursec().size()-50)); int iDirection = wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("Direction"),2); switch (iDirection) { case 0: SetDirection(stfnum::up); break; case 1: SetDirection(stfnum::down); break; case 2: SetDirection(stfnum::both); break; default: SetDirection(stfnum::undefined_direction); } SetFromBase( true ); // reset at every program start wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("FromBase"),1) ); SetPeakAtEnd( wxGetApp().wxGetProfileInt(wxT("Settings"), wxT("PeakAtEnd"), 0)); SetFitBeg(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("FitBegin"), 10)); SetFitEnd(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("FitEnd"), 100)); SetStartFitAtPeak( wxGetApp().wxGetProfileInt(wxT("Settings"), wxT("StartFitAtPeak"), 0)); SetLatencyWindowMode(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("LatencyWindowMode"),1)); SetLatencyBeg(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("LatencyStartCursor"), 0)); /*CSH*/ SetLatencyEnd(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("LatencyEndCursor"), 2)); /*CSH*/ SetLatencyStartMode( wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("LatencyStartMode"),0) ); SetLatencyEndMode( wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("LatencyEndMode"),0) ); // Set corresponding menu checkmarks: // UpdateMenuCheckmarks(); SetPM(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("PeakMean"),1)); SetRTFactor(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("RTFactor"),20)); wxString wxsSlope = wxGetApp().wxGetProfileString(wxT("Settings"),wxT("Slope"),wxT("20.0")); double fSlope = 0.0; wxsSlope.ToDouble(&fSlope); SetSlopeForThreshold( fSlope ); if (!(get().size()>1) && GetLatencyStartMode()!=stf::manualMode && GetLatencyEndMode()!=stf::manualMode) { wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("LatencyStartMode"),stf::manualMode); wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("LatencyEndMode"),stf::manualMode); SetLatencyStartMode(stf::manualMode); SetLatencyEndMode(stf::manualMode); } #ifdef WITH_PSLOPE // read PSlope Beg mode from Stimfit registry int iPSlopeMode = wxGetApp().wxGetProfileInt( wxT("Settings"), wxT("PSlopeStartMode"), stf::psBeg_manualMode ); switch (iPSlopeMode) { case 0: SetPSlopeBegMode( stf::psBeg_manualMode ); break; case 1: SetPSlopeBegMode( stf::psBeg_footMode ); break; case 2: SetPSlopeBegMode( stf::psBeg_thrMode ); break; case 3: SetPSlopeBegMode( stf::psBeg_t50Mode ); break; default: SetPSlopeBegMode( stf::psBeg_undefined ); } // read PSlope End mode from Stimfit registry iPSlopeMode = wxGetApp().wxGetProfileInt( wxT("Settings"), wxT("PSlopeEndMode"), stf::psEnd_manualMode ); switch (iPSlopeMode) { case 0: SetPSlopeEndMode( stf::psEnd_manualMode ); break; case 1: SetPSlopeEndMode( stf::psEnd_t50Mode ); break; case 2: SetPSlopeEndMode( stf::psEnd_DeltaTMode ); break; case 3: SetPSlopeEndMode( stf::psEnd_peakMode ); break; default: SetPSlopeEndMode( stf::psEnd_undefined ); } #endif CheckBoundaries(); return wxID_OK; } //End SettingsDlg() void wxStfDoc::PostInit() { wxStfChildFrame *pFrame = (wxStfChildFrame*)GetDocumentWindow(); if ( pFrame == NULL ) { wxGetApp().ErrorMsg( wxT("Zero pointer in wxStfDoc::PostInit") ); return; } // Update some vector sizes sec_attr.resize(size()); for (std::size_t nchannel=0; nchannel < sec_attr.size(); ++nchannel) { sec_attr[nchannel].resize(at(nchannel).size()); } yzoom.resize(size()); try { pFrame->CreateMenuTraces(get().at(GetCurChIndex()).size()); if ( size() > 1 ) { wxArrayString channelNames; channelNames.Alloc( size() ); for (std::size_t n_c=0; n_c < size(); ++n_c) { wxString channelStream; channelStream << n_c << wxT(" (") << stf::std2wx( at(n_c).GetChannelName() ) << wxT(")"); channelNames.Add( channelStream ); } pFrame->CreateComboChannels( channelNames ); pFrame->SetChannels( GetCurChIndex(), GetSecChIndex() ); } } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal ) ); return; } if (GetSR()>1000) { wxString highSampling; highSampling << wxT("Sampling rate seems very high (") << GetSR() << wxT(" kHz).\n") << wxT("Divide by 1000?"); if (wxMessageDialog( GetDocumentWindow(), highSampling, wxT("Adjust sampling rate"), wxYES_NO ).ShowModal()==wxID_YES) { SetXScale(GetXScale()*1000.0); } } // Read results table settings from registry: SetViewCrosshair(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewCrosshair"),1)==1); SetViewBaseline(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewBaseline"),1)==1); SetViewBaseSD(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewBaseSD"),1)==1); SetViewThreshold(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewThreshold"),1)==1); SetViewPeakZero(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewPeakzero"),1)==1); SetViewPeakBase(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewPeakbase"),1)==1); SetViewPeakThreshold(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewPeakthreshold"),1)==1); SetViewRTLoHi(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewRTLoHi"),1)==1); SetViewInnerRiseTime(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewInnerRiseTime"),1)==1); SetViewOuterRiseTime(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewOuterRiseTime"),1)==1); SetViewT50(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewT50"),1)==1); SetViewRD(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewRD"),1)==1); SetViewSlopeRise(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewSloperise"),1)==1); SetViewSlopeDecay(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewSlopedecay"),1)==1); #ifdef WITH_PSLOPE //SetViewPSlope(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewPSlope"),1)==1); SetViewPSlope(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewPSlope"),1)==1); //SetPSlopeBegMode( wxGetApp().wxGetProfileInt( wxT("Settings"), wxT("PSlopeStartMode"), 1)==1); #endif SetViewLatency(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewLatency"),1)==1); SetViewCursors(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewCursors"),1)==1); // refresh the view once we are through: initialized=true; pFrame->SetCurTrace(0); UpdateSelectedButton(); wxGetApp().OnPeakcalcexecMsg(); wxStfParentFrame* parentFrame = GetMainFrame(); if (parentFrame) { parentFrame->SetFocus(); } wxStfView* pView=(wxStfView*)GetFirstView(); if (pView != NULL) { wxStfGraph* pGraph = pView->GetGraph(); if (pGraph != NULL) { pGraph->Refresh(); pGraph->Enable(); // Set the focus: pGraph->SetFocus(); } } } //Dialog box to select channel to be displayed bool wxStfDoc::ChannelSelDlg() { // Set default channels: if ( size() < 2 ) { return false; } // SetCurChIndex(); done in Recording constructor // SetSecCh( 1 ); return true; } //End ChannelSelDlg() void wxStfDoc::CheckBoundaries() { //Security check base if (GetBaseBeg() > GetBaseEnd()) { std::size_t aux=GetBaseBeg(); SetBaseBeg((int)GetBaseEnd()); SetBaseEnd((int)aux); wxGetApp().ErrorMsg(wxT("Base cursors are reversed,\nthey will be exchanged")); } //Security check peak if (GetPeakBeg() > GetPeakEnd()) { std::size_t aux=GetPeakBeg(); SetPeakBeg((int)GetPeakEnd()); SetPeakEnd((int)aux); wxGetApp().ErrorMsg(wxT("Peak cursors are reversed,\nthey will be exchanged")); } //Security check decay if (GetFitBeg() > GetFitEnd()) { std::size_t aux=GetFitBeg(); SetFitBeg((int)GetFitEnd()); SetFitEnd((int)aux); wxGetApp().ErrorMsg(wxT("Decay cursors are reversed,\nthey will be exchanged")); } if (GetPM() > (int)cursec().size()) { SetPM((int)cursec().size()-1); } if (GetPM() == 0) { SetPM(1); } } bool wxStfDoc::OnNewDocument() { // correct caption: wxString title(GetTitle()); wxStfChildFrame* wnd=(wxStfChildFrame*)GetDocumentWindow(); wnd->SetLabel(title); // call base class member: return true; // return wxDocument::OnNewDocument(); } void wxStfDoc::Fileinfo(wxCommandEvent& WXUNUSED(event)) { //Create CFileOpenDlg object 'dlg' std::ostringstream oss1, oss2; oss1 << "Number of Channels: " << static_cast(get().size()); oss2 << "Number of Sweeps: " << static_cast(get()[GetCurChIndex()].size()); char buf[128]; struct tm t = GetDateTime(); snprintf(buf, 128, "Date:\t%04i-%02i-%02i\nTime:\t%02i:%02i:%02i\n", t.tm_year+1900, t.tm_mon+1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec); std::string general = buf + oss1.str() + "\n" + oss2.str() + "\n" + "Comment:\n" + GetComment(); wxStfFileInfoDlg dlg( GetDocumentWindow(), general, GetFileDescription(), GetGlobalSectionDescription() ); dlg.ShowModal(); } bool wxStfDoc::OnCloseDocument() { if (!get().empty()) { WriteToReg(); } // Remove file menu from file menu list: #ifndef __WXGTK__ wxGetApp().GetDocManager()->GetFileHistory()->RemoveMenu( doc_file_menu ); #endif // Tell the App: wxGetApp().CleanupDocument(this); return wxDocument::OnCloseDocument(); //Note that the base class version will delete all the document's data } bool wxStfDoc::SaveAs() { // Override file save dialog to display only writeable // file types wxString filters; filters += wxT("hdf5 file (*.h5)|*.h5|"); filters += wxT("CED filing system (*.dat;*.cfs)|*.dat;*.cfs|"); filters += wxT("Axon text file (*.atf)|*.atf|"); filters += wxT("Igor binary wave (*.ibw)|*.ibw|"); filters += wxT("Mantis TDMS file (*.tdms)|*.tdms|"); filters += wxT("Text file series (*.txt)|*.txt|"); #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) filters += wxT("GDF file (*.gdf)|*.gdf"); #endif wxFileDialog SelectFileDialog( GetDocumentWindow(), wxT("Save file"), wxT(""), wxT(""), filters, wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxFD_PREVIEW ); if(SelectFileDialog.ShowModal()==wxID_OK) { wxString filename = SelectFileDialog.GetPath(); Recording writeRec(ReorderChannels()); if (writeRec.size() == 0) return false; try { stf::wxProgressInfo progDlg("Reading file", "Opening file", 100); stfio::filetype type; switch (SelectFileDialog.GetFilterIndex()) { case 0: type=stfio::hdf5; break; case 1: type=stfio::cfs; break; case 2: type=stfio::atf; break; case 3: type=stfio::igor; break; case 4: type=stfio::tdms; break; case 5: type=stfio::ascii; break; #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) default: type=stfio::biosig; #else default: type=stfio::hdf5; #endif } return stfio::exportFile(stf::wx2std(filename), type, writeRec, progDlg); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(stf::std2wx(e.what())); return false; } } else { return false; } } Recording wxStfDoc::ReorderChannels() { // Re-order channels? std::vector< wxString > channelNames(size()); wxs_it it = channelNames.begin(); for (c_ch_it cit = get().begin(); cit != get().end() && it != channelNames.end(); cit++) { *it = stf::std2wx( cit->GetChannelName() ); it++; } std::vector channelOrder(size()); if (size()>1) { wxStfOrderChannelsDlg orderDlg(GetDocumentWindow(),channelNames); if (orderDlg.ShowModal() != wxID_OK) { return Recording(0); } channelOrder=orderDlg.GetChannelOrder(); } else { int n_c = 0; for (int_it it = channelOrder.begin(); it != channelOrder.end(); it++) { *it = n_c++; } } Recording writeRec(size()); writeRec.CopyAttributes(*this); std::size_t n_c = 0; for (c_int_it cit2 = channelOrder.begin(); cit2 != channelOrder.end(); cit2++) { writeRec.InsertChannel(get()[*cit2],n_c); // correct units: writeRec[n_c++].SetYUnits( at(*cit2).GetYUnits() ); } return writeRec; } #ifndef TEST_MINIMAL bool wxStfDoc::DoSaveDocument(const wxString& filename) { Recording writeRec(ReorderChannels()); if (writeRec.size() == 0) return false; try { stf::wxProgressInfo progDlg("Reading file", "Opening file", 100); if (stfio::exportFile(stf::wx2std(filename), stfio::hdf5, writeRec, progDlg)) return true; else return false; } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(stf::std2wx(e.what())); return false; } } #endif void wxStfDoc::WriteToReg() { //Write file length wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("FirstPoint"), 1); wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("LastPoint"), (int)cursec().size()-1); //Write cursors if (!outOfRange(GetBaseBeg())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("BaseBegin"), (int)GetBaseBeg()); if (!outOfRange(GetBaseEnd())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("BaseEnd"), (int)GetBaseEnd()); if (!outOfRange(GetPeakBeg())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("PeakBegin"), (int)GetPeakBeg()); if (!outOfRange(GetPeakEnd())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("PeakEnd"), (int)GetPeakEnd()); wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("PeakMean"),(int)GetPM()); wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("RTFactor"),(int)GetRTFactor()); wxString wxsSlope; wxsSlope << GetSlopeForThreshold(); wxGetApp().wxWriteProfileString(wxT("Settings"),wxT("Slope"),wxsSlope); //if (wxGetApp().GetCursorsDialog() != NULL) { // wxGetApp().wxWriteProfileInt( // wxT("Settings"),wxT("StartFitAtPeak"),(int)wxGetApp().GetCursorsDialog()->GetStartFitAtPeak() // ); //} if (!outOfRange(GetFitBeg())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("FitBegin"), (int)GetFitBeg()); if (!outOfRange(GetFitEnd())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("FitEnd"), (int)GetFitEnd()); wxGetApp().wxWriteProfileInt( wxT("Settings"),wxT("StartFitAtPeak"),(int)GetStartFitAtPeak() ); if (!outOfRange((size_t)GetLatencyBeg())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("LatencyStartCursor"), (int)GetLatencyBeg()); if (!outOfRange((size_t)GetLatencyEnd())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("LatencyEndCursor"), (int)GetLatencyEnd()); #ifdef WITH_PSLOPE if (!outOfRange((size_t)GetPSlopeBeg())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("PSlopeStartCursor"), GetPSlopeBeg() ); if (!outOfRange((size_t)GetPSlopeEnd())) wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("PSlopeEndCursor"), GetPSlopeEnd() ); wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("PSlopeStartMode"), (int)GetPSlopeBegMode()); wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("PSlopeEndMode"), (int)GetPSlopeEndMode()); wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("DeltaT"), GetDeltaT() ); #endif // Write Zoom wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("Zoom.xZoom"), (int)GetXZoom().xZoom*100000); wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("Zoom.yZoom"), GetYZoom(GetCurChIndex()).yZoom*100000); wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("Zoom.startPosX"), (int)GetXZoom().startPosX); wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("Zoom.startPosY"), GetYZoom(GetCurChIndex()).startPosY); if ((get().size()>1)) { wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("Zoom.yZoom2"), (int)GetYZoom(GetSecChIndex()).yZoom*100000); wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("Zoom.startPosY2"), GetYZoom(GetSecChIndex()).startPosY); } } bool wxStfDoc::SetSection(std::size_t section){ // Check range: if (!(get().size()>1)) { if (section>=get()[GetCurChIndex()].size()) { wxGetApp().ErrorMsg(wxT("subscript out of range\nwhile calling CStimfitDoc::SetSection()")); return false; } if (get()[GetCurChIndex()][section].size()==0) { wxGetApp().ErrorMsg(wxT("Section is empty")); return false; } } else { if (section>=get()[GetCurChIndex()].size() || section>=get()[GetSecChIndex()].size()) { wxGetApp().ErrorMsg(wxT("subscript out of range\nwhile calling CStimfitDoc::SetSection()")); return false; } if (get()[GetCurChIndex()][section].size()==0 || get()[GetSecChIndex()][section].size()==0) { wxGetApp().ErrorMsg(wxT("Section is empty")); return false; } } CheckBoundaries(); SetCurSecIndex(section); UpdateSelectedButton(); return true; } void wxStfDoc::OnSwapChannels(wxCommandEvent& WXUNUSED(event)) { if ( size() > 1) { // Update combo boxes: wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); if ( pFrame == NULL ) { wxGetApp().ErrorMsg( wxT("Frame is zero in wxStfDoc::SwapChannels")); return; } pFrame->SetChannels( GetSecChIndex(), GetCurChIndex() ); pFrame->UpdateChannels(); } } void wxStfDoc::ToggleSelect() { // get current selection status of this trace: bool selected = false; for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end() && !selected; ++cit) { if (*cit == GetCurSecIndex()) { selected = true; } } if (selected) { Remove(); } else { Select(); } } void wxStfDoc::Select() { if (GetSelectedSections().size() == get()[GetCurChIndex()].size()) { wxGetApp().ErrorMsg(wxT("No more traces can be selected\nAll traces are selected")); return; } //control whether trace has already been selected: bool already=false; for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end() && !already; ++cit) { if (*cit == GetCurSecIndex()) { already = true; } } //add trace number to selected numbers, print number of selected traces if (!already) { SelectTrace(GetCurSecIndex(), baseBeg, baseEnd); //String output in the trace navigator wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); pFrame->SetSelected(GetSelectedSections().size()); } else { wxGetApp().ErrorMsg(wxT("Trace is already selected")); return; } Focus(); } void wxStfDoc::Remove() { if (UnselectTrace(GetCurSecIndex())) { //Message update in the trace navigator wxStfChildFrame* pFrame = (wxStfChildFrame*)GetDocumentWindow(); if (pFrame) pFrame->SetSelected(GetSelectedSections().size()); } else { wxGetApp().ErrorMsg(wxT("Trace is not selected")); } Focus(); } void wxStfDoc::ConcatenateMultiChannel(wxCommandEvent &WXUNUSED(event)) { if (GetSelectedSections().empty()) { wxGetApp().ErrorMsg(wxT("Select sweeps first")); return; } stf::wxProgressInfo progDlg("Concatenating sections", "Starting...", 100); try { Recording Concatenated = stfio::concatenate(*this, GetSelectedSections(), progDlg); wxGetApp().NewChild(Concatenated,this,wxString(GetTitle()+wxT(", concatenated"))); } catch (const std::runtime_error& e) { wxGetApp().ErrorMsg(wxT("Error concatenating sections:\n") + stf::std2wx(e.what())); } } void wxStfDoc::CreateAverage( bool calcSD, bool align //align to steepest rise of other channel? ) { if(GetSelectedSections().empty()) { wxGetApp().ErrorMsg(wxT("Select traces first")); return; } wxBusyCursor wc; //array indicating how many indices to shift when aligning, //has to be filled with zeros: std::vector shift(GetSelectedSections().size(),0); int shift_size = 0; /* Aligned average */ //find alignment points in the reference (==second) channel: if (align) { // check that we have more than one channel wxStfAlignDlg AlignDlg(GetDocumentWindow(), size()>1); if (AlignDlg.ShowModal() != wxID_OK) return; //store current section and channel index: std::size_t section_old=GetCurSecIndex(); std::size_t channel_old=GetCurChIndex(); //initialize the lowest and the highest index: std::size_t min_index=0; try { if (AlignDlg.UseReference()) min_index=get()[GetSecChIndex()].at(GetSelectedSections().at(0)).size()-1; else min_index=get()[GetCurChIndex()].at(GetSelectedSections().at(0)).size()-1; } catch (const std::out_of_range& e) { wxString msg(wxT("Error while aligning\nIt is safer to re-start the program\n")); msg+=wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(msg); return; } // swap channels temporarily: // if (AlignDlg.UseReference()) // SetCurChIndex(GetSecChIndex()); std::size_t max_index=0, n=0; int_it it = shift.begin(); //loop through all selected sections: for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end() && it != shift.end(); cit++) { //Set the selected section as the current section temporarily: SetSection(*cit); if (peakAtEnd) { SetPeakEnd((int)get()[GetSecChIndex()][*cit].size()-1); } // Calculate all variables for the current settings // APMaxSlopeT will be calculated for the second (==reference) // channel, so channels may not be changed! try { Measure(); } catch (const std::out_of_range& e) { Average.resize(0); SetSection(section_old); SetCurChIndex(channel_old); wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return; } std::size_t alignIndex; //check whether the current index is a max or a min, //and if so, store it: switch (AlignDlg.AlignRise()) { case 0: // align to peak time if (AlignDlg.UseReference()) alignIndex = lround(GetAPMaxT()); else alignIndex = lround(GetMaxT()); break; case 1: // align to steepest slope time if (AlignDlg.UseReference()) alignIndex = lround(GetAPMaxRiseT()); else alignIndex = lround(GetMaxRiseT()); break; case 2: // align to half amplitude time if (AlignDlg.UseReference()) alignIndex = lround(GetAPT50LeftReal()); else alignIndex = lround(GetT50LeftReal()); break; case 3: // align to onset if (AlignDlg.UseReference()) alignIndex = lround(GetAPT0Real()); else alignIndex = lround(GetT0Real()); break; default: wxGetApp().ExceptMsg(wxT("Invalid alignment method")); return; } *it = alignIndex; if (alignIndex > max_index) { max_index=alignIndex; } if (alignIndex < min_index) { min_index=alignIndex; } n++; it++; } //now that max and min indices are known, calculate the number of //points that need to be shifted: for (int_it it = shift.begin(); it != shift.end(); it++) { (*it) -= (int)min_index; } //restore section and channel settings: SetSection(section_old); SetCurChIndex(channel_old); shift_size = (max_index-min_index); } //number of points in average: size_t average_size = cursec().size(); for (c_st_it sit = GetSelectedSections().begin(); sit != GetSelectedSections().end(); sit++) { if (curch().get()[*sit].size() < average_size) { average_size = curch().get()[*sit].size(); } } average_size -= shift_size; //initialize temporary sections and channels: Average.resize(size()); std::size_t n_c = 0; for (c_ch_it cit = get().begin(); cit != get().end(); cit++) { Section TempSection(average_size), TempSig(average_size); try { MakeAverage(TempSection, TempSig, n_c, GetSelectedSections(), calcSD, shift); } catch (const std::out_of_range& e) { Average.resize(0); wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return; } TempSection.SetXScale(get()[n_c][0].GetXScale()); // set xscale for channel n_c and the only section TempSection.SetSectionDescription(stf::wx2std(GetTitle()) +std::string(", average")); Channel TempChannel(TempSection); TempChannel.SetChannelName(cit->GetChannelName()); try { Average.InsertChannel(TempChannel,n_c); } catch (const std::out_of_range& e) { Average.resize(0); wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return; } n_c++; } Average.CopyAttributes(*this); wxString title; title << GetFilename() << wxT(", average of ") << (int)GetSelectedSections().size() << wxT(" traces"); wxGetApp().NewChild(Average,this,title); } //End of CreateAverage(.,.,.) void wxStfDoc::FitDecay(wxCommandEvent& WXUNUSED(event)) { int fselect=-2; wxStfFitSelDlg FitSelDialog(GetDocumentWindow(), this); if (FitSelDialog.ShowModal() != wxID_OK) return; wxBeginBusyCursor(); fselect=FitSelDialog.GetFSelect(); if (outOfRange(GetFitBeg()) || outOfRange(GetFitEnd())) { wxGetApp().ErrorMsg(wxT("Subscript out of range in wxStfDoc::FitDecay()")); return; } //number of parameters to be fitted: std::size_t n_params=0; //number of points: std::size_t n_points = GetFitEnd()-GetFitBeg(); if (n_points<=1) { wxGetApp().ErrorMsg(wxT("Check fit limits")); return; } std::string fitInfo; try { n_params=(int)wxGetApp().GetFuncLib().at(fselect).pInfo.size(); } catch (const std::out_of_range& e) { wxString msg(wxT("Could not retrieve function from library:\n")); msg+=wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(msg); return; } Vector_double params ( FitSelDialog.GetInitP() ); int warning = 0; try { std::size_t fitSize = GetFitEnd() - GetFitBeg(); Vector_double x( fitSize ); //fill array: std::copy(&cursec()[GetFitBeg()], &cursec()[GetFitBeg()+fitSize], &x[0]); if (params.size() != n_params) { throw std::runtime_error("Wrong size of params in wxStfDoc::lmFit()"); } double chisqr = stfnum::lmFit( x, GetXScale(), wxGetApp().GetFuncLib()[fselect], FitSelDialog.GetOpts(), FitSelDialog.UseScaling(), params, fitInfo, warning ); SetIsFitted( GetCurChIndex(), GetCurSecIndex(), params, wxGetApp().GetFuncLibPtr(fselect), chisqr, GetFitBeg(), GetFitEnd() ); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg( wxString(e.what(), wxConvLocal) ); return; } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg( wxString(e.what(), wxConvLocal) ); return; } // Refresh the graph to show the fit before // the dialog pops up: wxStfView* pView=(wxStfView*)GetFirstView(); if (pView!=NULL && pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); wxStfFitInfoDlg InfoDialog(GetDocumentWindow(), stf::std2wx(fitInfo)); wxEndBusyCursor(); InfoDialog.ShowModal(); wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); wxString label; label << wxT("Fit, Section #") << (int)GetCurSecIndex()+1; try { pFrame->ShowTable(sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).bestFit, label); } catch (const std::out_of_range e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } void wxStfDoc::LFit(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor wc; if (outOfRange(GetFitBeg()) || outOfRange(GetFitEnd())) { wxGetApp().ErrorMsg(wxT("Subscript out of range in wxStfDoc::FitDecay()")); return; } //number of parameters to be fitted: std::size_t n_params=0; //number of points: std::size_t n_points=GetFitEnd()-GetFitBeg(); if (n_points<=1) { wxGetApp().ErrorMsg(wxT("Check fit limits")); return; } std::string fitInfo; n_params=2; Vector_double params( n_params ); //fill array: Vector_double x(n_points); std::copy(&cursec()[GetFitBeg()], &cursec()[GetFitBeg()+n_points], &x[0]); Vector_double t(x.size()); for (std::size_t n_t=0;n_tGetGraph()!=NULL) pView->GetGraph()->Refresh(); std::ostringstream fitInfoStr; fitInfoStr << wxT("slope = ") << params[0] << wxT("\n1/slope = ") << 1.0/params[0] << wxT("\ny-intercept = ") << params[1]; fitInfo += fitInfoStr.str(); wxStfFitInfoDlg InfoDialog(GetDocumentWindow(), stf::std2wx(fitInfo)); InfoDialog.ShowModal(); wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); wxString label; label << wxT("Fit, Section #") << (int)GetCurSecIndex(); try { pFrame->ShowTable(sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).bestFit, label); } catch (const std::out_of_range e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } void wxStfDoc::LnTransform(wxCommandEvent& WXUNUSED(event)) { Channel TempChannel(GetSelectedSections().size(), get()[GetCurChIndex()][GetSelectedSections()[0]].size()); std::size_t n = 0; for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end(); cit++) { Section TempSection(size()); std::transform(get()[GetCurChIndex()][*cit].get().begin(), get()[GetCurChIndex()][*cit].get().end(), TempSection.get_w().begin(), #if defined(_WINDOWS) && !defined(__MINGW32__) std::logl); #else (double(*)(double))log); #endif TempSection.SetXScale(get()[GetCurChIndex()][*cit].GetXScale()); TempSection.SetSectionDescription( get()[GetCurChIndex()][*cit].GetSectionDescription()+ ", transformed (ln)"); try { TempChannel.InsertSection(TempSection,n); } catch (const std::out_of_range e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } n++; } if (TempChannel.size()>0) { Recording Transformed(TempChannel); Transformed.CopyAttributes(*this); wxString title(GetTitle()); title+=wxT(", transformed (ln)"); wxGetApp().NewChild(Transformed,this,title); } } void wxStfDoc::Viewtable(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor wc; try { wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); pFrame->ShowTable( CurAsTable(), stf::std2wx( cursec().GetSectionDescription() ) ); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return; } } void wxStfDoc::Multiply(wxCommandEvent& WXUNUSED(event)) { if (GetSelectedSections().empty()) { wxGetApp().ErrorMsg(wxT("Select traces first")); return; } //insert standard values: std::vector labels(1); Vector_double defaults(labels.size()); labels[0]="Multiply with:";defaults[0]=1; stf::UserInput init(labels,defaults,"Set factor"); wxStfUsrDlg MultDialog(GetDocumentWindow(),init); if (MultDialog.ShowModal()!=wxID_OK) return; Vector_double input(MultDialog.readInput()); if (input.size()!=1) return; double factor=input[0]; try { Recording Multiplied = stfio::multiply(*this, GetSelectedSections(), GetCurChIndex(), factor); wxGetApp().NewChild(Multiplied, this, wxString(GetTitle()+wxT(", multiplied"))); } catch (const std::exception& e) { wxGetApp().ErrorMsg(wxT("Error during multiplication:\n") + stf::std2wx(e.what())); } } bool wxStfDoc::SubtractBase( ) { if (GetSelectedSections().empty()) { wxGetApp().ErrorMsg(wxT("Select traces first")); return false; } Channel TempChannel(GetSelectedSections().size(), get()[GetCurChIndex()][GetSelectedSections()[0]].size()); std::size_t n = 0; for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end(); cit++) { Section TempSection(stfio::vec_scal_minus(get()[GetCurChIndex()][*cit].get(), GetSelectBase()[n])); TempSection.SetXScale(get()[GetCurChIndex()][*cit].GetXScale()); TempSection.SetSectionDescription( get()[GetCurChIndex()][*cit].GetSectionDescription()+ ", baseline subtracted"); try { TempChannel.InsertSection(TempSection,n); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return false; } n++; } if (TempChannel.size()>0) { Recording SubBase(TempChannel); SubBase.CopyAttributes(*this); wxString title(GetTitle()); title+=wxT(", baseline subtracted"); wxGetApp().NewChild(SubBase,this,title); } else { wxGetApp().ErrorMsg( wxT("Channel is empty.") ); return false; } return true; } void wxStfDoc::OnAnalysisBatch(wxCommandEvent &WXUNUSED(event)) { // event.Skip(); if (GetSelectedSections().empty()) { wxGetApp().ErrorMsg(wxT("No selected traces")); return; } std::size_t section_old=GetCurSecIndex(); // wxStfBatchDlg SaveYtDialog(GetDocumentWindow()); if (SaveYtDialog.ShowModal()!=wxID_OK) return; std::vector colTitles; //Write the header of the SaveYt file in a string if (SaveYtDialog.PrintBase()) { colTitles.push_back("Base"); } if (SaveYtDialog.PrintBaseSD()) { colTitles.push_back("Base SD"); } if (SaveYtDialog.PrintThreshold()) { colTitles.push_back("Slope threshold"); } if (SaveYtDialog.PrintSlopeThresholdTime()) { colTitles.push_back("Slope threshold time"); } if (SaveYtDialog.PrintPeakZero()) { colTitles.push_back("Peak (from 0)"); } if (SaveYtDialog.PrintPeakBase()) { colTitles.push_back("Peak (from baseline)"); } if (SaveYtDialog.PrintPeakThreshold()) { colTitles.push_back("Peak (from threshold)"); } if (SaveYtDialog.PrintPeakTime()) { colTitles.push_back("Peak time"); } if (SaveYtDialog.PrintRTLoHi()) { colTitles.push_back("RT Lo-Hi%"); } if (SaveYtDialog.PrintInnerRTLoHi()) { colTitles.push_back("inner Rise Time Lo-Hi%"); } if (SaveYtDialog.PrintOuterRTLoHi()) { colTitles.push_back("Outer Rise Time Lo-Hi%"); } if (SaveYtDialog.PrintT50()) { colTitles.push_back("duration Amp/2"); } if (SaveYtDialog.PrintT50SE()) { colTitles.push_back("start Amp/2"); colTitles.push_back("end Amp/2"); } if (SaveYtDialog.PrintSlopes()) { colTitles.push_back("Max. slope rise"); colTitles.push_back("Max. slope decay"); } if (SaveYtDialog.PrintSlopeTimes()) { colTitles.push_back("Time of max. rise"); colTitles.push_back("Time of max. decay"); } if (SaveYtDialog.PrintLatencies()) { colTitles.push_back("Latency"); } int fselect=-2; std::size_t n_params=0; wxStfFitSelDlg FitSelDialog(GetDocumentWindow(), this); if (SaveYtDialog.PrintFitResults()) { while (fselect<0) { FitSelDialog.SetNoInput(true); if (FitSelDialog.ShowModal()!=wxID_OK) { SetSection(section_old); return; } fselect=FitSelDialog.GetFSelect(); } try { n_params=(int)wxGetApp().GetFuncLib().at(fselect).pInfo.size(); } catch (const std::out_of_range& e) { wxString msg(wxT("Error while retrieving function from library:\n")); msg += stf::std2wx(e.what()); wxGetApp().ExceptMsg(msg); SetSection(section_old); return; } for (std::size_t n_pf=0;n_pf(1, thrS.str()), Vector_double (1,0.0), "Set threshold"); wxStfUsrDlg myDlg( GetDocumentWindow(), Input ); if (myDlg.ShowModal()!=wxID_OK) { return; } threshold=myDlg.readInput()[0]; } wxProgressDialog progDlg( wxT("Batch analysis in progress"), wxT("Starting batch analysis"), 100, GetDocumentWindow(), wxPD_SMOOTH | wxPD_AUTO_HIDE | wxPD_APP_MODAL ); stfnum::Table table(GetSelectedSections().size(),colTitles.size()); for (std::size_t nCol=0;nColGetStartFitAtPeak()) if ( startFitAtPeak ) SetFitBeg(GetMaxT()); Vector_double params; int fitWarning = 0; if (SaveYtDialog.PrintFitResults()) { try { n_params=(int)wxGetApp().GetFuncLib().at(fselect).pInfo.size(); } catch (const std::out_of_range& e) { wxString msg(wxT("Could not retrieve function from library:\n")); msg+=wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(msg); return; } // in this case, initialize parameters from init function, // not from user input: Vector_double x(GetFitEnd()-GetFitBeg()); //fill array: std::copy(&cursec()[GetFitBeg()], &cursec()[GetFitEnd()], &x[0]); params.resize(n_params); wxGetApp().GetFuncLib().at(fselect).init( x, GetBase(), GetPeak(), GetRTLoHi(), GetHalfDuration(), GetXScale(), params ); std::string fitInfo; try { double chisqr = stfnum::lmFit( x, GetXScale(), wxGetApp().GetFuncLib()[fselect], FitSelDialog.GetOpts(), FitSelDialog.UseScaling(), params, fitInfo, fitWarning ); SetIsFitted( GetCurChIndex(), GetCurSecIndex(), params, wxGetApp().GetFuncLibPtr(fselect), chisqr, GetFitBeg(), GetFitEnd() ); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); SetSection(section_old); return; } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); SetSection(section_old); return; } catch (const std::exception& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); SetSection(section_old); return; } } // count number of threshold crossings if needed: std::size_t n_crossings=0; if (SaveYtDialog.PrintThr()) { n_crossings= stfnum::peakIndices( cursec().get(), threshold, 0 ).size(); } std::size_t nCol=0; //Write the variables of the current channel in a string try { table.SetRowLabel(n_s, cursec().GetSectionDescription()); if (SaveYtDialog.PrintBase()) table.at(n_s,nCol++)=GetBase(); if (SaveYtDialog.PrintBaseSD()) table.at(n_s,nCol++)=GetBaseSD(); if (SaveYtDialog.PrintThreshold()) table.at(n_s,nCol++)=GetThreshold(); if (SaveYtDialog.PrintSlopeThresholdTime()) table.at(n_s,nCol++)=GetThrT()*GetXScale(); if (SaveYtDialog.PrintPeakZero()) table.at(n_s,nCol++)=GetPeak(); if (SaveYtDialog.PrintPeakBase()) table.at(n_s,nCol++)=GetPeak()-GetBase(); if (SaveYtDialog.PrintPeakThreshold()) table.at(n_s,nCol++)=GetPeak()-GetThreshold(); if (SaveYtDialog.PrintPeakTime()) table.at(n_s,nCol++)=GetPeakTime()*GetXScale(); if (SaveYtDialog.PrintRTLoHi()) table.at(n_s,nCol++)=GetRTLoHi(); if (SaveYtDialog.PrintInnerRTLoHi()) table.at(n_s,nCol++)=GetInnerRiseTime(); if (SaveYtDialog.PrintOuterRTLoHi()) table.at(n_s,nCol++)=GetOuterRiseTime(); if (SaveYtDialog.PrintT50()) table.at(n_s,nCol++)=GetHalfDuration(); if (SaveYtDialog.PrintT50SE()) { table.at(n_s,nCol++)=GetT50LeftReal()*GetXScale(); table.at(n_s,nCol++)=GetT50RightReal()*GetXScale(); } if (SaveYtDialog.PrintSlopes()) { table.at(n_s,nCol++)=GetMaxRise(); table.at(n_s,nCol++)=GetMaxDecay(); } if (SaveYtDialog.PrintSlopeTimes()) { table.at(n_s,nCol++)=GetMaxRiseT()*GetXScale(); table.at(n_s,nCol++)=GetMaxDecayT()*GetXScale(); } if (SaveYtDialog.PrintLatencies()) { table.at(n_s,nCol++)=GetLatency()*GetXScale(); } if (SaveYtDialog.PrintFitResults()) { for (std::size_t n_pf=0;n_pfShowTable(table,wxT("Batch analysis results")); } void wxStfDoc::OnAnalysisIntegrate(wxCommandEvent &WXUNUSED(event)) { double integral_s = 0.0, integral_t = 0.0; const std::string units = at(GetCurChIndex()).GetYUnits() + " * " + GetXUnits(); try { integral_s = stfnum::integrate_simpson(cursec().get(),GetFitBeg(),GetFitEnd(),GetXScale()); integral_t = stfnum::integrate_trapezium(cursec().get(),GetFitBeg(),GetFitEnd(),GetXScale()); } catch (const std::exception& e) { wxGetApp().ErrorMsg(wxString( e.what(), wxConvLocal )); return; } stfnum::Table integralTable(6,1); try { integralTable.SetRowLabel(0, "Trapezium (linear)"); integralTable.SetRowLabel(1, "Integral (from 0)"); integralTable.SetRowLabel(2, "Integral (from base)"); integralTable.SetRowLabel(3, "Simpson (quadratic)"); integralTable.SetRowLabel(4, "Integral (from 0)"); integralTable.SetRowLabel(5, "Integral (from base)"); //integralTable.SetColLabel(0, "Results"); integralTable.SetColLabel(0, units); integralTable.SetEmpty(0,0); integralTable.at(1,0) = integral_t; integralTable.at(2,0) = integral_t - (GetFitEnd()-GetFitBeg())*GetXScale()*GetBase(); integralTable.SetEmpty(3,0); integralTable.at(4,0) = integral_s; integralTable.at(5,0) = integral_s - (GetFitEnd()-GetFitBeg())*GetXScale()*GetBase(); } catch (const std::out_of_range& e) { wxGetApp().ErrorMsg(wxString( e.what(), wxConvLocal )); return; } wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); pFrame->ShowTable(integralTable,wxT("Integral")); try { Vector_double quad_p = stfnum::quad(cursec().get(), GetFitBeg(), GetFitEnd()); SetIsIntegrated(GetCurChIndex(), GetCurSecIndex(), true,GetFitBeg(),GetFitEnd(), quad_p); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } void wxStfDoc::OnAnalysisDifferentiate(wxCommandEvent &WXUNUSED(event)) { if (GetSelectedSections().empty()) { wxGetApp().ErrorMsg(wxT("Select traces first")); return; } Channel TempChannel(GetSelectedSections().size(), get()[GetCurChIndex()][GetSelectedSections()[0]].size()); std::size_t n = 0; for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end(); cit++) { Section TempSection( stfnum::diff( get()[GetCurChIndex()][*cit].get(), GetXScale() ) ); TempSection.SetXScale(get()[GetCurChIndex()][*cit].GetXScale()); TempSection.SetSectionDescription( get()[GetCurChIndex()][*cit].GetSectionDescription()+ ", differentiated"); try { TempChannel.InsertSection(TempSection,n); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } n++; } if (TempChannel.size()>0) { Recording Diff(TempChannel); Diff.CopyAttributes(*this); Diff[0].SetYUnits(at(GetCurChIndex()).GetYUnits()+" / ms"); wxString title(GetTitle()); title+=wxT(", differentiated"); wxGetApp().NewChild(Diff,this,title); } } bool wxStfDoc::OnNewfromselectedThis( ) { if (GetSelectedSections().empty()) { wxGetApp().ErrorMsg(wxT("Select traces first")); return false; } Channel TempChannel(GetSelectedSections().size(), get()[GetCurChIndex()][GetSelectedSections()[0]].size()); std::size_t n = 0; for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end(); cit++) { // Multiply the valarray in Data: Section TempSection(get()[GetCurChIndex()][*cit].get()); TempSection.SetXScale(get()[GetCurChIndex()][*cit].GetXScale()); TempSection.SetSectionDescription( get()[GetCurChIndex()][*cit].GetSectionDescription()+ ", new from selected"); try { TempChannel.InsertSection(TempSection,n); } catch (const std::out_of_range e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return false; } n++; } if (TempChannel.size()>0) { Recording Selected(TempChannel); Selected.CopyAttributes(*this); Selected[0].SetYUnits( at(GetCurChIndex()).GetYUnits() ); Selected[0].SetChannelName( at(GetCurChIndex()).GetChannelName() ); wxString title(GetTitle()); title+=wxT(", new from selected"); wxGetApp().NewChild(Selected,this,title); } else { wxGetApp().ErrorMsg( wxT("Channel is empty.") ); return false; } return true; } void wxStfDoc::Selectsome(wxCommandEvent &WXUNUSED(event)) { if (GetSelectedSections().size()>0) { wxGetApp().ErrorMsg(wxT("Unselect all")); return; } //insert standard values: std::vector labels(2); Vector_double defaults(labels.size()); labels[0]="Select every x-th trace:";defaults[0]=1; labels[1]="Starting with the y-th:";defaults[1]=1; stf::UserInput init(labels,defaults,"Select every n-th (1-based)"); wxStfUsrDlg EveryDialog(GetDocumentWindow(),init); if (EveryDialog.ShowModal()!=wxID_OK) return; Vector_double input(EveryDialog.readInput()); if (input.size()!=2) return; int everynth=(int)input[0]; int everystart=(int)input[1]; //div_t n_selected=div((int)get()[GetCurChIndex()].size(),everynth); for (int n=0; n*everynth+everystart-1 < (int)get()[GetCurChIndex()].size(); ++n) { try { SelectTrace(n*everynth+everystart-1, baseBeg, baseEnd); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg( wxString::FromAscii(e.what()) ); } } wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); pFrame->SetSelected(GetSelectedSections().size()); Focus(); } void wxStfDoc::SelectTracesOfType(wxCommandEvent &WXUNUSED(event)) { // TODO: dialog should display possible selections //insert standard values: std::vector labels(1); Vector_double defaults(labels.size()); labels[0]="Select Trace of Type";defaults[0]=1; stf::UserInput init(labels,defaults,"Select trace of type"); wxStfUsrDlg EveryDialog(GetDocumentWindow(),init); if (EveryDialog.ShowModal()!=wxID_OK) return; Vector_double input(EveryDialog.readInput()); if (input.size()!=1) return; int selTyp=(int)input[0]; for (size_t n=0; n < (int)get()[GetCurChIndex()].size(); ++n) { if (GetSectionType(n)==selTyp) SelectTrace(n, baseBeg, baseEnd); } wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); pFrame->SetSelected(GetSelectedSections().size()); Focus(); } void wxStfDoc::UnselectTracesOfType(wxCommandEvent &WXUNUSED(event)) { // TODO: dialog should display possible selections //insert standard values: std::vector labels(1); Vector_double defaults(labels.size()); labels[0]="Unselect Traces of Type";defaults[0]=1; stf::UserInput init(labels,defaults,"Unselect trace of type"); wxStfUsrDlg EveryDialog(GetDocumentWindow(),init); if (EveryDialog.ShowModal()!=wxID_OK) return; Vector_double input(EveryDialog.readInput()); if (input.size()!=1) return; int selTyp=(int)input[0]; for (int n=0; n < (int)get()[GetCurChIndex()].size(); ++n) { if (GetSectionType(n)==selTyp) UnselectTrace(n); } wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); pFrame->SetSelected(GetSelectedSections().size()); Focus(); } void wxStfDoc::Unselectsome(wxCommandEvent &WXUNUSED(event)) { if (GetSelectedSections().size() < get()[GetCurChIndex()].size()) { wxGetApp().ErrorMsg(wxT("Select all traces first")); return; } //insert standard values: std::vector labels(2); Vector_double defaults(labels.size()); labels[0]="Unselect every x-th trace:";defaults[0]=1; labels[1]="Starting with the y-th:";defaults[1]=1; stf::UserInput init(labels,defaults,"Unselect every n-th (1-based)"); wxStfUsrDlg EveryDialog(GetDocumentWindow(),init); if (EveryDialog.ShowModal()!=wxID_OK) return; Vector_double input(EveryDialog.readInput()); if (input.size()!=2) return; int everynth=(int)input[0]; int everystart=(int)input[1]; //div_t n_unselected=div((int)get()[GetCurChIndex()].size(),everynth); for (int n=0; n*everynth+everystart-1 < (int)get()[GetCurChIndex()].size(); ++n) { UnselectTrace(n*everynth+everystart-1); } wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); pFrame->SetSelected(GetSelectedSections().size()); Focus(); } void wxStfDoc::Selectall(wxCommandEvent& event) { //Make sure all traces are unselected prior to selecting them all: if ( !GetSelectedSections().empty() ) Deleteselected(event); for (int n_s=0; n_s<(int)get()[GetCurChIndex()].size(); ++n_s) { SelectTrace(n_s, baseBeg, baseEnd); } wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); pFrame->SetSelected(GetSelectedSections().size()); Focus(); } void wxStfDoc::Deleteselected(wxCommandEvent &WXUNUSED(event)) { wxStfChildFrame* pFrame=(wxStfChildFrame*)GetDocumentWindow(); if( !GetSelectedSections().empty() ) { GetSelectedSectionsW().clear(); GetSelectBaseW().clear(); //Update selected traces string in the trace navigator pFrame->SetSelected(GetSelectedSections().size()); } else { wxGetApp().ErrorMsg(wxT("No selected trace to remove")); return; } // refresh the view once we are through: if (pFrame->ShowSelected()) { wxStfView* pView=(wxStfView*)GetFirstView(); if (pView!=NULL && pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } Focus(); } void wxStfDoc::Focus() { UpdateSelectedButton(); // refresh the view once we are through: wxStfView* pView=(wxStfView*)GetFirstView(); if (pView != NULL && pView->GetGraph() != NULL) { pView->GetGraph()->Enable(); pView->GetGraph()->SetFocus(); } } void wxStfDoc::UpdateSelectedButton() { // control whether trace has been selected: bool selected=false; for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end() && !selected; ++cit) { if (*cit == GetCurSecIndex()) { selected = true; } } // Set status of selection button: wxStfParentFrame* parentFrame = GetMainFrame(); if (parentFrame) { parentFrame->SetSelectedButton( selected ); } } void wxStfDoc::Filter(wxCommandEvent& WXUNUSED(event)) { #ifndef TEST_MINIMAL if (GetSelectedSections().empty()) { wxGetApp().ErrorMsg(wxT("No traces selected")); return; } //--For details on the Fast Fourier Transform see NR in C++, chapters 12 and 13 std::vector windowLabels(2); Vector_double windowDefaults(windowLabels.size()); windowLabels[0]="From point #:";windowDefaults[0]=0; windowLabels[1]="To point #:";windowDefaults[1]=(int)cursec().size()-1; stf::UserInput initWindow(windowLabels,windowDefaults,"Filter window"); wxStfUsrDlg FilterWindowDialog(GetDocumentWindow(),initWindow); if (FilterWindowDialog.ShowModal()!=wxID_OK) return; Vector_double windowInput(FilterWindowDialog.readInput()); if (windowInput.size()!=2) return; int llf=(int)windowInput[0]; int ulf=(int)windowInput[1]; wxStfFilterSelDlg FilterSelectDialog(GetDocumentWindow()); if (FilterSelectDialog.ShowModal()!=wxID_OK) return; int fselect=FilterSelectDialog.GetFilterSelect(); int size=0; bool inverse=true; switch (fselect) { case 1: size=3; break; case 2: case 3: size=1; break; } wxStfGaussianDlg FftDialog(GetDocumentWindow()); Vector_double a(size); switch (fselect) { case 1: if (FftDialog.ShowModal()!=wxID_OK) return; a[0]=(int)(FftDialog.Amp()*100000.0)/100000.0; /*amplitude from 0 to 1*/ a[1]=(int)(FftDialog.Center()*100000.0)/100000.0; /*center in kHz*/ a[2]=(int)(FftDialog.Width()*100000.0)/100000.0; /*width in kHz*/ break; case 2: case 3: { //insert standard values: std::vector labels(1); Vector_double defaults(labels.size()); labels[0]="Cutoff frequency (kHz):"; defaults[0]=10; stf::UserInput init(labels,defaults,"Set frequency"); wxStfUsrDlg FilterHighLowDialog(GetDocumentWindow(),init); if (FilterHighLowDialog.ShowModal()!=wxID_OK) return; Vector_double input(FilterHighLowDialog.readInput()); if (input.size()!=1) return; a[0]=(int)(input[0]*100000.0)/100000.0; /*midpoint of sigmoid curve in kHz*/ break; } } wxBusyCursor wc; //--I. Defining the parameters of the filter function /*sampling interval in ms*/ Channel TempChannel(GetSelectedSections().size(), get()[GetCurChIndex()][GetSelectedSections()[0]].size()); std::size_t n = 0; for (c_st_it cit = GetSelectedSections().begin(); cit != GetSelectedSections().end(); cit++) { try { switch (fselect) { case 3: { Section FftTemp(stfnum::filter(get()[GetCurChIndex()][*cit].get(), llf,ulf,a,(int)GetSR(),stfnum::fgaussColqu,false)); FftTemp.SetXScale(get()[GetCurChIndex()][*cit].GetXScale()); FftTemp.SetSectionDescription( get()[GetCurChIndex()][*cit].GetSectionDescription()+ ", filtered"); TempChannel.InsertSection(FftTemp, n); break; } case 2: { Section FftTemp(stfnum::filter(get()[GetCurChIndex()][*cit].get(), llf,ulf,a,(int)GetSR(),stfnum::fbessel4,false)); FftTemp.SetXScale(get()[GetCurChIndex()][*cit].GetXScale()); FftTemp.SetSectionDescription( get()[GetCurChIndex()][*cit].GetSectionDescription()+ ", filtered" ); TempChannel.InsertSection(FftTemp, n); break; } case 1: { Section FftTemp(stfnum::filter(get()[GetCurChIndex()][*cit].get(), llf,ulf,a,(int)GetSR(),stfnum::fgauss,inverse)); FftTemp.SetXScale(get()[GetCurChIndex()][*cit].GetXScale()); FftTemp.SetSectionDescription( get()[GetCurChIndex()][*cit].GetSectionDescription()+ std::string(", filtered") ); TempChannel.InsertSection(FftTemp, n); break; } } } catch (const std::exception& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } n++; } if (TempChannel.size()>0) { Recording Fft(TempChannel); Fft.CopyAttributes(*this); wxGetApp().NewChild(Fft, this,GetTitle()+wxT(", filtered")); } #endif } void wxStfDoc::P_over_N(wxCommandEvent& WXUNUSED(event)){ //insert standard values: std::vector labels(1); Vector_double defaults(labels.size()); labels[0]="N = (mind polarity!)";defaults[0]=-4; stf::UserInput init(labels,defaults,"P over N"); wxStfUsrDlg PonDialog(GetDocumentWindow(),init); if (PonDialog.ShowModal()!=wxID_OK) return; Vector_double input(PonDialog.readInput()); if (input.size()!=1) return; int PoN=(int)fabs(input[0]); int ponDirection=input[0]<0? -1:1; int new_sections=(int)get()[GetCurChIndex()].size()/(PoN+1); if (new_sections<1) { wxGetApp().ErrorMsg(wxT("Not enough traces for P/n correction")); return; } //File dialog box wxBusyCursor wc; Channel TempChannel(new_sections); //read and PoN for (int n_section=0; n_section < new_sections; n_section++) { //Section loop Section TempSection(get()[GetCurChIndex()][n_section].size()); TempSection.SetXScale(get()[GetCurChIndex()][n_section].GetXScale()); for (int n_point=0; n_point < (int)get()[GetCurChIndex()][n_section].size(); n_point++) TempSection[n_point]=0.0; //Addition of the PoN-values: for (int n_PoN=1; n_PoN < PoN+1; n_PoN++) for (int n_point=0; n_point < (int)get()[GetCurChIndex()][n_section].size(); n_point++) TempSection[n_point] += get()[GetCurChIndex()][n_PoN+(n_section*(PoN+1))][n_point]; //Subtraction from the original values: for (int n_point=0; n_point < (int)get()[GetCurChIndex()][n_section].size(); n_point++) TempSection[n_point] = get()[GetCurChIndex()][n_section*(PoN+1)][n_point]- TempSection[n_point]*ponDirection; std::ostringstream povernLabel; povernLabel << GetTitle() << ", #" << n_section << ", P over N"; TempSection.SetSectionDescription(povernLabel.str()); try { TempChannel.InsertSection(TempSection,n_section); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } if (TempChannel.size()>0) { Recording DataPoN(TempChannel); DataPoN.CopyAttributes(*this); wxGetApp().NewChild(DataPoN,this,GetTitle()+wxT(", p over n subtracted")); } } void wxStfDoc::Plotextraction(stf::extraction_mode mode) { std::vector sectionList(wxGetApp().GetSectionsWithFits()); if (sectionList.empty()) { wxGetApp().ErrorMsg( wxT("You have to create a template first\nby fitting a function to an event") ); return; } wxStfEventDlg MiniDialog(GetDocumentWindow(), sectionList, false); if (MiniDialog.ShowModal()!=wxID_OK) { return; } int nTemplate=MiniDialog.GetTemplate(); try { Vector_double templateWave( sectionList.at(nTemplate).sec_attr.storeFitEnd - sectionList.at(nTemplate).sec_attr.storeFitBeg); for ( std::size_t n_p=0; n_p < templateWave.size(); n_p++ ) { templateWave[n_p] = sectionList.at(nTemplate).sec_attr.fitFunc->func( n_p*GetXScale(), sectionList.at(nTemplate).sec_attr.bestFitP); } wxBusyCursor wc; #undef min #undef max // subtract offset and normalize: double fmax = *std::max_element(templateWave.begin(), templateWave.end()); double fmin = *std::min_element(templateWave.begin(), templateWave.end()); templateWave = stfio::vec_scal_minus(templateWave, fmax); double minim=fabs(fmin); templateWave = stfio::vec_scal_div(templateWave, minim); std::string section_description, window_title; Section TempSection(cursec().get().size()); switch (mode) { case stf::criterion: { stf::wxProgressInfo progDlg("Computing detection criterion...", "Computing detection criterion...", 100); TempSection = Section(stfnum::detectionCriterion( cursec().get(), templateWave, progDlg)); section_description = "Detection criterion of "; window_title = ", detection criterion"; break; } case stf::correlation: { stf::wxProgressInfo progDlg("Computing linear correlation...", "Computing linear correlation...", 100); TempSection = Section(stfnum::linCorr(cursec().get(), templateWave, progDlg)); section_description = "Template correlation of "; window_title = ", linear correlation"; break; } case stf::deconvolution: std::string usrInStr[2] = {"Lowpass (kHz)", "Highpass (kHz)"}; double usrInDbl[2] = {0.5, 0.0001}; stf::UserInput Input( std::vector(usrInStr, usrInStr+2), Vector_double (usrInDbl, usrInDbl+2), "Filter settings" ); wxStfUsrDlg myDlg( GetDocumentWindow(), Input ); if (myDlg.ShowModal()!=wxID_OK) return; Vector_double filter = myDlg.readInput(); stf::wxProgressInfo progDlg("Computing deconvolution...", "Starting deconvolution...", 100); TempSection = Section(stfnum::deconvolve(cursec().get(), templateWave, (int)GetSR(), filter[1], filter[0], progDlg)); section_description = "Template deconvolution from "; window_title = ", deconvolution"; break; } if (TempSection.size()==0) return; TempSection.SetXScale(cursec().GetXScale()); TempSection.SetSectionDescription(section_description + cursec().GetSectionDescription()); Channel TempChannel(TempSection); Recording detCrit(TempChannel); detCrit.CopyAttributes(*this); wxGetApp().NewChild(detCrit, this, GetTitle() + stf::std2wx(window_title)); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } catch (const std::exception& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } void wxStfDoc::Plotcriterion(wxCommandEvent& WXUNUSED(event)) { Plotextraction(stf::criterion); } void wxStfDoc::Plotcorrelation(wxCommandEvent& WXUNUSED(event)) { Plotextraction(stf::correlation); } void wxStfDoc::Plotdeconvolution(wxCommandEvent& WXUNUSED(event)) { Plotextraction(stf::deconvolution); } void wxStfDoc::MarkEvents(wxCommandEvent& WXUNUSED(event)) { std::vector sectionList(wxGetApp().GetSectionsWithFits()); if (sectionList.empty()) { wxGetApp().ErrorMsg( wxT( "You have to create a template first\nby fitting a function to an event" ) ); return; } wxStfEventDlg MiniDialog( GetDocumentWindow(), sectionList, true ); if ( MiniDialog.ShowModal()!=wxID_OK ) { return; } int nTemplate=MiniDialog.GetTemplate(); try { Vector_double templateWave( sectionList.at(nTemplate).sec_attr.storeFitEnd - sectionList.at(nTemplate).sec_attr.storeFitBeg); for ( std::size_t n_p=0; n_p < templateWave.size(); n_p++ ) { templateWave[n_p] = sectionList.at(nTemplate).sec_attr.fitFunc->func( n_p*GetXScale(), sectionList.at(nTemplate).sec_attr.bestFitP); } wxBusyCursor wc; #undef min #undef max // subtract offset and normalize: double fmax = *std::max_element(templateWave.begin(), templateWave.end()); double fmin = *std::min_element(templateWave.begin(), templateWave.end()); templateWave = stfio::vec_scal_minus(templateWave, fmax); double minim=fabs(fmin); templateWave = stfio::vec_scal_div(templateWave, minim); Vector_double detect( cursec().get().size() - templateWave.size() ); switch (MiniDialog.GetMode()) { case stf::criterion: { stf::wxProgressInfo progDlg("Computing detection criterion...", "Computing detection criterion...", 100); detect=stfnum::detectionCriterion(cursec().get(), templateWave, progDlg); break; } case stf::correlation: { stf::wxProgressInfo progDlg("Computing linear correlation...", "Computing linear correlation...", 100); detect=stfnum::linCorr(cursec().get(), templateWave, progDlg); break; } case stf::deconvolution: std::string usrInStr[2] = {"Lowpass (kHz)", "Highpass (kHz)"}; double usrInDbl[2] = {0.5, 0.0001}; stf::UserInput Input( std::vector(usrInStr, usrInStr+2), Vector_double (usrInDbl, usrInDbl+2), "Filter settings" ); wxStfUsrDlg myDlg( GetDocumentWindow(), Input ); if (myDlg.ShowModal()!=wxID_OK) return; Vector_double filter = myDlg.readInput(); stf::wxProgressInfo progDlg("Computing deconvolution...", "Starting deconvolution...", 100); detect=stfnum::deconvolve(cursec().get(), templateWave, (int)GetSR(), filter[1], filter[0], progDlg); break; } if (detect.empty()) { wxGetApp().ErrorMsg(wxT("Error: Detection criterion is empty.")); return; } std::vector startIndices( stfnum::peakIndices( detect, MiniDialog.GetThreshold(), MiniDialog.GetMinDistance() ) ); if (startIndices.empty()) { wxGetApp().ErrorMsg( wxT( "No events were found. Try to lower the threshold." ) ); return; } // erase old events: ClearEvents(GetCurChIndex(), GetCurSecIndex()); wxStfView* pView = (wxStfView*)GetFirstView(); wxStfGraph* pGraph = pView->GetGraph(); for (c_int_it cit = startIndices.begin(); cit != startIndices.end(); ++cit ) { sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).eventList.push_back( stf::Event( *cit, 0, templateWave.size(), new wxCheckBox( pGraph, -1, wxEmptyString) ) ); // Find peak in this event: double baselineMean=0; for ( int n_mean = *cit-baseline; n_mean < *cit; ++n_mean ) { if (n_mean < 0) { baselineMean += cursec().at(0); } else { baselineMean += cursec().at(n_mean); } } baselineMean /= baseline; double peakIndex=0; int eventl = templateWave.size(); if (*cit + eventl >= cursec().get().size()) { eventl = cursec().get().size()-1- (*cit); } stfnum::peak( cursec().get(), baselineMean, *cit, *cit + eventl, 1, stfnum::both, peakIndex ); if (peakIndex != peakIndex || peakIndex < 0 || peakIndex >= cursec().get().size()) { throw std::runtime_error("Error during peak detection (result is NAN)\n"); } // set peak index of this event: sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).eventList.back().SetEventPeakIndex((int)peakIndex); } if (pGraph != NULL) { pGraph->Refresh(); } } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal )); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal )); } catch (const std::exception& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal )); } } void wxStfDoc::Extract( wxCommandEvent& WXUNUSED(event) ) { try { stfnum::Table events(GetCurrentSectionAttributes().eventList.size(), 2); events.SetColLabel(0, "Time of event onset"); events.SetColLabel(1, "Inter-event interval"); // using the peak indices (these are the locations of the beginning of an optimal // template matching), new sections are created: // count non-discarded events: std::size_t n_real = 0; for (c_event_it cit = GetCurrentSectionAttributes().eventList.begin(); cit != GetCurrentSectionAttributes().eventList.end(); ++cit) { n_real += (int)(!cit->GetDiscard()); } Channel TempChannel2(n_real); std::vector peakIndices(n_real); n_real = 0; c_event_it lastEventIt = GetCurrentSectionAttributes().eventList.begin(); for (c_event_it it = GetCurrentSectionAttributes().eventList.begin(); it != GetCurrentSectionAttributes().eventList.end(); ++it) { if (!it->GetDiscard()) { wxString miniName; miniName << wxT( "Event #" ) << (int)n_real+1; events.SetRowLabel(n_real, stf::wx2std(miniName)); events.at(n_real,0) = (double)it->GetEventStartIndex() / GetSR(); events.at(n_real,1)= ((double)(it->GetEventStartIndex() - lastEventIt->GetEventStartIndex())) / GetSR(); // add some baseline at the beginning and end: std::size_t eventSize = it->GetEventSize() + 2*baseline; Section TempSection2( eventSize ); for ( std::size_t n_new = 0; n_new < eventSize; ++n_new ) { // make sure index is not out of range: int index = it->GetEventStartIndex() + n_new - baseline; if (index < 0) index = 0; if (index >= (int)cursec().size()) index = cursec().size()-1; TempSection2[n_new] = cursec()[index]; } std::ostringstream eventDesc; eventDesc << "Extracted event #" << (int)n_real; TempSection2.SetSectionDescription(eventDesc.str()); TempSection2.SetXScale(get()[GetCurChIndex()][GetCurSecIndex()].GetXScale()); TempChannel2.InsertSection( TempSection2, n_real ); n_real++; lastEventIt = it; } } if (TempChannel2.size()>0) { Recording Minis( TempChannel2 ); Minis.CopyAttributes( *this ); wxStfDoc* pDoc=wxGetApp().NewChild( Minis, this, GetTitle()+wxT(", extracted events") ); if (pDoc != NULL) { wxStfChildFrame* pChild=(wxStfChildFrame*)pDoc->GetDocumentWindow(); if (pChild!=NULL) { pChild->ShowTable(events,wxT("Extracted events")); } } } } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } catch (const std::exception& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } void wxStfDoc::InteractiveEraseEvents( wxCommandEvent& WXUNUSED(event) ) { if (wxMessageDialog( GetDocumentWindow(), wxT("Do you really want to erase all events?"), wxT("Erase all events"), wxYES_NO ).ShowModal()==wxID_YES) { try { ClearEvents(GetCurChIndex(), GetCurSecIndex()); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } } void wxStfDoc::AddEvent( wxCommandEvent& WXUNUSED(event) ) { try { // retrieve the position where to add the event: wxStfView* pView = (wxStfView*)GetFirstView(); wxStfGraph* pGraph = pView->GetGraph(); int newStartPos = pGraph->get_eventPos(); stf::Event newEvent(newStartPos, 0, GetCurrentSectionAttributes().eventList.at(0).GetEventSize(), new wxCheckBox(pGraph, -1, wxEmptyString)); // Find peak in this event: double baselineMean=0; for ( int n_mean = newStartPos - baseline; n_mean < newStartPos; ++n_mean ) { if (n_mean < 0) { baselineMean += cursec().at(0); } else { baselineMean += cursec().at(n_mean); } } baselineMean /= baseline; double peakIndex=0; stfnum::peak( cursec().get(), baselineMean, newStartPos, newStartPos + GetCurrentSectionAttributes().eventList.at(0).GetEventSize(), 1, stfnum::both, peakIndex ); // set peak index of last event: newEvent.SetEventPeakIndex( (int)peakIndex ); // find the position in the current event list where the new // event should be inserted: bool found = false; for (event_it it = sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).eventList.begin(); it != sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).eventList.end(); ++it) { if ( (int)(it->GetEventStartIndex()) > newStartPos ) { // insert new event before this event, then break: sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).eventList.insert( it, newEvent ); found = true; break; } } // if we are at the end of the list, append the event: if (!found) sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).eventList.push_back( newEvent ); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } catch (const std::exception& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } void wxStfDoc::Threshold(wxCommandEvent& WXUNUSED(event)) { // get threshold from user input: Vector_double threshold(0); std::ostringstream thrS; thrS << "Threshold (" << at(GetCurChIndex()).GetYUnits() << ")"; stf::UserInput Input( std::vector(1, thrS.str()), Vector_double (1,0.0), "Set threshold" ); wxStfUsrDlg myDlg( GetDocumentWindow(), Input ); if (myDlg.ShowModal()!=wxID_OK) { return; } threshold=myDlg.readInput(); std::vector startIndices( stfnum::peakIndices( cursec().get(), threshold[0], 0 ) ); if (startIndices.empty()) { wxGetApp().ErrorMsg( wxT("Couldn't find any events;\ntry again with lower threshold") ); } // clear table from previous detection wxStfView* pView=(wxStfView*)GetFirstView(); wxStfGraph* pGraph = pView->GetGraph(); sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).eventList.clear(); for (c_int_it cit = startIndices.begin(); cit != startIndices.end(); ++cit) { sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()).eventList.push_back( stf::Event(*cit, 0, baseline, new wxCheckBox(pGraph, -1, wxEmptyString))); } // show results in a table: stfnum::Table events(GetCurrentSectionAttributes().eventList.size(),2); events.SetColLabel( 0, "Time of event peak"); events.SetColLabel( 1, "Inter-event interval"); std::size_t n_event = 0; c_event_it lastEventCit = GetCurrentSectionAttributes().eventList.begin(); for (c_event_it cit2 = GetCurrentSectionAttributes().eventList.begin(); cit2 != GetCurrentSectionAttributes().eventList.end(); ++cit2) { wxString eventName; eventName << wxT("Event #") << (int)n_event+1; events.SetRowLabel(n_event, stf::wx2std(eventName)); events.at(n_event,0)= (double)cit2->GetEventStartIndex() / GetSR(); events.at(n_event,1)= ((double)(cit2->GetEventStartIndex() - lastEventCit->GetEventStartIndex()) ) / GetSR(); n_event++; lastEventCit = cit2; } wxStfChildFrame* pChild=(wxStfChildFrame*)GetDocumentWindow(); if (pChild!=NULL) { pChild->ShowTable(events,wxT("Extracted events")); } } //Function calculates the peak and respective measures: base, Lo/Hi rise time //half duration, ratio of rise/slope and maximum slope void wxStfDoc::Measure( ) { double var=0.0; if (cursec().get().size() == 0) return; try { cursec().at(0); } catch (const std::out_of_range&) { return; } long windowLength = 1; /* windowLength (defined in samples) determines the size of the window for computing slopes. if the window length larger than 1 is used, a kind of smoothing and low pass filtering is applied. If slope estimates from data with different sampling rates should be compared, the window should be choosen in such a way that the length in milliseconds is approximately the same. This reduces some variability, the slope estimates are more robust and comparible. Set window length to 0.05 ms, with a minimum of 1 sample. In this way, all data sampled with 20 kHz or lower, will use a 1 sample window, data with a larger sampling rate use a window of 0.05 ms for computing the slope. */ windowLength = lround(0.05 * GetSR()); // use window length of about 0.05 ms. if (windowLength < 1) windowLength = 1; // use a minimum window length of 1 sample //Begin peak and base calculation //------------------------------- try { base=stfnum::base(baselineMethod,var,cursec().get(),baseBeg,baseEnd); baseSD=sqrt(var); peak=stfnum::peak(cursec().get(),base, peakBeg,peakEnd,pM,direction,maxT); } catch (const std::out_of_range& e) { base=0.0; baseSD=0.0; peak=0.0; throw e; } try { threshold = stfnum::threshold( cursec().get(), peakBeg, peakEnd, slopeForThreshold/GetSR(), thrT, windowLength ); } catch (const std::out_of_range& e) { threshold = 0; throw e; } //Begin Lo to Hi% Rise Time calculation //------------------------------------- // 2009-06-05: reference is either from baseline or from threshold double reference = base; if (!fromBase && thrT >= 0) { reference = threshold; } double ampl=peak-reference; tLoReal=0.0; double factor= RTFactor*0.01; /* normalized value */ InnerLoRT=NAN; InnerHiRT=NAN; OuterLoRT=NAN; OuterHiRT=NAN; try { // 2008-04-27: changed limits to start from the beginning of the trace // 2013-06-16: changed to accept different rise-time proportions rtLoHi=stfnum::risetime2(cursec().get(),reference,ampl, (double)0/*(double)baseEnd*/, maxT, factor/*0.2*/, InnerLoRT, InnerHiRT, OuterLoRT, OuterHiRT); InnerLoRT/=GetSR(); InnerHiRT/=GetSR(); OuterLoRT/=GetSR(); OuterHiRT/=GetSR(); } catch (const std::out_of_range& e) { throw e; } try { // 2008-04-27: changed limits to start from the beginning of the trace // 2013-06-16: changed to accept different rise-time proportions rtLoHi=stfnum::risetime(cursec().get(),reference,ampl, (double)0/*(double)baseEnd*/, maxT, factor/*0.2*/, tLoIndex, tHiIndex, tLoReal); } catch (const std::out_of_range& e) { rtLoHi=0.0; throw e; } tHiReal=tLoReal+rtLoHi; rtLoHi/=GetSR(); //Begin Half Duration calculation //------------------------------- //t50LeftReal=0.0; // 2008-04-27: changed limits to start from the beginning of the trace // and to stop at the end of the trace halfDuration = stfnum::t_half(cursec().get(), reference, ampl, (double)0 /*(double)baseBeg*/, (double)cursec().size()-1 /*(double)peakEnd*/,maxT, t50LeftIndex, t50RightIndex, t50LeftReal); t50RightReal=t50LeftReal+halfDuration; halfDuration/=GetSR(); t50Y=0.5*ampl + reference; //Calculate the beginning of the event by linear extrapolation: if (latencyEndMode==stf::footMode) { t0Real=tLoReal-(tHiReal-tLoReal)/3.0; // using 20-80% rise time (f/(1-2f) = 0.2/(1-0.4) = 1/3.0) } else { t0Real=t50LeftReal; } //Begin Ratio of slopes rise/decay calculation //-------------------------------------------- double left_rise = peakBeg; maxRise=stfnum::maxRise(cursec().get(),left_rise,maxT,maxRiseT,maxRiseY,windowLength); double t_half_3=t50RightIndex+2.0*(t50RightIndex-t50LeftIndex); double right_decay=peakEnd<=t_half_3 ? peakEnd : t_half_3+1; maxDecay=stfnum::maxDecay(cursec().get(),maxT,right_decay,maxDecayT,maxDecayY,windowLength); //Slope ratio if (maxDecay !=0) slopeRatio=maxRise/maxDecay; else slopeRatio=0.0; maxRise *= GetSR(); maxDecay *= GetSR(); if (size()>1) { //Calculate the absolute peak of the (AP) Ch2 inbetween the peak boundaries //A direction dependent evaluation of the peak as in Ch1 does NOT exist!! // endResting is set to 100 points arbitrarily in the pascal version // (see measlib.pas) assuming that the resting potential is stable // during the first 100 sampling points. // const int endResting=100; const int searchRange=100; double APBase=0.0, APVar=0.0; try { // in 2012-11-02: use baseline cursors and not arbitrarily 100 points //APBase=stfnum::base(APVar,secsec().get(),0,endResting); APBase=stfnum::base(baselineMethod,APVar,secsec().get(), baseBeg, baseEnd ); // use baseline cursors //APPeak=stfnum::peak(secsec().get(),APBase,peakBeg,peakEnd,pM,stfnum::up,APMaxT); APPeak=stfnum::peak( secsec().get(),APBase ,peakBeg ,peakEnd ,pM,direction ,APMaxT ); } catch (const std::out_of_range& e) { APBase=0.0; APPeak=0.0; throw e; } //------------------------------- //Maximal slope in the rise before the peak //---------------------------- APMaxRiseT=0.0; APMaxRiseY=0.0; double left_APRise = peakBeg; //if (GetLatencyWindowMode() == stf::defaultMode ) { left_APRise= APMaxT-searchRange>2.0 ? APMaxT-searchRange : 2.0; try { stfnum::maxRise(secsec().get(),left_APRise,APMaxT,APMaxRiseT,APMaxRiseY,windowLength); } catch (const std::out_of_range&) { APMaxRiseT=0.0; APMaxRiseY=0.0; left_APRise = peakBeg; } //End determination of the region of maximal slope in the second channel //---------------------------- //------------------------------- //Half-maximal amplitude //---------------------------- //APt50LeftReal=0.0; //std::size_t APt50LeftIndex,APt50RightIndex; stfnum::t_half(secsec().get(), APBase, APPeak-APBase, left_APRise, (double)secsec().get().size(), APMaxT, APt50LeftIndex, APt50RightIndex, APt50LeftReal); //End determination of the region of maximal slope in the second channel //---------------------------- // Get onset in 2nd channel APrtLoHi=stfnum::risetime(secsec().get(), APBase, APPeak-APBase, (double)0, APMaxT, 0.2, APtLoIndex, APtHiIndex, APtLoReal); APtHiReal = APtLoReal + APrtLoHi; APt0Real = APtLoReal-(APtHiReal-APtLoReal)/3.0; // using 20-80% rise time (f/(1-2f) = 0.2/(1-0.4) = 1/3.0) } // get and set start of latency measurement: double latStart=0.0; switch (latencyStartMode) { // Interestingly, latencyCursor is an int in pascal, although // the maxTs aren't. That's why there are double type casts // here. case stf::peakMode: //Latency cursor is set to the peak latStart=APMaxT; break; case stf::riseMode: latStart=APMaxRiseT; break; case stf::halfMode: latStart=APt50LeftReal; break; case stf::manualMode: default: latStart=GetLatencyBeg(); break; } SetLatencyBeg(latStart); APt0Real = tLoReal-(tHiReal-tLoReal)/3.0; // using 20-80% rise time (f/(1-2f) = 0.2/(1-0.4) = 1/3.0) // get and set end of latency measurement: double latEnd=0.0; switch (latencyEndMode) { // Interestingly, latencyCursor is an int in pascal, although // the maxTs aren't. That's why there are double type casts // here. case stf::footMode: latEnd=tLoReal-(tHiReal-tLoReal)/3.0; // using 20-80% rise time (f/(1-2f) = 0.2/(1-0.4) = 1/3.0) break; case stf::riseMode: latEnd=maxRiseT; break; case stf::halfMode: latEnd=t50LeftReal; break; case stf::peakMode: latEnd=maxT; break; case stf::manualMode: default: latEnd=GetLatencyEnd(); break; } SetLatencyEnd(latEnd); SetLatency(GetLatencyEnd()-GetLatencyBeg()); #ifdef WITH_PSLOPE //------------------------------------- // Begin PSlope calculation (PSP Slope) //------------------------------------- // int PSlopeBegVal; switch (pslopeBegMode) { case stf::psBeg_footMode: // Left PSlope to commencement PSlopeBegVal = (int)(tLoReal-(tHiReal-tLoReal)/3.0); break; case stf::psBeg_thrMode: // Left PSlope to threshold PSlopeBegVal = (int)thrT; break; case stf::psBeg_t50Mode: // Left PSlope to the t50 PSlopeBegVal = (int)t50LeftReal; break; case stf::psBeg_manualMode: // Left PSlope cursor manual default: PSlopeBegVal = PSlopeBeg; } SetPSlopeBeg(PSlopeBegVal); int PSlopeEndVal; switch (pslopeEndMode) { case stf::psEnd_t50Mode: // Right PSlope to t50rigth PSlopeEndVal = (int)t50LeftReal; break; case stf::psEnd_peakMode: // Right PSlope to peak PSlopeEndVal = (int)maxT; break; case stf::psEnd_DeltaTMode: // Right PSlope to DeltaT time from first peak PSlopeEndVal = (int)(PSlopeBeg + DeltaT); break; case stf::psEnd_manualMode: default: PSlopeEndVal = PSlopeEnd; } SetPSlopeEnd(PSlopeEndVal); try { PSlope = (stfnum::pslope(cursec().get(), PSlopeBeg, PSlopeEnd))*GetSR(); } catch (const std::out_of_range& e) { PSlope = 0.0; throw e; } //----------------------------------- // End PSlope calculation (PSP Slope) //----------------------------------- #endif // WITH_PSLOPE //-------------------------- } //End of Measure(,,,,,) void wxStfDoc::CopyCursors(const wxStfDoc& c_Recording) { measCursor=c_Recording.measCursor; correctRangeR(measCursor); baseBeg=c_Recording.baseBeg; correctRangeR(baseBeg); baseEnd=c_Recording.baseEnd; correctRangeR(baseEnd); peakBeg=c_Recording.peakBeg; correctRangeR(peakBeg); peakEnd=c_Recording.peakEnd; correctRangeR(peakEnd); fitBeg=c_Recording.fitBeg; correctRangeR(fitBeg); fitEnd=c_Recording.fitEnd; correctRangeR(fitEnd); #ifdef WITH_PSLOPE PSlopeBeg = c_Recording.PSlopeBeg; // PSlope left cursor correctRangeR(PSlopeBeg); PSlopeEnd = c_Recording.PSlopeEnd; // PSlope right cursor correctRangeR(PSlopeEnd); DeltaT=c_Recording.DeltaT; //distance (number of points) from first cursor #endif pM=c_Recording.pM; //peakMean, number of points used for averaging } void wxStfDoc::SetLatencyStartMode(int value) { switch (value) { case 1: latencyStartMode=stf::peakMode; break; case 2: latencyStartMode=stf::riseMode; break; case 3: latencyStartMode=stf::halfMode; break; case 4: latencyStartMode=stf::footMode; break; case 0: default: latencyStartMode=stf::manualMode; } } void wxStfDoc::SetLatencyEndMode(int value) { switch (value) { case 1: latencyEndMode=stf::peakMode; break; case 2: latencyEndMode=stf::riseMode; break; case 3: latencyEndMode=stf::halfMode; break; case 4: latencyEndMode=stf::footMode; break; case 0: default: latencyEndMode=stf::manualMode; } } void wxStfDoc::SetLatencyWindowMode(int value) { if ( value == 1 ) { latencyWindowMode = stf::windowMode; } else { latencyWindowMode = stf::defaultMode; } } void wxStfDoc::correctRangeR(int& value) { if (value<0) { value=0; return; } if (value>=(int)cursec().size()) { value=(int)cursec().size()-1; return; } } void wxStfDoc::correctRangeR(std::size_t& value) { if (value>=cursec().size()) { value=cursec().size()-1; return; } } void wxStfDoc::SetMeasCursor(int value) { correctRangeR(value); measCursor=value; } double wxStfDoc::GetMeasValue() { if (measCursor>=curch().size()) { correctRangeR(measCursor); } return cursec().at(measCursor); } void wxStfDoc::SetBaseBeg(int value) { correctRangeR(value); baseBeg=value; } void wxStfDoc::SetBaseEnd(int value) { correctRangeR(value); baseEnd=value; } void wxStfDoc::SetPeakBeg(int value) { correctRangeR(value); peakBeg=value; } void wxStfDoc::SetPeakEnd(int value) { correctRangeR(value); peakEnd=value; } void wxStfDoc::SetFitBeg(int value) { correctRangeR(value); fitBeg=value; } void wxStfDoc::SetFitEnd(int value) { correctRangeR(value); fitEnd=value; } void wxStfDoc::SetLatencyBeg(double value) { if (value<0.0) { value=0.0; } if (value>=(double)cursec().size()) { value=cursec().size()-1.0; } latencyStartCursor=value; } void wxStfDoc::SetLatencyEnd(double value) { if (value<0.0) { value=0.0; } if (value>=(double)cursec().size()) { value=cursec().size()-1.0; } latencyEndCursor=value; } void wxStfDoc::SetRTFactor(int value) { if (value < 0){ value = 5; } else if (value > 50) { value = 45; } RTFactor = value; } #ifdef WITH_PSLOPE void wxStfDoc::SetPSlopeBeg(int value) { correctRangeR(value); PSlopeBeg = value; } void wxStfDoc::SetPSlopeEnd(int value) { correctRangeR(value); PSlopeEnd = value; } #endif stfnum::Table wxStfDoc::CurAsTable() const { stfnum::Table table(cursec().size(),size()); try { for (std::size_t nRow=0;nRow= 0) { table.at(0,nCol) = GetPeak()-GetThreshold(); } else { table.at(0,nCol) = 0; } if (viewCursors) { table.at(1,nCol)=GetPeakBeg()*GetXScale(); table.at(2,nCol)=GetPeakEnd()*GetXScale(); } nCol++; } // RT (Lo-Hi%) if (viewRTLoHi) {table.at(0,nCol)=GetRTLoHi(); if (viewCursors) { table.at(1,nCol)=GetTLoReal()*GetXScale(); table.at(2,nCol)=GetTHiReal()*GetXScale(); } nCol++; } if (viewInnerRiseTime) { table.at(0,nCol)=GetInnerRiseTime(); if (viewCursors) { table.at(1,nCol)=GetInnerLoRT(); table.at(2,nCol)=GetInnerHiRT(); } nCol++; } if (viewOuterRiseTime) { table.at(0,nCol)=GetOuterRiseTime(); if (viewCursors) { table.at(1,nCol)=GetOuterLoRT(); table.at(2,nCol)=GetOuterHiRT(); } nCol++; } // Half duration if (viewT50) {table.at(0,nCol)=GetHalfDuration(); if (viewCursors) { table.at(1,nCol)=GetT50LeftReal()*GetXScale(); table.at(2,nCol)=GetT50RightReal()*GetXScale(); } nCol++; } // Rise/decay if (viewRD) {table.at(0,nCol)=GetSlopeRatio(); if (viewCursors) { table.at(1,nCol)=GetMaxRiseT()*GetXScale(); table.at(2,nCol)=GetMaxDecayT()*GetXScale(); } nCol++; } // Max rise if (viewSloperise) {table.at(0,nCol)=GetMaxRise(); if (viewCursors) { table.at(1,nCol)=GetMaxRiseT()*GetXScale(); table.SetEmpty(2,nCol,true); } nCol++; } // Max decay if (viewSlopedecay) {table.at(0,nCol)=GetMaxDecay(); if (viewCursors) { table.at(1,nCol)=GetMaxDecayT()*GetXScale(); table.SetEmpty(2,nCol,true); } nCol++; } // Latency if (viewLatency) {table.at(0,nCol)=GetLatency()*GetXScale(); if (viewCursors) { table.at(1,nCol)=GetLatencyBeg()*GetXScale(); table.at(2,nCol)=GetLatencyEnd()*GetXScale(); } nCol++; } #ifdef WITH_PSLOPE // PSlope if (viewPSlope) {table.at(0,nCol)=GetPSlope(); if (viewCursors) { table.at(1,nCol)=GetPSlopeBeg()*GetXScale(); table.at(2,nCol)=GetPSlopeEnd()*GetXScale(); } nCol++; } #endif // WITH_PSLOPE return table; } void wxStfDoc::resize(std::size_t c_n_channels) { Recording::resize(c_n_channels); yzoom.resize(size()); sec_attr.resize(size()); for (std::size_t nchannel = 0; nchannel < size(); ++nchannel) { sec_attr[nchannel].resize(at(nchannel).size()); } } void wxStfDoc::InsertChannel(Channel& c_Channel, std::size_t pos) { Recording::InsertChannel(c_Channel, pos); yzoom.resize(size()); sec_attr.resize(size()); for (std::size_t nchannel = 0; nchannel < size(); ++nchannel) { sec_attr[nchannel].resize(at(nchannel).size()); } } void wxStfDoc::SetIsFitted( std::size_t nchannel, std::size_t nsection, const Vector_double& bestFitP_, stfnum::storedFunc* fitFunc_, double chisqr, std::size_t fitBeg, std::size_t fitEnd ) { if (nchannel >= sec_attr.size() || nsection >= sec_attr[nchannel].size()) { throw std::out_of_range("Index out of range in wxStfDoc::SetIsFitted"); } if ( !fitFunc_ ) { throw std::runtime_error("Function pointer is zero in wxStfDoc::SetIsFitted"); } if ( fitFunc_->pInfo.size() != bestFitP_.size() ) { throw std::runtime_error("Number of best-fit parameters doesn't match number\n \ of function parameters in wxStfDoc::SetIsFitted"); } sec_attr[nchannel][nsection].fitFunc = fitFunc_; if ( sec_attr[nchannel][nsection].bestFitP.size() != bestFitP_.size() ) sec_attr[nchannel][nsection].bestFitP.resize(bestFitP_.size()); sec_attr[nchannel][nsection].bestFitP = bestFitP_; sec_attr[nchannel][nsection].bestFit = sec_attr[nchannel][nsection].fitFunc->output(sec_attr[nchannel][nsection].bestFitP, sec_attr[nchannel][nsection].fitFunc->pInfo, chisqr ); sec_attr[nchannel][nsection].storeFitBeg = fitBeg; sec_attr[nchannel][nsection].storeFitEnd = fitEnd; sec_attr[nchannel][nsection].isFitted = true; } void wxStfDoc::DeleteFit(std::size_t nchannel, std::size_t nsection) { if (nchannel >= sec_attr.size() || nsection >= sec_attr[nchannel].size()) { throw std::out_of_range("Index out of range in wxStfDoc::DeleteFit"); } sec_attr[nchannel][nsection].fitFunc = NULL; sec_attr[nchannel][nsection].bestFitP.resize( 0 ); sec_attr[nchannel][nsection].bestFit = stfnum::Table( 0, 0 ); sec_attr[nchannel][nsection].isFitted = false; } void wxStfDoc::SetIsIntegrated(std::size_t nchannel, std::size_t nsection, bool value, std::size_t begin, std::size_t end, const Vector_double& quad_p_) { if (nchannel >= sec_attr.size() || nsection >= sec_attr[nchannel].size()) { throw std::out_of_range("Index out of range in wxStfDoc::SetIsIntegrated"); } if (value==false) { sec_attr[nchannel][nsection].isIntegrated=value; return; } if (end<=begin) { throw std::out_of_range("integration limits out of range in Section::SetIsIntegrated"); } int n_intervals=std::div((int)end-(int)begin,2).quot; if ((int)quad_p_.size() != n_intervals*3) { throw std::out_of_range("Wrong number of parameters for quadratic equations in Section::SetIsIntegrated"); } sec_attr[nchannel][nsection].quad_p = quad_p_; sec_attr[nchannel][nsection].isIntegrated=value; sec_attr[nchannel][nsection].storeIntBeg=begin; sec_attr[nchannel][nsection].storeIntEnd=end; } void wxStfDoc::ClearEvents(std::size_t nchannel, std::size_t nsection) { try { sec_attr.at(nchannel).at(nsection).eventList.clear(); } catch(const std::out_of_range& e) { throw e; } } const stf::SectionAttributes& wxStfDoc::GetSectionAttributes(std::size_t nchannel, std::size_t nsection) const { try { return sec_attr.at(nchannel).at(nsection); } catch(const std::out_of_range& e) { throw e; } } const stf::SectionAttributes& wxStfDoc::GetCurrentSectionAttributes() const { try { return sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()); } catch(const std::out_of_range& e) { throw e; } } stf::SectionAttributes& wxStfDoc::GetCurrentSectionAttributesW() { try { return sec_attr.at(GetCurChIndex()).at(GetCurSecIndex()); } catch(const std::out_of_range& e) { throw e; } } #if 0 void wxStfDoc::Userdef(std::size_t id) { wxBusyCursor wc; int fselect=(int)id; Recording newR; Vector_double init(0); // get user input if necessary: if (!wxGetApp().GetPluginLib().at(fselect).input.labels.empty()) { wxStfUsrDlg myDlg( GetDocumentWindow(), wxGetApp().GetPluginLib().at(fselect).input ); if (myDlg.ShowModal()!=wxID_OK) { return; } init=myDlg.readInput(); } // Apply function to current valarray std::map< wxString, double > resultsMap; try { newR=wxGetApp().GetPluginLib().at(fselect).pluginFunc( *this, init, resultsMap ); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return; } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return; } catch (const std::exception& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); return; } if (newR.size()==0) { return; } wxString newTitle(GetTitle()); newTitle += wxT(", "); newTitle += wxGetApp().GetPluginLib().at(fselect).menuEntry; wxStfDoc* pDoc = wxGetApp().NewChild(newR,this,newTitle); ((wxStfChildFrame*)pDoc->GetDocumentWindow())->ShowTable( stfnum::Table(resultsMap), wxGetApp().GetPluginLib().at(fselect).menuEntry ); } #endif stimfit-0.15.8/src/stimfit/gui/main.cpp0000775000175000017500000000064713062445067014712 00000000000000// For compilers that support precompilation, includes "wx/wx.h". #include #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "./app.h" wxAppConsole *wxCreateApp() { wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "your program"); return new wxStfApp; } wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp); IMPLEMENT_WXWIN_MAIN IMPLEMENT_WX_THEME_SUPPORT stimfit-0.15.8/src/stimfit/gui/unopt.cpp0000664000175000017500000005636713062445067015142 00000000000000#ifdef WITH_PYTHON // For compilers that support precompilation, includes "wx/wx.h". #include #ifndef WX_PRECOMP #include "wx/wx.h" #endif // WX_PRECOMP #ifdef _POSIX_C_SOURCE #define _POSIX_C_SOURCE_WAS_DEF #undef _POSIX_C_SOURCE #endif #ifdef _XOPEN_SOURCE #define _XOPEN_SOURCE_WAS_DEF #undef _XOPEN_SOURCE #endif #include #ifdef _POSIX_C_SOURCE_WAS_DEF #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE #endif #endif #ifdef _XOPEN_SOURCE_WAS_DEF #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE #endif #endif #if defined(__WXMAC__) || defined(__WXGTK__) #pragma GCC diagnostic ignored "-Wwrite-strings" #endif #if PY_MAJOR_VERSION >= 3 #include #define PyString_Check PyBytes_Check #define PyString_AsString PyBytes_AsString #else #include #endif // revert to previous behaviour #if defined(__WXMAC__) || defined(__WXGTK__) #pragma GCC diagnostic warning "-Wwrite-strings" #endif //#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include #include "./app.h" #include "./doc.h" #include "./parentframe.h" int stf::Extension::n_extensions = 0; #if defined(__WXMAC__) || defined (__WXGTK__) #include wxString GetExecutablePath() { return wxStandardPaths::Get( ).GetExecutablePath(); } #endif // __WXMAC__ || __WXGTK__ #ifdef _WINDOWS #include #include wxString GetExecutablePath() { HKEY keyHandle; if( RegOpenKeyEx( HKEY_CURRENT_USER, wxT("Software\\Stimfit 0.14"), 0, KEY_QUERY_VALUE, &keyHandle) == ERROR_SUCCESS) { DWORD BufferSize = 8192; DWORD cbData = BufferSize; wxCharTypeBuffer data( BufferSize ); DWORD dwRet = RegQueryValueEx( keyHandle, TEXT("InstallLocation"), NULL, NULL, (LPBYTE) data.data(), &cbData ); while( dwRet == ERROR_MORE_DATA ) { // Get a buffer that is big enough. BufferSize += 4096; data.extend( BufferSize ); cbData = BufferSize; dwRet = RegQueryValueEx( keyHandle, TEXT("InstallLocation"), NULL, NULL, (LPBYTE) data.data(), &cbData ); } if( dwRet == ERROR_SUCCESS ) { RegCloseKey(keyHandle); return wxString( data ); } else { // wxGetApp().ErrorMsg( wxT("Couldn't read registry key for Stimfit") ); return wxT(""); } } else { // wxGetApp().ErrorMsg( wxT("Couldn't open registry key for Stimfit") ); return wxT(""); } } #endif // _WINDOWS bool wxStfApp::Init_wxPython() { // Initialize the Python interpreter if (!Py_IsInitialized()) { Py_Initialize(); } PyEval_InitThreads(); wxString cwd; #ifdef __WXMAC__ // Add the cwd to the present path: wxString app_path = wxFileName( GetExecutablePath() ).GetPath(); cwd << wxT("import os\n"); cwd << wxT("cwd=\"") << app_path << wxT("/../Frameworks\"\n"); cwd << wxT("import sys\n"); cwd << wxT("sys.path.append(cwd)\n"); cwd << wxT("cwd=\"") << app_path << wxT("/../Frameworks/stimfit\"\n"); cwd << wxT("sys.path.append(cwd)\n"); // cwd << wxT("cwd=\"") << app_path << wxT("/../Frameworks/numpy\"\n"); // cwd << wxT("sys.path.insert(0,cwd)\n"); #ifdef _STFDEBUG cwd << wxT("print(sys.path)\n"); cwd << wxT("import numpy\n"); cwd << wxT("print(numpy.version.version)\n"); #endif // _STFDEBUG #endif // __WXMAC__ #ifdef __WXGTK__ // Add the cwd to the present path: wxString app_path = wxFileName( GetExecutablePath() ).GetPath(); cwd << wxT("import os\n"); cwd << wxT("cwd=\"") << app_path << wxT("/../lib/stimfit\"\n"); cwd << wxT("import sys\n"); cwd << wxT("sys.path.append(cwd)\n"); #ifdef _STFDEBUG cwd << wxT("print(sys.path)\n"); cwd << wxT("import numpy\n"); cwd << wxT("print(numpy.version.version)\n"); #endif // _STFDEBUG #endif // __WXGTK__ #ifdef _WINDOWS // Add the cwd to the present path: wxString app_path = GetExecutablePath().BeforeFirst( wxUniChar('\0') ); cwd << wxT("cwd = \"") << app_path << wxT("\\wx-3.0-msw\"\nimport sys\nsys.path.insert(0,cwd)\n"); cwd << wxT("cwd = \"") << app_path << wxT("\\stf-site-packages\"\nsys.path.insert(0,cwd)\n"); cwd << wxT("cwd = \"") << app_path << wxT("\"\nsys.path.insert(0,cwd)\n"); #endif int cwd_result = PyRun_SimpleString(cwd.utf8_str()); if (cwd_result!=0) { PyErr_Print(); ErrorMsg( wxT("Couldn't modify Python path") ); Py_Finalize(); return false; } // Load the wxPython core API. Imports the wx._core_ module and sets a // local pointer to a function table located there. The pointer is used // internally by the rest of the API functions. #if PY_MAJOR_VERSION < 3 // Specify version of the wx module to be imported PyObject* wxversion = PyImport_ImportModule("wxversion"); if (wxversion==NULL) { PyErr_Print(); ErrorMsg( wxT("Couldn't import wxversion") ); Py_Finalize(); return false; } PyObject* wxselect = PyObject_GetAttrString(wxversion, "select"); Py_DECREF(wxversion); if (!PyCallable_Check(wxselect)) { PyErr_Print(); ErrorMsg( wxT("Couldn't select correct version of wx") ); Py_Finalize(); return false; } #if wxCHECK_VERSION(3, 0, 0) PyObject* ver_string = Py_BuildValue("ss","3.0",""); #elif wxCHECK_VERSION(2, 9, 0) PyObject* ver_string = Py_BuildValue("ss","2.9",""); #else PyObject* ver_string = Py_BuildValue("ss","2.8",""); #endif PyObject* result = PyEval_CallObject(wxselect, ver_string); Py_DECREF(ver_string); if (result == NULL) { PyErr_Print(); ErrorMsg( wxT("Couldn't call wxversion.select") ); Py_Finalize(); return false; } #endif // < python 3 #if 0 // wxversion.select doesn't return an error code, but raises an exception long iresult = PyInt_AsLong(result); Py_DECREF(result); if (iresult == 0) { PyErr_Print(); ErrorMsg( wxT("Couldn't select correct version of wx") ); Py_Finalize(); return false; } #endif #if PY_MAJOR_VERSION >= 3 if (wxPyGetAPIPtr()==NULL) { #else if ( ! wxPyCoreAPI_IMPORT() ) { #endif PyErr_Print(); wxString errormsg; errormsg << wxT("Couldn't load wxPython core API.\n"); #ifdef _WINDOWS errormsg << wxT("Try the following steps:\n"); errormsg << wxT("1.\tUninstall a previous Stimfit installation\n"); errormsg << wxT("\t(Control Panel->Software)\n"); errormsg << wxT("2.\tUninstall a previous wxPython installation\n"); errormsg << wxT("\t(Control Panel->Software)\n"); errormsg << wxT("3.\tUninstall a previous Python 2.5 installation\n"); errormsg << wxT("\t(Control Panel->Software)\n"); errormsg << wxT("4.\tSet the current working directory\n"); errormsg << wxT("\tto the program directory so that all shared\n"); errormsg << wxT("\tlibraries can be found.\n"); errormsg << wxT("\tIf you used a shortcut, right-click on it,\n"); errormsg << wxT("\tchoose \"Properties\", select the \"Shortcut\"\n"); errormsg << wxT("\ttab, then set \"Run in...\" to the stimfit program\n"); errormsg << wxT("\tdirectory (typically C:\\Program Files\\Stimfit).\n"); errormsg << wxT("\tIf you started stimfit from the command line, you\n"); errormsg << wxT("\thave to set the current working directory using the\n"); errormsg << wxT("\t\"/d\" option (e.g. /d=C:\\Program Files\\Stimfit)\n"); #endif // _WINDOWS ErrorMsg( errormsg ); Py_Finalize(); #if PY_MAJOR_VERSION < 3 Py_DECREF(result); #endif return false; } // Save the current Python thread state and release the // Global Interpreter Lock. m_mainTState = wxPyBeginAllowThreads(); #ifdef IPYTHON // Set a dummy sys.argv for IPython wxPyBlock_t blocked = wxPyBeginBlockThreads(); char* argv = (char *)"\0"; PySys_SetArgv(1, &argv); wxPyEndBlockThreads(blocked); #endif return true; } void wxStfApp::ImportPython(const wxString &modulelocation) { // Get path and filename from modulelocation wxString python_path = wxFileName(modulelocation).GetPath(); wxString python_file = wxFileName(modulelocation).GetName(); // Grab the Global Interpreter Lock. wxPyBlock_t blocked = wxPyBeginBlockThreads(); wxString python_import; #ifdef IPYTHON // the ip object is created to access the interactive IPython session python_import << wxT("import IPython.ipapi\n"); python_import << wxT("ip = IPython.ipapi.get()\n"); python_import << wxT("import sys\n"); python_import << wxT("sys.path.append(\"") << python_path << wxT("\")\n"); python_import << wxT("if not sys.modules.has_key(\"") << python_file << wxT("\"):"); python_import << wxT("ip.ex(\"import ") << python_file << wxT("\")\n"); python_import << wxT("else:") << wxT("ip.ex(\"reload(") << python_file << wxT(")") << wxT("\")\n"); python_import << wxT("sys.path.remove(\"") << python_path << wxT("\")\n"); #else // Python code to import a module with PyCrust python_import << wxT("import sys\n"); python_import << wxT("sys.path.append(\"") << python_path << wxT("\")\n"); python_import << wxT("if not sys.modules.has_key(\"") << python_file << wxT("\"):"); python_import << wxT("import ") << python_file << wxT("\n"); python_import << wxT("else:") << wxT("reload(") << python_file << wxT(")") << wxT("\n"); python_import << wxT("sys.path.remove(\"") << python_path << wxT("\")\n"); python_import << wxT("del sys\n"); #endif #if ((wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) && !defined(__WXMAC__)) PyRun_SimpleString(python_import); #else PyRun_SimpleString(python_import.char_str()); #endif // Release the Global Interpreter Lock wxPyEndBlockThreads(blocked); } bool wxStfApp::Exit_wxPython() { wxPyEndAllowThreads(m_mainTState); Py_Finalize(); return true; } void wxStfParentFrame::RedirectStdio() { // This is a helpful little tidbit to help debugging and such. It // redirects Python's stdout and stderr to a window that will popup // only on demand when something is printed, like a traceback. wxString python_redirect; python_redirect = wxT("import sys, wx\n"); python_redirect << wxT("output = wx.PyOnDemandOutputWindow()\n"); python_redirect << wxT("sys.stdin = sys.stderr = output\n"); python_redirect << wxT("del sys, wx\n"); wxPyBlock_t blocked = wxPyBeginBlockThreads(); #if ((wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) && !defined(__WXMAC__)) PyRun_SimpleString(python_redirect); #else PyRun_SimpleString(python_redirect.char_str()); #endif wxPyEndBlockThreads(blocked); } new_wxwindow wxStfParentFrame::MakePythonWindow(const std::string& windowFunc, const std::string& mgr_name, const std::string& caption, bool show, bool full, bool isfloat, int width, int height, double mpl_width, double mpl_height) { // More complex embedded situations will require passing C++ objects to // Python and/or returning objects from Python to be used in C++. This // sample shows one way to do it. NOTE: The above code could just have // easily come from a file, or the whole thing could be in the Python // module that is imported and manipulated directly in this C++ code. See // the Python API for more details. wxWindow *window = NULL; PyObject *result; // As always, first grab the GIL wxPyBlock_t blocked = wxPyBeginBlockThreads(); RedirectStdio(); // Now make a dictionary to serve as the global namespace when the code is // executed. Put a reference to the builtins module in it. (Yes, the // names are supposed to be different, I don't know why...) PyObject* globals = PyDict_New(); #if PY_MAJOR_VERSION >= 3 PyObject* builtins = PyImport_ImportModule("builtins"); #else PyObject* builtins = PyImport_ImportModule("__builtin__"); #endif PyDict_SetItemString(globals, "__builtins__", builtins); Py_DECREF(builtins); // Execute the code to make the makeWindow function result = PyRun_String(python_code2.char_str(), Py_file_input, globals, globals); // Was there an exception? if (! result) { PyErr_Print(); wxGetApp().ErrorMsg(wxT("Couldn't initialize python shell")); wxPyEndBlockThreads(blocked); return NULL; } Py_DECREF(result); // Now there should be an object named 'makeWindow' in the dictionary that // we can grab a pointer to: PyObject* func = NULL; func = PyDict_GetItemString(globals, windowFunc.c_str()); if (!PyCallable_Check(func)) { PyErr_Print(); wxGetApp().ErrorMsg(wxT("Couldn't initialize window for the python shell")); wxPyEndBlockThreads(blocked); return NULL; } // Now build an argument tuple and call the Python function. Notice the // use of another wxPython API to take a wxWindows object and build a // wxPython object that wraps it. #if PY_MAJOR_VERSION >= 3 PyObject* arg = wxPyConstructObject((void*)this, wxT("wxWindow"), false); #else PyObject* arg = wxPyMake_wxObject(this, false); #endif wxASSERT(arg != NULL); PyObject* py_mpl_width = PyFloat_FromDouble(mpl_width); wxASSERT(py_mpl_width != NULL); PyObject* py_mpl_height = PyFloat_FromDouble(mpl_height); wxASSERT(py_mpl_height != NULL); PyObject* figsize = PyTuple_New(2); PyTuple_SET_ITEM(figsize, 0, py_mpl_width); PyTuple_SET_ITEM(figsize, 1, py_mpl_height); PyObject* argtuple = PyTuple_New(2); PyTuple_SET_ITEM(argtuple, 0, arg); PyTuple_SET_ITEM(argtuple, 1, figsize); result = PyEval_CallObject(func, argtuple); Py_DECREF(argtuple); Py_DECREF(py_mpl_width); Py_DECREF(py_mpl_height); Py_DECREF(figsize); // Was there an exception? if (! result) { PyErr_Print(); wxGetApp().ErrorMsg(wxT("Couldn't create window for the python shell")); wxPyEndBlockThreads(blocked); return NULL; } else { // Otherwise, get the returned window out of Python-land and // into C++-ville... #if PY_MAJOR_VERSION >= 3 if (!wxPyConvertWrappedPtr(result, (void**)&window, _T("wxWindow"))) { #else if (!wxPyConvertSwigPtr(result, (void**)&window, _T("wxWindow"))) { #endif PyErr_Print(); wxGetApp().ErrorMsg(wxT("Returned object was not a wxWindow!")); wxPyEndBlockThreads(blocked); return NULL; } Py_DECREF(result); } // Release the python objects we still have Py_DECREF(globals); // Finally, after all Python stuff is done, release the GIL wxPyEndBlockThreads(blocked); if (!full) { if (isfloat) { m_mgr.AddPane( window, wxAuiPaneInfo().Name(stf::std2wx(mgr_name)). CloseButton(true). Show(show).Caption(stf::std2wx(caption)).Float(). BestSize(width, height) ); } else { m_mgr.AddPane( window, wxAuiPaneInfo().Name(stf::std2wx(mgr_name)). CloseButton(true). Show(show).Caption(stf::std2wx(caption)).Dockable(true).Bottom(). BestSize(width, height) ); } } else { m_mgr.AddPane( window, wxAuiPaneInfo().Name(stf::std2wx(mgr_name)). Floatable(false).CaptionVisible(false). BestSize(GetClientSize().GetWidth(),GetClientSize().GetHeight()).Fixed() ); } m_mgr.Update(); return new_wxwindow(window, result); } std::vector wxStfApp::LoadExtensions() { std::vector< stf::Extension > extList; // As always, first grab the GIL wxPyBlock_t blocked = wxPyBeginBlockThreads(); // import extensions.py: PyObject* pModule = PyImport_ImportModule("extensions"); if (!pModule) { PyErr_Print(); #ifdef _STFDEBUG wxGetApp().ErrorMsg(wxT("Couldn't load extensions.py")); #endif wxPyEndBlockThreads(blocked); return extList; } PyObject* pExtList = PyObject_GetAttrString(pModule, "extensionList"); if (!pExtList) { PyErr_Print(); wxGetApp().ErrorMsg(wxT("Couldn't find extensionList in extensions.py")); wxPyEndBlockThreads(blocked); Py_DECREF(pModule); return extList; } if (!PyList_Check(pExtList)) { PyErr_Print(); wxGetApp().ErrorMsg(wxT("extensionList is not a Python list in extensions.py")); wxPyEndBlockThreads(blocked); Py_DECREF(pExtList); Py_DECREF(pModule); return extList; } // retrieve values from list: for (int i=0; i= (int)GetExtensionLib().size() || id<0) { wxString msg(wxT("Couldn't find extension function")); ErrorMsg( msg ); return; } // As always, first grab the GIL wxPyBlock_t blocked = wxPyBeginBlockThreads(); // retrieve function PyObject* pPyFunc = (PyObject*)(GetExtensionLib()[id].pyFunc); // retrieve function name wxString FuncName = stf::std2wx(GetExtensionLib()[id].menuEntry); if (!pPyFunc || !PyCallable_Check(pPyFunc)) { wxString msg(FuncName << wxT(" Couldn't call extension function ")); ErrorMsg( msg ); wxPyEndBlockThreads(blocked); return; } // call function PyObject* res = PyObject_CallObject(pPyFunc, NULL); if (!res) { PyErr_Print(); wxString msg(FuncName << wxT(" call failed")); ErrorMsg( msg ); wxPyEndBlockThreads(blocked); return; } if (res==Py_False) { wxString msg(FuncName << wxT(" returned False")); ErrorMsg( msg ); } Py_XDECREF(res); // Finally, after all Python stuff is done, release the GIL wxPyEndBlockThreads(blocked); } bool wxStfDoc::LoadTDMS(const std::string& filename, Recording& ReturnData) { // Grab the Global Interpreter Lock. wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyObject* stf_mod = PyImport_ImportModule("tdms"); if (!stf_mod) { PyErr_Print(); #ifdef _STFDEBUG wxGetApp().ErrorMsg(wxT("Couldn't load tdms.py")); #endif wxPyEndBlockThreads(blocked); return false; } PyObject* py_fn = PyString_FromString(filename.c_str()); PyObject* stf_tdms_f = PyObject_GetAttrString(stf_mod, "tdms_open"); PyObject* stf_tdms_res = NULL; if (PyCallable_Check(stf_tdms_f)) { PyObject* stf_tdms_args = PyTuple_Pack(1, py_fn); stf_tdms_res = PyObject_CallObject(stf_tdms_f, stf_tdms_args); PyErr_Print(); Py_DECREF(stf_mod); Py_DECREF(py_fn); Py_DECREF(stf_tdms_args); } else { Py_DECREF(stf_mod); Py_DECREF(py_fn); return false; } if (stf_tdms_res == Py_None) { wxGetApp().ErrorMsg( wxT("nptdms module unavailable. Cannot read tdms files.")); Py_DECREF(stf_tdms_res); return false; } if (!PyTuple_Check(stf_tdms_res)) { wxGetApp().ErrorMsg(wxT("Return value of tdms_open is not a tuple. Aborting now.")); Py_DECREF(stf_tdms_res); return false; } if (PyTuple_Size(stf_tdms_res) != 2) { wxGetApp().ErrorMsg( wxT("Return value of tdms_open is not a 2-tuple. Aborting now.")); Py_DECREF(stf_tdms_res); return false; } PyObject* data_list = PyTuple_GetItem(stf_tdms_res, 0); PyObject* py_dt = PyTuple_GetItem(stf_tdms_res, 1); double dt = PyFloat_AsDouble(py_dt); Py_DECREF(py_dt); Py_ssize_t nchannels = PyList_Size(data_list); ReturnData.resize(nchannels); int nchannels_nonempty = 0; for (int nc=0; nc class wxStfDoc; class wxStfGraph; //! The view class, derived from wxView. /*! It is used to model the viewing and editing component of the file-based data. * It is part of the document/view framework supported by wxWidgets. Note that * this class does almost nothing in stimfit. Its only purpose is to adhere to * the doc/view paradigm. All of the actual drawing happens in wxStfGraph. */ class wxStfView : public wxView { public: //! Constructor wxStfView(); //! Destructor ~wxStfView() {} //! Override default view creation /*! Creates a child frame and a graph, sets the window title. * \param doc Pointer to the attached document. * \param flags View creation flags. * \return true upon successful view creation, false otherwise. */ virtual bool OnCreate(wxDocument *doc, long flags); //! The drawing function (note that actual drawing happens in wxStfGraph::OnDraw()) /*! \param dc Pointer to the device context. * \sa wxStfGraph::OnDraw() */ virtual void OnDraw(wxDC *dc); //! Override default updating behaviour /*! Called when the graph should be refreshed. * \param sender Pointer to the view that requested the update. * \param hint Unused. */ virtual void OnUpdate(wxView *sender, wxObject *hint = (wxObject *) NULL); //! Override default file closing behaviour /*! \param deleteWindow true if the child frame should be deleted. * \return true if file closing was successful. */ virtual bool OnClose(bool deleteWindow = true); //! Retrieve the attached graph /*! \return A pointer to the attached graph. */ wxStfGraph* GetGraph() { return graph; } //! Retrieve the attached document /*! \return A pointer to the attached document. */ wxStfDoc* Doc(); //! Retrieve the attached document /*! \return A pointer to the attached document. */ wxStfDoc* DocC() const; protected: //! Called when the view is activated; dialogs and menus are then updated. /*! \param activate true if this view is being activated. * \param activeView Pointer to the view that is now active. * \param deactiveView Pointer to the view that has just been deactivated. */ virtual void OnActivateView(bool activate, wxView *activeView, wxView *deactiveView); private: DECLARE_DYNAMIC_CLASS(wxStfView) DECLARE_EVENT_TABLE() wxStfGraph *graph; wxStfChildFrame *childFrame; }; /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/printout.h0000775000175000017500000000512713062445067015315 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file printout.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfPrintout. Derived from wxPrintout to handle printing of traces. */ #ifndef _PRINTOUT_H #define _PRINTOUT_H /*! \addtogroup wxstf * @{ */ //! Handles printing of traces. class wxStfPrintout : public wxPrintout { public: //! Constructor /*! \param title Printout title */ wxStfPrintout(const wxChar *title = _T("Printout")); //! Called by the framework when a page should be printed. /*! \param page The page number to be printed * \return false will cancel the print job. */ bool OnPrintPage(int page); //! Checks whether a page exists. /*! \param page The page number to be checked. * \return True if \e page exists. */ bool HasPage(int page); //! Called by the framework at the start of document printing. /*! \param startPage Page from which to start printing. * \param endPage Page at which to end printing. * \return false cancels the print job. */ bool OnBeginDocument(int startPage, int endPage); //! Retrieve information about the pages that will be printed. /*! \param minPage On return, a pointer to the minimal page number allowed. * \param maxPage On return, a pointer to the maximal page number allowed. * \param selPageFrom On return, a pointer to the minimal selected page number allowed. * \param selPageTo On return, a pointer to the maximal selected page number allowed. */ void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); //! Prints the first (and only) page. void DrawPageOne(); private: void PrintHeader(wxDC* pDC,double scale); bool store_noGimmicks; wxStfDoc* Doc() const {return wxGetApp().GetActiveDoc();} }; /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/graph.h0000775000175000017500000004006313062445067014530 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file graph.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfGraph. */ #ifndef _GRAPH_H #define _GRAPH_H /*! \addtogroup wxstf * @{ */ // forward declarations: class wxStfView; class wxStfDoc; class wxStfParentFrame; class wxStfCheckBox; class wxEnhMetaFile; #include "./zoom.h" enum plottype { active, reference, background }; //! Handles drawing of traces and keyboard or mouse input. /*! Derived from wxScrolledWindow, although no scrolling is implemented * at this time. All the trace scaling and drawing happens here. Mouse * and keyboard input is handled here as well. */ class StfDll wxStfGraph : public wxScrolledWindow { public: //! Constructor. /*! \param v is a pointer to the attached wxView. * \param frame is a pointer to the attached child frame. * \param pos and \param size indicate the initial position and size of this frame. * \param style is the window style. */ wxStfGraph(wxView *v, wxStfChildFrame *frame, const wxPoint& pos, const wxSize& size, long style); //! The central drawing function. Used for drawing to any output device, such as a printer or a screen. /*! \param dc is the device context used for drawing (can be a printer, a screen or a file). */ virtual void OnDraw(wxDC& dc); //! Copies the drawing to the clipboard as a windows metafile. /*! Metafiles are only implemented in Windows. Some applications * allow you to paste as an enhanced metafile (usually through * "Edit -> Paste special..."); choose this option for best results. */ void Snapshotwmf(); //! Handles mouse events. /*! The different possibilities (e.g. left or right click) split up * within this function. * \param event The mouse event. Contains information such as whether * the left or right button was clicked. */ void OnMouseEvent(wxMouseEvent& event); //! Handles keyboard input. /*! Key modifiers (e.g. Shift or Ctrl) ar handled within this function. * \param event The keyboard event. Contains information about the key * that was pressed. */ void OnKeyDown(wxKeyEvent& event); //! Change trace /*! Takes care of refreshing everything when a new trace is shown * \param trace Index of next trace to be displayed */ void ChangeTrace(int trace); //! Show and analyse next trace. /*! Called when either the "next trace"-button is clicked or the right * arrow cursor key is pressed. Wraps around when last trace is reached. */ void OnNext(); //! Show and analyse previous trace. /*! Called when either the "previous trace"-button is clicked or the left * arrow cursor key is pressed. Wraps around when first trace is reached. */ void OnPrevious(); //! Show and analyse last trace. /*! Called when the "last trace"-button is clicked. */ void OnLast(); //! Show and analyse first trace. /*! Called when the "first trace"-button is clicked. */ void OnFirst(); //! Moves the traces up by 20 px. /*! Called when either the up arrow cursor key is pressed * or the "Move traces up"-button is clicked. */ void OnUp(); //! Moves the traces down by 20 px. /*! Called when either the down arrow cursor key is pressed * or the "Move traces down"-button is clicked. */ void OnDown(); //! Moves the traces right by 20 px. /*! Called when either the right arrow cursor key and Ctrl are pressed * at the same time or the "Move traces right"-button is clicked. */ void OnRight(); //! Moves the traces left by 20 px. /*! Called when either the left arrow cursor key and Ctrl are pressed * at the same time or the "Move traces left"-button is clicked. */ void OnLeft(); //! Enlarges the x-scale by a factor of 2. /*! This is currently never called and might be removed in the future. */ void OnXenlhi(); //! Enlarges the x-scale by a factor of 1.1. /*! Called when either the "+" key and Ctrl are pressed * at the same time or the "Enlarge x-scale"-button is clicked. */ void OnXenllo(); //! Shrinks the x-scale by a factor of 1.1. /*! Called when either the "-" key and Ctrl are pressed * at the same time or the "Shrink x-scale"-button is clicked. */ void OnXshrinklo(); //! Shrinks the x-scale by a factor of 2. /*! This is currently never called and might be removed in the future. */ void OnXshrinkhi(); //! Enlarges the y-scale by a factor of 2. /*! This is currently never called and might be removed in the future. */ void OnYenlhi(); //! Enlarges the y-scale by a factor of 1.1. /*! Called when either the "+" key is pressed * or the "Enlarge x-scale"-button is clicked. */ void OnYenllo(); //! Shrinks the y-scale by a factor of 1.1. /*! Called when either the "-" key is pressed * or the "Shrink x-scale"-button is clicked. */ void OnYshrinklo(); //! Shrinks the y-scale by a factor of 2. /*! This is currently never called and might be removed in the future. */ void OnYshrinkhi(); //! Adjust y-positioning so that the baselines of channel 1 and 2 are at the same y-position. void Ch2base(); //! Adjust y-positioning so that channel 1 and 2 are at the same absolute y-position. void Ch2pos(); //! Adjust y-scale so that channel 1 and 2 have the same y-scale. void Ch2zoom(); //! Combines Ch2zoom() and Ch2base(). /*! This is a separate function so that the graph is not * refreshed between adjusting the y-scale and the baseline. */ void Ch2basezoom(); //! advance / decrement the active channel by one void ChanScroll(int direction); #if 0 //! Swaps the active and the reference channel. void SwapChannels(); #endif //! Fits the graph to the window. /*! Fits the graph to 100% of the width and 50% of the height * of the window and centers it. * \param refresh Set to true if the graph should be refreshed after fitting it to the window. */ void Fittowindow(bool refresh); //! Set to true if the graph is drawn on a printer. /*! \param value boolean determining whether the graph is printed. */ void set_isPrinted(bool value); //! Sets the printing scale to the specified value. /*! \param value The new printing scale. */ void set_printScale(double value) {printScale=value;} //! Sets the size of the printout to the epcified rectangle. /*! \param value The new printing rectangle. */ void set_printRect(wxRect value) {printRect=value;} //! Set to true if the results table and the cursors should be printed. /*! \param value boolean determining whether everything should be printed. */ void set_noGimmicks(bool value) {no_gimmicks=value;} //! Prints every n-th point. /*! \param value Determines that every n-th point should be printed. */ void set_downsampling(int value) { downsampling = (value < 1 ? 1 : value); } //! Indicates whether everything (cursors, results table, etc.) is printed out. /*! \return true if everything is printed out. */ bool get_noGimmicks() const {return no_gimmicks;} //! Returns the y-position of a right click when in event-detection mode. /*! \return the index of the trace that the right-click position corresponds to. */ int get_eventPos() const { return eventPos; } //! Returns the current zoom struct. /*! \return the current zoom struct. */ // Zoom get_zoom() { return Doc()->at(Doc()->GetCurChIndex()).GetZoom(); } //! Sets the current zoom struct. /*! \param zoom_ The current zoom struct. */ // void set_zoom(const Zoom& zoom_) { Doc()->at(Doc()->GetCurChIndex()).GetZoomW()=zoom_; } //! The view attached to this wxStfGraph. wxStfView *view; //! Returns x value of the left screen border /*! \return x value of the left screen border */ double get_plot_xmin() const; //! Returns x value of the right screen border /*! \return x value of the right screen border */ double get_plot_xmax() const; //! Returns y value of the bottom screen border /*! \return y value of the bottom screen border */ double get_plot_ymin() const; //! Returns y value of the top screen border /*! \return y value of the top screen border */ double get_plot_ymax() const; //! Returns y value of the bottom screen border for the reference channel /*! \return y value of the bottom screen border for the reference channel */ double get_plot_y2min() const; //! Returns y value of the top screen border for the reference channel /*! \return y value of the top screen border for the reference channel */ double get_plot_y2max() const; private: wxStfChildFrame* pFrame; bool isZoomRect; //True if zoom window is set bool no_gimmicks; //True if no extra rulers/lines and circles shall be displayed bool isPrinted; //True when the View is drawn to a printer bool isLatex; bool firstPass; bool isSyncx; //Zoom struct // Zoom zoom; //Zoom struct to retain StdOut // Zoom zoomOld; //Zoom struct for PrintOut // Zoom zoomPrint; //Variables for the scaling of the print out wxRect printRect; //Printout graphic variables static const int boebbelStd=6;//Size of circles for display output int boebbel, //Size of circles (for peak, 2080rise time, etc.) boebbelPrint; //Size of circles for scalable print out double printScale; int printSizePen1,//Size of pens for scalable print out printSizePen2, printSizePen4, downsampling, eventPos; // ll... means lower limit, ul... means upper limit double llz_x, ulz_x, llz_y, ulz_y, llz_y2,ulz_y2; //Three lines of text containing the results wxString results1, results2, results3,results4, results5, results6; //Pens are declared here instead of locally to accelerate OnDraw() //Drawing (pen) styles for the different graphical standard output wxPen standardPen, standardPen2, standardPen3, scalePen, scalePen2, peakPen, peakLimitPen, basePen, baseLimitPen, decayLimitPen, ZoomRectPen, fitPen, fitSelectedPen, selectPen, averagePen, rtPen, hdPen, rdPen, slopePen, latencyPen, alignPen, measPen, eventPen, PSlopePen; /*CSH*/ //Drawing (pen) styles for the different graphical standard output wxPen standardPrintPen, standardPrintPen2, standardPrintPen3, scalePrintPen, scalePrintPen2,measPrintPen, peakPrintPen, peakLimitPrintPen, basePrintPen, baseLimitPrintPen, decayLimitPrintPen, fitPrintPen, fitSelectedPrintPen, selectPrintPen, averagePrintPen, rtPrintPen, hdPrintPen, rdPrintPen, slopePrintPen, resultsPrintPen, latencyPrintPen, PSlopePrintPen; wxBrush baseBrush, zeroBrush; wxPoint lastLDown; YZoom yzoombg; #if (__cplusplus < 201103) boost::shared_ptr m_zoomContext; boost::shared_ptr m_eventContext; #else std::shared_ptr m_zoomContext; std::shared_ptr m_eventContext; #endif void InitPlot(); void PlotSelected(wxDC& DC); void PlotAverage(wxDC& DC); void DrawZoomRect(wxDC& DC); void PlotGimmicks(wxDC& DC); void PlotEvents(wxDC& DC); void DrawCrosshair( wxDC& DC, const wxPen& pen, const wxPen& printPen, int crosshairSize, double xch, double ych); void PlotTrace( wxDC* pDC, const Vector_double& trace, plottype pt=active, int bgno=0 ); void DoPlot( wxDC* pDC, const Vector_double& trace, int start, int end, int step, plottype pt=active, int bgno=0 ); void PrintScale(wxRect& WindowRect); void PrintTrace( wxDC* pDC, const Vector_double& trace, plottype ptype=active); void DoPrint( wxDC* pDC, const Vector_double& trace, int start, int end, plottype ptype=active); void DrawCircle(wxDC* pDC, double x, double y, const wxPen& pen, const wxPen& printPen); void DrawVLine(wxDC* pDC, double x, const wxPen& pen, const wxPen& printPen); void DrawHLine(wxDC* pDC, double y, const wxPen& pen, const wxPen& printPen); void eventArrow(wxDC* pDC, int eventIndex); void DrawFit(wxDC* pDC); void PlotFit( wxDC* pDC, const stf::SectionPointer& Sec ); void DrawIntegral(wxDC* pDC); void CreateScale(wxDC* pDC); // Function receives the x-coordinate of a point and returns // its formatted value according to the current Zoom settings long xFormat(double); long xFormat(long); long xFormat(int); long xFormat(std::size_t); // The same for the y coordinates long yFormat(double); long yFormat(long); long yFormat(int); long yFormatD(double f) { return yFormat(f); } // The same for the y coordinates of the second channel long yFormat2(double); long yFormat2(long); long yFormat2(int); long yFormatD2(double f) { return yFormat2(f); } // The same for the y coordinates of the background channel long yFormatB(double); long yFormatB(long); long yFormatB(int); long yFormatDB(double f) { return yFormatB(f); } void FittorectY(YZoom& yzoom, const wxRect& rect, double min, double max, double screen_part); void FitToWindowSecCh(bool refresh); void LButtonDown(wxMouseEvent& event); void RButtonDown(wxMouseEvent& event); void LButtonUp(wxMouseEvent& event); // shorthand: wxStfDoc* Doc() { if (view != NULL) return view->Doc(); else return NULL; } wxStfDoc* DocC() const { if (view != NULL) return view->DocC(); else return NULL; } void ChangeXScale(double factor); void ChangeYScale(double factor); wxStfParentFrame* ParentFrame(); void OnZoomHV(wxCommandEvent& event); void OnZoomH(wxCommandEvent& event); void OnZoomV(wxCommandEvent& event); #if defined __WXMAC__ && !(wxCHECK_VERSION(2, 9, 0)) void OnPaint(wxPaintEvent &event); #endif long SPX() const { return DocC()->GetXZoom().startPosX; } long& SPXW() { return DocC()->GetXZoomW().startPosX; } long SPY() const { return DocC()->GetYZoom(DocC()->GetCurChIndex()).startPosY; } long& SPYW() { return DocC()->GetYZoomW(DocC()->GetCurChIndex()).startPosY; } long SPY2() const { return DocC()->GetYZoom(DocC()->GetSecChIndex()).startPosY; } long& SPY2W() { return DocC()->GetYZoomW(DocC()->GetSecChIndex()).startPosY; } double XZ() const { return DocC()->GetXZoom().xZoom; } double& XZW() { return DocC()->GetXZoomW().xZoom; } double YZ() const { return DocC()->GetYZoom(DocC()->GetCurChIndex()).yZoom; } double& YZW() { return DocC()->GetYZoomW(DocC()->GetCurChIndex()).yZoom; } double YZ2() const { return DocC()->GetYZoom(DocC()->GetSecChIndex()).yZoom; } double& YZ2W() { return DocC()->GetYZoomW(DocC()->GetSecChIndex()).yZoom; } DECLARE_EVENT_TABLE() }; /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/zoom.h0000775000175000017500000000424713062445067014417 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file zoom.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares the Zoom struct. */ #ifndef _ZOOM_H #define _ZOOM_H //! Handles y-scaling of traces class YZoom { public: //! Default constructor YZoom() : startPosY(500), yZoom(0.1), isLogScaleY(false) {} //! Constructor /*! \param spy1 The y offset in pixels. * \param yz1 The y-scaling. * \param lsy Currently unused. */ YZoom(long spy1, double yz1, bool lsy=false) : startPosY(spy1), yZoom(yz1), isLogScaleY(lsy) {} long startPosY; /*!< The y offset in pixels. */ double yZoom; /*!< The y-scaling. */ bool isLogScaleY; /*!< Currently unused. */ //! Overloaded multiplication operator. YZoom operator*( double factor ); }; //! Handles x-scaling of traces class XZoom { public: //! Default constructor XZoom() : startPosX(0), xZoom(0.1), isLogScaleX(false) {} //! Constructor /*! \param spx The x offset in pixels. * \param xz The x-scaling. * \param lsx Currently unused. */ XZoom( long spx, double xz, bool lsx=false ) : startPosX(spx), xZoom(xz), isLogScaleX(lsx) {} long startPosX; /*!< The x offset in pixels. */ double xZoom; /*!< The x-scaling. */ bool isLogScaleX; /*!< Currently unused. */ //! Overloaded multiplication operator. XZoom operator*( double factor ); }; #endif stimfit-0.15.8/src/stimfit/gui/parentframe.cpp0000775000175000017500000015050213062445067016266 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // parentframe.cpp // These are the top-level and child windows of the application. // 2007-12-27, Christoph Schmidt-Hieber, University of Freiburg #ifdef _STFDEBUG #include #endif // For compilers that support precompilation, includes "wx/wx.h". #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #if !wxUSE_DOC_VIEW_ARCHITECTURE #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! #endif #if !wxUSE_MDI_ARCHITECTURE #error You must set wxUSE_MDI_ARCHITECTURE to 1 in setup.h! #endif #include "../../../stfconf.h" #include "./app.h" #include "./doc.h" #include "./view.h" #include "./graph.h" #include "./table.h" #include "./printout.h" #include "./dlgs/convertdlg.h" #include "./dlgs/smalldlgs.h" #include "./copygrid.h" #include "./../../libstfio/atf/atflib.h" #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) #include "./../../libstfio/biosig/biosiglib.h" #endif #include "./../../libstfio/igor/igorlib.h" #include "./childframe.h" #include "./parentframe.h" #include "./../../libstfnum/levmar/levmar.h" #include "./../res/16-em-down.xpm" #include "./../res/16-em-open.xpm" #include "./../res/accept.xpm" #include "./../res/arrow_down.xpm" #include "./../res/arrow_left.xpm" #include "./../res/arrow_out.xpm" #include "./../res/arrow_right.xpm" #include "./../res/arrow_up.xpm" #include "./../res/camera.xpm" #include "./../res/camera_ps.xpm" #include "./../res/ch1.xpm" #include "./../res/ch2.xpm" #include "./../res/cursor.xpm" #include "./../res/event.xpm" #include "./../res/fit.xpm" #include "./../res/fit_lim.xpm" #include "./../res/latency_lim.xpm" #include "./../res/resultset_first.xpm" #include "./../res/resultset_last.xpm" #include "./../res/resultset_next.xpm" #include "./../res/resultset_previous.xpm" #include "./../res/sum_new.xpm" #include "./../res/sum_new_aligned.xpm" #include "./../res/table.xpm" #include "./../res/zoom.xpm" #include "./../res/zoom_in.xpm" #include "./../res/zoom_out.xpm" #ifdef WITH_PSLOPE #include "./../res/slope.xpm" #endif #ifndef wxS_DIR_DEFAULT #define wxS_DIR_DEFAULT 0777 #endif IMPLEMENT_CLASS(wxStfParentFrame, wxStfParentType) BEGIN_EVENT_TABLE(wxStfParentFrame, wxStfParentType) EVT_MENU(wxID_HELP, wxStfParentFrame::OnHelp) EVT_MENU(ID_UPDATE, wxStfParentFrame::OnCheckUpdate) EVT_MENU(wxID_ABOUT, wxStfParentFrame::OnAbout) EVT_TOOL(ID_TOOL_SELECT,wxStfParentFrame::OnToggleSelect) EVT_TOOL(ID_TOOL_FIRST, wxStfParentFrame::OnToolFirst) EVT_TOOL(ID_TOOL_NEXT, wxStfParentFrame::OnToolNext) EVT_TOOL(ID_TOOL_PREVIOUS, wxStfParentFrame::OnToolPrevious) EVT_TOOL(ID_TOOL_LAST, wxStfParentFrame::OnToolLast) EVT_TOOL(ID_TOOL_XENL, wxStfParentFrame::OnToolXenl) EVT_TOOL(ID_TOOL_XSHRINK, wxStfParentFrame::OnToolXshrink) EVT_TOOL(ID_TOOL_YENL, wxStfParentFrame::OnToolYenl) EVT_TOOL(ID_TOOL_YSHRINK, wxStfParentFrame::OnToolYshrink) EVT_TOOL(ID_TOOL_UP, wxStfParentFrame::OnToolUp) EVT_TOOL(ID_TOOL_DOWN, wxStfParentFrame::OnToolDown) EVT_TOOL(ID_TOOL_FIT, wxStfParentFrame::OnToolFit) EVT_TOOL(ID_TOOL_LEFT, wxStfParentFrame::OnToolLeft) EVT_TOOL(ID_TOOL_RIGHT, wxStfParentFrame::OnToolRight) EVT_TOOL(ID_TOOL_SNAPSHOT_WMF, wxStfParentFrame::OnToolSnapshotwmf) EVT_TOOL(ID_TOOL_CH1, wxStfParentFrame::OnToolCh1) EVT_TOOL(ID_TOOL_CH2, wxStfParentFrame::OnToolCh2) EVT_TOOL(ID_TOOL_MEASURE, wxStfParentFrame::OnToolMeasure) EVT_TOOL(ID_TOOL_PEAK,wxStfParentFrame::OnToolPeak) EVT_TOOL(ID_TOOL_BASE,wxStfParentFrame::OnToolBase) EVT_TOOL(ID_TOOL_DECAY,wxStfParentFrame::OnToolDecay) #ifdef WITH_PSLOPE EVT_TOOL(ID_TOOL_PSLOPE,wxStfParentFrame::OnToolPSlope) #endif EVT_TOOL(ID_TOOL_LATENCY,wxStfParentFrame::OnToolLatency) EVT_TOOL(ID_TOOL_ZOOM,wxStfParentFrame::OnToolZoom) EVT_TOOL(ID_TOOL_EVENT,wxStfParentFrame::OnToolEvent) EVT_TOOL(ID_TOOL_FITDECAY, wxStfParentFrame::OnToolFitdecay) EVT_MENU(ID_CONVERT, wxStfParentFrame::OnConvert) EVT_MENU(ID_AVERAGE, wxStfParentFrame::OnAverage) EVT_MENU(ID_ALIGNEDAVERAGE, wxStfParentFrame::OnAlignedAverage) EVT_MENU( ID_VIEW_RESULTS, wxStfParentFrame::OnViewResults) EVT_MENU( ID_CH2BASE, wxStfParentFrame::OnCh2base ) EVT_MENU( ID_CH2POS, wxStfParentFrame::OnCh2pos ) EVT_MENU( ID_CH2ZOOM, wxStfParentFrame::OnCh2zoom ) EVT_MENU( ID_CH2BASEZOOM, wxStfParentFrame::OnCh2basezoom ) EVT_MENU( ID_SCALE, wxStfParentFrame::OnScale ) EVT_MENU( ID_PRINT_PRINT, wxStfParentFrame::OnPrint) EVT_MENU( ID_MPL, wxStfParentFrame::OnMpl) EVT_MENU( ID_MPL_SPECTRUM,wxStfParentFrame::OnMplSpectrum) EVT_MENU( ID_PRINT_PAGE_SETUP, wxStfParentFrame::OnPageSetup) EVT_MENU( ID_SAVEPERSPECTIVE, wxStfParentFrame::OnSaveperspective ) EVT_MENU( ID_LOADPERSPECTIVE, wxStfParentFrame::OnLoadperspective ) EVT_MENU( ID_RESTOREPERSPECTIVE, wxStfParentFrame::OnRestoreperspective ) #ifdef WITH_PYTHON EVT_MENU( ID_VIEW_SHELL, wxStfParentFrame::OnViewshell ) #endif #if 0 EVT_MENU( ID_LATENCYSTART_MAXSLOPE, wxStfParentFrame::OnLStartMaxslope ) EVT_MENU( ID_LATENCYSTART_HALFRISE, wxStfParentFrame::OnLStartHalfrise ) EVT_MENU( ID_LATENCYSTART_PEAK, wxStfParentFrame::OnLStartPeak ) EVT_MENU( ID_LATENCYSTART_MANUAL, wxStfParentFrame::OnLStartManual ) EVT_MENU( ID_LATENCYEND_FOOT, wxStfParentFrame::OnLEndFoot ) EVT_MENU( ID_LATENCYEND_MAXSLOPE, wxStfParentFrame::OnLEndMaxslope ) EVT_MENU( ID_LATENCYEND_PEAK, wxStfParentFrame::OnLEndPeak ) EVT_MENU( ID_LATENCYEND_HALFRISE, wxStfParentFrame::OnLEndHalfrise ) EVT_MENU( ID_LATENCYEND_MANUAL, wxStfParentFrame::OnLEndManual ) EVT_MENU( ID_LATENCYWINDOW, wxStfParentFrame::OnLWindow ) #endif END_EVENT_TABLE() wxStfParentFrame::wxStfParentFrame(wxDocManager *manager, wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size, long type): wxStfParentType(manager, frame, wxID_ANY, title, pos, size, type, _T("myFrame")), mpl_figno(0) { // ::wxInitAllImageHandlers(); m_mgr.SetManagedWindow(this); m_mgr.SetFlags( wxAUI_MGR_ALLOW_FLOATING | wxAUI_MGR_TRANSPARENT_DRAG | wxAUI_MGR_VENETIAN_BLINDS_HINT | wxAUI_MGR_ALLOW_ACTIVE_PANE ); #if wxUSE_DRAG_AND_DROP m_drop = new wxStfFileDrop; // obviously gets deleted when the frame is destructed SetDropTarget(m_drop); #endif m_printData.reset(new wxPrintData); // initial paper size // m_printData->SetQuality(wxPRINT_QUALITY_HIGH); // int ppi = m_printData->GetQuality(); m_printData->SetPaperId(wxPAPER_A4); // initial orientation m_printData->SetOrientation(wxLANDSCAPE); m_pageSetupData.reset(new wxPageSetupDialogData); // copy over initial paper size from print record m_pageSetupData->SetPrintData(*m_printData); // Set some initial page margins in mm. m_pageSetupData->SetMarginTopLeft(wxPoint(15, 15)); m_pageSetupData->SetMarginBottomRight(wxPoint(15, 15)); // create some toolbars wxStfToolBar* tb1 = CreateStdTb(); tb1->Realize(); m_scaleToolBar=CreateScaleTb(); m_scaleToolBar->Realize(); wxStfToolBar* tb4=CreateEditTb(); tb4->Realize(); m_cursorToolBar=CreateCursorTb(); m_cursorToolBar->Realize(); // add the toolbars to the manager m_mgr.AddPane( tb1, wxAuiPaneInfo().Name(wxT("tb1")).Caption(wxT("Std Toolbar")).ToolbarPane().Resizable(false). Position(0).Top().Gripper().RightDockable(false) ); #ifdef __WXMAC__ int xpos = 64, ypos = 32; #endif m_mgr.AddPane( m_cursorToolBar, wxAuiPaneInfo().Name(wxT("tb2")).Caption(wxT("Edit Toolbar")). ToolbarPane().Resizable(false). #ifndef __WXMAC__ Position(1).Top().Gripper().RightDockable(false) ); #else Dockable(false).Float().FloatingPosition(xpos, ypos) ); xpos += m_cursorToolBar->GetSize().GetWidth()+8; #endif m_mgr.AddPane( tb4, wxAuiPaneInfo().Name(wxT("tb4")).Caption(wxT("Analysis Toolbar")). ToolbarPane().Resizable(false). #ifndef __WXMAC__ Position(2).Top().Gripper().RightDockable(false) ); #else Dockable(false).Float().FloatingPosition(xpos,ypos) ); xpos += tb4->GetSize().GetWidth()+8; #endif m_mgr.AddPane( m_scaleToolBar, wxAuiPaneInfo().Name(wxT("m_scaleToolBar")).Caption(wxT("Navigation Toolbar")). ToolbarPane().Resizable(false). #ifndef __WXMAC__ Position(3).Top().Gripper().RightDockable(false) ); #else Dockable(false).Float().FloatingPosition(xpos,ypos) ); #endif SetMouseQual( stf::measure_cursor ); #ifdef WITH_PYTHON python_code2 << wxT("import sys\n") << wxT("sys.path.append('.')\n") #ifdef IPYTHON << wxT("import embedded_ipython\n") #else << wxT("import embedded_stf\n") #endif << wxT("\n") << wxT("def makeWindow(parent, figsize=(8,6)):\n") #ifdef IPYTHON << wxT(" win = embedded_ipython.MyPanel(parent)\n") #else << wxT(" win = embedded_stf.MyPanel(parent)\n") #endif << wxT(" return win\n") << wxT("\n") #if PY_MAJOR_VERSION < 3 << wxT("import embedded_mpl\n") << wxT("def plotWindowMpl(parent, figsize=(8,6)):\n") << wxT(" win = embedded_mpl.MplPanel(parent, figsize)\n") << wxT(" win.plot_screen()\n") << wxT(" return win\n") << wxT("\n") << wxT("def spectrumWindowMpl(parent, figsize=(8,6)):\n") << wxT(" win = embedded_mpl.MplPanel(parent, figsize)\n") << wxT(" win.plot_spectrum()\n") << wxT(" return win\n") << wxT("\n") << wxT("def makeWindowMpl(parent, figsize=(8,6)):\n") << wxT(" win = embedded_mpl.MplPanel(parent, figsize)\n") << wxT(" return win\n") #endif ; /* The window remains open after the main application has been closed; deactivated for the time being. * RedirectStdio(); */ bool show = wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewShell"), 1); wxWindow* pPython = MakePythonWindow("makeWindow", "pythonShell", "Python Shell", show, #ifdef __WXMAC__ true #else false, false, GetClientSize().GetWidth(), GetClientSize().GetHeight()/5 #endif ).cppWindow; if ( pPython == 0 ) { wxGetApp().ErrorMsg(wxT("Can't create a window for the python shell\nPointer is zero")); } #ifdef _STFDEBUG #ifdef _WINDOWS wxGetApp().InfoMsg( python_code2 ); #else std::cout << "python startup script:\n" << std::string( python_code2.char_str() ); #endif // _WINDOWS #endif // _STFDEBUG #else // WITH_PYTHON m_mgr.Update(); #endif // WITH_PYTHON wxStatusBar* pStatusBar = new wxStatusBar(this, wxID_ANY, wxST_SIZEGRIP); SetStatusBar(pStatusBar); //int widths[] = { 60, 60, -1 }; //pStatusBar->SetFieldWidths(WXSIZEOF(widths), widths); //pStatusBar->SetStatusText(wxT("Test"), 0); } wxStfParentFrame::~wxStfParentFrame() { // deinitialize the frame manager #ifdef WITH_PYTHON // write visibility of the shell to config: bool shell_state = m_mgr.GetPane(wxT("pythonShell")).IsShown(); wxGetApp().wxWriteProfileInt( wxT("Settings"),wxT("ViewShell"), int(shell_state) ); #endif m_mgr.UnInit(); } wxStfToolBar* wxStfParentFrame::CreateStdTb() { wxStfToolBar* tb1=new wxStfToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_TB_DEFAULT_STYLE ); tb1->SetToolBitmapSize(wxSize(20,20)); tb1->AddTool( wxID_OPEN, wxT("Open"), wxArtProvider::GetBitmap( wxART_FILE_OPEN, wxART_TOOLBAR, wxSize(16,16) ), wxT("Open file"), wxITEM_NORMAL ); tb1->AddTool( wxID_SAVEAS, wxT("Save"), wxArtProvider::GetBitmap( wxART_FILE_SAVE_AS, wxART_TOOLBAR, wxSize(16,16) ), wxT("Save traces"), wxITEM_NORMAL ); tb1->AddTool( ID_PRINT_PRINT, wxT("Print"), wxArtProvider::GetBitmap( wxART_PRINT, wxART_TOOLBAR, wxSize(16,16) ), wxT("Print traces"), wxITEM_NORMAL ); return tb1; } wxStfToolBar* wxStfParentFrame::CreateScaleTb() { wxStfToolBar* scaleToolBar = new wxStfToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_TB_DEFAULT_STYLE ); scaleToolBar->SetToolBitmapSize(wxSize(20,20)); scaleToolBar->AddTool( ID_TOOL_FIRST, wxT("First"), wxBitmap(resultset_first), wxT("Go to first trace"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_PREVIOUS, wxT("Prev."), wxBitmap(resultset_previous), wxT("Go to previous trace (left cursor)"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_NEXT, wxT("Next"), wxBitmap(resultset_next), wxT("Go to next trace (right cursor)"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_LAST, wxT("Last"), wxBitmap(resultset_last), wxT("Go to last trace"), wxITEM_NORMAL ); scaleToolBar->AddSeparator(); scaleToolBar->AddTool( ID_TOOL_LEFT, wxT("Left"), wxBitmap(arrow_left), wxT("Move traces left (CTRL+left cursor)"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_RIGHT, wxT("Right"), wxBitmap(arrow_right), wxT("Move traces right (CTRL+right cursor)"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_FIT, wxT("Fit"), wxBitmap(arrow_out), wxT("Fit traces to window (\"F\")"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_UP, wxT("Up"), wxBitmap(arrow_up), wxT("Move traces up (up cursor)"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_DOWN, wxT("Down"), wxBitmap(arrow_down), wxT("Move traces down (down cursor)"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_XENL, wxT("Zoom X"), wxBitmap(zoom_in), wxT("Enlarge x-scale (CTRL + \"+\")"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_XSHRINK, wxT("Shrink X"), wxBitmap(zoom_out), wxT("Shrink x-scale (CTRL + \"-\")"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_YENL, wxT("Zoom Y"), wxBitmap(zoom_in), wxT("Enlarge y-scale (\"+\")"), wxITEM_NORMAL ); scaleToolBar->AddTool( ID_TOOL_YSHRINK, wxT("Shrink Y"), wxBitmap(zoom_out), wxT("Shrink y-scale (\"-\")"), wxITEM_NORMAL ); scaleToolBar->AddSeparator(); scaleToolBar->AddTool( ID_TOOL_CH1, wxT("Ch 1"), wxBitmap(ch_), wxT("Scaling applies to active (black) channel (\"1\")"), wxITEM_CHECK ); scaleToolBar->AddTool( ID_TOOL_CH2, wxT("Ch 2"), wxBitmap(ch2_), wxT("Scaling applies to reference (red) channel (\"2\")"), wxITEM_CHECK ); return scaleToolBar; } wxStfToolBar* wxStfParentFrame::CreateEditTb() { wxStfToolBar* tb4= new wxStfToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_TB_DEFAULT_STYLE ); tb4->SetToolBitmapSize(wxSize(20,20)); tb4->AddTool( ID_AVERAGE, wxT("Mean"), wxBitmap(sum_new), wxT("Average of selected traces"), wxITEM_NORMAL ); tb4->AddTool( ID_ALIGNEDAVERAGE, wxT("Aligned"), wxBitmap(sum_new_aligned), wxT("Aligned average of selected traces"), wxITEM_NORMAL ); tb4->AddTool( ID_TOOL_FITDECAY, wxT("Fit"), wxBitmap(fit),//chart_line), wxT("Fit function to data"), wxITEM_NORMAL ); tb4->AddTool( ID_VIEWTABLE, wxT("Table"), wxBitmap(table), wxT("View current trace as a table"), wxITEM_NORMAL ); return tb4; } wxStfToolBar* wxStfParentFrame::CreateCursorTb() { wxStfToolBar* cursorToolBar = new wxStfToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_TB_DEFAULT_STYLE ); cursorToolBar->SetToolBitmapSize(wxSize(20,20)); cursorToolBar->AddTool( ID_TOOL_SELECT, wxT("Select"), wxBitmap( acceptbmp ), wxT("Select or unselect this trace (\"S\" / \"R\")"), wxITEM_CHECK ); // cursorToolBar->AddTool( ID_TOOL_REMOVE, // wxT("Unselect"), // wxBitmap( bin ), // wxT("Unselect this trace (\"R\")"), // wxITEM_NORMAL ); cursorToolBar->AddSeparator(); cursorToolBar->AddTool( ID_MPL, wxT("Snapshot"), wxBitmap(camera), wxT("Create snapshot with matplotlib"), wxITEM_NORMAL ); cursorToolBar->AddTool( ID_TOOL_SNAPSHOT_WMF, wxT("WMF Snapshot"), wxBitmap(camera_ps), wxT("Copy vectorized image to clipboard"), wxITEM_NORMAL ); cursorToolBar->AddSeparator(); cursorToolBar->AddTool( ID_TOOL_MEASURE, _T("Measure"), wxBitmap(cursor), wxT("Mouse selects measurement (crosshair) cursor (\"M\")"), wxITEM_CHECK ); cursorToolBar->AddTool( ID_TOOL_PEAK, _T("Peak"), wxBitmap(___em_open), wxT("Mouse selects peak cursors (\"P\")"), wxITEM_CHECK ); cursorToolBar->AddTool( ID_TOOL_BASE, _T("Base"), wxBitmap(___em_down), wxT("Mouse selects base cursors (\"B\")"), wxITEM_CHECK ); cursorToolBar->AddTool( ID_TOOL_DECAY, _T("Fit"), wxBitmap(fit_lim),//chart_curve), wxT("Mouse selects fit cursors (\"D\")"), wxITEM_CHECK ); cursorToolBar->AddTool( ID_TOOL_LATENCY, _T("Latency"), wxBitmap(latency_lim),//chart_curve), wxT("Mouse selects latency cursors (\"L\")"), wxITEM_CHECK ); #ifdef WITH_PSLOPE cursorToolBar->AddTool( ID_TOOL_PSLOPE, _T("Slope"), wxBitmap(slope), wxT("Mouse selects slope cursors (\"O\")"), wxITEM_CHECK ); #endif cursorToolBar->AddTool( ID_TOOL_ZOOM, _T("Zoom"), wxBitmap(zoom), wxT("Draw a zoom window with left mouse button (\"Z\")"), wxITEM_CHECK ); cursorToolBar->AddTool( ID_TOOL_EVENT, _T("Events"), wxBitmap(event), wxT( "Add, erase or extract events manually with right mouse button (\"E\")" ), wxITEM_CHECK ); return cursorToolBar; } #if 0 #if defined(WITH_BIOSIG2) #define CREDIT_BIOSIG "Biosig import using libbiosig2 http://biosig.sf.net\n\n" #elif defined(WITH_BIOSIG) #define CREDIT_BIOSIG "Biosig import using libbiosig http://biosig.sf.net\n\n" #else #define CREDIT_BIOSIG "" #endif #endif void wxStfParentFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) { wxAboutDialogInfo info; info.SetName(wxT("Stimfit")); info.SetVersion(wxString(PACKAGE_VERSION, wxConvLocal)); info.SetWebSite(wxT("http://www.stimfit.org")); wxString about = wxString(wxT("Credits:\n\nOriginal idea (Stimfit for DOS):\n\ Peter Jonas, Physiology Department, University of Freiburg\n\n\ Fourier transform:\nFFTW, http://www.fftw.org\n\n\ Levenberg-Marquardt non-linear regression, version ") + wxString(wxT(LM_VERSION)) + wxT("\n\ Manolis Lourakis, http://www.ics.forth.gr/~lourakis/levmar/ \n\n")) + #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) wxString( wxT("BioSig import using libbiosig\n") ) + //+ wxString( wxT("version ") + wxT(BIOSIG_VERSION ) ) + wxString( wxT("http://biosig.sf.net\n\n") ) + #endif wxString(wxT("Documentation:\n\ Jose Guzman\n\n\ Event detection algorithms:\n\ Jonas, P., Major, G. & Sakmann B. (1993) J Physiol 472:615-63\n\ Clements, J. D. & Bekkers, J. M. (1997) Biophys J 73:220-229\n\ Pernía-Andrade, A.J., et al., (2012) Biophys J 103:1429-39.\n\n\ Thanks to Bill Anderson (www.winltp.com) for helpful suggestions")); info.SetDescription(about); info.SetCopyright(wxT("(C) 2001-2015 Christoph Schmidt-Hieber \n\ Christoph Schmidt-Hieber, University College London\n\ Published under the GNU general public license (http://www.gnu.org/licenses/gpl.html)")); wxAboutBox(info); } void wxStfParentFrame::OnHelp(wxCommandEvent& WXUNUSED(event) ) { wxLaunchDefaultBrowser( wxT("http://www.stimfit.org/doc/sphinx/index.html") ); } std::vector ParseVersionString( const wxString& VersionString ) { std::vector VersionInt(5); const char pt = '.'; // Major version: long major=0; wxString sMajor = VersionString.BeforeFirst(pt); if ( sMajor.length() == VersionString.length() ) { major = 0; } else { sMajor.ToLong( &major ); } VersionInt[0] = major; // Minor version: long minor=0; wxString sMinor1 = VersionString.AfterFirst(pt); if ( sMinor1.empty() ) { minor = 0; } else { wxString sMinor = sMinor1.BeforeFirst(pt); if ( sMinor1.length() == sMinor.length() ) { minor = 0; } else { sMinor.ToLong( &minor ); } } VersionInt[1] = minor; // Build version: long build=0; wxString sBuild = VersionString.AfterLast(pt); if ( sBuild.empty() ) { build = 0; } else { sBuild.ToLong( &build ); } VersionInt[2] = build; return VersionInt; } bool CompVersion( const std::vector& version ) { // Get current version: wxString currentString(PACKAGE_VERSION, wxConvLocal); std::vector current = ParseVersionString(currentString); if (version[0] > current[0]) { return true; } else { if (version[0] == current[0]) { if (version[1] > current[1]) { return true; } else { if (version[1] == current[1]) { if (version[2] > current[2]) { return true; } else { return false; } } else { // version[0] == current[0] && version[1] < current[1] return false; } } } else { // version[0] < current[0] return false; } } } void wxStfParentFrame::CheckUpdate( wxProgressDialog* progDlg ) const { #if defined (__MINGW32__) wxString address(wxT("/latest_mingw")); #elif defined (_WINDOWS) wxString address(wxT("/latest_windows")); #elif defined (__APPLE__) wxString address(wxT("/latest_mac")); #else wxString address(wxT("/latest_linux")); #endif wxHTTP http; http.SetHeader( wxT("Accept") , wxT("text/*") ); http.SetHeader( wxT("User-Agent"), wxT("Mozilla") ); http.SetTimeout( 1 ); // seconds // Note that Connect() wants a host address, not an URL. 80 is the server's port. wxString server( wxT("www.stimfit.org") ); if( http.Connect(server) ) { if(wxInputStream* in_stream = http.GetInputStream (address)) { wxString verS; int c_int = in_stream->GetC(); while ( c_int != wxEOF ) { if (progDlg != NULL) { progDlg->Pulse( wxT("Reading version information...") ); } verS << wxChar(c_int); c_int = in_stream->GetC(); } wxDELETE(in_stream); std::vector version = ParseVersionString( verS ); if ( CompVersion(version) ) { wxString msg; msg << wxT("A newer version of Stimfit (") << verS << wxT(") is available. ") << wxT("Would you like to download it now?"); wxMessageDialog newversion( NULL, msg, wxT("New version available"), wxYES_NO ); if ( newversion.ShowModal() == wxID_YES ) { wxLaunchDefaultBrowser( wxT("http://code.google.com/p/stimfit/downloads/list") ); } } else { if (progDlg != NULL) { wxMessageDialog newversion( NULL, wxT("You already have the newest version"), wxT("No new version available"), wxOK ); newversion.ShowModal(); } } } else { if (progDlg != NULL) { wxGetApp().ErrorMsg( wxT("Couldn't retrieve update information. Are you connected to the internet?") ); } } } else { if (progDlg != NULL) { wxGetApp().ErrorMsg( wxT("Couldn't connect to server. Are you connected to the internet?") ); } } } void wxStfParentFrame::OnCheckUpdate(wxCommandEvent& WXUNUSED(event) ) { wxProgressDialog progDlg( wxT("Checking for updates"), wxT("Connecting to server..."), 100, NULL, wxPD_SMOOTH | wxPD_AUTO_HIDE ); CheckUpdate( &progDlg ); } void wxStfParentFrame::OnConvert(wxCommandEvent& WXUNUSED(event) ) { int nfiles; // files to convert wxString src_ext; // extension of the source file wxString dest_ext; // extesion of the destiny file // "Convert files" Dialog (see wxStfConvertDlg in smalldlgs.cpp) wxStfConvertDlg myDlg(this); if(myDlg.ShowModal() == wxID_OK) { stfio::filetype ift = myDlg.GetSrcFileExt(); stfio::filetype eft = myDlg.GetDestFileExt(); src_ext = myDlg.GetSrcFilter(); // wxProgressDialog wxProgressDialog progDlg( wxT("CFS conversion utility"), wxT("Starting file conversion"), 100, NULL, wxPD_SMOOTH | wxPD_AUTO_HIDE | wxPD_APP_MODAL ); wxArrayString srcFilenames(myDlg.GetSrcFileNames()); nfiles = srcFilenames.size(); // number of files to convert wxString myDestDir = myDlg.GetDestDir(); for (std::size_t nFile=0; nFile ") << destFilename; progDlg.Update( (int)(((double)nFile/(double)srcFilenames.size())*100.0), progStr ); // Open source file and convert: Recording sourceFile; try { stf::wxProgressInfo progDlgIn("Reading file", "Opening file", 100); stfio::importFile(stf::wx2std(srcFilenames[nFile]), ift, sourceFile, wxGetApp().GetTxtImport(), progDlgIn); stf::wxProgressInfo progDlgOut("Writing file", "Opening file", 100); switch ( eft ) { #ifndef WITHOUT_ABF case stfio::atf: stfio::exportATFFile(stf::wx2std(destFilename), sourceFile); dest_ext = wxT("Axon textfile [*.atf]"); break; #endif case stfio::igor: stfio::exportIGORFile(stf::wx2std(destFilename), sourceFile, progDlgOut); dest_ext = wxT("Igor binary file [*.ibw]"); break; #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) case stfio::biosig: stfio::exportBiosigFile(stf::wx2std(destFilename), sourceFile, progDlgOut); dest_ext = wxT("Biosig/GDF [*.gdf]"); break; #endif default: wxString errorMsg(wxT("Unknown export file type\n")); wxGetApp().ErrorMsg(errorMsg); return; } } catch (const std::runtime_error& e) { wxString errorMsg(wxT("Error opening file\n")); errorMsg += wxT("Runtime Error\n"); errorMsg += wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(errorMsg); return; } catch (const std::exception& e) { wxString errorMsg(wxT("Error opening file\n")); errorMsg += wxT("Exception\n"); errorMsg += wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(errorMsg); return; } } // Show now a smal information dialog //std::count << srcFilter.c_str() << std::endl; wxString msg; msg = wxString::Format(wxT("%i"), nfiles); msg << src_ext; msg << wxT(" files \nwere converted to "); msg << dest_ext; wxMessageDialog Simple(this, msg); Simple.ShowModal(); } // end of wxStfConvertDlg } // Creates a graph. Called from view.cpp when a new drawing // view is created. wxStfGraph *wxStfParentFrame::CreateGraph(wxView *view, wxStfChildFrame *parent) { int width=800, height=600; parent->GetClientSize(&width, &height); // Non-retained graph wxStfGraph *graph = new wxStfGraph( view, parent, #ifndef __APPLE__ wxPoint(0, 0), #else wxDefaultPosition, #endif wxSize(width, height), wxFULL_REPAINT_ON_RESIZE | wxWANTS_CHARS ); return graph; } void wxStfParentFrame::OnPrint(wxCommandEvent& WXUNUSED(event)) { if (wxGetApp().GetActiveDoc()==NULL) return; wxPrintDialogData printDialogData(* m_printData); wxPrinter printer(& printDialogData); wxStfPreprintDlg myDlg(this); if (myDlg.ShowModal()!=wxID_OK) return; wxStfView* pView=wxGetApp().GetActiveView(); pView->GetGraph()->set_downsampling(myDlg.GetDownSampling()); pView->GetGraph()->set_noGimmicks(!myDlg.GetGimmicks()); wxStfPrintout printout(_T("Trace printout")); if (!printer.Print(this, &printout, true /*prompt*/)) { if (wxPrinter::GetLastError() == wxPRINTER_ERROR) wxMessageBox( _T("There was a problem printing.\nPerhaps your current printer is not set correctly?"), _T("Printing"), wxOK ); else wxMessageBox(_T("You canceled printing"), _T("Printing"), wxOK); } else { (*m_printData) = printer.GetPrintDialogData().GetPrintData(); } } void wxStfParentFrame::OnMpl(wxCommandEvent& WXUNUSED(event)) { if (wxGetApp().GetActiveDoc()==NULL) return; #ifdef WITH_PYTHON std::ostringstream mgr_name; mgr_name << "mpl" << GetMplFigNo(); wxWindow* pPython = MakePythonWindow("plotWindowMpl", mgr_name.str(), "Matplotlib", true, false, true, 800, 600).cppWindow; if ( pPython == 0 ) #endif wxGetApp().ErrorMsg(wxT("Can not create figure (python/matplotlib is not available)")); } void wxStfParentFrame::OnMplSpectrum(wxCommandEvent& WXUNUSED(event)) { if (wxGetApp().GetActiveDoc()==NULL) return; #ifdef WITH_PYTHON std::ostringstream mgr_name; mgr_name << "mpl" << GetMplFigNo(); wxWindow* pPython = MakePythonWindow("spectrumWindowMpl", mgr_name.str(), "Matplotlib", true, false, true, 800, 600).cppWindow; if ( pPython == 0 ) #endif wxGetApp().ErrorMsg(wxT("Can not create figure (python/matplotlib is not available)")); } void wxStfParentFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event)) { (*m_pageSetupData) = *m_printData; wxPageSetupDialog pageSetupDialog(this, m_pageSetupData.get()); pageSetupDialog.ShowModal(); (*m_printData) = pageSetupDialog.GetPageSetupDialogData().GetPrintData(); (*m_pageSetupData) = pageSetupDialog.GetPageSetupDialogData(); } void wxStfParentFrame::OnToggleSelect(wxCommandEvent& WXUNUSED(event)) { wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pDoc!=NULL) { pDoc->ToggleSelect(); } } void wxStfParentFrame::OnToolFirst(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnFirst(); } } void wxStfParentFrame::OnToolNext(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnNext(); } } void wxStfParentFrame::OnToolPrevious(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnPrevious(); } } void wxStfParentFrame::OnToolLast(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnLast(); } } void wxStfParentFrame::OnToolXenl(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnXenllo(); } } void wxStfParentFrame::OnToolXshrink(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnXshrinklo(); } } void wxStfParentFrame::OnToolYenl(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnYenllo(); } } void wxStfParentFrame::OnToolYshrink(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnYshrinklo(); } } void wxStfParentFrame::OnToolUp(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnUp(); } } void wxStfParentFrame::OnToolDown(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnDown(); } } void wxStfParentFrame::OnToolFit(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->Fittowindow(true); } } void wxStfParentFrame::OnToolLeft(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnLeft(); } } void wxStfParentFrame::OnToolRight(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->OnRight(); } } void wxStfParentFrame::OnToolCh1(wxCommandEvent& WXUNUSED(event)) { // activate channel 1 if no channel is active: if (!m_scaleToolBar->GetToolToggled(ID_TOOL_CH1) && !m_scaleToolBar->GetToolToggled(ID_TOOL_CH2)) { m_scaleToolBar->ToggleTool(ID_TOOL_CH1,true); } m_scaleToolBar->Refresh(); } void wxStfParentFrame::OnToolCh2(wxCommandEvent& WXUNUSED(event)) { // activate channel 1 if no channel is active: if (!m_scaleToolBar->GetToolToggled(ID_TOOL_CH1) && !m_scaleToolBar->GetToolToggled(ID_TOOL_CH2)) { m_scaleToolBar->ToggleTool(ID_TOOL_CH1,true); } m_scaleToolBar->Refresh(); } void wxStfParentFrame::OnToolFitdecay(wxCommandEvent& event) { wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pDoc!=NULL) { pDoc->FitDecay(event); } } void wxStfParentFrame::SetSingleChannel(bool value) { if (!m_scaleToolBar) return; if (value) { if (!m_scaleToolBar->GetToolEnabled(ID_TOOL_CH1)) m_scaleToolBar->EnableTool(ID_TOOL_CH1,true); if (m_scaleToolBar->GetToolEnabled(ID_TOOL_CH2)) m_scaleToolBar->EnableTool(ID_TOOL_CH2,false); } else { if (!m_scaleToolBar->GetToolEnabled(ID_TOOL_CH1)) m_scaleToolBar->EnableTool(ID_TOOL_CH1,true); if (!m_scaleToolBar->GetToolEnabled(ID_TOOL_CH2)) m_scaleToolBar->EnableTool(ID_TOOL_CH2,true); } // Make sure at least one value is selected: if (!m_scaleToolBar->GetToolToggled(ID_TOOL_CH1) && (value || !m_scaleToolBar->GetToolToggled(ID_TOOL_CH2))) { m_scaleToolBar->ToggleTool(ID_TOOL_CH1, true); } m_scaleToolBar->Refresh(); } void wxStfParentFrame::OnToolSnapshotwmf(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->Snapshotwmf(); } } void wxStfParentFrame::OnToolMeasure(wxCommandEvent& WXUNUSED(event)) { SetMouseQual( stf::measure_cursor ); } void wxStfParentFrame::OnToolPeak(wxCommandEvent& WXUNUSED(event)) { SetMouseQual( stf::peak_cursor ); } void wxStfParentFrame::OnToolBase(wxCommandEvent& WXUNUSED(event)) { SetMouseQual( stf::base_cursor ); } void wxStfParentFrame::OnToolDecay(wxCommandEvent& WXUNUSED(event)) { SetMouseQual( stf::decay_cursor ); } #ifdef WITH_PSLOPE void wxStfParentFrame::OnToolPSlope(wxCommandEvent& WXUNUSED(event)) { SetMouseQual( stf::pslope_cursor ); } #endif void wxStfParentFrame::OnToolLatency(wxCommandEvent& WXUNUSED(event)) { SetMouseQual( stf::latency_cursor ); } void wxStfParentFrame::OnToolZoom(wxCommandEvent& WXUNUSED(event)) { SetMouseQual( stf::zoom_cursor ); } void wxStfParentFrame::OnToolEvent(wxCommandEvent& WXUNUSED(event)) { SetMouseQual( stf::event_cursor ); } void wxStfParentFrame::OnCh2zoom(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->Ch2zoom(); } } void wxStfParentFrame::OnCh2base(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->Ch2base(); } } void wxStfParentFrame::OnCh2pos(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->Ch2pos(); } } void wxStfParentFrame::OnCh2basezoom(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { pView->GetGraph()->Ch2basezoom(); } } void wxStfParentFrame::OnViewResults(wxCommandEvent& WXUNUSED(event)) { wxStfChildFrame* pChild=(wxStfChildFrame*)GetActiveChild(); if (pChild!=NULL) { pChild->GetCopyGrid()->ViewResults(); } } void wxStfParentFrame::OnScale(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); if (pView!=NULL) { if (GetActiveChild()->GetMenuBar() && GetActiveChild()->GetMenuBar()->GetMenu(2)->IsChecked(ID_SCALE)) { wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("ViewScaleBars"),1); wxGetApp().set_isBars(true); } else { wxGetApp().wxWriteProfileInt(wxT("Settings"),wxT("ViewScaleBars"),0); wxGetApp().set_isBars(false); } if (pView->GetGraph() != NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnAverage(wxCommandEvent& WXUNUSED(event)) { wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pDoc!=NULL) { pDoc->CreateAverage(false,false); } } void wxStfParentFrame::OnAlignedAverage(wxCommandEvent& WXUNUSED(event)) { wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pDoc!=NULL) { pDoc->CreateAverage(false,true); } } #if 0 void wxStfParentFrame::OnUserdef(wxCommandEvent& event) { wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pDoc!=NULL) { pDoc->Userdef(event.GetId()-ID_USERDEF1); } } #endif void wxStfParentFrame::OnSaveperspective(wxCommandEvent& WXUNUSED(event)) { wxStfChildFrame* pChild=(wxStfChildFrame*)GetActiveChild(); if (pChild!=NULL) { pChild->Saveperspective(); } } void wxStfParentFrame::OnLoadperspective(wxCommandEvent& WXUNUSED(event)) { wxStfChildFrame* pChild=(wxStfChildFrame*)GetActiveChild(); if (pChild!=NULL) { pChild->Loadperspective(); } } void wxStfParentFrame::OnRestoreperspective(wxCommandEvent& WXUNUSED(event)) { wxStfChildFrame* pChild=(wxStfChildFrame*)GetActiveChild(); if (pChild!=NULL) { pChild->Restoreperspective(); } } #ifdef WITH_PYTHON void wxStfParentFrame::OnViewshell(wxCommandEvent& WXUNUSED(event)) { // Save the current visibility state: bool old_state = m_mgr.GetPane(wxT("pythonShell")).IsShown(); // Toggle python shell visibility: m_mgr.GetPane(wxT("pythonShell")).Show( !old_state ); wxGetApp().wxWriteProfileInt( wxT("Settings"),wxT("ViewShell"), int(!old_state) ); m_mgr.Update(); } #endif void wxStfParentFrame::OnLStartMaxslope(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { // get previous mode: // bool prevMode=pDoc->GetLatencyStartMode()==stfio::riseMode; // toggle on if it wasn't the previous mode: // if (!prevMode) { pDoc->SetLatencyStartMode(stf::riseMode); wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("LatencyStartMode"), pDoc->GetLatencyStartMode()); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnLStartHalfrise(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { pDoc->SetLatencyStartMode(stf::halfMode); wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyStartMode"), pDoc->GetLatencyStartMode() ); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnLStartPeak(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { pDoc->SetLatencyStartMode(stf::peakMode); wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyStartMode"), pDoc->GetLatencyStartMode() ); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnLStartManual(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { // Always keep manual mode as a default, even if attempted to uncheck: pDoc->SetLatencyStartMode(stf::manualMode); wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyStartMode"), pDoc->GetLatencyStartMode() ); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnLEndFoot(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { pDoc->SetLatencyEndMode(stf::footMode); wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyEndMode"), pDoc->GetLatencyEndMode() ); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnLEndMaxslope(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { pDoc->SetLatencyEndMode(stf::riseMode); wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyEndMode"), pDoc->GetLatencyEndMode() ); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnLEndHalfrise(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { pDoc->SetLatencyEndMode(stf::halfMode); wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyEndMode"), pDoc->GetLatencyEndMode() ); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnLEndPeak(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { pDoc->SetLatencyEndMode(stf::peakMode); wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyEndMode"), pDoc->GetLatencyEndMode() ); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } void wxStfParentFrame::OnLEndManual(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL && pDoc!=NULL) { pDoc->SetLatencyEndMode(stf::manualMode); wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyEndMode"), pDoc->GetLatencyEndMode() ); if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } # if 0 void wxStfParentFrame::OnLWindow(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=wxGetApp().GetActiveView(); wxStfDoc* pDoc=wxGetApp().GetActiveDoc(); if (pView!=NULL) { // Select if (GetActiveChild()->GetMenuBar() && GetActiveChild()->GetMenuBar()->GetMenu(1)->IsChecked(ID_LATENCYWINDOW)) { wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyWindowMode"), stf::windowMode ); pDoc->SetLatencyWindowMode(stf::windowMode); } else { wxGetApp().wxWriteProfileInt( wxT("Settings"), wxT("LatencyWindowMode"), stf::defaultMode ); pDoc->SetLatencyWindowMode(stf::defaultMode); } if (pView->GetGraph()!=NULL) pView->GetGraph()->Refresh(); } } #endif stf::cursor_type wxStfParentFrame::GetMouseQual() const { if (m_cursorToolBar->GetToolToggled(ID_TOOL_MEASURE)) return stf::measure_cursor; if (m_cursorToolBar->GetToolToggled(ID_TOOL_PEAK)) return stf::peak_cursor; if (m_cursorToolBar->GetToolToggled(ID_TOOL_BASE)) return stf::base_cursor; if (m_cursorToolBar->GetToolToggled(ID_TOOL_DECAY)) return stf::decay_cursor; if (m_cursorToolBar->GetToolToggled(ID_TOOL_LATENCY)) return stf::latency_cursor; if (m_cursorToolBar->GetToolToggled(ID_TOOL_ZOOM)) return stf::zoom_cursor; if (m_cursorToolBar->GetToolToggled(ID_TOOL_EVENT)) return stf::event_cursor; #ifdef WITH_PSLOPE if (m_cursorToolBar->GetToolToggled(ID_TOOL_PSLOPE)) return stf::pslope_cursor; #endif return stf::undefined_cursor; } void wxStfParentFrame::SetMouseQual(stf::cursor_type value) { if (m_cursorToolBar == NULL) return; // Need to set everything to false explicitly first: m_cursorToolBar->ToggleTool(ID_TOOL_MEASURE,false); m_cursorToolBar->ToggleTool(ID_TOOL_PEAK,false); m_cursorToolBar->ToggleTool(ID_TOOL_BASE,false); m_cursorToolBar->ToggleTool(ID_TOOL_DECAY,false); m_cursorToolBar->ToggleTool(ID_TOOL_LATENCY,false); m_cursorToolBar->ToggleTool(ID_TOOL_ZOOM,false); m_cursorToolBar->ToggleTool(ID_TOOL_EVENT,false); #ifdef WITH_PSLOPE m_cursorToolBar->ToggleTool(ID_TOOL_PSLOPE,false); #endif // Then set the state of the selected button: if (value==stf::measure_cursor) m_cursorToolBar->ToggleTool(ID_TOOL_MEASURE,true); if (value==stf::peak_cursor) m_cursorToolBar->ToggleTool(ID_TOOL_PEAK,true); if (value==stf::base_cursor) m_cursorToolBar->ToggleTool(ID_TOOL_BASE,true); if (value==stf::decay_cursor) m_cursorToolBar->ToggleTool(ID_TOOL_DECAY,true); if (value==stf::latency_cursor) m_cursorToolBar->ToggleTool(ID_TOOL_LATENCY,true); #ifdef WITH_PSLOPE if (value==stf::pslope_cursor) m_cursorToolBar->ToggleTool(ID_TOOL_PSLOPE,true); #endif if (value==stf::zoom_cursor) m_cursorToolBar->ToggleTool(ID_TOOL_ZOOM,true); if (value==stf::event_cursor) m_cursorToolBar->ToggleTool(ID_TOOL_EVENT,true); m_cursorToolBar->Refresh(); } void wxStfParentFrame::SetSelectedButton(bool selected) { if (m_cursorToolBar==NULL) return; m_cursorToolBar->ToggleTool(ID_TOOL_SELECT, selected); m_cursorToolBar->Refresh(); } stf::zoom_channels wxStfParentFrame::GetZoomQual() const { if (m_scaleToolBar->GetToolToggled(ID_TOOL_CH1)) { if (m_scaleToolBar->GetToolToggled(ID_TOOL_CH2)) { return stf::zoomboth; } else { return stf::zoomch1; } } return stf::zoomch2; } void wxStfParentFrame::SetZoomQual(stf::zoom_channels value) { if (m_scaleToolBar==NULL) return; if (value==stf::zoomch1) { m_scaleToolBar->ToggleTool(ID_TOOL_CH1,true); m_scaleToolBar->ToggleTool(ID_TOOL_CH2,false); } if (value==stf::zoomch2) { m_scaleToolBar->ToggleTool(ID_TOOL_CH1,false); m_scaleToolBar->ToggleTool(ID_TOOL_CH2,true); } if (value==stf::zoomboth) { m_scaleToolBar->ToggleTool(ID_TOOL_CH1,true); m_scaleToolBar->ToggleTool(ID_TOOL_CH2,true); } m_scaleToolBar->Refresh(); } stimfit-0.15.8/src/stimfit/gui/graph.cpp0000775000175000017500000024504513152223421015056 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // graph.cpp // This is where the actual drawing happens. // 2007-12-27, Christoph Schmidt-Hieber, University of Freiburg #include #ifndef WX_PRECOMP #include #endif #include #include #include #include #include #include "./app.h" #include "./doc.h" #include "./view.h" #include "./parentframe.h" #include "./childframe.h" #include "./printout.h" #include "./dlgs/cursorsdlg.h" #include "./dlgs/smalldlgs.h" #include "./usrdlg/usrdlg.h" #include "./graph.h" #include "./../../libstfnum/measure.h" #ifdef _STFDEBUG #include #endif #if defined (_WIN32) #define isnan _isnan #elif !defined(isnan) #define isnan std::isnan #endif // #define BENCHMARK // uncomment to run benchmark #ifdef BENCHMARK //def _STFDEBUG #include #include #include #include #ifdef __MACH__ #include #include #endif /* From https://gist.github.com/jbenet/1087739 */ void current_utc_time(struct timespec *ts) { #ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time clock_serv_t cclock; mach_timespec_t mts; host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); ts->tv_sec = mts.tv_sec; ts->tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_REALTIME, ts); #endif } static const double BILLION = 1000000000L; double tdiff(timespec time1, timespec time0) { return ( time1.tv_sec - time0.tv_sec ) + ( time1.tv_nsec - time0.tv_nsec ) / BILLION; } double t2d(timespec time1) { return time1.tv_sec + time1.tv_nsec / BILLION; } #endif BEGIN_EVENT_TABLE(wxStfGraph, wxWindow) EVT_MENU(ID_ZOOMHV,wxStfGraph::OnZoomHV) EVT_MENU(ID_ZOOMH,wxStfGraph::OnZoomH) EVT_MENU(ID_ZOOMV,wxStfGraph::OnZoomV) EVT_MOUSE_EVENTS(wxStfGraph::OnMouseEvent) EVT_KEY_DOWN( wxStfGraph::OnKeyDown ) #if defined __WXMAC__ && !(wxCHECK_VERSION(2, 9, 0)) EVT_PAINT( wxStfGraph::OnPaint ) #endif END_EVENT_TABLE() // Define a constructor for my canvas wxStfGraph::wxStfGraph(wxView *v, wxStfChildFrame *frame, const wxPoint& pos, const wxSize& size, long style): wxScrolledWindow(frame, wxID_ANY, pos, size, style),pFrame(frame), isZoomRect(false),no_gimmicks(false),isPrinted(false),isLatex(false),firstPass(true),isSyncx(false), printRect(),boebbel(boebbelStd),boebbelPrint(boebbelStd), #ifdef __WXGTK__ printScale(1.0),printSizePen1(4),printSizePen2(8),printSizePen4(16), #else printScale(1.0),printSizePen1(4),printSizePen2(8),printSizePen4(16), #endif downsampling(1),eventPos(0), llz_x(0.0),ulz_x(1.0),llz_y(0.0),ulz_y(1.0),llz_y2(0.0),ulz_y2(1.0), results1(wxT("\0")),results2(wxT("\0")),results3(wxT("\0")),results4(wxT("\0")),results5(wxT("\0")),results6(wxT("\0")), standardPen(*wxBLACK,1,wxSOLID), //Solid black line standardPen2(*wxRED,1,wxSOLID), //Solid red line standardPen3(wxColour(255,192,192),1,wxSOLID), //Solid red line scalePen(*wxBLACK,2,wxSOLID), //Solid black line scalePen2(*wxRED,2,wxSOLID), //Solid red line peakPen(*wxRED,1,wxSHORT_DASH), //Dashed red line peakLimitPen(*wxRED,1,wxDOT), //Dotted red line basePen(*wxGREEN,1,wxSHORT_DASH), //Dashed green line baseLimitPen(*wxGREEN,1,wxDOT), //Dotted green line decayLimitPen(wxColour(127,127,127),1,wxDOT), //Dotted dark blue line ZoomRectPen(*wxLIGHT_GREY,1,wxDOT), //Dotted grey line fitPen(wxColour(127,127,127),4,wxSOLID), //Solid dark grey line fitSelectedPen(wxColour(192,192,192),2,wxSOLID), //Solid dark grey line selectPen(wxColour(127,127,127),1,wxSOLID), //Solid grey line averagePen(*wxBLUE,1,wxSOLID), //Solid light blue line rtPen(*wxGREEN,2,wxSOLID), //Solid green line hdPen(*wxCYAN,2,wxSOLID), //Solid violet line rdPen(*wxRED,2,wxSOLID), //Solid dark violet line #ifdef WITH_PSLOPE slopePen(*wxBLUE,2,wxSOLID), //Solid blue line #endif latencyPen(*wxBLUE,1,wxDOT), alignPen(*wxBLUE,1,wxSHORT_DASH), measPen(*wxBLACK,1,wxDOT), eventPen(*wxBLUE,2,wxSOLID), #ifdef WITH_PSLOPE PSlopePen(wxColor(30,144,255), 1, wxDOT), // Dotted bright blue line #endif standardPrintPen(*wxBLACK,printSizePen1,wxSOLID), //Solid black line standardPrintPen2(*wxRED,printSizePen1,wxSOLID), //Solid red line standardPrintPen3(wxColour(255,192,192),printSizePen1,wxSOLID), //Solid red line scalePrintPen(*wxBLACK,printSizePen2,wxSOLID), //Solid black line scalePrintPen2(*wxRED,printSizePen2,wxSOLID), //Solid red line measPrintPen(*wxBLACK,printSizePen1,wxDOT), peakPrintPen(*wxRED,printSizePen1,wxSHORT_DASH), //Dashed red line peakLimitPrintPen(*wxRED,printSizePen1,wxDOT), //Dotted red line basePrintPen(*wxGREEN,printSizePen1,wxSHORT_DASH), //Dashed green line baseLimitPrintPen(*wxGREEN,printSizePen1,wxDOT), //Dotted green line decayLimitPrintPen(wxColour(63,63,63),printSizePen1,wxDOT), //Dotted dark blue line fitPrintPen(wxColour(63,63,63),printSizePen2,wxSOLID), //Solid dark grey line fitSelectedPrintPen(wxColour(128,128,128),printSizePen2,wxSOLID), //Solid dark grey line selectPrintPen(wxColour(31,31,31),printSizePen1,wxSOLID), //Solid grey line averagePrintPen(*wxBLUE,printSizePen1,wxSOLID), //Solid light blue line rtPrintPen(*wxGREEN,printSizePen2,wxSOLID), //Solid green line hdPrintPen(*wxCYAN,printSizePen2,wxSOLID), //Solid violet line rdPrintPen(*wxRED,printSizePen2,wxSOLID), //Solid dark violet line #ifdef WITH_PSLOPE slopePrintPen(*wxBLUE,printSizePen4,wxSOLID), //Solid blue line #endif resultsPrintPen(*wxLIGHT_GREY,printSizePen2,wxSOLID),//Solid light grey line latencyPrintPen(*wxBLUE,printSizePen1,wxDOT),//Dotted violett line PSlopePrintPen(wxColour(30,144,255), printSizePen1, wxDOT), // Dotted bright blue line baseBrush(*wxLIGHT_GREY,wxBDIAGONAL_HATCH), zeroBrush(*wxLIGHT_GREY,wxFDIAGONAL_HATCH), lastLDown(0,0), yzoombg(), m_zoomContext( new wxMenu ), m_eventContext( new wxMenu ) { m_zoomContext->Append( ID_ZOOMHV, wxT("Expand zoom window horizontally && vertically") ); m_zoomContext->Append( ID_ZOOMH, wxT("Expand zoom window horizontally") ); m_zoomContext->Append( ID_ZOOMV, wxT("Expand zoom window vertically") ); m_eventContext->Append( ID_EVENT_ADDEVENT, wxT("Add an event that starts here") ); m_eventContext->Append( ID_EVENT_ERASE, wxT("Erase all events") ); m_eventContext->Append( ID_EVENT_EXTRACT, wxT("Extract selected events") ); SetBackgroundColour(*wxWHITE); view = (wxStfView*)v; wxString perspective=wxGetApp().wxGetProfileString(wxT("Settings"),wxT("Windows"),wxT("")); /* if (perspective != wxT("")) { // load the stored perspective: frame->GetMgr()->LoadPerspective(perspective); } else { // or the default: frame->GetMgr()->LoadPerspective(defaultPersp); } */ } wxStfParentFrame* wxStfGraph::ParentFrame() { return (wxStfParentFrame*)wxGetApp().GetTopWindow(); } // Defines the repainting behaviour void wxStfGraph::OnDraw( wxDC& DC ) { if ( !view || Doc()->get().empty() || !Doc()->IsInitialized() ) return; // ugly hack to force active document update: #if defined(__WXGTK__) || defined(__WXMAC__) view->Activate(true); #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) if (!HasFocus()) #else if (wxWindow::FindFocus()!=(wxWindow*)this) #endif SetFocus(); #endif wxRect WindowRect(GetRect()); if (isPrinted) { PrintScale(WindowRect); } if (firstPass) { firstPass = false; InitPlot(); } //Creates scale bars and labelings for display or print out //Calculate scale bars and labelings CreateScale(&DC); //Create additional rulers/lines and circles on display if (!no_gimmicks) { PlotGimmicks(DC); } //Plot all selected traces and fitted functions if at least one trace ist selected //and 'is selected' is selected in the trace navigator/control box //Polyline() is used for printing to avoid separation of traces //in postscript files //LineTo()is used for display for performance reasons //Plot fit curves (including current trace) DrawFit(&DC); if (!Doc()->GetSelectedSections().empty() && pFrame->ShowSelected()) { PlotSelected(DC); } //End plot all selected traces //Plot average if (Doc()->GetIsAverage()) { PlotAverage(DC); } //End plot average // Plot integral boundaries try { if (Doc()->GetCurrentSectionAttributes().isIntegrated) { DrawIntegral(&DC); } } catch (const std::out_of_range& e) { /* Do nothing for now */ } //Zoom window is displayed (see OnLeftButtonUp()) if (isZoomRect) { DrawZoomRect(DC); } //End zoom //Plot of the second channel //Trace one when displayed first time if ((Doc()->size()>1) && pFrame->ShowSecond()) { if (!isPrinted) { //Draw current trace on display //For display use point to point drawing DC.SetPen(standardPen2); PlotTrace(&DC,Doc()->get()[Doc()->GetSecChIndex()][Doc()->GetCurSecIndex()].get(), reference); } else { //Draw second channel for print out //For print out use polyline tool DC.SetPen(standardPrintPen2); PrintTrace(&DC,Doc()->get()[Doc()->GetSecChIndex()][Doc()->GetCurSecIndex()].get(), reference); } // End display or print out } //End plot of the second channel if ((Doc()->size()>1) && pFrame->ShowAll()) { for (std::size_t n=0; n < Doc()->size(); ++n) { if (!isPrinted) { //Draw current trace on display //For display use point to point drawing DC.SetPen(standardPen3); PlotTrace(&DC,Doc()->get()[n][Doc()->GetCurSecIndex()].get(), background, n); } } } //End plot of the second channel //Standard plot of the current trace //Trace one when displayed first time if (!isPrinted) { //Draw current trace on display //For display use point to point drawing DC.SetPen(standardPen); PlotTrace(&DC,Doc()->get()[Doc()->GetCurChIndex()][Doc()->GetCurSecIndex()].get()); } else { //For print out use polyline tool DC.SetPen(standardPrintPen); PrintTrace(&DC,Doc()->get()[Doc()->GetCurChIndex()][Doc()->GetCurSecIndex()].get()); } // End display or print out //End plot of the current trace //Ensure old scaling after print out if(isPrinted) { for (std::size_t n=0; n < Doc()->size(); ++n) { Doc()->GetYZoomW(n) = Doc()->GetYZoomW(n) * (1.0/printScale); } Doc()->GetXZoomW() = Doc()->GetXZoomW() * (1.0/printScale); WindowRect=printRect; } //End ensure old scaling after print out view->OnDraw(& DC); } void wxStfGraph::InitPlot() { if (wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewScaleBars"),1)) { if (pFrame->GetMenuBar() && pFrame->GetMenuBar()->GetMenu(2)) { pFrame->GetMenuBar()->GetMenu(2)->Check(ID_SCALE,true); } wxGetApp().set_isBars(true); } else { if (pFrame->GetMenuBar() && pFrame->GetMenuBar()->GetMenu(2)) { pFrame->GetMenuBar()->GetMenu(2)->Check(ID_SCALE,false); } wxGetApp().set_isBars(false); } if (wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("ViewSyncx"),1)) { isSyncx=true; } else { isSyncx=false; } // Ensure proper dimensioning // Determine scaling factors and Units // Zoom and offset variables are currently not part of the settings dialog => // Read from registry // Return a negative value upon first program start so that the trace is // fit to the window dimensions YZW()=(double)(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("zoom.yZoom"), -1) / 100000.0); SPYW()=wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("zoom.startPosY"), 0); XZW()=(double)(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("zoom.xZoom"), -1) / 100000.0); SPXW()=wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("zoom.startPosX"), 0); if (XZ() <= 0 || YZ() <= 0 || fabs(double(SPY())) >= 1e15) Fittowindow(false); if ((Doc()->size()>1)) { //Second channel is not part of the settings dialog =>read from registry SPY2W() = wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("Zoom.startPosY2"), 1); YZ2W() = (double)(wxGetApp().wxGetProfileInt(wxT("Settings"),wxT("Zoom.yZoom2"), 1) / 100000.0); //Ensure proper dimensioning if (YZ2() <=0) FitToWindowSecCh(false); } } void wxStfGraph::PlotSelected(wxDC& DC) { if (!isPrinted) { //Draw traces on display DC.SetPen(selectPen); for (unsigned m=0; m < Doc()->GetSelectedSections().size(); ++m) { //For display use point to point drawing PlotTrace( &DC, Doc()->get()[Doc()->GetCurChIndex()][Doc()->GetSelectedSections()[m]].get() ); } } //End draw traces on display else { //Draw traces for print out DC.SetPen(selectPrintPen); for (unsigned m=0; m < Doc()->GetSelectedSections().size() && Doc()->GetSelectedSections().size()>0; ++m) { PrintTrace(&DC,Doc()->get()[Doc()->GetCurChIndex()][Doc()->GetSelectedSections()[m]].get()); } //End draw for print out } //End if display or print out } void wxStfGraph::PlotAverage(wxDC& DC) { //Average is calculated but not plotted if (!isPrinted) { //Draw Average on display //For display use point to point drawing DC.SetPen(averagePen); PlotTrace(&DC,Doc()->GetAverage()[0][0].get()); } //End draw Average on display else { //Draw average for print out //For print out use polyline tool DC.SetPen(averagePrintPen); PrintTrace(&DC,Doc()->GetAverage()[0][0].get()); } //End draw average for print out } void wxStfGraph::DrawZoomRect(wxDC& DC) { DC.SetPen(ZoomRectPen); wxPoint ZoomPoints[4]; wxPoint Ul_Corner((int)llz_x, (int)llz_y); wxPoint Ur_Corner((int)ulz_x, (int)llz_y); wxPoint Lr_Corner((int)ulz_x, (int)ulz_y); wxPoint Ll_Corner((int)llz_x, (int)ulz_y); ZoomPoints[0]=Ul_Corner; ZoomPoints[1]=Ur_Corner; ZoomPoints[2]=Lr_Corner; ZoomPoints[3]=Ll_Corner; DC.DrawPolygon(4,ZoomPoints); } void wxStfGraph::PlotGimmicks(wxDC& DC) { // crosshair through measurement cursor: int crosshairSize=20; DrawCrosshair(DC, measPen, measPrintPen, crosshairSize, Doc()->GetMeasCursor(), Doc()->GetMeasValue()); // crosshair through threshold: DrawCrosshair(DC, peakPen, peakPrintPen, crosshairSize/2.0, Doc()->GetThrT(), Doc()->GetThreshold()); // creates vertical ruler through measurement peak if needed if ( Doc()->GetMeasRuler() ) DrawVLine(&DC, Doc()->GetMeasCursor(), measPen, measPrintPen); //creates red vertical and horizontal dashed lines through the peak DrawVLine(&DC,Doc()->GetMaxT(), peakPen, peakPrintPen); DrawHLine(&DC,Doc()->GetPeak(), peakPen, peakPrintPen); //and red dotted lines through peak calculation limits DrawVLine(&DC,Doc()->GetPeakBeg(), peakLimitPen, peakLimitPrintPen); DrawVLine(&DC,Doc()->GetPeakEnd(), peakLimitPen, peakLimitPrintPen); //creates a green horizontal dashed line through the base DrawHLine(&DC,Doc()->GetBase(), basePen, basePrintPen); //and green dotted lines through Doc()->GetBase() calculation limits DrawVLine(&DC,Doc()->GetBaseBeg(), baseLimitPen, baseLimitPrintPen); DrawVLine(&DC,Doc()->GetBaseEnd(), baseLimitPen, baseLimitPrintPen); //Create darkblue dotted lines through decay calculation limits DrawVLine(&DC,Doc()->GetFitBeg(), decayLimitPen, decayLimitPrintPen); DrawVLine(&DC,Doc()->GetFitEnd(), decayLimitPen, decayLimitPrintPen); // Create dotted line as a latency cursor DrawVLine(&DC,Doc()->GetLatencyBeg(), latencyPen, latencyPrintPen); DrawVLine(&DC,Doc()->GetLatencyEnd(), latencyPen, latencyPrintPen); // Create double-arrow between latency cursors: int latStart=xFormat(Doc()->GetLatencyBeg()); int latEnd=xFormat(Doc()->GetLatencyEnd()); if (latStart < 0) latStart = 0; if (latEnd > GetRect().width) latEnd = GetRect().width; DC.DrawLine(latStart,20,latEnd,20); // left arrowhead: DC.DrawLine(latStart+1,20,latStart+6,15); DC.DrawLine(latStart+1,20,latStart+6,25); // right arrowhead: DC.DrawLine(latEnd-1,20,latEnd-6,15); DC.DrawLine(latEnd-1,20,latEnd-6,25); #ifdef WITH_PSLOPE // Create dotted bright blue line as slope cursor DrawVLine(&DC, Doc()->GetPSlopeBeg(), PSlopePen, PSlopePrintPen); DrawVLine(&DC, Doc()->GetPSlopeEnd(), PSlopePen, PSlopePrintPen); #endif //Set circle size depending on output if (!isPrinted) boebbel=boebbelStd; else boebbel=boebbelPrint; //draws green circles around the Lo% and the Hi% rise times double reference = Doc()->GetBase(); if ( !Doc()->GetFromBase() && Doc()->GetThrT() >= 0 ) { reference = Doc()->GetThreshold(); } double Low = Doc()->GetRTFactor()/100.; double High = 1-Low; DrawCircle( &DC,Doc()->GetTLoReal(), High*reference + Low*Doc()->GetPeak(), rtPen, rtPrintPen); DrawCircle( &DC,Doc()->GetTHiReal(), Low*reference + High*Doc()->GetPeak(), rtPen, rtPrintPen); //draws circles around the half duration limits DrawCircle(&DC,Doc()->GetT50LeftReal(),Doc()->GetT50Y(), hdPen, hdPrintPen); DrawCircle(&DC,Doc()->GetT50RightReal(),Doc()->GetT50Y(), hdPen, hdPrintPen); //draws dark violet circles around the points of steepest rise/decay DrawCircle(&DC,Doc()->GetMaxRiseT(),Doc()->GetMaxRiseY(), rdPen, rdPrintPen); DrawCircle(&DC,Doc()->GetMaxDecayT(),Doc()->GetMaxDecayY(), rdPen, rdPrintPen); try { stf::SectionAttributes sec_attr = Doc()->GetCurrentSectionAttributes(); if (!sec_attr.eventList.empty()) { PlotEvents(DC); } if (!sec_attr.pyMarkers.empty()) { DC.SetPen(eventPen); for (c_marker_it it = sec_attr.pyMarkers.begin(); it != sec_attr.pyMarkers.end(); ++it) { // Create circles indicating the peak of an event: DC.DrawRectangle( xFormat(it->x), yFormat(it->y), boebbel*2.0, boebbel*2.0 ); } } } catch (const std::out_of_range& e) { /* Do nothing for now */ } } void wxStfGraph::PlotEvents(wxDC& DC) { const int MAX_EVENTS_PLOT = 200; stf::SectionAttributes sec_attr; try { sec_attr = Doc()->GetCurrentSectionAttributes(); } catch (const std::out_of_range& e) { return; } DC.SetPen(eventPen); for (c_event_it it = sec_attr.eventList.begin(); it != sec_attr.eventList.end(); ++it) { // Create small arrows indicating the start of an event: eventArrow(&DC, (int)it->GetEventStartIndex()); // Create circles indicating the peak of an event: try { DrawCircle( &DC, it->GetEventPeakIndex(), Doc()->cursec().at(it->GetEventPeakIndex()), eventPen, eventPen ); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal ) ); return; } } // Only draw check boxes if there are less than 1000 events (takes too long // to draw them and it's impossible to check them anyway) wxRect WindowRect=GetRect(); if (isPrinted) WindowRect=wxRect(printRect); int right=WindowRect.width; int nevents_plot = 0; for (event_it it2 = sec_attr.eventList.begin(); it2 != sec_attr.eventList.end(); ++it2) { nevents_plot += (xFormat(it2->GetEventStartIndex()) < right && xFormat(it2->GetEventStartIndex()) > 0); } if (nevents_plot < MAX_EVENTS_PLOT) { for (event_it it2 = sec_attr.eventList.begin(); it2 != sec_attr.eventList.end(); ++it2) { if (xFormat(it2->GetEventStartIndex()) < right && xFormat(it2->GetEventStartIndex()) > 0) { it2->GetCheckBox()->Move(wxPoint(xFormat(it2->GetEventStartIndex()), 0)); it2->GetCheckBox()->Show(true); } else { it2->GetCheckBox()->Show(false); } } } else { for (event_it it2 = sec_attr.eventList.begin(); it2 != sec_attr.eventList.end(); ++it2) { it2->GetCheckBox()->Show(false); } } // return focus to frame: SetFocus(); } void wxStfGraph::DrawCrosshair( wxDC& DC, const wxPen& pen, const wxPen& printPen, int crosshairSize, double xch, double ych) { if (isnan(xch) || isnan(ych)) { return; } wxPen chpen = pen; if (isPrinted) { chpen = printPen; crosshairSize=(int)(crosshairSize*printScale); } DC.SetPen(chpen); try { // circle: wxRect frame(wxPoint( xFormat(xch)-crosshairSize, yFormat(ych)-crosshairSize ), wxPoint( xFormat(xch)+crosshairSize, yFormat(ych)+crosshairSize )); DC.DrawEllipse(frame); // vertical part: DC.DrawLine( xFormat(xch), yFormat(ych)-crosshairSize, xFormat(xch), yFormat(ych)+crosshairSize ); if (wxGetApp().GetCursorsDialog()!=NULL && wxGetApp().GetCursorsDialog()->IsShown()) { //if (wxGetApp().GetCursorsDialog()->GetRuler()) if ( Doc()->GetMeasRuler() ) { DrawVLine(&DC,xch, pen, printPen); } } // horizontal part: DC.DrawLine( xFormat(xch)-crosshairSize, yFormat(ych), xFormat(xch)+crosshairSize, yFormat(ych) ); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal ) ); return; } } double wxStfGraph::get_plot_xmin() const { return -SPX()/XZ() * DocC()->GetXScale(); } double wxStfGraph::get_plot_xmax() const { wxRect WindowRect=GetRect(); int right=WindowRect.width; return (right-SPX())/XZ() * DocC()->GetXScale(); } double wxStfGraph::get_plot_ymin() const { wxRect WindowRect=GetRect(); int top=WindowRect.height; return (SPY()-top)/YZ(); } double wxStfGraph::get_plot_ymax() const { return SPY()/YZ(); } double wxStfGraph::get_plot_y2min() const { wxRect WindowRect=GetRect(); int top=WindowRect.height; return (SPY2()-top)/YZ2(); } double wxStfGraph::get_plot_y2max() const { return SPY2()/YZ2(); } void wxStfGraph::PlotTrace( wxDC* pDC, const Vector_double& trace, plottype pt, int bgno ) { // speed up drawing by omitting points that are outside the window: // find point before left window border: // xFormat=toFormat * zoom.xZoom + zoom.startPosX // for xFormat==0: // toFormat=-zoom.startPosX/zoom.xZoom std::size_t start=0; int x0i=int(-SPX()/XZ()); if (x0i>=0 && x0i<(int)trace.size()-1) start=x0i; // find point after right window border: // for xFormat==right: // toFormat=(right-zoom.startPosX)/zoom.xZoom std::size_t end=trace.size(); wxRect WindowRect=GetRect(); if (isPrinted) WindowRect=wxRect(printRect); int right=WindowRect.width; int xri = int((right-SPX())/XZ())+1; if (xri>=0 && xri<(int)trace.size()-1) end=xri; // apply filter at half the new sampling frequency: DoPlot(pDC, trace, start, end, 1, pt, bgno); } void wxStfGraph::DoPlot( wxDC* pDC, const Vector_double& trace, int start, int end, int step, plottype pt, int bgno) { #if (__cplusplus < 201103) boost::function yFormatFunc; #else std::function yFormatFunc; #endif switch (pt) { case active: yFormatFunc = std::bind1st( std::mem_fun(&wxStfGraph::yFormatD), this); break; case reference: yFormatFunc = std::bind1st( std::mem_fun(&wxStfGraph::yFormatD2), this); break; case background: Vector_double::const_iterator max_el = std::max_element(trace.begin(), trace.end()); Vector_double::const_iterator min_el = std::min_element(trace.begin(), trace.end()); double min = *min_el; if (min>1.0e12) min= 1.0e12; if (min<-1.0e12) min=-1.0e12; double max = *max_el; if (max>1.0e12) max= 1.0e12; if (max<-1.0e12) max=-1.0e12; wxRect WindowRect=GetRect(); WindowRect.height /= Doc()->size(); FittorectY(yzoombg, WindowRect, min, max, 1.0); yzoombg.startPosY += bgno*WindowRect.height; yFormatFunc = std::bind1st( std::mem_fun(&wxStfGraph::yFormatDB), this); break; } int x_last = xFormat(start); int y_last = yFormatFunc( trace[start] ); int x_next = 0; int y_next = 0; #ifdef BENCHMARK //def _STFDEBUG struct timespec time0, time1; current_utc_time(&time0); #else wxRect WindowRect(GetRect()); if (end-start < 2*WindowRect.width+2) { #endif for (int n=start; nDrawLine( x_last, y_last, x_next, y_next ); x_last = x_next; y_last = y_next; } #ifdef BENCHMARK //def _STFDEBUG current_utc_time(&time1); double accum = tdiff(time1, time0)*1e3; std::string fn_platform = "plt_bench_" + stf::wx2std(wxGetOsDescription()) + ".txt"; std::ofstream plt_bench; plt_bench.open(fn_platform.c_str(), std::ios::out | std::ios::app); plt_bench << end-start << "\t" << accum << "\t"; current_utc_time(&time0); x_last = xFormat(start); #else } else { #endif double y_max = trace[start]; double y_min = trace[start]; for (int n=start; n y_max) { y_max = trace[n+1]; } } else { // plot line between extrema of previous column: pDC->DrawLine( x_last, yFormatFunc(y_min), x_last, yFormatFunc(y_max) ); // plot line between last point of previous and first point of this column: pDC->DrawLine( x_last, yFormatFunc(trace[n]), x_next, yFormatFunc(trace[n+1]) ); y_min = trace[n+1]; y_max = trace[n+1]; x_last = x_next; } } #ifdef BENCHMARK //def _STFDEBUG current_utc_time(&time1); accum = tdiff(time1, time0)*1e3; plt_bench << accum << std::endl; plt_bench.close(); #else } #endif } void wxStfGraph::PrintScale(wxRect& WindowRect) { //enhance resolution for printing - see OnPrint() //Ensures the scaling of all pixel dependent drawings for (std::size_t n=0; n < Doc()->size(); ++n) { Doc()->GetYZoomW(n) = Doc()->GetYZoomW(n) * printScale; } Doc()->GetXZoomW() = Doc()->GetXZoomW() * printScale; WindowRect=printRect; //Calculate scaling variables boebbelPrint=(int)(boebbelStd * printScale); if ( boebbelPrint < 1 ) boebbelPrint=2; printSizePen1=(int)(1 * printScale); if ( printSizePen1 < 1 ) boebbelPrint=1; printSizePen2=(int)(2 * printScale); if ( printSizePen2 < 1 ) boebbelPrint=2; printSizePen4=(int)(4 * printScale); if ( printSizePen4 < 1 ) boebbelPrint=4; } void wxStfGraph::PrintTrace( wxDC* pDC, const Vector_double& trace, plottype ptype ) { // speed up drawing by omitting points that are outside the window: // find point before left window border: // xFormat=toFormat * zoom.xZoom + zoom.startPosX // for xFormat==0: // toFormat=-zoom.startPosX/zoom.xZoom std::size_t start=0; int x0i=int(-SPX()/XZ()); if (x0i>=0 && x0i<(int)trace.size()-1) start=x0i; // find point after right window border: // for xFormat==right: // toFormat=(right-zoom.startPosX)/zoom.xZoom std::size_t end=trace.size(); wxRect WindowRect=GetRect(); if (isPrinted) WindowRect=wxRect(printRect); int right=WindowRect.width; int xri=int((right-SPX())/XZ())+1; if (xri>=0 && xri<(int)trace.size()-1) end=xri; DoPrint(pDC, trace, start, end, ptype); } void wxStfGraph::DoPrint( wxDC* pDC, const Vector_double& trace, int start, int end, plottype ptype) { #if (__cplusplus < 201103) boost::function yFormatFunc; #else std::function yFormatFunc; #endif switch (ptype) { case active: yFormatFunc = std::bind1st( std::mem_fun(&wxStfGraph::yFormatD), this); break; default: yFormatFunc = std::bind1st( std::mem_fun(&wxStfGraph::yFormatD2), this); break; } std::vector points; int x_last = xFormat(start); int y_last = yFormatFunc( trace[start] ); int y_max = y_last; int y_min = y_last; int x_next = 0; int y_next = 0; points.push_back( wxPoint(x_last,y_last) ); for (int n=start; n y_max) { y_max = y_next; } } else { // else, always draw and reset extrema: if (y_min != y_next) { points.push_back( wxPoint(x_last, y_min) ); } if (y_max != y_next) { points.push_back( wxPoint(x_last, y_max) ); } points.push_back( wxPoint(x_next, y_next) ); y_min = y_next; y_max = y_next; x_last = x_next; } } pDC->DrawLines((int)points.size(),&points[0]); } void wxStfGraph::DrawCircle(wxDC* pDC, double x, double y, const wxPen& pen, const wxPen& printPen) { if (isPrinted) { pDC->SetPen(printPen); } else { pDC->SetPen(pen); } wxRect Frame( wxPoint(xFormat(x)-boebbel,yFormat(y)-boebbel), wxPoint(xFormat(x)+boebbel,yFormat(y)+boebbel) ); pDC->DrawEllipse(Frame); } void wxStfGraph::DrawVLine(wxDC* pDC, double x, const wxPen& pen, const wxPen& printPen) { wxRect WindowRect(GetRect()); if (isPrinted) { //Set WindowRect to print coordinates (page size) WindowRect=printRect; pDC->SetPen(printPen); } else { pDC->SetPen(pen); } pDC->DrawLine(xFormat(x),0,xFormat(x),WindowRect.height); } void wxStfGraph::DrawHLine(wxDC* pDC, double y, const wxPen& pen, const wxPen& printPen) { wxRect WindowRect(GetRect()); if (isPrinted) { //Set WindowRect to print coordinates (page size) WindowRect=printRect; pDC->SetPen(printPen); } else { pDC->SetPen(pen); } pDC->DrawLine(0, yFormat(y),WindowRect.width,yFormat(y)); } void wxStfGraph::eventArrow(wxDC* pDC, int eventIndex) { // we only need that if it's within the screen: wxRect WindowRect(GetRect()); if (xFormat(eventIndex)<0 || xFormat(eventIndex)>WindowRect.width) { return; } if (isPrinted) { //Set WindowRect to print coordinates (page size) WindowRect=printRect; } pDC->DrawLine(xFormat(eventIndex), 20, xFormat(eventIndex), 0); // arrow head: pDC->DrawLine(xFormat(eventIndex)-5, 15, xFormat(eventIndex), 20); pDC->DrawLine(xFormat(eventIndex)+5, 15, xFormat(eventIndex), 20); } void wxStfGraph::DrawFit(wxDC* pDC) { try { // go through selected traces: if ( isPrinted ) pDC->SetPen(fitSelectedPrintPen); else pDC->SetPen(fitSelectedPen); for ( std::size_t n_sel = 0; n_sel < Doc()->GetSelectedSections().size(); ++n_sel ) { std::size_t sel_index = Doc()->GetSelectedSections()[ n_sel ]; // Check whether this section contains a fit: try { stf::SectionAttributes sec_attr = Doc()->GetSectionAttributes(Doc()->GetCurChIndex(), sel_index); if ( sec_attr.isFitted && pFrame->ShowSelected() ) { PlotFit( pDC, stf::SectionPointer( &((*Doc())[Doc()->GetCurChIndex()][sel_index]), sec_attr ) ); } } catch (const std::out_of_range& e) { /* Do nothing */ } } // Active trace if ( isPrinted ) pDC->SetPen(fitPrintPen); else pDC->SetPen(fitPen); stf::SectionAttributes sec_attr = Doc()->GetCurrentSectionAttributes(); if (sec_attr.isFitted) { PlotFit( pDC, stf::SectionPointer( &((*Doc())[Doc()->GetCurChIndex()][Doc()->GetCurSecIndex()]), sec_attr) ); } } catch (const std::out_of_range& e) { } } void wxStfGraph::PlotFit( wxDC* pDC, const stf::SectionPointer& Sec ) { wxRect WindowRect = GetRect(); if (isPrinted) { //Set WindowRect to print coordinates (page size) WindowRect=printRect; } int firstPixel = xFormat( Sec.sec_attr.storeFitBeg ); if ( firstPixel < 0 ) firstPixel = 0; int lastPixel = xFormat( Sec.sec_attr.storeFitEnd ); if ( lastPixel > WindowRect.width + 1 ) lastPixel = WindowRect.width + 1; if (!isPrinted) { //Draw Fit on display //For display use point to point drawing double fit_time_1 = ( ((double)firstPixel - (double)SPX()) / XZ() - (double)Sec.sec_attr.storeFitBeg )* Doc()->GetXScale(); for ( int n_px = firstPixel; n_px < lastPixel-1; n_px++ ) { // Calculate pixel back to time (GetStoreFitBeg() is t=0) double fit_time_2 = ( ((double)n_px+1.0 - (double)SPX()) / XZ() - (double)Sec.sec_attr.storeFitBeg ) * Doc()->GetXScale(); // undo xFormat = (int)(toFormat * XZ() + SPX()); pDC->DrawLine( n_px, yFormat(Sec.sec_attr.fitFunc->func( fit_time_1, Sec.sec_attr.bestFitP)), n_px + 1, yFormat(Sec.sec_attr.fitFunc->func(fit_time_2, Sec.sec_attr.bestFitP)) ); fit_time_1 = fit_time_2; } } else { //Draw Fit for print out // For print out use polyline std::vector f_print( lastPixel - firstPixel ); for ( int n_px = firstPixel; n_px < lastPixel; n_px++ ) { // Calculate pixel back to time (GetStoreFitBeg() is t=0) double fit_time = ( ((double)n_px - (double)SPX()) / XZ() -(double)Sec.sec_attr.storeFitBeg ) * Doc()->GetXScale(); // undo xFormat = (int)(toFormat * XZ() + SPX()); f_print[n_px-firstPixel].x = n_px; f_print[n_px-firstPixel].y = yFormat( Sec.sec_attr.fitFunc->func( fit_time, Sec.sec_attr.bestFitP) ); } pDC->DrawLines( f_print.size(), &f_print[0] ); } //End if display or print out } void wxStfGraph::DrawIntegral(wxDC* pDC) { // Draws a polygon around the integral. Note that the polygon will be drawn // out of screen as well. stf::SectionAttributes sec_attr; try { sec_attr = Doc()->GetCurrentSectionAttributes(); } catch (const std::out_of_range& e) { return; } if (!isPrinted) { pDC->SetPen(scalePen); } else { pDC->SetPen(scalePrintPen); } bool even = std::div((int)sec_attr.storeIntEnd-(int)sec_attr.storeIntBeg, 2).rem==0; int firstPixel=xFormat(sec_attr.storeIntBeg); // last pixel: int lastPixel= even ? xFormat(sec_attr.storeIntEnd) : xFormat(sec_attr.storeIntEnd-1); std::size_t qt_size= lastPixel-firstPixel + // part that covers the trace 2; // straight line through base or 0 if (!even) qt_size++; //straight line for trapezoidal part std::vector quadTrace; quadTrace.reserve(qt_size); quadTrace.push_back(wxPoint(firstPixel,yFormat(Doc()->GetBase()))); // "Simpson part" (piecewise quadratic functions through three adjacent points): for (int n_pixel=firstPixel; n_pixel < lastPixel; ++n_pixel) { // (lower) index corresponding to pixel: int n_relIndex = (int)(((double)n_pixel-(double)SPX())/(double)XZ()-sec_attr.storeIntBeg); if (n_relIndex >= 0 && (unsigned int)(n_relIndex/2)*3+2 < sec_attr.quad_p.size()) { double n_absIndex = ((double)n_pixel-(double)SPX())/(double)XZ(); // quadratic parameters at this point: double a = sec_attr.quad_p[(int)(n_relIndex/2)*3]; double b = sec_attr.quad_p[(int)(n_relIndex/2)*3+1]; double c = sec_attr.quad_p[(int)(n_relIndex/2)*3+2]; double y = a*n_absIndex*n_absIndex + b*n_absIndex + c; quadTrace.push_back(wxPoint(n_pixel,yFormat(y))); } } // add trapezoidal integration part if uneven: if (!even) { // draw a straight line: quadTrace.push_back( wxPoint( xFormat(sec_attr.storeIntEnd), yFormat(Doc()->cursec()[sec_attr.storeIntEnd]) )); } quadTrace.push_back( wxPoint( xFormat(sec_attr.storeIntEnd), yFormat(Doc()->GetBase()) )); // Polygon from base: pDC->SetBrush(baseBrush); pDC->DrawPolygon((int)quadTrace.size(),&quadTrace[0]); // Polygon from 0: quadTrace[0]=wxPoint(firstPixel,yFormat(0L)); quadTrace[quadTrace.size()-1]= wxPoint( xFormat(sec_attr.storeIntEnd), yFormat(0L) ); pDC->SetBrush(zeroBrush); pDC->DrawPolygon((int)quadTrace.size(),&quadTrace[0]); pDC->SetBrush(*wxTRANSPARENT_BRUSH); } void wxStfGraph::Snapshotwmf() { wxStfPreprintDlg myDlg(this,true); if (myDlg.ShowModal()!=wxID_OK) return; set_downsampling(myDlg.GetDownSampling()); // Get size of Graph, in pixels: wxRect screenRect(GetRect()); // Get size of page, in pixels: // assuming the screen is ~ 96 dpi, but we want ~ 720: printRect = wxRect(wxPoint(0,0), wxSize(GetRect().GetSize()*4)); double scale=(double)printRect.width/(double)screenRect.width; #if _WINDOWS // FIXME: for non-Windows platforms wxMetafileDC wmfDC; if (!wmfDC.IsOk()) #endif { wxGetApp().ErrorMsg(wxT("Error while creating clipboard data")); return; } set_noGimmicks(true); set_isPrinted(true); printScale=scale; #if _WINDOWS // FIXME: for non-Windows platforms OnDraw(wmfDC); #endif set_isPrinted(false); no_gimmicks=false; #if _WINDOWS // FIXME: for non-Windows platforms wxMetafile* mf = wmfDC.Close(); if (mf && mf->IsOk()) { mf->SetClipboard(); delete mf; } else #endif { wxGetApp().ErrorMsg(wxT("Error while copying to clipboard")); } } void wxStfGraph::OnMouseEvent(wxMouseEvent& event) { // event.Skip(); if (!view) return; if (event.LeftDown()) LButtonDown(event); if (event.RightDown()) RButtonDown(event); if (event.LeftUp()) LButtonUp(event); } void wxStfGraph::LButtonDown(wxMouseEvent& event) { // event.Skip(); if (!view) return; view->Activate(true); #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) if (!HasFocus()) #else if (wxWindow::FindFocus()!=(wxWindow*)this) #endif SetFocusIgnoringChildren(); wxClientDC dc(this); PrepareDC(dc); lastLDown = event.GetLogicalPosition(dc); switch (ParentFrame()->GetMouseQual()) { //Depending on the radio buttons (Mouse field) //in the (trace navigator) control box case stf::measure_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetMeasCursor( stf::round( ((double)lastLDown.x - (double)SPX())/XZ() ) ); //second 'double' added // in this case, update results string without waiting for "Return": pFrame->UpdateResults(); break; case stf::peak_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetPeakBeg( stf::round( ((double)lastLDown.x - (double)SPX())/XZ() ) ); //second 'double' added //Set x-value as lower limit of the peak calculation dialog box break; case stf::base_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetBaseBeg( stf::round( ((double)lastLDown.x - (double)SPX())/XZ() ) ); //second 'double' added break; case stf::decay_cursor: //conversion of pixel on screen to time (inversion of xFormat()) if (wxGetApp().GetCursorsDialog() != NULL && wxGetApp().GetCursorsDialog()->GetStartFitAtPeak()) { wxGetApp().ErrorMsg( wxT("Fit will start at the peak. Change cursor settings (Edit->Cursor settings) to set manually.") ); break; } Doc()->SetFitBeg( stf::round( ((double)lastLDown.x - (double)SPX())/XZ() ) ); //second 'double' added break; case stf::latency_cursor: if (Doc()->GetLatencyStartMode() != stf::manualMode) { Doc()->SetLatencyStartMode( stf::manualMode ); wxGetApp().ErrorMsg( wxT("The first latency cursor is set to manual mode") ); } Doc()->SetLatencyBeg(((double)lastLDown.x-(double)SPX())/XZ()); Refresh(); break; case stf::zoom_cursor: llz_x=(double)lastLDown.x; llz_y=(double)lastLDown.y; llz_y2=llz_y; break; #ifdef WITH_PSLOPE case stf::pslope_cursor: Doc()->SetPSlopeBegMode(stf::psBeg_manualMode); // set left cursor to manual // conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetPSlopeBeg( stf::round( ((double)lastLDown.x - (double)SPX())/XZ() ) ); // second 'double' added break; #endif default: break; } //End switch TraceNav->GetMouseQual() if (wxGetApp().GetCursorsDialog()!=NULL && wxGetApp().GetCursorsDialog()->IsShown()) { try { wxGetApp().GetCursorsDialog()->UpdateCursors(); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal) ); } } } void wxStfGraph::RButtonDown(wxMouseEvent& event) { // event.Skip(); if (!view) return; view->Activate(true); #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) if (!HasFocus()) #else if (wxWindow::FindFocus()!=(wxWindow*)this) #endif SetFocusIgnoringChildren(); wxClientDC dc(this); PrepareDC(dc); wxPoint point(event.GetLogicalPosition(dc)); switch (ParentFrame()->GetMouseQual()) { case stf::peak_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetPeakEnd( stf::round( ((double)point.x - (double)SPX())/XZ() ) ); break; case stf::base_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetBaseEnd( stf::round( ((double)point.x - (double)SPX())/XZ() ) ); break; case stf::decay_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetFitEnd( stf::round( ((double)point.x - (double)SPX())/XZ() ) ); break; case stf::latency_cursor: if (Doc()->GetLatencyEndMode() != stf::manualMode) { Doc()->SetLatencyEndMode( stf::manualMode ); wxGetApp().ErrorMsg( wxT("The second latency cursor is set to manual mode") ); } Doc()->SetLatencyEnd(((double)point.x-(double)SPX())/XZ()); Refresh(); break; case stf::zoom_cursor: if (isZoomRect) { PopupMenu(m_zoomContext.get()); } else { wxGetApp().ErrorMsg(wxT("Draw a zoom window with the left mouse button first")); } break; case stf::event_cursor: try { if (!Doc()->GetCurrentSectionAttributes().eventList.empty()) { // store the position that has been clicked: eventPos = stf::round( ((double)point.x - (double)SPX())/XZ() ); PopupMenu(m_eventContext.get()); } else { wxGetApp().ErrorMsg(wxT("No events have been detected yet")); } } catch (const std::out_of_range& e) { } break; #ifdef WITH_PSLOPE case stf::pslope_cursor: Doc()->SetPSlopeEndMode(stf::psEnd_manualMode); // set right cursor to manual mode Doc()->SetPSlopeEnd( stf::round( ((double)point.x - (double)SPX())/XZ() ) ); break; #endif default: ; } //End switch TraceNav->GetMouseQual() if (wxGetApp().GetCursorsDialog()!=NULL && wxGetApp().GetCursorsDialog()->IsShown()) { try { wxGetApp().GetCursorsDialog()->UpdateCursors(); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal) ); } } Refresh(); } void wxStfGraph::LButtonUp(wxMouseEvent& event) { // event.Skip(); wxClientDC dc(this); PrepareDC(dc); wxPoint point(event.GetLogicalPosition(dc)); if (point == lastLDown) { Refresh(); return; } switch (ParentFrame()->GetMouseQual()) { case stf::peak_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetPeakEnd( stf::round( ((double)point.x - (double)SPX())/XZ() ) ); break; case stf::base_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetBaseEnd( stf::round( ((double)point.x - (double)SPX())/XZ() ) ); break; case stf::decay_cursor: //conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetFitEnd( stf::round( ((double)point.x - (double)SPX())/XZ() ) ); break; #ifdef WITH_PSLOPE case stf::pslope_cursor: // conversion of pixel on screen to time (inversion of xFormat()) Doc()->SetPSlopeEnd( stf::round( ((double)point.x - (double)SPX())/XZ() ) ); #endif case stf::latency_cursor: if (Doc()->GetLatencyEndMode() != stf::manualMode) { wxGetApp().ErrorMsg( wxT("The latency cursor can not be set in the current mode\n \ Choose manual mode to set the latency cursor manually") ); break; } Doc()->SetLatencyEnd(((double)point.x-(double)SPX())/XZ()); break; case stf::zoom_cursor: ulz_x=(double)point.x; ulz_y=(double)point.y; ulz_y2=ulz_y; if (llz_x>ulz_x) std::swap(llz_x,ulz_x); if (llz_y>ulz_y) std::swap(llz_y,ulz_y); if (llz_y2>ulz_y2) std::swap(llz_y2,ulz_y2); isZoomRect=true; break; default: break; } Refresh(); } void wxStfGraph::OnKeyDown(wxKeyEvent& event) { // event.Skip(); if (!view) return; view->Activate(true); int kc = event.GetKeyCode(); #ifdef _STFDEBUG std::cout << "User pressed " << char(kc) << ", corresponding keycode is " << kc << std::endl; std::cout << "Mouse Cursor Mode " << ParentFrame()->GetMouseQual() << std::endl; #endif wxRect WindowRect(GetRect()); switch (kc) { case WXK_LEFT: //left cursor if (event.ControlDown()) { OnLeft(); return; } if (event.ShiftDown()) { SPXW() = SPX()-WindowRect.width; Refresh(); return; } OnPrevious(); return; case WXK_RIGHT: {//right cursor if (event.ControlDown()) { OnRight(); return; } if (event.ShiftDown()) { SPXW() = SPX()+WindowRect.width; Refresh(); return; } OnNext(); return; } case WXK_DOWN: //down cursor if (event.ControlDown()) { ChanScroll(-1); } else { OnDown(); } return; case WXK_UP: //up cursor if (event.ControlDown()) { ChanScroll(1); } else { OnUp(); } return; case 49: //1 ParentFrame()->SetZoomQual(stf::zoomch1); return; case 50: //2 if (Doc()->size()>1) ParentFrame()->SetZoomQual(stf::zoomch2); return; case 51: //3 if (Doc()->size()>1) ParentFrame()->SetZoomQual(stf::zoomboth); return; case 69: // e case 101: ParentFrame()->SetMouseQual(stf::event_cursor); return; case 70: case 102: // f Fittowindow(true); return; case 77: // m case 109: ParentFrame()->SetMouseQual(stf::measure_cursor); return; case 80: // p case 112: ParentFrame()->SetMouseQual(stf::peak_cursor); return; case 65: // 'a' case 97: // Select all traces: if (event.ControlDown()) { wxCommandEvent com; Doc()->Selectall(com); return; } return; case 66: // b case 98: ParentFrame()->SetMouseQual(stf::base_cursor); return; #ifdef WITH_PSLOPE case 79: // key 'o' to activate PSlope cursors case 111: ParentFrame()->SetMouseQual(stf::pslope_cursor); return; #endif case 68: // d case 100: ParentFrame()->SetMouseQual(stf::decay_cursor); return; case 90: // z case 122: ParentFrame()->SetMouseQual(stf::zoom_cursor); return; case 76: // l case 108: ParentFrame()->SetMouseQual(stf::latency_cursor); return; case WXK_RETURN: //Enter or Return { wxGetApp().OnPeakcalcexecMsg(); pFrame->UpdateResults(); return; } case 83: // Invalidate();//s case 115: { Doc()->Select(); return; } case 88: // x case 120: { wxCommandEvent foo; Doc()->OnSwapChannels(foo); return; } case 82: // Invalidate();//r case 114: { Doc()->Remove(); return; } } switch (char(kc)) { case '0': case '=': case '+': if (event.ControlDown()) { OnXenllo(); return; } OnYenllo(); return; case '-': if (event.ControlDown()) { OnXshrinklo(); return; } OnYshrinklo(); return; } } void wxStfGraph::OnZoomHV(wxCommandEvent& event) { OnZoomH(event); OnZoomV(event); } void wxStfGraph::OnZoomH(wxCommandEvent& WXUNUSED(event)) { wxRect WindowRect=GetRect(); llz_x=(llz_x - SPX()) / XZ(); ulz_x=(ulz_x - SPX()) / XZ(); int points=(int)(ulz_x - llz_x); XZW()=(double)WindowRect.width / points; SPXW()=(int)(-llz_x * XZ()); isZoomRect=false; } void wxStfGraph::OnZoomV(wxCommandEvent& WXUNUSED(event)) { wxRect WindowRect=GetRect(); llz_y=(SPY() - llz_y) / YZ(); ulz_y=(SPY() - ulz_y) / YZ(); YZW()=WindowRect.height/fabs(ulz_y-llz_y); SPYW()=(int)(WindowRect.height + ulz_y * YZ()); if (Doc()->size() > 1) { llz_y2=(SPY2()-llz_y2)/YZ2(); ulz_y2=(SPY2()-ulz_y2)/YZ2(); YZ2W()=WindowRect.height/fabs(ulz_y2-llz_y2); SPY2W()=(int)(WindowRect.height + ulz_y2 * YZ2()); } isZoomRect=false; } #if defined __WXMAC__ && !(wxCHECK_VERSION(2, 9, 0)) void wxStfGraph::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC PDC(this); OnDraw(PDC); } #endif double prettyNumber( double fDistance, double pixelDistance, int limit ) { double fScaled = 1.0; for (;;) { //set stepsize int nZeros = (int)log10(fScaled); int prev10e = (int)(pow(10.0, nZeros)); int next10e = prev10e * 10; int step = prev10e < 1 ? 1 : prev10e; if ( fScaled / prev10e > 5 ) { fScaled = next10e; step = next10e; } //check whether f scale is ok if ((fScaled/fDistance) * pixelDistance > limit || fScaled>1e9) break; else { //suggest a new f scale: fScaled += step; } } return fScaled; } void wxStfGraph::CreateScale(wxDC* pDC) { // catch bizarre y-Zooms: double fstartPosY=(double)SPY(); if (fabs(fstartPosY)>(double)1.0e15) SPYW()=0; if (fabs(YZ())>1e15) YZW()=1.0; if (!isPrinted) { wxFont font((int)(8*printScale), wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); pDC->SetFont(font); } //Copy main window coordinates to 'WindowRect' wxRect WindowRect(GetRect()); if (isPrinted) { //Set WindowRect to print coordinates (page size) WindowRect=printRect; } //1. Creation of x-(time-)scale: //distance between two neigboured time steps in pixels: XZW()=XZ()>0 ? XZ() : 1.0; double pixelDistance=XZ(); //distance between time steps in msec: //(it might be more elegant to read out the equalspaced step size // directly from the Doc()) double timeDistance=1.0/Doc()->GetSR(); //i.e., 1 timeDistance corresponds to 1 pixelDistance //get an integer time value which comes close to 150 pixels: int limit=(int)(100*printScale); double timeScaled = prettyNumber(timeDistance, pixelDistance, limit); int barLength=(int)((timeScaled/timeDistance) * pixelDistance); //2. creation of y-(voltage- or current-)scale //distance between two neigboured yValues in pixels: YZW()=YZ()>1e-9 ? YZ() : 1.0; double pixelDistanceY=YZ(); //real distance (difference) between two neighboured Values: double realDistanceY=1.0; //get an integer y-value which comes close to 150 pixels: double yScaled = prettyNumber(realDistanceY, pixelDistanceY, limit); int barLengthY=(int)((yScaled/realDistanceY) * pixelDistanceY); //3. creation of y-scale for the second channel //Fit scale of second channel to window //distance between two neigboured yValues in pixels: int barLengthY2=100; double yScaled2 =1.0; double pixelDistanceY2= 1.0; //real distance (difference) between two neighboured Values: double realDistanceY2 = 1.0; if ((Doc()->size()>1)) { pixelDistanceY2= YZ2(); //get an entire y-value which comes close to 150 pixels: yScaled2 = prettyNumber(realDistanceY2, pixelDistanceY2, limit); barLengthY2=(int)((yScaled2/realDistanceY2) * pixelDistanceY2); } //End creation y-scale of the 2nd Channel if (wxGetApp().get_isBars()) { // Use scale bars std::vector Scale(5); // Distance of scale bar from bottom and right border of window: int bottomDist=(int)(50*printScale); int rightDist=(int)(60*printScale); // leave space for a second scale bar: if ((Doc()->size()>1)) rightDist*=2; // Set end points for the scale bar Scale[0]=wxPoint(WindowRect.width-rightDist-barLength, WindowRect.height-bottomDist); Scale[1]=wxPoint(WindowRect.width-rightDist, WindowRect.height-bottomDist); Scale[2]=wxPoint(WindowRect.width-rightDist, WindowRect.height-bottomDist-barLengthY); if (Doc()->size()>1 && pFrame->ShowSecond()) { //Set end points for the second channel y-bar Scale[3]=wxPoint(WindowRect.width-rightDist/2, WindowRect.height-bottomDist); Scale[4]=wxPoint(WindowRect.width-rightDist/2, WindowRect.height-bottomDist-barLengthY2); } // Set scalebar labels wxString scaleXString; scaleXString << (int)timeScaled << wxT(" ms"); // Center of x-scalebar: int xCenter=WindowRect.width-(Scale[1].x-Scale[0].x)/2-rightDist; wxRect TextFrameX( wxPoint(xCenter-(int)(40*printScale),WindowRect.height-bottomDist+(int)(5.0*(double)printScale)), wxPoint(xCenter+(int)(40*printScale),WindowRect.height-bottomDist+(int)(25.0*(double)printScale)) ); if (!isLatex) { pDC->DrawLabel( scaleXString,TextFrameX,wxALIGN_CENTRE_HORIZONTAL | wxALIGN_TOP ); } else { #if 0 wxLatexDC* pLatexDC = (wxLatexDC*)pDC; pLatexDC->DrawLabelLatex( scaleXString, TextFrameX,wxALIGN_CENTRE_HORIZONTAL | wxALIGN_TOP ); #endif } wxString scaleYString; #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) scaleYString << (int)yScaled << wxT(" ") << Doc()->at(Doc()->GetCurChIndex()).GetYUnits() << wxT("\0"); #else scaleYString << (int)yScaled << wxT(" ") << wxString(Doc()->at(Doc()->GetCurChIndex()).GetYUnits().c_str(), wxConvUTF8) << wxT("\0"); #endif // Center of y-scalebar: int yCenter=WindowRect.height-bottomDist-(Scale[1].y-Scale[2].y)/2; wxRect TextFrameY( wxPoint(WindowRect.width-rightDist+(int)(5*printScale),yCenter-(int)(10*printScale)), wxPoint(WindowRect.width,yCenter+(int)(10*printScale)) ); if (!isLatex) { pDC->DrawLabel(scaleYString,TextFrameY,wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL); } else { #if 0 wxLatexDC* pLatexDC = (wxLatexDC*)pDC; pLatexDC->DrawLabelLatex(scaleYString,TextFrameY,wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL); #endif } if (Doc()->size()>1 && pFrame->ShowSecond()) { wxString scaleYString2; scaleYString2 << (int)yScaled2 << wxT(" ") #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) << Doc()->at(Doc()->GetSecChIndex()).GetYUnits(); #else << wxString(Doc()->at(Doc()->GetSecChIndex()).GetYUnits().c_str(), wxConvUTF8); #endif // Center of y2-scalebar: int y2Center=WindowRect.height-bottomDist-(Scale[3].y-Scale[4].y)/2; wxRect TextFrameY2( wxPoint(WindowRect.width-rightDist/2+(int)(5*printScale),y2Center-(int)(10*printScale)), wxPoint(WindowRect.width,y2Center+(int)(10*printScale)) ); pDC->SetTextForeground(*wxRED); if (!isLatex) { pDC->DrawLabel(scaleYString2,TextFrameY2,wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); } else { #if 0 wxLatexDC* pLatexDC = (wxLatexDC*)pDC; pLatexDC->DrawLabelLatex(scaleYString2,TextFrameY2,wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); #endif } pDC->SetTextForeground(*wxBLACK); } //Set PenStyle if (!isPrinted) pDC->SetPen(scalePen); else pDC->SetPen(scalePrintPen); //Plot them pDC->DrawLine(Scale[0],Scale[1]); pDC->DrawLine(Scale[1],Scale[2]); if (Doc()->size()>1 && pFrame->ShowSecond()) { if (!isPrinted) pDC->SetPen(scalePen2); else pDC->SetPen(scalePrintPen2); pDC->DrawLine(Scale[3],Scale[4]); } } else { // Use grid // Added 11/02/2006, CSH // Distance of coordinates from bottom, left, top and right border of window: int bottomDist=(int)(50*printScale); int leftDist=(int)(50*printScale); int topDist=(int)(20*printScale); int rightDist=(int)(20*printScale); // upper left corner: pDC->DrawLine(leftDist,topDist,leftDist,WindowRect.height-bottomDist); // lower right corner: pDC->DrawLine(leftDist,WindowRect.height-bottomDist, WindowRect.width-rightDist,WindowRect.height-bottomDist); // second y-axis: if (Doc()->size()>1 && pFrame->ShowSecond()) { pDC->SetPen(scalePen2); // upper left corner: pDC->DrawLine(leftDist*2,topDist,leftDist*2,WindowRect.height-bottomDist); } //Set PenStyle if (!isPrinted) pDC->SetPen(scalePen); else pDC->SetPen(scalePrintPen); // Set ticks: int tickLength=(int)(10*printScale); // Find first y-axis tick: // Get y-value of bottomDist: double yBottom=(SPY()-(WindowRect.height-bottomDist))/YZ(); // Find next-higher integer multiple of barLengthY: int nextTickMult=(int)(yBottom/yScaled); // nextTickMult is truncated; hence, negative and positive values // have to be treated separately: if (yBottom>0) { nextTickMult++; } // pixel position of this tick: double yFirst=nextTickMult*yScaled; int yFirstTick=yFormat(yFirst); // How many times does the y-scale bar fit into the window? int yScaleInWindow=(yFirstTick-topDist)/barLengthY; // y-Axis ticks: for (int n_tick_y=0;n_tick_y<=yScaleInWindow;++n_tick_y) { pDC->DrawLine(leftDist-tickLength, yFirstTick-n_tick_y*barLengthY, leftDist, yFirstTick-n_tick_y*barLengthY); // Create a rectangle from the left window border to the tick: wxRect TextFrame( wxPoint(0,yFirstTick-n_tick_y*barLengthY-(int)(10*printScale)), wxPoint(leftDist-tickLength-1,yFirstTick-n_tick_y*barLengthY+(int)(10*printScale)) ); // Draw Text: int y=(int)(yScaled*n_tick_y+yFirst); wxString yLabel;yLabel << y; pDC->DrawLabel(yLabel,TextFrame,wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL); } // Write y units: // Length of y-axis: int yLength=WindowRect.height-topDist-bottomDist; // position of vertical center: int vCenter=topDist+yLength/2; wxRect TextFrame( wxPoint(2,vCenter-(int)(10*printScale)), wxPoint(leftDist-tickLength-1,vCenter+(int)(10*printScale)) ); pDC->DrawLabel( #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) Doc()->at(Doc()->GetCurChIndex()).GetYUnits(), #else wxString(Doc()->at(Doc()->GetCurChIndex()).GetYUnits().c_str(), wxConvUTF8), #endif TextFrame, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); // y-Axis of second channel: if (Doc()->size()>1 && pFrame->ShowSecond()) { pDC->SetPen(scalePen2); // Find first y-axis tick: // Get y-value of bottomDist: double y2Bottom=(SPY2()-(WindowRect.height-bottomDist))/YZ2(); // Find next-higher integer multiple of barLengthY: int nextTickMult=(int)(y2Bottom/yScaled2); // nextTickMult is truncated; hence, negative and positive values // have to be treated separately: if (y2Bottom>0) { nextTickMult++; } // pixel position of this tick: double y2First=nextTickMult*yScaled2; int y2FirstTick=yFormat2(y2First); // How many times does the y-scale bar fit into the window? int y2ScaleInWindow = 1; if (barLengthY2 > 0) { y2ScaleInWindow = (y2FirstTick-topDist)/barLengthY2; } else { y2ScaleInWindow = (y2FirstTick-topDist)/1e-15; } // y-Axis ticks: for (int n_tick_y=0;n_tick_y<=y2ScaleInWindow;++n_tick_y) { pDC->DrawLine(leftDist*2-tickLength, y2FirstTick-n_tick_y*barLengthY2, leftDist*2, y2FirstTick-n_tick_y*barLengthY2); // Create a rectangle from the left window border to the tick: wxRect TextFrame2( wxPoint(0,y2FirstTick-n_tick_y*barLengthY2-(int)(10*printScale)), wxPoint(leftDist*2-tickLength-1,y2FirstTick-n_tick_y*barLengthY2+(int)(10*printScale)) ); // Draw Text: int y2=(int)(yScaled2*n_tick_y+y2First); wxString y2Label; y2Label << y2; pDC->SetTextForeground(*wxRED); pDC->DrawLabel(y2Label,TextFrame2,wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL); pDC->SetTextForeground(*wxBLACK); } // Write y units: // Length of y-axis: int y2Length=WindowRect.height-topDist-bottomDist; // position of vertical center: int v2Center=topDist+y2Length/2; wxRect TextFrame2( wxPoint(2+leftDist,v2Center-(int)(10*printScale)), wxPoint(leftDist*2-tickLength-1,v2Center+(int)(10*printScale)) ); pDC->SetTextForeground(*wxRED); pDC->DrawLabel( #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) Doc()->at(Doc()->GetSecChIndex()).GetYUnits(), #else wxString(Doc()->at(Doc()->GetSecChIndex()).GetYUnits().c_str(), wxConvUTF8), #endif TextFrame2, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL ); pDC->SetTextForeground(*wxBLACK); } // x-Axis ticks: // if x axis starts with the beginning of the trace, find first tick: int xFirstTick=leftDist; double xFirst=0.0; if (isSyncx) { // Find first x-axis tick: // Get x-value of leftDist: double xLeft=(leftDist-SPX())/XZ()*Doc()->GetXScale(); // Find next-higher integer multiple of barLengthX: int nextTickMult=(int)(xLeft/timeScaled); // nextTickMult is truncated; hence, negative and positive values // have to be treated separately: if (xLeft>0) { nextTickMult++; } // pixel position of this tick: xFirst=nextTickMult*timeScaled; double xFirstSamplingPoint=xFirst/Doc()->GetXScale(); // units of sampling points xFirstTick=xFormat(xFirstSamplingPoint); } // How many times does the x-scale bar fit into the window? int xScaleInWindow=(WindowRect.width-xFirstTick-rightDist)/barLength; pDC->SetPen(scalePen); for (int n_tick_x=0;n_tick_x<=xScaleInWindow;++n_tick_x) { pDC->DrawLine(xFirstTick+n_tick_x*barLength, WindowRect.height-bottomDist+tickLength, xFirstTick+n_tick_x*barLength, WindowRect.height-bottomDist); // Create a rectangle: wxRect TextFrame( wxPoint( xFirstTick+n_tick_x*barLength-(int)(40*printScale), WindowRect.height-bottomDist+tickLength ), wxPoint( xFirstTick+n_tick_x*barLength+(int)(40*printScale), WindowRect.height-bottomDist+tickLength+(int)(20*printScale) ) ); // Draw Text: int x=(int)(timeScaled*n_tick_x+xFirst); wxString xLabel; xLabel << x; pDC->DrawLabel(xLabel,TextFrame,wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); } // Draw x-units: // Length of x-axis: int xLength=WindowRect.width-leftDist-rightDist; // position of horizontal center: int hCenter=leftDist+xLength/2; wxRect xTextFrame( wxPoint( hCenter-(int)(40*printScale), WindowRect.height-bottomDist+tickLength+(int)(20*printScale) ), wxPoint( hCenter+(int)(40*printScale), WindowRect.height-bottomDist+tickLength+(int)(40*printScale) ) ); #if (wxCHECK_VERSION(2, 9, 0) || defined(MODULE_ONLY)) pDC->DrawLabel(Doc()->GetXUnits(),xTextFrame,wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); #else pDC->DrawLabel(wxString(Doc()->GetXUnits().c_str(), wxConvUTF8),xTextFrame,wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); #endif } } inline long wxStfGraph::xFormat(double toFormat) { return (int)(toFormat * XZ() + SPX()); } inline long wxStfGraph::xFormat(long toFormat) { return (long)(toFormat * XZ() + SPX()); } inline long wxStfGraph::xFormat(int toFormat) { return (long)(toFormat * XZ() + SPX()); } inline long wxStfGraph::xFormat(std::size_t toFormat) { return (long)(toFormat * XZ() + SPX()); } inline long wxStfGraph::yFormat(double toFormat) { return (long)(SPY() - toFormat * YZ()); } inline long wxStfGraph::yFormat(long toFormat) { return (long)(SPY() - toFormat * YZ()); } inline long wxStfGraph::yFormat(int toFormat) { return (long)(SPY() - toFormat * YZ()); } inline long wxStfGraph::yFormat2(double toFormat) { return (long)(SPY2() - toFormat * YZ2()); } inline long wxStfGraph::yFormat2(long toFormat){ return (long)(SPY2() - toFormat * YZ2()); } inline long wxStfGraph::yFormat2(int toFormat){ return (long)(SPY2() - toFormat * YZ2()); } inline long wxStfGraph::yFormatB(double toFormat) { return (long)(yzoombg.startPosY - toFormat * yzoombg.yZoom); } inline long wxStfGraph::yFormatB(long toFormat){ return (long)(yzoombg.startPosY - toFormat * yzoombg.yZoom); } inline long wxStfGraph::yFormatB(int toFormat){ return (long)(yzoombg.startPosY - toFormat * yzoombg.yZoom); } void wxStfGraph::FittorectY(YZoom& yzoom, const wxRect& rect, double min, double max, double screen_part) { yzoom.yZoom = (rect.height/fabs(max-min))*screen_part; yzoom.startPosY = (long)(((screen_part+1.0)/2.0)*rect.height + min * yzoom.yZoom); } void wxStfGraph::Fittowindow(bool refresh) { const double screen_part=0.5; //part of the window to be filled std::size_t points=Doc()->cursec().size(); if (points==0) { wxGetApp().ErrorMsg(wxT("Array of size zero in wxGraph::Fittowindow()")); return; } #if (__cplusplus < 201103) Vector_double::const_iterator max_el = std::max_element(Doc()->cursec().get().begin(), Doc()->cursec().get().end()); Vector_double::const_iterator min_el = std::min_element(Doc()->cursec().get().begin(), Doc()->cursec().get().end()); #else Vector_double::const_iterator max_el = std::max(Doc()->cursec().get().begin(), Doc()->cursec().get().end()); Vector_double::const_iterator min_el = std::min(Doc()->cursec().get().begin(), Doc()->cursec().get().end()); #endif double min = *min_el; if (min>1.0e12) min= 1.0e12; if (min<-1.0e12) min=-1.0e12; double max = *max_el; if (max>1.0e12) max= 1.0e12; if (max<-1.0e12) max=-1.0e12; wxRect WindowRect(GetRect()); switch (ParentFrame()->GetZoomQual()) { //Depending on the zoom radio buttons (Mouse field) //in the (trace navigator) control box case stf::zoomboth: if(!(Doc()->size()>1)) return; //Fit to window Ch2 FitToWindowSecCh(false); //Fit to window Ch1 XZW()=(double)WindowRect.width /points; SPXW()=0; FittorectY(Doc()->GetYZoomW(Doc()->GetCurChIndex()), WindowRect, min, max, screen_part); break; case stf::zoomch2: //ErrorMsg if no second channel available if(!(Doc()->size()>1)) return; //Fit to window Ch2 FitToWindowSecCh(false); break; default: //ErrorMsg if no second channel available // Invalidate(); //Fit to window Ch1 XZW()=(double)WindowRect.width /points; SPXW()=0; FittorectY(Doc()->GetYZoomW(Doc()->GetCurChIndex()), WindowRect, min, max, screen_part); break; } if (refresh) Refresh(); } void wxStfGraph::FitToWindowSecCh(bool refresh) { if (Doc()->size()>1) { //Get coordinates of the main window wxRect WindowRect(GetRect()); const double screen_part=0.5; //part of the window to be filled std::size_t secCh=Doc()->GetSecChIndex(); #undef min #undef max #if (__cplusplus < 201103) Vector_double::const_iterator max_el = std::max_element(Doc()->get()[secCh][Doc()->GetCurSecIndex()].get().begin(), Doc()->get()[secCh][Doc()->GetCurSecIndex()].get().end()); Vector_double::const_iterator min_el = std::min_element(Doc()->get()[secCh][Doc()->GetCurSecIndex()].get().begin(), Doc()->get()[secCh][Doc()->GetCurSecIndex()].get().end()); #else Vector_double::const_iterator max_el = std::max(Doc()->get()[secCh][Doc()->GetCurSecIndex()].get().begin(), Doc()->get()[secCh][Doc()->GetCurSecIndex()].get().end()); Vector_double::const_iterator min_el = std::min(Doc()->get()[secCh][Doc()->GetCurSecIndex()].get().begin(), Doc()->get()[secCh][Doc()->GetCurSecIndex()].get().end()); #endif double min=*min_el; double max=*max_el; FittorectY(Doc()->GetYZoomW(Doc()->GetSecChIndex()), WindowRect, min, max, screen_part); if (refresh) Refresh(); } } //End FitToWindowSecCh() void wxStfGraph::ChangeTrace(int trace) { stf::SectionAttributes sec_attr = Doc()->GetCurrentSectionAttributes(); if (!sec_attr.eventList.empty() && trace != Doc()->GetCurSecIndex()) { for (event_it it2 = sec_attr.eventList.begin(); it2 != sec_attr.eventList.end(); ++it2) { it2->GetCheckBox()->Show(false); } } Doc()->SetSection(trace); wxGetApp().OnPeakcalcexecMsg(); pFrame->SetCurTrace(trace); Refresh(); } void wxStfGraph::OnPrevious() { if (Doc()->get()[Doc()->GetCurChIndex()].size()==1) return; std::size_t curSection=Doc()->GetCurSecIndex(); if (Doc()->GetCurSecIndex() > 0) curSection--; else curSection=Doc()->get()[Doc()->GetCurChIndex()].size()-1; ChangeTrace(curSection); } void wxStfGraph::OnFirst() { if (Doc()->GetCurSecIndex()==0) return; ChangeTrace(0); } void wxStfGraph::OnLast() { if (Doc()->GetCurSecIndex()==Doc()->get()[Doc()->GetCurChIndex()].size()-1) return; std::size_t curSection=Doc()->get()[Doc()->GetCurChIndex()].size()-1; ChangeTrace(curSection); } void wxStfGraph::OnNext() { if (Doc()->get()[Doc()->GetCurChIndex()].size()==1) return; std::size_t curSection=Doc()->GetCurSecIndex(); if (curSection < Doc()->get()[Doc()->GetCurChIndex()].size()-1) curSection++; else curSection=0; ChangeTrace(curSection); } void wxStfGraph::OnUp() { switch (ParentFrame()->GetZoomQual()) { //Depending on the zoom radio buttons (Mouse field) //in the (trace navigator) control box case stf::zoomboth: //ErrorMsg if no second channel available //yZooms of Ch1 are performed keeping the base constant SPYW()=SPY() - 20; if(!(Doc()->size()>1)) break; //Ymove of Ch2 is performed SPY2W()=SPY2() - 20; break; case stf::zoomch2: if(!(Doc()->size()>1)) break; //Ymove of Ch2 is performed SPY2W()=SPY2() - 20; break; default: //Ymove of Ch1 is performed SPYW()=SPY() - 20; break; } Refresh(); } void wxStfGraph::OnDown() { switch (ParentFrame()->GetZoomQual()) { //Depending on the zoom radio buttons (Mouse field) //in the (trace navigator) control box case stf::zoomboth: //yZooms of Ch1 are performed keeping the base constant SPYW()=SPY() + 20; if(!(Doc()->size()>1)) break; //Ymove of Ch2 is performed SPY2W()=SPY2() + 20; break; case stf::zoomch2: if(!(Doc()->size()>1)) break; //Ymove of Ch2 is performed SPY2W()=SPY2() + 20; break; default: //Ymove of Ch1 is performed SPYW()=SPY() + 20; break; } Refresh(); } void wxStfGraph::ChanScroll(int direction) { /* on Control + cursor press, adjust the active channel up or down. */ // direction is either +1, or -1 int ref_chan = Doc()->GetSecChIndex(); int new_chan = Doc()->GetCurChIndex() + direction; int last_chan = Doc()->size()-1; // Exit early if there is only one channel if (Doc()->size() == 1) { return; } /*Rollover conditions ------------------- I ended up resorting to ternery operators because I need to check both that we haven't gone over the document range and that we aren't hitting the reference channel */ if (new_chan == ref_chan) { // Skip the reference channel new_chan += direction; // move one unit past the ref channel. } if (new_chan > last_chan) { // Rollover to start if channel out of range // making sure to skip the reference channel new_chan = (ref_chan == 0)? 1 : 0; } else if (new_chan < 0) { // Rollover to end if channel out of range // making sure to skip the reference channel new_chan = (ref_chan == last_chan)? last_chan-1 : last_chan; } /*Update the window ----------------- */ // Pointer to wxStfChildFrame to access Channel selection combo wxStfChildFrame* pFrame = (wxStfChildFrame*)Doc()->GetDocumentWindow(); if (!pFrame) { return; } // set the channel selection combo //pFrame->SetChannels( actDoc()->GetCurChIndex(), actDoc()->GetSecChIndex()); pFrame->SetChannels(new_chan, ref_chan); pFrame->UpdateChannels(); // update according to the combo Refresh(); } void wxStfGraph::OnRight() { SPXW()=SPX() + 20; Refresh(); } void wxStfGraph::OnLeft() { SPXW()=SPX() - 20; Refresh(); } void wxStfGraph::OnXenlhi() { ChangeXScale(2.0); } void wxStfGraph::OnXenllo() { ChangeXScale(1.1); } void wxStfGraph::OnXshrinklo() { ChangeXScale(1.0/1.1); } void wxStfGraph::OnXshrinkhi() { ChangeXScale(0.5); } void wxStfGraph::ChangeXScale(double factor) { wxRect WindowRect(GetRect()); //point in the middle: double middle=(WindowRect.width/2.0 - SPX()) / XZ(); //new setting for xZoom XZW()=XZ() * factor; //calculation of new start position SPXW()=(int)(WindowRect.width/2.0 - middle * XZ()); Refresh(); } void wxStfGraph::OnYenlhi() { ChangeYScale(2.0); } void wxStfGraph::OnYenllo() { ChangeYScale(1.1); } void wxStfGraph::OnYshrinklo() { ChangeYScale(1/1.1); } void wxStfGraph::OnYshrinkhi() { ChangeYScale(0.5); } void wxStfGraph::ChangeYScale(double factor) { switch (ParentFrame()->GetZoomQual()) { // Depending on the zoom radio buttons (Mouse field) // in the (trace navigator) control box case stf::zoomboth: //yZooms of Ch1 are performed keeping the base constant SPYW()=(int)(SPY() + Doc()->GetBase() * (YZ() * factor - YZ())); YZW()=YZ() * factor; //ErrorMsg if no second channel available if (Doc()->size()<=1) break; //yZooms of Ch2 are performed keeping the base constant SPY2W()=(int)(SPY2() + Doc()->GetBase() * (YZ2() * factor - YZ2())); YZ2W()=YZ2() * factor; break; case stf::zoomch2: if (Doc()->size()<=1) break; //yZooms of Ch2 are performed keeping the base constant SPY2W()=(int)(SPY2() + Doc()->GetBase() * (YZ2() * factor - YZ2())); YZ2W()=YZ2() * factor; break; default: //yZooms of Ch1 are performed keeping the base constant SPYW()=(int)(SPY() + Doc()->GetBase() * (YZ() * factor - YZ())); YZW()=YZ() * factor; break; } Refresh(); } void wxStfGraph::Ch2base() { if ((Doc()->size()>1)) { double base2=0.0; try { double var2=0.0; base2=stfnum::base(Doc()->GetBaselineMethod(),var2,Doc()->get()[Doc()->GetSecChIndex()][Doc()->GetCurSecIndex()].get(), Doc()->GetBaseBeg(),Doc()->GetBaseEnd()); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal ) ); return; } double base1=Doc()->GetBase(); int base1_onScreen=yFormat(base1); // Adjust startPosY2 so that base2 is the same as base1 on the screen; // i.e. yFormat2(base2) == yFormat(base1) // this is what yFormat2(toFormat) does: // return (int)(zoom.startPosY2 - toFormat * zoom.yZoom2); // Solved for startPosY2, this gets: SPY2W()=(int)(base1_onScreen+base2*YZ2()); Refresh(); } } void wxStfGraph::Ch2pos() { if ((Doc()->size()>1)) { SPY2W()=SPY(); Refresh(); } } void wxStfGraph::Ch2zoom() { if ((Doc()->size()>1)) { YZ2W()=YZ(); Refresh(); } } void wxStfGraph::Ch2basezoom() { if ((Doc()->size()>1)) { // Adjust y-scale without refreshing: YZ2W()=YZ(); // Adjust baseline: double base2=0.0; try { double var2=0.0; base2=stfnum::base(Doc()->GetBaselineMethod(),var2,Doc()->get()[Doc()->GetSecChIndex()][Doc()->GetCurSecIndex()].get(), Doc()->GetBaseBeg(),Doc()->GetBaseEnd()); } catch (const std::out_of_range& e) { wxGetApp().ExceptMsg( wxString( e.what(), wxConvLocal ) ); return; } double base1=Doc()->GetBase(); int base1_onScreen=yFormat(base1); // Adjust startPosY2 so that base2 is the same as base1 on the screen; // i.e. yFormat2(base2) == yFormat(base1) // this is what yFormat2(toFormat) does: // return (int)(zoom.startPosY2 - toFormat * zoom.yZoom2); // Solved for startPosY2, this gets: SPY2W()=(int)(base1_onScreen+base2*YZ2()); Refresh(); } } void wxStfGraph::set_isPrinted(bool value) { if (value==false) { printScale=1.0; no_gimmicks=false; } else { #if defined __WXGTK__ || defined __APPLE__ printScale=0.25; #endif // store zoom settings upon switching from normal to print view: if (isPrinted==false) { // zoomOld=zoom; } } isPrinted=value; } stimfit-0.15.8/src/stimfit/gui/table.h0000775000175000017500000000501213062445067014511 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file table.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfTable. Derived from wxGridTableBase. */ #ifndef _TABLE_H #define _TABLE_H #include "../stf.h" /*! \addtogroup wxstf * @{ */ //! Adapts stfnum::Table to be used by wxStfGrid class wxStfTable : public wxGridTableBase { public: //! Constructor /*! \param table_ The associated stfnum::Table */ wxStfTable(const stfnum::Table& table_) : table(table_) {} //! Get the number of rows. /*! \return The number of rows. */ virtual int GetNumberRows() {return (int)table.nRows()+1;} //! Get the number of columns. /*! \return The number of columns. */ virtual int GetNumberCols() {return (int)table.nCols()+1;} //! Check whether a cell is empty. /*! \param row The row number of the cell. * \param col The column number of the cell. * \return true if the cell is empty, false otherwise. */ virtual bool IsEmptyCell(int row,int col); //! Retrieve a cell entry. /*! \param row The row number of the cell. * \param col The column number of the cell. * \return The cell entry as a string. */ virtual wxString GetValue( int row, int col ); //! Set a cell entry. /*! \param row The row number of the cell. * \param col The column number of the cell. * \param value The new cell entry. */ virtual void SetValue( int row, int col, const wxString& value ); //! Retrieve values from selected cells. /*! \param selection The selected cells. * \return The selection as a single string. */ wxString GetSelection(const wxGridCellCoordsArray& selection); private: stfnum::Table table; }; /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/app.cpp0000775000175000017500000015503013315356003014533 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // app.cpp // The application, derived from wxApp // 2007-12-27, Christoph Schmidt-Hieber, University of Freiburg #include // For compilers that support precompilation, includes "wx/wx.h". #include #include #include #include #include #include #include #include #include #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #if !wxUSE_DOC_VIEW_ARCHITECTURE #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! #endif #if !wxUSE_MDI_ARCHITECTURE #error You must set wxUSE_MDI_ARCHITECTURE to 1 in setup.h! #endif #include "../../../stfconf.h" #include "./app.h" #include "./doc.h" #include "./view.h" #include "./parentframe.h" #include "./childframe.h" #include "./graph.h" #include "./dlgs/cursorsdlg.h" #include "./dlgs/smalldlgs.h" #include "./../../libstfnum/funclib.h" #include "./../../libstfnum/fit.h" #if defined(__WXGTK__) || defined(__WXMAC__) #if !defined(__MINGW32__) #include "./../../libstfio/abf/axon/Common/axodefn.h" #include "./../../libstfio/abf/axon/AxAbfFio32/abffiles.h" #endif #endif extern wxStfApp& wxGetApp(); wxStfApp& wxGetApp() { return *static_cast(wxApp::GetInstance()); } wxStfParentFrame *frame = (wxStfParentFrame *) NULL; BEGIN_EVENT_TABLE( wxStfApp, wxApp ) EVT_KEY_DOWN( wxStfApp::OnKeyDown ) EVT_MENU( ID_CURSORS, wxStfApp::OnCursorSettings ) EVT_MENU( ID_NEWFROMSELECTED, wxStfApp::OnNewfromselected ) EVT_MENU( ID_NEWFROMALL, wxStfApp::OnNewfromall ) EVT_MENU( ID_APPLYTOALL, wxStfApp::OnApplytoall ) #ifdef WITH_PYTHON EVT_MENU( ID_IMPORTPYTHON, wxStfApp::OnPythonImport ) EVT_MENU_RANGE(ID_USERDEF, ID_USERDEF+32, wxStfApp::OnUserdef) #endif END_EVENT_TABLE() wxStfApp::wxStfApp(void) : directTxtImport(false), isBars(true), txtImport(), funcLib(), #ifdef WITH_PYTHON extensionLib(), #endif CursorsDialog(NULL), storedLinFunc( stfnum::initLinFunc() ), /*m_file_menu(0),*/ m_fileToLoad(wxEmptyString), mrActiveDoc(0) {} void wxStfApp::OnInitCmdLine(wxCmdLineParser& parser) { wxApp::OnInitCmdLine(parser); parser.AddOption(wxT("d"), wxT("dir"), wxT("Working directory to change to"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL ); parser.AddParam(wxT("File to open"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL ); } bool wxStfApp::OnCmdLineParsed(wxCmdLineParser& parser) { // Check if we should change the working directory: wxString new_cwd( wxT("\0") ); if ( parser.Found( wxT("dir"), &new_cwd ) ) { // Check whether the directory exists: if ( !wxDirExists( new_cwd ) ) { wxString msg; msg << wxT("New working directory ") << new_cwd << wxT(" doesn't exist."); ErrorMsg( msg ); return false; } // Change to the new wd: if ( !wxSetWorkingDirectory( new_cwd ) ) { wxString msg; msg << wxT("Couldn't change working directory to ") << new_cwd; ErrorMsg( msg ); return false; } } // Get file to load if ( parser.GetParamCount() > 0 ) { m_fileToLoad = parser.GetParam(); } return wxApp::OnCmdLineParsed(parser); } bool wxStfApp::OnInit(void) { if (!wxApp::OnInit()) { std::cerr << "Could not start application" << std::endl; return false; } #ifdef WITH_PYTHON if ( !Init_wxPython() ) { // don't start the app if we can't initialize wxPython. wxString msg; msg << wxT("Could not start wxPython"); ErrorMsg( msg ); return false; } // Load Python extensions before creation of wxMenuBar ( see later CreateUnifiedMenuBar() ) #if PY_MAJOR_VERSION < 3 extensionLib = LoadExtensions(); #ifdef _STFDEBUG std::cout << (int) GetExtensionLib().size() << " Python extension/s loaded"<< std::endl; #endif #endif #endif //WITH_PTYHON // Config: config.reset(new wxFileConfig(wxT("Stimfit"))); //// Create a document manager wxDocManager* docManager = new wxDocManager; //// Create a template relating drawing documents to their views #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) m_biosigTemplate=new wxDocTemplate( docManager, wxT("All files"), wxT("*.*"), wxT(""), wxT(""), wxT("Biosig Document"), wxT("Biosig View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); #endif #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) m_biosigTemplate=new wxDocTemplate( docManager, # if (BIOSIG_VERSION < 10800) wxT("Biosig files"), wxT("*.dat;*.cfs;*.gdf;*.ibw"), wxT(""), wxT(""), # else wxT("Biosig files"), wxT("*.dat;*.cfs;*.gdf;*.ibw;*.wcp"), wxT(""), wxT(""), # endif wxT("Biosig Document"), wxT("Biosig View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); #endif m_cfsTemplate=new wxDocTemplate( docManager, wxT("CED filing system"), wxT("*.dat;*.cfs"), wxT(""), wxT("dat;cfs"), wxT("CFS Document"), wxT("CFS View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); m_hdf5Template=new wxDocTemplate( docManager, wxT("hdf5 file"), wxT("*.h5"), wxT(""), wxT("h5"), wxT("HDF5 Document"), wxT("HDF5 View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); m_abfTemplate=new wxDocTemplate( docManager, wxT("Axon binary file"), wxT("*.abf"), wxT(""), wxT("abf"), wxT("ABF Document"), wxT("ABF View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); #if defined(__WXGTK__) || defined(__WXMAC__) #if !defined(__MINGW32__) #if !defined(WITHOUT_ABF) ABF_Initialize(); #endif #endif #endif m_atfTemplate=new wxDocTemplate( docManager, wxT("Axon text file"), wxT("*.atf"), wxT(""), wxT("atf"), wxT("ATF Document"), wxT("ATF View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); m_axgTemplate=new wxDocTemplate( docManager, wxT("Axograph binary file"), wxT("*.axgd;*.axgx"), wxT(""), wxT("axgd;axgx"), wxT("AXG Document"), wxT("AXG View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); m_hekaTemplate=new wxDocTemplate( docManager, wxT("HEKA file"), wxT("*.dat"), wxT(""), wxT("dat"), wxT("HEKA Document"), wxT("HEKA View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); m_intanTemplate=new wxDocTemplate( docManager, wxT("Intan CLAMP file"), wxT("*.clp"), wxT(""), wxT("clp"), wxT("Intan CLAMP Document"), wxT("Intan View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); m_tdmsTemplate=new wxDocTemplate( docManager, wxT("Mantis TDMS file"), wxT("*.tdms"), wxT(""), wxT("tdms"), wxT("Mantis TDMS Document"), wxT("TDMS View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); #if 0 m_sonTemplate=new wxDocTemplate( docManager, wxT("CED Spike 2 (SON) file"), wxT("*.smr"), wxT(""), wxT(""), wxT("SON Document"), wxT("SON View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); #endif m_txtTemplate=new wxDocTemplate( docManager, wxT("General text file import"), wxT("*.*"), wxT(""), wxT(""), wxT("Text Document"), wxT("Text View"), CLASSINFO(wxStfDoc), CLASSINFO(wxStfView) ); // read last directory from config: wxString lastDir = wxGetProfileString( wxT("Settings"), wxT("Last directory"), wxT("") ); if (lastDir == wxT("") || !wxFileName::DirExists( lastDir )) { lastDir = wxFileName::GetCwd(); } docManager->SetLastDirectory( lastDir ); //// Create the main frame window frame = new wxStfParentFrame(docManager, (wxFrame *)NULL, wxT("Stimfit"), wxDefaultPosition, #ifndef __WXMAC__ wxSize(1024, 768), #else wxSize(640, 480), #endif wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE | wxMAXIMIZE); #if 0 frame->SetIcon( wxICON(sample) ); #endif // frame->SetIcon(wxIcon(wxT("doc.xbm"))); #ifndef __WXGTK__ //// Make a menubar wxMenu* m_file_menu = new wxMenu; // wxMenu *edit_menu = (wxMenu *) NULL; m_file_menu->Append(wxID_OPEN); m_file_menu->AppendSeparator(); m_file_menu->Append(ID_CONVERT, wxT("Convert file series...")); #ifdef WITH_PYTHON m_file_menu->AppendSeparator(); m_file_menu->Append( ID_IMPORTPYTHON, wxT("&Import Python module...\tCtrl+I"), wxT("Import or reload user-defined Python modules") ); #endif // WITH_PYTHON m_file_menu->AppendSeparator(); m_file_menu->Append(wxID_EXIT); // A nice touch: a history of files visited. Use this menu. GetDocManager()->FileHistoryLoad( *config ); GetDocManager()->FileHistoryUseMenu(m_file_menu); #if (wxCHECK_VERSION(2, 9, 0)) GetDocManager()->FileHistoryAddFilesToMenu(m_file_menu); #else GetDocManager()->FileHistoryAddFilesToMenu(); #endif wxMenu *help_menu = new wxMenu; help_menu->Append(wxID_HELP); help_menu->Append(ID_UPDATE, wxT("&Check for updates")); help_menu->Append(wxID_ABOUT); wxMenu *m_view_menu = new wxMenu; #ifdef WITH_PYTHON m_file_menu->AppendSeparator(); m_view_menu->Append(ID_VIEW_SHELL, wxT("&Toggle Python shell"), wxT("Shows or hides the Python shell")); #endif // WITH_PYTHON wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(m_file_menu, wxT("&File")); /* if (edit_menu) menu_bar->Append(edit_menu, wxT("&Edit")); */ menu_bar->Append(m_view_menu, wxT("&View")); menu_bar->Append(help_menu, wxT("&Help")); #ifdef __WXMAC__ // wxApp::SetExitOnFrameDelete(false); wxMenuBar::MacSetCommonMenuBar(menu_bar); #endif #else // __WXGTK__ wxMenuBar* menu_bar = CreateUnifiedMenuBar(); #endif //__WXGTK__ frame->SetMenuBar(menu_bar); frame->Centre(wxBOTH); /* pStatusBar = new wxStatusBar(frame); frame->SetStatusBar(pStatusBar); */ #if 1 //ndef __WXMAC__ frame->Show(true); #endif //ndef __WXMAC__ // check for updates in background: #ifndef __WXMAC__ frame->CheckUpdate(); #endif // load user-defined plugins: // pluginLib = stf::GetPluginLib(); //#ifdef WITH_PYTHON // extensionLib = LoadExtensions(); // std::cout << "DEBUG: wxStfApp extensionLib size is " << GetExtensionLib().size() << std::endl; //#endif // load fit function library: funcLib = stfnum::GetFuncLib(); SetTopWindow(frame); if (!m_fileToLoad.empty()) { wxDocTemplate* templ=GetDocManager()->FindTemplateForPath(m_fileToLoad); wxStfDoc* NewDoc=(wxStfDoc*)templ->CreateDocument(m_fileToLoad,wxDOC_NEW); NewDoc->SetDocumentTemplate(templ); if (!NewDoc->OnOpenDocument(m_fileToLoad)) { ErrorMsg(wxT("Couldn't open file, aborting file import")); GetDocManager()->CloseDocument(NewDoc); return false; } } return true; } int wxStfApp::OnExit() { #if wxUSE_CONFIG GetDocManager()->FileHistorySave(*config); #endif // wxUSE_CONFIG delete GetDocManager(); #ifdef WITH_PYTHON Exit_wxPython(); #endif return wxApp::OnExit(); } // "Fake" registry void wxStfApp::wxWriteProfileInt(const wxString& main, const wxString& sub, int value) const { // create a wxConfig-compatible path: wxString path=wxT("/")+main+wxT("/")+sub; if (!config->Write(path,(long)value)) { ErrorMsg(wxT("Couldn't write application settings")); return; } config->Flush(); } int wxStfApp::wxGetProfileInt(const wxString& main,const wxString& sub, int default_) const { wxString path=wxT("/")+main+wxT("/")+sub; return config->Read(path,default_); } void wxStfApp::wxWriteProfileString( const wxString& main, const wxString& sub, const wxString& value ) const { // create a wxConfig-compatible path: wxString path=wxT("/")+main+wxT("/")+sub; if (!config->Write(path,value)) { ErrorMsg(wxT("Couldn't write application settings")); return; } config->Flush(); } wxString wxStfApp::wxGetProfileString( const wxString& main, const wxString& sub, const wxString& default_) const { wxString path=wxT("/")+main+wxT("/")+sub; return config->Read(path,default_); } void wxStfApp::OnPeakcalcexecMsg(wxStfDoc* actDoc) { if (actDoc==0) { actDoc = GetActiveDoc(); if (!actDoc) return; } if (!actDoc->IsInitialized()) { ErrorMsg(wxT("Uninitialized file in wxStfApp::OnPeakcalcexecMsg()")); return; } #ifdef __WXMAC__ wxStfView* actView = (wxStfView*)actDoc->GetFirstView(); #else wxStfView* actView = GetActiveView(); #endif if (actView!=NULL) { wxStfGraph* pGraph = actView->GetGraph(); if (pGraph != NULL) pGraph->Refresh(); else return; } if (CursorsDialog != NULL && CursorsDialog->IsShown() && actView!=NULL && actDoc!=NULL && actDoc->IsInitialized()) { CursorsDialog->SetActiveDoc(actDoc); switch (CursorsDialog->CurrentCursor()) { case stf::measure_cursor: actDoc->SetMeasCursor(CursorsDialog->GetCursorM());// * GetDocument()->GetSR())); wxWriteProfileInt(wxT("Settings"), wxT("MeasureCursor"), CursorsDialog->GetCursorM() ); actDoc->SetMeasRuler( CursorsDialog->GetRuler() ); wxWriteProfileInt(wxT("Settings"), wxT("ShowRuler"), CursorsDialog->GetRuler() ); break; //Get limits for peak calculation from the dialog box: case stf::peak_cursor: actDoc->SetPeakBeg(CursorsDialog->GetCursor1P());// * GetDocument()->GetSR())); actDoc->SetPeakEnd(CursorsDialog->GetCursor2P());// * GetDocument()->GetSR())); actDoc->CheckBoundaries(); break; case stf::base_cursor: wxWriteProfileInt(wxT("Settings"), wxT("BaselineMethod"), CursorsDialog->GetBaselineMethod()); actDoc->SetBaseBeg(CursorsDialog->GetCursor1B()); actDoc->SetBaseEnd(CursorsDialog->GetCursor2B()); actDoc->SetBaselineMethod(CursorsDialog->GetBaselineMethod()); break; case stf::decay_cursor: actDoc->SetFitBeg(CursorsDialog->GetCursor1D()); actDoc->SetFitEnd(CursorsDialog->GetCursor2D()); break; case stf::latency_cursor: // Use peak cursors for latency? // actDoc->SetLatencyWindowMode(CursorsDialog->UsePeak4Latency() ); // wxWriteProfileInt(wxT("Settings"), wxT("LatencyWindowMode"), CursorsDialog->UsePeak4Latency() ); // Latency start mode actDoc->SetLatencyBeg(CursorsDialog->GetCursor1L()); // set latency mode in wxStfDoc actDoc->SetLatencyStartMode(CursorsDialog->GetLatencyStartMode() ); // write latency start mode in Stimfit Profile wxWriteProfileInt(wxT("Settings"), wxT("LatencyStartMode"), CursorsDialog->GetLatencyStartMode() ); if (CursorsDialog->GetLatencyStartMode() == stf::manualMode) wxWriteProfileInt(wxT("Settings"), wxT("LatencyStartCursor"), CursorsDialog->GetCursor1L() ); // Latency end mode actDoc->SetLatencyEnd(CursorsDialog->GetCursor2L()); actDoc->SetLatencyEndMode(CursorsDialog->GetLatencyEndMode() ); wxWriteProfileInt(wxT("Settings"), wxT("LatencyEndMode"), CursorsDialog->GetLatencyEndMode() ); if (CursorsDialog->GetLatencyEndMode() == stf::manualMode) wxWriteProfileInt(wxT("Settings"), wxT("LatencyEndCursor"), CursorsDialog->GetCursor2L() ); break; #ifdef WITH_PSLOPE case stf::pslope_cursor: // first PSlope cursor actDoc->SetPSlopeBegMode( CursorsDialog->GetPSlopeBegMode() ); wxWriteProfileInt(wxT("Settings"), wxT("PSlopeStartMode"), CursorsDialog->GetPSlopeBegMode() ); if (actDoc->GetPSlopeBegMode() == stf::psBeg_manualMode) actDoc->SetPSlopeBeg( CursorsDialog->GetCursor1PS() ); //wxWriteProfileInt(wxT("Settings"), wxT("PSlopeStartCursor"), CursorsDialog->GetCursor1PS() ); // second PSlope cursor actDoc->SetPSlopeEndMode( CursorsDialog->GetPSlopeEndMode() ); if (actDoc->GetPSlopeEndMode() == stf::psEnd_manualMode) actDoc->SetPSlopeEnd( CursorsDialog->GetCursor2PS() ); // we take data from CursorsDialog only if we need the DeltaT //else if (actDoc->GetPSlopeEndMode() == stf::psEnd_DeltaTMode){ actDoc->SetDeltaT(CursorsDialog->GetDeltaT()); break; #endif case stf::undefined_cursor: ErrorMsg(wxT("Undefined cursor in wxStfApp::OnPeakcalcexecMsg()")); return; default: break; } wxWriteProfileInt(wxT("Settings"), wxT("PeakAtEnd"), CursorsDialog->GetPeakAtEnd() ); //Update edit peak limits in the peak calculation dialog box if (CursorsDialog->GetPeakAtEnd()) { //If 'Upper limit at end of trace' is selected in the dialog box //Set upper limit to end of trace actDoc->SetPeakEnd((int)actDoc->cursec().size()-1); try { CursorsDialog->UpdateCursors(); } catch (const std::runtime_error& e) { ExceptMsg(wxString(e.what(), wxConvLocal)); return; } actDoc->SetPeakAtEnd(true); } else { actDoc->SetPeakAtEnd(false); } // Get number of peak points from the dialog box... actDoc->SetPM(CursorsDialog->GetPeakPoints()); wxWriteProfileInt(wxT("Settings"),wxT("PeakMean"),(int)actDoc->GetPM()); // Get direction from the dialog box actDoc->SetDirection(CursorsDialog->GetDirection()); wxWriteProfileInt(wxT("Settings"),wxT("Direction"), CursorsDialog->GetDirection()); // Get reference for AP kinetics from the dialog box actDoc->SetFromBase(CursorsDialog->GetFromBase()); wxWriteProfileInt(wxT("Settings"),wxT("FromBase"), CursorsDialog->GetFromBase()); // Get factor for rise time calculation actDoc->SetRTFactor(CursorsDialog->GetRTFactor()); wxWriteProfileInt(wxT("Settings"),wxT("RTFactor"), CursorsDialog->GetRTFactor()); // Get slope for threshold: actDoc->SetSlopeForThreshold( CursorsDialog->GetSlope() ); wxString wxsSlope; wxsSlope << CursorsDialog->GetSlope(); wxWriteProfileString(wxT("Settings"), wxT("Slope"), wxsSlope); wxWriteProfileInt(wxT("Settings"), wxT("StartFitAtPeak"), CursorsDialog->GetStartFitAtPeak() ); //Update start fit at peak if ( CursorsDialog->GetStartFitAtPeak() ) { actDoc->SetFitBeg( actDoc->GetMaxT() ); actDoc->SetStartFitAtPeak(true); try { CursorsDialog->UpdateCursors(); } catch (const std::runtime_error& e) { ExceptMsg(wxString( e.what(), wxConvLocal )); return; } } else { actDoc->SetStartFitAtPeak(false); } } // Calculate peak, base, Lo/Hi rise time, half duration, // ratio of rise/slope, maximum slope and geometrical slope (PSlope). try { if (actDoc != NULL) { actDoc->Measure( ); } } catch (const std::out_of_range& e) { ExceptMsg(wxString( e.what(), wxConvLocal )); } /* // Set fit start cursor to new peak if necessary. //std::cout << CursorsDialog->GetPeakAtEnd() << std::endl; //wxWriteProfileInt(wxT("Settings"), wxT("StartFitAtPeak"), CursorsDialog->GetStartFitAtPeak() ); if (actDoc != NULL && CursorsDialog != NULL && CursorsDialog->GetStartFitAtPeak()) //if ( CursorsDialog->GetStartFitAtPeak() ) { //actDoc->SetFitBeg(actDoc->GetMaxT()); actDoc->SetStartFitAtPeak( true ); //try { // CursorsDialog->UpdateCursors(); //} //catch (const std::runtime_error& e) { // ExceptMsg(wxString( e.what(), wxConvLocal )); // return; //} } else { actDoc->SetStartFitAtPeak( true ); } */ // Updates strings in the result box if (actView != NULL) { wxStfChildFrame* pChild=(wxStfChildFrame*)actView->GetFrame(); if (pChild != NULL) pChild->UpdateResults(); wxStfGraph* pGraph = actView->GetGraph(); if (pGraph != NULL) pGraph->SetFocus(); } } wxMenuBar *wxStfApp::CreateUnifiedMenuBar(wxStfDoc* doc) { //// Make a menubar wxMenu *file_menu = new wxMenu; file_menu->Append(wxID_OPEN); file_menu->Append(wxID_CLOSE); // file_menu->Append(wxID_SAVE, wxT("&Save")); file_menu->Append(wxID_SAVEAS); //#ifdef _WINDOWS file_menu->AppendSeparator(); file_menu->Append(ID_CONVERT, wxT("&Convert file series...")); //#endif file_menu->AppendSeparator(); file_menu->Append(ID_FILEINFO, wxT("File information...")); file_menu->AppendSeparator(); file_menu->Append(ID_MPL, wxT("Create &figure...")); file_menu->Append(ID_PRINT_PRINT, wxT("&Print...")); file_menu->Append(ID_PRINT_PAGE_SETUP, wxT("Print &Setup...")); #ifdef WITH_PYTHON file_menu->AppendSeparator(); file_menu->Append( ID_IMPORTPYTHON, wxT("&Import Python module...\tCtrl+I"), wxT("Import or reload user-defined Python modules") ); #endif // WITH_PYTHON file_menu->AppendSeparator(); file_menu->Append(wxID_EXIT); #if !defined __WXGTK__ && (wxCHECK_VERSION(2, 9, 0)) ((wxStfDoc*)doc)->SetFileMenu( file_menu ); #else GetDocManager()->FileHistoryLoad( *config ); #endif GetDocManager()->FileHistoryUseMenu(file_menu); #if (wxCHECK_VERSION(2, 9, 0)) GetDocManager()->FileHistoryAddFilesToMenu(file_menu); #else GetDocManager()->FileHistoryAddFilesToMenu(); #endif wxMenu* m_edit_menu=new wxMenu; m_edit_menu->Append( ID_CURSORS, wxT("&Cursor settings...\tCtrl+R"), wxT("Set cursor position, direction, etc.") ); m_edit_menu->AppendSeparator(); m_edit_menu->Append( ID_MYSELECTALL, wxT("&Select all traces\tCtrl+A"), wxT("Select all traces in this file") ); m_edit_menu->Append( ID_SELECTSOME, wxT("S&elect some traces..."), wxT("Select every n-th trace in this file") ); m_edit_menu->Append( ID_SELECT_AND_ADD, wxT("Se&lect and add traces of type ..."), wxT("Traces of a certain type are added to the select") ); m_edit_menu->Append( ID_UNSELECTALL, wxT("&Unselect all traces\tCtrl+U"), wxT("Unselect all traces in this file") ); m_edit_menu->Append( ID_UNSELECTSOME, wxT("U&nselect some traces"), wxT("Unselect some traces in this file") ); m_edit_menu->Append( ID_SELECT_AND_REMOVE, wxT("Unse&lect traces of type ..."), wxT("Traces of a certain type are removed from the selection") ); wxMenu *editSub=new wxMenu; editSub->Append( ID_NEWFROMSELECTEDTHIS, wxT("&selected traces from this file"), wxT("Create a new window showing all selected traces from this file") ); editSub->Append( ID_NEWFROMSELECTED, wxT("&selected traces from all files"), wxT("Create a new window showing all selected traces from all files") ); editSub->Append(ID_NEWFROMALL, wxT("&all traces from all files"), wxT("Create a new window showing all traces from all files") ); m_edit_menu->AppendSeparator(); m_edit_menu->AppendSubMenu(editSub,wxT("New window with...")); m_edit_menu->Append( ID_CONCATENATE_MULTICHANNEL, wxT("&Concatenate selected sweeps (multiple channels)"), wxT("Create one large sweep by merging selected sweeps in this file") ); wxMenu* m_view_menu = new wxMenu; m_view_menu->Append( ID_VIEW_RESULTS, wxT("&Results..."), wxT("Select analysis results to be shown in the results table") ); m_view_menu->Append( ID_APPLYTOALL, wxT("&Apply scaling to all windows"), wxT("Apply this trace's scaling to all other windows") ); m_view_menu->AppendCheckItem( ID_SCALE, wxT("&View scale bars"), wxT("If checked, use scale bars rather than coordinates") ); m_view_menu->AppendSeparator(); m_view_menu->Append(ID_SAVEPERSPECTIVE,wxT("&Save window positions")); m_view_menu->Append(ID_LOADPERSPECTIVE,wxT("&Load window positions")); m_view_menu->Append(ID_RESTOREPERSPECTIVE,wxT("&Restore default window positions")); #ifdef WITH_PYTHON m_view_menu->AppendSeparator(); m_view_menu->Append(ID_VIEW_SHELL, wxT("&Toggle Python shell"), wxT("Shows or hides the Python shell")); #endif // WITH_PYTHON wxMenu* ch2Sub=new wxMenu; ch2Sub->Append(ID_CH2BASE, wxT("Match &baseline")); ch2Sub->Append(ID_CH2POS, wxT("Match &abs. position")); ch2Sub->Append(ID_CH2ZOOM, wxT("Match &y-scale")); ch2Sub->Append(ID_CH2BASEZOOM, wxT("Match baseline a&nd y-scale")); m_view_menu->AppendSeparator(); m_view_menu->AppendSubMenu(ch2Sub, wxT("&Channel 2 scaling")); m_view_menu->Append(ID_SWAPCHANNELS, wxT("&Swap channels")); wxMenu *analysis_menu = new wxMenu; wxMenu *fitSub = new wxMenu; fitSub->Append( ID_FIT, wxT("&Nonlinear regression...\tCtrl+N"), wxT("Fit a function to this trace between fit cursors") ); fitSub->Append( ID_LFIT, wxT("&Linear fit..."), wxT("Fit a linear function to this trace between fit cursors") ); analysis_menu->AppendSubMenu(fitSub, wxT("&Fit")); wxMenu *transformSub = new wxMenu; transformSub->Append( ID_LOG, wxT("&Logarithmic (base e)..."), wxT("Transform selected traces logarithmically") ); analysis_menu->AppendSubMenu(transformSub, wxT("&Transform")); analysis_menu->Append( ID_MULTIPLY, wxT("&Multiply..."), wxT("Multiply selected traces") ); analysis_menu->Append( ID_INTEGRATE, wxT("&Integrate"), wxT("Integrate this trace between fit cursors") ); analysis_menu->Append( ID_DIFFERENTIATE, wxT("&Differentiate"), wxT("Differentiate selected traces") ); analysis_menu->Append( ID_SUBTRACTBASE, wxT("&Subtract baseline"), wxT("Subtract baseline from selected traces") ); analysis_menu->Append( ID_FILTER, wxT("Fi<er..."), wxT("Filter selected traces") ); analysis_menu->Append( ID_MPL_SPECTRUM, wxT("&Power spectrum..."), wxT("Compute an estimate of the power spectrum of the selected traces") ); analysis_menu->Append( ID_POVERN, wxT("P over &N correction..."), wxT("Apply P over N correction to all traces of this file") ); wxMenu* eventPlotSub = new wxMenu; eventPlotSub->Append(ID_PLOTCRITERION, wxT("&Detection criterion...")); eventPlotSub->Append(ID_PLOTCORRELATION, wxT("&Correlation coefficient...")); eventPlotSub->Append(ID_PLOTDECONVOLUTION, wxT("&Deconvolution...")); wxMenu* eventSub = new wxMenu; eventSub->AppendSubMenu(eventPlotSub,wxT("Plot")); eventSub->Append(ID_EXTRACT,wxT("&Template matching...")); eventSub->Append(ID_THRESHOLD,wxT("Threshold &crossing...")); analysis_menu->AppendSubMenu(eventSub,wxT("Event detection")); analysis_menu->Append( ID_BATCH, wxT("&Batch analysis..."), wxT("Analyze selected traces and show results in a table") ); #if 0 wxMenu* userdefSub=new wxMenu; for (std::size_t n=0;nAppend( ID_USERDEF1+(int)n, GetPluginLib()[n].menuEntry ); } analysis_menu->AppendSubMenu(userdefSub,wxT("User-defined functions")); #endif #ifdef WITH_PYTHON wxMenu *extensions_menu = new wxMenu; for (std::size_t n=0;nAppend(ID_USERDEF+(int)n, stf::std2wx(GetExtensionLib()[n].menuEntry)); } #endif wxMenu *help_menu = new wxMenu; help_menu->Append(wxID_HELP, wxT("Online &help\tF1")); help_menu->Append(wxID_ABOUT, wxT("&About")); help_menu->Append(ID_UPDATE, wxT("&Check for updates")); wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(file_menu, wxT("&File")); menu_bar->Append(m_edit_menu, wxT("&Edit")); menu_bar->Append(m_view_menu, wxT("&View")); menu_bar->Append(analysis_menu, wxT("&Analysis")); #ifdef WITH_PYTHON menu_bar->Append(extensions_menu, wxT("E&xtensions")); #endif menu_bar->Append(help_menu, wxT("&Help")); return menu_bar; } /* * Centralised code for creating a document frame. * Called from view.cpp when a view is created. */ wxStfChildFrame *wxStfApp::CreateChildFrame(wxDocument *doc, wxView *view) { //// Make a child frame #ifdef __WXMAC__ int xpos = (GetDocCount()-1) * 16 + 64; int ypos = (GetDocCount()-1) * 16 + 80; #endif wxStfChildFrame *subframe = new wxStfChildFrame( doc, view, GetMainFrame(), wxID_ANY, doc->GetTitle(), #ifdef __WXMAC__ wxPoint(xpos,ypos), wxSize(800,600), #else wxDefaultPosition, wxDefaultSize, #endif wxDEFAULT_FRAME_STYLE | // wxNO_FULL_REPAINT_ON_RESIZE | wxWANTS_CHARS | wxMAXIMIZE ); #ifdef __WXMSW__ subframe->SetIcon(wxString(wxT("chart"))); #endif #ifdef __X__ // subframe->SetIcon(wxIcon(wxT("doc.xbm"))); #endif #ifndef __WXGTK__ wxMenuBar* menu_bar = CreateUnifiedMenuBar((wxStfDoc*)doc); //// Associate the menu bar with the frame subframe->SetMenuBar(menu_bar); #endif // __WXGTK__ return subframe; } wxStfDoc* wxStfApp::NewChild(const Recording& NewData, const wxStfDoc* Sender, const wxString& title) { wxStfDoc* NewDoc=(wxStfDoc*)m_cfsTemplate->CreateDocument(title,wxDOC_NEW); NewDoc->SetDocumentName(title); NewDoc->SetTitle(title); NewDoc->SetDocumentTemplate(m_cfsTemplate); if (!NewDoc->OnNewDocument()) return NULL; try { NewDoc->SetData(NewData, Sender, title); } catch (const std::out_of_range& e) { wxString msg; msg << wxT("Error while creating new document:\n") << stf::std2wx(e.what()); ExceptMsg(msg); // Close file: NewDoc->OnCloseDocument(); return NULL; } catch (const std::runtime_error& e) { wxString msg; msg << wxT("Runtime error while creating new document:\n") << wxString( e.what(), wxConvLocal ); ExceptMsg( msg ); // Close file: if (!NewDoc->OnCloseDocument()) ErrorMsg(wxT("Could not close file; please close manually")); return NULL; } return NewDoc; } wxStfView* wxStfApp::GetActiveView() const { if ( GetDocManager() == 0) { ErrorMsg( wxT("Couldn't access the document manager")); return NULL; } wxStfView* pView = (wxStfView*)GetDocManager()->GetCurrentView(); if (pView == NULL) { if (mrActiveDoc != NULL) { return (wxStfView*)mrActiveDoc->GetFirstView(); } } return pView; } wxStfDoc* wxStfApp::GetActiveDoc() const { if ( GetDocManager() == 0) { ErrorMsg( wxT("Couldn't access the document manager")); return NULL; } if (GetDocManager()->GetDocuments().empty()) return NULL; wxStfDoc* pDoc = (wxStfDoc*)GetDocManager()->GetCurrentDocument(); if (pDoc == NULL) { return mrActiveDoc; } return pDoc; } void wxStfApp::OnKeyDown( wxKeyEvent& event ) { event.Skip(); wxStfDoc* actDoc = GetActiveDoc(); if (!actDoc) return; // wxStfView* actView = (wxStfView*)actDoc->GetFirstView(); wxStfView* actView = GetActiveView(); if (actView) { wxStfGraph* pGraph = actView->GetGraph(); wxStfChildFrame* pChild=(wxStfChildFrame*)actView->GetFrame(); if (pGraph && pChild && pChild->IsActive()) pGraph->OnKeyDown(event); } } void wxStfApp::OnCursorSettings( wxCommandEvent& WXUNUSED(event) ) { wxStfDoc* actDoc=GetActiveDoc(); if (CursorsDialog==NULL && actDoc!=NULL) { CursorsDialog=new wxStfCursorsDlg(frame, actDoc); CursorsDialog->Show(); CursorsDialog->SetActiveDoc(actDoc); //set CEdit controls to given values try { CursorsDialog->UpdateCursors(); } catch (const std::runtime_error& e) { ExceptMsg(wxString( e.what(), wxConvLocal )); return; } //set CButton to given direction CursorsDialog->SetDirection(actDoc->GetDirection()); CursorsDialog->SetPeakPoints((int)actDoc->GetPM()); CursorsDialog->SetFromBase(actDoc->GetFromBase()); CursorsDialog->SetSlope( actDoc->GetSlopeForThreshold() ); return; } if(CursorsDialog!=NULL && !CursorsDialog->IsShown() && actDoc!=NULL) { CursorsDialog->Show(); CursorsDialog->SetActiveDoc(actDoc); //set CEdit controls to given values try { CursorsDialog->UpdateCursors(); } catch (const std::runtime_error& e) { ExceptMsg(wxString( e.what(), wxConvLocal )); return; } //set CButton to given direction CursorsDialog->SetDirection(actDoc->GetDirection()); CursorsDialog->SetPeakPoints((int)actDoc->GetPM()); CursorsDialog->SetFromBase(actDoc->GetFromBase()); CursorsDialog->SetSlope( actDoc->GetSlopeForThreshold() ); } } void wxStfApp::OnNewfromselected( wxCommandEvent& WXUNUSED(event) ) { // number of selected traces across all open documents: std::size_t nwxT=0; // Search the document's template list for open documents: wxList docList=GetDocManager()->GetDocuments(); if (docList.IsEmpty()) { ErrorMsg(wxT("No traces were found")); return; } // Since random access is expensive, go through the list node by node: // Get first node: wxObjectList::compatibility_iterator curNode=docList.GetFirst(); std::size_t n_channels=((wxStfDoc*)curNode->GetData())->size(); while (curNode) { wxStfDoc* pDoc=(wxStfDoc*)curNode->GetData(); if (pDoc->size()!=n_channels) { ErrorMsg(wxT("Can't combine files: different numbers of channels")); return; } try { nwxT+=pDoc->GetSelectedSections().size(); } catch (const std::out_of_range& e) { ExceptMsg(wxString( e.what(), wxConvLocal )); return; } curNode=curNode->GetNext(); } if (nwxT==0) { ErrorMsg(wxT("No selected traces were found")); return; } Recording Selected(n_channels,nwxT); // Do the same iteration once again filling the channel with data: curNode=docList.GetFirst(); wxStfDoc* pDoc=NULL; nwxT=0; std::vector > channel_names(n_channels); while (curNode) { pDoc=(wxStfDoc*)curNode->GetData(); if (pDoc->GetSelectedSections().size() > 0) { for (std::size_t n_c=0;n_csize();++n_c) { channel_names[n_c].push_back(pDoc->get()[n_c].GetChannelName()); for (std::size_t n=0; nGetSelectedSections().size(); ++n) { try { Selected[n_c].InsertSection( pDoc->get()[n_c][pDoc->GetSelectedSections()[n]], n+nwxT ); } catch (const std::out_of_range& e) { ExceptMsg(wxString( e.what(), wxConvLocal )); return; } } } } nwxT+=pDoc->GetSelectedSections().size(); curNode=curNode->GetNext(); } // Set channel names: for (std::size_t n_c=0;n_c=0 && !used;--n_used) { // can't use size_t here because // n_used might be negative when checking loop condition used = ( channel_names[n_c][n_n].compare( channel_names[n_c][n_used] ) == 0 ); } if (!used) { channel_name << wxT(", ") << channel_names[n_c][n_n]; } } Selected.get()[n_c].SetChannelName(channel_name.str()); } // Copy some variables from the last document's recording // to the new recording: Selected.CopyAttributes(*pDoc); // Create a new document in a new child window, using the settings // of the last open document: NewChild(Selected,pDoc,wxT("New from selected traces")); } void wxStfApp::OnNewfromall( wxCommandEvent& WXUNUSED(event) ) { // number of traces in all open documents: std::size_t nwxT=0; // minimal number of channels: // Search the document's template list for open documents: wxList docList=GetDocManager()->GetDocuments(); if (docList.IsEmpty()) { ErrorMsg(wxT("No traces were found")); return; } // Since random access is expensive, go through the list node by node: // Get first node: wxObjectList::compatibility_iterator curNode=docList.GetFirst(); std::size_t n_channels=((wxStfDoc*)curNode->GetData())->size(); while (curNode) { wxStfDoc* pDoc=(wxStfDoc*)curNode->GetData(); if (pDoc->size()!=n_channels) { ErrorMsg(wxT("Can't combine files: different numbers of channels")); return; } try { nwxT+=pDoc->get().at(pDoc->GetCurChIndex()).size(); } catch (const std::out_of_range& e) { ExceptMsg(wxString( e.what(), wxConvLocal )); return; } curNode=curNode->GetNext(); } Recording Selected(n_channels,nwxT); //Do the same iteration once again filling the channel with data: curNode=docList.GetFirst(); nwxT=0; wxStfDoc* pDoc=NULL; std::vector > channel_names(n_channels); while (curNode) { pDoc=(wxStfDoc*)curNode->GetData(); if (pDoc->get()[pDoc->GetCurChIndex()].size() > 0) { for (std::size_t n_c=0;n_cget()[n_c].GetChannelName()); for (std::size_t n=0; nget()[n_c].size(); ++n) { try { Selected[n_c].InsertSection(pDoc->get()[n_c][n],n+nwxT); } catch (const std::out_of_range& e) { ExceptMsg(wxString( e.what(), wxConvLocal )); return; } } } } nwxT+=pDoc->get()[pDoc->GetCurChIndex()].size(); curNode=curNode->GetNext(); } // Set channel names: for (std::size_t n_c=0;n_c=0 && !used;--n_used) { // can't use size_t here because // n_used might be negative when checking loop condition used = ( channel_names[n_c][n_n].compare( channel_names[n_c][n_used] ) == 0 ); } if (!used) { channel_name << wxT(", ") << channel_names[n_c][n_n]; } } Selected.get()[n_c].SetChannelName(channel_name.str()); } // Copy some variables from the last document's recording // to the new recording: Selected.CopyAttributes(*pDoc); // Create a new document in a new child window, using the settings // of the last open document: NewChild(Selected,pDoc,wxT("New from all traces")); } void wxStfApp::OnApplytoall( wxCommandEvent& WXUNUSED(event) ) { // toggle through open documents to find out // which one is active: // Search the document's template list for open documents: wxList docList=GetDocManager()->GetDocuments(); if (docList.IsEmpty()) { ErrorMsg(wxT("No traces were found")); return; } wxStfDoc* pDoc=GetActiveDoc(); wxStfView* pView=GetActiveView(); if (pDoc==NULL || pView==NULL) { ErrorMsg(wxT("Couldn't find an active window")); return; } std::size_t llbToApply=pDoc->GetBaseBeg(); std::size_t ulbToApply=pDoc->GetBaseEnd(); std::size_t llpToApply=pDoc->GetPeakBeg(); std::size_t ulpToApply=pDoc->GetPeakEnd(); std::size_t lldToApply=pDoc->GetFitBeg(); std::size_t uldToApply=pDoc->GetFitEnd(); double latencyStartCursorToApply=pDoc->GetLatencyBeg(); double latencyEndCursorToApply=pDoc->GetLatencyEnd(); // Since random access is expensive, go through the list node by node: // Get first node: wxObjectList::compatibility_iterator curNode=docList.GetFirst(); while (curNode) { wxStfDoc* OpenDoc=(wxStfDoc*)curNode->GetData(); if (OpenDoc==NULL) return; wxStfView* curView = (wxStfView*)OpenDoc->GetFirstView(); //(GetActiveView()); if (curView!=pView && curView!=NULL) { OpenDoc->GetXZoomW() = pDoc->GetXZoom(); for ( std::size_t n_c=0; n_c < OpenDoc->size(); ++n_c ) { if ( n_c < pDoc->size() ) { OpenDoc->GetYZoomW(n_c) = pDoc->GetYZoom(n_c); } } OpenDoc->SetBaseBeg((int)llbToApply); OpenDoc->SetBaseEnd((int)ulbToApply); OpenDoc->SetPeakBeg((int)llpToApply); OpenDoc->SetPeakEnd((int)ulpToApply); OpenDoc->SetFitBeg((int)lldToApply); OpenDoc->SetFitEnd((int)uldToApply); OpenDoc->SetLatencyBeg(latencyStartCursorToApply); OpenDoc->SetLatencyEnd(latencyEndCursorToApply); wxStfChildFrame* pChild=(wxStfChildFrame*)curView->GetFrame(); pChild->UpdateResults(); if (curView->GetGraph() != NULL) curView->GetGraph()->Refresh(); } curNode=curNode->GetNext(); } } bool wxStfApp::OpenFileSeries(const wxArrayString& fNameArray) { int nFiles=(int)fNameArray.GetCount(); if (nFiles==0) return false; bool singleWindow=false; if (nFiles!=1) { // Ask whether to put files into a single window: singleWindow=(wxMessageDialog( frame, wxT("Put files into a single window?"), wxT("File series import"), wxYES_NO ).ShowModal() == wxID_YES); } wxProgressDialog progDlg( wxT("Importing file series"), wxT("Starting file import"), 100, frame, wxPD_SMOOTH | wxPD_AUTO_HIDE ); int n_opened=0; Recording seriesRec; while (n_opened!=nFiles) { wxString progStr; progStr << wxT("Reading file #") << n_opened + 1 << wxT(" of ") << nFiles; progDlg.Update( (int)((double)n_opened/(double)nFiles*100.0), progStr ); if (!singleWindow) { wxDocTemplate* templ=GetDocManager()->FindTemplateForPath(fNameArray[n_opened]); wxStfDoc* NewDoc=(wxStfDoc*)templ->CreateDocument(fNameArray[n_opened],wxDOC_NEW); NewDoc->SetDocumentTemplate(templ); if (!NewDoc->OnOpenDocument(fNameArray[n_opened++])) { ErrorMsg(wxT("Couldn't open file, aborting file import")); GetDocManager()->CloseDocument(NewDoc); return false; } } else { // Add to recording first: #ifndef TEST_MINIMAL // Find a template: wxDocTemplate* templ=GetDocManager()->FindTemplateForPath(fNameArray[n_opened]); // Use this template only for type recognition: wxString filter(templ->GetFileFilter()); stfio::filetype type = stfio::findType(stf::wx2std(templ->GetFileFilter())); #else stfio::filetype type = stfio::none; #endif #if 0 // TODO: re-implement ascii if (type==stfio::ascii) { if (!get_directTxtImport()) { wxStfTextImportDlg ImportDlg(NULL, stf::CreatePreview(fNameArray[n_opened]), 1, true); if (ImportDlg.ShowModal()!=wxID_OK) { return false; } // store settings in application: set_txtImportSettings(ImportDlg.GetTxtImport()); set_directTxtImport(ImportDlg.ApplyToAll()); } } #endif // add this file to the series recording: Recording singleRec; try { stf::wxProgressInfo progDlg("Reading file", "Opening file", 100); stfio::importFile(stf::wx2std(fNameArray[n_opened++]),type,singleRec,txtImport, progDlg); if (n_opened==1) { seriesRec.resize(singleRec.size()); // reserve memory to avoid allocations: for (std::size_t n_c=0;n_cFindTemplateForPath( filename ); if ( templ == NULL ) { ErrorMsg(wxT("Couldn't open file, aborting file import")); return false; } wxStfDoc* NewDoc = (wxStfDoc*)templ->CreateDocument( filename, wxDOC_NEW ); if ( NewDoc == NULL ) { ErrorMsg(wxT("Couldn't open file, aborting file import")); return false; } NewDoc->SetDocumentTemplate(templ); if (!NewDoc->OnOpenPyDocument(filename)) { ErrorMsg(wxT("Couldn't open file, aborting file import")); GetDocManager()->CloseDocument(NewDoc); return false; } return true; } #endif //WITH_PYTHON void wxStfApp::CleanupDocument(wxStfDoc* pDoc) { // count open docs: if (GetDocManager() && GetDocManager()->GetDocuments().GetCount()==1) { // Clean up if this was the last document: if (CursorsDialog!=NULL) { CursorsDialog->Destroy(); CursorsDialog=NULL; } } // Update active document: /* activeDoc.remove(pDoc); */ // Remove menu from file history menu list: // GetDocManager()->FileHistoryUseMenu(m_file_menu); // GetDocManager()->FileHistoryAddFilesToMenu(); } std::vector wxStfApp::GetSectionsWithFits() const { // Search the document's template list for open documents: wxList docList=GetDocManager()->GetDocuments(); if (docList.IsEmpty()) { return std::vector(0); } std::vector sectionList; // Since random access is expensive, go through the list node by node: // Get first node: wxObjectList::compatibility_iterator curNode=docList.GetFirst(); while (curNode) { wxStfDoc* pDoc=(wxStfDoc*)curNode->GetData(); try { for (std::size_t n_sec=0; n_sec < pDoc->get().at(pDoc->GetCurChIndex()).size(); ++n_sec) { stf::SectionAttributes sec_attr = pDoc->GetSectionAttributes(pDoc->GetCurChIndex(), n_sec); if (sec_attr.isFitted) { sectionList.push_back(stf::SectionPointer(&pDoc->get()[pDoc->GetCurChIndex()][n_sec], sec_attr) ); } } } catch (const std::out_of_range& e) { ExceptMsg( wxString( e.what(), wxConvLocal ) ); return std::vector(0); } curNode=curNode->GetNext(); } return sectionList; } wxString wxStfApp::GetVersionString() const { wxString verString; verString << wxT("Stimfit ") << wxString(PACKAGE_VERSION, wxConvLocal) #ifdef _STFDEBUG << wxT(", debug build, "); #else << wxT(", release build, "); #endif verString << wxT(__DATE__) << wxT(", ") << wxT(__TIME__); return verString; } StfDll wxStfParentFrame *GetMainFrame(void) { return frame; } // LocalWords: wxStfView #ifdef WITH_PYTHON void wxStfApp::OnPythonImport(wxCommandEvent& WXUNUSED(event)) { // show a file selection dialog menu. wxString pyFilter; // file filter only show *.py pyFilter = wxT("Python file (*.py)|*.py"); wxFileDialog LoadModuleDialog (frame, wxT("Import/reload Python module"), wxT(""), wxT(""), pyFilter, wxFD_OPEN | wxFD_PREVIEW ); if (LoadModuleDialog.ShowModal() == wxID_OK) { wxString modulelocation = LoadModuleDialog.GetPath(); ImportPython(modulelocation); // see in /src/app/unopt.cpp L196 } else { return; } } #endif // WITH_PYTHON stimfit-0.15.8/src/stimfit/gui/childframe.cpp0000775000175000017500000005327313062445067016067 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // frame.cpp // These are the top-level and child windows of the application. // 2007-12-27, Christoph Schmidt-Hieber, University of Freiburg #ifdef _STFDEBUG #include #endif // For compilers that support precompilation, includes "wx/wx.h". #include #include #include #include #include #include #include #include #include #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #if !wxUSE_DOC_VIEW_ARCHITECTURE #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! #endif #if !wxUSE_MDI_ARCHITECTURE #error You must set wxUSE_MDI_ARCHITECTURE to 1 in setup.h! #endif #include "./app.h" #include "./doc.h" #include "./view.h" #include "./graph.h" #include "./table.h" #include "./printout.h" #include "./dlgs/smalldlgs.h" #include "./copygrid.h" #ifdef _WINDOWS #include "./../../libstfio/atf/atflib.h" #include "./../../libstfio/igor/igorlib.h" #endif #include "./childframe.h" IMPLEMENT_CLASS(wxStfChildFrame, wxStfChildType) BEGIN_EVENT_TABLE(wxStfChildFrame, wxStfChildType) EVT_SPINCTRL( ID_SPINCTRLTRACES, wxStfChildFrame::OnSpinCtrlTraces ) EVT_COMBOBOX( ID_COMBOACTCHANNEL, wxStfChildFrame::OnComboActChannel ) EVT_COMBOBOX( ID_COMBOINACTCHANNEL, wxStfChildFrame::OnComboInactChannel ) EVT_CHECKBOX( ID_ZERO_INDEX, wxStfChildFrame::OnZeroIndex) EVT_CHECKBOX( ID_PLOTSELECTED, wxStfChildFrame::OnShowselected ) // workaround for status bar: EVT_MENU_HIGHLIGHT_ALL( wxStfChildFrame::OnMenuHighlight ) END_EVENT_TABLE() wxStfChildFrame::wxStfChildFrame(wxDocument* doc, wxView* view, wxStfParentType* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name) : wxStfChildType(doc,view,parent,id,title,pos,size,style,name), m_parent(parent), m_notebook(NULL) { m_mgr.SetManagedWindow(this); m_mgr.SetFlags( wxAUI_MGR_ALLOW_FLOATING | wxAUI_MGR_TRANSPARENT_DRAG | wxAUI_MGR_VENETIAN_BLINDS_HINT | wxAUI_MGR_ALLOW_ACTIVE_PANE ); } wxStfChildFrame::~wxStfChildFrame() { // deinitialize the frame manager m_mgr.UnInit(); } wxStfGrid* wxStfChildFrame::CreateTable() { // create the notebook off-window to avoid flicker //wxSize client_size = GetClientSize(); wxStfGrid* ctrl = new wxStfGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL | wxHSCROLL ); #ifndef __APPLE__ wxFont font( 10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ); ctrl->SetDefaultCellFont(font); #endif ctrl->SetDefaultColSize(108); ctrl->SetColLabelSize(20); ctrl->SetDefaultCellAlignment(wxALIGN_RIGHT,wxALIGN_CENTRE); ctrl->CreateGrid(3,10); ctrl->EnableEditing(false); return ctrl; } wxAuiNotebook* wxStfChildFrame::CreateNotebook() { // create the notebook off-window to avoid flicker wxSize client_size = GetClientSize(); m_notebook_style = wxAUI_NB_SCROLL_BUTTONS | wxAUI_NB_CLOSE_ON_ACTIVE_TAB |/*wxAUI_NB_DEFAULT_STYLE | */ wxNO_BORDER; wxAuiNotebook* ctrl = new wxAuiNotebook( this, wxID_ANY, wxPoint(client_size.x, client_size.y), wxSize(200,200), m_notebook_style ); return ctrl; } wxPanel* wxStfChildFrame::CreateTraceCounter() { //wxSize client_size = GetClientSize(); wxPanel* ctrl = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize );// , wxSize(165,88) ); return ctrl; } wxPanel* wxStfChildFrame::CreateChannelCounter() { wxPanel* ctrl = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize ); //, wxSize(256,88) ); return ctrl; } void wxStfChildFrame::CreateMenuTraces(const std::size_t value) { sizemax = value; m_traceCounter = CreateTraceCounter(); // this is wxPanel wxBoxSizer* pTracesBoxSizer; // top-level Sizer pTracesBoxSizer = new wxBoxSizer(wxVERTICAL); wxGridSizer* TracesGridSizer; // top-level GridSizer TracesGridSizer = new wxGridSizer(3,1,0,0); // Grid for spin control wxFlexGridSizer* pSpinCtrlTraceSizer; pSpinCtrlTraceSizer = new wxFlexGridSizer(1,3,0,0); // 1 row, 3 columns for the SpinCtrl + text // 1) the wxSpinCtrl object trace_spinctrl = new wxSpinCtrl( m_traceCounter, ID_SPINCTRLTRACES, wxEmptyString, wxDefaultPosition, wxSize(64, wxDefaultCoord), wxSP_WRAP); // the "of n", where n is the number of traces // n is zero-based in zero-based check box is selected wxStaticText* pIndexText; pIndexText = new wxStaticText(m_traceCounter, wxID_ANY, wxT("Index: ")); pSize=new wxStaticText( m_traceCounter, wxID_ANY, wxEmptyString); wxString sizeStr; pSpinCtrlTraceSizer->Add( pIndexText, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1) ; pSpinCtrlTraceSizer->Add( trace_spinctrl, 0, wxALIGN_LEFT, 1) ; pSpinCtrlTraceSizer->Add( pSize, 0, wxALIGN_LEFT | wxALIGN_CENTER, 1) ; // 2) Show zero-based index? Read from Stimfit registry pZeroIndex = new wxCheckBox( m_traceCounter, ID_ZERO_INDEX, wxT("Zero-based index ") ); pZeroIndex->SetValue(wxGetApp().wxGetProfileInt(wxT("Settings"), wxT("Zeroindex"), 0)); // If true set the starting value to zero if (pZeroIndex->GetValue()){ sizemax--; trace_spinctrl->SetValue(0); trace_spinctrl->SetRange(0, (int)sizemax); } else { trace_spinctrl->SetValue(1); trace_spinctrl->SetRange(1, (int)sizemax); } // value argument is the number of traces sizeStr << wxT("(") << value << wxT(")"); // gives asserts on OS X: wxString::Format(wxT("%3d"), value); pSize->SetLabel(sizeStr); // Show selected pShowSelected = new wxCheckBox( m_traceCounter, ID_PLOTSELECTED, wxT("Show selected")); pShowSelected->SetValue(false); // Add everything to top-level GridSizer TracesGridSizer->Add(pSpinCtrlTraceSizer, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 3); TracesGridSizer->Add(pZeroIndex, 0, wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 3); TracesGridSizer->Add(pShowSelected, 0, wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 3); pTracesBoxSizer->Add(TracesGridSizer, 0, wxALIGN_CENTER | wxALL, 1); pTracesBoxSizer->SetSizeHints(m_traceCounter); m_traceCounter->SetSizer( TracesGridSizer ); m_traceCounter->Layout(); wxSize size = m_traceCounter->GetSize(); wxStfDoc* pDoc=(wxStfDoc*)GetDocument(); m_mgr.AddPane( m_traceCounter, wxAuiPaneInfo().Caption(wxT("Trace selection")).Fixed().BestSize(size.x, size.y). Position(pDoc->size()-1).CloseButton(false).Floatable().Dock().Top().Name(wxT("SelectionT")) ); m_table=CreateTable(); m_mgr.AddPane( m_table, wxAuiPaneInfo().Caption(wxT("Results")).Position(pDoc->size()). CloseButton(false).Floatable().Dock().Top().Name(wxT("Results")) ); m_mgr.Update(); Refresh(); } // Channel Selection childframe void wxStfChildFrame::CreateComboChannels(const wxArrayString& channelStrings) { m_channelCounter = CreateChannelCounter(); wxBoxSizer* pChannelsBoxSizer; // top-level Sizer pChannelsBoxSizer = new wxBoxSizer(wxVERTICAL); // Grid for ChannelCombo wxFlexGridSizer* ChannelCombos; ChannelCombos = new wxFlexGridSizer(2,2,4,0); // Active channel Combo wxStaticText* pActIndex = new wxStaticText( m_channelCounter, wxID_ANY, wxT("Active channel: ") ); pActChannel = new wxComboBox( m_channelCounter, ID_COMBOACTCHANNEL, wxT("0"), wxDefaultPosition, wxSize(120, wxDefaultCoord), channelStrings, wxCB_DROPDOWN | wxCB_READONLY ); // Inactive channel Combo wxStaticText* pInactIndex = new wxStaticText( m_channelCounter, wxID_ANY, wxT("Reference channel: ") ); pInactIndex->SetForegroundColour( *wxRED ); pInactChannel = new wxComboBox( m_channelCounter, ID_COMBOINACTCHANNEL, wxT("1"), wxDefaultPosition, wxSize(120,wxDefaultCoord), channelStrings, wxCB_DROPDOWN | wxCB_READONLY ); ChannelCombos->Add( pActIndex, 1, wxALIGN_CENTER_VERTICAL, 1); ChannelCombos->Add( pActChannel, 1); ChannelCombos->Add( pInactIndex,1, wxALIGN_CENTER_VERTICAL, 1); ChannelCombos->Add( pInactChannel, 1); wxBoxSizer *pShowChannelSizer; pShowChannelSizer = new wxBoxSizer(wxHORIZONTAL); // Show reference channel? Read from Stimfit registry pShowSecond = new wxCheckBox( m_channelCounter, ID_PLOTSELECTED, wxT("Show reference") ); pShowSecond->SetValue(wxGetApp().wxGetProfileInt(wxT("Settings"), wxT("ShowReference"),0)); pShowSecond->SetForegroundColour( *wxRED ); pShowAll = new wxCheckBox( m_channelCounter, ID_PLOTSELECTED, wxT("Show all ") ); pShowAll->SetValue(false); pShowChannelSizer->Add( pShowAll ); pShowChannelSizer->Add( pShowSecond ); pChannelsBoxSizer->Add(ChannelCombos, 0, wxALIGN_CENTER | wxALL, 3); pChannelsBoxSizer->Add(pShowChannelSizer, 0, wxALIGN_LEFT | wxALL, 3); pChannelsBoxSizer->SetSizeHints(m_channelCounter); m_channelCounter->SetSizer( pChannelsBoxSizer ); m_channelCounter->Layout(); wxSize size = m_channelCounter->GetSize(); m_mgr.AddPane( m_channelCounter, wxAuiPaneInfo().Caption(wxT("Channel selection")).Fixed().BestSize(size.x, size.y). Position(0).CloseButton(false).Floatable().Dock().Top().Name(wxT("SelectionC")) ); m_mgr.Update(); Refresh(); } // Trace selection childframe void wxStfChildFrame::SetSelected(std::size_t value) { wxString selStr; selStr << wxT("Show ") << wxString::Format(wxT("%3d"),(int)value) << wxT(" selected"); pShowSelected->SetLabel(selStr); } void wxStfChildFrame::SetChannels( std::size_t act, std::size_t inact ) { pActChannel->SetSelection( act ); pInactChannel->SetSelection( inact ); } std::size_t wxStfChildFrame::GetCurTrace() const { // if zero-based is True if ( pZeroIndex->GetValue() ) return trace_spinctrl->GetValue(); else return trace_spinctrl->GetValue()-1; } void wxStfChildFrame::SetCurTrace(std::size_t n) { // if zero-based is True if ( pZeroIndex->GetValue() ) trace_spinctrl->SetValue((int)n); else trace_spinctrl->SetValue((int)n+1); } void wxStfChildFrame::OnSpinCtrlTraces( wxSpinEvent& event ){ event.Skip(); wxStfView* pView=(wxStfView*)GetView(); wxStfDoc* pDoc=(wxStfDoc*)GetDocument(); if (pDoc == NULL || pView == NULL) { wxGetApp().ErrorMsg(wxT("Null pointer in wxStfChildFrame::OnSpinCtrlTraces()")); return; } if (pView->GetGraph() != NULL) { pView->GetGraph()->ChangeTrace(GetCurTrace()); pView->GetGraph()->Enable(); pView->GetGraph()->SetFocus(); } } void wxStfChildFrame::OnActivate(wxActivateEvent &event) { wxStfView* pView=(wxStfView*)GetView(); if (pView) pView->Activate(true); } void wxStfChildFrame::OnComboActChannel(wxCommandEvent& WXUNUSED(event)) { if ( pActChannel->GetCurrentSelection() == pInactChannel->GetCurrentSelection()) { // correct selection: for (int n_c=0;n_c<(int)pActChannel->GetCount();++n_c) { if (n_c!=pActChannel->GetCurrentSelection()) { pInactChannel->SetSelection(n_c); break; } } } UpdateChannels(); } void wxStfChildFrame::OnComboInactChannel(wxCommandEvent& WXUNUSED(event)) { if (pInactChannel->GetCurrentSelection()==pActChannel->GetCurrentSelection()) { // correct selection: for (int n_c=0;n_c<(int)pInactChannel->GetCount();++n_c) { if (n_c!=pInactChannel->GetCurrentSelection()) { pActChannel->SetSelection(n_c); break; } } } UpdateChannels(); } void wxStfChildFrame::UpdateChannels( ) { wxStfDoc* pDoc=(wxStfDoc*)GetDocument(); if ( pDoc != NULL && pDoc->size() > 1) { try { if (pActChannel->GetCurrentSelection() >= 0 || pActChannel->GetCurrentSelection() < (int)pDoc->size()) { pDoc->SetCurChIndex( pActChannel->GetCurrentSelection() ); if (pInactChannel->GetCurrentSelection() >= 0 || pInactChannel->GetCurrentSelection() < (int)pDoc->size()) { pDoc->SetSecChIndex( pInactChannel->GetCurrentSelection() ); } else { pDoc->SetCurChIndex(0); pDoc->SetSecChIndex(1); } } else { pDoc->SetCurChIndex(0); pDoc->SetSecChIndex(1); } } catch (const std::out_of_range& e) { wxString msg(wxT("Error while changing channels\nPlease close file\n")); msg += wxString( e.what(), wxConvLocal ); wxGetApp().ExceptMsg(msg); return; } // Update measurements: wxGetApp().OnPeakcalcexecMsg(); UpdateResults(); wxStfView* pView=(wxStfView*)GetView(); if ( pView == NULL ) { wxGetApp().ErrorMsg( wxT("View is zero in wxStfDoc::SwapChannels")); return; } if (pView->GetGraph() != NULL) { pView->GetGraph()->Refresh(); pView->GetGraph()->Enable(); pView->GetGraph()->SetFocus(); } } } void wxStfChildFrame::OnZeroIndex( wxCommandEvent& event) { event.Skip(); wxSpinCtrl* pTraceCtrl = (wxSpinCtrl*)FindWindow(ID_SPINCTRLTRACES); wxCheckBox* pZeroIndex = (wxCheckBox*)FindWindow(ID_ZERO_INDEX); if (pZeroIndex == NULL || pTraceCtrl == NULL){ wxGetApp().ErrorMsg(wxT("Null pointer in wxStfChildFrame::OnZeroIndex")); return; } // If Zero-index is ON (selected) if (pZeroIndex->GetValue()){ wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("Zeroindex"), 1); // write config if (pTraceCtrl->GetValue()==1){ sizemax--; pTraceCtrl->SetRange(0, sizemax); // first set new range pTraceCtrl->SetValue(pTraceCtrl->GetValue()-1); // now you can move one less } else if (pTraceCtrl->GetValue()==(int)sizemax){ sizemax--; pTraceCtrl->SetValue(pTraceCtrl->GetValue()-1); // move one less pTraceCtrl->SetRange(0, sizemax); // next set new range } else { sizemax--; pTraceCtrl->SetRange(0, sizemax); // first set new range pTraceCtrl->SetValue(pTraceCtrl->GetValue()-1); // now you can move one less } } // If Zero-index is OFF (unselected) else { wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("Zeroindex"), 0); if (pTraceCtrl->GetValue()==0){ sizemax++; pTraceCtrl->SetValue(pTraceCtrl->GetValue()+1); pTraceCtrl->SetRange(1, (int)sizemax); } else if (pTraceCtrl->GetValue()==(int)sizemax){ sizemax++; pTraceCtrl->SetRange(1, (int)sizemax); // first set new range pTraceCtrl->SetValue(pTraceCtrl->GetValue()+1); // now you can move one more } else { // now the order does not matter sizemax++; pTraceCtrl->SetRange(1, (int)sizemax); // first set new range pTraceCtrl->SetValue(pTraceCtrl->GetValue()+1); // now you can move one more } } //wxString sizeStr; //sizeStr << wxT("of ") << wxString::Format(wxT("%3d"),(int)sizemax); //pSize->SetLabel(sizeStr); } void wxStfChildFrame::OnShowselected(wxCommandEvent& WXUNUSED(event)) { wxStfView* pView=(wxStfView*)GetView(); if (pView != NULL && pView->GetGraph()!= NULL) { pView->GetGraph()->Refresh(); pView->GetGraph()->Enable(); pView->GetGraph()->SetFocus(); } } bool wxStfChildFrame::ShowSecond() { wxGetApp().wxWriteProfileInt(wxT("Settings"), wxT("ShowReference"), pShowSecond->IsChecked()); // write config return pShowSecond->IsChecked(); } void wxStfChildFrame::ActivateGraph() { wxStfView* pView=(wxStfView*)GetView(); // Set the focus somewhere else: if (m_traceCounter != NULL) m_traceCounter->SetFocus(); if (pView != NULL && pView->GetGraph()!= NULL) { pView->GetGraph()->Enable(); pView->GetGraph()->SetFocus(); } } void wxStfChildFrame::ShowTable(const stfnum::Table &table,const wxString& caption) { // Create and show notebook if necessary: if (m_notebook==NULL && !m_mgr.GetPane(m_notebook).IsOk()) { m_notebook=CreateNotebook(); m_mgr.AddPane( m_notebook, wxAuiPaneInfo().Caption(wxT("Analysis results")). Floatable().Dock().Left().Name( wxT("Notebook") ) ); } else { // Re-open notebook if it has been closed: if (!m_mgr.GetPane(m_notebook).IsShown()) { m_mgr.GetPane(m_notebook).Show(); } } wxStfGrid* pGrid = new wxStfGrid( m_notebook, wxID_ANY, wxPoint(0,20), wxDefaultSize ); wxStfTable* pTable(new wxStfTable(table)); pGrid->SetTable(pTable,true); // the grid will take care of the deletion pGrid->SetEditable(false); pGrid->SetDefaultCellAlignment(wxALIGN_RIGHT,wxALIGN_CENTRE); for (std::size_t n_row=0; n_row<=table.nRows()+1; ++n_row) { pGrid->SetCellAlignment(wxALIGN_LEFT,(int)n_row,0); } m_notebook->AddPage( pGrid, caption, true ); // "commit" all changes made to wxAuiManager m_mgr.Update(); wxStfView* pView=(wxStfView*)GetView(); if (pView != NULL && pView->GetGraph()!= NULL) { pView->GetGraph()->Enable(); pView->GetGraph()->SetFocus(); } } void wxStfChildFrame::UpdateResults() { wxStfDoc* pDoc=(wxStfDoc*)GetDocument(); stfnum::Table table(pDoc->CurResultsTable()); // Delete or append columns: if (m_table->GetNumberCols()<(int)table.nCols()) { m_table->AppendCols((int)table.nCols()-(int)m_table->GetNumberCols()); } else { if (m_table->GetNumberCols()>(int)table.nCols()) { m_table->DeleteCols(0,(int)m_table->GetNumberCols()-(int)table.nCols()); } } // Delete or append row: if (m_table->GetNumberRows()<(int)table.nRows()) { m_table->AppendRows((int)table.nRows()-(int)m_table->GetNumberRows()); } else { if (m_table->GetNumberRows()>(int)table.nRows()) { m_table->DeleteRows(0,(int)m_table->GetNumberRows()-(int)table.nRows()); } } for (std::size_t nRow=0;nRowSetRowLabelValue((int)nRow, stf::std2wx(table.GetRowLabel(nRow))); for (std::size_t nCol=0;nColSetColLabelValue((int)nCol, stf::std2wx(table.GetColLabel(nCol))); if (!table.IsEmpty(nRow,nCol)) { wxString entry; entry << table.at(nRow,nCol); m_table->SetCellValue((int)nRow,(int)nCol,entry); } else { m_table->SetCellValue((int)nRow,(int)nCol,wxT("n.a.")); } } } } void wxStfChildFrame::Saveperspective() { wxString perspective = m_mgr.SavePerspective(); // Save to wxConfig: wxGetApp().wxWriteProfileString(wxT("Settings"),wxT("Windows"),perspective); #ifdef _STFDEBUG wxFile persp(wxT("perspective.txt"), wxFile::write); persp.Write(perspective); persp.Close(); #endif } void wxStfChildFrame::Loadperspective() { wxString perspective = wxGetApp().wxGetProfileString(wxT("Settings"),wxT("Windows"),wxT("")); if (perspective!=wxT("")) { m_mgr.LoadPerspective(perspective); } else { wxGetApp().ErrorMsg(wxT("Couldn't find saved windows settings")); } } void wxStfChildFrame::Restoreperspective() { m_mgr.LoadPerspective(defaultPersp); m_mgr.Update(); } void wxStfChildFrame::OnMenuHighlight(wxMenuEvent& event) { if (this->GetMenuBar()) { wxMenuItem *item = this->GetMenuBar()->FindItem(event.GetId()); if(item) { wxLogStatus(item->GetHelp()); } } event.Skip(); } #if wxUSE_DRAG_AND_DROP bool wxStfFileDrop::OnDropFiles(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), const wxArrayString& filenames) { int nFiles=(int)filenames.GetCount(); if (nFiles>0) { return wxGetApp().OpenFileSeries(filenames); } else { return false; } } #endif stimfit-0.15.8/src/stimfit/gui/childframe.h0000775000175000017500000001735213062445067015532 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file childframe.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfChildFrame. */ #ifndef _CHILDFRAME_H #define _CHILDFRAME_H /*! \addtogroup wxstf * @{ */ #include #include #include #include #include "./../stf.h" // Define a new frame class wxStfGraph; class wxStfTable; class wxStfGrid; //! child frame type; depends on whether aui is used for the doc/view interface #ifdef WITH_AUIDOCVIEW typedef wxAuiDocMDIChildFrame wxStfChildType; #else typedef wxDocMDIChildFrame wxStfChildType; #endif //! parent frame type; depends on whether aui is used for the doc/view interface #ifdef WITH_AUIDOCVIEW typedef wxAuiDocMDIParentFrame wxStfParentType; #else typedef wxDocMDIParentFrame wxStfParentType; #endif //! Default perspective string. /*! Can be loaded to restore the default AUI perspective. */ const wxString defaultPersp = wxT("layout2| \ name=Results;caption=Results;state=2044;dir=1;layer=0;row=0;pos=1;prop=167270; \ bestw=200;besth=184;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1| \ name=Selection;caption=Trace selection;state=2044;dir=1;layer=0;row=0;pos=0;prop=32730; \ bestw=128;besth=64;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1| \ name=Traces;caption=Traces;state=18428;dir=5;layer=0;row=0;pos=0;prop=100000; \ bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|"); #if wxUSE_DRAG_AND_DROP class wxStfFileDrop : public wxFileDropTarget { protected: virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames); }; #endif //! Provides the child frame for displaying documents on separate windows. /*! This class can only be used for MDI child frames. It is part of the document/view * framework supported by wxWidgets. */ class StfDll wxStfChildFrame : public wxStfChildType { DECLARE_CLASS( wxStfChildFrame ) public: //! Constructor /*! \param doc Pointer to the attached document. * \param view Pointer to the attached view. * \param parent Pointer to the parent frame. * \param id Window id. * \param title Window title string. * \param pos Initial window position. * \param size Initial window size. * \param style Window style. * \param name Name of this frame. */ wxStfChildFrame( wxDocument* doc, wxView* view, wxStfParentType* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxPoint(48,48), const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxT("frame") ); //! Destructor ~wxStfChildFrame(); //! Adds a table to the results notebook /*! \param table The table to be added. * \param caption The title of the new table in the notebook. */ void ShowTable(const stfnum::Table& table,const wxString& caption); //! Retrieves the current trace from the trace selection combo box. /*! \return The 0-based index of the currently selected trace. */ std::size_t GetCurTrace() const; //! Sets the current trace from the trace selection combo box. /*! \return The 0-based index of the trace to be selected. */ void SetCurTrace(std::size_t); //! Creates the trace selection menu. /*! \param value The number of traces. */ void CreateMenuTraces(std::size_t value); //! Creates the channel selection combo boxes. /*! \param channelNames The channel names for the combo box drop-down list. */ void CreateComboChannels( const wxArrayString& channelNames ); //! Refreshes the trace selection string. /*! \param value The number of selected traces. */ void SetSelected(std::size_t value); //! Sets the channels in the combo boxes. Checks and corrects equal channels in both boxes. /*! \param act Index of the active channel. * \param inact Index of the reference channel. */ void SetChannels( std::size_t act, std::size_t inact ); //! Updates the channels according to the current combo boy selection. void UpdateChannels( ); //! Updates the results table. /*! Called from wxStfApp::OnPeakcalcexecMsg() to update the results table. * Don't call this directly; use wxStfApp::OnPeakcalcexecMsg() instead. */ void UpdateResults(); //! Retrieve the wxAuiManager. /*! \return A pointer to the wxAuiManager. */ wxAuiManager* GetMgr() {return &m_mgr;} //! Retrieve the wxStfGrid that contains the results table. /*! \return A pointer to the grid. */ wxStfGrid* GetCopyGrid() {return m_table;} //! Write the current AUI perspective to the configuration void Saveperspective(); //! Load the saved AUI perspective from the configuration void Loadperspective(); //! Restore the default AUI perspective. void Restoreperspective(); //! Indicates whether all selected traces should be plotted. /*! \return true if they should be plotted, false otherwise. */ bool ShowSelected() const {return pShowSelected->IsChecked();} //! Indicates whether the second channel should be plotted. /*! \return true if it should be plotted, false otherwise. */ bool ShowSecond();// const {return pShowSecond->IsChecked();} //! Indicates whether all channels should be plotted. /*! \return true if they should be plotted, false otherwise. */ bool ShowAll() const {return pShowAll->IsChecked();} //! Activated the current graph void ActivateGraph(); void OnActivate(wxActivateEvent &event); //! Override default GetMenuBar /*! \return the menu bar if non-NULL; otherwise, the parent's menu bar */ virtual wxMenuBar *GetMenuBar() const { if (wxStfChildType::GetMenuBar()) { return wxStfChildType::GetMenuBar(); } else { return m_parent->GetMenuBar(); } } private: wxStfParentType* m_parent; wxAuiManager m_mgr; wxAuiNotebook* m_notebook; long m_notebook_style; wxPanel *m_traceCounter; wxPanel *m_channelCounter; wxStaticText *pSize; wxComboBox *pActChannel, *pInactChannel; wxSpinCtrl *trace_spinctrl; wxStfGrid* m_table; wxCheckBox *pZeroIndex, *pShowSelected, *pShowSecond, *pShowAll; std::size_t sizemax; wxAuiNotebook* CreateNotebook(); wxPanel* CreateTraceCounter(); wxPanel* CreateChannelCounter(); wxStfGrid* CreateTable(); void OnMenuHighlight(wxMenuEvent& event); void OnShowselected(wxCommandEvent& event); void OnZeroIndex(wxCommandEvent& event); void OnSpinCtrlTraces(wxSpinEvent& event); void OnComboActChannel(wxCommandEvent& event); void OnComboInactChannel(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; /*@}*/ #endif stimfit-0.15.8/src/stimfit/gui/printout.cpp0000775000175000017500000001714113062445067015647 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // printout.cpp // Controls printing of traces. // 2007-12-27, Christoph Schmidt-Hieber, University of Freiburg #include #ifndef WX_PRECOMP #include #endif #include #include "./app.h" #include "./view.h" #include "./parentframe.h" #include "./doc.h" #include "./printout.h" #include "./graph.h" extern wxStfParentFrame* frame; wxStfPrintout::wxStfPrintout(const wxChar *title) : wxPrintout(title) , store_noGimmicks(false) { wxStfDoc* pDoc = wxGetApp().GetActiveDoc(); if (!pDoc) { wxGetApp().ErrorMsg(wxT("Null pointer (pDoc) in wxStfPrintout::wxStfPrintout()\nAborting printing")); return; } wxStfView* pView = (wxStfView*)pDoc->GetFirstView(); if (!pView) { wxGetApp().ErrorMsg(wxT("Null pointer (pView) in wxStfPrintout::wxStfPrintout()\nAborting printing")); return; } wxStfGraph* pGraph = pView->GetGraph(); if (!pGraph) { wxGetApp().ErrorMsg(wxT("Null pointer (pGraph) in wxStfPrintout::wxStfPrintout()\nAborting printing")); return; } store_noGimmicks=wxGetApp().GetActiveView()->GetGraph()->get_noGimmicks(); } bool wxStfPrintout::OnPrintPage(int WXUNUSED(page)) { wxDC* dc=GetDC(); if (dc) { DrawPageOne(); return true; } else return false; } bool wxStfPrintout::OnBeginDocument(int startPage, int endPage) { if (!wxPrintout::OnBeginDocument(startPage, endPage)) return false; return true; } void wxStfPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) { *minPage = 1; *maxPage = 1; *selPageFrom = 1; *selPageTo = 1; } bool wxStfPrintout::HasPage(int pageNum) { return (pageNum == 1); } void wxStfPrintout::DrawPageOne() { int x,y; GetPPIPrinter(&x,&y); // Get size of Graph, in pixels: wxStfDoc* pDoc = wxGetApp().GetActiveDoc(); if (!pDoc) { wxGetApp().ErrorMsg(wxT("Null pointer (pDoc) in wxStfPrintout::DrawPageOne()\nAborting printing")); return; } wxStfView* pView = (wxStfView*)pDoc->GetFirstView(); if (!pView) { wxGetApp().ErrorMsg(wxT("Null pointer (pView) in wxStfPrintout::DrawPageOne()\nAborting printing")); return; } wxStfGraph* pGraph = pView->GetGraph(); if (!pGraph) { wxGetApp().ErrorMsg(wxT("Null pointer (pGraph) in wxStfPrintout::DrawPageOne()\nAborting printing")); return; } wxRect screenRect(pGraph->GetRect()); // Get size of page, in pixels: wxRect printRect=GetLogicalPageMarginsRect(*(frame->GetPageSetup())); // A first guess at the scale: double hScale=(double)printRect.height/(double)screenRect.height; double headerSizeY=0.0; // Space needed for the header: if (!store_noGimmicks) { headerSizeY=30.0*hScale; } else { pGraph->set_noGimmicks(true); } // Fit to width or fit to height? // If the screenRect's proportion is wider than the printRect's, // fit to width: double scale=1.0; wxRect propPrintRect(printRect); double prop=(double)screenRect.width/(double)screenRect.height; if (prop > (printRect.height-headerSizeY)/printRect.width) { scale=(double)printRect.width/(double)(screenRect.width); // keep width: propPrintRect.height=(int)((double)propPrintRect.width/prop); } else { scale=(double)(printRect.height-headerSizeY)/(double)(screenRect.height); propPrintRect.width=(int)((double)propPrintRect.height*prop); } // maximal extent of the Graph on paper: wxCoord maxX = (int)((double)(screenRect.width)*scale); wxCoord maxY = (int)((double)(screenRect.height)*scale); wxCoord xoff =(printRect.width - maxX) / 2.0; wxCoord yoff =(printRect.height - maxY) / 2.0; #ifdef __WXGTK__ xoff = -printRect.width*0.8; OffsetLogicalOrigin(xoff, 0); xoff = 0; #endif pGraph->set_isPrinted(true); pGraph->set_printScale(scale); // construct a rectangle with the same proportion as the graph on screen: pGraph->set_printRect(propPrintRect); if (!store_noGimmicks) { PrintHeader(GetDC(),hScale); } // create a font that looks similar to the screen font: wxFont font( (int)(6.0 * (double)x/72.0), wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ); GetDC()->SetFont(font); OffsetLogicalOrigin(xoff, (int)(yoff+headerSizeY)); pGraph->OnDraw(*GetDC()); pGraph->set_isPrinted(false); } void wxStfPrintout::PrintHeader(wxDC* pDC, double scale) { int ppiX,ppiY; GetPPIPrinter(&ppiX,&ppiY); double resScale = ppiX / 72.0; #ifdef _WINDOWS int fontScale=(int)(6.0 * resScale); #else int fontScale=(int)(10.0 * resScale); #endif int xstart=0; int ystart=0; // create a font that looks similar to the screen font: wxFont font( fontScale, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD ); GetDC()->SetFont(font); // File name and section number: wxString description; description << Doc()->GetFilename() << wxT(", Trace ") << (int)Doc()->GetCurSecIndex()+1 << wxT(" of ") << (int)Doc()->get()[Doc()->GetCurChIndex()].size(); pDC->DrawText(description,xstart,ystart); // Results: stfnum::Table table(Doc()->CurResultsTable()); font.SetWeight(wxFONTWEIGHT_NORMAL); pDC->SetFont(font); int xpos=xstart; for (std::size_t nRow=0;nRow<1;/*table.nRows()*/++nRow) { // row label: for (std::size_t nCol=0;nColDrawText(stf::std2wx(table.GetColLabel(nCol)),xpos,(int)(14.0*resScale)+ystart); if (!table.IsEmpty(nRow,nCol)) { wxString entry; entry << table.at(nRow,nCol); pDC->DrawText(entry,xpos,(int)(24.0*resScale)+ystart); } xpos+=colSize; } } try { stf::SectionAttributes sec_attr = Doc()->GetCurrentSectionAttributes(); if (sec_attr.isFitted) { wxRect WindowRect(GetLogicalPageMarginsRect(*(frame->GetPageSetup()))); int increment=WindowRect.height/50; int yPos=(int)(WindowRect.height*0.5); int xPos=(int)(WindowRect.width*0.75); // print fit info line by line: for (std::size_t n=0;n < sec_attr.bestFit.nRows();++n) { pDC->DrawText(stf::std2wx(sec_attr.bestFit.GetRowLabel(n)),xPos,yPos); wxString value; value << sec_attr.bestFit.at(n,0); pDC->DrawText(value,(int)(xPos+40.0*resScale),yPos); yPos+=increment; } } } catch (const std::out_of_range& e) { } } stimfit-0.15.8/src/stimfit/gui/table.cpp0000775000175000017500000000560713062445067015056 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // table.cpp // Table entries for spreadsheets in wxStfGrid. // 2007-12-27, Christoph Schmidt-Hieber, University of Freiburg #include "wx/wxprec.h" #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "wx/grid.h" #include "./table.h" bool wxStfTable::IsEmptyCell( int row, int col ) { try { if (row==0 && col>=1) { return table.GetColLabel(col-1) == "\0"; } else if (col==0 && row>=1) { return table.GetRowLabel(row-1) == "\0"; } else if (col!=0 && row!=0) { return table.IsEmpty(row-1,col-1); } else { return true; } } catch (const std::out_of_range&) { return true; } } wxString wxStfTable::GetValue( int row, int col ) { try { if (row==0 && col>=1) { return stf::std2wx(table.GetColLabel(col-1)); } else if (col==0 && row>=1) { return stf::std2wx(table.GetRowLabel(row-1)); } else if (col!=0 && row!=0) { if (table.IsEmpty(row-1,col-1)) return wxT("\0"); wxString strVal; strVal << table.at(row-1,col-1); return strVal; } else { return wxT("\0"); } } catch (const std::out_of_range&) { return wxT("\0"); } } void wxStfTable::SetValue( int row, int col, const wxString& value ) { try { if (row==0 && col>=1) { return table.SetColLabel(col-1, stf::wx2std(value)); } else if (col==0 && row>=1) { return table.SetRowLabel(row-1, stf::wx2std(value)); } else if (col!=0 && row!=0) { wxString strVal; strVal << value; double in=0.0; strVal.ToDouble(&in); table.at(row-1,col-1)=in; } else { return; } } catch (const std::out_of_range&) { return; } } wxString wxStfTable::GetSelection(const wxGridCellCoordsArray& selection) { wxString ret(wxT("\0")); for (std::size_t n_sel=0;n_selGetFilename()); childFrame->SetTitle(fn.GetName()); graph = GetMainFrame()->CreateGraph(this, childFrame); if (graph==NULL) { return false; } childFrame->GetMgr()->AddPane( graph, wxAuiPaneInfo().Caption(wxT("Traces")).Name(wxT("Traces")).CaptionVisible(true). CloseButton(false).Centre().PaneBorder(true) ); childFrame->GetMgr()->Update(); // childFrame->ActivateGraph(); #if defined(__X__) || defined(__WXMAC__) // X seems to require a forced resize // childFrame->SetClientSize(800,600); #endif childFrame->Show(true); Activate(true); return true; } wxStfDoc* wxStfView::Doc() { return (wxStfDoc*)GetDocument(); } wxStfDoc* wxStfView::DocC() const { return (wxStfDoc*)GetDocument(); } // Sneakily gets used for default print/preview // as well as drawing on the screen. void wxStfView::OnDraw(wxDC *WXUNUSED(pDC)) { } void wxStfView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint)) { if (graph) { graph->Refresh(); } } // Clean up windows used for displaying the view. bool wxStfView::OnClose(bool deleteWindow) { if ( !GetDocument()->Close() ) return false; Activate(false); if ( deleteWindow ) wxDELETE(childFrame); SetFrame(NULL); return true; } void wxStfView::OnActivateView(bool activate, wxView *activeView, wxView *deactiveView) { //this function will be called whenever the view is activated if (activeView!=NULL) { wxStfDoc *pDoc = ((wxStfView*)activeView)->Doc(); if (pDoc) { // Update menu checks: // pDoc->UpdateMenuCheckmarks(); if (frame!=NULL) frame->SetSingleChannel(pDoc->size()<2); pDoc->UpdateSelectedButton(); if (wxGetApp().GetCursorsDialog()!=NULL && wxGetApp().GetCursorsDialog()->IsShown()) { wxGetApp().GetCursorsDialog()->SetActiveDoc(Doc()); try { wxGetApp().GetCursorsDialog()->UpdateCursors(); } catch (const std::runtime_error& e) { wxGetApp().ExceptMsg(wxString( e.what(), wxConvLocal )); } } } #ifdef __WXGTK__ wxStfGraph *pGraph = ((wxStfView*)activeView)->GetGraph(); if (pGraph) pGraph->SetFocus(); #endif } #ifdef __WXMAC__ wxGetApp().SetMRActiveDoc(Doc()); #endif wxView::OnActivateView(activate,activeView,deactiveView); } stimfit-0.15.8/src/stimfit/gui/parentframe.h0000775000175000017500000002226613062445067015740 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file parentframe.h * \author Christoph Schmidt-Hieber * \date 2008-01-16 * \brief Declares wxStfParentFrame. */ #ifndef _PARENTFRAME_H #define _PARENTFRAME_H /*! \addtogroup wxstf * @{ */ #include #include #include #include "./../stf.h" class wxStfGraph; class wxStfTable; class wxStfGrid; class wxStfFileDrop; class wxProgressDialog; //! child frame type; depends on whether aui is used for the doc/view interface #ifdef WITH_AUIDOCVIEW typedef wxAuiDocMDIChildFrame wxStfChildType; #else typedef wxDocMDIChildFrame wxStfChildType; #endif //! parent frame type; depends on whether aui is used for the doc/view interface #ifdef WITH_AUIDOCVIEW typedef wxAuiDocMDIParentFrame wxStfParentType; #else typedef wxDocMDIParentFrame wxStfParentType; #endif typedef wxAuiToolBar wxStfToolBar; #ifdef WITH_PYTHON struct new_wxwindow { new_wxwindow(wxWindow* cppW=NULL, PyObject* pyW=NULL) : cppWindow(cppW), pyWindow(pyW) {} wxWindow* cppWindow; PyObject* pyWindow; }; #else struct new_wxwindow { new_wxwindow(wxWindow* cppW=NULL, void* pyW=NULL) : cppWindow(cppW), pyWindow(pyW) {} wxWindow* cppWindow; void* pyWindow; }; #endif //! Provides the top-level frame. /*! It is part of the of the document/view framework implemented in wxWidgets. * This class can only be used for MDI parent frames. */ class StfDll wxStfParentFrame : public wxStfParentType { DECLARE_CLASS(wxStfParentFrame) public: //! Constructor /*! \param manager Pointer to the document manager. * \param frame Pointer to the parent frame (should be NULL, because this is * the top-level frame * \param title Title of this frame. * \param pos Initial position of this frame. * \param size Initial size of this frame. * \param style Window style. */ wxStfParentFrame(wxDocManager *manager, wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size, long style); //! Destructor ~wxStfParentFrame(); //! Shows the "About" dialog. /*! \param event The menu event that made the call. */ void OnAbout(wxCommandEvent& event); //! Creates a new graph. /*! Called from view.cpp when a new drawing view is created. * \param view Pointer to the attached view. * \param parent Pointer to the child frame that will serve as a parent for the new graph. * \return A pointer to the newly created graph. */ wxStfGraph *CreateGraph(wxView *view, wxStfChildFrame *parent); //! Retrieve the current mouse mode. /*! \return The current mouse cursor mode. */ stf::cursor_type GetMouseQual() const; //! Sets the current mouse cursor mode. /*! \param value The new mouse cursor mode. */ void SetMouseQual(stf::cursor_type value); //! Sets status of the toolbar's selection button. /*! \param selected The desired toggle status of the selection button. */ void SetSelectedButton(bool selected); //! Retrieve which channels will be affected by scaling operations /*! \return The channels affected by scaling operations. */ stf::zoom_channels GetZoomQual() const; //! Set the channels that will be affected by scaling operations /*! \param value The channels affected by scaling operations. */ void SetZoomQual(stf::zoom_channels value); //! Set the zoom buttons to single- or multi-channel mode. /*! \param value Set to true for single- or false for multi-channel mode. */ void SetSingleChannel(bool value); //! Retrieves the print data /*! \return Pointer to the stored print data. */ wxPrintData* GetPrintData() { return m_printData.get(); } //! Retrieves the page setup /*! \return Pointer to the page setup data. */ wxPageSetupDialogData* GetPageSetup() { return m_pageSetupData.get(); } //! Retrieve the wxAuiManager. /*! \return A reference to the wxAuiManager. */ wxAuiManager& GetMgr() { return m_mgr; } //! Checks for updates. /*! \param progDlg An optional progress dialog */ void CheckUpdate( wxProgressDialog* progDlg=NULL ) const; new_wxwindow MakePythonWindow(const std::string& windowFunc, const std::string& mgr_name="pythonShell", const std::string& caption="Python Shell", bool show=true, bool full=false, bool isfloat=true, int width=-1, int height=-1, double mpl_width=8.0, double mpl_height=6.0); int GetMplFigNo() {return mpl_figno++;} private: wxAuiManager m_mgr; wxStfToolBar *m_cursorToolBar, *m_scaleToolBar; wxStfFileDrop* m_drop; #ifdef WITH_PYTHON wxString python_code2; // python import code void RedirectStdio(); #endif #if (__cplusplus < 201103) // print data, to remember settings during the session boost::shared_ptr m_printData; // page setup data boost::shared_ptr m_pageSetupData; #else // print data, to remember settings during the session std::shared_ptr m_printData; // page setup data std::shared_ptr m_pageSetupData; #endif bool firstResize; int mpl_figno; wxStfToolBar* CreateStdTb(); wxStfToolBar* CreateScaleTb(); wxStfToolBar* CreateEditTb(); wxStfToolBar* CreateCursorTb(); void OnHelp(wxCommandEvent& event); void OnCheckUpdate(wxCommandEvent& event); void OnToggleSelect(wxCommandEvent& event); void OnToolFirst(wxCommandEvent& event); void OnToolNext(wxCommandEvent& event); void OnToolPrevious(wxCommandEvent& event); void OnToolLast(wxCommandEvent& event); void OnToolXenl(wxCommandEvent& event); void OnToolXshrink(wxCommandEvent& event); void OnToolYenl(wxCommandEvent& event); void OnToolYshrink(wxCommandEvent& event); void OnToolUp(wxCommandEvent& event); void OnToolDown(wxCommandEvent& event); void OnToolFit(wxCommandEvent& event); void OnToolLeft(wxCommandEvent& event); void OnToolRight(wxCommandEvent& event); void OnToolCh1(wxCommandEvent& event); void OnToolCh2(wxCommandEvent& event); void OnToolSnapshotwmf(wxCommandEvent& event); void OnToolMeasure(wxCommandEvent& event); void OnToolPeak(wxCommandEvent& event); void OnToolBase(wxCommandEvent& event); void OnToolDecay(wxCommandEvent& event); void OnToolLatency(wxCommandEvent& event); void OnToolZoom(wxCommandEvent& event); void OnToolEvent(wxCommandEvent& event); void OnToolFitdecay(wxCommandEvent& event); #ifdef WITH_PSLOPE void OnToolPSlope(wxCommandEvent& event); #endif // void OnSwapChannels(wxCommandEvent& event); void OnCh2base(wxCommandEvent& event); void OnCh2pos(wxCommandEvent& event); void OnCh2zoom(wxCommandEvent& event); void OnCh2basezoom(wxCommandEvent& event); void OnAverage(wxCommandEvent& event); void OnAlignedAverage(wxCommandEvent& event); void OnExportfile(wxCommandEvent& event); void OnExportatf(wxCommandEvent& event); void OnExportigor(wxCommandEvent& event); void OnExporthdf5(wxCommandEvent& event); void OnConvert(wxCommandEvent& event); void OnPrint(wxCommandEvent& event); void OnScale(wxCommandEvent& event); void OnMpl(wxCommandEvent& event); void OnMplSpectrum(wxCommandEvent& event); void OnPageSetup(wxCommandEvent& event); void OnViewResults(wxCommandEvent& event); void OnSaveperspective(wxCommandEvent& event); void OnLoadperspective(wxCommandEvent& event); void OnRestoreperspective(wxCommandEvent& event); #ifdef WITH_PYTHON void OnViewshell(wxCommandEvent& event); void OnUserdef(wxCommandEvent& event); #endif void OnLStartMaxslope(wxCommandEvent& event); void OnLStartHalfrise(wxCommandEvent& event); void OnLStartPeak(wxCommandEvent& event); void OnLStartManual(wxCommandEvent& event); void OnLEndFoot(wxCommandEvent& event); void OnLEndMaxslope(wxCommandEvent& event); void OnLEndHalfrise(wxCommandEvent& event); void OnLEndPeak(wxCommandEvent& event); void OnLEndManual(wxCommandEvent& event); void OnLWindow(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; /*@}*/ #endif stimfit-0.15.8/src/stimfit/Makefile.in0000664000175000017500000013074613315356052014540 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @WITH_BIOSIGLITE_TRUE@am__append_1 = ../libbiosiglite/libbiosiglite.la subdir = src/stimfit ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acsite.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/stfconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) am__DEPENDENCIES_1 = libstimfit_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ ../libstfio/libstfio.la ../libstfnum/libstfnum.la \ $(am__append_1) am_libstimfit_la_OBJECTS = libstimfit_la-stf.lo libstimfit_la-app.lo \ libstimfit_la-unopt.lo libstimfit_la-doc.lo \ libstimfit_la-copygrid.lo libstimfit_la-graph.lo \ libstimfit_la-printout.lo libstimfit_la-parentframe.lo \ libstimfit_la-childframe.lo libstimfit_la-view.lo \ libstimfit_la-table.lo libstimfit_la-zoom.lo \ libstimfit_la-convertdlg.lo libstimfit_la-cursorsdlg.lo \ libstimfit_la-eventdlg.lo libstimfit_la-fitseldlg.lo \ libstimfit_la-smalldlgs.lo libstimfit_la-usrdlg.lo libstimfit_la_OBJECTS = $(am_libstimfit_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libstimfit_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) $(libstimfit_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libstimfit_la_SOURCES) DIST_SOURCES = $(libstimfit_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GT_CPPFLAGS = @GT_CPPFLAGS@ GT_CXXFLAGS = @GT_CXXFLAGS@ GT_LDFLAGS = @GT_LDFLAGS@ GT_LIBS = @GT_LIBS@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_LIBS = @HDF5_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBBIOSIG_LDFLAGS = @LIBBIOSIG_LDFLAGS@ LIBHDF5_LDFLAGS = @LIBHDF5_LDFLAGS@ LIBLAPACK_LDFLAGS = @LIBLAPACK_LDFLAGS@ LIBNUMPY_INCLUDES = @LIBNUMPY_INCLUDES@ LIBOBJS = @LIBOBJS@ LIBPYTHON_INCLUDES = @LIBPYTHON_INCLUDES@ LIBPYTHON_LDFLAGS = @LIBPYTHON_LDFLAGS@ LIBS = @LIBS@ LIBSTF_LDFLAGS = @LIBSTF_LDFLAGS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MACSETFILE = @MACSETFILE@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSTLINK_COMMAND = @POSTLINK_COMMAND@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_DIST_PKG = @PYTHON_DIST_PKG@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_NUMPY_INCLUDE = @PYTHON_NUMPY_INCLUDE@ PYTHON_PRE_DIST_PKG = @PYTHON_PRE_DIST_PKG@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ PY_AC_VERSION = @PY_AC_VERSION@ RANLIB = @RANLIB@ REZ = @REZ@ SED = @SED@ SETFILE = @SETFILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFIO_PYTHON_LIBNAME = @STFIO_PYTHON_LIBNAME@ STF_PYTHON_LIBNAME = @STF_PYTHON_LIBNAME@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ SWIG_PYTHON_CPPFLAGS = @SWIG_PYTHON_CPPFLAGS@ SWIG_PYTHON_OPT = @SWIG_PYTHON_OPT@ VERSION = @VERSION@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkglib_LTLIBRARIES = libstimfit.la libstimfit_la_SOURCES = ./stf.cpp \ ./gui/app.cpp ./gui/unopt.cpp ./gui/doc.cpp ./gui/copygrid.cpp ./gui/graph.cpp \ ./gui/printout.cpp ./gui/parentframe.cpp ./gui/childframe.cpp ./gui/view.cpp ./gui/table.cpp ./gui/zoom.cpp \ ./gui/dlgs/convertdlg.cpp ./gui/dlgs/cursorsdlg.cpp ./gui/dlgs/eventdlg.cpp \ ./gui/dlgs/fitseldlg.cpp ./gui/dlgs/smalldlgs.cpp \ ./gui/usrdlg/usrdlg.cpp libstimfit_la_CPPFLAGS = libstimfit_la_CXXFLAGS = $(OPT_CXXFLAGS) $(WX_CXXFLAGS) libstimfit_la_LDFLAGS = $(LIBPYTHON_LDFLAGS) $(LIBSTF_LDFLAGS) libstimfit_la_LIBADD = $(WX_LIBS) ../libstfio/libstfio.la \ ../libstfnum/libstfnum.la $(am__append_1) @BUILD_PYTHON_FALSE@PYTHON_ADDINCLUDES = # the application source, library search path, and link libraries @BUILD_PYTHON_TRUE@PYTHON_ADDINCLUDES = $(LIBNUMPY_INCLUDES) $(LIBPYTHON_INCLUDES) INCLUDES = $(PYTHON_ADDINCLUDES) all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/stimfit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/stimfit/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libstimfit.la: $(libstimfit_la_OBJECTS) $(libstimfit_la_DEPENDENCIES) $(EXTRA_libstimfit_la_DEPENDENCIES) $(AM_V_CXXLD)$(libstimfit_la_LINK) -rpath $(pkglibdir) $(libstimfit_la_OBJECTS) $(libstimfit_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-app.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-childframe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-convertdlg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-copygrid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-cursorsdlg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-doc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-eventdlg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-fitseldlg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-graph.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-parentframe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-printout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-smalldlgs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-stf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-table.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-unopt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-usrdlg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-view.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstimfit_la-zoom.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libstimfit_la-stf.lo: ./stf.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-stf.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-stf.Tpo -c -o libstimfit_la-stf.lo `test -f './stf.cpp' || echo '$(srcdir)/'`./stf.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-stf.Tpo $(DEPDIR)/libstimfit_la-stf.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./stf.cpp' object='libstimfit_la-stf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-stf.lo `test -f './stf.cpp' || echo '$(srcdir)/'`./stf.cpp libstimfit_la-app.lo: ./gui/app.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-app.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-app.Tpo -c -o libstimfit_la-app.lo `test -f './gui/app.cpp' || echo '$(srcdir)/'`./gui/app.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-app.Tpo $(DEPDIR)/libstimfit_la-app.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/app.cpp' object='libstimfit_la-app.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-app.lo `test -f './gui/app.cpp' || echo '$(srcdir)/'`./gui/app.cpp libstimfit_la-unopt.lo: ./gui/unopt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-unopt.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-unopt.Tpo -c -o libstimfit_la-unopt.lo `test -f './gui/unopt.cpp' || echo '$(srcdir)/'`./gui/unopt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-unopt.Tpo $(DEPDIR)/libstimfit_la-unopt.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/unopt.cpp' object='libstimfit_la-unopt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-unopt.lo `test -f './gui/unopt.cpp' || echo '$(srcdir)/'`./gui/unopt.cpp libstimfit_la-doc.lo: ./gui/doc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-doc.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-doc.Tpo -c -o libstimfit_la-doc.lo `test -f './gui/doc.cpp' || echo '$(srcdir)/'`./gui/doc.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-doc.Tpo $(DEPDIR)/libstimfit_la-doc.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/doc.cpp' object='libstimfit_la-doc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-doc.lo `test -f './gui/doc.cpp' || echo '$(srcdir)/'`./gui/doc.cpp libstimfit_la-copygrid.lo: ./gui/copygrid.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-copygrid.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-copygrid.Tpo -c -o libstimfit_la-copygrid.lo `test -f './gui/copygrid.cpp' || echo '$(srcdir)/'`./gui/copygrid.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-copygrid.Tpo $(DEPDIR)/libstimfit_la-copygrid.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/copygrid.cpp' object='libstimfit_la-copygrid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-copygrid.lo `test -f './gui/copygrid.cpp' || echo '$(srcdir)/'`./gui/copygrid.cpp libstimfit_la-graph.lo: ./gui/graph.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-graph.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-graph.Tpo -c -o libstimfit_la-graph.lo `test -f './gui/graph.cpp' || echo '$(srcdir)/'`./gui/graph.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-graph.Tpo $(DEPDIR)/libstimfit_la-graph.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/graph.cpp' object='libstimfit_la-graph.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-graph.lo `test -f './gui/graph.cpp' || echo '$(srcdir)/'`./gui/graph.cpp libstimfit_la-printout.lo: ./gui/printout.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-printout.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-printout.Tpo -c -o libstimfit_la-printout.lo `test -f './gui/printout.cpp' || echo '$(srcdir)/'`./gui/printout.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-printout.Tpo $(DEPDIR)/libstimfit_la-printout.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/printout.cpp' object='libstimfit_la-printout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-printout.lo `test -f './gui/printout.cpp' || echo '$(srcdir)/'`./gui/printout.cpp libstimfit_la-parentframe.lo: ./gui/parentframe.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-parentframe.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-parentframe.Tpo -c -o libstimfit_la-parentframe.lo `test -f './gui/parentframe.cpp' || echo '$(srcdir)/'`./gui/parentframe.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-parentframe.Tpo $(DEPDIR)/libstimfit_la-parentframe.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/parentframe.cpp' object='libstimfit_la-parentframe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-parentframe.lo `test -f './gui/parentframe.cpp' || echo '$(srcdir)/'`./gui/parentframe.cpp libstimfit_la-childframe.lo: ./gui/childframe.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-childframe.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-childframe.Tpo -c -o libstimfit_la-childframe.lo `test -f './gui/childframe.cpp' || echo '$(srcdir)/'`./gui/childframe.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-childframe.Tpo $(DEPDIR)/libstimfit_la-childframe.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/childframe.cpp' object='libstimfit_la-childframe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-childframe.lo `test -f './gui/childframe.cpp' || echo '$(srcdir)/'`./gui/childframe.cpp libstimfit_la-view.lo: ./gui/view.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-view.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-view.Tpo -c -o libstimfit_la-view.lo `test -f './gui/view.cpp' || echo '$(srcdir)/'`./gui/view.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-view.Tpo $(DEPDIR)/libstimfit_la-view.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/view.cpp' object='libstimfit_la-view.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-view.lo `test -f './gui/view.cpp' || echo '$(srcdir)/'`./gui/view.cpp libstimfit_la-table.lo: ./gui/table.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-table.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-table.Tpo -c -o libstimfit_la-table.lo `test -f './gui/table.cpp' || echo '$(srcdir)/'`./gui/table.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-table.Tpo $(DEPDIR)/libstimfit_la-table.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/table.cpp' object='libstimfit_la-table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-table.lo `test -f './gui/table.cpp' || echo '$(srcdir)/'`./gui/table.cpp libstimfit_la-zoom.lo: ./gui/zoom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-zoom.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-zoom.Tpo -c -o libstimfit_la-zoom.lo `test -f './gui/zoom.cpp' || echo '$(srcdir)/'`./gui/zoom.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-zoom.Tpo $(DEPDIR)/libstimfit_la-zoom.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/zoom.cpp' object='libstimfit_la-zoom.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-zoom.lo `test -f './gui/zoom.cpp' || echo '$(srcdir)/'`./gui/zoom.cpp libstimfit_la-convertdlg.lo: ./gui/dlgs/convertdlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-convertdlg.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-convertdlg.Tpo -c -o libstimfit_la-convertdlg.lo `test -f './gui/dlgs/convertdlg.cpp' || echo '$(srcdir)/'`./gui/dlgs/convertdlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-convertdlg.Tpo $(DEPDIR)/libstimfit_la-convertdlg.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/dlgs/convertdlg.cpp' object='libstimfit_la-convertdlg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-convertdlg.lo `test -f './gui/dlgs/convertdlg.cpp' || echo '$(srcdir)/'`./gui/dlgs/convertdlg.cpp libstimfit_la-cursorsdlg.lo: ./gui/dlgs/cursorsdlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-cursorsdlg.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-cursorsdlg.Tpo -c -o libstimfit_la-cursorsdlg.lo `test -f './gui/dlgs/cursorsdlg.cpp' || echo '$(srcdir)/'`./gui/dlgs/cursorsdlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-cursorsdlg.Tpo $(DEPDIR)/libstimfit_la-cursorsdlg.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/dlgs/cursorsdlg.cpp' object='libstimfit_la-cursorsdlg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-cursorsdlg.lo `test -f './gui/dlgs/cursorsdlg.cpp' || echo '$(srcdir)/'`./gui/dlgs/cursorsdlg.cpp libstimfit_la-eventdlg.lo: ./gui/dlgs/eventdlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-eventdlg.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-eventdlg.Tpo -c -o libstimfit_la-eventdlg.lo `test -f './gui/dlgs/eventdlg.cpp' || echo '$(srcdir)/'`./gui/dlgs/eventdlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-eventdlg.Tpo $(DEPDIR)/libstimfit_la-eventdlg.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/dlgs/eventdlg.cpp' object='libstimfit_la-eventdlg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-eventdlg.lo `test -f './gui/dlgs/eventdlg.cpp' || echo '$(srcdir)/'`./gui/dlgs/eventdlg.cpp libstimfit_la-fitseldlg.lo: ./gui/dlgs/fitseldlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-fitseldlg.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-fitseldlg.Tpo -c -o libstimfit_la-fitseldlg.lo `test -f './gui/dlgs/fitseldlg.cpp' || echo '$(srcdir)/'`./gui/dlgs/fitseldlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-fitseldlg.Tpo $(DEPDIR)/libstimfit_la-fitseldlg.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/dlgs/fitseldlg.cpp' object='libstimfit_la-fitseldlg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-fitseldlg.lo `test -f './gui/dlgs/fitseldlg.cpp' || echo '$(srcdir)/'`./gui/dlgs/fitseldlg.cpp libstimfit_la-smalldlgs.lo: ./gui/dlgs/smalldlgs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-smalldlgs.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-smalldlgs.Tpo -c -o libstimfit_la-smalldlgs.lo `test -f './gui/dlgs/smalldlgs.cpp' || echo '$(srcdir)/'`./gui/dlgs/smalldlgs.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-smalldlgs.Tpo $(DEPDIR)/libstimfit_la-smalldlgs.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/dlgs/smalldlgs.cpp' object='libstimfit_la-smalldlgs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-smalldlgs.lo `test -f './gui/dlgs/smalldlgs.cpp' || echo '$(srcdir)/'`./gui/dlgs/smalldlgs.cpp libstimfit_la-usrdlg.lo: ./gui/usrdlg/usrdlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -MT libstimfit_la-usrdlg.lo -MD -MP -MF $(DEPDIR)/libstimfit_la-usrdlg.Tpo -c -o libstimfit_la-usrdlg.lo `test -f './gui/usrdlg/usrdlg.cpp' || echo '$(srcdir)/'`./gui/usrdlg/usrdlg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstimfit_la-usrdlg.Tpo $(DEPDIR)/libstimfit_la-usrdlg.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='./gui/usrdlg/usrdlg.cpp' object='libstimfit_la-usrdlg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstimfit_la_CPPFLAGS) $(CPPFLAGS) $(libstimfit_la_CXXFLAGS) $(CXXFLAGS) -c -o libstimfit_la-usrdlg.lo `test -f './gui/usrdlg/usrdlg.cpp' || echo '$(srcdir)/'`./gui/usrdlg/usrdlg.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkglibLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkglibLTLIBRARIES .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stimfit-0.15.8/src/libbiosiglite/0000775000175000017500000000000013315356572013711 500000000000000stimfit-0.15.8/src/libbiosiglite/Makefile.am0000664000175000017500000000226613240265330015657 00000000000000if BUILD_MODULE if ISDARWIN PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} else PYTHON_TARGET_DIR=${PYTHON_PRE_DIST_PKG} # PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} endif PYTHON_DEST_DIR=${DESTDIR}${PYTHON_TARGET_DIR} pkglibdir = ${PYTHON_TARGET_DIR}/stfio endif pkglib_LTLIBRARIES = libbiosiglite.la libbiosiglite_la_SOURCES = \ biosig4c++/t210/sopen_abf_read.c \ biosig4c++/t210/sopen_alpha_read.c \ biosig4c++/t210/sopen_axg_read.c \ biosig4c++/t210/sopen_cfs_read.c \ biosig4c++/t210/sopen_heka_read.c \ biosig4c++/t210/sopen_igor.c \ biosig4c++/t210/sopen_scp_read.c \ biosig4c++/t210/scp-decode.cpp \ biosig4c++/t220/crc4scp.c \ biosig4c++/t220/sopen_scp_write.c \ biosig4c++/test0/sandbox.c \ biosig4c++/biosig.c \ biosig4c++/biosig2.c \ biosig4c++/biosig-network.c \ biosig4c++/biosig-HL7aECG-stub.c \ biosig4c++/gdftime.c \ biosig4c++/mdc_ecg_codes.c \ biosig4c++/physicalunits.c libbiosiglite_la_CPPFLAGS = -DWITH_BIOSIG2 -DWITH_ZLIB -DWITH_CHOLMOD -DWITHOUT_NETWORK libbiosiglite_la_LDFLAGS = libbiosiglite_la_LIBADD = $(LIBSTF_LDFLAGS) -lz -lcholmod if ISDARWIN # don't install anything because it has to go into the app bundle if !BUILD_MODULE install: endif endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/0000775000175000017500000000000013315356572015542 500000000000000stimfit-0.15.8/src/libbiosiglite/biosig4c++/units.i0000664000175000017500000002106513152223421016763 00000000000000#if 0 ### This file is autogenerated - Do not modify it !!! ### ### Vital Signs Units of Measurement # prEN ISO 11073-10101 (Nov 2003) # ISO/IEEE 11073-10101:2004 # Health Informatics - Point-of-care medical device communications - Part 10101: Nomenclature # p.62-75. Table A.6.3: Vital signs units of measurements # # CEN/TC251/PT40 2001 # File Exchange Format for Vital Signs - Annex A # # Copyright (C) 2005,2006,2008,2012,2016 Alois Schloegl # This file is part of the biosig project http://biosig.sf.net/ # # In some cases, there are more than one text representation for a certain code. #endif { 0, "?" }, { 512, "-" }, { 544, "%" }, { 544, "percent" }, { 576, "ppht" }, { 608, "ppm" }, { 640, "ppmd" }, { 672, "ppb" }, { 704, "ppt" }, { 736, "degree" }, { 768, "rad" }, { 800, "g g-1" }, { 832, "g kg-1" }, { 864, "mol mol-1" }, { 896, "l l-1" }, { 928, "m m-3" }, { 960, "m cm-3" }, { 6240, "vol %" }, { 992, "pH" }, { 1024, "drop" }, { 1056, "rbc" }, { 1088, "beat" }, { 1120, "breath" }, { 1152, "cell" }, { 1184, "cough" }, { 1216, "sigh" }, { 1248, "%PCV" }, { 1280, "m" }, { 1312, "yd" }, { 1344, "ft" }, { 1376, "in" }, { 1408, "lm-2" }, { 1440, "m-1" }, { 1472, "m2" }, { 1504, "in2" }, { 1536, "m-2" }, { 1568, "m3" }, { 1600, "l" }, { 1632, "l breath-1" }, { 6112, "l beat-1" }, { 1664, "m-3" }, { 1696, "l-1" }, { 1728, "g" }, { 1760, "lb" }, { 1792, "oz" }, { 1824, "g-1" }, { 1856, "g m" }, { 1888, "g m m-2" }, { 1920, "kg m2" }, { 1952, "kg m-2" }, { 1984, "g m-3" }, { 2016, "g cm-3" }, { 2048, "g l-1" }, { 2080, "g cl-3" }, { 2112, "g dl-3" }, { 2144, "g ml-3" }, { 2176, "s" }, { 2208, "min" }, { 2240, "h" }, { 2272, "d" }, { 2304, "weeks" }, { 2336, "mth" }, { 2368, "y" }, { 2400, "TOD" }, { 2432, "DATE" }, { 2464, "s-1" }, { 2496, "Hz" }, { 2528, "min-1" }, { 2560, "h-1" }, { 2592, "d-1" }, { 2624, "week-1" }, { 2656, "mth-1" }, { 2688, "y-1" }, { 2720, "bpm" }, { 2752, "puls min-1" }, { 2784, "resp min-1" }, { 2816, "m s-1" }, { 2848, "l min-1 m-2" }, { 2848, "l/(min*m²)" }, { 2880, "m2 s-1" }, { 2912, "m3 s-1" }, { 2944, "m3 min-1" }, { 2976, "m3 h-1" }, { 3008, "m3 d-1" }, { 3040, "l s-1" }, { 3072, "l min-1" }, { 3072, "l/min" }, { 3104, "l h-1" }, { 3136, "l d-1" }, { 3168, "l kg-1" }, { 3200, "m3 kg-1" }, { 3232, "m Pa-1s-1" }, { 3264, "l min-1 mmHG-1" }, { 3296, "g s-1" }, { 3328, "g m-1" }, { 3360, "g h-1" }, { 3392, "g d-1" }, { 3424, "g kg-1 s-1" }, { 3456, "g kg-1 m-1" }, { 3488, "g kg-1 h-1" }, { 3520, "g kg-1 d-1" }, { 3552, "g l-1 s-1" }, { 3584, "g l-1 m-1" }, { 3616, "g l-1 h-1" }, { 3648, "g l-1 d-1" }, { 3680, "g m-1 s-1" }, { 3712, "gm s-1" }, { 3744, "Ns" }, { 3776, "N" }, { 3808, "dyn" }, { 3840, "Pa" }, { 3872, "mmHg" }, { 3904, "cm H2O" }, { 3936, "bar" }, { 3968, "J" }, { 4000, "eV" }, { 4032, "W" }, { 4064, "Pa s m-3" }, { 4096, "Pa s l-1" }, { 5888, "l (cmH2O)-1" }, { 6272, "l (mmHg)-1" }, { 6304, "l Pa-1" }, { 6144, "cmH2O l-1" }, { 6336, "mmHg l-1" }, { 6368, "Pa l-1" }, { 4160, "A" }, { 4192, "C" }, { 6080, "Ah" }, { 4224, "A m-1" }, { 4256, "V" }, { 4288, "Ohm" }, { 4320, "Wm" }, { 4352, "F" }, { 4384, "K" }, { 6048, "°C" }, { 4416, "°F" }, { 4448, "K W-1" }, { 4480, "cd" }, { 4512, "osmole" }, { 4544, "mol" }, { 4576, "eq" }, { 4608, "osmol l-1" }, { 4640, "mol cm-3" }, { 4672, "mol m-3" }, { 4704, "mol l-1" }, { 4736, "mol ml-1" }, { 4768, "eq cm-3" }, { 4800, "eq m-3" }, { 4832, "eq l-1" }, { 4864, "eq ml-1" }, { 4896, "osmol kg-1" }, { 4928, "mol kg-1" }, { 4960, "mol s-1" }, { 4992, "mol min-1" }, { 5024, "mol h-1" }, { 5056, "mol d-1" }, { 5088, "eq s-1" }, { 5120, "eq min-1" }, { 5152, "eq h-1" }, { 5184, "eq d-1" }, { 5216, "mol kg-1 s-1" }, { 5248, "mol kg-1 min-1" }, { 5280, "mol kg-1 h-1" }, { 5312, "mol kg-1 d-1" }, { 5344, "eq kg-1 s-1" }, { 5376, "eq kg-1 min-1" }, { 5408, "eq kg-1 h-1" }, { 5440, "eq kg-1 d-1" }, { 5472, "i.u." }, { 5504, "i.u. cm-3" }, { 5536, "i.u. m-3" }, { 5568, "i.u. l-1" }, { 5600, "i.u. ml-1" }, { 5632, "i.u. s-1" }, { 5664, "i.u. min-1" }, { 5696, "i.u. h-1" }, { 5728, "i.u. d-1" }, { 5760, "i.u. kg-1 s-1" }, { 5792, "i.u. kg-1 min-1" }, { 5824, "i.u. kg-1 h-1" }, { 5856, "i.u. kg-1 d-1" }, { 5920, "cmH2O l-1s-1" }, { 5952, "l2s-1" }, { 5984, "cmH2O %-1" }, { 6016, "dyne s m-2 cm-5" }, { 6176, "mmHg %-1" }, { 6208, "Pa %-1" }, { 6432, "B" }, { 6624, "m s-2" }, { 6624, "m/s²" }, { 6656, "rad s2-2" }, { 6688, "ft min-1" }, { 6720, "in min-1" }, { 7776, "" }, { 7808, "dB(V)" }, { 7840, "dB(10V)" }, { 7872, "dB(W)" }, { 7744, "g m-2" }, { 8032, "cm2" }, { 8064, "s-2" }, { 8096, "rpm" }, { 8128, "drops min-1" }, { 6784, "g lb-1 min-1" }, { 6752, "g lb-1 h-1" }, { 6848, "g m-2 min-1" }, { 6816, "g m-2 h-1" }, { 7168, "g m-2 d-1" }, { 8160, "l cmH2O-1 kg-1" }, { 8192, "Wb m-2" }, { 8192, "T" }, { 8224, "Vs" }, { 8256, "V s-1" }, { 8256, "V/s" }, { 8288, "S" }, { 7552, "mol m-2" }, { 7584, "eq kg-1" }, { 7616, "eq m-2" }, { 7424, "mol m-2 s-1" }, { 7456, "mol m-2 min-1" }, { 7488, "mol m-2 h-1" }, { 7520, "mol m-2 d-1" }, { 7040, "eq lb-2 min-1" }, { 7008, "eq lb-2 h-1" }, { 7104, "eq m-2 min-1" }, { 7072, "eq m-2 h-1" }, { 7136, "eq m-2 d-1" }, { 7680, "i.u. kg-1" }, { 7712, "i.u. m-2" }, { 6912, "i.u. lb-1 min-1" }, { 10400, "i.u. lb-1 h-1" }, { 6880, "i.u. lb-1 d-1" }, { 7648, "i.u. m-2 s-1" }, { 6976, "i.u. m-2 min-1" }, { 6944, "i.u. m-2 h-1" }, { 7200, "i.u. m-2 d-1" }, { 8320, "dyne s m2 cm-5" }, { 8352, "cal" }, { 8384, "nutr cal" }, { 8416, "cal d-1" }, { 7264, "L kg-1 min-1" }, { 7232, "L kg-1 h-1" }, { 7296, "L kg-1 d-1" }, { 7328, "L m-2 min-1" }, { 7360, "L m-2 h-1" }, { 7392, "L m-2 d-1" }, { 8448, "J/breath" }, { 8480, "J/L" }, { 10528, "J/mL" }, { 10496, "J/day" }, { 8480, "J/L" }, { 8512, "dyn s cm-5" }, { 8512, "dyne s cm-5" }, { 8544, "PRU" }, { 8576, "WU" }, { 8608, "b" }, { 8640, "B" }, { 8672, "drops/L" }, { 8704, "breaths/min/L" }, { 8736, "breaths^2/min/L" }, { 8768, "L/min/kg" }, { 8800, "sat-sec" }, { 8832, "m/V" }, { 8864, "gf m" }, { 8896, "gf m L-1" }, { 8928, "gf m m-2" }, { 8960, "cal kg-1" }, { 8992, "cal kg-1 d-1" }, { 9024, "cal mL-1" }, { 9056, "arb.u" }, { 9088, "arb.u cm-3" }, { 9120, "arb.u m-3" }, { 9152, "arb.u l-1" }, { 9184, "arb.u ml-1" }, { 9216, "arb.u s-1" }, { 9248, "arb.u min-1" }, { 9280, "arb.u h-1" }, { 9312, "arb.u d-1" }, { 9344, "arb.u kg-1" }, { 9376, "arb.u m-2" }, { 9408, "arb.u kg-1 s-1" }, { 9440, "arb.u kg-1 min-1" }, { 9472, "arb.u kg-1 h-1" }, { 9504, "arb.u kg-1 d-1" }, { 9536, "arb.u lb-1 min-1" }, { 10432, "arb.u lb-1 h-1" }, { 9568, "arb.u lb-1 d-1" }, { 9600, "arb.u m-2 s-1" }, { 9632, "arb.u m-2 min-1" }, { 9664, "arb.u m-2 h-1" }, { 9696, "arb.u m-2 d-1" }, { 9728, "USP.u" }, { 9760, "USP.u cm-3" }, { 9792, "USP.u m-3" }, { 9824, "USP.u l-1" }, { 9856, "USP.u ml-1" }, { 9888, "USP.u s-1" }, { 9920, "USP.u min-1" }, { 9952, "USP.u h-1" }, { 9984, "USP.u d-1" }, { 10016, "USP.u kg-1" }, { 10048, "USP.u m-2" }, { 10080, "USP.u kg-1 s-1" }, { 10112, "USP.u kg-1 min-1" }, { 10144, "USP.u kg-1 h-1" }, { 10176, "USP.u kg-1 d-1" }, { 10208, "USP.u lb-1 min-1" }, { 10464, "USP.u lb-1 h-1" }, { 10240, "USP.u lb-1 d-1" }, { 10272, "USP.u m-2 s-1" }, { 10304, "USP.u m-2 min-1" }, { 10336, "USP.u m-2 h-1" }, { 10368, "USP.u m-2 d-1" }, { 10560, "vol % L-1" }, { 10592, "Pa L-1" }, { 10624, "Pa mL-1" }, { 10656, "bar L-1" }, { 10688, "bar L-1 10-1" }, { 10720, "bar mL-1" }, { 10752, "bar s L-1" }, { 10784, "bar s L-1 10-1" }, { 10816, "L hPa-1" }, { 10848, "L bar-1" }, { 10880, "L mbar-1" }, { 10912, "J/L/s" }, { 10944, "mmHg min-1" }, { 10976, "mmHg s-1" }, { 11008, "bar s-1" }, { 11040, "cmH2O min-1" }, { 11072, "% per 1/2 h" }, { 11104, "L beat-1 m-2" }, { 11136, "V cm-1" }, { 11168, "W cm-2 mm-1" }, { 11200, "cmH2O uV-1" }, { 65088, "mph" }, { 65120, "Nm" }, { 65152, "V/s" }, { 65184, "m/m" }, { 65216, "km/h" }, { 65248, "g s-2" }, { 65280, "g s-3" }, { 65312, "mHg s-1" }, { 65344, "mol l-1 mm" }, { 65376, "r.p.m" }, { 65408, "B" }, { 65440, "dyne s m2 cm-5" }, { 65440, "dyne*s*m²/cm^5" }, { 65472, "l m-2" }, { 65472, "l/m²" }, { 65504, "T" }, stimfit-0.15.8/src/libbiosiglite/biosig4c++/biosig-dev.h0000775000175000017500000011433313240263033017655 00000000000000/* % Copyright (C) 2005-2018 Alois Schloegl % This file is part of the "BioSig for C/C++" repository % (biosig4c++) at http://biosig.sf.net/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. */ /* Internal definitions (external API is defined in biosig.h) */ /****************************************************************************/ /** **/ /** CONSTANTS and Global variables **/ /** **/ /****************************************************************************/ #ifndef __BIOSIG_INTERNAL_H__ #define __BIOSIG_INTERNAL_H__ #include #include #include #include #if !defined(_MSC_VER) #include #endif #include #include "physicalunits.h" #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C #endif #ifdef __cplusplus extern "C" { #endif #ifdef NDEBUG #define VERBOSE_LEVEL 0 // turn off debugging information, but its only used without NDEBUG #else extern int VERBOSE_LEVEL; // used for debugging, variable is always defined #endif /* Including ZLIB enables reading gzipped files (they are decompressed on-the-fly) The output files can be zipped, too. */ #ifdef HAVE_ZLIB #include #ifndef ZLIB_H #if defined(__MINGW64__) #include "win64/zlib/zlib.h" #elif defined(__MINGW32__) #include "win32/zlib/include/zlib.h" #endif #endif #endif #ifdef HAVE_CHOLMOD #ifdef __APPLE__ #include #else #include #endif #endif #ifdef HAVE_HDF5 #include #endif #ifdef WITH_NIFTI #include #endif #ifdef WITH_GSL #include #endif #ifdef __WIN32__ #define FILESEP '\\' char *getlogin (void); #else #define FILESEP '/' #endif /* test whether HDR.CHANNEL[].{bi,bi8} can be replaced, reduction of header size by about 3% currently this is not working, because FAMOS seems to need it. //#define NO_BI */ /* External API definitions - this was part of old biosig.h */ // #include "biosig.h" /****************************************************************************/ /** **/ /** DEFINITIONS, TYPEDEFS AND MACROS **/ /** **/ /****************************************************************************/ #define BIOSIG_VERSION_MAJOR 1 #define BIOSIG_VERSION_MINOR 9 #define BIOSIG_PATCHLEVEL 0 // for backward compatibility #define BIOSIG_VERSION_STEPPING BIOSIG_PATCHLEVEL #define BIOSIG_VERSION (BIOSIG_VERSION_MAJOR * 10000 + BIOSIG_VERSION_MINOR * 100 + BIOSIG_PATCHLEVEL) // biosigCHECK_VERSION returns true if BIOSIG_VERSION is at least a.b.c #define biosigCHECK_VERSION(a,b,c) (BIOSIG_VERSION >= ( 10000*(a) + 100*(b) + (c) ) ) #if defined(_MSC_VER) && (_MSC_VER < 1600) #if defined(_WIN64) typedef __int64 ssize_t; typedef unsigned __int64 size_t; #else typedef __int32 ssize_t; typedef unsigned __int32 size_t; #endif typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned __int32 uint32_t; typedef __int32 int32_t; typedef __int16 int16_t; typedef unsigned __int8 uint8_t; typedef __int8 int8_t; #else #include #endif #include "gdftime.h" /* * pack structures to fullfil following requirements: * (1) Matlab v7.3+ requires 8 byte alignment * (2) in order to use mingw-compiled libbiosig with MS' VisualStudio, * the structurs must be packed in a MS compatible way. */ #pragma pack(push, 8) //* this is probably redundant to the #pragma pack(8) statement, its here to do it the gnu way, too. */ #ifdef __GNUC__ #define ATT_ALI __attribute__ ((aligned (8))) #define ATT_DEPREC __attribute__ ((deprecated)) #else #define ATT_ALI #define ATT_DEPREC #endif #if defined(_MINGW32__) || defined(__CYGWIN__) #pragma ms_struct on #define ATT_MSSTRUCT __attribute__ ((ms_struct)) #else #define ATT_MSSTRUCT #endif /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * biosig_data_type data type of internal data format * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ typedef double biosig_data_type; /****************************************************************************/ /** **/ /** CONSTANTS and Global variables **/ /** **/ /****************************************************************************/ /* for error handling */ enum B4C_ERROR { B4C_NO_ERROR=0, B4C_FORMAT_UNKNOWN, B4C_FORMAT_UNSUPPORTED, B4C_CANNOT_OPEN_FILE, B4C_CANNOT_WRITE_FILE, B4C_CANNOT_APPEND_FILE, B4C_INSUFFICIENT_MEMORY, B4C_ENDIAN_PROBLEM, B4C_CRC_ERROR, B4C_DATATYPE_UNSUPPORTED, B4C_SCLOSE_FAILED, B4C_DECOMPRESSION_FAILED, B4C_MEMORY_ALLOCATION_FAILED, B4C_RAWDATA_COLLAPSING_FAILED, B4C_REREF_FAILED, B4C_INCOMPLETE_FILE, B4C_UNSPECIFIC_ERROR, B4C_CHAR_ENCODING_UNSUPPORTED }; #ifdef BIN #undef BIN // needed for biosig4perl #endif #ifdef EVENT #undef EVENT // defined by MS VC++ #endif /* list of file formats */ enum FileFormat { noFile, unknown, ABF, ABF2, ACQ, ACR_NEMA, AIFC, AIFF, AINF, alpha, ARFF, ASCII_IBI, ASCII, AU, ASF, ATES, ATF, AVI, AXG, Axona, BCI2000, BDF, BESA, BIN, BKR, BLSC, BMP, BNI, BSCS, BrainVision, BrainVisionVAmp, BrainVisionMarker, BZ2, CDF, CFS, CFWB, CNT, CTF, DICOM, DEMG, EBS, EDF, EEG1100, EEProbe, EEProbe2, EEProbeAvr, EGI, EGIS, ELF, EMBLA, EMSA, ePrime, ET_MEG, ETG4000, EVENT, EXIF, FAMOS, FEF, FIFF, FITS, FLAC, GDF, GDF1, GIF, GTF, GZIP, HDF, HL7aECG, HEKA, IBW, ISHNE, ITX, JPEG, JSON, Lexicor, Matlab, MFER, MIDI, MIT, MM, MSI, MSVCLIB, MS_LNK, MX, native, NeuroLoggerHEX, NetCDF, NEURON, NEV, NEX1, NIFTI, NUMPY, OGG, OpenXDF, PBMA, PBMN, PDF, PDP, Persyst, PGMA, PGMB, PLEXON, PNG, PNM, POLY5, PPMA, PPMB, PS, RDF, RIFF, SASXPT, SCP_ECG, SIGIF, Sigma, SMA, SMR, SND, SQLite, SPSS, STATA, SVG, SXI, SYNERGY, TDMS, TIFF, TMS32, TMSiLOG, TRC, UNIPRO, VRML, VTK, WAV, WCP, WG1, WinEEG, WMF, XML, XPM, Z, ZIP, ZIP2, RHD2000, invalid=0xffff }; /* This part has moved into biosig-dev.h in v1.4.1, because VERBOSE_LEVEL is just used for debugging and should not be exposed to common applications #ifdef NDEBUG #define VERBOSE_LEVEL 0 // turn off debugging information #else extern int VERBOSE_LEVEL; // used for debugging #endif */ /****************************************************************************/ /** **/ /** DEFINITIONS, TYPEDEFS AND MACROS **/ /** **/ /****************************************************************************/ typedef int64_t nrec_t; /* type for number of records */ /****************************************************************************/ /** **/ /** TYPEDEFS AND STRUCTURES **/ /** **/ /****************************************************************************/ /* This structure defines the header for each channel (variable header) */ // TODO: change fixed length strings to dynamically allocated strings #define MAX_LENGTH_LABEL 80 // TMS: 40, AXG: 79 #define MAX_LENGTH_TRANSDUCER 80 #if (BIOSIG_VERSION < 10600) #define MAX_LENGTH_PHYSDIM 20 // DEPRECATED - DO NOT USE #else #undef MAX_LENGTH_PHYSDIM #endif #define MAX_LENGTH_PID 80 // length of Patient ID: MFER<65, GDF<67, EDF/BDF<81, etc. #define MAX_LENGTH_RID 80 // length of Recording ID: EDF,GDF,BDF<80, HL7 ? #define MAX_LENGTH_NAME 132 // max length of personal name: MFER<=128, EBS<=33*4 #define MAX_LENGTH_MANUF 128 // max length of manufacturer field: MFER<128 #define MAX_LENGTH_TECHNICIAN 128 // max length of manufacturer field: SCP<41 typedef struct CHANNEL_STRUCT { double PhysMin ATT_ALI; /* physical minimum */ double PhysMax ATT_ALI; /* physical maximum */ double DigMin ATT_ALI; /* digital minimum */ double DigMax ATT_ALI; /* digital maximum */ double Cal ATT_ALI; /* gain factor */ double Off ATT_ALI; /* bias */ char Label[MAX_LENGTH_LABEL+1] ATT_ALI; /* Label of channel */ char OnOff ATT_ALI; /* 0: channel is off, not consider for data output; 1: channel is turned on; 2: channel containing time axis */ uint16_t LeadIdCode ATT_ALI; /* Lead identification code */ char Transducer[MAX_LENGTH_TRANSDUCER+1] ATT_ALI; /* transducer e.g. EEG: Ag-AgCl electrodes */ #ifdef MAX_LENGTH_PHYSDIM char PhysDim[MAX_LENGTH_PHYSDIM+1] ATT_ALI ATT_DEPREC; /* DONOT USE - use PhysDim3(PhysDimCode) instead */ #endif uint16_t PhysDimCode ATT_ALI; /* code for physical dimension - PhysDim3(PhysDimCode) returns corresponding string */ float TOffset ATT_ALI; /* time delay of sampling */ float LowPass ATT_ALI; /* lowpass filter */ float HighPass ATT_ALI; /* high pass */ float Notch ATT_ALI; /* notch filter */ float XYZ[3] ATT_ALI; /* sensor position */ union { /* context specific channel information */ float Impedance ATT_ALI; /* Electrode Impedance in Ohm, defined only if PhysDim = _Volt */ float fZ ATT_ALI; /* ICG probe frequency, defined only if PhysDim = _Ohm */ } ATT_ALI; /* this part should not be used by application programs */ uint8_t* bufptr ATT_ALI; /* pointer to buffer: NRec<=1 and bi,bi8 not used */ uint32_t SPR ATT_ALI; /* samples per record (block) */ uint32_t bi ATT_ALI; /* start byte (byte index) of channel within data block */ uint32_t bi8 ATT_ALI; /* start bit (bit index) of channel within data block */ uint16_t GDFTYP ATT_ALI; /* data type */ } CHANNEL_TYPE ATT_ALI ATT_MSSTRUCT; /* This structure defines the general (fixed) header */ typedef struct HDR_STRUCT { char* FileName ATT_ALI; /* FileName - dynamically allocated, local copy of file name */ union { // workaround for transition to cleaner fieldnames float VERSION; /* GDF version number */ float Version; /* GDF version number */ } ATT_ALI; union { // workaround for transition to cleaner fieldnames enum FileFormat TYPE; /* type of file format */ enum FileFormat Type; /* type of file format */ } ATT_ALI; struct { size_t size[2] ATT_ALI; /* size {rows, columns} of data block */ biosig_data_type* block ATT_ALI; /* data block */ } data ATT_ALI; uint8_t IPaddr[16] ATT_ALI; /* IP address of recording device (if applicable) */ double SampleRate ATT_ALI; /* Sampling rate */ nrec_t NRec ATT_ALI; /* number of records/blocks -1 indicates length is unknown. */ gdf_time T0 ATT_ALI; /* starttime of recording */ uint32_t HeadLen ATT_ALI; /* length of header in bytes */ uint32_t SPR ATT_ALI; /* samples per block (when different sampling rates are used, this is the LCM(CHANNEL[..].SPR) */ uint32_t LOC[4] ATT_ALI; /* location of recording according to RFC1876 */ uint16_t NS ATT_ALI; /* number of channels */ int16_t tzmin ATT_ALI; /* time zone : minutes east of UTC */ #ifdef CHOLMOD_H cholmod_sparse *Calib ATT_ALI; /* re-referencing matrix */ #else void *Calib ATT_ALI; /* re-referencing matrix */ #endif CHANNEL_TYPE *rerefCHANNEL ATT_ALI; /* Patient specific information */ struct { gdf_time Birthday; /* Birthday of Patient */ // Age; // the age is HDR.T0 - HDR.Patient.Birthday, even if T0 and Birthday are not known uint16_t Headsize[3]; /* circumference, nasion-inion, left-right mastoid in millimeter; */ /* Patient Name: * can consist of up to three components, separated by the unit separator ascii(31), 0x1f, containing in that order Last name, first name, second last name (see also SCP-ECG specification EN1064, Section 1, tag 0, 1, and 3) * for privacy protection this field is by default not supported, support can be turned on with FLAG.ANONYMOUS */ char Name[MAX_LENGTH_NAME+1]; char Id[MAX_LENGTH_PID+1]; /* patient identification, identification code as used in hospital */ uint8_t Weight; /* weight in kilograms [kg] 0:unkown, 255: overflow */ uint8_t Height; /* height in centimeter [cm] 0:unkown, 255: overflow */ // BMI; // the body-mass index = weight[kg]/height[m]^2 /* Patient classification */ int8_t Sex; /* 0:Unknown, 1: Male, 2: Female */ int8_t Handedness; /* 0:Unknown, 1: Right, 2: Left, 3: Equal */ int8_t Smoking; /* 0:Unknown, 1: NO, 2: YES */ int8_t AlcoholAbuse; /* 0:Unknown, 1: NO, 2: YES */ int8_t DrugAbuse; /* 0:Unknown, 1: NO, 2: YES */ int8_t Medication; /* 0:Unknown, 1: NO, 2: YES */ struct { int8_t Visual; /* 0:Unknown, 1: NO, 2: YES, 3: Corrected */ int8_t Heart; /* 0:Unknown, 1: NO, 2: YES, 3: Pacemaker */ } Impairment; } Patient ATT_ALI; struct { char Recording[MAX_LENGTH_RID+1]; /* HL7, EDF, GDF, BDF replaces HDR.AS.RID */ char* Technician; char* Hospital; /* recording institution */ uint64_t Equipment; /* identifies this software */ struct { /* see SCP: section1, tag14, MFER: tag23: "Manufacturer^model^version number^serial number" */ const char* Name; const char* Model; const char* Version; const char* SerialNumber; char _field[MAX_LENGTH_MANUF+1]; /* buffer */ } Manufacturer; } ID ATT_ALI; /* position of electrodes; see also HDR.CHANNEL[k].XYZ */ struct { float REF[3]; /* XYZ position of reference electrode */ float GND[3]; /* XYZ position of ground electrode */ } ELEC ATT_ALI; /* EVENTTABLE */ struct { double SampleRate ATT_ALI; /* for converting POS and DUR into seconds */ uint16_t *TYP ATT_ALI; /* defined at http://biosig.svn.sourceforge.net/viewvc/biosig/trunk/biosig/doc/eventcodes.txt */ uint32_t *POS ATT_ALI; /* starting position [in samples] using a 0-based indexing */ uint32_t *DUR ATT_ALI; /* duration [in samples] */ uint16_t *CHN ATT_ALI; /* channel number; 0: all channels */ #if (BIOSIG_VERSION >= 10500) gdf_time *TimeStamp ATT_ALI; /* store time stamps */ #endif const char* *CodeDesc ATT_ALI; /* describtion of "free text"/"user specific" events (encoded with TYP=0..255 */ uint32_t N ATT_ALI; /* number of events */ uint16_t LenCodeDesc ATT_ALI; /* length of CodeDesc Table */ } EVENT ATT_ALI; struct { /* flags */ char OVERFLOWDETECTION; /* overflow & saturation detection 0: OFF, !=0 ON */ char UCAL; /* UnCalibration 0: scaling !=0: NO scaling - raw data return */ char ANONYMOUS; /* 1: anonymous mode, no personal names are processed */ char ROW_BASED_CHANNELS; /* 0: column-based data [default]; 1: row-based data */ char TARGETSEGMENT; /* in multi-segment files (like Nihon-Khoden, EEG1100), it is used to select a segment */ } FLAG ATT_ALI; CHANNEL_TYPE *CHANNEL ATT_ALI; // moving CHANNEL after the next struct (HDR.FILE) gives problems at AMD64 MEX-file. // perhaps some alignment problem. struct { /* File specific data */ #ifdef ZLIB_H gzFile gzFID; #else void* gzFID; #endif #ifdef _BZLIB_H // BZFILE* bzFID; #endif FILE* FID; /* file handle */ size_t size; /* size of file - experimental: only partly supported */ size_t POS; /* current reading/writing position [in blocks] */ //size_t POS2; // current reading/writing position [in samples] */ int Des; /* file descriptor */ int DES; /* descriptor for streams */ uint8_t OPEN; /* 0: closed, 1:read, 2: write */ uint8_t LittleEndian; /* 1 if file is LittleEndian data format and 0 for big endian data format*/ uint8_t COMPRESSION; /* 0: no compression 9: best compression */ } FILE ATT_ALI; /* internal variables (not public) */ struct { const char* B4C_ERRMSG; /* error message */ // char PID[MAX_LENGTH_PID+1]; // use HDR.Patient.Id instead // char* RID; // recording identification uint32_t bpb; /* total bytes per block */ uint32_t bpb8; /* total bits per block */ uint8_t* Header; uint8_t* rawEventData; uint8_t* rawdata; /* raw data block */ size_t first; /* first block loaded in buffer - this is equivalent to hdr->FILE.POS */ size_t length; /* number of block(s) loaded in buffer */ uint8_t* auxBUF; /* auxillary buffer - used for storing EVENT.CodeDesc, MIT FMT infor, alpha:rawdata header */ union { char* bci2000; /* application specific free text field */ char* fpulse; char* stimfit; }; uint32_t SegSel[5]; /* segment selection in a hirachical data formats, e.g. sweeps in HEKA/PatchMaster format */ enum B4C_ERROR B4C_ERRNUM; /* error code */ char flag_collapsed_rawdata; /* 0 if rawdata contain obsolete channels, too. */ } AS ATT_ALI; void *aECG; /* used as an pointer to (non-standard) auxilary information - mostly used for hacks */ uint64_t viewtime; /* used by edfbrowser */ #if (BIOSIG_VERSION >= 10500) struct { /* This part contains Section 7-11 of the SCP-ECG format without its 16 byte "Section ID header". These sections are also stored in GDF Header 3 (tag 9-13) It is mostly used for SCP<->GDF conversion. The pointers points into hdr->AS.Header, so do not dynamically re-allocate the pointers. */ const uint8_t* Section7; const uint8_t* Section8; const uint8_t* Section9; const uint8_t* Section10; const uint8_t* Section11; uint32_t Section7Length; uint32_t Section8Length; uint32_t Section9Length; uint32_t Section10Length; uint32_t Section11Length; } SCP; #endif } HDRTYPE ATT_MSSTRUCT; /* This structure defines codes and groups of the event table */ // Desription of event codes struct etd_t { uint16_t typ; // used in HDR.EVENT.TYP uint16_t groupid; // defines the group id as used in EventCodeGroups below const char* desc; // name/description of event code // const decrease signifitiantly number of warning } ATT_MSSTRUCT; // Groups of event codes struct event_groups_t { uint16_t groupid; const char* GroupDescription; // const decrease signifitiantly number of warning } ATT_MSSTRUCT; struct FileFormatStringTable_t { enum FileFormat fmt; const char* FileTypeString; } ATT_MSSTRUCT; struct NomenclatureAnnotatedECG_t { uint16_t part; uint16_t code10; uint32_t cf_code10; const char *refid; } ATT_MSSTRUCT; extern const struct etd_t ETD []; extern const struct event_groups_t EventCodeGroups []; extern const struct FileFormatStringTable_t FileFormatStringTable []; /* reset structure packing to default settings */ #pragma pack(pop) #if defined(_MINGW32__) || defined(__CYGWIN__) #pragma ms_struct reset #endif #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #if 0 #elif defined(__linux__) # include # include #elif defined(__GLIBC__) // for Hurd # include # include #elif defined(__CYGWIN__) # include # include #elif defined(__WIN32__) || defined(_WIN32) # include # define __BIG_ENDIAN 4321 # define __LITTLE_ENDIAN 1234 # define __BYTE_ORDER __LITTLE_ENDIAN # define bswap_16(x) __builtin_bswap16(x) # define bswap_32(x) __builtin_bswap32(x) # define bswap_64(x) __builtin_bswap64(x) # include # if !defined(_MSC_VER) # include # endif # if BYTE_ORDER == LITTLE_ENDIAN # define htobe16(x) htons(x) # define htole16(x) (x) # define be16toh(x) ntohs(x) # define le16toh(x) (x) # define htobe32(x) htonl(x) # define htole32(x) (x) # define be32toh(x) ntohl(x) # define le32toh(x) (x) # define htole64(x) (x) # if !defined(_MSC_VER) # define htobe64(x) __builtin_bswap64(x) # define be64toh(x) __builtin_bswap64(x) # else # define ntohll(x) (((_int64)(ntohl((int)((x << 32) >> 32))) << 32) | (unsigned int)ntohl(((int)(x >> 32)))) # define htonll(x) ntohll(x) # define htobe64(x) htonll(x) # define be64toh(x) ntohll(x) # endif # define le64toh(x) (x) # elif BYTE_ORDER == BIG_ENDIAN /* that would be xbox 360 */ # define htobe16(x) (x) # define htole16(x) __builtin_bswap16(x) # define be16toh(x) (x) # define le16toh(x) __builtin_bswap16(x) # define htobe32(x) (x) # define htole32(x) __builtin_bswap32(x) # define be32toh(x) (x) # define le32toh(x) __builtin_bswap32(x) # define htobe64(x) (x) # define htole64(x) __builtin_bswap64(x) # define be64toh(x) (x) # define le64toh(x) __builtin_bswap64(x) # else # error byte order not supported # endif #elif defined(__NetBSD__) # include # define __BIG_ENDIAN _BIG_ENDIAN # define __LITTLE_ENDIAN _LITTLE_ENDIAN # define __BYTE_ORDER _BYTE_ORDER # define bswap_16(x) bswap16(x) # define bswap_32(x) bswap32(x) # define bswap_64(x) bswap64(x) #elif defined(__APPLE__) # define __BIG_ENDIAN 4321 # define __LITTLE_ENDIAN 1234 #if (defined(__LITTLE_ENDIAN__) && (__LITTLE_ENDIAN__ == 1)) #define __BYTE_ORDER __LITTLE_ENDIAN #else #define __BYTE_ORDER __BIG_ENDIAN #endif # include # define bswap_16 OSSwapInt16 # define bswap_32 OSSwapInt32 # define bswap_64 OSSwapInt64 # define htobe16(x) OSSwapHostToBigInt16(x) # define htole16(x) OSSwapHostToLittleInt16(x) # define be16toh(x) OSSwapBigToHostInt16(x) # define le16toh(x) OSSwapLittleToHostInt16(x) # define htobe32(x) OSSwapHostToBigInt32(x) # define htole32(x) OSSwapHostToLittleInt32(x) # define be32toh(x) OSSwapBigToHostInt32(x) # define le32toh(x) OSSwapLittleToHostInt32(x) # define htobe64(x) OSSwapHostToBigInt64(x) # define htole64(x) OSSwapHostToLittleInt64(x) # define be64toh(x) OSSwapBigToHostInt64(x) # define le64toh(x) OSSwapLittleToHostInt64(x) #elif defined(__OpenBSD__) # include # define bswap_16 __swap16 # define bswap_32 __swap32 # define bswap_64 __swap64 #elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) # include # define be16toh(x) betoh16(x) # define le16toh(x) letoh16(x) # define be32toh(x) betoh32(x) # define le32toh(x) letoh32(x) # define be64toh(x) betoh64(x) # define le64toh(x) letoh64(x) #elif (defined(BSD) && (BSD >= 199103)) && !defined(__GLIBC__) # include # define __BIG_ENDIAN _BIG_ENDIAN # define __LITTLE_ENDIAN _LITTLE_ENDIAN # define __BYTE_ORDER _BYTE_ORDER # define bswap_16(x) __bswap16(x) # define bswap_32(x) __bswap32(x) # define bswap_64(x) __bswap64(x) #elif defined(__GNUC__) /* use byteswap macros from the host system, hopefully optimized ones ;-) */ # include # include # define bswap_16(x) __bswap_16 (x) # define bswap_32(x) __bswap_32 (x) # define bswap_64(x) __bswap_64 (x) #elif defined(__sparc__) # define __BIG_ENDIAN 4321 # define __LITTLE_ENDIAN 1234 # define __BYTE_ORDER __BIG_ENDIAN #else # error Unknown platform #endif #if defined(__sparc__) # ifndef bswap_16 # define bswap_16(x) \ ((((x) & 0xff00) >> 8) | (((x) & 0x00ff) << 8)) # endif # ifndef bswap_32 # define bswap_32(x) \ ((((x) & 0xff000000) >> 24) \ | (((x) & 0x00ff0000) >> 8) \ | (((x) & 0x0000ff00) << 8) \ | (((x) & 0x000000ff) << 24)) # endif # ifndef bswap_64 # define bswap_64(x) \ ((((x) & 0xff00000000000000ull) >> 56) \ | (((x) & 0x00ff000000000000ull) >> 40) \ | (((x) & 0x0000ff0000000000ull) >> 24) \ | (((x) & 0x000000ff00000000ull) >> 8) \ | (((x) & 0x00000000ff000000ull) << 8) \ | (((x) & 0x0000000000ff0000ull) << 24) \ | (((x) & 0x000000000000ff00ull) << 40) \ | (((x) & 0x00000000000000ffull) << 56)) # endif #endif #if !defined(__BIG_ENDIAN) && !defined(__LITTLE_ENDIAN) #error ENDIANITY is not known #endif static inline uint16_t leu16p(const void* i) { uint16_t a; memcpy(&a, i, sizeof(a)); return (le16toh(a)); } static inline int16_t lei16p(const void* i) { uint16_t a; memcpy(&a, i, sizeof(a)); return ((int16_t)le16toh(a)); } static inline uint32_t leu32p(const void* i) { uint32_t a; memcpy(&a, i, sizeof(a)); return (le32toh(a)); } static inline int32_t lei32p(const void* i) { uint32_t a; memcpy(&a, i, sizeof(a)); return ((int32_t)le32toh(a)); } static inline uint64_t leu64p(const void* i) { uint64_t a; memcpy(&a, i, sizeof(a)); return (le64toh(a)); } static inline int64_t lei64p(const void* i) { uint64_t a; memcpy(&a, i, sizeof(a)); return ((int64_t)le64toh(a)); } static inline uint16_t beu16p(const void* i) { uint16_t a; memcpy(&a, i, sizeof(a)); return ((int16_t)be16toh(a)); } static inline int16_t bei16p(const void* i) { uint16_t a; memcpy(&a, i, sizeof(a)); return ((int16_t)be16toh(a)); } static inline uint32_t beu32p(const void* i) { uint32_t a; memcpy(&a, i, sizeof(a)); return (be32toh(a)); } static inline int32_t bei32p(const void* i) { uint32_t a; memcpy(&a, i, sizeof(a)); return ((int32_t)be32toh(a)); } static inline uint64_t beu64p(const void* i) { uint64_t a; memcpy(&a, i, sizeof(a)); return ((int64_t)be64toh(a)); } static inline int64_t bei64p(const void* i) { uint64_t a; memcpy(&a, i, sizeof(a)); return ((int64_t)be64toh(a)); } static inline void leu16a(uint16_t i, void* r) { i = htole16(i); memcpy(r, &i, sizeof(i)); } static inline void lei16a( int16_t i, void* r) { i = htole16(i); memcpy(r, &i, sizeof(i)); } static inline void leu32a(uint32_t i, void* r) { i = htole32(i); memcpy(r, &i, sizeof(i)); } static inline void lei32a( int32_t i, void* r) { i = htole32(i); memcpy(r, &i, sizeof(i)); } static inline void leu64a(uint64_t i, void* r) { i = htole64(i); memcpy(r, &i, sizeof(i)); } static inline void lei64a( int64_t i, void* r) { i = htole64(i); memcpy(r, &i, sizeof(i)); } static inline void beu16a(uint16_t i, void* r) { i = htobe16(i); memcpy(r, &i, sizeof(i)); }; static inline void bei16a( int16_t i, void* r) { i = htobe16(i); memcpy(r, &i, sizeof(i)); } static inline void beu32a(uint32_t i, void* r) { i = htobe32(i); memcpy(r, &i, sizeof(i)); } static inline void bei32a( int32_t i, void* r) { i = htobe32(i); memcpy(r, &i, sizeof(i)); } static inline void beu64a(uint64_t i, void* r) { i = htobe64(i); memcpy(r, &i, sizeof(i)); } static inline void bei64a( int64_t i, void* r) { i = htobe64(i); memcpy(r, &i, sizeof(i)); } static inline float lef32p(const void* i) { // decode little endian float pointer uint32_t o; union { uint32_t i; float r; } c; memcpy(&o,i,4); c.i = le32toh(o); return(c.r); } static inline double lef64p(const void* i) { // decode little endian double pointer uint64_t o=0; union { uint64_t i; double r; } c; memcpy(&o,i,8); c.i = le64toh(o); return(c.r); } static inline float bef32p(const void* i) { // decode little endian float pointer uint32_t o; union { uint32_t i; float r; } c; memcpy(&o,i,4); c.i = be32toh(o); return(c.r); } static inline double bef64p(const void* i) { // decode little endian double pointer uint64_t o=0; union { uint64_t i; double r; } c; memcpy(&o,i,8); c.i = be64toh(o); return(c.r); } static inline void lef32a( float i, void* r) { uint32_t i32; memcpy(&i32, &i, sizeof(i)); i32 = le32toh(i32); memcpy(r, &i32, sizeof(i32)); } static inline void lef64a( double i, void* r) { uint64_t i64; memcpy(&i64, &i, sizeof(i)); i64 = le64toh(i64); memcpy(r, &i64, sizeof(i64)); } static inline void bef32a( float i, void* r) { uint32_t i32; memcpy(&i32, &i, sizeof(i)); i32 = be32toh(i32); memcpy(r, &i32, sizeof(i32)); } static inline void bef64a( double i, void* r) { uint64_t i64; memcpy(&i64, &i, sizeof(i)); i64 = be64toh(i64); memcpy(r, &i64, sizeof(i64)); } #ifndef NAN # define NAN (0.0/0.0) /* used for encoding of missing values */ #endif #ifndef INFINITY # define INFINITY (1.0/0.0) /* positive infinity */ #endif #ifndef isfinite # define isfinite(a) (-INFINITY < (a) && (a) < INFINITY) #endif #ifndef isnan # define isnan(a) ((a)!=(a)) #endif /* The macro IS_SET() can be used to test for defines in if (IS_SET(...)) { } as well as in #if (IS_SET(...)) #endif http://www.thepowerbase.com/2012/04/latest-release-of-linux-contains-code-developed-via-google-plus/ */ #define macrotest_1 , #define IS_SET(macro) is_set_(macro) #define is_set_(value) is_set__(macrotest_##value) #define is_set__(comma) is_set___(comma 1, 0) #define is_set___(_, v, ...) v /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * global constants and variables * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #ifndef VERBOSE_LEVEL extern int VERBOSE_LEVEL; // used for debugging #endif /****************************************************************************/ /** **/ /** TYPEDEFS AND STRUCTURES **/ /** **/ /****************************************************************************/ /* This structure defines the fields used for "VitalFEF" */ typedef struct asn1 { void *pduType; void *SAS; } ASN1_t; /* This structure defines the fields used for "Annotated ECG" */ typedef struct aecg { char* test; /* test field for annotated ECG */ float diastolicBloodPressure; /* in mmHg */ float systolicBloodPressure; /* in mmHg */ char* MedicationDrugs; char* ReferringPhysician; char* LatestConfirmingPhysician; char* Diagnosis; uint8_t EmergencyLevel; /* 0: routine 1-10: increased emergency level */ float HeartRate; float P_wave[2]; /* start and end */ float QRS_wave[2]; /* start and end */ float T_wave[2]; /* start and end */ float P_QRS_T_axes[3]; /***** SCP only fields *****/ struct { uint8_t HUFFMAN; uint8_t REF_BEAT; uint8_t DIFF; uint8_t BIMODAL; } FLAG; struct { //uint8_t tag14[41],tag15[41]; struct { uint16_t INST_NUMBER; /* tag 14, byte 1-2 */ uint16_t DEPT_NUMBER; /* tag 14, byte 3-4 */ uint16_t DEVICE_ID; /* tag 14, byte 5-6 */ uint8_t DeviceType; /* tag 14, byte 7: 0: Cart, 1: System (or Host) */ uint8_t MANUF_CODE; /* tag 14, byte 8 (MANUF_CODE has to be 255) */ char* MOD_DESC; /* tag 14, byte 9 (MOD_DESC has to be "Cart1") */ uint8_t VERSION; /* tag 14, byte 15 (VERSION has to be 20) */ uint8_t PROT_COMP_LEVEL; /* tag 14, byte 16 (PROT_COMP_LEVEL has to be 0xA0 => level II) */ uint8_t LANG_SUPP_CODE; /* tag 14, byte 17 (LANG_SUPP_CODE has to be 0x00 => Ascii only, latin and 1-byte code) */ uint8_t ECG_CAP_DEV; /* tag 14, byte 18 (ECG_CAP_DEV has to be 0xD0 => Acquire, (No Analysis), Print and Store) */ uint8_t MAINS_FREQ; /* tag 14, byte 19 (MAINS_FREQ has to be 0: unspecified, 1: 50 Hz, 2: 60Hz) */ char reserved[22]; /* char[35-19] reserved; */ char* ANAL_PROG_REV_NUM; char* SERIAL_NUMBER_ACQ_DEV; char* ACQ_DEV_SYS_SW_ID; char* ACQ_DEV_SCP_SW; /* tag 14, byte 38 (SCP_IMPL_SW has to be "OpenECG XML-SCP 1.00") */ char* ACQ_DEV_MANUF; /* tag 14, byte 38 (ACQ_DEV_MANUF has to be "Manufacturer") */ } Tag14, Tag15; } Section1; struct { size_t StartPtr; size_t Length; } Section5; struct { size_t StartPtr; size_t Length; } Section6; struct { char Confirmed; // 0: original report (not overread); 1:Confirmed report; 2: Overread report (not confirmed) struct tm t; uint8_t NumberOfStatements; char **Statements; } Section8; struct { char* StartPtr; size_t Length; } Section9; struct { size_t StartPtr; size_t Length; } Section10; struct { char Confirmed; // 0: original report (not overread); 1:Confirmed report; 2: Overread report (not confirmed) struct tm t; uint8_t NumberOfStatements; char **Statements; } Section11; struct { size_t StartPtr; size_t Length; } Section12; } aECG_TYPE; /****************************************************************************/ /** **/ /** INTERNAL FUNCTIONS **/ /** **/ /****************************************************************************/ /* file access wrapper: use ZLIB (if available) or STDIO */ HDRTYPE* ifopen(HDRTYPE* hdr, const char* mode ); int ifclose(HDRTYPE* hdr); int ifeof(HDRTYPE* hdr); int ifflush(HDRTYPE* hdr); size_t ifread(void* buf, size_t size, size_t nmemb, HDRTYPE* hdr); size_t ifwrite(void* buf, size_t size, size_t nmemb, HDRTYPE* hdr); int ifprintf(HDRTYPE* hdr, const char *format, va_list arg); int ifputc(int c, HDRTYPE* hdr); int ifgetc(HDRTYPE* hdr); char* ifgets(char *str, int n, HDRTYPE* hdr); int ifseek(HDRTYPE* hdr, long offset, int whence ); long iftell(HDRTYPE* hdr); int ifgetpos(HDRTYPE* hdr, size_t *pos); int iferror(HDRTYPE* hdr); /* various utility functions */ uint32_t gcd(uint32_t A, uint32_t B); uint32_t lcm(uint32_t A, uint32_t B); extern const uint16_t GDFTYP_BITS[]; extern const char *LEAD_ID_TABLE[]; uint16_t CRCEvaluate(uint8_t* datablock, uint32_t datalength); int16_t CRCCheck(uint8_t* datablock, uint32_t datalength); #if (BIOSIG_VERSION < 10700) // this deprecated since Aug 2013, v1.5.7 #ifndef _WIN32 ATT_DEPREC int strcmpi(const char* str1, const char* str2); // use strcasecmp() instead #endif ATT_DEPREC int strncmpi(const char* str1, const char* str2, size_t n); // use strncasecmp() instead #endif int month_string2int(const char *s); int u32cmp(const void *a, const void *b); void biosigERROR(HDRTYPE *hdr, enum B4C_ERROR errnum, const char *errmsg); /* sets the local and the (deprecated) global error variables B4C_ERRNUM and B4C_ERRMSG the global error variables are kept for backwards compatibility. */ /* some important functions used internally, the interface for these functios is a bit clumsy and are therefore not exported to standard user applications. */ void struct2gdfbin(HDRTYPE *hdr); int gdfbin2struct(HDRTYPE *hdr); /* struct2gdfbin and gdfbin2struct convert between the streamed header information (as in a GDF file or on a network connection) and the header structure HDRTYPE Specifically, the fixed header, the variable hadder and the optional header information (header 1,2 and 3). This incluedes the description of the user-specified events (TYP=1..255), but not the event table itself. ------------------------------------------------------------------------*/ size_t hdrEVT2rawEVT(HDRTYPE *hdr); void rawEVT2hdrEVT(HDRTYPE *hdr, size_t length_rawEventTable); /* rawEVT2hdrEVT and hdrEVT2rawEVT convert between streamed event table and the structure HDRTYPE.EVENT. ------------------------------------------------------------------------*/ int NumberOfChannels(HDRTYPE *hdr); /* returns the number of channels returned by SREAD. This might be different than the number of data channels in the file because of status,event and annotation channels, and because some rereferencing is applied ------------------------------------------------------------------------*/ size_t reallocEventTable(HDRTYPE *hdr, size_t EventN); /* allocate, and resize memory of event table ------------------------------------------------------------------------*/ void FreeGlobalEventCodeTable(); /* free memory allocated for global event code ------------------------------------------------------------------------*/ size_t sread_raw(size_t START, size_t LEN, HDRTYPE* hdr, char flag, void *buf, size_t bufsize); /* sread_raw: LEN data segments are read from file associated with hdr, starting from segment START. If buf==NULL, a sufficient amount of memory is (re-)allocated in hdr->AS.rawdata and the data is copied into hdr->AS.rawdata, and LEN*hdr->AS.bpb bytes are read and stored. If buf points to some memory location of size bufsize, the data is stored in buf, no reallocation of memory is possible, and only the minimum(bufsize, LEN*hdr->AS.bpb) is stored. No Overflowdetection or calibration is applied. The number of successfully read data blocks is returned, this can be smaller than LEN at the end of the file, of when bufsize is not large enough. The data can be "cached", this means that more than the requested number of blocks is available in hdr->AS.rawdata. hdr->AS.first and hdr->AS.length contain the number of the first block and the number of blocks, respectively. --------------------------------------------------------------- */ size_t bpb8_collapsed_rawdata(HDRTYPE *hdr); /* bpb8_collapsed_rawdata computes the bits per block when rawdata is collapsed --------------------------------------------------------------- */ HDRTYPE* getfiletype(HDRTYPE* hdr); /* identify file format from header information input: hdr->AS.Header contains header of hdr->HeadLen bytes hdr->TYPE must be unknown, otherwise no FileFormat evaluation is performed output: hdr->TYPE file format hdr->VERSION is defined for some selected formats e.g. ACQ, EDF, BDF, GDF --------------------------------------------------------------- */ const char* GetFileTypeString(enum FileFormat FMT); /* returns a string with file format --------------------------------------------------------------- */ enum FileFormat GetFileTypeFromString(const char *); /* returns file format from string --------------------------------------------------------------- */ #ifdef __cplusplus } #endif /****************************************************************************/ /** **/ /** EOF **/ /** **/ /****************************************************************************/ #endif /* BIOSIG_INTERNAL_H */ stimfit-0.15.8/src/libbiosiglite/biosig4c++/igor/0000775000175000017500000000000013315356571016501 500000000000000stimfit-0.15.8/src/libbiosiglite/biosig4c++/igor/IgorBin.h0000664000175000017500000002221113062445067020117 00000000000000/* Copyright (C) 2013 Alois Schloegl Copyright (C) 1999 Wavematrix, Inc. Lake Oswego OR, USA This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // IgorBin.h -- structures and #defines for dealing with Igor binary data. #include #ifdef __cplusplus extern "C" { #endif // All structures written to disk are 2-byte-aligned. #if __GNUC__ #pragma pack(push,2) /* igor uses a 32bit memory model, all pointers are 32 bit. in order to keep the structs containing poiners aligned, all pointers need to be remapped to uint32_t. */ #define ptr_t uint32_t #define Handle uint32_t #elif GENERATINGPOWERPC #pragma options align=mac68k #endif // From IgorMath.h #define NT_CMPLX 1 // Complex numbers. #define NT_FP32 2 // 32 bit fp numbers. #define NT_FP64 4 // 64 bit fp numbers. #define NT_I8 8 // 8 bit signed integer. Requires Igor Pro 2.0 or later. #define NT_I16 0x10 // 16 bit integer numbers. Requires Igor Pro 2.0 or later. #define NT_I32 0x20 // 32 bit integer numbers. Requires Igor Pro 2.0 or later. #define NT_UNSIGNED 0x40 // Makes above signed integers unsigned. Requires Igor Pro 3.0 or later. // From wave.h #define MAXDIMS 4 // From binary.h typedef struct BinHeader1 { int16_t version; // Version number for backwards compatibility. int32_t wfmSize; // The size of the WaveHeader2 data structure plus the wave data plus 16 bytes of padding. int16_t checksum; // Checksum over this header and the wave header. } BinHeader1; typedef struct BinHeader2 { int16_t version; // Version number for backwards compatibility. int32_t wfmSize; // The size of the WaveHeader2 data structure plus the wave data plus 16 bytes of padding. int32_t noteSize; // The size of the note text. int32_t pictSize; // Reserved. Write zero. Ignore on read. int16_t checksum; // Checksum over this header and the wave header. } BinHeader2; typedef struct BinHeader3 { int16_t version; // Version number for backwards compatibility. int32_t wfmSize; // The size of the WaveHeader2 data structure plus the wave data plus 16 bytes of padding. int32_t noteSize; // The size of the note text. int32_t formulaSize; // The size of the dependency formula, if any. int32_t pictSize; // Reserved. Write zero. Ignore on read. int16_t checksum; // Checksum over this header and the wave header. } BinHeader3; typedef struct BinHeader5 { int16_t version; // Version number for backwards compatibility. int16_t checksum; // Checksum over this header and the wave header. int32_t wfmSize; // The size of the WaveHeader5 data structure plus the wave data. int32_t formulaSize; // The size of the dependency formula, if any. int32_t noteSize; // The size of the note text. int32_t dataEUnitsSize; // The size of optional extended data units. int32_t dimEUnitsSize[MAXDIMS]; // The size of optional extended dimension units. int32_t dimLabelsSize[MAXDIMS]; // The size of optional dimension labels. int32_t sIndicesSize; // The size of string indicies if this is a text wave. int32_t optionsSize1; // Reserved. Write zero. Ignore on read. int32_t optionsSize2; // Reserved. Write zero. Ignore on read. } BinHeader5; // From wave.h #define MAX_WAVE_NAME2 18 // Maximum length of wave name in version 1 and 2 files. Does not include the trailing null. #define MAX_WAVE_NAME5 31 // Maximum length of wave name in version 5 files. Does not include the trailing null. #define MAX_UNIT_CHARS 3 // Header to an array of waveform data. struct WaveHeader2 { int16_t type; // See types (e.g. NT_FP64) above. Zero for text waves. // struct WaveHeader2 **next; // Used in memory only. Write zero. Ignore on read. ptr_t next; char bname[MAX_WAVE_NAME2+2]; // Name of wave plus trailing null. int16_t whVersion; // Write 0. Ignore on read. int16_t srcFldr; // Used in memory only. Write zero. Ignore on read. Handle fileName; // Used in memory only. Write zero. Ignore on read. char dataUnits[MAX_UNIT_CHARS+1]; // Natural data units go here - null if none. char xUnits[MAX_UNIT_CHARS+1]; // Natural x-axis units go here - null if none. int32_t npnts; // Number of data points in wave. int16_t aModified; // Used in memory only. Write zero. Ignore on read. double hsA,hsB; // X value for point p = hsA*p + hsB int16_t wModified; // Used in memory only. Write zero. Ignore on read. int16_t swModified; // Used in memory only. Write zero. Ignore on read. int16_t fsValid; // True if full scale values have meaning. double topFullScale,botFullScale; // The min full scale value for wave. char useBits; // Used in memory only. Write zero. Ignore on read. char kindBits; // Reserved. Write zero. Ignore on read. //void **formula; // Used in memory only. Write zero. Ignore on read. ptr_t formula; int32_t depID; // Used in memory only. Write zero. Ignore on read. uint32_t creationDate; // DateTime of creation. Not used in version 1 files. char wUnused[2]; // Reserved. Write zero. Ignore on read. uint32_t modDate; // DateTime of last modification. Handle waveNoteH; // Used in memory only. Write zero. Ignore on read. float wData[4]; // The start of the array of waveform data. }; typedef struct WaveHeader2 WaveHeader2; typedef WaveHeader2 *WavePtr2; typedef WavePtr2 *waveHandle2; struct WaveHeader5 { //struct WaveHeader5 **next; // link to next wave in linked list. ptr_t next; uint32_t creationDate; // DateTime of creation. uint32_t modDate; // DateTime of last modification. int32_t npnts; // Total number of points (multiply dimensions up to first zero). int16_t type; // See types (e.g. NT_FP64) above. Zero for text waves. int16_t dLock; // Reserved. Write zero. Ignore on read. char whpad1[6]; // Reserved. Write zero. Ignore on read. int16_t whVersion; // Write 1. Ignore on read. char bname[MAX_WAVE_NAME5+1]; // Name of wave plus trailing null. int32_t whpad2; // Reserved. Write zero. Ignore on read. //struct DataFolder **dFolder; // Used in memory only. Write zero. Ignore on read. ptr_t dFolder; // Dimensioning info. [0] == rows, [1] == cols etc int32_t nDim[MAXDIMS]; // Number of of items in a dimension -- 0 means no data. double sfA[MAXDIMS]; // Index value for element e of dimension d = sfA[d]*e + sfB[d]. double sfB[MAXDIMS]; // SI units char dataUnits[MAX_UNIT_CHARS+1]; // Natural data units go here - null if none. char dimUnits[MAXDIMS][MAX_UNIT_CHARS+1]; // Natural dimension units go here - null if none. int16_t fsValid; // TRUE if full scale values have meaning. int16_t whpad3; // Reserved. Write zero. Ignore on read. double topFullScale,botFullScale; // The max and max full scale value for wave. Handle dataEUnits; // Used in memory only. Write zero. Ignore on read. Handle dimEUnits[MAXDIMS]; // Used in memory only. Write zero. Ignore on read. Handle dimLabels[MAXDIMS]; // Used in memory only. Write zero. Ignore on read. Handle waveNoteH; // Used in memory only. Write zero. Ignore on read. int32_t whUnused[16]; // Reserved. Write zero. Ignore on read. // The following stuff is considered private to Igor. int16_t aModified; // Used in memory only. Write zero. Ignore on read. int16_t wModified; // Used in memory only. Write zero. Ignore on read. int16_t swModified; // Used in memory only. Write zero. Ignore on read. char useBits; // Used in memory only. Write zero. Ignore on read. char kindBits; // Reserved. Write zero. Ignore on read. //void **formula; // Used in memory only. Write zero. Ignore on read. ptr_t formula; int32_t depID; // Used in memory only. Write zero. Ignore on read. int16_t whpad4; // Reserved. Write zero. Ignore on read. int16_t srcFldr; // Used in memory only. Write zero. Ignore on read. Handle fileName; // Used in memory only. Write zero. Ignore on read. //int32_t **sIndices; // Used in memory only. Write zero. Ignore on read. ptr_t sIndices; float wData[1]; // The start of the array of data. Must be 64 bit aligned. }; typedef struct WaveHeader5 WaveHeader5; typedef WaveHeader5 *WavePtr5; typedef WavePtr5 *WaveHandle5; #if __GNUC__ #pragma pack(pop) #undef ptr_t #undef Handle #elif GENERATINGPOWERPC #pragma options align=reset #endif // All structures written to disk are 2-byte-aligned. #ifdef __cplusplus } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/11073-10102-AnnexB.i0000664000175000017500000014627213062445067020132 00000000000000#if 0 ### This file is autogenerated - Do not modify it !!! ### # # Expanded terms with discriminators and numeric codes # obtained from IEEE Std 11073-10102-2012 # Health informatics—Point-of-care medical device communication # Part 10102: Nomenclature—Annotated ECG # # This table is also part of the specification of # the BioSig project http://biosig.sf.net/ # # BioSig is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # Version 3 of the License, or (at your option) any later version. # # #PART CODE10 CF_CODE10 REFID #endif { 0, 0, "MDC_ECG_LEAD_CONFIG" }, { 1, 1, "MDC_ECG_LEAD_I" }, { 31, 31, "MDC_ECG_LEAD_dI" }, { 2, 2, "MDC_ECG_LEAD_II" }, { 32, 32, "MDC_ECG_LEAD_dII" }, { 3, 3, "MDC_ECG_LEAD_V1" }, { 33, 33, "MDC_ECG_LEAD_dV1" }, { 4, 4, "MDC_ECG_LEAD_V2" }, { 34, 34, "MDC_ECG_LEAD_dV2" }, { 5, 5, "MDC_ECG_LEAD_V3" }, { 35, 35, "MDC_ECG_LEAD_dV3" }, { 6, 6, "MDC_ECG_LEAD_V4" }, { 36, 36, "MDC_ECG_LEAD_dV4" }, { 7, 7, "MDC_ECG_LEAD_V5" }, { 37, 37, "MDC_ECG_LEAD_dV5" }, { 8, 8, "MDC_ECG_LEAD_V6" }, { 38, 38, "MDC_ECG_LEAD_dV6" }, { 9, 9, "MDC_ECG_LEAD_V7" }, { 39, 39, "MDC_ECG_LEAD_dV7" }, { 10, 10, "MDC_ECG_LEAD_V2R" }, { 40, 40, "MDC_ECG_LEAD_dV2R" }, { 11, 11, "MDC_ECG_LEAD_V3R" }, { 41, 41, "MDC_ECG_LEAD_dV3R" }, { 12, 12, "MDC_ECG_LEAD_V4R" }, { 42, 42, "MDC_ECG_LEAD_dV4R" }, { 13, 13, "MDC_ECG_LEAD_V5R" }, { 43, 43, "MDC_ECG_LEAD_dV5R" }, { 14, 14, "MDC_ECG_LEAD_V6R" }, { 44, 44, "MDC_ECG_LEAD_dV6R" }, { 15, 15, "MDC_ECG_LEAD_V7R" }, { 45, 45, "MDC_ECG_LEAD_dV7R" }, { 16, 16, "MDC_ECG_LEAD_X" }, { 46, 46, "MDC_ECG_LEAD_dX" }, { 17, 17, "MDC_ECG_LEAD_Y" }, { 47, 47, "MDC_ECG_LEAD_dY" }, { 18, 18, "MDC_ECG_LEAD_Z" }, { 48, 48, "MDC_ECG_LEAD_dZ" }, { 19, 19, "MDC_ECG_LEAD_CC5" }, { 49, 49, "MDC_ECG_LEAD_dCC5" }, { 20, 20, "MDC_ECG_LEAD_CM5" }, { 50, 50, "MDC_ECG_LEAD_dCM5" }, { 21, 21, "MDC_ECG_LEAD_LA" }, { 51, 51, "MDC_ECG_LEAD_dLA" }, { 22, 22, "MDC_ECG_LEAD_RA" }, { 52, 52, "MDC_ECG_LEAD_dRA" }, { 23, 23, "MDC_ECG_LEAD_LL" }, { 53, 53, "MDC_ECG_LEAD_dLL" }, { 24, 24, "MDC_ECG_LEAD_fI" }, { 54, 54, "MDC_ECG_LEAD_dfI" }, { 25, 25, "MDC_ECG_LEAD_fE" }, { 55, 55, "MDC_ECG_LEAD_dfE" }, { 26, 26, "MDC_ECG_LEAD_fC" }, { 56, 56, "MDC_ECG_LEAD_dfC" }, { 27, 27, "MDC_ECG_LEAD_fA" }, { 57, 57, "MDC_ECG_LEAD_dfA" }, { 28, 28, "MDC_ECG_LEAD_fM" }, { 58, 58, "MDC_ECG_LEAD_dfM" }, { 29, 29, "MDC_ECG_LEAD_fF" }, { 59, 59, "MDC_ECG_LEAD_dfF" }, { 30, 30, "MDC_ECG_LEAD_fH" }, { 60, 60, "MDC_ECG_LEAD_dfH" }, { 61, 61, "MDC_ECG_LEAD_III" }, { 111, 111, "MDC_ECG_LEAD_dIII" }, { 62, 62, "MDC_ECG_LEAD_AVR" }, { 112, 112, "MDC_ECG_LEAD_dAVR" }, { 63, 63, "MDC_ECG_LEAD_AVL" }, { 113, 113, "MDC_ECG_LEAD_dAVL" }, { 64, 64, "MDC_ECG_LEAD_AVF" }, { 114, 114, "MDC_ECG_LEAD_dAVF" }, { 65, 65, "MDC_ECG_LEAD_AVRneg" }, { 115, 115, "MDC_ECG_LEAD_dAVRneg" }, { 66, 66, "MDC_ECG_LEAD_V8" }, { 79, 79, "MDC_ECG_LEAD_dV8" }, { 67, 67, "MDC_ECG_LEAD_V9" }, { 80, 80, "MDC_ECG_LEAD_dV9" }, { 68, 68, "MDC_ECG_LEAD_V8R" }, { 81, 81, "MDC_ECG_LEAD_dV8R" }, { 69, 69, "MDC_ECG_LEAD_V9R" }, { 82, 82, "MDC_ECG_LEAD_dV9R" }, { 70, 70, "MDC_ECG_LEAD_D" }, { 83, 83, "MDC_ECG_LEAD_dD" }, { 71, 71, "MDC_ECG_LEAD_A" }, { 84, 84, "MDC_ECG_LEAD_dA" }, { 72, 72, "MDC_ECG_LEAD_J" }, { 85, 85, "MDC_ECG_LEAD_dJ" }, { 73, 73, "MDC_ECG_LEAD_DEFIB" }, { 135, 135, "MDC_ECG_LEAD_dDEFIB" }, { 74, 74, "MDC_ECG_LEAD_EXTERN" }, { 136, 136, "MDC_ECG_LEAD_dEXTERN" }, { 75, 75, "MDC_ECG_LEAD_A1" }, { 137, 137, "MDC_ECG_LEAD_dA1" }, { 76, 76, "MDC_ECG_LEAD_A2" }, { 138, 138, "MDC_ECG_LEAD_dA2" }, { 77, 77, "MDC_ECG_LEAD_A3" }, { 139, 139, "MDC_ECG_LEAD_dA3" }, { 78, 78, "MDC_ECG_LEAD_A4" }, { 140, 140, "MDC_ECG_LEAD_dA4" }, { 86, 86, "MDC_ECG_LEAD_C" }, { 116, 116, "MDC_ECG_LEAD_dC" }, { 87, 87, "MDC_ECG_LEAD_V" }, { 117, 117, "MDC_ECG_LEAD_dV" }, { 88, 88, "MDC_ECG_LEAD_VR" }, { 118, 118, "MDC_ECG_LEAD_dVR" }, { 89, 89, "MDC_ECG_LEAD_VL" }, { 119, 119, "MDC_ECG_LEAD_dVL" }, { 90, 90, "MDC_ECG_LEAD_VF" }, { 120, 120, "MDC_ECG_LEAD_dVF" }, { 91, 91, "MDC_ECG_LEAD_MCL" }, { 152, 152, "MDC_ECG_LEAD_dMCL" }, { 92, 92, "MDC_ECG_LEAD_MCL1" }, { 141, 141, "MDC_ECG_LEAD_dMCL1" }, { 93, 93, "MDC_ECG_LEAD_MCL2" }, { 142, 142, "MDC_ECG_LEAD_dMCL2" }, { 94, 94, "MDC_ECG_LEAD_MCL3" }, { 143, 143, "MDC_ECG_LEAD_dMCL3" }, { 95, 95, "MDC_ECG_LEAD_MCL4" }, { 144, 144, "MDC_ECG_LEAD_dMCL4" }, { 96, 96, "MDC_ECG_LEAD_MCL5" }, { 145, 145, "MDC_ECG_LEAD_dMCL5" }, { 97, 97, "MDC_ECG_LEAD_MCL6" }, { 146, 146, "MDC_ECG_LEAD_dMCL6" }, { 98, 98, "MDC_ECG_LEAD_CC" }, { 153, 153, "MDC_ECG_LEAD_dCC" }, { 99, 99, "MDC_ECG_LEAD_CC1" }, { 154, 154, "MDC_ECG_LEAD_dCC1" }, { 100, 100, "MDC_ECG_LEAD_CC2" }, { 155, 155, "MDC_ECG_LEAD_dCC2" }, { 101, 101, "MDC_ECG_LEAD_CC3" }, { 156, 156, "MDC_ECG_LEAD_dCC3" }, { 102, 102, "MDC_ECG_LEAD_CC4" }, { 157, 157, "MDC_ECG_LEAD_dCC4" }, { 103, 103, "MDC_ECG_LEAD_CC6" }, { 158, 158, "MDC_ECG_LEAD_dCC6" }, { 104, 104, "MDC_ECG_LEAD_CC7" }, { 159, 159, "MDC_ECG_LEAD_dCC7" }, { 105, 105, "MDC_ECG_LEAD_CM" }, { 160, 160, "MDC_ECG_LEAD_dCM" }, { 106, 106, "MDC_ECG_LEAD_CM1" }, { 161, 161, "MDC_ECG_LEAD_dCM1" }, { 107, 107, "MDC_ECG_LEAD_CM2" }, { 162, 162, "MDC_ECG_LEAD_dCM2" }, { 108, 108, "MDC_ECG_LEAD_CM3" }, { 163, 163, "MDC_ECG_LEAD_dCM3" }, { 109, 109, "MDC_ECG_LEAD_CM4" }, { 164, 164, "MDC_ECG_LEAD_dCM4" }, { 110, 110, "MDC_ECG_LEAD_CM6" }, { 165, 165, "MDC_ECG_LEAD_dCM6" }, { 121, 121, "MDC_ECG_LEAD_CM7" }, { 166, 166, "MDC_ECG_LEAD_dCM7" }, { 122, 122, "MDC_ECG_LEAD_CH5" }, { 167, 167, "MDC_ECG_LEAD_dCH5" }, { 123, 123, "MDC_ECG_LEAD_CS5" }, { 168, 168, "MDC_ECG_LEAD_dCS5" }, { 124, 124, "MDC_ECG_LEAD_CB5" }, { 169, 169, "MDC_ECG_LEAD_dCB5" }, { 125, 125, "MDC_ECG_LEAD_CR5" }, { 170, 170, "MDC_ECG_LEAD_dCR5" }, { 126, 126, "MDC_ECG_LEAD_ML" }, { 171, 171, "MDC_ECG_LEAD_dML" }, { 127, 127, "MDC_ECG_LEAD_AB1" }, { 172, 172, "MDC_ECG_LEAD_dAB1" }, { 128, 128, "MDC_ECG_LEAD_AB2" }, { 173, 173, "MDC_ECG_LEAD_dAB2" }, { 129, 129, "MDC_ECG_LEAD_AB3" }, { 174, 174, "MDC_ECG_LEAD_dAB3" }, { 130, 130, "MDC_ECG_LEAD_AB4" }, { 175, 175, "MDC_ECG_LEAD_dAB4" }, { 131, 131, "MDC_ECG_LEAD_ES" }, { 176, 176, "MDC_ECG_LEAD_dES" }, { 132, 132, "MDC_ECG_LEAD_AS" }, { 177, 177, "MDC_ECG_LEAD_dAS" }, { 133, 133, "MDC_ECG_LEAD_AI" }, { 178, 178, "MDC_ECG_LEAD_dAI" }, { 134, 134, "MDC_ECG_LEAD_S" }, { 179, 179, "MDC_ECG_LEAD_dS" }, { 147, 147, "MDC_ECG_LEAD_RL" }, { 180, 180, "MDC_ECG_LEAD_dRL" }, { 148, 148, "MDC_ECG_LEAD_CV5RL" }, { 181, 181, "MDC_ECG_LEAD_dCV5RL" }, { 149, 149, "MDC_ECG_LEAD_CV6LL" }, { 182, 182, "MDC_ECG_LEAD_dCV6LL" }, { 150, 150, "MDC_ECG_LEAD_CV6LU" }, { 183, 183, "MDC_ECG_LEAD_dCV6LU" }, { 151, 151, "MDC_ECG_LEAD_V10" }, { 184, 184, "MDC_ECG_LEAD_dV10" }, { 256, 655616, "MDC_ECG_WAVC_PWAVE" }, { 257, 655617, "MDC_ECG_WAVC_PWAVE_TIME_POINT" }, { 258, 655618, "MDC_ECG_WAVC_PWAVE_DURN" }, { 259, 655619, "MDC_ECG_WAVC_PWAVE_PEAK" }, { 260, 655620, "MDC_ECG_WAVC_PWAVE_ONSET" }, { 261, 655621, "MDC_ECG_WAVC_PWAVE_OFFSET" }, { 262, 655622, "MDC_ECG_WAVC_PWAVE_ONSET_IMPL" }, { 263, 655623, "MDC_ECG_WAVC_PWAVE_OFFSET_IMPL" }, { 264, 655624, "MDC_ECG_WAVC_PWAVE_AREA" }, { 265, 655625, "MDC_ECG_WAVC_PWAVE_INTEGRAL" }, { 272, 655632, "MDC_ECG_WAVC_PWAVE_NA" }, { 273, 655633, "MDC_ECG_WAVC_PWAVE_NA_TIME_POINT" }, { 274, 655634, "MDC_ECG_WAVC_PWAVE_NA_DURN" }, { 275, 655635, "MDC_ECG_WAVC_PWAVE_NA_PEAK" }, { 276, 655636, "MDC_ECG_WAVC_PWAVE_NA_ONSET" }, { 277, 655637, "MDC_ECG_WAVC_PWAVE_NA_OFFSET" }, { 278, 655638, "MDC_ECG_WAVC_PWAVE_NA_ONSET_IMPL" }, { 279, 655639, "MDC_ECG_WAVC_PWAVE_NA_OFFSET_IMPL" }, { 280, 655640, "MDC_ECG_WAVC_PWAVE_NA_AREA" }, { 281, 655641, "MDC_ECG_WAVC_PWAVE_NA_INTEGRAL" }, { 288, 655648, "MDC_ECG_WAVC_PWAVE_FB" }, { 289, 655649, "MDC_ECG_WAVC_PWAVE_FB_TIME_POINT" }, { 290, 655650, "MDC_ECG_WAVC_PWAVE_FB_DURN" }, { 291, 655651, "MDC_ECG_WAVC_PWAVE_FB_PEAK" }, { 292, 655652, "MDC_ECG_WAVC_PWAVE_FB_ONSET" }, { 293, 655653, "MDC_ECG_WAVC_PWAVE_FB_OFFSET" }, { 294, 655654, "MDC_ECG_WAVC_PWAVE_FB_ONSET_IMPL" }, { 295, 655655, "MDC_ECG_WAVC_PWAVE_FB_OFFSET_IMPL" }, { 296, 655656, "MDC_ECG_WAVC_PWAVE_FB_AREA" }, { 297, 655657, "MDC_ECG_WAVC_PWAVE_FB_INTEGRAL" }, { 304, 655664, "MDC_ECG_WAVC_PWAVE_PB" }, { 305, 655665, "MDC_ECG_WAVC_PWAVE_PB_TIME_POINT" }, { 306, 655666, "MDC_ECG_WAVC_PWAVE_PB_DURN" }, { 307, 655667, "MDC_ECG_WAVC_PWAVE_PB_PEAK" }, { 308, 655668, "MDC_ECG_WAVC_PWAVE_PB_ONSET" }, { 309, 655669, "MDC_ECG_WAVC_PWAVE_PB_OFFSET" }, { 310, 655670, "MDC_ECG_WAVC_PWAVE_PB_ONSET_IMPL" }, { 311, 655671, "MDC_ECG_WAVC_PWAVE_PB_OFFSET_IMPL" }, { 312, 655672, "MDC_ECG_WAVC_PWAVE_PB_AREA" }, { 313, 655673, "MDC_ECG_WAVC_PWAVE_PB_INTEGRAL" }, { 320, 655680, "MDC_ECG_WAVC_PPWAVE" }, { 384, 655744, "MDC_ECG_WAVC_PPPWAVE" }, { 448, 655808, "MDC_ECG_WAVC_QWAVE" }, { 512, 655872, "MDC_ECG_WAVC_QSWAVE" }, { 576, 655936, "MDC_ECG_WAVC_RWAVE" }, { 640, 656000, "MDC_ECG_WAVC_RRWAVE" }, { 704, 656064, "MDC_ECG_WAVC_RRRWAVE" }, { 768, 656128, "MDC_ECG_WAVC_NOTCH" }, { 832, 656192, "MDC_ECG_WAVC_SWAVE" }, { 896, 656256, "MDC_ECG_WAVC_SSWAVE" }, { 960, 656320, "MDC_ECG_WAVC_SSSWAVE" }, { 1024, 656384, "MDC_ECG_WAVC_TWAVE" }, { 1088, 656448, "MDC_ECG_WAVC_TTWAVE" }, { 1152, 656512, "MDC_ECG_WAVC_UWAVE" }, { 1216, 656576, "MDC_ECG_WAVC_DELTA" }, { 1280, 656640, "MDC_ECG_WAVC_IWAVE" }, { 1344, 656704, "MDC_ECG_WAVC_KWAVE" }, { 1408, 656768, "MDC_ECG_WAVC_JWAVE" }, { 1472, 656832, "MDC_ECG_WAVC_PQRSTWAVE" }, { 1536, 656896, "MDC_ECG_WAVC_QRSTWAVE" }, { 1600, 656960, "MDC_ECG_WAVC_QRSWAVE" }, { 1664, 657024, "MDC_ECG_WAVC_TUWAVE" }, { 1728, 657088, "MDC_ECG_WAVC_VFLWAVE" }, { 1792, 657152, "MDC_ECG_WAVC_AFLWAVE" }, { 1856, 657216, "MDC_ECG_WAVC_ISO" }, { 1920, 657280, "MDC_ECG_WAVC_PRSEG" }, { 1984, 657344, "MDC_ECG_WAVC_STSEG" }, { 2048, 657408, "MDC_ECG_WAVC_STJ" }, { 2112, 657472, "MDC_ECG_WAVC_STM" }, { 2176, 657536, "MDC_ECG_WAVC_ARFCT" }, { 2240, 657600, "MDC_ECG_WAVC_CALP" }, { 2304, 657664, "MDC_ECG_WAVC_STCH" }, { 2368, 657728, "MDC_ECG_WAVC_TCH" }, { 2432, 657792, "MDC_ECG_WAVC_VAT" }, { 4096, 659456, "MDC_ECG_WAVP_PACE" }, { 4097, 659457, "MDC_ECG_WAVP_PACE_TIME_POINT" }, { 4098, 659458, "MDC_ECG_WAVP_PACE_DURN" }, { 4099, 659459, "MDC_ECG_WAVP_PACE_PEAK" }, { 4100, 659460, "MDC_ECG_WAVP_PACE_ONSET" }, { 4101, 659461, "MDC_ECG_WAVP_PACE_OFFSET" }, { 4102, 659462, "MDC_ECG_WAVP_PACE_ONSET_IMPL" }, { 4103, 659463, "MDC_ECG_WAVP_PACE_OFFSET_IMPL" }, { 4104, 659464, "MDC_ECG_WAVP_PACE_AREA" }, { 4105, 659465, "MDC_ECG_WAVP_PACE_INTEGRAL" }, { 4112, 659472, "MDC_ECG_WAVP_PACE_NC" }, { 4113, 659473, "MDC_ECG_WAVP_PACE_NC_TIME_POINT" }, { 4114, 659474, "MDC_ECG_WAVP_PACE_NC_DURN" }, { 4115, 659475, "MDC_ECG_WAVP_PACE_NC_PEAK" }, { 4116, 659476, "MDC_ECG_WAVP_PACE_NC_ONSET" }, { 4117, 659477, "MDC_ECG_WAVP_PACE_NC_OFFSET" }, { 4118, 659478, "MDC_ECG_WAVP_PACE_NC_ONSET_IMPL" }, { 4119, 659479, "MDC_ECG_WAVP_PACE_NC_OFFSET_IMPL" }, { 4120, 659480, "MDC_ECG_WAVP_PACE_NC_AREA" }, { 4121, 659481, "MDC_ECG_WAVP_PACE_NC_INTEGRAL" }, { 4128, 659488, "MDC_ECG_WAVP_PACE_C" }, { 4129, 659489, "MDC_ECG_WAVP_PACE_C_TIME_POINT" }, { 4130, 659490, "MDC_ECG_WAVP_PACE_C_DURN" }, { 4131, 659491, "MDC_ECG_WAVP_PACE_C_PEAK" }, { 4132, 659492, "MDC_ECG_WAVP_PACE_C_ONSET" }, { 4133, 659493, "MDC_ECG_WAVP_PACE_C_OFFSET" }, { 4134, 659494, "MDC_ECG_WAVP_PACE_C_ONSET_IMPL" }, { 4135, 659495, "MDC_ECG_WAVP_PACE_C_OFFSET_IMPL" }, { 4136, 659496, "MDC_ECG_WAVP_PACE_C_AREA" }, { 4137, 659497, "MDC_ECG_WAVP_PACE_C_INTEGRAL" }, { 4144, 659504, "MDC_ECG_WAVP_PACE_FSN" }, { 4145, 659505, "MDC_ECG_WAVP_PACE_FSN_TIME_POINT" }, { 4146, 659506, "MDC_ECG_WAVP_PACE_FSN_DURN" }, { 4147, 659507, "MDC_ECG_WAVP_PACE_FSN_PEAK" }, { 4148, 659508, "MDC_ECG_WAVP_PACE_FSN_ONSET" }, { 4149, 659509, "MDC_ECG_WAVP_PACE_FSN_OFFSET" }, { 4150, 659510, "MDC_ECG_WAVP_PACE_FSN_ONSET_IMPL" }, { 4151, 659511, "MDC_ECG_WAVP_PACE_FSN_OFFSET_IMPL" }, { 4152, 659512, "MDC_ECG_WAVP_PACE_FSN_AREA" }, { 4153, 659513, "MDC_ECG_WAVP_PACE_FSN_INTEGRAL" }, { 4160, 659520, "MDC_ECG_WAVP_PACE_APPR" }, { 4161, 659521, "MDC_ECG_WAVP_PACE_APPR_TIME_POINT" }, { 4162, 659522, "MDC_ECG_WAVP_PACE_APPR_DURN" }, { 4163, 659523, "MDC_ECG_WAVP_PACE_APPR_PEAK" }, { 4164, 659524, "MDC_ECG_WAVP_PACE_APPR_ONSET" }, { 4165, 659525, "MDC_ECG_WAVP_PACE_APPR_OFFSET" }, { 4166, 659526, "MDC_ECG_WAVP_PACE_APPR_ONSET_IMPL" }, { 4167, 659527, "MDC_ECG_WAVP_PACE_APPR_OFFSET_IMPL" }, { 4168, 659528, "MDC_ECG_WAVP_PACE_APPR_AREA" }, { 4169, 659529, "MDC_ECG_WAVP_PACE_APPR_INTEGRAL" }, { 4176, 659536, "MDC_ECG_WAVP_PACE_APPR_NC" }, { 4177, 659537, "MDC_ECG_WAVP_PACE_APPR_NC_TIME_POINT" }, { 4178, 659538, "MDC_ECG_WAVP_PACE_APPR_NC_DURN" }, { 4179, 659539, "MDC_ECG_WAVP_PACE_APPR_NC_PEAK" }, { 4180, 659540, "MDC_ECG_WAVP_PACE_APPR_NC_ONSET" }, { 4181, 659541, "MDC_ECG_WAVP_PACE_APPR_NC_OFFSET" }, { 4182, 659542, "MDC_ECG_WAVP_PACE_APPR_NC_ONSET_IMPL" }, { 4183, 659543, "MDC_ECG_WAVP_PACE_APPR_NC_OFFSET_IMPL" }, { 4184, 659544, "MDC_ECG_WAVP_PACE_APPR_NC_AREA" }, { 4185, 659545, "MDC_ECG_WAVP_PACE_APPR_NC_INTEGRAL" }, { 4192, 659552, "MDC_ECG_WAVP_PACE_APPR_C" }, { 4193, 659553, "MDC_ECG_WAVP_PACE_APPR_C_TIME_POINT" }, { 4194, 659554, "MDC_ECG_WAVP_PACE_APPR_C_DURN" }, { 4195, 659555, "MDC_ECG_WAVP_PACE_APPR_C_PEAK" }, { 4196, 659556, "MDC_ECG_WAVP_PACE_APPR_C_ONSET" }, { 4197, 659557, "MDC_ECG_WAVP_PACE_APPR_C_OFFSET" }, { 4198, 659558, "MDC_ECG_WAVP_PACE_APPR_C_ONSET_IMPL" }, { 4199, 659559, "MDC_ECG_WAVP_PACE_APPR_C_OFFSET_IMPL" }, { 4200, 659560, "MDC_ECG_WAVP_PACE_APPR_C_AREA" }, { 4201, 659561, "MDC_ECG_WAVP_PACE_APPR_C_INTEGRAL" }, { 4208, 659568, "MDC_ECG_WAVP_PACE_APPR_FSN" }, { 4209, 659569, "MDC_ECG_WAVP_PACE_APPR_FSN_TIME_POINT" }, { 4210, 659570, "MDC_ECG_WAVP_PACE_APPR_FSN_DURN" }, { 4211, 659571, "MDC_ECG_WAVP_PACE_APPR_FSN_PEAK" }, { 4212, 659572, "MDC_ECG_WAVP_PACE_APPR_FSN_ONSET" }, { 4213, 659573, "MDC_ECG_WAVP_PACE_APPR_FSN_OFFSET" }, { 4214, 659574, "MDC_ECG_WAVP_PACE_APPR_FSN_ONSET_IMPL" }, { 4215, 659575, "MDC_ECG_WAVP_PACE_APPR_FSN_OFFSET_IMPL" }, { 4216, 659576, "MDC_ECG_WAVP_PACE_APPR_FSN_AREA" }, { 4217, 659577, "MDC_ECG_WAVP_PACE_APPR_FSN_INTEGRAL" }, { 4224, 659584, "MDC_ECG_WAVP_PACE_INAPPR" }, { 4225, 659585, "MDC_ECG_WAVP_PACE_INAPPR_TIME_POINT" }, { 4226, 659586, "MDC_ECG_WAVP_PACE_INAPPR_DURN" }, { 4227, 659587, "MDC_ECG_WAVP_PACE_INAPPR_PEAK" }, { 4228, 659588, "MDC_ECG_WAVP_PACE_INAPPR_ONSET" }, { 4229, 659589, "MDC_ECG_WAVP_PACE_INAPPR_OFFSET" }, { 4230, 659590, "MDC_ECG_WAVP_PACE_INAPPR_ONSET_IMPL" }, { 4231, 659591, "MDC_ECG_WAVP_PACE_INAPPR_OFFSET_IMPL" }, { 4232, 659592, "MDC_ECG_WAVP_PACE_INAPPR_AREA" }, { 4233, 659593, "MDC_ECG_WAVP_PACE_INAPPR_INTEGRAL" }, { 4240, 659600, "MDC_ECG_WAVP_PACE_INAPPR_NC" }, { 4241, 659601, "MDC_ECG_WAVP_PACE_INAPPR_NC_TIME_POINT" }, { 4242, 659602, "MDC_ECG_WAVP_PACE_INAPPR_NC_DURN" }, { 4243, 659603, "MDC_ECG_WAVP_PACE_INAPPR_NC_PEAK" }, { 4244, 659604, "MDC_ECG_WAVP_PACE_INAPPR_NC_ONSET" }, { 4245, 659605, "MDC_ECG_WAVP_PACE_INAPPR_NC_OFFSET" }, { 4246, 659606, "MDC_ECG_WAVP_PACE_INAPPR_NC_ONSET_IMPL" }, { 4247, 659607, "MDC_ECG_WAVP_PACE_INAPPR_NC_OFFSET_IMPL" }, { 4248, 659608, "MDC_ECG_WAVP_PACE_INAPPR_NC_AREA" }, { 4249, 659609, "MDC_ECG_WAVP_PACE_INAPPR_NC_INTEGRAL" }, { 4256, 659616, "MDC_ECG_WAVP_PACE_INAPPR_C" }, { 4257, 659617, "MDC_ECG_WAVP_PACE_INAPPR_C_TIME_POINT" }, { 4258, 659618, "MDC_ECG_WAVP_PACE_INAPPR_C_DURN" }, { 4259, 659619, "MDC_ECG_WAVP_PACE_INAPPR_C_PEAK" }, { 4260, 659620, "MDC_ECG_WAVP_PACE_INAPPR_C_ONSET" }, { 4261, 659621, "MDC_ECG_WAVP_PACE_INAPPR_C_OFFSET" }, { 4262, 659622, "MDC_ECG_WAVP_PACE_INAPPR_C_ONSET_IMPL" }, { 4263, 659623, "MDC_ECG_WAVP_PACE_INAPPR_C_OFFSET_IMPL" }, { 4264, 659624, "MDC_ECG_WAVP_PACE_INAPPR_C_AREA" }, { 4265, 659625, "MDC_ECG_WAVP_PACE_INAPPR_C_INTEGRAL" }, { 4272, 659632, "MDC_ECG_WAVP_PACE_INAPPR_FSN" }, { 4273, 659633, "MDC_ECG_WAVP_PACE_INAPPR_FSN_TIME_POINT" }, { 4274, 659634, "MDC_ECG_WAVP_PACE_INAPPR_FSN_DURN" }, { 4275, 659635, "MDC_ECG_WAVP_PACE_INAPPR_FSN_PEAK" }, { 4276, 659636, "MDC_ECG_WAVP_PACE_INAPPR_FSN_ONSET" }, { 4277, 659637, "MDC_ECG_WAVP_PACE_INAPPR_FSN_OFFSET" }, { 4278, 659638, "MDC_ECG_WAVP_PACE_INAPPR_FSN_ONSET_IMPL" }, { 4279, 659639, "MDC_ECG_WAVP_PACE_INAPPR_FSN_OFFSET_IMPL" }, { 4280, 659640, "MDC_ECG_WAVP_PACE_INAPPR_FSN_AREA" }, { 4281, 659641, "MDC_ECG_WAVP_PACE_INAPPR_FSN_INTEGRAL" }, { 4288, 659648, "MDC_ECG_WAVP_PACE_EXCP" }, { 4289, 659649, "MDC_ECG_WAVP_PACE_EXCP_TIME_POINT" }, { 4290, 659650, "MDC_ECG_WAVP_PACE_EXCP_DURN" }, { 4291, 659651, "MDC_ECG_WAVP_PACE_EXCP_PEAK" }, { 4292, 659652, "MDC_ECG_WAVP_PACE_EXCP_ONSET" }, { 4293, 659653, "MDC_ECG_WAVP_PACE_EXCP_OFFSET" }, { 4294, 659654, "MDC_ECG_WAVP_PACE_EXCP_ONSET_IMPL" }, { 4295, 659655, "MDC_ECG_WAVP_PACE_EXCP_OFFSET_IMPL" }, { 4296, 659656, "MDC_ECG_WAVP_PACE_EXCP_AREA" }, { 4297, 659657, "MDC_ECG_WAVP_PACE_EXCP_INTEGRAL" }, { 4304, 659664, "MDC_ECG_WAVP_PACE_EXCP_NC" }, { 4305, 659665, "MDC_ECG_WAVP_PACE_EXCP_NC_TIME_POINT" }, { 4306, 659666, "MDC_ECG_WAVP_PACE_EXCP_NC_DURN" }, { 4307, 659667, "MDC_ECG_WAVP_PACE_EXCP_NC_PEAK" }, { 4308, 659668, "MDC_ECG_WAVP_PACE_EXCP_NC_ONSET" }, { 4309, 659669, "MDC_ECG_WAVP_PACE_EXCP_NC_OFFSET" }, { 4310, 659670, "MDC_ECG_WAVP_PACE_EXCP_NC_ONSET_IMPL" }, { 4311, 659671, "MDC_ECG_WAVP_PACE_EXCP_NC_OFFSET_IMPL" }, { 4312, 659672, "MDC_ECG_WAVP_PACE_EXCP_NC_AREA" }, { 4313, 659673, "MDC_ECG_WAVP_PACE_EXCP_NC_INTEGRAL" }, { 4320, 659680, "MDC_ECG_WAVP_PACE_EXCP_C" }, { 4321, 659681, "MDC_ECG_WAVP_PACE_EXCP_C_TIME_POINT" }, { 4322, 659682, "MDC_ECG_WAVP_PACE_EXCP_C_DURN" }, { 4323, 659683, "MDC_ECG_WAVP_PACE_EXCP_C_PEAK" }, { 4324, 659684, "MDC_ECG_WAVP_PACE_EXCP_C_ONSET" }, { 4325, 659685, "MDC_ECG_WAVP_PACE_EXCP_C_OFFSET" }, { 4326, 659686, "MDC_ECG_WAVP_PACE_EXCP_C_ONSET_IMPL" }, { 4327, 659687, "MDC_ECG_WAVP_PACE_EXCP_C_OFFSET_IMPL" }, { 4328, 659688, "MDC_ECG_WAVP_PACE_EXCP_C_AREA" }, { 4329, 659689, "MDC_ECG_WAVP_PACE_EXCP_C_INTEGRAL" }, { 4336, 659696, "MDC_ECG_WAVP_PACE_EXCP_FSN" }, { 4337, 659697, "MDC_ECG_WAVP_PACE_EXCP_FSN_TIME_POINT" }, { 4338, 659698, "MDC_ECG_WAVP_PACE_EXCP_FSN_DURN" }, { 4339, 659699, "MDC_ECG_WAVP_PACE_EXCP_FSN_PEAK" }, { 4340, 659700, "MDC_ECG_WAVP_PACE_EXCP_FSN_ONSET" }, { 4341, 659701, "MDC_ECG_WAVP_PACE_EXCP_FSN_OFFSET" }, { 4342, 659702, "MDC_ECG_WAVP_PACE_EXCP_FSN_ONSET_IMPL" }, { 4343, 659703, "MDC_ECG_WAVP_PACE_EXCP_FSN_OFFSET_IMPL" }, { 4344, 659704, "MDC_ECG_WAVP_PACE_EXCP_FSN_AREA" }, { 4345, 659705, "MDC_ECG_WAVP_PACE_EXCP_FSN_INTEGRAL" }, { 4352, 659712, "MDC_ECG_WAVP_PACE_ATR" }, { 4608, 659968, "MDC_ECG_WAVP_PACE_ATR_R" }, { 4864, 660224, "MDC_ECG_WAVP_PACE_ATR_L" }, { 5120, 660480, "MDC_ECG_WAVP_PACE_V" }, { 5376, 660736, "MDC_ECG_WAVP_PACE_V_R" }, { 5632, 660992, "MDC_ECG_WAVP_PACE_V_L" }, { 5888, 661248, "MDC_ECG_WAVP_PACE_EXT" }, { 6144, 661504, "MDC_ECG_WAVP_ATPACE" }, { 6400, 661760, "MDC_ECG_WAVP_ATPACE_ATR" }, { 6656, 662016, "MDC_ECG_WAVP_ATPACE_V" }, { 6912, 662272, "MDC_ECG_WAVP_ATPACE_EXT" }, { 7168, 662528, "MDC_ECG_WAVP_CDVS" }, { 7424, 662784, "MDC_ECG_WAVP_CDVS_ATR" }, { 7680, 663040, "MDC_ECG_WAVP_CDVS_V" }, { 7936, 663296, "MDC_ECG_WAVP_CDVS_EXT" }, { 8192, 663552, "MDC_ECG_WAVP_DEFIB" }, { 8448, 663808, "MDC_ECG_WAVP_DEFIB_ATR" }, { 8704, 664064, "MDC_ECG_WAVP_DEFIB_V" }, { 8960, 664320, "MDC_ECG_WAVP_DEFIB_EXT" }, { 8192, 663552, "MDC_ECG_BEAT" }, { 8193, 663553, "MDC_ECG_BEAT_TIME_POINT" }, { 8194, 663554, "MDC_ECG_BEAT_DURN" }, { 8195, 663555, "MDC_ECG_BEAT_PEAK" }, { 8196, 663556, "MDC_ECG_BEAT_ONSET" }, { 8197, 663557, "MDC_ECG_BEAT_OFFSET" }, { 8198, 663558, "MDC_ECG_BEAT_ONSET_IMPL" }, { 8199, 663559, "MDC_ECG_BEAT_OFFSET_IMPL" }, { 8200, 663560, "MDC_ECG_BEAT_EVENT" }, { 8201, 663561, "MDC_ECG_BEAT_COUNT" }, { 8202, 663562, "MDC_ECG_BEAT_RATE" }, { 8203, 663563, "MDC_ECG_BEAT_RATE_MAX" }, { 8204, 663564, "MDC_ECG_BEAT_RATE_MIN" }, { 8205, 663565, "MDC_ECG_BEAT_RATE_MEAN" }, { 8206, 663566, "MDC_ECG_BEAT_TIME" }, { 8207, 663567, "MDC_ECG_BEAT_ANNOT" }, { 8208, 663568, "MDC_ECG_BEAT_NORMAL" }, { 8224, 663584, "MDC_ECG_BEAT_ABNORMAL" }, { 8240, 663600, "MDC_ECG_BEAT_DOMINANT" }, { 8256, 663616, "MDC_ECG_BEAT_SV_P_C" }, { 8272, 663632, "MDC_ECG_BEAT_ATR_P_C" }, { 8288, 663648, "MDC_ECG_BEAT_JUNC_P_C" }, { 8304, 663664, "MDC_ECG_BEAT_ATR_P_C_ABERR" }, { 8320, 663680, "MDC_ECG_BEAT_ATR_PWAVE_BLK" }, { 8336, 663696, "MDC_ECG_BEAT_V_P_C" }, { 8352, 663712, "MDC_ECG_BEAT_V_P_C_FUSION" }, { 8368, 663728, "MDC_ECG_BEAT_V_P_C_RonT" }, { 8384, 663744, "MDC_ECG_BEAT_SV_ESC" }, { 8400, 663760, "MDC_ECG_BEAT_ATR_ESC" }, { 8416, 663776, "MDC_ECG_BEAT_JUNC_ESC" }, { 8432, 663792, "MDC_ECG_BEAT_V_ESC" }, { 8448, 663808, "MDC_ECG_BEAT_BB_BLK" }, { 8464, 663824, "MDC_ECG_BEAT_LBB_BLK_COMP" }, { 8480, 663840, "MDC_ECG_BEAT_LBB_BLK_INCOMP" }, { 8496, 663856, "MDC_ECG_BEAT_RBB_BLK_COMP" }, { 8512, 663872, "MDC_ECG_BEAT_RBB_BLK_INCOMP" }, { 8528, 663888, "MDC_ECG_BEAT_BLK_ANT_L_HEMI" }, { 8544, 663904, "MDC_ECG_BEAT_BLK_POS_L_HEMI" }, { 8560, 663920, "MDC_ECG_BEAT_BLK_BIFAS" }, { 8576, 663936, "MDC_ECG_BEAT_BLK_TRFAS" }, { 8592, 663952, "MDC_ECG_BEAT_BLK_BILAT" }, { 8608, 663968, "MDC_ECG_BEAT_BLK_IVCD" }, { 8624, 663984, "MDC_ECG_BEAT_PREX" }, { 8640, 664000, "MDC_ECG_BEAT_WPW_UNK" }, { 8656, 664016, "MDC_ECG_BEAT_WPW_A" }, { 8672, 664032, "MDC_ECG_BEAT_WPW_B" }, { 8688, 664048, "MDC_ECG_BEAT_LGL" }, { 8704, 664064, "MDC_ECG_BEAT_PACED" }, { 8720, 664080, "MDC_ECG_BEAT_PACED_FUS" }, { 8736, 664096, "MDC_ECG_BEAT_UNKNOWN" }, { 8752, 664112, "MDC_ECG_BEAT_LEARN" }, { 9216, 664576, "MDC_ECG_RHY_SINUS_RHY" }, { 9217, 664577, "MDC_ECG_RHY_SINUS_RHY_TIME_POINT" }, { 9218, 664578, "MDC_ECG_RHY_SINUS_RHY_DURN" }, { 9219, 664579, "MDC_ECG_RHY_SINUS_RHY_PEAK" }, { 9220, 664580, "MDC_ECG_RHY_SINUS_RHY_ONSET" }, { 9221, 664581, "MDC_ECG_RHY_SINUS_RHY_OFFSET" }, { 9222, 664582, "MDC_ECG_RHY_SINUS_RHY_ONSET_IMPL" }, { 9223, 664583, "MDC_ECG_RHY_SINUS_RHY_OFFSET_IMPL" }, { 9224, 664584, "MDC_ECG_RHY_SINUS_RHY_EVENT" }, { 9225, 664585, "MDC_ECG_RHY_SINUS_RHY_COUNT" }, { 9226, 664586, "MDC_ECG_RHY_SINUS_RHY_RATE" }, { 9227, 664587, "MDC_ECG_RHY_SINUS_RHY_RATE_MAX" }, { 9228, 664588, "MDC_ECG_RHY_SINUS_RHY_RATE_MIN" }, { 9229, 664589, "MDC_ECG_RHY_SINUS_RHY_RATE_MEAN" }, { 9230, 664590, "MDC_ECG_RHY_SINUS_RHY_TIME" }, { 9231, 664591, "MDC_ECG_RHY_SINUS_RHY_ANNOT" }, { 9232, 664592, "MDC_ECG_RHY_SINUS_NORMAL_RHY" }, { 9248, 664608, "MDC_ECG_RHY_SINUS_BRADY" }, { 9264, 664624, "MDC_ECG_RHY_SINUS_TACHY" }, { 9280, 664640, "MDC_ECG_RHY_SINUS_ARRHY" }, { 9296, 664656, "MDC_ECG_RHY_RESP_ARRHY" }, { 9312, 664672, "MDC_ECG_RHY_NON_RESP_ARRHY" }, { 9328, 664688, "MDC_ECG_RHY_WANDP_ARRHY" }, { 9344, 664704, "MDC_ECG_RHY_WANDPAV_ARRHY" }, { 9360, 664720, "MDC_ECG_RHY_ATR_ECT_RHY" }, { 9376, 664736, "MDC_ECG_RHY_ATR_BIGEM" }, { 9392, 664752, "MDC_ECG_RHY_ATR_TACHY" }, { 9408, 664768, "MDC_ECG_RHY_ATR_TACHY_PAROX" }, { 9424, 664784, "MDC_ECG_RHY_ATR_TACHY_MF" }, { 9440, 664800, "MDC_ECG_RHY_ATR_TACHY_AUTO" }, { 9456, 664816, "MDC_ECG_RHY_ATR_FLUT" }, { 9472, 664832, "MDC_ECG_RHY_ATR_FIB" }, { 9488, 664848, "MDC_ECG_RHY_SV_ECT_RHY" }, { 9504, 664864, "MDC_ECG_RHY_SV_TACHY" }, { 9520, 664880, "MDC_ECG_RHY_SV_TACHY_PAROX" }, { 9536, 664896, "MDC_ECG_RHY_JUNC_RHY" }, { 9552, 664912, "MDC_ECG_RHY_JUNC_ESC_BEATS" }, { 9568, 664928, "MDC_ECG_RHY_JUNC_ACCEL" }, { 9584, 664944, "MDC_ECG_RHY_JUNC_TACHY" }, { 9600, 664960, "MDC_ECG_RHY_AV_TACHY_RECIP" }, { 9616, 664976, "MDC_ECG_RHY_AV_TACHY_REENTRANT" }, { 9632, 664992, "MDC_ECG_RHY_AV_HEART_BLK_DEG_1" }, { 9648, 665008, "MDC_ECG_RHY_AV_HEART_BLK_DEG_2" }, { 9664, 665024, "MDC_ECG_RHY_AV_HEART_BLK_DEG_2_I" }, { 9680, 665040, "MDC_ECG_RHY_AV_HEART_BLK_DEG_2_II" }, { 9696, 665056, "MDC_ECG_RHY_AV_HEART_BLK_DEG_3" }, { 9712, 665072, "MDC_ECG_RHY_AV_DISSOC" }, { 9728, 665088, "MDC_ECG_RHY_AV_DISSOC_INT" }, { 9744, 665104, "MDC_ECG_RHY_AV_DISSOC_ISO" }, { 9760, 665120, "MDC_ECG_RHY_AV_DISSOC_COMP" }, { 9776, 665136, "MDC_ECG_RHY_SA_HEART_BLK_DEG_1" }, { 9792, 665152, "MDC_ECG_RHY_SA_HEART_BLK_DEG_2_I" }, { 9808, 665168, "MDC_ECG_RHY_SA_HEART_BLK_DEG_2_II" }, { 9824, 665184, "MDC_ECG_RHY_SA_HEART_BLK_DEG_3" }, { 9840, 665200, "MDC_ECG_RHY_V_RHY" }, { 9856, 665216, "MDC_ECG_RHY_V_IDIO_RHY" }, { 9872, 665232, "MDC_ECG_RHY_V_PARA" }, { 9888, 665248, "MDC_ECG_RHY_V_AIVR" }, { 9904, 665264, "MDC_ECG_RHY_V_IDIO_TACHY" }, { 10464, 665824, "MDC_ECG_RHY_V_BRADY" }, { 9920, 665280, "MDC_ECG_RHY_V_BIGEM" }, { 9936, 665296, "MDC_ECG_RHY_V_TRIGEM" }, { 9952, 665312, "MDC_ECG_RHY_V_P_C_CPLT" }, { 9968, 665328, "MDC_ECG_RHY_V_P_C_RUN" }, { 9984, 665344, "MDC_ECG_RHY_V_TACHY" }, { 10000, 665360, "MDC_ECG_RHY_V_FLUT" }, { 10016, 665376, "MDC_ECG_RHY_V_FIB" }, { 10032, 665392, "MDC_ECG_RHY_V_TACHY_PAROX" }, { 10048, 665408, "MDC_ECG_RHY_V_TACHY_MONO" }, { 10064, 665424, "MDC_ECG_RHY_V_TACHY_POLY" }, { 10080, 665440, "MDC_ECG_RHY_V_TACHY_TDP" }, { 10096, 665456, "MDC_ECG_RHY_PREX" }, { 10112, 665472, "MDC_ECG_RHY_WPW_UNK" }, { 10128, 665488, "MDC_ECG_RHY_WPW_A" }, { 10144, 665504, "MDC_ECG_RHY_WPW_B" }, { 10160, 665520, "MDC_ECG_RHY_LGL" }, { 10176, 665536, "MDC_ECG_RHY_EPADM" }, { 10192, 665552, "MDC_ECG_RHY_EPAC" }, { 10208, 665568, "MDC_ECG_RHY_EPAFC" }, { 10224, 665584, "MDC_ECG_RHY_EPAFS" }, { 10240, 665600, "MDC_ECG_RHY_EPVDM" }, { 10256, 665616, "MDC_ECG_RHY_EPVC" }, { 10272, 665632, "MDC_ECG_RHY_EPVFC" }, { 10288, 665648, "MDC_ECG_RHY_EPVFS" }, { 10304, 665664, "MDC_ECG_RHY_EPAVT" }, { 10320, 665680, "MDC_ECG_RHY_MISSB" }, { 10336, 665696, "MDC_ECG_RHY_ASYSTOLE" }, { 10352, 665712, "MDC_ECG_RHY_IRREG" }, { 10368, 665728, "MDC_ECG_RHY_LHRV" }, { 10384, 665744, "MDC_ECG_RHY_STELVATION" }, { 10400, 665760, "MDC_ECG_RHY_STHILOST" }, { 10416, 665776, "MDC_ECG_RHY_TALT" }, { 10432, 665792, "MDC_ECG_RHY_BRADY" }, { 10448, 665808, "MDC_ECG_RHY_CALS" }, { 10480, 665840, "MDC_ECG_RHY_EPAX" }, { 10496, 665856, "MDC_ECG_RHY_EPAXLO" }, { 10512, 665872, "MDC_ECG_RHY_EPAXFO" }, { 10528, 665888, "MDC_ECG_RHY_EPVX" }, { 10544, 665904, "MDC_ECG_RHY_EPVXLO" }, { 10560, 665920, "MDC_ECG_RHY_EPVXFO" }, { 11200, 666560, "MDC_ECG_NOISE_CLEAN" }, { 11201, 666561, "MDC_ECG_NOISE_CLEAN_TIME_POINT" }, { 11202, 666562, "MDC_ECG_NOISE_CLEAN_DURN" }, { 11203, 666563, "MDC_ECG_NOISE_CLEAN_PEAK" }, { 11204, 666564, "MDC_ECG_NOISE_CLEAN_ONSET" }, { 11205, 666565, "MDC_ECG_NOISE_CLEAN_OFFSET" }, { 11206, 666566, "MDC_ECG_NOISE_CLEAN_ONSET_IMPL" }, { 11207, 666567, "MDC_ECG_NOISE_CLEAN_OFFSET_IMPL" }, { 11208, 666568, "MDC_ECG_NOISE_CLEAN_EVENT" }, { 11209, 666569, "MDC_ECG_NOISE_CLEAN_COUNT" }, { 11210, 666570, "MDC_ECG_NOISE_CLEAN_RATE" }, { 11211, 666571, "MDC_ECG_NOISE_CLEAN_RATE_MAX" }, { 11212, 666572, "MDC_ECG_NOISE_CLEAN_RATE_MIN" }, { 11213, 666573, "MDC_ECG_NOISE_CLEAN_RATE_MEAN" }, { 11214, 666574, "MDC_ECG_NOISE_CLEAN_TIME" }, { 11215, 666575, "MDC_ECG_NOISE_CLEAN_ANNOT" }, { 11216, 666576, "MDC_ECG_NOISE_MODERATE" }, { 11232, 666592, "MDC_ECG_NOISE_SEVERE" }, { 11248, 666608, "MDC_ECG_NOISE_NOSIGNAL" }, { 16248, 147320, "MDC_ECG_ANGLE_J20_AZIM" }, { 16249, 147321, "MDC_ECG_ANGLE_J20_AZIM_MAX" }, { 16250, 147322, "MDC_ECG_ANGLE_J20_AZIM_MIN" }, { 16251, 147323, "MDC_ECG_ANGLE_J20_AZIM_MEAN" }, { 16284, 147356, "MDC_ECG_ANGLE_J80_AZIM" }, { 16288, 147360, "MDC_ECG_ANGLE_J80_ELEV" }, { 16296, 147368, "MDC_ECG_ANGLE_Jxx_AZIM" }, { 16300, 147372, "MDC_ECG_ANGLE_Jxx_ELEV" }, { 16236, 147308, "MDC_ECG_ANGLE_J_AZIM" }, { 16240, 147312, "MDC_ECG_ANGLE_J_ELEV" }, { 16252, 147324, "MDC_ECG_ANGLE_J20_ELEV" }, { 16260, 147332, "MDC_ECG_ANGLE_J40_AZIM" }, { 16264, 147336, "MDC_ECG_ANGLE_J40_ELEV" }, { 16272, 147344, "MDC_ECG_ANGLE_J60_AZIM" }, { 16276, 147348, "MDC_ECG_ANGLE_J60_ELEV" }, { 16204, 147276, "MDC_ECG_ANGLE_P_AZIM" }, { 16216, 147288, "MDC_ECG_ANGLE_P_ELEV" }, { 16128, 147200, "MDC_ECG_ANGLE_P_FRONT" }, { 16208, 147280, "MDC_ECG_ANGLE_QRS_AZIM" }, { 16220, 147292, "MDC_ECG_ANGLE_QRS_ELEV" }, { 16132, 147204, "MDC_ECG_ANGLE_QRS_FRONT" }, { 16224, 147296, "MDC_ECG_ANGLE_T_ELEV" }, { 16212, 147284, "MDC_ECG_ANGLE_T_AZIM" }, { 16136, 147208, "MDC_ECG_ANGLE_T_FRONT" }, { 16184, 147256, "MDC_ECG_TIME_PD_P" }, { 16184, 147256, "MDC_ECG_TIME_PD_P_GL" }, { 16140, 147212, "MDC_ECG_TIME_PD_PP" }, { 16140, 147212, "MDC_ECG_TIME_PD_PP_GL" }, { 16144, 147216, "MDC_ECG_TIME_PD_PQ" }, { 15872, 146944, "MDC_ECG_TIME_PD_PR" }, { 16148, 147220, "MDC_ECG_TIME_PD_PQ_SEG" }, { 16156, 147228, "MDC_ECG_TIME_PD_QRS" }, { 16156, 147228, "MDC_ECG_TIME_PD_QRS_GL" }, { 16160, 147232, "MDC_ECG_TIME_PD_QT" }, { 16160, 147232, "MDC_ECG_TIME_PD_QT_GL" }, { 16164, 147236, "MDC_ECG_TIME_PD_QTc" }, { 15876, 146948, "MDC_ECG_TIME_PD_QTC" }, { 15880, 146952, "MDC_ECG_TIME_PD_QTC_BAZETT" }, { 15884, 146956, "MDC_ECG_TIME_PD_QTC_FRAMINGHAM" }, { 15888, 146960, "MDC_ECG_TIME_PD_QTC_HODGES" }, { 15892, 146964, "MDC_ECG_TIME_PD_QTC_FREDERICA" }, { 15896, 146968, "MDC_ECG_TIME_PD_QTC_USER" }, { 16000, 147072, "MDC_ECG_TIME_PD_RR_GL" }, { 16004, 147076, "MDC_ECG_TIME_PD_QTU" }, { 16008, 147080, "MDC_ECG_DISPERSION_QT" }, { 16012, 147084, "MDC_ECG_DISPERSION_QTC" }, { 16168, 147240, "MDC_ECG_TIME_PD_RR" }, { 16168, 147240, "MDC_ECG_TIME_PD_RR_GL" }, { 16304, 147376, "MDC_ECG_TIME_ST_Jxx" }, { 16232, 147304, "MDC_ECG_MAG_J_VECT" }, { 16244, 147316, "MDC_ECG_MAG_J20_VECT" }, { 16256, 147328, "MDC_ECG_MAG_J40_VECT" }, { 16268, 147340, "MDC_ECG_MAG_J60_VECT" }, { 16280, 147352, "MDC_ECG_MAG_J80_VECT" }, { 16292, 147364, "MDC_ECG_MAG_Jxx_VECT" }, { 16172, 147244, "MDC_ECG_MAG_P_FRONT" }, { 16192, 147264, "MDC_ECG_MAG_P_VECT" }, { 16308, 147380, "MDC_ECG_MAG_P_VECT_FRONT" }, { 16312, 147384, "MDC_ECG_MAG_P_VECT_HORIZ" }, { 16316, 147388, "MDC_ECG_MAG_P_VECT_SAGI" }, { 16176, 147248, "MDC_ECG_MAG_QRS_FRONT" }, { 16196, 147268, "MDC_ECG_MAG_QRS_VECT" }, { 16320, 147392, "MDC_ECG_MAG_QRS_VECT_FRONT" }, { 16324, 147396, "MDC_ECG_MAG_QRS_VECT_HORIZ" }, { 16328, 147400, "MDC_ECG_MAG_QRS_VECT_SAGI" }, { 16180, 147252, "MDC_ECG_MAG_T_FRONT" }, { 16200, 147272, "MDC_ECG_MAG_T_VECT" }, { 16332, 147404, "MDC_ECG_MAG_T_VECT_FRONT" }, { 16336, 147408, "MDC_ECG_MAG_T_VECT_HORIZ" }, { 16340, 147412, "MDC_ECG_MAG_T_VECT_SAGI" }, { 16770, 147842, "MDC_ECG_HEART_RATE" }, { 16016, 147088, "MDC_ECG_VENTRICULAR_RATE" }, { 16020, 147092, "MDC_ECG_ATRIAL_RATE" }, { 16024, 147096, "MDC_ECG_VPC_COUNT" }, { 16028, 147100, "MDC_ECG_SVPC_RATE" }, { 16032, 147104, "MDC_ECG_BEAT_COUNT" }, { 6656, 137728, "MDC_ECG_TIME_PD_P" }, { 6657, 137729, "MDC_ECG_TIME_PD_P_I" }, { 6687, 137759, "MDC_ECG_TIME_PD_P_dI" }, { 6658, 137730, "MDC_ECG_TIME_PD_P_II" }, { 6688, 137760, "MDC_ECG_TIME_PD_P_dII" }, { 6659, 137731, "MDC_ECG_TIME_PD_P_V1" }, { 6689, 137761, "MDC_ECG_TIME_PD_P_dV1" }, { 6660, 137732, "MDC_ECG_TIME_PD_P_V2" }, { 6690, 137762, "MDC_ECG_TIME_PD_P_dV2" }, { 6661, 137733, "MDC_ECG_TIME_PD_P_V3" }, { 6691, 137763, "MDC_ECG_TIME_PD_P_dV3" }, { 6662, 137734, "MDC_ECG_TIME_PD_P_V4" }, { 6692, 137764, "MDC_ECG_TIME_PD_P_dV4" }, { 6663, 137735, "MDC_ECG_TIME_PD_P_V5" }, { 6693, 137765, "MDC_ECG_TIME_PD_P_dV5" }, { 6664, 137736, "MDC_ECG_TIME_PD_P_V6" }, { 6694, 137766, "MDC_ECG_TIME_PD_P_dV6" }, { 6665, 137737, "MDC_ECG_TIME_PD_P_V7" }, { 6695, 137767, "MDC_ECG_TIME_PD_P_dV7" }, { 6666, 137738, "MDC_ECG_TIME_PD_P_V2R" }, { 6696, 137768, "MDC_ECG_TIME_PD_P_dV2R" }, { 6667, 137739, "MDC_ECG_TIME_PD_P_V3R" }, { 6697, 137769, "MDC_ECG_TIME_PD_P_dV3R" }, { 6668, 137740, "MDC_ECG_TIME_PD_P_V4R" }, { 6698, 137770, "MDC_ECG_TIME_PD_P_dV4R" }, { 6669, 137741, "MDC_ECG_TIME_PD_P_V5R" }, { 6699, 137771, "MDC_ECG_TIME_PD_P_dV5R" }, { 6670, 137742, "MDC_ECG_TIME_PD_P_V6R" }, { 6700, 137772, "MDC_ECG_TIME_PD_P_dV6R" }, { 6671, 137743, "MDC_ECG_TIME_PD_P_V7R" }, { 6701, 137773, "MDC_ECG_TIME_PD_P_dV7R" }, { 6672, 137744, "MDC_ECG_TIME_PD_P_X" }, { 6702, 137774, "MDC_ECG_TIME_PD_P_dX" }, { 6673, 137745, "MDC_ECG_TIME_PD_P_Y" }, { 6703, 137775, "MDC_ECG_TIME_PD_P_dY" }, { 6674, 137746, "MDC_ECG_TIME_PD_P_Z" }, { 6704, 137776, "MDC_ECG_TIME_PD_P_dZ" }, { 6675, 137747, "MDC_ECG_TIME_PD_P_CC5" }, { 6705, 137777, "MDC_ECG_TIME_PD_P_dCC5" }, { 6676, 137748, "MDC_ECG_TIME_PD_P_CM5" }, { 6706, 137778, "MDC_ECG_TIME_PD_P_dCM5" }, { 6677, 137749, "MDC_ECG_TIME_PD_P_LA" }, { 6707, 137779, "MDC_ECG_TIME_PD_P_dLA" }, { 6678, 137750, "MDC_ECG_TIME_PD_P_RA" }, { 6708, 137780, "MDC_ECG_TIME_PD_P_dRA" }, { 6679, 137751, "MDC_ECG_TIME_PD_P_LL" }, { 6709, 137781, "MDC_ECG_TIME_PD_P_dLL" }, { 6680, 137752, "MDC_ECG_TIME_PD_P_fI" }, { 6710, 137782, "MDC_ECG_TIME_PD_P_dfI" }, { 6681, 137753, "MDC_ECG_TIME_PD_P_fE" }, { 6711, 137783, "MDC_ECG_TIME_PD_P_dfE" }, { 6682, 137754, "MDC_ECG_TIME_PD_P_fC" }, { 6712, 137784, "MDC_ECG_TIME_PD_P_dfC" }, { 6683, 137755, "MDC_ECG_TIME_PD_P_fA" }, { 6713, 137785, "MDC_ECG_TIME_PD_P_dfA" }, { 6684, 137756, "MDC_ECG_TIME_PD_P_fM" }, { 6714, 137786, "MDC_ECG_TIME_PD_P_dfM" }, { 6685, 137757, "MDC_ECG_TIME_PD_P_fF" }, { 6715, 137787, "MDC_ECG_TIME_PD_P_dfF" }, { 6686, 137758, "MDC_ECG_TIME_PD_P_fH" }, { 6716, 137788, "MDC_ECG_TIME_PD_P_dfH" }, { 6717, 137789, "MDC_ECG_TIME_PD_P_III" }, { 6767, 137839, "MDC_ECG_TIME_PD_P_dIII" }, { 6718, 137790, "MDC_ECG_TIME_PD_P_AVR" }, { 6768, 137840, "MDC_ECG_TIME_PD_P_dAVR" }, { 6719, 137791, "MDC_ECG_TIME_PD_P_AVL" }, { 6769, 137841, "MDC_ECG_TIME_PD_P_dAVL" }, { 6720, 137792, "MDC_ECG_TIME_PD_P_AVF" }, { 6770, 137842, "MDC_ECG_TIME_PD_P_dAVF" }, { 6721, 137793, "MDC_ECG_TIME_PD_P_AVRneg" }, { 6771, 137843, "MDC_ECG_TIME_PD_P_dAVRneg" }, { 6722, 137794, "MDC_ECG_TIME_PD_P_V8" }, { 6735, 137807, "MDC_ECG_TIME_PD_P_dV8" }, { 6723, 137795, "MDC_ECG_TIME_PD_P_V9" }, { 6736, 137808, "MDC_ECG_TIME_PD_P_dV9" }, { 6724, 137796, "MDC_ECG_TIME_PD_P_V8R" }, { 6737, 137809, "MDC_ECG_TIME_PD_P_dV8R" }, { 6725, 137797, "MDC_ECG_TIME_PD_P_V9R" }, { 6738, 137810, "MDC_ECG_TIME_PD_P_dV9R" }, { 6726, 137798, "MDC_ECG_TIME_PD_P_D" }, { 6739, 137811, "MDC_ECG_TIME_PD_P_dD" }, { 6727, 137799, "MDC_ECG_TIME_PD_P_A" }, { 6740, 137812, "MDC_ECG_TIME_PD_P_dA" }, { 6728, 137800, "MDC_ECG_TIME_PD_P_J" }, { 6741, 137813, "MDC_ECG_TIME_PD_P_dJ" }, { 6729, 137801, "MDC_ECG_TIME_PD_P_DEFIB" }, { 6791, 137863, "MDC_ECG_TIME_PD_P_dDEFIB" }, { 6730, 137802, "MDC_ECG_TIME_PD_P_EXTERN" }, { 6792, 137864, "MDC_ECG_TIME_PD_P_dEXTERN" }, { 6731, 137803, "MDC_ECG_TIME_PD_P_A1" }, { 6793, 137865, "MDC_ECG_TIME_PD_P_dA1" }, { 6732, 137804, "MDC_ECG_TIME_PD_P_A2" }, { 6794, 137866, "MDC_ECG_TIME_PD_P_dA2" }, { 6733, 137805, "MDC_ECG_TIME_PD_P_A3" }, { 6795, 137867, "MDC_ECG_TIME_PD_P_dA3" }, { 6734, 137806, "MDC_ECG_TIME_PD_P_A4" }, { 6796, 137868, "MDC_ECG_TIME_PD_P_dA4" }, { 6742, 137814, "MDC_ECG_TIME_PD_P_C" }, { 6772, 137844, "MDC_ECG_TIME_PD_P_dC" }, { 6743, 137815, "MDC_ECG_TIME_PD_P_V" }, { 6773, 137845, "MDC_ECG_TIME_PD_P_dV" }, { 6744, 137816, "MDC_ECG_TIME_PD_P_VR" }, { 6774, 137846, "MDC_ECG_TIME_PD_P_dVR" }, { 6745, 137817, "MDC_ECG_TIME_PD_P_VL" }, { 6775, 137847, "MDC_ECG_TIME_PD_P_dVL" }, { 6746, 137818, "MDC_ECG_TIME_PD_P_VF" }, { 6776, 137848, "MDC_ECG_TIME_PD_P_dVF" }, { 6747, 137819, "MDC_ECG_TIME_PD_P_MCL" }, { 6808, 137880, "MDC_ECG_TIME_PD_P_dMCL" }, { 6748, 137820, "MDC_ECG_TIME_PD_P_MCL1" }, { 6797, 137869, "MDC_ECG_TIME_PD_P_dMCL1" }, { 6749, 137821, "MDC_ECG_TIME_PD_P_MCL2" }, { 6798, 137870, "MDC_ECG_TIME_PD_P_dMCL2" }, { 6750, 137822, "MDC_ECG_TIME_PD_P_MCL3" }, { 6799, 137871, "MDC_ECG_TIME_PD_P_dMCL3" }, { 6751, 137823, "MDC_ECG_TIME_PD_P_MCL4" }, { 6800, 137872, "MDC_ECG_TIME_PD_P_dMCL4" }, { 6752, 137824, "MDC_ECG_TIME_PD_P_MCL5" }, { 6801, 137873, "MDC_ECG_TIME_PD_P_dMCL5" }, { 6753, 137825, "MDC_ECG_TIME_PD_P_MCL6" }, { 6802, 137874, "MDC_ECG_TIME_PD_P_dMCL6" }, { 6754, 137826, "MDC_ECG_TIME_PD_P_CC" }, { 6809, 137881, "MDC_ECG_TIME_PD_P_dCC" }, { 6755, 137827, "MDC_ECG_TIME_PD_P_CC1" }, { 6810, 137882, "MDC_ECG_TIME_PD_P_dCC1" }, { 6756, 137828, "MDC_ECG_TIME_PD_P_CC2" }, { 6811, 137883, "MDC_ECG_TIME_PD_P_dCC2" }, { 6757, 137829, "MDC_ECG_TIME_PD_P_CC3" }, { 6812, 137884, "MDC_ECG_TIME_PD_P_dCC3" }, { 6758, 137830, "MDC_ECG_TIME_PD_P_CC4" }, { 6813, 137885, "MDC_ECG_TIME_PD_P_dCC4" }, { 6759, 137831, "MDC_ECG_TIME_PD_P_CC6" }, { 6814, 137886, "MDC_ECG_TIME_PD_P_dCC6" }, { 6760, 137832, "MDC_ECG_TIME_PD_P_CC7" }, { 6815, 137887, "MDC_ECG_TIME_PD_P_dCC7" }, { 6761, 137833, "MDC_ECG_TIME_PD_P_CM" }, { 6816, 137888, "MDC_ECG_TIME_PD_P_dCM" }, { 6762, 137834, "MDC_ECG_TIME_PD_P_CM1" }, { 6817, 137889, "MDC_ECG_TIME_PD_P_dCM1" }, { 6763, 137835, "MDC_ECG_TIME_PD_P_CM2" }, { 6818, 137890, "MDC_ECG_TIME_PD_P_dCM2" }, { 6764, 137836, "MDC_ECG_TIME_PD_P_CM3" }, { 6819, 137891, "MDC_ECG_TIME_PD_P_dCM3" }, { 6765, 137837, "MDC_ECG_TIME_PD_P_CM4" }, { 6820, 137892, "MDC_ECG_TIME_PD_P_dCM4" }, { 6766, 137838, "MDC_ECG_TIME_PD_P_CM6" }, { 6821, 137893, "MDC_ECG_TIME_PD_P_dCM6" }, { 6777, 137849, "MDC_ECG_TIME_PD_P_CM7" }, { 6822, 137894, "MDC_ECG_TIME_PD_P_dCM7" }, { 6778, 137850, "MDC_ECG_TIME_PD_P_CH5" }, { 6823, 137895, "MDC_ECG_TIME_PD_P_dCH5" }, { 6779, 137851, "MDC_ECG_TIME_PD_P_CS5" }, { 6824, 137896, "MDC_ECG_TIME_PD_P_dCS5" }, { 6780, 137852, "MDC_ECG_TIME_PD_P_CB5" }, { 6825, 137897, "MDC_ECG_TIME_PD_P_dCB5" }, { 6781, 137853, "MDC_ECG_TIME_PD_P_CR5" }, { 6826, 137898, "MDC_ECG_TIME_PD_P_dCR5" }, { 6782, 137854, "MDC_ECG_TIME_PD_P_ML" }, { 6827, 137899, "MDC_ECG_TIME_PD_P_dML" }, { 6783, 137855, "MDC_ECG_TIME_PD_P_AB1" }, { 6828, 137900, "MDC_ECG_TIME_PD_P_dAB1" }, { 6784, 137856, "MDC_ECG_TIME_PD_P_AB2" }, { 6829, 137901, "MDC_ECG_TIME_PD_P_dAB2" }, { 6785, 137857, "MDC_ECG_TIME_PD_P_AB3" }, { 6830, 137902, "MDC_ECG_TIME_PD_P_dAB3" }, { 6786, 137858, "MDC_ECG_TIME_PD_P_AB4" }, { 6831, 137903, "MDC_ECG_TIME_PD_P_dAB4" }, { 6787, 137859, "MDC_ECG_TIME_PD_P_ES" }, { 6832, 137904, "MDC_ECG_TIME_PD_P_dES" }, { 6788, 137860, "MDC_ECG_TIME_PD_P_AS" }, { 6833, 137905, "MDC_ECG_TIME_PD_P_dAS" }, { 6789, 137861, "MDC_ECG_TIME_PD_P_AI" }, { 6834, 137906, "MDC_ECG_TIME_PD_P_dAI" }, { 6790, 137862, "MDC_ECG_TIME_PD_P_S" }, { 6835, 137907, "MDC_ECG_TIME_PD_P_dS" }, { 6803, 137875, "MDC_ECG_TIME_PD_P_RL" }, { 6836, 137908, "MDC_ECG_TIME_PD_P_dRL" }, { 6804, 137876, "MDC_ECG_TIME_PD_P_CV5RL" }, { 6837, 137909, "MDC_ECG_TIME_PD_P_dCV5RL" }, { 6805, 137877, "MDC_ECG_TIME_PD_P_CV6LL" }, { 6838, 137910, "MDC_ECG_TIME_PD_P_dCV6LL" }, { 6806, 137878, "MDC_ECG_TIME_PD_P_CV6LU" }, { 6839, 137911, "MDC_ECG_TIME_PD_P_dCV6LU" }, { 6807, 137879, "MDC_ECG_TIME_PD_P_V10" }, { 6840, 137912, "MDC_ECG_TIME_PD_P_dV10" }, { 5888, 136960, "MDC_ECG_TIME_END_P" }, { 4608, 135680, "MDC_ECG_TIME_PD_P1" }, { 4864, 135936, "MDC_ECG_TIME_PD_P2" }, { 9472, 140544, "MDC_ECG_TIME_START_P" }, { 5120, 136192, "MDC_ECG_TIME_PD_P3" }, { 7168, 138240, "MDC_ECG_TIME_PD_PR" }, { 7680, 138752, "MDC_ECG_TIME_PD_Q" }, { 7936, 139008, "MDC_ECG_TIME_PD_QRS" }, { 6144, 137216, "MDC_ECG_TIME_END_QRS" }, { 9728, 140800, "MDC_ECG_TIME_START_QRS" }, { 8192, 139264, "MDC_ECG_TIME_PD_QT" }, { 8448, 139520, "MDC_ECG_TIME_PD_QT_CORR" }, { 11264, 142336, "MDC_ECG_TIME_PD_R_1" }, { 11520, 142592, "MDC_ECG_TIME_PD_R_2" }, { 11776, 142848, "MDC_ECG_TIME_PD_R_3" }, { 12032, 143104, "MDC_ECG_TIME_PD_S_1" }, { 12288, 143360, "MDC_ECG_TIME_PD_S_2" }, { 12544, 143616, "MDC_ECG_TIME_PD_S_3" }, { 6400, 137472, "MDC_ECG_TIME_END_QRS" }, { 9984, 141056, "MDC_ECG_TIME_START_T" }, { 11008, 142080, "MDC_ECG_TIME_PD_VENT_ACTIV" }, { 256, 131328, "MDC_ECG_ELEC_POTL" }, { 1024, 132096, "MDC_ECG_AMPL_J" }, { 14848, 145920, "MDC_ECG_ELEC_POTL_ST_20" }, { 15104, 146176, "MDC_ECG_ELEC_POTL_ST_40" }, { 14336, 145408, "MDC_ECG_ELEC_POTL_ST_60" }, { 14592, 145664, "MDC_ECG_ELEC_POTL_ST_80" }, { 1280, 132352, "MDC_ECG_AMPL_P_MAX" }, { 1536, 132608, "MDC_ECG_AMPL_P_MIN" }, { 3072, 134144, "MDC_ECG_AMPL_P3" }, { 1792, 132864, "MDC_ECG_AMPL_Q" }, { 2048, 133120, "MDC_ECG_AMPL_R" }, { 12800, 143872, "MDC_ECG_ELEC_POTL_R_1" }, { 13056, 144128, "MDC_ECG_ELEC_POTL_R_2" }, { 13312, 144384, "MDC_ECG_ELEC_POTL_R_3" }, { 2304, 133376, "MDC_ECG_AMPL_S" }, { 13568, 144640, "MDC_ECG_ELEC_POTL_S_1" }, { 13824, 144896, "MDC_ECG_ELEC_POTL_S_2" }, { 14080, 145152, "MDC_ECG_ELEC_POTL_S_3" }, { 2560, 133632, "MDC_ECG_AMPL_T_MAX" }, { 2816, 133888, "MDC_ECG_AMPL_T_MIN" }, { 256, 131328, "MDC_ECG_ELEC_POTL" }, { 768, 131840, "MDC_ECG_AMPL_ST" }, { 6912, 137984, "MDC_ECG_INTEGRAL_P" }, { 3840, 134912, "MDC_ECG_AREA_P" }, { 7424, 138496, "MDC_ECG_INTEGRAL_Q" }, { 3328, 134400, "MDC_ECG_AREA_Q" }, { 8704, 139776, "MDC_ECG_INTEGRAL_QRS" }, { 4096, 135168, "MDC_ECG_AREA_QRS" }, { 9216, 140288, "MDC_ECG_INTEGRAL_ST" }, { 4352, 135424, "MDC_ECG_AREA_ST" }, { 8960, 140032, "MDC_ECG_INTEGRAL_T" }, { 3584, 134656, "MDC_ECG_AREA_T" }, { 5376, 136448, "MDC_ECG_SLOPE_ST" }, { 32768, 163840, "MDC_ECG_TIME_PD_PP" }, { 33024, 164096, "MDC_ECG_TIME_PD_RR" }, { 33280, 164352, "MDC_ECG_TIME_PD_PQ" }, { 33536, 164608, "MDC_ECG_TIME_PD_PQ_SEG" }, { 33792, 164864, "MDC_ECG_TIME_PD_QTc" }, { 34048, 165120, "MDC_ECG_TIME_PD_QTcB" }, { 34304, 165376, "MDC_ECG_TIME_PD_QTcF" }, { 34560, 165632, "MDC_ECG_TIME_PD_QTU" }, { 34816, 165888, "MDC_ECG_SHAPE_ST" }, { 35072, 166144, "MDC_ECG_SHAPE_ST_T" }, { 11264, 666624, "MDC_ECG_LDSYS_12LD_UNSPECIFIED" }, { 11265, 666625, "MDC_ECG_LDSYS_12LD_STD" }, { 11266, 666626, "MDC_ECG_LDSYS_12LD_MASON_LIKAR" }, { 11267, 666627, "MDC_ECG_LDSYS_12LD_VPAD" }, { 11268, 666628, "MDC_ECG_LDSYS_12LD_PAD" }, { 11269, 666629, "MDC_ECG_LDSYS_12LD_FROM_FRANK" }, { 11270, 666630, "MDC_ECG_LDSYS_12LD_NON_STANDARD" }, { 11271, 666631, "MDC_ECG_LDSYS_12LD_BICYCLE" }, { 11272, 666632, "MDC_ECG_LDSYS_12LD_RAISED_INTERCOSTAL" }, { 11273, 666633, "MDC_ECG_LDSYS_XYZ_UNSPECIFIED" }, { 11274, 666634, "MDC_ECG_LDSYS_XYZ_FRANK" }, { 11275, 666635, "MDC_ECG_LDSYS_XYZ_MCFEE_PARUNAGO" }, { 11276, 666636, "MDC_ECG_LDSYS_XYZ_CUBE" }, { 11277, 666637, "MDC_ECG_LDSYS_XYZ_BIPOLAR" }, { 11278, 666638, "MDC_ECG_LDSYS_XYZ_PSEUDO_ORTH" }, { 11279, 666639, "MDC_ECG_LDSYS_XYZ_FROM_12LD" }, { 11280, 666640, "MDC_ECG_LDSYS_3LD_NEHB" }, { 11281, 666641, "MDC_ECG_LDSYS_3LD_CC5_CM5_ML" }, { 11282, 666642, "MDC_ECG_LDSYS_3LD_CM5_CC5_CH5" }, { 11283, 666643, "MDC_ECG_LDSYS_12LD_FROM_DOWER" }, { 11284, 666644, "MDC_ECG_LDSYS_12LD_FROM_EASI" }, { 11285, 666645, "MDC_ECG_LDSYS_12LD_FROM_LIMB" }, { 11286, 666646, "MDC_ECG_LDSYS_12LD_STD_AND_XYZ" }, { 11287, 666647, "MDC_ECG_LDSYS_12LD_STD_AND_NEHB" }, { 11288, 666648, "MDC_ECG_LDSYS_12LD_STD_AND_CC5_CM5_ML" }, { 11289, 666649, "MDC_ECG_LDSYS_12LD_STD_AND_CM5_CC5_CH5" }, { 11290, 666650, "MDC_ECG_LDSYS_12LD_STD_EXTD" }, { 11291, 666651, "MDC_ECG_LDSYS_12LD_STD_EXTD_RIGHT" }, { 11292, 666652, "MDC_ECG_LDSYS_12LD_STD_EXTD_LEFT" }, { 11392, 666752, "MDC_ECG_CTL_VBL" }, { 11393, 666753, "MDC_ECG_CTL_VBL_SAMPLE_RATE" }, { 11394, 666754, "MDC_ECG_CTL_VBL_SENSITIVITY" }, { 11395, 666755, "MDC_ECG_CTL_VBL_ZERO_OFFSET" }, { 11396, 666756, "MDC_ECG_CTL_VBL_VALID_RANGE" }, { 11397, 666757, "MDC_ECG_CTL_VBL_PAD_VALUE" }, { 11398, 666758, "MDC_ECG_CTL_VBL_TIME_SKEW" }, { 11399, 666759, "MDC_ECG_CTL_VBL_SAMPLE_SKEW" }, { 11400, 666760, "MDC_ECG_CTL_VBL_TIME_OFFSET" }, { 11401, 666761, "MDC_ECG_CTL_VBL_QTC_METHOD" }, { 11402, 666762, "MDC_ECG_CTL_VBL_ATTR_FILTER_LOW_PASS" }, { 11403, 666763, "MDC_ECG_CTL_VBL_ATTR_FILTER_CUTOFF_FREQ" }, { 11404, 666764, "MDC_ECG_CTL_VBL_ATTR_FILTER_HIGH_PASS" }, { 11405, 666765, "MDC_ECG_CTL_VBL_ATTR_FILTER_ORDER" }, { 11406, 666766, "MDC_ECG_CTL_VBL_ATTR_FILTER_DESCRIPTION" }, { 11407, 666767, "MDC_ECG_CTL_VBL_ATTR_FILTER_NOTCH" }, { 11408, 666768, "MDC_ECG_CTL_VBL_ATTR_FILTER_NOTCH_FREQ" }, { 11409, 666769, "MDC_ECG_CTL_VBL_ATTR_FILTER_NOTCH_BANDWIDTH" }, { 11410, 666770, "MDC_ECG_CTL_VBL_ATTR_FILTER_DESCRIPTION" }, { 11411, 666771, "MDC_ECG_CTL_VBL_BASELINE" }, { 11412, 666772, "MDC_ECG_CTL_VBL_BASELINE_DESC" }, { 11413, 666773, "MDC_ECG_CTL_VBL_BASELINE_ORDER" }, { 11414, 666774, "MDC_ECG_CTL_VBL_INTERPOLATOR" }, { 11415, 666775, "MDC_ECG_CTL_VBL_INTERPOLATOR_SRC_SAMP_RATE" }, { 11416, 666776, "MDC_ECG_CTL_VBL_INTERPOLATOR_DESC" }, { 11417, 666777, "MDC_ECG_CTL_VBL_INTERPOLATOR_ORDER" }, { 11418, 666778, "MDC_ECG_CTL_VBL_INTERPOLATOR_SNR" }, { 11419, 666779, "MDC_ECG_CTL_VBL_DISPLAYED_SIZE" }, { 11420, 666780, "MDC_ECG_CTL_VBL_DISPLAYED_COLOR" }, { 11421, 666781, "MDC_ECG_CTL_VBL_DISPLAYED_SWEEP_RATE" }, { 11422, 666782, "MDC_ECG_CTL_VBL_ATTR_RHTYHM" }, { 11423, 666783, "MDC_ECG_CTL_VBL_ATTR_AV_COND" }, { 11424, 666784, "MDC_ECG_CTL_VBL_ATTR_SA_COND" }, { 11425, 666785, "MDC_ECG_CTL_VBL_ATTR_RHYTHM_CRITERIA" }, { 11426, 666786, "MDC_ECG_CTL_VBL_ATTR_RHYTHM_CODE" }, { 11427, 666787, "MDC_ECG_CTL_VBL_ATTR_RATE_LIMIT_HIGH_GT" }, { 11428, 666788, "MDC_ECG_CTL_VBL_ATTR_RATE_LIMIT_HIGH_GE" }, { 11429, 666789, "MDC_ECG_CTL_VBL_ATTR_RATE_LIMIT_LOW_LT" }, { 11430, 666790, "MDC_ECG_CTL_VBL_ATTR_RATE_LIMIT_LOW_LE" }, { 11431, 666791, "MDC_ECG_CTL_VBL_ATTR_RATE_LIMIT_LOW_GT" }, { 11432, 666792, "MDC_ECG_CTL_VBL_ATTR_RATE_LIMIT_LOW_GE" }, { 11433, 666793, "MDC_ECG_CTL_VBL_ATTR_RATE_LIMIT_HIGH_LT" }, { 11434, 666794, "MDC_ECG_CTL_VBL_ATTR_RATE_LIMIT_HIGH_LE" }, { 16188, 147260, "MDC_ECG_QRS_TYPE" }, { 11328, 666688, "MDC_ECG_QRS_MORPH_NUM" }, { 11329, 666689, "MDC_ECG_VPC_FOCUS_NUM" }, { 11330, 666690, "MDC_ECG_NOISE_TYPE" }, { 11331, 666691, "MDC_ECG_BEAT_TOC" }, { 11332, 666692, "MDC_ECG_RHYTHM_TYPE" }, { 11333, 666693, "MDC_ECG_RHYTHM_AV_COND" }, { 11334, 666694, "MDC_ECG_RHYTHM_SA_COND" }, { 11335, 666695, "MDC_ECG_WAVC_TYPE" }, { 11336, 666696, "MDC_ECG_WAVP_TYPE" }, { 11337, 666697, "MDC_ECG_WAVC_ONSET" }, { 11338, 666698, "MDC_ECG_WAVC_OFFSET" }, { 11339, 666699, "MDC_ECG_WAVC_PEAK" }, { 11340, 666700, "MDC_ECG_WAVC_OTHER" }, { 11341, 666701, "MDC_ECG_INTERPRETATION" }, { 11342, 666702, "MDC_ECG_INTERPRETATION_STATEMENT" }, { 11343, 666703, "MDC_ECG_INTERPRETATION_COMMENT" }, { 11344, 666704, "MDC_ECG_INTERPRETATION_SUMMARY" }, stimfit-0.15.8/src/libbiosiglite/biosig4c++/mdc_ecg_codes.h0000664000175000017500000000341413062445067020370 00000000000000/* % Copyright (C) 2014 Alois Schloegl % This file is part of the "BioSig for C/C++" repository % (biosig4c++) at http://biosig.sf.net/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /**************************************************************************** ** ** ** Conversion functions for encoded physical units according to ** ** ISO/IEEE 11073-10102 Annex B ** ** ** ****************************************************************************/ #ifndef __MDC_ECG_CODES_H__ #define __MDC_ECG_CODES_H__ #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef unsigned __int16 uint16_t; #else #include #endif #ifdef __cplusplus extern "C" { #endif uint16_t encode_mdc_ecg_code10 (const char *IDstr); uint32_t encode_mdc_ecg_cfcode10 (const char *IDstr); const char* decode_mdc_ecg_code10 (uint16_t code10); const char* decode_mdc_ecg_cfcode10 (uint32_t cf_code10); #ifdef __cplusplus } #endif #endif /* __PHYSICALUNITS_H__ */ stimfit-0.15.8/src/libbiosiglite/biosig4c++/config.h0000664000175000017500000000000013240263033017050 00000000000000stimfit-0.15.8/src/libbiosiglite/biosig4c++/biosig2.h0000664000175000017500000000160413152223421017153 00000000000000/* Copyright (C) 2017 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // #error Instead of biosig2.h use #include #include "biosig.h" stimfit-0.15.8/src/libbiosiglite/biosig4c++/biosig-network.h0000664000175000017500000002273413240263033020570 00000000000000/* Copyright (C) 2005,2006,2007,2008,2009,2016 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define IPv4 #ifndef __BIOSIG_NETWORK_H__ #define __BIOSIG_NETWORK_H__ #include "biosig-dev.h" #define SERVER_PORT 54321 #if defined(__MINGW32__) #include #include #ifndef socklen_t #define socklen_t int #endif #define EALREADY WSAEALREADY #define ECONNABORTED WSAECONNABORTED #define ECONNREFUSED WSAECONNREFUSED #define ECONNRESET WSAECONNRESET #define EHOSTDOWN WSAEHOSTDOWN #define EHOSTUNREACH WSAEHOSTUNREACH #define EINPROGRESS WSAEINPROGRESS #define EISCONN WSAEISCONN #define ENETDOWN WSAENETDOWN #define ENETRESET WSAENETRESET #define ENETUNREACH WSAENETUNREACH #define EWOULDBLOCK WSAEWOULDBLOCK #define EADDRINUSE WSAEADDRINUSE #define ENOTSUP ENOSYS #define ETIMEDOUT WSAETIMEDOUT #define ENOTSOCK WSAENOTSOCK #define ENOBUFS WSAENOBUFS #define EMSGSIZE WSAEMSGSIZE #define EADDRNOTAVAIL WSAEADDRNOTAVAIL #define EPROTONOSUPPORT WSAEPROTONOSUPPORT #if 0 //!__linux__ // needed by MinGW on Windows #define creat(a, c) OpenFile(a, O_WRONLY|O_CREAT|O_TRUNC, c) #define write(a,b,c) WriteFile(a,b,c,0,0) #define close(a) CloseFile(a) #endif #else #include #include #include #include #include #include #endif /* External API definitions */ /****************************************************************************/ /** **/ /** DEFINITIONS, TYPEDEFS AND MACROS **/ /** **/ /****************************************************************************/ /* client server commands*/ #define BSCS_ID_BITLEN 64 #define BSCS_MAX_BUFSIZ_LOG2 14 #define BSCS_MAX_BUFSIZ (1< (b)) ? (a) : (b)) typedef struct { uint32_t STATE; uint32_t LEN; uint8_t LOAD[max(8,BSCS_ID_BITLEN>>3)] __attribute__ ((aligned (8))); // must fit at least ID length } mesg_t __attribute__ ((aligned (8))); extern uint32_t SERVER_STATE; /****************************************************************************/ /** **/ /** EXPORTED FUNCTIONS **/ /** **/ /****************************************************************************/ #ifdef __cplusplus extern "C" { #endif int c64ta(uint64_t ID, char* txt); // convert 64bit to ascii int cat64(char* txt, uint64_t *ID); // convert ascii to 64bit void *get_in_addr(struct sockaddr *sa); /* biosig client-server functions */ int bscs_connect(const char* hostname); /* opens a connection to the server on success, the socket file descriptor (a positive integer) is returned in case of failure, a negative integer is returned -------------------------------------------------------------- */ int bscs_disconnect(int sd); /* disconnects the socket file descriptor -------------------------------------------------------------- */ int send_packet(int sd, uint32_t state, uint32_t len, void* load); /* send a single packet including header and load -------------------------------------------------------------- */ int bscs_open(int sd, uint64_t *ID); // read-open /* ID = 0 : write access, new identifier is returned in ID ID > 0 : read access to the file with known ID -------------------------------------------------------------- */ int bscs_close(int sd); /* close current connection -------------------------------------------------------------- */ int bscs_send_hdr(int sd, HDRTYPE *hdr); /* hdr->AS.Header must contain GDF header information hdr->HeadLen must contain header length -------------------------------------------------------------- */ int bscs_send_dat(int sd, void* buf, size_t len ); /* buf must contain the data block as in hdr->AS.rawdata -------------------------------------------------------------- */ int bscs_send_evt(int sd, HDRTYPE *hdr); /* hdr->EVENT defines the event table -------------------------------------------------------------- */ int bscs_send_msg(int sd, char* msg); /* msg is string -------------------------------------------------------------- */ int bscs_error(int sd, int ERRNUM, char* ERRMSG); /* ERRNUM contains the error number ERRMSG is string -------------------------------------------------------------- */ int bscs_requ_hdr(int sd, HDRTYPE *hdr); /* request header information -------------------------------------------------------------- */ ssize_t bscs_requ_dat(int sd, size_t start, size_t nblocks, HDRTYPE *hdr); /* request data blocks bufsiz is maximum number of bytes, typically it must be nblocks*hdr->AS.bpb -------------------------------------------------------------- */ int bscs_requ_evt(int sd, HDRTYPE *hdr); /* request event information -------------------------------------------------------------- */ int bscs_put_file(int sd, char *filename); /* put raw data file on server -------------------------------------------------------------- */ int bscs_get_file(int sd, uint64_t ID, char *filename); /* put raw data file on server -------------------------------------------------------------- */ int bscs_nop(int sd); /* no operation -------------------------------------------------------------- */ #ifdef __cplusplus } #endif /****************************************************************************/ /** **/ /** EOF **/ /** **/ /****************************************************************************/ #endif /* __BIOSIG_NETWORK_H__ */ stimfit-0.15.8/src/libbiosiglite/biosig4c++/eventcodegroups.i0000664000175000017500000000262613062445067021053 00000000000000#if 0 ### This file is autogenerated - Do not modify it !!! ### ### Table of event codes. # This table is also part of the specification of # GDF v2.x http://arxiv.org/abs/cs.DB/0608052 and # GDF v1.x http://pub.ist.ac.at/~schloegl/matlab/eeg/gdf4/TR_GDF.pdf # and part of the BioSig project http://biosig.sf.net/ # Copyright (C) 2004-2015 Alois Schloegl # # BioSig is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # Version 3 of the License, or (at your option) any later version. #endif { 0x0100, "EEG artifacts" }, { 0x0110, "EEG patterns" }, { 0x0120, "Stimulus for Evoked potentials" }, { 0x0130, "Stimulus for Steady State Evoked potentials" }, { 0x0140, "Response code" }, { 0x0200, "Neural spikes, and spike trains" }, { 0x0300, "BCI: Trigger, cues, classlabels" }, { 0x0400, "Respiratory Events" }, { 0x0410, "Sleep stages according to Rechtschaffen&Kales and AASM'07" }, { 0x0420, "Sleep" }, { 0x0430, "Eye movements" }, { 0x0440, "muscle activity (for checking on EEG artifacts)" }, { 0x0500, "ECG events" }, { 0x0580, "ergometric events " }, { 0x1000, "neural spikes " }, { 0x2000, "reserved for ECG events (see HL7 10102 Annotated ECG)" }, { 0x0000, "user specific events" }, { 0x4000, "up to 4096 different stimuli" }, { 0x7f00, "special codes" }, stimfit-0.15.8/src/libbiosiglite/biosig4c++/mdc_ecg_codes.c0000664000175000017500000000454313062445067020367 00000000000000/* Copyright (C) 2014 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include "mdc_ecg_codes.h" /* physical units are defined in IEEE/ISO 11073-10102-Annex B */ const struct mdc_code_table { const uint16_t code10; const uint32_t cf_code10; const char* refid; } MDC_CODE_TABLE[] = { #include "11073-10102-AnnexB.i" {0xffff, 0xffffffff, "MDC_ECG_ERROR_CODE" } } ; /* Conversion between MDC Refid and CODE10 encoding Currently, a simple lookup table is used, Eventually, this can be made more efficient */ uint16_t encode_mdc_ecg_code10(const char *IDstr) { if ( !memcmp(IDstr,"MDC_ECG_", 8) ) return 0xffff; uint32_t k; for (k=0; MDC_CODE_TABLE[k].cf_code10 < 0xffffffff; k++) { if (! strcmp(IDstr+8, MDC_CODE_TABLE[k].refid+8) ) return MDC_CODE_TABLE[k].code10; } return 0xffff; } uint32_t encode_mdc_ecg_cfcode10(const char *IDstr) { if ( !memcmp(IDstr,"MDC_ECG_", 8) ) return 0xffffffff; size_t k; for (k=0; MDC_CODE_TABLE[k].cf_code10 < 0xffffffff; k++) { if ( !strcmp(IDstr+8, MDC_CODE_TABLE[k].refid+8) ) return MDC_CODE_TABLE[k].cf_code10; } return 0xffffffff; } const char* decode_mdc_ecg_code10(uint16_t code10) { uint32_t k; for (k=0; MDC_CODE_TABLE[k].cf_code10 < 0xffffffff; k++) { if ( code10 == MDC_CODE_TABLE[k].code10 ) return MDC_CODE_TABLE[k].refid; } return NULL; } const char* decode_mdc_ecg_cfcode10(uint32_t cf_code10) { uint32_t k; for (k=0; MDC_CODE_TABLE[k].cf_code10 < 0xffffffff; k++) { if ( cf_code10 == MDC_CODE_TABLE[k].cf_code10 ) return MDC_CODE_TABLE[k].refid; } return NULL; } stimfit-0.15.8/src/libbiosiglite/biosig4c++/biosig-HL7aECG-stub.c0000664000175000017500000000027213152224130021105 00000000000000#include "./biosig-dev.h" int sopen_HL7aECG_read (HDRTYPE* hdr) { return 0; } void sopen_HL7aECG_write(HDRTYPE* hdr) { } int sclose_HL7aECG_write(HDRTYPE* hdr) { return 0; } stimfit-0.15.8/src/libbiosiglite/biosig4c++/biosig.h0000664000175000017500000010736713240263033017107 00000000000000/* Copyright (C) 2012-2018 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef __LIBBIOSIG2_H__ #define __LIBBIOSIG2_H__ #include "biosig-dev.h" #define BIOSIG_FLAG_COMPRESSION 0x0001 #define BIOSIG_FLAG_UCAL 0x0002 #define BIOSIG_FLAG_OVERFLOWDETECTION 0x0004 #define BIOSIG_FLAG_ROW_BASED_CHANNELS 0x0008 #ifdef __cplusplus extern "C" { #endif /****************************************************************************/ /** **/ /** EXPORTED FUNCTIONS : Level 1 **/ /** **/ /****************************************************************************/ uint32_t get_biosig_version (); /* returns the version number in hex-decimal representation get_biosig_version() & 0x00ff0000 : major version number get_biosig_version() & 0x0000ff00 : minor version number get_biosig_version() & 0x000000ff : patch level --------------------------------------------------------------- */ HDRTYPE* constructHDR(const unsigned NS, const unsigned N_EVENT); /* allocates memory initializes header HDR of type HDRTYPE with NS channels an N_EVENT event elements --------------------------------------------------------------- */ void destructHDR(HDRTYPE* hdr); /* destroys the header *hdr and frees allocated memory --------------------------------------------------------------- */ HDRTYPE* sopen(const char* FileName, const char* MODE, HDRTYPE* hdr); /* FileName: name of file Mode: "r" is reading mode, requires FileName Mode: "w" is writing mode, hdr contains the header information If the number of records is not known, set hdr->NRec=-1 and sclose will fill in the correct number. Mode: "a" is append mode, if file exists, header and eventtable is read, position pointer is set to end of data in order to add more data. If file is successfully opened, the header structure of the existing file is used, and any different specification in hdr is discarded. If file is not compressed, it can be used for read and write, for compressed files, only appending at the end of file is possible. Currently, append mode is supported only for the GDF format. hdr should be generated with constructHDR, and the necessary fields must be defined. In read-mode, hdr can be NULL; however, hdr->FLAG... can be used to turn off spurious warnings. In write-mode, the whole header information must be defined. In append mode, it is recommended to provide whole header information, which must be equivalent to the header info of an existing file. After calling sopen, the file header is read or written, and the position pointer points to the beginning of the data section in append mode, the position pointer points to the end of the data section. --------------------------------------------------------------- */ int sclose(HDRTYPE* hdr); /* closes the file corresponding to hdr file handles are closed, the position pointer becomes meaningless Note: hdr is not destroyed; use destructHDR() to free the memory of hdr if hdr was opened in writing mode, the event table is added to the file and if hdr->NRec=-1, the number of records is obtained from the position pointer and written into the header, --------------------------------------------------------------- */ size_t sread(biosig_data_type* DATA, size_t START, size_t LEN, HDRTYPE* hdr); /* LEN data segments are read from file associated with hdr, starting from segment START. The data is copied into DATA; if DATA == NULL, a sufficient amount of memory is allocated, and the pointer to the data is available in hdr->data.block. In total, LEN*hdr->SPR*NS samples are read and stored in data type of biosig_data_type (currently double). NS is the number of channels with non-zero hdr->CHANNEL[].OnOff. The number of successfully read data blocks is returned. A pointer to the data block is also available from hdr->data.block, the number of columns and rows is available from hdr->data.size[0] and hdr->data.size[1] respectively. Channels k with (hdr->CHANNEL[k].SPR==0) are interpreted as sparsely sampled channels [for details see specification ofGDF v2 or larger]. The sample values are also returned in DATA the corresponding sampling time, the values in between the sparse sampling times are set to DigMin. (Applying the flags UCAL and OVERFLOWDETECTION will convert this into PhysMin and NaN, resp. see below). The following flags will influence the result. hdr->FLAG.UCAL = 0 scales the data to its physical values hdr->FLAG.UCAL = 1 does not apply the scaling factors hdr->FLAG.OVERFLOWDETECTION = 0 does not apply overflow detection hdr->FLAG.OVERFLOWDETECTION = 1: replaces all values that exceed the dynamic range (defined by Phys/Dig/Min/Max) hdr->FLAG.ROW_BASED_CHANNELS = 0 each channel is in one column hdr->FLAG.ROW_BASED_CHANNELS = 1 each channel is in one row --------------------------------------------------------------- */ #ifdef __GSL_MATRIX_DOUBLE_H__ size_t gsl_sread(gsl_matrix* DATA, size_t START, size_t LEN, HDRTYPE* hdr); /* same as sread but return data is of type gsl_matrix --------------------------------------------------------------- */ #endif size_t swrite(const biosig_data_type *DATA, size_t NELEM, HDRTYPE* hdr); /* DATA contains the next NELEM data segment(s) for writing. * hdr contains the definition of the header information and was generated by sopen * the number of successfully written segments is returned; --------------------------------------------------------------- */ int seof(HDRTYPE* hdr); /* returns 1 if end of file is reached. --------------------------------------------------------------- */ void srewind(HDRTYPE* hdr); /* postions file pointer to the beginning * * Currently, this function is meaning less because sread requires always the start value --------------------------------------------------------------- */ int sseek(HDRTYPE* hdr, long int offset, int whence); /* positions file pointer * * Currently, this function is meaning less because sread requires always the start value --------------------------------------------------------------- */ long int stell(HDRTYPE* hdr); /* returns position of file point in segments --------------------------------------------------------------- */ #ifndef ONLYGDF ATT_DEPREC int serror(); /* handles errors; it reports whether an error has occured. * if yes, an error message is displayed, and the error status is reset. * the return value is 0 if no error has occured, otherwise the error code * is returned. * IMPORTANT NOTE: * serror() uses the global error variables B4C_ERRNUM and B4C_ERRMSG, * which is not re-entrant, because two opened files share the same * error variables. --------------------------------------------------------------- */ #endif //ONLYGDF int serror2(HDRTYPE* hdr); /* handles errors; it reports whether an error has occured. * if yes, an error message is displayed, and the error status is reset. * the return value is 0 if no error has occured, otherwise the error code * is returned. --------------------------------------------------------------- */ int biosig_check_error(HDRTYPE *hdr); /* returns error status but does not handle/reset it. * it can be used for checking whether some error status has been set --------------------------------------------------------------- */ char* biosig_get_errormsg(HDRTYPE *hdr); /* returns error message but does not reset it. * memory for the error message is allocated and need to be freed * by the calling application --------------------------------------------------------------- */ int sflush_gdf_event_table(HDRTYPE* hdr); /* writes the event table of file hdr. hdr must define a file in GDF format * and can be opened as read or write. * In case of success, the return value is 0. --------------------------------------------------------------- */ int cachingWholeFile(HDRTYPE* hdr); /* caching: load data of whole file into buffer * this will speed up data access, especially in interactive mode --------------------------------------------------------------- */ int RerefCHANNEL(HDRTYPE *hdr, void *ReRef, char rrtype); /* rerefCHAN defines rereferencing of channels, hdr->Calib defines the rereferencing matrix hdr->rerefCHANNEL is defined. hdr->rerefCHANNEL[.].Label is by some heuristics from hdr->CHANNEL either the maximum scaling factor if ReRef is NULL, rereferencing is turned off (hdr->Calib and hdr->rerefCHANNEL are reset to NULL). if rrtype==1, Reref is a filename pointing to a MatrixMarket file if rrtype==2, Reref must be a pointer to a cholmod sparse matrix (cholmod_sparse*) In case of an error (mismatch of dimensions), a non-zero is returned, and serror() is set. rr is a pointer to a rereferencing matrix rrtype determines the type of pointer rrtype=0: no rereferencing, RR is ignored (NULL) 1: pointer to MarketMatrix file (char*) 2: pointer to a sparse cholmod matrix (cholmod_sparse*) ------------------------------------------------------------------------*/ /* ============================================================= utility functions for handling of event table ============================================================= */ void sort_eventtable(HDRTYPE *hdr); /* sort event table with respect to hdr->EVENT.POS --------------------------------------------------------------*/ size_t reallocEventTable(HDRTYPE *hdr, size_t EventN); /*------------------------------------------------------------------------ re-allocates memory for Eventtable. hdr->EVENT.N contains actual number of events EventN determines the size of the allocated memory return value: in case of success, EVENT_N is returned in case of failure SIZE_MAX is returned; ------------------------------------------------------------------------*/ void convert2to4_eventtable(HDRTYPE *hdr); /* converts event table from {TYP,POS} to [TYP,POS,CHN,DUR} format -------------------------------------------------------------- */ void convert4to2_eventtable(HDRTYPE *hdr); /* converts event table from [TYP,POS,CHN,DUR} to {TYP,POS} format all CHN[k] must be 0 -------------------------------------------------------------- */ const char* GetEventDescription(HDRTYPE *hdr, size_t n); /* returns clear text description of n-th event, considers also user-defined events. -------------------------------------------------------------- */ void FreeTextEvent(HDRTYPE* hdr, size_t N, const char* annotation); /* adds free text annotation to event table for the N-th event. the EVENT.TYP[N] is identified from the table EVENT.CodeDesc if annotations is not listed in CodeDesc, it is added to CodeDesc The table is limited to 256 entries, because the table EventCodes allows only codes 0-255 as user specific entry. If the description table contains more than 255 entries, an error is set. ------------------------------------------------------------------------*/ /* ============================================================= utility functions for handling of physical dimensons ============================================================= */ #ifndef __PHYSICALUNITS_H__ uint16_t PhysDimCode(const char* PhysDim); /* Encodes Physical Dimension as 16bit integer according to ISO/IEEE 11073-10101:2004 Vital Signs Units of Measurement --------------------------------------------------------------- */ char* PhysDim(uint16_t PhysDimCode, char *PhysDimText); /* DEPRECATED: USE INSTEAD PhysDim3(uint16_t PhysDimCode) It's included just for backwards compatibility converts HDR.CHANNEL[k].PhysDimCode into a readable Physical Dimension the memory for PhysDim must be preallocated, its maximum length is defined by (MAX_LENGTH_PHYSDIM+1) --------------------------------------------------------------- */ const char* PhysDim3(uint16_t PhysDimCode); /* converts PhysDimCode into a readable Physical Dimension --------------------------------------------------------------- */ double PhysDimScale(uint16_t PhysDimCode); /* returns scaling factor of physical dimension e.g. 0.001 for milli, 1000 for kilo etc. --------------------------------------------------------------- */ #endif int biosig_set_hdr_ipaddr(HDRTYPE *hdr, const char *hostname); /* set the field HDR.IPaddr based on the IP address of hostname Return value: 0: hdr->IPaddr is set otherwise hdr->IPaddr is not set ---------------------------------------------------------------*/ /* ============================================================= printing of header information ============================================================= */ int hdr2ascii(HDRTYPE* hdr, FILE *fid, int VERBOSITY); /* writes the header information is ascii format the stream defined by fid * Typically fid is stdout. VERBOSITY defines how detailed the information is. * VERBOSITY=0 or 1 report just some basic information, * VERBOSITY=2 reports als the channel information * VERBOSITY=3 provides in addition the event table. * VERBOSITY=8 for debugging * VERBOSITY=9 for debugging * VERBOSITY=-1 header and event table is shown in JSON format --------------------------------------------------------------- */ ATT_DEPREC int hdr2json (HDRTYPE *hdr, FILE *fid); int fprintf_hdr2json(FILE *stream, HDRTYPE* hdr); /* prints header in json format into stream; hdr2json is the old form and deprecated, use fprintf_hdr2json instead --------------------------------------------------------------- */ int asprintf_hdr2json(char **str, HDRTYPE* hdr); /* prints header in json format into *str; memory for str is automatically allocated and must be freed after usage. --------------------------------------------------------------- */ HDRTYPE* constructHDR(const unsigned NS, const unsigned N_EVENT); /* allocates memory initializes header HDR of type HDRTYPE with NS channels an N_EVENT event elements --------------------------------------------------------------- */ void destructHDR(HDRTYPE* hdr); /* destroys the header *hdr and frees allocated memory --------------------------------------------------------------- */ /****************************************************************************/ /** **/ /** EXPORTED FUNCTIONS : Level 2 **/ /** **/ /****************************************************************************/ /* ============================================================= setter and getter functions for accessing fields of HDRTYPE these functions are currently experimential and are likely to change ============================================================= */ /* get, set and check function of filetype */ enum FileFormat biosig_get_filetype(HDRTYPE *hdr); int biosig_set_filetype(HDRTYPE *hdr, enum FileFormat format); #define biosig_check_filetype(a,b) (biosig_get_filetype(a)==b) ATT_DEPREC int biosig_set_flags(HDRTYPE *hdr, char compression, char ucal, char overflowdetection); int biosig_get_flag(HDRTYPE *hdr, unsigned flags); int biosig_set_flag(HDRTYPE *hdr, unsigned flags); int biosig_reset_flag(HDRTYPE *hdr, unsigned flags); int biosig_set_targetsegment(HDRTYPE *hdr, unsigned targetsegment); int biosig_get_targetsegment(HDRTYPE *hdr); const char* biosig_get_filename(HDRTYPE *hdr); float biosig_get_version(HDRTYPE *hdr); int biosig_set_segment_selection(HDRTYPE *hdr, int k, uint32_t argSweepSel); uint32_t* biosig_get_segment_selection(HDRTYPE *hdr); // returns error message in memory allocated with strdup int biosig_check_error(HDRTYPE *hdr); char *biosig_get_errormsg(HDRTYPE *hdr); long biosig_get_number_of_channels(HDRTYPE *hdr); size_t biosig_get_number_of_samples(HDRTYPE *hdr); ATT_DEPREC size_t biosig_get_number_of_samples_per_record(HDRTYPE *hdr); size_t biosig_get_number_of_records(HDRTYPE *hdr); size_t biosig_get_number_of_segments(HDRTYPE *hdr); int biosig_set_number_of_channels(HDRTYPE *hdr, int ns); int biosig_set_number_of_samples(HDRTYPE *hdr, ssize_t nrec, ssize_t spr); #define biosig_set_number_of_samples_per_record(h,n) biosig_set_number_of_samples(h,-1,n) #define biosig_set_number_of_records(h,n) biosig_set_number_of_samples(h,n,-1) // ATT_DEPREC int biosig_set_number_of_segments(HDRTYPE *hdr, ); int biosig_get_datablock(HDRTYPE *hdr, biosig_data_type **data, size_t *rows, size_t *columns); biosig_data_type* biosig_get_data(HDRTYPE *hdr, char flag); double biosig_get_samplerate(HDRTYPE *hdr); int biosig_set_samplerate(HDRTYPE *hdr, double fs); size_t biosig_get_number_of_events(HDRTYPE *hdr); size_t biosig_set_number_of_events(HDRTYPE *hdr, size_t N); // get n-th event, variables pointing to NULL are ignored int biosig_get_nth_event(HDRTYPE *hdr, size_t n, uint16_t *typ, uint32_t *pos, uint16_t *chn, uint32_t *dur, gdf_time *timestamp, const char **desc); /* set n-th event, variables pointing to NULL are ignored typ or Desc can be used to determine the type of the event. if both, typ and Desc, are not NULL, the result is undefined */ int biosig_set_nth_event(HDRTYPE *hdr, size_t n, uint16_t* typ, uint32_t *pos, uint16_t *chn, uint32_t *dur, gdf_time *timestamp, char *Desc); double biosig_get_eventtable_samplerate(HDRTYPE *hdr); int biosig_set_eventtable_samplerate(HDRTYPE *hdr, double fs); int biosig_change_eventtable_samplerate(HDRTYPE *hdr, double fs); int biosig_get_startdatetime(HDRTYPE *hdr, struct tm *T); int biosig_set_startdatetime(HDRTYPE *hdr, struct tm T); gdf_time biosig_get_startdatetime_gdf(HDRTYPE *hdr); int biosig_set_startdatetime_gdf(HDRTYPE *hdr, gdf_time T); int biosig_get_birthdate(HDRTYPE *hdr, struct tm *T); int biosig_set_birthdate(HDRTYPE *hdr, struct tm T); const char* biosig_get_patient_name(HDRTYPE *hdr); const char* biosig_get_patient_id(HDRTYPE *hdr); const char* biosig_get_recording_id(HDRTYPE *hdr); const char* biosig_get_technician(HDRTYPE *hdr); const char* biosig_get_manufacturer_name(HDRTYPE *hdr); const char* biosig_get_manufacturer_model(HDRTYPE *hdr); const char* biosig_get_manufacturer_version(HDRTYPE *hdr); const char* biosig_get_manufacturer_serial_number(HDRTYPE *hdr); const char* biosig_get_application_specific_information(HDRTYPE *hdr); int biosig_set_patient_name(HDRTYPE *hdr, const char* rid); int biosig_set_patient_name_structured(HDRTYPE *hdr, const char* LastName, const char* FirstName, const char* SecondLastName); int biosig_set_patient_id(HDRTYPE *hdr, const char* rid); int biosig_set_recording_id(HDRTYPE *hdr, const char* rid); int biosig_set_technician(HDRTYPE *hdr, const char* rid); int biosig_set_manufacturer_name(HDRTYPE *hdr, const char* rid); int biosig_set_manufacturer_model(HDRTYPE *hdr, const char* rid); int biosig_set_manufacturer_version(HDRTYPE *hdr, const char* rid); int biosig_set_manufacturer_serial_number(HDRTYPE *hdr, const char* rid); int biosig_set_application_specific_information(HDRTYPE *hdr, const char* appinfo); double biosig_get_channel_samplerate(HDRTYPE *hdr, int chan); int biosig_set_channel_samplerate_and_samples_per_record(HDRTYPE *hdr, int chan, ssize_t spr, double fs); /* ============================================================= setter and getter functions for accessing fields of CHANNEL_TYPE these functions are currently experimential and are likely to change ============================================================= */ // returns M-th channel, M is zero-based CHANNEL_TYPE* biosig_get_channel(HDRTYPE *hdr, int M); const char* biosig_channel_get_label(CHANNEL_TYPE *chan); int biosig_channel_set_label(CHANNEL_TYPE *chan, const char* label); uint16_t biosig_channel_get_physdimcode(CHANNEL_TYPE *chan); const char* biosig_channel_get_physdim(CHANNEL_TYPE *chan); #define biosig_channel_get_unit(h) biosig_channel_get_physdim(h) int biosig_channel_set_physdimcode(CHANNEL_TYPE *chan, uint16_t physdimcode); #define biosig_channel_set_physdim(a,b) biosig_channel_set_physdimcode(a, PhysDimCode(b)) #define biosig_channel_set_unit(a,b) biosig_channel_set_physdimcode(a, PhysDimCode(b)) // this will affect result of next SREAD when flag.ucal==0 int biosig_channel_change_scale_to_physdimcode(CHANNEL_TYPE *chan, uint16_t physdimcode); #define biosig_channel_change_scale_to_unitcode(a,b) biosig_channel_set_scale_to_physdimcode(a, b) #define biosig_channel_change_scale_to_physdim(a,b) biosig_channel_set_scale_to_physdimcode(a, PhysDimCode(b)) #define biosig_channel_change_scale_to_unit(a,b) biosig_channel_set_scale_to_physdimcode(a, PhysDimCode(b)) int biosig_channel_get_scaling(CHANNEL_TYPE *chan, double *PhysMax, double *PhysMin, double *DigMax, double *DigMin); int biosig_channel_set_scaling(CHANNEL_TYPE *chan, double PhysMax, double PhysMin, double DigMax, double DigMin); double biosig_channel_get_cal(CHANNEL_TYPE *chan); double biosig_channel_get_off(CHANNEL_TYPE *chan); ATT_DEPREC int biosig_channel_set_cal(CHANNEL_TYPE *chan, double cal); ATT_DEPREC int biosig_channel_set_off(CHANNEL_TYPE *chan, double off); int biosig_channel_get_filter(CHANNEL_TYPE *chan, double *LowPass, double *HighPass, double *Notch); int biosig_channel_set_filter(CHANNEL_TYPE *chan, double LowPass, double HighPass, double Notch); double biosig_channel_get_timing_offset(CHANNEL_TYPE *hc); int biosig_channel_set_timing_offset(CHANNEL_TYPE *hc, double off); double biosig_channel_get_impedance(CHANNEL_TYPE *hc); int biosig_channel_set_impedance(CHANNEL_TYPE *hc, double val); /* double biosig_channel_get_samplerate(CHANNEL_TYPE *hc); int biosig_channel_set_samplerate_and_samples_per_record(CHANNEL_TYPE *hc, size_t spr, double val); */ size_t biosig_channel_get_samples_per_record(CHANNEL_TYPE *hc); int biosig_channel_set_samples_per_record(CHANNEL_TYPE *hc, size_t spr); uint16_t biosig_channel_get_datatype(CHANNEL_TYPE *hc); int biosig_channel_set_datatype(CHANNEL_TYPE *hc, uint16_t gdftyp); #define biosig_channel_set_datatype_to_int8(h) biosig_channel_set_datatype(h,1) #define biosig_channel_set_datatype_to_uint8(h) biosig_channel_set_datatype(h,2) #define biosig_channel_set_datatype_to_int16(h) biosig_channel_set_datatype(h,3) #define biosig_channel_set_datatype_to_uint16(h) biosig_channel_set_datatype(h,4) #define biosig_channel_set_datatype_to_int32(h) biosig_channel_set_datatype(h,5) #define biosig_channel_set_datatype_to_uint32(h) biosig_channel_set_datatype(h,6) #define biosig_channel_set_datatype_to_int64(h) biosig_channel_set_datatype(h,7) #define biosig_channel_set_datatype_to_uint64(h) biosig_channel_set_datatype(h,8) #define biosig_channel_set_datatype_to_float(h) biosig_channel_set_datatype(h,16) #define biosig_channel_set_datatype_to_single(h) biosig_channel_set_datatype(h,16) #define biosig_channel_set_datatype_to_double(h) biosig_channel_set_datatype(h,17) const char *biosig_channel_get_transducer(CHANNEL_TYPE *hc); int biosig_channel_set_transducer(CHANNEL_TYPE *hc, const char *transducer); /* DO NOT USE DO NOT USE DO NOT USE DO NOT USE the functions below are experimental and have not been used so far in any productions system They will be removed or significantly changed . DO NOT USE DO NOT USE DO NOT USE DO NOT USE */ struct ATT_DEPREC biosig_annotation_struct { /* this structure is used for annotations */ size_t onset; /* onset time of the event, expressed in units of 100 nanoSeconds and relative to the starttime in the header */ size_t duration; /* duration time, this is a null-terminated ASCII text-string */ const char *annotation; /* description of the event in UTF-8, this is a null terminated string */ }; typedef HDRTYPE *biosig_handle_t ; ATT_DEPREC int biosig_lib_version(void); ATT_DEPREC int biosig_open_file_readonly(const char *path, int read_annotations); ATT_DEPREC int biosig_close_file(int handle); ATT_DEPREC int biosig_read_samples(int handle, size_t channel, size_t n, double *buf, unsigned char UCAL); ATT_DEPREC int biosig_read_physical_samples(int handle, size_t channel, size_t n, double *buf); ATT_DEPREC int biosig_read_digital_samples(int handle, size_t channel, size_t n, double *buf); //#define biosig_read_physical_samples(a,b,c,d) biosig_read_samples(a,b,c,d,0) //#define biosig_read_digital_samples(a,b,c,d) biosig_read_samples(a,b,c,d,1) ATT_DEPREC size_t biosig_seek(int handle, long long offset, int whence); ATT_DEPREC size_t biosig_tell(int handle); ATT_DEPREC void biosig_rewind(int handle, int biosig_signal); ATT_DEPREC int biosig_get_annotation(int handle, size_t n, struct biosig_annotation_struct *annot); ATT_DEPREC int biosig_open_file_writeonly(const char *path, enum FileFormat filetype, int number_of_signals); ATT_DEPREC double biosig_get_global_samplefrequency(int handle); ATT_DEPREC int biosig_set_global_samplefrequency(int handle, double samplefrequency); ATT_DEPREC double biosig_get_samplefrequency(int handle, int biosig_signal); ATT_DEPREC int biosig_set_samplefrequency(int handle, int biosig_signal, double samplefrequency); ATT_DEPREC double biosig_get_physical_maximum(int handle, int biosig_signal); ATT_DEPREC int biosig_set_physical_maximum(int handle, int biosig_signal, double phys_max); ATT_DEPREC double biosig_get_physical_minimum(int handle, int biosig_signal); ATT_DEPREC int biosig_set_physical_minimum(int handle, int biosig_signal, double phys_min); ATT_DEPREC double biosig_get_digital_maximum(int handle, int biosig_signal); ATT_DEPREC int biosig_set_digital_maximum(int handle, int biosig_signal, double dig_max); ATT_DEPREC double biosig_get_digital_minimum(int handle, int biosig_signal); ATT_DEPREC int biosig_set_digital_minimum(int handle, int biosig_signal, double dig_min); ATT_DEPREC const char *biosig_get_label(int handle, int biosig_signal); ATT_DEPREC int biosig_set_label(int handle, int biosig_signal, const char *label); //const char *biosig_get_prefilter(int handle, int biosig_signal); ATT_DEPREC int biosig_set_prefilter(int handle, int biosig_signal, const char *prefilter); ATT_DEPREC double biosig_get_highpassfilter(int handle, int biosig_signal); ATT_DEPREC int biosig_set_highpassfilter(int handle, int biosig_signal, double frequency); ATT_DEPREC double biosig_get_lowpassfilter(int handle, int biosig_signal); ATT_DEPREC int biosig_set_lowpassfilter(int handle, int biosig_signal, double frequency); ATT_DEPREC double biosig_get_notchfilter(int handle, int biosig_signal); ATT_DEPREC int biosig_set_notchfilter(int handle, int biosig_signal, double frequency); ATT_DEPREC const char *biosig_get_transducer(int handle, int biosig_signal); ATT_DEPREC int biosig_set_transducer(int handle, int biosig_signal, const char *transducer); ATT_DEPREC const char *biosig_get_physical_dimension(int handle, int biosig_signal); ATT_DEPREC int biosig_set_physical_dimension(int handle, int biosig_signal, const char *phys_dim); /* int biosig_get_startdatetime(int handle, struct tm *T); int biosig_set_startdatetime(int handle, const struct tm *T); */ ATT_DEPREC const char *biosig_get_patientname(int handle); ATT_DEPREC int biosig_set_patientname(int handle, const char *patientname); ATT_DEPREC const char *biosig_get_patientcode(int handle); ATT_DEPREC int biosig_set_patientcode(int handle, const char *patientcode); ATT_DEPREC int biosig_get_gender(int handle); ATT_DEPREC int biosig_set_gender(int handle, int gender); /* int biosig_get_birthdate(int handle, struct tm *T); int biosig_set_birthdate(int handle, const struct tm *T); */ ATT_DEPREC int biosig_set_patient_additional(int handle, const char *patient_additional); ATT_DEPREC int biosig_set_admincode(int handle, const char *admincode); /* const char *biosig_get_technician(int handle); int biosig_set_technician(int handle, const char *technician); */ ATT_DEPREC int biosig_set_equipment(int handle, const char *equipment); ATT_DEPREC int biosig_set_recording_additional(int handle, const char *recording_additional); ATT_DEPREC int biosig_write_physical_samples(int handle, double *buf); ATT_DEPREC int biosig_blockwrite_physical_samples(int handle, double *buf); ATT_DEPREC int biosig_write_digital_samples(int handle, int *buf); ATT_DEPREC int biosig_blockwrite_digital_samples(int handle, int *buf); ATT_DEPREC int biosig_write_annotation_utf8(int handle, size_t onset, size_t duration, const char *description); ATT_DEPREC int biosig_write_annotation_latin1(int handle, size_t onset, size_t duration, const char *description); ATT_DEPREC int biosig_set_datarecord_duration(int handle, double duration); /* ============================================================= serialize/unserialize data converts between linear buffer memory and header structure ============================================================= */ ATT_DEPREC void* biosig_serialize(HDRTYPE *hdr, void **mem, size_t *len); /****************************************************************************************** biosig_serialize: converts header structure into memory buffer input: hdr: header structure, including event table. output: *mem will contain start address of buffer *len will contain length of buffer mem. ******************************************************************************************/ ATT_DEPREC HDRTYPE* biosig_unserialize(void *mem, size_t len, size_t start, size_t length, biosig_data_type **data, int flags); #define biosig_unserialize_header(a,b) biosig_unserialize(a,b,0,0,NULL,0) /****************************************************************************************** biosig_unserialize_header: converts memory buffer into header structure HDR biosig_unserialize: converts memory buffer into header structure HDR, and if data != NULL, data samples will be read into a matrix, the starting address of this data matrix will be stored in *data point to *data input: mem : buffer len : length of buffer mem start: starting position to extract data length: number of samples for extracting data, flags: BIOSIG_FLAG_UCAL | BIOSIG_FLAG_OVERFLOWDETECTION | BIOSIG_FLAG_ROW_BASED_CHANNELS output: *data will contain start address to matrix data samples, of size hdr->NS * (hdr->SPR * hdr->NRec) or its transpose form depending on flags return value: header structure HDRTYPE* hdr. ******************************************************************************************/ #if defined(MAKE_EDFLIB) // definitions according to edflib v1.09 #define edflib_version() (109) #define EDFLIB_MAX_ANNOTATION_LEN 512 #define EDFLIB_FILETYPE_EDF 0 #define EDFLIB_FILETYPE_EDFPLUS 1 #define EDFLIB_FILETYPE_BDF 2 #define EDFLIB_FILETYPE_BDFPLUS 3 #define EDFLIB_MALLOC_ERROR -1 #define EDFLIB_NO_SUCH_FILE_OR_DIRECTORY -2 #define EDFLIB_FILE_CONTAINS_FORMAT_ERRORS -3 #define EDFLIB_MAXFILES_REACHED -4 #define EDFLIB_FILE_READ_ERROR -5 #define EDFLIB_FILE_ALREADY_OPENED -6 #define EDFLIB_FILETYPE_ERROR -7 #define EDFLIB_FILE_WRITE_ERROR -8 #define EDFLIB_NUMBER_OF_SIGNALS_INVALID -9 #define EDFLIB_FILE_IS_DISCONTINUOUS -10 #define EDFLIB_INVALID_READ_ANNOTS_VALUE -11 /* values for annotations */ #define EDFLIB_DO_NOT_READ_ANNOTATIONS 0 #define EDFLIB_READ_ANNOTATIONS 1 #define EDFLIB_READ_ALL_ANNOTATIONS 2 /* the following defines are possible errors returned by edfopen_file_writeonly() */ #define EDFLIB_NO_SIGNALS -20 #define EDFLIB_TOO_MANY_SIGNALS -21 #define EDFLIB_NO_SAMPLES_IN_RECORD -22 #define EDFLIB_DIGMIN_IS_DIGMAX -23 #define EDFLIB_DIGMAX_LOWER_THAN_DIGMIN -24 #define EDFLIB_PHYSMIN_IS_PHYSMAX -25 #define EDFLIB_TIME_DIMENSION (10000000LL) #define EDFLIB_MAXSIGNALS 256 #define EDFLIB_MAX_ANNOTATION_LEN 512 #define EDFSEEK_SET 0 #define EDFSEEK_CUR 1 #define EDFSEEK_END 2 struct edf_annotation_struct { /* this structure is used for annotations */ size_t onset; /* onset time of the event, expressed in units of 100 nanoSeconds and relative to the starttime in the header */ size_t duration; /* duration time, this is a null-terminated ASCII text-string */ char annotation[EDFLIB_MAX_ANNOTATION_LEN + 1]; /* description of the event in UTF-8, this is a null terminated string */ }; int edfopen_file_writeonly(const char *path, int filetype, int number_of_signals); #define edfopen_file_readonly(a,c) biosig_open_file_readonly(a,c) #define edfclose_file(handle) biosig_close_file(handle) int edfread_physical_samples(int handle, int edfsignal, int n, double *buf); int edfread_digital_samples(int handle, int edfsignal, int n, int *buf); long long edfseek(int handle, int biosig_signal, long long offset, int whence); long long edftell(int handle, int biosig_signal); int edfrewind(int handle, int edfsignal); //#define edf_get_annotation(a,b,c) biosig_get_annotation(a,b,c) int edf_get_annotation(int handle, int n, struct edf_annotation_struct *annot); //#define edfopen_file_writeonly(a,b,c) biosig_open_file_writeonly(a,b,c) int biosig_open_file_writeonly(const char *path, enum FileFormat filetype, int number_of_signals); #define edf_set_samplefrequency(a,b,c) biosig_set_samplefrequency(a,b,c) #define edf_set_physical_maximum(a,b,c) biosig_set_physical_maximum(a,b,c) #define edf_set_physical_minimum(a,b,c) biosig_set_physical_minimum(a,b,c) #define edf_set_digital_maximum(a,b,c) biosig_set_digital_maximum(a,b,(double)(c)) #define edf_set_digital_minimum(a,b,c) biosig_set_digital_minimum(a,b,(double)(c)) #define edf_set_label(a,b,c) biosig_set_label(a,b,c) #define edf_set_prefilter(a,b,c) biosig_set_prefilter(a,b,c) #define edf_set_transducer(a,b,c) biosig_set_transducer(a,b,c) #define edf_set_physical_dimension(a,b,c) biosig_set_physical_dimension(a,b,c) int edf_set_startdatetime(int handle, int startdate_year, int startdate_month, int startdate_day, int starttime_hour, int starttime_minute, int starttime_second); #define edf_set_patientname(a,b) biosig_set_patientname(a,b) #define edf_set_patientcode(a,b) biosig_set_patientcode(a,b) //#define edf_set_gender(a,b) biosig_set_gender(a,b) int edf_set_gender(int handle, int gender); int edf_set_birthdate(int handle, int birthdate_year, int birthdate_month, int birthdate_day); #define edf_set_patient_additional(a,b) biosig_set_patient_additional(a,b) #define edf_set_admincode(a,b) biosig_set_admincode(a,b) #define edf_set_technician(a,b) biosig_set_technician(a,b) #define edf_set_equipment(a,b) biosig_set_equipment(a,b) int edf_set_recording_additional(int handle, const char *recording_additional); int edfwrite_physical_samples(int handle, double *buf); int edf_blockwrite_physical_samples(int handle, double *buf); int edfwrite_digital_samples(int handle, int *buf); int edf_blockwrite_digital_samples(int handle, int *buf); #define edfwrite_annotation_utf8(a,b,c,d) biosig_write_annotation_utf8(a,b,c,d) #define edfwrite_annotation_latin1(a,b,c,d) biosig_write_annotation_latin1(a,b,c,d) #define edf_set_datarecord_duration(a,b) biosig_set_datarecord_duration(a,b) #endif #ifdef __cplusplus } /* extern "C" */ #endif #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/biosig.c0000664000175000017500000165505513240263033017105 00000000000000/* Copyright (C) 2005-2018 Alois Schloegl Copyright (C) 2011 Stoyan Mihaylov This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Library function for reading and writing of varios biosignal data formats. It provides also one reference implementation for reading and writing of the GDF data format [1]. Features: - reading and writing of EDF, BDF, GDF1, GDF2, CWFB, HL7aECG, SCP files - reading of ACQ, AINF, BKR, BrainVision, CNT, DEMG, EGI, ETG4000, MFER files The full list of supported formats is shown at http://pub.ist.ac.at/~schloegl/biosig/TESTED implemented functions: - SOPEN, SREAD, SWRITE, SCLOSE, SEOF, SSEEK, STELL, SREWIND References: [1] GDF - A general data format for biomedical signals. available online http://arxiv.org/abs/cs.DB/0608052 */ /* TODO: ensure that hdr->CHANNEL[.].TOffset gets initialized after every alloc() */ #include #include #include #include #include #include #include #ifdef WITH_CURL # include #endif int VERBOSE_LEVEL = 0; // this variable is always available, but only used without NDEBUG #include "config.h" #include "biosig.h" #include "biosig-network.h" #ifdef _WIN32 #include #include #define FILESEP '\\' #else #include #include /* sockaddr_in and sockaddr_in6 definitions. */ #include #include #define FILESEP '/' #endif #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) char* getlogin (void); char* xgethostname (void); /*----------------------------------------------------------------------- error handling should use error variables local to each HDR otherwise, sopen() etc. is not re-entrant. Therefore, use of variables B4C_ERRNUM and B4C_ERRMSG is deprecated; Use instead serror2(hdr), hdr->AS.B4C_ERRNUM, hdr->AS.B4C_ERRMSG. ----------------------------------------------------------------------- */ // do not expose deprecated interface in libgdf #ifndef ONLYGDF ATT_DEPREC int B4C_ERRNUM = 0; ATT_DEPREC const char *B4C_ERRMSG; #endif #ifdef HAVE_CHOLMOD cholmod_common CHOLMOD_COMMON_VAR; void CSstop() { cholmod_finish(&CHOLMOD_COMMON_VAR); } void CSstart () { cholmod_start (&CHOLMOD_COMMON_VAR) ; /* start CHOLMOD */ atexit (&CSstop) ; } #endif #ifndef ONLYGDF #ifdef __cplusplus extern "C" { #endif int sopen_SCP_read (HDRTYPE* hdr); int sopen_SCP_write (HDRTYPE* hdr); int sopen_HL7aECG_read (HDRTYPE* hdr); void sopen_HL7aECG_write(HDRTYPE* hdr); void sopen_abf_read (HDRTYPE* hdr); void sopen_abf2_read (HDRTYPE* hdr); void sopen_axg_read (HDRTYPE* hdr); void sopen_alpha_read (HDRTYPE* hdr); void sopen_cfs_read (HDRTYPE* hdr); void sopen_FAMOS_read (HDRTYPE* hdr); void sopen_fiff_read (HDRTYPE* hdr); int sclose_HL7aECG_write(HDRTYPE* hdr); void sopen_ibw_read (HDRTYPE* hdr); void sopen_itx_read (HDRTYPE* hdr); void sopen_smr_read (HDRTYPE* hdr); void sopen_tdms_read (HDRTYPE* hdr); int sopen_trc_read (HDRTYPE* hdr); int sopen_unipro_read (HDRTYPE* hdr); #ifdef WITH_FEF int sopen_fef_read(HDRTYPE* hdr); int sclose_fef_read(HDRTYPE* hdr); #endif void sopen_heka(HDRTYPE* hdr,FILE *fid); #ifdef HAVE_HDF int sopen_hdf5(HDRTYPE *hdr); #endif #ifdef HAVE_MATIO int sopen_matlab(HDRTYPE *hdr); #endif #ifdef WITH_DICOM int sopen_dicom_read(HDRTYPE* hdr); #endif void sopen_atf_read(HDRTYPE* hdr); void sread_atf(HDRTYPE* hdr); #ifdef __cplusplus } #endif #endif //ONLYGDF const uint16_t GDFTYP_BITS[] = { 8, 8, 8,16,16,32,32,64,64,32,64, 0, 0, 0, 0, 0, /* 0 */ 32,64,128,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 16 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 32 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 48 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 64 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 128: EEG1100 coder, */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,10, 0,12, 0, 0, 0,16, /* 256 - 271*/ 0, 0, 0, 0, 0, 0, 0,24, 0, 0, 0, 0, 0, 0, 0,32, /* 255+24 = bit24, 3 byte */ 0, 0, 0, 0, 0, 0, 0,40, 0, 0, 0, 0, 0, 0, 0,48, 0, 0, 0, 0, 0, 0, 0,56, 0, 0, 0, 0, 0, 0, 0,64, 0, 0, 0, 0, 0, 0, 0,72, 0, 0, 0, 0, 0, 0, 0,80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 384 - 399*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,10, 0,12, 0, 0, 0,16, /* 512 - 527*/ 0, 0, 0, 0, 0, 0, 0,24, 0, 0, 0, 0, 0, 0, 0,32, 0, 0, 0, 0, 0, 0, 0,40, 0, 0, 0, 0, 0, 0, 0,48, 0, 0, 0, 0, 0, 0, 0,56, 0, 0, 0, 0, 0, 0, 0,64, 0, 0, 0, 0, 0, 0, 0,72, 0, 0, 0, 0, 0, 0, 0,80 }; const char *gdftyp_string[] = { "char","int8","uint8","int16","uint16","int32","uint32","int64","uint64", "","","","","","","","float32","float64","float128" }; const char *LEAD_ID_TABLE[] = { "unspecified", "I","II","V1","V2","V3","V4","V5","V6", "V7","V2R","V3R","V4R","V5R","V6R","V7R","X", "Y","Z","CC5","CM5","LA","RA","LL","fI", "fE","fC","fA","fM","fF","fH","dI", "dII","dV1","dV2","dV3","dV4","dV5", "dV6","dV7","dV2R","dV3R","dV4R","dV5R", "dV6R","dV7R","dX","dY","dZ","dCC5","dCM5", "dLA","dRA","dLL","dfI","dfE","dfC","dfA", "dfM","dfF","dfH","III","aVR","aVL","aVF", "aVRneg","V8","V9","V8R","V9R","D","A","J", "Defib","Extern","A1","A2","A3","A4","dV8", "dV9","dV8R","dV9R","dD","dA","dJ","Chest", "V","VR","VL","VF","MCL","MCL1","MCL2","MCL3", "MCL4","MCL5","MCL6","CC","CC1","CC2","CC3", "CC4","CC6","CC7","CM","CM1","CM2","CM3","CM4", "CM6","dIII","daVR","daVL","daVF","daVRneg","dChest", "dV","dVR","dVL","dVF","CM7","CH5","CS5","CB5","CR5", "ML","AB1","AB2","AB3","AB4","ES","AS","AI","S", "dDefib","dExtern","dA1","dA2","dA3","dA4","dMCL1", "dMCL2","dMCL3","dMCL4","dMCL5","dMCL6","RL","CV5RL", "CV6LL","CV6LU","V10","dMCL","dCC","dCC1","dCC2", "dCC3","dCC4","dCC6","dCC7","dCM","dCM1","dCM2", "dCM3","dCM4","dCM6","dCM7","dCH5","dCS5","dCB5", "dCR5","dML","dAB1","dAB2","dAB3","dAB4","dES", "dAS","dAI","dS","dRL","dCV5RL","dCV6LL","dCV6LU","dV10" /* EEG Leads - non consecutive index ,"NZ","FPZ","AFZ","FZ","FCZ","CZ","CPZ","PZ", "POZ","OZ","IZ","FP1","FP2","F1","F2","F3","F4", "F5","F6","F7","F8","F9","F10","FC1","FC2","FC3", "FC4","FC5","FC6","FT7","FT8","FT9","FT10","C1", "C2","C3","C4","C5","C6","CP1","CP2","CP3","CP4", "CP5","CP6","P1","P2","P3","P4","P5","P6","P9", "P10","O1","O2","AF3","AF4","AF7","AF8","PO3", "PO4","PO7","PO8","T3","T7","T4","T8","T5","P7", "T6","P8","T9","T10","TP7","TP8","TP9","TP10", "A1","A2","T1","T2","PG1","PG2","SP1","SP2", "E0","EL1","EL2","EL3","EL4","EL5","EL6","EL7", "ER1","ER2","ER3","ER4","ER5","ER6","ER7","ELL", "ERL","ELA","ELB","ERA","ERB" */ , "\0\0" }; // stop marker #ifndef ONLYGDF /* This information was obtained from here: http://www.physionet.org/physiotools/wfdb/lib/ecgcodes.h */ const char *MIT_EVENT_DESC[] = { "normal beat", "left bundle branch block beat", "right bundle branch block beat", "aberrated atrial premature beat", "premature ventricular contraction", "fusion of ventricular and normal beat", "nodal (junctional) premature beat", "atrial premature contraction", "premature or ectopic supraventricular beat", "ventricular escape beat", "nodal (junctional) escape beat", "paced beat", "unclassifiable beat", "signal quality change", "condition 15", "isolated QRS-like artifact", "condition 17", "ST change", "T-wave change", "systole", "diastole", "comment annotation", "measurement annotation", "P-wave peak", "left or right bundle branch block", "non-conducted pacer spike", "T-wave peak", "rhythm change", "U-wave peak", "learning", "ventricular flutter wave", "start of ventricular flutter/fibrillation", "end of ventricular flutter/fibrillation", "atrial escape beat", "supraventricular escape beat", "link to external data (aux contains URL)", "non-conducted P-wave (blocked APB)", "fusion of paced and normal beat", "PQ junction (beginning of QRS)", "J point (end of QRS)", "R-on-T premature ventricular contraction", "condition 42", "condition 43", "condition 44", "condition 45", "condition 46", "condition 47", "condition 48", "not-QRS (not a getann/putann code)", // code = 0 is mapped to 49(ACMAX) ""}; #endif //ONLYGDF /* --------------------------------------------------- * * Predefined Event Code Table * * --------------------------------------------------- */ #if (BIOSIG_VERSION < 10500) ATT_DEPREC static uint8_t GLOBAL_EVENTCODES_ISLOADED = 0; ATT_DEPREC struct global_t { uint16_t LenCodeDesc; uint16_t *CodeIndex; const char **CodeDesc; char *EventCodesTextBuffer; } Global; // deprecated since Oct 2012, v1.4.0 #endif // event table desription const struct etd_t ETD [] = { #include "eventcodes.i" {0, 0, ""} }; // event groups const struct event_groups_t EventCodeGroups [] = { #include "eventcodegroups.i" {0xffff, "end-of-table" }, }; /****************************************************************************/ /** **/ /** INTERNAL FUNCTIONS **/ /** **/ /****************************************************************************/ // greatest common divisor uint32_t gcd(uint32_t A, uint32_t B) { uint32_t t; if (A0) { t = B; B = A%B; A = t; } return(A); }; // least common multiple - used for obtaining the common HDR.SPR uint32_t lcm(uint32_t A, uint32_t B) { // return(A*(B/gcd(A,B)) with overflow detection uint64_t A64 = A; A64 *= B/gcd(A,B); if (A64 > 0x00000000ffffffffllu) { fprintf(stderr,"Error: HDR.SPR=LCM(%u,%u) overflows and does not fit into uint32.\n",(unsigned)A,(unsigned)B); #ifndef ONLYGDF B4C_ERRNUM = B4C_UNSPECIFIC_ERROR; B4C_ERRMSG = "Computing LCM failed."; #endif } return((uint32_t)A64); }; #ifndef ONLYGDF void* mfer_swap8b(uint8_t *buf, int8_t len, char FLAG_SWAP) { if (VERBOSE_LEVEL==9) fprintf(stdout,"swap=%i %i %i \nlen=%i %2x%2x%2x%2x%2x%2x%2x%2x\n", (int)FLAG_SWAP, __BYTE_ORDER, __LITTLE_ENDIAN, (int)len, (unsigned)buf[0],(unsigned)buf[1],(unsigned)buf[2],(unsigned)buf[3], (unsigned)buf[4],(unsigned)buf[5],(unsigned)buf[6],(unsigned)buf[7] ); #ifndef S_SPLINT_S #if __BYTE_ORDER == __BIG_ENDIAN if (FLAG_SWAP) { unsigned k; for (k=len; k < sizeof(uint64_t); buf[k++]=0); *(uint64_t*)buf = bswap_64(*(uint64_t*)buf); } else { *(uint64_t*)buf >>= (sizeof(uint64_t)-len)*8; } #elif __BYTE_ORDER == __LITTLE_ENDIAN if (FLAG_SWAP) { *(uint64_t*)buf = bswap_64(*(uint64_t*)buf) >> (sizeof(uint64_t)-len)*8; } else { unsigned k; for (k=len; k < sizeof(uint64_t); buf[k++]=0) {}; } #endif #endif if (VERBOSE_LEVEL==9) fprintf(stdout,"%2x%2x%2x%2x%2x%2x%2x%2x %i %f\n", buf[0],buf[1],buf[2],buf[3],buf[4],buf[5], buf[6],buf[7],(int)*(uint64_t*)buf,*(double*)buf ); return(buf); } /* -------------------------------- * float to ascii[8] conversion * -------------------------------- */ int ftoa8(char* buf, double num) { // used for converting scaling factors Dig/Phys/Min/Max into EDF header // Important note: buf may need more than len+1 bytes. make sure there is enough memory allocated. double f1,f2; if (num==ceil(num)) sprintf(buf,"%d",(int)num); else sprintf(buf,"%f",num); f1 = atof(buf); buf[8] = 0; // truncate f2 = atof(buf); return (fabs(f1-f2) > (fabs(f1)+fabs(f2)) * 1e-6); } int is_nihonkohden_signature(char *str) { return (!( strncmp(str, "EEG-1200A V01.00", 16) && strncmp(str, "EEG-1100A V01.00", 16) && strncmp(str, "EEG-1100B V01.00", 16) && strncmp(str, "EEG-1100C V01.00", 16) && strncmp(str, "QI-403A V01.00", 16) && strncmp(str, "QI-403A V02.00", 16) && strncmp(str, "EEG-2100 V01.00", 16) && strncmp(str, "EEG-2100 V02.00", 16) && strncmp(str, "DAE-2100D V01.30", 16) && strncmp(str, "DAE-2100D V02.00", 16) )); } #endif //ONLYGDF #if (BIOSIG_VERSION < 10700) int strncmpi(const char* str1, const char* str2, size_t n) { fprintf(stderr,"Warning from libbiosig: use of function strncmpi() is deprecated - use instead strncasecmp()\n"); return strncasecmp(str1,str2,n); } int strcmpi(const char* str1, const char* str2) { fprintf(stderr,"Warning from libbiosig: use of function strcmpi() is deprecated - use instead strcasecmp()\n"); return strcasecmp(str1,str2); } #endif /* Converts name of month int numeric value. */ int month_string2int(const char *s) { const char ListOfMonth[12][4] = {"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"}; int k; for (k = 0; k < 12; k++) if (!strncasecmp(s, ListOfMonth[k], 3)) return k; return -1; } /* compare uint32_t */ int u32cmp(const void *a,const void *b) { return((int)(*(uint32_t*)a - *(uint32_t*)b)); } /* Interface for mixed use of ZLIB and STDIO If ZLIB is not available, STDIO is used. If ZLIB is availabe, HDR.FILE.COMPRESSION tells whether STDIO or ZLIB is used. */ HDRTYPE* ifopen(HDRTYPE* hdr, const char* mode) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) { hdr->FILE.gzFID = gzopen(hdr->FileName, mode); hdr->FILE.OPEN = (hdr->FILE.gzFID != NULL); } else #endif { hdr->FILE.FID = fopen(hdr->FileName, mode); hdr->FILE.OPEN = (hdr->FILE.FID != NULL); } return(hdr); } int ifclose(HDRTYPE* hdr) { hdr->FILE.OPEN = 0; #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gzclose(hdr->FILE.gzFID)); else #endif return(fclose(hdr->FILE.FID)); } int ifflush(HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gzflush(hdr->FILE.gzFID,Z_FINISH)); else #endif return(fflush(hdr->FILE.FID)); } size_t ifread(void* ptr, size_t size, size_t nmemb, HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION>0) return(gzread(hdr->FILE.gzFID, ptr, size * nmemb)/size); else #endif return(fread(ptr, size, nmemb, hdr->FILE.FID)); } size_t ifwrite(void* ptr, size_t size, size_t nmemb, HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gzwrite(hdr->FILE.gzFID, ptr, size*nmemb)/size); else #endif return(fwrite(ptr, size, nmemb, hdr->FILE.FID)); } int ifprintf(HDRTYPE* hdr, const char *format, va_list arg) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gzprintf(hdr->FILE.gzFID, format, arg)); else #endif return(fprintf(hdr->FILE.FID, format, arg)); } int ifputc(int c, HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gzputc(hdr->FILE.gzFID, c)); else #endif return(fputc(c,hdr->FILE.FID)); } int ifgetc(HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gzgetc(hdr->FILE.gzFID)); else #endif return(fgetc(hdr->FILE.FID)); } char* ifgets(char *str, int n, HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gzgets(hdr->FILE.gzFID, str, n)); else #endif return(fgets(str,n,hdr->FILE.FID)); } int ifseek(HDRTYPE* hdr, long offset, int whence) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) { if (whence==SEEK_END) fprintf(stdout,"Warning SEEK_END is not supported but used in gzseek/ifseek.\nThis can cause undefined behaviour.\n"); return(gzseek(hdr->FILE.gzFID,offset,whence)); } else #endif return(fseek(hdr->FILE.FID,offset,whence)); } long int iftell(HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gztell(hdr->FILE.gzFID)); else #endif return(ftell(hdr->FILE.FID)); } int ifsetpos(HDRTYPE* hdr, size_t *pos) { #if __gnu_linux__ // gnu linux on sparc needs this fpos_t p; p.__pos = *pos; #elif __sparc__ || __APPLE__ || __MINGW32__ || ANDROID || __NetBSD__ || __CYGWIN__ fpos_t p = *pos; #else fpos_t p; p.__pos = *pos; #endif #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) { gzseek(hdr->FILE.gzFID,*pos,SEEK_SET); size_t pos1 = *pos; *pos = gztell(hdr->FILE.gzFID); return(*pos - pos1); } else #endif { int c= fsetpos(hdr->FILE.FID,&p); #if __gnu_linux__ // gnu linux on sparc needs this *pos = p.__pos; #elif __sparc__ || __APPLE__ || __MINGW32__ || ANDROID || __NetBSD__ || __CYGWIN__ *pos = p; #else *pos = p.__pos; #endif return(c); } } int ifgetpos(HDRTYPE* hdr, size_t *pos) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) { z_off_t p = gztell(hdr->FILE.gzFID); if (p<0) return(-1); else { *pos = p; return(0); } } else #endif { fpos_t p; int c = fgetpos(hdr->FILE.FID, &p); #if __gnu_linux__ // gnu linux on sparc needs this *pos = p.__pos; // ugly hack but working #elif __sparc__ || __APPLE__ || __MINGW32__ || ANDROID || __NetBSD__ || __CYGWIN__ *pos = p; #else *pos = p.__pos; // ugly hack but working #endif return(c); } } int ifeof(HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) return(gzeof(hdr->FILE.gzFID)); else #endif return(feof(hdr->FILE.FID)); } int iferror(HDRTYPE* hdr) { #ifdef ZLIB_H if (hdr->FILE.COMPRESSION) { int errnum; const char *tmp = gzerror(hdr->FILE.gzFID,&errnum); fprintf(stderr,"GZERROR: %i %s \n",errnum, tmp); return(errnum); } else #endif return(ferror(hdr->FILE.FID)); } /*------------------------------------------------------------------------ sort event table according to EVENT.POS ------------------------------------------------------------------------*/ struct event { uint32_t POS; uint32_t DUR; uint16_t TYP; uint16_t CHN; #if (BIOSIG_VERSION >= 10500) gdf_time TimeStamp; #endif }; int compare_eventpos(const void *e1, const void *e2) { return(((struct event*)(e1))->POS - ((struct event*)(e2))->POS); } void sort_eventtable(HDRTYPE *hdr) { size_t k; struct event *entry = (struct event*) calloc(hdr->EVENT.N, sizeof(struct event)); if ((hdr->EVENT.DUR != NULL) && (hdr->EVENT.CHN != NULL)) for (k=0; k < hdr->EVENT.N; k++) { entry[k].TYP = hdr->EVENT.TYP[k]; entry[k].POS = hdr->EVENT.POS[k]; entry[k].CHN = hdr->EVENT.CHN[k]; entry[k].DUR = hdr->EVENT.DUR[k]; } else for (k=0; k < hdr->EVENT.N; k++) { entry[k].TYP = hdr->EVENT.TYP[k]; entry[k].POS = hdr->EVENT.POS[k]; } #if (BIOSIG_VERSION >= 10500) if (hdr->EVENT.TimeStamp != NULL) for (k=0; k < hdr->EVENT.N; k++) { entry[k].TimeStamp = hdr->EVENT.TimeStamp[k]; } #endif qsort(entry, hdr->EVENT.N, sizeof(struct event), &compare_eventpos); if ((hdr->EVENT.DUR != NULL) && (hdr->EVENT.CHN != NULL)) for (k=0; k < hdr->EVENT.N; k++) { hdr->EVENT.TYP[k] = entry[k].TYP; hdr->EVENT.POS[k] = entry[k].POS; hdr->EVENT.CHN[k] = entry[k].CHN; hdr->EVENT.DUR[k] = entry[k].DUR; } else for (k=0; k < hdr->EVENT.N; k++) { hdr->EVENT.TYP[k] = entry[k].TYP; hdr->EVENT.POS[k] = entry[k].POS; } #if (BIOSIG_VERSION >= 10500) if (hdr->EVENT.TimeStamp != NULL) for (k=0; k < hdr->EVENT.N; k++) { hdr->EVENT.TimeStamp[k] = entry[k].TimeStamp; } #endif free(entry); } /*------------------------------------------------------------------------ re-allocates memory for Eventtable. hdr->EVENT.N contains actual number of events EventN determines the size of the allocated memory return value: in case of success, EVENT_N is returned in case of failure SIZE_MAX is returned; ------------------------------------------------------------------------*/ size_t reallocEventTable(HDRTYPE *hdr, size_t EventN) { size_t n; hdr->EVENT.POS = (uint32_t*)realloc(hdr->EVENT.POS, EventN * sizeof(*hdr->EVENT.POS)); hdr->EVENT.DUR = (uint32_t*)realloc(hdr->EVENT.DUR, EventN * sizeof(*hdr->EVENT.DUR)); hdr->EVENT.TYP = (uint16_t*)realloc(hdr->EVENT.TYP, EventN * sizeof(*hdr->EVENT.TYP)); hdr->EVENT.CHN = (uint16_t*)realloc(hdr->EVENT.CHN, EventN * sizeof(*hdr->EVENT.CHN)); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = (gdf_time*)realloc(hdr->EVENT.TimeStamp, EventN * sizeof(gdf_time)); #endif if (hdr->EVENT.POS==NULL) return SIZE_MAX; if (hdr->EVENT.TYP==NULL) return SIZE_MAX; if (hdr->EVENT.CHN==NULL) return SIZE_MAX; if (hdr->EVENT.DUR==NULL) return SIZE_MAX; if (hdr->EVENT.TimeStamp==NULL) return SIZE_MAX; for (n = hdr->EVENT.N; n< EventN; n++) { hdr->EVENT.TYP[n] = 0; hdr->EVENT.CHN[n] = 0; hdr->EVENT.DUR[n] = 0; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[n] = 0; #endif } return EventN; } /*------------------------------------------------------------------------ converts event table from {TYP,POS} to [TYP,POS,CHN,DUR} format ------------------------------------------------------------------------*/ void convert2to4_eventtable(HDRTYPE *hdr) { size_t k1,k2,N=hdr->EVENT.N; sort_eventtable(hdr); if (hdr->EVENT.DUR == NULL) hdr->EVENT.DUR = (typeof(hdr->EVENT.DUR)) calloc(N,sizeof(*hdr->EVENT.DUR)); if (hdr->EVENT.CHN == NULL) hdr->EVENT.CHN = (typeof(hdr->EVENT.CHN)) calloc(N,sizeof(*hdr->EVENT.CHN)); for (k1=0; k1EVENT.TYP) typ = hdr->EVENT.TYP[k1]; if ((typ < 0x8000) && (typ>0) && !hdr->EVENT.DUR[k1]) for (k2 = k1+1; k2EVENT.TYP[k2]) { hdr->EVENT.DUR[k1] = hdr->EVENT.POS[k2] - hdr->EVENT.POS[k1]; hdr->EVENT.TYP[k2] = 0; break; } } } for (k1=0,k2=0; k1EVENT.TYP[k2]=hdr->EVENT.TYP[k1]; hdr->EVENT.POS[k2]=hdr->EVENT.POS[k1]; hdr->EVENT.DUR[k2]=hdr->EVENT.DUR[k1]; hdr->EVENT.CHN[k2]=hdr->EVENT.CHN[k1]; #if (BIOSIG_VERSION >= 10500) if (hdr->EVENT.TimeStamp != NULL) hdr->EVENT.TimeStamp[k2] = hdr->EVENT.TimeStamp[k1]; #endif } if (hdr->EVENT.TYP[k1]) k2++; } hdr->EVENT.N = k2; } /*------------------------------------------------------------------------ converts event table from [TYP,POS,CHN,DUR} to {TYP,POS} format ------------------------------------------------------------------------*/ void convert4to2_eventtable(HDRTYPE *hdr) { size_t k1,k2,N = hdr->EVENT.N; if ((hdr->EVENT.DUR == NULL) || (hdr->EVENT.CHN == NULL)) return; for (k1=0; k1EVENT.CHN[k1]) return; hdr->EVENT.TYP = (typeof(hdr->EVENT.TYP)) realloc(hdr->EVENT.TYP,2*N*sizeof(*hdr->EVENT.TYP)); hdr->EVENT.POS = (typeof(hdr->EVENT.POS)) realloc(hdr->EVENT.POS,2*N*sizeof(*hdr->EVENT.POS)); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = (gdf_time*) realloc(hdr->EVENT.TimeStamp,2*N*sizeof(gdf_time)); #endif for (k1=0,k2=N; k1EVENT.DUR[k1]) { hdr->EVENT.TYP[k2] = hdr->EVENT.TYP[k1] | 0x8000; hdr->EVENT.POS[k2] = hdr->EVENT.POS[k1] + hdr->EVENT.DUR[k1]; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[k2] = hdr->EVENT.TimeStamp[k1] + lround(ldexp(hdr->EVENT.DUR[k1]/(hdr->EVENT.SampleRate*24*3600),32)); #endif k2++; } hdr->EVENT.N = k2; free(hdr->EVENT.CHN); hdr->EVENT.CHN=NULL; free(hdr->EVENT.DUR); hdr->EVENT.DUR=NULL; sort_eventtable(hdr); } /*------------------------------------------------------------------------ write GDF event table utility function for SCLOSE and SFLUSH_GDF_EVENT_TABLE TODO: writing of TimeStamps ------------------------------------------------------------------------*/ void write_gdf_eventtable(HDRTYPE *hdr) { uint32_t k32u; uint8_t buf[88]; char flag; fprintf(stdout,"write_gdf_eventtable is obsolete - use hdrEVT2rawEVT instead;\n"); ifseek(hdr, hdr->HeadLen + hdr->AS.bpb*hdr->NRec, SEEK_SET); if (VERBOSE_LEVEL>7) fprintf(stdout,"WriteEventTable: %p %p %p %p\t",hdr->EVENT.TYP,hdr->EVENT.POS,hdr->EVENT.DUR,hdr->EVENT.CHN); flag = (hdr->EVENT.DUR != NULL) && (hdr->EVENT.CHN != NULL); if (flag) // any DUR or CHN is larger than 0 for (k32u=0, flag=0; (k32uEVENT.N) && !flag; k32u++) flag |= hdr->EVENT.CHN[k32u] || hdr->EVENT.DUR[k32u]; if (VERBOSE_LEVEL>7) fprintf(stdout,"flag=%d.\n",flag); buf[0] = (flag ? 3 : 1); if (hdr->VERSION < 1.94) { k32u = lround(hdr->EVENT.SampleRate); buf[1] = k32u & 0x000000FF; buf[2] = (k32u>>8 ) & 0x000000FF; buf[3] = (k32u>>16) & 0x000000FF; leu32a(hdr->EVENT.N, buf+4); } else { k32u = hdr->EVENT.N; buf[1] = k32u & 0x000000FF; buf[2] = (k32u>>8 ) & 0x000000FF; buf[3] = (k32u>>16) & 0x000000FF; lef32a(hdr->EVENT.SampleRate, buf+4); }; for (k32u=0; k32uEVENT.N; k32u++) { hdr->EVENT.POS[k32u] = htole32(hdr->EVENT.POS[k32u]); hdr->EVENT.TYP[k32u] = htole16(hdr->EVENT.TYP[k32u]); } ifwrite(buf, 8, 1, hdr); ifwrite(hdr->EVENT.POS, sizeof(*hdr->EVENT.POS), hdr->EVENT.N, hdr); ifwrite(hdr->EVENT.TYP, sizeof(*hdr->EVENT.TYP), hdr->EVENT.N, hdr); if (flag) { for (k32u=0; k32uEVENT.N; k32u++) { hdr->EVENT.DUR[k32u] = le32toh(hdr->EVENT.DUR[k32u]); hdr->EVENT.CHN[k32u] = le16toh(hdr->EVENT.CHN[k32u]); } ifwrite(hdr->EVENT.CHN, sizeof(*hdr->EVENT.CHN), hdr->EVENT.N,hdr); ifwrite(hdr->EVENT.DUR, sizeof(*hdr->EVENT.DUR), hdr->EVENT.N,hdr); } } #if (BIOSIG_VERSION < 10500) /* Stubs for deprecated functions */ ATT_DEPREC void FreeGlobalEventCodeTable() {} // deprecated since Oct 2012, v1.4.0 ATT_DEPREC void LoadGlobalEventCodeTable() {} // deprecated since Oct 2012, v1.4.0 #endif /*------------------------------------------------------------------------ adds free text annotation to event table the EVENT.TYP is identified from the table EVENT.CodeDesc if annotations is not listed in CodeDesc, it is added to CodeDesc The table is limited to 256 entries, because the table EventCodes allows only codes 0-255 as user specific entry. ------------------------------------------------------------------------*/ void FreeTextEvent(HDRTYPE* hdr,size_t N_EVENT, const char* annotation) { /* free text annotations encoded as user specific events (codes 1-255) */ /* !!! annotation is not copied, but it is assumed that annotation string is also available after return usually, the string is available in hdr->AS.Header; still this can disappear (free, or rellocated) before the Event table is destroyed. !!! */ size_t k; int flag; // static int LengthCodeDesc = 0; if (hdr->EVENT.CodeDesc == NULL) { hdr->EVENT.CodeDesc = (typeof(hdr->EVENT.CodeDesc)) realloc(hdr->EVENT.CodeDesc,257*sizeof(*hdr->EVENT.CodeDesc)); hdr->EVENT.CodeDesc[0] = ""; // typ==0, is always empty hdr->EVENT.LenCodeDesc = 1; } if (annotation == NULL) { hdr->EVENT.TYP[N_EVENT] = 0; return; } // First, compare text with any predefined event description for (k=0; ETD[k].typ != 0; k++) { if (!strcmp(ETD[k].desc, annotation)) { // annotation is already a predefined event hdr->EVENT.TYP[N_EVENT] = ETD[k].typ; return; } } // Second, compare text with user-defined event description flag=1; for (k=0; (k < hdr->EVENT.LenCodeDesc) && flag; k++) { if (!strncmp(hdr->EVENT.CodeDesc[k], annotation, strlen(annotation))) { hdr->EVENT.TYP[N_EVENT] = k; flag = 0; } } // Third, add event description if needed if (flag) { hdr->EVENT.TYP[N_EVENT] = hdr->EVENT.LenCodeDesc; hdr->EVENT.CodeDesc[hdr->EVENT.LenCodeDesc] = annotation; hdr->EVENT.LenCodeDesc++; } if (hdr->EVENT.LenCodeDesc > 255) { biosigERROR(hdr, B4C_INSUFFICIENT_MEMORY, "Maximum number of user-defined events (256) exceeded"); } } /*------------------------------------------------------------------------ returns clear text description of n-th event -------------------------------------------------------------- */ const char* GetEventDescription(HDRTYPE *hdr, size_t N) { if (hdr==NULL || N >= hdr->EVENT.N) return NULL; uint16_t TYP = hdr->EVENT.TYP[N]; if (TYP < hdr->EVENT.LenCodeDesc) // user-specified events, TYP < 256 return hdr->EVENT.CodeDesc[TYP]; if (TYP < 256) // not defined by user return NULL; // end of event: encoded by 0x8000+TYP if ((hdr->EVENT.TYP[N] & 0x8000) && (hdr->TYPE==GDF)) return (NULL); if ((hdr->EVENT.TYP[N] == 0x7fff) && (hdr->TYPE==GDF)) return "[neds]"; // event definition according to GDF's eventcodes.txt table uint16_t k; for (k=0; ETD[k].typ != 0; k++) if (ETD[k].typ==TYP) return ETD[k].desc; fprintf(stderr,"Warning: invalid event type 0x%04x\n",TYP); return (NULL); } /*------------------------------------------------------------------------ DUR2VAL converts sparse sample values in the event table from the DUR format (uint32, machine endian) to the sample value. Endianity of the platform is considered. ------------------------------------------------------------------------*/ double dur2val(uint32_t DUR, uint16_t gdftyp) { if (gdftyp==5) return (double)(int32_t)DUR; if (gdftyp==6) return (double)(uint32_t)DUR; if (gdftyp==16) { float fDur; memcpy(&fDur,&DUR,4); return (double)fDur; } union { uint32_t t32; uint16_t t16[2]; uint8_t t8[4]; } u; /* make sure u32 is always little endian like in the GDF file and only then extract the sample value */ u.t32 = htole32(DUR); if (gdftyp==1) return (double)(int8_t)(u.t8[0]); if (gdftyp==2) return (double)(uint8_t)(u.t8[0]); if (gdftyp==3) return (double)(int16_t)le16toh(u.t16[0]); if (gdftyp==4) return (double)(uint16_t)le16toh(u.t16[0]); return NAN; } /*------------------------------------------------------------------------ getTimeChannelNumber searches all channels, whether one channel contains the time axis Return value: the number of the first channel containing the time axis is returned. if no time channel is found, 0 is returned; Note: a 1-based indexing is used, the corresponding time channel is used the header of the time channel is in hdr->CHANNEL[getTimeChannelNumber(hdr)-1] ------------------------------------------------------------------------*/ int getTimeChannelNumber(HDRTYPE* hdr) { typeof(hdr->NS) k; for (k=0; kNS; k++) if (hdr->CHANNEL[k].OnOff==2) return (k+1); return 0; } /*------------------------------------------------------------------------ biosig_set_hdr_ipaddr set the field HDR.IPaddr based on the IP address of hostname Return value: 0: hdr->IPaddr is set otherwise hdr->IPaddr is not set ------------------------------------------------------------------------*/ int biosig_set_hdr_ipaddr(HDRTYPE *hdr, const char *hostname) { struct addrinfo hints; struct addrinfo *result, *rp; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_socktype = 0; hints.ai_flags = 0; hints.ai_protocol = 0; /* Any protocol */ int s = getaddrinfo(hostname, NULL, &hints, &result); if (s != 0) return -1; // IPaddr can not be set for (rp = result; rp != NULL; rp = rp->ai_next) { if ( rp->ai_family == AF_INET6) memcpy(hdr->IPaddr, &(((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr), 16); else if ( rp->ai_family == AF_INET) { memcpy(hdr->IPaddr, &(((struct sockaddr_in *)rp->ai_addr)->sin_addr.s_addr), 4); memset(hdr->IPaddr+4, 0, 12); } break; // set first found address } freeaddrinfo(result); return 0; } /****************************************************************************/ /** **/ /** EXPORTED FUNCTIONS **/ /** **/ /****************************************************************************/ uint32_t get_biosig_version () { return ((BIOSIG_VERSION_MAJOR<<16) + (BIOSIG_VERSION_MINOR<<8) + BIOSIG_PATCHLEVEL); } /****************************************************************************/ /** INIT HDR **/ /****************************************************************************/ #define Header1 ((char*)hdr->AS.Header) HDRTYPE* constructHDR(const unsigned NS, const unsigned N_EVENT) { /* HDR is initialized, memory is allocated for NS channels and N_EVENT number of events. The purpose is to define all parameters at an initial step. No parameters must remain undefined. */ HDRTYPE* hdr = (HDRTYPE*)malloc(sizeof(HDRTYPE)); union { uint32_t testword; uint8_t testbyte[sizeof(uint32_t)]; } EndianTest; int k,k1; uint8_t LittleEndian; size_t BitsPerBlock; EndianTest.testword = 0x4a3b2c1d; LittleEndian = (EndianTest.testbyte[0]==0x1d && EndianTest.testbyte[1]==0x2c && EndianTest.testbyte[2]==0x3b && EndianTest.testbyte[3]==0x4a ); assert ( ( LittleEndian && __BYTE_ORDER == __LITTLE_ENDIAN) || (!LittleEndian && __BYTE_ORDER == __BIG_ENDIAN ) ); hdr->FileName = NULL; hdr->FILE.OPEN = 0; hdr->FILE.FID = 0; hdr->FILE.POS = 0; hdr->FILE.Des = 0; hdr->FILE.COMPRESSION = 0; hdr->FILE.size = 0; #ifdef ZLIB_H hdr->FILE.gzFID = 0; #endif hdr->AS.B4C_ERRNUM = B4C_NO_ERROR; hdr->AS.B4C_ERRMSG = NULL; hdr->AS.Header = NULL; hdr->AS.rawEventData = NULL; hdr->AS.auxBUF = NULL; hdr->AS.bpb = 0; hdr->TYPE = noFile; hdr->VERSION = 2.0; hdr->AS.rawdata = NULL; //(uint8_t*) malloc(0); hdr->AS.flag_collapsed_rawdata = 0; // is rawdata not collapsed hdr->AS.first = 0; hdr->AS.length = 0; // no data loaded memset(hdr->AS.SegSel,0,sizeof(hdr->AS.SegSel)); hdr->Calib = NULL; hdr->rerefCHANNEL = NULL; hdr->NRec = 0; hdr->SPR = 0; hdr->NS = NS; hdr->SampleRate = 4321.5; hdr->Patient.Id[0]=0; strcpy(hdr->ID.Recording,"00000000"); hdr->data.size[0] = 0; // rows hdr->data.size[1] = 0; // columns hdr->data.block = NULL; hdr->T0 = t_time2gdf_time(time(NULL)-timezone); // localtime hdr->tzmin = -timezone/60; // convert from seconds west of UTC to minutes east; { uint8_t Equipment[8] = "b4c_1.5 "; Equipment[4] = BIOSIG_VERSION_MAJOR+'0'; Equipment[6] = BIOSIG_VERSION_MINOR+'0'; memcpy(&(hdr->ID.Equipment), &Equipment, 8); } hdr->ID.Manufacturer._field[0] = 0; hdr->ID.Manufacturer.Name = NULL; hdr->ID.Manufacturer.Model = NULL; hdr->ID.Manufacturer.Version = NULL; hdr->ID.Manufacturer.SerialNumber = NULL; hdr->ID.Technician = NULL; hdr->ID.Hospital = NULL; memset(hdr->IPaddr, 0, 16); { // some local variables are used only in this block #ifdef _WIN32 #if 1 // getlogin() a flawfinder level [4] issue, recommended to use getpwuid(geteuid()) but not available on Windows hdr->ID.Technician = strdup(getlogin()); #else // this compiles but stops with "Program error" on wine char str[1001]; GetUserName(str,1000); if (VERBOSE_LEVEL>7) fprintf(stdout,"Name:%s\n",str); hdr->ID.Technician = strdup(str); #endif #else char *username = NULL; /* TODO: check whether memory leak in glibc's getpwuid is fixed. for details see: http://sourceware.org/bugzilla/show_bug.cgi?id=14122 struct passwd *p = NULL; //getpwuid(geteuid()); if (p != NULL) username = p->pw_gecos; */ if (username == NULL) username = getlogin(); if (username) hdr->ID.Technician = strdup(username); #endif } #ifndef WITHOUT_NETWORK #ifdef _WIN32 WSADATA wsadata; WSAStartup(MAKEWORD(1,1), &wsadata); #endif { // set default IP address to local IP address char *localhostname; localhostname = xgethostname(); if (localhostname) { biosig_set_hdr_ipaddr(hdr, localhostname); free (localhostname); } } #ifdef _WIN32 WSACleanup(); #endif #endif // not WITHOUT_NETWORK hdr->Patient.Name[0] = 0; //hdr->Patient.Id[0] = 0; hdr->Patient.Birthday = (gdf_time)0; // Unknown; hdr->Patient.Medication = 0; // 0:Unknown, 1: NO, 2: YES hdr->Patient.DrugAbuse = 0; // 0:Unknown, 1: NO, 2: YES hdr->Patient.AlcoholAbuse=0; // 0:Unknown, 1: NO, 2: YES hdr->Patient.Smoking = 0; // 0:Unknown, 1: NO, 2: YES hdr->Patient.Sex = 0; // 0:Unknown, 1: Male, 2: Female hdr->Patient.Handedness = 0; // 0:Unknown, 1: Right, 2: Left, 3: Equal hdr->Patient.Impairment.Visual = 0; // 0:Unknown, 1: NO, 2: YES, 3: Corrected hdr->Patient.Impairment.Heart = 0; // 0:Unknown, 1: NO, 2: YES, 3: Pacemaker hdr->Patient.Weight = 0; // 0:Unknown hdr->Patient.Height = 0; // 0:Unknown for (k1=0; k1<3; k1++) { hdr->Patient.Headsize[k1] = 0; // Unknown; hdr->ELEC.REF[k1] = 0.0; hdr->ELEC.GND[k1] = 0.0; } hdr->LOC[0] = 0x00292929; hdr->LOC[1] = 48*3600000+(1<<31); // latitude hdr->LOC[2] = 15*3600000+(1<<31); // longitude hdr->LOC[3] = 35000; //altitude in centimeter above sea level hdr->FLAG.UCAL = 0; // un-calibration OFF (auto-scaling ON) hdr->FLAG.OVERFLOWDETECTION = 1; // overflow detection ON hdr->FLAG.ANONYMOUS = 1; // <>0: no personal names are processed hdr->FLAG.TARGETSEGMENT = 1; // read 1st segment hdr->FLAG.ROW_BASED_CHANNELS=0; // define variable header hdr->CHANNEL = (CHANNEL_TYPE*)calloc(hdr->NS, sizeof(CHANNEL_TYPE)); BitsPerBlock = 0; for (k=0;kNS;k++) { size_t nbits; CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->Label[0] = 0; hc->LeadIdCode= 0; strcpy(hc->Transducer, "EEG: Ag-AgCl electrodes"); hc->PhysDimCode = 19+4256; // uV hc->PhysMax = +100; hc->PhysMin = -100; hc->DigMax = +2047; hc->DigMin = -2048; hc->Cal = NAN; hc->Off = 0.0; hc->TOffset = 0.0; hc->GDFTYP = 3; // int16 hc->SPR = 1; // one sample per block hc->bi = 2*k; hc->bi8 = BitsPerBlock; nbits = GDFTYP_BITS[hc->GDFTYP]*hc->SPR; BitsPerBlock += nbits; hc->OnOff = 1; hc->HighPass = 0.16; hc->LowPass = 70.0; hc->Notch = 50; hc->Impedance = INFINITY; hc->fZ = NAN; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; } // define EVENT structure hdr->EVENT.N = N_EVENT; hdr->EVENT.SampleRate = 0; hdr->EVENT.CodeDesc = NULL; hdr->EVENT.LenCodeDesc = 0; if (hdr->EVENT.N) { hdr->EVENT.POS = (uint32_t*) calloc(hdr->EVENT.N, sizeof(*hdr->EVENT.POS)); hdr->EVENT.TYP = (uint16_t*) calloc(hdr->EVENT.N, sizeof(*hdr->EVENT.TYP)); hdr->EVENT.DUR = (uint32_t*) calloc(hdr->EVENT.N, sizeof(*hdr->EVENT.DUR)); hdr->EVENT.CHN = (uint16_t*) calloc(hdr->EVENT.N, sizeof(*hdr->EVENT.CHN)); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = (gdf_time*) calloc(hdr->EVENT.N, sizeof(gdf_time)); #endif } else { hdr->EVENT.POS = NULL; hdr->EVENT.TYP = NULL; hdr->EVENT.DUR = NULL; hdr->EVENT.CHN = NULL; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = NULL; #endif } // initialize specialized fields hdr->aECG = NULL; hdr->AS.bci2000 = NULL; #if (BIOSIG_VERSION >= 10500) hdr->SCP.Section7 = NULL; hdr->SCP.Section8 = NULL; hdr->SCP.Section9 = NULL; hdr->SCP.Section10 = NULL; hdr->SCP.Section11 = NULL; hdr->SCP.Section7Length = 0; hdr->SCP.Section8Length = 0; hdr->SCP.Section9Length = 0; hdr->SCP.Section10Length = 0; hdr->SCP.Section11Length = 0; #endif return(hdr); } /* just for debugging void debug_showptr(HDRTYPE* hdr) { fprintf(stdout,"=========================\n"); fprintf(stdout,"&AS.Header=%p\n",hdr->AS.Header); fprintf(stdout,"&AS.auxBUF=%p\n",hdr->AS.auxBUF); fprintf(stdout,"&aECG=%p\n",hdr->aECG); fprintf(stdout,"&AS.bci2000=%p\n",hdr->AS.bci2000); fprintf(stdout,"&AS.rawEventData=%p\n",hdr->AS.rawEventData); fprintf(stdout,"&AS.rawData=%p\n",hdr->AS.rawdata); fprintf(stdout,"&data.block=%p\n",hdr->data.block); fprintf(stdout,"&CHANNEL=%p\n",hdr->CHANNEL); fprintf(stdout,"&EVENT.POS=%p\n",hdr->EVENT.POS); fprintf(stdout,"&EVENT.TYP=%p\n",hdr->EVENT.TYP); fprintf(stdout,"&EVENT.DUR=%p\n",hdr->EVENT.DUR); fprintf(stdout,"&EVENT.CHN=%p\n",hdr->EVENT.CHN); fprintf(stdout,"&EVENT.CodeDesc=%p\n",hdr->EVENT.CodeDesc); fprintf(stdout,"&FileName=%p %s\n",&hdr->FileName,hdr->FileName); fprintf(stdout,"&Hospital=%p\n",hdr->ID.Hospital); } */ void destructHDR(HDRTYPE* hdr) { if (hdr==NULL) return; sclose(hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR(%s): free HDR.aECG\n",hdr->FileName); #if (BIOSIG_VERSION < 10500) if (hdr->aECG != NULL) { if (((struct aecg*)hdr->aECG)->Section8.NumberOfStatements>0) free(((struct aecg*)hdr->aECG)->Section8.Statements); if (((struct aecg*)hdr->aECG)->Section11.NumberOfStatements>0) free(((struct aecg*)hdr->aECG)->Section11.Statements); free(hdr->aECG); } #endif if (hdr->ID.Technician != NULL) free(hdr->ID.Technician); if (hdr->ID.Hospital != NULL) free(hdr->ID.Hospital); if (hdr->AS.bci2000 != NULL) free(hdr->AS.bci2000); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR.AS.rawdata @%p\n",hdr->AS.rawdata); // in case of SCPv3, rawdata can be loaded into Header if ( (hdr->AS.rawdata < hdr->AS.Header) || (hdr->AS.rawdata > (hdr->AS.Header+hdr->HeadLen)) ) if (hdr->AS.rawdata != NULL) free(hdr->AS.rawdata); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR.data.block @%p\n",hdr->data.block); if (hdr->data.block != NULL) free(hdr->data.block); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR.CHANNEL[] @%p %p\n",hdr->CHANNEL,hdr->rerefCHANNEL); if (hdr->CHANNEL != NULL) free(hdr->CHANNEL); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR.AS.Header\n"); if (hdr->AS.rawEventData != NULL) free(hdr->AS.rawEventData); if (hdr->AS.Header != NULL) free(hdr->AS.Header); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free Event Table %p %p %p %p \n",hdr->EVENT.TYP,hdr->EVENT.POS,hdr->EVENT.DUR,hdr->EVENT.CHN); if (hdr->EVENT.POS != NULL) free(hdr->EVENT.POS); if (hdr->EVENT.TYP != NULL) free(hdr->EVENT.TYP); if (hdr->EVENT.DUR != NULL) free(hdr->EVENT.DUR); if (hdr->EVENT.CHN != NULL) free(hdr->EVENT.CHN); #if (BIOSIG_VERSION >= 10500) if (hdr->EVENT.TimeStamp) free(hdr->EVENT.TimeStamp); #endif if (hdr->EVENT.CodeDesc != NULL) free(hdr->EVENT.CodeDesc); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR.AS.auxBUF\n"); if (hdr->AS.auxBUF != NULL) free(hdr->AS.auxBUF); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR.rerefCHANNEL\n"); #ifdef CHOLMOD_H //if (hdr->Calib) cholmod_print_sparse(hdr->Calib,"destructHDR hdr->Calib",&CHOLMOD_COMMON_VAR); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free hdr->Calib\n"); if (hdr->Calib) cholmod_free_sparse(&hdr->Calib, &CHOLMOD_COMMON_VAR); if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free hdr->rerefCHANNEL %p\n",hdr->rerefCHANNEL); if (hdr->rerefCHANNEL) free(hdr->rerefCHANNEL); #endif if (VERBOSE_LEVEL>7) fprintf(stdout,"destructHDR: free HDR\n"); if (hdr->FileName != NULL) free(hdr->FileName); if (hdr != NULL) free(hdr); return; } /****************************************************************************/ /** INITIALIZE FIELDS OF A SINGLE CHANNEL TO DEFAULT VALUES **/ /****************************************************************************/ void init_channel(struct CHANNEL_STRUCT *hc) { hc->PhysMin = -1e9; hc->PhysMax = +1e9; hc->DigMin = ldexp(-1,15); hc->DigMax = ldexp(1,15)-1; hc->Cal = 1.0; hc->Off = 0.0; hc->Label[0] = '\0'; hc->OnOff = 1; hc->LeadIdCode = 0; hc->Transducer[0] = '\0'; hc->PhysDimCode = 0; #ifdef MAX_LENGTH_PHYSDIM hc->PhysDim[0] = '?'; #endif hc->TOffset = 0.0; hc->HighPass = NAN; hc->LowPass = NAN; hc->Notch = NAN; hc->XYZ[0] = 0; hc->XYZ[1] = 0; hc->XYZ[2] = 0; hc->Impedance = NAN; hc->bufptr = NULL; hc->SPR = 1; hc->bi = 0; hc->bi8 = 0; hc->GDFTYP = 3; // int16 } /* http://www.ietf.org/rfc/rfc1952.txt */ const char *MAGIC_NUMBER_GZIP = "\x1f\x8B\x08"; /****************************************************************************/ /** GETFILETYPE **/ /****************************************************************************/ HDRTYPE* getfiletype(HDRTYPE* hdr) /* input: hdr->AS.Header1 contains first block of hdr->HeadLen bytes hdr->TYPE must be unknown, otherwise no FileFormat evaluation is performed output: hdr->TYPE file format hdr->VERSION is defined for some selected formats e.g. ACQ, EDF, BDF, GDF */ { // ToDo: use LEN to detect buffer overflow hdr->TYPE = unknown; if (VERBOSE_LEVEL>7) fprintf(stdout,"[%s line %i]! %i\n", __func__,__LINE__, hdr->HeadLen); #ifndef ONLYGDF const uint8_t MAGIC_NUMBER_FEF1[] = {67,69,78,13,10,0x1a,4,0x84}; const uint8_t MAGIC_NUMBER_FEF2[] = {67,69,78,0x13,0x10,0x1a,4,0x84}; const uint8_t MAGIC_NUMBER_Z[] = {31,157,144}; // const uint8_t MAGIC_NUMBER_ZIP[] = {80,75,3,4}; const uint8_t MAGIC_NUMBER_TIFF_l32[] = {73,73,42,0}; const uint8_t MAGIC_NUMBER_TIFF_b32[] = {77,77,0,42}; const uint8_t MAGIC_NUMBER_TIFF_l64[] = {73,73,43,0,8,0,0,0}; const uint8_t MAGIC_NUMBER_TIFF_b64[] = {77,77,0,43,0,8,0,0}; const uint8_t MAGIC_NUMBER_DICOM[] = {8,0,5,0,10,0,0,0,73,83,79,95,73,82,32,49,48,48}; const uint8_t MAGIC_NUMBER_UNIPRO[] = {40,0,4,1,44,1,102,2,146,3,44,0,190,3}; const uint8_t MAGIC_NUMBER_SYNERGY[] = {83,121,110,101,114,103,121,0,48,49,50,46,48,48,51,46,48,48,48,46,48,48,48,0,28,0,0,0,2,0,0,0}; const char* MAGIC_NUMBER_BRAINVISION = "Brain Vision Data Exchange Header File"; const char* MAGIC_NUMBER_BRAINVISION1 = "Brain Vision V-Amp Data Header File Version"; const char* MAGIC_NUMBER_BRAINVISIONMARKER = "Brain Vision Data Exchange Marker File, Version"; /******** read 1st (fixed) header *******/ uint32_t U32 = leu32p(hdr->AS.Header+2); uint32_t MAGIC_EN1064_Section0Length = leu32p(hdr->AS.Header+10); if ((U32>=30) & (U32<=45)) { hdr->VERSION = (float)U32; U32 = leu32p(hdr->AS.Header+6); if ((hdr->VERSION <34.0) && (U32 == 150)) hdr->TYPE = ACQ; else if ((hdr->VERSION <35.0) && (U32 == 164)) hdr->TYPE = ACQ; else if ((hdr->VERSION <36.0) && (U32 == 326)) hdr->TYPE = ACQ; else if ((hdr->VERSION <37.0) && (U32 == 886)) hdr->TYPE = ACQ; else if ((hdr->VERSION <38.0) && (U32 ==1894)) hdr->TYPE = ACQ; else if ((hdr->VERSION <41.0) && (U32 ==1896)) hdr->TYPE = ACQ; else if ((hdr->VERSION <43.0) && (U32 ==1944)) hdr->TYPE = ACQ; //else if ((hdr->VERSION <45.0) && (U32 ==2976)) hdr->TYPE = ACQ; else if ((hdr->VERSION <45.0) && (U32 >=2220)) hdr->TYPE = ACQ; else if ((hdr->VERSION>=45.0) && (U32 ==(12944+160))) hdr->TYPE = ACQ; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s ACQ %f %i\n", __FILE__, __LINE__, __func__, hdr->VERSION, U32); if (hdr->TYPE == ACQ) { hdr->HeadLen = U32; // length of fixed header hdr->FILE.LittleEndian = 1; return(hdr); } } U32 = beu32p(hdr->AS.Header+2); if ((U32==83)) { hdr->VERSION = (float)U32; U32 = beu32p(hdr->AS.Header+6); if ((hdr->VERSION == 83) & (U32 == 1564)) hdr->TYPE = ACQ; if (hdr->TYPE == ACQ) { hdr->HeadLen = U32; // length of fixed header hdr->FILE.LittleEndian = 0; return(hdr); } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s (..): %u %u %u\n", __FILE__,__LINE__,__func__,beu32p(hdr->AS.Header+2),beu32p(hdr->AS.Header+6),beu32p(hdr->AS.Header+10)); #endif //ONLYGDF if (VERBOSE_LEVEL>7) fprintf(stdout,"(%s line %i: %x %x! <%8s>\n",__func__,__LINE__, leu16p(hdr->AS.Header),leu16p(hdr->AS.Header+154),hdr->AS.Header); if (hdr->TYPE != unknown) return(hdr); #ifndef ONLYGDF else if (!memcmp(hdr->AS.Header, "ABF ", 4)) { // else if (!memcmp(Header1,"ABF \x66\x66\xE6\x3F",4)) { // ABF v1.8 hdr->TYPE = ABF; hdr->VERSION = lef32p(hdr->AS.Header+4); } else if (!memcmp(hdr->AS.Header, "ABF2\x00\x00", 6) && ( hdr->AS.Header[7] < 10 ) ) { hdr->TYPE = ABF2; hdr->VERSION = hdr->AS.Header[6] + ( hdr->AS.Header[7] / 10.0 ); } else if (!memcmp(Header1+20,"ACR-NEMA",8)) hdr->TYPE = ACR_NEMA; else if (strstr(Header1,"ALPHA-TRACE-MEDICAL")) hdr->TYPE = alpha; else if (!memcmp(Header1,"ATES MEDICA SOFT. EEG for Windows",33)) hdr->TYPE = ATES; else if (!memcmp(Header1,"ATF\x09",4)) hdr->TYPE = ATF; else if (!memcmp(Header1,"AxGr",4)) { hdr->TYPE = AXG; hdr->VERSION = bei16p(hdr->AS.Header+4); } else if (!memcmp(Header1,"axgx",4)) { hdr->TYPE = AXG; hdr->VERSION = bei32p(hdr->AS.Header+4); } else if (!memcmp(Header1,"ADU1",4) || !memcmp(Header1,"ADU2",4) ) hdr->TYPE = Axona; else if (!memcmp(Header1,"HeaderLen=",10)) { hdr->TYPE = BCI2000; hdr->VERSION = 1.0; } else if (!memcmp(Header1,"BCI2000V",8)) { hdr->TYPE = BCI2000; hdr->VERSION = 1.1; } else if (!memcmp(Header1+1,"BIOSEMI",7) && (hdr->AS.Header[0]==0xff) && (hdr->HeadLen > 255)) { hdr->TYPE = BDF; hdr->VERSION = -1; } else if (!memcmp(Header1,"#BIOSIG ASCII",13)) hdr->TYPE = ASCII; else if (!memcmp(Header1,"#BIOSIG BINARY",14)) hdr->TYPE = BIN; else if ((leu16p(hdr->AS.Header)==207) && (leu16p(hdr->AS.Header+154)==0)) hdr->TYPE = BKR; else if (!memcmp(Header1+34,"BLSC",4)) hdr->TYPE = BLSC; else if (!memcmp(Header1,"bscs://",7)) hdr->TYPE = BSCS; else if (((beu16p(hdr->AS.Header)==0x0311) && (beu32p(hdr->AS.Header+4)==0x0809B002) && (leu16p(hdr->AS.Header+2) > 240) && (leu16p(hdr->AS.Header+2) < 250)) // v2.40 - v2.50 || !memcmp(hdr->AS.Header+307, "E\x00\x00\x00\x00\x00\x00\x00DAT", 11) ) hdr->TYPE = BLSC; else if (!memcmp(Header1,"FileFormat = BNI-1-BALTIMORE",28)) hdr->TYPE = BNI; else if (!memcmp(Header1,MAGIC_NUMBER_BRAINVISION,strlen(MAGIC_NUMBER_BRAINVISION)) || ((leu32p(hdr->AS.Header)==0x42bfbbef) && !memcmp(Header1+3, MAGIC_NUMBER_BRAINVISION,38))) hdr->TYPE = BrainVision; else if (!memcmp(Header1,MAGIC_NUMBER_BRAINVISION1,strlen(MAGIC_NUMBER_BRAINVISION1))) hdr->TYPE = BrainVisionVAmp; else if (!memcmp(Header1,MAGIC_NUMBER_BRAINVISIONMARKER,strlen(MAGIC_NUMBER_BRAINVISIONMARKER))) hdr->TYPE = BrainVisionMarker; else if (!memcmp(Header1,"BZh91",5)) hdr->TYPE = BZ2; else if (!memcmp(Header1,"CDF",3)) hdr->TYPE = CDF; else if (!memcmp(Header1,"CEDFILE",7)) hdr->TYPE = CFS; else if (!memcmp(Header1+2,"(C) CED 87",10)) hdr->TYPE = SMR; // CED's SMR/SON format else if (!memcmp(Header1,"CFWB\1\0\0\0",8)) hdr->TYPE = CFWB; else if (!memcmp(Header1,"Version 3.0",11)) hdr->TYPE = CNT; else if (!memcmp(Header1,"MEG4",4)) hdr->TYPE = CTF; else if (!memcmp(Header1,"CTF_MRI_FORMAT VER 2.2",22)) hdr->TYPE = CTF; else if (!memcmp(Header1,"PATH OF DATASET:",16)) hdr->TYPE = CTF; else if (!memcmp(Header1,"DEMG",4)) hdr->TYPE = DEMG; else if (!memcmp(Header1+128,"DICM\x02\x00\x00\x00",8)) hdr->TYPE = DICOM; else if (!memcmp(Header1, MAGIC_NUMBER_DICOM,sizeof(MAGIC_NUMBER_DICOM))) hdr->TYPE = DICOM; else if (!memcmp(Header1+12, MAGIC_NUMBER_DICOM,sizeof(MAGIC_NUMBER_DICOM))) hdr->TYPE = DICOM; else if (!memcmp(Header1+12, MAGIC_NUMBER_DICOM,8)) hdr->TYPE = DICOM; else if (!memcmp(Header1,"EBS\x94\x0a\x13\x1a\x0d",8)) hdr->TYPE = EBS; else if (!memcmp(Header1,"0 ",8) && (hdr->HeadLen > 255)) { hdr->TYPE = EDF; hdr->VERSION = 0; } /* Nihon Kohden */ else if (is_nihonkohden_signature((char*)Header1) && is_nihonkohden_signature((char*)(Header1+0x81))) { hdr->TYPE = EEG1100; hdr->VERSION = strtod((char*)Header1+11,NULL); } else if (!memcmp(Header1, "RIFF",4) && !memcmp(Header1+8, "CNT ",4)) hdr->TYPE = EEProbe; else if (!memcmp(Header1, "EEP V2.0",8)) hdr->TYPE = EEProbe; else if (!memcmp(Header1, "\x26\x00\x10\x00",4)) // AVR hdr->TYPE = EEProbe; else if (( bei32p(hdr->AS.Header) == 0x01020304) && ((beu16p(hdr->AS.Header+4) == 0xffff) || (beu16p(hdr->AS.Header+4) == 3)) ) { hdr->TYPE = EGIS; hdr->FILE.LittleEndian = 0; } else if (( lei32p(hdr->AS.Header) == 0x01020304) && ((leu16p(hdr->AS.Header+4) == 0xffff) || (leu16p(hdr->AS.Header+4) == 3)) ) { hdr->TYPE = EGIS; hdr->FILE.LittleEndian = 1; } else if ((beu32p(hdr->AS.Header) > 1) && (beu32p(hdr->AS.Header) < 8) && !hdr->AS.Header[6] && !hdr->AS.Header[8] && !hdr->AS.Header[10] && !hdr->AS.Header[12] && !hdr->AS.Header[14] && !hdr->AS.Header[26] ) { /* sanity check: the high byte of month, day, hour, min, sec and bits must be zero */ hdr->TYPE = EGI; hdr->VERSION = hdr->AS.Header[3]; } else if (*(uint32_t*)(Header1) == htobe32(0x7f454c46)) hdr->TYPE = ELF; else if ( (hdr->HeadLen > 14) && !memcmp(Header1,"Embla data file",15)) hdr->TYPE = EMBLA; else if ( (hdr->HeadLen > 4) && ( !memcmp(Header1,"PBJ",3) || !memcmp(Header1,"BPC",3) ) ) hdr->TYPE = EMSA; else if (strstr(Header1,"Subject") && strstr(Header1,"Target.OnsetTime") && strstr(Header1,"Target.RTTime") && strstr(Header1,"Target.RESP")) hdr->TYPE = ePrime; else if (!memcmp(Header1,"[Header]",8)) hdr->TYPE = ET_MEG; else if ( (hdr->HeadLen > 19) && !memcmp(Header1,"Header\r\nFile Version'",20)) hdr->TYPE = ETG4000; else if (!memcmp(Header1,"|CF,",4)) hdr->TYPE = FAMOS; else if (!memcmp(Header1,MAGIC_NUMBER_FEF1,sizeof(MAGIC_NUMBER_FEF1)) || !memcmp(Header1,MAGIC_NUMBER_FEF2,sizeof(MAGIC_NUMBER_FEF1))) { hdr->TYPE = FEF; char tmp[9];tmp[8] = 0; memcpy(tmp,hdr->AS.Header+8,8); hdr->VERSION = (float)atol(tmp); } else if (!memcmp(hdr->AS.Header, "\0\0\0\x64\0\0\0\x1f\0\0\0\x14\0\0\0\0\0\1",4) && !memcmp(hdr->AS.Header+36,"\0\0\0\x65\0\0\0\3\0\0\0\4\0\0",14) && !memcmp(hdr->AS.Header+56,"\0\0\0\x6a\0\0\0\3\0\0\0\4\0\0\0\0\xff\xff\xff\xff\0\0",22) ) hdr->TYPE = FIFF; else if (!memcmp(Header1,"fLaC",4)) hdr->TYPE = FLAC; #endif //ONLYGDF else if (!memcmp(Header1,"GDF",3) && (hdr->HeadLen > 255)) { hdr->TYPE = GDF; char tmp[6]; tmp[5] = 0; memcpy(tmp,hdr->AS.Header+3, 5); hdr->VERSION = strtod(tmp,NULL); } #ifndef ONLYGDF else if (!memcmp(Header1,"GIF87a",6)) hdr->TYPE = GIF; else if (!memcmp(Header1,"GIF89a",6)) hdr->TYPE = GIF; else if ( (hdr->HeadLen > 21) && !memcmp(Header1,"GALILEO EEG TRACE FILE",22)) hdr->TYPE = GTF; else if (!memcmp(Header1,MAGIC_NUMBER_GZIP,strlen(MAGIC_NUMBER_GZIP))) { hdr->TYPE = GZIP; // hdr->FILE.COMPRESSION = 1; } else if (!memcmp(Header1,"\x89HDF\x0d\x0a\x1a\x0a",8)) hdr->TYPE = HDF; else if (!memcmp(Header1,"DATA\0\0\0\0",8)) { hdr->TYPE = HEKA; hdr->VERSION = 0; } else if (!memcmp(Header1,"DAT1\0\0\0\0",8)) { hdr->TYPE = HEKA; hdr->VERSION = 1; } else if (!memcmp(Header1,"DAT2\0\0\0\0",8)) { hdr->TYPE = HEKA; hdr->VERSION = 2; } else if (!memcmp(Header1,"IGOR",4)) hdr->TYPE = ITX; else if (*(int16_t*)Header1==0x0001 || *(int16_t*)Header1==0x0002 || *(int16_t*)Header1==0x0003 || *(int16_t*)Header1==0x0005 ) { /* no swapping */ hdr->TYPE = IBW; hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); hdr->VERSION = *(int16_t*)Header1; } else if (*(int16_t*)Header1==0x0100 || *(int16_t*)Header1==0x0200 || *(int16_t*)Header1==0x0300 || *(int16_t*)Header1==0x0500 ) { /* data need to be swapped */ hdr->TYPE = IBW; hdr->FILE.LittleEndian = (__BYTE_ORDER == __BIG_ENDIAN); hdr->VERSION = bswap_16(*(int16_t*)Header1); } else if (!memcmp(Header1,"ANN 1.0",8)) hdr->TYPE = ISHNE; else if (!memcmp(Header1,"ISHNE1.0",8)) hdr->TYPE = ISHNE; else if (!memcmp(Header1,"@ MFER ",8)) hdr->TYPE = MFER; else if (!memcmp(Header1,"@ MFR ",6)) hdr->TYPE = MFER; else if (!memcmp(Header1,"MATLAB 5.0 MAT-file, ",7) && !memcmp(Header1+10," MAT-file, ",11) ) { hdr->TYPE = Matlab; hdr->VERSION = (Header1[7]-'0') + (Header1[9]-'0')/10.0; } else if (!memcmp(Header1,"%%MatrixMarket",14)) hdr->TYPE = MM; /* else if (!memcmp(Header1,"MThd\000\000\000\001\000",9)) hdr->TYPE = MIDI; */ else if (!memcmp(Header1,"\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x03\x00\xFE\xFF\x09\x00\x06",0x21)) hdr->TYPE = MSI; else if (!strcmp(Header1,"(*This is a Mathematica binary dump file. It can be loaded with Get.*)")) hdr->TYPE = MX; else if ( (hdr->HeadLen>346) && (Header1[344]=='n') && (Header1[347]=='\0') && \ ((Header1[345]=='i') || (Header1[345]=='+') ) && \ (Header1[346]>'0') && (Header1[346]<='9') ) { hdr->TYPE = NIFTI; hdr->VERSION = Header1[346]-'0'; } else if ( (hdr->HeadLen > 344) && (!memcmp(Header1+344,"ni1",4) || !memcmp(Header1+344,"n+1",4) ) ) hdr->TYPE = NIFTI; else if (!memcmp(Header1,"NEURALEV",8) || !memcmp(Header1,"N.EV.",6) ) hdr->TYPE = NEV; else if (!memcmp(Header1,"NEX1",3)) hdr->TYPE = NEX1; else if ( (hdr->HeadLen > 31) && !memcmp(Header1,"Logging Start\x0aLogger SW Version: ",31)) hdr->TYPE = NeuroLoggerHEX; else if (!memcmp(Header1,"Neuron",6)) hdr->TYPE = NEURON; else if (!memcmp(Header1,"\x93NUMPY",6)) { hdr->TYPE = NUMPY; } else if (!memcmp(Header1,"[FileInfo]",10)) hdr->TYPE = Persyst; else if (!memcmp(Header1,"SXDF",4)) hdr->TYPE = OpenXDF; else if (!memcmp(Header1,"PLEX",4)) { hdr->TYPE = PLEXON; hdr->VERSION=1.0; } else if (!memcmp(Header1+10,"PLEXON",6)) { hdr->TYPE = PLEXON; hdr->VERSION=2.0; } else if (!memcmp(Header1,"\x02\x27\x91\xC6",4)) { hdr->TYPE = RHD2000; // Intan RHD2000 format hdr->FILE.LittleEndian = 1; } else if (!memcmp(Header1,"\x55\xAA\x00\xb0",2)) { hdr->TYPE = RDF; // UCSD ERPSS aquisition system hdr->FILE.LittleEndian = 1; } else if (!memcmp(Header1,"\xAA\x55\xb0\x00",2)) { hdr->TYPE = RDF; // UCSD ERPSS aquisition system hdr->FILE.LittleEndian = 0; } else if (!memcmp(Header1,"RIFF",4)) { hdr->TYPE = RIFF; if (!memcmp(Header1+8,"WAVE",4)) hdr->TYPE = WAV; if (!memcmp(Header1+8,"AIF",3)) hdr->TYPE = AIFF; if (!memcmp(Header1+8,"AVI ",4)) hdr->TYPE = AVI; } // general SCP else if ( (hdr->HeadLen>32) && ( MAGIC_EN1064_Section0Length > 120) && ( MAGIC_EN1064_Section0Length < 250) && ((MAGIC_EN1064_Section0Length%10)== 6) && (*(uint16_t*)(hdr->AS.Header+ 8) == 0x0000) && (leu32p(hdr->AS.Header+10) == leu32p(hdr->AS.Header+24)) && ( (!memcmp(hdr->AS.Header+16,"SCPECG\0\0",8)) || (*(uint64_t*)(hdr->AS.Header+16) == 0) ) && (leu32p(hdr->AS.Header+28) == (uint32_t)0x00000007) && (leu16p(hdr->AS.Header+32) == (uint16_t)0x0001) ) { hdr->TYPE = SCP_ECG; } /* // special SCP files - header is strange, files can be decoded else if ( (leu32p(hdr->AS.Header+10) == 136) && (*(uint16_t*)(hdr->AS.Header+ 8) == 0x0000) && ( (!memcmp(hdr->AS.Header+14,"\x0A\x01\x25\x01\x99\x01\xE7\x49\0\0",10)) || (!memcmp(hdr->AS.Header+14,"\x0A\x00\x90\x80\0\0\x78\x80\0\0",10)) || (!memcmp(hdr->AS.Header+14,"\x0A\xCD\xCD\xCD\xCD\xCD\xCD\xCD\0\0",10)) ) && (leu32p(hdr->AS.Header+24) == 136) && (leu32p(hdr->AS.Header+28) == 0x0007) && (leu16p(hdr->AS.Header+32) == 0x0001) ) { hdr->TYPE = SCP_ECG; hdr->VERSION = -2; } else if ( (leu32p(hdr->AS.Header+10) == 136) && (*(uint16_t*)(hdr->AS.Header+ 8) == 0x0000) && (*(uint8_t*) (hdr->AS.Header+14) == 0x0A) && (*(uint8_t*) (hdr->AS.Header+15) == 0x0B) && (*(uint32_t*)(hdr->AS.Header+16) == 0) && (*(uint32_t*)(hdr->AS.Header+20) == 0) && (*(uint32_t*)(hdr->AS.Header+24) == 0) && (*(uint32_t*)(hdr->AS.Header+28) == 0) && (leu16p(hdr->AS.Header+32) == 0x0001) ) { hdr->TYPE = SCP_ECG; hdr->VERSION = -3; } */ /* // special SCP files - header is strange, files cannot be decoded else if ( (leu32p(hdr->AS.Header+10) == 136) && (*(uint16_t*)(hdr->AS.Header+ 8) == 0x0000) && (leu16p(hdr->AS.Header+14) == 0x0b0b) && (!memcmp(hdr->AS.Header+16,"x06SCPECG",7)) ) { hdr->TYPE = SCP_ECG; hdr->VERSION = -1; } else if ( (leu32p(hdr->AS.Header+10) == 136) && (*(uint16_t*)(hdr->AS.Header+ 8) == 0x0000) && (leu16p(hdr->AS.Header+14) == 0x0d0d) && (!memcmp(hdr->AS.Header+16,"SCPEGC\0\0",8)) && (leu32p(hdr->AS.Header+24) == 136) && (leu32p(hdr->AS.Header+28) == 0x0007) && (leu16p(hdr->AS.Header+32) == 0x0001) ) { hdr->TYPE = SCP_ECG; hdr->VERSION = -4; } */ else if ((hdr->HeadLen > 78) && !memcmp(Header1,"HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000",78)) hdr->TYPE = SASXPT; // SAS Transport file format (XPORT) else if (!memcmp(Header1,"$FL2@(#) SPSS DATA FILE",8)) { hdr->TYPE = SPSS; // SPSS file format switch (*(uint32_t*)(Header1+64)) { case 0x00000002: case 0x00000003: hdr->FILE.LittleEndian = 1; break; case 0x02000000: case 0x03000000: hdr->FILE.LittleEndian = 0; break; } } else if ((Header1[0]==0x71 || Header1[0]==0x72) && (Header1[1]==1 || Header1[1]==2) && Header1[2]==1 && Header1[3]==0 ) hdr->TYPE = STATA; else if (!memcmp(Header1,"IAvSFo",6)) hdr->TYPE = SIGIF; else if ((hdr->HeadLen>23) && !memcmp(Header1,"SQLite format 3\000",16) && Header1[21]==64 && Header1[22]==32 && Header1[23]==32 ) hdr->TYPE = SQLite; else if ((hdr->HeadLen>23) && !memcmp(Header1,"\"Snap-Master Data File\"",24)) hdr->TYPE = SMA; else if (!memcmp(Header1,".snd",5)) hdr->TYPE = SND; else if (!memcmp(Header1,".snd",5)) hdr->TYPE = SND; else if (!memcmp(Header1,"\x54\x44\x53\x6d",4)) hdr->TYPE = TDMS; // http://www.ni.com/white-paper/5696/en else if ((hdr->HeadLen>30) && !memcmp(Header1,"POLY SAMPLE FILEversion ",24) && !memcmp(Header1+28, "\x0d\x0a\x1a",3)) hdr->TYPE = TMS32; else if ((hdr->HeadLen>35) && !memcmp(Header1,"FileId=TMSi PortiLab sample log file\x0a\x0dVersion=",35)) hdr->TYPE = TMSiLOG; else if (!memcmp(Header1,MAGIC_NUMBER_TIFF_l32,4)) hdr->TYPE = TIFF; else if (!memcmp(Header1,MAGIC_NUMBER_TIFF_b32,4)) hdr->TYPE = TIFF; else if (!memcmp(Header1,MAGIC_NUMBER_TIFF_l64,8)) hdr->TYPE = TIFF; else if (!memcmp(Header1,MAGIC_NUMBER_TIFF_b64,8)) hdr->TYPE = TIFF; else if (!memcmp(Header1,"#VRML",5)) hdr->TYPE = VRML; else if ((hdr->HeadLen > 17) && !memcmp(hdr->AS.Header+4,MAGIC_NUMBER_UNIPRO,14)) hdr->TYPE = UNIPRO; else if (!memcmp(Header1,MAGIC_NUMBER_SYNERGY,sizeof(MAGIC_NUMBER_SYNERGY)) && !strncmp(Header1+63,"CRawDataElement",15) && !strncmp(Header1+85,"CRawDataBuffer",14) ) { hdr->TYPE = SYNERGY; } else if ((hdr->HeadLen > 23) && !memcmp(Header1,"# vtk DataFile Version ",23)) { hdr->TYPE = VTK; char tmp[4]; tmp[3]=0; memcpy(tmp,(char*)Header1+23,3); hdr->VERSION = strtod(tmp,NULL); } else if (!strncmp(Header1,"Serial number",13)) hdr->TYPE = ASCII_IBI; else if (!memcmp(Header1,"VER=9\r\nCTIME=",13)) hdr->TYPE = WCP; else if (!memcmp(Header1,"\xAF\xFE\xDA\xDA",4) || !memcmp(Header1,"\xDA\xDA\xFE\xAF",4) || !memcmp(Header1,"\x55\x55\xFE\xAF",4) ) hdr->TYPE = WG1; // Walter Graphtek else if (!memcmp(Header1,MAGIC_NUMBER_Z,3)) hdr->TYPE = Z; else if (!strncmp(Header1,"PK\003\004",4)) hdr->TYPE = ZIP; else if (!strncmp(Header1,"PK\005\006",4)) hdr->TYPE = ZIP; else if (!strncmp(Header1,"!\n",8)) hdr->TYPE = MSVCLIB; else if (!strncmp(Header1,"ZIP2",4)) hdr->TYPE = ZIP2; else if ((hdr->HeadLen>13) && !memcmp(Header1,"TYPE = HL7aECG; else if ( (leu32p(hdr->AS.Header) & 0x00FFFFFFL) == 0x00BFBBEFL && !memcmp(Header1+3,"TYPE = HL7aECG; // UTF8 else if (leu16p(hdr->AS.Header)==0xFFFE) { hdr->TYPE = XML; // UTF16 BigEndian hdr->FILE.LittleEndian = 0; } else if (leu16p(hdr->AS.Header)==0xFEFF) { hdr->TYPE = XML; // UTF16 LittleEndian hdr->FILE.LittleEndian = 1; } else if ((hdr->HeadLen>40) && !memcmp(hdr->AS.Header,"V3.0 ",16) && !memcmp(hdr->AS.Header+32,"[PatInfo]",9)) { hdr->TYPE = Sigma; hdr->VERSION = 3.0; } else if ((hdr->HeadLen > 175) && (hdr->AS.Header[175] < 5)) { hdr->TYPE = TRC; // Micromed *.TRC format hdr->FILE.LittleEndian = 1; } else if (!memcmp(hdr->AS.Header,"\x4c\x00\x00\x00\x01\x14\x02\x00\x00\x00\x00\x00\xC0\x00\x00\x00\x00\x00\x46",20)) { hdr->TYPE = MS_LNK; // Microsoft *.LNK format hdr->FILE.LittleEndian = 1; } else if ((hdr->HeadLen > 175) && (hdr->AS.Header[175] < 5)) { hdr->TYPE = TRC; // Micromed *.TRC format hdr->FILE.LittleEndian = 1; } else { // if the first 4 bytes represent the file length struct stat FileBuf; if (stat(hdr->FileName,&FileBuf)==0 && (leu32p(hdr->AS.Header+2)==FileBuf.st_size) && (leu16p(hdr->AS.Header)==0) ) { // Cardioview 3000 generates such SCP files hdr->TYPE = SCP_ECG; hdr->FILE.LittleEndian = 1; fprintf(stderr,"Warning SOPEN (SCP): this kind of an SCP file predates the official SCP (EN1064) standard and is not fully implemented.\n" ); if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i): %i %s %s \n",__FILE__,__LINE__,hdr->TYPE,GetFileTypeString(hdr->TYPE),hdr->FileName); } if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i): 0x%x 0x%x \n",__FILE__,__LINE__,leu32p(hdr->AS.Header),(int)FileBuf.st_size); } #endif //ONLYGDF if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i): %i %s %s \n",__FILE__,__LINE__,hdr->TYPE,GetFileTypeString(hdr->TYPE),hdr->FileName); return(hdr); } const struct FileFormatStringTable_t FileFormatStringTable[] = { { unknown, "unknown" }, { alpha, "alpha" }, { ABF, "ABF" }, { ABF2, "ABF2" }, { ACQ, "ACQ" }, { ACR_NEMA, "ACR_NEMA" }, { AINF, "AINF" }, { AIFC, "AIFC" }, { AIFF, "AIFF" }, { ARFF, "ARFF" }, { ASCII, "ASCII" }, { ATES, "ATES" }, { ATF, "ATF" }, { AU, "AU" }, { AXG, "AXG" }, { Axona, "Axona" }, { BCI2000, "BCI2000" }, { BDF, "BDF" }, { BESA, "BESA" }, { BIN, "BINARY" }, { BKR, "BKR" }, { BLSC, "BLSC" }, { BMP, "BMP" }, { BNI, "BNI-1-Baltimore/Nicolet" }, { BrainVision, "BrainVision" }, { BrainVisionVAmp, "BrainVision" }, { BrainVisionMarker, "BrainVision" }, { BZ2, "BZ2" }, { CDF, "CDF" }, { CFS, "CFS" }, { CFWB, "CFWB" }, { CNT, "CNT" }, { CTF, "CTF" }, { DEMG, "DEMG" }, { DICOM, "DICOM" }, { EBS, "EBS" }, { EDF, "EDF" }, { EEG1100, "EEG1100" }, { EEProbe, "EEProbe" }, { EGI, "EGI" }, { EGIS, "EGIS" }, { ELF, "ELF" }, { EMBLA, "EMBLA" }, { EMSA, "EMSA" }, { ePrime, "ePrime" }, { ET_MEG, "ET-MEG" }, { ETG4000, "ETG4000" }, { EVENT, "EVENT" }, { EXIF, "EXIF" }, { FAMOS, "FAMOS" }, { FEF, "FEF" }, { FIFF, "FIFF" }, { FITS, "FITS" }, { FLAC, "FLAC" }, { GDF, "GDF" }, { GIF, "GIF" }, { GTF, "GTF" }, { GZIP, "GZIP" }, { HDF, "HDF" }, { HEKA, "HEKA" }, { HL7aECG, "HL7aECG" }, { IBW, "IBW" }, { ITX, "ITX" }, { ISHNE, "ISHNE" }, { JPEG, "JPEG" }, { JSON, "JSON" }, { Matlab, "MAT" }, { MFER, "MFER" }, { MIDI, "MIDI" }, { MIT, "MIT" }, { MM, "MatrixMarket" }, { MSI, "MSI" }, { MS_LNK, ".LNK" }, { MSVCLIB, "MS VC++ Library" }, { MX, "Mathematica serialized package format" }, { native, "native" }, { NeuroLoggerHEX, "NeuroLoggerHEX"}, { NetCDF, "NetCDF" }, { NEV, "NEV" }, { NEX1, "NEX" }, { NIFTI, "NIFTI" }, { NEURON, "NEURON" }, { NUMPY, "NUMPY" }, { Persyst, "Persyst" }, { OGG, "OGG" }, { PDP, "PDP" }, { PLEXON, "PLEXON" }, { RDF, "RDF" }, { RHD2000, "RHD2000" }, { RIFF, "RIFF" }, { SASXPT, "SAS_XPORT" }, { SCP_ECG, "SCP" }, { SIGIF, "SIGIF" }, { Sigma, "Sigma" }, { SMA, "SMA" }, { SMR, "SON/SMR" }, { SND, "SND" }, { SPSS, "SPSS" }, { SQLite, "SQLite" }, { STATA, "STATA" }, { SVG, "SVG" }, { SYNERGY, "SYNERGY"}, { TDMS, "TDMS (NI)" }, { TIFF, "TIFF" }, { TMS32, "TMS32" }, { TMSiLOG, "TMSiLOG" }, { TRC, "TRC" }, { UNIPRO, "UNIPRO" }, { VRML, "VRML" }, { VTK, "VTK" }, { WAV, "WAV" }, { WCP, "WCP" }, { WG1, "Walter Graphtek" }, { WMF, "WMF" }, { XML, "XML" }, { ZIP, "ZIP" }, { ZIP2, "ZIP2" }, { Z, "Z" }, { noFile, NULL } } ; /* ------------------------------------------ * returns string of file type * ------------------------------------------- */ const char* GetFileTypeString(enum FileFormat FMT) { uint16_t k; for (k=0; ; k++) { if (FMT==FileFormatStringTable[k].fmt) return (FileFormatStringTable[k].FileTypeString); if (noFile==FileFormatStringTable[k].fmt) // stopping criteria: last element in FileFormatStringTable return (NULL); } } /* ------------------------------------------ * returns file type from type string * ------------------------------------------- */ enum FileFormat GetFileTypeFromString(const char *FileTypeString) { uint16_t k; for (k=0; ; k++) { if (FileFormatStringTable[k].FileTypeString == NULL) // stopping criteria: last element in FileFormatStringTable return (noFile); if (!strcmp(FileFormatStringTable[k].FileTypeString, FileTypeString)) return (FileFormatStringTable[k].fmt); } } /****************************************************************************/ /** struct2gdfbin **/ /****************************************************************************/ void struct2gdfbin(HDRTYPE *hdr) { size_t k; char tmp[81]; uint32_t Dur[2]; // NS number of channels selected for writing typeof(hdr->NS) NS = 0; for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (hc->OnOff) NS++; hc->Cal = (hc->PhysMax-hc->PhysMin)/(hc->DigMax-hc->DigMin); hc->Off = hc->PhysMin-hc->Cal*hc->DigMin; } hdr->HeadLen = (NS+1)*256; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %p\n", __func__, __LINE__, hdr->HeadLen, hdr->EVENT.LenCodeDesc, hdr->EVENT.CodeDesc); /****** * The size of Header 3 is computed by going through all TLV triples, * and compute HeadLen to allocate sufficient amount of memory * Header 3 is filled later in a 2nd scan below ******/ /* writing header 3, in Tag-Length-Value from */ uint32_t TagNLen[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; uint8_t tag=1; if (hdr->EVENT.LenCodeDesc > 1) { // first entry is always empty - no need to save tag1 for (k=0; kEVENT.LenCodeDesc; k++) TagNLen[tag] += strlen(hdr->EVENT.CodeDesc[k])+1; TagNLen[tag] += 1; // acounts for terminating \0 hdr->HeadLen += 4+TagNLen[tag]; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 2; if (hdr->AS.bci2000 != NULL) { TagNLen[tag] = strlen(hdr->AS.bci2000)+1; hdr->HeadLen += 4+TagNLen[tag]; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 3; if ((hdr->ID.Manufacturer.Name != NULL) || (hdr->ID.Manufacturer.Model != NULL) || (hdr->ID.Manufacturer.Version != NULL) || (hdr->ID.Manufacturer.SerialNumber != NULL)) { if (hdr->ID.Manufacturer.Name == NULL) hdr->ID.Manufacturer.Name=""; if (hdr->ID.Manufacturer.Model == NULL) hdr->ID.Manufacturer.Model=""; if (hdr->ID.Manufacturer.Version == NULL) hdr->ID.Manufacturer.Version=""; if (hdr->ID.Manufacturer.SerialNumber == NULL) hdr->ID.Manufacturer.SerialNumber=""; TagNLen[tag] = strlen(hdr->ID.Manufacturer.Name)+strlen(hdr->ID.Manufacturer.Model)+strlen(hdr->ID.Manufacturer.Version)+strlen(hdr->ID.Manufacturer.SerialNumber)+4; hdr->HeadLen += 4+TagNLen[tag]; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 4; /* OBSOLETE char FLAG_SENSOR_ORIENTATION = 0; for (k=0; kNS; k++) { FLAG_SENSOR_ORIENTATION |= hdr->CHANNEL[k].Orientation[0] != (float)0.0; FLAG_SENSOR_ORIENTATION |= hdr->CHANNEL[k].Orientation[1] != (float)0.0; FLAG_SENSOR_ORIENTATION |= hdr->CHANNEL[k].Orientation[2] != (float)0.0; FLAG_SENSOR_ORIENTATION |= hdr->CHANNEL[k].Area != (float)0.0; } if (FLAG_SENSOR_ORIENTATION) TagNLen[tag] = hdr->NS*sizeof(float)*4; hdr->HeadLen += 4+TagNLen[tag]; */ if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 5; for (k=0; k<16; k++) { if (hdr->IPaddr[k]) { if (k<4) TagNLen[tag] = 4; else TagNLen[tag] = 16; } hdr->HeadLen += 4+TagNLen[tag]; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 6; TagNLen[tag] = hdr->ID.Technician==NULL ? 0 : strlen(hdr->ID.Technician); if (TagNLen[tag]) { TagNLen[tag]++; hdr->HeadLen += 4+TagNLen[tag]; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 7; if (hdr->ID.Hospital!=NULL) { TagNLen[tag] = strlen(hdr->ID.Hospital); if (TagNLen[tag]) { TagNLen[tag]++; hdr->HeadLen += 4+TagNLen[tag]; } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); #if (BIOSIG_VERSION >= 10500) tag = 9; if (hdr->SCP.Section7 != NULL) { TagNLen[tag] = hdr->SCP.Section7Length; // leu32p(hdr->SCP.Section7+4); if (TagNLen[tag]) { hdr->HeadLen += 4+TagNLen[tag]; } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 10; if (hdr->SCP.Section8 != NULL) { TagNLen[tag] = hdr->SCP.Section8Length; // leu32p(hdr->SCP.Section8+4); if (TagNLen[tag]) { hdr->HeadLen += 4+TagNLen[tag]; } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 11; if (hdr->SCP.Section9 != NULL) { TagNLen[tag] = hdr->SCP.Section9Length; // leu32p(hdr->SCP.Section9+4); if (TagNLen[tag]) { hdr->HeadLen += 4+TagNLen[tag]; } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 12; if (hdr->SCP.Section10 != NULL) { TagNLen[tag] = hdr->SCP.Section10Length; // leu32p(hdr->SCP.Section10+4); if (TagNLen[tag]) { hdr->HeadLen += 4+TagNLen[tag]; } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); tag = 13; if (hdr->SCP.Section11 != NULL) { TagNLen[tag] = hdr->SCP.Section11Length; // leu32p(hdr->SCP.Section11+4); if (TagNLen[tag]) { hdr->HeadLen += 4+TagNLen[tag]; } } #endif if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); /* end */ if (hdr->TYPE==GDF) { if (0.0 < hdr->VERSION && hdr->VERSION < 1.9) { hdr->VERSION = 1.25; } else if (hdr->VERSION < 3.0) { // this is currently still the default version #if (BIOSIG_VERSION >= 10500) hdr->VERSION = 2.51; #else hdr->VERSION = 2.22; #endif } else { hdr->VERSION = 3.0; } // in case of GDF v2, make HeadLen a multiple of 256. if ((hdr->VERSION > 2.0) && (hdr->HeadLen & 0x00ff)) hdr->HeadLen = (hdr->HeadLen & 0xff00) + 256; } else if (hdr->TYPE==GDF1) { fprintf(stderr,"libbiosig@sopen(hdr,\"w\") with hdr->TYPE=GDF1 is deprecated. Use hdr->TYPE=GDF and hdr->VERSION=1.25 instead\n"); hdr->VERSION = 1.25; hdr->TYPE = GDF; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, 1, hdr->HeadLen, TagNLen[1]); hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header, hdr->HeadLen); if (hdr->AS.Header == NULL) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Memory allocation failed"); return; } sprintf((char*)hdr->AS.Header,"GDF %4.2f",hdr->VERSION); uint8_t* Header2 = hdr->AS.Header+256; uint16_t maxlen = 66; if (hdr->VERSION < 1.90) maxlen = 80; size_t l1 = (hdr->Patient.Id==NULL) ? 0 : strlen(hdr->Patient.Id); size_t l2 = (hdr->Patient.Name==NULL) ? 0 : strlen(hdr->Patient.Name); if (0 < l1 && l1 < maxlen) { for (k=0; hdr->Patient.Id[k]; k++) if (isspace(hdr->Patient.Id[k])) hdr->Patient.Id[k] = '_'; strncpy(Header1+8, hdr->Patient.Id, l1+1); } else { strncpy(Header1+8, "X X",4); l1 = 1; } if (!hdr->FLAG.ANONYMOUS && (0 < l2) && (l1+l2+1 < maxlen) ) { Header1[8+l1] = ' '; strcpy(Header1+8+1+l1, hdr->Patient.Name); /* Flawfinder: ignore *** length is already checked with l1+l2+1 */ } else if (l1+3 < maxlen) strcpy(Header1+8+l1, " X"); if (hdr->VERSION>1.90) { Header1[84] = (hdr->Patient.Smoking%4) + ((hdr->Patient.AlcoholAbuse%4)<<2) + ((hdr->Patient.DrugAbuse%4)<<4) + ((hdr->Patient.Medication%4)<<6); Header1[85] = hdr->Patient.Weight; Header1[86] = hdr->Patient.Height; Header1[87] = (hdr->Patient.Sex%4) + ((hdr->Patient.Handedness%4)<<2) + ((hdr->Patient.Impairment.Visual%4)<<4) + ((hdr->Patient.Impairment.Heart%4)<<6); } size_t len = strlen(hdr->ID.Recording); memcpy(Header1+88, hdr->ID.Recording, min(len,80)); Header1[88 + min(len,80)] = 0; if (hdr->VERSION>1.90) { memcpy(Header1+152, &hdr->LOC, 16); #if __BYTE_ORDER == __BIG_ENDIAN *(uint32_t*) (Header1+152) = htole32( *(uint32_t*) (Header1+152) ); *(uint32_t*) (Header1+156) = htole32( *(uint32_t*) (Header1+156) ); *(uint32_t*) (Header1+160) = htole32( *(uint32_t*) (Header1+160) ); *(uint32_t*) (Header1+164) = htole32( *(uint32_t*) (Header1+164) ); #endif } if (hdr->VERSION<1.90) { struct tm *t = gdf_time2tm_time(hdr->T0); sprintf(tmp,"%04i%02i%02i%02i%02i%02i00",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); memcpy(hdr->AS.Header+168,tmp,max(strlen(tmp),16)); leu32a(hdr->HeadLen, hdr->AS.Header+184); memcpy(Header1+192, &hdr->ID.Equipment, 8); // FIXME: 200: LabId, 208 TechId, 216, Serial No // } else { //memcpy(Header1+168, &hdr->T0, 8); leu64a(hdr->T0, hdr->AS.Header+168); //memcpy(Header1+176, &hdr->Patient.Birthday, 8); leu64a(hdr->Patient.Birthday, hdr->AS.Header+176); // *(uint16_t*)(Header1+184) = (hdr->HeadLen>>8)+(hdr->HeadLen%256>0); leu32a(hdr->HeadLen>>8, hdr->AS.Header+184); memcpy(hdr->AS.Header+192, &hdr->ID.Equipment, 8); memcpy(hdr->AS.Header+200, &hdr->IPaddr, 6); memcpy(hdr->AS.Header+206, &hdr->Patient.Headsize, 6); lef32a(hdr->ELEC.REF[0], hdr->AS.Header+212); lef32a(hdr->ELEC.REF[1], hdr->AS.Header+216); lef32a(hdr->ELEC.REF[2], hdr->AS.Header+220); lef32a(hdr->ELEC.GND[0], hdr->AS.Header+224); lef32a(hdr->ELEC.GND[1], hdr->AS.Header+228); lef32a(hdr->ELEC.GND[2], hdr->AS.Header+232); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %x\n", __func__, __LINE__, hdr->HeadLen,leu32p(hdr->AS.Header+184)); leu64a(hdr->NRec, hdr->AS.Header+236); /* FIXME: this part should make the records as small as possible size_t DIV = 1, div; for (k=0; kNS; k++) { div = hdr->SPR/hdr->CHANNEL[k].SPR; if (div>DIV) DIV=div; } for (k=0; kNS; k++) { hdr->CHANNEL[k].SPR = (hdr->CHANNEL[k].SPR*DIV)/hdr->SPR; } hdr->NRec *= hdr->SPR/DIV; hdr->SPR = DIV; */ double fDur = hdr->SPR/hdr->SampleRate; if (hdr->NS==0 && 0.0 < hdr->EVENT.SampleRate && hdr->EVENT.SampleRate < INFINITY) fDur = 1.0 / hdr->EVENT.SampleRate; if (hdr->VERSION < 2.21) { /* Duration is expressed as an fraction of integers */ double dtmp1, dtmp2; dtmp2 = modf(fDur, &dtmp1); // approximate real with rational number if (fabs(dtmp2) < DBL_EPSILON) { Dur[0] = lround(fDur); Dur[1] = 1; } else { Dur[1] = lround(1.0 / dtmp2 ); Dur[0] = lround(1.0 + dtmp1 * Dur[1]); } leu32a(Dur[0], hdr->AS.Header+244); leu32a(Dur[1], hdr->AS.Header+248); } else lef64a(fDur, hdr->AS.Header+244); leu16a(NS, hdr->AS.Header + 252); if (hdr->VERSION > 2.4) { lei16a(hdr->tzmin, hdr->AS.Header+254); } /* define HDR.Header2 this requires checking the arguments in the fields of the struct HDR.CHANNEL and filling in the bytes in HDR.Header2. */ typeof(k) k2=0; for (k=0; kNS; k++) if (hdr->CHANNEL[k].OnOff) { const char *tmpstr; if (hdr->CHANNEL[k].LeadIdCode) tmpstr = LEAD_ID_TABLE[hdr->CHANNEL[k].LeadIdCode]; else tmpstr = hdr->CHANNEL[k].Label; len = strlen(tmpstr)+1; memcpy(Header2+16*k2,tmpstr,min(len,16)); Header2[16*k2+min(len,16)] = 0; len = strlen(hdr->CHANNEL[k].Transducer); memcpy(Header2+80*k2 + 16*NS, hdr->CHANNEL[k].Transducer, min(len,80)); Header2[80*k2 + min(len,80) + 16*NS] = 0; tmpstr = PhysDim3(hdr->CHANNEL[k].PhysDimCode); len = strlen(tmpstr)+1; if (hdr->VERSION < 1.9) memcpy(Header2+ 8*k2 + 96*NS, tmpstr, min(8,len)); else { memcpy(Header2+ 6*k2 + 96*NS, tmpstr, min(6,len)); leu16a(hdr->CHANNEL[k].PhysDimCode, Header2+ 2*k2 + 102*NS); }; lef64a(hdr->CHANNEL[k].PhysMin, Header2 + 8*k2 + 104*NS); lef64a(hdr->CHANNEL[k].PhysMax, Header2 + 8*k2 + 112*NS); if (hdr->VERSION < 1.9) { lei64a((int64_t)hdr->CHANNEL[k].DigMin, Header2 + 8*k2 + 120*NS); lei64a((int64_t)hdr->CHANNEL[k].DigMax, Header2 + 8*k2 + 128*NS); // FIXME // memcpy(Header2 + 80*k + 136*hdr->NS,hdr->CHANNEL[k].PreFilt,max(80,strlen(hdr->CHANNEL[k].PreFilt))); } else { lef64a(hdr->CHANNEL[k].DigMin, Header2 + 8*k2 + 120*NS); lef64a(hdr->CHANNEL[k].DigMax, Header2 + 8*k2 + 128*NS); if (hdr->VERSION >= 2.22) lef32a(hdr->CHANNEL[k].TOffset, Header2 + 4*k2 + 200*NS); // GDF222 lef32a(hdr->CHANNEL[k].LowPass, Header2 + 4*k2 + 204*NS); lef32a(hdr->CHANNEL[k].HighPass, Header2 + 4*k2 + 208*NS); lef32a(hdr->CHANNEL[k].Notch, Header2 + 4*k2 + 212*NS); lef32a(hdr->CHANNEL[k].XYZ[0], Header2 + 4*k2 + 224*NS); lef32a(hdr->CHANNEL[k].XYZ[1], Header2 + 4*k2 + 228*NS); lef32a(hdr->CHANNEL[k].XYZ[2], Header2 + 4*k2 + 232*NS); if (hdr->VERSION < (float)2.19) Header2[k2+236*NS] = (uint8_t)ceil(log10(min(39e8,hdr->CHANNEL[k].Impedance))/log10(2.0)*8.0-0.5); else switch (hdr->CHANNEL[k].PhysDimCode & 0xFFE0) { // context-specific header 2 area case 4256: lef32a((float)hdr->CHANNEL[k].Impedance, Header2+236*NS+20*k2); break; case 4288: lef32a((float)hdr->CHANNEL[k].fZ, Header2+236*NS+20*k2); break; // default: // reserved area } } leu32a(hdr->CHANNEL[k].SPR, Header2 + 4*k2 + 216*NS); leu32a(hdr->CHANNEL[k].GDFTYP, Header2 + 4*k2 + 220*NS); k2++; } if (errno==34) errno = 0; // reset numerical overflow error if (VERBOSE_LEVEL>7) fprintf(stdout,"GDFw 444 %i %s\n", errno, strerror(errno)); /***** * This is the 2nd scan of Header3 - memory is allocated, now H3 is filled in with content *****/ Header2 = hdr->AS.Header+(NS+1)*256; tag = 1; if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=1 & Length of Tag 1 size_t pos = 4; for (k=0; kEVENT.LenCodeDesc; k++) { strcpy((char*)(Header2+pos),hdr->EVENT.CodeDesc[k]); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ pos += strlen(hdr->EVENT.CodeDesc[k])+1; } Header2[pos]=0; // terminating NULL Header2 += pos+1; } tag = 2; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=2 & Length of Tag 2 strcpy((char*)(Header2+4),hdr->AS.bci2000); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ Header2 += 4+TagNLen[tag]; } tag = 3; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=3 & Length of Tag 3 if (VERBOSE_LEVEL>8) fprintf(stdout,"SOPEN(GDF)w: tag=%i,len=%i\n",tag,TagNLen[tag]); memset(Header2+4,0,TagNLen[tag]); size_t len = 0; strcpy((char*)(Header2+4), hdr->ID.Manufacturer.Name); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ if (hdr->ID.Manufacturer.Name != NULL) len += strlen(hdr->ID.Manufacturer.Name); strcpy((char*)(Header2+5+len), hdr->ID.Manufacturer.Model); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ if (hdr->ID.Manufacturer.Model != NULL) len += strlen(hdr->ID.Manufacturer.Model); strcpy((char*)(Header2+6+len), hdr->ID.Manufacturer.Version); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ if (hdr->ID.Manufacturer.Version != NULL) len += strlen(hdr->ID.Manufacturer.Version); strcpy((char*)(Header2+7+len), hdr->ID.Manufacturer.SerialNumber); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ if (hdr->ID.Manufacturer.SerialNumber != NULL) len += strlen(hdr->ID.Manufacturer.SerialNumber); Header2 += 4+TagNLen[tag]; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); /* tag = 4; if (TagNLen[tag]>0) { *(uint32_t*)(Header2) = htole32(tag + (TagNLen[tag]<<8)); // Tag=4 & Length of Tag 4 Header2 += 4; for (k=0; kNS; k++) { *(uint32_t*)(Header2 + 4*k) = le32toh(*(uint32_t*)(hdr->CHANNEL[k].Orientation+0)); *(uint32_t*)(Header2 + 4*k + 4*hdr->NS) = le32toh(*(uint32_t*)(hdr->CHANNEL[k].Orientation+1)); *(uint32_t*)(Header2 + 4*k + 8*hdr->NS) = le32toh(*(uint32_t*)(hdr->CHANNEL[k].Orientation+2)); *(uint32_t*)(Header2 + 4*k +12*hdr->NS) = le32toh(*(uint32_t*)(&(hdr->CHANNEL[k].Area)); } Header2 += 4*sizeof(float)*hdr->NS; } */ tag = 5; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=5 & Length of Tag 5 memcpy(Header2+4,hdr->IPaddr,TagNLen[tag]); Header2 += 4+TagNLen[tag]; } tag = 6; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=6 & Length of Tag 6 strcpy((char*)(Header2+4),hdr->ID.Technician); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ Header2 += 4+TagNLen[tag]; } tag = 7; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=7 & Length of Tag 7 strcpy((char*)(Header2+4),hdr->ID.Hospital); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ Header2 += 4+TagNLen[tag]; } #if (BIOSIG_VERSION >= 10500) tag = 9; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=9 & Length of Tag 9 memcpy((char*)(Header2+4),hdr->SCP.Section7, TagNLen[tag]); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ Header2 += 4+TagNLen[tag]; } tag = 10; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=10 & Length of Tag 10 memcpy((char*)(Header2+4),hdr->SCP.Section8, TagNLen[tag]); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ Header2 += 4+TagNLen[tag]; } tag = 11; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=11 & Length of Tag 11 memcpy((char*)(Header2+4),hdr->SCP.Section9, TagNLen[tag]); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ Header2 += 4+TagNLen[tag]; } tag = 12; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=12 & Length of Tag 12 memcpy((char*)(Header2+4),hdr->SCP.Section10, TagNLen[tag]); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ Header2 += 4+TagNLen[tag]; } tag = 13; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i %i\n", __func__, __LINE__, tag, hdr->HeadLen, TagNLen[tag]); if (TagNLen[tag]>0) { leu32a(tag + (TagNLen[tag]<<8), Header2); // Tag=13 & Length of Tag 13 memcpy((char*)(Header2+4),hdr->SCP.Section11, TagNLen[tag]); /* Flawfinder: ignore *** memory is allocated after 1st H3 scan above */ Header2 += 4+TagNLen[tag]; } #endif while (Header2 < (hdr->AS.Header + hdr->HeadLen) ) { *Header2 = 0; Header2++; } if (VERBOSE_LEVEL>8) fprintf(stdout,"GDFw [339] %p %p\n", Header1,Header2); } /**************************************************************************** gdfbin2struct converts flat file into hdr structure ****************************************************************************/ int gdfbin2struct(HDRTYPE *hdr) { unsigned int k; char tmp[81]; double Dur; // char* ptr_str; struct tm tm_time; // time_t tt; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %p\n",__func__,__LINE__,hdr->AS.Header); if (!memcmp("GDF",(char*)(hdr->AS.Header+3),3)) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Only GDF is supported"); return (hdr->AS.B4C_ERRNUM); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) #%i \n",__func__,__LINE__, (int)hdr->NS); strncpy(tmp,(char*)(hdr->AS.Header+3),5); tmp[5]=0; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) #%i Ver=<%s>\n",__func__,__LINE__, (int)hdr->NS,tmp); hdr->VERSION = atof(tmp); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) #%i Ver=<%s>\n",__func__,__LINE__, (int)hdr->NS,tmp); hdr->NRec = lei64p(hdr->AS.Header+236); hdr->NS = leu16p(hdr->AS.Header+252); hdr->tzmin = (hdr->VERSION > 2.4) ? lei16p(hdr->AS.Header+254) : 0; if (hdr->VERSION < 2.21) Dur = (double)leu32p(hdr->AS.Header+244)/(double)leu32p(hdr->AS.Header+248); else Dur = lef64p(hdr->AS.Header+244); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) #%i Ver=%g\n",__func__,__LINE__, hdr->NS, hdr->VERSION); if (hdr->VERSION > 1.90) { hdr->HeadLen = leu16p(hdr->AS.Header+184)<<8; int len = min(66,MAX_LENGTH_PID); strncpy(hdr->Patient.Id,(const char*)hdr->AS.Header+8,len); hdr->Patient.Id[len]=0; len = min(64,MAX_LENGTH_RID); strncpy(hdr->ID.Recording,(const char*)hdr->AS.Header+88,len); hdr->ID.Recording[len]=0; strtok(hdr->Patient.Id," "); char *tmpptr = strtok(NULL," "); if ((!hdr->FLAG.ANONYMOUS) && (tmpptr != NULL)) { // strncpy(hdr->Patient.Name,tmpptr,Header1+8-tmpptr); strncpy(hdr->Patient.Name,tmpptr,MAX_LENGTH_NAME); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) FMT=%s Ver=%4.2f\n",__func__,__LINE__, GetFileTypeString(hdr->TYPE), hdr->VERSION); hdr->Patient.Smoking = Header1[84]%4; hdr->Patient.AlcoholAbuse = (Header1[84]>>2)%4; hdr->Patient.DrugAbuse = (Header1[84]>>4)%4; hdr->Patient.Medication = (Header1[84]>>6)%4; hdr->Patient.Weight = Header1[85]; hdr->Patient.Height = Header1[86]; hdr->Patient.Sex = Header1[87]%4; hdr->Patient.Handedness = (Header1[87]>>2)%4; hdr->Patient.Impairment.Visual = (Header1[87]>>4)%4; hdr->Patient.Impairment.Heart = (Header1[87]>>6)%4; #if __BYTE_ORDER == __BIG_ENDIAN *(uint32_t*)(hdr->AS.Header+156) = bswap_32(*(uint32_t*)(hdr->AS.Header+156)); *(uint32_t*)(hdr->AS.Header+160) = bswap_32(*(uint32_t*)(hdr->AS.Header+160)); *(uint32_t*)(hdr->AS.Header+164) = bswap_32(*(uint32_t*)(hdr->AS.Header+164)); #endif if (hdr->AS.Header[156]) { hdr->LOC[0] = 0x00292929; memcpy(&hdr->LOC[1], hdr->AS.Header+156, 12); } else { #if __BYTE_ORDER == __BIG_ENDIAN *(uint32_t*) (hdr->AS.Header+152) = bswap_32(*(uint32_t*)(hdr->AS.Header+152)); #endif memcpy(&hdr->LOC, hdr->AS.Header+152, 16); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) FMT=%s Ver=%4.2f\n",__func__,__LINE__, GetFileTypeString(hdr->TYPE), hdr->VERSION); hdr->T0 = lei64p(hdr->AS.Header+168); hdr->Patient.Birthday = lei64p(hdr->AS.Header+176); // memcpy(&hdr->T0, Header1+168,8); // memcpy(&hdr->Patient.Birthday, Header1+176, 8); hdr->ID.Equipment = lei64p(hdr->AS.Header+192); if (hdr->VERSION < (float)2.10) memcpy(hdr->IPaddr, Header1+200,4); hdr->Patient.Headsize[0]= leu16p(hdr->AS.Header+206); hdr->Patient.Headsize[1]= leu16p(hdr->AS.Header+208); hdr->Patient.Headsize[2]= leu16p(hdr->AS.Header+210); //memcpy(&hdr->ELEC.REF, Header1+212,12); //memcpy(&hdr->ELEC.GND, Header1+224,12); hdr->ELEC.REF[0] = lef32p(hdr->AS.Header+212); hdr->ELEC.REF[1] = lef32p(hdr->AS.Header+216); hdr->ELEC.REF[2] = lef32p(hdr->AS.Header+220); hdr->ELEC.GND[0] = lef32p(hdr->AS.Header+224); hdr->ELEC.GND[1] = lef32p(hdr->AS.Header+228); hdr->ELEC.GND[2] = lef32p(hdr->AS.Header+232); if (hdr->VERSION > 100000.0) { fprintf(stdout,"%e \nb4c %c %i %c. %c%c%c%c%c%c%c\n",hdr->VERSION,169,2007,65,83,99,104,108,246,103,108); FILE *fid = fopen("/tmp/b4c_tmp","wb"); if (fid != NULL) { fprintf(fid,"\nb4c %f \n%c %i %c.%c%c%c%c%c%c%c\n",hdr->VERSION,169,2007,65,83,99,104,108,246,103,108); fclose(fid); } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) FMT=%s Ver=%4.2f\n",__func__,__LINE__, GetFileTypeString(hdr->TYPE), hdr->VERSION); } else if (hdr->VERSION > 0.0) { strncpy(hdr->Patient.Id,Header1+8,min(80,MAX_LENGTH_PID)); hdr->Patient.Id[min(80,MAX_LENGTH_PID)] = 0; strncpy(hdr->ID.Recording,(const char*)Header1+88,min(80,MAX_LENGTH_RID)); hdr->ID.Recording[min(80,MAX_LENGTH_RID)] = 0; strtok(hdr->Patient.Id," "); char *tmpptr = strtok(NULL," "); if ((!hdr->FLAG.ANONYMOUS) && (tmpptr != NULL)) { // strncpy(hdr->Patient.Name,tmpptr,Header1+8-tmpptr); strncpy(hdr->Patient.Name,tmpptr,MAX_LENGTH_NAME); } memset(tmp,0,5); strncpy(tmp,Header1+168+12,2); tm_time.tm_sec = atoi(tmp); strncpy(tmp,Header1+168+10,2); tm_time.tm_min = atoi(tmp); strncpy(tmp,Header1+168+ 8,2); tm_time.tm_hour = atoi(tmp); strncpy(tmp,Header1+168+ 6,2); tm_time.tm_mday = atoi(tmp); strncpy(tmp,Header1+168+ 4,2); tm_time.tm_mon = atoi(tmp)-1; strncpy(tmp,Header1+168 ,4); tm_time.tm_year = atoi(tmp)-1900; tm_time.tm_isdst= -1; hdr->T0 = tm_time2gdf_time(&tm_time); hdr->HeadLen = leu64p(hdr->AS.Header+184); } else { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error SOPEN(GDF); invalid version number."); return (hdr->AS.B4C_ERRNUM); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) #%i Ver=%4.2f\n",__func__,__LINE__, hdr->NS, hdr->VERSION); if (hdr->HeadLen < (256u * (hdr->NS + 1u))) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "(GDF) Length of Header is too small"); return (hdr->AS.B4C_ERRNUM); } hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); uint8_t *Header2 = hdr->AS.Header+256; hdr->AS.bpb=0; size_t bpb8 = 0; for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) #%i/%i\n",__func__,__LINE__, k, hdr->NS); hc->LeadIdCode = 0; size_t len = min(16, MAX_LENGTH_LABEL); strncpy(hc->Label,(char*)Header2 + 16*k, len); hc->Label[len] = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"#%2i: <%s> %i %i\n",k,hc->Label,(int)len,(int)strlen(hc->Label)); len = min(MAX_LENGTH_TRANSDUCER, 80); memcpy(hc->Transducer, (char*)Header2 + 16*hdr->NS + 80*k, len); hc->Transducer[len] = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"[GDF 212] #=%i/%i %s\n",k,hdr->NS,hc->Label); hc->PhysMin = lef64p(Header2+ 8*k + 104*hdr->NS); hc->PhysMax = lef64p(Header2+ 8*k + 112*hdr->NS); hc->SPR = leu32p(Header2+ 4*k + 216*hdr->NS); hc->GDFTYP = leu16p(Header2+ 4*k + 220*hdr->NS); hc->OnOff = 1; hc->bi = bpb8>>3; hc->bi8 = bpb8; size_t nbits = (GDFTYP_BITS[hc->GDFTYP]*(size_t)hc->SPR); bpb8 += nbits; if (hdr->VERSION < 1.90) { char p[9]; strncpy(p, (char*)Header2 + 8*k + 96*hdr->NS,8); p[8] = 0; // remove trailing blanks int k1; for (k1=7; (k1>0) && isspace(p[k1]); p[k1--] = 0) {}; hc->PhysDimCode = PhysDimCode(p); hc->DigMin = (double) lei64p(Header2 + 8*k + 120*hdr->NS); hc->DigMax = (double) lei64p(Header2 + 8*k + 128*hdr->NS); char *PreFilt = (char*)(Header2+ 68*k + 136*hdr->NS); hc->LowPass = NAN; hc->HighPass = NAN; hc->Notch = NAN; hc->TOffset = NAN; float lf,hf; if (sscanf(PreFilt,"%f - %f Hz",&lf,&hf)==2) { hc->LowPass = hf; hc->HighPass = lf; } } else { hc->PhysDimCode = leu16p(Header2+ 2*k + 102*hdr->NS); hc->DigMin = lef64p(Header2+ 8*k + 120*hdr->NS); hc->DigMax = lef64p(Header2+ 8*k + 128*hdr->NS); hc->LowPass = lef32p(Header2+ 4*k + 204*hdr->NS); hc->HighPass = lef32p(Header2+ 4*k + 208*hdr->NS); hc->Notch = lef32p(Header2+ 4*k + 212*hdr->NS); hc->XYZ[0] = lef32p(Header2+ 4*k + 224*hdr->NS); hc->XYZ[1] = lef32p(Header2+ 4*k + 228*hdr->NS); hc->XYZ[2] = lef32p(Header2+ 4*k + 232*hdr->NS); // memcpy(&hc->XYZ,Header2 + 4*k + 224*hdr->NS,12); hc->Impedance= ldexp(1.0, (uint8_t)Header2[k + 236*hdr->NS]/8); if (hdr->VERSION < 2.22) hc->TOffset = NAN; else hc->TOffset = lef32p(Header2 + 4 * k + 200 * hdr->NS); if (hdr->VERSION < (float)2.19) hc->Impedance = ldexp(1.0, (uint8_t)Header2[k + 236*hdr->NS]/8); else switch(hdr->CHANNEL[k].PhysDimCode & 0xFFE0) { // context-specific header 2 area case 4256: hc->Impedance = *(float*)(Header2+236*hdr->NS+20*k); break; case 4288: hc->fZ = *(float*)(Header2+236*hdr->NS+20*k); break; // default: // reserved area } } hc->Cal = (hc->PhysMax-hc->PhysMin)/(hc->DigMax-hc->DigMin); hc->Off = hc->PhysMin-hc->Cal*hc->DigMin; } hdr->AS.bpb = bpb8>>3; if (bpb8 & 0x07) { // each block must use whole number of bytes hdr->AS.bpb++; hdr->AS.bpb8 = hdr->AS.bpb<<3; } if (VERBOSE_LEVEL>8) fprintf(stdout,"[213] FMT=%s Ver=%4.2f\n",GetFileTypeString(hdr->TYPE),hdr->VERSION); for (k=0, hdr->SPR=1; kNS;k++) { if (VERBOSE_LEVEL>8) fprintf(stdout,"[GDF 214] #=%i\n",k); if (hdr->CHANNEL[k].SPR) hdr->SPR = lcm(hdr->SPR,hdr->CHANNEL[k].SPR); if (GDFTYP_BITS[hdr->CHANNEL[k].GDFTYP]==0) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "GDF: Invalid or unsupported GDFTYP"); return(hdr->AS.B4C_ERRNUM); } } hdr->SampleRate = ((double)(hdr->SPR))/Dur; if (VERBOSE_LEVEL>8) fprintf(stdout,"[219] FMT=%s Ver=%4.2f\n",GetFileTypeString(hdr->TYPE),hdr->VERSION); /* read GDF Header 3 - experimental */ if ((hdr->HeadLen > 256u*(hdr->NS+1u)) && (hdr->VERSION>=(float)2.10)) { uint8_t *Header2 = hdr->AS.Header + 256*(hdr->NS+1); uint8_t tag = 0xff; size_t pos=0,len=0; tag = (uint8_t)Header2[0]; if (VERBOSE_LEVEL>8) fprintf(stdout,"[220] GDFr3: %i %i Tag=%i\n",hdr->HeadLen,hdr->NS,tag); while ((pos < (hdr->HeadLen-256*(hdr->NS+1)-4)) && (tag>0)) { len = leu32p(Header2+pos)>>8; if (VERBOSE_LEVEL>8) fprintf(stdout,"GDFr3: Tag=%i Len=%i pos=%i\n",tag,(int)len,(int)pos); if (0) {} else if (tag==1) { // user-specific events i.e. free text annotations if (VERBOSE_LEVEL>6) fprintf(stdout,"user-specific events defined\n"); hdr->AS.auxBUF = (uint8_t*) realloc(hdr->AS.auxBUF,len); memcpy(hdr->AS.auxBUF, Header2+pos+4, len); hdr->EVENT.CodeDesc = (typeof(hdr->EVENT.CodeDesc)) realloc(hdr->EVENT.CodeDesc,257*sizeof(*hdr->EVENT.CodeDesc)); hdr->EVENT.CodeDesc[0] = ""; // typ==0, is always empty hdr->EVENT.LenCodeDesc = 1; k = 1; while (hdr->AS.auxBUF[k]) { hdr->EVENT.CodeDesc[hdr->EVENT.LenCodeDesc++] = (char*)(hdr->AS.auxBUF+k); k += strlen((char*)(hdr->AS.auxBUF+k))+1; } } else if (tag==2) { /* BCI 2000 information */ hdr->AS.bci2000 = (char*) realloc(hdr->AS.bci2000,len+1); memcpy(hdr->AS.bci2000,Header2+pos+4,len); hdr->AS.bci2000[len]=0; } else if (tag==3) { /* manufacture information */ if (len > MAX_LENGTH_MANUF) { fprintf(stderr,"Warning: length of Manufacturer information (%i) exceeds length of %i bytes\n", (int)len, MAX_LENGTH_MANUF); len = MAX_LENGTH_MANUF; } memcpy(hdr->ID.Manufacturer._field,Header2+pos+4,len); hdr->ID.Manufacturer._field[MAX_LENGTH_MANUF]=0; hdr->ID.Manufacturer.Name = hdr->ID.Manufacturer._field; hdr->ID.Manufacturer.Model= hdr->ID.Manufacturer.Name+strlen(hdr->ID.Manufacturer.Name)+1; hdr->ID.Manufacturer.Version = hdr->ID.Manufacturer.Model+strlen(hdr->ID.Manufacturer.Model)+1; hdr->ID.Manufacturer.SerialNumber = hdr->ID.Manufacturer.Version+strlen(hdr->ID.Manufacturer.Version)+1; } else if (0) { // (tag==4) { /* sensor orientation */ /* // OBSOLETE for (k=0; kNS; k++) { hdr->CHANNEL[k].Orientation[0] = lef32p(Header2+pos+4+4*k); hdr->CHANNEL[k].Orientation[1] = lef32p(Header2+pos+4+4*k+hdr->NS*4); hdr->CHANNEL[k].Orientation[2] = lef32p(Header2+pos+4+4*k+hdr->NS*8); // if (len >= 12*hdr->NS) hdr->CHANNEL[k].Area = lef32p(Header2+pos+4+4*k+hdr->NS*12); if (VERBOSE_LEVEL>8) fprintf(stdout,"GDF tag=4 #%i pos=%i/%i: %f\n",k,pos,len,hdr->CHANNEL[k].Area); } */ } else if (tag==5) { /* IP address */ memcpy(hdr->IPaddr,Header2+pos+4,len); } else if (tag==6) { /* Technician */ hdr->ID.Technician = (char*)realloc(hdr->ID.Technician,len+1); memcpy(hdr->ID.Technician,Header2+pos+4, len); hdr->ID.Technician[len]=0; } else if (tag==7) { // recording institution // hdr->ID.Hospital = strndup((char*)(Header2+pos+4),len); hdr->ID.Hospital = malloc(len+1); if (hdr->ID.Hospital) { hdr->ID.Hospital[len] = 0; strncpy(hdr->ID.Hospital,(char*)Header2+pos+4,len); } } #if (BIOSIG_VERSION >= 10500) else if (tag==9) { hdr->SCP.Section7 = Header2+pos+4; hdr->SCP.Section7Length = len; } else if (tag==10) { hdr->SCP.Section8 = Header2+pos+4; hdr->SCP.Section8Length = len; } else if (tag==11) { hdr->SCP.Section9 = Header2+pos+4; hdr->SCP.Section9Length = len; } else if (tag==12) { hdr->SCP.Section10 = Header2+pos+4; hdr->SCP.Section10Length = len; } else if (tag==13) { hdr->SCP.Section11 = Header2+pos+4; hdr->SCP.Section11Length = len; } #endif /* further tags may include - Manufacturer: SCP, MFER, GDF1 - Orientation of MEG channels - Study ID - BCI: session, run */ pos+= 4+len; tag = (uint8_t)Header2[pos]; if (VERBOSE_LEVEL>8) fprintf(stdout,"GDFr3: next Tag=%i pos=%i\n",tag,(int)pos); } } // if (VERBOSE_LEVEL>8) fprintf(stdout,"[GDF 217] #=%li\n",iftell(hdr)); return(hdr->AS.B4C_ERRNUM); } /********************************************************************************* hdrEVT2rawEVT(HDRTYPE *hdr) converts structure HDR.EVENT into raw event data (hdr->AS.rawEventData) TODO: support of EVENT.TimeStamp *********************************************************************************/ size_t hdrEVT2rawEVT(HDRTYPE *hdr) { size_t k32u; char flag = (hdr->EVENT.DUR != NULL) && (hdr->EVENT.CHN != NULL) ? 3 : 1; if (flag==3) // any DUR or CHN is larger than 0 for (k32u=0, flag=1; k32u < hdr->EVENT.N; k32u++) if (hdr->EVENT.CHN[k32u] || hdr->EVENT.DUR[k32u]) { flag = 3; break; } #if (BIOSIG_VERSION >= 10500) if (hdr->EVENT.TimeStamp != NULL) { flag = flag | 0x04; } #endif int sze; sze = (flag & 2) ? 12 : 6; sze += (flag & 4) ? 8 : 0; size_t len = 8+hdr->EVENT.N*sze; hdr->AS.rawEventData = (uint8_t*) realloc(hdr->AS.rawEventData,len); uint8_t *buf = hdr->AS.rawEventData; buf[0] = flag; if (hdr->VERSION < 1.94) { k32u = lround(hdr->EVENT.SampleRate); buf[1] = k32u & 0x000000FF; buf[2] = (k32u>>8 ) & 0x000000FF; buf[3] = (k32u>>16) & 0x000000FF; leu32a(hdr->EVENT.N, buf+4); } else { k32u = hdr->EVENT.N; buf[1] = k32u & 0x000000FF; buf[2] = (k32u>>8 ) & 0x000000FF; buf[3] = (k32u>>16) & 0x000000FF; lef32a(hdr->EVENT.SampleRate, buf+4); }; uint8_t *buf1=hdr->AS.rawEventData+8; uint8_t *buf2=hdr->AS.rawEventData+8+hdr->EVENT.N*4; for (k32u=0; k32uEVENT.N; k32u++) { *(uint32_t*)(buf1+k32u*4) = htole32(hdr->EVENT.POS[k32u]+1); // convert from 0-based (biosig4c++) to 1-based (GDF) indexing *(uint16_t*)(buf2+k32u*2) = htole16(hdr->EVENT.TYP[k32u]); } if (flag & 2) { buf1 = hdr->AS.rawEventData+8+hdr->EVENT.N*6; buf2 = hdr->AS.rawEventData+8+hdr->EVENT.N*8; for (k32u=0; k32uEVENT.N; k32u++) { *(uint16_t*)(buf1+k32u*2) = htole16(hdr->EVENT.CHN[k32u]); *(uint32_t*)(buf2+k32u*4) = htole32(hdr->EVENT.DUR[k32u]); } } #if (BIOSIG_VERSION >= 10500) if (flag & 4) { buf1 = hdr->AS.rawEventData+8+hdr->EVENT.N*(sze-8); for (k32u=0; k32uEVENT.N; k32u++) { *(uint64_t*)(buf1+k32u*8) = htole64(hdr->EVENT.TimeStamp[k32u]); } } #endif return(len); } /********************************************************************************* rawEVT2hdrEVT(HDRTYPE *hdr) converts raw event data (hdr->AS.rawEventData) into structure HDR.EVENT TODO: support of EVENT.TimeStamp *********************************************************************************/ void rawEVT2hdrEVT(HDRTYPE *hdr, size_t length_rawEventData) { // TODO: avoid additional copying size_t k; uint8_t *buf = hdr->AS.rawEventData; if ((buf==NULL) || (length_rawEventData < 8)) { hdr->EVENT.N = 0; return; } if (hdr->VERSION < 1.94) { if (buf[1] | buf[2] | buf[3]) hdr->EVENT.SampleRate = buf[1] + (buf[2] + buf[3]*256.0)*256.0; else { fprintf(stdout,"Warning GDF v1: SampleRate in Eventtable is not set in %s !!!\n",hdr->FileName); hdr->EVENT.SampleRate = hdr->SampleRate; } hdr->EVENT.N = leu32p(buf + 4); } else { hdr->EVENT.N = buf[1] + (buf[2] + buf[3]*256)*256; hdr->EVENT.SampleRate = lef32p(buf + 4); } char flag = buf[0]; int sze = (flag & 2) ? 12 : 6; if (flag & 4) sze+=8; if (sze*hdr->EVENT.N+8 < length_rawEventData) { hdr->EVENT.N = 0; biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error GDF: event table is corrupted"); return; } if (hdr->NS==0 && !isfinite(hdr->SampleRate)) hdr->SampleRate = hdr->EVENT.SampleRate; hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, hdr->EVENT.N*sizeof(*hdr->EVENT.POS) ); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, hdr->EVENT.N*sizeof(*hdr->EVENT.TYP) ); uint8_t *buf1 = hdr->AS.rawEventData+8; uint8_t *buf2 = hdr->AS.rawEventData+8+4*hdr->EVENT.N; for (k=0; k < hdr->EVENT.N; k++) { // POS & TYP hdr->EVENT.POS[k] = leu32p(buf1 + k*4)-1; // convert from 1-based (GDF) to 0-based (biosig4c++) indexing hdr->EVENT.TYP[k] = leu16p(buf2 + k*2); } if (flag & 2) { // DUR & CHN hdr->EVENT.DUR = (uint32_t*) realloc(hdr->EVENT.DUR,hdr->EVENT.N*sizeof(*hdr->EVENT.DUR)); hdr->EVENT.CHN = (uint16_t*) realloc(hdr->EVENT.CHN,hdr->EVENT.N*sizeof(*hdr->EVENT.CHN)); buf1 = hdr->AS.rawEventData+8+6*hdr->EVENT.N; buf2 = hdr->AS.rawEventData+8+8*hdr->EVENT.N; for (k=0; k < hdr->EVENT.N; k++) { hdr->EVENT.CHN[k] = leu16p(buf1 + k*2); hdr->EVENT.DUR[k] = leu32p(buf2 + k*4); } } else { hdr->EVENT.DUR = NULL; hdr->EVENT.CHN = NULL; } #if (BIOSIG_VERSION >= 10500) if (flag & 4) { // TimeStamp hdr->EVENT.TimeStamp = (gdf_time*) realloc(hdr->EVENT.TimeStamp, hdr->EVENT.N*sizeof(*hdr->EVENT.TimeStamp)); buf1 = hdr->AS.rawEventData+8+hdr->EVENT.N*(sze-8); for (k=0; k < hdr->EVENT.N; k++) { hdr->EVENT.TimeStamp[k] = leu64p(buf1 + k*8); } } else { hdr->EVENT.TimeStamp = NULL; } #endif } int NumberOfChannels(HDRTYPE *hdr) { unsigned int k,NS; for (k=0, NS=0; kNS; k++) if (hdr->CHANNEL[k].OnOff==1) NS++; #ifdef CHOLMOD_H if (hdr->Calib == NULL) return (NS); if (NS == hdr->Calib->nrow) return (hdr->Calib->ncol); #endif return(hdr->NS); } int RerefCHANNEL(HDRTYPE *hdr, void *arg2, char Mode) { #ifndef CHOLMOD_H if (!arg2 || !Mode) return(0); // do nothing biosigERROR(hdr, B4C_REREF_FAILED, "Error RerefCHANNEL: cholmod library is missing"); return(1); #else if (arg2==NULL) Mode = 0; // do nothing cholmod_sparse *ReRef=NULL; uint16_t flag,NS; size_t i,j,k; long r; char flagLabelIsSet = 0; switch (Mode) { case 1: { HDRTYPE *RR = sopen((const char*)arg2,"r",NULL); ReRef = RR->Calib; if (RR->rerefCHANNEL != NULL) { flagLabelIsSet = 1; if (hdr->rerefCHANNEL) free(hdr->rerefCHANNEL); hdr->rerefCHANNEL = RR->rerefCHANNEL; RR->rerefCHANNEL = NULL; } RR->Calib = NULL; // do not destroy ReRef destructHDR(RR); RR = NULL; break; } case 2: ReRef = (cholmod_sparse*) arg2; CSstart(); break; } if ((ReRef==NULL) || !Mode) { // reset rereferencing if (hdr->Calib != NULL) cholmod_free_sparse(&hdr->Calib, &CHOLMOD_COMMON_VAR); hdr->Calib = ReRef; if (hdr->rerefCHANNEL) free(hdr->rerefCHANNEL); hdr->rerefCHANNEL = NULL; return(0); } cholmod_sparse *A = ReRef; // check dimensions for (k=0, NS=0; kNS; k++) if (hdr->CHANNEL[k].OnOff) NS++; if (NS - A->nrow) { biosigERROR(hdr, B4C_REREF_FAILED, "Error REREF_CHAN: size of data does not fit ReRef-matrix"); return(1); } // allocate memory if (hdr->Calib != NULL) cholmod_free_sparse(&hdr->Calib, &CHOLMOD_COMMON_VAR); if (VERBOSE_LEVEL>8) { CHOLMOD_COMMON_VAR.print = 5; cholmod_print_sparse(ReRef,"HDR.Calib", &CHOLMOD_COMMON_VAR); } hdr->Calib = ReRef; if (hdr->rerefCHANNEL==NULL) hdr->rerefCHANNEL = (CHANNEL_TYPE*) realloc(hdr->rerefCHANNEL, A->ncol*sizeof(CHANNEL_TYPE)); CHANNEL_TYPE *NEWCHANNEL = hdr->rerefCHANNEL; hdr->FLAG.ROW_BASED_CHANNELS = 1; // check each component for (i=0; incol; i++) // i .. column index { flag = 0; int mix = -1, oix = -1, pix = -1; double m = 0.0; double v; for (j = *((unsigned*)(A->p)+i); j < *((unsigned*)(A->p)+i+1); j++) { v = *(((double*)A->x)+j); r = *(((int*)A->i)+j); // r .. row index if (v>m) { m = v; mix = r; } if (v==1.0) { if (oix<0) oix = r; else fprintf(stderr,"Warning: ambiguous channel information (in new #%i,%i more than one scaling factor of 1.0 is used.) \n",(int)i,(int)j); } if (v) { if (pix == -1) { //memcpy(NEWCHANNEL+i, hdr->CHANNEL+r, sizeof(CHANNEL_TYPE)); NEWCHANNEL[i].PhysDimCode = hdr->CHANNEL[r].PhysDimCode; NEWCHANNEL[i].LowPass = hdr->CHANNEL[r].LowPass; NEWCHANNEL[i].HighPass = hdr->CHANNEL[r].HighPass; NEWCHANNEL[i].Notch = hdr->CHANNEL[r].Notch; NEWCHANNEL[i].SPR = hdr->CHANNEL[r].SPR; NEWCHANNEL[i].GDFTYP = hdr->CHANNEL[r].GDFTYP; NEWCHANNEL[i].Impedance = fabs(v)*hdr->CHANNEL[r].Impedance; NEWCHANNEL[i].OnOff = 1; NEWCHANNEL[i].LeadIdCode = 0; if (!flagLabelIsSet) memcpy(NEWCHANNEL[i].Label, hdr->CHANNEL[r].Label, MAX_LENGTH_LABEL); pix = 0; } else { if (NEWCHANNEL[i].PhysDimCode != hdr->CHANNEL[r].PhysDimCode) NEWCHANNEL[i].PhysDimCode = 0; if (NEWCHANNEL[i].LowPass != hdr->CHANNEL[r].LowPass) NEWCHANNEL[i].LowPass = NAN; if (NEWCHANNEL[i].HighPass != hdr->CHANNEL[r].HighPass) NEWCHANNEL[i].HighPass = NAN; if (NEWCHANNEL[i].Notch != hdr->CHANNEL[r].Notch) NEWCHANNEL[i].Notch = NAN; if (NEWCHANNEL[i].SPR != hdr->CHANNEL[r].SPR) NEWCHANNEL[i].SPR = lcm(NEWCHANNEL[i].SPR, hdr->CHANNEL[r].SPR); if (NEWCHANNEL[i].GDFTYP != hdr->CHANNEL[r].GDFTYP) NEWCHANNEL[i].GDFTYP = max(NEWCHANNEL[i].GDFTYP, hdr->CHANNEL[r].GDFTYP); NEWCHANNEL[i].Impedance += fabs(v)*NEWCHANNEL[r].Impedance; NEWCHANNEL[i].GDFTYP = 16; } } if (r >= hdr->NS) { flag = 1; fprintf(stderr,"Error: index (%i) in channel (%i) exceeds number of channels (%i)\n",(int)r,(int)i,hdr->NS); } } // heuristic to determine hdr->CHANNEL[k].Label; if (oix>-1) r=oix; // use the info from channel with a scaling of 1.0 ; else if (mix>-1) r=mix; // use the info from channel with the largest scale; else r = -1; if (flagLabelIsSet) ; else if (!flag && (rNS) && (r>=0)) { // if successful memcpy(NEWCHANNEL[i].Label, hdr->CHANNEL[r].Label, MAX_LENGTH_LABEL); } else { sprintf(NEWCHANNEL[i].Label,"component #%i",(int)i); } } return(0); #endif } /**************************************************************************** * READ_HEADER_1 * * ****************************************************************************/ int read_header(HDRTYPE *hdr) { /* input: hdr must be an open file able to read from hdr->TYPE must be unknown, otherwise no FileFormat evaluation is performed hdr->FILE.size output: defines whole header structure and event table return value: 0 no error -1 error reading header 1 -2 error reading header 2 -3 error reading event table */ if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %f\n",__func__,__LINE__, (int)hdr->FILE.size, (int)hdr->HeadLen, hdr->VERSION); size_t count = hdr->HeadLen; if (hdr->HeadLen<=512) { ifseek(hdr, count, SEEK_SET); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, 513); count += ifread(hdr->AS.Header+hdr->HeadLen, 1, 512-count, hdr); getfiletype(hdr); } char tmp[6]; strncpy(tmp,(char*)hdr->AS.Header+3,5); tmp[5]=0; hdr->VERSION = atof(tmp); // currently, only GDF is supported if ( (hdr->TYPE != GDF) || (hdr->VERSION < 0.01) ) return ( -1 ); if (hdr->VERSION > 1.90) hdr->HeadLen = leu16p(hdr->AS.Header+184)<<8; else hdr->HeadLen = leu64p(hdr->AS.Header+184); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %i %f\n", __func__, __LINE__,(int)hdr->FILE.size, (int)hdr->HeadLen, (int)count, hdr->VERSION); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen); if (count < hdr->HeadLen) { ifseek(hdr, count, SEEK_SET); count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %i %f\n",__func__, __LINE__, (int)hdr->FILE.size, (int)hdr->HeadLen, (int)count, hdr->VERSION); if (count < hdr->HeadLen) { if (VERBOSE_LEVEL>7) fprintf(stdout,"ambigous GDF header size: %i %i\n",(int)count,hdr->HeadLen); biosigERROR(hdr, B4C_INCOMPLETE_FILE, "reading GDF header failed"); return(-2); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %i %f\n",__func__, __LINE__, (int)hdr->FILE.size, (int)hdr->HeadLen, (int)count, hdr->VERSION); if ( gdfbin2struct(hdr) ) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %i %f\n",__func__, __LINE__, (int)hdr->FILE.size, (int)hdr->HeadLen, (int)count, hdr->VERSION); return(-2); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %i %f\n",__func__, __LINE__, (int)hdr->FILE.size, (int)hdr->HeadLen, (int)count, hdr->VERSION); hdr->EVENT.N = 0; hdr->EVENT.POS = NULL; hdr->EVENT.TYP = NULL; hdr->EVENT.DUR = NULL; hdr->EVENT.CHN = NULL; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = NULL; #endif if (hdr->NRec < 0) { hdr->NRec = (hdr->FILE.size - hdr->HeadLen)/hdr->AS.bpb; if (hdr->AS.rawEventData!=NULL) { free(hdr->AS.rawEventData); hdr->AS.rawEventData=NULL; } } else if (hdr->FILE.size > hdr->HeadLen + hdr->AS.bpb*(size_t)hdr->NRec + 8) { if (VERBOSE_LEVEL > 7) fprintf(stdout,"GDF EVENT: %i,%i %i,%i,%i\n",(int)hdr->FILE.size, (int)(hdr->HeadLen + hdr->AS.bpb*hdr->NRec + 8), hdr->HeadLen, hdr->AS.bpb, (int)hdr->NRec); ifseek(hdr, hdr->HeadLen + hdr->AS.bpb*hdr->NRec, SEEK_SET); // READ EVENTTABLE hdr->AS.rawEventData = (uint8_t*)realloc(hdr->AS.rawEventData,8); size_t c = ifread(hdr->AS.rawEventData, sizeof(uint8_t), 8, hdr); uint8_t *buf = hdr->AS.rawEventData; if (c<8) { hdr->EVENT.N = 0; } else if (hdr->VERSION < 1.94) { hdr->EVENT.N = leu32p(buf + 4); } else { hdr->EVENT.N = buf[1] + (buf[2] + buf[3]*256)*256; } if (VERBOSE_LEVEL > 7) fprintf(stdout,"EVENT.N = %i,%i\n",hdr->EVENT.N,(int)c); char flag = buf[0]; int sze = (flag & 2) ? 12 : 6; if (flag & 4) sze+=8; hdr->AS.rawEventData = (uint8_t*)realloc(hdr->AS.rawEventData,8+hdr->EVENT.N*sze); c = ifread(hdr->AS.rawEventData+8, sze, hdr->EVENT.N, hdr); ifseek(hdr, hdr->HeadLen, SEEK_SET); if (c < hdr->EVENT.N) { biosigERROR(hdr, B4C_INCOMPLETE_FILE, "reading GDF eventtable failed"); return(-3); } rawEVT2hdrEVT(hdr, 8+hdr->EVENT.N*sze); } else hdr->EVENT.N = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"[228] FMT=%s Ver=%4.2f\n",GetFileTypeString(hdr->TYPE),hdr->VERSION); return (0); } /****************************************************************************/ /** SOPEN **/ /****************************************************************************/ HDRTYPE* sopen(const char* FileName, const char* MODE, HDRTYPE* hdr) /* MODE="r" reads file and returns HDR MODE="w" writes HDR into file */ { // unsigned int k2; // uint32_t k32u; size_t count; #ifndef ONLYGDF // double Dur; char* ptr_str; struct tm tm_time; // time_t tt; const char* GENDER = "XMFX"; const uint16_t CFWB_GDFTYP[] = {17,16,3}; const float CNT_SETTINGS_NOTCH[] = {0.0, 50.0, 60.0}; const float CNT_SETTINGS_LOWPASS[] = {30, 40, 50, 70, 100, 200, 500, 1000, 1500, 2000, 2500, 3000}; const float CNT_SETTINGS_HIGHPASS[] = {NAN, 0, .05, .1, .15, .3, 1, 5, 10, 30, 100, 150, 300}; uint16_t BCI2000_StatusVectorLength=0; // specific for BCI2000 format #endif //ONLYGDF if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN( %s, %s) \n",FileName, MODE); if (FileName == NULL) { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "no filename specified"); return (hdr); } if (hdr==NULL) hdr = constructHDR(0,0); // initializes fields that may stay undefined during SOPEN if (FileName != NULL) { if (hdr->FileName) free(hdr->FileName); hdr->FileName = strdup(FileName); } if (VERBOSE_LEVEL>6) fprintf(stdout,"SOPEN( %s, %s) open=%i\n",FileName, MODE, hdr->FILE.OPEN); setlocale(LC_NUMERIC,"C"); // hdr->FLAG.SWAP = (__BYTE_ORDER == __BIG_ENDIAN); // default: most data formats are little endian hdr->FILE.LittleEndian = 1; if (!strncmp(MODE,"a",1)) { /***** SOPEN APPEND *****/ HDRTYPE *hdr2 = NULL; struct stat FileBuf; if (stat(FileName, &FileBuf)==0) hdr->FILE.size = FileBuf.st_size; else hdr->FILE.size = 0; if (hdr->FILE.size==0) { if (hdr->FILE.OPEN) ifclose(hdr); return( sopen(FileName, "w", hdr) ); } else if (hdr->FILE.size < 256) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error SOPEN(APPEND); file format not supported."); return (hdr); } else { // read header of existing file hdr2 = sopen(FileName, "r", hdr2); sclose(hdr2); }; if (hdr2->TYPE != GDF) { // currently only GDF is tested and supported biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error SOPEN(APPEND); file format not supported."); destructHDR(hdr2); return (hdr); } // test for additional restrictions if ( hdr2->EVENT.N > 0 && hdr2->FILE.COMPRESSION ) { // gzopen does not support "rb+" (simultaneous read/write) but can only append at the end of file biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error SOPEN(GDF APPEND); cannot append to compressed GDF file containing event table."); destructHDR(hdr2); return (hdr); } // use header of existing file, sopen does hdr=hdr2, and open files for writing. destructHDR(hdr); if (hdr2->FILE.COMPRESSION) hdr = ifopen(hdr2, "ab"); else { hdr = ifopen(hdr2, "rb+"); ifseek(hdr, hdr->HeadLen + hdr->NRec*hdr->AS.bpb, SEEK_SET); } if (!hdr->FILE.OPEN) { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "Error SOPEN(APPEND); Cannot open file."); return(hdr); } hdr->FILE.OPEN = 2; } else if (!strncmp(MODE,"r",1)) { /***** SOPEN READ *****/ #ifndef WITHOUT_NETWORK if (!memcmp(hdr->FileName,"bscs://",7)) { uint64_t ID; char *hostname = (char*)hdr->FileName+7; char *t = strrchr(hostname,'/'); if (t==NULL) { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "SOPEN-NETWORK: file identifier not specifed"); return(hdr); } *t=0; cat64(t+1, &ID); int sd,s; sd = bscs_connect(hostname); if (sd<0) { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "could not connect to server"); return(hdr); } hdr->FILE.Des = sd; s = bscs_open(sd, &ID); if (VERBOSE_LEVEL>7) fprintf(stdout,"%i = bscs_open\n",s); s = bscs_requ_hdr(sd,hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"%i = bscs_requ_hdr\n",s); s = bscs_requ_evt(sd,hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"%i = bscs_requ_evt\n",s); hdr->FILE.OPEN = 1; return(hdr); } #endif // modern cpu's have cache lines of 4096 bytes, so for performance reasons we use this size as well. const size_t PAGESIZE=4096; /* reading some formats may imply that at least 512 bytes are read, if you want to use a smaller page size, double check whether your format(s) are correctly handled. */ assert(PAGESIZE >= 512); hdr->AS.Header = (uint8_t*)malloc(PAGESIZE+1); size_t k; #ifndef ONLYGDF size_t name=0,ext=0; for (k=0; hdr->FileName[k]; k++) { if (hdr->FileName[k]==FILESEP) name = k+1; if (hdr->FileName[k]=='.') ext = k+1; } const char *FileExt = hdr->FileName+ext; const char *FileName = hdr->FileName+name; #endif //ONLYGDF #ifdef __CURL_CURL_H if (! strncmp(hdr->FileName,"file://", 7) || ! strncmp(hdr->FileName,"ftp://", 6) || ! strncmp(hdr->FileName,"http://", 7) || ! strncmp(hdr->FileName,"https://", 8) ) { CURL *curl; char errbuffer[CURL_ERROR_SIZE]; if ((curl = curl_easy_init()) != NULL) { FILE *tmpfid = tmpfile(); curl_easy_setopt(curl, CURLOPT_URL, hdr->FileName); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuffer); if (VERBOSE_LEVEL > 6) curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_WRITEDATA, tmpfid); if (curl_easy_perform(curl) != CURLE_OK) { fprintf(stderr,"CURL ERROR: %s\n",errbuffer); biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "Error SOPEN(READ); file download failed."); fclose(tmpfid); return(hdr); } /* associate temporary file with input stream channeling everything through zlib ensures that *.gz files are automatically decompressed According to http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.12.html#tmpfile, the tmpfile will be removed when stream is closed */ fseek(tmpfid,0,SEEK_SET); hdr->FILE.gzFID = gzdopen(fileno(tmpfid), "r"); hdr->FILE.COMPRESSION = 1; curl_easy_cleanup(curl); /* */ count = ifread(hdr->AS.Header, 1, PAGESIZE, hdr); hdr->AS.Header[count]=0; } } else #endif { if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN 101: <%s>\n",hdr->FileName); #ifndef ONLYGDF /* AINF */ if (!strcmp(FileExt, "ainf")) { if (VERBOSE_LEVEL>8) fprintf(stdout,"getfiletype ainf1 %s %i\n",hdr->FileName,(int)ext); char* AINF_RAW_FILENAME = (char*)calloc(strlen(hdr->FileName)+5,sizeof(char)); strncpy(AINF_RAW_FILENAME, hdr->FileName,ext); strcpy(AINF_RAW_FILENAME+ext, "raw"); FILE* fid1=fopen(AINF_RAW_FILENAME,"rb"); if (fid1) { fclose(fid1); hdr->TYPE = AINF; } free(AINF_RAW_FILENAME); } else if (!strcmp(FileExt, "raw")) { char* AINF_RAW_FILENAME = (char*)calloc(strlen(hdr->FileName)+5,sizeof(char)); strncpy(AINF_RAW_FILENAME, hdr->FileName,ext); strcpy(AINF_RAW_FILENAME+ext, "ainf"); FILE* fid1=fopen(AINF_RAW_FILENAME,"r"); if (fid1) { fclose(fid1); hdr->TYPE = AINF; } free(AINF_RAW_FILENAME); } #endif //ONLYGDF hdr->FILE.COMPRESSION = 0; hdr = ifopen(hdr,"rb"); if (!hdr->FILE.OPEN) { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "Error SOPEN(READ); Cannot open file."); return(hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN 101:\n"); count = ifread(hdr->AS.Header, 1, PAGESIZE, hdr); hdr->AS.Header[count]=0; if (!memcmp(Header1,MAGIC_NUMBER_GZIP,strlen(MAGIC_NUMBER_GZIP))) { #ifdef ZLIB_H if (VERBOSE_LEVEL>7) fprintf(stdout,"[221] %i\n",(int)count); ifseek(hdr, 0, SEEK_SET); hdr->FILE.gzFID = gzdopen(fileno(hdr->FILE.FID),"r"); hdr->FILE.COMPRESSION = (uint8_t)1; hdr->FILE.FID = NULL; count = ifread(hdr->AS.Header, 1, PAGESIZE, hdr); hdr->AS.Header[count]=0; #else biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error SOPEN(READ); *.gz file not supported because not linked with zlib."); #endif } } if (VERBOSE_LEVEL>7) fprintf(stdout,"[222] %i\n",(int)count); hdr->HeadLen = count; getfiletype(hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) FMT=%s Ver=%4.2f\n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION); #ifndef ONLYGDF if (hdr->TYPE != unknown) ; else if (!memcmp(Header1,FileName,strspn(FileName,".")) && (!strcmp(FileExt,"HEA") || !strcmp(FileExt,"hea") )) hdr->TYPE = MIT; #endif //ONLYGDF if (hdr->TYPE == unknown) { biosigERROR(hdr, B4C_FORMAT_UNKNOWN, "ERROR BIOSIG4C++ SOPEN(read): Dataformat not known.\n"); ifclose(hdr); return(hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) FMT=%s Ver=%4.2f\n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION); count = iftell(hdr); hdr->AS.first = 0; hdr->AS.length = 0; hdr->AS.bpb = -1; // errorneous value: ensures that hdr->AS.bpb will be defined #ifndef WITHOUT_NETWORK if (!memcmp(hdr->AS.Header,"bscs://",7)) { hdr->AS.Header[count]=0; uint64_t ID; char *hostname = Header1+7; Header1[6]=0; char *t = strrchr(hostname,'/'); if (t==NULL) { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "SOPEN-NETWORK: file identifier not specifed"); return(hdr); } t[0]=0; cat64(t+1, &ID); int sd,s; sd = bscs_connect(hostname); if (sd<0) { fprintf(stderr,"could not connect to %s\n",hostname); biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "could not connect to server"); return(hdr); } hdr->FILE.Des = sd; s = bscs_open(sd, &ID); s = bscs_requ_hdr(sd,hdr); s = bscs_requ_evt(sd,hdr); hdr->FILE.OPEN = 1; return(hdr); } else #endif if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) FMT=%s Ver=%4.2f\n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION); if (hdr->TYPE == GDF) { struct stat FileBuf; if (stat(hdr->FileName,&FileBuf)==0) hdr->FILE.size = FileBuf.st_size; if ( read_header(hdr) ) { return (hdr); } } #ifndef ONLYGDF else if ((hdr->TYPE == EDF) || (hdr->TYPE == BDF)) { if (count < 256) { biosigERROR(hdr, B4C_INCOMPLETE_FILE, "reading BDF/EDF fixed header failed"); return(hdr); } typeof(hdr->NS) AnnotationChannel = 0; typeof(hdr->NS) StatusChannel = 0; int last = min(MAX_LENGTH_PID, 80); strncpy(hdr->Patient.Id, Header1+8, last); while ((0 <= last) && (isspace(hdr->Patient.Id[--last]))); hdr->Patient.Id[last+1]=0; last = min(MAX_LENGTH_RID, 80); memcpy(hdr->ID.Recording, Header1+88, last); while ((0 <= last) && (isspace(hdr->ID.Recording[--last]))); hdr->ID.Recording[last+1]=0; if (VERBOSE_LEVEL>8) fprintf(stdout,"[EDF 211] #=%li\nT0=<%16s>",iftell(hdr),Header1+168); // TODO: sanity check of T0 char tmp[81]; memset(tmp,0,9); strncpy(tmp,Header1+168+14,2); tm_time.tm_sec = atoi(tmp); strncpy(tmp,Header1+168+11,2); tm_time.tm_min = atoi(tmp); strncpy(tmp,Header1+168+8,2); tm_time.tm_hour = atoi(tmp); strncpy(tmp,Header1+168,2); tm_time.tm_mday = atoi(tmp); strncpy(tmp,Header1+168+3,2); tm_time.tm_mon = atoi(tmp)-1; strncpy(tmp,Header1+168+6,2); tm_time.tm_year = atoi(tmp); tm_time.tm_year+= (tm_time.tm_year < 70 ? 100 : 0); hdr->EVENT.N = 0; memset(tmp,0,9); hdr->NS = atoi(memcpy(tmp,Header1+252,4)); hdr->HeadLen = atoi(memcpy(tmp,Header1+184,8)); if (hdr->HeadLen < ((hdr->NS+1u)*256)) { biosigERROR(hdr, B4C_UNSPECIFIC_ERROR, "EDF/BDF corrupted: HDR.NS and HDR.HeadLen do not fit"); if (VERBOSE_LEVEL > 7) fprintf(stdout,"HeadLen=%i,%i\n",hdr->HeadLen ,(hdr->NS+1)<<8); }; hdr->NRec = atoi(strncpy(tmp,Header1+236,8)); //Dur = atof(strncpy(tmp,Header1+244,8)); if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211b] #=%li\nT0=%s\n",iftell(hdr),asctime(&tm_time)); if (!strncmp(Header1+192,"EDF+",4)) { if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211c+] <%s>\n",hdr->Patient.Id); strtok(hdr->Patient.Id," "); ptr_str = strtok(NULL," "); if (ptr_str!=NULL) { // define Id, Sex, Birthday, Name if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211c+] <%p>\n",ptr_str); hdr->Patient.Sex = (ptr_str[0]=='f')*2 + (ptr_str[0]=='F')*2 + (ptr_str[0]=='M') + (ptr_str[0]=='m'); ptr_str = strtok(NULL," "); // startdate char *tmpptr = strtok(NULL," "); if ((!hdr->FLAG.ANONYMOUS) && (tmpptr != NULL)) { strncpy(hdr->Patient.Name,tmpptr,MAX_LENGTH_NAME); hdr->Patient.Name[MAX_LENGTH_NAME]=0; } if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211c] #=%li\n",iftell(hdr)); if (strlen(ptr_str)==11) { struct tm t1; char *strMDay=strtok(ptr_str,"-"); char *strMonth=strtok(NULL,"-"); char *strYear=strtok(NULL,"-"); for (k=0; strMonth[k]>0; ++k) strMonth[k]= toupper(strMonth[k]); // convert to uppper case t1.tm_mday = atoi(strMDay); t1.tm_mon = month_string2int(strMonth); t1.tm_year = atoi(strYear) - 1900; t1.tm_sec = 0; t1.tm_min = 0; t1.tm_hour = 12; t1.tm_isdst= -1; hdr->Patient.Birthday = tm_time2gdf_time(&t1); }} if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211d] <%s>\n",hdr->ID.Recording); if (!strncmp(Header1+88,"Startdate ",10)) { size_t pos = strcspn(Header1+88+10," ")+10; strncpy(hdr->ID.Recording, Header1+88+pos+1, 80-pos); hdr->ID.Recording[80-pos-1] = 0; if (strtok(hdr->ID.Recording," ")!=NULL) { char *tech = strtok(NULL," "); if (hdr->ID.Technician) free(hdr->ID.Technician); hdr->ID.Technician = (tech != NULL) ? strdup(tech) : NULL; hdr->ID.Manufacturer.Name = strtok(NULL," "); } Header1[167]=0; strtok(Header1+88," "); ptr_str = strtok(NULL," "); // check EDF+ Startdate against T0 if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211e-] <%s>\n",ptr_str); /* TODO: fix "Startdate X ..." */ if (strcmp(ptr_str,"X")) { int d,m,y; d = atoi(strtok(ptr_str,"-")); if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211e] <%s>\n",ptr_str); ptr_str = strtok(NULL,"-"); if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211f] <%s>\n",ptr_str); strcpy(tmp,ptr_str); for (k=0; k7) fprintf(stdout,"[EDF 211g] <%s>\n",tmp); y = atoi(strtok(NULL,"-")) - 1900; if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211h] <%i>\n",tm_time.tm_year); if ((tm_time.tm_mday == d) && (tm_time.tm_mon == m)) { tm_time.tm_year = y; tm_time.tm_isdst= -1; } else { fprintf(stderr,"Error SOPEN(EDF+): recording dates do not match %i/%i <> %i/%i\n",d,m,tm_time.tm_mday,tm_time.tm_mon); } } } if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 211z] #=%li\n",iftell(hdr)); } hdr->T0 = tm_time2gdf_time(&tm_time); if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 212] #=%li\n",iftell(hdr)); if (hdr->NS==0) return(hdr); hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); hdr->AS.Header = (uint8_t*) realloc(Header1,hdr->HeadLen); char *Header2 = (char*)hdr->AS.Header+256; count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); if (count < hdr->HeadLen) { biosigERROR(hdr, B4C_INCOMPLETE_FILE, "reading BDF/EDF variable header failed"); return(hdr); } /* identify buggy NeuroLoggerEDF export with bytes 236-257 EDF requires that the fields are left-justified, thus the first byte should be different than a space Therefore, the probability of a false positive detection is highly unlikely. */ char FLAG_BUGGY_NEUROLOGGER_EDF = !strncmp(Header1+236," 1 0 8 ",21) && Header1[0x180]==' ' && Header1[0x7c0]==' ' && Header1[0x400]==' ' && Header1[0x440]==' ' && Header1[0x480]==' ' && Header1[0x4c0]==' ' && Header1[0x500]==' '; if (FLAG_BUGGY_NEUROLOGGER_EDF) for (k=236; k<9*256; k++) Header1[k-1]=Header1[k]; char p[9]; hdr->AS.bpb = 0; size_t BitsPerBlock = 0; for (k=0, hdr->SPR = 1; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 213] #%i/%i\n",(int)k,hdr->NS); hc->LeadIdCode = 0; last = min(MAX_LENGTH_LABEL, 16); strncpy(hc->Label, Header2 + 16*k, last); while ((0 <= last) && (isspace(hc->Label[--last]))) ; hc->Label[last+1]=0; last = min(80,MAX_LENGTH_TRANSDUCER); strncpy(hc->Transducer, Header2+80*k+16*hdr->NS, last); while ((0 <= last) && (isspace(hc->Transducer[--last]))); hc->Transducer[last+1]=0; // PhysDim -> PhysDimCode last = 8; memcpy(p,Header2 + 8*k + 96*hdr->NS, last); while ((0 <= last) && (isspace(p[--last]))); p[last+1]=0; hc->PhysDimCode = PhysDimCode(p); tmp[8] = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 215a] #%i/%i\n",(int)k,hdr->NS); hc->PhysMin = atof(strncpy(tmp,Header2 + 8*k + 104*hdr->NS,8)); hc->PhysMax = atof(strncpy(tmp,Header2 + 8*k + 112*hdr->NS,8)); hc->DigMin = atof(strncpy(tmp,Header2 + 8*k + 120*hdr->NS,8)); hc->DigMax = atof(strncpy(tmp,Header2 + 8*k + 128*hdr->NS,8)); if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 215b] #%i/%i\n",(int)k,hdr->NS); hc->Cal = (hc->PhysMax - hc->PhysMin) / (hc->DigMax-hc->DigMin); hc->Off = hc->PhysMin - hc->Cal*hc->DigMin; if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 215c] #%i: NS=%i NRec=%i \n",(int)k,hdr->NS,(int)hdr->NRec); hc->LeadIdCode = 0; hc->SPR = atol(strncpy(tmp, Header2 + 8*k + 216*hdr->NS, 8)); hc->GDFTYP = ((hdr->TYPE != BDF) ? 3 : 255+24); hc->OnOff = 1; hc->bi = hdr->AS.bpb; hc->bi8 = BitsPerBlock; size_t nbits = GDFTYP_BITS[hc->GDFTYP]*(size_t)hc->SPR; BitsPerBlock += nbits; uint32_t nbytes = nbits>>3; hdr->AS.bpb += nbytes; if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 216] #%i/%i/%i/%i/%i/%i\n",(int)k,hdr->NS,nbytes,hdr->AS.bpb,hc->SPR,hdr->SPR); hc->LowPass = NAN; hc->HighPass = NAN; hc->Notch = NAN; hc->TOffset = NAN; hc->Impedance = NAN; // decode filter information into hdr->Filter.{Lowpass, Highpass, Notch} uint8_t kk; char PreFilt[81]; strncpy(PreFilt, Header2+ 80*k + 136*hdr->NS, 80); for (kk=0; kk<80; kk++) PreFilt[kk] = toupper(PreFilt[kk]); PreFilt[80] = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"#%i# <%s>\n",(int)k,PreFilt); char *s1; s1 = strstr(PreFilt,"HP:"); if (s1) hc->HighPass = strtod(s1+3, &s1); s1 = strstr(PreFilt,"LP:"); if (s1) hc->LowPass = strtod(s1+3, &s1); s1 = strstr(PreFilt,"NOTCH:"); if (s1) hc->Notch = strtod(s1+6, &s1); if (VERBOSE_LEVEL>7) fprintf(stdout,"#%i# HP: %fHz LP:%fHz NOTCH=%f\n",(int)k,hc->HighPass,hc->LowPass,hc->Notch); if ((hdr->TYPE==EDF) && !strncmp(Header1+192,"EDF+",4) && !strcmp(hc->Label,"EDF Annotations")) { hc->OnOff = 0; AnnotationChannel = k+1; } else if ((hdr->TYPE==BDF) && !strncmp(Header1+192,"BDF+",4) && !strcmp(hc->Label,"BDF Annotations")) { hc->OnOff = 0; AnnotationChannel = k+1; } if ((hdr->TYPE==BDF) && !strcmp(hc->Label,"Status")) { hc->OnOff = 0; StatusChannel = k+1; } if (hc->OnOff) { // common sampling rate is based only on date channels but not annotation channels hdr->SPR = lcm(hdr->SPR, hc->SPR); } if (VERBOSE_LEVEL>7) fprintf(stdout,"[EDF 219] #%i/%i/%i\n",(int)k,hdr->NS,hdr->SPR); } hdr->FLAG.OVERFLOWDETECTION = 0; // EDF does not support automated overflow and saturation detection double Dur = atof(strncpy(tmp,Header1+244,8)); if (Dur==0.0 && FLAG_BUGGY_NEUROLOGGER_EDF) Dur = hdr->SPR/496.0; hdr->SampleRate = hdr->SPR/Dur; if (VERBOSE_LEVEL>8) fprintf(stdout,"[EDF 220] #=%i SPR=%i\n",(int)iftell(hdr),(int)hdr->SPR); if (hdr->NRec <= 0) { struct stat FileBuf; stat(hdr->FileName,&FileBuf); hdr->NRec = (FileBuf.st_size - hdr->HeadLen)/hdr->AS.bpb; } if (AnnotationChannel) { /* read Annotation and Status channel and extract event information */ CHANNEL_TYPE *hc = hdr->CHANNEL+AnnotationChannel-1; size_t sz = GDFTYP_BITS[hc->GDFTYP]>>3; size_t bpb = hc->SPR * sz; size_t len = bpb * hdr->NRec; uint8_t *Marker = (uint8_t*)malloc(len + 1); size_t skip = hdr->AS.bpb - bpb; ifseek(hdr, hdr->HeadLen + hc->bi, SEEK_SET); nrec_t k3; for (k3=0; k3NRec; k3++) { ifread(Marker+k3*bpb, 1, bpb, hdr); ifseek(hdr, skip, SEEK_CUR); } Marker[hdr->NRec*bpb] = 20; // terminating marker size_t N_EVENT = 0; hdr->EVENT.SampleRate = hdr->SampleRate; /* convert EDF+/BDF+ annotation channel into event table */ for (k3 = 0; k3 < hdr->NRec; k3++) { double timeKeeping = 0; char *line = (char*)(Marker + k3 * bpb); char flag = !strncmp(Header1+193,"DF+D",4); // no time keeping for EDF+C while (line < (char*)(Marker + (k3+1) * bpb)) { // loop through all annotations within a segment if (VERBOSE_LEVEL>7) fprintf(stdout,"EDF+ line<%s>\n",line); char *next = strchr(line,0); // next points to end of annotation char *s1 = strtok(line,"\x14"); char *s2 = strtok(NULL,"\x14"); char *s3 = strtok(NULL,"\x14"); char *tstr = strtok(s1,"\x14\x15"); char *durstr = strtok(NULL,"\x14\x15"); if (tstr==NULL) { // TODO: check whether this is needed based on the EDF+ specs or whether it is an incorrect fprintf(stderr,"Warning EDF+ events: tstr not defined\n"); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i): EDF+ line<%s>\n",__FILE__,__LINE__,line); break; } double t = atof(tstr); if (flag>0 || s2!=NULL) { if (N_EVENT <= hdr->EVENT.N+1) { N_EVENT = reallocEventTable(hdr, max(6,hdr->EVENT.N*2)); if (N_EVENT == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } switch (flag) { case 0: // EDF+C FreeTextEvent(hdr, hdr->EVENT.N, s2); // set hdr->EVENT.TYP hdr->EVENT.POS[hdr->EVENT.N] = round(t * hdr->EVENT.SampleRate); break; case 1: // EDF+D: marker for beginning of segment hdr->EVENT.TYP[hdr->EVENT.N] = 0x7ffe; hdr->EVENT.POS[hdr->EVENT.N] = k3 * hdr->SPR; timeKeeping = t; flag = 2; break; default: // EDF+D: real annotation FreeTextEvent(hdr, hdr->EVENT.N, s2); // set hdr->EVENT.TYP hdr->EVENT.POS[hdr->EVENT.N] = k3 * hdr->SPR + round((t-timeKeeping) * hdr->EVENT.SampleRate); break; } #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = hdr->T0 + ldexp(t/(24*3600),32); #endif hdr->EVENT.DUR[hdr->EVENT.N] = durstr ? (atof(durstr)*hdr->EVENT.SampleRate) : 0; hdr->EVENT.CHN[hdr->EVENT.N] = 0; hdr->EVENT.N++; } if (VERBOSE_LEVEL>7) fprintf(stdout,"EDF+ event\n\ts1:\t<%s>\n\ts2:\t<%s>\n\ts3:\t<%s>\n\tsdelay:\t<%s>\n\tdur:\t<%s>\n\t\n",s1,s2,s3,tstr,durstr); for (line=next; *line==0; line++) {}; // skip \0's and set line to start of next annotation } } hdr->AS.auxBUF = Marker; // contains EVENT.CodeDesc strings } /* End reading if Annotation channel */ if (StatusChannel) { /* read Status channel and extract event information */ CHANNEL_TYPE *hc = hdr->CHANNEL+StatusChannel-1; size_t sz = GDFTYP_BITS[hc->GDFTYP]>>3; size_t len = hc->SPR * hdr->NRec * sz; uint8_t *Marker = (uint8_t*)malloc(len + 1); size_t skip = hdr->AS.bpb - hc->SPR * sz; ifseek(hdr, hdr->HeadLen + hc->bi, SEEK_SET); nrec_t k3; for (k3=0; k3NRec; k3++) { ifread(Marker+k3*hc->SPR * sz, 1, hc->SPR * sz, hdr); ifseek(hdr, skip, SEEK_CUR); } size_t N_EVENT = 0; hdr->EVENT.SampleRate = hdr->SampleRate; /* convert BDF status channel into event table*/ uint32_t d1, d0; for (d0=0, k=0; k < len/3; d0 = d1, k++) { d1 = ((uint32_t)Marker[3*k+2]<<16) + ((uint32_t)Marker[3*k+1]<<8) + (uint32_t)Marker[3*k]; /* count raising edges */ if (d1 & 0x010000) d1 = 0; else d1 &= 0x00ffff; if (d0 < d1) ++N_EVENT; /* raising and falling edges if ((d1 & 0x010000) != (d0 & 0x010000)) ++N_EVENT; if ((d1 & 0x00ffff) != (d0 & 0x00ffff)) ++N_EVENT; */ } hdr->EVENT.POS = (uint32_t*)realloc(hdr->EVENT.POS, (hdr->EVENT.N + N_EVENT) * sizeof(*hdr->EVENT.POS)); hdr->EVENT.TYP = (uint16_t*)realloc(hdr->EVENT.TYP, (hdr->EVENT.N + N_EVENT) * sizeof(*hdr->EVENT.TYP)); if (hdr->EVENT.POS==NULL || hdr->EVENT.TYP==NULL) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); } for (d0=0, k=0; k < len/3; d0=d1, k++) { d1 = ((uint32_t)Marker[3*k+2]<<16) + ((uint32_t)Marker[3*k+1]<<8) + (uint32_t)Marker[3*k]; /* raising edges */ if (d1 & 0x010000) d1 = 0; else d1 &= 0x00ffff; if (d0 < d1) { hdr->EVENT.POS[hdr->EVENT.N] = k; // 0-based indexing hdr->EVENT.TYP[hdr->EVENT.N] = d1; ++hdr->EVENT.N; } /* raising and falling edges if ((d1 & 0x010000) != (d0 & 0x010000)) { hdr->EVENT.POS[hdr->EVENT.N] = k; // 0-based indexing hdr->EVENT.TYP[hdr->EVENT.N] = 0x7ffe; ++hdr->EVENT.N; } if ((d1 & 0x00ffff) != (d0 & 0x00ffff)) { hdr->EVENT.POS[hdr->EVENT.N] = k; // 0-based indexing uint16_t d2 = d1 & 0x00ffff; if (!d2) d2 = (uint16_t)(d0 & 0x00ffff) | 0x8000; hdr->EVENT.TYP[hdr->EVENT.N] = d2; ++hdr->EVENT.N; if (d2==0x7ffe) fprintf(stdout,"Warning: BDF file %s uses ambigous code 0x7ffe; For details see file eventcodes.txt. \n",hdr->FileName); } */ } free(Marker); } /* End reading BDF Status channel */ ifseek(hdr, hdr->HeadLen, SEEK_SET); } else if (hdr->TYPE==ABF) { hdr->HeadLen = count; sopen_abf_read(hdr); } else if (hdr->TYPE==ABF2) { hdr->HeadLen = count; sopen_abf2_read(hdr); } #if defined(WITH_ATF) else if (hdr->TYPE==ATF) { // READ ATF hdr->HeadLen = count; hdr->VERSION = atof((char*)(hdr->AS.Header+4)); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) FMT=%s Ver=%4.2f\n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION); if (hdr->FILE.COMPRESSION) { biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "compressed ATF file format not supported"); return hdr; } sopen_atf_read(hdr); } #endif // WITH_ATF else if (hdr->TYPE==ACQ) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: try loading ACQ header \n", __FILE__, __LINE__, __func__); if ( !hdr->FILE.LittleEndian ) { hdr->NS = bei16p(hdr->AS.Header + 10); hdr->HeadLen += hdr->NS*1714; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s (..): v%g noChan=%u HeadLen=%u\n", \ __FILE__, __LINE__, __func__, hdr->VERSION, hdr->NS, hdr->HeadLen); biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "BigEndian ACQ file format is currently not supported"); return(hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s \n", __FILE__, __LINE__, __func__); /* defined in http://biopac.com/AppNotes/app156FileFormat/FileFormat.htm */ hdr->NS = lei16p(hdr->AS.Header+10); hdr->SampleRate = 1000.0/lef64p(hdr->AS.Header+16); hdr->NRec = 1; hdr->SPR = 1; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s \n", __FILE__, __LINE__, __func__); // add "per channel data section" if (hdr->VERSION<38.0) // Version 3.0+ hdr->HeadLen += hdr->NS*122; else if (hdr->VERSION<39.0) // Version 3.7.0+ hdr->HeadLen += hdr->NS*252; else if (hdr->VERSION<42.0) // Version 3.7.3+ hdr->HeadLen += hdr->NS*254; else if (hdr->VERSION<43.0) // Version 3.7.3+ hdr->HeadLen += hdr->NS*256; else // Version 3.8.2+ hdr->HeadLen += hdr->NS*262; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s \n", __FILE__, __LINE__, __func__); hdr->HeadLen += 4; // read header up to nLenght and nID of foreign data section hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header, hdr->HeadLen); count += ifread(Header1+count, 1, hdr->HeadLen-count, hdr); uint32_t POS = hdr->HeadLen; // read "foreign data section" and "per channel data types section" hdr->HeadLen += leu16p(hdr->AS.Header + hdr->HeadLen-4) - 4; // read "foreign data section" and "per channel data types section" hdr->HeadLen += 4*hdr->NS; hdr->AS.Header = (uint8_t*)realloc(Header1, hdr->HeadLen+8); count += ifread(Header1+POS, 1, hdr->HeadLen-POS, hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s %i/%i %i/%i %i/%i %i/%i %i/%i \n", \ __FILE__, __LINE__, __func__, \ leu16p(hdr->AS.Header+hdr->HeadLen-20), leu16p(hdr->AS.Header+hdr->HeadLen-18), \ leu16p(hdr->AS.Header+hdr->HeadLen-16), leu16p(hdr->AS.Header+hdr->HeadLen-14), \ leu16p(hdr->AS.Header+hdr->HeadLen-12), leu16p(hdr->AS.Header+hdr->HeadLen-10), \ leu16p(hdr->AS.Header+hdr->HeadLen-8), leu16p(hdr->AS.Header+hdr->HeadLen-6), \ leu16p(hdr->AS.Header+hdr->HeadLen-4), leu16p(hdr->AS.Header+hdr->HeadLen-2) \ ); // define channel specific header information hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); uint32_t* ACQ_NoSamples = (uint32_t*) calloc(hdr->NS, sizeof(uint32_t)); //uint16_t CHAN; POS = leu32p(hdr->AS.Header+6); size_t minBufLenXVarDiv = -1; // maximum integer value for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; uint8_t* Header2 = hdr->AS.Header+POS; hc->LeadIdCode = 0; hc->Transducer[0] = '\0'; //CHAN = leu16p(Header2+4); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: #%i %i %i %i %i\n", \ __FILE__, __LINE__, __func__, (int)k, (int)leu32p(Header2), (int)leu16p(Header2+4), (int)leu32p(Header2+88), (int)leu16p(Header2+250)); int len=min(MAX_LENGTH_LABEL,40); strncpy(hc->Label,(char*)Header2+6,len); hc->Label[len]=0; char tmp[21]; strncpy(tmp,(char*)Header2+68,20); tmp[20]=0; /* ACQ uses none-standard way of encoding physical units Convert to ISO/IEEE 11073-10101 */ if (!strcmp(tmp,"Volts")) hc->PhysDimCode = 4256; else if (!strcmp(tmp,"Seconds")) hc->PhysDimCode = 2176; else if (!strcmp(tmp,"deg C")) hc->PhysDimCode = 6048; else if (!strcmp(tmp,"microsiemen")) hc->PhysDimCode = 8307; else hc->PhysDimCode = PhysDimCode(tmp); hc->Off = lef64p(Header2+52); hc->Cal = lef64p(Header2+60); hc->OnOff = 1; hc->SPR = 1; if (hdr->VERSION >= 38.0) { hc->SPR = leu16p(Header2+250); // used here as Divider if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: %i:%i\n", __FILE__, __LINE__, __func__, (int)hdr->SPR, (int)hc->SPR); if (hc->SPR > 1) hdr->SPR = lcm(hdr->SPR, hc->SPR); else hc->SPR = 1; } ACQ_NoSamples[k] = leu32p(Header2+88); size_t tmp64 = leu32p(Header2+88) * hc->SPR; if (minBufLenXVarDiv > tmp64) minBufLenXVarDiv = tmp64; POS += leu32p((uint8_t*)Header2); } hdr->NRec = minBufLenXVarDiv; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i\n", __FILE__, __LINE__, __func__, POS); /// foreign data section - skip POS += leu16p(hdr->AS.Header+POS); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i,%i\n", __FILE__, __LINE__, __func__, (int)POS, (int)count); if (POS+2 > count) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i,%i\n", __FILE__, __LINE__, __func__, (int)POS, (int)count); hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header, POS+2); count += ifread(Header1+count, 1, POS+2-count, hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i\n", __FILE__, __LINE__, __func__, POS); size_t DataLen=0; for (k=0, hdr->AS.bpb=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if ((hdr->VERSION>=38.0) && (hc->SPR > 1)) hc->SPR = hdr->SPR/hc->SPR; // convert DIVIDER into SPR uint16_t u16 = leu16p(hdr->AS.Header+POS+2); switch (u16) { case 1: hc->GDFTYP = 17; // double DataLen += ACQ_NoSamples[k]<<3; hc->DigMax = 1e9; hc->DigMin = -1e9; break; case 2: hc->GDFTYP = 3; // int DataLen += ACQ_NoSamples[k]<<1; hc->DigMax = 32767; hc->DigMin = -32678; break; default: if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: #%i type=%i \n", __FILE__, __LINE__, __func__, (int)k, (int)u16); biosigERROR(hdr, B4C_UNSPECIFIC_ERROR, "SOPEN(ACQ-READ): invalid channel type."); }; hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; hc->bi = hdr->AS.bpb; hdr->AS.bpb += (GDFTYP_BITS[hc->GDFTYP]*hc->SPR)>>3; POS +=4; } free(ACQ_NoSamples); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i,%i\n", __FILE__, __LINE__, __func__, (int)POS, (int)count); /// Markers header section - skip POS += leu16p(hdr->AS.Header+POS); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i,%i\n", __FILE__, __LINE__, __func__, (int)POS, (int)count); if (POS+2 > count) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i,%i\n", __FILE__, __LINE__, __func__, (int)POS, (int)count); hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header, POS+2); count += ifread(Header1+count, 1, POS+2-count, hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i,%i\n", __FILE__, __LINE__, __func__, (int)POS, (int)count); /// Markers header section - skip POS += leu16p(hdr->AS.Header+POS); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i,%i\n", __FILE__, __LINE__, __func__, (int)POS, (int)count); if (POS+2 > count) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i,%i\n", __FILE__, __LINE__, __func__, (int)POS, (int)count); hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header, POS+2); count += ifread(Header1+count, 1, POS+2-count, hdr); } // hdr->HeadLen = count + 1; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s: POS=%i HeadLen=%i\n", __FILE__, __LINE__, __func__, POS, (int)hdr->HeadLen); /* ### FIXME ### reading Marker section POS = hdr->HeadLen; #ifdef ZLIB_H gzseek(hdr->FILE.FID, hdr->HeadLen+DataLen, SEEK_SET); // start of markers header section count = gzread(hdr->FILE.FID, Header1+POS, 8); #else fseek(hdr->FILE.FID, hdr->HeadLen+DataLen, SEEK_SET); // start of markers header section count = fread(Header1+POS, 1, 8, hdr->FILE.FID); #endif size_t LengthMarkerItemSection = (leu32p(Header1+POS)); hdr->EVENT.N = (leu32p(Header1+POS+4)); Header1 = (char*)realloc(Header1,hdr->HeadLen+8+LengthMarkerItemSection); POS += 8; #ifdef ZLIB_H count = gzread(hdr->FILE.FID, Header1+POS, LengthMarkerItemSection); #else count = fread(Header1+POS, 1, LengthMarkerItemSection, hdr->FILE.FID); #endif hdr->EVENT.TYP = (uint16_t*)calloc(hdr->EVENT.N,2); hdr->EVENT.POS = (uint32_t*)calloc(hdr->EVENT.N,4); for (k=0; kEVENT.N; k++) { fprintf(stdout,"ACQ EVENT: %i POS: %i\n",k,POS); hdr->EVENT.POS[k] = leu32p(Header1+POS); POS += 12 + leu16p(Header1+POS+10); } */ ifseek(hdr, hdr->HeadLen, SEEK_SET); } else if (hdr->TYPE==AINF) { ifclose(hdr); char *filename = hdr->FileName; // keep input file name char* tmpfile = (char*)calloc(strlen(hdr->FileName)+5,1); strcpy(tmpfile, hdr->FileName); // Flawfinder: ignore char* ext = strrchr(tmpfile,'.')+1; /* open and read header file */ strcpy(ext,"ainf"); hdr->FileName = tmpfile; hdr = ifopen(hdr,"rb"); count = 0; while (!ifeof(hdr)) { size_t bufsiz = 4096; hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count+bufsiz+1); count += ifread(hdr->AS.Header+count,1,bufsiz,hdr); } hdr->AS.Header[count]=0; hdr->HeadLen = count; ifclose(hdr); char *t1= NULL; char *t = strtok((char*)hdr->AS.Header,"\xA\xD"); while ((t) && !strncmp(t,"#",1)) { char* p; if ((p = strstr(t,"sfreq ="))) t1 = p; t = strtok(NULL,"\xA\xD"); } hdr->SampleRate = atof(strtok(t1+7," ")); hdr->SPR = 1; hdr->NS = 0; hdr->AS.bpb = 4; while (t) { int chno1=-1, chno2=-1; double f1,f2; char *label = NULL; #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L sscanf(t,"%d %as %d %lf %lf",&chno1,&label,&chno2,&f1,&f2); #else sscanf(t,"%d %ms %d %lf %lf",&chno1,&label,&chno2,&f1,&f2); #endif k = hdr->NS++; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); CHANNEL_TYPE *hc = hdr->CHANNEL+k; snprintf(hc->Label, MAX_LENGTH_LABEL+1, "%s %03i",label, chno2); hc->LeadIdCode = 0; hc->SPR = 1; hc->Cal = f1*f2; hc->Off = 0.0; hc->OnOff = 1; hc->GDFTYP = 3; hc->DigMax = 32767; hc->DigMin = -32678; hc->PhysMax= hc->DigMax * hc->Cal + hc->Off; hc->PhysMin= hc->DigMin * hc->Cal + hc->Off; hc->bi = hdr->AS.bpb; hdr->AS.bpb += 2; if (strcmp(label,"MEG")==0) hc->PhysDimCode = 1446; // "T/m" else hc->PhysDimCode = 4256; // "V" if (label) free(label); t = strtok(NULL,"\x0a\x0d"); } /* open data file */ strcpy(ext,"raw"); struct stat FileBuf; stat(hdr->FileName,&FileBuf); hdr = ifopen(hdr,"rb"); hdr->NRec = FileBuf.st_size/hdr->AS.bpb; hdr->HeadLen = 0; // hdr->FLAG.SWAP = (__BYTE_ORDER == __LITTLE_ENDIAN); // AINF is big endian hdr->FILE.LittleEndian = 0; /* restore input file name, and free temporary file name */ hdr->FileName = filename; free(tmpfile); } else if (hdr->TYPE==alpha) { ifclose(hdr); // close already opened file (typically its .../alpha.alp) sopen_alpha_read(hdr); } else if (hdr->TYPE==AXG) { sopen_axg_read(hdr); } else if (hdr->TYPE==Axona) { fprintf(stdout, "Axona: alpha version. \n"); hdr->AS.bpb = 12 + 20 + 2 * 192 + 16; hdr->NS = 4 + 64; hdr->SPR = 3; hdr->SampleRate = 24e3; struct stat FileBuf; if (stat(hdr->FileName, &FileBuf)==0) hdr->FILE.size = FileBuf.st_size; hdr->NRec = hdr->FILE.size / hdr->AS.bpb; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); CHANNEL_TYPE *hc; for (k = 0; k < hdr->NS; k++) { hc = hdr->CHANNEL + k; // hc->PhysDimCode = 4256; // "V" hc->PhysDimCode = 0; hc->Transducer[0] = 0; hc->LeadIdCode = 0; hc->SPR = hdr->SPR; hc->Cal = 1.0; hc->Off = 0.0; hc->OnOff = 1; hc->LeadIdCode = 0; hc->Notch = NAN; hc->LowPass = NAN; hc->HighPass = NAN; } for (k = 0; k+4 < hdr->NS; k++) { hc = hdr->CHANNEL + k + 4; sprintf(hc->Label, "#%02i", (int)k+1); hc->PhysDimCode = 4256; // "V" hc->PhysDimCode = 4274; // "mV" hc->PhysDimCode = 4275; // "uV" hc->GDFTYP = 3; hc->DigMax = 32767; hc->DigMin = -32678; hc->bi = 32 + 2*k; } hc = hdr->CHANNEL; strcpy(hc->Label, "PacketNumber"); hc->SPR = 1; hc->GDFTYP = 6; // uint32 hc->DigMin = 0.0; hc->DigMax = ldexp(1.0, 32) - 1.0; hc->bi = 4; hc = hdr->CHANNEL + 1; strcpy(hc->Label, "Digital I/O"); hc->SPR = 1; hc->GDFTYP = 6; // uint32 hc->DigMin = 0.0; hc->DigMax = ldexp(1.0, 32) - 1.0; hc->bi = 8; hc = hdr->CHANNEL + 2; strcpy(hc->Label, "FunKey"); hc->SPR = 1; hc->GDFTYP = 2; // uint8 hc->DigMin = 0.0; hc->DigMax = 255.0; hc->bi = 416; hc = hdr->CHANNEL + 3; strcpy(hc->Label, "Key Code"); hc->SPR = 1; hc->GDFTYP = 2; // uint8 hc->DigMin = 0.0; hc->DigMax = 255.0; hc->bi = 417; for (k = 0; k < hdr->NS; k++) { hc = hdr->CHANNEL + k; hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; } hdr->HeadLen = 0; ifseek(hdr, 0, SEEK_SET); HDRTYPE H1; H1.FILE.COMPRESSION = 1; // try always with zlib, libz reverts to no compression anyway. H1.FileName = malloc(strlen(hdr->FileName)+5); strcpy(H1.FileName, hdr->FileName); // Flawfinder: ignore char *e = strrchr(H1.FileName,'.'); if (e==NULL) e = H1.FileName+strlen(H1.FileName); strcpy(e,".set"); ifopen(&H1, "r"); unsigned MaxLineLen = 1000; char *line = malloc(MaxLineLen); double PhysMax = NAN; //char* ifgets(char *str, int n, HDRTYPE* hdr) { while (!ifeof(&H1)) { ifgets(line, MaxLineLen, &H1); if (MaxLineLen <= strlen(line)) { fprintf(stderr,"Warning (Axona): line ## in file <%s> exceeds maximum length\n",H1.FileName); } char *tag = strtok(line," \t\n\r"); char *val = strtok(NULL,"\n\r"); if (tag==NULL || val==NULL) ; else if (!strcmp(tag,"trial date")) ; else if (!strcmp(tag,"trial time")) ; else if (!strcmp(tag,"experimenter")) hdr->ID.Technician = strdup(val); else if (!strcmp(tag,"sw_version")) ; else if (!strcmp(tag,"ADC_fullscale_mv")) { char *e; PhysMax = strtod(val, &e); if (e==NULL) continue; // ignore value because its invalid } else if (!strncmp(tag,"gain_ch_",4)) { char *e; size_t ch = strtol(tag+8, &e, 10); if (e==NULL || ch >= hdr->NS) continue; // ignore value because its invalid double Cal = strtod(val, &e); if (e==NULL) continue; // ignore value because its invalid hdr->CHANNEL[ch].Cal = 1.0/Cal; hdr->CHANNEL[ch].Off = 0.0; hdr->CHANNEL[ch].PhysMax = +PhysMax; hdr->CHANNEL[ch].PhysMin = -PhysMax; hdr->CHANNEL[ch].DigMax = +PhysMax/Cal; hdr->CHANNEL[ch].DigMin = -PhysMax/Cal; } else if (!strcmp(tag,"rawRate")) { char *e; double fs = strtod(val, &e); if (e==NULL) continue; // ignore value because its invalid hdr->SampleRate = fs; } else if (!strcmp(tag,"")) { ; } } free(line); ifclose(&H1); free(H1.FileName); } else if ((hdr->TYPE==ASCII) || (hdr->TYPE==BIN)) { while (!ifeof(hdr)) { size_t bufsiz = 65536; hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count+bufsiz+1); count += ifread(hdr->AS.Header+count,1,bufsiz,hdr); } hdr->AS.Header[count]=0; hdr->HeadLen = count; ifclose(hdr); hdr->NS = 0; hdr->NRec = 1; hdr->SPR = 1; hdr->AS.bpb = 0; double Fs = 1.0; size_t N = 0; char status = 0; char *val = NULL; const char sep[] = " =\x09"; double duration = 0; size_t lengthRawData = 0; uint8_t FLAG_NUMBER_OF_FIELDS_READ; // used to trigger consolidation of channel info CHANNEL_TYPE *cp = NULL; char *datfile = NULL; uint16_t gdftyp = 0; char *line = strtok((char*)hdr->AS.Header,"\x0a\x0d"); while (line!=NULL) { if (VERBOSE_LEVEL>7) fprintf(stdout,"ASCII read line [%i]: <%s>\n",status,line); if (!strncmp(line,"[Header 1]",10)) status = 1; else if (!strncmp(line,"[Header 2]",10)) { status = 2; hdr->NS = 0; FLAG_NUMBER_OF_FIELDS_READ=0; } else if (!strncmp(line,"[EVENT TABLE]",13)) { status = 3; hdr->EVENT.SampleRate = hdr->SampleRate; N = 0; } val = strchr(line,'='); if ((val != NULL) && (status<3)) { val += strspn(val,sep); size_t c; c = strspn(val,"#"); if (c) val[c] = 0; // remove comments c = strcspn(line,sep); if (c) line[c] = 0; // deblank FLAG_NUMBER_OF_FIELDS_READ++; } if (VERBOSE_LEVEL>8) fprintf(stdout,"BIN <%s>=<%s> \n",line,val); if (status==1) { if (!strcmp(line,"Duration")) duration = atof(val); //else if (!strncmp(line,"NumberOfChannels")) else if (!strcmp(line,"Patient.Id")) strncpy(hdr->Patient.Id,val,MAX_LENGTH_PID); else if (!strcmp(line,"Patient.Birthday")) { struct tm t; sscanf(val,"%04i-%02i-%02i %02i:%02i:%02i",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); t.tm_year -=1900; t.tm_mon--; t.tm_isdst = -1; hdr->Patient.Birthday = tm_time2gdf_time(&t); } else if (!strcmp(line,"Patient.Weight")) hdr->Patient.Weight = atoi(val); else if (!strcmp(line,"Patient.Height")) hdr->Patient.Height = atoi(val); else if (!strcmp(line,"Patient.Gender")) hdr->Patient.Sex = atoi(val); else if (!strcmp(line,"Patient.Handedness")) hdr->Patient.Handedness = atoi(val); else if (!strcmp(line,"Patient.Smoking")) hdr->Patient.Smoking = atoi(val); else if (!strcmp(line,"Patient.AlcoholAbuse")) hdr->Patient.AlcoholAbuse = atoi(val); else if (!strcmp(line,"Patient.DrugAbuse")) hdr->Patient.DrugAbuse = atoi(val); else if (!strcmp(line,"Patient.Medication")) hdr->Patient.Medication = atoi(val); else if (!strcmp(line,"Recording.ID")) strncpy(hdr->ID.Recording,val,MAX_LENGTH_RID); else if (!strcmp(line,"Recording.Time")) { struct tm t; sscanf(val,"%04i-%02i-%02i %02i:%02i:%02i",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); t.tm_year -= 1900; t.tm_mon--; t.tm_isdst = -1; hdr->T0 = tm_time2gdf_time(&t); } else if (!strcmp(line,"Timezone")) { int m; if (sscanf(val,"%i min", &m) > 0) hdr->tzmin = m; } else if (!strcmp(line,"Recording.IPaddress")) { #ifndef WITHOUT_NETWORK #ifdef _WIN32 WSADATA wsadata; WSAStartup(MAKEWORD(1,1), &wsadata); #endif biosig_set_hdr_ipaddr(hdr, val); #ifdef _WIN32 WSACleanup(); #endif #endif // not WITHOUT_NETWORK } else if (!strcmp(line,"Recording.Technician")) { if (hdr->ID.Technician) free(hdr->ID.Technician); hdr->ID.Technician = strdup(val); } else if (!strcmp(line,"Manufacturer.Name")) hdr->ID.Manufacturer.Name = val; else if (!strcmp(line,"Manufacturer.Model")) hdr->ID.Manufacturer.Model = val; else if (!strcmp(line,"Manufacturer.Version")) hdr->ID.Manufacturer.Version = val; else if (!strcmp(line,"Manufacturer.SerialNumber")) hdr->ID.Manufacturer.SerialNumber = val; } else if (status==2) { if (!strcmp(line,"Filename")) { // add next channel ++hdr->NS; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS*sizeof(CHANNEL_TYPE)); cp = hdr->CHANNEL+hdr->NS-1; cp->bi = hdr->AS.bpb; cp->PhysDimCode = 0; cp->HighPass = NAN; cp->LowPass = NAN; cp->Notch = NAN; cp->Impedance= NAN; cp->fZ = NAN; cp->LeadIdCode = 0; datfile = val; FLAG_NUMBER_OF_FIELDS_READ = 1; } else if (!strcmp(line,"Label")) strncpy(cp->Label,val,MAX_LENGTH_LABEL); else if (!strcmp(line,"GDFTYP")) { if (!strcmp(val,"int8")) gdftyp = 1; else if (!strcmp(val,"uint8")) gdftyp = 2; else if (!strcmp(val,"int16")) gdftyp = 3; else if (!strcmp(val,"uint16")) gdftyp = 4; else if (!strcmp(val,"int32")) gdftyp = 5; else if (!strcmp(val,"uint32")) gdftyp = 6; else if (!strcmp(val,"int64")) gdftyp = 7; else if (!strcmp(val,"uint64")) gdftyp = 8; else if (!strcmp(val,"float32")) gdftyp = 16; else if (!strcmp(val,"float64")) gdftyp = 17; else if (!strcmp(val,"float128")) gdftyp = 18; else if (!strcmp(val,"ascii")) gdftyp = 0xfffe; else gdftyp = atoi(val); } else if (!strcmp(line,"PhysicalUnits")) cp->PhysDimCode = PhysDimCode(val); else if (!strcmp(line,"PhysDimCode")) { // If PhysicalUnits and PhysDimCode conflict, PhysicalUnits gets the preference if (!cp->PhysDimCode) cp->PhysDimCode = atoi(val); } else if (!strcmp(line,"Transducer")) strncpy(cp->Transducer,val,MAX_LENGTH_TRANSDUCER); else if (!strcmp(line,"SamplingRate")) Fs = atof(val); else if (!strcmp(line,"NumberOfSamples")) { cp->SPR = atol(val); if (cp->SPR>0) hdr->SPR = lcm(hdr->SPR,cp->SPR); if ((gdftyp>0) && (gdftyp<256)) { cp->GDFTYP = gdftyp; FILE *fid = fopen(datfile,"rb"); if (fid != NULL) { size_t bufsiz = (size_t)cp->SPR*GDFTYP_BITS[cp->GDFTYP]>>3; hdr->AS.rawdata = (uint8_t*) realloc(hdr->AS.rawdata,lengthRawData+bufsiz+1); count = fread(hdr->AS.rawdata+lengthRawData,1,bufsiz+1,fid); if (count != bufsiz) fprintf(stderr,"Warning SOPEN(BIN) #%i: mismatch between sample number and file size (%i,%i)\n",hdr->NS-1,(int)count,(int)bufsiz); lengthRawData += bufsiz; fclose(fid); } else if (cp->SPR > 0) { cp->SPR = 0; fprintf(stderr,"Warning SOPEN(BIN) #%i: data file (%s) not found\n",hdr->NS,datfile); } } else if (gdftyp==0xfffe) { cp->GDFTYP = 17; // double struct stat FileBuf; stat(datfile, &FileBuf); FILE *fid = fopen(datfile,"rb"); if (fid != NULL) { char *buf = (char*)malloc(FileBuf.st_size+1); count = fread(buf, 1, FileBuf.st_size, fid); fclose(fid); buf[count] = 0; size_t sz = GDFTYP_BITS[cp->GDFTYP]>>3; const size_t bufsiz = cp->SPR * sz; hdr->AS.rawdata = (uint8_t*) realloc(hdr->AS.rawdata, lengthRawData+bufsiz); char *bufbak = buf; // backup copy char **endptr = &bufbak; for (k = 0; k < cp->SPR; k++) { double d = strtod(*endptr,endptr); *(double*)(hdr->AS.rawdata+lengthRawData+sz*k) = d; } lengthRawData += bufsiz; free(buf); } else if (cp->SPR > 0) { cp->SPR = 0; fprintf(stderr,"Warning SOPEN(BIN) #%i: data file (%s) not found\n",hdr->NS,datfile); } } else { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "ASCII/BIN: data type unsupported"); } hdr->AS.bpb = lengthRawData; } else if (!strcmp(line,"HighPassFilter")) cp->HighPass = atof(val); else if (!strcmp(line,"LowPassFilter")) cp->LowPass = atof(val); else if (!strcmp(line,"NotchFilter")) cp->Notch = atof(val); else if (!strcmp(line,"DigMax")) cp->DigMax = atof(val); else if (!strcmp(line,"DigMin")) cp->DigMin = atof(val); else if (!strcmp(line,"PhysMax")) cp->PhysMax = atof(val); else if (!strcmp(line,"PhysMin")) cp->PhysMin = atof(val); else if (!strcmp(line,"Impedance")) cp->Impedance = atof(val); else if (!strcmp(line,"freqZ")) cp->fZ = atof(val); else if (!strncmp(line,"Position",8)) { sscanf(val,"%f \t%f \t%f",cp->XYZ,cp->XYZ+1,cp->XYZ+2); // consolidate previous channel if ((((size_t)cp->SPR*GDFTYP_BITS[cp->GDFTYP] >> 3) != (hdr->AS.bpb-cp->bi)) && (hdr->TYPE==BIN)) { fprintf(stdout,"Warning SOPEN(BIN): problems with channel %i - filesize %i does not fit header info %"PRIiPTR"\n",(int)k+1, hdr->AS.bpb-hdr->CHANNEL[k].bi, (GDFTYP_BITS[hdr->CHANNEL[k].GDFTYP]*(size_t)hdr->CHANNEL[k].SPR) >> 3); } hdr->SampleRate = hdr->SPR/duration; cp->LeadIdCode = 0; cp->OnOff = 1; cp->Cal = (cp->PhysMax - cp->PhysMin) / (cp->DigMax - cp->DigMin); cp->Off = cp->PhysMin - cp->Cal*cp->DigMin; } } else if (status==3) { if (!strncmp(line,"0x",2)) { if (hdr->EVENT.N+1 >= N) { N = max(4096, 2*N); if (N != reallocEventTable(hdr, N)) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } val = line+2; int i; sscanf(val,"%04x",&i); if (i>0xffff) fprintf(stdout,"Warning: Type %i of event %i does not fit in 16bit\n",i,hdr->EVENT.N); else hdr->EVENT.TYP[hdr->EVENT.N] = (typeof(hdr->EVENT.TYP[0]))i; double d; val = strchr(val,'\t')+1; sscanf(val,"%lf",&d); hdr->EVENT.POS[hdr->EVENT.N] = (typeof(*hdr->EVENT.POS))round(d*hdr->EVENT.SampleRate); // 0-based indexing #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif val = strchr(val,'\t')+1; if (val[0]!='\t') { sscanf(val,"%lf",&d); hdr->EVENT.DUR[hdr->EVENT.N] = (typeof(*hdr->EVENT.POS))round(d*hdr->EVENT.SampleRate); } else hdr->EVENT.DUR[hdr->EVENT.N] = 0; val = strchr(val,'\t')+1; if (val[0]!='\t') { sscanf(val,"%d",&i); if (i>0xffff) fprintf(stdout,"Warning: channel number %i of event %i does not fit in 16bit\n",i,hdr->EVENT.N); else hdr->EVENT.CHN[hdr->EVENT.N] = i; } else hdr->EVENT.CHN[hdr->EVENT.N] = 0; val = strchr(val,'\t')+1; if ((hdr->EVENT.TYP[hdr->EVENT.N]==0x7fff) && (hdr->EVENT.CHN[hdr->EVENT.N]>0) && (!hdr->CHANNEL[hdr->EVENT.CHN[hdr->EVENT.N]-1].SPR)) { sscanf(val,"%d",&hdr->EVENT.DUR[hdr->EVENT.N]); } ++hdr->EVENT.N; } } line = strtok(NULL,"\x0a\x0d"); } hdr->AS.length = hdr->NRec; } else if (hdr->TYPE==BCI2000) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) FMT=%s Ver=%4.2f\n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION); char *ptr, *t1; /* decode header length */ hdr->HeadLen = 0; ptr = strstr((char*)hdr->AS.Header,"HeaderLen="); if (ptr==NULL) biosigERROR(hdr, B4C_FORMAT_UNKNOWN, "not a BCI2000 format"); else { /* read whole header */ hdr->HeadLen = (typeof(hdr->HeadLen)) strtod(ptr+10,&ptr); if (count <= hdr->HeadLen) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, hdr->HeadLen+1); count += ifread(hdr->AS.Header+count,1,hdr->HeadLen-count,hdr); } else ifseek(hdr,hdr->HeadLen,SEEK_SET); } hdr->AS.Header[hdr->HeadLen]=0; hdr->AS.bci2000 = (char*)realloc(hdr->AS.bci2000, hdr->HeadLen+1); memcpy(hdr->AS.bci2000, hdr->AS.Header, hdr->HeadLen+1); /* decode number of channels */ t1 = strtok((char*)hdr->AS.Header,"\x0a\x0d"); ptr = strstr(t1,"SourceCh="); if (ptr==NULL) biosigERROR(hdr, B4C_FORMAT_UNKNOWN, "not a BCI2000 format"); else hdr->NS = (typeof(hdr->NS)) strtod(ptr+9,&ptr); /* decode length of state vector */ ptr = strstr(t1,"StatevectorLen="); if (ptr==NULL) biosigERROR(hdr, B4C_FORMAT_UNKNOWN, "not a BCI2000 format"); else BCI2000_StatusVectorLength = (size_t) strtod(ptr+15,&ptr); /* decode data format */ ptr = strstr(ptr,"DataFormat="); uint16_t gdftyp=3; if (ptr == NULL) gdftyp = 3; else if (!strncmp(ptr+12,"int16",3)) gdftyp = 3; else if (!strncmp(ptr+12,"int32",5)) gdftyp = 5; else if (!strncmp(ptr+12,"float32",5)) gdftyp = 16; else if (!strncmp(ptr+12,"int24",5)) gdftyp = 255+24; else if (!strncmp(ptr+12,"uint16",3)) gdftyp = 4; else if (!strncmp(ptr+12,"uint32",5)) gdftyp = 6; else if (!strncmp(ptr+12,"uint24",5)) gdftyp = 511+24; else if (!strncmp(ptr+12,"float64",6)) gdftyp = 17; else biosigERROR(hdr, B4C_FORMAT_UNKNOWN, "SOPEN(BCI2000): invalid file format"); if (hdr->AS.B4C_ERRNUM) { return(hdr); } if (hdr->FLAG.OVERFLOWDETECTION) { fprintf(stderr,"WARNING: Automated overflowdetection not supported in BCI2000 file %s\n",hdr->FileName); hdr->FLAG.OVERFLOWDETECTION = 0; } hdr->SPR = 1; double gain=0.0, offset=0.0, digmin=0.0, digmax=0.0; size_t tc_len=0,tc_pos=0, rs_len=0,rs_pos=0, fb_len=0,fb_pos=0; char TargetOrientation=0; hdr->AS.bpb = 0; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; sprintf(hc->Label,"#%03i",(int)k+1); hc->Cal = gain; hc->Off = offset; hc->PhysDimCode = 4275; // uV hc->LeadIdCode = 0; hc->OnOff = 1; hc->SPR = 1; hc->GDFTYP = gdftyp; hc->bi = hdr->AS.bpb; hdr->AS.bpb += (GDFTYP_BITS[hc->GDFTYP] * (size_t)hc->SPR)>>3; } if (hdr->TYPE==BCI2000) hdr->AS.bpb += BCI2000_StatusVectorLength; int status = 0; ptr = strtok(NULL,"\x0a\x0d"); while (ptr != NULL) { if (VERBOSE_LEVEL>8) fprintf(stdout,"[203] %i: %s !\n",status,ptr); if (!strncmp(ptr,"[ State Vector Definition ]",26)) status = 1; else if (!strncmp(ptr,"[ Parameter Definition ]",24)) status = 2; else if (!strncmp(ptr,"[ ",2)) status = 3; else if (status==1) { int i[4]; char *item = NULL; #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L sscanf(ptr,"%as %i %i %i %i",&item,i,i+1,i+2,i+3); #else sscanf(ptr,"%ms %i %i %i %i",&item,i,i+1,i+2,i+3); #endif if (!strcmp(item,"TargetCode")) { tc_pos = i[2]*8 + i[3]; tc_len = i[0]; } else if (!strcmp(item,"ResultCode")) { rs_pos = i[2]*8 + i[3]; rs_len = i[0]; } else if (!strcmp(item,"Feedback")) { fb_pos = i[2]*8 + i[3]; fb_len = i[0]; } if (item) free(item); } else if (status==2) { t1 = strstr(ptr,"ChannelNames="); if (t1 != NULL) { unsigned NS = (unsigned)strtod(t1+13,&ptr); for (k=0; kMAX_LENGTH_LABEL) k1=MAX_LENGTH_LABEL; strncpy(hdr->CHANNEL[k].Label,ptr-k1,k1); hdr->CHANNEL[k].Label[k1]=0; // terminating 0 } } t1 = strstr(ptr,"SamplingRate="); if (t1 != NULL) hdr->SampleRate = strtod(t1+14,&ptr); t1 = strstr(ptr,"SourceChGain="); if (t1 != NULL) { unsigned NS = (unsigned) strtod(t1+13,&ptr); for (k=0; kCHANNEL[k].Cal = strtod(ptr,&ptr); for (; kNS; k++) hdr->CHANNEL[k].Cal = hdr->CHANNEL[k-1].Cal; } t1 = strstr(ptr,"SourceChOffset="); if (t1 != NULL) { unsigned NS = (unsigned) strtod(t1+15,&ptr); for (k=0; kCHANNEL[k].Off = strtod(ptr,&ptr); for (; kNS; k++) hdr->CHANNEL[k].Off = hdr->CHANNEL[k-1].Off; } t1 = strstr(ptr,"SourceMin="); if (t1 != NULL) digmin = strtod(t1+10,&ptr); t1 = strstr(ptr,"SourceMax="); if (t1 != NULL) digmax = strtod(t1+10,&ptr); t1 = strstr(ptr,"StorageTime="); if (t1 != NULL) { char *t2 = strstr(t1,"%20"); while (t2!=NULL) { memset(t2,' ',3); t2 = strstr(t1,"%20"); } char tmp[20]; int c=sscanf(t1+12,"%03s %03s %2u %2u:%2u:%2u %4u",tmp+10,tmp,&tm_time.tm_mday,&tm_time.tm_hour,&tm_time.tm_min,&tm_time.tm_sec,&tm_time.tm_year); if (c==7) { tm_time.tm_isdst = -1; tm_time.tm_year -= 1900; tm_time.tm_mon = month_string2int(tmp); hdr->T0 = tm_time2gdf_time(&tm_time); } } t1 = strstr(ptr,"TargetOrientation="); if (t1 != NULL) TargetOrientation = (char) strtod(t1+18, &ptr); // else if (status==3); } ptr = strtok(NULL,"\x0a\x0d"); } for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->DigMax = digmax; hc->DigMin = digmin; hc->PhysMax= hc->DigMax * hc->Cal + hc->Off; hc->PhysMin= hc->DigMin * hc->Cal + hc->Off; } hdr->AS.bpb = (hdr->NS * (GDFTYP_BITS[gdftyp]>>3) + BCI2000_StatusVectorLength); /* decode state vector into event table */ hdr->EVENT.SampleRate = hdr->SampleRate; size_t skip = hdr->NS * (GDFTYP_BITS[gdftyp]>>3); size_t N = 0; count = 0; uint8_t *StatusVector = (uint8_t*) malloc(BCI2000_StatusVectorLength*2); uint32_t b0=0,b1=0,b2=0,b3,b4=0,b5; while (!ifeof(hdr)) { ifseek(hdr, skip, SEEK_CUR); ifread(StatusVector + BCI2000_StatusVectorLength*(count & 1), 1, BCI2000_StatusVectorLength, hdr); if (memcmp(StatusVector, StatusVector+BCI2000_StatusVectorLength, BCI2000_StatusVectorLength)) { if (N+4 >= hdr->EVENT.N) { hdr->EVENT.N += 1024; if (SIZE_MAX == reallocEventTable(hdr, hdr->EVENT.N)) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[N] = 0; #endif /* event codes according to http://www.bci2000.org/wiki/index.php/User_Reference:GDFFileWriter http://biosig.cvs.sourceforge.net/biosig/biosig/doc/eventcodes.txt?view=markup */ /* decode ResultCode */ b3 = *(uint32_t*)(StatusVector + BCI2000_StatusVectorLength*(count & 1) + (rs_pos>>3)); b3 = (b3 >> (rs_pos & 7)) & ((1<b2) hdr->EVENT.TYP[N] = ( b3==b1 ? 0x0381 : 0x0382); else hdr->EVENT.TYP[N] = ( b2==b0 ? 0x8381 : 0x8382); hdr->EVENT.POS[N] = count; // 0-based indexing N++; b2 = b3; } /* decode TargetCode */ b1 = *(uint32_t*)(StatusVector + BCI2000_StatusVectorLength*(count & 1) + (tc_pos>>3)); b1 = (b1 >> (tc_pos & 7)) & ((1<EVENT.TYP[N] = 0x030c; break; case 2: hdr->EVENT.TYP[N] = 0x0306; break; case -1: hdr->EVENT.TYP[N] = 0x830c; break; case -2: hdr->EVENT.TYP[N] = 0x8306; break; default: if (b1>b0) hdr->EVENT.TYP[N] = 0x0300 + b1 - b0; else hdr->EVENT.TYP[N] = 0x8300 + b0 - b1; } } else { if (b1>b0) hdr->EVENT.TYP[N] = 0x0300 + b1 - b0; else hdr->EVENT.TYP[N] = 0x8300 + b0 - b1; } hdr->EVENT.POS[N] = count; // 0-based indexing N++; b0 = b1; } /* decode Feedback */ b5 = *(uint32_t*)(StatusVector + BCI2000_StatusVectorLength*(count & 1) + (fb_pos>>3)); b5 = (b5 >> (fb_pos & 7)) & ((1< b4) hdr->EVENT.TYP[N] = 0x030d; else if (b5 < b4) hdr->EVENT.TYP[N] = 0x830d; if (b5 != b4) { hdr->EVENT.POS[N] = count; // 0-based indexing N++; b4 = b5; } } count++; } hdr->EVENT.N = N; free(StatusVector); hdr->NRec = (iftell(hdr) - hdr->HeadLen) / hdr->AS.bpb; ifseek(hdr, hdr->HeadLen, SEEK_SET); if (VERBOSE_LEVEL>8) fprintf(stdout,"[209] header finished!\n"); } else if (hdr->TYPE==BKR) { if (VERBOSE_LEVEL>8) fprintf(stdout,"libbiosig/sopen (BKR)\n"); hdr->HeadLen = 1024; hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, hdr->HeadLen); count += ifread(hdr->AS.Header+count,1,hdr->HeadLen-count,hdr); hdr->NS = leu16p(hdr->AS.Header+2); hdr->NRec = leu32p(hdr->AS.Header+6); hdr->SPR = leu32p(hdr->AS.Header+10); hdr->NRec *= hdr->SPR; hdr->SPR = 1; hdr->T0 = 0; // Unknown; hdr->SampleRate = leu16p(hdr->AS.Header+4); /* extract more header information */ hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; sprintf(hc->Label,"# %02i",(int)k); hc->Transducer[0] = '\0'; hc->GDFTYP = 3; hc->SPR = 1; // *(int32_t*)(Header1+56); hc->LowPass = lef32p(hdr->AS.Header+22); hc->HighPass = lef32p(hdr->AS.Header+26); hc->Notch = -1.0; // unknown hc->PhysMax = (double)leu16p(hdr->AS.Header+14); hc->DigMax = (double)leu16p(hdr->AS.Header+16); hc->PhysMin = -hc->PhysMax; hc->DigMin = -hc->DigMax; hc->Cal = hc->PhysMax/hc->DigMax; hc->Off = 0.0; hc->OnOff = 1; hc->PhysDimCode = 4275; // uV hc->LeadIdCode = 0; hc->bi = k*2; } hdr->AS.bpb = hdr->NS*2; hdr->FLAG.OVERFLOWDETECTION = 0; // BKR does not support automated overflow and saturation detection } else if (hdr->TYPE==BLSC) { hdr->HeadLen = hdr->AS.Header[1]<<7; if (countHeadLen) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, hdr->HeadLen); count += ifread(hdr->AS.Header+count,1,hdr->HeadLen-count,hdr); } hdr->VERSION = leu16p(hdr->AS.Header+2)/100.0; hdr->SampleRate = 128; hdr->SPR = 1; hdr->NS = hdr->AS.Header[346]; const uint32_t GAIN[] = { 0,50000,75000,100000,150000,200000,250000,300000, //0-7 0,5000,7500,10000,15000,20000,25000,30000, //8-15 0,500,750,1000,1500,2000,2500,3000, //16-23 10,50,75,100,150,200,250,300 //24-31 }; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->Label[0] = 0; hc->Transducer[0] = '\0'; hc->GDFTYP = 2; hc->SPR = hdr->SPR; // *(int32_t*)(Header1+56); hc->LowPass = -1.0; hc->HighPass = -1.0; hc->Notch = -1.0; // unknown hc->DigMax = 255; hc->DigMin = 0; #define SENS leu16p(hdr->AS.Header+467) #define CALUV leu16p(hdr->AS.Header+469) #define CV hdr->AS.Header[425+k] #define DC hdr->AS.Header[446+k] #define gain GAIN[hdr->AS.Header[602+k]] if (VERBOSE_LEVEL>8) fprintf(stdout,"#%i sens=%i caluv=%i cv=%i dc=%i Gain=%i\n",(int)k,SENS,CALUV,CV,DC,gain); double cal, off; if (hdr->AS.Header[5]==0) { // external amplifier cal = 0.2*CALUV*SENS/CV; off = -DC*cal; } else { // internal amplifier cal = 4e6/(CV*gain); off = -(128+(DC-128)*gain/3e5)*cal; } #undef SENS #undef CALUV #undef CV #undef DC #undef gain hc->Cal = cal; hc->Off = off; hc->PhysMax = hc->DigMax * cal + off; hc->PhysMin = hc->DigMin * cal + off; hc->OnOff = 1; hc->PhysDimCode = 4275; // uV hc->LeadIdCode = 0; hc->bi = k*hc->SPR*(GDFTYP_BITS[2]>>3); } hdr->AS.bpb = hdr->NS*hdr->SPR*(GDFTYP_BITS[2]>>3); struct stat FileBuf; stat(hdr->FileName,&FileBuf); hdr->NRec = FileBuf.st_size/hdr->NS; ifseek(hdr, hdr->HeadLen, SEEK_SET); } else if (hdr->TYPE==BNI) { // BNI-1-Baltimore/Nicolet char *line = strtok((char*)hdr->AS.Header,"\x0a\x0d"); fprintf(stderr,"Warning SOPEN: BNI not implemented - experimental code!\n"); double cal=0,age; char *Label=NULL; struct tm t; while (line != NULL) { size_t c1 = strcspn(line," ="); size_t c2 = strspn(line+c1," ="); char *val = line+c1+c2; if (!strncmp(line,"PatientId",9)) strncpy(hdr->Patient.Id,val,MAX_LENGTH_PID); else if (!strncasecmp(line,"Sex",3)) hdr->Patient.Sex = 1*(toupper(val[0])=='M')+2*(toupper(val[0])=='F'); else if (!strncasecmp(line,"medication",11)) hdr->Patient.Medication = val==NULL ? 1 : 2; else if (!strncasecmp(line,"diagnosis",10)) { } else if (!strncasecmp(line,"MontageRaw",9)) Label = val; else if (!strncasecmp(line,"Age",3)) age = atol(val); else if (!strncasecmp(line,"Date",c1)) sscanf(val,"%02i/%02i/%02i",&t.tm_mon,&t.tm_mday,&t.tm_year); else if (!strncasecmp(line,"Time",c1)) sscanf(val,"%02i:%02i:%02i",&t.tm_hour,&t.tm_min,&t.tm_sec); else if (!strncasecmp(line,"Rate",c1)) hdr->SampleRate = atol(val); else if (!strncasecmp(line,"NchanFile",9)) hdr->NS = atol(val); else if (!strncasecmp(line,"UvPerBit",c1)) cal = atof(val); else if (!strncasecmp(line,"[Events]",c1)) { // not implemented yet } else fprintf(stdout,"SOPEN(BNI): unknown field %s=%s\n",line,val); line = strtok(NULL,"\x0a\x0d"); } hdr->T0 = tm_time2gdf_time(&t); hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (!k) strncpy(hc->Label, strtok(Label,","),MAX_LENGTH_LABEL); else strncpy(hc->Label, strtok(NULL,","),MAX_LENGTH_LABEL); hc->Transducer[0] = '\0'; hc->GDFTYP = 0xffff; // unknown - triggers error status hc->SPR = 1; // hc->LowPass = -1.0; hc->HighPass = -1.0; hc->Notch = -1.0; // unknown hc->DigMax = 32767; hc->DigMin = -32768; hc->Cal = cal; hc->Off = 0.0; hc->PhysMax = hc->DigMax * cal; hc->PhysMin = hc->DigMin * cal; hc->OnOff = 1; hc->PhysDimCode = 4275; // uV hc->LeadIdCode = 0; //hc->bi = k*GDFTYP_BITS[hc->GDFTYP]>>3; } } else if (hdr->TYPE==BrainVisionMarker) { while (!ifeof(hdr)) { size_t bufsiz = 4096; hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count+bufsiz+1); count += ifread(hdr->AS.Header+count,1,bufsiz,hdr); } hdr->AS.Header[count]=0; hdr->HeadLen = count; ifclose(hdr); if (VERBOSE_LEVEL>8) fprintf(stdout,"SOPEN(BV): marker file read.\n"); int seq = 0; /* decode marker file */ char *t,*t1=" "; t = Header1; t += strcspn(Header1,"\x0A\x0D"); t += strspn(t,"\x0A\x0D"); //char *t1 = strtok(Header1,"\x0A\x0D"); // skip first line size_t N_EVENT=0; hdr->EVENT.N=0; do { t1 = t; t += strcspn(t,"\x0A\x0D"); t += strspn(t,"\x0A\x0D"); t[-1]=0; if (VERBOSE_LEVEL>8) fprintf(stdout,"%i <%s>\n",seq,t1); if (!strncmp(t1,";",1)) ; else if (!strncmp(t1,"[Common Infos]",14)) seq = 1; else if (!strncmp(t1,"[Marker Infos]",14)) seq = 2; else if (seq==1) ; else if ((seq==2) && !strncmp(t1,"Mk",2)) { int p1 = strcspn(t1,"="); int p2 = p1 + 1 + strcspn(t1+p1+1,","); int p3 = p2 + 1 + strcspn(t1+p2+1,","); int p4 = p3 + 1 + strcspn(t1+p3+1,","); int p5 = p4 + 1 + strcspn(t1+p4+1,","); int p6 = p5 + 1 + strcspn(t1+p5+1,","); if (VERBOSE_LEVEL>8) fprintf(stdout," %i %i %i %i %i %i \n",p1,p2,p3,p4,p5,p6); t1[p1]=0; t1[p2]=0; t1[p3]=0; t1[p4]=0; t1[p5]=0; if (hdr->EVENT.N <= N_EVENT) { hdr->EVENT.N += 256; if (reallocEventTable(hdr, hdr->EVENT.N) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } hdr->EVENT.TYP[N_EVENT] = atol(t1+p2+2); hdr->EVENT.POS[N_EVENT] = atol(t1+p3+1)-1; // 0-based indexing hdr->EVENT.DUR[N_EVENT] = atol(t1+p4+1); hdr->EVENT.CHN[N_EVENT] = atol(t1+p5+1); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[N_EVENT] = 0; #endif if (!strncmp(t1+p1+1,"New Segment",11)) { hdr->EVENT.TYP[N_EVENT] = 0x7ffe; char* t2 = t1+p6+1; t2[14]=0; tm_time.tm_sec = atoi(t2+12); t2[12]=0; tm_time.tm_min = atoi(t2+10); t2[10]=0; tm_time.tm_hour = atoi(t2+8); t2[8] =0; tm_time.tm_mday = atoi(t2+6); t2[6] =0; tm_time.tm_mon = atoi(t2+4)-1; t2[4] =0; tm_time.tm_year = atoi(t2)-1900; hdr->T0 = tm_time2gdf_time(&tm_time); } else { if (VERBOSE_LEVEL>8) fprintf(stdout,"#%02i <%s>\n",(int)N_EVENT,t1+p2+1); FreeTextEvent(hdr,N_EVENT,t1+p2+1); } ++N_EVENT; } } while (strlen(t1)>0); // free(vmrk); hdr->AS.auxBUF = hdr->AS.Header; hdr->AS.Header = NULL; hdr->EVENT.N = N_EVENT; hdr->TYPE = EVENT; } else if ((hdr->TYPE==BrainVision) || (hdr->TYPE==BrainVisionVAmp)) { /* open and read header file */ // ifclose(hdr); char *filename = hdr->FileName; // keep input file name char* tmpfile = (char*)calloc(strlen(hdr->FileName)+5,1); strcpy(tmpfile, hdr->FileName); // Flawfinder: ignore hdr->FileName = tmpfile; char* ext = strrchr((char*)hdr->FileName,'.')+1; while (!ifeof(hdr)) { size_t bufsiz = 4096; hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count+bufsiz+1); count += ifread(hdr->AS.Header+count,1,bufsiz,hdr); } hdr->AS.Header[count]=0; hdr->HeadLen = count; ifclose(hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN(BV): header file read.\n"); int seq = 0; /* decode header information */ hdr->FLAG.OVERFLOWDETECTION = 0; seq = 0; uint16_t gdftyp=3; char FLAG_ASCII = 0; hdr->FILE.LittleEndian = 1; // default little endian double physmax=1e6,physmin=-1e6,digmax=1e6,digmin=-1e6,cal=1.0,off=0.0; enum o_t{VEC,MUL} orientation = MUL; char DECIMALSYMBOL='.'; int SKIPLINES=0, SKIPCOLUMNS=0; size_t npts=0; char *t; size_t pos; // skip first line with const char EOL[] = "\r\n"; pos = strcspn(Header1,EOL); pos += strspn(Header1+pos,EOL); while (pos < hdr->HeadLen) { t = Header1+pos; // start of line pos += strcspn(t,EOL); Header1[pos] = 0; // line terminator pos += strspn(Header1+pos+1,EOL)+1; // skip if (VERBOSE_LEVEL>7) fprintf(stdout,"[212]: %i pos=%i <%s>, ERR=%i\n",seq,(int)pos,t,hdr->AS.B4C_ERRNUM); if (!strncmp(t,";",1)) // comments ; else if (!strncmp(t,"[Common Infos]",14)) seq = 1; else if (!strncmp(t,"[Binary Infos]",14)) seq = 2; else if (!strncmp(t,"[ASCII Infos]",13)) { seq = 2; FLAG_ASCII = 1; gdftyp = 17; // biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "Error SOPEN(BrainVision): ASCII-format not supported (yet)."); } else if (!strncmp(t,"[Channel Infos]",14)) { seq = 3; /* open data file */ if (FLAG_ASCII) hdr = ifopen(hdr,"rt"); else hdr = ifopen(hdr,"rb"); hdr->AS.bpb = (hdr->NS*GDFTYP_BITS[gdftyp])>>3; if (hdr->TYPE==BrainVisionVAmp) hdr->AS.bpb += 4; if (!npts) { struct stat FileBuf; stat(hdr->FileName,&FileBuf); npts = FileBuf.st_size/hdr->AS.bpb; } /* restore input file name, and free temporary file name */ hdr->FileName = filename; free(tmpfile); if (orientation == VEC) { hdr->SPR = npts; hdr->NRec= 1; hdr->AS.bpb*= hdr->SPR; } else { hdr->SPR = 1; hdr->NRec= npts; } hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->Label[0] = 0; hc->Transducer[0] = '\0'; hc->GDFTYP = gdftyp; hc->SPR = hdr->SPR; // *(int32_t*)(Header1+56); hc->LowPass = -1.0; hc->HighPass = -1.0; hc->Notch = -1.0; // unknown hc->PhysMax = physmax; hc->DigMax = digmax; hc->PhysMin = physmin; hc->DigMin = digmin; hc->Impedance = NAN; hc->Cal = cal; hc->Off = off; hc->OnOff = 1; hc->PhysDimCode = 4275; // uV hc->LeadIdCode = 0; size_t bi8 = k*(size_t)hdr->SPR*GDFTYP_BITS[gdftyp]; hc->bi8 = bi8; hc->bi = bi8>>3; } if (VERBOSE_LEVEL>7) fprintf(stdout,"BVA210 seq=%i,pos=%i,%i <%s> bpb=%i\n",seq,(int)pos,hdr->HeadLen,t,hdr->AS.bpb); } //else if (!strncmp(t,"[Common Infos]",14)) // seq = 4; else if (!strncmp(t,"[Coordinates]",13)) seq = 5; else if (!strncmp(t,"[Comment]",9)) seq = 6; else if (!strncmp(t,"[",1)) seq = 9; else if (seq==1) { if (!strncmp(t,"DataFile=",9)) strcpy(ext, strrchr(t,'.') + 1); else if (!strncmp(t,"MarkerFile=",11)) { char* mrkfile = (char*)calloc(strlen(hdr->FileName)+strlen(t),1); if (strrchr(hdr->FileName,FILESEP)) { strcpy(mrkfile, hdr->FileName); // Flawfinder: ignore strcpy(strrchr(mrkfile,FILESEP)+1, t+11); // Flawfinder: ignore } else strcpy(mrkfile,t+11); // Flawfinder: ignore if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN marker file <%s>.\n",mrkfile); HDRTYPE *hdr2 = sopen(mrkfile,"r",NULL); hdr->T0 = hdr2->T0; memcpy(&hdr->EVENT,&hdr2->EVENT,sizeof(hdr2->EVENT)); hdr->AS.auxBUF = hdr2->AS.auxBUF; // contains the free text annotation // do not de-allocate event table when hdr2 is deconstructed memset(&hdr2->EVENT,0,sizeof(hdr2->EVENT)); hdr2->AS.auxBUF = NULL; sclose(hdr2); destructHDR(hdr2); free(mrkfile); biosigERROR(hdr, B4C_NO_ERROR, NULL); // reset error status - missing or incorrect marker file is not critical } else if (!strncmp(t,"DataFormat=BINARY",11)) ; else if (!strncmp(t,"DataFormat=ASCII",16)) { FLAG_ASCII = 1; gdftyp = 17; // biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "Error SOPEN(BrainVision): ASCII-format not supported (yet)."); } else if (!strncmp(t,"DataOrientation=VECTORIZED",25)) orientation = VEC; else if (!strncmp(t,"DataOrientation=MULTIPLEXED",26)) orientation = MUL; else if (!strncmp(t,"DataType=TIMEDOMAIN",19)) ; else if (!strncmp(t,"DataType=",9)) { biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "Error SOPEN(BrainVision): DataType is not TIMEDOMAIN"); } else if (!strncmp(t,"NumberOfChannels=",17)) { hdr->NS = atoi(t+17); } else if (!strncmp(t,"DataPoints=",11)) { npts = atol(t+11); } else if (!strncmp(t,"SamplingInterval=",17)) { hdr->SampleRate = 1e6/atof(t+17); hdr->EVENT.SampleRate = hdr->SampleRate; } } else if (seq==2) { if (!strncmp(t,"BinaryFormat=IEEE_FLOAT_32",26)) { gdftyp = 16; digmax = physmax/cal; digmin = physmin/cal; } else if (!strncmp(t,"BinaryFormat=INT_16",19)) { gdftyp = 3; digmax = 32767; digmin = -32768; hdr->FLAG.OVERFLOWDETECTION = 1; } else if (!strncmp(t,"BinaryFormat=UINT_16",20)) { gdftyp = 4; digmax = 65535; digmin = 0; hdr->FLAG.OVERFLOWDETECTION = 1; } else if (!strncmp(t,"BinaryFormat",12)) { biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "Error SOPEN(BrainVision): BinaryFormat="); } else if (!strncmp(t,"UseBigEndianOrder=NO",20)) { // hdr->FLAG.SWAP = (__BYTE_ORDER == __BIG_ENDIAN); hdr->FILE.LittleEndian = 1; } else if (!strncmp(t,"UseBigEndianOrder=YES",21)) { // hdr->FLAG.SWAP = (__BYTE_ORDER == __LITTLE_ENDIAN); hdr->FILE.LittleEndian = 0; } else if (!strncmp(t,"DecimalSymbol=",14)) { DECIMALSYMBOL = t[14]; } else if (!strncmp(t,"SkipLines=",10)) { SKIPLINES = atoi(t+10); } else if (!strncmp(t,"SkipColumns=",12)) { SKIPCOLUMNS = atoi(t+12); } else if (0) { biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "Error SOPEN(BrainVision): BinaryFormat="); return(hdr); } } else if (seq==3) { if (VERBOSE_LEVEL==9) fprintf(stdout,"BVA: seq=%i,line=<%s>,ERR=%i\n",seq,t,hdr->AS.B4C_ERRNUM ); if (!strncmp(t,"Ch",2)) { char* ptr; if (VERBOSE_LEVEL==9) fprintf(stdout,"%s\n",t); int n = strtoul(t+2, &ptr, 10)-1; if ((n < 0) || (n >= hdr->NS)) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error SOPEN(BrainVision): invalid channel number"); ifclose(hdr); return(hdr); } size_t len = min(strcspn(ptr+1,","),MAX_LENGTH_LABEL); strncpy(hdr->CHANNEL[n].Label,ptr+1,len); hdr->CHANNEL[n].Label[len]=0; ptr += len+2; ptr += strcspn(ptr,",")+1; if (strlen(ptr)>0) { double tmp = atof(ptr); if (tmp) hdr->CHANNEL[n].Cal = tmp; hdr->CHANNEL[n].PhysMax = hdr->CHANNEL[n].DigMax * hdr->CHANNEL[n].Cal ; hdr->CHANNEL[n].PhysMin = hdr->CHANNEL[n].DigMin * hdr->CHANNEL[n].Cal ; } if (VERBOSE_LEVEL==9) fprintf(stdout,"Ch%02i=%s,,%s(%f)\n",n,hdr->CHANNEL[n].Label,ptr,hdr->CHANNEL[n].Cal ); } } else if (seq==4) { } else if (seq==5) { } else if (seq==6) { } // t = strtok(NULL,"\x0a\x0d"); // extract next line } hdr->HeadLen = 0; if (FLAG_ASCII) { count = 0; size_t bufsiz = hdr->NS*hdr->SPR*hdr->NRec*16; while (!ifeof(hdr)) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count+bufsiz+1); count += ifread(hdr->AS.Header+count,1,bufsiz,hdr); } ifclose(hdr); hdr->AS.Header[count]=0; // terminating null character size_t pos=0; if (DECIMALSYMBOL != '.') do { if (hdr->AS.Header[pos]==DECIMALSYMBOL) hdr->AS.Header[pos] = '.'; } while (hdr->AS.Header[++pos]); pos = 0; while (SKIPLINES>0) { while (!iscntrl(hdr->AS.Header[pos])) pos++; // skip line while ( iscntrl(hdr->AS.Header[pos])) pos++; // skip line feed and carriage return SKIPLINES--; } hdr->AS.rawdata = (uint8_t*)malloc(hdr->NS*npts*sizeof(double)); char* POS=(char*)(hdr->AS.Header+pos); for (k=0; k < hdr->NS*npts; k++) { if (((orientation==MUL) && !(k%hdr->NS)) || ((orientation==VEC) && !(k%npts))) { double d; int sc = SKIPCOLUMNS; while (sc--) d=strtod(POS,&POS); // skip value, return value is ignored } *(double*)(hdr->AS.rawdata+k*sizeof(double)) = strtod(POS,&POS); } hdr->TYPE = native; hdr->AS.length = hdr->NRec; } } else if (hdr->TYPE==CFS) { hdr->HeadLen = count; sopen_cfs_read(hdr); } else if (hdr->TYPE==SMR) { hdr->HeadLen = count; sopen_smr_read(hdr); } else if (hdr->TYPE==CFWB) { hdr->SampleRate = 1.0/lef64p(hdr->AS.Header+8); hdr->SPR = 1; tm_time.tm_year = lei32p(hdr->AS.Header+16) - 1900; tm_time.tm_mon = lei32p(hdr->AS.Header+20) - 1; tm_time.tm_mday = lei32p(hdr->AS.Header+24); tm_time.tm_hour = lei32p(hdr->AS.Header+28); tm_time.tm_min = lei32p(hdr->AS.Header+32); tm_time.tm_sec = (int)lef64p(hdr->AS.Header+36); tm_time.tm_isdst = -1; hdr->T0 = tm_time2gdf_time(&tm_time); // = *(double*)(Header1+44); // pre-trigger time hdr->NS = leu32p(hdr->AS.Header+52); hdr->NRec = leu32p(hdr->AS.Header+56); #define CFWB_FLAG_TIME_CHANNEL (*(int32_t*)(Header1+60)) // TimeChannel // = *(int32_t*)(Header1+64); // DataFormat hdr->HeadLen = 68 + hdr->NS*96; hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen); if (count<=hdr->HeadLen) count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); else ifseek(hdr, hdr->HeadLen, SEEK_SET); uint16_t gdftyp = leu32p(hdr->AS.Header+64); hdr->AS.bpb = (CFWB_FLAG_TIME_CHANNEL ? GDFTYP_BITS[CFWB_GDFTYP[gdftyp-1]]>>3 : 0); hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; uint8_t* Header2 = hdr->AS.Header+68+k*96; hc->Transducer[0] = '\0'; hc->GDFTYP = CFWB_GDFTYP[gdftyp-1]; hc->SPR = 1; // *(int32_t*)(Header1+56); strncpy(hc->Label, (char*)Header2, min(32,MAX_LENGTH_LABEL)); char p[17]; memcpy(p, (char*)Header2+32, 16); p[16] = 0; hc->PhysDimCode = PhysDimCode(p); hc->LeadIdCode = 0; hc->Cal = lef64p(Header2+64); hc->Off = lef64p(Header2+72); hc->PhysMax = lef64p(Header2+80); hc->PhysMin = lef64p(Header2+88); hc->DigMax = (hc->PhysMax - hc->Off) / hc->Cal; hc->DigMin = (hc->PhysMin - hc->Off) / hc->Cal; hc->OnOff = 1; hc->bi = hdr->AS.bpb; hdr->AS.bpb += GDFTYP_BITS[hc->GDFTYP]>>3; } hdr->FLAG.OVERFLOWDETECTION = 0; // CFWB does not support automated overflow and saturation detection } else if (hdr->TYPE==CNT) { if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN: Neuroscan format \n"); // TODO: fix handling of AVG and EEG files hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, 900); hdr->VERSION = atof((char*)hdr->AS.Header + 8); count += ifread(hdr->AS.Header+count, 1, 900-count, hdr); int8_t FLAG_CNT32 = 0; uint16_t gdftyp = 0; uint8_t minor_revision = hdr->AS.Header[804]; size_t eventtablepos = leu32p(hdr->AS.Header+886); uint32_t nextfilepos = leu32p(hdr->AS.Header+12); if (VERBOSE_LEVEL > 7) fprintf(stdout,"SOPEN: Neuroscan format: minor revision %i eventtablepos: %i nextfilepos: %i\n", minor_revision, (unsigned)eventtablepos, nextfilepos); /* make base of filename */ size_t i=0, j=0; while (hdr->FileName[i] != '\0') { if ((hdr->FileName[i]=='/') || (hdr->FileName[i]=='\\')) { j=i+1; } i++; } /* skip the extension '.cnt' of filename base and copy to Patient.Id */ strncpy(hdr->Patient.Id, hdr->FileName+j, min(MAX_LENGTH_PID,strlen(hdr->FileName)-j-4)); hdr->Patient.Id[MAX_LENGTH_PID] = 0; ptr_str = (char*)hdr->AS.Header+136; hdr->Patient.Sex = (ptr_str[0]=='f')*2 + (ptr_str[0]=='F')*2 + (ptr_str[0]=='M') + (ptr_str[0]=='m'); ptr_str = (char*)hdr->AS.Header+137; hdr->Patient.Handedness = (ptr_str[0]=='r')*2 + (ptr_str[0]=='R')*2 + (ptr_str[0]=='L') + (ptr_str[0]=='l'); ptr_str = (char*)hdr->AS.Header+225; char tmp[6]; tmp[2] = '\0'; // make sure tmp is 0-terminated tm_time.tm_sec = atoi(memcpy(tmp,ptr_str+16,2)); tm_time.tm_min = atoi(memcpy(tmp,ptr_str+13,2)); tm_time.tm_hour = atoi(memcpy(tmp,ptr_str+10,2)); tm_time.tm_mday = atoi(memcpy(tmp,ptr_str,2)); tm_time.tm_mon = atoi(memcpy(tmp,ptr_str+3,2))-1; tm_time.tm_year = atoi(memcpy(tmp,ptr_str+6,2)); if (tm_time.tm_year<=80) tm_time.tm_year += 100; hdr->T0 = tm_time2gdf_time(&tm_time); hdr->NS = leu16p(hdr->AS.Header+370); hdr->HeadLen = 900+hdr->NS*75; hdr->SampleRate = leu16p(hdr->AS.Header+376); hdr->AS.bpb = hdr->NS*2; if (hdr->AS.Header[20]==1) { // Neuroscan EEG hdr->NRec = leu16p(hdr->AS.Header+362); hdr->SPR = leu16p(hdr->AS.Header+368); hdr->AS.bpb = 2*hdr->NS*hdr->SPR+1+2+2+4+2+2; size_t bpb4 = 4*hdr->NS*hdr->SPR+1+2+2+4+2+2; struct stat FileBuf; if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN: Neuroscan format: minor rev=%i bpb2:%i bpb4:%i\n", minor_revision, (unsigned)hdr->AS.bpb, (unsigned)bpb4); switch (minor_revision) { case 9: // TODO: FIXME fprintf(stderr,"Warning biosig/sopen (CNT/EEG): minor revision %i is experimental\n", minor_revision); gdftyp = 3; hdr->FILE.LittleEndian = 0; stat(hdr->FileName,&FileBuf); if (hdr->NRec <= 0) { hdr->NRec = (min(FileBuf.st_size, nextfilepos) - hdr->HeadLen)/hdr->AS.bpb; } break; case 12: gdftyp = 3; eventtablepos = hdr->HeadLen + hdr->NRec*hdr->AS.bpb; break; default: if (minor_revision != 16) fprintf(stderr,"Warning biosig/sopen (CNT/EEG): minor revision %i not tested\n", minor_revision); if (VERBOSE_LEVEL>7) fprintf(stdout,"biosig/sopen (CNT/EEG): %i %i %i %i %i %i \n", (int)hdr->NRec, hdr->SPR, hdr->NS, (int)eventtablepos, (int)(hdr->AS.bpb * hdr->NRec + hdr->HeadLen), (int)(bpb4 * hdr->NRec + hdr->HeadLen)); if ((size_t)(hdr->AS.bpb * hdr->NRec + hdr->HeadLen) == eventtablepos) gdftyp = 3; else if ((bpb4 * hdr->NRec + hdr->HeadLen) == eventtablepos) { hdr->AS.bpb = bpb4; gdftyp = 5; } else { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "CNT/EEG: type of format not supported"); return(hdr); } } } else { // Neuroscan CNT hdr->SPR = 1; eventtablepos = leu32p(hdr->AS.Header+886); if (nextfilepos > 0) { ifseek (hdr,nextfilepos+52,SEEK_SET); FLAG_CNT32 = (ifgetc(hdr)==1); ifseek (hdr,count,SEEK_SET); } gdftyp = FLAG_CNT32 ? 5 : 3; hdr->AS.bpb = hdr->NS*GDFTYP_BITS[gdftyp]/8; hdr->NRec = (eventtablepos - hdr->HeadLen) / hdr->AS.bpb; if (VERBOSE_LEVEL > 7) fprintf(stdout,"biosig/sopen (CNT): %i %i %i %i %i \n", (int)hdr->NRec, hdr->SPR, hdr->NS, (int)eventtablepos, (int)(hdr->AS.bpb * hdr->NRec + hdr->HeadLen) ); } hdr->AS.Header = (uint8_t*) realloc(Header1,hdr->HeadLen); count += ifread(Header1+900, 1, hdr->NS*75, hdr); hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); size_t bi = 0; for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; uint8_t* Header2 = hdr->AS.Header+900+k*75; hc->Transducer[0] = '\0'; hc->GDFTYP = gdftyp; hc->SPR = hdr->SPR; // *(int32_t*)(Header1+56); const size_t len = min(10, MAX_LENGTH_LABEL); strncpy(hc->Label, (char*)Header2, len); hc->Label[len] = 0; hc->LeadIdCode = 0; hc->PhysDimCode = 4256+19; // uV hc->Cal = lef32p(Header2+59); hc->Cal *= lef32p(Header2+71)/204.8; hc->Off = lef32p(Header2+47) * hc->Cal; hc->HighPass = CNT_SETTINGS_HIGHPASS[(uint8_t)Header2[64]]; hc->LowPass = CNT_SETTINGS_LOWPASS[(uint8_t)Header2[65]]; hc->Notch = CNT_SETTINGS_NOTCH[(uint8_t)Header1[682]]; hc->OnOff = 1; if (FLAG_CNT32) { hc->DigMax = (double)(0x007fffff); hc->DigMin = -(double)(int32_t)(0xff800000); } else { hc->DigMax = (double)32767; hc->DigMin = -(double)32768; } hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; hc->bi = bi; bi += (size_t)hdr->SPR * (GDFTYP_BITS[hc->GDFTYP]>>3); } if ((eventtablepos < nextfilepos) && !ifseek(hdr, eventtablepos, SEEK_SET)) { /* read event table */ hdr->EVENT.SampleRate = hdr->SampleRate; ifread(tmp, 9, 1, hdr); int8_t TeegType = tmp[0]; uint32_t TeegSize = leu32p(tmp+1); // uint32_t TeegOffset = leu32p(tmp+5); // not used int fieldsize; switch (TeegType) { case 2: case 3: fieldsize = 19; break; default: fieldsize = 8; } uint8_t* buf = (uint8_t*)malloc(TeegSize); count = ifread(buf, 1, TeegSize, hdr); hdr->EVENT.N = count/fieldsize; if (reallocEventTable(hdr, hdr->EVENT.N) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; for (k = 0; k < hdr->EVENT.N; k++) { hdr->EVENT.TYP[k] = leu16p(buf+k*fieldsize); // stimulus type uint8_t tmp8 = buf[k*fieldsize+3]; if (tmp8>0) { if (hdr->EVENT.TYP[k]>0) fprintf(stdout,"Warning SOPEN(CNT) event %i: both, stimulus and response, codes (%i/%i) are non-zero. response code is ignored.\n",(int)k+1,hdr->EVENT.TYP[k],tmp8); else hdr->EVENT.TYP[k] |= tmp8 | 0x80; // response type } hdr->EVENT.POS[k] = leu32p(buf+4+k*fieldsize); // 0-based indexing if (TeegType != 3) hdr->EVENT.POS[k] = (hdr->EVENT.POS[k] - hdr->HeadLen) / hdr->AS.bpb; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[k] = 0; #endif } free(buf); } ifseek(hdr, hdr->HeadLen, SEEK_SET); hdr->FLAG.OVERFLOWDETECTION = 0; // automated overflow and saturation detection not supported } else if (hdr->TYPE==CTF) { if (VERBOSE_LEVEL>7) fprintf(stdout,"CTF[101]: %s\n",hdr->FileName); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,1844); hdr->HeadLen = 1844; char *f0 = hdr->FileName; char *f1 = (char*)malloc(strlen(f0)+6); strcpy(f1, f0); // Flawfinder: ignore strcpy(strrchr(f1,'.')+1,"res4"); // Flawfinder: ignore if (VERBOSE_LEVEL>8) fprintf(stdout,"CTF[102]: %s\n\t%s\n",f0,f1); if (strcmp(strrchr(hdr->FileName,'.'),".res4")) { if (VERBOSE_LEVEL>8) fprintf(stdout,"CTF[103]:\n"); ifclose(hdr); hdr->FileName = f1; hdr = ifopen(hdr,"rb"); count = 0; } count += ifread(hdr->AS.Header+count,1,hdr->HeadLen-count,hdr); if (VERBOSE_LEVEL>8) fprintf(stdout,"CTF[104]: %i %s\n\t%s\n",(int)count,f0,f1); struct tm t; sscanf((char*)(hdr->AS.Header+778),"%d:%d:%d",&t.tm_hour,&t.tm_min,&t.tm_sec); sscanf((char*)(hdr->AS.Header+778+255),"%d/%d/%d",&t.tm_mday,&t.tm_mon,&t.tm_year); --t.tm_mon; hdr->T0 = tm_time2gdf_time(&t); hdr->SPR = bei32p(hdr->AS.Header+1288); hdr->NS = bei16p(hdr->AS.Header+1292); hdr->SampleRate = bef64p(hdr->AS.Header+1296); // double Dur = bef64p(hdr->AS.Header+1304); hdr->NRec = bei16p(hdr->AS.Header+1312); strncpy(hdr->Patient.Id,(char*)(hdr->AS.Header+1712),min(MAX_LENGTH_PID,32)); int32_t CTF_RunSize = bei32p(hdr->AS.Header+1836); //int32_t CTF_RunSize2 = bei32p(hdr->AS.Header+1844); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,1844+CTF_RunSize+2); count += ifread(hdr->AS.Header+count,1,CTF_RunSize+2,hdr); int16_t CTF_NumberOfFilters = bei16p(hdr->AS.Header+1844+CTF_RunSize); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count+CTF_NumberOfFilters*26+hdr->NS*(32+48+1280)); count += ifread(hdr->AS.Header+count,1,CTF_NumberOfFilters*26+hdr->NS*(32+48+1280),hdr); ifclose(hdr); size_t pos = 1846+CTF_RunSize+CTF_NumberOfFilters*26; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); hdr->AS.bpb = 0; for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; strncpy(hc->Label,(const char*)(hdr->AS.Header+pos+k*32),min(32,MAX_LENGTH_LABEL)); hc->Label[min(MAX_LENGTH_LABEL,32)]=0; if (VERBOSE_LEVEL>8) fprintf(stdout,"CTF[107]: #%i\t%x\t%s\n",(int)k,(int)(pos+k*32),hc->Label); int16_t index = bei16p(hdr->AS.Header+pos+hdr->NS*32+k*(48+1280)); // index hc->Cal = 1.0/bef64p(hdr->AS.Header+pos+hdr->NS*32+k*(48+1280)+16); switch (index) { case 0: case 1: case 9: hc->Cal /= bef64p(hdr->AS.Header+pos+hdr->NS*32+k*(48+1280)+8); } hc->GDFTYP = 5; hc->SPR = hdr->SPR; hc->LeadIdCode = 0; hc->Off = 0.0; hc->OnOff = 1; hc->PhysDimCode = 0; hc->DigMax = ldexp( 1.0,31); hc->DigMin = ldexp(-1.0,31); hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; hc->bi = hdr->AS.bpb; hdr->AS.bpb += hdr->SPR*(GDFTYP_BITS[hc->GDFTYP]>>3); } if (VERBOSE_LEVEL>8) fprintf(stdout,"CTF[109] %s: \n",hdr->FileName); /********** read marker file **********/ char *f2 = (char*)malloc(strlen(f0)+16); strcpy(f2, f0); // Flawfinder: ignore strcpy(strrchr(f2,FILESEP)+1,"MarkerFile.mrk"); // Flawfinder: ignore hdr->EVENT.SampleRate = hdr->SampleRate; hdr->EVENT.N = 0; hdr->FileName = f2; hdr = ifopen(hdr,"rb"); if (hdr->FILE.OPEN) { size_t bufsiz = 4096; count = 0; char *vmrk=NULL; while (!ifeof(hdr)) { vmrk = (char*)realloc(vmrk,count+bufsiz+1); count += ifread(vmrk+count,1,bufsiz,hdr); } vmrk[count] = 0; // add terminating \0 character ifclose(hdr); char *t1, *t2; float u1,u2; t1 = strstr(vmrk,"TRIAL NUMBER"); t2 = strtok(t1,"\x0a\x0d"); size_t N = 0; t2 = strtok(NULL,"\x0a\x0d"); while (t2 != NULL) { sscanf(t2,"%f %f",&u1,&u2); if (N+1 >= hdr->EVENT.N) { hdr->EVENT.N += 256; if (reallocEventTable(hdr, hdr->EVENT.N) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } hdr->EVENT.TYP[N] = 1; hdr->EVENT.POS[N] = (uint32_t)(u1*hdr->SPR+u2*hdr->SampleRate); hdr->EVENT.DUR[N] = 0; hdr->EVENT.CHN[N] = 0; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[N] = 0; #endif N++; t2 = strtok(NULL,"\x0a\x0d"); } hdr->EVENT.N = N; free(vmrk); } free(f2); /********** end reading event/marker file **********/ strcpy(strrchr(f1,'.')+1,"meg4"); hdr->FileName = f1; hdr = ifopen(hdr,"rb"); hdr->HeadLen = 8; hdr->HeadLen = ifread(hdr->AS.Header,1,8,hdr); // hdr->FLAG.SWAP= (__BYTE_ORDER == __LITTLE_ENDIAN); hdr->FILE.LittleEndian = 0; hdr->FileName = f0; free(f1); } else if (hdr->TYPE==DEMG) { hdr->VERSION = leu16p(hdr->AS.Header+4); hdr->NS = leu16p(hdr->AS.Header+6); hdr->SPR = 1; hdr->SampleRate = leu32p(hdr->AS.Header+8); hdr->NRec = leu32p(hdr->AS.Header+12); uint16_t gdftyp = 16; uint8_t bits = hdr->AS.Header[16]; double PhysMin = (double)(int8_t)hdr->AS.Header[17]; double PhysMax = (double)(int8_t)hdr->AS.Header[18]; double Cal = 1.0; double Off = 0.0; if (hdr->VERSION==1) { gdftyp = 16; // float32 Cal = 1.0; Off = 0.0; } else if (hdr->VERSION==2) { gdftyp = 4; // uint16 Cal = (PhysMax-PhysMin)/((1<CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); hdr->AS.bpb = 0; for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE* hc = hdr->CHANNEL+k; hc->GDFTYP = gdftyp; hc->SPR = 1; hc->Cal = Cal; hc->Off = Off; hc->OnOff = 1; hc->Transducer[0] = '\0'; hc->LowPass = 450; hc->HighPass = 20; hc->PhysMax = PhysMax; hc->PhysMin = PhysMin; hc->DigMax = DigMax; hc->DigMin = DigMin; hc->LeadIdCode = 0; hc->bi = hdr->AS.bpb; hdr->AS.bpb += GDFTYP_BITS[gdftyp]>>3; } hdr->FLAG.OVERFLOWDETECTION = 0; // automated overflow and saturation detection not supported hdr->HeadLen = 19; ifseek(hdr, 19, SEEK_SET); } else if (hdr->TYPE==EBS) { fprintf(stderr,"Warning SOPEN(EBS): support for EBS format is experimental\n"); /** Fixed Header (32 bytes) **/ uint32_t EncodingID = beu32p(hdr->AS.Header+8); hdr->NS = beu32p(hdr->AS.Header+12); hdr->SPR = beu64p(hdr->AS.Header+16); uint64_t datalen = beu64p(hdr->AS.Header+24); enum encoding { TIB_16 = 0x00000000, CIB_16 = 0x00000001, TIL_16 = 0x00000002, CIL_16 = 0x00000003, TI_16D = 0x00000010, CI_16D = 0x00000011 }; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); size_t pos = 32; uint32_t tag, len; /** Variable Header **/ tag = beu32p(hdr->AS.Header+pos); while (tag) { len = beu32p(hdr->AS.Header+pos+4)<<2; pos += 8; if (count < pos+len+8) { hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header,count*2); count += ifread(hdr->AS.Header+count, 1, count, hdr); } if (VERBOSE_LEVEL>8) fprintf(stdout,"%6i %6i tag=%08x len=%5i: |%c%c%c%c| %s\n", (int)pos, (int)count,tag, len, Header1[0x015f], Header1[0x0160], Header1[0x0161], Header1[0x0162], hdr->AS.Header+pos); /* Appendix A */ switch (tag) { case 0x00000002: break; case 0x00000004: strncpy(hdr->Patient.Name,Header1+pos,MAX_LENGTH_NAME); break; case 0x00000006: strncpy(hdr->Patient.Id,Header1+pos,MAX_LENGTH_PID); break; case 0x00000008: { struct tm t; t.tm_mday = (Header1[pos+6]-'0')*10 + (Header1[pos+7]-'0'); Header1[pos+6] = 0; t.tm_mon = atoi(Header1+pos+4) + 1; Header1[pos+4] = 0; t.tm_year = atoi(Header1+pos) - 1900; t.tm_hour = 0; t.tm_min = 0; t.tm_sec = 0; hdr->Patient.Birthday = tm_time2gdf_time(&t); break; } case 0x0000000a: hdr->Patient.Sex = bei32p(hdr->AS.Header+pos); break; case 0x00000010: hdr->SampleRate = atof(Header1+pos); break; case 0x00000012: // strndup(hdr->ID.Hospital,Header1+pos,len); hdr->ID.Hospital = malloc(len+1); if (hdr->ID.Hospital) { hdr->ID.Hospital[len] = 0; strncpy(hdr->ID.Hospital,Header1+pos,len); } break; case 0x00000003: // units { int k; char* ptr = Header1+pos; for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; hc->Cal = strtod(ptr, &ptr); hc->PhysDimCode = PhysDimCode(ptr); } } break; case 0x00000005: { int k; char* ptr = Header1+pos; for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; int c = 0; while (beu32p(ptr)) { if (VERBOSE_LEVEL>8) fprintf(stdout,"0x05: [%i %i] |%c%c%c%c%c%c%c%c|\n",k,c,ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5],ptr[6],ptr[7]); if ((*ptr) && (c<=MAX_LENGTH_LABEL)) { hc->Label[c++] = *ptr; } ptr++; } if (VERBOSE_LEVEL>7) fprintf(stdout,"0x05: %08x\n",beu32p(ptr)); hc->Label[c] = 0; ptr += 4; while (bei32p(ptr)) ptr++; ptr += 4; } } break; case 0x0000000b: // recording time if (Header1[pos+8]=='T') { struct tm t; t.tm_sec = atoi(Header1+pos+13); Header1[pos+13] = 0; t.tm_min = atoi(Header1+pos+11); Header1[pos+11] = 0; t.tm_hour = atoi(Header1+pos+9); Header1[pos+8] = 0; t.tm_mday = atoi(Header1+pos+6); Header1[pos+6] = 0; t.tm_mon = atoi(Header1+pos+4) + 1; Header1[pos+4] = 0; t.tm_year = atoi(Header1+pos) - 1900; hdr->T0 = tm_time2gdf_time(&t); if (VERBOSE_LEVEL>8) fprintf(stdout,"<%s>, T0 = %s\n",Header1+pos,asctime(&t)); } if (VERBOSE_LEVEL>8) fprintf(stdout,"<%s>\n",Header1+pos); break; case 0x0000000f: // filter { int k; char* ptr = Header1+pos; for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; switch (beu32p(ptr)) { case 1: // lowpass hc->LowPass = strtod(ptr+4, &ptr); break; case 2: // high pass hc->HighPass = strtod(ptr+4, &ptr); break; default: fprintf(stderr,"Warning SOPEN (EBS): unknown filter\n"); } while (bei32p(ptr) != -1) ptr++; ptr += 4; } } break; } pos += len; tag = beu32p(hdr->AS.Header+pos); } hdr->HeadLen = pos; ifseek(hdr,pos,SEEK_SET); hdr->AS.first = 0; hdr->AS.length = 0; if ((bei64p(hdr->AS.Header+24)==-1) && (bei64p(hdr->AS.Header+24)==-1)) { /* if data length is not present */ struct stat FileBuf; stat(hdr->FileName,&FileBuf); hdr->FILE.size = FileBuf.st_size; datalen = (hdr->FILE.size - hdr->HeadLen); } else datalen <<= 2; /** Encoded Signal Data (4*d bytes) **/ size_t spr = datalen/(2*hdr->NS); switch (EncodingID) { case TIB_16: hdr->SPR = 1; hdr->NRec = spr; hdr->FILE.LittleEndian = 0; break; case CIB_16: hdr->SPR = spr; hdr->NRec = 1; hdr->FILE.LittleEndian = 0; break; case TIL_16: hdr->SPR = 1; hdr->NRec = spr; hdr->FILE.LittleEndian = 1; break; case CIL_16: hdr->SPR = spr; hdr->NRec = 1; hdr->FILE.LittleEndian = 1; break; case TI_16D: case CI_16D: default: biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "EBS: unsupported Encoding"); return(hdr); } typeof(hdr->NS) k; for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; hc->GDFTYP = 3; // int16 hc->SPR = hdr->SPR; // int16 hc->bi = k*2; hc->Off = 0.0; hc->OnOff = 1; hc->DigMax = (double)32767; hc->DigMin = (double)-32768; hc->PhysMax = hc->DigMax*hc->Cal; hc->PhysMin = hc->DigMin*hc->Cal; hc->Transducer[0] = 0; hc->LeadIdCode = 0; hc->Notch = NAN; hc->Impedance = INFINITY; hc->fZ = NAN; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; } hdr->AS.bpb = hdr->SPR*hdr->NS*2; /** Optional Second Variable Header **/ } else if (hdr->TYPE==EEG1100) { // the information of this format is derived from nk2edf-0.43beta-src of Teunis van Beelen if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [207]: \n"); char *fn = (char*)malloc((strlen(hdr->FileName)+5)*sizeof(char)); strcpy(fn, hdr->FileName); // Flawfinder: ignore char *LOG=NULL; /* read .pnt */ if (strrchr(fn,FILESEP)) strncpy(strrchr(fn,FILESEP)+1, (char*)(hdr->AS.Header + 32), 4); else strncpy(fn, (char*)(hdr->AS.Header + 32), 4); FILE *fid = fopen(fn,"rb"); if (fid != NULL) { count = 0; while (!feof(fid)) { size_t r = max(count*2,1024); LOG = (char*) realloc(LOG,r+1); count += fread(LOG+count,1,r-count,fid); } fclose(fid); LOG[count] = 0; // Name: @0x062e if (!hdr->FLAG.ANONYMOUS) { strncpy(hdr->Patient.Name, LOG+0x62e, MAX_LENGTH_PID); hdr->Patient.Name[MAX_LENGTH_NAME] = 0; } // Id: @0x0604 strncpy(hdr->Patient.Id, LOG+0x604, MAX_LENGTH_PID); hdr->Patient.Id[MAX_LENGTH_PID] = 0; // Gender: @0x064a hdr->Patient.Sex = (toupper(LOG[0x064a])=='M') + 2*(toupper(LOG[0x064a])=='F') + 2*(toupper(LOG[0x064a])=='W'); // Birthday: @0x0660 sscanf((char*)(LOG+0x0660),"%04u/%02u/%02u",&tm_time.tm_year,&tm_time.tm_mon,&tm_time.tm_mday); tm_time.tm_hour = 12; tm_time.tm_min = 0; tm_time.tm_sec = 0; tm_time.tm_year -= 1900; tm_time.tm_mon--; tm_time.tm_isdst = -1; hdr->Patient.Birthday = tm_time2gdf_time(&tm_time); } if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [222]: \n"); size_t n1,n2,k2,pos1,pos2; n1 = hdr->AS.Header[145]; if ((n1*20+0x92) > count) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,n1*20+0x92+1); count += ifread(hdr->AS.Header+count, 1, n1*20+0x92-count,hdr); } // Start date: @0x0040 sscanf((char*)(hdr->AS.Header+0x40),"%04u%02u%02u%02u%02u%02u",&tm_time.tm_year,&tm_time.tm_mon,&tm_time.tm_mday,&tm_time.tm_hour,&tm_time.tm_min,&tm_time.tm_sec); tm_time.tm_year -= 1900; tm_time.tm_mon--; // Jan=0, Feb=1, ... tm_time.tm_isdst = -1; //hdr->T0 = tm_time2gdf_time(&tm_time); int TARGET_SEGMENT = hdr->FLAG.TARGETSEGMENT; int numSegments = 0; size_t Total_NRec = 0; uint8_t *h2 = (uint8_t*)malloc(22); uint8_t *h3 = (uint8_t*)malloc(40); for (k=0; k7) fprintf(stdout,"EEG1100 [232] %i: \n",(int)k); pos1 = leu32p(hdr->AS.Header+146+k*20); ifseek(hdr, pos1, SEEK_SET); ifread(h2, 1, 22, hdr); n2 = h2[17]; if (n2>1) { h2 = (uint8_t*)realloc(h2,2+n2*20); ifread(h2+22, 1, 2+n2*20-22, hdr); } if (reallocEventTable(hdr, hdr->EVENT.N+n2) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; for (k2=0; k2\n",pos3,(char*)h3+1); if (!strncmp((char*)h3+1,"TIME",4)) { sscanf((char*)(h3+5),"%02u%02u%02u",&tm_time.tm_hour,&tm_time.tm_min,&tm_time.tm_sec); } typeof(hdr->NS) NS = h3[38]; typeof(hdr->SampleRate) SampleRate = leu16p(h3+26) & 0x3fff; nrec_t NRec = (nrec_t)(leu32p(h3+28) * SampleRate * 0.1); size_t HeadLen = pos2 + 39 + 10*NS; hdr->EVENT.TYP[hdr->EVENT.N] = 0x7ffe; hdr->EVENT.POS[hdr->EVENT.N] = Total_NRec; hdr->EVENT.DUR[hdr->EVENT.N] = NRec; hdr->EVENT.CHN[hdr->EVENT.N] = 0; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif Total_NRec += NRec; hdr->EVENT.N++; numSegments++; --TARGET_SEGMENT; // decrease target segment counter if (TARGET_SEGMENT != 0) { continue; } hdr->T0 = tm_time2gdf_time(&tm_time); hdr->NS = NS; hdr->SampleRate = SampleRate; hdr->EVENT.SampleRate = SampleRate; hdr->NRec = NRec; hdr->HeadLen = HeadLen; hdr->SPR = 1; int16_t gdftyp = 128; // Nihon-Kohden int16 format hdr->AS.bpb = ((hdr->NS*GDFTYP_BITS[gdftyp])>>3)+2; // fprintf(stdout,"NK k=%i <%s> k2=%i <%s>\n",k,h2+1,k2,h3+1); // fprintf(stdout,"[%i %i]:pos=%u (%x) length=%Li(%Lx).\n",k,k2,pos2,pos2,hdr->NRec*(hdr->NS+1)*2,hdr->NRec*(hdr->NS+1)*2); h3 = (uint8_t*)realloc(h3,32 + hdr->NS*10); pos3 += ifread(h3+pos3, 1, 32+hdr->NS*10 - pos3, hdr); hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); int k3; for (k3=0; k3NS; k3++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k3; uint8_t u8 = h3[39+k3*10]; switch (u8) { case 0: strcpy(hc->Label,"Fp1"); break; case 1: strcpy(hc->Label,"Fp2"); break; case 2: strcpy(hc->Label,"F3"); break; case 3: strcpy(hc->Label,"F4"); break; case 4: strcpy(hc->Label,"C3"); break; case 5: strcpy(hc->Label,"C4"); break; case 6: strcpy(hc->Label,"P3"); break; case 7: strcpy(hc->Label,"P4"); break; case 8: strcpy(hc->Label,"O1"); break; case 9: strcpy(hc->Label,"O2"); break; case 10: strcpy(hc->Label,"F7"); break; case 11: strcpy(hc->Label,"F8"); break; case 12: strcpy(hc->Label,"T3"); break; case 13: strcpy(hc->Label,"T4"); break; case 14: strcpy(hc->Label,"T5"); break; case 15: strcpy(hc->Label,"T6"); break; case 16: strcpy(hc->Label,"Fz"); break; case 17: strcpy(hc->Label,"Cz"); break; case 18: strcpy(hc->Label,"Pz"); break; case 19: strcpy(hc->Label,"E"); break; case 20: strcpy(hc->Label,"PG1"); break; case 21: strcpy(hc->Label,"PG2"); break; case 22: strcpy(hc->Label,"A1"); break; case 23: strcpy(hc->Label,"A2"); break; case 24: strcpy(hc->Label,"T1"); break; case 25: strcpy(hc->Label,"T2"); break; case 74: strcpy(hc->Label,"BN1"); break; case 75: strcpy(hc->Label,"BN2"); break; case 76: strcpy(hc->Label,"Mark1"); break; case 77: strcpy(hc->Label,"Mark2"); break; case 100: strcpy(hc->Label,"X12/BP1"); break; case 101: strcpy(hc->Label,"X13/BP2"); break; case 102: strcpy(hc->Label,"X14/BP3"); break; case 103: strcpy(hc->Label,"X15/BP4"); break; case 254: strcpy(hc->Label,"-"); break; case 255: strcpy(hc->Label,"Z"); break; default: if ((25Label,"X%u",u8-25); else if ((36Label,"-"); else if ((41Label,"DC%02u",u8-41); else if ((77Label,"-"); else if ((103Label,"X%u",u8-88); } if ((41PhysDimCode = 4274; // mV hc->PhysMin = -12002.9; hc->PhysMax = 12002.56; } else { hc->PhysDimCode = 4275; // uV hc->PhysMin = -3200.0; hc->PhysMax = 3200.0*((1<<15)-1)/(1<<15); } hc->GDFTYP = 128; // Nihon-Kohden int16 format hc->DigMax = 32767.0; hc->DigMin = -32768.0; hc->Cal = (hc->PhysMax - hc->PhysMin) / (hc->DigMax - hc->DigMin); hc->Off = hc->PhysMin - hc->Cal * hc->DigMin; hc->SPR = 1; hc->LeadIdCode = 0; hc->OnOff = 1; hc->Transducer[0] = 0; hc->bi = (k3*GDFTYP_BITS[gdftyp])>>3; // hc->LowPass = 0.1; // hc->HighPass = 100; // hdr->CHANNEL[k3].Notch = 0; } } } free(h2); free(h3); ifseek(hdr, hdr->HeadLen, SEEK_SET); if ((numSegments>1) && (hdr->FLAG.TARGETSEGMENT==1)) fprintf(stdout,"File %s has more than one (%i) segment; use TARGET_SEGMENT argument to select other segments.\n",hdr->FileName,numSegments); if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [242]: <%s>\n",fn); /* read .log */ char *c = strrchr(fn,'.'); if (c != NULL) { strcpy(c+1,"log"); FILE *fid = fopen(fn,"rb"); if (fid == NULL) { strcpy(c+1,"LOG"); fid = fopen(fn,"rb"); } if (fid != NULL) { count = 0; while (!feof(fid)) { size_t c = max(2*count, 11520); LOG = (char*) realloc(LOG, c+1); count += fread(LOG+count, 1, c-count, fid); } fclose(fid); LOG[count]=0; for (k=0; k<(unsigned)LOG[145]; k++) { if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [252]: %i,%i<%s>\n",(int)k,(int)count,fn); //uint32_t lba = leu32p(LOG+146+k*20); uint32_t lba = atoi(LOG+146+k*20); if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [253]: <%d> %d 0x%x\n",(int)k,lba,lba); //break; // FIXME: there is at least one EEG1100C file that breaks this uint32_t N = LOG[lba+18]; if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [254]: <%d> %d %d\n",(int)k,(int)lba,N); if (reallocEventTable(hdr, hdr->EVENT.N+N) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; size_t k1; for (k1=0; k17) fprintf(stdout,"EEG1100 [257]: [%d,%d] N=%d,%d\n",(int)k,(int)k1,N,hdr->EVENT.N); if (VERBOSE_LEVEL>8) fprintf(stdout,"EEG1100 [258]: [%d,%d] N=%d, <%s>\n",(int)k,(int)k1,hdr->EVENT.N,(char*)(LOG+lba+20+k1*45)); // FreeTextEvent(hdr,hdr->EVENT.N,(char*)(LOG+lba+20+k1*45)); if (VERBOSE_LEVEL>7) { fprintf(stdout," <%s>\n <%s>\n",(char*)(LOG+lba+9+k1*45),(char*)(LOG+lba+29+k1*45)); int kk; for (kk=0; kk<45; kk++) putchar(LOG[lba+9+k1*45+kk]); putchar('\n'); } char *desc = (char*)(LOG+lba+9+k1*45); if (desc[0] == 0) continue; /* char secstr[7]; memcpy(secstr, LOG+lba+29+k1*45, 6); secstr[6] = 0; */ if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [259]: <%s> <%s>",desc,(char*)LOG+lba+29+k1*45); /* int c = sscanf((char*)(LOG+lba+46+k1*45),"(%02u%02u%02u%02u%02u%02u)",&tm_time.tm_year,&tm_time.tm_mon,&tm_time.tm_mday,&tm_time.tm_hour,&tm_time.tm_min,&tm_time.tm_sec); if (c<6) continue; tm_time.tm_year += tm_time.tm_year<20 ? 100:0; tm_time.tm_mon--; // Jan=0, Feb=1, ... gdf_time t0 = tm_time2gdf_time(&tm_time); char tmpstr[80]; strftime(tmpstr,80,"%Y-%m-%d %H:%M:%S", &tm_time); if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [261]: %s\n",tmpstr); */ if (1) //(t0 >= hdr->T0) { hdr->EVENT.TYP[hdr->EVENT.N] = 1; //hdr->EVENT.POS[hdr->EVENT.N] = (uint32_t)(ldexp(t0 - hdr->T0,-32)*86400*hdr->SampleRate); // 0-based indexing //hdr->EVENT.POS[hdr->EVENT.N] = (uint32_t)(atoi(strtok((char*)(LOG+lba+29+k1*45),"("))*hdr->SampleRate); hdr->EVENT.POS[hdr->EVENT.N] = (uint32_t)(atoi(strtok((char*)(LOG+lba+29+k1*45),"("))*hdr->SampleRate); hdr->EVENT.DUR[hdr->EVENT.N] = 0; hdr->EVENT.CHN[hdr->EVENT.N] = 0; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif FreeTextEvent(hdr,hdr->EVENT.N,desc); hdr->EVENT.N++; } } } } } hdr->AS.auxBUF = (uint8_t*)LOG; free(fn); if (VERBOSE_LEVEL>7) fprintf(stdout,"EEG1100 [292]: \n"); } else if (hdr->TYPE==EEProbe) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "EEProbe currently not supported"); } else if (hdr->TYPE==EGI) { fprintf(stdout,"Reading EGI is under construction\n"); uint16_t NEC = 0; // specific for EGI format uint16_t gdftyp = 3; // BigEndian hdr->FILE.LittleEndian = 0; hdr->VERSION = beu32p(hdr->AS.Header); if (hdr->VERSION==2 || hdr->VERSION==3) gdftyp = 3; // int32 else if (hdr->VERSION==4 || hdr->VERSION==5) gdftyp = 16; // float else if (hdr->VERSION==6 || hdr->VERSION==7) gdftyp = 17; // double tm_time.tm_year = beu16p(hdr->AS.Header+4) - 1900; tm_time.tm_mon = beu16p(hdr->AS.Header+6) - 1; tm_time.tm_mday = beu16p(hdr->AS.Header+8); tm_time.tm_hour = beu16p(hdr->AS.Header+10); tm_time.tm_min = beu16p(hdr->AS.Header+12); tm_time.tm_sec = beu16p(hdr->AS.Header+14); // tm_time.tm_sec = beu32p(Header1+16)/1000; // not supported by tm_time hdr->T0 = tm_time2gdf_time(&tm_time); hdr->SampleRate = beu16p(hdr->AS.Header+20); hdr->NS = beu16p(hdr->AS.Header+22); // uint16_t Gain = beu16p(Header1+24); // not used uint16_t Bits = beu16p(hdr->AS.Header+26); uint16_t PhysMax= beu16p(hdr->AS.Header+28); size_t POS; if (hdr->AS.Header[3] & 0x01) { // Version 3,5,7 POS = 32; for (k=0; k < beu16p(hdr->AS.Header+30); k++) { char tmp[256]; int len = hdr->AS.Header[POS]; strncpy(tmp,Header1+POS,len); tmp[len]=0; if (VERBOSE_LEVEL>7) fprintf(stdout,"EGI categorie %i: <%s>\n",(int)k,tmp); POS += *(hdr->AS.Header+POS); // skip EGI categories if (POS > count-8) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,2*count); count += ifread(hdr->AS.Header,1,count,hdr); } } hdr->NRec= beu16p(hdr->AS.Header+POS); hdr->SPR = beu32p(hdr->AS.Header+POS+2); NEC = beu16p(hdr->AS.Header+POS+6); // EGI.N POS += 8; } else { // Version 2,4,6 hdr->NRec = beu32p(hdr->AS.Header+30); NEC = beu16p(hdr->AS.Header+34); // EGI.N hdr->SPR = 1; /* see also end-of-sopen hdr->AS.spb = hdr->SPR+NEC; hdr->AS.bpb = (hdr->NS + NEC)*GDFTYP_BITS[hdr->CHANNEL[0].GDFTYP]>>3; */ POS = 36; } /* read event code description */ hdr->AS.auxBUF = (uint8_t*) realloc(hdr->AS.auxBUF,5*NEC); hdr->EVENT.CodeDesc = (typeof(hdr->EVENT.CodeDesc)) realloc(hdr->EVENT.CodeDesc,257*sizeof(*hdr->EVENT.CodeDesc)); hdr->EVENT.CodeDesc[0] = ""; // typ==0, is always empty hdr->EVENT.LenCodeDesc = NEC+1; for (k=0; k < NEC; k++) { memcpy(hdr->AS.auxBUF+5*k,Header1+POS,4); hdr->AS.auxBUF[5*k+4]=0; hdr->EVENT.CodeDesc[k+1] = (char*)hdr->AS.auxBUF+5*k; POS += 4; } hdr->HeadLen = POS; ifseek(hdr,hdr->HeadLen,SEEK_SET); hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->GDFTYP = gdftyp; hc->PhysDimCode = 4275; // "uV" hc->LeadIdCode = 0; sprintf(hc->Label,"# %03i",(int)k); hc->Cal = PhysMax/ldexp(1,Bits); hc->Off = 0; hc->SPR = hdr->SPR; hc->bi = k*hdr->SPR*(GDFTYP_BITS[gdftyp]>>3); if (VERBOSE_LEVEL>8) fprintf(stdout,"SOPEN(EGI): #%i %i %i\n",(int)k,Bits, PhysMax); if (Bits && PhysMax) { hc->PhysMax = PhysMax; hc->PhysMin = -PhysMax; hc->DigMax = ldexp(1,Bits); hc->DigMin = ldexp(-1,Bits); } else { /* hc->PhysMax = PhysMax; hc->PhysMin = -PhysMax; hc->DigMax = ldexp(1,Bits); hc->DigMin = ldexp(-1,Bits); */ hc->Cal = 1.0; hc->OnOff = 1; } } hdr->AS.bpb = (hdr->NS*hdr->SPR + NEC) * (GDFTYP_BITS[gdftyp]>>3); if (hdr->AS.Header[3] & 0x01) // triggered hdr->AS.bpb += 6; size_t N = 0; if (NEC > 0) { /* read event information */ size_t sz = GDFTYP_BITS[gdftyp]>>3; uint8_t *buf = (uint8_t*)calloc(NEC, sz); uint8_t *buf8 = (uint8_t*)calloc(NEC*2, 1); size_t *ix = (size_t*)calloc(NEC, sizeof(size_t)); size_t skip = hdr->AS.bpb - NEC * sz; ifseek(hdr, hdr->HeadLen + skip, SEEK_SET); typeof(NEC) k1; nrec_t k; for (k=0; (k < hdr->NRec*hdr->SPR) && !ifeof(hdr); k++) { ifread(buf, sz, NEC, hdr); ifseek(hdr, skip, SEEK_CUR); int off0, off1; if (k & 0x01) { off0 = 0; off1=NEC; } else { off0 = NEC; off1=0; } memset(buf8+off1,0,NEC); // reset for (k1=0; k1 < NEC * sz; k1++) if (buf[k1]) buf8[ off1 + k1/sz ] = 1; for (k1=0; k1 < NEC ; k1++) { if (buf8[off1 + k1] && !buf8[off0 + k1]) { /* rising edge */ ix[k1] = k; } else if (!buf8[off1 + k1] && buf8[off0 + k1]) { /* falling edge */ if (N <= (hdr->EVENT.N + NEC*2)) { N += (hdr->EVENT.N+NEC)*2; // allocate memory for this and the terminating line. if (reallocEventTable(hdr, N) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } hdr->EVENT.TYP[hdr->EVENT.N] = k1+1; hdr->EVENT.POS[hdr->EVENT.N] = ix[k1]; // 0-based indexing hdr->EVENT.CHN[hdr->EVENT.N] = 0; hdr->EVENT.DUR[hdr->EVENT.N] = k-ix[k1]; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif hdr->EVENT.N++; ix[k1] = 0; } } } for (k1 = 0; k1 < NEC; k1++) if (ix[k1]) { /* end of data */ hdr->EVENT.TYP[hdr->EVENT.N] = k1+1; hdr->EVENT.POS[hdr->EVENT.N] = ix[k1]; // 0-based indexing hdr->EVENT.CHN[hdr->EVENT.N] = 0; hdr->EVENT.DUR[hdr->EVENT.N] = k-ix[k1]; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif hdr->EVENT.N++; ix[k1] = 0; } hdr->EVENT.SampleRate = hdr->SampleRate; free(buf); free(buf8); free(ix); } ifseek(hdr,hdr->HeadLen,SEEK_SET); /* TODO: check EGI format */ } #ifdef WITH_EGIS else if (hdr->TYPE==EGIS) { fprintf(stdout,"Reading EGIS is under construction\n"); #if __BYTE_ORDER == __BIG_ENDIAN char FLAG_SWAP = hdr->FILE.LittleEndian; #elif __BYTE_ORDER == __LITTLE_ENDIAN char FLAG_SWAP = hdr->FILE.LittleEndian; #endif hdr->VERSION = *(int16_t*) mfer_swap8b(hdr->AS.Header+4, sizeof(int16_t), char FLAG_SWAP); hdr->HeadLen = *(uint16_t*) mfer_swap8b(hdr->AS.Header+6, sizeof(uint16_t), char FLAG_SWAP); //hdr->HeadLen = *(uint32_t*) mfer_swap8b(hdr->AS.Header+8, sizeof(uint32_t), char FLAG_SWAP); /* read file */ hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen+1); count += ifread(hdr->AS.Header+count,1,hdr->HeadLen-count,hdr); hdr->AS.Header[count]=0; } #endif #ifdef WITH_EMBLA else if (hdr->TYPE==EMBLA) { ifseek(hdr,48,SEEK_SET); hdr->NS = 1; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE* hc = hdr->CHANNEL+k; hc->OnOff = 1; hc->GDFTYP = 3; hc->SPR = hdr->SPR; hc->Cal = 0.1; hc->Off = 0.0; hc->Transducer[0] = '\0'; hc->LowPass = NAN; hc->HighPass = NAN; hc->PhysMax = 3276.7; hc->PhysMin = -3276.8; hc->DigMax = 32767; hc->DigMin = -32768; hc->LeadIdCode = 0; hc->PhysDimCode = 4275; //uV hc->bi = k*hdr->SPR*2; char *label = (char*)(hdr->AS.Header+1034+k*512); len = min(16,MAX_LENGTH_LABEL); if ( (hdr->AS.Header[1025+k*512]=='E') && strlen(label)<13) { strcpy(hc->Label, "EEG "); strcat(hc->Label, label); // Flawfinder: ignore } else { strncpy(hc->Label, label, len); hc->Label[len]=0; } } while (1) { uint32_t taglen[2]; uint32_t *tag = &taglen[0]; uint32_t *len = &taglen[1]; size_t c = ifread(taglen, 4, 2, hdr); if (ifeof(hdr)) break; switch (*tag) { case 32: hdr->HeadLen = iftell(hdr); hdr->SPR = *len/2; hdr->AS.rawdata = realloc(hdr->AS.rawdata,*len); ifread(hdr->AS.rawdata,2,*len/2,hdr); default: ifseek(hdr,*len,SEEK_CUR); } //strncpy(hdr->CHANNEL[k].Label,buf+0x116,MAX_LENGTH_LABEL); } } #endif else if (hdr->TYPE==EMSA) { hdr->NS = (uint8_t)hdr->AS.Header[3]; hdr->HeadLen = 1024 + hdr->NS*512; hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, hdr->HeadLen); count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); if (count < hdr->HeadLen) { biosigERROR(hdr, B4C_INCOMPLETE_FILE, "EMSA file corrupted"); } hdr->HeadLen = count; sprintf(hdr->Patient.Id,"%05i",leu32p(hdr->AS.Header+4)); unsigned seq_nr = hdr->AS.Header[8]; uint16_t fs = leu16p(hdr->AS.Header+9); if (fs % 10) hdr->SPR = fs; else hdr->SPR = fs/10; hdr->AS.bpb = 2*hdr->NS*hdr->SPR; hdr->NRec = (hdr->FILE.size - hdr->HeadLen) / hdr->AS.bpb; hdr->SampleRate = fs; { struct tm t; char tmp[9]; // Birthday strncpy(tmp, (char*)(hdr->AS.Header+169), 8); for (k=0; k<8; k++) if (tmp[k]<'0' || tmp[k]>'9') biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); // error ; tmp[8] = 0; t.tm_mday = atoi(tmp+6); tmp[6] = 0; t.tm_mon = atoi(tmp+4)-1; tmp[4] = 0; t.tm_year = atoi(tmp+4)-1900; t.tm_hour = 12; t.tm_min = 0; t.tm_sec = 0; hdr->Patient.Birthday = tm_time2gdf_time(&t); // startdate strncpy(tmp, (char*)hdr->AS.Header+205, 8); for (k=0; k<8; k++) if (tmp[k]<'0' || tmp[k]>'9') biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); // error ; tmp[8] = 0; t.tm_mday = atoi(tmp+6); tmp[6] = 0; t.tm_mon = atoi(tmp+4)-1; tmp[4] = 0; t.tm_year = atoi(tmp+4)-1900; // starttime strncpy(tmp, (char*)hdr->AS.Header+214, 8); for (k=0; k<8; k++) { if ((k==2 || k==5) && tmp[k] != ':') biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); // error ; else if (tmp[k]<'0' || tmp[k]>'9') biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); // error ; } tmp[8] = 0; t.tm_sec = atoi(tmp+6); tmp[5] = 0; t.tm_min = atoi(tmp+3); tmp[2] = 0; t.tm_hour= atoi(tmp); hdr->T0 = tm_time2gdf_time(&t); if (hdr->AS.B4C_ERRNUM) biosigERROR(hdr, B4C_FORMAT_UNKNOWN, "Reading EMSA file failed - invalid data / time format"); } size_t len = min(MAX_LENGTH_NAME,30); strncpy(hdr->Patient.Name, (char*)hdr->AS.Header+11, len); hdr->Patient.Name[len]=0; // equipment len = min(MAX_LENGTH_MANUF,40); strncpy(hdr->ID.Manufacturer._field, (char*)hdr->AS.Header+309, len); hdr->ID.Manufacturer._field[len]=0; char c = toupper(hdr->AS.Header[203]); hdr->Patient.Sex = (c=='M') + (c=='F')*2; c = hdr->AS.Header[204]; hdr->Patient.Handedness = (c=='D') + (c=='E')*2; //D->1: right-handed, E->2: left-handed, 0 unknown hdr->Patient.Weight = atoi((char*)(hdr->AS.Header+351)); hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE* hc = hdr->CHANNEL+k; hc->OnOff = 1; hc->GDFTYP = 3; hc->SPR = hdr->SPR; hc->Cal = 0.1; hc->Off = 0.0; hc->Transducer[0] = '\0'; hc->LowPass = NAN; hc->HighPass = NAN; hc->PhysMax = 3276.7; hc->PhysMin = -3276.8; hc->DigMax = 32767; hc->DigMin = -32768; hc->LeadIdCode = 0; hc->PhysDimCode = 4275; //uV hc->bi = k*hdr->SPR*2; char *label = (char*)(hdr->AS.Header+1034+k*512); len = min(16,MAX_LENGTH_LABEL); if ( (hdr->AS.Header[1025+k*512]=='E') && strlen(label)<13) { strcpy(hc->Label, "EEG "); strcat(hc->Label, label); // Flawfinder: ignore } else { strncpy(hc->Label, label, len); hc->Label[len]=0; } } /* read event file */ char* tmpfile = (char*)calloc(strlen(hdr->FileName)+4, 1); strcpy(tmpfile, hdr->FileName); char* ext = strrchr(tmpfile,'.'); if (ext != NULL) strcpy(ext+1,"LBK"); // Flawfinder: ignore else strcat(tmpfile,".LBK"); // Flawfinder: ignore FILE *fid = fopen(tmpfile,"rb"); if (fid==NULL) { if (ext != NULL) strcpy(ext+1,"lbk"); else strcat(tmpfile,".lbk"); } if (fid != NULL) { size_t N_EVENTS = 0; const int sz = 69; char buf[sz+1]; hdr->EVENT.SampleRate = hdr->SampleRate; while (!feof(fid)) { if (fread(buf,sz,1,fid) <= 0) break; // starttime char *tmp = buf; for (k=0; k<8; k++) { if ((k==2 || k==5) && tmp[k] != ':') biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); // error ; else if (tmp[k]<'0' || tmp[k]>'9') biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); // error ; } tmp[2] = 0; tmp[5] = 0; tmp[8] = 0; size_t tstart = atoi(tmp)*3600 + atoi(tmp+3)*60 + atoi(tmp+6); fread(buf,sz,1,fid); // endtime tmp = buf+9; for (k=0; k<8; k++) { if ((k==2 || k==5) && tmp[k] != ':') biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); // error ; else if (tmp[k]<'0' || tmp[k]>'9') biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); // error ; } tmp[2] = 0; tmp[5] = 0; tmp[8] = 0; size_t tend = atoi(tmp)*3600 + atoi(tmp+3)*60 + atoi(tmp+6); if (tend18 && isspace(buf[k])) k--; buf[k+1]=0; if (hdr->EVENT.N+2 >= N_EVENTS) { // memory allocation if needed N_EVENTS = max(128, N_EVENTS*2); if (reallocEventTable(hdr, N_EVENTS) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } FreeTextEvent(hdr,hdr->EVENT.N,(char*)buf); hdr->EVENT.POS[hdr->EVENT.N] = tstart*hdr->EVENT.SampleRate; hdr->EVENT.DUR[hdr->EVENT.N] = (tend-tstart)*hdr->EVENT.SampleRate; hdr->EVENT.CHN[hdr->EVENT.N] = 0; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif hdr->EVENT.N++; } } free(tmpfile); } else if (hdr->TYPE==ePrime) { /* read file */ while (!ifeof(hdr)) { size_t bufsiz = max(2*count,1<<16); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, bufsiz+1); count += ifread(hdr->AS.Header+count, 1, bufsiz-count, hdr); } hdr->AS.Header[count]=0; hdr->HeadLen = count; ifclose(hdr); struct Target { size_t OnsetTime; size_t RTTime; size_t RT; size_t TrigTarget; uint8_t RESP; char *Stimulus; } Target; Target.RESP = 0xff; Target.Stimulus = NULL; Target.OnsetTime = 0; Target.RTTime = 0; Target.RT = 0; Target.TrigTarget = 0; int colSubject = -1, colSampleRate = -1, colDate = -1, colTime = -1, colOnsetTime = -1; int colResponseTime = -1, colRTTime = -1, colStimulus = -1, colTrigTarget = -1, colRESP = -1; size_t N_EVENTS = 0; struct tm t; char nextRow = 0; int col=0, row=0, len; char *f = (char*)hdr->AS.Header; while (*f != 0) { len = strcspn(f,"\t\n\r"); col++; if (f[len]==9) { nextRow = 0; } else if ( f[len]==10 || f[len]==13 || f[len]==0 ) { nextRow = 1; if (row>0) { if (hdr->EVENT.N+2 >= N_EVENTS) { // memory allocation if needed N_EVENTS = max(128, N_EVENTS*2); if (reallocEventTable(hdr, N_EVENTS) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } // add trigger event if (Target.Stimulus != NULL || Target.TrigTarget > 0) { if (Target.Stimulus) FreeTextEvent(hdr, hdr->EVENT.N, Target.Stimulus); else hdr->EVENT.TYP[hdr->EVENT.N] = Target.TrigTarget; hdr->EVENT.POS[hdr->EVENT.N] = Target.OnsetTime; hdr->EVENT.DUR[hdr->EVENT.N] = Target.RT; hdr->EVENT.CHN[hdr->EVENT.N] = 0; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif hdr->EVENT.N++; } if (Target.RESP < 0x0f) { // add response event hdr->EVENT.TYP[hdr->EVENT.N] = Target.RESP + 0x0140; // eventcodes.txt: response codes are in the range between 0x0140 to 0x014f hdr->EVENT.POS[hdr->EVENT.N] = Target.OnsetTime + Target.RT; hdr->EVENT.CHN[hdr->EVENT.N] = 0; hdr->EVENT.DUR[hdr->EVENT.N] = 0; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif hdr->EVENT.N++; }; } if (VERBOSE_LEVEL>7) fprintf(stdout,"=======%i: %i\t%s\t%i\t%i\t%i\t%i\n", hdr->EVENT.N-1, (int)Target.TrigTarget, Target.Stimulus, (int)Target.OnsetTime, (int)Target.RT, (int)Target.RTTime, Target.RESP); Target.RESP = 0xff; Target.Stimulus = NULL; Target.OnsetTime = 0; Target.RTTime = 0; Target.RT = 0; Target.TrigTarget = 0; } f[len] = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"r%i\tc%i\t%s\t%i\t%i\t%i\t%i\t%i\t%i\t%i\t%i\n",(int)row,(int)col,f,colSubject, colSampleRate, colDate, colTime, colOnsetTime, colResponseTime, colStimulus, colRTTime); if (row==0) { // decode header line if (!strcmp(f,"Subject")) { colSubject = col; } else if (!strcmp(f,"Display.RefreshRate")) { colSampleRate = col; } else if (!strcmp(f,"SessionDate")) { colDate = col; } else if (!strcmp(f,"SessionTime")) { colTime = col; } else if (strstr(f,"Target.OnsetTime")) { colOnsetTime = col; } else if (strstr(f,"Target.RTTime")) { colRTTime = col; } else if (strstr(f,"Target.RT")) { colResponseTime = col; } else if (!strcmp(f,"Stimulus")) { colStimulus = col; } else if (!strcmp(f,"TrigTarget")) { colTrigTarget = col; } else if (strstr(f,"Target.RESP")) { colRESP = col; } } else { // decode line of body if (row==1) { t.tm_isdst = 0; char *eptr; if (col==colTime) { t.tm_hour = strtol(f, &eptr, 10); t.tm_min = strtol(eptr+1, &eptr, 10); t.tm_sec = strtol(eptr+1, &eptr, 10); } else if (col==colDate) { t.tm_mon = strtol(f, &eptr, 10)-1; t.tm_mday = strtol(eptr+1, &eptr, 10); t.tm_year = strtol(eptr+1, &eptr, 10)-1900; } else if (col==colSubject) { strncpy(hdr->Patient.Id, f, MAX_LENGTH_PID); } else if (col==colSampleRate) { hdr->EVENT.SampleRate = atof(f); } } if (col==colOnsetTime) { Target.OnsetTime = atol(f); } else if (col==colResponseTime) { Target.RT = atoi(f); } else if (col==colRTTime) { Target.RTTime = atol(f); } else if (col==colStimulus) { Target.Stimulus = f; } else if (col==colTrigTarget) { Target.TrigTarget = atoi(f); } else if ((col==colRESP) && strlen(f)) { Target.RESP = atoi(f); } } f += len+1; if (nextRow) { f += strspn(f,"\n\r"); row += nextRow; col = 0; } }; hdr->T0 = tm_time2gdf_time(&t); } else if (hdr->TYPE==ET_MEG) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "FLT/ET-MEG format not supported"); } else if (hdr->TYPE==ETG4000) { /* read file */ while (!ifeof(hdr)) { size_t bufsiz = max(2*count,1<<16); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, bufsiz+1); count += ifread(hdr->AS.Header+count, 1, bufsiz-count, hdr); } hdr->AS.Header[count]=0; hdr->HeadLen = count; ifclose(hdr); if (VERBOSE_LEVEL==9) fprintf(stdout,"Size of File %s is %i\n",hdr->FileName,(int)count); /* decode header section */ char dlm[2]; dlm[0] = (char)hdr->AS.Header[20]; dlm[1] = 0; hdr->VERSION = -1; char FLAG_StimType_STIM = 0; char *t = strtok((char*)hdr->AS.Header,"\xA\xD"); char *ag=NULL, *dg=NULL, *label; double lpf=-1.0,hpf=-1.0,age=0.0; while (strncmp(t,"Probe",5)) { if (VERBOSE_LEVEL==9) fprintf(stderr,"-> %s\n",t); if (!strncmp(t,"File Version",12)) hdr->VERSION = atof(strpbrk(t,dlm)+1); else if (!strncmp(t,"Name",4)) strncpy(hdr->Patient.Id,strpbrk(t,dlm)+1,MAX_LENGTH_PID); else if (!strncmp(t,"Sex",3)) hdr->Patient.Sex = ((toupper(*strpbrk(t,dlm)+1)=='F')<<1) + (toupper(*strpbrk(t,dlm)+1)=='M'); else if (!strncmp(t,"Age",3)) { char *tmp1 = strpbrk(t,dlm)+1; size_t c = strcspn(tmp1,"0123456789"); char buf[20]; age = atof(strncpy(buf,tmp1,19)); if (tmp1[c]=='y') age *= 365.25; else if (tmp1[c]=='m') age *= 30; } else if (!strncmp(t,"Date",4)) { sscanf(strpbrk(t,dlm)+1,"%d/%d/%d %d:%d",&(tm_time.tm_year),&(tm_time.tm_mon),&(tm_time.tm_mday),&(tm_time.tm_hour),&(tm_time.tm_min)); tm_time.tm_sec = 0; tm_time.tm_year -= 1900; tm_time.tm_mon -= 1; //fprintf(stdout,"%s\n",asctime(&tm_time)); hdr->T0 = tm_time2gdf_time(&tm_time); } else if (!strncmp(t,"HPF[Hz]",7)) hpf = atof(strpbrk(t,dlm)+1); else if (!strncmp(t,"LPF[Hz]",7)) lpf = atof(strpbrk(t,dlm)+1); else if (!strncmp(t,"Analog Gain",11)) ag = strpbrk(t,dlm); else if (!strncmp(t,"Digital Gain",12)) dg = strpbrk(t,dlm)+1; else if (!strncmp(t,"Sampling Period[s]",18)) hdr->SampleRate = 1.0/atof(strpbrk(t,dlm)+1); else if (!strncmp(t,"StimType",8)) FLAG_StimType_STIM = !strncmp(t+9,"STIM",4); t = strtok(NULL,"\xA\xD"); } if (VERBOSE_LEVEL==9) fprintf(stderr,"\nNS=%i\n-> %s\n",hdr->NS,t); hdr->Patient.Birthday = hdr->T0 - (uint64_t)ldexp(age,32); hdr->NS = 0; while (ag != NULL) { ++hdr->NS; ag = strpbrk(ag+1,dlm); } hdr->NS >>= 1; if (VERBOSE_LEVEL==9) fprintf(stderr,"\n-V=%i NS=%i\n-> %s\n",VERBOSE_LEVEL,hdr->NS,t); label = strpbrk(t,dlm) + 1; //uint16_t gdftyp = 16; // use float32 as internal buffer uint16_t gdftyp = 17; // use float64 as internal buffer double DigMax = 1.0, DigMin = -1.0; hdr->FLAG.OVERFLOWDETECTION = 0; // automated overflow and saturation detection not supported hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE* hc = hdr->CHANNEL+k; hc->OnOff = 1; hc->GDFTYP = gdftyp; hc->SPR = 1; hc->Cal = 1.0; hc->Off = 0.0; hc->Transducer[0] = '\0'; hc->LowPass = lpf; hc->HighPass = hpf; hc->PhysMax = DigMax; hc->PhysMin = DigMin; hc->DigMax = DigMax; hc->DigMin = DigMin; hc->LeadIdCode = 0; hc->PhysDimCode = 65362; //mmol l-1 mm hc->bi = k*GDFTYP_BITS[gdftyp]>>3; size_t c = strcspn(label,dlm); size_t c1 = min(c,MAX_LENGTH_LABEL); strncpy(hc->Label, label, c1); hc->Label[c1]= 0; label += c+1; if (VERBOSE_LEVEL>8) fprintf(stderr,"-> Label #%02i: len(%i) %s\n",(int)k,(int)c1,hc->Label); } hdr->SPR = 1; hdr->NRec = 0; hdr->AS.bpb = hdr->NS*GDFTYP_BITS[gdftyp]>>3; /* decode data section */ // hdr->FLAG.SWAP = 0; hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); uint32_t pos; int Mark=0,hh,mm,ss,ds,BodyMovement,RemovalMark,PreScan; size_t NEV = 16; hdr->EVENT.N = 0; hdr->EVENT.SampleRate = hdr->SampleRate; hdr->EVENT.DUR = NULL; hdr->EVENT.CHN = NULL; pos = atol(strtok(NULL,dlm)); while (pos) { hdr->AS.rawdata = (uint8_t*) realloc(hdr->AS.rawdata, (((size_t)hdr->NRec+1) * hdr->NS * GDFTYP_BITS[gdftyp])>>3); for (k=0; k < hdr->NS; k++) { if (gdftyp==16) *(float*)(hdr->AS.rawdata + (((size_t)hdr->NRec*hdr->NS+k)*(GDFTYP_BITS[gdftyp]>>3))) = (float)atof(strtok(NULL,dlm)); else if (gdftyp==17) *(double*)(hdr->AS.rawdata + (((size_t)hdr->NRec*hdr->NS+k)*(GDFTYP_BITS[gdftyp]>>3))) = atof(strtok(NULL,dlm)); } ++hdr->NRec; Mark = atoi(strtok(NULL,dlm)); if (Mark) { if (hdr->EVENT.N+1 >= NEV) { NEV<<=1; // double allocated memory hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, NEV*sizeof(*hdr->EVENT.POS) ); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, NEV*sizeof(*hdr->EVENT.TYP) ); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = (gdf_time*)realloc(hdr->EVENT.TimeStamp, NEV*sizeof(gdf_time)); #endif } hdr->EVENT.POS[hdr->EVENT.N] = pos; // 0-based indexing hdr->EVENT.TYP[hdr->EVENT.N] = Mark; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = 0; #endif if (FLAG_StimType_STIM && !(hdr->EVENT.N & 0x01)) hdr->EVENT.TYP[hdr->EVENT.N] = Mark | 0x8000; ++hdr->EVENT.N; } sscanf(strtok(NULL,dlm),"%d:%d:%d.%d",&hh,&mm,&ss,&ds); BodyMovement = atoi(strtok(NULL,dlm)); RemovalMark = atoi(strtok(NULL,dlm)); PreScan = atoi(strtok(NULL,"\xA\xD")); if (VERBOSE_LEVEL>8) fprintf(stdout,"%d: %d %02d:%02d:%02d.%02d %d %d %d\n",pos,Mark,hh,mm,ss,ds,BodyMovement,RemovalMark,PreScan); pos = atol(strtok(NULL,dlm)); }; if (FLAG_StimType_STIM && (hdr->EVENT.N & 0x01)) { /* if needed, add End-Of-Event marker */ ++hdr->EVENT.N; hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, hdr->EVENT.N*sizeof(*hdr->EVENT.POS) ); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, hdr->EVENT.N*sizeof(*hdr->EVENT.TYP) ); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = (gdf_time*)realloc(hdr->EVENT.TimeStamp, hdr->EVENT.N*sizeof(gdf_time)); hdr->EVENT.TimeStamp[hdr->EVENT.N-1] = 0; #endif hdr->EVENT.POS[hdr->EVENT.N-1] = pos; // 0-based indexing hdr->EVENT.TYP[hdr->EVENT.N-1] = Mark | 0x8000; } hdr->AS.length = hdr->NRec; } #ifdef WITH_FAMOS else if (hdr->TYPE==FAMOS) { hdr->HeadLen=count; sopen_FAMOS_read(hdr); } #endif else if (hdr->TYPE==FEF) { #ifdef WITH_FEF size_t bufsiz = 1l<<24; while (!ifeof(hdr)) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count+bufsiz+1); count += ifread(hdr->AS.Header+count,1,bufsiz,hdr); } hdr->AS.Header[count]=0; hdr->HeadLen = count; char tmp[9]; tmp[8] = 0; memcpy(tmp, hdr->AS.Header+8, 8); hdr->VERSION = atol(tmp)/100.0; memcpy(tmp, hdr->AS.Header+24, 8); hdr->FILE.LittleEndian = !atol(tmp); ifseek(hdr,32,SEEK_SET); if (VERBOSE_LEVEL>7) fprintf(stdout,"ASN1 [401] %i\n",(int)count); sopen_fef_read(hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"ASN1 [491]\n"); #else biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "VITAL/FEF Format not supported"); return(hdr); #endif } else if (hdr->TYPE==FIFF) { hdr->HeadLen = count; sopen_fiff_read(hdr); } else if (hdr->TYPE==HDF) { #ifdef WITH_HDF if (sopen_hdf5(hdr) != 0) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error reading HDF file"); } #else biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format HDF not supported"); ifclose(hdr); #endif return(hdr); } else if (hdr->TYPE==HEKA) { // HEKA PatchMaster file format hdr->HeadLen = count; FILE *itx = fopen((char*)hdr->aECG, "w"); hdr->aECG = NULL; // reset auxillary pointer sopen_heka(hdr, itx); if (itx) fclose(itx); } else if (hdr->TYPE==IBW) { struct stat FileBuf; stat(hdr->FileName, &FileBuf); hdr->FILE.size = FileBuf.st_size; sopen_ibw_read(hdr); } else if (hdr->TYPE==ITX) { sopen_itx_read(hdr); } else if (hdr->TYPE==ISHNE) { char flagANN = !strncmp((char*)hdr->AS.Header,"ANN",3); fprintf(stderr,"Warning SOPEN(ISHNE): support for ISHNE format is experimental\n"); // unknown, generic, X,Y,Z, I-VF, V1-V6, ES, AS, AI uint16_t Table1[] = {0,0,16,17,18,1,2,87,88,89,90,3,4,5,6,7,8,131,132,133}; size_t len; struct tm t; hdr->HeadLen = lei32p(hdr->AS.Header+22); if (count < hdr->HeadLen) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen); count += ifread(hdr->AS.Header+count,1,hdr->HeadLen-count,hdr); } hdr->HeadLen = count; if (VERBOSE_LEVEL>6) { fprintf(stdout,"SOPEN(ISNHE): @%p %i\n",hdr->AS.Header,hdr->HeadLen); fprintf(stdout,"SOPEN(ISNHE): @%p %x %x %x %x %x %x\n",hdr->AS.Header,hdr->AS.Header[132],hdr->AS.Header[133],hdr->AS.Header[134],hdr->AS.Header[135],hdr->AS.Header[136],hdr->AS.Header[137]); for (k=0;k<522;k++) { fprintf(stdout,"%02x ",hdr->AS.Header[k]); if (k%32==0) fputc('\n',stdout); } } //int offsetVarHdr = lei32p(hdr->AS.Header+18); hdr->VERSION = (float)lei16p(hdr->AS.Header+26); if (!hdr->FLAG.ANONYMOUS) { len = min(40, MAX_LENGTH_NAME); char *s; s = (char*)(hdr->AS.Header+68); // lastname int len1 = min(40, strlen(s)); strncpy(hdr->Patient.Name, s, len1); hdr->Patient.Name[len] = 0x1f; // unit separator ascii(31) s = (char*)(hdr->AS.Header+28); // firstname int len2 = min(strlen(s), MAX_LENGTH_NAME-len-1); strncpy(hdr->Patient.Name+len1+1, s, len2); hdr->Patient.Name[len1+len2+1] = 0; } len = min(20, MAX_LENGTH_PID); strncpy(hdr->Patient.Id, (char*)(hdr->AS.Header+108), len); hdr->Patient.Id[len] = 0; hdr->Patient.Sex = lei16p(hdr->AS.Header+128); // Race = lei16p(hdr->AS.Header+128); t.tm_mday = lei16p(hdr->AS.Header + 132); t.tm_mon = lei16p(hdr->AS.Header + 134) - 1; t.tm_year = lei16p(hdr->AS.Header + 136) - 1900; t.tm_hour = 12; t.tm_min = 0; t.tm_sec = 0; t.tm_isdst = 0; if (VERBOSE_LEVEL>6) { fprintf(stdout,"SOPEN(ISNHE): Birthday: %04i-%02i-%02i %02i:%02i:%02i\n",t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec); fprintf(stdout,"SOPEN(ISNHE): @%p %x %x %x %x %x %x\n",hdr->AS.Header,hdr->AS.Header[132],hdr->AS.Header[133],hdr->AS.Header[134],hdr->AS.Header[135],hdr->AS.Header[136],hdr->AS.Header[137]); } if (t.tm_mday>0 && t.tm_mon>=0 && t.tm_year>=0) hdr->Patient.Birthday = tm_time2gdf_time(&t); t.tm_mday = leu16p(hdr->AS.Header + 138); t.tm_mon = leu16p(hdr->AS.Header + 140)-1; t.tm_year = leu16p(hdr->AS.Header + 142)-1900; t.tm_hour = leu16p(hdr->AS.Header + 150); t.tm_min = leu16p(hdr->AS.Header + 152); t.tm_sec = leu16p(hdr->AS.Header + 154); hdr->T0 = tm_time2gdf_time(&t); hdr->NS = lei16p(hdr->AS.Header + 156); hdr->AS.bpb= hdr->NS * 2; hdr->SPR = 1; hdr->SampleRate = lei16p(hdr->AS.Header + 272); hdr->Patient.Impairment.Heart = lei16p(hdr->AS.Header+230) ? 3 : 0; // Pacemaker { struct stat FileBuf; stat(hdr->FileName,&FileBuf); hdr->FILE.size = FileBuf.st_size; } if (flagANN) { hdr->NRec=0; hdr->EVENT.N = (hdr->FILE.size - hdr->HeadLen)/4; hdr->EVENT.TYP = (typeof(hdr->EVENT.TYP)) realloc(hdr->EVENT.TYP, hdr->EVENT.N * sizeof(*hdr->EVENT.TYP)); hdr->EVENT.POS = (typeof(hdr->EVENT.POS)) realloc(hdr->EVENT.POS, hdr->EVENT.N * sizeof(*hdr->EVENT.POS)); /* define user specified events according to ECG Annotation format of http://thew-project.org/THEWFileFormat.htm */ hdr->EVENT.CodeDesc = (typeof(hdr->EVENT.CodeDesc)) realloc(hdr->EVENT.CodeDesc,10*sizeof(*hdr->EVENT.CodeDesc)); hdr->EVENT.CodeDesc[0]=""; hdr->EVENT.CodeDesc[1]="Normal beat"; hdr->EVENT.CodeDesc[2]="Premature ventricular contraction"; hdr->EVENT.CodeDesc[3]="Supraventricular premature or ectopic beat"; hdr->EVENT.CodeDesc[4]="Calibration Pulse"; hdr->EVENT.CodeDesc[5]="Bundle branch block beat"; hdr->EVENT.CodeDesc[6]="Pace"; hdr->EVENT.CodeDesc[7]="Artfact"; hdr->EVENT.CodeDesc[8]="Unknown"; hdr->EVENT.CodeDesc[9]="NULL"; hdr->EVENT.LenCodeDesc = 9; uint8_t evt[4]; ifseek(hdr, lei32p(hdr->AS.Header+22), SEEK_SET); size_t N = 0, pos=0; while (!ifeof(hdr)) { if (!ifread(evt, 1, 4, hdr)) break; uint16_t typ = 8; switch ((char)(evt[0])) { case 'N': typ = 1; break; case 'V': typ = 2; break; case 'S': typ = 3; break; case 'C': typ = 4; break; case 'B': typ = 5; break; case 'P': typ = 6; break; case 'X': typ = 7; break; case '!': typ = 0x7ffe; break; case 'U': typ = 8; break; default: continue; } pos += leu16p(evt+2); hdr->EVENT.POS[N] = pos; hdr->EVENT.TYP[N] = typ; N++; } hdr->EVENT.N = N; } else { hdr->EVENT.N = 0; hdr->NRec = min(leu32p(hdr->AS.Header+14), (hdr->FILE.size - hdr->HeadLen)/hdr->AS.bpb ); } hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE* hc = hdr->CHANNEL+k; hc->OnOff = 1; if (hdr->VERSION == 1) { hc->GDFTYP = 3; //int16 - 2th complement hc->DigMax = (double)(int16_t)(0x7fff); hc->DigMin = (double)(int16_t)(0x8000); } else { hc->GDFTYP = 4; //uint16 hc->DigMax = (double)(uint16_t)(0xffff); hc->DigMin = (double)(uint16_t)(0x0000); } hc->SPR = 1; hc->Cal = lei16p(hdr->AS.Header + 206 + 2*k); hc->Off = 0.0; hc->Transducer[0] = '\0'; hc->LowPass = NAN; hc->HighPass = NAN; hc->PhysMax = hc->Cal * hc->DigMax; hc->PhysMin = hc->Cal * hc->DigMin; hc->LeadIdCode = Table1[lei16p(hdr->AS.Header + 158 + 2*k)]; hc->PhysDimCode = 4276; // nV hc->bi = k*2; strcpy(hc->Label, LEAD_ID_TABLE[hc->LeadIdCode]); } ifseek(hdr, lei32p(hdr->AS.Header+22), SEEK_SET); hdr->FILE.POS = 0; } else if (hdr->TYPE==Matlab) { #ifdef HAVE_MATIO if (sopen_matlab(hdr) != 0) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Error reading MATLAB file"); } #else biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format MAT not supported"); ifclose(hdr); #endif return(hdr); } else if (hdr->TYPE==MFER) { // ISO/TS 11073-92001:2007(E), Table 5, p.9 /* ### FIXME: some units are not encoded */ const uint16_t MFER_PhysDimCodeTable[30] = { 4256, 3872, 3840, 3904,65330, // Volt, mmHg, Pa, mmH2O, mmHg/s 3808, 3776, 544, 6048, 2528, // dyne, N, %, °C, 1/min 4264, 4288, 4160,65376, 4032, // 1/s, Ohm, A, rpm, W 6448, 1731, 3968, 6016, 1600, // dB, kg, J, dyne s m-2 cm-5, l 3040, 3072, 4480, 0, 0, // l/s, l/min, cd 0, 0, 0, 0, 0, // }; hdr->FLAG.OVERFLOWDETECTION = 0; // MFER does not support automated overflow and saturation detection uint8_t buf[128]; void* ptrbuf = buf; uint8_t gdftyp = 3; // default: int16 uint8_t UnitCode=0; double Cal = 1.0, Off = 0.0; char SWAP = ( __BYTE_ORDER == __LITTLE_ENDIAN); // default of MFER is BigEndian hdr->FILE.LittleEndian = 0; hdr->SampleRate = 1000; // default sampling rate is 1000 Hz hdr->NS = 1; // default number of channels is 1 /* TAG */ uint8_t tag = hdr->AS.Header[0]; ifseek(hdr,1,SEEK_SET); int curPos = 1; size_t N_EVENT=0; // number of events, memory is allocated for in the event table. while (!ifeof(hdr)) { uint32_t len, val32=0; int32_t chan=-1; uint8_t tmplen; if (tag==255) break; else if (tag==63) { /* CONTEXT */ curPos += ifread(buf,1,1,hdr); chan = buf[0] & 0x7f; while (buf[0] & 0x80) { curPos += ifread(buf,1,1,hdr); chan = (chan<<7) + (buf[0] & 0x7f); } } /* LENGTH */ curPos += ifread(&tmplen,1,1,hdr); char FlagInfiniteLength = 0; if ((tag==63) && (tmplen==0x80)) { FlagInfiniteLength = -1; //Infinite Length len = 0; } else if (tmplen & 0x80) { tmplen &= 0x7f; curPos += ifread(&buf,1,tmplen,hdr); len = 0; k = 0; while (k7) fprintf(stdout,"MFER: tag=%3i chan=%2i len=%i %3i curPos=%i %li\n",tag,chan,tmplen,len,curPos,iftell(hdr)); /* VALUE */ if (tag==0) { if (len!=1) fprintf(stderr,"Warning MFER tag0 incorrect length %i!=1\n",len); curPos += ifread(buf,1,len,hdr); } else if (tag==1) { // Endianity if (len!=1) fprintf(stderr,"Warning MFER tag1 incorrect length %i!=1\n",len); ifseek(hdr,len-1,SEEK_CUR); curPos += ifread(buf,1,1,hdr); hdr->FILE.LittleEndian = buf[0]; #if (__BYTE_ORDER == __BIG_ENDIAN) SWAP = hdr->FILE.LittleEndian; #elif (__BYTE_ORDER == __LITTLE_ENDIAN) SWAP = !hdr->FILE.LittleEndian; #endif } else if (tag==2) { // Version uint8_t v[3]; if (len!=3) fprintf(stderr,"Warning MFER tag2 incorrect length %i!=3\n",len); curPos += ifread(&v,1,3,hdr); hdr->VERSION = v[0] + (v[1]<10 ? v[1]/10.0 : (v[1]<100 ? v[1]/100.0 : v[1]/1000.0)); } else if (tag==3) { // character code char v[17]; if (len>16) fprintf(stderr,"Warning MFER tag2 incorrect length %i>16\n",len); curPos += ifread(&v,1,len,hdr); v[len] = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"MFER: character code <%s>\n",v); } else if (tag==4) { // SPR if (len>4) fprintf(stderr,"Warning MFER tag4 incorrect length %i>4\n",len); curPos += ifread(buf,1,len,hdr); hdr->SPR = *(int64_t*) mfer_swap8b(buf, len, SWAP); if (VERBOSE_LEVEL>7) fprintf(stdout,"MFER: TLV %i %i %i \n",tag,len,(int)hdr->SPR); } else if (tag==5) //0x05: number of channels { if (len>4) fprintf(stderr,"Warning MFER tag5 incorrect length %i>4\n",len); curPos += ifread(buf,1,len,hdr); hdr->NS = *(int64_t*) mfer_swap8b(buf, len, SWAP); if (VERBOSE_LEVEL>7) fprintf(stdout,"MFER: TLV %i %i %i \n",tag,len,(int)hdr->NS); hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS*sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->SPR = 0; hc->PhysDimCode = 0; hc->Cal = 1.0; hc->LeadIdCode = 0; hc->GDFTYP = 3; } } else if (tag==6) // 0x06 "number of sequences" { // NRec if (len>4) fprintf(stderr,"Warning MFER tag6 incorrect length %i>4\n",len); curPos += ifread(buf,1,len,hdr); hdr->NRec = *(int64_t*) mfer_swap8b(buf, len, SWAP); if (VERBOSE_LEVEL>7) fprintf(stdout,"MFER: TLV %i %i %i \n",tag,len,(int)hdr->NRec); } else if (tag==8) { if (len>2) fprintf(stderr,"Warning MFER tag8 incorrect length %i>2\n",len); curPos += ifread(buf,1,len,hdr); /* // NOT USED // Type of Waveform union { uint8_t TypeOfWaveForm8[2]; uint16_t TypeOfWaveForm; } t; if (len==1) t.TypeOfWaveForm = buf[0]; else { t.TypeOfWaveForm8[0] = buf[0]; t.TypeOfWaveForm8[1] = buf[1]; if (SWAP) t.TypeOfWaveForm = bswap_16(t.TypeOfWaveForm); } */ } else if (tag==10) { // GDFTYP if (len!=1) fprintf(stderr,"warning MFER tag10 incorrect length %i!=1\n",len); curPos += ifread(&gdftyp,1,1,hdr); if (gdftyp==0) gdftyp=3; // int16 else if (gdftyp==1) gdftyp=4; // uint16 else if (gdftyp==2) gdftyp=5; // int32 else if (gdftyp==3) gdftyp=2; // uint8 else if (gdftyp==4) gdftyp=4; // bit16 else if (gdftyp==5) gdftyp=1; // int8 else if (gdftyp==6) gdftyp=6; // uint32 else if (gdftyp==7) gdftyp=16; // float32 else if (gdftyp==8) gdftyp=17; // float64 else if (gdftyp==9) //gdftyp=2; // 8 bit AHA compression fprintf(stdout,"Warning: MFER compressed format not supported\n"); else gdftyp=3; } else if (tag==11) //0x0B { // Fs if (len>6) fprintf(stderr,"Warning MFER tag11 incorrect length %i>6\n",len); double fval; curPos += ifread(buf,1,len,hdr); fval = *(int64_t*) mfer_swap8b(buf+2, len-2, SWAP); hdr->SampleRate = fval*pow(10.0, (int8_t)buf[1]); if (buf[0]==1) // s hdr->SampleRate = 1.0/hdr->SampleRate; if (VERBOSE_LEVEL>7) fprintf(stdout,"MFER: TLV %i %i %i %i %g \n",tag,len,buf[0], buf[1], hdr->SampleRate); } else if (tag==12) //0x0C { // sampling resolution if (len>6) fprintf(stderr,"Warning MFER tag12 incorrect length %i>6\n",len); val32 = 0; int8_t v8; curPos += ifread(&UnitCode,1,1,hdr); curPos += ifread(&v8,1,1,hdr); curPos += ifread(buf,1,len-2,hdr); Cal = *(int64_t*) mfer_swap8b(buf, len-2, SWAP); Cal *= pow(10.0,v8); if (!MFER_PhysDimCodeTable[UnitCode]) fprintf(stderr,"Warning MFER: unsupported physical unit (code=%i)\n", UnitCode); } else if (tag==13) { if (len>8) fprintf(stderr,"Warning MFER tag13 incorrect length %i>8\n",len); curPos += ifread(&buf,1,len,hdr); if (gdftyp == 1) Off = ( int8_t)buf[0]; else if (gdftyp == 2) Off = (uint8_t)buf[0]; else if (SWAP) { if (gdftyp == 3) Off = ( int16_t)bswap_16(*( int16_t*)ptrbuf); else if (gdftyp == 4) Off = (uint16_t)bswap_16(*(uint16_t*)ptrbuf); else if (gdftyp == 5) Off = ( int32_t)bswap_32(*( int32_t*)ptrbuf); else if (gdftyp == 6) Off = (uint32_t)bswap_32(*(uint32_t*)ptrbuf); else if (gdftyp == 7) Off = ( int64_t)bswap_64(*( int64_t*)ptrbuf); else if (gdftyp == 8) Off = (uint64_t)bswap_64(*(uint64_t*)ptrbuf); else if (gdftyp ==16) { *(uint32_t*)ptrbuf = bswap_32(*(uint32_t*)ptrbuf); Off = *(float*)ptrbuf; } else if (gdftyp ==17) { *(uint64_t*)ptrbuf = bswap_64(*(uint64_t*)ptrbuf); Off = *(double*)ptrbuf; } } else { if (gdftyp == 3) Off = *( int16_t*)ptrbuf; else if (gdftyp == 4) Off = *(uint16_t*)ptrbuf; else if (gdftyp == 5) Off = *( int32_t*)ptrbuf; else if (gdftyp == 6) Off = *(uint32_t*)ptrbuf; else if (gdftyp == 7) Off = *( int64_t*)ptrbuf; else if (gdftyp == 8) Off = *(uint64_t*)ptrbuf; else if (gdftyp ==16) Off = *(float*)ptrbuf; else if (gdftyp ==17) Off = *(double*)ptrbuf; } } else if (tag==22) { // MWF_NTE (16h): Comment char buf[257]; ifread(buf,1,min(256,len),hdr); buf[min(256,len)]=0; if (VERBOSE_LEVEL > 7) fprintf(stdout,"MFER comment (tag=22): %s\n",buf); size_t POS=0, CHN=0; const char *Desc = NULL; char *ptrP1 = strstr(buf,""); if (ptrP2) { *ptrP2=0; ptrP2++; POS = atol(ptrP1); Desc = ptrP2; } } char *ptrP3 = strstr(buf,""); if (ptrP2) { *ptrP2=0; ptrP2++; CHN = strtol(ptrP3, &ptrP3, 10); } } if (POS>0 && Desc) { size_t N = hdr->EVENT.N; if (N_EVENT <= N) { N_EVENT = reallocEventTable(hdr, N_EVENT); if (N_EVENT == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } hdr->EVENT.POS[N] = POS; hdr->EVENT.CHN[N] = CHN; FreeTextEvent(hdr, N, Desc); // sets hdr->EVENT.TYP[n] hdr->EVENT.N = N+1; } curPos += len; } else if (tag==23) { // manufacturer information: "Manufacturer^model^version number^serial number" ifread(hdr->ID.Manufacturer._field,1,min(MAX_LENGTH_MANUF,len),hdr); if (len>MAX_LENGTH_MANUF) { fprintf(stderr,"Warning MFER tag23 incorrect length %i>128\n",len); ifseek(hdr,len-MAX_LENGTH_MANUF,SEEK_CUR); } curPos += len; for (k=0; isprint(hdr->ID.Manufacturer._field[k]) && (kID.Manufacturer._field[k] = 0; hdr->ID.Manufacturer.Name = strtok(hdr->ID.Manufacturer._field,"^"); hdr->ID.Manufacturer.Model = strtok(NULL,"^"); hdr->ID.Manufacturer.Version = strtok(NULL,"^"); hdr->ID.Manufacturer.SerialNumber = strtok(NULL,"^"); if (hdr->ID.Manufacturer.Name == NULL) hdr->ID.Manufacturer.Name="\0"; if (hdr->ID.Manufacturer.Model == NULL) hdr->ID.Manufacturer.Model="\0"; if (hdr->ID.Manufacturer.Version == NULL) hdr->ID.Manufacturer.Version="\0"; if (hdr->ID.Manufacturer.SerialNumber == NULL) hdr->ID.Manufacturer.SerialNumber="\0"; } else if (tag==30) //0x1e: waveform data { // data block hdr->AS.rawdata = (uint8_t*)realloc(hdr->AS.rawdata,len); hdr->HeadLen = curPos; curPos += ifread(hdr->AS.rawdata,1,len,hdr); hdr->AS.first = 0; hdr->AS.length= hdr->NRec; } else if (tag==63) { uint8_t tag2=255, len2=255; count = 0; while ((count4) fprintf(stderr,"Warning MFER tag63-4 incorrect length %i>4\n",len2); int64_t SPR = *(int64_t*) mfer_swap8b(buf, len2, SWAP); hdr->SPR = (chan==0) ? SPR : lcm(SPR, hdr->SPR); hdr->CHANNEL[chan].SPR = SPR; if (VERBOSE_LEVEL>7) fprintf(stdout,"MFER: TLV %i %i %i %i %i %i %i %i %i\n",tag,len, chan, tag2,len2, buf[0], buf[1], (int)hdr->SPR, (int)hdr->CHANNEL[chan].SPR); } else if (tag2==9) { //leadname if (len2==2) hdr->CHANNEL[chan].LeadIdCode = 0; else if (len2==1) hdr->CHANNEL[chan].LeadIdCode = buf[0]; else if (len2<=32) strncpy(hdr->CHANNEL[chan].Label,(char*)buf,len2); else fprintf(stderr,"Warning MFER tag63-9 incorrect length %i>32\n",len2); } else if (tag2==10) { // GDFTYP if (len2!=1) fprintf(stderr,"warning MFER tag63-10 incorrect length %i!=1\n",len2); if (buf[0]==0) gdftyp=3; // int16 else if (buf[0]==1) gdftyp=4; // uint16 else if (buf[0]==2) gdftyp=5; // int32 else if (buf[0]==3) gdftyp=2; // uint8 else if (buf[0]==4) gdftyp=4; // bit16 else if (buf[0]==5) gdftyp=1; // int8 else if (buf[0]==6) gdftyp=6; // uint32 else if (buf[0]==7) gdftyp=16; // float32 else if (buf[0]==8) gdftyp=17; // float64 else if (buf[0]==9) //gdftyp=2; // 8 bit AHA compression fprintf(stdout,"Warning: MFER compressed format not supported\n"); else gdftyp=3; hdr->CHANNEL[chan].GDFTYP = gdftyp; if (VERBOSE_LEVEL>7) fprintf(stdout,"MFER: TLV %i %i %i %i %i %i %i\n",tag, len, chan, tag2, len2, buf[0], gdftyp); } else if (tag2==11) { // sampling resolution if (len2>6) fprintf(stderr,"Warning MFER tag63-11 incorrect length %i>6\n",len2); double fval; fval = *(int64_t*) mfer_swap8b(buf+2, len2-2, SWAP); fval *= pow(10.0, (int8_t)(buf[1])); if (buf[0]==1) // s fval = 1.0/fval; hdr->CHANNEL[chan].SPR = lround(hdr->SPR * fval / hdr->SampleRate); if (VERBOSE_LEVEL>7) fprintf(stdout,"MFER: TLV %i %i %i %i %i %i %i %g %i %g\n",tag,len, chan, tag2,len2, buf[0], buf[1], fval, (int)hdr->SPR, hdr->SampleRate); } else if (tag2==12) { // sensitivity // FIXME fprintf(stdout,"MFER: change f channel specific scaling/sensitivity is not supported"); } else if (tag2==13) { // Offset gdftyp = hdr->CHANNEL[chan].GDFTYP; if (gdftyp == 1) Off = ( int8_t)buf[0]; else if (gdftyp == 2) Off = (uint8_t)buf[0]; else if (SWAP) { if (gdftyp == 3) Off = ( int16_t)bswap_16(*( int16_t*)buf); else if (gdftyp == 4) Off = (uint16_t)bswap_16(*(uint16_t*)buf); else if (gdftyp == 5) Off = ( int32_t)bswap_32(*( int32_t*)buf); else if (gdftyp == 6) Off = (uint32_t)bswap_32(*(uint32_t*)buf); else if (gdftyp == 7) Off = ( int64_t)bswap_64(*( int64_t*)buf); else if (gdftyp == 8) Off = (uint64_t)bswap_64(*(uint64_t*)buf); else if (gdftyp ==16) { *(uint32_t*)ptrbuf = bswap_32(*(uint32_t*)buf); Off = *(float*)ptrbuf; } else if (gdftyp ==17) { uint64_t u64 = bswap_64(*(uint64_t*)ptrbuf); Off = *(double*)&u64; } } else { if (gdftyp == 3) Off = *( int16_t*)buf; else if (gdftyp == 4) Off = *(uint16_t*)buf; else if (gdftyp == 5) Off = *( int32_t*)buf; else if (gdftyp == 6) Off = *(uint32_t*)buf; else if (gdftyp == 7) Off = *( int64_t*)buf; else if (gdftyp == 8) Off = *(uint64_t*)buf; else if (gdftyp ==16) Off = *(float*)buf; else if (gdftyp ==17) Off = *(double*)buf; } hdr->CHANNEL[chan].Off = Off; /* TODO convert to Phys/Dig/Min/Max */ } else if (tag2==18) { // null value // FIXME: needed for overflow detection if (len2>6) fprintf(stderr,"Warning MFER tag63-12 incorrect length %i>6\n", len2); if (!MFER_PhysDimCodeTable[UnitCode]) fprintf(stderr,"Warning MFER: unsupported physical unit (code=%i)\n", UnitCode); hdr->CHANNEL[chan].PhysDimCode = MFER_PhysDimCodeTable[UnitCode]; double cal = *(int64_t*) mfer_swap8b(buf+2, len2-2, SWAP); hdr->CHANNEL[chan].Cal = cal * pow(10.0,(int8_t)buf[1]); } else { if (VERBOSE_LEVEL==9) fprintf(stdout,"tag=63-%i (len=%i) not supported\n",tag2,len2); } } } else if (tag==64) //0x40 { // preamble char tmp[256]; curPos += ifread(tmp,1,len,hdr); if (VERBOSE_LEVEL>7) { fprintf(stdout,"Preamble: pos=%i|",curPos); for (k=0; k2) { size_t N = hdr->EVENT.N; #ifdef CURRENTLY_NOT_AVAILABLE // FIXME: biosig_set_number_of_events is currently part of biosig2 interface if (N_EVENT <= N) { N_EVENT = biosig_set_number_of_events(hdr, max(16, N*2)); } if (VERBOSE_LEVEL > 7) fprintf(stdout,"MFER-event: N=%i\n",hdr->EVENT.N); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[N] = 0; #endif hdr->EVENT.CHN[N] = 0; hdr->EVENT.DUR[N] = 0; if (SWAP) { hdr->EVENT.TYP[N] = bswap_16(*(uint16_t*)ptrbuf); hdr->EVENT.POS[N] = bswap_32(*(uint32_t*)(buf+2)); // 0-based indexing if (len>6) hdr->EVENT.DUR[N] = bswap_32(*(uint32_t*)(buf+6)); } else { hdr->EVENT.TYP[N] = *(uint16_t*)ptrbuf; hdr->EVENT.POS[N] = *(uint32_t*)(buf+2); // 0-based indexing if (len>6) hdr->EVENT.DUR[N] = *(uint32_t*)(buf+6); } hdr->EVENT.N = N+1; #endif //CURRENTLY_NOT_AVAILABLE } } else if (tag==66) //0x42: NIPB, SpO2(value) { } else if (tag==67) //0x43: Sample skew { int skew=0; curPos += ifread(&skew, 1, len,hdr); if (VERBOSE_LEVEL>2) fprintf(stdout,"MFER: sample skew %i ns\n",skew); } else if (tag==70) //0x46: digital signature { if (VERBOSE_LEVEL>2) fprintf(stdout,"MFER: digital signature \n"); } else if (tag==103) //0x67 Group definition { if (VERBOSE_LEVEL>2) fprintf(stdout,"MFER: Group definition\n"); } else if (tag==129) //0x81 { if (!hdr->FLAG.ANONYMOUS) curPos += ifread(hdr->Patient.Name,1,len,hdr); else { ifseek(hdr,len,SEEK_CUR); curPos += len; } } else if (tag==130) //0x82 { // Patient Id if (len>64) fprintf(stderr,"Warning MFER tag131 incorrect length %i>64\n",len); if (len>MAX_LENGTH_PID) { ifread(hdr->Patient.Id,1,MAX_LENGTH_PID,hdr); ifseek(hdr,MAX_LENGTH_PID-len,SEEK_CUR); curPos += len; } else curPos += ifread(hdr->Patient.Id,1,len,hdr); } else if (tag==131) //0x83 { // Patient Age if (len!=7) fprintf(stderr,"Warning MFER tag131 incorrect length %i!=7\n",len); curPos += ifread(buf,1,len,hdr); uint16_t t16; memcpy(&t16, buf+3, 2); if (SWAP) t16 = bswap_16(t16); tm_time.tm_year = t16 - 1900; tm_time.tm_mon = buf[5]-1; tm_time.tm_mday = buf[6]; tm_time.tm_hour = 12; tm_time.tm_min = 0; tm_time.tm_sec = 0; hdr->Patient.Birthday = tm_time2gdf_time(&tm_time); //hdr->Patient.Age = buf[0] + cswap_u16(*(uint16_t*)(buf+1))/365.25; } else if (tag==132) //0x84 { // Patient Sex if (len!=1) fprintf(stderr,"Warning MFER tag132 incorrect length %i!=1\n",len); curPos += ifread(&hdr->Patient.Sex,1,len,hdr); } else if (tag==133) //0x85 { curPos += ifread(buf,1,len,hdr); uint16_t t16, u16; memcpy(&t16, buf+3, 2); if (SWAP) t16 = bswap_16(t16); tm_time.tm_year = t16 - 1900; tm_time.tm_mon = buf[2] - 1; tm_time.tm_mday = buf[3]; tm_time.tm_hour = buf[4]; tm_time.tm_min = buf[5]; tm_time.tm_sec = buf[6]; hdr->T0 = tm_time2gdf_time(&tm_time); // add milli- and micro-seconds memcpy(&t16, buf+7, 2); memcpy(&u16, buf+9, 2); if (SWAP) hdr->T0 += (uint64_t) ( bswap_16(t16) * 1e+3 + bswap_16(u16) * ldexp(1.0,32) / (24*3600e6) ); else hdr->T0 += (uint64_t) ( t16 * 1e+3 + u16 * ldexp(1.0,32) / (24*3600e6) ); } else if (tag==135) //0x67 Object identifier { if (VERBOSE_LEVEL>2) fprintf(stdout,"MFER: object identifier\n"); } else { curPos += len; ifseek(hdr,len,SEEK_CUR); if (VERBOSE_LEVEL>7) fprintf(stdout,"tag=%i (len=%i) not supported\n",tag,len); } if (curPos != iftell(hdr)) fprintf(stdout,"positions differ %i %li \n",curPos,iftell(hdr)); /* TAG */ int sz=ifread(&tag,1,1,hdr); curPos += sz; } hdr->FLAG.OVERFLOWDETECTION = 0; // overflow detection OFF - not supported hdr->AS.bpb = 0; for (k=0; kNS; k++) { if (VERBOSE_LEVEL>8) fprintf(stdout,"sopen(MFER): #%i\n",(int)k); CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (!hc->PhysDimCode) hc->PhysDimCode = MFER_PhysDimCodeTable[UnitCode]; if (hc->Cal==1.0) hc->Cal = Cal; hc->Off = Off * hc->Cal; if (!hc->SPR) hc->SPR = hdr->SPR; if (hc->GDFTYP<16) if (hc->GDFTYP & 0x01) { hc->DigMax = ldexp( 1.0,GDFTYP_BITS[gdftyp]-1) - 1.0; hc->DigMin = ldexp(-1.0,GDFTYP_BITS[gdftyp]-1); } else { hc->DigMax = ldexp( 1.0,GDFTYP_BITS[gdftyp]); hc->DigMin = 0.0; } else { hc->DigMax = INFINITY; hc->DigMin = -INFINITY; } hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; hc->OnOff = 1; hc->bi = hdr->AS.bpb; hdr->AS.bpb += hdr->SPR*(GDFTYP_BITS[gdftyp]>>3); } if (VERBOSE_LEVEL>7) fprintf(stdout,"[MFER] -V=%i NE=%i\n",VERBOSE_LEVEL,hdr->EVENT.N); } else if (hdr->TYPE==MIT) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %i \n",__FILE__,__LINE__,__func__,VERBOSE_LEVEL); size_t bufsiz = 1024; while (!ifeof(hdr)) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count+bufsiz); count += ifread(hdr->AS.Header+count, 1, bufsiz, hdr); } ifclose(hdr); /* MIT: decode header information */ if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %s \n",__FILE__,__LINE__,__func__, (char*)hdr->AS.Header); hdr->SampleRate = 250.0; hdr->NRec = 0; hdr->SPR = 1; size_t NumberOfSegments = 1; char *ptr = (char*)hdr->AS.Header; char *line; do line = strtok((char*)hdr->AS.Header,"\x0d\x0a"); while ((line != NULL) && (line[0]=='#')); ptr = strpbrk(line,"\x09\x0a\x0d\x20"); // skip 1st field ptr[0] = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %s \n",__FILE__,__LINE__,__func__, ptr); if (strchr(line,'/') != NULL) { NumberOfSegments = atol(strchr(line,'/')+1); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "MIT/HEA/PhysioBank: multi-segment records are not supported"); } hdr->NS = (typeof(hdr->NS))strtod(ptr+1,&ptr); // number of channels if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): NS=%i %p\n",__FILE__,__LINE__,__func__, hdr->NS, ptr); if ((ptr != NULL) && strlen(ptr)) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...) MIT : 123: <%s>\n",__FILE__,__LINE__,__func__, ptr); hdr->SampleRate = strtod(ptr,&ptr); if (ptr[0]=='/') { double CounterFrequency = strtod(ptr+1,&ptr); if (fabs(CounterFrequency-hdr->SampleRate) > 1e-5) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "MIT format: Sampling rate and counter frequency differ - this is currently not supported!"); } } if (ptr[0]=='(') { double BaseCounterValue = strtod(ptr+1,&ptr); if (BaseCounterValue) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "MIT format: BaseCounterValue is not zero - this is currently not supported !"); } ptr++; // skip ")" } } if ((ptr != NULL) && strlen(ptr)) { hdr->NRec = (nrec_t)strtod(ptr,&ptr); } if ((ptr != NULL) && strlen(ptr)) { struct tm t; sscanf(ptr," %u:%u:%u %u/%u/%u",&t.tm_hour,&t.tm_min,&t.tm_sec,&t.tm_mday,&t.tm_mon,&t.tm_year); t.tm_mon--; t.tm_year -= 1900; t.tm_isdst = -1; hdr->T0 = tm_time2gdf_time(&t); } if (VERBOSE_LEVEL>8) hdr2ascii(hdr,stdout,2); // channel header not parsed yet int fmt=0,FMT=0; size_t MUL=1; char **DatFiles = (char**)calloc(hdr->NS, sizeof(char*)); size_t *ByteOffset = (size_t*)calloc(hdr->NS, sizeof(size_t)); size_t nDatFiles = 0; uint16_t gdftyp,NUM=1,DEN=1; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); hdr->AS.bpb8 = 0; hdr->AS.bpb = 0; for (k=0; k < hdr->NS; k++) { double skew=0; //double byteoffset=0; double ADCgain=200; double baseline=0; double ADCresolution=12; double ADCzero=0; double InitialValue=0; double BlockSize=0; CHANNEL_TYPE* hc = hdr->CHANNEL+k; do line = strtok(NULL,"\x0d\x0a"); while (line[0]=='#'); // read next line if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %i/%i <%s>\n",__FILE__,__LINE__,__func__, (int)k, hdr->NS, line); for (ptr=line; !isspace(ptr[0]); ptr++) {}; // skip 1st field ptr[0]=0; if (k==0) DatFiles[nDatFiles++]=line; else if (strcmp(DatFiles[nDatFiles-1],line)) DatFiles[nDatFiles++]=line; fmt = (typeof(fmt))strtod(ptr+1,&ptr); if (k==0) FMT = fmt; else if (FMT != fmt) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "MIT/HEA/PhysioBank: different formats within a single data set is not supported"); } size_t DIV=1; if (ptr[0]=='x') { DIV = (size_t)strtod(ptr+1, &ptr); hdr->CHANNEL[k].SPR *= DIV; MUL = lcm(MUL, DIV); } hdr->CHANNEL[k].SPR = DIV; if (ptr[0]==':') skew = strtod(ptr+1,&ptr); if (ptr[0]=='+') ByteOffset[k] = (size_t)strtod(ptr+1,&ptr); if (ptr != NULL) ADCgain = strtod(ptr+1,&ptr); if (ADCgain==0) ADCgain=200; // DEFGAIN: https://www.physionet.org/physiotools/wag/header-5.htm if (ptr[0] == '(') { baseline = strtod(ptr+1,&ptr); ptr++; } hc->PhysDimCode = 4274; // mV if (ptr[0] == '/') { char *PhysUnits = ++ptr; while (!isspace(ptr[0])) ++ptr; ptr[0] = 0; hc->PhysDimCode = PhysDimCode(PhysUnits); } if (ptr != NULL) ADCresolution = strtod(ptr+1,&ptr); if (ptr != NULL) ADCzero = strtod(ptr+1,&ptr); if (ptr != NULL) InitialValue = strtod(ptr+1,&ptr); else InitialValue = ADCzero; double checksum; if (ptr != NULL) checksum = strtod(ptr+1,&ptr); if (ptr != NULL) BlockSize = strtod(ptr+1,&ptr); while (isspace(ptr[0])) ++ptr; strncpy(hdr->CHANNEL[k].Label,ptr,MAX_LENGTH_LABEL); hc->Cal = 1/ADCgain; hc->Off = -ADCzero*hc->Cal; hc->OnOff = 1; hc->Transducer[0] = '\0'; hc->LowPass = -1; hc->HighPass = -1; // hdr->FLAG.SWAP = (__BYTE_ORDER == __BIG_ENDIAN); hdr->FILE.LittleEndian = 1; switch (fmt) { case 8: gdftyp = 1; hc->DigMax = 127.0; hc->DigMin = -128.0; biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "MIT/HEA/PhysioBank format 8(diff) not supported"); break; case 80: gdftyp = 2; // uint8; hc->Off= -128*hc->Cal; hc->DigMax = 255.0; hc->DigMin = 0.0; break; case 16: gdftyp = 3; NUM = 2; DEN = 1; hc->DigMax = ldexp( 1.0,15)-1.0; hc->DigMin = ldexp(-1.0,15); break; case 24: gdftyp = 255+24; NUM = 3; DEN = 1; hc->DigMax = ldexp( 1.0,23)-1.0; hc->DigMin = ldexp(-1.0,23); break; case 32: gdftyp = 5; NUM = 4; DEN = 1; hc->DigMax = ldexp( 1.0,31)-1.0; hc->DigMin = ldexp(-1.0,31); break; case 61: gdftyp = 3; // hdr->FLAG.SWAP = !(__BYTE_ORDER == __BIG_ENDIAN); hdr->FILE.LittleEndian = 0; NUM = 2; DEN = 1; hc->DigMax = ldexp( 1.0,15)-1.0; hc->DigMin = ldexp(-1.0,15); break; case 160: gdftyp = 4; // uint16; hc->Off= ldexp(-1.0,15)*hc->Cal; NUM = 2; DEN = 1; hc->DigMax = ldexp(1.0,16)-1.0; hc->DigMin = 0.0; break; case 212: gdftyp = 255+12; NUM = 3; DEN = 2; hc->DigMax = ldexp( 1.0,11)-1.0; hc->DigMin = ldexp(-1.0,11); break; case 310: case 311: gdftyp = 255+10; NUM = 4; DEN = 3; hc->DigMax = ldexp( 1.0,9)-1.0; hc->DigMin = ldexp(-1.0,9); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "MIT/HEA/PhysioBank format 310/311 not supported"); break; default: gdftyp = 0xffff; biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "MIT/HEA/PhysioBank: unknown format"); } hc->GDFTYP = gdftyp; hc->LeadIdCode = 0; hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; hc->bi8 = hdr->AS.bpb8; hdr->AS.bpb8 += (hdr->SPR*NUM<<3)/DEN; hc->bi = hdr->AS.bpb; hdr->AS.bpb += hdr->AS.bpb8>>3; } hdr->SampleRate *= MUL; hdr->SPR *= MUL; if (VERBOSE_LEVEL>7) hdr2ascii(hdr,stdout,4); /* read age, sex etc. */ line = strtok(NULL,"\x0d\x0a"); if (line != NULL) { char *t1; double age=0.0; for (k=0; k:"); if (t1 != NULL) age = strtod(t1+5,&ptr); if (age>0.0) hdr->Patient.Birthday = hdr->T0 - (uint64_t)ldexp(age*365.25,32); t1 = strstr(line,"SEX:"); if (t1 != NULL) t1 += 4; else { t1 = strstr(line,"SEX>:"); if (t1 != NULL) t1 += 5; } if (t1 != NULL) { while (isspace(t1[0])) t1++; hdr->Patient.Sex = (t1[0]=='M') + 2* (t1[0]=='F'); } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %i (%i) %s FMT=%i + %i\n",__FILE__,__LINE__,__func__, (int)k+1,(int)nDatFiles,DatFiles[0],fmt,(int)ByteOffset[0]); /* MIT: read ATR annotation file */ char *f0 = hdr->FileName; char *f1 = (char*) malloc(strlen(hdr->FileName)+5); strcpy(f1,hdr->FileName); // Flawfinder: ignore strcpy(strrchr(f1,'.')+1,"atr"); // Flawfinder: ignore hdr->FileName = f1; hdr = ifopen(hdr,"r"); if (!hdr->FILE.OPEN) { // if no *.atr file, try *.qrs strcpy(strrchr(f1,'.')+1,"qrs"); // Flawfinder: ignore hdr = ifopen(hdr,"r"); } if (!hdr->FILE.OPEN) { // *.ecg strcpy(strrchr(f1,'.')+1,"ecg"); // Flawfinder: ignore hdr = ifopen(hdr,"r"); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): <%s> %i %i\n",__FILE__,__LINE__,__func__, hdr->FileName,hdr->FILE.OPEN,(int)bufsiz); if (hdr->FILE.OPEN) { uint16_t *Marker=NULL; count = 0; while (!ifeof(hdr)) { if (bufsiz<1024) bufsiz = 1024; bufsiz *= 2; void *tmp = realloc(Marker, 2 * bufsiz ); Marker = (uint16_t*) tmp; count += ifread (Marker+count, 2, bufsiz-count, hdr); } ifclose(hdr); Marker[count]=0; /* define user specified events according to http://www.physionet.org/physiotools/wfdb/lib/ecgcodes.h */ hdr->EVENT.CodeDesc = (typeof(hdr->EVENT.CodeDesc)) realloc(hdr->EVENT.CodeDesc,257*sizeof(*hdr->EVENT.CodeDesc)); hdr->EVENT.CodeDesc[0] = ""; for (k=0; strlen(MIT_EVENT_DESC[k])>0; k++) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...) [MIT 182]: %i\n",__FILE__,__LINE__,__func__, (int)k); hdr->EVENT.CodeDesc[k+1] = (char*)MIT_EVENT_DESC[k]; // hack to satisfy MinGW (gcc version 4.2.1-sjlj) if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...) [MIT 182]: %i %s %s\n",__FILE__,__LINE__,__func__, (int)k,MIT_EVENT_DESC[k],hdr->EVENT.CodeDesc[k]); } hdr->EVENT.LenCodeDesc = k+1; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...)[MIT 183] %s %i\n",__FILE__,__LINE__,__func__, f1,(int)count); /* decode ATR annotation information */ size_t N = count; hdr->EVENT.TYP = (typeof(hdr->EVENT.TYP)) realloc(hdr->EVENT.TYP,N*sizeof(*hdr->EVENT.TYP)); hdr->EVENT.POS = (typeof(hdr->EVENT.POS)) realloc(hdr->EVENT.POS,N*sizeof(*hdr->EVENT.POS)); hdr->EVENT.CHN = (typeof(hdr->EVENT.CHN)) realloc(hdr->EVENT.CHN,N*sizeof(*hdr->EVENT.CHN)); hdr->EVENT.N = 0; hdr->EVENT.SampleRate = hdr->SampleRate; uint16_t chn = 0; size_t pos = 0; char flag_chn = 0; for (k=0; (k> 10; uint16_t len = a16 & 0x03ff; if (VERBOSE_LEVEL>8) fprintf(stdout,"%s (line %i) %s(...)[MIT 183] k=%i/%i N=%i A=%i l=%i\n", __FILE__,__LINE__,__func__, (int)k, (int)N, (int)hdr->EVENT.N, a16>>10, len); switch (A) { case 59: // SKIP pos += (((uint32_t)leu16p(Marker+k+1))<<16) + leu16p(Marker+k+2); k += 2; break; case 60: // NUM case 61: // SUB break; case 62: // CHN chn = len; flag_chn = flag_chn || chn; break; case 63: // AUX k += (len+1)/2; break; default: pos += len; // code = 0 is mapped to 49(ACMAX), see MIT_EVENT_DESC and http://www.physionet.org/physiotools/wfdb/lib/ecgcodes.h hdr->EVENT.TYP[hdr->EVENT.N] = (A==0 ? 49 : A); hdr->EVENT.POS[hdr->EVENT.N] = pos-1; // convert to 0-based indexing hdr->EVENT.CHN[hdr->EVENT.N] = chn; ++hdr->EVENT.N; } } if (flag_chn) hdr->EVENT.DUR = (typeof(hdr->EVENT.DUR)) realloc(hdr->EVENT.DUR,N*sizeof(*hdr->EVENT.DUR)); else { free(hdr->EVENT.CHN); hdr->EVENT.CHN = NULL; } free(Marker); } free(f1); hdr->FileName = f0; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...)[MIT 185] \n",__FILE__,__LINE__,__func__); /* MIT: open data file */ if (nDatFiles == 1) { //uint8_t *Marker=NULL; count = 0; char *f0 = hdr->FileName; char *f1 = (char*) malloc(strlen(hdr->FileName)+strlen(DatFiles[0])+2); strcpy(f1,hdr->FileName); hdr->FileName = f1; char *ptr = strrchr(f1,FILESEP); if (ptr != NULL) strcpy(ptr+1,DatFiles[0]); else strcpy(f1,DatFiles[0]); hdr->HeadLen = ByteOffset[0]; hdr = ifopen(hdr,"rb"); ifseek(hdr, hdr->HeadLen, SEEK_SET); count = 0; bufsiz = 1024; while (!ifeof(hdr)) { bufsiz *= 2; void *tmpptr = realloc(hdr->AS.rawdata, bufsiz + 1 ); hdr->AS.rawdata = (uint8_t*) tmpptr; count += ifread (hdr->AS.rawdata+count, 1, bufsiz-count, hdr); } ifclose(hdr); free(f1); hdr->FileName = f0; if (!hdr->NRec) { hdr->NRec = count/(hdr->AS.bpb); } } if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %s(...)[MIT 198] #%i: (%i) %s FMT=%i\n",__FILE__,__LINE__,__func__,(int)k+1,(int)nDatFiles,DatFiles[0],fmt); free(DatFiles); free(ByteOffset); if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %s(...)[MIT 199] #%i: (%i) %s FMT=%i\n",__FILE__,__LINE__,__func__,(int)k+1,(int)nDatFiles,DatFiles[0],fmt); if (nDatFiles != 1) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "MIT/HEA/PhysioBank: multiply data files within a single data set is not supported"); return(hdr); } hdr->AS.length = hdr->NRec; } /* END OF MIT FORMAT */ #ifdef CHOLMOD_H else if ((hdr->TYPE==MM) && (!hdr->FILE.COMPRESSION)) { if (VERBOSE_LEVEL>7) fprintf(stdout,"[MM 001] %i,%i\n",hdr->HeadLen,hdr->FILE.COMPRESSION); while (!ifeof(hdr)) { count = max(5000, hdr->HeadLen*2); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, count); hdr->HeadLen += ifread(hdr->AS.Header + hdr->HeadLen, 1, count - hdr->HeadLen - 1, hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout,"[MM 003] %i,%i\n",hdr->HeadLen,hdr->FILE.COMPRESSION); char *line = strtok((char*)hdr->AS.Header, "\x0a\x0d"); char status = 0; unsigned long ns = 0; while (line != NULL) { if (VERBOSE_LEVEL>7) fprintf(stdout,"[MM 013] <%s>\n",line); if ((line[0]=='%') && (line[1]=='%') && isspace(line[2])) { if (!strncmp(line+3,"LABELS",6)) status = 1; else if (!strncmp(line+3,"ENDLABEL",8)) { status = 0; break; } if (status) { int k = 3; while (isspace(line[k])) k++; unsigned long ch = strtoul(line+k, &line, 10); while (isspace(line[0])) line++; if (ch >= ns) { hdr->rerefCHANNEL = (CHANNEL_TYPE*)realloc(hdr->rerefCHANNEL, ch*sizeof(CHANNEL_TYPE)); while (ns < ch) { hdr->rerefCHANNEL[ns].Label[0] = 0; ns++; } } strncpy(hdr->rerefCHANNEL[ch-1].Label, line, MAX_LENGTH_LABEL); hdr->rerefCHANNEL[ch-1].OnOff = 1; hdr->rerefCHANNEL[ch-1].Label[MAX_LENGTH_LABEL] = 0; hdr->rerefCHANNEL[ch-1].LeadIdCode = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"[MM 027] %i <%s>\n",(int)ch,line); } } line = strtok(NULL,"\x0a\x0d"); } if (VERBOSE_LEVEL>7) fprintf(stdout,"[MM 033]\n"); ifseek(hdr,0,SEEK_SET); CSstart(); // init cholmod library CHOLMOD_COMMON_VAR.print = 5; hdr->Calib = cholmod_read_sparse (hdr->FILE.FID, &CHOLMOD_COMMON_VAR); /* read in a matrix */ if (VERBOSE_LEVEL>7) cholmod_print_sparse (hdr->Calib, "Calib", &CHOLMOD_COMMON_VAR); /* print the matrix */ ifclose(hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"[MM 999]\n"); return(hdr); } /* END OF MatrixMarket */ #endif else if (hdr->TYPE==NEURON) { hdr->HeadLen = count; if (VERBOSE_LEVEL>7) fprintf(stdout,"NEURON: start\n"); size_t count; while (!ifeof(hdr)) { count = max(1<<20, hdr->HeadLen*2); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, count); hdr->HeadLen += ifread(hdr->AS.Header + hdr->HeadLen, 1, count - hdr->HeadLen - 1, hdr); } hdr->AS.Header[hdr->HeadLen] = 0; hdr->NS = 1; hdr->SPR = 1; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); hdr->CHANNEL[0].GDFTYP = 17; hdr->CHANNEL[0].Cal = 1.0; hdr->CHANNEL[0].Off = 0.0; hdr->CHANNEL[0].PhysMin = -1e9; hdr->CHANNEL[0].PhysMax = +1e9; hdr->CHANNEL[0].DigMin = -1e9; hdr->CHANNEL[0].DigMax = +1e9; hdr->AS.bpb = sizeof(double); hdr->CHANNEL[0].bi = 0; hdr->CHANNEL[0].bi8 = 0; hdr->CHANNEL[0].LeadIdCode = 0; hdr->CHANNEL[0].SPR = hdr->SPR; hdr->CHANNEL[0].LowPass = NAN; hdr->CHANNEL[0].HighPass = NAN; hdr->CHANNEL[0].Notch = NAN; if (VERBOSE_LEVEL>7) fprintf(stdout,"NEURON 202: \n"); char *t = strtok( (char*)hdr->AS.Header, "\x0A\x0D"); char status = 0; size_t spr = 0; while (t != NULL) { if (VERBOSE_LEVEL>8) fprintf(stdout,"NEURON 301: <%s>\n", t); if (status==0) { if (!strncmp(t,"Header:", 7)) status = 1; } else if (status==1) { if (VERBOSE_LEVEL>7) fprintf(stdout,"NEURON 311: <%s>\n",t); char *val = t+strlen(t); while (isspace(*(--val))) {}; val[1]=0; // remove trailing blanks val = strchr(t,':'); // find right value val[0] = 0; while (isspace(*(++val))) {}; if (!strncmp(t,"Data", 7)) { status=2; spr = 0; } else if (!strcmp(t,"SampleInt")) hdr->SampleRate = 1.0 / atof(val); else if (!strcmp(t,"Points")) { hdr->NRec = atoi(val); hdr->AS.rawdata = (uint8_t*)realloc(hdr->AS.rawdata, sizeof(double) * hdr->NRec); } else if (!strcmp(t,"XUnit")) { uint16_t xunits = PhysDimCode(val); double scale = PhysDimScale(xunits); if ((xunits & 0xffe0)==2176) hdr->SampleRate /= scale; else fprintf(stdout, "Error NEURON: invalid XUnits <%s>\n", val); } else if (!strcmp(t,"YUnit")) { if (VERBOSE_LEVEL>7) fprintf(stdout,"NEURON 321: Yunits:<%s>\n",val); hdr->CHANNEL[0].PhysDimCode = PhysDimCode(val); } else if (!strcmp(t,"Method")) { strncpy(hdr->CHANNEL[0].Label, val, MAX_LENGTH_LABEL); } } else if (status==2) { if (strpbrk(t,"0123456789")) { // ignore non-numeric (e.g. emtpy) lines *(double*)(hdr->AS.rawdata + spr*sizeof(double)) = atof(t); spr++; } if (hdr->NRec >= 0) if (spr >= (size_t)hdr->NRec) { void *ptr = realloc(hdr->AS.rawdata, 2 * min(spr, (size_t)hdr->NRec) * sizeof(double)); if (ptr==NULL) break; hdr->AS.rawdata = (uint8_t*)ptr; } } t = strtok(NULL, "\x0A\x0D"); } free(hdr->AS.Header); hdr->AS.Header = NULL; hdr->AS.first = 0; hdr->AS.length = spr; } else if (hdr->TYPE == NeuroLoggerHEX) { hdr->NS = 8; // uint16_t gdftyp = 2; biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "NeuroLogger HEX format not supported, yet"); return(hdr); } #if defined(WITH_NEV) else if (hdr->TYPE==NEV) { fprintf(stdout,"Support for NEV format is under construction - most likely its not useful yet.\n"); if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (NEV)\n"); hdr->VERSION = beu16p(hdr->AS.Header+8)>>8; switch (beu16p(hdr->AS.Header+8)) { case 0x0100: // readnev1 case 0x0101: // readnev1_1 case 0x0200: // readnev2 //biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, NULL); break; default: biosigERROR(hdr, B4C_FORMAT_UNKNOWN, NULL); } const int H1Len = 28+16+32+256+4; /* read Basic Header */ // uint16_t fileFormat = beu16p(hdr->AS.Header+10); uint32_t HeadLen = leu32p(hdr->AS.Header+12); if (HeadLen < H1Len) { biosigERROR(hdr, B4C_INCOMPLETE_FILE, NULL); return(hdr); } hdr->AS.bpb = leu32p(hdr->AS.Header+16); uint32_t TimeStepFrequency = leu32p(hdr->AS.Header+20); // samples = TimeStepFrequency / 10; // Freq in 0.1 seconds hdr->SampleRate = leu32p(hdr->AS.Header+24); if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (NEV) [210] %d %d \n", (int)count, (int)HeadLen); if (countAS.Header = (uint8_t*)realloc(hdr->AS.Header,HeadLen); count += ifread(hdr->AS.Header+count, 1, HeadLen-count, hdr); } uint32_t extHdrN = leu32p(hdr->AS.Header+H1Len-4); if (count < H1Len + 32*extHdrN) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,HeadLen); count += ifread(hdr->AS.Header+count, 1, HeadLen-count, hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (NEV) [220] %d %d %d \n", extHdrN, (int)count, (int)HeadLen); struct tm t; t.tm_year = leu32p(hdr->AS.Header+28); t.tm_mon = leu32p(hdr->AS.Header+30); //t.tm_wday = beu32p(hdr->AS.Header+32); t.tm_mday = leu32p(hdr->AS.Header+34); t.tm_hour = leu32p(hdr->AS.Header+36); t.tm_min = leu32p(hdr->AS.Header+38); t.tm_sec = leu32p(hdr->AS.Header+40); //milliseconds = beu32p(hdr->AS.Header+42); hdr->T0 = tm_time2gdf_time(&t); double time_interval = 1e3 * (hdr->AS.bpb-8) / TimeStepFrequency; if (VERBOSE_LEVEL>7) hdr2ascii(hdr,stdout,2); //******** read Extended Header ********* const char *nameOfElectrode, *extraComment, *continuedComment, *mapfile; const char *H2 = (char*)hdr->AS.Header + H1Len; hdr->NS = 0; for (k = 0; k < extHdrN; k++) { const char *identifier = H2 + k*32; if (VERBOSE_LEVEL>8) { char tmp[9];tmp[8]=0; char tmp24[25]; tmp24[24]=0; memcpy(tmp,identifier,8); memcpy(tmp24,identifier+8,24); fprintf(stdout,"SOPEN (NEV) [225] %d %d <%s> <%s>\n",(int)k,hdr->NS,tmp,tmp24); } if (!memcmp (identifier, "NEUEVWAV",8)) hdr->NS++; } if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (NEV) [230]\n"); hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); uint16_t NS = 0; for (k = 0; k < extHdrN; k++) { const char *identifier = H2 + k*32; if (!memcmp (identifier, "ARRAYNME",8)) { nameOfElectrode = identifier + 8; } else if (!memcmp (identifier, "ECOMMENT",8)) { extraComment = identifier + 8; } else if (!memcmp (identifier, "CCOMMENT",8)) { continuedComment = identifier + 8; } else if (!memcmp (identifier, "MAPFILE",8)) { mapfile = identifier + 8; } else if (!memcmp (identifier, "NEUEVWAV",8)) { //neuralEventWaveform = identifier + 8; CHANNEL_TYPE *hc = hdr->CHANNEL+(NS++); sprintf(hc->Label,"#%d",leu16p(identifier + 8)); // electrodeId // (uint8_t)(identifier + 8 + 2); // module // (uint8_t)(identifier + 8 + 3); // channel hc->OnOff = 1; hc->Cal = leu16p(identifier+ 8 + 4); // scaling factor // beu16p(identifier + 8 + 6); // energyTreshold hc->Off = 0; hc->DigMax = lei16p(identifier + 8 + 8); // high threshold hc->DigMin = lei16p(identifier + 8 + 10); // low threshold // (uint8_t)(identifier + 8 + 11); // sortedUnitsInChannel hc->GDFTYP = 2 * identifier[8 + 12]; // bytesPerWaveformSample hc->PhysMax = hc->DigMax*hc->Cal; hc->PhysMin = hc->DigMin*hc->Cal; hc->LeadIdCode = 0; hc->Transducer[0] = 0; hc->PhysDimCode = 0; hc->TOffset = 0; hc->LowPass = NAN; hc->HighPass = NAN; hc->Notch = NAN; hc->XYZ[0] = 0; hc->XYZ[1] = 0; hc->XYZ[2] = 0; hc->Impedance = NAN; hc->SPR = 0; hc->bi = hdr->AS.bpb; hc->bi8 = hdr->AS.bpb*8; hc->bufptr = NULL; } else if (!memcmp (identifier, "NSASEXEV",8)) { char *nsas = identifier + 8; } else { /* // IGNORE biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "NEV: unknown extended header"); */ } } return(hdr); } #endif else if (hdr->TYPE==NEX1) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i)\n",__func__,__LINE__); if (count < 284) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,284); count += ifread(hdr->AS.Header + count, 1, 284 - count, hdr); } uint8_t v = hdr->AS.Header[3]-'0'; const int H1LEN = (v==1) ? (4 + 4 + 256 + 8 + 4*4 + 256) : (4 + 4 + 256 + 8 + 8 + 4 + 8 + 64); const int H2LEN = (v==1) ? (4 + 4 + 64 + 6*4 + 4*8 + 12 + 16 + 52) : (4 + 4 + 64 + 2*8 + 2*4 + 8 + 32 + 4*8 + 4*4 + 60); uint32_t k = leu32p(hdr->AS.Header + 280); if (count < H1LEN + k * H2LEN) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, H1LEN + k * H2LEN); count += ifread(hdr->AS.Header + count, 1, H1LEN + k * H2LEN - count, hdr); } hdr->HeadLen = count; hdr->VERSION = leu32p(hdr->AS.Header + 4) / 100.0; hdr->SampleRate = lef64p(hdr->AS.Header + 264); hdr->SPR = 1; hdr->EVENT.SampleRate = lef64p(hdr->AS.Header + 264); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i)\n",__func__,__LINE__); if (k > 0xffff) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "NEX format has more than 65535 channels"); return (hdr); } while (!ifeof(hdr)) { void *tmpptr = realloc(hdr->AS.Header, count*2); if (tmpptr) hdr->AS.Header = (uint8_t*)tmpptr; else { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Not enough memory to read NEX file"); return(hdr); } count += ifread(hdr->AS.Header + count, 1, count, hdr); } hdr->NS = k; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS*sizeof(CHANNEL_TYPE)); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i)\n",__func__,__LINE__); for (k=0; k < hdr->NS; k++) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): VarHdr # %i\n",__func__,__LINE__, k); CHANNEL_TYPE *hc = hdr->CHANNEL+k; uint32_t type = leu32p(hdr->AS.Header + H1LEN + k*H2LEN); hc->OnOff = (type==5); strncpy(hc->Label, hdr->AS.Header + H1LEN + k*H2LEN + 8, min(64,MAX_LENGTH_LABEL)); hc->Label[min(64, MAX_LENGTH_LABEL)] = 0; size_t n; if (v==5) { hc->GDFTYP = (leu32p(hdr->AS.Header + H1LEN + k*H2LEN + 92)==1) ? 16 : 3; hc->PhysDimCode = PhysDimCode(hdr->AS.Header + H1LEN + k*H2LEN + 5*8 + 64); n = leu64p(hdr->AS.Header + 80 + H1LEN + k*H2LEN); hc->Cal = lef64p(hdr->AS.Header + 64+8*5+32 + H1LEN + k*H2LEN); hc->Off = lef64p(hdr->AS.Header + 64+8*5+40 + H1LEN + k*H2LEN); hc->SPR = leu64p(hdr->AS.Header + 64+8*5+48 + H1LEN + k*H2LEN); hc->bufptr = hdr->AS.Header + leu64p(hdr->AS.Header + 64+8 + H1LEN + k*H2LEN); } else { hc->GDFTYP = 3; hc->PhysDimCode = PhysDimCode("mV"); n = leu32p(hdr->AS.Header + 76 + H1LEN + k*H2LEN); hc->Cal = lef64p(hdr->AS.Header + 64+8*4+3*8 + H1LEN + k*H2LEN); hc->Off = lef64p(hdr->AS.Header + 64+8*4+3*8+20 + H1LEN + k*H2LEN); hc->SPR = leu32p(hdr->AS.Header + 64+8*4+4*8 + H1LEN + k*H2LEN); hc->bufptr = hdr->AS.Header+leu32p(hdr->AS.Header + 64+8 + H1LEN + k*H2LEN); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): VarHdr # %i %i %i %i \n",__func__,__LINE__, k,v,type,(int)n); switch (type) { case 2: //case 6: case 0: case 1: hdr->EVENT.N += n; } //if (hc->OnOff) hdr->SPR = lcm(hdr->SPR, hc->SPR); } if (hdr->EVENT.N > 0) { size_t N=hdr->EVENT.N; hdr->EVENT.N=0; reallocEventTable(hdr,N); N = 0; for (k=0; k < hdr->NS; k++) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): VarHdr # %i\n",__func__,__LINE__, k); CHANNEL_TYPE *hc = hdr->CHANNEL+k; uint32_t type = leu32p(hdr->AS.Header + H1LEN + k*H2LEN); size_t n,l; uint16_t gdftyp = 5; if (v==5) { n = leu64p(hdr->AS.Header + 80 + H1LEN + k*H2LEN); if (leu32p(hdr->AS.Header + 88 + H1LEN + k*H2LEN)) gdftyp=7; } else n = leu32p(hdr->AS.Header + 76 + H1LEN + k*H2LEN); switch (type) { case 2: if (gdftyp==5) { for (l=0; lEVENT.DUR[N+l] = leu32p(hc->bufptr+4*(l+n)); } else { for (l=0; lEVENT.DUR[N+l] = leu64p(hc->bufptr+8*(l+n)); } case 0: case 1: //case 6: if (gdftyp==5) { for (l=0; lEVENT.POS[N+l] = leu32p(hc->bufptr+4*l); } else { for (l=0; lEVENT.POS[N+l] = leu64p(hc->bufptr+8*l); } for (l=0; lEVENT.TYP[N+l] = type; hdr->EVENT.CHN[N+l] = k; //hdr->EVENT.TimeStamp[N+l] = 0; } } N+=n; } hdr->EVENT.N=N; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i)\n",__func__,__LINE__); hdr2ascii(hdr,stdout,4); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Support for NEX format is not ready yet"); return(hdr); } else if (hdr->TYPE==NIFTI) { if (count<352) count += ifread(hdr->AS.Header+count, 1, 352-count, hdr); // nifti_1_header *NIFTI_HDR = (nifti_1_header*)hdr-AS.Header; char SWAP = *(int16_t*)(Header1+40) > 7; #if (__BYTE_ORDER == __BIG_ENDIAN) hdr->FILE.LittleEndian = SWAP; #elif (__BYTE_ORDER == __LITTLE_ENDIAN) hdr->FILE.LittleEndian = !SWAP; #endif if (!SWAP) { hdr->HeadLen = (size_t)*(float*)(Header1+80); } else { union {uint32_t u32; float f32;} u; u.u32 = bswap_32(*(uint32_t*)(Header1+108)); hdr->HeadLen = (size_t)u.f32; } if (Header1[345]=='i') { ifclose(hdr); char *f0 = hdr->FileName; char *f1 = (char*)malloc(strlen(hdr->FileName)+4); strcpy(f1,hdr->FileName); strcpy(strrchr(f1,'.') + 1, "img"); // Flawfinder: ignore hdr->FileName = f1; hdr = ifopen(hdr,"r"); hdr->FileName = f0; } else ifseek(hdr,hdr->HeadLen,SEEK_SET); #ifdef _NIFTI_HEADER_ nifti_1_header *NIFTI_HDR = (nifti_1_header*)hdr->AS.Header; #endif ifclose(hdr); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format NIFTI not supported"); return(hdr); } else if (hdr->TYPE==NUMPY) { /* There is no way to extract sampling rate and scaling factors from numpy files. For this reason, numpy is not going to be a supported data format. */ fprintf(stderr,"Warning SOPEN (NUMPY): sampling rate, scaling, physical units etc. are not supported, and are most likely incorrect."); hdr->VERSION = hdr->AS.Header[6]+hdr->AS.Header[7]/100; hdr->HeadLen = leu16p(hdr->AS.Header+8); if (count < hdr->HeadLen) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen+1); count += ifread(hdr->AS.Header + count, 1, hdr->HeadLen - count, hdr); } hdr->AS.Header[hdr->HeadLen]=0; hdr->NS=1; hdr->SPR=0; hdr->NRec=1; uint16_t gdftyp = 0; const char *h=(char*)hdr->AS.Header+10; int flag_order = (strstr(h,"'fortran_order': False")==NULL) + (strstr(h,"'fortran_order': True")==NULL)*2; switch (flag_order) { case 1: break; case 2: break; default: biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "format NUMPY: fortran_order not specified or invalid"); } char *descr = strstr(h,"'descr':"); if (descr==NULL) biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format NUMPY: descr not defined"); else { descr += 8; descr += strspn(descr," \t'"); descr[strcspn(descr," \t'")]=0; if (descr[0]=='<') hdr->FILE.LittleEndian = 1; else if (descr[0]=='>') hdr->FILE.LittleEndian = 0; else biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format NUMPY: field 'descr': endianity undefined"); if (!strcmp(descr+1,"f8")) gdftyp = 17; else if (!strcmp(descr+1,"f4")) gdftyp = 16; else if (!strcmp(descr+1,"u8")) gdftyp = 8; else if (!strcmp(descr+1,"i8")) gdftyp = 7; else if (!strcmp(descr+1,"u4")) gdftyp = 6; else if (!strcmp(descr+1,"i4")) gdftyp = 5; else if (!strcmp(descr+1,"u2")) gdftyp = 4; else if (!strcmp(descr+1,"i2")) gdftyp = 3; else if (!strcmp(descr+1,"u1")) gdftyp = 2; else if (!strcmp(descr+1,"i1")) gdftyp = 1; else biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format NUMPY: field 'descr': not supported"); } char *shapestr = strstr(h,"'shape':"); if (shapestr==NULL) biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format NUMPY: shape not defined"); else { int n = 0; char *tmpstr = strchr(shapestr,'(') + 1; while (tmpstr && *tmpstr) { *strchr(tmpstr,')') = 0; // terminating \0 char *next = strchr(tmpstr,','); if (next) { *next=0; long dim = atol(tmpstr); switch (n) { case 0: hdr->SPR =dim; break; case 1: hdr->NS =dim; break; //case 2: hdr->NRec=dim; break; default: biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "format NUMPY: shape not supported"); } n++; tmpstr = next+1; } } } hdr->AS.bpb = hdr->NS*GDFTYP_BITS[gdftyp]>>3; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); typeof (hdr->NS) k; for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->GDFTYP = gdftyp; hc->SPR = hdr->SPR; hc->Cal = 1.0; hc->Off = 0.0; } if (VERBOSE_LEVEL > 6) fprintf(stdout,"NUMPY:\n%s",(char*)hdr->AS.Header+10); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format NUMPY not supported"); return(hdr); } else if (hdr->TYPE==Persyst) { if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [225]\n"); int c=1; while (~ifeof(hdr) && c) { if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [25] %d\n",(int)count); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,count*2+1); c = ifread(hdr->AS.Header + count, 1, count, hdr); count += c; } hdr->AS.Header[count] = 0; ifclose(hdr); hdr->SPR = 1; int32_t gdftyp = 3; double Cal = 1.0; int status = 0; char *remHDR=(char*)hdr->AS.Header; const char *FirstName=NULL, *MiddleName=NULL, *SurName=NULL; char *datfile = NULL; struct tm RecTime; size_t NEvent = 0; hdr->FLAG.OVERFLOWDETECTION = 0; // overflow detection is not supported for this format double DigMax = ldexp(1,-15); double DigMin = -ldexp(1,-15)-1; char *line; char flag_interleaved = 1; while (1) { if (*remHDR == '\0') break; // line = strsep(&remHDR,"\n\r"); line = remHDR; remHDR = strpbrk(remHDR,"\n\r\0"); *remHDR++ = 0; remHDR += strspn(remHDR,"\n\r"); if (!strncmp(line,"[FileInfo]",10)) status = 1; else if (!strncmp(line,"[ChannelMap]",12)) { status = 2; hdr->AS.bpb = hdr->NS*GDFTYP_BITS[gdftyp]>>3; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); uint16_t ch; for (ch=0; ch < hdr->NS; ch++) { CHANNEL_TYPE *hc = hdr->CHANNEL+ch; hc->PhysMax = DigMax*Cal; hc->PhysMin = DigMin*Cal; hc->DigMax = DigMax; hc->DigMin = DigMin; hc->Cal = Cal; hc->Off = 0.0; hc->OnOff = 1; hc->Label[0] = 0; hc->LeadIdCode = 0; hc->Transducer[0] = 0; hc->PhysDimCode = 0; //TODO hc->GDFTYP = gdftyp; hc->TOffset = NAN; hc->LowPass = NAN; hc->HighPass = NAN; hc->Notch = NAN; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; hc->Impedance = NAN; hc->SPR = hdr->SPR; hc->bi8 = ch*GDFTYP_BITS[gdftyp]; hc->bi = hc->bi8>>3; hc->bufptr = NULL; } } else if (!strncmp(line,"[Sheets]",8)) status = 3; else if (!strncmp(line,"[Comments]",10)) status = 4; else if (!strncmp(line,"[Patient]",9)) status = 5; else if (!strncmp(line,"[SampleTimes]",13)) status = 6; else { switch (status) { case 1: { char *tag = line; char *val = strchr(line,'='); *val= 0; // replace "=" with terminating \0 val++; // next character is the start of the value parameters if (!strcmp(tag,"File")) { datfile = strrchr(val,'/'); if (!datfile) datfile = strrchr(val,'\\')+1; if (!datfile) datfile = val; } else if (!strcmp(line,"FileType")) flag_interleaved = !strcmp(val,"Interleaved"); else if (!strcmp(line,"SamplingRate")) hdr->SampleRate = atof(val); else if (!strcmp(line,"Calibration")) Cal = atof(val); else if (!strcmp(line,"WaveformCount")) hdr->NS = atol(val); else if (!strcmp(line,"DataType")) { switch (atol(val)) { case 0: gdftyp = 3; // int 16 hdr->FILE.LittleEndian = 1; hdr->AS.bpb *= 2; DigMin = -ldexp(1.0,-15)-1; DigMax = ldexp(1.0,-15); break; case 4: gdftyp = 3; // int16 hdr->FILE.LittleEndian = 0; hdr->AS.bpb *= 2; DigMin = -ldexp(1.0,-15)-1; DigMax = ldexp(1.0,-15); break; case 6: gdftyp = 1; // int8 DigMin = -ldexp(1.0,-7)-1; DigMax = ldexp(1.0,-7); break; default: biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format Persyst: unsupported data type"); } } break; } case 2: { char *tag = line; char *val = strchr(line,'='); *val = 0; // replace "=" with terminating \0 val++; // next character is the start of the value parameters int channo = atol(val)-1; if (0 <= channo && channo < hdr->NS) { strncpy(hdr->CHANNEL[channo].Label, tag, MAX_LENGTH_LABEL); } break; } case 3: { break; } case 4: { if (NEvent < hdr->EVENT.N+2) { NEvent += max(128,NEvent); if (reallocEventTable(hdr, NEvent) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return (hdr); }; } char *tmp2,*tmp1 = line; tmp2 = strchr(tmp1,','); *tmp2 = 0; hdr->EVENT.POS[hdr->EVENT.N] = atof(tmp1)*hdr->SampleRate; tmp1 = strchr(tmp2+1,','); *tmp1 = 0; hdr->EVENT.DUR[hdr->EVENT.N] = atof(tmp1)*hdr->SampleRate; tmp2 = strchr(tmp1+1,','); *tmp2 = 0; // ignore next field tmp1 = strchr(tmp2+1,','); *tmp1 = 0; // ignore next field char *Desc = tmp1+1; FreeTextEvent(hdr,hdr->EVENT.N,Desc); hdr->EVENT.N++; break; } case 5: { char *val = strchr(line,'='); *val= 0; // replace "=" with terminating \0 val++; // next character is the start of the value parameters if (!strcmp(line,"First")) FirstName=val; else if (!strcmp(line,"MI")) MiddleName=val; else if (!strcmp(line,"Last")) SurName=val; else if (!strcmp(line,"Hand")) hdr->Patient.Handedness = (toupper(val[0])=='R') + 2*(toupper(val[0])=='L') ; else if (!strcmp(line,"Sex")) hdr->Patient.Sex = (toupper(val[0])=='M') + 2*(toupper(val[0])=='F') ; else if (!strcmp(line,"BirthDate")) { struct tm t; t.tm_year = atol(val+6); if (t.tm_year < 80) t.tm_year+=100; val[5]=0; t.tm_mday = atol(val+3); val[2]=0; t.tm_mon = atol(val); t.tm_hour = 12; t.tm_min = 0; t.tm_sec = 0; hdr->Patient.Birthday = tm_time2gdf_time(&t); } else if (!strcmp(line,"TestDate")) { RecTime.tm_year = atol(val+6); if (RecTime.tm_year < 80) RecTime.tm_year+=100; val[5]=0; RecTime.tm_mday = atol(val+3); val[2]=0; RecTime.tm_mon = atol(val); } else if (!strcmp(line,"TestTime")) { RecTime.tm_sec = atol(val+6); val[5]=0; RecTime.tm_min = atol(val+3); val[2]=0; RecTime.tm_hour = atol(val); } else if (!strcmp(line,"ID")) { strncpy(hdr->Patient.Id,val,MAX_LENGTH_PID); hdr->Patient.Id[MAX_LENGTH_PID] = 0; } /* Omitted, because it is not important, identification through ID, and T0; quality is determined by Technician else if (!strcmp(line,"Physician")) Physician=val; */ else if (!strcmp(line,"Technician")) hdr->ID.Technician = strdup(val); else if (!strcmp(line,"Medications")) hdr->Patient.Medication = (val!=NULL) && strlen(val)>0; break; } case 6: { break; } case 7: { break; } } } } if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [260] %d<%s>\n",status,line); hdr->T0 = tm_time2gdf_time(&RecTime); if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [270] %d<%s>\n",status,line); if (!hdr->FLAG.ANONYMOUS) { size_t len = 0, len0=0; if (SurName!=NULL) len += strlen(SurName); if (len < MAX_LENGTH_NAME) { strcpy(hdr->Patient.Name, SurName); hdr->Patient.Name[len]=0x1f; len0 = ++len; } if (FirstName!=NULL) len += strlen(FirstName); if (len < MAX_LENGTH_NAME) { strcpy(hdr->Patient.Name+len0, FirstName); hdr->Patient.Name[len]=' '; len0 = ++len; } if (MiddleName!=NULL) len += strlen(MiddleName); if (len < MAX_LENGTH_NAME) { strcpy(hdr->Patient.Name+len0, MiddleName); hdr->Patient.Name[len0]=' '; } hdr->Patient.Name[len]=0; } if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [280] %d<%s>\n",status,datfile); size_t len = strlen(hdr->FileName); char *FileName = hdr->FileName; hdr->FileName = (char*) malloc(len+strlen(datfile)+2); if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [283] %d<%s> %d/%d\n",(int)len,datfile,(int)hdr->SPR,(int)hdr->NRec); if (strspn(FileName,"/\\")) { strcpy(hdr->FileName, FileName); char *tmpstr = strrchr(hdr->FileName,'/')+1; if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [285] %d<%s>\n",(int)len,tmpstr); if (tmpstr==NULL) tmpstr = strrchr(hdr->FileName,'\\')+1; if (tmpstr!=NULL) strcpy(tmpstr,datfile); else { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "Format Persyst: cannot open dat file."); } } else { strcpy(hdr->FileName, datfile); } if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [290] %d<%s>\n",status, hdr->FileName); struct stat FileBuf; if (stat(hdr->FileName, &FileBuf)==0) { hdr->FILE.size = FileBuf.st_size; hdr->NRec = FileBuf.st_size*8/(hdr->NS*GDFTYP_BITS[gdftyp]); if (!flag_interleaved) { hdr->SPR = hdr->NRec; hdr->NRec = 1; uint16_t ch; for (ch=0; ch < hdr->NS; ch++) { CHANNEL_TYPE *hc = hdr->CHANNEL+ch; hc->SPR = hdr->SPR; size_t bi8 = ch * (size_t)hdr->SPR * GDFTYP_BITS[gdftyp]; hc->bi8 = bi8; hc->bi = bi8>>3; } hdr->AS.bpb = FileBuf.st_size; } } else { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "Format Persyst: cannot open dat file."); } ifopen(hdr,"r"); hdr->HeadLen = 0; // datfile has no header free(hdr->FileName); hdr->FileName = FileName; if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN (Persyst) [298] %d %d %d\n",(int)FileBuf.st_size,(int)hdr->AS.bpb,(int)(FileBuf.st_size/hdr->AS.bpb)); } else if (hdr->TYPE==PLEXON) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format PLEXON not supported"); return(hdr); } else if (hdr->TYPE==RDF) { // UCSD ERPSS aquisition system #define RH_F_CONV 0x0001 /* converted from other format */ #define RH_F_RCOMP 0x0002 /* raw file is compressed */ #define RH_F_DCMAP 0x4000 /* channel mapping used during dig. */ #define RH_CHANS 256 /* maximum # channels */ #define RH_DESC 64 /* max # chars in description */ #define RH_CHDESC 8 /* max # chars in channel descriptor */ #define RH_SFILL 4 /* short filler */ #define RH_LFILL 6 /* long filler */ #define RH_ALOG 828 /* max # chars in ASCII log */ struct rawhdr { uint16_t rh_byteswab; /* ERPSS byte swab indicator */ uint16_t rh_magic; /* file magic number */ uint16_t rh_flags; /* flags */ uint16_t rh_nchans; /* # channels */ uint16_t rh_calsize; /* (if norm, |cal|) */ uint16_t rh_res; /* (if norm, in pts/unit) */ uint16_t rh_pmod; /* # times processed */ uint16_t rh_dvers; /* dig. program version */ uint16_t rh_l2recsize; /* log 2 record size */ uint16_t rh_recsize; /* record size in pts */ uint16_t rh_errdetect; /* error detection in effect */ uint16_t rh_chksum; /* error detection chksum */ uint16_t rh_tcomp; /* log 2 time comp/exp */ uint16_t rh_narbins; /* (# art. rej. count slots) */ uint16_t rh_sfill[RH_SFILL]; /* short filler (to 16 slots) */ uint16_t rh_nrmcs[RH_CHANS]; /* (cal sizes used for norm.) */ uint32_t rh_time; /* creation time, secs since 1970 */ uint32_t rh_speriod; /* digitization sampling period */ uint32_t rh_lfill[RH_LFILL]; /* long filler (to 8 slots) */ char rh_chdesc[RH_CHANS][RH_CHDESC]; /* chan descriptions */ char rh_chmap[RH_CHANS]; /* input chan mapping array */ char rh_subdesc[RH_DESC]; /* subject description */ char rh_expdesc[RH_DESC]; /* experimenter description */ char rh_ename[RH_DESC]; /* experiment name */ char rh_hname[RH_DESC]; /* host machine name */ char rh_filedesc[RH_DESC]; /* file description */ char rh_arbdescs[RH_DESC]; /* (art. rej. descriptions) */ char rh_alog[RH_ALOG]; /* ASCII log */ }; if (count < sizeof(struct rawhdr)) { hdr->HeadLen = sizeof(struct rawhdr); hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header,hdr->HeadLen+1); count += ifread(Header1+count, 1, hdr->HeadLen-count, hdr); hdr->AS.Header[hdr->HeadLen]=0; } hdr->NS = *(uint16_t*)(hdr->AS.Header+2); time_t T0 = (time_t)*(uint32_t*)(hdr->AS.Header+32); // seconds since 1970 hdr->T0 = t_time2gdf_time(T0); hdr->SampleRate = 1e6 / (*(uint32_t*)(hdr->AS.Header+36)); strncpy(hdr->Patient.Id, (const char*)hdr->AS.Header+32+24+256*9, min(64,MAX_LENGTH_PID)); hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; hc->OnOff = 1; strncpy(hc->Label,(char*)(hdr->AS.Header+32+24+8*k),8); hc->LeadIdCode = 0; } biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format RDF (UCSD ERPSS) not supported"); } else if (hdr->TYPE==RHD2000) { float minor = leu16p(hdr->AS.Header+6); minor *= (minor < 10) ? 0.1 : 0.01; hdr->VERSION = leu16p(hdr->AS.Header+4) + minor; hdr->NS = 1; hdr->SampleRate = lef32p(hdr->AS.Header+8); float HighPass = ( leu16p(hdr->AS.Header+12) ? 0.0 : lef32p(hdr->AS.Header+14) ); HighPass = max( HighPass, lef32p(hdr->AS.Header+18) ); float LowPass = lef32p(hdr->AS.Header+22); const int ListNotch[] = {0,50,60}; uint16_t tmp = leu16p(hdr->AS.Header+34); if (tmp>2) tmp=0; float Notch = ListNotch[tmp]; float fZ = lef32p(hdr->AS.Header+40); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Format Intan RHD2000 not supported"); /* hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); CHANNEL_TYPE *hc = hdr->CHANNEL; */ } else if (hdr->TYPE==SCP_ECG) { hdr->HeadLen = leu32p(hdr->AS.Header+2); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen); count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); uint16_t crc = CRCEvaluate(hdr->AS.Header+2,hdr->HeadLen-2); if ( leu16p(hdr->AS.Header) != crc) { biosigERROR(hdr, B4C_CRC_ERROR, "Warning SOPEN(SCP-READ): Bad CRC!"); } hdr->Version = hdr->AS.Header[14]/10.0; sopen_SCP_read(hdr); serror2(hdr); // report and reset error, but continue // hdr->FLAG.SWAP = 0; // no swapping hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); // no swapping hdr->AS.length = hdr->NRec; } else if (hdr->TYPE==Sigma) { /********* Sigma PLpro ************/ hdr->HeadLen = leu32p(hdr->AS.Header+16); hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header,hdr->HeadLen+1); count += ifread(Header1+count, 1, hdr->HeadLen-count, hdr); hdr->AS.Header[hdr->HeadLen]=0; struct tm t; char *tag, *val; size_t pos = leu32p(hdr->AS.Header+28); uint8_t len; typeof(hdr->NS) k; for (k=0; k<5; k++) { #define line ((char*)(hdr->AS.Header+pos)) len = strcspn(line,"\x0a\x0d"); line[len] = 0; tag = line; val = strchr(line,'='); if (val!=NULL) { val[0] = 0; val++; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%i: %s=%s\n",k,tag,val); if (0) {} //else if (!strcmp(tag,"Name")) {} //else if (!strcmp(tag,"Vorname")) {} else if (!strcmp(tag,"GebDat")) { sscanf(val,"%02u.%02u.%04u",&t.tm_mday,&t.tm_mon,&t.tm_year); t.tm_year -=1900; t.tm_mon--; t.tm_hour = 12; t.tm_min = 0; t.tm_sec = 0; t.tm_isdst = -1; hdr->T0 = tm_time2gdf_time(&t); } else if (!strcmp(tag,"ID")) strncpy(hdr->Patient.Id,val,MAX_LENGTH_PID); pos += len+1; while ((line[0]==10) || (line[0]==13)) pos++; } if (VERBOSE_LEVEL>7) fprintf(stdout,"333 SIGMA pos=%i, 0x%x\n", (int)pos, (int)pos); hdr->NS = leu16p(hdr->AS.Header+pos); hdr->SampleRate = 128; hdr->SPR = 1; hdr->NRec = -1; // unknown struct stat stbuf; if(!stat(hdr->FileName, &stbuf)) { if (!hdr->FILE.COMPRESSION) hdr->NRec = (stbuf.st_size-hdr->HeadLen)/(2*hdr->NS); else fprintf(stdout,"Compressed Sigma file (%s) is currently not supported. Uncompress file and try again.", hdr->FileName); } if (VERBOSE_LEVEL>7) fprintf(stdout,"333 SIGMA NS=%i/0x%x, Fs=%f, SPR=%i, NRec=%i\n",hdr->NS,hdr->NS, hdr->SampleRate,hdr->SPR,(int)hdr->NRec); // define variable header pos = 148; hdr->FLAG.UCAL = 1; hdr->FLAG.OVERFLOWDETECTION = 0; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); uint16_t p[] = {4,19,19,19,19+2,19,19,19,19+8,9,11}; // difference of positions of string elements within variable header for (k=1; k < sizeof(p)/sizeof(p[0]); k++) p[k] += p[k-1]; // relative position double *fs = (double*) malloc(hdr->NS * sizeof(double)); double minFs = INFINITY; for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; pos = 148 + k*203; // ch = lei16p(hdr->AS.Header+pos); double val; hc->GDFTYP = 3; hc->OnOff = 1; hc->SPR = 1; hc->DigMax = (int16_t)0x7fff; hc->DigMin = (int16_t)0x8000; hc->PhysMax = hc->DigMax; hc->PhysMin = hc->DigMin; // hc->Cal = 1.0; hc->Off = 0.0; hc->HighPass = NAN; hc->LowPass = NAN; hc->Notch = *(int16_t*)(hdr->AS.Header+pos+2) ? 1.0 : 0.0; hc->Impedance = INFINITY; hc->fZ = NAN; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; hc->LeadIdCode = 0; unsigned k1; for (k1 = sizeof(p)/sizeof(p[0]); k1>0; ) { k1--; len = hdr->AS.Header[pos+p[k1]]; hdr->AS.Header[pos+p[k1]+len+1] = 0; val = atof((char*)(hdr->AS.Header+pos+p[k1]+1)); switch (k1) { case 0: // Abtastrate fs[k] = val; if (hdr->SampleRate < fs[k]) hdr->SampleRate=fs[k]; if (minFs > fs[k]) minFs=fs[k]; break; case 1: // obere Grenzfrequenz hc->LowPass = val; break; case 2: // untere Grenzfrequenz hc->HighPass = val; break; case 6: // Electrodenimpedanz hc->Impedance = val; break; case 7: // Sensitivitaet Verstaerker hc->Cal = val; break; case 8: // Elektrodenbezeichnung strcpy(hc->Label, (char*)(hdr->AS.Header+pos+p[k1]+1)); break; case 10: // Masseinheit hc->PhysDimCode = PhysDimCode((char*)(hdr->AS.Header+pos+p[k1]+1)); break; case 11: // strcpy(hc->Transducer, (char*)(hdr->AS.Header+pos+p[k1]+1)); break; case 3: // gerfac ? case 4: // Kalibriergroesse case 5: // Kanaldimension case 9: // Bezeichnung der Referenzelektrode {}; } } hc->Off = lei16p(hdr->AS.Header+pos+ 80) * hc->Cal; hc->XYZ[0] = lei32p(hdr->AS.Header+pos+158); hc->XYZ[1] = lei32p(hdr->AS.Header+pos+162); hc->XYZ[2] = lei32p(hdr->AS.Header+pos+166); } #undef line hdr->SPR = (typeof(hdr->SPR))round(hdr->SampleRate/minFs); for (k=0,hdr->AS.bpb=0; kNS; k++) { hdr->CHANNEL[k].SPR = (typeof(hdr->SPR))round(fs[k]/minFs); hdr->CHANNEL[k].bi = hdr->AS.bpb; hdr->AS.bpb += hdr->CHANNEL[k].SPR*2; } free(fs); } /******* end of Sigma PLpro ********/ /* else if (hdr->TYPE==SMA) { char *delim = "=\x0a\x0d\x22"; } */ else if (hdr->TYPE==SND) { /* read file */ // hdr->FLAG.SWAP = (__BYTE_ORDER == __LITTLE_ENDIAN); hdr->FILE.LittleEndian = 0; hdr->HeadLen = beu32p(hdr->AS.Header+4); size_t datlen = beu32p(hdr->AS.Header+8); uint32_t filetype = beu32p(hdr->AS.Header+12); hdr->SampleRate = (double)beu32p(hdr->AS.Header+16); hdr->NS = beu32p(hdr->AS.Header+20); if (countHeadLen) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen); count += ifread(hdr->AS.Header+count,1,hdr->HeadLen-count,hdr); } else { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen); ifseek(hdr,hdr->HeadLen,SEEK_SET); } const uint16_t SND_GDFTYP[] = {0,2,1,3,255+24,5,16,17,0,0,0,2,4,511+25,6}; uint16_t gdftyp = SND_GDFTYP[filetype]; hdr->AS.bpb = hdr->NS * GDFTYP_BITS[gdftyp]>>3; double Cal = 1; if ((filetype>1) && (filetype<6)) Cal = ldexp(1,-GDFTYP_BITS[gdftyp]); hdr->NRec = datlen/hdr->AS.bpb; hdr->SPR = 1; hdr->FLAG.OVERFLOWDETECTION = 0; // automated overflow and saturation detection not supported hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); double digmax = ldexp(1,GDFTYP_BITS[gdftyp]); for (k=0,hdr->AS.bpb=0; k < hdr->NS; k++) { CHANNEL_TYPE* hc = hdr->CHANNEL+k; hc->OnOff = 1; hc->GDFTYP = gdftyp; hc->SPR = 1; hc->Cal = Cal; hc->Off = 0.0; hc->Transducer[0] = '\0'; hc->LowPass = -1; hc->HighPass = -1; hc->PhysMax = 1.0; hc->PhysMin = -1.0; hc->DigMax = digmax; hc->DigMin = -digmax; hc->LeadIdCode = 0; hc->PhysDimCode = 0; hc->Label[0] = 0; hc->bi = hdr->AS.bpb; hdr->AS.bpb += GDFTYP_BITS[gdftyp]>>3; } } else if (hdr->TYPE==TDMS) { #if defined(WITH_TDMS) sopen_tdms_read(hdr); #else biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "TDMS (NI): data format is not supported"); #endif } else if (hdr->TYPE==TMS32) { hdr->VERSION = leu16p(hdr->AS.Header+31); hdr->SampleRate = leu16p(hdr->AS.Header+114); size_t NS = leu16p(hdr->AS.Header+119); hdr->HeadLen = 217 + NS*136; if (hdr->HeadLen > count) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen); count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); } else ifseek(hdr,hdr->HeadLen,SEEK_SET); // size_t filesize = lei32p(hdr->AS.Header+121); tm_time.tm_year = lei16p(hdr->AS.Header+129)-1900; tm_time.tm_mon = lei16p(hdr->AS.Header+131)-1; tm_time.tm_mday = lei16p(hdr->AS.Header+133); tm_time.tm_hour = lei16p(hdr->AS.Header+137); tm_time.tm_min = lei16p(hdr->AS.Header+139); tm_time.tm_sec = lei16p(hdr->AS.Header+141); tm_time.tm_isdst= -1; hdr->T0 = tm_time2gdf_time(&tm_time); hdr->NRec = lei32p(hdr->AS.Header+143); hdr->SPR = leu16p(hdr->AS.Header+147); //hdr->AS.bpb = leu16p(hdr->AS.Header+149)+86; hdr->AS.bpb = 86; hdr->FLAG.OVERFLOWDETECTION = 0; hdr->CHANNEL = (CHANNEL_TYPE*)calloc(NS, sizeof(CHANNEL_TYPE)); size_t aux = 0; for (k=0; k < NS; k += 1) { CHANNEL_TYPE* hc = hdr->CHANNEL+aux; uint8_t StringLength = hdr->AS.Header[217+k*136]; char *SignalName = (char*)(hdr->AS.Header+218+k*136); if (!strncmp(SignalName, "(Lo) ", 5)) { strncpy(hc->Label,SignalName+5,StringLength-5); hc->GDFTYP = 16; aux += 1; hc->Label[StringLength-5] = 0; hc->bi = hdr->AS.bpb; } else if (!strncmp(SignalName, "(Hi) ", 5)) { } else { strncpy(hc->Label, SignalName, StringLength); hc->GDFTYP = 3; aux += 1; hc->Label[StringLength] = 0; hc->bi = hdr->AS.bpb; } StringLength = hdr->AS.Header[45+217+k*136]; char tmp[256]; strncpy(tmp, (char*)(hdr->AS.Header+46+217+k*136), StringLength); tmp[StringLength] = 0; hc->PhysDimCode = PhysDimCode(tmp); hc->PhysMin = lef32p(hdr->AS.Header+56+217+k*136); hc->PhysMax = lef32p(hdr->AS.Header+60+217+k*136); hc->DigMin = lef32p(hdr->AS.Header+64+217+k*136); hc->DigMax = lef32p(hdr->AS.Header+68+217+k*136); hc->Cal = (hc->PhysMax-hc->PhysMin)/(hc->DigMax-hc->DigMin); hc->Off = hc->PhysMin - hc->Cal * hc->DigMin; hc->OnOff = 1; hc->SPR = hdr->SPR; hc->Transducer[0] = '\0'; hc->LowPass = -1; hc->HighPass = -1; hc->LeadIdCode = 0; //hdr->AS.bpb += 2 * hc->SPR; hdr->AS.bpb += hc->SPR * (GDFTYP_BITS[hc->GDFTYP]>>3); if (VERBOSE_LEVEL>7) fprintf(stdout,"k=%i\tLabel=%s [%s]\tNS=%i\tpos=%i\n",(int)k,SignalName,tmp,(int)NS,(int)iftell(hdr)); } hdr->NS = aux; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL,hdr->NS*sizeof(CHANNEL_TYPE)); } else if (hdr->TYPE==TMSiLOG) { /* read header docu says HeadLen = 141+275*NS, but our example has 135+277*NS; */ int bufsiz = 16384; while (!ifeof(hdr)) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, count+bufsiz+1); count += ifread(hdr->AS.Header+count, 1, bufsiz, hdr); } ifclose(hdr); hdr->AS.Header[count] = 0; hdr->NS = 0; hdr->SPR = 1; hdr->NRec = 1; double duration = 0.0; uint16_t gdftyp = 0; char *line = strstr(Header1,"Signals="); if (line) { char tmp[5]; strncpy(tmp,line+8,5); hdr->NS = atoi(tmp); } if (!hdr->NS) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "TMSiLOG: multiple data files not supported"); } hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); char *filename = NULL; line = strtok(Header1,"\x0d\x0a"); while (line) { char *val = strchr(line,'='); val[0] = 0; val++; if (!strcmp(line,"FileId")) {} else if (!strcmp(line,"Version")) hdr->VERSION = atoi(val); else if (!strcmp(line,"DateTime")) { struct tm t; sscanf(val,"%04d/%02d/%02d-%02d:%02d:%02d",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); t.tm_year -= 1900; t.tm_mon--; t.tm_isdst =-1; } else if (!strcmp(line,"Format")) { if (!strcmp(val,"Float32")) gdftyp = 16; else if (!strcmp(val,"Int32 ")) gdftyp = 5; else if (!strcmp(val,"Int16 ")) gdftyp = 3; else if (!strcmp(val,"Ascii ")) gdftyp = 0xfffe; else gdftyp = 0xffff; } else if (!strcmp(line,"Length")) { duration = atof(val); } else if (!strcmp(line,"Signals")) { hdr->NS = atoi(val); } else if (!strncmp(line,"Signal",6)) { char tmp[5]; strncpy(tmp,line+6,4); size_t ch = atoi(tmp)-1; char *field = line+11; if (!strcmp(field,"Name")) strncpy(hdr->CHANNEL[ch].Label,val,MAX_LENGTH_LABEL); else if (!strcmp(field,"UnitName")) hdr->CHANNEL[ch].PhysDimCode=PhysDimCode(val); else if (!strcmp(field,"Resolution")) hdr->CHANNEL[ch].Cal=atof(val); else if (!strcmp(field,"StoreRate")) { hdr->NRec = (nrec_t)atof(val)*duration; hdr->CHANNEL[ch].SPR = 1; // hdr->CHANNEL[ch].SPR=atof(val)*duration; //hdr->SPR = lcm(hdr->SPR,hdr->CHANNEL[ch].SPR); } else if (!strcmp(field,"File")) { if (!filename) filename = val; else if (strcmp(val, filename)) { fprintf(stdout,"<%s><%s>",val,filename); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "TMSiLOG: multiple data files not supported"); } } else if (!strcmp(field,"Index")) {} else fprintf(stdout,"TMSi Signal%04i.%s = <%s>\n",(int)ch,field,val); } else fprintf(stdout,"TMSi %s = <%s>\n",line,val); line = strtok(NULL,"\x0d\x0a"); } hdr->SampleRate = hdr->SPR*hdr->NRec/duration; hdr->NRec *= hdr->SPR; hdr->SPR = 1; char *fullfilename = (char*)malloc(strlen(hdr->FileName)+strlen(filename)+1); if (!filename) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "TMSiLOG: data file not specified"); } else if (strrchr(hdr->FileName,FILESEP)) { strcpy(fullfilename,hdr->FileName); strcpy(strrchr(fullfilename,FILESEP)+1,filename); } else { strcpy(fullfilename,filename); } filename = NULL; // filename had a pointer to hdr->AS.Header; could be released here if (gdftyp < 1000) { FILE *fid = fopen(fullfilename,"rb"); if (!fid) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "TMSiLOG: data file not found"); } else { int16_t h[3]; size_t c = fread(h, 2, 3, fid); if (h[2]==16) h[2] = 3; else if (h[2]==32) h[2] = 5; else if (h[2]==288) h[2] = 16; else h[2] = 0xffff; // this triggers the error trap if ( (c<2) || (h[0] != hdr->NS) || (((double)h[1]) != hdr->SampleRate) || (h[2] != gdftyp) ) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "TMSiLOG: Binary file corrupted"); } else { size_t sz = (size_t)hdr->NS*hdr->SPR*hdr->NRec*(GDFTYP_BITS[gdftyp]>>3); hdr->AS.rawdata = (uint8_t*)realloc(hdr->AS.rawdata,sz); c = fread(hdr->AS.rawdata, hdr->NRec, hdr->SPR*hdr->NS*GDFTYP_BITS[gdftyp]>>3, fid); if (c < sz) hdr->NRec = c; } fclose(fid); } } else if (gdftyp==0xfffe) { // double Fs; gdftyp = 17; // ascii is converted to double FILE *fid = fopen(fullfilename,"rt"); if (!fid) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "TMSiLOG: data file not found"); } else { size_t sz = (hdr->NS+1)*24; char *line = (char*) malloc(sz); // read and ignore (i.e. skip) 3 lines int c = 3; while (c>0) { if (fgetc(fid)=='\n') { c--; int ch = fgetc(fid); // skip '\r' if (ch=='\r') ungetc(ch,fid); } } // TODO: sanity checks if (0) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "TMSiLOG: Binary file corrupted"); } else { // hdr->FLAG.SWAP = 0; // no swaping required typeof(hdr->NS) k2; size_t k; hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); size_t sz = (size_t)hdr->NS * hdr->SPR * hdr->NRec * GDFTYP_BITS[gdftyp]>>3; hdr->AS.rawdata = (uint8_t*)realloc(hdr->AS.rawdata,sz); for (k=0; k < (size_t)hdr->SPR*hdr->NRec; k++) if (fgets(line,sz,fid)) { char *next; strtoul(line, &next, 10); // skip index entry for (k2=0;k2NS;k2++) *(double*)(hdr->AS.rawdata+(k*hdr->NS+k2)*sizeof(double)) = strtod(next,&next); } else { for (k2=0;k2NS;k2++) *(double*)(hdr->AS.rawdata+(k*hdr->NS+k2)*sizeof(double)) = NAN; } } free(line); fclose(fid); } } free(fullfilename); hdr->AS.length = hdr->NRec; if (VERBOSE_LEVEL>8) fprintf(stdout,"TMSi [149] \n"); hdr->AS.bpb = 0; for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (VERBOSE_LEVEL>8) fprintf(stdout,"TMSi [151] %i\n",(int)k); hc->GDFTYP = gdftyp; if (gdftyp==3) { hc->DigMax = (double)(int16_t)0x7fff; hc->DigMin = (double)(int16_t)0x8000; } else if (gdftyp==5) { hc->DigMax = (double)(int32_t)0x7fffffff; hc->DigMin = (double)(int32_t)0x80000000; } else { hc->DigMax = 1.0; hc->DigMin = 0.0; hdr->FLAG.OVERFLOWDETECTION = 0; // no overflow detection } hc->PhysMax = hc->DigMax * hc->Cal; hc->PhysMin = hc->DigMin * hc->Cal; hc->LeadIdCode = 0; hc->Transducer[0] = 0; hc->SPR = 1; // one sample per block hc->OnOff = 1; hc->HighPass = NAN; hc->LowPass = NAN; hc->Notch = NAN; hc->Impedance = INFINITY; hc->fZ = NAN; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; hc->bi = hdr->AS.bpb; hdr->AS.bpb += GDFTYP_BITS[gdftyp]>>3; } } else if (hdr->TYPE==AIFF) { // hdr->FLAG.SWAP = (__BYTE_ORDER == __LITTLE_ENDIAN); hdr->FILE.LittleEndian = 0; uint8_t *tag; uint32_t tagsize; //uint16_t gdftyp; size_t pos; tagsize = beu32p(hdr->AS.Header+4); tagsize += tagsize & 0x0001; pos = 12; tag = hdr->AS.Header+pos; while (1) { tagsize = beu32p(hdr->AS.Header+pos+4); tagsize += tagsize & 0x0001; if (!strncmp((char*)tag,"COMM",4)) { } else if (!strncmp((char*)tag,"DATA",4)) { } pos += tagsize; tag = hdr->AS.Header+pos; } /// TODO, FIXME } #if defined(WITH_WAV) || defined(WITH_AVI) || defined(WITH_RIFF) else if ((hdr->TYPE==WAV)||(hdr->TYPE==AVI)||(hdr->TYPE==RIFF)) { // hdr->FLAG.SWAP = (__BYTE_ORDER == __BIG_ENDIAN); hdr->FILE.LittleEndian = 1; uint8_t *tag; uint32_t tagsize; uint16_t gdftyp; uint16_t format=0, bits = 0; double Cal=1.0, Off=0.0; size_t pos; tagsize = leu32p(hdr->AS.Header+4); tagsize += tagsize & 0x0001; pos = 12; tag = hdr->AS.Header+pos; while (1) { tagsize = leu32p(hdr->AS.Header+pos+4); tagsize += tagsize & 0x0001; if (!strncmp((char*)tag,"fmt ",4)) { format = leu16p(hdr->AS.Header+pos+4); hdr->NS = leu16p(hdr->AS.Header+pos+4+2); hdr->SampleRate = (double)leu32p(hdr->AS.Header+pos+4+4); if (format==1) { bits = leu16p(hdr->AS.Header+pos+4+14); Cal = ldexp(1,-8*(bits/8 + ((bits%8) > 0))); if (bits <= 8) { gdftyp = 2; Off = 0.5; } else if (bits <= 16) gdftyp = 3; else if (bits <= 24) gdftyp = 255+24; else if (bits <= 32) gdftyp = 5; } else fprintf(stdout,"Warning (WAV): format not supported.\n"); } else if (!strncmp((char*)tag,"data",4)) { if (format==1) { hdr->AS.bpb = hdr->NS * ((bits/8) + ((bits%8)>0)); hdr->SPR = tagsize/hdr->AS.bpb; } } pos += tagsize; tag = hdr->AS.Header+pos; /// TODO, FIXME } } #endif else if (hdr->TYPE==ASCII_IBI) { hdr->NS = 0; hdr->NRec = 0; hdr->SPR = 1; hdr->AS.bpb = 0; ifseek(hdr,0,SEEK_SET); char line[81]; ifgets(line,80,hdr); size_t N = 0; hdr->EVENT.N = 0; while (!ifeof(hdr) && strlen(line)) { if (isdigit(line[0])) { struct tm t; int ms,rri; char *desc = NULL; #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L sscanf(line,"%02u-%02u-%02u %02u:%02u:%02u %03u %as %u", &t.tm_mday, &t.tm_mon, &t.tm_year, &t.tm_hour, &t.tm_min, &t.tm_sec, &ms, &desc, &rri); #else sscanf(line,"%02u-%02u-%02u %02u:%02u:%02u %03u %ms %u", &t.tm_mday, &t.tm_mon, &t.tm_year, &t.tm_hour, &t.tm_min, &t.tm_sec, &ms, &desc, &rri); #endif if (t.tm_year < 1970) t.tm_year += 100; t.tm_mon--; t.tm_isdst = -1; if (N+1 >= hdr->EVENT.N) { hdr->EVENT.N += max(4096,hdr->EVENT.N); hdr->EVENT.POS = (typeof(hdr->EVENT.POS)) realloc(hdr->EVENT.POS, hdr->EVENT.N*sizeof(*hdr->EVENT.POS) ); hdr->EVENT.TYP = (typeof(hdr->EVENT.TYP)) realloc(hdr->EVENT.TYP, hdr->EVENT.N*sizeof(*hdr->EVENT.TYP) ); } if (N==0) { hdr->T0 = (gdf_time)(tm_time2gdf_time(&t) + ldexp((ms-rri)/(24*3600*1e3),32)); hdr->EVENT.POS[0] = 0; hdr->EVENT.TYP[0] = 0x0501; hdr->EVENT.POS[1] = rri; hdr->EVENT.TYP[1] = 0x0501; N = 1; } else { hdr->EVENT.POS[N] = hdr->EVENT.POS[N-1] + rri; } if (!strcmp(desc,"IBI")) hdr->EVENT.TYP[N] = 0x0501; else FreeTextEvent(hdr,N,desc); ++N; if (desc) free(desc); } else { strtok(line,":"); char *v = strtok(NULL,":"); if (!strncmp(line,"File version",12)) hdr->VERSION = atof(v); else if (!hdr->FLAG.ANONYMOUS && !strncmp(line,"File version",12)) strncpy(hdr->Patient.Id,v,MAX_LENGTH_PID); } ifgets(line,80,hdr); } ifclose(hdr); hdr->EVENT.N = N; hdr->SampleRate = 1000.0; hdr->EVENT.SampleRate = 1000.0; hdr->TYPE = EVENT; hdr->data.block = NULL; hdr->data.size[0] = 0; hdr->data.size[1] = 0; } #if defined(WITH_DICOM) || defined(WITH_GDCM) || defined(WITH_DCMTK) else if (hdr->TYPE==DICOM) { fprintf(stderr,"DICOM support is very (!!!) experimental!\n"); hdr->HeadLen = count; sopen_dicom_read(hdr); return(hdr); } #endif else if (hdr->TYPE==HL7aECG || hdr->TYPE==XML) { sopen_HL7aECG_read(hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"[181] #%i\n",hdr->NS); if (hdr->AS.B4C_ERRNUM) return(hdr); // hdr->FLAG.SWAP = 0; hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); // no swapping hdr->AS.length = hdr->NRec; } #ifdef WITH_MICROMED else if (hdr->TYPE==TRC) { sopen_TRC_read(hdr); } #endif else if (hdr->TYPE==UNIPRO) { sopen_unipro_read(hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"[181] #%i\n",hdr->NS); if (hdr->AS.B4C_ERRNUM) return(hdr); // hdr->FLAG.SWAP = 0; } else if (hdr->TYPE==WCP) { fprintf(stderr,"%s (line %i) %s: WARNING WCP support is experimental!\n", __FILE__,__LINE__,__func__); const int WCP_HEADER_LENGTH=2048; if (hdr->HeadLen < WCP_HEADER_LENGTH) { hdr->AS.Header = realloc(hdr->AS.Header, WCP_HEADER_LENGTH); hdr->HeadLen += ifread(hdr->AS.Header+hdr->HeadLen, 1, WCP_HEADER_LENGTH - hdr->HeadLen, hdr); } int ADCMAX=0; char *tok = strtok(hdr->AS.Header,"\r\n"); while (tok != NULL) { char *sep = strchr(tok,'='); *sep = 0; char *val = sep+1; char *key = tok; if (!strcmp(key,"VER")) hdr->VERSION=atof(val); else if (!strcmp(key,"RTIME")) { struct tm T; #if !defined(_WIN32) strptime(val,"%d/%m/%Y %T",&T); #else char *p=val+strlen(val); do p--; while (isdigit(*p) && (p>val)); T.tm_sec = atoi(p+1); *p=0; do p--; while (isdigit(*p) && (p>val)); T.tm_min = atoi(p+1); *p=0; do p--; while (isdigit(*p) && (p>val)); T.tm_hour = atoi(p+1); *p=0; do p--; while (isdigit(*p) && (p>val)); T.tm_year = atoi(p+1); *p=0; do p--; while (isdigit(*p) && (p>val)); T.tm_mon = atoi(p+1); *p=0; do p--; while (isdigit(*p) && (p>val)); T.tm_mday = atoi(p+1); #endif hdr->T0 = tm_time2gdf_time(&T); } else if (!strcmp(key,"NC")) { hdr->NS=atoi(val); hdr->CHANNEL = realloc(hdr->CHANNEL, sizeof(CHANNEL_TYPE)*hdr->NS); } else if (!strcmp(key,"DT")) hdr->SampleRate=1.0/atof(val); else if (!strcmp(key,"ADCMAX")) ADCMAX=atoi(val); else if (!strcmp(key,"NR")) hdr->NRec=atoi(val); else if (key[0]=='Y') { int chan = atoi(key+2); CHANNEL_TYPE *hc = hdr->CHANNEL+chan; switch (key[1]) { case 'U': // YU hc->PhysDimCode = PhysDimCode(val); break; case 'N': // YN strncpy(hc->Label, val, MAX_LENGTH_LABEL+1); break; case 'G': // YG hc->Cal = atof(val); break; } } else { fprintf(stdout,"%s-WCP: %s=%s ignored\n",__func__,key,val); } tok = strtok(NULL,"\r\n"); } uint16_t gdftyp=3; if (ADCMAX==32767) gdftyp = 3; struct stat FileBuf; stat(hdr->FileName,&FileBuf); hdr->SPR = 1; typeof (hdr->NS) k; size_t bpb8=0; for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->GDFTYP = gdftyp; hc->OnOff = 1; hc->bi = bpb8>>3; hc->Off = 0.0; hc->DigMax = ADCMAX; hc->DigMin = -ADCMAX; hc->PhysMax = ADCMAX*hc->Cal; hc->PhysMin = -ADCMAX*hc->Cal; hc->SPR = 1; hc->TOffset = 0.0; hc->LowPass = 0.0; hc->HighPass= 0.0; hc->Notch = 0.0; hc->Impedance = NAN; hc->LeadIdCode = 0; hc->Transducer[0] = 0; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; hc->bufptr = NULL; bpb8 += GDFTYP_BITS[gdftyp]; } hdr->AS.bpb = bpb8>>3; hdr->NRec = (FileBuf.st_size - WCP_HEADER_LENGTH)/hdr->AS.bpb; } else if (hdr->TYPE==WG1) { uint32_t VER = leu32p(hdr->AS.Header); if (VER==0xAFFE5555) { // FIXME: this version is currently not implemented if (count < 5120) { hdr->AS.Header = realloc(hdr->AS.Header, 5120); count += ifread(hdr->AS.Header,5120-count,1,hdr); } hdr->HeadLen = count; hdr->NS = leu16p(hdr->AS.Header+0x40); hdr->NRec = leu16p(hdr->AS.Header+0x110); // total number of blocks /* uint16_t gdftyp = 1; uint16_t startblock = leu16p(hdr->AS.Header+0x112); // FIXME: */ biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "ERROR BIOSIG SOPEN(READ): WG1 0x5555FEAF format is not supported yet"); } else { hdr->SampleRate = 1e6 / leu32p(Header1+16); hdr->NS = leu16p(Header1+22); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "ERROR BIOSIG SOPEN(READ): WG1 data format is not supported yet"); } return(hdr); } #endif //ONLYGDF else { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "ERROR BIOSIG SOPEN(READ): data format is not supported"); ifclose(hdr); return(hdr); } hdr->FILE.POS = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"[189] #%i\n",hdr->NS); for (k=0; kNS; k++) { if (VERBOSE_LEVEL>7) fprintf(stdout,"[190] #%i: LeadIdCode=%i\n",(int)k,hdr->CHANNEL[k].LeadIdCode); // set HDR.PhysDim - this part will become obsolete /* k1 = hdr->CHANNEL[k].PhysDimCode; if (k1>0) hdr->CHANNEL[k].PhysDim = PhysDim3(k1); */ // set HDR.PhysDimCode if (hdr->CHANNEL[k].LeadIdCode == 0) { int k1; if (!strncmp(hdr->CHANNEL[k].Label, "MDC_ECG_LEAD_", 13)) { // MDC_ECG_LEAD_* - ignore case // for (k1=0; strcasecmp(hdr->CHANNEL[k].Label+13,LEAD_ID_TABLE[k1]) && LEAD_ID_TABLE[k1][0]; k1++) {}; if (LEAD_ID_TABLE[k1][0]) hdr->CHANNEL[k].LeadIdCode = k1; } else { for (k1=0; strcmp(hdr->CHANNEL[k].Label, LEAD_ID_TABLE[k1]) && LEAD_ID_TABLE[k1][0]; k1++) {}; if (LEAD_ID_TABLE[k1][0]) hdr->CHANNEL[k].LeadIdCode = k1; } } // based on ISO/DIS 11073-91064, EN 1064:2005+A1:2007 (E) if (200 <= hdr->CHANNEL[k].LeadIdCode) strcpy(hdr->CHANNEL[k].Label,"(Manufacturere specific)"); else if (185 <= hdr->CHANNEL[k].LeadIdCode) strcpy(hdr->CHANNEL[k].Label,"(reserved for future expansion)"); else if (hdr->CHANNEL[k].LeadIdCode) strcpy(hdr->CHANNEL[k].Label,LEAD_ID_TABLE[hdr->CHANNEL[k].LeadIdCode]); // Flawfinder: ignore } if (!hdr->EVENT.SampleRate) hdr->EVENT.SampleRate = hdr->SampleRate; /* convert2to4_event_table(hdr->EVENT); convert into canonical form if needed */ } else if (!strncmp(MODE,"w",1)) /* --- WRITE --- */ { hdr->FILE.COMPRESSION = hdr->FILE.COMPRESSION || strchr(MODE,'z'); if ( (hdr->Patient.Id==NULL) || !strlen(hdr->Patient.Id)) strcpy(hdr->Patient.Id,"00000000"); #ifndef WITHOUT_NETWORK if (!memcmp(hdr->FileName,"bscs://",7)) { // network: write to server const char *hostname = hdr->FileName+7; char *tmp= (char*)strchr(hostname,'/'); if (tmp != NULL) tmp[0]=0; // ignore terminating slash uint64_t ID=0; int sd, s; sd = bscs_connect(hostname); if (sd<0) { fprintf(stdout,"could not connect to <%s> (err %i)\n",hostname, sd); biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "could not connect to server"); return(hdr); } hdr->FILE.Des = sd; s = bscs_open(sd, &ID); s = bscs_send_hdr(sd,hdr); hdr->FILE.OPEN = 2; fprintf(stdout,"write file to bscs://%s/%016"PRIx64"\n",hostname,ID); return(hdr); } #endif // NS number of channels selected for writing typeof(hdr->NS) NS = 0; { typeof(hdr->NS) k; for (k=0; kNS; k++) if (hdr->CHANNEL[k].OnOff) NS++; } if (VERBOSE_LEVEL>7) fprintf(stdout,"sopen-W ns=%i (%s)\n",NS,GetFileTypeString(hdr->TYPE)); #ifndef ONLYGDF if ((hdr->TYPE==ASCII) || (hdr->TYPE==BIN)) { size_t k; FILE *fid = fopen(hdr->FileName,"w"); hdr->FILE.LittleEndian = 1; fprintf(fid,"#BIOSIG %s\n", (hdr->TYPE==ASCII ? "ASCII" : "BINARY")); fprintf(fid,"# comments start with #\n\n"); fprintf(fid,"Filename\t= %s\t # (this file)\n",hdr->FileName); fprintf(fid,"\n[Header 1]\n"); // fprintf(fid,"\n[Header 1]\nNumberOfChannels\t= %i\n",hdr->NS); //fprintf(fid,"NRec\t= %i\n",hdr->NRec); fprintf(fid,"Duration \t= %f\t# in seconds\n",hdr->SPR*hdr->NRec/hdr->SampleRate); struct tm *t = gdf_time2tm_time(hdr->T0); fprintf(fid,"Recording.Time \t= %04i-%02i-%02i %02i:%02i:%02i\t# YYYY-MM-DD hh:mm:ss\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); fprintf(fid,"Timezone \t= +%i min\n",hdr->tzmin); fprintf(fid,"Patient.Id \t= %s\n",hdr->Patient.Id); t = gdf_time2tm_time(hdr->Patient.Birthday); fprintf(fid,"Patient.Birthday \t= %04i-%02i-%02i %02i:%02i:%02i\t# YYYY-MM-DD hh:mm:ss\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); fprintf(fid,"Patient.Weight \t= %i\t# in [kg]\n",hdr->Patient.Weight); fprintf(fid,"Patient.Height \t= %i\t# in [cm]\n",hdr->Patient.Height); fprintf(fid,"Patient.Gender \t= %i\t# 0:Unknown, 1: Male, 2: Female, 9: Unspecified\n",hdr->Patient.Sex); fprintf(fid,"Patient.Handedness\t= %i\t# 0:Unknown, 1: Right, 2: Left, 3: Equal\n",hdr->Patient.Handedness); fprintf(fid,"Patient.Smoking \t= %i\t# 0:Unknown, 1: NO, 2: YES\n",hdr->Patient.Sex); fprintf(fid,"Patient.AlcoholAbuse\t= %i\t# 0:Unknown, 1: NO, 2: YES\n",hdr->Patient.AlcoholAbuse); fprintf(fid,"Patient.DrugAbuse \t= %i\t# 0:Unknown, 1: NO, 2: YES \n",hdr->Patient.DrugAbuse); fprintf(fid,"Patient.Medication\t= %i\t# 0:Unknown, 1: NO, 2: YES \n",hdr->Patient.Medication); fprintf(fid,"Recording.ID \t= %s\n",hdr->ID.Recording); uint8_t IPv6=0; for (k=4; k<16; k++) IPv6 |= hdr->IPaddr[k]; if (IPv6) fprintf(fid,"Recording.IPaddress \t= %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",hdr->IPaddr[0],hdr->IPaddr[1],hdr->IPaddr[2],hdr->IPaddr[3],hdr->IPaddr[4],hdr->IPaddr[5],hdr->IPaddr[6],hdr->IPaddr[7],hdr->IPaddr[8],hdr->IPaddr[9],hdr->IPaddr[10],hdr->IPaddr[11],hdr->IPaddr[12],hdr->IPaddr[13],hdr->IPaddr[14],hdr->IPaddr[15]); else fprintf(fid,"Recording.IPaddress \t= %u.%u.%u.%u\n",hdr->IPaddr[0],hdr->IPaddr[1],hdr->IPaddr[2],hdr->IPaddr[3]); fprintf(fid,"Recording.Technician\t= %s\n",hdr->ID.Technician); fprintf(fid,"Manufacturer.Name \t= %s\n",hdr->ID.Manufacturer.Name); fprintf(fid,"Manufacturer.Model\t= %s\n",hdr->ID.Manufacturer.Model); fprintf(fid,"Manufacturer.Version\t= %s\n",hdr->ID.Manufacturer.Version); fprintf(fid,"Manufacturer.SerialNumber\t= %s\n",hdr->ID.Manufacturer.SerialNumber); fprintf(fid,"\n[Header 2]\n"); k = strlen(hdr->FileName); char* fn = (char*)calloc(k + 10,1); strcpy(fn, hdr->FileName); char *e = strrchr(fn,'.'); if (e==NULL) { fn[k] = '.'; e = fn+k; } e[1] = (hdr->TYPE == ASCII ? 'a' : 's'); e+=2; for (k=0; kNS; k++) if (hdr->CHANNEL[k].OnOff) { if (hdr->FILE.COMPRESSION) sprintf(e,"%02i_gz",(int)k+1); else sprintf(e,"%02i",(int)k+1); fprintf(fid,"Filename \t= %s\n",fn); fprintf(fid,"Label \t= %s\n",hdr->CHANNEL[k].Label); if (hdr->TYPE==ASCII) fprintf(fid,"GDFTYP \t= ascii\n"); else if (hdr->TYPE==BIN) { const char *gdftyp; switch (hdr->CHANNEL[k].GDFTYP) { case 1: gdftyp="int8"; break; case 2: gdftyp="uint8"; break; case 3: gdftyp="int16"; break; case 4: gdftyp="uint16"; break; case 5: gdftyp="int32"; break; case 6: gdftyp="uint32"; break; case 7: gdftyp="int64"; break; case 8: gdftyp="uint64"; break; case 16: gdftyp="float32"; break; case 17: gdftyp="float64"; break; case 18: gdftyp="float128"; break; case 255+24: gdftyp="bit24"; break; case 511+24: gdftyp="ubit24"; break; case 255+12: gdftyp="bit12"; break; case 511+12: gdftyp="ubit12"; break; default: gdftyp = "unknown"; } fprintf(fid,"GDFTYP \t= %s\n",gdftyp); } fprintf(fid,"Transducer\t= %s\n",hdr->CHANNEL[k].Transducer); fprintf(fid,"PhysicalUnits\t= %s\n",PhysDim3(hdr->CHANNEL[k].PhysDimCode)); fprintf(fid,"PhysDimCode\t= %i\n",hdr->CHANNEL[k].PhysDimCode); fprintf(fid,"DigMax \t= %f\n",hdr->CHANNEL[k].DigMax); fprintf(fid,"DigMin \t= %f\n",hdr->CHANNEL[k].DigMin); fprintf(fid,"PhysMax \t= %g\n",hdr->CHANNEL[k].PhysMax); fprintf(fid,"PhysMin \t= %g\n",hdr->CHANNEL[k].PhysMin); fprintf(fid,"SamplingRate\t= %f\n",hdr->CHANNEL[k].SPR*hdr->SampleRate/hdr->SPR); fprintf(fid,"NumberOfSamples\t= %i\t# 0 indicates a channel with sparse samples\n",(int)(hdr->CHANNEL[k].SPR*hdr->NRec)); fprintf(fid,"HighPassFilter\t= %f\n",hdr->CHANNEL[k].HighPass); fprintf(fid,"LowPassFilter\t= %f\n",hdr->CHANNEL[k].LowPass); fprintf(fid,"NotchFilter\t= %f\n",hdr->CHANNEL[k].Notch); switch (hdr->CHANNEL[k].PhysDimCode & 0xffe0) { case 4256: // Voltage data fprintf(fid,"Impedance\t= %f\n",hdr->CHANNEL[k].Impedance); break; case 4288: // Impedance data fprintf(fid,"freqZ\t= %f\n",hdr->CHANNEL[k].fZ); break; } fprintf(fid,"PositionXYZ\t= %f\t%f\t%f\n",hdr->CHANNEL[k].XYZ[0],hdr->CHANNEL[k].XYZ[1],hdr->CHANNEL[k].XYZ[2]); // fprintf(fid,"OrientationXYZ\t= %f\t%f\t%f\n",hdr->CHANNEL[k].Orientation[0],hdr->CHANNEL[k].Orientation[1],hdr->CHANNEL[k].Orientation[2]); // fprintf(fid,"Area \t= %f\n",hdr->CHANNEL[k].Area); fprintf(fid,"\n"); hdr->CHANNEL[k].SPR *= hdr->NRec; } hdr->SPR *= hdr->NRec; hdr->NRec = 1; fprintf(fid,"[EVENT TABLE]\n"); fprintf(fid,"TYP\tPOS [s]\tDUR [s]\tCHN\tVAL/Desc"); for (k=0; kEVENT.N; k++) { fprintf(fid,"\n0x%04x\t%f\t",hdr->EVENT.TYP[k],hdr->EVENT.POS[k]/hdr->EVENT.SampleRate); // EVENT.POS uses 0-based indexing if (hdr->EVENT.DUR != NULL) { typeof(*hdr->EVENT.DUR) DUR; DUR = (hdr->EVENT.TYP[k]==0x7fff) ? 0 : hdr->EVENT.DUR[k]; fprintf(fid,"%f\t%d\t", DUR/hdr->EVENT.SampleRate, hdr->EVENT.CHN[k]); } else fprintf(fid,"\t\t"); if (hdr->EVENT.TYP[k] == 0x7fff) { typeof(hdr->NS) chan = hdr->EVENT.CHN[k] - 1; double val = dur2val(hdr->EVENT.DUR[k], hdr->CHANNEL[chan].GDFTYP); val *= hdr->CHANNEL[chan].Cal; val += hdr->CHANNEL[chan].Off; fprintf(fid,"%g\t# sparse sample ", val); // value of sparse samples } else { const char *str = GetEventDescription(hdr,k); if (str) fprintf(fid,"%s",str); } } fclose(fid); free(fn); hdr->FILE.POS = 0; } else if (hdr->TYPE==ATF) { // Write ATF hdr->HeadLen = 0; hdr->FILE.POS = 0; hdr->FILE.FID = fopen(hdr->FileName, "w"); typeof(hdr->NS) k, NS = 1; for (k = 0; k < hdr->NS; k++) { NS += (hdr->CHANNEL[k].OnOff > 0); } hdr->HeadLen += fprintf(hdr->FILE.FID, "ATF\t1.0\n%"PRIu64"u\t%u", max(0,hdr->NRec * hdr->SPR), NS + 1); char *sep = "\n"; if (getTimeChannelNumber(hdr) == 0) { hdr->HeadLen += fprintf(hdr->FILE.FID, "%s\"Time (s)\"",sep); sep = "\t"; } for (k = 0; k < hdr->NS; k++) { if (hdr->CHANNEL[k].OnOff) { hdr->HeadLen += fprintf(hdr->FILE.FID, "%s\"%s (%s)\"", sep, hdr->CHANNEL[k].Label, PhysDim3(hdr->CHANNEL[k].PhysDimCode)); sep = "\t"; } } } else if (hdr->TYPE==BrainVision) { if (VERBOSE_LEVEL>8) fprintf(stdout,"BVA-write: [210]\n"); char* tmpfile = (char*)calloc(strlen(hdr->FileName)+6,1); strcpy(tmpfile,hdr->FileName); // Flawfinder: ignore char* ext = strrchr(tmpfile,'.'); if (ext != NULL) strcpy(ext+1,"vhdr"); // Flawfinder: ignore else strcat(tmpfile,".vhdr"); // Flawfinder: ignore if (VERBOSE_LEVEL>8) fprintf(stdout,"BVA-write: [211]\n"); hdr->HeadLen = 0; FILE *fid = fopen(tmpfile,"wb"); fprintf(fid,"Brain Vision Data Exchange Header File Version 1.0\r\n"); fprintf(fid,"; Data created by BioSig4C++\r\n\r\n"); fprintf(fid,"[Common Infos]\r\n"); fprintf(fid,"DataFile=%s\r\n",hdr->FileName); fprintf(fid,"MarkerFile=%s\r\n",strcpy(strrchr(tmpfile,'.')+1,"vhdr")); fprintf(fid,"DataFormat=BINARY\r\n"); fprintf(fid,"; Data orientation: MULTIPLEXED=ch1,pt1, ch2,pt1 ...\r\n"); fprintf(fid,"DataOrientation=MULTIPLEXED\r\n"); hdr->NRec *= hdr->SPR; hdr->SPR = 1; fprintf(fid,"NumberOfChannels=%i\r\n",hdr->NS); fprintf(fid,"; Sampling interval in microseconds\r\n"); fprintf(fid,"SamplingInterval=%f\r\n\r\n",1e6/hdr->SampleRate); if (VERBOSE_LEVEL>8) fprintf(stdout,"BVA-write: [212]\n"); fprintf(fid,"[Binary Infos]\r\nBinaryFormat="); uint16_t gdftyp = 0; typeof(hdr->NS) k; for (k=0; kNS; k++) if (gdftyp < hdr->CHANNEL[k].GDFTYP) gdftyp = hdr->CHANNEL[k].GDFTYP; if (gdftyp<4) { gdftyp = 3; fprintf(fid,"INT_16"); } else { gdftyp = 16; fprintf(fid,"IEEE_FLOAT_32"); } if (VERBOSE_LEVEL>8) fprintf(stdout,"BVA-write: [214] gdftyp=%i NS=%i\n",gdftyp,hdr->NS); hdr->AS.bpb = (size_t)hdr->NS * hdr->SPR * GDFTYP_BITS[gdftyp] >> 3; fprintf(fid,"\r\n\r\n[Channel Infos]\r\n"); fprintf(fid,"; Each entry: Ch=,,\r\n"); fprintf(fid,"; ,,,NS; k++) { if (VERBOSE_LEVEL>8) fprintf(stdout,"BVA-write: [220] %i\n",k); hdr->CHANNEL[k].SPR = hdr->SPR; hdr->CHANNEL[k].GDFTYP = gdftyp; char Label[MAX_LENGTH_LABEL+1]; strcpy(Label,hdr->CHANNEL[k].Label); // Flawfinder: ignore size_t k1; for (k1=0; Label[k1]; k1++) if (Label[k1]==',') Label[k1]=1; fprintf(fid,"Ch%d=%s,,1,%s\r\n",k+1,Label,PhysDim3(hdr->CHANNEL[k].PhysDimCode)); } fprintf(fid,"\r\n\r\n[Coordinates]\r\n"); // fprintf(fid,"; Each entry: Ch=,,\n\r"); fprintf(fid,"; Each entry: Ch=,,\r\n"); for (k=0; kNS; k++) fprintf(fid,"Ch%i=%f,%f,%f\r\n",k+1,hdr->CHANNEL[k].XYZ[0],hdr->CHANNEL[k].XYZ[1],hdr->CHANNEL[k].XYZ[2]); if (VERBOSE_LEVEL>8) fprintf(stdout,"BVA-write: [222]\n"); fprintf(fid,"\r\n\r\n[Comment]\r\n\r\n"); fprintf(fid,"A m p l i f i e r S e t u p\r\n"); fprintf(fid,"============================\r\n"); fprintf(fid,"Number of channels: %i\r\n",hdr->NS); fprintf(fid,"Sampling Rate [Hz]: %f\r\n",hdr->SampleRate); fprintf(fid,"Sampling Interval [µS]: %f\r\n",1e6/hdr->SampleRate); fprintf(fid,"Channels\r\n--------\r\n"); fprintf(fid,"# Name Phys. Chn. Resolution [µV] Low Cutoff [s] High Cutoff [Hz] Notch [Hz]\n\r"); for (k=0; kNS; k++) { fprintf(fid,"\r\n%6i %13s %17i %18f",k+1,hdr->CHANNEL[k].Label,k+1,hdr->CHANNEL[k].Cal); if (hdr->CHANNEL[k].HighPass>0) fprintf(fid," %15f",1/(2*3.141592653589793238462643383279502884197169399375*hdr->CHANNEL[k].HighPass)); else fprintf(fid,"\t-"); if (hdr->CHANNEL[k].LowPass>0) fprintf(fid," %15f",hdr->CHANNEL[k].LowPass); else fprintf(fid,"\t-"); if (hdr->CHANNEL[k].Notch>0) fprintf(fid," %f",hdr->CHANNEL[k].Notch); else fprintf(fid,"\t-"); } fprintf(fid,"\r\n\r\nImpedance [kOhm] :\r\n\r\n"); for (k=0; kNS; k++) if (isnan(hdr->CHANNEL[k].Impedance)) fprintf(fid,"%s:\t\t-\r\n",hdr->CHANNEL[k].Label); else fprintf(fid,"%s:\t\t%f\r\n",hdr->CHANNEL[k].Label,hdr->CHANNEL[k].Impedance); fclose(fid); strcpy(strrchr(tmpfile,'.')+1,"vmrk"); fid = fopen(tmpfile,"wb"); fprintf(fid,"Brain Vision Data Exchange Marker File, Version 1.0\r\n"); fprintf(fid,"; Data created by BioSig4C++\r\n\r\n"); fprintf(fid,"[Common Infos]\r\n"); fprintf(fid,"DataFile=%s\r\n\r\n",hdr->FileName); fprintf(fid,"[Marker Infos]\r\n\r\n"); fprintf(fid,"; Each entry: Mk=,,,\r\n"); fprintf(fid,"; , \r\n"); fprintf(fid,"; Fields are delimited by commas, some fields might be omitted (empty).\r\n"); fprintf(fid,"; Commas in type or description text are coded as \"\\1\".\r\n"); struct tm *T0 = gdf_time2tm_time(hdr->T0); uint32_t us = (hdr->T0*24*3600 - floor(hdr->T0*24*3600))*1e6; fprintf(fid,"Mk1=New Segment,,1,1,0,%04u%02u%02u%02u%02u%02u%06u",T0->tm_year+1900,T0->tm_mon+1,T0->tm_mday,T0->tm_hour,T0->tm_min,T0->tm_sec,us); // 20081002150147124211 if ((hdr->EVENT.DUR==NULL) && (hdr->EVENT.CHN==NULL)) for (k=0; kEVENT.N; k++) { fprintf(fid,"\r\nMk%i=,0x%04x,%u,1,0",k+2,hdr->EVENT.TYP[k],hdr->EVENT.POS[k]+1); // convert to 1-based indexing } else for (k=0; kEVENT.N; k++) { fprintf(fid,"\r\nMk%i=,0x%04x,%u,%u,%u",k+2,hdr->EVENT.TYP[k],hdr->EVENT.POS[k]+1,hdr->EVENT.DUR[k],hdr->EVENT.CHN[k]); // convert EVENT.POS to 1-based indexing } fclose(fid); free(tmpfile); if (VERBOSE_LEVEL>8) fprintf(stdout,"BVA-write: [290] %s %s\n",tmpfile,hdr->FileName); } else if (hdr->TYPE==CFWB) { hdr->HeadLen = 68 + NS*96; hdr->AS.Header = (uint8_t*)malloc(hdr->HeadLen); uint8_t* Header2 = hdr->AS.Header+68; memset(hdr->AS.Header,0,hdr->HeadLen); memcpy(hdr->AS.Header,"CFWB\1\0\0\0",8); lef64a(1/hdr->SampleRate, hdr->AS.Header+8); struct tm *t = gdf_time2tm_time(hdr->T0); leu32a(t->tm_year + 1900, hdr->AS.Header+16); leu32a(t->tm_mon + 1, hdr->AS.Header+20); leu32a(t->tm_mday, hdr->AS.Header+24); leu32a(t->tm_hour, hdr->AS.Header+28); leu32a(t->tm_min, hdr->AS.Header+32); lef64a(t->tm_sec, hdr->AS.Header+36); lef64a(0.0, hdr->AS.Header+44); // pretrigger time leu32a(NS, hdr->AS.Header+52); hdr->NRec *= hdr->SPR; hdr->SPR = 1; leu32a(hdr->NRec, hdr->AS.Header+56); // number of samples lei32a(0, hdr->AS.Header+60); // 1: time channel int32_t gdftyp = 3; // 1:double, 2:float, 3: int16; see CFWB_GDFTYP too. typeof(hdr->NS) k,k2; for (k=0; kNS; k++) if (hdr->CHANNEL[k].OnOff) { /* if int16 is not sufficient, use float or double */ if (hdr->CHANNEL[k].GDFTYP>16) gdftyp = min(gdftyp,1); // double else if (hdr->CHANNEL[k].GDFTYP>3) gdftyp = min(gdftyp,2); // float } lei32a(gdftyp, hdr->AS.Header+64); // 1: double, 2: float, 3:short for (k=0,k2=0; kNS; k++) if (hdr->CHANNEL[k].OnOff) { hdr->CHANNEL[k].SPR = 1; hdr->CHANNEL[k].GDFTYP = CFWB_GDFTYP[gdftyp-1]; const char *tmpstr; if (hdr->CHANNEL[k].LeadIdCode) tmpstr = LEAD_ID_TABLE[hdr->CHANNEL[k].LeadIdCode]; else tmpstr = hdr->CHANNEL[k].Label; size_t len = strlen(tmpstr); memcpy(Header2+96*k2, tmpstr, min(len,32)); tmpstr = PhysDim3(hdr->CHANNEL[k].PhysDimCode); if (tmpstr != NULL) { len = strlen(tmpstr)+1; memcpy(Header2+96*k2+32, tmpstr, min(len,32)); } lef64a(hdr->CHANNEL[k].Cal, Header2+96*k2+64); lef64a(hdr->CHANNEL[k].Off, Header2+96*k2+72); lef64a(hdr->CHANNEL[k].PhysMax, Header2+96*k2+80); lef64a(hdr->CHANNEL[k].PhysMin, Header2+96*k2+88); k2++; } } else #endif //ONLYGDF if ((hdr->TYPE==GDF) || (hdr->TYPE==GDF1)) { /* use of GDF1 is deprecated, instead hdr->TYPE=GDF and hdr->VERSION=1.25 should be used. a test and a warning is about this is implemented within struct2gdfbin */ struct2gdfbin(hdr); size_t bpb8 = 0; typeof(hdr->NS) k; for (k=0, hdr->AS.bpb=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->bi8 = bpb8; hc->bi = bpb8>>3; if (hc->OnOff) bpb8 += (GDFTYP_BITS[hc->GDFTYP] * hc->SPR); } hdr->AS.bpb8 = bpb8; hdr->AS.bpb = bpb8>>3; if (bpb8 & 0x07) { // each block must use whole number of bytes hdr->AS.bpb++; hdr->AS.bpb8 = hdr->AS.bpb<<3; } if (VERBOSE_LEVEL>7) fprintf(stdout,"GDFw h3\n"); } #ifndef ONLYGDF else if ((hdr->TYPE==EDF) || (hdr->TYPE==BDF)) { hdr->HeadLen = (NS+1)*256; hdr->AS.Header = (uint8_t*)malloc(hdr->HeadLen); char* Header2 = (char*)hdr->AS.Header+256; memset(Header1,' ',hdr->HeadLen); if (hdr->TYPE==BDF) { Header1[0] = 255; memcpy(Header1+1,"BIOSEMI",7); } else { Header1[0] = '0'; } /* obsolete tt = gdf_time2t_time(hdr->Patient.Birthday); if (hdr->Patient.Birthday>1) strftime(tmp,81,"%d-%b-%Y",localtime(&tt)); */ char tmp[81]; struct tm *t = gdf_time2tm_time(hdr->Patient.Birthday); if (hdr->Patient.Birthday>1) strftime(tmp,81,"%02d-%b-%04Y",t); else strcpy(tmp,"X"); if (strlen(hdr->Patient.Id) > 0) { size_t k; for (k=0; hdr->Patient.Id[k]; k++) if (isspace(hdr->Patient.Id[k])) hdr->Patient.Id[k] = '_'; } char cmd[256]; if (!hdr->FLAG.ANONYMOUS) snprintf(cmd,MAX_LENGTH_PID+1,"%s %c %s %s",hdr->Patient.Id,GENDER[hdr->Patient.Sex],tmp,hdr->Patient.Name); else snprintf(cmd,MAX_LENGTH_PID+1,"%s %c %s X",hdr->Patient.Id,GENDER[hdr->Patient.Sex],tmp); memcpy(Header1+8, cmd, strlen(cmd)); t = gdf_time2tm_time(hdr->T0); if (hdr->T0>1) strftime(tmp,81,"%02d-%b-%04Y",t); else strcpy(tmp,"X"); char *tmpstr = hdr->ID.Technician; if (!tmpstr || !strlen(tmp)) tmpstr = "X"; size_t len = snprintf(cmd,sizeof(cmd),"Startdate %s X %s ", tmp, tmpstr); memcpy(Header1+88, cmd, len); memcpy(Header1+88+len, &hdr->ID.Equipment, 8); t = gdf_time2tm_time(hdr->T0); strftime(tmp,81,"%d.%m.%y%H.%M.%S",t); memcpy(Header1+168, tmp, 16); len = sprintf(tmp,"%i",hdr->HeadLen); if (len>8) fprintf(stderr,"Warning: HeaderLength is (%s) too long (%i>8).\n",tmp,(int)len); memcpy(Header1+184, tmp, len); memcpy(Header1+192, "EDF+C ", 5); len = sprintf(tmp,"%u",(int)hdr->NRec); if (len>8) fprintf(stderr,"Warning: NRec is (%s) too long (%i>8).\n",tmp,(int)len); memcpy(Header1+236, tmp, len); len = sprintf(tmp,"%f",hdr->SPR/hdr->SampleRate); if (len>8) fprintf(stderr,"Warning: Duration is (%s) too long (%i>8).\n",tmp,(int)len); memcpy(Header1+244, tmp, len); len = sprintf(tmp,"%i",NS); if (len>4) fprintf(stderr,"Warning: NS is (%s) too long (%i>4).\n",tmp,(int)len); memcpy(Header1+252, tmp, len); typeof(hdr->NS) k,k2; for (k=0,k2=0; kNS; k++) if (hdr->CHANNEL[k].OnOff) { const char *tmpstr; if (hdr->CHANNEL[k].LeadIdCode) tmpstr = LEAD_ID_TABLE[hdr->CHANNEL[k].LeadIdCode]; else tmpstr = hdr->CHANNEL[k].Label; len = strlen(tmpstr); if (len>16) //fprintf(stderr,"Warning: Label (%s) of channel %i is to long.\n",hdr->CHANNEL[k].Label,k); fprintf(stderr,"Warning: Label of channel %i,%i is too long (%i>16).\n",k,k2, (int)len); memcpy(Header2+16*k2,tmpstr,min(len,16)); len = strlen(hdr->CHANNEL[k].Transducer); if (len>80) fprintf(stderr,"Warning: Transducer of channel %i,%i is too long (%i>80).\n",k,k2, (int)len); memcpy(Header2+80*k2 + 16*NS,hdr->CHANNEL[k].Transducer,min(len,80)); tmpstr = PhysDim3(hdr->CHANNEL[k].PhysDimCode); if (tmpstr) { len = strlen(tmpstr); if (len>8) fprintf(stderr,"Warning: Physical Dimension (%s) of channel %i is too long (%i>8).\n",tmpstr,k,(int)len); memcpy(Header2 + 8*k2 + 96*NS, tmpstr, min(len,8)); } if (ftoa8(tmp,hdr->CHANNEL[k].PhysMin)) fprintf(stderr,"Warning: PhysMin (%f)(%s) of channel %i does not fit into 8 bytes of EDF header.\n",hdr->CHANNEL[k].PhysMin,tmp,k); memcpy(Header2 + 8*k2 + 104*NS, tmp, strlen(tmp)); if (ftoa8(tmp,hdr->CHANNEL[k].PhysMax)) fprintf(stderr,"Warning: PhysMax (%f)(%s) of channel %i does not fit into 8 bytes of EDF header.\n",hdr->CHANNEL[k].PhysMax,tmp,k); memcpy(Header2 + 8*k2 + 112*NS, tmp, strlen(tmp)); if (ftoa8(tmp,hdr->CHANNEL[k].DigMin)) fprintf(stderr,"Warning: DigMin (%f)(%s) of channel %i does not fit into 8 bytes of EDF header.\n",hdr->CHANNEL[k].DigMin,tmp,k); memcpy(Header2 + 8*k2 + 120*NS, tmp, strlen(tmp)); if (ftoa8(tmp,hdr->CHANNEL[k].DigMax)) fprintf(stderr,"Warning: DigMax (%f)(%s) of channel %i does not fit into 8 bytes of EDF header.\n",hdr->CHANNEL[k].DigMax,tmp,k); memcpy(Header2 + 8*k2 + 128*NS, tmp, strlen(tmp)); if (hdr->CHANNEL[k].Notch>0) len = sprintf(tmp,"HP:%fHz LP:%fHz Notch:%fHz",hdr->CHANNEL[k].HighPass,hdr->CHANNEL[k].LowPass,hdr->CHANNEL[k].Notch); else len = sprintf(tmp,"HP:%fHz LP:%fHz",hdr->CHANNEL[k].HighPass,hdr->CHANNEL[k].LowPass); memcpy(Header2+ 80*k2 + 136*NS,tmp,min(80,len)); len = sprintf(tmp,"%i",hdr->CHANNEL[k].SPR); if (len>8) fprintf(stderr,"Warning: SPR (%s) of channel %i is to long (%i)>8.\n",tmp,k,(int)len); memcpy(Header2+ 8*k2 + 216*NS,tmp,min(8,len)); hdr->CHANNEL[k].GDFTYP = ( (hdr->TYPE != BDF) ? 3 : 255+24); k2++; } } else if (hdr->TYPE==HL7aECG) { sopen_HL7aECG_write(hdr); // hdr->FLAG.SWAP = 0; hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); // no byte-swapping } else if (hdr->TYPE==MFER) { uint8_t tag; size_t len, curPos=0; hdr->HeadLen = 32+128+3*6+3 +80000; hdr->AS.Header = (uint8_t*)malloc(hdr->HeadLen); memset(Header1, ' ', hdr->HeadLen); hdr->FILE.LittleEndian = 0; fprintf(stderr,"Warning SOPEN(MFER): write support for MFER format under construction\n"); /* FIXME & TODO: known issues: Label Sampling Rate HeadLen Encoding of data block */ // tag 64: preamble // Header1[curPos] = 64; // len =32; curPos = 34; strncpy(Header1,"@ MFER ",curPos); // Header1[curPos+1] = len; // curPos = len+2; if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 711]:\n"); // tag 23: Manufacturer tag = 23; Header1[curPos] = tag; { char *str = Header1+curPos+2; strncpy(str, hdr->ID.Manufacturer.Name, MAX_LENGTH_MANUF); size_t l2,l1 = strlen(str); l2 = (hdr->ID.Manufacturer.Model==NULL) ? MAX_LENGTH_MANUF*2 : strlen(hdr->ID.Manufacturer.Model); str[l1++]='^'; if (l1+l2 <= MAX_LENGTH_MANUF) { memcpy(str+l1, hdr->ID.Manufacturer.Model, l2); l1 += l2; } l2 = (hdr->ID.Manufacturer.Version==NULL) ? MAX_LENGTH_MANUF*2 : strlen(hdr->ID.Manufacturer.Version); str[l1++]='^'; if (l1+l2 <= MAX_LENGTH_MANUF) { memcpy(str+l1, hdr->ID.Manufacturer.Version, l2); l1 += l2; } l2 = (hdr->ID.Manufacturer.SerialNumber==NULL) ? MAX_LENGTH_MANUF*2 : strlen(hdr->ID.Manufacturer.SerialNumber); str[l1++]='^'; if (l1+l2 <= MAX_LENGTH_MANUF) { memcpy(str+l1, hdr->ID.Manufacturer.SerialNumber, l2); l1 += l2; } len = min(l1, MAX_LENGTH_MANUF); str[len]=0; } Header1[curPos] = tag; if (len<128) { hdr->AS.Header[curPos+1] = len; curPos += len+2; } else fprintf(stderr,"Warning MFER(W) Tag23 (manufacturer) too long len=%i>128\n",(int)len); if (VERBOSE_LEVEL>8) fprintf(stdout,"Write MFER: tag=%i,len%i,curPos=%i\n",tag,(int)len,(int)curPos); // tag 1: Endianity // use default BigEndianity if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 720-4]:\n"); // tag 4: SPR tag = 4; len = sizeof(uint32_t); Header1[curPos++] = tag; Header1[curPos++] = len; beu32a(hdr->SPR, hdr->AS.Header+curPos); curPos += len; if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 720-5]:\n"); // tag 5: NS tag = 5; len = sizeof(uint16_t); Header1[curPos++] = tag; Header1[curPos++] = len; beu16a(hdr->NS, hdr->AS.Header+curPos); curPos += len; if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 720-6]:\n"); // tag 6: NRec tag = 6; len = sizeof(uint32_t); Header1[curPos++] = tag; Header1[curPos++] = len; beu32a(hdr->NRec, hdr->AS.Header+curPos); curPos += len; if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 720-8]:\n"); // tag 8: Waveform: unidentified tag = 8; len = sizeof(uint8_t); Header1[curPos++] = tag; Header1[curPos++] = len; *(Header1+curPos) = 0; // unidentified curPos += len; if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 720-129]:\n"); // tag 129: Patient Name if (!hdr->FLAG.ANONYMOUS) { tag = 129; len = strlen(hdr->Patient.Name); Header1[curPos++] = tag; Header1[curPos++] = len; strcpy(Header1+curPos,hdr->Patient.Name); curPos += len; } // tag 130: Patient Id tag = 130; len = strlen(hdr->Patient.Id); Header1[curPos++] = tag; Header1[curPos++] = len; strcpy(Header1+curPos,hdr->Patient.Id); curPos += len; // tag 131: Patient Age if (hdr->Patient.Birthday>0) { tag = 131; len = 7; struct tm *t = gdf_time2tm_time(hdr->Patient.Birthday); hdr->AS.Header[curPos++] = tag; hdr->AS.Header[curPos++] = len; hdr->AS.Header[curPos] = (uint8_t)((hdr->T0 - hdr->Patient.Birthday)/365.25); double tmpf64 = (hdr->T0 - hdr->Patient.Birthday); tmpf64 -= 365.25*floor(tmpf64/365.25); beu16a((uint16_t)tmpf64, Header1+curPos+1); beu16a(t->tm_year+1900, Header1+curPos+3); hdr->AS.Header[curPos+5] = (t->tm_mon+1); hdr->AS.Header[curPos+6] = (t->tm_mday); curPos += len; } if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 720-132]:\n"); // tag 132: Patient Sex tag = 132; Header1[curPos] = tag; Header1[curPos+1] = 1; Header1[curPos+2] = hdr->Patient.Sex; curPos += 3; // tag 133: Recording time tag = 133; len = 11; { struct tm *t = gdf_time2tm_time(hdr->T0); hdr->AS.Header[curPos++] = tag; hdr->AS.Header[curPos++] = len; beu16a(t->tm_year+1900, hdr->AS.Header+curPos); hdr->AS.Header[curPos+2] = (uint8_t)(t->tm_mon+1); hdr->AS.Header[curPos+3] = (uint8_t)(t->tm_mday); hdr->AS.Header[curPos+4] = (uint8_t)(t->tm_hour); hdr->AS.Header[curPos+5] = (uint8_t)(t->tm_min); hdr->AS.Header[curPos+6] = (uint8_t)(t->tm_sec); memset(hdr->AS.Header+curPos+7, 0, 4); curPos += len; } // tag 9: LeadId // tag 10: gdftyp // tag 11: SampleRate // tag 12: Cal // tag 13: Off hdr->HeadLen = curPos; // tag 63: channel-specific settings if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 720-63]:\n"); tag = 63; size_t ch; for (ch=0; chNS; ch++) { if (VERBOSE_LEVEL>8) fprintf(stdout,"[MFER 720-63 #%i/%i %i]:\n",(int)ch,hdr->NS,hdr->CHANNEL[ch].LeadIdCode); // FIXME: this is broken len = 0; Header1[curPos++] = tag; if (ch<128) Header1[curPos++] = ch; else { Header1[curPos++] = (ch >> 7) | 0x80; Header1[curPos++] = (ch && 0x7f); } // tag1 9: LeadId size_t ix = curPos; size_t len1 = 0; Header1[ix++] = 9; if (hdr->CHANNEL[ch].LeadIdCode>0) { hdr->AS.Header[ix++] = 2; leu16a(hdr->CHANNEL[ch].LeadIdCode, hdr->AS.Header+ix); len1 = 2; } else { len1 = strlen(hdr->CHANNEL[ch].Label); Header1[ix++] = len1; strcpy(Header1+ix, hdr->CHANNEL[ch].Label); } // tag1 10: gdftyp // tag1 11: SampleRate // tag1 12: Cal // tag1 13: Off len += len1+ix-curPos; hdr->AS.Header[curPos] = len; curPos += len+curPos; } // tag 30: data } else if (hdr->TYPE==SCP_ECG) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i) %s -> SOPEN_SCP_WRITE v%f\n",__FILE__,__LINE__,__func__,hdr->VERSION); sopen_SCP_write(hdr); if (hdr->AS.B4C_ERRNUM) return(hdr); } #ifdef WITH_TMSiLOG else if (hdr->TYPE==TMSiLOG) { // ###FIXME: writing of TMSi-LOG file is experimental and not completed FILE *fid = fopen(hdr->FileName,"wb"); fprintf(fid,"FileId=TMSi PortiLab sample log file\n\rVersion=0001\n\r",NULL); struct tm *t = gdf_time2tm_time(hdr->T0); fprintf(fid,"DateTime=%04d/02d/02d-02d:02d:02d\n\r",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); fprintf(fid,"Format=Float32\n\rLength=%f\n\rSignals=%04i\n\r",hdr->NRec*hdr->SPR/hdr->SampleRate,hdr->NS); const char* fn = strrchr(hdr->FileName,FILESEP); if (!fn) fn=hdr->FileName; size_t len = strcspn(fn,"."); char* fn2 = (char*)malloc(len+1); strncpy(fn2,fn,len); fn2[len]=0; for (k=0; kNS; k++) { fprintf(fid,"Signal%04d.Name=%s\n\r",k+1,hdr->CHANNEL[k].Label); fprintf(fid,"Signal%04d.UnitName=%s\n\r",k+1,PhysDim3(hdr->CHANNEL[k].PhysDimCode)); fprintf(fid,"Signal%04d.Resolution=%f\n\r",k+1,hdr->CHANNEL[k].Cal); fprintf(fid,"Signal%04d.StoreRate=%f\n\r",k+1,hdr->SampleRate); fprintf(fid,"Signal%04d.File=%s.asc\n\r",k+1,fn2); fprintf(fid,"Signal%04d.Index=%04d\n\r",k+1,k+1); } fprintf(fid,"\n\r\n\r"); fclose(fid); // ###FIXME: this belongs into SWRITE // write data file fn2 = (char*) realloc(fn2, strlen(hdr->FileName)+5); strcpy(fn2,hdr->FileName); // Flawfinder: ignore strcpy(strrchr(fn2,'.'),".asc"); // Flawfinder: ignore // hdr->FileName = fn2; fid = fopen(fn2,"wb"); fprintf(fid,"%d\tHz\n\r\n\rN",hdr->SampleRate); for (k=0; kNS; k++) { fprintf(fid,"\t%s(%s)", hdr->CHANNEL[k].Label, PhysDim3(hdr->CHANNEL[k].PhysDimCode)); } for (k1=0; k1SPR*hdr->NRec; k1++) { fprintf(fid,"\n%i",k1); for (k=0; kNS; k++) { // TODO: Row/Column ordering fprintf(fid,"\t%f",hdr->data.block[]); } } fclose(fid); free(fn2); } #endif // WITH_TMSiLOG #endif //ONLYGDF else { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Writing of format not supported"); return(NULL); } if ((hdr->TYPE != ASCII) && (hdr->TYPE != ATF) && (hdr->TYPE != BIN) && (hdr->TYPE != HL7aECG) && (hdr->TYPE != TMSiLOG)){ hdr = ifopen(hdr,"wb"); if (!hdr->FILE.COMPRESSION && (hdr->FILE.FID == NULL) ) { biosigERROR(hdr, B4C_CANNOT_WRITE_FILE, "Unable to open file for writing"); return(NULL); } #ifdef ZLIB_H else if (hdr->FILE.COMPRESSION && (hdr->FILE.gzFID == NULL) ){ biosigERROR(hdr, B4C_CANNOT_WRITE_FILE, "Unable to open file for writing"); return(NULL); } #endif if(hdr->TYPE != SCP_ECG){ ifwrite(Header1, sizeof(char), hdr->HeadLen, hdr); } hdr->FILE.OPEN = 2; hdr->FILE.POS = 0; } size_t bpb8 = 0; #ifndef ONLYGDF if (hdr->TYPE==AINF) { hdr->AS.bpb = 4; bpb8 = 32; } else #endif //ONLYGDF hdr->AS.bpb = 0; typeof(hdr->NS) k; for (k=0, hdr->SPR = 1; k < hdr->NS; k++) { hdr->CHANNEL[k].bi = bpb8>>3; hdr->CHANNEL[k].bi8 = bpb8; if (hdr->CHANNEL[k].OnOff) { bpb8 += (GDFTYP_BITS[hdr->CHANNEL[k].GDFTYP] * hdr->CHANNEL[k].SPR); if (hdr->CHANNEL[k].SPR > 0) // ignore sparse channels hdr->SPR = lcm(hdr->SPR, hdr->CHANNEL[k].SPR); } } hdr->AS.bpb8 = bpb8; hdr->AS.bpb = bpb8>>3; if ((hdr->TYPE==GDF) && (bpb8 & 0x07)) { // each block must use whole number of bytes hdr->AS.bpb++; hdr->AS.bpb8 = hdr->AS.bpb<<3; } } // end of branch "write" #ifndef ANDROID if (VERBOSE_LEVEL > 7) { //There is a way to send messages in Android to log, but I dont know it yet. Stoyan //There is problem with some files printing deubg info. //And debug in NDK is bad idea in Android if (hdr->FILE.POS != 0) fprintf(stdout,"Debugging Information: (Format=%d) %s FILE.POS=%d is not zero.\n",hdr->TYPE,hdr->FileName,(int)hdr->FILE.POS); typeof(hdr->NS) k; for (k=0; kNS; k++) if (GDFTYP_BITS[hdr->CHANNEL[k].GDFTYP] % 8) { if (hdr->TYPE==alpha) ; // 12bit alpha is well tested else if ((__BYTE_ORDER == __LITTLE_ENDIAN) && !hdr->FILE.LittleEndian) fprintf(stdout,"GDFTYP=%i [12bit LE/BE] not well tested\n",hdr->CHANNEL[k].GDFTYP); else if ((__BYTE_ORDER == __LITTLE_ENDIAN) && hdr->FILE.LittleEndian) fprintf(stdout,"GDFTYP=%i [12bit LE/LE] not well tested\n",hdr->CHANNEL[k].GDFTYP); else if ((__BYTE_ORDER == __BIG_ENDIAN) && hdr->FILE.LittleEndian) fprintf(stdout,"GDFTYP=%i [12bit BE/LE] not well tested\n",hdr->CHANNEL[k].GDFTYP); else if ((__BYTE_ORDER == __BIG_ENDIAN) && !hdr->FILE.LittleEndian) fprintf(stdout,"GDFTYP=%i [12bit BE/BE] not well tested\n",hdr->CHANNEL[k].GDFTYP); } } if (VERBOSE_LEVEL>7) fprintf(stdout,"sopen{return} %i %s\n", hdr->AS.B4C_ERRNUM,GetFileTypeString(hdr->TYPE) ); #endif return(hdr); } // end of SOPEN /**************************************************************************** bpb8_collapsed_rawdata computes the bytes per block when rawdata is collapsed ****************************************************************************/ size_t bpb8_collapsed_rawdata(HDRTYPE *hdr) { size_t bpb8=0; CHANNEL_TYPE *CHptr; typeof(hdr->NS) k; for (k=0; kNS; k++) { CHptr = hdr->CHANNEL+k; if (CHptr->OnOff) bpb8 += (size_t)CHptr->SPR*GDFTYP_BITS[CHptr->GDFTYP]; } return(bpb8); } /* *************************************************************************** collapse raw data this function is used to remove obsolete channels (e.g. status and annotation channels because the information as been already converted into the event table) that are not needed in GDF. if buf==NULL, hdr->AS.rawdata will be collapsed ****************************************************************************/ void collapse_rawdata(HDRTYPE *hdr, void *buf, size_t count) { CHANNEL_TYPE *CHptr; size_t bpb, k4; size_t bi1=0, bi2=0, SZ; int num3Segments=0,k1; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): started\n",__func__,__LINE__); bpb = bpb8_collapsed_rawdata(hdr); if (bpb == hdr->AS.bpb<<3) return; // no collapsing needed if ((bpb & 7) || (hdr->AS.bpb8 & 7)) { biosigERROR(hdr, B4C_RAWDATA_COLLAPSING_FAILED, "collapse_rawdata: does not support bitfields"); } bpb >>= 3; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): bpb=%i/%i\n",__func__,__LINE__,(int)bpb,hdr->AS.bpb); if (buf == NULL) { buf = hdr->AS.rawdata; count = hdr->AS.length; } // prepare idxlist for copying segments within a single block (i.e. record) size_t *idxList= alloca(3*hdr->NS*sizeof(size_t)); CHptr = hdr->CHANNEL; while (1) { SZ = 0; while (!CHptr->OnOff && (CHptr < hdr->CHANNEL+hdr->NS) ) { SZ += (size_t)CHptr->SPR * GDFTYP_BITS[CHptr->GDFTYP]; if (SZ & 7) biosigERROR(hdr, B4C_RAWDATA_COLLAPSING_FAILED, "collapse_rawdata: does not support bitfields"); CHptr++; } bi1 += SZ; SZ = 0; while (CHptr->OnOff && (CHptr < hdr->CHANNEL+hdr->NS)) { SZ += (size_t)CHptr->SPR * GDFTYP_BITS[CHptr->GDFTYP]; if (SZ & 7) biosigERROR(hdr, B4C_RAWDATA_COLLAPSING_FAILED, "collapse_rawdata: does not support bitfields"); CHptr++; } if (SZ > 0) { SZ >>= 3; idxList[num3Segments] = bi2; // offset of destination idxList[num3Segments+1] = bi1; // offset of source idxList[num3Segments+2] = SZ; // size num3Segments += 3; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): #%i src:%i dest:%i size:%i\n",__func__,__LINE__,num3Segments/3,(int)bi1,(int)bi2,(int)SZ); } if (CHptr >= hdr->CHANNEL+hdr->NS) break; bi1 += SZ; bi2 += SZ; } for (k4 = 0; k4 < count; k4++) { void *src = buf + k4*hdr->AS.bpb; void *dest = buf + k4*bpb; for (k1=0; k1 < num3Segments; k1+=3) if ((dest + idxList[k1]) != (src + idxList[k1+1])) memcpy(dest + idxList[k1], src + idxList[k1+1], idxList[k1+2]); } if (buf == hdr->AS.rawdata) { hdr->AS.flag_collapsed_rawdata = 1; // rawdata is now "collapsed" } } /****************************************************************************/ /** SREAD_RAW : segment-based **/ /****************************************************************************/ size_t sread_raw(size_t start, size_t length, HDRTYPE* hdr, char flag, void *buf, size_t bufsize) { /* * Reads LENGTH blocks with HDR.AS.bpb BYTES each * (and HDR.SPR samples). * Rawdata is available in hdr->AS.rawdata. * * start <0: read from current position * >=0: start reading from position start * length : try to read length blocks * * flag!=0 : unused channels (those channels k where HDR.CHANNEL[k].OnOff==0) * are collapsed * * for reading whole data section, bufsize must be length*hdr->AS.bpb (also if flag is set) */ if (buf != NULL) { if (length > (bufsize / hdr->AS.bpb)) { fprintf(stderr, "Warning %s (line %i): bufsize is not large enough for converting %i blocks.\n", \ __func__, __LINE__, (int)length); length = bufsize / hdr->AS.bpb; } if ( (hdr->AS.first <= start) && ((start+length) <= (hdr->AS.first+hdr->AS.length)) ) { /**** copy from rawData if available: - better performance - required for some data formats (e.g. CFS, when hdr->AS.rawdata is populated in SOPEN) ****/ if (!hdr->AS.flag_collapsed_rawdata) { memcpy(buf, hdr->AS.rawdata + (start - hdr->AS.first) * hdr->AS.bpb, bufsize); if (flag) collapse_rawdata(hdr, buf, length); return (length); } else if (flag) { size_t bpb = bpb8_collapsed_rawdata(hdr)>>3; memcpy(buf, hdr->AS.rawdata + (start - hdr->AS.first) * bpb, bufsize); return (bufsize / bpb); } // else if (hdr->AS.flag_collapsed_rawdata && !flag) is handled below } } if (hdr->AS.flag_collapsed_rawdata && !flag) hdr->AS.length = 0; // force reloading of data size_t count, nelem; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): start=%d length=%d nrec=%d POS=%d bpb=%i\n",__func__,__LINE__, \ (int)start,(int)length,(int)hdr->NRec, (int)hdr->FILE.POS, hdr->AS.bpb); if ((nrec_t)start > hdr->NRec) return(0); else if ((ssize_t)start < 0) start = hdr->FILE.POS; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %d %d %d %d\n",__func__,__LINE__, (int)start, (int)length, (int)hdr->NRec, (int)hdr->FILE.POS); // limit reading to end of data block if (hdr->NRec<0) nelem = length; else if (start >= (size_t)hdr->NRec) nelem = 0; else nelem = min(length, hdr->NRec - start); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %i %i %i %p\n",__func__,__LINE__, \ (int)start, (int)length, (int)nelem, (int)hdr->NRec, (int)hdr->FILE.POS, hdr->AS.rawdata); if ( (buf == NULL) && (start >= hdr->AS.first) && ( (start + nelem) <= (hdr->AS.first + hdr->AS.length) ) ) { // Caching, no file-IO, data is already loaded into hdr->AS.rawdata hdr->FILE.POS = start; count = nelem; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): \n",__func__,__LINE__); } #ifndef WITHOUT_NETWORK else if (hdr->FILE.Des > 0) { // network connection int s = bscs_requ_dat(hdr->FILE.Des, start, length,hdr); count = hdr->AS.length; if (VERBOSE_LEVEL>7) fprintf(stdout,"sread-raw from network: 222 count=%i\n",(int)count); } #endif else { assert(hdr->TYPE != CFS); // CFS data has been already cached in SOPEN assert(hdr->TYPE != SMR); // CFS data has been already cached in SOPEN if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): \n",__func__,__LINE__); // read required data block(s) if (ifseek(hdr, start*hdr->AS.bpb + hdr->HeadLen, SEEK_SET)<0) { if (VERBOSE_LEVEL>7) fprintf(stdout,"--%i %i %i %i \n",(int)(start*hdr->AS.bpb + hdr->HeadLen), (int)start, (int)hdr->AS.bpb, (int)hdr->HeadLen); return(0); } else hdr->FILE.POS = start; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): bpb=%i\n",__func__,__LINE__,(int)hdr->AS.bpb); // allocate AS.rawdata void* tmpptr = buf; if (buf == NULL) { tmpptr = realloc(hdr->AS.rawdata, hdr->AS.bpb*nelem); if ((tmpptr!=NULL) || (hdr->AS.bpb*nelem==0)) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i %i \n",__func__,__LINE__,(int)hdr->AS.bpb,(int)nelem); hdr->AS.rawdata = (uint8_t*) tmpptr; } else { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "memory allocation failed"); return(0); } } if (VERBOSE_LEVEL>8) fprintf(stdout,"#sread(%i %li)\n",(int)(hdr->HeadLen + hdr->FILE.POS*hdr->AS.bpb), iftell(hdr)); // read data count = ifread(tmpptr, hdr->AS.bpb, nelem, hdr); if (buf != NULL) { hdr->AS.flag_collapsed_rawdata = 0; // is rawdata not collapsed hdr->AS.first = start; hdr->AS.length= count; } if (count < nelem) { fprintf(stderr,"warning: less than the number of requested blocks read (%i/%i) from file %s - something went wrong\n",(int)count,(int)nelem,hdr->FileName); if (VERBOSE_LEVEL>7) fprintf(stderr,"warning: only %i instead of %i blocks read - something went wrong (bpb=%i,pos=%li)\n",(int)count,(int)nelem,hdr->AS.bpb,iftell(hdr)); } } // (uncollapsed) data is now in buffer hdr->AS.rawdata if (flag) { collapse_rawdata(hdr, NULL, 0); } return(count); } /**************************************************************************** caching: load data of whole file into buffer this will speed up data access, especially in interactive mode ****************************************************************************/ int cachingWholeFile(HDRTYPE* hdr) { sread_raw(0,hdr->NRec,hdr, 0, NULL, 0); return((hdr->AS.first != 0) || (hdr->AS.length != (size_t)hdr->NRec)); } /****************************************************************************/ /** SREAD : segment-based **/ /****************************************************************************/ size_t sread(biosig_data_type* data, size_t start, size_t length, HDRTYPE* hdr) { /* * Reads LENGTH blocks with HDR.AS.bpb BYTES each * (and HDR.SPR samples). * Rawdata is available in hdr->AS.rawdata. * Output data is available in hdr->data.block. * If the request can be completed, hdr->data.block contains * LENGTH*HDR.SPR samples and HDR.NS channels. * The size of the output data is availabe in hdr->data.size. * * hdr->FLAG.LittleEndian controls swapping * * hdr->CHANNEL[k].OnOff controls whether channel k is loaded or not * * data is a pointer to a memory array to write the data. * if data is NULL, memory is allocated and the pointer is returned * in hdr->data.block. * * channel selection is controlled by hdr->CHANNEL[k].OnOff * * start <0: read from current position * >=0: start reading from position start * length : try to read length blocks * * * ToDo: * - sample-based loading * */ size_t count,k1,k2,k4,k5=0,NS;//bi,bi8; size_t toffset; // time offset for rawdata biosig_data_type *data1=NULL; if (VERBOSE_LEVEL>6) fprintf(stdout,"%s( %p, %i, %i, %s ) MODE=%i bpb=%i\n",__func__,data, (int)start, (int)length, hdr->FileName, hdr->FILE.OPEN, (int)hdr->AS.bpb); #if !defined(ONLYGDF) && defined(WITH_ATF) if (hdr->TYPE == ATF) { sread_atf(hdr); count = hdr->NRec; } #endif if (start >= (size_t)hdr->NRec) return(0); switch (hdr->TYPE) { case AXG: case SMR: // data is already cached count = hdr->NRec; break; default: count = sread_raw(start, length, hdr, 0, NULL, 0); } if (hdr->AS.B4C_ERRNUM) return(0); toffset = start - hdr->AS.first; // set position of file handle size_t POS = hdr->FILE.POS; hdr->FILE.POS += count; // count number of selected channels for (k1=0,NS=0; k1NS; ++k1) if (hdr->CHANNEL[k1].OnOff) ++NS; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): count=%i pos=[%i,%i,%i,%i], size of data = %ix%ix%ix%i = %i\n", __func__, __LINE__, \ (int)count,(int)start,(int)length,(int)POS,(int)hdr->FILE.POS,(int)hdr->SPR, (int)count, \ (int)NS, (int)sizeof(biosig_data_type), (int)(hdr->SPR * count * NS * sizeof(biosig_data_type))); #ifndef ANDROID //Stoyan: Arm has some problem with log2 - or I dont know how to fix it - it exists but do not work. if (log2(hdr->SPR) + log2(count) + log2(NS) + log2(sizeof(biosig_data_type)) + 1 >= sizeof(size_t)*8) { // used to check the 2GByte limit on 32bit systems biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Size of required data buffer too large (exceeds size_t addressable space)"); return(0); } #endif // transfer RAW into BIOSIG data format if ((data==NULL) || hdr->Calib) { // local data memory required size_t sz = hdr->SPR * count * NS * sizeof(biosig_data_type); void *tmpptr = realloc(hdr->data.block, sz); if (tmpptr!=NULL || !sz) data1 = (biosig_data_type*) tmpptr; else { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "memory allocation failed - not enough memory"); return(0); } hdr->data.block = data1; } else data1 = data; char ALPHA12BIT = (hdr->TYPE==alpha) && (hdr->NS>0) && (hdr->CHANNEL[0].GDFTYP==(255+12)); char MIT12BIT = (hdr->TYPE==MIT ) && (hdr->NS>0) && (hdr->CHANNEL[0].GDFTYP==(255+12)); #if (__BYTE_ORDER == __BIG_ENDIAN) char SWAP = hdr->FILE.LittleEndian; #elif (__BYTE_ORDER == __LITTLE_ENDIAN) char SWAP = !hdr->FILE.LittleEndian; #endif int stride = 1; #ifndef ONLYGDF if (hdr->TYPE==Axona) stride = 64; else if (hdr->TYPE==TMS32) stride = hdr->NS; #endif //ONLYGDF if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): alpha12bit=%i SWAP=%i spr=%i %p\n",__func__,__LINE__, ALPHA12BIT, SWAP, hdr->SPR, hdr->AS.rawdata); for (k1=0,k2=0; k1NS; k1++) { CHANNEL_TYPE *CHptr = hdr->CHANNEL+k1; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) #%i#%i: alpha12bit=%i SWAP=%i spr=%i %p | bi=%i bpb=%i \n",__func__,__LINE__, (int)k1, (int)k2, ALPHA12BIT, SWAP, hdr->SPR, hdr->AS.rawdata,(int)CHptr->bi,(int)hdr->AS.bpb ); if (CHptr->OnOff) { /* read selected channels only */ if (CHptr->SPR > 0) { size_t DIV = hdr->SPR/CHptr->SPR; uint16_t GDFTYP = CHptr->GDFTYP; size_t SZ = GDFTYP_BITS[GDFTYP]; int32_t int32_value = 0; uint8_t bitoff = 0; union {int16_t i16; uint16_t u16; uint32_t i32; float f32; uint64_t i64; double f64;} u; // TODO: MIT data types for (k4 = 0; k4 < count; k4++) { uint8_t *ptr1; #ifndef ONLYGDF if (hdr->TYPE == FEF) { ptr1 = CHptr->bufptr; } else #endif //ONLYGDF ptr1 = hdr->AS.rawdata + (k4+toffset)*hdr->AS.bpb + CHptr->bi; for (k5 = 0; k5 < CHptr->SPR; k5++) { biosig_data_type sample_value; uint8_t *ptr = ptr1 + (stride * k5 * SZ >> 3); if (VERBOSE_LEVEL>8) fprintf(stdout,"%s (line %i): k_i = [%d %d %d %d ] 0x%08x[%g] @%p => ",__func__,__LINE__,(int)k1,(int)k2,(int)k4,(int)k5,(int)leu32p(ptr),lef64p(ptr),ptr); switch (GDFTYP) { case 1: sample_value = (biosig_data_type)(*(int8_t*)ptr); break; case 2: sample_value = (biosig_data_type)(*(uint8_t*)ptr); break; case 3: if (SWAP) { sample_value = (biosig_data_type)(int16_t)bswap_16(*(int16_t*)ptr); } else { sample_value = (biosig_data_type)(*(int16_t*)ptr); } break; case 4: if (SWAP) { sample_value = (biosig_data_type)(uint16_t)bswap_16(*(uint16_t*)ptr); } else { sample_value = (biosig_data_type)(*(uint16_t*)ptr); } break; case 5: if (SWAP) { sample_value = (biosig_data_type)(int32_t)bswap_32(*(int32_t*)ptr); } else { sample_value = (biosig_data_type)(*(int32_t*)ptr); } break; case 6: if (SWAP) { sample_value = (biosig_data_type)(uint32_t)bswap_32(*(uint32_t*)ptr); } else { sample_value = (biosig_data_type)(*(uint32_t*)ptr); } break; case 7: if (SWAP) { sample_value = (biosig_data_type)(int64_t)bswap_64(*(int64_t*)ptr); } else { sample_value = (biosig_data_type)(*(int64_t*)ptr); } break; case 8: if (SWAP) { sample_value = (biosig_data_type)(uint64_t)bswap_64(*(uint64_t*)ptr); } else { sample_value = (biosig_data_type)(*(uint64_t*)ptr); } break; case 16: if (SWAP) { u.i32 = bswap_32(*(uint32_t*)(ptr)); sample_value = (biosig_data_type)(u.f32); } else { sample_value = (biosig_data_type)(*(float*)(ptr)); } break; case 17: if (SWAP) { u.i64 = bswap_64(*(uint64_t*)(ptr)); sample_value = (biosig_data_type)(u.f64); } else { sample_value = (biosig_data_type)(*(double*)(ptr)); } break; case 128: // Nihon-Kohden little-endian int16 format u.u16 = leu16p(ptr) + 0x8000; sample_value = (biosig_data_type) (u.i16); break; case 255+12: if (ALPHA12BIT) { // get source address size_t off = (k4+toffset)*hdr->NS*SZ + hdr->CHANNEL[k1].bi8 + k5*SZ; ptr = hdr->AS.rawdata + (off>>3); if (off & 0x07) u.i16 = ptr[1] + ((ptr[0] & 0x0f)<<8); else u.i16 = (ptr[0]<<4) + (ptr[1] >> 4); if (u.i16 & 0x0800) u.i16 -= 0x1000; sample_value = (biosig_data_type)u.i16; } else if (MIT12BIT) { size_t off = (k4+toffset)*hdr->NS*SZ + hdr->CHANNEL[k1].bi8 + k5*SZ; ptr = hdr->AS.rawdata + (off>>3); //bitoff = k5*SZ & 0x07; if (off & 0x07) u.i16 = (((uint16_t)ptr[0] & 0xf0) << 4) + ptr[1]; else //u.i16 = ((uint16_t)ptr[0]<<4) + (ptr[1] & 0x0f); u.i16 = leu16p(ptr) & 0x0fff; if (u.i16 & 0x0800) u.i16 -= 0x1000; sample_value = (biosig_data_type)u.i16; } else if (hdr->FILE.LittleEndian) { bitoff = k5*SZ & 0x07; #if __BYTE_ORDER == __BIG_ENDIAN u.i16 = (leu16p(ptr) >> (4-bitoff)) & 0x0FFF; #elif __BYTE_ORDER == __LITTLE_ENDIAN u.i16 = (leu16p(ptr) >> bitoff) & 0x0FFF; #endif if (u.i16 & 0x0800) u.i16 -= 0x1000; sample_value = (biosig_data_type)u.i16; } else { bitoff = k5*SZ & 0x07; #if __BYTE_ORDER == __BIG_ENDIAN u.i16 = (beu16p(ptr) >> (4-bitoff)) & 0x0FFF; #elif __BYTE_ORDER == __LITTLE_ENDIAN u.i16 = (beu16p(ptr) >> bitoff) & 0x0FFF; #endif if (u.i16 & 0x0800) u.i16 -= 0x1000; sample_value = (biosig_data_type)u.i16; } break; case 511+12: bitoff = k5*SZ & 0x07; if (hdr->FILE.LittleEndian) { #if __BYTE_ORDER == __BIG_ENDIAN sample_value = (biosig_data_type)((leu16p(ptr) >> (4-bitoff)) & 0x0FFF); #elif __BYTE_ORDER == __LITTLE_ENDIAN sample_value = (biosig_data_type)((leu16p(ptr) >> bitoff) & 0x0FFF); #endif } else { #if __BYTE_ORDER == __BIG_ENDIAN sample_value = (biosig_data_type)((beu16p(ptr) >> (4-bitoff)) & 0x0FFF); #elif __BYTE_ORDER == __LITTLE_ENDIAN sample_value = (biosig_data_type)((beu16p(ptr) >> (4-bitoff)) & 0x0FFF); #endif } case 255+24: if (hdr->FILE.LittleEndian) { int32_value = (*(uint8_t*)(ptr)) + (*(uint8_t*)(ptr+1)<<8) + (*(int8_t*)(ptr+2)*(1<<16)); sample_value = (biosig_data_type)int32_value; } else { int32_value = (*(uint8_t*)(ptr+2)) + (*(uint8_t*)(ptr+1)<<8) + (*(int8_t*)(ptr)*(1<<16)); sample_value = (biosig_data_type)int32_value; } break; case 511+24: if (hdr->FILE.LittleEndian) { int32_value = (*(uint8_t*)(ptr)) + (*(uint8_t*)(ptr+1)<<8) + (*(uint8_t*)(ptr+2)<<16); sample_value = (biosig_data_type)int32_value; } else { int32_value = (*(uint8_t*)(ptr+2)) + (*(uint8_t*)(ptr+1)<<8) + (*(uint8_t*)(ptr)<<16); sample_value = (biosig_data_type)int32_value; } break; default: if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) GDFTYP=%i %i %i \n", __FILE__, __LINE__, GDFTYP, (int)k1, (int)k2); biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "Error SREAD: datatype not supported"); return(-1); } // end switch // overflow and saturation detection if ((hdr->FLAG.OVERFLOWDETECTION) && ((sample_value <= CHptr->DigMin) || (sample_value >= CHptr->DigMax))) sample_value = NAN; // missing value if (!hdr->FLAG.UCAL) // scaling sample_value = sample_value * CHptr->Cal + CHptr->Off; if (VERBOSE_LEVEL>8) fprintf(stdout,"%g\n",sample_value); // resampling 1->DIV samples if (hdr->FLAG.ROW_BASED_CHANNELS) { size_t k3; for (k3=0; k3 < DIV; k3++) data1[k2 + (k4*hdr->SPR + k5*DIV + k3)*NS] = sample_value; // row-based channels } else { size_t k3; for (k3=0; k3 < DIV; k3++) data1[k2*count*hdr->SPR + k4*hdr->SPR + k5*DIV + k3] = sample_value; // column-based channels } } // end for (k5 .... } // end for (k4 .... } k2++; }} if (hdr->FLAG.ROW_BASED_CHANNELS) { hdr->data.size[0] = k2; // rows hdr->data.size[1] = hdr->SPR*count; // columns } else { hdr->data.size[0] = hdr->SPR*count; // rows hdr->data.size[1] = k2; // columns } /* read sparse samples */ if (((hdr->TYPE==GDF) && (hdr->VERSION > 1.9)) || (hdr->TYPE==PDP)) { for (k1=0,k2=0; k1NS; k1++) { CHANNEL_TYPE *CHptr = hdr->CHANNEL+k1; // Initialize sparse channels with NANs if (CHptr->OnOff) { /* read selected channels only */ if (CHptr->SPR==0) { // sparsely sampled channels are stored in event table if (hdr->FLAG.ROW_BASED_CHANNELS) { for (k5 = 0; k5 < hdr->SPR*count; k5++) data1[k2 + k5*NS] = CHptr->DigMin; // row-based channels } else { for (k5 = 0; k5 < hdr->SPR*count; k5++) data1[k2*count*hdr->SPR + k5] = CHptr->DigMin; // column-based channels } } k2++; } } double c = hdr->SPR / hdr->SampleRate * hdr->EVENT.SampleRate; size_t *ChanList = (size_t*)calloc(hdr->NS+1,sizeof(size_t)); // Note: ChanList and EVENT.CHN start with index=1 (not 0) size_t ch = 0; for (k1=0; k1NS; k1++) // list of selected channels ChanList[k1+1]= (hdr->CHANNEL[k1].OnOff ? ++ch : 0); for (k1=0; k1EVENT.N; k1++) if (hdr->EVENT.TYP[k1] == 0x7fff) // select non-equidistant sampled value if (ChanList[hdr->EVENT.CHN[k1]] > 0) // if channel is selected if ((hdr->EVENT.POS[k1] >= POS*c) && (hdr->EVENT.POS[k1] < hdr->FILE.POS*c)) { biosig_data_type sample_value; uint8_t *ptr = (uint8_t*)(hdr->EVENT.DUR + k1); k2 = ChanList[hdr->EVENT.CHN[k1]]-1; CHANNEL_TYPE *CHptr = hdr->CHANNEL+k2; size_t DIV = (uint32_t)ceil(hdr->SampleRate/hdr->EVENT.SampleRate); uint16_t GDFTYP = CHptr->GDFTYP; // size_t SZ = GDFTYP_BITS[GDFTYP]>>3; // obsolete int32_t int32_value = 0; if (0); else if (GDFTYP==3) sample_value = (biosig_data_type)lei16p(ptr); else if (GDFTYP==4) sample_value = (biosig_data_type)leu16p(ptr); else if (GDFTYP==16) sample_value = (biosig_data_type)lef32p(ptr); /* else if (GDFTYP==17) sample_value = (biosig_data_type)lef64p(ptr); */ else if (GDFTYP==0) sample_value = (biosig_data_type)(*(char*)ptr); else if (GDFTYP==1) sample_value = (biosig_data_type)(*(int8_t*)ptr); else if (GDFTYP==2) sample_value = (biosig_data_type)(*(uint8_t*)ptr); else if (GDFTYP==5) sample_value = (biosig_data_type)lei32p(ptr); else if (GDFTYP==6) sample_value = (biosig_data_type)leu32p(ptr); /* else if (GDFTYP==7) sample_value = (biosig_data_type)(*(int64_t*)ptr); else if (GDFTYP==8) sample_value = (biosig_data_type)(*(uint64_t*)ptr); */ else if (GDFTYP==255+24) { // assume LITTLE_ENDIAN format int32_value = (*(uint8_t*)(ptr)) + (*(uint8_t*)(ptr+1)<<8) + (*(int8_t*)(ptr+2)*(1<<16)); sample_value = (biosig_data_type)int32_value; } else if (GDFTYP==511+24) { // assume LITTLE_ENDIAN format int32_value = (*(uint8_t*)(ptr)) + (*(uint8_t*)(ptr+1)<<8) + (*(uint8_t*)(ptr+2)<<16); sample_value = (biosig_data_type)int32_value; } else { if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) GDFTYP=%i %i %i \n", __FILE__, __LINE__, GDFTYP,(int)k1,(int)k2); biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "Error SREAD: datatype not supported"); return(0); } // overflow and saturation detection if ((hdr->FLAG.OVERFLOWDETECTION) && ((sample_value<=CHptr->DigMin) || (sample_value>=CHptr->DigMax))) sample_value = NAN; // missing value if (!hdr->FLAG.UCAL) // scaling sample_value = sample_value * CHptr->Cal + CHptr->Off; // resampling 1->DIV samples k5 = (hdr->EVENT.POS[k1]/c - POS)*hdr->SPR; if (hdr->FLAG.ROW_BASED_CHANNELS) { size_t k3; for (k3=0; k3 < DIV; k3++) data1[k2 + (k5 + k3)*NS] = sample_value; } else { size_t k3; for (k3=0; k3 < DIV; k3++) data1[k2 * count * hdr->SPR + k5 + k3] = sample_value; } if (VERBOSE_LEVEL>7) fprintf(stdout,"E%02i: s(%d,%d)= %d %e %e %e\n",(int)k1,(int)k2,hdr->EVENT.CHN[k1],leu32p(ptr),sample_value,(*(double*)(ptr)),(*(float*)(ptr))); } free(ChanList); } else if (hdr->TYPE==TMS32) { // post-processing TMS32 files: last block can contain undefined samples size_t spr = lei32p(hdr->AS.Header+121); if (hdr->FILE.POS*hdr->SPR > spr) for (k2=0; k2SPR; k5 < hdr->SPR*count; k5++) { if (hdr->FLAG.ROW_BASED_CHANNELS) data1[k2 + k5*NS] = NAN; // row-based channels else data1[k2*count*hdr->SPR + k5] = NAN; // column-based channels } } #ifdef CHOLMOD_H if (hdr->Calib) { if (!hdr->FLAG.ROW_BASED_CHANNELS) fprintf(stderr,"Error SREAD: Re-Referencing on column-based data not supported."); else { cholmod_dense X,Y; X.nrow = hdr->data.size[0]; X.ncol = hdr->data.size[1]; X.d = hdr->data.size[0]; X.nzmax= hdr->data.size[1]*hdr->data.size[0]; X.x = data1; X.xtype = CHOLMOD_REAL; X.dtype = CHOLMOD_DOUBLE; Y.nrow = hdr->Calib->ncol; Y.ncol = hdr->data.size[1]; Y.d = Y.nrow; Y.nzmax= Y.nrow * Y.ncol; if (data) Y.x = data; else Y.x = malloc(Y.nzmax*sizeof(double)); Y.xtype = CHOLMOD_REAL; Y.dtype = CHOLMOD_DOUBLE; double alpha[]={1,0},beta[]={0,0}; cholmod_sdmult(hdr->Calib,1,alpha,beta,&X,&Y,&CHOLMOD_COMMON_VAR); if (VERBOSE_LEVEL>8) fprintf(stdout,"%f -> %f\n",*(double*)X.x,*(double*)Y.x); free(X.x); if (data==NULL) hdr->data.block = (biosig_data_type*)Y.x; else hdr->data.block = NULL; hdr->data.size[0] = Y.nrow; } } #endif if (VERBOSE_LEVEL>7) fprintf(stdout,"sread - end \n"); //VERBOSE_LEVEL = V; return(count); } // end of SREAD #ifdef __GSL_MATRIX_DOUBLE_H__ /****************************************************************************/ /** GSL_SREAD : GSL-version of sread **/ /****************************************************************************/ size_t gsl_sread(gsl_matrix* m, size_t start, size_t length, HDRTYPE* hdr) { /* same as sread but return data is of type gsl_matrix */ // TODO: testing size_t count = sread(NULL, start, length, hdr); size_t n = hdr->data.size[0]*hdr->data.size[1]; if (m->owner && m->block) gsl_block_free(m->block); m->block = gsl_block_alloc(n); m->block->data = hdr->data.block; m->size1 = hdr->data.size[1]; m->tda = hdr->data.size[0]; m->size2 = hdr->data.size[0]; m->data = m->block->data; m->owner = 1; hdr->data.block = NULL; return(count); } #endif /****************************************************************************/ /** SWRITE **/ /****************************************************************************/ size_t swrite(const biosig_data_type *data, size_t nelem, HDRTYPE* hdr) { /* * writes NELEM blocks with HDR.AS.bpb BYTES each, */ uint8_t *ptr; size_t count=0,k1,k2,k4,k5,DIV,SZ=0; int GDFTYP; CHANNEL_TYPE* CHptr; biosig_data_type sample_value, iCal, iOff; union { int8_t i8; uint8_t u8; int16_t i16; uint16_t u16; int32_t i32; uint32_t u32; int64_t i64; uint64_t u64; } val; if (VERBOSE_LEVEL>6) fprintf(stdout,"%s( %p, %i, %s ) MODE=%i\n",__func__, data, (int)nelem, hdr->FileName, hdr->FILE.OPEN); // write data #define MAX_INT8 ((int8_t)0x7f) #define MIN_INT8 ((int8_t)0x80) #define MAX_UINT8 ((uint8_t)0xff) #define MIN_UINT8 ((uint8_t)0) #define MAX_INT16 ((int16_t)0x7fff) #define MIN_INT16 ((int16_t)0x8000) #define MAX_UINT16 ((uint16_t)0xffff) #define MIN_UINT16 ((uint16_t)0) #define MAX_INT24 ((int32_t)0x007fffff) #define MIN_INT24 ((int32_t)0xff800000) #define MAX_UINT24 ((uint32_t)0x00ffffff) #define MIN_UINT24 ((uint32_t)0) #define MAX_INT32 ((int32_t)0x7fffffff) #define MIN_INT32 ((int32_t)0x80000000) #define MAX_UINT32 ((uint32_t)0xffffffff) #define MIN_UINT32 ((uint32_t)0) #define MAX_INT64 ((((uint64_t)1)<<63)-1) #define MIN_INT64 ((int64_t)((uint64_t)1)<<63) #define MAX_UINT64 ((uint64_t)0xffffffffffffffffl) #define MIN_UINT64 ((uint64_t)0) size_t bpb8 = bpb8_collapsed_rawdata(hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): <%s> sz=%i\n",__func__,__LINE__,hdr->FileName,(int)(hdr->NRec*bpb8>>3)); if (hdr->TYPE==ATF) { if (VERBOSE_LEVEL>7) fprintf(stdout,"ATF swrite\n"); nrec_t nr = hdr->data.size[(int)hdr->FLAG.ROW_BASED_CHANNELS]; // if collapsed data, use k2, otherwise use k1 assert(nr == hdr->NRec * hdr->SPR); typeof(hdr->NS) k,k2; nrec_t c = 0; unsigned timeChan = getTimeChannelNumber(hdr); // char tabflag = 0; if ( timeChan == 0) { hdr->HeadLen += fprintf(hdr->FILE.FID, "\"Time (s)\""); // tabflag = 1; } if (hdr->data.size[1-hdr->FLAG.ROW_BASED_CHANNELS] < hdr->NS) { // if collapsed data, use k2, otherwise use k1 for (c = 0; c < nr; c++) { char *sep = "\n"; if (timeChan == 0) fprintf(hdr->FILE.FID,"%s%.16g",sep,(++hdr->FILE.POS)/hdr->SampleRate); for (k = 0, k2=0; k < hdr->NS; k++) { if (hdr->CHANNEL[k].OnOff) { size_t idx; if (hdr->FLAG.ROW_BASED_CHANNELS) idx = k2 + c * hdr->data.size[0]; else idx = k2 * hdr->data.size[0] + c; fprintf(hdr->FILE.FID,"%s%.16g",sep,data[idx]); sep = "\t"; k2++; } } } } else { // if not collapsed data, use k1 for (c = 0; c < nr; c++) { char *sep = "\n"; if (timeChan == 0) fprintf(hdr->FILE.FID,"%s%.16g",sep,(++hdr->FILE.POS)/hdr->SampleRate); for (k = 0; k < hdr->NS; k++) { if (hdr->CHANNEL[k].OnOff) { size_t idx; if (hdr->FLAG.ROW_BASED_CHANNELS) idx = k + c * hdr->data.size[0]; else idx = k * hdr->data.size[0] + c; fprintf(hdr->FILE.FID,"%s%.16g", sep, data[idx]); sep = "\t"; } } } } return nr; // end write ATF } if ((hdr->NRec*bpb8>0) && (hdr->TYPE != SCP_ECG)) { // memory allocation for SCP is done in SOPEN_SCP_WRITE Section 6 ptr = (typeof(ptr))realloc(hdr->AS.rawdata, (hdr->NRec*bpb8>>3)+1); if (ptr==NULL) { biosigERROR(hdr, B4C_INSUFFICIENT_MEMORY, "SWRITE: memory allocation failed."); return(0); } else hdr->AS.rawdata = (uint8_t*)ptr; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i\n",__func__,__LINE__,(int)hdr->NRec,hdr->NS); size_t bi8 = 0; for (k1=0,k2=0; k1NS; k1++) { CHptr = hdr->CHANNEL+k1; if (CHptr->OnOff != 0) { if (CHptr->SPR) { DIV = hdr->SPR/CHptr->SPR; GDFTYP = CHptr->GDFTYP; SZ = GDFTYP_BITS[GDFTYP]; iCal = 1/CHptr->Cal; //iOff = CHptr->DigMin - CHptr->PhysMin*iCal; iOff = -CHptr->Off*iCal; size_t col = (hdr->data.size[1-hdr->FLAG.ROW_BASED_CHANNELS]NS) ? k2 : k1; // if collapsed data, use k2, otherwise use k1 if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): #%i gdftyp=%i %i %i %i %f %f %f %f %i\n", __func__,__LINE__,(int)k1,GDFTYP,(int)bi8,(int)SZ,(int)CHptr->SPR,CHptr->Cal,CHptr->Off,iCal,iOff,(int)bpb8); for (k4 = 0; k4 < (size_t)hdr->NRec; k4++) { if (VERBOSE_LEVEL>8) fprintf(stdout,"%s (line %i): #%i: [%i %i] %i %i %i %i %i\n", __func__,__LINE__,(int)k1,(int)hdr->data.size[0],(int)hdr->data.size[1],(int)k4,(int)0,(int)hdr->SPR,(int)DIV,(int)nelem); for (k5 = 0; k5 < CHptr->SPR; k5++) { if (VERBOSE_LEVEL>8) fprintf(stdout,"%s (line %i): #%i: [%i %i] %i %i %i %i %i\n", __func__,__LINE__,(int)k1,(int)hdr->data.size[0],(int)hdr->data.size[1],(int)k4,(int)k5,(int)hdr->SPR,(int)DIV,(int)nelem); size_t k3=0; if (VERBOSE_LEVEL>8) fprintf(stdout,"%s (line %i): [%i %i %i %i %i] %i %i %i %i %i %i\n", __func__,__LINE__,(int)k1,(int)k2,(int)k3,(int)k4,(int)k5,(int)col, (int)hdr->data.size[0],(int)hdr->data.size[1],(int)hdr->SPR,(int)nelem,(int)hdr->NRec); if (hdr->FLAG.ROW_BASED_CHANNELS) { for (k3=0, sample_value=0.0; k3 < DIV; k3++) sample_value += data[col + (k4*hdr->SPR + k5*DIV + k3)*hdr->data.size[0]]; } else { for (k3=0, sample_value=0.0; k3 < DIV; k3++) sample_value += data[col*nelem*hdr->SPR + k4*hdr->SPR + k5*DIV + k3]; } if (VERBOSE_LEVEL>8) fprintf(stdout,"%s (line %i): %f/%i\n",__func__,__LINE__,sample_value,(int)DIV); sample_value /= DIV; if (!hdr->FLAG.UCAL) // scaling sample_value = sample_value * iCal + iOff; // get target address //ptr = hdr->AS.rawdata + k4*hdr->AS.bpb + hdr->CHANNEL[k1].bi + k5*SZ; //ptr = hdr->AS.rawdata + (k4*bpb8 + bi8 + k5*SZ)>>3; //size_t off = k4*hdr->AS.bpb8 + hdr->CHANNEL[k1].bi8 + (k5*SZ); size_t off = k4*bpb8 + bi8 + (k5*SZ); ptr = hdr->AS.rawdata + (off>>3); if (VERBOSE_LEVEL>8) fprintf(stdout,"%s (line %i): %i %i %i %f %p %p\n", __func__,__LINE__,(int)k4,(int)k5,(int)(off>>3),sample_value, hdr->AS.Header, ptr); // mapping of raw data type to (biosig_data_type) switch (GDFTYP) { case 3: if (sample_value > MAX_INT16) val.i16 = MAX_INT16; else if (sample_value > MIN_INT16) val.i16 = (int16_t) sample_value; else val.i16 = MIN_INT16; lei16a(val.i16, ptr); break; case 4: if (sample_value > MAX_UINT16) val.u16 = MAX_UINT16; else if (sample_value > MIN_UINT16) val.u16 = (uint16_t) sample_value; else val.u16 = MIN_UINT16; leu16a(val.u16, ptr); break; case 16: lef32a((float)sample_value, ptr); break; case 17: lef64a((double)sample_value, ptr); break; case 0: if (sample_value > MAX_INT8) val.i8 = MAX_INT8; else if (sample_value > MIN_INT8) val.i8 = (int8_t) sample_value; else val.i8 = MIN_INT8; *(int8_t*)ptr = val.i8; break; case 1: if (sample_value > MAX_INT8) val.i8 = MAX_INT8; else if (sample_value > MIN_INT8) val.i8 = (int8_t) sample_value; else val.i8 = MIN_INT8; *(int8_t*)ptr = val.i8; break; case 2: if (sample_value > MAX_UINT8) val.u8 = MAX_UINT8; else if (sample_value > MIN_UINT8) val.u8 = (uint8_t) sample_value; else val.u8 = MIN_UINT8; *(uint8_t*)ptr = val.u8; break; case 5: if (sample_value > ldexp(1.0,31)-1) val.i32 = MAX_INT32; else if (sample_value > ldexp(-1.0,31)) val.i32 = (int32_t) sample_value; else val.i32 = MIN_INT32; lei32a(val.i32, ptr); break; case 6: if (sample_value > ldexp(1.0,32)-1.0) val.u32 = MAX_UINT32; else if (sample_value > 0.0) val.u32 = (uint32_t) sample_value; else val.u32 = MIN_UINT32; leu32a(val.u32, ptr); break; case 7: if (sample_value > ldexp(1.0,63)-1.0) val.i64 = MAX_INT64; else if (sample_value > -ldexp(1.0,63)) val.i64 = (int64_t) sample_value; else val.i64 = MIN_INT64; lei64a(val.i64, ptr); break; case 8: if (sample_value > ldexp(1.0,64)-1.0) val.u64 = (uint64_t)(-1); else if (sample_value > 0.0) val.u64 = (uint64_t) sample_value; else val.u64 = 0; leu64a(val.u64, ptr); break; case 255+24: if (sample_value > MAX_INT24) val.i32 = MAX_INT24; else if (sample_value > MIN_INT24) val.i32 = (int32_t) sample_value; else val.i32 = MIN_INT24; *(uint8_t*)ptr = (uint8_t)(val.i32 & 0x000000ff); *((uint8_t*)ptr+1) = (uint8_t)((val.i32>>8) & 0x000000ff); *((uint8_t*)ptr+2) = (uint8_t)((val.i32>>16) & 0x000000ff); break; case 511+24: if (sample_value > MAX_UINT24) val.i32 = MAX_UINT24; else if (sample_value > MIN_UINT24) val.i32 = (int32_t) sample_value; else val.i32 = MIN_UINT24; *(uint8_t*)ptr = val.i32 & 0x000000ff; *((uint8_t*)ptr+1) = (uint8_t)((val.i32>>8) & 0x000000ff); *((uint8_t*)ptr+2) = (uint8_t)((val.i32>>16) & 0x000000ff); break; case 255+12: case 511+12: { if (GDFTYP == 255+12) { if (sample_value > ((1<<11)-1)) val.i16 = (1<<11)-1; else if (sample_value > -(1<<11)) val.i16 = (int16_t) sample_value; else val.i16 = -(1<<11); } else if (GDFTYP == 511+12) { if (sample_value > ((1<<12)-1)) val.u16 = (1<<12)-1; else if (sample_value > 0) val.u16 = (int16_t) sample_value; else val.u16 = 0; } if (hdr->FILE.LittleEndian) { uint16_t acc = leu16p(ptr); if (off) leu16a( (acc & 0x000F) | (val.u16<<4), ptr); else leu16a( (acc & 0xF000) | (val.u16 & 0x0FFF), ptr); } else { uint16_t acc = beu16p(ptr); if (!off) beu16a( (acc & 0x000F) | (val.u16<<4), ptr); else beu16a( (acc & 0xF000) | (val.u16 & 0x0FFF), ptr); } break; } default: biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "SWRITE: datatype not supported"); return(0); } } // end for k5 } // end for k4 } // end if SPR k2++; bi8 += SZ*CHptr->SPR; if (VERBOSE_LEVEL>7) fprintf(stdout,"swrite 314 %i\n",(int)k2); } // end if OnOff } // end for k1 if (VERBOSE_LEVEL>7) fprintf(stdout,"swrite 315 <%s>\n", hdr->FileName ); #ifndef WITHOUT_NETWORK if (hdr->FILE.Des>0) { if (VERBOSE_LEVEL>7) fprintf(stdout,"bscs_send_dat sz=%i\n",(int)(hdr->NRec*bpb8>>3)); int s = bscs_send_dat(hdr->FILE.Des,hdr->AS.rawdata,hdr->NRec*bpb8>>3); if (VERBOSE_LEVEL>7) fprintf(stdout,"bscs_send_dat succeeded %i\n",s); } else #endif #ifndef ONLYGDF if ((hdr->TYPE == ASCII) || (hdr->TYPE == BIN)) { HDRTYPE H1; H1.CHANNEL = NULL; H1.FILE.COMPRESSION = hdr->FILE.COMPRESSION; if (VERBOSE_LEVEL>7) fprintf(stdout,"swrite ASCII/BIN\n"); k1 = strlen(hdr->FileName); char* fn = (char*)calloc(k1 + 10,1); strcpy(fn, hdr->FileName); char *e = strrchr(fn,'.'); if (e==NULL) { fn[k1] = '.'; e = fn+k1; } e[1] = (hdr->TYPE == ASCII ? 'a' : 's'); e+=2; for (k1=0; k1NS; k1++) if (hdr->CHANNEL[k1].OnOff) { //if (hdr->CHANNEL[k1].OnOff && hdr->CHANNEL[k1].SPR) { /* Off channels and sparse channels (SPR) are not exported; sparse samples are available throught the header file containing the event table. */ CHptr = hdr->CHANNEL+k1; if (hdr->FILE.COMPRESSION) sprintf(e,"%02i_gz",(int)k1+1); else sprintf(e,"%02i",(int)k1+1); if (VERBOSE_LEVEL>7) fprintf(stdout,"#%i: %s\n",(int)k1,fn); H1.FileName = fn; ifopen(&H1,"wb"); if (hdr->TYPE == ASCII) { typeof(hdr->SPR) SPR; if (CHptr->SPR>0) { DIV = hdr->SPR/CHptr->SPR; SPR = CHptr->SPR; } else { DIV = 1; SPR = hdr->SPR; } size_t k2; for (k2=0; k2 < SPR*(size_t)hdr->NRec; k2++) { biosig_data_type i = 0.0; size_t k3; // TODO: row channels if (hdr->FLAG.ROW_BASED_CHANNELS) for (k3=0; k3data.block[k1+(k2*DIV+k3)*hdr->data.size[0]]; else // assumes column channels for (k3=0; k3data.block[hdr->SPR*hdr->NRec*k1+k2*DIV+k3]; /* if (hdr->FLAG.ROW_BASED_CHANNELS) { for (k3=0, sample_value=0.0; k3 < DIV; k3++) sample_value += data[col + (k4*hdr->SPR + k5*DIV + k3)*hdr->data.size[0]]; } else { for (k3=0, sample_value=0.0; k3 < DIV; k3++) sample_value += data[col*nelem*hdr->SPR + k4*hdr->SPR + k5*DIV + k3]; } */ #ifdef ZLIB_H if (H1.FILE.COMPRESSION) gzprintf(H1.FILE.gzFID,"%g\n",i/DIV); else #endif fprintf(H1.FILE.FID,"%g\n",i/DIV); } } else if (hdr->TYPE == BIN) { size_t nbytes = ((size_t)hdr->CHANNEL[k1].SPR * GDFTYP_BITS[hdr->CHANNEL[k1].GDFTYP])>>3; ifwrite(hdr->AS.rawdata+hdr->CHANNEL[k1].bi, nbytes, hdr->NRec, &H1); } ifclose(&H1); } count = hdr->NRec; free(fn); } else #endif //ONLYGDF if ((hdr->TYPE != SCP_ECG) && (hdr->TYPE != HL7aECG)) { // for SCP: writing to file is done in SCLOSE if (VERBOSE_LEVEL>7) fprintf(stdout,"swrite 317 <%s>\n", hdr->FileName ); count = ifwrite((uint8_t*)(hdr->AS.rawdata), hdr->AS.bpb, hdr->NRec, hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"swrite 319 <%i>\n", (int)count); } else { // SCP_ECG, HL7aECG #ifdef ONLYGDF assert(0); #endif //ONLYGDF count = 1; } // set position of file handle hdr->FILE.POS += count; return(count); } // end of SWRITE /****************************************************************************/ /** SEOF **/ /****************************************************************************/ int seof(HDRTYPE* hdr) { return (hdr->FILE.POS >= (size_t)hdr->NRec); } /****************************************************************************/ /** SREWIND **/ /****************************************************************************/ void srewind(HDRTYPE* hdr) { sseek(hdr,0,SEEK_SET); return; } /****************************************************************************/ /** SSEEK **/ /****************************************************************************/ int sseek(HDRTYPE* hdr, long int offset, int whence) { int64_t pos=0; if (whence < 0) pos = offset * hdr->AS.bpb; else if (whence == 0) pos = (hdr->FILE.POS + offset) * hdr->AS.bpb; else if (whence > 0) pos = (hdr->NRec + offset) * hdr->AS.bpb; if ((pos < 0) | (pos > hdr->NRec * hdr->AS.bpb)) return(-1); else if (ifseek(hdr, pos + hdr->HeadLen, SEEK_SET)) return(-1); hdr->FILE.POS = pos / (hdr->AS.bpb); return(0); } // end of SSEEK /****************************************************************************/ /** STELL **/ /****************************************************************************/ long int stell(HDRTYPE* hdr) { long int pos = iftell(hdr); if (pos<0) return(-1); else if ((size_t)pos != (hdr->FILE.POS * hdr->AS.bpb + hdr->HeadLen)) return(-1); else return(hdr->FILE.POS); } // end of STELL /****************************************************************************/ /** SCLOSE **/ /****************************************************************************/ int sclose(HDRTYPE* hdr) { int32_t pos, len; if (VERBOSE_LEVEL>6) fprintf(stdout,"SCLOSE( %s ) MODE=%i\n",hdr->FileName, hdr->FILE.OPEN); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): sclose\n",__FILE__,__LINE__); if (hdr==NULL) return(0); size_t k; for (k=0; kNS; k++) { // replace Nihon-Kohden code with standard code if (hdr->CHANNEL[k].GDFTYP==128) hdr->CHANNEL[k].GDFTYP=3; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): sclose OPEN=%i %s\n",__FILE__,__LINE__,hdr->FILE.OPEN,GetFileTypeString(hdr->TYPE)); #if defined(WITH_FEF) && !defined(ONLYGDF) if (hdr->TYPE == FEF) sclose_fef_read(hdr); #endif #ifndef WITHOUT_NETWORK if (hdr->FILE.Des>0) { // network connection if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): sclose\n",__FILE__,__LINE__); if (hdr->FILE.OPEN > 1) bscs_send_evt(hdr->FILE.Des,hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): sclose\n",__FILE__,__LINE__); int s = bscs_close(hdr->FILE.Des); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): sclose\n",__FILE__,__LINE__); if (s & ERR_MASK) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): bscs_close failed (err %i %08x)\n",__FILE__,__LINE__,s,s); biosigERROR(hdr, B4C_SCLOSE_FAILED, "bscs_close failed"); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): sclose\n",__FILE__,__LINE__); hdr->FILE.Des = 0; hdr->FILE.OPEN = 0; bscs_disconnect(hdr->FILE.Des); } else #endif if ((hdr->FILE.OPEN>1) && ((hdr->TYPE==GDF) || (hdr->TYPE==EDF) || (hdr->TYPE==BDF))) { if (VERBOSE_LEVEL>7) fprintf(stdout,"sclose(121) nrec= %i\n",(int)hdr->NRec); // WRITE HDR.NRec pos = (iftell(hdr)-hdr->HeadLen); if (hdr->NRec<0) { union { char tmp[88]; int64_t i64; } t; if (pos>0) hdr->NRec = pos/hdr->AS.bpb; else hdr->NRec = 0; if (hdr->TYPE==GDF) { t.i64 = htole64(hdr->NRec); len = sizeof(hdr->NRec); } else { len = sprintf(t.tmp,"%d",(int)hdr->NRec); if (len>8) fprintf(stderr,"Warning: NRec is (%s) to long.\n",t.tmp); } /* ### FIXME : gzseek supports only forward seek */ if (hdr->FILE.COMPRESSION>0) fprintf(stderr,"Warning: writing NRec in gz-file requires gzseek which may not be supported.\n"); ifseek(hdr,236,SEEK_SET); ifwrite(t.tmp,len,1,hdr); } if (VERBOSE_LEVEL>7) fprintf(stdout, "888: File Type=%s ,N#of Events %i,bpb=%i\n",GetFileTypeString(hdr->TYPE),hdr->EVENT.N,hdr->AS.bpb); if ((hdr->TYPE==GDF) && (hdr->EVENT.N>0)) { size_t len = hdrEVT2rawEVT(hdr); ifseek(hdr, hdr->HeadLen + hdr->AS.bpb*hdr->NRec, SEEK_SET); ifwrite(hdr->AS.rawEventData, len, 1, hdr); // write_gdf_eventtable(hdr); } } #ifndef ONLYGDF else if ((hdr->FILE.OPEN>1) && (hdr->TYPE==ATF)) { fprintf(hdr->FILE.FID, "\n"); } else if ((hdr->FILE.OPEN>1) && (hdr->TYPE==SCP_ECG)) { uint16_t crc; uint8_t* ptr; // pointer to memory mapping of the file layout hdr->AS.rawdata = NULL; struct aecg* aECG = (struct aecg*)hdr->aECG; if (aECG->Section5.Length>0) { // compute CRC for Section 5 uint16_t crc = CRCEvaluate(hdr->AS.Header + aECG->Section5.StartPtr+2,aECG->Section5.Length-2); // compute CRC leu16a(crc, hdr->AS.Header + aECG->Section5.StartPtr); } if (aECG->Section6.Length>0) { // compute CRC for Section 6 uint16_t crc = CRCEvaluate(hdr->AS.Header + aECG->Section6.StartPtr+2,aECG->Section6.Length-2); // compute CRC leu16a(crc, hdr->AS.Header + aECG->Section6.StartPtr); } if ((aECG->Section12.Length>0) && (hdr->VERSION >2.5)){ // compute CRC for Section 12 uint16_t crc = CRCEvaluate(hdr->AS.Header + aECG->Section12.StartPtr+2,aECG->Section12.Length-2); // compute CRC leu16a(crc, hdr->AS.Header + aECG->Section12.StartPtr); } // compute crc and len and write to preamble ptr = hdr->AS.Header; leu32a(hdr->HeadLen, ptr+2); crc = CRCEvaluate(ptr+2,hdr->HeadLen-2); leu16a(crc, ptr); ifwrite(hdr->AS.Header, sizeof(char), hdr->HeadLen, hdr); } else if ((hdr->FILE.OPEN>1) && (hdr->TYPE==HL7aECG)) { sclose_HL7aECG_write(hdr); hdr->FILE.OPEN = 0; } #endif //ONLYGDF if (hdr->FILE.OPEN > 0) { int status = ifclose(hdr); if (status) iferror(hdr); hdr->FILE.OPEN = 0; } return(0); } /****************************************************************************/ /** Error Handling **/ /****************************************************************************/ void biosigERROR(HDRTYPE *hdr, enum B4C_ERROR errnum, const char *errmsg) { /* sets the local and the (deprecated) global error variables B4C_ERRNUM and B4C_ERRMSG the global error variables are kept for backwards compatibility. */ #if (BIOSIG_VERSION < 10500) #ifndef ONLYGDF B4C_ERRNUM = errnum; B4C_ERRMSG = errmsg; #endif //ONLYGDF #endif hdr->AS.B4C_ERRNUM = errnum; hdr->AS.B4C_ERRMSG = errmsg; } #if (BIOSIG_VERSION < 10500) #ifndef ONLYGDF // do not expose deprecated interface in libgdf int serror() { int status = B4C_ERRNUM; fprintf(stderr,"Warning: use of function SERROR() is deprecated - use SERROR2() instead"); if (status) { fprintf(stderr,"ERROR %i: %s\n",B4C_ERRNUM,B4C_ERRMSG); B4C_ERRNUM = B4C_NO_ERROR; } return(status); } #endif //ONLYGDF #endif int serror2(HDRTYPE *hdr) { int status = hdr->AS.B4C_ERRNUM; if (status) { fprintf(stderr,"ERROR %i: %s\n",hdr->AS.B4C_ERRNUM,hdr->AS.B4C_ERRMSG); hdr->AS.B4C_ERRNUM = B4C_NO_ERROR; hdr->AS.B4C_ERRMSG = NULL; } return(status); } char *biosig_get_errormsg(HDRTYPE *hdr) { if (hdr==NULL) return NULL; if (hdr->AS.B4C_ERRNUM==0) return NULL; return strdup(hdr->AS.B4C_ERRMSG); }; int biosig_check_error(HDRTYPE *hdr) { if (hdr==NULL) return B4C_NO_ERROR; return hdr->AS.B4C_ERRNUM; }; /****************************************************************************/ /* Write / Update Event Table in GDF file */ /* */ /* returns 0 in case of success */ /* returns -1 in case of failure */ /****************************************************************************/ int sflush_gdf_event_table(HDRTYPE* hdr) { if ((hdr->TYPE!=GDF) || hdr->FILE.COMPRESSION) return(-1); long int filepos = iftell(hdr); ifclose(hdr); hdr = ifopen(hdr,"rb+"); if (!hdr->FILE.OPEN) { /* file cannot be opened in write mode */ hdr = ifopen(hdr,"rb"); return(-1); } size_t len = hdrEVT2rawEVT(hdr); ifseek(hdr, hdr->HeadLen + hdr->AS.bpb*hdr->NRec, SEEK_SET); ifwrite(hdr->AS.rawEventData, len, 1, hdr); // write_gdf_eventtable(hdr); ifseek(hdr,filepos,SEEK_SET); return(0); } void fprintf_json_double(FILE *fid, const char* Name, double val) { fprintf(fid,"\t\t\"%s\"\t: %g", Name, val); } /****************************************************************************/ /** HDR2ASCII **/ /** displaying header information **/ /****************************************************************************/ int asprintf_hdr2json(char **str, HDRTYPE *hdr) { size_t k; char tmp[41]; char flag_comma = 0; size_t sz = 25*50 + hdr->NS * 16 * 50 + hdr->EVENT.N * 6 * 50; // rough estimate of memory needed size_t c = 0; *str = (char*) realloc(*str, sz); #define STR ((*str)+c) if (VERBOSE_LEVEL>7) fprintf(stdout, "asprintf_hdr2json: sz=%i\n", (int)sz); size_t NumberOfSweeps = (hdr->SPR*hdr->NRec > 0); size_t NumberOfUserSpecifiedEvents = 0; for (k = 0; k < hdr->EVENT.N; k++) { if (hdr->EVENT.TYP[k] < 255) NumberOfUserSpecifiedEvents++; else if (hdr->EVENT.TYP[k]==0x7ffe) NumberOfSweeps++; } c += sprintf(STR, "\n{\n"); c += sprintf(STR, "\t\"TYPE\"\t: \"%s\",\n",GetFileTypeString(hdr->TYPE)); c += sprintf(STR, "\t\"VERSION\"\t: %4.2f,\n",hdr->VERSION); c += sprintf(STR, "\t\"Filename\"\t: \"%s\",\n",hdr->FileName); c += sprintf(STR, "\t\"NumberOfChannels\"\t: %i,\n",(int)hdr->NS); c += sprintf(STR, "\t\"NumberOfRecords\"\t: %i,\n",(int)hdr->NRec); c += sprintf(STR, "\t\"SamplesPerRecords\"\t: %i,\n",(int)hdr->SPR); c += sprintf(STR, "\t\"NumberOfSamples\"\t: %i,\n",(int)(hdr->NRec*hdr->SPR)); if (!isnan(hdr->SampleRate)) c += sprintf(STR, "\t\"Samplingrate\"\t: %f,\n",hdr->SampleRate); strftime(tmp,40,"%Y-%m-%d %H:%M:%S",gdf_time2tm_time(hdr->T0)); c += sprintf(STR, "\t\"StartOfRecording\"\t: \"%s\",\n",tmp); c += sprintf(STR, "\t\"TimezoneMinutesEastOfUTC\"\t: %i,\n", hdr->tzmin); c += sprintf(STR, "\t\"NumberOfSweeps\"\t: %d,\n",(unsigned)NumberOfSweeps); c += sprintf(STR, "\t\"NumberOfGroupsOrUserSpecifiedEvents\"\t: %d,\n", (unsigned)NumberOfUserSpecifiedEvents); c += sprintf(STR, "\t\"Patient\"\t: {\n"); if (strlen(hdr->Patient.Name)) { c += sprintf(STR, "\t\t\"Name\"\t: \"%s\",\n", hdr->Patient.Name); char Name[MAX_LENGTH_NAME+1]; strcpy(Name, hdr->Patient.Name); char *lastname = strtok(Name,"\x1f"); char *firstname = strtok(NULL,"\x1f"); char *secondlastname = strtok(NULL,"\x1f"); c += sprintf(STR, "\t\t\"Lastname\"\t: \"%s\",\n", lastname); c += sprintf(STR, "\t\t\"Firstname\"\t: \"%s\",\n", firstname); c += sprintf(STR, "\t\t\"Second_Lastname\"\t: \"%s\",\n", secondlastname); } if (hdr->Patient.Id) c += sprintf(STR, "\t\t\"Id\"\t: \"%s\",\n", hdr->Patient.Id); if (hdr->Patient.Weight) c += sprintf(STR, "\t\t\"Weight\"\t: \"%i kg\",\n", hdr->Patient.Weight); if (hdr->Patient.Height) c += sprintf(STR, "\t\t\"Height\"\t: \"%i cm\",\n", hdr->Patient.Height); if (hdr->Patient.Birthday>0) c += sprintf(STR, "\t\t\"Age\"\t: %i,\n", (int)((hdr->T0 - hdr->Patient.Birthday)/ldexp(365.25,32)) ); c += sprintf(STR, "\t\t\"Gender\"\t: \"%s\"\n", hdr->Patient.Sex==1 ? "Male" : "Female"); // no comma at the end because its the last element c += sprintf(STR, "\t},\n"); // end-of-Patient if (hdr->ID.Manufacturer.Name || hdr->ID.Manufacturer.Model || hdr->ID.Manufacturer.Version || hdr->ID.Manufacturer.SerialNumber) { c += sprintf(STR,"\t\"Manufacturer\"\t: {\n"); flag_comma = 0; if (hdr->ID.Manufacturer.Name) { c += sprintf(STR,"\t\t\"Name\"\t: \"%s\"", hdr->ID.Manufacturer.Name); flag_comma = 1; } if (hdr->ID.Manufacturer.Model) { if (flag_comma) c += sprintf(STR,",\n"); c += sprintf(STR,"\t\t\"Model\"\t: \"%s\"", hdr->ID.Manufacturer.Model); flag_comma = 1; } if (hdr->ID.Manufacturer.Version) { if (flag_comma) c += sprintf(STR,",\n"); c += sprintf(STR,"\t\t\"Version\"\t: \"%s\"", hdr->ID.Manufacturer.Version); flag_comma = 1; } if (hdr->ID.Manufacturer.SerialNumber) { if (flag_comma) c += sprintf(STR,",\n"); c += sprintf(STR,"\t\t\"SerialNumber\"\t: \"%s\"", hdr->ID.Manufacturer.SerialNumber); } c += sprintf(STR,"\n\t},\n"); // end-of-Manufacturer } c += sprintf(STR,"\t\"CHANNEL\"\t: ["); if (VERBOSE_LEVEL>7) fprintf(stdout, "asprintf_hdr2json: count=%i\n", (int)c); for (k = 0; k < hdr->NS; k++) { if (sz < c + 1000) { // double allocated memory sz *= 2; *str = (char*) realloc(*str, sz); } CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (k>0) c += sprintf(STR,","); c += sprintf(STR,"\n\t\t{\n"); c += sprintf(STR,"\t\t\"ChannelNumber\"\t: %i,\n", (int)k+1); c += sprintf(STR,"\t\t\"Label\"\t: \"%s\",\n", hc->Label); if ( hc->Transducer && strlen(hc->Transducer) ) c += sprintf(STR,"\t\t\"Transducer\"\t: \"%s\",\n", hc->Transducer); c += sprintf(STR,"\t\t\"PhysicalUnit\"\t: \"%s\",\n", PhysDim3(hc->PhysDimCode)); if (!isnan(hc->PhysMax)) c += sprintf(STR,"\t\t\"PhysicalMaximum\"\t: %g,\n", hc->PhysMax); if (!isnan(hc->PhysMin)) c += sprintf(STR,"\t\t\"PhysicalMinimum\"\t: %g,\n", hc->PhysMin); if (!isnan(hc->DigMax)) c += sprintf(STR,"\t\t\"DigitalMaximum\"\t: %f,\n", hc->DigMax); if (!isnan(hc->DigMin)) c += sprintf(STR,"\t\t\"DigitalMinimum\"\t: %f,\n", hc->DigMin); if (!isnan(hc->Cal)) c += sprintf(STR,"\t\t\"scaling\"\t: %g,\n", hc->Cal); if (!isnan(hc->Off)) c += sprintf(STR,"\t\t\"offset\"\t: %g,\n", hc->Off); if (!isnan(hc->TOffset)) c += sprintf(STR,"\t\t\"TimeDelay\"\t: %g,\n", hc->TOffset); uint8_t flag = (0 < hc->LowPass && hc->LowPassHighPass && hc->HighPassNotch && hc->NotchLowPass, flag & 0x06 ? ',' : ' '); if (flag & 0x02) c += sprintf(STR, "\t\t\t\"Highpass\"\t: %g%c\n", hc->HighPass, flag & 0x04 ? ',' : ' ' ); if (flag & 0x04) c += sprintf(STR, "\t\t\t\"Notch\"\t: %g\n", hc->Notch); c += sprintf(STR, "\n\t\t},\n"); } switch (hc->PhysDimCode & 0xffe0) { case 4256: // Volt if (!isnan(hc->Impedance)) c += sprintf(STR, "\t\t\"Impedance\"\t: %g,\n", hc->Impedance); break; case 4288: // Ohm if (!isnan(hc->fZ)) c += sprintf(STR, "\t\t\"fZ\"\t: %g,\n", hc->fZ); break; } double fs = hdr->SampleRate * hc->SPR/hdr->SPR; if (!isnan(fs)) c += sprintf(STR, "\t\t\"Samplingrate\"\t: %f", fs); c += sprintf(STR, "\n\t\t}"); // end-of-CHANNEL } c += sprintf(STR, "\n\t]"); // end-of-CHANNELS if (VERBOSE_LEVEL>7) fprintf(stdout, "asprintf_hdr2json: count=%i\n", (int)c); if (hdr->EVENT.N>0) { c += sprintf(STR, ",\n\t\"EVENT\"\t: ["); flag_comma = 0; for (k = 0; k < hdr->EVENT.N; k++) { if ( hdr->EVENT.TYP[k] == 0 ) continue; if (sz < c + 1000) { // double allocated memory sz *= 2; *str = (char*) realloc(*str, sz); } if ( flag_comma ) c += sprintf(STR,","); c += sprintf(STR, "\n\t\t{\n"); c += sprintf(STR, "\t\t\"TYP\"\t: \"0x%04x\",\n", hdr->EVENT.TYP[k]); c += sprintf(STR, "\t\t\"POS\"\t: %f", hdr->EVENT.POS[k]/hdr->EVENT.SampleRate); if (hdr->EVENT.CHN && hdr->EVENT.DUR) { if (hdr->EVENT.CHN[k]) c += sprintf(STR, ",\n\t\t\"CHN\"\t: %d", hdr->EVENT.CHN[k]); if (hdr->EVENT.TYP[k] != 0x7fff) c += sprintf(STR, ",\n\t\t\"DUR\"\t: %f", hdr->EVENT.DUR[k]/hdr->EVENT.SampleRate); } #if (BIOSIG_VERSION >= 10500) if (hdr->EVENT.TimeStamp != NULL && hdr->EVENT.TimeStamp[k] != 0) { struct tm tm; char buf[255]; gdf_time2tm_time_r(hdr->EVENT.TimeStamp[k],&tm); strftime(buf,sizeof(buf), "%Y-%b-%d %H:%M:%S", &tm); c += sprintf(STR,",\n\t\t\"TimeStamp\"\t: \"%s\"", buf); } #endif if (hdr->EVENT.TYP[k] == 0x7fff) { // c += sprintf(STR, ",\n\t\t\"Description\"\t: \"[sparse sample]\""); typeof(hdr->NS) chan = hdr->EVENT.CHN[k] - 1; double val = dur2val(hdr->EVENT.DUR[k], hdr->CHANNEL[chan].GDFTYP); val *= hdr->CHANNEL[chan].Cal; val += hdr->CHANNEL[chan].Off; if (isfinite(val)) c += sprintf(STR, ",\n\t\t\"Value\"\t: %g", val); // no comma at the end because its the last element } else { const char *tmpstr = GetEventDescription(hdr,k); if (tmpstr != NULL) c += sprintf(STR, ",\n\t\t\"Description\"\t: \"%s\"", tmpstr); // no comma at the end because its the last element } c += sprintf(STR, "\n\t\t}"); flag_comma = 1; } c += sprintf(STR, "\n\t]"); // end-of-EVENT } c += sprintf(STR, "\n}\n"); if (VERBOSE_LEVEL>7) fprintf(stdout, "asprintf_hdr2json: count=%i\n", (int)c); return (0); #undef STR } /****************************************************************************/ /** HDR2ASCII **/ /** displaying header information **/ /****************************************************************************/ #if (BIOSIG_VERSION < 10500) // for backwards compatibility ATT_DEPREC int hdr2json( HDRTYPE *hdr, FILE *fid) { return fprintf_hdr2json(fid, hdr); } // deprecated since Oct 2012, v1.4.0 #endif int fprintf_hdr2json(FILE *fid, HDRTYPE* hdr) { size_t k; char tmp[41]; char flag_comma = 0; size_t NumberOfSweeps = (hdr->SPR*hdr->NRec > 0); size_t NumberOfUserSpecifiedEvents = 0; for (k = 0; k < hdr->EVENT.N; k++) { if (hdr->EVENT.TYP[k] < 255) NumberOfUserSpecifiedEvents++; else if (hdr->EVENT.TYP[k]==0x7ffe) NumberOfSweeps++; } fprintf(fid,"{\n"); fprintf(fid,"\t\"TYPE\"\t: \"%s\",\n",GetFileTypeString(hdr->TYPE)); fprintf(fid,"\t\"VERSION\"\t: %4.2f,\n",hdr->VERSION); fprintf(fid,"\t\"Filename\"\t: \"%s\",\n",hdr->FileName); fprintf(fid,"\t\"NumberOfChannels\"\t: %i,\n",(int)hdr->NS); fprintf(fid,"\t\"NumberOfRecords\"\t: %i,\n",(int)hdr->NRec); fprintf(fid,"\t\"SamplesPerRecords\"\t: %i,\n",(int)hdr->SPR); fprintf(fid,"\t\"NumberOfSamples\"\t: %i,\n",(int)(hdr->NRec*hdr->SPR)); if (!isnan(hdr->SampleRate)) fprintf(fid,"\t\"Samplingrate\"\t: %f,\n",hdr->SampleRate); strftime(tmp,40,"%Y-%m-%d %H:%M:%S",gdf_time2tm_time(hdr->T0)); fprintf(fid,"\t\"StartOfRecording\"\t: \"%s\",\n",tmp); fprintf(fid,"\t\"TimezoneMinutesEastOfUTC\"\t: %i,\n", hdr->tzmin); fprintf(fid,"\t\"NumberOfSweeps\"\t: %d,\n",(unsigned)NumberOfSweeps); fprintf(fid,"\t\"NumberOfGroupsOrUserSpecifiedEvents\"\t: %d,\n",(unsigned)NumberOfUserSpecifiedEvents); fprintf(fid,"\t\"Patient\"\t: {\n"); if (strlen(hdr->Patient.Name)) { fprintf(fid, "\t\t\"Name\"\t: \"%s\",\n", hdr->Patient.Name); char Name[MAX_LENGTH_NAME+1]; strcpy(Name, hdr->Patient.Name); char *lastname = strtok(Name,"\x1f"); char *firstname = strtok(NULL,"\x1f"); char *secondlastname = strtok(NULL,"\x1f"); fprintf(fid, "\t\t\"Lastname\"\t: \"%s\",\n", lastname); fprintf(fid, "\t\t\"Firstname\"\t: \"%s\",\n", firstname); fprintf(fid, "\t\t\"Second_Lastname\"\t: \"%s\",\n", secondlastname); } if (hdr->Patient.Id) fprintf(fid,"\t\t\"Id\"\t: \"%s\",\n", hdr->Patient.Id); if (hdr->Patient.Weight) fprintf(fid,"\t\t\"Weight\"\t: \"%i kg\",\n", hdr->Patient.Weight); if (hdr->Patient.Height) fprintf(fid,"\t\t\"Height\"\t: \"%i cm\",\n", hdr->Patient.Height); if (hdr->Patient.Birthday>0) fprintf(fid,"\t\t\"Age\"\t: %i,\n", (int)((hdr->T0 - hdr->Patient.Birthday)/ldexp(365.25,32)) ); fprintf(fid,"\t\t\"Gender\"\t: \"%s\"\n", hdr->Patient.Sex==1 ? "Male" : "Female"); // no comma at the end because its the last element fprintf(fid,"\t},\n"); // end-of-Patient if (hdr->ID.Manufacturer.Name || hdr->ID.Manufacturer.Model || hdr->ID.Manufacturer.Version || hdr->ID.Manufacturer.SerialNumber) { fprintf(fid,"\t\"Manufacturer\"\t: {\n"); flag_comma = 0; if (hdr->ID.Manufacturer.Name) { fprintf(fid,"\t\t\"Name\"\t: \"%s\"", hdr->ID.Manufacturer.Name); flag_comma = 1; } if (hdr->ID.Manufacturer.Model) { if (flag_comma) fprintf(fid,",\n"); fprintf(fid,"\t\t\"Model\"\t: \"%s\"", hdr->ID.Manufacturer.Model); flag_comma = 1; } if (hdr->ID.Manufacturer.Version) { if (flag_comma) fprintf(fid,",\n"); fprintf(fid,"\t\t\"Version\"\t: \"%s\"", hdr->ID.Manufacturer.Version); flag_comma = 1; } if (hdr->ID.Manufacturer.SerialNumber) { if (flag_comma) fprintf(fid,",\n"); fprintf(fid,"\t\t\"SerialNumber\"\t: \"%s\"", hdr->ID.Manufacturer.SerialNumber); // no comma at the end because its the last element } fprintf(fid,"\n\t},\n"); // end-of-Manufacturer } fprintf(fid,"\t\"CHANNEL\"\t: ["); for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (k>0) fprintf(fid,","); fprintf(fid,"\n\t\t{\n"); fprintf(fid,"\t\t\"ChannelNumber\"\t: %i,\n", (int)k+1); fprintf(fid,"\t\t\"Label\"\t: \"%s\",\n", hc->Label); if ( hc->Transducer && strlen(hc->Transducer) ) fprintf(fid,"\t\t\"Transducer\"\t: \"%s\",\n", hc->Transducer); fprintf(fid,"\t\t\"PhysicalUnit\"\t: \"%s\",\n", PhysDim3(hc->PhysDimCode)); if (!isnan(hc->PhysMax)) fprintf(fid,"\t\t\"PhysicalMaximum\"\t: %g,\n", hc->PhysMax); if (!isnan(hc->PhysMin)) fprintf(fid,"\t\t\"PhysicalMinimum\"\t: %g,\n", hc->PhysMin); if (!isnan(hc->DigMax)) fprintf(fid,"\t\t\"DigitalMaximum\"\t: %f,\n", hc->DigMax); if (!isnan(hc->DigMin)) fprintf(fid,"\t\t\"DigitalMinimum\"\t: %f,\n", hc->DigMin); if (!isnan(hc->Cal)) fprintf(fid,"\t\t\"scaling\"\t: %g,\n", hc->Cal); if (!isnan(hc->Off)) fprintf(fid,"\t\t\"offset\"\t: %g,\n", hc->Off); if (!isnan(hc->TOffset)) fprintf(fid,"\t\t\"TimeDelay\"\t: %g,\n", hc->TOffset); uint8_t flag = (0 < hc->LowPass && hc->LowPassHighPass && hc->HighPassNotch && hc->NotchLowPass, flag & 0x06 ? ',' : ' '); if (flag & 0x02) fprintf(fid,"\t\t\t\"Highpass\"\t: %g%c\n",hc->HighPass, flag & 0x04 ? ',' : ' ' ); if (flag & 0x04) fprintf(fid,"\t\t\t\"Notch\"\t: %g\n",hc->Notch); fprintf(fid,"\n\t\t},\n"); } switch (hc->PhysDimCode & 0xffe0) { case 4256: // Volt if (!isnan(hc->Impedance)) fprintf(fid,"\t\t\"Impedance\"\t: %g,\n", hc->Impedance); break; case 4288: // Ohm if (!isnan(hc->fZ)) fprintf(fid,"\t\t\"fZ\"\t: %g,\n", hc->fZ); break; } double fs = hdr->SampleRate * hc->SPR/hdr->SPR; if (!isnan(fs)) fprintf(fid,"\t\t\"Samplingrate\"\t: %f", fs); // no comma at the end because its the last element fprintf(fid,"\n\t\t}"); // end-of-CHANNEL } fprintf(fid,"\n\t]"); // end-of-CHANNELS if (hdr->EVENT.N>0) { flag_comma = 0; fprintf(fid,",\n\t\"EVENT\"\t: ["); for (k = 0; k < hdr->EVENT.N; k++) { if ( hdr->EVENT.TYP[k] == 0 ) continue; if ( flag_comma ) fprintf(fid,","); fprintf(fid,"\n\t\t{\n"); fprintf(fid,"\t\t\"TYP\"\t: \"0x%04x\",\n", hdr->EVENT.TYP[k]); fprintf(fid,"\t\t\"POS\"\t: %f", hdr->EVENT.POS[k]/hdr->EVENT.SampleRate); if (hdr->EVENT.CHN && hdr->EVENT.DUR) { if (hdr->EVENT.CHN[k]) fprintf(fid,",\n\t\t\"CHN\"\t: %d", hdr->EVENT.CHN[k]); if (hdr->EVENT.TYP[k] != 0x7fff) fprintf(fid,",\n\t\t\"DUR\"\t: %f", hdr->EVENT.DUR[k]/hdr->EVENT.SampleRate); } #if (BIOSIG_VERSION >= 10500) if (hdr->EVENT.TimeStamp != NULL && hdr->EVENT.TimeStamp[k] != 0) { struct tm tm; char buf[255]; gdf_time2tm_time_r(hdr->EVENT.TimeStamp[k],&tm); strftime(buf,sizeof(buf), "%Y-%b-%d %H:%M:%S", &tm); fprintf(fid,",\n\t\t\"TimeStamp\"\t: \"%s\"", buf); } #endif if ((hdr->EVENT.TYP[k] == 0x7fff) && (hdr->TYPE==GDF)) { //fprintf(fid,"\t\t\"Description\"\t: [neds]\n"); // no comma at the end because its the last element //fprintf(fid,",\n\t\t\"Description\"\t: \"[sparse sample]\""); typeof(hdr->NS) chan = hdr->EVENT.CHN[k] - 1; double val = dur2val(hdr->EVENT.DUR[k], hdr->CHANNEL[chan].GDFTYP); val *= hdr->CHANNEL[chan].Cal; val += hdr->CHANNEL[chan].Off; if (isfinite(val)) fprintf(fid,",\n\t\t\"Value\"\t: %g", val); // no comma at the end because its the last element } else { const char *str = GetEventDescription(hdr,k); if (str != NULL) fprintf(fid,",\n\t\t\"Description\"\t: \"%s\"",str); // no comma at the end because its the last element } fprintf(fid,"\n\t\t}"); flag_comma = 1; } fprintf(fid,"\n\t]"); // end-of-EVENT } fprintf(fid,"\n}\n"); return (0); } /****************************************************************************/ /** HDR2ASCII **/ /** displaying header information **/ /****************************************************************************/ int hdr2ascii(HDRTYPE* hdr, FILE *fid, int VERBOSE) { CHANNEL_TYPE* cp; struct tm *T0; float age; if (VERBOSE==7) { T0 = gdf_time2tm_time(hdr->T0); char tmp[60]; strftime(tmp, 59, "%x %X %Z", T0); fprintf(fid,"\tStartOfRecording: %s\nbci2000: %p\n",tmp,hdr->AS.bci2000); return(0); } if (VERBOSE==-1) { return(fprintf_hdr2json(fid, hdr)); } if (VERBOSE>0) { /* demographic information */ fprintf(fid,"\n===========================================\n[FIXED HEADER]\n"); // fprintf(fid,"\nPID:\t|%s|\nPatient:\n",hdr->AS.PID); fprintf(fid, "Recording:\n\tID : %s\n",hdr->ID.Recording); fprintf(fid, "\tInstitution : %s\n",hdr->ID.Hospital); fprintf(fid, "\tTechnician : %s\t# default: localuser\n",hdr->ID.Technician); char tmp[60]; strncpy(tmp,(char*)&hdr->ID.Equipment,8); tmp[8] = 0; fprintf(fid, "\tEquipment : %s\n",tmp); if (VERBOSE_LEVEL>8) fprintf(fid, "\t %#.16"PRIx64"\n",(uint64_t)hdr->ID.Equipment); uint8_t k,IPv6=0; for (k=4; k<16; k++) IPv6 |= hdr->IPaddr[k]; if (IPv6) fprintf(fid, "\tIPv6 address : %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",hdr->IPaddr[0],hdr->IPaddr[1],hdr->IPaddr[2],hdr->IPaddr[3],hdr->IPaddr[4],hdr->IPaddr[5],hdr->IPaddr[6],hdr->IPaddr[7],hdr->IPaddr[8],hdr->IPaddr[9],hdr->IPaddr[10],hdr->IPaddr[11],hdr->IPaddr[12],hdr->IPaddr[13],hdr->IPaddr[14],hdr->IPaddr[15]); else fprintf(fid, "\tIPv4 address : %u.%u.%u.%u",hdr->IPaddr[0],hdr->IPaddr[1],hdr->IPaddr[2],hdr->IPaddr[3]); fprintf(fid,"\t # default:local host\nManufacturer:\n\tName : %s\n",hdr->ID.Manufacturer.Name); fprintf(fid, "\tModel : %s\n",hdr->ID.Manufacturer.Model); fprintf(fid, "\tVersion : %s\n",hdr->ID.Manufacturer.Version); fprintf(fid, "\tSerialNumber : %s\n",hdr->ID.Manufacturer.SerialNumber); fprintf(fid, "Patient:\n\tID : %s\n",hdr->Patient.Id); if (strlen(hdr->Patient.Name)) { fprintf(fid, "\tName : %s\n",hdr->Patient.Name); char Name[MAX_LENGTH_NAME+1]; strcpy(Name, hdr->Patient.Name); char *lastname = strtok(Name,"\x1f"); char *firstname = strtok(NULL,"\x1f"); char *secondlastname = strtok(NULL,"\x1f"); fprintf(fid,"\t\tLastname : %s\n",lastname); fprintf(fid,"\t\tFirstname : %s\n",firstname); fprintf(fid,"\t\tSecondLastName : %s\n",secondlastname); } if (hdr->Patient.Birthday>0) age = (hdr->T0 - hdr->Patient.Birthday)/ldexp(365.25,32); else age = NAN; if (hdr->Patient.Height) fprintf(fid,"\tHeight : %i cm\n",hdr->Patient.Height); if (hdr->Patient.Height) fprintf(stdout,"\tWeight : %i kg\n",hdr->Patient.Weight); const char *Gender[] = {"unknown","male","female","unknown"}; const char *EyeImpairment[] = {"unknown","no","yes","corrected"}; const char *HeartImpairment[] = {"unknown","no","yes","pacemaker"}; fprintf(fid,"\tGender : %s\n",Gender[hdr->Patient.Sex]); fprintf(fid,"\tEye Impairment : %s\n",EyeImpairment[hdr->Patient.Impairment.Visual]); fprintf(fid,"\tHeart Impairment: %s\n",HeartImpairment[hdr->Patient.Impairment.Heart]); if (hdr->Patient.Birthday) { T0 = gdf_time2tm_time(hdr->Patient.Birthday); fprintf(fid,"\tAge : %4.1f years\n\tBirthday : (%.6f) %s ",age,ldexp(hdr->Patient.Birthday,-32),asctime(T0)); } else fprintf(fid,"\tAge : ----\n\tBirthday : unknown\n"); T0 = gdf_time2tm_time(hdr->T0); strftime(tmp, 59, "%x %X %Z", T0); fprintf(fid,"\tStartOfRecording: (%.6f) %s",ldexp(hdr->T0,-32),asctime(T0)); fprintf(fid,"\tTimezone : %+i min\n\n", hdr->tzmin); if (hdr->AS.bci2000 != NULL) { if (VERBOSE < 4) { size_t c = min(39,strcspn(hdr->AS.bci2000,"\xa\xd")); strncpy(tmp, hdr->AS.bci2000, c); tmp[c]=0; fprintf(fid,"BCI2000 [%i]\t\t: <%s...>\n",(int)strlen(hdr->AS.bci2000),tmp); } else { fprintf(fid,"BCI2000 [%i]:\n%s\n",(int)strlen(hdr->AS.bci2000),hdr->AS.bci2000); } } fprintf(fid,"bpb=%i\n",hdr->AS.bpb); fprintf(fid,"row-based=%i\n",hdr->FLAG.ROW_BASED_CHANNELS); fprintf(fid,"uncalib =%i\n",hdr->FLAG.UCAL); fprintf(fid,"OFdetect =%i\n",hdr->FLAG.OVERFLOWDETECTION); } if (VERBOSE>1) { /* display header information */ fprintf(fid,"FileName:\t%s\nType :\t%s\nVersion :\t%4.2f\nHeadLen :\t%i\n",hdr->FileName,GetFileTypeString(hdr->TYPE),hdr->VERSION,hdr->HeadLen); // fprintf(fid,"NoChannels:\t%i\nSPR:\t\t%i\nNRec:\t\t%Li\nDuration[s]:\t%u/%u\nFs:\t\t%f\n",hdr->NS,hdr->SPR,hdr->NRec,hdr->Dur[0],hdr->Dur[1],hdr->SampleRate); fprintf(fid,"NoChannels:\t%i\nSPR:\t\t%i\nNRec:\t\t%li\nFs:\t\t%f\n",hdr->NS,hdr->SPR,(long)hdr->NRec,hdr->SampleRate); fprintf(fid,"Events/Annotations:\t%i\nEvents/SampleRate:\t%f\n",hdr->EVENT.N,hdr->EVENT.SampleRate); } if (VERBOSE>2) { /* channel settings */ fprintf(fid,"\n[CHANNEL HEADER] %p",hdr->CHANNEL); fprintf(fid,"\nNo LeadId Label\tFs[Hz]\tSPR\tGDFTYP\tCal\tOff\tPhysDim\tPhysMax \tPhysMin \tDigMax \tDigMin \tHighPass\tLowPass \tNotch \tdelay [s]\tX\tY\tZ"); size_t k; #ifdef CHOLMOD_H typeof(hdr->NS) NS = hdr->NS; if (hdr->Calib) NS += hdr->Calib->ncol; for (k=0; kNS) cp = hdr->CHANNEL+k; else cp = hdr->rerefCHANNEL + k - hdr->NS; #else for (k=0; kNS; k++) { cp = hdr->CHANNEL+k; #endif const char *tmpstr = cp->Label; if (tmpstr==NULL || strlen(tmpstr)==0) tmpstr = LEAD_ID_TABLE[cp->LeadIdCode]; fprintf(fid,"\n#%02i: %3i %i %-17s\t%5f %5i", (int)k+1, cp->LeadIdCode, cp->bi8, tmpstr, cp->SPR*hdr->SampleRate/hdr->SPR, cp->SPR); if (cp->GDFTYP<20) fprintf(fid," %s ",gdftyp_string[cp->GDFTYP]); else if (cp->GDFTYP>511) fprintf(fid, " bit%i ", cp->GDFTYP-511); else if (cp->GDFTYP>255) fprintf(fid, " bit%i ", cp->GDFTYP-255); tmpstr = PhysDim3(cp->PhysDimCode); if (tmpstr==NULL) tmpstr="\0"; fprintf(fid,"%e %e %s\t%g\t%g\t%5f\t%5f\t%5f\t%5f\t%5f\t%5g\t%5f\t%5f\t%5f", cp->Cal, cp->Off, tmpstr, cp->PhysMax, cp->PhysMin, cp->DigMax, cp->DigMin,cp->HighPass,cp->LowPass,cp->Notch,cp->TOffset, cp->XYZ[0],cp->XYZ[1],cp->XYZ[2]); //fprintf(fid,"\t %3i", cp->SPR); } } if (VERBOSE>3) { /* channel settings */ fprintf(fid,"\n\n[EVENT TABLE %i] N=%i Fs=%f", (hdr->EVENT.TimeStamp!=NULL) + (hdr->EVENT.TYP!=NULL) + (hdr->EVENT.POS!=NULL) + (hdr->EVENT.CHN!=NULL) + (hdr->EVENT.DUR!=NULL), hdr->EVENT.N,hdr->EVENT.SampleRate); fprintf(fid,"\nNo\tTYP\tPOS\tCHN\tDUR/VAL\tDesc"); size_t k; for (k=0; kEVENT.N; k++) { fprintf(fid,"\n%5i\t0x%04x\t%d",(int)(k+1),hdr->EVENT.TYP[k],hdr->EVENT.POS[k]); #if (BIOSIG_VERSION >= 10500) if (hdr->EVENT.TimeStamp != NULL && hdr->EVENT.TimeStamp[k] != 0) { struct tm tm; char buf[255]; gdf_time2tm_time_r(hdr->EVENT.TimeStamp[k],&tm); strftime(buf,sizeof(buf), "%Y-%b-%d %H:%M:%S", &tm); fprintf(fid,"\t%s",buf); } #endif if (hdr->EVENT.TYP[k] == 0x7fff) fprintf(fid,"\t%d",hdr->EVENT.CHN[k]); else if (hdr->EVENT.DUR != NULL) fprintf(fid,"\t%d\t%5d",hdr->EVENT.CHN[k],hdr->EVENT.DUR[k]); if ((hdr->EVENT.TYP[k] == 0x7fff) && (hdr->TYPE==GDF)) { typeof(hdr->NS) chan = hdr->EVENT.CHN[k]-1; double val = dur2val(hdr->EVENT.DUR[k], hdr->CHANNEL[chan].GDFTYP); val *= hdr->CHANNEL[chan].Cal; val += hdr->CHANNEL[chan].Off; fprintf(fid, "\t%g %s\t## sparse sample", val, PhysDim3(hdr->CHANNEL[chan].PhysDimCode)); // no comma at the end because its the last element } else { const char *str = GetEventDescription(hdr,k); if (str) fprintf(fid,"\t\t%s",str); } } } if (VERBOSE>4) { const char* StatusString[] = {"Original (not overread)", "Confirmed", "Overread (not confirmed)", "unknown"}; #if (BIOSIG_VERSION >= 10500) if (hdr->SCP.Section7) { fprintf(stdout,"\n\n=== SCP Section 7: Global measurements ===\n"); fprintf(stdout,"\n\n (report of this section is not implemented yet \n"); } if (hdr->SCP.Section8) { struct tm t; t.tm_year = leu16p(hdr->SCP.Section8+1)-1900; t.tm_mon = hdr->SCP.Section8[3]-1; t.tm_mday = hdr->SCP.Section8[4]; t.tm_hour = hdr->SCP.Section8[5]; t.tm_min = hdr->SCP.Section8[6]; t.tm_sec = hdr->SCP.Section8[7]; uint8_t NumberOfStatements = hdr->SCP.Section8[8]; fprintf(stdout,"\n\n=== SCP Section 8: Storage of full text interpretive statements ===\n"); fprintf(stdout,"Report %04i-%02i-%02i %02ih%02im%02is (Status=%s) %i statements\n",t.tm_year+1900,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec,StatusString[min(hdr->SCP.Section8[0],3)], NumberOfStatements); uint32_t curSectPos = 9; uint8_t k; for (k=0; k < NumberOfStatements;k++) { if (curSectPos+3 > hdr->SCP.Section8Length) break; fprintf(stdout, "%s\n", (char*)(hdr->SCP.Section8+curSectPos+3)); curSectPos += 3+leu16p(hdr->SCP.Section8+curSectPos+1); } } if (hdr->SCP.Section9) { struct tm t; t.tm_year = leu16p(hdr->SCP.Section9+1)-1900; t.tm_mon = hdr->SCP.Section9[3]-1; t.tm_mday = hdr->SCP.Section9[4]; t.tm_hour = hdr->SCP.Section9[5]; t.tm_min = hdr->SCP.Section9[6]; t.tm_sec = hdr->SCP.Section9[7]; uint8_t NumberOfStatements = hdr->SCP.Section9[8]; fprintf(stdout,"\n\n=== SCP Section 9: Storing manufacturer specific interpretive statements and data related to the overreading trail ===\n"); fprintf(stdout,"Report %04i-%02i-%02i %02ih%02im%02is (Status=%s) %i statements\n",t.tm_year+1900,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec,StatusString[min(hdr->SCP.Section8[0],3)], NumberOfStatements); uint32_t curSectPos = 9; uint8_t k; for (k=0; k < NumberOfStatements;k++) { if (curSectPos+3 > hdr->SCP.Section9Length) break; fprintf(stdout, "%s\n", (char*)(hdr->SCP.Section9+curSectPos+3)); curSectPos += 3+leu16p(hdr->SCP.Section9+curSectPos+1); } } if (hdr->SCP.Section10) { fprintf(stdout,"\n\n=== SCP Section 10: Lead measurement block ===\n"); fprintf(stdout,"\n\n (report of this section is not implemented yet \n"); } if (hdr->SCP.Section11) { struct tm t; t.tm_year = leu16p(hdr->SCP.Section11+1)-1900; t.tm_mon = hdr->SCP.Section11[3]-1; t.tm_mday = hdr->SCP.Section11[4]; t.tm_hour = hdr->SCP.Section11[5]; t.tm_min = hdr->SCP.Section11[6]; t.tm_sec = hdr->SCP.Section11[7]; uint8_t NumberOfStatements = hdr->SCP.Section11[8]; fprintf(stdout,"\n\n=== SCP Section 11: Storage of the universal ECG interpretive statement codes ===\n"); fprintf(stdout,"Report %04i-%02i-%02i %02ih%02im%02is (Status=%s) %i statements\n",t.tm_year+1900,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec,StatusString[min(hdr->SCP.Section8[0],3)], NumberOfStatements); uint32_t curSectPos = 9; uint8_t k; for (k=0; k < NumberOfStatements;k++) { if (curSectPos+3 > hdr->SCP.Section11Length) break; fprintf(stdout, "%s\n", (char*)(hdr->SCP.Section11+curSectPos+3)); curSectPos += 3+leu16p(hdr->SCP.Section11+curSectPos+1); } } #else if (hdr->aECG && (hdr->TYPE==SCP_ECG)) { struct aecg* aECG = (struct aecg*)hdr->aECG; fprintf(stdout,"\nInstitution Number: %i\n",aECG->Section1.Tag14.INST_NUMBER); fprintf(stdout,"DepartmentNumber : %i\n",aECG->Section1.Tag14.DEPT_NUMBER); fprintf(stdout,"Device Id : %i\n",aECG->Section1.Tag14.DEVICE_ID); fprintf(stdout,"Device Type : %i\n",aECG->Section1.Tag14.DeviceType); fprintf(stdout,"Manufacture code : %i\n",aECG->Section1.Tag14.MANUF_CODE); fprintf(stdout,"MOD_DESC : %s\n",aECG->Section1.Tag14.MOD_DESC); fprintf(stdout,"Version : %i\n",aECG->Section1.Tag14.VERSION); fprintf(stdout,"ProtCompLevel : %i\n",aECG->Section1.Tag14.PROT_COMP_LEVEL); fprintf(stdout,"LangSuppCode : %i\n",aECG->Section1.Tag14.LANG_SUPP_CODE); fprintf(stdout,"ECG_CAP_DEV : %i\n",aECG->Section1.Tag14.ECG_CAP_DEV); fprintf(stdout,"Mains Frequency : %i\n",aECG->Section1.Tag14.MAINS_FREQ); /* fprintf(stdout,"ANAL_PROG_REV_NUM : %s\n",aECG->Section1.Tag14.ANAL_PROG_REV_NUM); fprintf(stdout,"SERIAL_NUMBER_ACQ_DEV: %s\n",aECG->Section1.Tag14.SERIAL_NUMBER_ACQ_DEV); fprintf(stdout,"ACQ_DEV_SYS_SW_ID : %i\n",aECG->Section1.Tag14.ACQ_DEV_SYS_SW_ID); fprintf(stdout,"ACQ_DEV_SCP_SW : %i\n",aECG->Section1.Tag14.ACQ_DEV_SCP_SW); */ fprintf(stdout,"ACQ_DEV_MANUF : %s\n",aECG->Section1.Tag14.ACQ_DEV_MANUF); fprintf(stdout,"Compression HUFFMAN : %i\n",aECG->FLAG.HUFFMAN); fprintf(stdout,"Compression REF-BEAT: %i\n",aECG->FLAG.REF_BEAT); fprintf(stdout,"Compression BIMODAL : %i\n",aECG->FLAG.BIMODAL); fprintf(stdout,"Compression DIFF : %i\n",aECG->FLAG.DIFF); if ((aECG->systolicBloodPressure > 0.0) || (aECG->diastolicBloodPressure > 0.0)) fprintf(stdout,"Blood pressure (systolic/diastolic) : %3.0f/%3.0f mmHg\n",aECG->systolicBloodPressure,aECG->diastolicBloodPressure); uint8_t k; if (aECG->Section8.NumberOfStatements>0) { fprintf(stdout,"\n\nReport %04i-%02i-%02i %02ih%02im%02is (Status=%s)\n",aECG->Section8.t.tm_year+1900,aECG->Section8.t.tm_mon+1,aECG->Section8.t.tm_mday,aECG->Section8.t.tm_hour,aECG->Section8.t.tm_min,aECG->Section8.t.tm_sec,StatusString[min(aECG->Section8.Confirmed,3)]); for (k=0; kSection8.NumberOfStatements;k++) { fprintf(stdout,"%s\n",aECG->Section8.Statements[k]); } } if ( aECG->Section11.NumberOfStatements > 0 ) { fprintf(stdout,"\n\nReport %04i-%02i-%02i %02ih%02im%02is (Status=%s)\n",aECG->Section11.t.tm_year+1900,aECG->Section11.t.tm_mon+1,aECG->Section11.t.tm_mday,aECG->Section11.t.tm_hour,aECG->Section11.t.tm_min,aECG->Section11.t.tm_sec,StatusString[min(aECG->Section11.Confirmed,3)]); for (k=0; kSection11.NumberOfStatements;k++) { fprintf(stdout,"%s\n",aECG->Section11.Statements[k]); } } fprintf(stdout,"\n\nSection9:\n%s\n\n",aECG->Section9.StartPtr); } #endif // BIOSIGVERSION < 10500 } fprintf(fid,"\n\n"); return(0); } /* end of HDR2ASCII */ /****************************************************************************/ /** **/ /** EOF **/ /** **/ /****************************************************************************/ stimfit-0.15.8/src/libbiosiglite/biosig4c++/biosig2.c0000664000175000017500000013536213240263033017160 00000000000000/* Copyright (C) 2012-2018 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include "biosig.h" /* ============================================================= setter and getter functions for accessing fields of HDRTYPE ============================================================= */ enum FileFormat biosig_get_filetype(HDRTYPE *hdr) { if (hdr==NULL) return noFile; return hdr->TYPE; } int biosig_set_filetype(HDRTYPE *hdr, enum FileFormat format) { if (hdr==NULL) return -1; hdr->TYPE=format; if (format==GDF) hdr->VERSION = 1.0/0.0; // use latest version return 0; } #if (BIOSIG_VERSION < 10700) ATT_DEPREC int biosig_set_flags(HDRTYPE *hdr, char compression, char ucal, char overflowdetection) { fprintf(stderr,"Warning libbiosig2: function biosig_set_flags() is deprecated, use biosig_(re)set_flag() instead\n"); if (hdr==NULL) return -1; hdr->FLAG.UCAL = ucal; hdr->FLAG.OVERFLOWDETECTION = overflowdetection; hdr->FILE.COMPRESSION = compression; return 0; } #endif int biosig_get_flag(HDRTYPE *hdr, unsigned flags) { if (hdr==NULL) return -1; return flags & ( \ (!!hdr->FLAG.OVERFLOWDETECTION) * (unsigned)BIOSIG_FLAG_OVERFLOWDETECTION \ + (!!hdr->FLAG.UCAL) * (unsigned)BIOSIG_FLAG_UCAL \ + (!!hdr->FILE.COMPRESSION) * (unsigned)BIOSIG_FLAG_COMPRESSION \ + (!!hdr->FLAG.UCAL) * (unsigned)BIOSIG_FLAG_UCAL \ + (!!hdr->FLAG.ROW_BASED_CHANNELS)* (unsigned)BIOSIG_FLAG_ROW_BASED_CHANNELS \ ) ; } int biosig_set_flag(HDRTYPE *hdr, unsigned flags) { if (hdr==NULL) return -1; hdr->FLAG.UCAL |= !!(flags & BIOSIG_FLAG_UCAL); hdr->FLAG.OVERFLOWDETECTION |= !!(flags & BIOSIG_FLAG_OVERFLOWDETECTION); hdr->FILE.COMPRESSION |= !!(flags & BIOSIG_FLAG_COMPRESSION); hdr->FLAG.ROW_BASED_CHANNELS |= !!(flags & BIOSIG_FLAG_ROW_BASED_CHANNELS); return 0; }; int biosig_reset_flag(HDRTYPE *hdr, unsigned flags) { if (hdr==NULL) return -1; hdr->FLAG.UCAL &= !(flags & BIOSIG_FLAG_UCAL); hdr->FLAG.OVERFLOWDETECTION &= !(flags & BIOSIG_FLAG_OVERFLOWDETECTION); hdr->FILE.COMPRESSION &= !(flags & BIOSIG_FLAG_COMPRESSION); hdr->FLAG.ROW_BASED_CHANNELS &= !(flags & BIOSIG_FLAG_ROW_BASED_CHANNELS); return 0; }; int biosig_get_targetsegment(HDRTYPE *hdr) { if (hdr==NULL) return -1; return hdr->FLAG.TARGETSEGMENT; }; const char* biosig_get_filename(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->FileName; }; float biosig_get_version(HDRTYPE *hdr) { if (hdr==NULL) return NAN; return hdr->VERSION; }; int biosig_set_targetsegment(HDRTYPE *hdr, unsigned targetsegment) { return biosig_set_segment_selection(hdr, 0, targetsegment); }; int biosig_set_segment_selection(HDRTYPE *hdr, int k, uint32_t argSweepSel) {; if (hdr==NULL) return -1; if (k>5 || k<0) return -3; if (k==0) { if (argSweepSel > 127) { fprintf(stderr,"Warning libbiosig2: biosig_set_targetsegment is larger than 127 (%i)\n", argSweepSel); return -2; } hdr->FLAG.TARGETSEGMENT = argSweepSel; } else hdr->AS.SegSel[k-1] = argSweepSel; return 0; } uint32_t* biosig_get_segment_selection(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return (uint32_t*)&(hdr->AS.SegSel); }; long biosig_get_number_of_channels(HDRTYPE *hdr) { if (hdr==NULL) return -1; long k,m; for (k=0,m=0; kNS; k++) if (hdr->CHANNEL[k].OnOff==1) { m++; } return m; } size_t biosig_get_number_of_records(HDRTYPE *hdr) { if (hdr==NULL) return -1; return hdr->NRec; } size_t biosig_get_number_of_samples(HDRTYPE *hdr) { if (hdr==NULL) return -1; return hdr->NRec*hdr->SPR; } size_t biosig_get_number_of_samples_per_record(HDRTYPE *hdr) { if (hdr==NULL) return -1; return hdr->SPR; } size_t biosig_get_number_of_segments(HDRTYPE *hdr) { if (hdr==NULL) return 0; if (hdr->SPR==0) return 0; size_t k, n; for (k=0, n=1; kEVENT.N; k++) if (hdr->EVENT.TYP[k]==0x7ffe) n++; return n; } int biosig_set_number_of_channels(HDRTYPE *hdr, int ns) { if (hdr==NULL) return -1; // define variable header void *ptr = realloc(hdr->CHANNEL, ns*sizeof(CHANNEL_TYPE)); if (ptr==NULL) return -1; hdr->CHANNEL = (CHANNEL_TYPE*)ptr; int k; for (k=hdr->NS; k < ns; k++) { // initialize new channels CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->Label[0] = 0; hc->LeadIdCode= 0; strcpy(hc->Transducer, "EEG: Ag-AgCl electrodes"); hc->PhysDimCode = 19+4256; // uV hc->PhysMax = +100; hc->PhysMin = -100; hc->DigMax = +2047; hc->DigMin = -2048; hc->Cal = NAN; hc->Off = 0.0; hc->TOffset = 0.0; hc->GDFTYP = 3; // int16 hc->SPR = 1; // one sample per block hc->bi = 2*k; hc->bi8 = 16*k; hc->OnOff = 1; hc->HighPass = 0.16; hc->LowPass = 70.0; hc->Notch = 50; hc->Impedance = INFINITY; hc->fZ = NAN; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; } hdr->NS = ns; return 0; } int biosig_set_number_of_samples(HDRTYPE *hdr, ssize_t nrec, ssize_t spr) { if (hdr==NULL) return -1; if (nrec >= 0) hdr->NRec = nrec; if (spr >= 0) hdr->SPR = spr; return 0; } //ATT_DEPREC int biosig_set_number_of_segments(HDRTYPE *hdr, ) int biosig_get_datablock(HDRTYPE *hdr, double **data, size_t *rows, size_t *columns ) { if (hdr==NULL) return -1; *data = hdr->data.block; *rows = hdr->data.size[0]; *columns = hdr->data.size[1]; return 0; } biosig_data_type* biosig_get_data(HDRTYPE *hdr, char flag ) { if (hdr==NULL) return NULL; hdr->FLAG.ROW_BASED_CHANNELS = flag; sread(NULL, 0, hdr->NRec, hdr); return hdr->data.block; } double biosig_get_samplerate(HDRTYPE *hdr) { if (hdr==NULL) return NAN; return hdr->SampleRate; } int biosig_set_samplerate(HDRTYPE *hdr, double fs) { if (hdr==NULL) return -1; hdr->SampleRate=fs; return 0; } size_t biosig_get_number_of_events(HDRTYPE *hdr) { if (hdr==NULL) return 0; return hdr->EVENT.N; } size_t biosig_set_number_of_events(HDRTYPE *hdr, size_t N) { if (hdr==NULL) return 0; size_t k; hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, N * 4 ); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, N * 2 ); for (k = hdr->EVENT.N; kEVENT.POS[k] = 0; hdr->EVENT.TYP[k] = 0; } k = ( (hdr->EVENT.DUR==NULL) || (hdr->EVENT.CHN==NULL) ) ? 0 : hdr->EVENT.N; hdr->EVENT.DUR = (uint32_t*) realloc(hdr->EVENT.DUR, N * 4 ); hdr->EVENT.CHN = (uint16_t*) realloc(hdr->EVENT.CHN, N * 2 ); for (; kEVENT.CHN[k] = 0; hdr->EVENT.DUR[k] = 0; } k = (hdr->EVENT.TimeStamp==NULL) ? 0 : hdr->EVENT.N; hdr->EVENT.TimeStamp = (gdf_time*) realloc(hdr->EVENT.TimeStamp, N * 8 ); for (; kEVENT.TimeStamp[k] = 0; } hdr->EVENT.N = N; return hdr->EVENT.N; } int biosig_get_nth_event(HDRTYPE *hdr, size_t n, uint16_t *typ, uint32_t *pos, uint16_t *chn, uint32_t *dur, gdf_time *timestamp, const char **desc) { if (hdr==NULL) return -1; if (hdr->EVENT.N <= n) return -1; uint16_t TYP=hdr->EVENT.TYP[n]; if (typ != NULL) *typ = TYP; if (pos != NULL) *pos = hdr->EVENT.POS[n]; if (chn != NULL) *chn = (hdr->EVENT.CHN==NULL) ? 0 : hdr->EVENT.CHN[n]; if (dur != NULL) *dur = (hdr->EVENT.DUR==NULL) ? 0 : hdr->EVENT.DUR[n]; if (timestamp != NULL) *timestamp = (hdr->EVENT.TimeStamp==NULL) ? 0 : hdr->EVENT.TimeStamp[n]; if ( (desc != NULL) ) *desc = (TYP < hdr->EVENT.LenCodeDesc) ? hdr->EVENT.CodeDesc[TYP] : NULL; return 0; } int biosig_set_nth_event(HDRTYPE *hdr, size_t n, uint16_t* typ, uint32_t *pos, uint16_t *chn, uint32_t *dur, gdf_time *timestamp, char *Desc) { if (hdr==NULL) return -1; if (hdr->EVENT.N <= n) biosig_set_number_of_events(hdr, n+1); if (typ != NULL) hdr->EVENT.TYP[n] = *typ; else if (typ == NULL) FreeTextEvent(hdr, n, Desc); // sets hdr->EVENT.TYP[n] if (pos != NULL) hdr->EVENT.POS[n] = *pos; if (chn != NULL) hdr->EVENT.CHN[n] = *chn; if (dur != NULL) hdr->EVENT.DUR[n] = *dur; if (timestamp != NULL) hdr->EVENT.TimeStamp[n] = *timestamp; return 0; } double biosig_get_eventtable_samplerate(HDRTYPE *hdr) { if (hdr==NULL) return NAN; return hdr->EVENT.SampleRate; } int biosig_set_eventtable_samplerate(HDRTYPE *hdr, double fs) { if (hdr==NULL) return -1; hdr->EVENT.SampleRate=fs; return 0; } int biosig_change_eventtable_samplerate(HDRTYPE *hdr, double fs) { if (hdr==NULL) return -1; if (hdr->EVENT.SampleRate==fs) return 0; size_t k; double ratio = fs/hdr->EVENT.SampleRate; for (k = 0; k < hdr->EVENT.N; k++) { uint32_t POS = hdr->EVENT.POS[k]; hdr->EVENT.POS[k] = ratio*POS; if (hdr->EVENT.DUR != NULL) hdr->EVENT.DUR[k] = (POS + hdr->EVENT.DUR[k]) * ratio - hdr->EVENT.POS[k]; } hdr->EVENT.SampleRate=fs; return 0; } int biosig_get_startdatetime(HDRTYPE *hdr, struct tm *T) { if (hdr==NULL) return -1; gdf_time2tm_time_r(hdr->T0, T); return (ldexp(hdr->T0,-32)<100.0); } int biosig_set_startdatetime(HDRTYPE *hdr, struct tm T) { if (hdr==NULL) return -1; hdr->T0 = tm_time2gdf_time(&T); return (ldexp(hdr->T0,-32)<100.0); } gdf_time biosig_get_startdatetime_gdf(HDRTYPE *hdr) { if (hdr==NULL) return 0; return(hdr->T0); } int biosig_set_startdatetime_gdf(HDRTYPE *hdr, gdf_time T) { if (hdr==NULL) return -1; hdr->T0 = T; return (ldexp(hdr->T0,-32)<100.0); } int biosig_get_birthdate(HDRTYPE *hdr, struct tm *T) { if (hdr==NULL) return -1; gdf_time2tm_time_r(hdr->Patient.Birthday, T); return (ldexp(hdr->Patient.Birthday,-32)<100.0); } int biosig_set_birthdate(HDRTYPE *hdr, struct tm T) { if (hdr==NULL) return -1; hdr->Patient.Birthday = tm_time2gdf_time(&T); return (ldexp(hdr->Patient.Birthday,-32)<100.0); } const char* biosig_get_patient_name(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->Patient.Name; } const char* biosig_get_patient_lastname(HDRTYPE *hdr, size_t *LengthLastName) { if (hdr==NULL) return NULL; *LengthLastName = strcspn(hdr->Patient.Name, "\x1f"); return hdr->Patient.Name; } const char* biosig_get_patient_firstname(HDRTYPE *hdr, size_t *LengthFirstName) { if (hdr==NULL) return NULL; char *tmpstr = strchr(hdr->Patient.Name, 0x1f); if (tmpstr==NULL) { *LengthFirstName = 0; return NULL; } *LengthFirstName = strcspn(tmpstr, "\x1f"); return tmpstr; } const char* biosig_get_patient_secondlastname(HDRTYPE *hdr, size_t *LengthSecondLastName) { if (hdr==NULL) return NULL; char *tmpstr = strchr(hdr->Patient.Name, 0x1f); if (tmpstr != NULL) tmpstr = strchr(tmpstr, 0x1f); if (tmpstr==NULL) { *LengthSecondLastName = 0; return NULL; } *LengthSecondLastName = strcspn(tmpstr, "\x1f"); return tmpstr; } const char* biosig_get_patient_id(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->Patient.Id; } const char* biosig_get_recording_id(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->ID.Recording; } const char* biosig_get_technician(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->ID.Technician; } const char* biosig_get_manufacturer_name(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->ID.Manufacturer.Name; } const char* biosig_get_manufacturer_model(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->ID.Manufacturer.Model; } const char* biosig_get_manufacturer_version(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->ID.Manufacturer.Version; } const char* biosig_get_manufacturer_serial_number(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->ID.Manufacturer.SerialNumber; } const char* biosig_get_application_specific_information(HDRTYPE *hdr) { if (hdr==NULL) return NULL; return hdr->AS.bci2000; } int biosig_set_patient_name(HDRTYPE *hdr, const char* name) { if (hdr==NULL) return -1; strncpy(hdr->Patient.Name, name, MAX_LENGTH_NAME); hdr->Patient.Name[MAX_LENGTH_NAME]=0; } int biosig_set_patient_name_structured(HDRTYPE *hdr, const char* LastName, const char* FirstName, const char* SecondLastName) { if (hdr==NULL) return -1; size_t len1 = (LastName ? strlen(LastName) : 0 ); size_t len2 = (FirstName ? strlen(FirstName) : 0 ); size_t len3 = (SecondLastName ? strlen(SecondLastName) : 0 ); if (len1+len2+len3+2 > MAX_LENGTH_NAME) { fprintf(stderr,"Error in function %f: total length of name too large (%i > %i)\n",__func__,len1+len2+len3+2,MAX_LENGTH_NAME); return -1; } strcpy(hdr->Patient.Name, LastName); // Flawfinder: ignore if (FirstName != NULL) { hdr->Patient.Name[len1]=0x1f; strcpy(hdr->Patient.Name+len1+1, FirstName); // Flawfinder: ignore } if (SecondLastName != NULL) { hdr->Patient.Name[len1+len2+1]=0x1f; strcpy(hdr->Patient.Name+len1+len2+2, SecondLastName); // Flawfinder: ignore } return 0; } int biosig_set_patient_id(HDRTYPE *hdr, const char* id) { if (hdr==NULL) return -1; strncpy(hdr->Patient.Id, id, MAX_LENGTH_PID); hdr->Patient.Id[MAX_LENGTH_PID]=0; return 0; } int biosig_set_recording_id(HDRTYPE *hdr, const char* rid) { if (hdr==NULL) return -1; strncpy(hdr->ID.Recording, rid, MAX_LENGTH_RID); hdr->ID.Recording[MAX_LENGTH_RID]=0; return 0; } int biosig_set_technician(HDRTYPE *hdr, const char* technician) { if (hdr==NULL) return -1; hdr->ID.Technician = (char*)technician; return 0; } int biosig_set_manufacturer_name(HDRTYPE *hdr, const char* rid) { if (hdr==NULL) return -1; hdr->ID.Manufacturer.Name = (char*)rid; return 0; } int biosig_set_manufacturer_model(HDRTYPE *hdr, const char* rid) { if (hdr==NULL) return -1; hdr->ID.Manufacturer.Model = rid; return 0; } int biosig_set_manufacturer_version(HDRTYPE *hdr, const char* rid) { if (hdr==NULL) return -1; hdr->ID.Manufacturer.Version = rid; return 0; } int biosig_set_manufacturer_serial_number(HDRTYPE *hdr, const char* rid) { if (hdr==NULL) return -1; hdr->ID.Manufacturer.SerialNumber = rid; return 0; } int biosig_set_application_specific_information(HDRTYPE *hdr, const char* appinfo) { if (hdr==NULL) return -1; hdr->AS.bci2000 = strdup(appinfo); return 0; } // returns M-th channel, M is 0-based CHANNEL_TYPE* biosig_get_channel(HDRTYPE *hdr, int M) { if (hdr==NULL) return NULL; typeof(hdr->NS) k,m; for (k=0,m=0; kNS; k++) if (hdr->CHANNEL[k].OnOff==1) { if (M==k) return hdr->CHANNEL+k; } return NULL; } int biosig_channel_change_scale_to_physdimcode(CHANNEL_TYPE *hc, uint16_t physdimcode) { if (hc==NULL) return -1; if (hc->PhysDimCode == physdimcode) return 0; // nothing to do if ( (hc->PhysDimCode & 0xffe0) != (physdimcode & 0xffe0) ) return -2; // units do not match double scale = PhysDimScale(hc->PhysDimCode); scale /= PhysDimScale(physdimcode); hc->PhysDimCode = physdimcode; hc->PhysMax *= scale; hc->PhysMin *= scale; hc->Cal *= scale; hc->Off *= scale; return(0); } const char* biosig_channel_get_label(CHANNEL_TYPE *hc) { if (hc==NULL) return NULL; return hc->Label; } uint16_t biosig_channel_get_physdimcode(CHANNEL_TYPE *hc) { if (hc==NULL) return 0; return hc->PhysDimCode; } const char* biosig_channel_get_physdim(CHANNEL_TYPE *hc) { if (hc==NULL) return NULL; return PhysDim3(hc->PhysDimCode); } int biosig_channel_set_label(CHANNEL_TYPE *hc, const char* label) { if (hc==NULL) return -1; strncpy(hc->Label, label, MAX_LENGTH_LABEL); hc->Label[MAX_LENGTH_LABEL]=0; return 0; } int biosig_channel_set_physdimcode(CHANNEL_TYPE *hc, uint16_t physdimcode) { if (hc==NULL) return -1; hc->PhysDimCode = physdimcode; return 0; } int biosig_channel_get_scaling(CHANNEL_TYPE *hc, double *PhysMax, double *PhysMin, double *DigMax, double *DigMin) { if (hc==NULL) return -1; if (PhysMax != NULL) *PhysMax = hc->PhysMax; if (PhysMin != NULL) *PhysMax = hc->PhysMin; if (DigMax != NULL) *DigMax = hc->DigMax; if (DigMin != NULL) *DigMin = hc->DigMin; return 0; } int biosig_channel_set_scaling(CHANNEL_TYPE *hc, double PhysMax, double PhysMin, double DigMax, double DigMin) { if (hc==NULL) return -1; hc->PhysMax = PhysMax; hc->PhysMin = PhysMin; hc->DigMax = DigMax; hc->DigMin = DigMin; hc->Cal = ( PhysMax - PhysMin) / ( DigMax - DigMin ); hc->Off = PhysMin - DigMin * hc->Cal; return 0; } double biosig_channel_get_cal(CHANNEL_TYPE *hc) { if (hc==NULL) return -1; double cal = ( hc->PhysMax - hc->PhysMin) / ( hc->DigMax - hc->DigMin ); assert(cal==hc->Cal); return (cal); } double biosig_channel_get_off(CHANNEL_TYPE *hc) { if (hc==NULL) return -1; double off = hc->PhysMin - hc->DigMin * hc->Cal; assert(off==hc->Off); return off; } int biosig_channel_set_cal(CHANNEL_TYPE *hc, double cal) { if (hc==NULL) return -1; hc->Cal = cal; return 0; } int biosig_channel_set_off(CHANNEL_TYPE *hc, double off) { if (hc==NULL) return -1; hc->Off = off; return 0; } int biosig_channel_get_filter(CHANNEL_TYPE *hc, double *LowPass, double *HighPass, double *Notch) { if (hc==NULL) return -1; if (LowPass != NULL) *LowPass = hc->LowPass; if (HighPass != NULL) *HighPass = hc->HighPass; if (Notch != NULL) *Notch = hc->Notch; return 0; } int biosig_channel_set_filter(CHANNEL_TYPE *hc, double LowPass, double HighPass, double Notch) { if (hc==NULL) return -1; hc->LowPass = LowPass; hc->HighPass = HighPass; hc->Notch = Notch; return 0; } double biosig_channel_get_timing_offset(CHANNEL_TYPE *hc) { if (hc==NULL) return -1; return hc->TOffset; } int biosig_channel_set_timing_offset(CHANNEL_TYPE *hc, double off) { if (hc==NULL) return -1; hc->TOffset = off; return 0; } double biosig_channel_get_impedance(CHANNEL_TYPE *hc) { if (hc==NULL) return -1; return ( (hc->PhysDimCode & 0x7ffe) == 4256 ) ? hc->Impedance : NAN; } int biosig_channel_set_impedance(CHANNEL_TYPE *hc, double val) { if (hc==NULL) return -1; if ( (hc->PhysDimCode & 0x7ffe) != 4256 ) return -1; hc->Impedance = val; return 0; } uint16_t biosig_channel_get_datatype(CHANNEL_TYPE *hc) { if (hc==NULL) return -1; return hc->GDFTYP; } int biosig_channel_set_datatype(CHANNEL_TYPE *hc, uint16_t gdftyp) { if (hc==NULL) return -1; hc->GDFTYP = gdftyp; return 0; } double biosig_get_channel_samplerate(HDRTYPE *hdr, int chan) { CHANNEL_TYPE *hc = biosig_get_channel(hdr, chan); if (hc==NULL) return -1; if (hdr==NULL) return -1; return (hdr->SampleRate * hc->SPR / hdr->SPR); } size_t biosig_channel_get_samples_per_record(CHANNEL_TYPE *hc) { if (hc==NULL) return -1; return hc->SPR; } int biosig_channel_set_samples_per_record(CHANNEL_TYPE *hc, size_t spr) { if (hc==NULL) return -1; hc->SPR = spr; return 0; } int biosig_set_channel_samplerate_and_samples_per_record(HDRTYPE *hdr, int chan, ssize_t spr, double fs) { CHANNEL_TYPE *hc = biosig_get_channel(hdr,chan); if (hc==NULL) return -1; if ((spr <= 0) && (fs >= 0.0)) { hc->SPR = hdr->SPR * fs / hdr->SampleRate; return 0; } if ((spr >= 0) && (fs != fs)) { hc->SPR = spr; return 0; } assert (hdr->SampleRate * hc->SPR == fs * hdr->SPR); return (hdr->SampleRate * hc->SPR != fs * hdr->SPR); } const char *biosig_channel_get_transducer(CHANNEL_TYPE *hc) { if (hc==NULL) return(NULL); return (hc->Transducer); } int biosig_channel_set_transducer(CHANNEL_TYPE *hc, const char *transducer) { if (hc==NULL) return(-1); strncpy(hc->Transducer, transducer, MAX_LENGTH_TRANSDUCER+1); return (0); } /* DO NOT USE DO NOT USE DO NOT USE DO NOT USE the functions below are experimental and have not been used so far in any productions system They will be removed or significantly changed . DO NOT USE DO NOT USE DO NOT USE DO NOT USE */ #define hdrlistlen 64 struct hdrlist_t { HDRTYPE *hdr; // header information as defined in level 1 interface //const char *filename; // name of file, is always hdr->FileName uint16_t NS; // number of effective channels, only CHANNEL[].OnOff==1 are considered size_t *chanpos; // position of file handle for each channel } ; struct hdrlist_t hdrlist[hdrlistlen]; CHANNEL_TYPE *getChannelHeader(HDRTYPE *hdr, uint16_t channel) { // returns channel header - skip Off-channels CHANNEL_TYPE *hc = hdr->CHANNEL; typeof(hdr->NS) chan = 0; while (1) { if (hc->OnOff==1) { if (chan==channel) return hc; chan++; } hc++; } return NULL; } int biosig_lib_version(void) { return (BIOSIG_VERSION); } biosig_handle_t biosig2_open_file_readonly(const char *path, int read_annotations) { /* on success returns handle. */ HDRTYPE *hdr = sopen(path,"r",NULL); if (serror2(hdr)) { destructHDR(hdr); return(NULL); } if (read_annotations) sort_eventtable(hdr); return(hdr); } int biosig_open_file_readonly(const char *path, int read_annotations) { /* on success returns handle. */ int k = 0; while (k < hdrlistlen && hdrlist[k].hdr != NULL) k++; if (k >= hdrlistlen) return(-1); HDRTYPE *hdr = sopen(path,"r",NULL); hdrlist[k].hdr = hdr; //hdrlist[k].filename = hdr->FileName; hdrlist[k].NS = 0; hdrlist[k].chanpos = calloc(hdrlist[k].NS,sizeof(size_t)); if (read_annotations) sort_eventtable(hdrlist[k].hdr); return(k); } int biosig2_close_file(biosig_handle_t hdr) { destructHDR(hdr); return(0); } int biosig_close_file(int handle) { destructHDR(hdrlist[handle].hdr); hdrlist[handle].hdr = NULL; if (hdrlist[handle].chanpos) free(hdrlist[handle].chanpos); hdrlist[handle].NS = 0; //hdrlist[handle].filename = NULL; #if 0 int k; for (k=0; k= hdrlistlen || hdrlist[handle].hdr==NULL || hdrlist[handle].NS<=channel ) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; CHANNEL_TYPE *hc = getChannelHeader(hdr,channel); size_t stride = 1; // stride between consecutive samples of same channel, depends on data orientation hdr->FLAG.ROW_BASED_CHANNELS size_t div = hdr->SPR/hc->SPR; // stride if sample rate of channel is smaller than the overall sampling rate size_t POS = hdrlist[handle].chanpos[channel]*div; // size_t LEN = n*div; size_t startpos = POS/hdr->SPR; // round towards 0 size_t endpos = (POS+LEN)/hdr->SPR + ((POS+LEN)%hdr->SPR != 0); // round towards infinity if (hdr->AS.first > startpos || (endpos-startpos) > hdr->AS.length || hdr->FLAG.UCAL!=UCAL) { // read data when not in data buffer hdr->data.block hdr->FLAG.UCAL = UCAL; sread(NULL, startpos, endpos - startpos, hdr); } // when starting position is not aligned with start of data size_t offset = hdr->AS.first * hdr->SPR - POS; // find starting position and stride of data double *data = hdr->data.block; if (hdr->FLAG.ROW_BASED_CHANNELS) { stride = hdr->data.size[0]; data = hdr->data.block + channel + offset * stride; } else { data = hdr->data.block + offset + channel * hdr->data.size[0]; } size_t k; for (k = 0; k < n; k++) { buf[k] = data[k*div*stride]; // copy data into output buffer } hdrlist[handle].chanpos[channel] += n; // update position pointer of channel chan return (0); } /* int biosig_read_physical_samples(int handle, size_t biosig_signal, size_t n, double *buf) { return biosig_read_samples(handle, biosig_signal, n, buf, (unsigned char)(0)); } int biosig_read_digital_samples(int handle, size_t biosig_signal, size_t n, double *buf) { return biosig_read_samples(handle, biosig_signal, n, buf, (unsigned char)(1)); } */ size_t biosig_seek(int handle, long long offset, int whence) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; sseek(hdr, offset, whence); return (hdr->FILE.POS); } size_t biosig_tell(int handle) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); return(stell(hdrlist[handle].hdr)); } void biosig_rewind(int handle, int biosig_signal) { /* It is equivalent to: (void) biosig_seek(int handle, int biosig_signal, 0LL, biosig_SEEK_SET) */ if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return; srewind(hdrlist[handle].hdr); } int biosig_get_annotation(int handle, size_t n, struct biosig_annotation_struct *annot) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; if (n>=hdr->EVENT.N) return (-1); annot->onset = hdr->EVENT.POS[n]; annot->duration = hdr->EVENT.DUR[n]; annot->annotation = GetEventDescription(hdr, n); return(0); } biosig_handle_t biosig2_open_file_writeonly(const char *path, enum FileFormat filetype, int number_of_signals) { /* TODO: does not open file and write to file */ HDRTYPE *hdr = constructHDR(number_of_signals,0); hdr->FLAG.UCAL = 0; hdr->FLAG.OVERFLOWDETECTION = 0; hdr->FILE.COMPRESSION = 0; return(hdr); } int biosig_open_file_writeonly(const char *path, enum FileFormat filetype, int number_of_signals) { /* TODO: does not open file and write to file */ #if 1 int k = 0; while (k < hdrlistlen && hdrlist[k].hdr != NULL) k++; if (k>=hdrlistlen) return -1; HDRTYPE *hdr = constructHDR(number_of_signals,0); #else HDRTYPE *hdr = constructHDR(number_of_signals,0); if (hdr==NULL) return (-1); hdr->FileName = strdup(path); hdr->TYPE = filetype; int k = 0; while (k < hdrlistlen && hdrlist[k].hdr != NULL) k++; if (k>=hdrlistlen) { void *ptr = realloc(hdrlist, (k+1)*sizeof(*hdrlist)); if (ptr==NULL) return (-1); hdrlist = (struct hdrlist_t*) ptr; hdrlistlen = k+1; } #endif hdr->FLAG.UCAL = 0; hdr->FLAG.OVERFLOWDETECTION = 0; hdr->FILE.COMPRESSION = 0; hdrlist[k].hdr = hdr; return(0); } double biosig_get_global_samplefrequency(int handle) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NAN); return (hdrlist[handle].hdr->SampleRate); } int biosig_set_global_samplefrequency(int handle, double samplefrequency) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); hdrlist[handle].hdr->SampleRate = samplefrequency; return 0; } double biosig_get_samplefrequency(int handle, int biosig_signal) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NAN); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(NAN); return (hdr->SampleRate*hdr->CHANNEL[biosig_signal].SPR/hdr->SPR); } int biosig_set_samplefrequency(int handle, int biosig_signal, double samplefrequency) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = 0; int ch; for (ch = 0; ch < hdr->NS; ch++) { if (hdr->CHANNEL[ch].OnOff==1) { if (ns==biosig_signal) break; ns++; } } if (ch >= hdr->NS) return(-1); // FIXME: resulting sampling rate might depend on calling order; what's the overall sampling rate ? if (samplefrequency != hdr->SampleRate) { double spr = samplefrequency * hdr->SPR / hdr->SampleRate; hdr->CHANNEL[biosig_signal].SPR = spr; if (spr != ceil(spr)) return (-2); return 0; } hdr->CHANNEL[ch].SPR = hdr->SPR; return 0; } double biosig_get_physical_maximum(int handle, int biosig_signal) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NAN); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(NAN); return (hdr->CHANNEL[biosig_signal].PhysMax); } int biosig_set_physical_maximum(int handle, int biosig_signal, double phys_max) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); hdr->CHANNEL[biosig_signal].PhysMax = phys_max; return (0); } double biosig_get_physical_minimum(int handle, int biosig_signal) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NAN); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(NAN); return (hdr->CHANNEL[biosig_signal].PhysMin); } int biosig_set_physical_minimum(int handle, int biosig_signal, double phys_min) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); hdr->CHANNEL[biosig_signal].PhysMin = phys_min; return (0); } double biosig_get_digital_maximum(int handle, int biosig_signal) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NAN); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(NAN); return (hdr->CHANNEL[biosig_signal].DigMax); } int biosig_set_digital_maximum(int handle, int biosig_signal, double dig_max) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); hdr->CHANNEL[biosig_signal].DigMax = dig_max; return (0); } double biosig_get_digital_minimum(int handle, int biosig_signal) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NAN); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(NAN); return (hdr->CHANNEL[biosig_signal].DigMin); } int biosig_set_digital_minimum(int handle, int biosig_signal, double dig_min) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); hdr->CHANNEL[biosig_signal].DigMin = dig_min; return (0); } const char *biosig_get_label(int handle, int biosig_signal) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NULL); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(NULL); return (hdr->CHANNEL[biosig_signal].Label); } int biosig_set_label(int handle, int biosig_signal, const char *label) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); strncpy(hdr->CHANNEL[biosig_signal].Label, label, MAX_LENGTH_LABEL); return (0); } int biosig_set_prefilter(int handle, int biosig_signal, const char *prefilter) { // TODO: parse prefilter and call biosig_set_{highpass,lowpass,notch}filter return fprintf(stderr,"Warning: biosig_set_prefilter(...) is not implemented, use instead biosig_set_highpassfilter(),biosig_set_lowpassfilter(),biosig_set_notchfilter().\n"); } int biosig_set_highpassfilter(int handle, int biosig_signal, double frequency) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); hdr->CHANNEL[biosig_signal].HighPass = frequency; return 0; } int biosig_set_lowpassfilter(int handle, int biosig_signal, double frequency) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); hdr->CHANNEL[biosig_signal].LowPass = frequency; return 0; } int biosig_set_notchfilter(int handle, int biosig_signal, double frequency) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); hdr->CHANNEL[biosig_signal].Notch = frequency; return (0); } const char *biosig_get_transducer(int handle, int biosig_signal) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NULL); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(NULL); return (hdr->CHANNEL[biosig_signal].Transducer); } int biosig_set_transducer(int handle, int biosig_signal, const char *transducer) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); strncpy(hdr->CHANNEL[biosig_signal].Transducer, transducer, MAX_LENGTH_TRANSDUCER+1); return (0); } const char *biosig_physical_dimension(int handle, int biosig_signal) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NULL); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(NULL); return (PhysDim3(hdr->CHANNEL[biosig_signal].PhysDimCode)); } int biosig_set_physical_dimension(int handle, int biosig_signal, const char *phys_dim) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; typeof(hdr->NS) ns = hdr->NS; if (biosig_signal >= ns) return(-1); hdr->CHANNEL[biosig_signal].PhysDimCode = PhysDimCode(phys_dim); return (0); } /* int biosig_get_startdatetime(int handle, struct tm *T) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; gdf_time2tm_time_r(hdr->T0, T); return (0); } int biosig_set_startdatetime(int handle, const struct tm *T) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; hdr->T0 = tm_time2gdf_time(T); return (0); } */ int edf_set_startdatetime(int handle, int startdate_year, int startdate_month, int startdate_day, int starttime_hour, int starttime_minute, int starttime_second) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; struct tm T; T.tm_year = startdate_year; T.tm_mon = startdate_month; T.tm_mday = startdate_day; T.tm_hour = starttime_hour; T.tm_min = starttime_minute; T.tm_sec = starttime_second; hdr->T0 = tm_time2gdf_time(&T); return (0); } const char *biosig_get_patientname(int handle) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NULL); return(hdrlist[handle].hdr->Patient.Name); } int biosig_set_patientname(int handle, const char *patientname) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); strncpy(hdrlist[handle].hdr->Patient.Name, patientname, MAX_LENGTH_NAME+1); return (0); } const char *biosig_get_patientcode(int handle) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NULL); return(hdrlist[handle].hdr->Patient.Id); } int biosig_set_patientcode(int handle, const char *patientcode) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); strncpy(hdrlist[handle].hdr->Patient.Id, patientcode, MAX_LENGTH_PID+1); return(0); } int biosig_get_gender(int handle) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(0); return(hdrlist[handle].hdr->Patient.Sex); } int biosig_set_gender(int handle, int gender) { if (gender<0 || gender>9) return (-1); if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); switch (gender) { case 1 : case 'm': case 'M': hdrlist[handle].hdr->Patient.Sex = 1; return(0); case 2 : case 'f': case 'F': hdrlist[handle].hdr->Patient.Sex = 2; return(0); default: return(0); } } /* int biosig_get_birthdate(int handle, struct tm *T) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; gdf_time2tm_time_r(hdr->Patient.Birthday, T); return (0); } int biosig_set_birthdate(int handle, const struct tm *T) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; hdr->Patient.Birthday = tm_time2gdf_time(T); return (0); } */ int edf_set_birthdate(int handle, int birthdate_year, int birthdate_month, int birthdate_day) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; struct tm T; T.tm_year = birthdate_year; T.tm_mon = birthdate_month; T.tm_mday = birthdate_day; T.tm_hour = 12; T.tm_min = 0; T.tm_sec = 0; hdr->Patient.Birthday = tm_time2gdf_time(&T); return (0); } int biosig_set_patient_additional(int handle, const char *patient_additional) { fprintf(stderr,"Warning: biosig_set_patient_additional() not supported.\n"); return (-1); } int biosig_set_admincode(int handle, const char *admincode) { fprintf(stderr,"Warning: biosig_set_admincode() not supported.\n"); return (-1); } /* const char *biosig_get_technician(int handle) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(NULL); HDRTYPE *hdr = hdrlist[handle].hdr; return(hdr->ID.Technician); } int biosig_set_technician(int handle, const char *technician) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; hdr->ID.Technician = realloc(hdr->ID.Technician, strlen(technician)+1); strcpy(hdr->ID.Technician, technician); return(0); } */ // TODO: implement the following functions int biosig_set_equipment(int handle, const char *equipment) { return (-1); } int biosig_set_recording_additional(int handle, const char *recording_additional) { return (-1); } int biosig_write_physical_samples(int handle, double *buf) { return (-1); } int biosig_blockwrite_physical_samples(int handle, double *buf) { return (-1); } int biosig_write_digital_samples(int handle, int *buf) { return (-1); } int biosig_blockwrite_digital_samples(int handle, int *buf) { return (-1); } int biosig_write_annotation(int handle, size_t onset, size_t duration, const char *description) { /* onset and duration are in samples */ if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; size_t N = hdr->EVENT.N++; hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, hdr->EVENT.N*sizeof(*(hdr->EVENT.POS)) ); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, hdr->EVENT.N*sizeof(*(hdr->EVENT.TYP)) ); hdr->EVENT.DUR = (uint32_t*) realloc(hdr->EVENT.DUR, hdr->EVENT.N*sizeof(*(hdr->EVENT.DUR)) ); hdr->EVENT.CHN = (uint16_t*) realloc(hdr->EVENT.CHN, hdr->EVENT.N*sizeof(*(hdr->EVENT.CHN)) ); hdr->EVENT.POS[N] = onset; hdr->EVENT.DUR[N] = duration; hdr->EVENT.CHN[N] = 0; FreeTextEvent(hdr, N, description); return (hdr->AS.B4C_ERRNUM); } int biosig_write_annotation_utf8(int handle, size_t onset, size_t duration, const char *description) { fprintf(stdout,"biosig_write_annotation_latin1(): It's recommended to use biosig_write_annotation() instead.\n"); return ( biosig_write_annotation(handle, onset, duration, description) ); } int biosig_write_annotation_latin1(int handle, size_t onset, size_t duration, const char *description) { fprintf(stdout,"biosig_write_annotation_latin1(): It's recommended to use biosig_write_annotation() instead.\n"); return ( biosig_write_annotation(handle, onset, duration, description) ); } int biosig_set_datarecord_duration(int handle, double duration) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; double spr = hdr->SampleRate * duration; size_t rspr = round(spr); if (fabs(spr - rspr) > 1e-8*spr) { fprintf(stderr,"Warning biosig_set_datarecord_duration(): number of samples is not integer (%g) - rounded to integers (%i)\n",spr,(int)rspr); } hdr->SPR = (size_t)rspr; return 0; } /****************************************************************************************** biosig_unserialize_header: converts memory buffer into header structure HDR biosig_unserialize: converts memory buffer into header structure HDR, and if data != NULL, data samples will be read into a matrix, the starting address of this data matrix will be stored in *data point to *data input: mem : buffer len : length of buffer mem start: starting position to extract data length: number of samples for extracting data, flags: BIOSIG_FLAG_UCAL | BIOSIG_FLAG_OVERFLOWDETECTION | BIOSIG_FLAG_ROW_BASED_CHANNELS output: *data will contain start address to matrix data samples, of size hdr->NS * (hdr->SPR * hdr->NRec) or its transpose form depending on flags return value: header structure HDRTYPE* hdr. ******************************************************************************************/ HDRTYPE* biosig_unserialize(void *mem, size_t len, size_t start, size_t length, biosig_data_type **data, int flags) { fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); HDRTYPE *hdr = constructHDR(0,0); // decode header fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); hdr->AS.Header = mem; // in case of error, memory is deallocated through destructHDR(hdr); if (gdfbin2struct(hdr)) return(hdr); // in case of success, memory is managed by its own pointer *mem hdr->AS.Header = NULL; fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); // get data block biosig_set_flag(hdr, flags); if (data != NULL) { hdr->AS.rawdata = mem+hdr->HeadLen; size_t L = sread(*data, start, length, hdr); *data = hdr->data.block; hdr->data.block = NULL; } hdr->AS.rawdata = NULL; fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); // read eventtable hdr->AS.rawEventData = (hdr->NRec != -1) ? mem + hdr->HeadLen + hdr->NRec*hdr->AS.bpb : NULL; rawEVT2hdrEVT(hdr, len - hdr->HeadLen - hdr->NRec*hdr->AS.bpb); // in case of success, memory is managed by its own pointer *mem hdr->AS.rawEventData = NULL; fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); return(hdr); } /****************************************************************************************** biosig_serialize: converts header structure into memory buffer input: hdr: header structure, including event table. output: *mem will contain start address of buffer *len will contain length of buffer mem. ******************************************************************************************/ void* biosig_serialize(HDRTYPE *hdr, void **mem, size_t *len) { // encode header fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); hdr->TYPE=GDF; hdr->VERSION=3.0; struct2gdfbin(hdr); fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); // write event table size_t len3 = hdrEVT2rawEVT(hdr); fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); size_t len0 = hdr->HeadLen + hdr->NRec*hdr->AS.bpb + len3; char* M = (char*)realloc(*mem,len0); if (M == NULL) return(NULL); *mem = M; *len = len0; // write header into buffer memcpy(M, hdr->AS.Header, hdr->HeadLen); fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); // write data into buffer, and collapse unused channels size_t count = sread_raw(0, hdr->NRec, hdr, 1, M + hdr->HeadLen, hdr->NRec*hdr->AS.bpb); fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); // write event table into buffer memcpy(M + hdr->HeadLen + hdr->NRec*hdr->AS.bpb, hdr->AS.rawEventData, len3); fprintf(stdout,"%s (line %i) %s:\n",__FILE__,__LINE__,__func__); return(M); } #if defined(MAKE_EDFLIB) int edfopen_file_writeonly(const char *path, int filetype, int number_of_signals) { enum FileFormat fmt=unknown; switch (filetype) { case EDFLIB_FILETYPE_EDF: case EDFLIB_FILETYPE_EDFPLUS: fmt = EDF; break; case EDFLIB_FILETYPE_BDF: case EDFLIB_FILETYPE_BDFPLUS: fmt = EDF; break; default: return(-1); } return(biosig_open_file_writeonly(path, fmt, number_of_signals)); } int edf_set_gender(int handle, int gender) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; hdr->Patient.Sex = (gender==1) + (gender==0)*2 ; } int edfread_physical_samples(int handle, int edfsignal, int n, double *buf) { fprintf(stderr,"error: edfread_physical_samples - use biosig_read_physical_samples instead.\n"); return(-1); } int edfread_digital_samples(int handle, int edfsignal, int n, int *buf) { fprintf(stderr,"error: edfread_digital_samples - use biosig_read_digital_samples instead.\n"); return(-1); } long long edfseek(int handle, int channel, long long offset, int whence) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL || hdrlist[handle].NS<=channel ) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; switch (whence) { case SEEK_SET: hdrlist[handle].chanpos[channel] = offset; // update position pointer of channel chan break; case SEEK_CUR: hdrlist[handle].chanpos[channel] += offset; // update position pointer of channel chan break; case SEEK_END: { CHANNEL_TYPE *hc = getChannelHeader(hdr,channel); hdrlist[handle].chanpos[channel] = hdr->NRec*hc->SPR + offset; // update position pointer of channel chan break; } } return (hdrlist[handle].chanpos[channel]); } long long edftell(int handle, int channel) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL || hdrlist[handle].NS<=channel ) return(-1); return ( hdrlist[handle].chanpos[channel] ); } int edfrewind(int handle, int channel) { /* It is equivalent to: (void) edf_seek(int handle, int biosig_signal, 0LL, SEEK_SET) */ if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL || hdrlist[handle].NS<=channel ) return(-1); hdrlist[handle].chanpos[channel] = 0; return(0); } int edf_get_annotation(int handle, int n, struct edf_annotation_struct *annot) { if (handle<0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; annot->onset = hdr->EVENT.POS[n]*1e4/hdr->EVENT.SampleRate; annot->duration = hdr->EVENT.DUR[n]*1e4/hdr->EVENT.SampleRate; strncpy(annot->annotation,GetEventDescription(hdr, n),sizeof(annot->annotation)); return(0); } int edfwrite_annotation(int handle, size_t onset, size_t duration, const char *description) { /* onset and duration are multiples of 100 microseconds */ if (handle < 0 || handle >= hdrlistlen || hdrlist[handle].hdr==NULL) return(-1); HDRTYPE *hdr = hdrlist[handle].hdr; return (biosig_write_annotation(handle, onset*1e-4*hdr->EVENT.SampleRate, duration*1e-4*hdr->EVENT.SampleRate, description)); } /* TODO: the following functions neeed to be implemented */ int edf_set_recording_additional(int handle, const char *recording_additional) { return fprintf(stderr,"this function is not implemented, yet.\n"); } int edfwrite_physical_samples(int handle, double *buf) { return fprintf(stderr,"this function is not implemented, yet.\n"); } int edf_blockwrite_physical_samples(int handle, double *buf) { return fprintf(stderr,"this function is not implemented, yet.\n"); } /* int edfwrite_digital_samples(int handle, int *buf) { return fprintf(stderr,"this function is not implemented, yet.\n"); } */ int edf_blockwrite_digital_samples(int handle, int *buf) { return fprintf(stderr,"this function is not implemented, yet.\n"); } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/0000775000175000017500000000000013315356572016230 500000000000000stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/sopen_igor.c0000664000175000017500000007234413062445067020467 00000000000000/* Copyright (C) 2013,2014 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* #include #include #include */ #include #include #include #include "../biosig-dev.h" #include "../igor/IgorBin.h" #define IGOROLD 1 // will be used for testing and migrating to new version #ifdef __cplusplus extern "C" { #endif #define ITX_MAXLINELENGTH 400 char *IgorChanLabel(char *inLabel, HDRTYPE *hdr, size_t *ngroup, size_t *nseries, size_t *nsweep, size_t *ns) { /* extract Channel Label of IGOR ITX data format */ *ns = 0; // static char Label[ITX_MAXLINELENGTH+1]; int k, s = 0, pos4=0, pos1=0; for (k = strlen(inLabel); inLabel[k] < ' '; k--); inLabel[k+1] = 0; while (inLabel[k] >= ' ') { while ( inLabel[k] >= '0' && inLabel[k] <= '9' ) k--; if (inLabel[k]=='_') { s++; if (s==1) pos4 = k; if (s==4) pos1 = k; k--; } if ( inLabel[k] < '0' || inLabel[k] > '9' ) break; } if (3 < s) { char nvar = 0; for (k = strlen(inLabel); 0 < k && nvar < 4; k--) { if (inLabel[k] == '_') { inLabel[k] = 0; char *v = inLabel+k+1; size_t n = atol(v); switch (nvar) { case 0: *ns = n; nvar++; break; case 1: *nsweep = n; nvar++; break; case 2: *nseries = n; nvar++; break; case 3: *ngroup = n; nvar++; break; } inLabel[k] = 0; } } for (k=1; inLabel[pos4+k-1]; k++) { inLabel[pos1+k] = inLabel[pos4+k]; } } if ((*ns)+1 > hdr->NS) { // another channel hdr->NS = (*ns)+1; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); } return(inLabel); } /* compute igor checksum */ int ibwChecksum(int16_t *data, int flag_swap, int oldcksum, int numbytes) { numbytes >>= 1; // 2 bytes to a short -- ignore trailing odd byte. if (flag_swap) { while(numbytes-- > 0) oldcksum += bswap_16(*(data++)); } else { while(numbytes-- > 0) oldcksum += *(data++); } return oldcksum&0xffff; } /* void ReorderBytes(void *p, int bytesPerPoint, long numValues) // Reverses byte order. { unsigned char ch, *p1, *p2, *pEnd; pEnd = (unsigned char *)p + numValues*bytesPerPoint; while (p < (void *)pEnd) { p1 = p; p2 = (unsigned char *)p + bytesPerPoint-1; while (p1 < p2) { ch = *p1; *p1++ = *p2; *p2-- = ch; } p = (unsigned char *)p + bytesPerPoint; } } */ void ReorderShort(void* sp) { *(uint16_t*)sp = bswap_16(*(uint16_t*)sp); } void ReorderLong(void* lp) { *(uint32_t*)lp = bswap_32(*(uint32_t*)lp); } void ReorderDouble(void* dp) { *(uint64_t*)dp = bswap_64(*(uint64_t*)dp); } void ReorderBinHeader1(BinHeader1* p) { ReorderShort(&p->version); ReorderLong(&p->wfmSize); ReorderShort(&p->checksum); } void ReorderBinHeader2(BinHeader2* p) { ReorderShort(&p->version); ReorderLong(&p->wfmSize); ReorderLong(&p->noteSize); // ReorderLong(&p->pictSize); ReorderShort(&p->checksum); } void ReorderBinHeader3(BinHeader3* p) { ReorderShort(&p->version); ReorderLong(&p->wfmSize); ReorderLong(&p->noteSize); ReorderLong(&p->formulaSize); // ReorderLong(&p->pictSize); ReorderShort(&p->checksum); } void ReorderBinHeader5(BinHeader5* p) { ReorderShort(&p->version); ReorderShort(&p->checksum); ReorderLong(&p->wfmSize); ReorderLong(&p->formulaSize); ReorderLong(&p->noteSize); ReorderLong(&p->dataEUnitsSize); // ReorderBytes(&p->dimEUnitsSize, 4, 4); ReorderLong(&p->dimEUnitsSize[0]); ReorderLong(&p->dimEUnitsSize[1]); ReorderLong(&p->dimEUnitsSize[2]); ReorderLong(&p->dimEUnitsSize[3]); // ReorderBytes(&p->dimLabelsSize, 4, 4); ReorderLong(&p->dimLabelsSize[0]); ReorderLong(&p->dimLabelsSize[1]); ReorderLong(&p->dimLabelsSize[2]); ReorderLong(&p->dimLabelsSize[3]); ReorderLong(&p->sIndicesSize); // ReorderLong(&p->optionsSize1); // ReorderLong(&p->optionsSize2); } void ReorderWaveHeader2(WaveHeader2* p) { ReorderShort(&p->type); // ReorderLong(&p->next); // char bname does not need to be reordered. // ReorderShort(&p->whVersion); // ReorderShort(&p->srcFldr); // ReorderLong(&p->fileName); // char dataUnits does not need to be reordered. // char xUnits does not need to be reordered. ReorderLong(&p->npnts); // ReorderShort(&p->aModified); ReorderDouble(&p->hsA); ReorderDouble(&p->hsB); // ReorderShort(&p->wModified); // ReorderShort(&p->swModified); ReorderShort(&p->fsValid); ReorderDouble(&p->topFullScale); ReorderDouble(&p->botFullScale); // char useBits does not need to be reordered. // char kindBits does not need to be reordered. // ReorderLong(&p->formula); // ReorderLong(&p->depID); ReorderLong(&p->creationDate); // char wUnused does not need to be reordered. ReorderLong(&p->modDate); // ReorderLong(&p->waveNoteH); // The wData field marks the start of the wave data which will be reordered separately. } void ReorderWaveHeader5(WaveHeader5* p) { // ReorderLong(&p->next); ReorderLong(&p->creationDate); ReorderLong(&p->modDate); ReorderLong(&p->npnts); ReorderShort(&p->type); // ReorderShort(&p->dLock); // char whpad1 does not need to be reordered. // ReorderShort(&p->whVersion); // char bname does not need to be reordered. // ReorderLong(&p->whpad2); // ReorderLong(&p->dFolder); // ReorderBytes(&p->nDim, 4, 4); ReorderLong(&p->nDim[0]); ReorderLong(&p->nDim[1]); ReorderLong(&p->nDim[2]); ReorderLong(&p->nDim[3]); // ReorderBytes(&p->sfA, 8, 4); ReorderDouble(&p->sfA[0]); ReorderDouble(&p->sfA[1]); ReorderDouble(&p->sfA[2]); ReorderDouble(&p->sfA[3]); // ReorderBytes(&p->sfB, 8, 4); ReorderDouble(&p->sfB[0]); ReorderDouble(&p->sfB[1]); ReorderDouble(&p->sfB[2]); ReorderDouble(&p->sfB[3]); // char dataUnits does not need to be reordered. // char dimUnits does not need to be reordered. ReorderShort(&p->fsValid); // ReorderShort(&p->whpad3); ReorderDouble(&p->topFullScale); ReorderDouble(&p->botFullScale); /* // according to IgorBin.h, the following stuff can be ignored for reading IBW files // ReorderLong(&p->dataEUnits); // ReorderBytes(&p->dimEUnits, 4, 4); ReorderLong(&p->dimEUnits[0]); ReorderLong(&p->dimEUnits[1]); ReorderLong(&p->dimEUnits[2]); ReorderLong(&p->dimEUnits[3]); // ReorderBytes(&p->dimLabels, 4, 4); ReorderLong(&p->dimLabels[0]); ReorderLong(&p->dimLabels[1]); ReorderLong(&p->dimLabels[2]); ReorderLong(&p->dimLabels[3]); ReorderLong(&p->waveNoteH); // ReorderBytes(&p->whUnused, 4, 16); ReorderShort(&p->aModified); ReorderShort(&p->wModified); ReorderShort(&p->swModified); // char useBits does not need to be reordered. // char kindBits does not need to be reordered. ReorderLong(&p->formula); ReorderLong(&p->depID); ReorderShort(&p->whpad4); ReorderShort(&p->srcFldr); ReorderLong(&p->fileName); ReorderLong(&p->sIndices); // The wData field marks the start of the wave data which will be reordered separately. */ } void sopen_ibw_read (HDRTYPE* hdr) { /* this function will be called by the function SOPEN in "biosig.c" Input: char* Header // contains the file content Output: HDRTYPE *hdr // defines the HDR structure accoring to "biosig.h" */ fprintf(stdout,"Warning: support for IBW is very experimental\n"); uint16_t version = *(uint16_t*)hdr->AS.Header; char flag_swap = (version & 0xFF) == 0; if (flag_swap) version = bswap_16(version); unsigned count=0; int binHeaderSize; int waveHeaderSize; switch (version) { case 1: binHeaderSize=sizeof(BinHeader1); waveHeaderSize=sizeof(WaveHeader2); break; case 2: binHeaderSize=sizeof(BinHeader2); waveHeaderSize=sizeof(WaveHeader2); break; case 3: binHeaderSize=sizeof(BinHeader3); waveHeaderSize=sizeof(WaveHeader2); break; case 5: binHeaderSize=sizeof(BinHeader5); waveHeaderSize=sizeof(WaveHeader5); break; default: if (VERBOSE_LEVEL>7) fprintf(stderr,"ver=%x \n",version); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Igor/IBW: unsupported version number"); return; } count = binHeaderSize+waveHeaderSize; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i): IBW v%i %i %i %i\n",__FILE__,__LINE__,version, binHeaderSize,waveHeaderSize, (int)count); if (hdr->HeadLen < count) { hdr->AS.Header = realloc(hdr->AS.Header, count+1); hdr->HeadLen += ifread(hdr->AS.Header + hdr->HeadLen, 1, count-hdr->HeadLen, hdr); } // compute check sum if ((int)hdr->VERSION == 5) count -= 4; void *buffer = hdr->AS.Header; // Check the checksum. int crc; if ((ibwChecksum((int16_t*)buffer, flag_swap, 0, count))) { if (VERBOSE_LEVEL>7) fprintf(stderr,"ver=%x crc = %x %i %i \n",version, crc, binHeaderSize, waveHeaderSize); biosigERROR(hdr, B4C_CRC_ERROR, "Igor/IBW: checksum error"); return; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i): sizeof BinHeaders %i %i %i %i\n",__FILE__,__LINE__, (int)sizeof(BinHeader1),(int)sizeof(BinHeader2),(int)sizeof(BinHeader3),(int)sizeof(BinHeader5)); // Do byte reordering if the file is from another platform. if (flag_swap) { version = bswap_16(version); switch(version) { case 1: ReorderBinHeader1((BinHeader1*)hdr->AS.Header); break; case 2: ReorderBinHeader2((BinHeader2*)hdr->AS.Header); break; case 3: ReorderBinHeader3((BinHeader3*)hdr->AS.Header); break; case 5: ReorderBinHeader5((BinHeader5*)hdr->AS.Header); break; } switch(version) { case 1: // Version 1 and 2 files use WaveHeader2. case 2: case 3: ReorderWaveHeader2((WaveHeader2*)(hdr->AS.Header+binHeaderSize)); break; case 5: ReorderWaveHeader5((WaveHeader5*)(hdr->AS.Header+binHeaderSize)); break; } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i): sizeof WaveHeaders %i %i %i v%i\n",__FILE__,__LINE__, (int)sizeof(WaveHeader2), (int)sizeof(WaveHeader5), (int)iftell(hdr),version); // Read some of the BinHeader fields. int16_t type = 0; // See types (e.g. NT_FP64) above. Zero for text waves. hdr->NS = 1; hdr->SampleRate = 1; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); // Read some of the WaveHeader fields. switch(version) { case 1: case 2: case 3: { WaveHeader2* w2; w2 = (WaveHeader2*)(buffer+binHeaderSize); type = w2->type; strncpy(hdr->CHANNEL[0].Label, w2->bname, MAX_LENGTH_LABEL); hdr->CHANNEL[0].PhysDimCode = PhysDimCode(w2->dataUnits); hdr->CHANNEL[0].SPR = hdr->SPR = 1; hdr->NRec = w2->npnts; #ifdef IGOROLD hdr->CHANNEL[0].Cal = w2->hsA; hdr->CHANNEL[0].Off = w2->hsB; /* hdr->CHANNEL[0].DigMax = (w2->topFullScale-w2->hsB) / w2->hsA; hdr->CHANNEL[0].DigMin = (w2->botFullScale-w2->hsB) / w2->hsA; */ #else hdr->SampleRate = 1.0 / w2->hsA; hdr->CHANNEL[0].PhysMax = w2->topFullScale; hdr->CHANNEL[0].PhysMin = w2->botFullScale; #endif hdr->FLAG.OVERFLOWDETECTION = !w2->fsValid; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i): %f %f <%s> <%s>\n",__FILE__,__LINE__,w2->hsA,w2->hsB,w2->xUnits,w2->dataUnits); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i): %f %f\n",__FILE__,__LINE__,w2->topFullScale,w2->botFullScale); hdr->HeadLen = binHeaderSize+waveHeaderSize-16; // 16 = size of wData field in WaveHeader2 structure. } break; case 5: { WaveHeader5* w5; w5 = (WaveHeader5*)(buffer+binHeaderSize); type = w5->type; int k; size_t nTraces=1; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i): %i %i %i %i\n", __FILE__, __LINE__, w5->nDim[0], w5->nDim[1], w5->nDim[2], w5->nDim[3]); for (k=1; (w5->nDim[k]!=0) && (k<4); k++) { // count number of traces nTraces *= w5->nDim[k]; } if (nTraces > 1) { // set break marker between traces hdr->EVENT.N = nTraces-1; if (reallocEventTable(hdr, hdr->EVENT.N) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return; }; size_t n; for (n = 0; n < hdr->EVENT.N; n++) { hdr->EVENT.TYP[n] = 0x7ffe; hdr->EVENT.POS[n] = (n+1)*w5->nDim[0]; } } if (VERBOSE_LEVEL>7) { for (k=0; k<4; k++) fprintf(stdout,"%i\t%f\t%f\n",w5->nDim[k],w5->sfA[k],w5->sfB[k]); } strncpy(hdr->CHANNEL[0].Label, w5->bname, MAX_LENGTH_LABEL); hdr->CHANNEL[0].PhysDimCode = PhysDimCode(w5->dataUnits); hdr->CHANNEL[0].SPR = hdr->SPR = 1; hdr->NRec = w5->npnts; hdr->SampleRate /= w5->sfA[0]; #ifdef IGOROLD hdr->CHANNEL[0].Cal = 1.0; hdr->CHANNEL[0].Off = 0.0; #else hdr->CHANNEL[0].PhysMax = w5->topFullScale; hdr->CHANNEL[0].PhysMin = w5->botFullScale; #endif if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %f %f\n",__FILE__,__LINE__,w5->topFullScale,w5->botFullScale); hdr->FLAG.OVERFLOWDETECTION = !w5->fsValid; hdr->HeadLen = binHeaderSize+waveHeaderSize-4; // 4 = size of wData field in WaveHeader5 structure. } break; } if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) Wave name=%s, npnts=%d, type=0x%x.\n", __FILE__, __LINE__, hdr->CHANNEL[0].Label, (int)hdr->NRec, type); uint16_t gdftyp; double digmin=NAN, digmax=NAN; // Consider the number type, not including the complex bit or the unsigned bit. switch(type & ~(NT_CMPLX | NT_UNSIGNED)) { case NT_I8: gdftyp = 1; hdr->AS.bpb = 1; // char break; if (type & NT_UNSIGNED) { gdftyp++; digmin = ldexp(-1,7); digmax = ldexp( 1,7)-1; } else { digmin = 0; digmax = ldexp( 1,8)-1; } break; case NT_I16: gdftyp = 3; hdr->AS.bpb = 2; // short if (type & NT_UNSIGNED) { gdftyp++; digmin = ldexp(-1,15); digmax = ldexp( 1,15)-1; } else { digmin = 0; digmax = ldexp( 1,16)-1; } break; case NT_I32: gdftyp = 5; hdr->AS.bpb = 4; // long if (type & NT_UNSIGNED) { gdftyp++; digmin = ldexp(-1,31); digmax = ldexp( 1,31)-1; } else { digmin = 0; digmax = ldexp( 1,32)-1; } break; case NT_FP32: gdftyp = 16; hdr->AS.bpb = 4; // float digmin = -__FLT_MAX__; digmax = __FLT_MAX__; break; case NT_FP64: gdftyp = 17; hdr->AS.bpb = 8; // double digmin = -__DBL_MAX__; digmax = __DBL_MAX__; break; case 0: // text waves biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Igor/IBW: text waves not supported"); return; default: if (VERBOSE_LEVEL>7) fprintf(stderr,"type=%x \n",version); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Igor/IBW: unsupported or unknown data type"); return; break; } if (type & NT_CMPLX) { hdr->AS.bpb *= 2; // Complex wave - twice as many points. hdr->NS *= 2; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); strcpy(hdr->CHANNEL[2].Label,"imag part"); hdr->CHANNEL[1].Cal = 1.0; hdr->CHANNEL[1].Off = 0.0; hdr->CHANNEL[1].SPR = hdr->SPR; } typeof (hdr->NS) k; size_t bpb=0; for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->GDFTYP = gdftyp; hc->OnOff = 1; hc->DigMin = digmin; hc->DigMax = digmax; #ifdef IGOROLD hc->PhysMax = digmax * hc->Cal + hc->Off; hc->PhysMin = digmin * hc->Cal + hc->Off; #else hc->Cal = (hc->PhysMax - hc->PhysMin) / (digmax - digmin); hc->Off = hc->PhysMin - hc->DigMin * hc->Cal; if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) %f %f %f %f.\n", __FILE__, __LINE__, hc->PhysMax, hc->PhysMin, digmax, digmin); #endif hc->LeadIdCode = 0; hc->bi = bpb; hc->Transducer[0] = 0; hc->TOffset = 0; hc->LowPass = NAN; hc->HighPass = NAN; hc->Notch = NAN; hc->Impedance = NAN; hc->XYZ[0] = 0; hc->XYZ[1] = 0; hc->XYZ[2] = 0; bpb += GDFTYP_BITS[gdftyp]/8; } hdr->FILE.POS = 0; hdr->AS.first = 0; hdr->AS.length= 0; hdr->data.block = NULL; hdr->AS.rawdata = NULL; if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) %i %i %i 0x%x\n", __FILE__, __LINE__, (int)hdr->HeadLen, (int)hdr->FILE.size, (int)(hdr->AS.bpb*hdr->NRec), (int)(hdr->HeadLen+hdr->AS.bpb*hdr->NRec)); #ifndef IGOROLD size_t endpos = hdr->HeadLen + hdr->AS.bpb * hdr->NRec; if (endpos < hdr->FILE.size) { /* * If data were recorded with NeuroMatic/NClamp: http://www.neuromatic.thinkrandom.com/ * some additional information like SamplingRate, Scaling, etc. can be obtained from * a text block at the end of a file. */ size_t sz = hdr->FILE.size-endpos; char *tmpstr = malloc(sz+1); ifseek(hdr, endpos, SEEK_SET); ifread(tmpstr, 1, sz, hdr); tmpstr[sz]=0; char *ptr = tmpstr; // skip 0-bytes at the beginning of the block while ((ptr != (tmpstr+sz)) && (*ptr==0)) { ptr++; } if (ptr != tmpstr + sz) { // if block is not empty if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) [%i]<%s>\n", __FILE__, __LINE__, sz, ptr); // parse lines char *line = strtok(ptr,"\n\r\0"); CHANNEL_TYPE *hc = hdr->CHANNEL+0; struct tm t; while (line != NULL) { if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) <%s>\n", __FILE__, __LINE__, line); size_t p = strcspn(line,":"); // search for field delimiter if (!strncmp(line,"ADCname",p)) { strncpy(hc->Label,line+p+1,MAX_LENGTH_LABEL+1); hc->Label[MAX_LENGTH_LABEL]=0; } else if (!strncmp(line,"ADCunits",p)) { hc->PhysDimCode = PhysDimCode(line+p+1); if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) %s<%s>\n", __FILE__, __LINE__, line+p+1, PhysDim3(hc->PhysDimCode)); } else if (!strncmp(line,"ADCunitsX",p)) { if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) Fs=%f %s\n", __FILE__, __LINE__, hdr->SampleRate, line+p+1); if (!strcmp(line+p+1,"msec")) line[p+3]=0; hdr->SampleRate /= PhysDimScale(PhysDimCode(line+p+1)); if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) %f Hz\n", __FILE__, __LINE__, hdr->SampleRate); } else if (!strncmp(line,"ADCscale",p)) { hc->Cal = strtod(line+p+1,NULL); if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) Cal %f %s\n", __FILE__, __LINE__, hc->Cal, line+p+1); hc->PhysMax = hc->DigMax * hc->Cal; hc->PhysMin = hc->DigMin * hc->Cal; hc->Label[MAX_LENGTH_LABEL]=0; } else if (!strncmp(line,"Time",p)) { ptr = line; // replace separator with : while (*ptr) { if (*ptr==',') *ptr=':'; ptr++; } strptime(line+p+1,"%H:%M:%S",&t); if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) %s\n", __FILE__, __LINE__, line); if (VERBOSE_LEVEL > 7) { char tmp[30]; strftime(tmp,30,"%F %T",&t); fprintf(stdout, "%s (line %i) %s\n", __FILE__, __LINE__, tmp); } } else if (!strncmp(line,"Date",p)) { strptime(line+p+1,"%d %b %Y",&t); t.tm_hour = 0; t.tm_min = 0; t.tm_sec = 0; if (VERBOSE_LEVEL > 7) { char tmp[30]; strftime(tmp,30,"%F %T",&t); fprintf(stdout, "%s (line %i) %s\n", __FILE__, __LINE__, tmp); } } else if (!strncmp(line,"Time Stamp",p)) { //hdr->SampleRate *= hdr->SPR*hdr->NRec/strtod(line+p+1,NULL); } line = strtok(NULL, "\n\r\0"); } hdr->T0 = tm_time2gdf_time(&t); } if (tmpstr) free(tmpstr); } #endif // not defined IGOROLD } /* * utility functions for managing List of Sweep names */ struct sweepnames_t { size_t idx; char *name; struct sweepnames_t *next; }; size_t search_sweepnames(struct sweepnames_t* list, const char* name) { /* first element starts with 1 zero is returned in case of empty list */ struct sweepnames_t* next=list; for (next=list; next!=NULL; next=next->next) { if (!strcmp(next->name, name)) return next->idx; } return 0; } struct sweepnames_t* add_sweepnames(struct sweepnames_t* list, const char* name) { struct sweepnames_t* next = (struct sweepnames_t*)malloc(sizeof(struct sweepnames_t)); next->name = strdup(name); next->idx = list==NULL ? 1 : list->idx+1; next->next = list; return next; } size_t count_sweepnames(struct sweepnames_t* list) { size_t count = 0; for (; list!=NULL; list=list->next) count++; return count; } void clear_sweepnames(struct sweepnames_t* list) { if (list==NULL) return; if (list->name) free(list->name); clear_sweepnames(list->next); free(list->next); } void sopen_itx_read (HDRTYPE* hdr) { #define IGOR_MAXLENLINE 400 char line[IGOR_MAXLENLINE+1]; char flagData = 0; char flagSupported = 1; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) start reading %s,v%4.2f format (%i)\n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION,ifeof(hdr)); typeof(hdr->SPR) SPR = 0, spr = 0; typeof(hdr->NS) ns = 0; int chanNo=0, sweepNo=0; hdr->SPR = 0; hdr->NRec= 0; struct sweepnames_t* sweepname_list=NULL; /* checks the structure of the file and extracts formating information */ ifseek(hdr,0,SEEK_SET); int c = ifgetc(hdr); // read first character while (!ifeof(hdr)) { if (VERBOSE_LEVEL>8) fprintf(stdout,"%s (line %i) start reading %s,v%4.2f format (%i)\n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION,(int)iftell(hdr)); int i = 0; while ( (c != -1) && (c != 10) && (c != 13) && (i < IGOR_MAXLENLINE) ) { // terminate when any line break occurs line[i++] = c; c = ifgetc(hdr); }; line[i] = 0; while (isspace(c)) c = ifgetc(hdr); // keep first non-space character of next line in buffer if (VERBOSE_LEVEL>8) fprintf(stdout,"\t%s (line %i) <%s> (%i)\n",__FILE__,__LINE__,line,(int)iftell(hdr)); if (!strncmp(line,"BEGIN",5)) { flagData = 1; spr = 0; hdr->CHANNEL[ns].bi = SPR*sizeof(double); } else if (!strncmp(line,"END",3)) { flagData = 0; if ((SPR!=0) && (SPR != spr)) { flagSupported = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) ITX (not supported): %i, %i \n",__FILE__,__LINE__, SPR, spr); } else SPR = spr; if (ns==0) hdr->SPR += SPR; } else if (!strncmp(line,"X SetScale/P x",14)) { /* This line seems to have inconsistant formating, some times an comma is following the first 14 bytes, some times no comma is found. here are some examples X SetScale/P x, 0.000000000E+00, 5.000000000E-05,"s", AP101222bp_1_63_1_2 X SetScale/P x 0,5e-05,"s", f0ch1w1_1_0to0_Co_TCh; SetScale y 0,1e-09,"A", f0ch1w1_1_0to0_Co_TCh */ double TOffset = atof(strtok(line+15,",")); if (isnan(hdr->CHANNEL[ns].TOffset)) hdr->CHANNEL[ns].TOffset = TOffset; else if (fabs(hdr->CHANNEL[ns].TOffset - TOffset) > 1e-12) fprintf(stderr,"Warning TOffsets in channel #%i do not match (%f,%f)", ns, hdr->CHANNEL[ns].TOffset, TOffset); double dur = atof(strtok(NULL,",")); char *p = strchr(line,'"'); if (p != NULL) { p++; char *p2 = strchr(p,'"'); if (p2 != NULL) *p2=0; dur *= PhysDimScale(PhysDimCode(p)); } double div = spr / (hdr->SampleRate * dur); if (ns==0) { hdr->SampleRate = 1.0 / dur; } else if (hdr->SampleRate == 1.0 / dur) ; else if (div == floor(div)) { hdr->SampleRate *= div; } } else if (!strncmp(line,"X SetScale y,",13)) { char *p = strchr(line,'"'); if (p!=NULL) { p++; char *p2 = strchr(p,'"'); if (p2!=NULL) *p2=0; if (hdr->CHANNEL[ns].PhysDimCode == 0) hdr->CHANNEL[ns].PhysDimCode = PhysDimCode(p); else if (hdr->CHANNEL[ns].PhysDimCode != PhysDimCode(p)) { flagSupported = 0; // physical units do not match if (VERBOSE_LEVEL>7) fprintf(stdout,"[%s:%i] ITX (not supported): %i, %i,<%s> \n",__FILE__,__LINE__, hdr->CHANNEL[ns].PhysDimCode,PhysDimCode(p),p); } } } else if (!strncmp(line,"WAVES",5)) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): <%s>#%i: %i/%i\n",__FILE__,__LINE__,line,(int)ns,(int)spr,(int)hdr->SPR); char *p; p = strrchr(line,'_'); ns = 0; sweepNo = 0; if (p != NULL) { chanNo = strtol(p+1, NULL, 10); if (chanNo > 0) ns = chanNo - 1; // if decoding fails, assume there is only a single channel p[0] = 0; if (search_sweepnames(sweepname_list, line) == 0) { // when sweep not found, add to list sweepname_list = add_sweepnames(sweepname_list, line); } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) ITX (supported %i): %i, %i, %i, %i, %i\n",__FILE__,__LINE__, flagSupported, (int)ns, (int)spr, (int)hdr->SPR, chanNo, sweepNo); if (ns >= hdr->NS) { hdr->NS = ns+1; hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): <%s>#%i: %i/%i\n",__FILE__,__LINE__,line,(int)ns,(int)spr,(int)hdr->SPR); CHANNEL_TYPE* hc = hdr->CHANNEL + ns; strncpy(hc->Label, line+6, MAX_LENGTH_LABEL); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): <%s>#%i: %i/%i\n",__FILE__,__LINE__,line,(int)ns,(int)spr,(int)hdr->SPR); hc->OnOff = 1; hc->GDFTYP = 17; hc->DigMax = (double)(int16_t)(0x7fff); hc->DigMin = (double)(int16_t)(0x8000); hc->LeadIdCode = 0; hc->Cal = 1.0; hc->Off = 0.0; hc->Transducer[0] = '\0'; hc->LowPass = NAN; hc->HighPass = NAN; hc->TOffset = NAN; hc->PhysMax = hc->Cal * hc->DigMax; hc->PhysMin = hc->Cal * hc->DigMin; hc->PhysDimCode = 0; // decode channel number and sweep number if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): <%s>#%i: %i/%i\n",__FILE__,__LINE__,line,(int)ns,(int)spr,(int)hdr->SPR); } else if (flagData) spr++; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): scaning %s,v%4.2f format (supported: %i)\n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION,flagSupported); if (!flagSupported) { clear_sweepnames(sweepname_list); biosigERROR(hdr, hdr->AS.B4C_ERRNUM, "This ITX format is not supported. Possible reasons: not generated by Heka-Patchmaster, corrupted, physical units do not match between sweeos, or do not fullfil some other requirements"); return; } hdr->NRec = count_sweepnames(sweepname_list); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): [%i,%i,%i] = %i, %i\n",__FILE__,__LINE__,(int)hdr->NS,(int)hdr->SPR,(int)hdr->NRec,(int)hdr->NRec*hdr->SPR*hdr->NS, (int)hdr->AS.bpb); hdr->EVENT.N = hdr->NRec - 1; hdr->EVENT.SampleRate = hdr->SampleRate; hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, hdr->EVENT.N * sizeof(*hdr->EVENT.POS)); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, hdr->EVENT.N * sizeof(*hdr->EVENT.TYP)); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = (gdf_time*)realloc(hdr->EVENT.TimeStamp, hdr->EVENT.N*sizeof(gdf_time)); #endif hdr->NRec = hdr->SPR; hdr->SPR = 1; hdr->AS.first = 0; hdr->AS.length = hdr->NRec; hdr->AS.bpb = sizeof(double)*hdr->NS; for (ns=0; ns < hdr->NS; ns++) { hdr->CHANNEL[ns].SPR = hdr->SPR; hdr->CHANNEL[ns].bi = sizeof(double)*ns; } double *data = (double*)realloc(hdr->AS.rawdata,hdr->NRec*hdr->SPR*hdr->NS*sizeof(double)); hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); // no swapping hdr->AS.rawdata = (uint8_t*) data; /* reads and converts data into biosig structure */ spr = 0;SPR = 0; ifseek(hdr, 0, SEEK_SET); c = ifgetc(hdr); // read first character while (!ifeof(hdr)) { int i = 0; while ( (c != -1) && (c != 10) && (c != 13) && (i < IGOR_MAXLENLINE) ) { // terminate when any line break occurs line[i++] = c; c = ifgetc(hdr); }; line[i] = 0; while (isspace(c)) c = ifgetc(hdr); // keep first non-space character of next line in buffer if (!strncmp(line,"BEGIN",5)) { flagData = 1; spr = 0; } else if (!strncmp(line,"END",3)) { flagData = 0; if (chanNo+1 == hdr->NS) SPR += spr; } else if (!strncmp(line,"X SetScale y,",13)) { //ns++; } else if (!strncmp(line,"WAVES",5)) { // decode channel number and sweep number chanNo = 0; sweepNo= 0; char *p; p = strrchr(line,'_'); if (p != NULL) { chanNo = strtol(p+1,NULL,10); if (chanNo > 0) chanNo--; // if decoding fails, assume there is only a single channel. p[0] = 0; sweepNo = search_sweepnames(sweepname_list, line); if (sweepNo > 0) sweepNo--; // if decoding fails, assume there is only a single sweep } spr = 0; if (sweepNo > 0 && chanNo==0) { hdr->EVENT.POS[sweepNo-1] = SPR; hdr->EVENT.TYP[sweepNo-1] = 0x7ffe; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[sweepNo-1] = 0; #endif } } else if (flagData) { double val = atof(line); data[hdr->NS*(SPR + spr) + chanNo] = val; spr++; } } clear_sweepnames(sweepname_list); hdr->EVENT.N = sweepNo; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): reading %s,v%4.2f format finished \n",__FILE__,__LINE__,GetFileTypeString(hdr->TYPE),hdr->VERSION); hdr->SPR = 1; hdr->NRec *= hdr->SPR; hdr->AS.first = 0; hdr->AS.length = hdr->NRec; hdr->AS.bpb = sizeof(double)*hdr->NS; #undef IGOR_MAXLENLINE } #ifdef __cplusplus } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/scp-decode.cpp0000664000175000017500000031101313240263033020643 00000000000000/* $Id: scp-decode.cpp,v 1.24 2008-07-12 20:46:58 schloegl Exp $ Copyright (C) 2011,2014 Alois Schloegl Copyright (C) 2011 Stoyan Mihaylov This function is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ Modifications by Alois Schloegl Jul 2011: get rid of warnings for unitialized variables and signed/unsigned comparison Jun 2007: replaced ultoa with sprintf Aug 2007: On-The-Fly-Decompression using ZLIB Oct 2007: Consider SunOS/SPARC platform obsolete code sections marked, this reduced SegFault from 18 to 1. --------------------------------------------------------------------------- Copyright (C) 2006 Eugenio Cervesato. Developed at the Associazione per la Ricerca in Cardiologia - Pordenone - Italy, based on the work of Eugenio Cervesato & Giorgio De Odorico. The original Copyright and comments follow. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --------------------------------------------------------------------------- ______________________________________________________________________________ scp-decode.cpp This is the "decode" module of the program SCP-AV. It opens an SCP-ECG v1.0 to v2.0 test file and extracts all the informations. Release 2.3 - feb 2006 --------------------------------------------------------------------------- ************************************************************************** ************************* original Copyright ***************************** Copyright (C) 2003-2004 Eugenio Cervesato & Giorgio De Odorico. Developed at the Associazione per la Ricerca in Cardiologia - Pordenone - Italy. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --------------------------------------------------------------------------- */ //______________________________________________________________________________ /* scp-decode.cpp This is the "decode" module of the program SCP-AV. It opens an SCP-ECG v1.3 or v2.0 test file and extracts all the informations. Developed by ING. GIORGIO DE ODORICO (giorgio.deodorico@tiscali.it) Documentation of the standard comes mainly from: http://www.centc251.org/TCMeet/doclist/TCdoc02/N02-015-prEN1064.pdf Internationalization, test, bug fix by Eugenio Cervesato (eugenio.cervesato@aopn.fvg.it) Release 2.1 - february 2004 */ // ************************* end of the original Copyright ***************************** // contribution of Michael Breuss . see 'by MB' in the sources // contribution of Stelios Sfakianakis . see 'by SS' in the sources // contribution of Federico cantini . see 'by FeC' in the sources //void remark(char *string); // #define WITH_OBSOLETE_PARTS // by E.C. 13.10.2003 part nedded to compile with gcc (Linux). // To compile with Borland C++ add the conditional define: WIN32. // In porting, I nedded to adapt fseek() and write a custom ultoa() #define COMPAT //______________________________________________________________________________ //#include #include //strcat, strcpy #include #include using namespace std; /* error handling should use error variables local to each HDR otherwise, sopen() etc. is not re-entrant. Therefore, use of variables B4C_ERRNUM and B4C_ERRMSG is deprecated; Instead, use biosigERROR for setting error status, and serror2(hdr), hdr->AS.B4C_ERRNUM, hdr->AS.B4C_ERRMSG for error handling. */ __attribute__ ((deprecated)) extern int B4C_ERRNUM; __attribute__ ((deprecated)) extern const char *B4C_ERRMSG; //______________________________________________________________________________ // FILE POINTERS #include "../biosig-dev.h" #include "structures.h" #include "codes.h" // the following define is private of Eugenio Cervesato. Please other readers ignore it! #ifdef CPPBUILDER3 #include "CPPBUILDER3.h" // inside are definitions needed to run on C++Builder GUI as a standalone module and bypass ZLIB #endif // end of private define. HDRTYPE* in; //--------------------------------------------------------------------------- static uint32_t _COUNT_BYTE=1UL; // counter of bytes read static uint32_t _DIM_FILE; // file length in byte static const uint8_t _NUM_SECTION=12U; // sections over 11 are not considered //______________________________________________________________________________ // section 2 uint8_t Input_Bit(uint8_t*,uint16_t&,uint16_t,uint8_t&,bool&); int16_t Input_Bits(uint8_t*,uint16_t&,uint16_t,uint8_t&,uint8_t,bool&); void decompress(TREE_NODE*,int16_t*,uint8_t&,uint16_t&,int32_t*,uint16_t,uint16_t&,table_H*,uint16_t*,uint16_t&); void Tree_Destroy(TREE_NODE*); TREE_NODE *Tree_Create(TREE_NODE*,uint16_t,table_H*,uint16_t); void Huffman(int32_t*,uint16_t*,uint8_t*,uint16_t&,uint16_t,table_H*,uint16_t*); void InitHuffman(table_H*); //inizialize default Huffman table //______________________________________________________________________________ // sections 3, 4, 5 and 6 template void Differences(int32_t*,t1,uint8_t); void Multiply(int32_t*,uint32_t,uint16_t); void Interpolate(int32_t*,int32_t*,f_lead,lead*,f_Res,Protected_Area*,uint32_t); void ExecFilter(int32_t*,int32_t*,uint32_t&,uint16_t); void DoFilter(int32_t*,int32_t*,f_Res,f_lead,lead*,Protected_Area*,Subtraction_Zone*); void DoAdd(int32_t*,int32_t*,f_Res,int32_t*,f_BdR0,Subtraction_Zone*,f_lead,lead*); void Opt_Filter(int32_t*, int32_t*, f_Res, f_lead, lead*, Protected_Area*); //______________________________________________________________________________ // INTERNAL FUNCTIONS char* ReadString(char*,uint16_t); //read a string char *FindString(char*,uint16_t); // calculate the length of a string and write it down int16_t Look(alfabetic*,uint16_t,uint16_t,uint16_t); //look at a number in alfabetic and give the position of the array //______________________________________________________________________________ template void ReadByte(t1&); //read a byte from stream void Skip(uint16_t); //skip some bytes //______________________________________________________________________________ uint16_t ReadCRC(); //read first 6 bytes of the file bool Check_CRC(uint16_t,uint32_t,uint32_t); // CRC check //______________________________________________________________________________ uint32_t ID_section(uint32_t, int8_t &version); //read section ID header void sectionsOptional(pointer_section*,DATA_DECODE &,DATA_RECORD&,DATA_INFO&); //handles optional sections #ifdef WITH_OBSOLETE_PARTS void section_0(pointer_section*, int size_max); //read section 0 void Init_S1(DATA_INFO &inf); void section_1(pointer_section,DATA_INFO&); //read section 1 data void section_1_0(demographic&); //read tag 0 of section 1 void section_1_1(demographic&); //read tag 1 of section 1 void section_1_2(demographic&); // ... and so on ... void section_1_3(demographic&); void section_1_4(demographic&); void section_1_5(demographic&); void section_1_6(demographic&); void section_1_7(demographic&); void section_1_8(demographic&); void section_1_9(demographic&); void section_1_10(clinic&,uint16_t&); void section_1_11(demographic&); void section_1_12(demographic&); void section_1_13(clinic&,uint16_t&); void section_1_14(descriptive&); void section_1_15(descriptive&); void section_1_16(descriptive&); void section_1_17(descriptive&); void section_1_18(descriptive&); void section_1_19(descriptive&); void section_1_20(clinic&); void section_1_21(clinic&); void section_1_22(clinic&); void section_1_23(descriptive&); void section_1_24(descriptive&); void section_1_25(device&); void section_1_26(device&); void section_1_27(device&); void section_1_28(device&); void section_1_29(device&); void section_1_30(clinic&,uint16_t&); void section_1_31(device&); void section_1_32(clinic&,uint16_t&, int8_t version); void section_1_33(device&); void section_1_34(device&); void section_1_35(clinic&,uint16_t&); void section_1_(); //skip tags of the manufacturer of the section 1 void section_1_255(); //read tag 255 of section 1 void section_7(pointer_section,DATA_RECORD&, int8_t version); //read section 7 void section_8(pointer_section,DATA_INFO&); //read section 8 void section_10(pointer_section,DATA_RECORD&, int8_t version); //read section 10 void section_11(pointer_section,DATA_INFO&); //read section 11 #endif void section_2(pointer_section,DATA_DECODE&); //read section 2 void section_3(pointer_section,DATA_DECODE&, int8_t version); //read section 3 void section_4(pointer_section,DATA_DECODE&, int8_t version); //read section 4 bool section_5(pointer_section,DATA_DECODE&,bool); //read section 5 void section_6(pointer_section,DATA_DECODE&,bool); //read section 6 //______________________________________________________________________________ void Decode_Data(pointer_section*,DATA_DECODE&,bool&); //______________________________________________________________________________ #define STR_NULL StrNull() void *FreeWithCare(void*P){ //Stoyan - else I got problems with some scp files - prestandart or so if(P) free(P); return NULL; } void *mymalloc(size_t size) // by E.C. 07.11.2003 this is a workaround for a bug { // present somewhere in memory allocation. // char buff[30]; // this problem should be fixed next! // ultoa(size, buff, 10); // used for debug purposes, shows the size // remark(buff); // fprintf(stdout,"MYMEMALLOC: %i\n",size); // void *res=malloc(size*2); // this way each time a doubled memory is requested. And it works!! void *res=malloc(size); return res; } const int StrNullLen=strlen(" unspecified/unknown "); char * StrNull(){ //Stoyan this way we can release everything char*Ret=(char*)mymalloc(StrNullLen+4); strcpy(Ret," unspecified/unknown "); return Ret; } /* moved by MB must be declared before first call (otherwise compiler error) */ //--------------------------------BYTE & BIT------------------------------------ template void ReadByte(t1 &number) { //read the requested number of bytes and //convert in decimal, taking into account that the first byte is the LSB. //the sign of the number is kept uint8_t *num, dim=sizeof(t1); uint8_t mask=0xFF; if(dim!=0 && (num=(uint8_t*)mymalloc(dim))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } ifread(num,dim,1,in); // *num = *(uint8_t*)(in->AS.Header+_COUNT_BYTE); number=0; _COUNT_BYTE+=dim; while((dim--)>0) { number<<=8; number+=num[dim]&mask; } free(num); }//end ReadByte // MAIN EXTERN_C void sopen_SCP_clean(struct DATA_DECODE *decode, struct DATA_RECORD *record, struct DATA_INFO *textual) { FreeWithCare(decode->length_BdR0); FreeWithCare(decode->samples_BdR0); FreeWithCare(decode->length_Res); FreeWithCare(decode->samples_Res); FreeWithCare(decode->t_Huffman); FreeWithCare(decode->flag_Huffman); FreeWithCare(decode->data_lead); FreeWithCare(decode->data_protected); FreeWithCare(decode->data_subtraction); FreeWithCare(decode->Median); FreeWithCare(decode->Residual); FreeWithCare(decode->Reconstructed); FreeWithCare(record->data_spike); FreeWithCare(record->type_BdR); FreeWithCare(record->data_BdR); FreeWithCare(record->data_additional); FreeWithCare(record->lead_block); FreeWithCare(textual->text_dim); FreeWithCare(textual->data_statement); FreeWithCare(textual->text_statement); FreeWithCare(textual->ana.last_name); FreeWithCare(textual->ana.first_name); FreeWithCare(textual->ana.ID); FreeWithCare(textual->ana.second_last_name); FreeWithCare(textual->cli.text_drug); FreeWithCare(textual->cli.text_diagnose); FreeWithCare(textual->cli.referring_physician); FreeWithCare(textual->cli.latest_confirming_physician); FreeWithCare(textual->cli.technician_description); FreeWithCare(textual->cli.text_free_text); FreeWithCare(textual->cli.text_free_medical_hystory); FreeWithCare(textual->cli.medical_hystory); FreeWithCare(textual->cli.free_text); FreeWithCare(textual->cli.drug); FreeWithCare(textual->des.acquiring.model_description); FreeWithCare(textual->des.acquiring.analysing_program_revision_number); FreeWithCare(textual->des.acquiring.serial_number_device); FreeWithCare(textual->des.acquiring.device_system_software); FreeWithCare(textual->des.acquiring.device_SCP_implementation_software); FreeWithCare(textual->des.acquiring.manifacturer_trade_name); FreeWithCare(textual->des.analyzing.model_description); FreeWithCare(textual->des.analyzing.analysing_program_revision_number); FreeWithCare(textual->des.analyzing.serial_number_device); FreeWithCare(textual->des.analyzing.device_system_software); FreeWithCare(textual->des.analyzing.device_SCP_implementation_software); FreeWithCare(textual->des.analyzing.manifacturer_trade_name); FreeWithCare(textual->des.acquiring_institution); FreeWithCare(textual->des.analyzing_institution); FreeWithCare(textual->des.acquiring_department); FreeWithCare(textual->des.analyzing_department); FreeWithCare(textual->des.room); FreeWithCare(textual->dev.sequence_number); FreeWithCare((char*)textual->dev.TZ.description); } //There is serious problem if we try to transfer whole structures between c and c++. I am not sure were exactly it is, but using pointers - solve it. extern C is not enough. Stoyan EXTERN_C int scp_decode(HDRTYPE* hdr, pointer_section *section, struct DATA_DECODE *decode, struct DATA_RECORD *info_recording, struct DATA_INFO *info_textual, bool add_filter) { uint16_t CRC; uint32_t pos; if (hdr->FILE.OPEN) { ifseek(hdr,0,SEEK_SET); } else hdr = ifopen(hdr,"rb"); if (!hdr->FILE.OPEN) { fprintf(stdout,"Cannot open the file %s.\n",hdr->FileName); return FALSE; // by E.C. 15.10.2003 now return FALSE } in = hdr; _COUNT_BYTE=1UL; CRC=ReadCRC(); pos=_COUNT_BYTE; ReadByte(_DIM_FILE); // if (CRC != 0xFFFF) Check_CRC(CRC,pos,_DIM_FILE-2U); // by E.C. may 2004 CARDIOLINE 1.0 ifseek(in, 0L, SEEK_SET); //mandatory sections #ifdef WITH_OBSOLETE_PARTS section_0(section, _DIM_FILE); // by E.C. may 2004 check file size section_1(section[1],*info_textual); sectionsOptional(section,*decode,*info_recording,*info_textual); #else if (section[2].length>0) section_2(section[2],*decode); //HUFFMAN if (section[3].length>0) section_3(section[3],*decode,hdr->aECG->Section1.Tag14.VERSION); //lead if (section[4].length) section_4(section[4],*decode,hdr->aECG->Section1.Tag15.VERSION); // fiducial locations if (section[5].length) if (!section_5(section[5],*decode,section[2].length)) section[5].length=0 ; //type 0 median beat if (section[6].length) section_6(section[6],*decode,section[2].length); //rhythm compressed data #endif ifclose(in); Decode_Data(section,*decode,add_filter); return TRUE; // by E.C. 15.10.2003 now return TRUE } //______________________________________________________________________________ // COMPUTATIONAL FUNCTIONS #ifdef WITH_OBSOLETE_PARTS //------------------------------STRINGS---------------------------------------- char *ReadString(char *temp_string, uint16_t num) //read a string from the stream. //the first extracted byte is written for fist. //each byte read from the stream is first "transformed" in char. { if(temp_string) free(temp_string); if(!num) return NULL;//before alocating memory, which will be loosed in case of num=0 if((temp_string=(char*)mymalloc(sizeof(char)*(num+2)))==NULL) // by E.C. 26.02.2004 one more byte { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return NULL; } _COUNT_BYTE+=num; ifread(temp_string,sizeof(char),num,in); if (temp_string[num-1]!='\0') temp_string[num]='\0'; return temp_string; }//end ReadString int16_t Look(alfabetic *code_, uint16_t a, uint16_t b, uint16_t key_) // look num in code_.number and give the element position { uint16_t middle=(a+b)/2U; if(code_[middle].number==key_) return middle; if(a>=b) return -1; if(code_[middle].number0U) ifseek(in,num,1U); _COUNT_BYTE+=num; }//end Skip //______________________________________________________________________________ // INITIALIZATION FUNCTIONS void InitHuffman(table_H *riga) //build the default Huffman table { /* The table is contructed as stated in the protocol SCP-ECG; each structure in each line. Columns are: bit_prefix = number of bits in the prefix bit_code = number of bits in the code TMS = table mode base_value = base value (decoded) cp = prefix code (in bits) base_code = decimal value of reversed cp From the stream I take a bit at a time until I find a correspondent value in the Huffman table. If: nbp=nbc the decode value is vb nbp!=nbc if m=1 I take nbc-nbp bits next in the stream if m=0 change to table vb Remark: Huffman tables stored in the stream contain vb in 2 complemented bytes. The decimal value of cp is included. Furthermore, always the MSB comes first! In my Huffman tables I set cp as a decimal value. Infact, I read a group of bits from the stream and convert them by multipying by 2^pos (where pos is 0 for bit 0, 1 for bit 1 and so on). So I read bits as they are. DEFAULT HUFFMAN TABLE nbp nbc m vb cp10 cp 1, 1, 1, 0, 0, 0, 3, 3, 1, 1, 1, 4, 3, 3, 1, -1, 5, 5, 4, 4, 1, 2, 3, 12, 4, 4, 1, -2, 11, 13, 5, 5, 1, 3, 7, 28, 5, 5, 1, -3, 23, 29, 6, 6, 1, 4, 15, 60, 6, 6, 1, -4, 47, 61, 7, 7, 1, 5, 31, 124, 7, 7, 1, -5, 95, 125, 8, 8, 1, 6, 63, 252, 8, 8, 1, -6, 191, 253, 9, 9, 1, 7, 127, 508, 9, 9, 1, -7, 383, 509, 10, 10, 1, 8, 255, 1020, 10, 10, 1, -8, 767, 1021, 10, 18, 1, 0, 511, 1022, 10, 26, 1, 0, 1023, 1023, */ uint8_t i; i= 0U; riga[i].bit_prefix= 1U; riga[i].bit_code= 1U; riga[i].TMS=1U; riga[i].base_value= 0; riga[i].base_code= 0UL; i= 1U; riga[i].bit_prefix= 3U; riga[i].bit_code= 3U; riga[i].TMS=1U; riga[i].base_value= 1; riga[i].base_code= 1UL; i= 2U; riga[i].bit_prefix= 3U; riga[i].bit_code= 3U; riga[i].TMS=1U; riga[i].base_value=-1; riga[i].base_code= 5UL; i= 3U; riga[i].bit_prefix= 4U; riga[i].bit_code= 4U; riga[i].TMS=1U; riga[i].base_value= 2; riga[i].base_code= 3UL; i= 4U; riga[i].bit_prefix= 4U; riga[i].bit_code= 4U; riga[i].TMS=1U; riga[i].base_value=-2; riga[i].base_code= 11UL; i= 5U; riga[i].bit_prefix= 5U; riga[i].bit_code= 5U; riga[i].TMS=1U; riga[i].base_value= 3; riga[i].base_code= 7UL; i= 6U; riga[i].bit_prefix= 5U; riga[i].bit_code= 5U; riga[i].TMS=1U; riga[i].base_value=-3; riga[i].base_code= 23UL; i= 7U; riga[i].bit_prefix= 6U; riga[i].bit_code= 6U; riga[i].TMS=1U; riga[i].base_value= 4; riga[i].base_code= 15UL; i= 8U; riga[i].bit_prefix= 6U; riga[i].bit_code= 6U; riga[i].TMS=1U; riga[i].base_value=-4; riga[i].base_code= 47UL; i= 9U; riga[i].bit_prefix= 7U; riga[i].bit_code= 7U; riga[i].TMS=1U; riga[i].base_value= 5; riga[i].base_code= 31UL; i=10U; riga[i].bit_prefix= 7U; riga[i].bit_code= 7U; riga[i].TMS=1U; riga[i].base_value=-5; riga[i].base_code= 95UL; i=11U; riga[i].bit_prefix= 8U; riga[i].bit_code= 8U; riga[i].TMS=1U; riga[i].base_value= 6; riga[i].base_code= 63UL; i=12U; riga[i].bit_prefix= 8U; riga[i].bit_code= 8U; riga[i].TMS=1U; riga[i].base_value=-6; riga[i].base_code= 191UL; i=13U; riga[i].bit_prefix= 9U; riga[i].bit_code= 9U; riga[i].TMS=1U; riga[i].base_value= 7; riga[i].base_code= 127UL; i=14U; riga[i].bit_prefix= 9U; riga[i].bit_code= 9U; riga[i].TMS=1U; riga[i].base_value=-7; riga[i].base_code= 383UL; i=15U; riga[i].bit_prefix=10U; riga[i].bit_code=10U; riga[i].TMS=1U; riga[i].base_value= 8; riga[i].base_code= 255UL; i=16U; riga[i].bit_prefix=10U; riga[i].bit_code=10U; riga[i].TMS=1U; riga[i].base_value=-8; riga[i].base_code= 767UL; i=17U; riga[i].bit_prefix=10U; riga[i].bit_code=18U; riga[i].TMS=1U; riga[i].base_value= 0; riga[i].base_code= 511UL; i=18U; riga[i].bit_prefix=10U; riga[i].bit_code=26U; riga[i].TMS=1U; riga[i].base_value= 0; riga[i].base_code=1023UL; }//end InitHuffman //______________________________________________________________________________ // handle sections uint16_t ReadCRC() // read the CRC of the entire file or of a section and convert it to decimal. { uint16_t dim; ReadByte(dim); return dim; }//end ReadCRC bool Check_CRC(uint16_t CRC, uint32_t pos, uint32_t length) /* CRC check starting from pos for Length Remark: all computations are in byte. A = new byte B = temp byte CRCHI = MSB of the CRC (16 bits) CRCLO = LSB of the CRC START: for A=first_byte to last_byte in block do: A = A xor CRCHI CRCHI = A shift A right 4 times {fulfill with zeroes} A = A xor CRCHI {I J K L M N O P} CRCHI = CRCLO {swap CRCHI, CRCLO} CRCLO = A rotate A left 4 times {M N O P I J K L} B = A { temp save } rotate A left once { N O P I J K L M } A = A and $1F { 0 0 0 I J L L M } CRCHI = A xor CRCHI A = B and $F0 { M N O P 0 0 0 0 } CRCHI = A xor CRCHI { CRCHI complete } rotate B left once { N O P 0 0 0 0 M } B = B and $E0 { N O P 0 0 0 0 0 } CRCLO = B xor CRCLO { CRCLO complete } end Final check on the CRC is accomplished by adding or concatenating CRCHI and CRCLO at the end of the data stream. Calculating the checksum of the resulting data stream shall result in a zero CRC if the data was correctly received. */ { uint32_t i; uint8_t A, B; uint8_t CRCLO, CRCHI; CRCLO=0xFF; CRCHI=0xFF; ifseek(in,pos-1,0U); for(i=1;i<=length;i++) { A=ifgetc(in); A^=CRCHI; A^=(A>>4); CRCHI=CRCLO; CRCLO=A; A=(A<<4)|(A>>4U); B=A; A=(A<<1)|(A>>7U); A&=0x1F; CRCHI^=A; A=B&0xF0; CRCHI^=A; B=(B<<1)|(B>>7U); B&=0xE0; CRCLO^=B; }//end for CRCLO-=CRC%256UL; CRCHI-=CRC/256UL; if ((CRCLO==CRCHI) && (CRCLO==0)) return 1; else { fprintf(stderr,"Cannot read the file: BAD CRC.\n"); // exit(2); return 0; } }//end Check_CRC uint32_t ID_section(uint32_t pos, int8_t &version) //read section Header { uint32_t dim; uint16_t CRC; CRC=ReadCRC(); Skip(2U); ReadByte(dim); // if (CRC != 0xFFFF) Check_CRC(CRC,pos+2,dim-2); // by E.C. may 2004 CARDIOLINE 1.0 ifseek(in,pos+7L,0); ReadByte(version); // by E.C. may 2004 store the version number Skip(7U); return dim; }//end ID_section void sectionsOptional(pointer_section *section, DATA_DECODE &block1, DATA_RECORD &block2, DATA_INFO &block3) //handles optional sections { uint8_t i=0, bimodal; //initialization block1.t_Huffman=NULL; block1.flag_Huffman=NULL; block1.data_lead=NULL; block1.data_protected=NULL; block1.data_subtraction=NULL; block1.length_BdR0=NULL; block1.samples_BdR0=NULL; block1.Median=NULL; block1.length_Res=NULL; block1.samples_Res=NULL; block1.Residual=NULL; // block1.Reconstructed=NULL; block2.data_spike=NULL; block2.type_BdR=NULL; block2.data_BdR=NULL; block2.data_additional=NULL; block2.lead_block=NULL; block3.text_dim=NULL; block3.text_report=NULL; block3.data_statement=NULL; block3.text_statement=NULL; //variables inizialization block1.flag_lead.number=0; block1.flag_lead.subtraction=0; block1.flag_lead.all_simultaneously=0; block1.flag_lead.number_simultaneously=0; block1.flag_BdR0.length=0; block1.flag_BdR0.fcM=0; block1.flag_BdR0.AVM=0; block1.flag_BdR0.STM=0; block1.flag_BdR0.number_samples=0; block1.flag_BdR0.encoding=0; block1.flag_Res.AVM=0; block1.flag_Res.STM=0; block1.flag_Res.number=0; block1.flag_Res.number_samples=0; block1.flag_Res.encoding=0; block1.flag_Res.bimodal=0; block1.flag_Res.decimation_factor=0; block2.data_global.number=0; block2.data_global.number_QRS=0; block2.data_global.number_spike=0; block2.data_global.average_RR=0; block2.data_global.average_PP=0; block2.data_global.ventricular_rate=0; block2.data_global.atrial_rate=0; block2.data_global.QT_corrected=0; block2.data_global.formula_type=0; block2.data_global.number_tag=0; block2.header_lead.number_lead=0; block2.header_lead.number_lead_measurement=0; while(i<_NUM_SECTION) { if(section[i].ID) switch(section[i].ID) { case 2: if(section[i].length) section_2(section[i],block1); //HUFFMAN break; case 3: if(section[i].length) section_3(section[i],block1,block3.des.acquiring.protocol_revision_number); //lead break; case 4: if(section[i].length) { if((block3.des.acquiring.protocol_revision_number>10) && section[6].length) // by E.C. 27.02.2004 whole section to be included in {} ! { ifseek(in,section[6].index+22,0); ReadByte(bimodal); block1.flag_Res.bimodal=bimodal; } else block1.flag_Res.bimodal=0; section_4(section[i],block1,block3.des.analyzing.protocol_revision_number); // fiducial locations } break; case 5: if(section[i].length) if (!section_5(section[i],block1,section[2].length)) section[i].length=0 ; //type 0 median beat break; case 6: if(section[i].length) section_6(section[i],block1,section[2].length); //rhythm compressed data break; #ifdef WITH_OBSOLETE_PARTS /* case 7: if(section[i].length) section_7(section[i],block2,block3.des.acquiring.protocol_revision_number); //global measurements break; case 8: if(section[i].length) section_8(section[i],block3); //full text interpretative statements break; case 10:if(section[i].length) section_10(section[i],block2,block3.des.acquiring.protocol_revision_number); //lead measurement block break; case 11:if(section[i].length) //universal ECG interpretative statements // section_11(section[i],block3); break; */ #endif }//end switch ++i; }//end while }//end sectionsOptional //______________________________________________________________________________ // sections //______________________________________________________________________________ #ifdef WITH_OBSOLETE_PARTS //______________________________________________________________________________ // section 0 //______________________________________________________________________________ void section_0(pointer_section *info, int size_max) // section 0 //build info_sections with ID, offset and length of each section { uint32_t pos, dim, ini; uint16_t ind; uint8_t i; int8_t version; ifseek(in,6L,0); pos=ID_section(7L, version)+7L; //length + offset _COUNT_BYTE=7L+16L; for(i=0;i<_NUM_SECTION;i++) { info[i].ID=0; info[i].length=0L; info[i].index=0L; } while((_COUNT_BYTE+10)<=pos) { ReadByte(ind); if(ind>11U) Skip(8U); else { ReadByte(dim); if(dim) { ReadByte(ini); if (ini<(unsigned)size_max) { // by E.C. may 2004 check overflow of file info[ind].ID=ind; info[ind].length=dim; info[ind].index=ini; } }//end if dim else Skip(4U); }//end else }//end while }//end section_0 //______________________________________________________________________________ // section 1 //______________________________________________________________________________ void Init_S1(DATA_INFO &inf) { inf.ana.last_name=STR_NULL; inf.ana.first_name=STR_NULL; inf.ana.ID=STR_NULL; inf.ana.second_last_name=STR_NULL; inf.ana.age.value=0; inf.ana.age.unit=0; inf.ana.height.value=0; inf.ana.height.unit=0; inf.ana.weight.value=0; inf.ana.weight.unit=0; inf.ana.sex=0; inf.ana.race=0; inf.ana.systolic_pressure=0; inf.ana.diastolic_pressure=0; inf.cli.number_drug=0; inf.cli.text_drug=STR_NULL; inf.cli.number_diagnose=0; inf.cli.text_diagnose=STR_NULL; inf.cli.referring_physician=STR_NULL; inf.cli.latest_confirming_physician=STR_NULL; inf.cli.technician_description=STR_NULL; inf.cli.number_text=0; inf.cli.text_free_text=STR_NULL; inf.cli.number_hystory=0; inf.cli.number_free_hystory=0; inf.cli.text_free_medical_hystory=STR_NULL; inf.cli.free_text=NULL; inf.cli.medical_hystory=NULL; inf.cli.drug=NULL; inf.des.acquiring.institution_number=0; inf.des.acquiring.department_number=0; inf.des.acquiring.ID=0; inf.des.acquiring.type=2; inf.des.acquiring.manifacturer=0; inf.des.acquiring.model_description=STR_NULL; inf.des.acquiring.protocol_revision_number=0; inf.des.acquiring.category=255; inf.des.acquiring.language=255; inf.des.acquiring.capability[0]=1; inf.des.acquiring.capability[1]=2; inf.des.acquiring.capability[2]=3; inf.des.acquiring.capability[3]=4; inf.des.acquiring.AC=0; inf.des.acquiring.analysing_program_revision_number=STR_NULL; inf.des.acquiring.serial_number_device=STR_NULL; inf.des.acquiring.device_system_software=STR_NULL; inf.des.acquiring.device_SCP_implementation_software=STR_NULL; inf.des.acquiring.manifacturer_trade_name=STR_NULL; inf.des.analyzing.institution_number=0; inf.des.analyzing.department_number=0; inf.des.analyzing.ID=0; inf.des.analyzing.type=2; inf.des.analyzing.manifacturer=0; inf.des.analyzing.model_description=STR_NULL; inf.des.analyzing.protocol_revision_number=0; inf.des.analyzing.category=255; inf.des.analyzing.language=255; inf.des.analyzing.capability[0]=1; inf.des.analyzing.capability[1]=2; inf.des.analyzing.capability[2]=3; inf.des.analyzing.capability[3]=4; inf.des.analyzing.AC=0; inf.des.analyzing.analysing_program_revision_number=STR_NULL; inf.des.analyzing.serial_number_device=STR_NULL; inf.des.analyzing.device_system_software=STR_NULL; inf.des.analyzing.device_SCP_implementation_software=STR_NULL; inf.des.analyzing.manifacturer_trade_name=STR_NULL; inf.des.acquiring_institution=STR_NULL; inf.des.analyzing_institution=STR_NULL; inf.des.acquiring_department=STR_NULL; inf.des.analyzing_department=STR_NULL; inf.des.room=STR_NULL; inf.des.stat_code=0; inf.dev.baseline_filter=0; inf.dev.lowpass_filter=0; inf.dev.other_filter[0]=0; inf.dev.other_filter[1]=0; inf.dev.other_filter[2]=0; inf.dev.other_filter[3]=0; inf.dev.sequence_number=STR_NULL; inf.dev.electrode_configuration.value=0; inf.dev.electrode_configuration.unit=0; inf.dev.TZ.offset=0; inf.dev.TZ.index=0; inf.dev.TZ.description=STR_NULL; } void section_1(pointer_section info_sections, DATA_INFO &inf) // section 1 { uint8_t tag; uint32_t num=info_sections.length+_COUNT_BYTE; uint16_t dim=0U; int8_t version; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version); Init_S1(inf); do { ReadByte(tag); switch(tag) { case 0: section_1_0(inf.ana); break; case 1: section_1_1(inf.ana); break; case 2: section_1_2(inf.ana); break; case 3: section_1_3(inf.ana); break; case 4: section_1_4(inf.ana); break; case 5: section_1_5(inf.ana); break; case 6: section_1_6(inf.ana); break; case 7: section_1_7(inf.ana); break; case 8: section_1_8(inf.ana); break; case 9: section_1_9(inf.ana); break; case 10: if(!inf.cli.number_drug) { inf.cli.drug=NULL; inf.cli.text_drug=(char*)FreeWithCare(inf.cli.text_drug); dim=0; } section_1_10(inf.cli,dim); break; case 11: section_1_11(inf.ana); break; case 12: section_1_12(inf.ana); break; case 13: if(!inf.cli.number_diagnose) { inf.cli.diagnose=NULL; inf.cli.text_diagnose=(char*)FreeWithCare(inf.cli.text_diagnose); dim=0; } section_1_13(inf.cli,dim); break; case 14: section_1_14(inf.des); break; case 15: section_1_15(inf.des); break; case 16: section_1_16(inf.des); break; case 17: section_1_17(inf.des); break; case 18: section_1_18(inf.des); break; case 19: section_1_19(inf.des); break; case 20: section_1_20(inf.cli); break; case 21: section_1_21(inf.cli); break; case 22: section_1_22(inf.cli); break; case 23: section_1_23(inf.des); break; case 24: section_1_24(inf.des); break; case 25: section_1_25(inf.dev); break; case 26: section_1_26(inf.dev); break; case 27: section_1_27(inf.dev); break; case 28: section_1_28(inf.dev); break; case 29: section_1_29(inf.dev); break; case 30: if(!inf.cli.number_text) { inf.cli.text_free_text=(char*)FreeWithCare(inf.cli.text_free_text); dim=0; } section_1_30(inf.cli,dim); break; case 31: section_1_31(inf.dev); break; case 32: if(!inf.cli.number_hystory) { inf.cli.medical_hystory=NULL; dim=0; } section_1_32(inf.cli,dim,inf.des.acquiring.protocol_revision_number); break; case 33: section_1_33(inf.dev); break; case 34: section_1_34(inf.dev); break; case 35: if(!inf.cli.number_free_hystory) { inf.cli.free_medical_hystory=NULL; inf.cli.text_free_medical_hystory=(char*)FreeWithCare(inf.cli.text_free_medical_hystory); dim=0; } section_1_35(inf.cli,dim); break; case 255: section_1_255(); break; default: section_1_(); break; }//end switch }//end do while((tag!=255) && (_COUNT_BYTE0)) inf.des.analyzing.protocol_revision_number=version; // by E.C. may 2004 CARDIOLINE 1.0 }//end section_1 void section_1_0(demographic &ana) // section 1 tag 0 { uint16_t dim; ReadByte(dim); ana.last_name=ReadString(ana.last_name,dim); }//end section_1_0 void section_1_1(demographic &ana) // section 1 tag 1 { uint16_t dim; ReadByte(dim); ana.first_name=ReadString(ana.first_name,dim); }//end section_1_1 void section_1_2(demographic &ana) //section 1 tag 2 { uint16_t dim; ReadByte(dim); ana.ID=ReadString(ana.ID,dim); }//end section_1_2 void section_1_3(demographic &ana) // section 1 tag 3 { uint16_t dim; ReadByte(dim); ana.second_last_name=ReadString(ana.second_last_name,dim); }//end section_1_3 void section_1_4(demographic &ana) // section 1 tag 4 { uint16_t dim; ReadByte(dim); ReadByte(ana.age.value); ReadByte(ana.age.unit); if(ana.age.unit>5) ana.age.unit=0; }//end section_1_4 void section_1_5(demographic &ana) // section 1 tag 5 { uint16_t dim; uint8_t m, g; uint16_t a; ReadByte(dim); ReadByte(a); ReadByte(m); ReadByte(g); struct tm tmf; // by E.C. feb 2006 tmf.tm_year = a - 1900; tmf.tm_mon = m - 1; tmf.tm_mday = g; tmf.tm_hour = 0; tmf.tm_min = 0; tmf.tm_sec = 0; tmf.tm_isdst = 0; ana.date_birth2 = mktime(&tmf); // store date in native format }//end section_1_5 void section_1_6(demographic &ana) // section 1 tag 6 { uint16_t dim; ReadByte(dim); ReadByte(ana.height.value); ReadByte(ana.height.unit); if(ana.height.unit>3) ana.height.unit=0; }//end section_1_6 void section_1_7(demographic &ana) // section 1 tag 7 { uint16_t dim; ReadByte(dim); ReadByte(ana.weight.value); ReadByte(ana.weight.unit); if(ana.weight.unit>4) ana.weight.unit=0; }//end section_1_7 void section_1_8(demographic &ana) // section 1 tag 8 { uint16_t dim; ReadByte(dim); ReadByte(ana.sex); if(ana.sex>2) ana.sex=3; }//end section_1_8 void section_1_9(demographic &ana) // section 1 tag 9 { uint16_t dim; ReadByte(dim); ReadByte(ana.race); if(ana.race>3) ana.race=0; }//end section_1_9 void section_1_10(clinic &cli, uint16_t &dim) // section 1 tag 10 { uint16_t val; uint8_t code_; char *temp_string=NULL, *pos_char; int16_t pos; ReadByte(val); /* this tag may have more instances; each instance have a: table code (1 byte), class code (1 byte) drug code (1 byte), text description of the drug (at least 1 byte with NULL). */ if(val) { if((cli.drug=(info_drug*)realloc(cli.drug,sizeof(info_drug)*(cli.number_drug+1)))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } ReadByte(cli.drug[cli.number_drug].table); ReadByte(code_); if(!cli.drug[cli.number_drug].table) { pos=Look(class_drug,0,15,code_); if(pos<=0) cli.drug[cli.number_drug].classes=0; else cli.drug[cli.number_drug].classes=pos; } else cli.drug[cli.number_drug].classes=code_; ReadByte(cli.drug[cli.number_drug].drug_code ); if(!cli.drug[cli.number_drug].table) { code_=cli.drug[cli.number_drug].drug_code +256*cli.drug[cli.number_drug].classes; pos=Look(class_drug,16,88,code_); if(pos<0) pos=0; cli.drug[cli.number_drug].drug_code =pos; } cli.drug[cli.number_drug].length=val-3; //string length + NULL if(cli.drug[cli.number_drug].length) { temp_string=ReadString(temp_string,cli.drug[cli.number_drug].length); strcat(temp_string,STR_END); dim+=strlen(temp_string); if((cli.text_drug=(char*)realloc(cli.text_drug,sizeof(char)*(dim+1)))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } pos_char=cli.text_drug; pos_char+=dim-strlen(temp_string); strcpy(pos_char,temp_string); free(temp_string); } cli.number_drug++; } }//end section_1_10 void section_1_11(demographic &ana) // section 1 tag 11 { uint16_t dim; ReadByte(dim); if(dim) ReadByte(ana.systolic_pressure); else ana.systolic_pressure=0; }//end section_1_11 void section_1_12(demographic &ana) // section 1 tag 12 { uint16_t dim; ReadByte(dim); if(dim) ReadByte(ana.diastolic_pressure); else ana.diastolic_pressure=0; }//end section_1_12 void section_1_13(clinic &cli, uint16_t &dim) // section 1 tag 13 { uint16_t val; char *temp_string=NULL, *pos_char; ReadByte(val); if(val) { if((cli.diagnose=(numeric*)realloc(cli.diagnose,sizeof(numeric)*(cli.number_diagnose+1)))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } cli.diagnose[cli.number_diagnose].unit=cli.number_diagnose+1; cli.diagnose[cli.number_diagnose].value=val; temp_string=ReadString(temp_string,cli.diagnose[cli.number_diagnose].value); strcat(temp_string,STR_END); dim+=strlen(temp_string); if((cli.text_diagnose=(char*)realloc(cli.text_diagnose,dim+1))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } pos_char=cli.text_diagnose; pos_char+=dim-strlen(temp_string); strcpy(pos_char,temp_string); free(temp_string); cli.number_diagnose++; } }//end section_1_13 void section_1_14(descriptive &des) // section 1 tag 14 { uint16_t dim, dim_to_skip; uint8_t i, mask, code_; int16_t pos; //fpos_t filepos, filepos_iniz; long filepos, filepos_iniz; ReadByte(dim); filepos = iftell(in); //FGETPOS(in,&filepos); //FGETPOS(in,&filepos_iniz); // by E.C. may 2004 ESAOTE save to reposition at the end of this section filepos_iniz=filepos; dim_to_skip=dim; dim+=filepos COMPAT; ReadByte(des.acquiring.institution_number); ReadByte(des.acquiring.department_number); ReadByte(des.acquiring.ID); ReadByte(des.acquiring.type); if(des.acquiring.type>1) des.acquiring.type=2; ReadByte(des.acquiring.manifacturer); if(des.acquiring.manifacturer>20 && des.acquiring.manifacturer!=255) des.acquiring.manifacturer=0; des.acquiring.model_description=ReadString(des.acquiring.model_description,6); ReadByte(des.acquiring.protocol_revision_number); ReadByte(des.acquiring.category); pos=Look(compatibility,0,3,des.acquiring.category); if(pos<0) pos=4; des.acquiring.category=pos; ReadByte(code_); if(code_<128U) pos=0; else if((code_<192U) && (code_>=128U)) pos=1; else { pos=Look(language_code,2,15,code_); if(pos<0) pos=16; } des.acquiring.language=pos; ReadByte(code_); mask=0x10; for(i=0;i<4;i++) { if(code_&mask) des.acquiring.capability[i]=i+4; else des.acquiring.capability[i]=i; mask<<=1; } ReadByte(des.acquiring.AC); if(des.acquiring.AC>2) des.acquiring.AC=0; Skip(16); des.acquiring.analysing_program_revision_number=(char*)FreeWithCare(des.acquiring.analysing_program_revision_number); des.acquiring.serial_number_device=(char*)FreeWithCare(des.acquiring.serial_number_device); des.acquiring.device_system_software=(char*)FreeWithCare(des.acquiring.device_system_software); des.acquiring.device_SCP_implementation_software=(char*)FreeWithCare(des.acquiring.device_SCP_implementation_software); des.acquiring.manifacturer_trade_name=(char*)FreeWithCare(des.acquiring.manifacturer_trade_name); ReadByte(i); if(!i) des.acquiring.analysing_program_revision_number=(char*)FreeWithCare(des.acquiring.analysing_program_revision_number); else des.acquiring.analysing_program_revision_number=ReadString(des.acquiring.analysing_program_revision_number,i); filepos = iftell(in); //FGETPOS(in,&filepos); des.acquiring.serial_number_device=FindString(des.acquiring.serial_number_device,dim-filepos COMPAT); if ((des.acquiring.protocol_revision_number==10) || (des.acquiring.protocol_revision_number==11)) // by E.C. may 2004 CARDIOLINE 1.0 & ESAOTE 1.1 ifseek(in,filepos_iniz COMPAT +dim_to_skip,0); // reposition file pointer else { filepos = iftell(in); //FGETPOS(in,&filepos); des.acquiring.device_system_software=FindString(des.acquiring.device_system_software,dim-filepos COMPAT); filepos = iftell(in); //FGETPOS(in,&filepos); des.acquiring.device_SCP_implementation_software=FindString(des.acquiring.device_SCP_implementation_software,dim-filepos COMPAT); filepos = iftell(in); //FGETPOS(in,&filepos); des.acquiring.manifacturer_trade_name=FindString(des.acquiring.manifacturer_trade_name,dim-filepos COMPAT); } }//end section_1_14 void section_1_15(descriptive &des) // section 1 tag 15 { uint16_t dim; uint8_t i, mask, code_; int16_t pos; //fpos_t filepos; long filepos; ReadByte(dim); filepos = iftell(in); //FGETPOS(in,&filepos); dim+=filepos COMPAT; ReadByte(des.analyzing.institution_number); ReadByte(des.analyzing.department_number); ReadByte(des.analyzing.ID); ReadByte(des.analyzing.type); if(des.analyzing.type>1) des.analyzing.type=2; ReadByte(des.analyzing.manifacturer); if(des.analyzing.manifacturer>20 && des.analyzing.manifacturer!=255) des.analyzing.manifacturer=0; des.analyzing.model_description=ReadString(des.analyzing.model_description,6); ReadByte(des.analyzing.protocol_revision_number); ReadByte(des.analyzing.category); pos=Look(compatibility,0,3,des.analyzing.category); if(pos<0) pos=4; des.analyzing.category=pos; ReadByte(code_); if(code_<128U) pos=0; else if((code_<192U) && (code_>=128U)) pos=1; else { pos=Look(language_code,2,15,code_); if(pos<0) pos=16; } des.analyzing.language=pos; ReadByte(code_); mask=0x10; for(i=0;i<4;i++) { if(code_&mask) des.analyzing.capability[i]=i+4; else des.analyzing.capability[i]=i; mask<<=1; } ReadByte(des.analyzing.AC); if(des.analyzing.AC>2) des.analyzing.AC=0; Skip(16); des.analyzing.analysing_program_revision_number=(char*)FreeWithCare(des.analyzing.analysing_program_revision_number); des.analyzing.serial_number_device=(char*)FreeWithCare(des.analyzing.serial_number_device); des.analyzing.device_system_software=(char*)FreeWithCare(des.analyzing.device_system_software); des.analyzing.device_SCP_implementation_software=(char*)FreeWithCare(des.analyzing.device_SCP_implementation_software); des.analyzing.manifacturer_trade_name=(char*)FreeWithCare(des.analyzing.manifacturer_trade_name); ReadByte(i); if(!i) des.analyzing.analysing_program_revision_number=(char*)FreeWithCare(des.analyzing.analysing_program_revision_number); else des.analyzing.analysing_program_revision_number=ReadString(des.analyzing.analysing_program_revision_number,i); filepos = iftell(in); //FGETPOS(in,&filepos); des.analyzing.serial_number_device=FindString(des.analyzing.serial_number_device,dim-filepos COMPAT); filepos = iftell(in); //FGETPOS(in,&filepos); des.analyzing.device_system_software=FindString(des.analyzing.device_system_software,dim-filepos COMPAT); filepos = iftell(in); //FGETPOS(in,&filepos); des.analyzing.device_SCP_implementation_software=FindString(des.analyzing.device_SCP_implementation_software,dim-filepos COMPAT); filepos = iftell(in); //FGETPOS(in,&filepos); des.analyzing.manifacturer_trade_name=FindString(des.analyzing.manifacturer_trade_name,dim-filepos COMPAT); }//end section_1_15 void section_1_16(descriptive &des) // section 1 tag 16 { uint16_t dim; ReadByte(dim); des.acquiring_institution=ReadString(des.acquiring_institution,dim); }//end section_1_16 void section_1_17(descriptive &des) // section 1 tag 17 { uint16_t dim; ReadByte(dim); des.analyzing_institution=ReadString(des.analyzing_institution,dim); }//end section_1_17 void section_1_18(descriptive &des) // section 1 tag 18 { uint16_t dim; ReadByte(dim); des.acquiring_department=ReadString(des.acquiring_department,dim); }//end section_1_18 void section_1_19(descriptive &des) // section 1 tag 19 { uint16_t dim; ReadByte(dim); des.analyzing_department=ReadString(des.analyzing_department,dim); }//end section_1_19 void section_1_20(clinic &cli) // section 1 tag 20 { uint16_t dim; ReadByte(dim); cli.referring_physician=ReadString(cli.referring_physician,dim); }//end section_1_20 void section_1_21(clinic &cli) // section 1 tag 21 { uint16_t dim; ReadByte(dim); cli.latest_confirming_physician=ReadString(cli.latest_confirming_physician,dim); }//end section_1_21 void section_1_22(clinic &cli) // section 1 tag 22 { uint16_t dim; ReadByte(dim); cli.technician_description=ReadString(cli.technician_description,dim); }//end section_1_22 void section_1_23(descriptive &des) // section 1 tag 23 { uint16_t dim; ReadByte(dim); des.room=ReadString(des.room,dim); }//end section_1_23 void section_1_24(descriptive &des) // section 1 tag 24 { uint16_t dim; ReadByte(dim); ReadByte(des.stat_code); }//end section_1_24 void section_1_25(device &dev) // section 1 tag 25 { uint16_t dim; uint8_t m, g; uint16_t a; ReadByte(dim); ReadByte(a); ReadByte(m); ReadByte(g); struct tm tmf; // by E.C. feb 2006 tmf.tm_year = a - 1900; tmf.tm_mon = m - 1; tmf.tm_mday = g; tmf.tm_hour = 0; tmf.tm_min = 0; tmf.tm_sec = 0; tmf.tm_isdst = 0; dev.date_acquisition2 = mktime(&tmf); // store date in native format }//end section_1_25 void section_1_26(device &dev) // section 1 tag 26 { uint16_t dim; uint8_t h, m, s; ReadByte(dim); ReadByte(h); ReadByte(m); ReadByte(s); dev.time_acquisition2 = (time_t) (s + m*(60 + h*24)); // by E.C. feb 2006 time in seconds }//end section_1_26 void section_1_27(device &dev) // section 1 tag 27 { uint16_t dim; ReadByte(dim); ReadByte(dev.baseline_filter); }//end section_1_27 void section_1_28(device &dev) // section 1 tag 28 { uint16_t dim; ReadByte(dim); ReadByte(dev.lowpass_filter); }//end section_1_28 void section_1_29(device &dev) // section 1 tag 29 { uint16_t dim; uint8_t mask=0x1, val, i, max=4, ris=0; ReadByte(dim); ReadByte(val); for(i=0;i6) pos=0; dev.electrode_configuration.value=pos; ReadByte(pos); if(pos>6) pos=0; dev.electrode_configuration.unit=pos; }//end section_1_33 void section_1_34(device &dev) // section 1 tag 34 { uint16_t dim; ReadByte(dim); ReadByte(dev.TZ.offset); //complemented if negative ReadByte(dev.TZ.index); if(dim-4) dev.TZ.description = FindString((char*)dev.TZ.description,dim-4); else{ dev.TZ.description = (const char*)realloc((char*)dev.TZ.description,4); strcpy((char*)dev.TZ.description,"-"); } }//end section_1_34 void section_1_35(clinic &cli, uint16_t &dim) // section 1 tag 35 { uint16_t val; char *temp_string=NULL, *pos_char; ReadByte(val); if(val) { if((cli.free_medical_hystory=(numeric*)realloc(cli.free_medical_hystory,sizeof(numeric)*(cli.number_free_hystory+1)))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } cli.free_medical_hystory[cli.number_free_hystory].unit=cli.number_free_hystory+1; cli.free_medical_hystory[cli.number_free_hystory].value=val; temp_string=ReadString(temp_string,cli.free_medical_hystory[cli.number_free_hystory].value); strcat(temp_string,STR_END); dim+=strlen(temp_string); if((cli.text_free_medical_hystory=(char*)realloc(cli.text_free_medical_hystory,dim+1))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } pos_char=cli.text_free_medical_hystory; pos_char+=dim-strlen(temp_string); strcpy(pos_char,temp_string); free(temp_string); cli.number_free_hystory++; } }//end section_1_35 void section_1_() // section 1 tag 36..254 are manufacturer specifics and are not utilized { uint16_t dim; ReadByte(dim); Skip(dim); }//end section_1_ void section_1_255() // section 1 tag 255 { uint16_t dim; ReadByte(dim); }//end section_1_255 #endif //______________________________________________________________________________ // section 2 //______________________________________________________________________________ void section_2(pointer_section info_sections,DATA_DECODE &data) //build Huffman tables if included in the file; if none then use del default one //cannot read the dummy Huffman table { uint16_t nt, i, j, ns=0, pos, dim; //fpos_t filepos; long filepos; int8_t version; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version); dim=info_sections.length-16; ReadByte(nt); if(nt!=19999U) { if((data.flag_Huffman=(uint16_t*)mymalloc(sizeof(uint16_t)*(nt+1)))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } data.flag_Huffman[0]=nt; filepos = iftell(in); //FGETPOS(in,&filepos); for(i=1;i<=data.flag_Huffman[0];i++) { ReadByte(data.flag_Huffman[i]); ns+=data.flag_Huffman[i]; Skip(9*data.flag_Huffman[i]); } ifseek(in,filepos COMPAT,0); if((ns*9)>dim || !ns) { B4C_ERRNUM = B4C_UNSPECIFIC_ERROR; B4C_ERRMSG = "SCP-DECODE: Cannot read data"; return; } if(ns!=0 && (data.t_Huffman=(table_H*)mymalloc(sizeof(table_H)*ns))==NULL) //array of 5 columns and ns rows { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } pos=0; for(j=0;j>3; if (version==11) // by E.C. may 2004 ESAOTE data.flag_lead.number_simultaneously=8; if(data.flag_lead.number!=0 && (data.data_lead=(lead*)mymalloc(sizeof(lead)*data.flag_lead.number))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } for(i=0;i85) data.data_lead[i].ID=0; } }//end section_3 //______________________________________________________________________________ // section 4 //______________________________________________________________________________ void section_4(pointer_section info_sections,DATA_DECODE &data,int8_t version) { uint16_t i; int8_t version_loc; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version_loc); ReadByte(data.flag_BdR0.length); ReadByte(data.flag_BdR0.fcM); ReadByte(data.flag_Res.number); if(data.flag_Res.bimodal || data.flag_lead.subtraction) // by E.C. may 2004 { if(data.flag_Res.number!=0 && (data.data_subtraction=(Subtraction_Zone*)mymalloc(sizeof(Subtraction_Zone)*data.flag_Res.number))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } for(i=0;i2) data.flag_BdR0.encoding=0; Skip(1); if(data.flag_lead.number!=0 && (data.length_BdR0=(uint16_t*)mymalloc(sizeof(uint16_t)*data.flag_lead.number))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return false; } dim=0; for(i=0;i>=1; dim*=sizeof(int32_t); if(dim!=0 && (data.Median=(int32_t*)mymalloc(dim))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return false; } dim/=sizeof(int32_t); for(t=0;t0x7FFF) data.Median[t]|=0xFFFF0000; } } return true; }//end section_5 //______________________________________________________________________________ // section 6 //______________________________________________________________________________ void section_6(pointer_section info_sections,DATA_DECODE &data, bool sez2) { uint16_t i; uint32_t t, dim; uint16_t value; int8_t version; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version); ReadByte(data.flag_Res.AVM); ReadByte(data.flag_Res.STM); ReadByte(data.flag_Res.encoding); if(data.flag_Res.encoding>2) data.flag_Res.encoding=0; Skip(1); if(data.flag_lead.number!=0 && (data.length_Res=(uint16_t*)mymalloc(sizeof(uint16_t)*data.flag_lead.number))==NULL) { B4C_ERRNUM = B4C_INSUFFICIENT_MEMORY; B4C_ERRMSG = "SCP-DECODE: Not enough memory"; return; } dim=0; for(i=0;i>=1; dim*=sizeof(int32_t); if(dim!=0 && (data.Residual=(int32_t*)mymalloc(dim))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } dim/=sizeof(int32_t); for(t=0;t0x7FFF) data.Residual[t]|=0xFFFF0000; } } }//end section_6 #ifdef WITH_OBSOLETE_PARTS //______________________________________________________________________________ // section 7 //______________________________________________________________________________ void section_7(pointer_section info_sections ,DATA_RECORD &data, int8_t version) { uint16_t i, j, dim; uint8_t lung; //fpos_t filepos; long filepos; int8_t version_loc; uint32_t length_eval; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version_loc); ReadByte(data.data_global.number); //each value should be checked in _special! ReadByte(data.data_global.number_spike); if (version==11) ReadByte(data.data_global.number_spike); // by E.C. may 2004 x ESAOTE!! This is an implementation error, for sure! ReadByte(data.data_global.average_RR); ReadByte(data.data_global.average_PP); if(Look(_special,0,3,data.data_global.number)<0) { if(data.data_global.number!=0 && (data.data_BdR=(BdR_measurement*)mymalloc(sizeof(BdR_measurement)*data.data_global.number))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i3) data.data_spike[i].type=0; ReadByte(data.data_spike[i].source); if(data.data_spike[i].source>2) data.data_spike[i].source=0; ReadByte(data.data_spike[i].index); ReadByte(data.data_spike[i].pulse_width); }//end for }//end if if (version<13) { // by E.C. may 2004 CARDIOLINE & ESAOTE missing!! if ((data.data_global.average_RR>0) && (data.data_global.average_RR<10000)) data.data_global.ventricular_rate=60000.0/data.data_global.average_RR+0.5; return; } // Insert by F.C. if (version>=13) { length_eval = 16 + 6 + data.data_global.number * 16 + data.data_global.number_spike * 4 + data.data_global.number_spike * 6; if (length_eval >= info_sections.length) return; } // End of F.C. insertion ReadByte(data.data_global.number_QRS); if (data.data_global.number_QRS==29999) return; // by E.C. 12/09/2007 if(Look(_special,0,3,data.data_global.number_QRS)<0) { filepos = iftell(in); //FGETPOS(in,&filepos); //necessary for ESAOTE and CARDIOLINE test files dim=info_sections.index+info_sections.length-filepos COMPAT+1; if(data.data_global.number_QRS>dim) { fprintf(stderr,"Error: Cannot extract these data!!!"); exit(2); //necessary for ESAOTE and CARDIOLINE test files } if(data.data_global.number_QRS!=0 && (data.type_BdR=(uint8_t*)mymalloc(sizeof(uint8_t)*data.data_global.number_QRS))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i=13) { length_eval += (2 + data.data_global.number_QRS); if (length_eval >= info_sections.length) return; } // End of F.C. insertion ReadByte(data.data_global.ventricular_rate); ReadByte(data.data_global.atrial_rate); ReadByte(data.data_global.QT_corrected); ReadByte(data.data_global.formula_type); if(data.data_global.formula_type>2) data.data_global.formula_type=0; ReadByte(data.data_global.number_tag); if(data.data_global.number_tag) { data.data_global.number_tag-=2; data.data_global.number_tag/=7; // tag number //warnig: this calculation is relative to the structure of STANDARD v2.0! if(data.data_global.number_tag!=0 && (data.data_additional=(additional_measurement*)mymalloc(sizeof(additional_measurement)*data.data_global.number_tag))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i3) data.data_additional[i].ID=4; ReadByte(lung); if(lung) { //warning:(255 is undefined) for(j=0;j<5;j++) ReadByte(data.data_additional[i].byte[j]); }//end if }//end for }//end if }//end section_7 //______________________________________________________________________________ // section 8 //______________________________________________________________________________ void section_8(pointer_section info_sections,DATA_INFO &data) { uint8_t m, g, h, s, i; uint16_t a, dim; char *c; //fpos_t filepos; long filepos; int8_t version; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version); ReadByte(data.flag_report.type); if(data.flag_report.type>2) data.flag_report.type=3; ReadByte(a); ReadByte(m); ReadByte(g); ReadByte(h); ReadByte(m); ReadByte(s); struct tm tmf; tmf.tm_year = a; tmf.tm_mon = m; tmf.tm_mday = g; tmf.tm_hour = h; tmf.tm_min = m; tmf.tm_sec = s; data.flag_report.date = (char*)mymalloc(18); strftime(data.flag_report.date,18,"%d %b %Y", &tmf); data.flag_report.time = (char*)mymalloc(18); strftime(data.flag_report.date,18,"%H:%M:%S", &tmf); ReadByte(data.flag_report.number); if(data.flag_report.number) { filepos = iftell(in); //FGETPOS(in,&filepos); if(data.flag_report.number!=0 && (data.text_dim=(numeric*)mymalloc(data.flag_report.number*sizeof(numeric)))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } dim=0; for(i=0;i>1)-2; if(n1>31) // for now 33 are defined n1=31; //ignore next bytes data.header_lead.number_lead_measurement=n1; //max number of statements by the manufacturer (2 bytes each) if(data.header_lead.number_lead) // by E.C. 17.11.2003 deleted "!" in the if { if((data.lead_block=(lead_measurement_block*)mymalloc(data.header_lead.number_lead*sizeof(lead_measurement_block)))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i85) id=0; ReadByte(dim); n2=(dim>>1); if(n2>n1) skip=(n2-n1)<<1; // bytes to skip else skip=0; data.lead_block[i].ID=id; //warnig: values relative to _SPECIAL for(j=1;j<=data.header_lead.number_lead_measurement;j++) { switch(j) { case 1: ReadByte(data.lead_block[i].P_duration); break; case 2: ReadByte(data.lead_block[i].PR_interval); break; case 3: ReadByte(data.lead_block[i].QRS_duration); break; case 4: ReadByte(data.lead_block[i].QT_interval); break; case 5: ReadByte(data.lead_block[i].Q_duration); break; case 6: ReadByte(data.lead_block[i].R_duration); break; case 7: ReadByte(data.lead_block[i].S_duration); break; case 8: ReadByte(data.lead_block[i].R1_duration); break; case 9: ReadByte(data.lead_block[i].S1_duration); break; case 10: ReadByte(data.lead_block[i].Q_amplitude); break; case 11: ReadByte(data.lead_block[i].R_amplitude); break; case 12: ReadByte(data.lead_block[i].S_amplitude); break; case 13: ReadByte(data.lead_block[i].R1_amplitude); break; case 14: ReadByte(data.lead_block[i].S1_amplitude); break; case 15: ReadByte(data.lead_block[i].J_point_amplitude); break; case 16: ReadByte(data.lead_block[i].Pp_amplitude); break; case 17: ReadByte(data.lead_block[i].Pm_amplitude); break; case 18: ReadByte(data.lead_block[i].Tp_amplitude); break; case 19: ReadByte(data.lead_block[i].Tm_amplitude); break; case 20: ReadByte(data.lead_block[i].ST_slope); break; case 21: ReadByte(data.lead_block[i].P_morphology); if(data.lead_block[i].P_morphology) data.lead_block[i].P_morphology=0; break; case 22: ReadByte(data.lead_block[i].T_morphology); if(data.lead_block[i].T_morphology) data.lead_block[i].T_morphology=0; break; case 23: ReadByte(data.lead_block[i].iso_electric_segment_onset_QRS); break; case 24: ReadByte(data.lead_block[i].iso_electric_segment_offset_QRS); break; case 25: ReadByte(data.lead_block[i].intrinsicoid_deflection); break; case 26: ReadByte(val); mask=0x3; for(k=0;k<8;k++) { data.lead_block[i].quality_recording[k]=mask&val; // TODO: code has no effect mask<<2; } break; case 27: ReadByte(data.lead_block[i].ST_amplitude_Jplus20); break; case 28: ReadByte(data.lead_block[i].ST_amplitude_Jplus60); break; case 29: ReadByte(data.lead_block[i].ST_amplitude_Jplus80); break; case 30: ReadByte(data.lead_block[i].ST_amplitude_JplusRR16); break; case 31: ReadByte(data.lead_block[i].ST_amplitude_JplusRR8); break; }//end switch }//end for if(skip) Skip(skip); }//end if }//end for }//end if }//end section_10 //______________________________________________________________________________ // section 11 //______________________________________________________________________________ void section_11(pointer_section info_sections,DATA_INFO &data) /* expressions (ASCII) should be either: 1) diagnostic statement_probability_modifiers; 2) diagnostic statement_probability_modifier_conjunctive term_diagnostic statement_probability_modifier...; in the test files I found only 1 diagnostic statement per expression, ending with a NULL. */ { uint8_t m, g, h, s, i, j; uint16_t a, dim; char *temp_string=0, *punt, c; //fpos_t filepos; long filepos; int8_t version; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version); ReadByte(data.flag_statement.type); if(data.flag_statement.type>2) data.flag_statement.type=3; ReadByte(a); ReadByte(m); ReadByte(g); ReadByte(h); ReadByte(m); ReadByte(s); struct tm tmf; tmf.tm_year = a; tmf.tm_mon = m; tmf.tm_mday = g; tmf.tm_hour = h; tmf.tm_min = m; tmf.tm_sec = s; data.flag_statement.date = (char*)mymalloc(18); strftime(data.flag_statement.date,18,"%d %b %Y", &tmf); data.flag_statement.time = (char*)mymalloc(18); strftime(data.flag_statement.time,18,"%H:%M:%S", &tmf); ReadByte(data.flag_statement.number); //number of expressions if(!data.flag_statement.number) { filepos = iftell(in); //FGETPOS(in,&filepos); if(data.flag_statement.number!=0 && (data.data_statement=(statement_coded*)mymalloc(data.flag_statement.number*sizeof(statement_coded)))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } dim=0; for(i=0;i void Differences(int32_t *dati, t1 flag, uint8_t num) { uint8_t i; uint16_t j; for(i=0;inext_0); Tree_Destroy(radix->next_1); free(radix); } return; } TREE_NODE *Tree_Create(TREE_NODE *tree, uint16_t n_of_struct, table_H *table, uint16_t pos) //build a tree { uint8_t i,j; uint32_t mask; TREE_NODE *temp; //build the root if((tree=(TREE_NODE *)mymalloc(sizeof(TREE_NODE)))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } tree->next_0=NULL; tree->next_1=NULL; tree->row=-1; //-1 means no row in the table for (j=0;jnext_1==NULL) { if((temp->next_1=(TREE_NODE *)mymalloc(sizeof(TREE_NODE)))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } temp->next_1->next_0=NULL; temp->next_1->next_1=NULL; temp->next_1->row=-1; } temp=temp->next_1; }//end if else { if (temp->next_0==NULL) { if((temp->next_0=(TREE_NODE *)mymalloc(sizeof(TREE_NODE)))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } temp->next_0->next_0=NULL; temp->next_0->next_1=NULL; temp->next_0->row=-1; } temp=temp->next_0; }//end else mask <<=1; }//end for i temp->row=j; //marks the j row in the table }//end for j return tree; }//end Tree_Create uint8_t Input_Bit(uint8_t *raw, uint16_t &pos, uint16_t max, uint8_t &mask, bool &err) { uint8_t value; if(pos==max) { err=1; return 0; } value=raw[pos]&mask; mask>>=1; if(!mask) { mask=0x80; ++pos; } return( value ? 1 : 0 ); }//end Input_Bit int16_t Input_Bits(uint8_t *raw, uint16_t &pos, uint16_t max, uint8_t &mask, uint8_t bit_count, bool &err) { uint16_t temp; int16_t value; if(pos==max) { err=1; return 0; } temp=1<<(bit_count-1); value=0; do { if(raw[pos]&mask) value |= temp; temp>>=1; mask>>=1; if(!mask) { mask=0x80; ++pos; if(pos==max) { mask=0; // by E.C. may 2004 break; } } } while(temp); if(temp) err=1; if (value & (1<<(bit_count-1))) // by E.C. may 2004 negative value. extend to the left value|=(-1<next_1; else temp=temp->next_0; if (temp==NULL) { fprintf(stderr,"Tree overflow"); err=1; break; } if (temp->row > -1) // row found in the table: exit for break; if(pos_in==maxIN) err=1; if(err) break; }//end for if(err) // check for error conditions and if exit while { break; // by E.C. may 2004 } if(table[temp->row+pos_tH].TMS!=1) // switch to another table { Tree_Destroy(tree); // destroy the tree and rebuild with the new table pos_tH=0; for(i=1;irow+pos_tH].base_value;i++) pos_tH+=flag[i]; // offset of the table tree=Tree_Create(tree,flag[table[temp->row+pos_tH].base_value],table,pos_tH); continue; }//end if table else { nbits=table[temp->row+pos_tH].bit_code-table[temp->row+pos_tH].bit_prefix; if (nbits) // bit of the code != bit of the prefix { if(pos_in==maxIN) { err=1; break; // by E.C. may 2004 } raw_out[pos_out]=Input_Bits(raw_in,pos_in,maxIN,mask,nbits,err); // take value from the stream if(err) // check for error conditions and if exit while { break; // by E.C. may 2004 } ++pos_out; }//end if nbits else // bit of the code = bit of the prefix { raw_out[pos_out]=table[temp->row+pos_tH].base_value; // take value from the table ++pos_out; } }//end else if table ++j; if (j==max_out) break; // by E.C. may 2004 } //end while pos_in=maxIN; // by E.C. 23.02.2004: align for safety max_out=j; // flows here anyhow! if (max_out>4900) { max_out=5000; // by E.C. may 2004 ESAOTE pos_out=(pos_out+100)/max_out*max_out; // align pointer } }//end decompress //data.data_BdR0 , data.length_BdR0 , data.samples_BdR0 , data.flag_BdR0.number_samples , data.flag_lead.number , data.t_Huffman , data.flag_Huffman //out_data , length , in_data , n_samples , n_lead , t_Huffman , flag_Huffman void Huffman(int32_t *out_data, uint16_t *length, uint8_t *in_data, uint16_t &n_samples, uint16_t n_lead, table_H *t_Huffman, uint16_t *flag_Huffman) { TREE_NODE *tree = NULL; uint16_t pos_in, pos_out, pos_tH; uint8_t i; pos_in=0; pos_out=0; pos_tH=0; tree=Tree_Create(tree,flag_Huffman[1],t_Huffman,pos_tH); for(i=0;i1) // by E.C. 19.02.2004 (i.e. to open pd3471) { //dim_R = number of bytes of decimated signal (4 bytes (int32_t) ) //data.flag_Res.number_samples = samples of the decimated signal //dim_R_ = number of bytes of the reconstructed signal (4 bytes (int32_t) ) //number_samples_ = samples of the reconstructed signal data.flag_Res.number_samples=number_samples_; //number of samples per lead number_samples_=dim_R/(sizeof(int32_t)*data.flag_lead.number); dim_R=dim_R_; dim_R_=(dim_R/sizeof(int32_t))*sizeof(float)*2; //dim_R_ = number of bytes of decimated signal (4 bytes (int32_t) ) //number_samples_ = samples of the decimated signal //dim_R = number of bytes of the reconstructed signal (4 bytes (int32_t) ) //data.flag_Res.number_samples = samples of the reconstructed signal if(dim_R_!=0 && (dati_Res_=(int32_t*)mymalloc(dim_R_))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } Interpolate(dati_Res_,data.Residual,data.flag_lead,data.data_lead,data.flag_Res,data.data_protected,number_samples_); DoFilter(data.Residual,dati_Res_,data.flag_Res,data.flag_lead,data.data_lead,data.data_protected,data.data_subtraction); free(dati_Res_); //dim_R modifies } } Multiply(data.Residual,data.flag_Res.number_samples*data.flag_lead.number,data.flag_Res.AVM); /* AS 2007-10-23: for some (unknown) reason, sometimes the memory allocation has the wrong size doing the memory allocation in sopen_scp_read does it correctly. Number of files with SegFaults is reduced by 3. if(dim_R!=0 && (data.Reconstructed=(int32_t*)mymalloc(dim_R))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } */ unsigned dim_RR=dim_R/sizeof(int32_t); // by E.C. 15.10.2003 This to correct a trivial error for(t=0;t1)){ // by E.C. 25.02.2004 // now that the signal is completely reconstructructed, and if decimation was performed // during the compression phase, do an extra low-pass filter outside protected zones ! // This shows lower RMS values of about 0.5 - 1.0 // If you don't like this extra filtering please uncheck the menu option and reopen for(t=0;tb : may be - the first sample is the first of the first protected zone (a=b+1=1) - empty no-protection zone (a=b+1) - the last sample is the last of the last protected zone (a=b+1) in these situations samples are copied as they are. */ { uint16_t a, b; //interpolation range float v; //interpolation value uint8_t j; //working variable uint16_t dim; //number of samples (to skip) into a protected zone uint16_t mINS, mCOPY; //number of samples to insert, copy int16_t num; //number of samples to interpolate uint32_t pos_in, pos_out; uint16_t nz; //index of protected zones, i.e. index of QRS uint8_t ne; //index of lead pos_in=0; pos_out=0; for(ne=0;ne0) { mINS=num/flag.decimation_factor; //number to interpolate mCOPY=num%flag.decimation_factor; //if, residual number to copy if(mINS) { //store first two samples equal to the first value in the list ... raw_out[pos_out++]=raw_in[pos_in]; raw_out[pos_out++]=raw_in[pos_in]; } // ... then proceed with interpolation dim=mINS; while((dim--)>1) { v=1.0*(raw_in[pos_in+1]-raw_in[pos_in])/flag.decimation_factor; // by E.C. 23.02.2004 (float v) // rounding improves RMS! for(j=0;j=(sample_Huff*(ne+1))) //check overflow break; if(mINS) { raw_out[pos_out++]=raw_in[pos_in]; raw_out[pos_out++]=raw_in[pos_in]; if(pos_in<(sample_Huff*(ne+1))) // by E.C. 19.02.2004 check overflow ++pos_in; } //not normal situation? insert mCOPY samples while((mCOPY--)>0) if(pos_in<(sample_Huff*(ne+1))) // by E.C. 19.02.2004 check overflow raw_out[pos_out++]=raw_in[pos_in++]; else raw_out[pos_out++]=0; }//end if num>0 if (nz0) raw_out[pos_out++]=raw_in[pos_in++]; } }//for nz pos_in=sample_Huff*(ne+1); // by E.C. 19.02.2004 align, never mind!! pos_out=(pos_out+100)/5000*5000; // by E.C. may 2004 for testing purposes only }//for ne }//end Interpolate void ExecFilter(int32_t *raw_in, int32_t *raw_out, uint32_t &pos, uint16_t dim) //filter from pos for dim samples { int32_t v; //value uint16_t i; if (dim>0) { //fist sample = unchanged raw_out[pos]=raw_in[pos]; pos++; if(dim>2) for(i=2;i=0) // as suggested by the standard for rounding v+=1; else v-=1; raw_out[pos++]=v/3; // by E.C. 24.02.2004 in this case, declaring v as float doesn't change results } } //last sample = unchanged if(dim>1) { raw_out[pos]=raw_in[pos]; pos++; } }//end ExecFilter void DoFilter(int32_t *raw_out, int32_t *raw_in, f_Res flag, f_lead flag_L, lead *marker_A, Protected_Area *marker_P, Subtraction_Zone *marker_S) //filter low-pass outside the proteced zones (marker_Z) for each lead (marker_A) // but taking into account transients at the boundaries of the subtraction zones (marker_S) //It's included rounding. { uint16_t a, b=0; //interval int16_t num; uint32_t pos; uint16_t nz; uint8_t ne; //index of lead pos=0; // by E.C. 19.02.2004 function redefined such as Interpolate() for(ne=0;ne0) { raw_out[pos]=raw_in[pos]; pos++; } } }//for nz } // for ne/ng }//end DoFilter void DoAdd(int32_t *raw_out, int32_t *raw_R, f_Res flag_R, int32_t *raw_B, f_BdR0 flag_B, Subtraction_Zone *marker_S, f_lead flag_L, lead *marker_A) //add BdR0 with the rhythm data for all leads { uint16_t pos_B; uint32_t pos_R, pos_out; uint16_t ns, a , b, num; uint8_t ne; //index of leads pos_R=0; // by E.C. 19.02.2004 add reference beat to rhythm for(ne=0;ne0) { raw_out[pos_out]+=raw_B[pos_B]; pos_out++; pos_B++; pos_R++; } }//end for/if }//end DoAdd void Opt_Filter(int32_t *raw_out, int32_t *raw_in, f_Res flag, f_lead flag_L, lead *marker_A, Protected_Area *marker_P) // by E.C. 25.02.2004 // do an extra low-pass filter outside protected zones (marker_P) // in the range of the signal (marker_A) for each lead // this is simpler than DoFilter() { uint16_t a, b=0; //interval for filtering int16_t num; uint32_t pos; uint16_t nz; uint8_t ne; //lead index pos=0; for(ne=0;ne0) { raw_out[pos]=raw_in[pos]; pos++; } } }//for nz } // for ne }//end Opt_Filter stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/abfheadr.h0000775000175000017500000017032713062445067020067 00000000000000//*********************************************************************************************** // // Copyright (c) 1993-2003 Axon Instruments. // All rights reserved. // Permission is granted to freely use, modify and copy the code in this file. // //*********************************************************************************************** // HEADER: ABFHEADR.H. // PURPOSE: Defines the ABFFileHeader structure, and provides prototypes for // functions implemented in ABFHEADR.CPP for reading and writing // ABFFileHeader's. // REVISIONS: // 1.1 - Version 1.1 was released in April 1992. // 1.2 - Added nDataFormat so that data can optionally be stored in floating point format. // - Added lClockChange to control the multiplexed ADC sample number after which the second sampling interval commences. // 1.3 - Change 4-byte sFileType string to long lFileSignature. // - #define ABF_NATIVESIGNATURE & ABF_REVERSESIGNATURE for byte order detection. // - Added support for Bells during before or after acquisitions // - Added parameters to describe hysteresis during event detected acquisitions: nLevelHysteresis and lTimeHysteresis. // - Dropped support for BASIC and Pascal. // - Added the ABF Scope Config section to store scope configuration information // 1.4 - Remove support for big-endian machines. // 1.5 - Change ABFSignal parameters from UUTop & UUBottom to // fDisplayGain & fDisplayOffset. // - Added and changed parameters in the 'File Structure', 'Display Parameters', // 'DAC Output File', 'Autopeak Measurements' and 'Unused space and end of header' sections of the ABF file header. // - Expanded the ABF API and error return codes // 1.6 - Expanded header to 5120 bytes and added extra parameters to support 2 waveform channels PRC // 1.65 - Telegraph support added. // 1.67 - Train epochs, multiple channel and multiple region stats // 1.68 - ABFScopeConfig expanded // 1.69 - Added user entered percentile levels for rise and decay stats // 1.70 - Added data reduction - AjD // 1.71 - Added epoch resistance // 1.72 - Added alternating outputs // 1.73 - Added post-processing lowpass filter settings. When filtering is done in Clampfit it is stored in the header. // 1.74 - Added channel_count_acquired // 1.75 - Added polarity for each channel // 1.76 - Added digital trigger out flag // 1.77 - Added major, minor and bugfix version numbers // 1.78 - Added separate entries for alternating DAC and digital outputs // 1.79 - Removed data reduction (now minidigi only) // 1.80 - Added stats mode for each region: mode is cursor region, epoch etc // 1.81 - Added multi input signal P / N leak subtraction // 1.82 - Cyclic Redundancy Code (CRC). // 1.83 - Added Modifier application name / version number // // Added 64bit support according to Jakub Nowacki's implementation in libaxon: // http://libaxon.sourceforge.net /* modified for use with biosig Copyright (C) 2013 Alois Schlögl, This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef INC_ABFHEADR_H #define INC_ABFHEADR_H #include #include //#include "AxAbffio32.h" #ifdef __cplusplus extern "C" { #endif // // Constants used in defining the ABF file header // #define ABF_ADCCOUNT 16 // number of ADC channels supported. #define ABF_DACCOUNT 4 // number of DAC channels supported. #define ABF_WAVEFORMCOUNT 2 // number of DAC channels which support waveforms. #define ABF_EPOCHCOUNT 10 // number of waveform epochs supported. #define ABF_BELLCOUNT 2 // Number of auditory signals supported. #define ABF_ADCUNITLEN 8 // length of ADC units strings #define ABF_ADCNAMELEN 10 // length of ADC channel name strings #define ABF_DACUNITLEN 8 // length of DAC units strings #define ABF_DACNAMELEN 10 // length of DAC channel name strings #define ABF_VARPARAMLISTLEN 80 // length of conditioning string #define ABF_USERLISTLEN 256 // length of the user list (V1.6) #define ABF_USERLISTCOUNT 4 // number of independent user lists (V1.6) #define ABF_OLDFILECOMMENTLEN 56 // length of file comment string (pre V1.6) #define ABF_FILECOMMENTLEN 128 // length of file comment string (V1.6) #define ABF_CREATORINFOLEN 16 // length of file creator info string #define ABF_OLDDACFILENAMELEN 12 // old length of the DACFile name string #define ABF_OLDDACFILEPATHLEN 60 // old length of the DACFile path string #define ABF_DACFILEPATHLEN 84 // length of full path for DACFile #define ABF_PATHLEN 256 // length of full path, used for DACFile and Protocol name. #define ABF_ARITHMETICOPLEN 2 // length of the Arithmetic operator field #define ABF_ARITHMETICUNITSLEN 8 // length of arithmetic units string #define ABF_TAGCOMMENTLEN 56 // length of tag comment string #define ABF_LONGDESCRIPTIONLEN 56 // length of long description entry #define ABF_NOTENAMELEN 10 // length of the name component of a note #define ABF_NOTEVALUELEN 8 // length of the value component of a note #define ABF_NOTEUNITSLEN 8 // length of the units component of a note #define ABF_BLOCKSIZE 512 // Size of block alignment in ABF files. #define ABF_MACRONAMELEN 64 // Size of a Clampfit macro name. #define ABF_CURRENTVERSION ABF_V183 // Current file format version number #define ABF_PREVIOUSVERSION 1.5F // Previous file format version number (for old header size) #define ABF_V16 1.6F // Version number when the header size changed. #define ABF_HEADERSIZE 6144 // Size of a Version 1.6 or later header #define ABF_OLDHEADERSIZE 2048 // Size of a Version 1.5 or earlier header #define ABF_NATIVESIGNATURE 0x20464241 // PC="ABF ", MAC=" FBA" #define ABF_REVERSESIGNATURE 0x41424620 // PC=" FBA", MAC="ABF " #define PCLAMP6_MAXSWEEPLENGTH 16384 // Maximum multiplexed sweep length supported by pCLAMP6 apps. #define PCLAMP7_MAXSWEEPLEN_PERCHAN 1032258 // Maximum per channel sweep length supported by pCLAMP7 apps. #define ABF_MAX_TRIAL_SAMPLES 0x7FFFFFFF // Maximum length of acquisition supported (samples) // INT_MAX is used instead of UINT_MAX because of the signed // values in the ABF header. #define ABF_MAX_SWEEPS_PER_AVERAGE 65500 // The maximum number of sweeps that can be combined into a // cumulative average (nAverageAlgorithm=ABF_INFINITEAVERAGE). #define ABF_STATS_REGIONS 8 // The number of independent statistics regions. #define ABF_BASELINE_REGIONS 1 // The number of independent baseline regions. #ifdef _MAC #define ABF_OLDPCLAMP ABF_REVERSESIGNATURE #else #define ABF_OLDPCLAMP ABF_NATIVESIGNATURE #endif // // Constant definitions for nFileType // #define ABF_ABFFILE 1 #define ABF_FETCHEX 2 #define ABF_CLAMPEX 3 // // Constant definitions for nDataFormat // #define ABF_INTEGERDATA 0 #define ABF_FLOATDATA 1 // // Constant definitions for nOperationMode // #define ABF_VARLENEVENTS 1 #define ABF_FIXLENEVENTS 2 // (ABF_FIXLENEVENTS == ABF_LOSSFREEOSC) #define ABF_LOSSFREEOSC 2 #define ABF_GAPFREEFILE 3 #define ABF_HIGHSPEEDOSC 4 #define ABF_WAVEFORMFILE 5 // // Constant definitions for nParamToVary // #define ABF_CONDITNUMPULSES 0 #define ABF_CONDITBASELINEDURATION 1 #define ABF_CONDITBASELINELEVEL 2 #define ABF_CONDITSTEPDURATION 3 #define ABF_CONDITSTEPLEVEL 4 #define ABF_CONDITPOSTTRAINDURATION 5 #define ABF_CONDITPOSTTRAINLEVEL 6 #define ABF_EPISODESTARTTOSTART 7 #define ABF_INACTIVEHOLDING 8 #define ABF_DIGITALHOLDING 9 #define ABF_PNNUMPULSES 10 #define ABF_PARALLELVALUE 11 #define ABF_EPOCHINITLEVEL (ABF_PARALLELVALUE + ABF_EPOCHCOUNT) #define ABF_EPOCHINITDURATION (ABF_EPOCHINITLEVEL + ABF_EPOCHCOUNT) #define ABF_EPOCHTRAINPERIOD (ABF_EPOCHINITDURATION + ABF_EPOCHCOUNT) #define ABF_EPOCHTRAINPULSEWIDTH (ABF_EPOCHTRAINPERIOD + ABF_EPOCHCOUNT) // Next value is (ABF_EPOCHINITDURATION + ABF_EPOCHCOUNT) // // Constants for nAveragingMode // #define ABF_NOAVERAGING 0 #define ABF_SAVEAVERAGEONLY 1 #define ABF_AVERAGESAVEALL 2 // // Constants for nAverageAlgorithm // #define ABF_INFINITEAVERAGE 0 #define ABF_SLIDINGAVERAGE 1 // // Constants for nEpochType // #define ABF_EPOCHDISABLED 0 // disabled epoch #define ABF_EPOCHSTEPPED 1 // stepped waveform #define ABF_EPOCHRAMPED 2 // ramp waveform #define ABF_EPOCH_TYPE_RECTANGLE 3 // rectangular pulse train #define ABF_EPOCH_TYPE_TRIANGLE 4 // triangular waveform #define ABF_EPOCH_TYPE_COSINE 5 // cosinusoidal waveform #define ABF_EPOCH_TYPE_RESISTANCE 6 // resistance waveform #define ABF_EPOCH_TYPE_BIPHASIC 7 // biphasic pulse train // // Constants for epoch resistance // #define ABF_MIN_EPOCH_RESISTANCE_DURATION 8 // // Constants for nWaveformSource // #define ABF_WAVEFORMDISABLED 0 // disabled waveform #define ABF_EPOCHTABLEWAVEFORM 1 #define ABF_DACFILEWAVEFORM 2 // // Constants for nInterEpisodeLevel & nDigitalInterEpisode // #define ABF_INTEREPI_USEHOLDING 0 #define ABF_INTEREPI_USELASTEPOCH 1 // // Constants for nExperimentType // #define ABF_VOLTAGECLAMP 0 #define ABF_CURRENTCLAMP 1 #define ABF_SIMPLEACQUISITION 2 // // Constants for nAutosampleEnable // #define ABF_AUTOSAMPLEDISABLED 0 #define ABF_AUTOSAMPLEAUTOMATIC 1 #define ABF_AUTOSAMPLEMANUAL 2 // // Constants for nAutosampleInstrument // #define ABF_INST_UNKNOWN 0 // Unknown instrument (manual or user defined telegraph table). #define ABF_INST_AXOPATCH1 1 // Axopatch-1 with CV-4-1/100 #define ABF_INST_AXOPATCH1_1 2 // Axopatch-1 with CV-4-0.1/100 #define ABF_INST_AXOPATCH1B 3 // Axopatch-1B(inv.) CV-4-1/100 #define ABF_INST_AXOPATCH1B_1 4 // Axopatch-1B(inv) CV-4-0.1/100 #define ABF_INST_AXOPATCH201 5 // Axopatch 200 with CV 201 #define ABF_INST_AXOPATCH202 6 // Axopatch 200 with CV 202 #define ABF_INST_GENECLAMP 7 // GeneClamp #define ABF_INST_DAGAN3900 8 // Dagan 3900 #define ABF_INST_DAGAN3900A 9 // Dagan 3900A #define ABF_INST_DAGANCA1_1 10 // Dagan CA-1 Im=0.1 #define ABF_INST_DAGANCA1 11 // Dagan CA-1 Im=1.0 #define ABF_INST_DAGANCA10 12 // Dagan CA-1 Im=10 #define ABF_INST_WARNER_OC725 13 // Warner OC-725 #define ABF_INST_WARNER_OC725C 14 // Warner OC-725 #define ABF_INST_AXOPATCH200B 15 // Axopatch 200B #define ABF_INST_DAGANPCONE0_1 16 // Dagan PC-ONE Im=0.1 #define ABF_INST_DAGANPCONE1 17 // Dagan PC-ONE Im=1.0 #define ABF_INST_DAGANPCONE10 18 // Dagan PC-ONE Im=10 #define ABF_INST_DAGANPCONE100 19 // Dagan PC-ONE Im=100 #define ABF_INST_WARNER_BC525C 20 // Warner BC-525C #define ABF_INST_WARNER_PC505 21 // Warner PC-505 #define ABF_INST_WARNER_PC501 22 // Warner PC-501 #define ABF_INST_DAGANCA1_05 23 // Dagan CA-1 Im=0.05 #define ABF_INST_MULTICLAMP700 24 // MultiClamp 700 #define ABF_INST_TURBO_TEC 25 // Turbo Tec #define ABF_INST_OPUSXPRESS6000 26 // OpusXpress 6000A // // Constants for nManualInfoStrategy // #define ABF_ENV_DONOTWRITE 0 #define ABF_ENV_WRITEEACHTRIAL 1 #define ABF_ENV_PROMPTEACHTRIAL 2 // // Constants for nTriggerSource // #define ABF_TRIGGERLINEINPUT -5 // Start on line trigger (DD1320 only) #define ABF_TRIGGERTAGINPUT -4 #define ABF_TRIGGERFIRSTCHANNEL -3 #define ABF_TRIGGEREXTERNAL -2 #define ABF_TRIGGERSPACEBAR -1 // >=0 = ADC channel to trigger off. // // Constants for nTrialTriggerSource // #define ABF_TRIALTRIGGER_SWSTARTONLY -6 // Start on software message, end when protocol ends. #define ABF_TRIALTRIGGER_SWSTARTSTOP -5 // Start and end on software messages. #define ABF_TRIALTRIGGER_LINEINPUT -4 // Start on line trigger (DD1320 only) #define ABF_TRIALTRIGGER_SPACEBAR -3 // Start on spacebar press. #define ABF_TRIALTRIGGER_EXTERNAL -2 // Start on external trigger high #define ABF_TRIALTRIGGER_NONE -1 // Start immediately (default). // >=0 = ADC channel to trigger off. // Not implemented as yet... // // Constants for nTriggerPolarity. // #define ABF_TRIGGER_RISINGEDGE 0 #define ABF_TRIGGER_FALLINGEDGE 1 // // Constants for nTriggerAction // #define ABF_TRIGGER_STARTEPISODE 0 #define ABF_TRIGGER_STARTRUN 1 #define ABF_TRIGGER_STARTTRIAL 2 // N.B. Discontinued in favor of nTrialTriggerSource // // Constants for nDrawingStrategy // #define ABF_DRAW_NONE 0 #define ABF_DRAW_REALTIME 1 #define ABF_DRAW_FULLSCREEN 2 #define ABF_DRAW_ENDOFRUN 3 // // Constants for nTiledDisplay // #define ABF_DISPLAY_SUPERIMPOSED 0 #define ABF_DISPLAY_TILED 1 // // Constants for nDataDisplayMode // #define ABF_DRAW_POINTS 0 #define ABF_DRAW_LINES 1 // // Constants for nArithmeticExpression // #define ABF_SIMPLE_EXPRESSION 0 #define ABF_RATIO_EXPRESSION 1 // // Constants for nLowpassFilterType & nHighpassFilterType // #define ABF_FILTER_NONE 0 #define ABF_FILTER_EXTERNAL 1 #define ABF_FILTER_SIMPLE_RC 2 #define ABF_FILTER_BESSEL 3 #define ABF_FILTER_BUTTERWORTH 4 // // Constants for nPNPosition // #define ABF_PN_BEFORE_EPISODE 0 #define ABF_PN_AFTER_EPISODE 1 // // Constants for nPNPolarity // #define ABF_PN_OPPOSITE_POLARITY -1 #define ABF_PN_SAME_POLARITY 1 // // Constants for nAutopeakPolarity // #define ABF_PEAK_NEGATIVE -1 #define ABF_PEAK_ABSOLUTE 0 #define ABF_PEAK_POSITIVE 1 // // Constants for nAutopeakSearchMode // #define ABF_PEAK_SEARCH_SPECIFIED -2 #define ABF_PEAK_SEARCH_ALL -1 // nAutopeakSearchMode 0..9 = epoch in waveform 0's epoch table // nAutopeakSearchMode 10..19 = epoch in waveform 1's epoch table // // Constants for nAutopeakBaseline // #define ABF_PEAK_BASELINE_SPECIFIED -3 #define ABF_PEAK_BASELINE_NONE -2 #define ABF_PEAK_BASELINE_FIRSTHOLDING -1 #define ABF_PEAK_BASELINE_LASTHOLDING -4 // // Constants for lAutopeakMeasurements // #define ABF_PEAK_MEASURE_PEAK 0x00000001 #define ABF_PEAK_MEASURE_PEAKTIME 0x00000002 #define ABF_PEAK_MEASURE_ANTIPEAK 0x00000004 #define ABF_PEAK_MEASURE_ANTIPEAKTIME 0x00000008 #define ABF_PEAK_MEASURE_MEAN 0x00000010 #define ABF_PEAK_MEASURE_STDDEV 0x00000020 #define ABF_PEAK_MEASURE_INTEGRAL 0x00000040 #define ABF_PEAK_MEASURE_MAXRISESLOPE 0x00000080 #define ABF_PEAK_MEASURE_MAXRISESLOPETIME 0x00000100 #define ABF_PEAK_MEASURE_MAXDECAYSLOPE 0x00000200 #define ABF_PEAK_MEASURE_MAXDECAYSLOPETIME 0x00000400 #define ABF_PEAK_MEASURE_RISETIME 0x00000800 #define ABF_PEAK_MEASURE_DECAYTIME 0x00001000 #define ABF_PEAK_MEASURE_HALFWIDTH 0x00002000 #define ABF_PEAK_MEASURE_BASELINE 0x00004000 #define ABF_PEAK_MEASURE_RISESLOPE 0x00008000 #define ABF_PEAK_MEASURE_DECAYSLOPE 0x00010000 #define ABF_PEAK_MEASURE_REGIONSLOPE 0x00020000 #define ABF_PEAK_MEASURE_ALL 0x0002FFFF // All of the above OR'd together. // // Constants for nStatsActiveChannels // #define ABF_PEAK_SEARCH_CHANNEL0 0x0001 #define ABF_PEAK_SEARCH_CHANNEL1 0x0002 #define ABF_PEAK_SEARCH_CHANNEL2 0x0004 #define ABF_PEAK_SEARCH_CHANNEL3 0x0008 #define ABF_PEAK_SEARCH_CHANNEL4 0x0010 #define ABF_PEAK_SEARCH_CHANNEL5 0x0020 #define ABF_PEAK_SEARCH_CHANNEL6 0x0040 #define ABF_PEAK_SEARCH_CHANNEL7 0x0080 #define ABF_PEAK_SEARCH_CHANNEL8 0x0100 #define ABF_PEAK_SEARCH_CHANNEL9 0x0200 #define ABF_PEAK_SEARCH_CHANNEL10 0x0400 #define ABF_PEAK_SEARCH_CHANNEL11 0x0800 #define ABF_PEAK_SEARCH_CHANNEL12 0x1000 #define ABF_PEAK_SEARCH_CHANNEL13 0x2000 #define ABF_PEAK_SEARCH_CHANNEL14 0x4000 #define ABF_PEAK_SEARCH_CHANNEL15 0x8000 #define ABF_PEAK_SEARCH_CHANNELSALL 0xFFFF // All of the above OR'd together. // Bit flag settings for nStatsSearchRegionFlags // #define ABF_PEAK_SEARCH_REGION0 0x01 #define ABF_PEAK_SEARCH_REGION1 0x02 #define ABF_PEAK_SEARCH_REGION2 0x04 #define ABF_PEAK_SEARCH_REGION3 0x08 #define ABF_PEAK_SEARCH_REGION4 0x10 #define ABF_PEAK_SEARCH_REGION5 0x20 #define ABF_PEAK_SEARCH_REGION6 0x40 #define ABF_PEAK_SEARCH_REGION7 0x80 #define ABF_PEAK_SEARCH_REGIONALL 0xFF // All of the above OR'd together. // // Constants for lStatisticsMeasurements // #define ABF_STATISTICS_ABOVETHRESHOLD 0x00000001 #define ABF_STATISTICS_EVENTFREQUENCY 0x00000002 #define ABF_STATISTICS_MEANOPENTIME 0x00000004 #define ABF_STATISTICS_MEANCLOSEDTIME 0x00000008 #define ABF_STATISTICS_ALL 0x0000000F // All the above OR'd together. // // Constants for nStatisticsSaveStrategy // #define ABF_STATISTICS_NOAUTOSAVE 0 #define ABF_STATISTICS_AUTOSAVE 1 #define ABF_STATISTICS_AUTOSAVE_AUTOCLEAR 2 // // Constants for nStatisticsDisplayStrategy // #define ABF_STATISTICS_DISPLAY 0 #define ABF_STATISTICS_NODISPLAY 1 // // Constants for nStatisticsClearStrategy // determines whether to clear statistics after saving. // #define ABF_STATISTICS_NOCLEAR 0 #define ABF_STATISTICS_CLEAR 1 // // Constants for nDACFileEpisodeNum // #define ABF_DACFILE_SKIPFIRSTSWEEP -1 #define ABF_DACFILE_USEALLSWEEPS 0 // >0 = The specific sweep number. // // Constants for nUndoPromptStrategy // #define ABF_UNDOPROMPT_ONABORT 0 #define ABF_UNDOPROMPT_ALWAYS 1 // // Constants for nAutoAnalyseEnable // #define ABF_AUTOANALYSE_DISABLED 0 #define ABF_AUTOANALYSE_DEFAULT 1 #define ABF_AUTOANALYSE_RUNMACRO 2 // // Constants for post nPostprocessLowpassFilterType // #define ABF_POSTPROCESS_FILTER_NONE 0 #define ABF_POSTPROCESS_FILTER_ADAPTIVE 1 #define ABF_POSTPROCESS_FILTER_BESSEL 2 #define ABF_POSTPROCESS_FILTER_BOXCAR 3 #define ABF_POSTPROCESS_FILTER_BUTTERWORTH 4 #define ABF_POSTPROCESS_FILTER_CHEBYSHEV 5 #define ABF_POSTPROCESS_FILTER_GAUSSIAN 6 #define ABF_POSTPROCESS_FILTER_RC 7 #define ABF_POSTPROCESS_FILTER_RC8 8 #define ABF_POSTPROCESS_FILTER_NOTCH 9 // // Miscellaneous constants // #define ABF_FILTERDISABLED 100000.0F // Large frequency to disable lowpass filters #define ABF_UNUSED_CHANNEL -1 // Unused ADC and DAC channels. // // The output sampling sequence identifier for a seperate digital out channel. // #define ABF_DIGITAL_OUT_CHANNEL -1 #define ABF_PADDING_OUT_CHANNEL -2 // // maximum values for various parameters (used by ABFH_CheckUserList). // #define ABF_CTPULSECOUNT_MAX 10000 #define ABF_CTBASELINEDURATION_MAX 100000.0F #define ABF_CTSTEPDURATION_MAX 100000.0F #define ABF_CTPOSTTRAINDURATION_MAX 100000.0F #define ABF_SWEEPSTARTTOSTARTTIME_MAX 100000.0F #define ABF_PNPULSECOUNT_MAX 8 #define ABF_DIGITALVALUE_MAX 0xFF #define ABF_EPOCHDIGITALVALUE_MAX 0x0F // // LTP Types - Reflects whether the header is used for LTP as baseline or induction. // #define ABF_LTP_TYPE_NONE 0 #define ABF_LTP_TYPE_BASELINE 1 #define ABF_LTP_TYPE_INDUCTION 2 // // LTP Usage of DAC - Reflects whether the analog output will be used presynaptically or postsynaptically. // #define ABF_LTP_DAC_USAGE_NONE 0 #define ABF_LTP_DAC_USAGE_PRESYNAPTIC 1 #define ABF_LTP_DAC_USAGE_POSTSYNAPTIC 2 // // Header Version Numbers // #define ABF_V166 1.66F #define ABF_V167 1.67F #define ABF_V168 1.68F #define ABF_V169 1.69F #define ABF_V170 1.70F #define ABF_V171 1.71F #define ABF_V172 1.72F #define ABF_V173 1.73F #define ABF_V174 1.74F #define ABF_V175 1.75F #define ABF_V176 1.76F #define ABF_V177 1.77F #define ABF_V178 1.78F #define ABF_V179 1.79F #define ABF_V180 1.80F #define ABF_V181 1.81F #define ABF_V182 1.82F #define ABF_V183 1.83F // // pack structure on byte boundaries // #ifndef RC_INVOKED #pragma pack(push, 1) #endif // // Definition of the ABF header structure. // struct ABFFileHeader // The total header length = 6144 bytes. { // GROUP #1 - File ID and size information. (40 bytes) ABFLONG lFileSignature; float fFileVersionNumber; short nOperationMode; ABFLONG lActualAcqLength; short nNumPointsIgnored; ABFLONG lActualEpisodes; ABFLONG lFileStartDate; // YYYYMMDD ABFLONG lFileStartTime; ABFLONG lStopwatchTime; float fHeaderVersionNumber; short nFileType; short nMSBinFormat; // GROUP #2 - File Structure (78 bytes) ABFLONG lDataSectionPtr; ABFLONG lTagSectionPtr; ABFLONG lNumTagEntries; ABFLONG lScopeConfigPtr; ABFLONG lNumScopes; ABFLONG _lDACFilePtr; ABFLONG _lDACFileNumEpisodes; char sUnused001[4]; ABFLONG lDeltaArrayPtr; ABFLONG lNumDeltas; ABFLONG lVoiceTagPtr; ABFLONG lVoiceTagEntries; ABFLONG lUnused002; ABFLONG lSynchArrayPtr; ABFLONG lSynchArraySize; short nDataFormat; short nSimultaneousScan; ABFLONG lStatisticsConfigPtr; ABFLONG lAnnotationSectionPtr; ABFLONG lNumAnnotations; char sUnused003[2]; // GROUP #3 - Trial hierarchy information (82 bytes) /** The number of input channels we acquired. Do not access directly - use CABFHeader::get_channel_count_acquired */ short channel_count_acquired; /** The number of input channels we recorded. Do not access directly - use CABFHeader::get_channel_count_recorded */ short nADCNumChannels; float fADCSampleInterval; /*{{ The documentation says these two sample intervals are the interval between multiplexed samples, but not all digitisers work like that. Instead, these are the per-channel sample rate divided by the number of channels. If the user chose 100uS and has two channels, this value will be 50uS. }}*/ float fADCSecondSampleInterval; /*{{ // The two sample intervals must be an integer multiple (or submultiple) of each other. if (fADCSampleInterval > fADCSecondSampleInterval) ASSERT(fmod(fADCSampleInterval, fADCSecondSampleInterval) == 0.0); if (fADCSecondSampleInterval, fADCSampleInterval) ASSERT(fmod(fADCSecondSampleInterval, fADCSampleInterval) == 0.0); }}*/ float fSynchTimeUnit; float fSecondsPerRun; /** * The total number of samples per episode, for the recorded channels only. * This does not include channels which are acquired but not recorded. * * This is the number of samples per episode per channel, times the number of recorded channels. * * If you want the samples per episode for one channel, you must divide this by get_channel_count_recorded(). */ ABFLONG lNumSamplesPerEpisode; ABFLONG lPreTriggerSamples; ABFLONG lEpisodesPerRun; ABFLONG lRunsPerTrial; ABFLONG lNumberOfTrials; short nAveragingMode; short nUndoRunCount; short nFirstEpisodeInRun; float fTriggerThreshold; short nTriggerSource; short nTriggerAction; short nTriggerPolarity; float fScopeOutputInterval; float fEpisodeStartToStart; float fRunStartToStart; float fTrialStartToStart; ABFLONG lAverageCount; ABFLONG lClockChange; short nAutoTriggerStrategy; // GROUP #4 - Display Parameters (44 bytes) short nDrawingStrategy; short nTiledDisplay; short nEraseStrategy; // N.B. Discontinued. Use scope config entry instead. short nDataDisplayMode; ABFLONG lDisplayAverageUpdate; short nChannelStatsStrategy; ABFLONG lCalculationPeriod; // N.B. Discontinued. Use fStatisticsPeriod. ABFLONG lSamplesPerTrace; ABFLONG lStartDisplayNum; ABFLONG lFinishDisplayNum; short nMultiColor; short nShowPNRawData; float fStatisticsPeriod; ABFLONG lStatisticsMeasurements; short nStatisticsSaveStrategy; // GROUP #5 - Hardware information (16 bytes) float fADCRange; float fDACRange; ABFLONG lADCResolution; ABFLONG lDACResolution; // GROUP #6 Environmental Information (118 bytes) short nExperimentType; short _nAutosampleEnable; short _nAutosampleADCNum; short _nAutosampleInstrument; float _fAutosampleAdditGain; float _fAutosampleFilter; float _fAutosampleMembraneCap; short nManualInfoStrategy; float fCellID1; float fCellID2; float fCellID3; char sCreatorInfo[ABF_CREATORINFOLEN]; char _sFileComment[ABF_OLDFILECOMMENTLEN]; short nFileStartMillisecs; // Milliseconds portion of lFileStartTime short nCommentsEnable; char sUnused003a[8]; // GROUP #7 - Multi-channel information (1044 bytes) short nADCPtoLChannelMap[ABF_ADCCOUNT]; short nADCSamplingSeq[ABF_ADCCOUNT]; char sADCChannelName[ABF_ADCCOUNT][ABF_ADCNAMELEN]; char sADCUnits[ABF_ADCCOUNT][ABF_ADCUNITLEN]; float fADCProgrammableGain[ABF_ADCCOUNT]; float fADCDisplayAmplification[ABF_ADCCOUNT]; float fADCDisplayOffset[ABF_ADCCOUNT]; float fInstrumentScaleFactor[ABF_ADCCOUNT]; float fInstrumentOffset[ABF_ADCCOUNT]; float fSignalGain[ABF_ADCCOUNT]; float fSignalOffset[ABF_ADCCOUNT]; float fSignalLowpassFilter[ABF_ADCCOUNT]; float fSignalHighpassFilter[ABF_ADCCOUNT]; char sDACChannelName[ABF_DACCOUNT][ABF_DACNAMELEN]; char sDACChannelUnits[ABF_DACCOUNT][ABF_DACUNITLEN]; float fDACScaleFactor[ABF_DACCOUNT]; float fDACHoldingLevel[ABF_DACCOUNT]; short nSignalType; char sUnused004[10]; // GROUP #8 - Synchronous timer outputs (14 bytes) short nOUTEnable; short nSampleNumberOUT1; short nSampleNumberOUT2; short nFirstEpisodeOUT; short nLastEpisodeOUT; short nPulseSamplesOUT1; short nPulseSamplesOUT2; // GROUP #9 - Epoch Waveform and Pulses (184 bytes) short nDigitalEnable; short _nWaveformSource; short nActiveDACChannel; short _nInterEpisodeLevel; short _nEpochType[ABF_EPOCHCOUNT]; float _fEpochInitLevel[ABF_EPOCHCOUNT]; float _fEpochLevelInc[ABF_EPOCHCOUNT]; short _nEpochInitDuration[ABF_EPOCHCOUNT]; short _nEpochDurationInc[ABF_EPOCHCOUNT]; short nDigitalHolding; short nDigitalInterEpisode; short nDigitalValue[ABF_EPOCHCOUNT]; char sUnavailable1608[4]; // was float fWaveformOffset; short nDigitalDACChannel; char sUnused005[6]; // GROUP #10 - DAC Output File (98 bytes) float _fDACFileScale; float _fDACFileOffset; char sUnused006[2]; short _nDACFileEpisodeNum; short _nDACFileADCNum; char _sDACFilePath[ABF_DACFILEPATHLEN]; // GROUP #11 - Presweep (conditioning) pulse train (44 bytes) short _nConditEnable; short _nConditChannel; ABFLONG _lConditNumPulses; float _fBaselineDuration; float _fBaselineLevel; float _fStepDuration; float _fStepLevel; float _fPostTrainPeriod; float _fPostTrainLevel; char sUnused007[12]; // GROUP #12 - Variable parameter user list ( 82 bytes) short _nParamToVary; char _sParamValueList[ABF_VARPARAMLISTLEN]; // GROUP #13 - Autopeak measurement (36 bytes) short _nAutopeakEnable; short _nAutopeakPolarity; short _nAutopeakADCNum; short _nAutopeakSearchMode; ABFLONG _lAutopeakStart; ABFLONG _lAutopeakEnd; short _nAutopeakSmoothing; short _nAutopeakBaseline; short _nAutopeakAverage; char sUnavailable1866[2]; // Was nAutopeakSaveStrategy, use nStatisticsSaveStrategy ABFLONG _lAutopeakBaselineStart; ABFLONG _lAutopeakBaselineEnd; ABFLONG _lAutopeakMeasurements; // GROUP #14 - Channel Arithmetic (52 bytes) short nArithmeticEnable; float fArithmeticUpperLimit; float fArithmeticLowerLimit; short nArithmeticADCNumA; short nArithmeticADCNumB; float fArithmeticK1; float fArithmeticK2; float fArithmeticK3; float fArithmeticK4; char sArithmeticOperator[ABF_ARITHMETICOPLEN]; char sArithmeticUnits[ABF_ARITHMETICUNITSLEN]; float fArithmeticK5; float fArithmeticK6; short nArithmeticExpression; char sUnused008[2]; // GROUP #15 - On-line subtraction (34 bytes) short _nPNEnable; short nPNPosition; short _nPNPolarity; short nPNNumPulses; short _nPNADCNum; float _fPNHoldingLevel; float fPNSettlingTime; float fPNInterpulse; char sUnused009[12]; // GROUP #16 - Miscellaneous variables (82 bytes) short _nListEnable; short nBellEnable[ABF_BELLCOUNT]; short nBellLocation[ABF_BELLCOUNT]; short nBellRepetitions[ABF_BELLCOUNT]; short nLevelHysteresis; ABFLONG lTimeHysteresis; short nAllowExternalTags; char nLowpassFilterType[ABF_ADCCOUNT]; char nHighpassFilterType[ABF_ADCCOUNT]; short nAverageAlgorithm; float fAverageWeighting; short nUndoPromptStrategy; short nTrialTriggerSource; short nStatisticsDisplayStrategy; short nExternalTagType; ABFLONG lHeaderSize; double dFileDuration; short nStatisticsClearStrategy; // Size of v1.5 header = 2048 // Extra parameters in v1.6 // EXTENDED GROUP #2 - File Structure (26 bytes) ABFLONG lDACFilePtr[ABF_WAVEFORMCOUNT]; ABFLONG lDACFileNumEpisodes[ABF_WAVEFORMCOUNT]; // EXTENDED GROUP #3 - Trial Hierarchy float fFirstRunDelay; char sUnused010[6]; // EXTENDED GROUP #7 - Multi-channel information (62 bytes) float fDACCalibrationFactor[ABF_DACCOUNT]; float fDACCalibrationOffset[ABF_DACCOUNT]; char sUnused011[30]; // GROUP #17 - Trains parameters (160 bytes) ABFLONG lEpochPulsePeriod[ABF_WAVEFORMCOUNT][ABF_EPOCHCOUNT]; ABFLONG lEpochPulseWidth [ABF_WAVEFORMCOUNT][ABF_EPOCHCOUNT]; // EXTENDED GROUP #9 - Epoch Waveform and Pulses ( 412 bytes) short nWaveformEnable[ABF_WAVEFORMCOUNT]; short nWaveformSource[ABF_WAVEFORMCOUNT]; short nInterEpisodeLevel[ABF_WAVEFORMCOUNT]; short nEpochType[ABF_WAVEFORMCOUNT][ABF_EPOCHCOUNT]; float fEpochInitLevel[ABF_WAVEFORMCOUNT][ABF_EPOCHCOUNT]; float fEpochLevelInc[ABF_WAVEFORMCOUNT][ABF_EPOCHCOUNT]; ABFLONG lEpochInitDuration[ABF_WAVEFORMCOUNT][ABF_EPOCHCOUNT]; ABFLONG lEpochDurationInc[ABF_WAVEFORMCOUNT][ABF_EPOCHCOUNT]; short nDigitalTrainValue[ABF_EPOCHCOUNT]; // 2 * 10 = 20 bytes short nDigitalTrainActiveLogic; // 2 bytes char sUnused012[18]; // EXTENDED GROUP #10 - DAC Output File (552 bytes) float fDACFileScale[ABF_WAVEFORMCOUNT]; float fDACFileOffset[ABF_WAVEFORMCOUNT]; ABFLONG lDACFileEpisodeNum[ABF_WAVEFORMCOUNT]; short nDACFileADCNum[ABF_WAVEFORMCOUNT]; char sDACFilePath[ABF_WAVEFORMCOUNT][ABF_PATHLEN]; char sUnused013[12]; // EXTENDED GROUP #11 - Presweep (conditioning) pulse train (100 bytes) short nConditEnable[ABF_WAVEFORMCOUNT]; ABFLONG lConditNumPulses[ABF_WAVEFORMCOUNT]; float fBaselineDuration[ABF_WAVEFORMCOUNT]; float fBaselineLevel[ABF_WAVEFORMCOUNT]; float fStepDuration[ABF_WAVEFORMCOUNT]; float fStepLevel[ABF_WAVEFORMCOUNT]; float fPostTrainPeriod[ABF_WAVEFORMCOUNT]; float fPostTrainLevel[ABF_WAVEFORMCOUNT]; char sUnused014[40]; // EXTENDED GROUP #12 - Variable parameter user list (1096 bytes) short nULEnable[ABF_USERLISTCOUNT]; short nULParamToVary[ABF_USERLISTCOUNT]; char sULParamValueList[ABF_USERLISTCOUNT][ABF_USERLISTLEN]; short nULRepeat[ABF_USERLISTCOUNT]; char sUnused015[48]; // EXTENDED GROUP #15 - On-line subtraction (56 bytes) short nPNEnable[ABF_WAVEFORMCOUNT]; short nPNPolarity[ABF_WAVEFORMCOUNT]; short __nPNADCNum[ABF_WAVEFORMCOUNT]; float fPNHoldingLevel[ABF_WAVEFORMCOUNT]; short nPNNumADCChannels[ABF_WAVEFORMCOUNT]; char nPNADCSamplingSeq[ABF_WAVEFORMCOUNT][ABF_ADCCOUNT]; // EXTENDED GROUP #6 Environmental Information (898 bytes) short nTelegraphEnable[ABF_ADCCOUNT]; short nTelegraphInstrument[ABF_ADCCOUNT]; float fTelegraphAdditGain[ABF_ADCCOUNT]; float fTelegraphFilter[ABF_ADCCOUNT]; float fTelegraphMembraneCap[ABF_ADCCOUNT]; short nTelegraphMode[ABF_ADCCOUNT]; short nTelegraphDACScaleFactorEnable[ABF_DACCOUNT]; char sUnused016a[24]; short nAutoAnalyseEnable; char sAutoAnalysisMacroName[ABF_MACRONAMELEN]; char sProtocolPath[ABF_PATHLEN]; char sFileComment[ABF_FILECOMMENTLEN]; struct GUID FileGUID; float fInstrumentHoldingLevel[ABF_DACCOUNT]; uint32_t ulFileCRC; char sModifierInfo[ABF_CREATORINFOLEN]; char sUnused017[76]; // EXTENDED GROUP #13 - Statistics measurements (388 bytes) short nStatsEnable; unsigned short nStatsActiveChannels; // Active stats channel bit flag unsigned short nStatsSearchRegionFlags; // Active stats region bit flag short nStatsSelectedRegion; short _nStatsSearchMode; short nStatsSmoothing; short nStatsSmoothingEnable; short nStatsBaseline; ABFLONG lStatsBaselineStart; ABFLONG lStatsBaselineEnd; ABFLONG lStatsMeasurements[ABF_STATS_REGIONS]; // Measurement bit flag for each region ABFLONG lStatsStart[ABF_STATS_REGIONS]; ABFLONG lStatsEnd[ABF_STATS_REGIONS]; short nRiseBottomPercentile[ABF_STATS_REGIONS]; short nRiseTopPercentile[ABF_STATS_REGIONS]; short nDecayBottomPercentile[ABF_STATS_REGIONS]; short nDecayTopPercentile[ABF_STATS_REGIONS]; short nStatsChannelPolarity[ABF_ADCCOUNT]; short nStatsSearchMode[ABF_STATS_REGIONS]; // Stats mode per region: mode is cursor region, epoch etc char sUnused018[156]; // GROUP #18 - Application version data (16 bytes) short nCreatorMajorVersion; short nCreatorMinorVersion; short nCreatorBugfixVersion; short nCreatorBuildVersion; short nModifierMajorVersion; short nModifierMinorVersion; short nModifierBugfixVersion; short nModifierBuildVersion; // GROUP #19 - LTP protocol (14 bytes) short nLTPType; short nLTPUsageOfDAC[ABF_WAVEFORMCOUNT]; short nLTPPresynapticPulses[ABF_WAVEFORMCOUNT]; char sUnused020[4]; // GROUP #20 - Digidata 132x Trigger out flag. (8 bytes) short nDD132xTriggerOut; char sUnused021[6]; // GROUP #21 - Epoch resistance (40 bytes) char sEpochResistanceSignalName[ABF_WAVEFORMCOUNT][ABF_ADCNAMELEN]; short nEpochResistanceState[ABF_WAVEFORMCOUNT]; char sUnused022[16]; // GROUP #22 - Alternating episodic mode (58 bytes) short nAlternateDACOutputState; short nAlternateDigitalValue[ABF_EPOCHCOUNT]; short nAlternateDigitalTrainValue[ABF_EPOCHCOUNT]; short nAlternateDigitalOutputState; char sUnused023[14]; // GROUP #23 - Post-processing actions (210 bytes) float fPostProcessLowpassFilter[ABF_ADCCOUNT]; char nPostProcessLowpassFilterType[ABF_ADCCOUNT]; // 6014 header bytes allocated + 130 header bytes not allocated char sUnused2048[130]; }; // Size = 6144 // This structure is persisted, so the size MUST NOT CHANGE #if !defined(_WINDOWS) || defined(__MINGW32__) #define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1]) #endif C_ASSERT(sizeof(struct ABFFileHeader) == 6144); /* inline ABFFileHeader::ABFFileHeader() { // Set everything to 0. memset( this, 0, sizeof(ABFFileHeader) ); // Set critical parameters so we can determine the version. lFileSignature = ABF_NATIVESIGNATURE; fFileVersionNumber = ABF_CURRENTVERSION; fHeaderVersionNumber = ABF_CURRENTVERSION; lHeaderSize = ABF_HEADERSIZE; } */ /* // // Scope descriptor format. // #define ABF_FACESIZE 32 struct ABFLogFont { short nHeight; // Height of the font in pixels. // short lWidth; // use 0 // short lEscapement; // use 0 // short lOrientation; // use 0 short nWeight; // MSWindows font weight value. // char bItalic; // use 0 // char bUnderline; // use 0 // char bStrikeOut; // use 0 // char cCharSet; // use ANSI_CHARSET (0) // char cOutPrecision; // use OUT_TT_PRECIS // char cClipPrecision; // use CLIP_DEFAULT_PRECIS // char cQuality; // use PROOF_QUALITY char cPitchAndFamily; // MSWindows pitch and family mask. char Unused[3]; // Unused space to maintain 4-byte packing. char szFaceName[ABF_FACESIZE];// Face name of the font. }; // Size = 40 struct ABFSignal { char szName[ABF_ADCNAMELEN+2]; // ABF name length + '\0' + 1 for alignment. short nMxOffset; // Offset of the signal in the sampling sequence. DWORD rgbColor; // Pen color used to draw trace. char nPenWidth; // Pen width in pixels. char bDrawPoints; // TRUE = Draw disconnected points char bHidden; // TRUE = Hide the trace. char bFloatData; // TRUE = Floating point pseudo channel float fVertProportion; // Relative proportion of client area to use float fDisplayGain; // Display gain of trace in UserUnits float fDisplayOffset; // Display offset of trace in UserUnits // float fUUTop; // Top of window in UserUnits // float fUUBottom; // Bottom of window in UserUnits }; // Size = 34 /////////////////////////////////////////////////////////////////////////////////// //// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ////// /////////////////////////////////////////////////////////////////////////////////// // The Following #defines appear to be largely unused in opur code base // However there does exist a second set of #defines in AxScope32.h // that REALLY defines what these bits in the header do. // In particular it important to note that all 32 bits are in fact used internally /////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// // Bit flags used in dwFlags field of ABFScopeConfig. #define ABF_OVERLAPPED 0x00000001 #define ABF_DONTERASE 0x00000002 #define ABF_MONOCHROME 0x00000004 #define ABF_CLIPPING 0x00000008 #define ABF_HIDEHORZGRIDS 0x00000010 #define ABF_HIDEVERTGRIDS 0x00000020 #define ABF_FULLSCREEN 0x00000040 #define ABF_HIDEXAXIS 0x00000080 #define ABF_HIDEYAXIS 0x00000100 #define ABF_HIDEXSCROLL 0x00000200 #define ABF_HIDEYSCROLL 0x00000400 #define ABF_HIDESIGNALNAME 0x00000800 #define ABF_ENABLEZOOM 0x00001000 #define ABF_XSPINFROMCENTER 0x00002000 #define ABF_HIDEXSPINNER 0x00004000 #define ABF_LARGESPINNERS 0x00008000 #define ABF_PERSISTENCEMODE 0x00010000 #define ABF_CARDIACMODE 0x00020000 #define ABF_HIDETWIRLER 0x00040000 #define ABF_DISABLEUI 0x00080000 /////////////////////////////////////////////////////////////////////////////////// // #define ABF_INTERNALUSE 0xFFF00000 // Do not add extra bit flags ^^^ here they are used internally /////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// //// DANGER DANGER DANGER DANGER DANGER DANGER DANGER DANGER DANGER DANGER DANGER// /////////////////////////////////////////////////////////////////////////////////// // Values for the wScopeMode field in ABFScopeConfig. #define ABF_EPISODICMODE 0 #define ABF_CONTINUOUSMODE 1 //#define ABF_XYMODE 2 // Values for the nEraseStrategy field in ABFScopeConfig. #define ABF_ERASE_EACHSWEEP 0 #define ABF_ERASE_EACHRUN 1 #define ABF_ERASE_EACHTRIAL 2 #define ABF_ERASE_DONTERASE 3 // Indexes into the rgbColor field of ABFScopeConfig. #define ABF_BACKGROUNDCOLOR 0 #define ABF_GRIDCOLOR 1 #define ABF_THRESHOLDCOLOR 2 #define ABF_EVENTMARKERCOLOR 3 #define ABF_SEPARATORCOLOR 4 #define ABF_AVERAGECOLOR 5 #define ABF_OLDDATACOLOR 6 #define ABF_TEXTCOLOR 7 #define ABF_AXISCOLOR 8 #define ABF_ACTIVEAXISCOLOR 9 #define ABF_LASTCOLOR ABF_ACTIVEAXISCOLOR #define ABF_SCOPECOLORS (ABF_LASTCOLOR+1) // Extended colors for rgbColorEx field in ABFScopeConfig #define ABF_STATISTICS_REGION0 0 #define ABF_STATISTICS_REGION1 1 #define ABF_STATISTICS_REGION2 2 #define ABF_STATISTICS_REGION3 3 #define ABF_STATISTICS_REGION4 4 #define ABF_STATISTICS_REGION5 5 #define ABF_STATISTICS_REGION6 6 #define ABF_STATISTICS_REGION7 7 #define ABF_BASELINE_REGION 8 #define ABF_STOREDSWEEPCOLOR 9 #define ABF_LASTCOLOR_EX ABF_STOREDSWEEPCOLOR #define ABF_SCOPECOLORS_EX (ABF_LASTCOLOR+1) // Values for the nDockState field in ABFScopeConfig #define ABF_SCOPE_NOTDOCKED 0 #define ABF_SCOPE_DOCKED_TOP 1 #define ABF_SCOPE_DOCKED_LEFT 2 #define ABF_SCOPE_DOCKED_RIGHT 3 #define ABF_SCOPE_DOCKED_BOTTOM 4 struct ABFScopeConfig { // Section 1 scope configurations DWORD dwFlags; // Flags that are meaningful to the scope. DWORD rgbColor[ABF_SCOPECOLORS]; // Colors for the components of the scope. float fDisplayStart; // Start of the display area in ms. float fDisplayEnd; // End of the display area in ms. WORD wScopeMode; // Mode that the scope is in. char bMaximized; // TRUE = Scope parent is maximized. char bMinimized; // TRUE = Scope parent is minimized. short xLeft; // Coordinate of the left edge. short yTop; // Coordinate of the top edge. short xRight; // Coordinate of the right edge. short yBottom; // Coordinate of the bottom edge. ABFLogFont LogFont; // Description of current font. ABFSignal TraceList[ABF_ADCCOUNT]; // List of traces in current use. short nYAxisWidth; // Width of the YAxis region. short nTraceCount; // Number of traces described in TraceList. short nEraseStrategy; // Erase strategy. short nDockState; // Docked position. // Size 656 // * Do not insert any new members above this point! * // Section 2 scope configurations for file version 1.68. short nSizeofOldStructure; // Unused byte to determine the offset of the version 2 data. DWORD rgbColorEx[ ABF_SCOPECOLORS_EX ]; // New color settings for stored sweep and cursors. short nAutoZeroState; // Status of the autozero selection. DWORD dwCursorsVisibleState; // Flag for visible status of cursors. DWORD dwCursorsLockedState; // Flag for enabled status of cursors. char sUnasigned[61]; // Size 113 ABFScopeConfig(); }; // Size = 769 inline ABFScopeConfig::ABFScopeConfig() { // Set everything to 0. memset( this, 0, sizeof(ABFScopeConfig) ); // Set critical parameters so we can determine the version. nSizeofOldStructure = 656; } */ // // Definition of the ABF synch array structure // struct ABFSynch { ABFLONG lStart; // Start of the episode/event in fSynchTimeUnit units. ABFLONG lLength; // Length of the episode/event in multiplexed samples. }; // Size = 8 // // Constants for nTagType in the ABFTag structure. // #define ABF_TIMETAG 0 #define ABF_COMMENTTAG 1 #define ABF_EXTERNALTAG 2 #define ABF_VOICETAG 3 #define ABF_NEWFILETAG 4 #define ABF_ANNOTATIONTAG 5 // Same as a comment tag except that nAnnotationIndex holds // the index of the annotation that holds extra information. // // Definition of the ABF Tag structure // struct ABFTag { ABFLONG lTagTime; // Time at which the tag was entered in fSynchTimeUnit units. char sComment[ABF_TAGCOMMENTLEN]; // Optional tag comment. short nTagType; // Type of tag ABF_TIMETAG, ABF_COMMENTTAG, ABF_EXTERNALTAG, ABF_VOICETAG, ABF_NEWFILETAG or ABF_ANNOTATIONTAG union { short nVoiceTagNumber; // If nTagType=ABF_VOICETAG, this is the number of this voice tag. short nAnnotationIndex; // If nTagType=ABF_ANNOTATIONTAG, this is the index of the corresponding annotation. }; }; // Size = 64 // Comment inserted for externally acquired tags (expanded with spaces to ABF_TAGCOMMENTLEN). #define ABF_EXTERNALTAGCOMMENT "" #define ABF_VOICETAGCOMMENT "" // // Constants for nCompressionType in the ABFVoiceTagInfo structure. // #define ABF_COMPRESSION_NONE 0 #define ABF_COMPRESSION_PKWARE 1 //#define ABF_COMPRESSION_MPEG 2 // // Definition of the ABFVoiceTagInfo structure. // struct ABFVoiceTagInfo { ABFLONG lTagNumber; // The tag number that corresponds to this VoiceTag ABFLONG lFileOffset; // Offset to this tag within the VoiceTag block ABFLONG lUncompressedSize; // Size of the voice tag expanded. ABFLONG lCompressedSize; // Compressed size of the tag. short nCompressionType; // Compression method used. short nSampleSize; // Size of the samples acquired. ABFLONG lSamplesPerSecond; // Rate at which the sound was acquired. uint32_t dwCRC; // CRC used to check data integrity. uint16_t wChannels; // Number of channels in the tag (usually 1). uint16_t wUnused; // Unused space. }; // Size 32 // // Constants for lParameterID in the ABFDelta structure. // // NOTE: If any changes are made to this list, the code in ABF_UpdateHeader must // be updated to include the new items. #define ABF_DELTA_HOLDING0 0 #define ABF_DELTA_HOLDING1 1 #define ABF_DELTA_HOLDING2 2 #define ABF_DELTA_HOLDING3 3 #define ABF_DELTA_DIGITALOUTS 4 #define ABF_DELTA_THRESHOLD 5 #define ABF_DELTA_PRETRIGGER 6 // Because of lack of space, the Autosample Gain ID also contains the ADC number. #define ABF_DELTA_AUTOSAMPLE_GAIN 100 // +ADC channel. // Because of lack of space, the Signal Gain ID also contains the ADC number. #define ABF_DELTA_SIGNAL_GAIN 200 // +ADC channel. // // Definition of the ABF Delta structure. // struct ABFDelta { ABFLONG lDeltaTime; // Time at which the parameter was changed in fSynchTimeUnit units. ABFLONG lParameterID; // Identifier for the parameter changed union { ABFLONG lNewParamValue; // Depending on the value of lParameterID float fNewParamValue; // this entry may be either a float or a long. }; }; // Size = 12 #ifndef RC_INVOKED #pragma pack(pop) // return to default packing #endif /* // // The size of the buffers to be passed to ABFH_GetWaveformVertor // #define ABFH_MAXVECTORS 30 // // Function prototypes for functions in ABFHEADR.C // void WINAPI ABFH_Initialize( ABFFileHeader *pFH ); void WINAPI ABFH_InitializeScopeConfig(const ABFFileHeader *pFH, ABFScopeConfig *pCfg); BOOL WINAPI ABFH_CheckScopeConfig(ABFFileHeader *pFH, ABFScopeConfig *pCfg); void WINAPI ABFH_GetADCDisplayRange( const ABFFileHeader *pFH, int nChannel, float *pfUUTop, float *pfUUBottom); void WINAPI ABFH_GetADCtoUUFactors( const ABFFileHeader *pFH, int nChannel, float *pfADCToUUFactor, float *pfADCToUUShift ); void WINAPI ABFH_ClipADCUUValue(const ABFFileHeader *pFH, int nChannel, float *pfUUValue); void WINAPI ABFH_GetDACtoUUFactors( const ABFFileHeader *pFH, int nChannel, float *pfDACToUUFactor, float *pfDACToUUShift ); void WINAPI ABFH_ClipDACUUValue(const ABFFileHeader *pFH, int nChannel, float *pfUUValue); BOOL WINAPI ABFH_GetMathValue(const ABFFileHeader *pFH, float fA, float fB, float *pfRval); int WINAPI ABFH_GetMathChannelName(char *pszName, UINT uNameLen); BOOL WINAPI ABFH_ParamReader( FILEHANDLE hFile, ABFFileHeader *pFH, int *pnError ); BOOL WINAPI ABFH_ParamReaderEx( HANDLE hFile, ABFFileHeader *pFH, int *pnError ); BOOL WINAPI ABFH_ParamWriter( HANDLE hFile, ABFFileHeader *pFH, int *pnError ); BOOL WINAPI ABFH_GetErrorText( int nError, char *pszBuffer, UINT nBufferSize ); // ABFHWAVE.CPP // Constants for ABFH_GetEpochLimits #define ABFH_FIRSTHOLDING -1 #define ABFH_LASTHOLDING ABF_EPOCHCOUNT // Return the bounds of a given epoch in a given episode. Values returned are ZERO relative. BOOL WINAPI ABFH_GetEpochLimits(const ABFFileHeader *pFH, int nADCChannel, DWORD dwEpisode, int nEpoch, UINT *puEpochStart, UINT *puEpochEnd, int *pnError); BOOL WINAPI ABFH_GetEpochLimitsEx(const ABFFileHeader *pFH, int nADCChannel, UINT uDACChannel, DWORD dwEpisode, int nEpoch, UINT *puEpochStart, UINT *puEpochEnd, int *pnError); // Get the offset in the sampling sequence for the given physical channel. BOOL WINAPI ABFH_GetChannelOffset( const ABFFileHeader *pFH, int nChannel, UINT *puChannelOffset ); // This function forms the de-multiplexed DAC output waveform for the // particular channel in the pfBuffer, in DAC UserUnits. BOOL WINAPI ABFH_GetWaveform( const ABFFileHeader *pFH, int nADCChannel, DWORD dwEpisode, float *pfBuffer, int *pnError); BOOL WINAPI ABFH_GetWaveformEx( const ABFFileHeader *pFH, UINT uDACChannel, DWORD dwEpisode, float *pfBuffer, int *pnError); // This function forms the de-multiplexed Digital output waveform for the // particular channel in the pdwBuffer, as a bit mask. Digital OUT 0 is in bit 0. BOOL WINAPI ABFH_GetDigitalWaveform( const ABFFileHeader *pFH, int nChannel, DWORD dwEpisode, DWORD *pdwBuffer, int *pnError); // Returns vector pairs for displaying a waveform made up of epochs. BOOL WINAPI ABFH_GetWaveformVector(const ABFFileHeader *pFH, DWORD dwEpisode, UINT uStart, UINT uFinish, float *pfLevels, float *pfTimes, int *pnVectors, int *pnError); // Returns vector pairs for displaying the digital outs. BOOL WINAPI ABFH_GetDigitalWaveformVector(const ABFFileHeader *pFH, DWORD dwEpisode, UINT uStart, UINT uFinish, DWORD *pdwLevels, float *pfTimes, int *pnVectors, int *pnError); // Calculates the timebase array for the file. void WINAPI ABFH_GetTimebase(const ABFFileHeader *pFH, float fTimeOffset, float *pfBuffer, UINT uBufferSize); void WINAPI ABFH_GetTimebaseEx(const ABFFileHeader *pFH, double dTimeOffset, double *pdBuffer, UINT uBufferSize); // Constant for ABFH_GetHoldingDuration #define ABFH_HOLDINGFRACTION 64 // Get the duration of the first holding period. UINT WINAPI ABFH_GetHoldingDuration(const ABFFileHeader *pFH); // Checks whether the waveform varies from episode to episode. BOOL WINAPI ABFH_IsConstantWaveform(const ABFFileHeader *pFH); BOOL WINAPI ABFH_IsConstantWaveformEx(const ABFFileHeader *pFH, UINT uDACChannel); // Checks that the sample intervals in the header are valid. BOOL WINAPI ABFH_CheckSampleIntervals(const ABFFileHeader *pFH, float fClockResolution, int *pnError); // Gets the closest sample intervals higher and lower than the passed interval. void WINAPI ABFH_GetClosestSampleIntervals(float fSampleInterval, float fClockResolution, int nOperationMode, float fMinPeriod, float fMaxPeriod, float *pfHigher, float *pfLower); // Sets up the list for the spinner to drive the sampling interval through. UINT WINAPI ABFH_SetupSamplingList(UINT uNumChannels, float fMinPeriod, float fMaxPeriod, float *pfIntervalList, UINT uListEntries); // Get the full sweep length given the length available to epochs or vice-versa. int WINAPI ABFH_SweepLenFromUserLen(int nUserLength, int nNumChannels); int WINAPI ABFH_UserLenFromSweepLen(int nSweepLength, int nNumChannels); // Converts a display range to the equivalent gain and offset factors. void WINAPI ABFH_GainOffsetToDisplayRange( const ABFFileHeader *pFH, int nChannel, float fDisplayGain, float fDisplayOffset, float *pfUUTop, float *pfUUBottom); // Converts a display range to the equivalent gain and offset factors. void WINAPI ABFH_DisplayRangeToGainOffset( const ABFFileHeader *pFH, int nChannel, float fUUTop, float fUUBottom, float *pfDisplayGain, float *pfDisplayOffset); // Converts a time value to a synch time count or vice-versa. void WINAPI ABFH_SynchCountToMS(const ABFFileHeader *pFH, UINT uCount, double *pdTimeMS); UINT WINAPI ABFH_MSToSynchCount(const ABFFileHeader *pFH, double dTimeMS); // Gets the point at which the sampling interval changes if split clock. UINT WINAPI ABFH_GetClockChange(const ABFFileHeader *pFH); // Gets the duration of the Waveform Episode (in us), allowing for split clock etc. void WINAPI ABFH_GetEpisodeDuration(const ABFFileHeader *pFH, double *pdEpisodeDuration); // Gets the duration of a P/N sequence (in us), including settling times. void WINAPI ABFH_GetPNDuration(const ABFFileHeader *pFH, double *pdPNDuration); void WINAPI ABFH_GetPNDurationEx(const ABFFileHeader *pFH, UINT uDAC, double *pdPNDuration); // Gets the duration of a pre-sweep train in us. void WINAPI ABFH_GetTrainDuration(const ABFFileHeader *pFH, double *pdTrainDuration); void WINAPI ABFH_GetTrainDurationEx (const ABFFileHeader *pFH, UINT uDAC, double *pdTrainDuration); // Gets the duration of a whole meta-episode (in us). void WINAPI ABFH_GetMetaEpisodeDuration(const ABFFileHeader *pFH, double *pdMetaEpisodeDuration); // Gets the start to start period for the episode in us. void WINAPI ABFH_GetEpisodeStartToStart(const ABFFileHeader *pFH, double *pdEpisodeStartToStart); // Checks that the user list contains valid entries for the protocol. BOOL WINAPI ABFH_CheckUserList(const ABFFileHeader *pFH, int *pnError); BOOL WINAPI ABFH_CheckUserListEx(const ABFFileHeader *pFH, UINT uListNum, int *pnError); // Checks if the ABFFileHeader is a new (6k) or old (2k) header. //BOOL WINAPI ABFH_IsNewHeader(const ABFFileHeader *pFH); // Demotes a new ABF header to a 1.5 version ABF header. void WINAPI ABFH_DemoteHeader(ABFFileHeader *pOut, const ABFFileHeader *pIn ); // Promotes an old ABF header to a 1.8 version ABF header. void WINAPI ABFH_PromoteHeader(ABFFileHeader *pOut, const ABFFileHeader *pIn ); // Gets the first sample interval, expressed as a double. double WINAPI ABFH_GetFirstSampleInterval( const ABFFileHeader *pFH ); // Gets the second sample interval expressed as a double. double WINAPI ABFH_GetSecondSampleInterval( const ABFFileHeader *pFH ); // Counts the number of changing sweeps. UINT WINAPI ABFH_GetNumberOfChangingSweeps( const ABFFileHeader *pFH ); // // Checks whether the digital output varies from episode to episode. BOOL WINAPI ABFH_IsConstantDigitalOutput(const ABFFileHeader *pFH); BOOL WINAPI ABFH_IsConstantDigitalOutputEx(const ABFFileHeader *pFH, UINT uDACChannel); int WINAPI ABFH_GetEpochDuration(const ABFFileHeader *pFH, UINT uDACChannel, UINT uEpisode, int nEpoch); float WINAPI ABFH_GetEpochLevel(const ABFFileHeader *pFH, UINT uDACChannel, UINT uEpisode, int nEpoch); BOOL WINAPI ABFH_GetEpochLevelRange(const ABFFileHeader *pFH, UINT uDACChannel, int nEpoch, float *pfMin, float *pfMax); UINT WINAPI ABFH_GetMaxPNSubsweeps(const ABFFileHeader *pFH, UINT uDACChannel); */ // // Error return values that may be returned by the ABFH_xxx functions. // #define ABFH_FIRSTERRORNUMBER 2001 #define ABFH_EHEADERREAD 2001 #define ABFH_EHEADERWRITE 2002 #define ABFH_EINVALIDFILE 2003 #define ABFH_EUNKNOWNFILETYPE 2004 #define ABFH_CHANNELNOTSAMPLED 2005 #define ABFH_EPOCHNOTPRESENT 2006 #define ABFH_ENOWAVEFORM 2007 #define ABFH_EDACFILEWAVEFORM 2008 #define ABFH_ENOMEMORY 2009 #define ABFH_BADSAMPLEINTERVAL 2010 #define ABFH_BADSECONDSAMPLEINTERVAL 2011 #define ABFH_BADSAMPLEINTERVALS 2012 #define ABFH_ENOCONDITTRAINS 2013 #define ABFH_EMETADURATION 2014 #define ABFH_ECONDITNUMPULSES 2015 #define ABFH_ECONDITBASEDUR 2016 #define ABFH_ECONDITBASELEVEL 2017 #define ABFH_ECONDITPOSTTRAINDUR 2018 #define ABFH_ECONDITPOSTTRAINLEVEL 2019 #define ABFH_ESTART2START 2020 #define ABFH_EINACTIVEHOLDING 2021 #define ABFH_EINVALIDCHARS 2022 #define ABFH_ENODIG 2023 #define ABFH_EDIGHOLDLEVEL 2024 #define ABFH_ENOPNPULSES 2025 #define ABFH_EPNNUMPULSES 2026 #define ABFH_ENOEPOCH 2027 #define ABFH_EEPOCHLEN 2028 #define ABFH_EEPOCHINITLEVEL 2029 #define ABFH_EDIGLEVEL 2030 #define ABFH_ECONDITSTEPDUR 2031 #define ABFH_ECONDITSTEPLEVEL 2032 #define ABFH_EINVALIDBINARYCHARS 2033 #define ABFH_EBADWAVEFORM 2034 #ifdef __cplusplus } #endif #endif /* INC_ABFHEADR_H */ stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/structures.h0000664000175000017500000002017313062445067020544 00000000000000/* --------------------------------------------------------------------------- Copyright (C) 2014 Alois Schloegl Copyright (C) 2003 Eugenio Cervesato & Giorgio De Odorico. Developed at the Associazione per la Ricerca in Cardiologia - Pordenone - Italy. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --------------------------------------------------------------------------- */ // structures.h header file #ifndef __STRUCTURES_H__ #define __STRUCTURES_H__ #include /* // obsolete definition #define int_S int8_t #define int_M int16_t #define int_L int32_t #define U_int_S uint8_t #define U_int_M uint16_t #define U_int_L uint32_t #define dec_S float #define dec_M double #define dec_L long double */ #define str char #define bool char #define true 1 #define false 0 #define TRUE 1 #define FALSE 0 struct alfabetic { uint16_t number; const char *sentence; }; struct numeric { uint16_t value; uint8_t unit; }; struct section_header { uint16_t CRC; uint16_t ID; uint32_t length; uint8_t version; uint8_t protocol_version; char *word; }; struct file_header { uint16_t CRC; uint32_t length; }; struct pointer_section { uint32_t index; int16_t ID; uint32_t length; }; struct device_info { uint16_t institution_number; uint16_t department_number; uint16_t ID; uint8_t type; uint8_t manifacturer; char *model_description; uint8_t protocol_revision_number; uint8_t category; uint8_t language; uint8_t capability[4]; uint8_t AC; char *analysing_program_revision_number; char *serial_number_device; char *device_system_software; char *device_SCP_implementation_software; char *manifacturer_trade_name; }; struct info_drug { uint8_t table; uint8_t classes; uint8_t drug_code; uint16_t length; }; struct Time_Zone { int16_t offset; uint16_t index; const char *description; }; struct demographic { char *first_name; char *last_name; char *ID; char *second_last_name; struct numeric age; time_t date_birth2; // by E.C. feb 2006 struct numeric height; struct numeric weight; uint8_t sex; uint8_t race; uint16_t systolic_pressure; uint16_t diastolic_pressure; }; struct clinic { uint16_t number_drug; struct info_drug *drug; char *text_drug; uint16_t number_diagnose; struct numeric *diagnose; char *text_diagnose; char *referring_physician; char *latest_confirming_physician; char *technician_description; uint16_t number_text; struct numeric *free_text; char *text_free_text; uint16_t number_hystory; struct numeric *medical_hystory; uint16_t number_free_hystory; struct numeric *free_medical_hystory; char *text_free_medical_hystory; }; struct descriptive { struct device_info acquiring; struct device_info analyzing; char *acquiring_institution; char *analyzing_institution; char *acquiring_department; char *analyzing_department; char *room; uint8_t stat_code; }; struct device { time_t date_acquisition2; // by E.C. feb 2006 time_t time_acquisition2; // by E.C. feb 2006 uint16_t baseline_filter; uint16_t lowpass_filter; uint8_t other_filter[4]; char *sequence_number; struct numeric electrode_configuration; struct Time_Zone TZ; }; struct table_H { uint8_t bit_prefix; uint8_t bit_code; uint8_t TMS; int16_t base_value; uint32_t base_code; }; struct f_lead { uint8_t number; bool subtraction; bool all_simultaneously; uint8_t number_simultaneously; }; struct lead { uint8_t ID; uint32_t start; uint32_t end; }; struct Subtraction_Zone { uint16_t beat_type; uint32_t SB; uint32_t fc; uint32_t SE; }; struct Protected_Area { uint32_t QB; uint32_t QE; }; struct f_BdR0 { uint16_t length; uint16_t fcM; uint16_t AVM; uint16_t STM; uint16_t number_samples; uint8_t encoding; }; struct f_Res { uint16_t AVM; uint16_t STM; uint16_t number; uint16_t number_samples; uint8_t encoding; bool bimodal; uint8_t decimation_factor; }; struct spike { uint16_t time; int16_t amplitude; uint8_t type; uint8_t source; uint8_t index; uint16_t pulse_width; }; struct global_measurement { uint8_t number; uint16_t number_QRS; uint8_t number_spike; uint16_t average_RR; uint16_t average_PP; uint16_t ventricular_rate; uint16_t atrial_rate; uint16_t QT_corrected; uint8_t formula_type; uint16_t number_tag; }; struct additional_measurement { uint8_t ID; uint8_t byte[5]; }; struct BdR_measurement { uint16_t P_onset; uint16_t P_offset; uint16_t QRS_onset; uint16_t QRS_offset; uint16_t T_offset; int16_t P_axis; int16_t QRS_axis; int16_t T_axis; }; struct info { uint8_t type; char *date; char *time; uint8_t number; }; struct header_lead_measurement { uint16_t number_lead; uint16_t number_lead_measurement; }; struct lead_measurement_block { uint16_t ID; int16_t P_duration; int16_t PR_interval; int16_t QRS_duration; int16_t QT_interval; int16_t Q_duration; int16_t R_duration; int16_t S_duration; int16_t R1_duration; int16_t S1_duration; int16_t Q_amplitude; int16_t R_amplitude; int16_t S_amplitude; int16_t R1_amplitude; int16_t S1_amplitude; int16_t J_point_amplitude; int16_t Pp_amplitude; int16_t Pm_amplitude; int16_t Tp_amplitude; int16_t Tm_amplitude; int16_t ST_slope; int16_t P_morphology; int16_t T_morphology; int16_t iso_electric_segment_onset_QRS; int16_t iso_electric_segment_offset_QRS; int16_t intrinsicoid_deflection; uint16_t quality_recording[8]; int16_t ST_amplitude_Jplus20; int16_t ST_amplitude_Jplus60; int16_t ST_amplitude_Jplus80; int16_t ST_amplitude_JplusRR16; int16_t ST_amplitude_JplusRR8; }; struct statement_coded { uint8_t sequence_number; uint16_t length; uint8_t type; uint16_t number_field; }; //_____________________________________ //structs for sections: 2, 3, 4, 5, 6 //_____________________________________ struct DATA_DECODE { struct table_H *t_Huffman; uint16_t *flag_Huffman; struct lead *data_lead; struct f_lead flag_lead; struct Protected_Area *data_protected; struct Subtraction_Zone *data_subtraction; struct f_BdR0 flag_BdR0; uint16_t *length_BdR0; uint8_t *samples_BdR0; int32_t *Median; struct f_Res flag_Res; uint16_t *length_Res; uint8_t *samples_Res; int32_t *Residual; int32_t *Reconstructed; }; struct TREE_NODE //struttura di un nodo dell'albero { struct TREE_NODE *next_0; struct TREE_NODE *next_1; int16_t row; }; //_____________________________________ //structs for sections: 7, 10 //_____________________________________ struct DATA_RECORD { struct global_measurement data_global; struct spike *data_spike; uint8_t *type_BdR; struct BdR_measurement *data_BdR; struct additional_measurement *data_additional; struct header_lead_measurement header_lead; struct lead_measurement_block *lead_block; }; //_____________________________________ //structs for sections: 1, 8, 11 //_____________________________________ struct DATA_INFO { struct demographic ana; struct clinic cli; struct descriptive des; struct device dev; struct info flag_report; struct numeric *text_dim; char *text_report; struct info flag_statement; struct statement_coded *data_statement; char *text_statement; }; #endif /*__STRUCTURES_H__*/ //_____________________________________ stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/sopen_axg_read.c0000664000175000017500000004647613240263033021275 00000000000000/* sopen_axg_read is a helper function to sopen, reading AXG data. Copyright (C) 2008-2014 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #if !defined(__APPLE__) && defined (_LIBICONV_H) #define iconv libiconv #define iconv_open libiconv_open #define iconv_close libiconv_close #endif #include "../biosig-dev.h" #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) void sopen_axg_read(HDRTYPE* hdr) { hdr->FILE.LittleEndian = 0; // read whole file into RAM size_t count = hdr->HeadLen; while (!ifeof(hdr)) { const int minsize = 1024; hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, 2*count+minsize); count += ifread(hdr->AS.Header+count, 1, count+minsize, hdr); } ifclose(hdr); if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %p %i\n", __FILE__, __LINE__, hdr->CHANNEL, hdr->NS ); int32_t nCol; switch ((int) hdr->VERSION) { case 1: case 2: nCol = bei16p(hdr->AS.Header+6); hdr->HeadLen = 8; break; case 3: case 4: case 5: case 6: nCol = bei32p(hdr->AS.Header+8); hdr->HeadLen = 12; break; default: biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - unsupported version number"); return; } /* hack: for now each trace (i.e. column) becomes a separate channel - later the traces of the channels will be reorganized */ CHANNEL_TYPE *TEMPCHANNEL = (CHANNEL_TYPE*)malloc(nCol*sizeof(CHANNEL_TYPE)); char **ValLabel = (char**)malloc(nCol*sizeof(char*)); uint32_t *keyLabel = (uint32_t*)malloc(nCol*sizeof(uint32_t)); if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %p %i\n", __FILE__, __LINE__, hdr->CHANNEL, hdr->NS ); /******* read all column/traces ******/ int32_t k; uint8_t *pos = hdr->AS.Header+hdr->HeadLen; hdr->SPR = beu32p(pos); switch ((int) hdr->VERSION) { case 1: for (k = 0; k < nCol; k++) { CHANNEL_TYPE *hc = TEMPCHANNEL+k; hc->GDFTYP = 16; //float hc->PhysDimCode = 0; hc->SPR = beu32p(pos); int strlen = pos[4]; // string in Pascal format if (strlen > 79) { biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - invalid title length "); return; } /* Organize channels */ uint32_t i; for (i = 0; i < hdr->NS; i++) { // check if channel with same title already exists if (!memcmp(ValLabel[hdr->NS], pos+4, strlen)) { keyLabel[k] = hdr->NS; break; } } if (i==hdr->NS) { // in case of new title, add another channel ValLabel[hdr->NS] = (char*)pos+4; keyLabel[k] = hdr->NS; hdr->NS++; } // start of data section hc->bufptr = pos+84; pos += 84 + hc->SPR * sizeof(float); } break; case 2: for (k = 0; k < nCol; k++) { CHANNEL_TYPE *hc = TEMPCHANNEL+k; hc->GDFTYP = 3; // int16 hc->PhysDimCode = 0; hc->SPR = beu32p(pos); if (k==0) { hc->Off = bef32p(pos+84); hc->Cal = bef32p(pos+88); hc->bufptr = NULL; hdr->SampleRate = 1.0 / hc->Cal; } else { hc->Cal = bef32p(pos+84); hc->Off = 0.0; hc->bufptr = pos + 88; } int strlen = pos[4]; // string in Pascal format if (strlen > 79) { biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - invalid title length "); return; } biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - version 2 not supported yet "); return; // start of data sectioB pos += (k==0 ? 92 : 88 + hc->SPR * sizeof(int16_t) ); } break; case 6: for (k=0; k < nCol; k++) { if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %p %i\n", __FILE__, __LINE__, hdr->CHANNEL, k ); CHANNEL_TYPE *hc = TEMPCHANNEL+k; hc->SPR = beu32p(pos); uint32_t datatype = beu32p(pos+4); size_t titleLen = beu32p(pos+8); char *inbuf = (char*)pos + 12; hc->bufptr = pos + 12 + titleLen; if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %i %i %i\n", __FILE__, __LINE__, (int)datatype, (int)titleLen, (int)hc->SPR); /* // The only types used for data file columns are... // ShortArrayType = 4 IntArrayType = 5 // FloatArrayType = 6 DoubleArrayType = 7 // SeriesArrayType = 9 ScaledShortArrayType = 10 */ hc->Cal = 1.0; hc->Off = 0.0; hc->GDFTYP = datatype; //TEMPCHANNEL.GDFTYP uses a different encoding than standard GDFTYP hc->OnOff = 1; switch (datatype) { case 4: // int16 case 5: // int32 case 6: // float32 case 7: // double break; case 9: hc->GDFTYP = 17; // series // double firstval = bef64p(hc->bufptr); double increment = bef64p(hc->bufptr+8); hc->bufptr = NULL; hc->OnOff = 0; if (!memcmp(inbuf,"\0T\0i\0m\0e\0 \0(\0s\0)\0",8)) { hdr->SampleRate = 1.0/increment; //hc->OnOff = 2; // time axis } else { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "AXG: series data not being a Time axis is not supported. "); return; } break; case 10: // scaled short hc->Cal = bef64p(hc->bufptr); hc->Off = bef64p(hc->bufptr+8); break; default: hc->OnOff = 0; biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "error reading AXG: unsupported data type"); return; } if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %p %i\n", __FILE__, __LINE__, hdr->CHANNEL, k ); if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i): %i %i %i %i\n", __FILE__, __LINE__, (int)hc->SPR, (int)datatype, (int)titleLen, (int)(pos-hdr->AS.Header) ); /* Organize channels find number of channels and setup data structure that assignes each column to a channel ValLabel contains the different Labels - one for each channel keyLabel contains the channel number for the corresponding column */ uint32_t i; for (i = 0; i < hdr->NS; i++) { // check if channel with same title already exists uint32_t prevTitleLen = beu32p((uint8_t*)(ValLabel[i])-4); if ((titleLen == prevTitleLen) && !memcmp(ValLabel[i], pos+12, titleLen)) { keyLabel[k] = i; break; } } if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %p %i\n", __FILE__, __LINE__, hdr->CHANNEL, k ); if (i==hdr->NS) { // in case of new title, add another channel ValLabel[hdr->NS] = (char*)pos+12; // pointer to title of channel 'nLabel', length of title is stored in beu32p(pos+8) keyLabel[k] = hdr->NS; hdr->NS++; } if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %p %i\n", __FILE__, __LINE__, hdr->CHANNEL, k ); // pointer to data sections hc->bufptr = pos + 12 + titleLen; // move pos to the starting position of the next column pos += 12 + titleLen; // position of next column switch (datatype) { case 4: pos += hc->SPR * sizeof(int16_t); break; case 5: //int32 case 6: //float pos += hc->SPR * 4; break; case 7: pos += hc->SPR * sizeof(double); break; case 9: pos += 2 * sizeof(double); break; case 10: pos += 2 * sizeof(double) + hc->SPR * sizeof(int16_t); break; default: biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"error reading AXG: unsupported data type"); } if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i): %i %i %i %i\n", __FILE__, __LINE__, (int)hc->SPR, (int)datatype, (int)titleLen, (int)(pos-hdr->AS.Header) ); } break; default: biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG version is not supported"); } if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) %p %p %i %i\n", __FILE__, __LINE__, TEMPCHANNEL, hdr->CHANNEL, (int)hdr->NS , (int)sizeof(CHANNEL_TYPE)); /* convert columns/traces into channels */ hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); uint32_t ns; for (ns=0; ns < hdr->NS; ns++) { CHANNEL_TYPE *hc = hdr->CHANNEL + ns; hc->SPR = 0; hc->GDFTYP = 0; hc->OnOff = 1; } size_t EventN = 0; hdr->SPR = 0; if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i) NS=%i nCol=%i\n", __FILE__, __LINE__, hdr->NS, nCol ); int flag_traces_of_first_sweep_done=0; for (k=0; k < nCol; k++) { /* copy essential parameters ´(GDFTYP, OnOff, Cal, Off) from TEMPCHANNEL and keep track of the number of samples SPR for each channel */ // define GDFTYP, Cal, Off ns = keyLabel[k]; // channel number for current column CHANNEL_TYPE *hc = hdr->CHANNEL + ns; hc->SPR += TEMPCHANNEL[k].SPR; switch (TEMPCHANNEL[k].GDFTYP) { case 4: // int16 if (hc->GDFTYP < 3) hc->GDFTYP = 3; break; case 5: // int32 if (hc->GDFTYP < 5) hc->GDFTYP = 5; break; case 6: // float32 if (hc->GDFTYP < 16) hc->GDFTYP = 16; break; case 7: // double if (hc->GDFTYP < 17) hc->GDFTYP = 17; break; case 10: hc->GDFTYP = 3; // scaled short if (hc->GDFTYP < 16) hc->GDFTYP = 16; } if (!flag_traces_of_first_sweep_done) { hc->Cal = TEMPCHANNEL[k].Cal; hc->Off = TEMPCHANNEL[k].Off; } else { if (hc->Cal != TEMPCHANNEL[k].Cal || hc->Off != TEMPCHANNEL[k].Off) { // in case input is scaled short, output shoud be float hc->GDFTYP = max(16, hc->GDFTYP); } } if (hdr->SPR < hc->SPR) hdr->SPR = hc->SPR; if (ns+1 == hdr->NS) { flag_traces_of_first_sweep_done = 1; // if current column corresponds to last channel, ... // check if all traces of the same sweep have the same length, and ... for (ns=0; ns < hdr->NS; ns++) { CHANNEL_TYPE *hc = hdr->CHANNEL + ns; if (hc->OnOff != 1) continue; else if (hdr->SPR != hc->SPR) { biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - SPR differs between channel"); return; } } // ... add segment break in event table. if ( hdr->EVENT.N + 1 >= EventN ) { EventN += max(EventN, 16); hdr->EVENT.POS = (uint32_t*)realloc(hdr->EVENT.POS, EventN * sizeof(*hdr->EVENT.POS)); hdr->EVENT.TYP = (uint16_t*)realloc(hdr->EVENT.TYP, EventN * sizeof(*hdr->EVENT.TYP)); } hdr->EVENT.TYP[hdr->EVENT.N] = 0x7ffe; hdr->EVENT.POS[hdr->EVENT.N] = hdr->SPR; hdr->EVENT.N++; } } hdr->EVENT.N--; // ignore last separator event hdr->NRec = hdr->SPR; hdr->SPR = 1; uint32_t bi8 = 0; for (ns=0; ns < hdr->NS; ns++) { CHANNEL_TYPE *hc = hdr->CHANNEL+ns; hc->SPR = hdr->SPR; hc->bi8 = bi8; hc->bi = bi8/8; if (hc->OnOff != 1) hc->SPR = 0; else bi8 += GDFTYP_BITS[hc->GDFTYP]; } hdr->AS.bpb = bi8/8; for (ns=0; ns < hdr->NS; ns++) { CHANNEL_TYPE *hc = hdr->CHANNEL+ns; // define hdr->channel[.].Label, hdr->channel[.].PhysDim if (hdr->Version <= 2) { // PascalToCString(ValLabel[ns]); // shift by 1 byte and terminate 0 char int strlen = min(ValLabel[ns][0],MAX_LENGTH_LABEL); strncpy(hc->Label, (ValLabel[ns])+1, strlen); char *u1 = strrchr(ValLabel[ns],'('); char *u2 = strrchr(ValLabel[ns],')'); if (u1 != NULL && u2 != NULL && u1 < u2) { *u1 = 0; *u2 = 0; hc->PhysDimCode = PhysDimCode(u1+1); } } else if (hdr->Version <= 6) { char *inbuf = ValLabel[ns]; size_t inlen = beu32p((uint8_t*)(ValLabel[ns])-4); char *outbuf = hc->Label; size_t outlen = MAX_LENGTH_LABEL+1; #if defined(_ICONV_H) || defined (_LIBICONV_H) iconv_t ICONV = iconv_open("UTF-8","UCS-2BE"); size_t reticonv = iconv(ICONV, &inbuf, &inlen, &outbuf, &outlen); iconv_close(ICONV); if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i): %i %i %i %"PRIiPTR"\n", __FILE__, __LINE__, (int)hc->SPR, (int)inlen, (int)(pos-hdr->AS.Header), reticonv ); if (reticonv == (size_t)(-1) ) { perror("AXG - conversion of title failed!!!"); biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - conversion of title failed"); return; } *outbuf=0; #else ++inbuf; int i = min(MAX_LENGTH_LABEL, titleLen/2); for (; i>0 ; i-- ) { *outbuf= *inbuf; inbuf += 2; outbuf++; } outbuf = 0; #endif char *u1 = strrchr(hc->Label,'('); char *u2 = strrchr(hc->Label,')'); if (u1 != NULL && u2 != NULL && u1 < u2) { *u1 = 0; *u2 = 0; hc->PhysDimCode = PhysDimCode(u1+1); } } // these might be reorganized below hc->DigMax = 1e9; hc->DigMin = -1e9; hc->PhysMax = hc->DigMax; hc->PhysMin = hc->DigMin; hc->LeadIdCode = 0; hc->Transducer[0] = 0; hc->Cal = 1.0; hc->Off = 0.0; hc->TOffset = 0; hc->HighPass = NAN; hc->LowPass = NAN; hc->Notch = NAN; hc->Impedance = INFINITY; hc->fZ = NAN; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; } hdr->AS.rawdata = (uint8_t*)realloc( hdr->AS.rawdata, hdr->AS.bpb*hdr->SPR*hdr->NRec); for (ns=0; ns < hdr->NS; ns++) { CHANNEL_TYPE *hc = hdr->CHANNEL + ns; hc->SPR = 0; } for (k=0; k < nCol; k++) { ns = keyLabel[k]; CHANNEL_TYPE *hc = hdr->CHANNEL + ns; if (hc->OnOff != 1) continue; uint32_t i; switch (hc->GDFTYP) { case 3: assert(TEMPCHANNEL[k].GDFTYP==4); for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(int16_t*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = bei16p(TEMPCHANNEL[k].bufptr + i*2); } break; case 5: switch (TEMPCHANNEL[k].GDFTYP) { case 4: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(int32_t*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = bei16p(TEMPCHANNEL[k].bufptr + i*2); } break; case 5: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(int32_t*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = bei32p(TEMPCHANNEL[k].bufptr + i*4); } break; default: biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - data conversion not supported "); return; } break; case 16: switch (TEMPCHANNEL[k].GDFTYP) { case 4: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(float*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = (float)bei16p(TEMPCHANNEL[k].bufptr + i*2); } break; case 5: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(float*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = (float)bei32p(TEMPCHANNEL[k].bufptr + i*4); } break; case 6: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(float*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = bef32p(TEMPCHANNEL[k].bufptr + i*4); } break; case 10: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(float*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = bei16p(TEMPCHANNEL[k].bufptr + i*2) * TEMPCHANNEL[k].Cal + TEMPCHANNEL[k].Off; } break; default: biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - data conversion not supported "); return; } break; case 17: switch (TEMPCHANNEL[k].GDFTYP) { case 4: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(double*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = (double)bei16p(TEMPCHANNEL[k].bufptr + i*2); } break; case 5: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(double*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = (double)bei32p(TEMPCHANNEL[k].bufptr + i*4); } break; case 6: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(double*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = (double)bef32p(TEMPCHANNEL[k].bufptr + i*4); } break; case 7: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(double*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = bef64p(TEMPCHANNEL[k].bufptr + i*8); } break; case 10: for (i=0; i < TEMPCHANNEL[k].SPR; i++) { *(double*)(hdr->AS.rawdata + hc->bi + (hc->SPR + i) * hdr->AS.bpb) = bei16p(TEMPCHANNEL[k].bufptr + i*2) * TEMPCHANNEL[k].Cal + TEMPCHANNEL[k].Off; } break; default: biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - data conversion not supported "); return; } break; default: biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - unsupported target data type"); return; } hc->SPR += TEMPCHANNEL[k].SPR; } for (ns=0; ns < hdr->NS; ns++) { CHANNEL_TYPE *hc = hdr->CHANNEL + ns; hc->SPR = hdr->SPR; } // free intermediate data structure to reorganized column/trace to channels if(TEMPCHANNEL) free(TEMPCHANNEL); if(keyLabel) free(keyLabel); if(ValLabel) free(ValLabel); // data is stored on hdr->AS.rawdata in such a way that swapping must not be applied hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); hdr->AS.first = 0; hdr->AS.length = (size_t)hdr->NRec; // read Comments size_t szComments = beu32p(pos); char *inbuf = (char*)pos+4; char *Comments = malloc(szComments+1); char *outbuf = Comments; size_t outlen = szComments+1; size_t inlen = szComments; iconv_t ICONV = iconv_open("UTF-8","UCS-2BE"); size_t reticonv = iconv(ICONV, &inbuf, &inlen, &outbuf, &outlen); iconv_close(ICONV); if (reticonv == (size_t)(-1) ) { perror("AXG - conversion of comments failed!!!"); biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - conversion of comments failed"); return; } Comments[outlen]=0; if (VERBOSE_LEVEL >7) fprintf(stdout,"\n=== COMMENT === \n %s\n",Comments); pos += 4+szComments; // read Notes size_t szNotes = beu32p(pos); inbuf = (char*)pos+4; char *Notes = malloc(szNotes+1); outbuf = Notes; outlen = szNotes+1; inlen = szNotes; ICONV = iconv_open("UTF-8","UCS-2BE"); reticonv = iconv(ICONV, &inbuf, &inlen, &outbuf, &outlen); iconv_close(ICONV); if ( reticonv == (size_t)(-1) ) { biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"AXG - conversion of Notes failed"); return; } Notes[outlen]=0; if (VERBOSE_LEVEL >7) fprintf(stdout,"=== NOTES === \n %s\n",Notes); pos += 4+szNotes; /****** parse Date and Time ********/ struct tm T; #ifdef __GLIBC__ strptime(strstr(Notes,"Created on ")+11, "%a %b %d %Y", &T); strptime(strstr(Notes,"acquisition at ")+15, "%T", &T); hdr->T0 = tm_time2gdf_time(&T); #else char DATE[30]; strncpy(DATE, strstr(Notes,"Created on ")+11, 30); DATE[29] = 0; strtok(DATE, "\n\r"); // cut at newline char *tmp = strtok(DATE, " "); // day of week - skip tmp = strtok(NULL, " "); // abreviated month name T.tm_mon = month_string2int(tmp); tmp = strtok(NULL, " "); // day of month T.tm_mday = atoi(tmp); tmp = strtok(NULL , " "); // year T.tm_year = atoi(tmp) - 1900; strncpy(DATE, strstr(Notes,"acquisition at ")+15, 9); DATE[9] = 0; tmp = strtok(DATE, " :"); T.tm_hour = atoi(tmp); tmp = strtok(NULL, " :"); T.tm_min = atoi(tmp); tmp = strtok(NULL, " :"); T.tm_sec = atoi(tmp); hdr->T0 = tm_time2gdf_time(&T); #endif hdr->AS.fpulse = Notes; free(Comments); if (VERBOSE_LEVEL > 7) fprintf(stdout,"%s (line %i)\n", __FILE__, __LINE__ ); } stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/codes.h0000664000175000017500000003364513062445067017426 00000000000000/* --------------------------------------------------------------------------- Copyright (C) 2003 Eugenio Cervesato & Giorgio De Odorico. Developed at the Associazione per la Ricerca in Cardiologia - Pordenone - Italy. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --------------------------------------------------------------------------- */ // codes.h consts included in the protocol #ifndef __CODES_H__ #define __CODES_H__ static const char STR_END[]={(char)-1,'\0'}; static char STR_NULL[]=" unspecified/unknown "; static alfabetic _special[]={ { 29999 , "measurements not computed" }, { 29998 , "measurements not found due to rejection of the lead" }, { 19999 , "measurements not found because wave not present" }, { 999 , "undefined" } }; static alfabetic _age[]={ { 0 , " unspecified/unknown " } , { 1 , " years " } , { 2 , " months " } , { 3 , " weeks " } , { 4 , " days " } , { 5 , " hours " } }; static alfabetic _height[]={ { 0 , " unspecified/unknown " } , { 1 , " cm " } , { 2 , " inch " } , { 3 , " mm " } }; static alfabetic _weight[]={ { 0 , " unspecified/unknown " } , { 1 , " Kg " } , { 2 , " g " } , { 3 , " lb " } , { 4 , " oz " } }; static alfabetic _sex[]={ { 0 , " ? " } , { 1 , " M " } , { 2 , " F " } , { 3 , " unspecified/unknown " } }; static alfabetic _race[]={ { 0 , " unspecified/unknown " } , { 1 , " caucasian " } , { 2 , " black " } , { 3 , " oriental " } }; static alfabetic class_drug[]={ { 0 , " unspecified/unknown " } , { 1 , " digitalis preparation " } , { 2 , " antiarrhythmic " } , { 3 , " diuretics " } , { 4 , " antihypertensive " } , { 5 , " antianginal " } , { 6 , " antithrombotic agents " } , { 7 , " beta blockers " } , { 8 , " psychotropic " } , { 9 , " calcium blockers " } , { 10 , " antihypotensive " } , { 11 , " anticholesterol " } , { 12 , " ACE-inhibitors " } , { 100 , " not taking drugs " } , { 101 , " drugs, but unknown type " } , { 102 , " other medication " }, { 256 , " unspecified/unknown " } , { 257 , " digoxin-lanoxin " } , { 258 , " digitoxin-digitalis " } , { 265 , " other " }, { 512 , " unspecified/unknown " } , { 513 , " dysopyramide " } , { 514 , " quinidine " } , { 515 , " procainamide " } , { 516 , " lidocaine " } , { 517 , " phenytoin " } , { 518 , " dilantin " } , { 519 , " amiodarone " } , { 520 , " tocainide " } , { 521 , " other " } , { 522 , " encainide " } , { 523 , " mexitil/mexilitine " } , { 524 , " flecainide " } , { 525 , " lorcainide " } , { 768 , " unspecified/unknown " } , { 769 , " thiazide " } , { 770 , " furosemide (lasix) " } , { 771 , " potassium cloride " } , { 777 , " other " } , { 1024 , " unspecified/unknown " } , { 1025 , " clonidine " } , { 1026 , " prasozin " } , { 1027 , " hydralazine " } , { 1033 , " other " }, { 1280 , " unspecified/unknown " } , { 1281 , " isosorbide " } , { 1282 , " calcium blockers " } , { 1283 , " diuretics " } , { 1284 , " nitrates " } , { 1289 , " other " }, { 1536 , " unspecified/unknown " } , { 1537 , " aspirin " } , { 1538 , " coumarin " } , { 1539 , " heparin " } , { 1540 , " warfarin " } , { 1541 , " streptokinase " } , { 1542 , " t-PA " } , { 1545 , " other " }, { 1792 , " unspecified/unknown " } , { 1793 , " propanolol " } , { 1794 , " corgard " } , { 1795 , " atenolol " } , { 1796 , " metoprolol " } , { 1797 , " pindolol " } , { 1798 , " acebutolol " } , { 1801 , " other " }, { 2048 , " unspecified/unknown " } , { 2049 , " tricyclic antidepressant " } , { 2050 , " phenothiazide " } , { 2051 , " barbiturate " } , { 2057 , " other " }, { 2304 , " unspecified/unknown " } , { 2305 , " nifedipine " } , { 2306 , " verapamil " } , { 2313 , " other " }, { 2560 , " unspecified/unknown " } , { 2561 , " asthmatic drug " } , { 2562 , " aminophyline " } , { 2563 , " isuprel " } , { 2569 , " other " }, { 2816 , " unspecified/unknown " } , { 2817 , " colestid " } , { 2818 , " lovastatin " } , { 2819 , " simvastatin " } , { 2820 , " fibrates " } , { 2825 , " other " }, { 3071 , " unspecified/unknown " } , { 3072 , " captopril " } , { 3081 , " other " } }; static alfabetic device_type[]={ { 0 , " Cart " }, { 1 , " host " }, { 2 , " unspecified/unknown "} }; static alfabetic legacy_device[]={ { 0 , " unspecified/unknown " } , { 1 , " Burdick " } , { 2 , " Cambridge " } , { 3 , " Comprumed " } , { 4 , " Datamed " } , { 5 , " Fukuda " } , { 6 , " Hewlett-Packard " } , { 7 , " Marquette Electronics " } , { 8 , " Moratara Instruments " } , { 9 , " Nihon Kohden " } , { 10 , " Okin " } , { 11 , " Quinton " } , { 12 , " Siemens " } , { 13 , " Spacelabs " } , { 14 , " Telemed " } , { 15 , " Hellige " } , { 16 , " ESA-OTE " } , { 17 , " Schiller " } , { 18 , " Picker-Schwarzer " } , { 19 , " Elettronica-Trentina " } , { 20 , " Zwonitz " } }; static alfabetic compatibility[]={ { 72 , " I " } , { 160 , " II " } , { 176 , " III " } , { 192 , " IV " }, { 255 , " unspecified/unknown " } }; static alfabetic language_code[]={ { 0 , " 8 bit ASCII only " } , { 1 , " ISO-8859-1 latin-1 " } , { 192 , " ISO-8859-2 latin-2 (central and estern european) " } , { 208 , " ISO-8859-4 latin-4 (Baltic) " } , { 200 , " ISO-8859-5 (Cyrillic) " } , { 216 , " ISO-8859-6 (Arabic) " } , { 196 , " ISO-8859-7 (Greek) " } , { 212 , " ISO-8859-8 (Hebrew) " } , { 204 , " ISO-8859-11 (Thai) " } , { 220 , " ISO-8859-15 latin-9 (latin-0) " } , { 224 , " Unicode (ISO-60646) " } , { 240 , " JIS X0201-1976 (Japanese) " } , { 232 , " JIS X0208-1977 (Japanese) " } , { 248 , " JIS X0212-1990 (Japanese) " } , { 228 , " GB 2312-80 (Chinese) " } , { 244 , " KS C5601-1987 (Korean) " } , { 255 , " unspecified/unknown " } }; static alfabetic capability_device[]={ { 1 , " No printing " } , { 2 , " No analysis " } , { 3 , " No storage " } , { 4 , " No acquisition " } , { 5 , " can print ECG reports " } , { 6 , " can interpret ECG " } , { 7 , " can store ECG records " } , { 8 , " can acquire ECG data " } }; static alfabetic frequency_AC[]={ { 0 , " unspecified/unknown " } , { 1 , " 50 Hz " } , { 2 , " 60 Hz " } }; static alfabetic filter_bitmap[]={ { 0 , " unspecified/unknown " }, { 1 , " 60 Hz notch filter " } , { 2 , " 50 Hz notch filter " } , { 3 , " artifact filter " } , { 4 , " baseline filter " } }; static alfabetic _hystory[]={ { 0 , " diagnoses or clinical problems " } , { 1 , " apparently healty " } , { 10 , " acute myocardial infarction " } , { 11 , " myocardial infarction " } , { 12 , " previous myocardial infarction " } , { 15 , " ischemic heart disease " } , { 18 , " peripheral vascular disease " } , { 20 , " cyanotic congenital heart disease " } , { 21 , " acyanotic congenital heart disease " } , { 22 , " valvular heart disease " } , { 25 , " hypertension " } , { 27 , " cerebrovascular accident " } , { 30 , " cardiomyopathy " } , { 35 , " pericardits " } , { 36 , " myocardits " } , { 40 , " post-operative cardiac surgery " } , { 42 , " implanted cardiac pacemaker " } , { 45 , " pulmonary embolism " } , { 50 , " respiratory disease " } , { 55 , " endocrine disease " } , { 60 , " neurological disease " } , { 65 , " alimentary disease " } , { 70 , " renal disease " } , { 80 , " pre-operative general surgery " } , { 81 , " post-operative general surgery " } , { 90 , " general medical " } , { 100 , " unspecified/unknown " } }; static alfabetic electrode_configuration_standard[]={ { 0 , " unspecified/unknown " } , { 1 , " 12-lead positions: RA, RL, LA, and LL at limb extremities. V1 to V6 at standard positions on the chest. Individually " } , { 2 , " RA, RL, LA, and LL are placed on the torso. V1 to V6 are placed at standard positions on the chest. Individually " } , { 3 , " RA, RL, LA, and LL are individually placed on the torso. V1 to V6 on the chest as part of a single electrode pad " } , { 4 , " RA, RL, LA, LL, and V1 to V6 (all electrodes) are on the chest in a single electrode pad " } , { 5 , " 12-lead ECG is derived from Frank XYZ leads " } , { 6 , " 12-lead ECG is derived from non-standard leads " } }; static alfabetic electrode_configuration_XYZ[]={ { 0 , " unspecified/unknown " } , { 1 , " Frank " } , { 2 , " McFee-Parungao " } , { 3 , " Cube " } , { 4 , " XYZ bipolar uncorrected " } , { 5 , " pseudo-orthogonal XYZ (as used in Holter) " } , { 6 , " XYZ derived from standard 12 leads " } }; static alfabetic lead_identification[]={ { 0 , " unspecified/unknown " } , { 1 , " I " } , { 2 , " II " } , { 3 , " V1 " } , { 4 , " V2 " } , { 5 , " V3 " } , { 6 , " V4 " } , { 7 , " V5 " } , { 8 , " V6 " } , { 9 , " V7 " } , { 10 , " V2R " } , { 11 , " V3R " } , { 12 , " V4R " } , { 13 , " V5R " } , { 14 , " V6R " } , { 15 , " V7R " } , { 16 , " X " } , { 17 , " Y " } , { 18 , " Z " } , { 19 , " CC5 " } , { 20 , " CM5 " } , { 21 , " left arm " } , { 22 , " right arm " } , { 23 , " left leg " } , { 24 , " I " } , { 25 , " R " } , { 26 , " C " } , { 27 , " A " } , { 28 , " M " } , { 29 , " F " } , { 30 , " H " } , { 31 , " I-cal " } , { 32 , " II-cal " } , { 33 , " V1-cal " } , { 34 , " V2-cal " } , { 35 , " V3-cal " } , { 36 , " V4-cal " } , { 37 , " V5-cal " } , { 38 , " V6-cal " } , { 39 , " V7-cal " } , { 40 , " V2R-cal " } , { 41 , " V3R-cal " } , { 42 , " V4R-cal " } , { 43 , " V5R-cal " } , { 44 , " V6R-cal " } , { 45 , " V7R-cal " } , { 46 , " X-cal " } , { 47 , " Y-cal " } , { 48 , " Z-cal " } , { 49 , " CC5-cal " } , { 50 , " CM5-cal " } , { 51 , " left arm-cal " } , { 52 , " right arm-cal " } , { 53 , " left leg-cal " } , { 54 , " I-cal " } , { 55 , " R-cal " } , { 56 , " C-cal " } , { 57 , " A-cal " } , { 58 , " M-cal " } , { 59 , " F-cal " } , { 60 , " H-cal " } , { 61 , " III " } , { 62 , " aVR " } , { 63 , " aVL " } , { 64 , " aVF " } , { 65 , " -aVR " } , { 66 , " V8 " } , { 67 , " V9 " } , { 68 , " V8R " } , { 69 , " V9R " } , { 70 , " D (Nehb-dorsal) " } , { 71 , " A (Nehb-anterior) " } , { 72 , " J (Nehb-inferior) " } , { 73 , " defibrillator anterior-lateral " } , { 74 , " external pacing anterior-posterior " } , { 75 , " A1 (auxiliary unipolar lead 1) " } , { 76 , " A2 (auxiliary unipolar lead 2) " } , { 77 , " A3 (auxiliary unipolar lead 3) " } , { 78 , " A4 (auxiliary unipolar lead 4) " } , { 79 , " V8-cal " } , { 80 , " V9-cal " } , { 81 , " V8R-cal " } , { 82 , " V9R-cal " } , { 83 , " D-cal (Nehb-dorsal) " } , { 84 , " A-cal (Nehb-anterior) " } , { 85 , " J-cal (Nehb-inferior) " } }; static alfabetic _encode[]={ { 0 , " real " } , { 1 , " first difference " } , { 2 , " second difference " } }; static alfabetic _compression[]={ { 0 , " bimodal compression not used " } , { 1 , " bimodal compression used " } }; static alfabetic spike_type[]={ { 0 , " unspecified/unknown " } , { 1 , " spike triggers neither P-wave nor QRS " } , { 2 , " spike triggers a QRS " } , { 3 , " spike triggers a P-wave " } }; static alfabetic source_pacemaker[]={ { 0 , " unspecified/unknown " } , { 1 , " internal " } , { 2 , " external " } }; static alfabetic triggered_spike[]={ { 0 , " spike does not trigger a QRS " } , { 1 , " spike triggers a QRS " } }; static alfabetic _formula_type[]={ { 0 , " unspecified/unknown " } , { 1 , " Bazett " } , { 2 , " Hodges " } }; static alfabetic ID_tag[]={ { 0 , " QTend all-lead dispersion " } , { 1 , " QTpeak all-lead dispersion " } , { 2 , " QTend precordial dispersion " } , { 3 , " QTpeak precordial dispersion " } , { 4 , " unspecified/unknown " } }; static alfabetic value_tag[]={ { 0 , " Dispersion = maximum QT interval ? minimum QT interval " } , { 1 , " Heart rate corrected Dispersion: Max?Min " } , { 2 , " Dispersion = standard deviation of the QT intervals " } , { 3 , " Heart rate corrected Dispersion: standard deviation " } , { 4 , " Heart rate correction formula. (See definition of byte 7 for valid values) " } }; static alfabetic type_confirm[]={ { 0 , " original report (not overread) " } , { 1 , " confirmed report " } , { 2 , " overread report, but not confirmed " } , { 3 , " unspecified/unknown " } }; static alfabetic morphology_description[]={ { 0 , " unspecified/unknown " } , { 1 , " positive " } , { 2 , " negative " } , { 3 , " positive/negative " } , { 4 , " negative/positive " } , { 5 , " positive/negative/positive " } , { 6 , " negative/positive/negative " } , { 7 , " notched M-shaped " } , { 8 , " notched W-shaped " } }; static alfabetic quality_code[]={ { 0 , " AC (mains) noise " } , { 1 , " overrange " } , { 2 , " wander " } , { 3 , " tremor or muscle artifact " } , { 4 , " spike or sudden jumps " } , { 5 , " electrode loose or off " } , { 6 , " pacemaker " } , { 7 , " interchanged lead " } }; static alfabetic noise_level[]={ { 0 , " none/no " } , { 1 , " moderate/yes " } , { 2 , " severe " } , { 3 , " unknown " } }; static alfabetic type_statement[]={ { 1 , " coded statement type " } , { 2 , " full text type " } , { 3 , " statement logic type " } }; #endif /*__CODES_H__*/ stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/sopen_alpha_read.c0000664000175000017500000004035013240263033021564 00000000000000/* $Id: sopen_alpha_read.c,v 1.2 2009-02-12 16:15:17 schloegl Exp $ Copyright (C) 2005,2006,2007,2008,2009 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include "../biosig-dev.h" #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) EXTERN_C void sopen_alpha_read(HDRTYPE* hdr) { /* this function will be called by the function SOPEN in "biosig.c" Input: char* Header // contains the file content Output: HDRTYPE *hdr // defines the HDR structure accoring to "biosig.h" */ size_t count; unsigned int k; const char *FileName = hdr->FileName; fprintf(stdout,"Warning: support for alpha format is just experimental.\n"); char* fn = (char*)malloc(strlen(hdr->FileName)+15); strcpy(fn,hdr->FileName); // Flawfinder: ignore const size_t bufsiz = 4096; char buf[bufsiz]; // alpha.alp cal_res digin digvidtc eog marker measure mkdef montage rawdata rawhead report.txt r_info sleep const char *f2 = "alpha.alp"; char *tmpstr = strrchr(fn,FILESEP); if (tmpstr) strcpy(tmpstr+1,f2); // Flawfinder: ignore else strcpy(fn,f2); // Flawfinder: ignore FILE *fid = fopen(fn,"r"); count = fread(buf,1,bufsiz-1,fid); fclose(fid); buf[count]=0; // terminating 0 character char *t = strtok(buf,"\xA\xD"); while (t) { if (VERBOSE_LEVEL>7) fprintf(stdout,"0: %s \n",t); if (!strncmp(t,"Version = ",9)) hdr->VERSION = atof(t+9); else if (!strncmp(t,"Id = ",4)) { strncpy(hdr->ID.Manufacturer._field,t+5,MAX_LENGTH_MANUF); hdr->ID.Manufacturer.Name = hdr->ID.Manufacturer._field; } t = strtok(NULL,"\xA\xD"); } f2 = "rawhead"; if (tmpstr) strcpy(tmpstr+1,f2); // Flawfinder: ignore else strcpy(fn,f2); // Flawfinder: ignore int Notch = 0; int Bits = 0; double DigMax=0, DigMin=0; uint16_t gdftyp = 0; int ns = 0; fid = fopen(fn,"r"); count = fread(buf,1,bufsiz-1,fid); fclose(fid); buf[count]=0; // terminating 0 character t = strtok(buf,"\xA\xD"); char STATUS = 1; uint32_t *ChanOrder=NULL; char **ChanType = NULL; while ((t!=NULL) && (STATUS<9)) { char *t1 = strchr(t,'='); if (VERBOSE_LEVEL>7) fprintf(stdout,"<%6.2f> %i- %s | %s\n",hdr->VERSION, STATUS,t,t1); if (t1) { t1[-1] = 0; t1++; if (STATUS == 1) { if (!strcmp(t,"Version")) hdr->VERSION = atof(t1); else if (!strcmp(t,"BitsPerValue")) { Bits = atoi(t1); switch (Bits) { case 12: gdftyp = 255+12; // hdr->FILE.LittleEndian = 0; DigMax = (1<<(Bits-1))-1; DigMin = -(1<<(Bits-1)); break; case 16: gdftyp = 3; DigMax = 32752.0; //!!! that's the maximum value found in alpha-trace files DigMin = -32736.0; //!!! that's the minimum value found in alpha-trace files break; case 32: gdftyp = 5; break; DigMax = (1<<(Bits-1))-1; DigMin = -(1<<(Bits-1)); } } else if (!strcmp(t,"ChanCount")) { hdr->NS = atoi(t1); hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS*sizeof(CHANNEL_TYPE)); ChanOrder = (uint32_t*)calloc(hdr->NS,sizeof(uint32_t)*2); ChanType = (char**)calloc(hdr->NS,sizeof(char*)); } else if (!strcmp(t,"SampleFreq")) hdr->SampleRate = atof(t1); else if (!strcmp(t,"SampleCount")) { hdr->NRec = atoi(t1); hdr->SPR = 1; } else if (!strcmp(t,"NotchFreq")) Notch = atof(t1); else if (!strcmp(t,"DispFlags") && (hdr->VERSION < 411.89)) STATUS = 2; else if (!strcmp(t,"Sec2Marker") && (hdr->VERSION > 411.89)) STATUS = 2; } else if (STATUS == 2) { if (ns>=hdr->NS) { ns = 0; STATUS = 3; } else { CHANNEL_TYPE *hc = hdr->CHANNEL+ns; hc->GDFTYP = gdftyp; hc->Notch = Notch; hc->LeadIdCode = 0; hc->SPR = hdr->SPR; //hc->bi8 = GDFTYP_BITS[gdftyp]*ns; hc->DigMax = DigMax; hc->DigMin = DigMin; hc->OnOff = 1; hc->Cal = 1.0; hc->Off = 0.0; hc->PhysMax = hc->DigMax; hc->PhysMin = hc->DigMin; strncpy(hc->Label, t, MAX_LENGTH_LABEL+1); char* t2= strchr(t1,','); t2[0] = 0; while (isspace((++t2)[0])); char* t3= strchr(t2,','); t3[0] = 0; while (isspace((++t3)[0])); char* t4= strchr(t3,','); t4[0] = 0; while (isspace((++t4)[0])); ChanOrder[ns*2] = atoi(t2); ChanOrder[ns*2+1] = ns; ChanType[ns] = t3; ns++; } } else if (STATUS == 3) { // decode information (filters, PhysDim, etc.) and assign to corresponding channels. char *pd = NULL; float tmp1, tmp2, HighPass, LowPass; #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L sscanf(t1, "%f, %f, %f, %f, %as", &HighPass,&LowPass, &tmp1,&tmp2, &pd); #else sscanf(t1, "%f, %f, %f, %f, %ms", &HighPass,&LowPass, &tmp1,&tmp2, &pd); #endif strrchr(pd,',')[0]=0; if (!strcmp(pd,"%%")) pd[1]=0; uint16_t pdc = PhysDimCode(pd); if (pd) free(pd); char flag = 0; for (k=0; k < hdr->NS; k++) { if ((ChanType[k]!=NULL) && !strcmp(t,ChanType[k])) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->PhysDimCode = pdc; //strcpy(hc->PhysDim,pd); hc->LowPass = LowPass; hc->HighPass = HighPass; ChanType[k] = NULL; } if (ChanType[k] != NULL) flag = 1; // not done yet } if (!flag) STATUS = 99; // done with channel definition } } t = strtok(NULL,"\xA\xD"); } hdr->AS.bpb8 = (GDFTYP_BITS[gdftyp]*hdr->NS); // hdr->AS.bpb = (GDFTYP_BITS[gdftyp]*hdr->NS)>>3; // do not rely on this, because some bits can get lost // sort channels qsort(ChanOrder,hdr->NS,2*sizeof(uint32_t),&u32cmp); for (k=0; kNS; k++) { hdr->CHANNEL[ChanOrder[2*k+1]].bi8 = GDFTYP_BITS[gdftyp]*k; hdr->CHANNEL[ChanOrder[2*k+1]].bi = (GDFTYP_BITS[gdftyp]*k)>>3; } free(ChanOrder); free(ChanType); f2 = "cal_res"; if (tmpstr) strcpy(tmpstr+1,f2); // Flawfinder: ignore else strcpy(fn,f2); // Flawfinder: ignore fid = fopen(fn,"r"); if (fid!=NULL) { if (VERBOSE_LEVEL>7) fprintf(stdout,"cal_res: \n"); count = fread(buf,1,bufsiz-1,fid); fclose(fid); buf[count]=0; // terminating 0 character t = strtok(buf,"\xA\xD"); t = strtok(NULL,"\xA\xD"); // skip lines 1 and 2 /* char label[MAX_LENGTH_LABEL+1]; char flag[MAX_LENGTH_LABEL+1]; double cal,off; */ char *t0,*t1,*t2,*t3; unsigned n=0; // for (k=0; max(k,n)NS; k++) { t = strtok(NULL,"\xA\xD"); if (t==NULL) { fprintf(stderr,"Warning SOPEN(alpha): scaling coefficients not defined for all channels\n"); break; } // strncpy(hc->Label,t,min(strcspn(t," =,"),MAX_LENGTH_LABEL)); t0 = strchr(t,'=');t0[0]=0;t0++; int ix = strlen(t)-1; while ((ix>0) && isspace(t[ix])) t[ix--] = 0; // remove trailing spaces t1 = strchr(t0,',');t1[0]=0;t1++; t2 = strchr(t1,',');t2[0]=0;t2++; t3 = strchr(t2,',');t3[0]=0;t3++; n = atoi(t); // n==0 if label is provided, n>0 if channel number is provided /* does not work because ambigous labels are used in rawhead and cal_res (e.g. T3 and T7) if (!n) for (n=0; nNS; n++) { if (!strcmp(hdr->CHANNEL[n].Label,t)) { n++; break; } } */ if (VERBOSE_LEVEL>7) fprintf(stdout,"cal_res: %i %i <%s> %s %s %s\n",k,n,t,t1,t2,t3); CHANNEL_TYPE *hc = hdr->CHANNEL + (n>0 ? n-1 : k); // channel can be denoted by label or number hc->Cal = atof(t1); hc->Off = 0; if (VERBOSE_LEVEL>7) fprintf(stdout," <%s> %s = ###, %f, %f\n", t1,hc->Label,hc->Cal,hc->Off); hc->PhysMax = (hc->DigMax - hc->Off) * hc->Cal; hc->PhysMin = (hc->DigMin - hc->Off) * hc->Cal; hc->XYZ[0]=0; hc->XYZ[1]=0; hc->XYZ[2]=0; } } f2 = "r_info"; if (tmpstr) strcpy(tmpstr+1,f2); // Flawfinder: ignore else strcpy(fn,f2); // Flawfinder: ignore fid = fopen(fn,"r"); if (fid!=NULL) { if (VERBOSE_LEVEL>7) fprintf(stdout,"r_info: \n"); count = fread(buf,1,bufsiz-1,fid); fclose(fid); buf[count]=0; // terminating 0 character struct tm T; t = strtok(buf,"\xA\xD"); t = strtok(NULL,"\xA\xD"); // skip line 1 while (t!=NULL) { char *t1 = strchr(t,'='); t1[0] = 0; while (isspace((++t1)[0])); for (k=strlen(t); (k>0) && isspace(t[--k]); t[k]=0); for (k=strlen(t1); (k>0) && isspace(t1[--k]); t1[k]=0); if (VERBOSE_LEVEL>7) fprintf(stdout,"r_info: %s = %s\n",t,t1); if (0) {} else if (!strcmp(t,"RecId")) strncpy(hdr->ID.Recording,t1,MAX_LENGTH_RID); else if (!strcmp(t,"RecDate")) { sscanf(t1,"%02d.%02d.%04d",&T.tm_mday,&T.tm_mon,&T.tm_year); T.tm_year -=1900; T.tm_mon -=1; } else if (!strcmp(t,"RecTime")) sscanf(t1,"%02d.%02d.%02d",&T.tm_hour,&T.tm_min,&T.tm_sec); else if (!strcmp(t,"TechSal")) { if (hdr->ID.Technician) free(hdr->ID.Technician); hdr->ID.Technician = strdup(t1); } else if (!strcmp(t,"TechTitle") || !strcmp(t,"TechLast") || !strcmp(t,"TechFirst")) { size_t l0 = strlen(hdr->ID.Technician); size_t l1 = strlen(t1); hdr->ID.Technician = (char*)realloc(hdr->ID.Technician,l0+l1+2); hdr->ID.Technician[l0] = ' '; strcpy(hdr->ID.Technician+l0+1, t1); // Flawfinder: ignore } t = strtok(NULL,"\xA\xD"); } hdr->T0 = tm_time2gdf_time(&T); } f2 = "marker"; if (tmpstr) strcpy(tmpstr+1,f2); // Flawfinder: ignore else strcpy(fn,f2); // Flawfinder: ignore fid = fopen(fn,"r"); if (fid != NULL) { size_t n,N; N=0; n=0; while (!feof(fid)) { hdr->AS.auxBUF = (uint8_t*) realloc(hdr->AS.auxBUF,N+bufsiz+1); N += fread(hdr->AS.auxBUF+N, 1, bufsiz, fid); } fclose(fid); hdr->AS.auxBUF[N] = 0; // terminating 0 character N = 0; t = (char*)hdr->AS.auxBUF+strcspn((char*)hdr->AS.auxBUF,"\xA\xD"); t = t+strspn(t,"\xA\xD"); // skip lines 1 and 2 while (t[0]) { char* t1 = t; size_t l1 = strcspn(t1,"="); size_t p2 = strspn(t1+l1,"= ")+l1; char* t2 = t+p2; size_t l2 = strcspn(t2," ,"); size_t p3 = strspn(t2+l2," ,")+l2; char* t3 = t2+p3; size_t l3 = strcspn(t3," ,"); size_t p4 = strspn(t3+l3," ,")+l3; char* t4 = t3+p4; size_t l4 = strcspn(t4,"\xA\xD"); size_t p5 = strspn(t4+l4,"\xA\xD")+l4; t1[l1] = 0; while (isspace(t1[--l1])) t1[l1]=0; t2[l2] = 0; t3[l3] = 0; t4[l4] = 0; t = t4 + p5; if (n+1 >= N) { const size_t sz = 100; hdr->EVENT.TYP = (typeof(hdr->EVENT.TYP)) realloc(hdr->EVENT.TYP,(N+sz)*sizeof(*hdr->EVENT.TYP)); hdr->EVENT.POS = (typeof(hdr->EVENT.POS)) realloc(hdr->EVENT.POS,(N+sz)*sizeof(*hdr->EVENT.POS)); N += sz; } hdr->EVENT.POS[n] = atol(t3); if (!strcmp(t1,"REC")) hdr->EVENT.TYP[n] = 0x7ffe; else if (!strcmp(t1,"MON")) hdr->EVENT.TYP[n] = 0; else if (!strcmp(t1,"TXT")) FreeTextEvent(hdr, n, t4); else FreeTextEvent(hdr, n, t1); if (!strcmp(t2,"off")) hdr->EVENT.TYP[n] |= 0x8000; //fprintf(stdout,"#%u, 0x%04x,%u | t1=<%s> = t2=<%s>, t3=<%s>, t4=<%s>\n",n,hdr->EVENT.TYP[n],hdr->EVENT.POS[n],t1,t2,t3,t4); n++; // t = strtok(NULL,"\xA\xD"); //fprintf(stdout," <%s>\n",t1); } hdr->EVENT.N = n; hdr->EVENT.SampleRate = hdr->SampleRate; // convert2to4_eventtable(hdr); } tmpstr = strrchr(fn,FILESEP); tmpstr[0] = 0; tmpstr = strrchr(fn,FILESEP); f2 = "s_info"; if (tmpstr) strcpy(tmpstr+1,f2); // Flawfinder: ignore else strcpy(fn,f2); // Flawfinder: ignore fid = fopen(fn,"r"); if (fid!=NULL) { count = fread(buf,1,bufsiz-1,fid); fclose(fid); buf[count]=0; // terminating 0 character char *Lastname = NULL; char *Firstname = NULL; struct tm T; t = strtok(buf,"\xA\xD"); t = strtok(NULL,"\xA\xD"); // skip line 1 while (t!=NULL) { char *t1 = strchr(t,'='); t1[0] = 0; while (isspace((++t1)[0])); for (k=strlen(t); (k>0) && isspace(t[--k]); t[k]=0); for (k=strlen(t1); (k>0) && isspace(t1[--k]); t1[k]=0); if (VERBOSE_LEVEL>7) fprintf(stdout,"s_info: <%s> = <%s>\n",t,t1); if (0) {} else if (!strcmp(t,"SubjId")) strncpy(hdr->Patient.Id,t1,MAX_LENGTH_PID); else if (!strcmp(t,"Gender")) switch (t1[0]) { case 'm': case 'M': hdr->Patient.Sex = 1; break; case 'w': case 'W': case 'f': case 'F': hdr->Patient.Sex = 2; break; default: hdr->Patient.Sex = 0; break; } else if (!strcmp(t,"Handedness")) switch (t1[0]) { case 'r': case 'R': hdr->Patient.Handedness = 1; break; case 'l': case 'L': hdr->Patient.Handedness = 2; break; default: hdr->Patient.Handedness = 0; break; } else if (!strcmp(t,"Size")) hdr->Patient.Height = atof(t1); else if (!strcmp(t,"Weight")) hdr->Patient.Weight = atof(t1); else if (!strcmp(t,"FirstName")) { Firstname = t1; } else if (!strcmp(t,"LastName")) { Lastname = t1; } else if (!strcmp(t,"BirthDay")) { int c = sscanf(t1,"%02d.%02d.%04d",&T.tm_mday,&T.tm_mon,&T.tm_year); T.tm_year -=1900; T.tm_mon -=1; T.tm_hour =12; T.tm_min =0; T.tm_sec =0; if (c > 2) hdr->Patient.Birthday = tm_time2gdf_time(&T); } t = strtok(NULL,"\xA\xD"); } size_t l0 = strlen(Firstname); size_t l1 = strlen(Lastname); if (l0+l1+1 <= MAX_LENGTH_NAME) { strcpy(hdr->Patient.Name, Firstname); // Flawfinder: ignore hdr->Patient.Name[l0] = ' '; strcpy(hdr->Patient.Name + l0 + 1, Lastname); // Flawfinder: ignore } else strncpy(hdr->Patient.Name, Lastname, MAX_LENGTH_NAME+1); // Flawfinder: ignore } strcpy(fn,hdr->FileName); // Flawfinder: ignore tmpstr = strrchr(fn,FILESEP); f2 = "rawdata"; if (tmpstr) strcpy(tmpstr+1,f2); // Flawfinder: ignore else strcpy(fn,f2); // Flawfinder: ignore if (VERBOSE_LEVEL>7) fprintf(stdout,"rawdata11: %s \n",f2); hdr->FileName = fn; ifopen(hdr,"r"); if (VERBOSE_LEVEL>7) fprintf(stdout,"rawdata22: %s open=%i\n",f2,hdr->FILE.OPEN); if (hdr->FILE.OPEN) { int16_t a[3]; ifread(a, 2, 3, hdr); hdr->VERSION = a[0]; hdr->HeadLen = 6; switch (a[2]) { case 12: gdftyp = 255+12; break; case 16: gdftyp = 3; break; case 32: gdftyp = 5; break; } for (k=a[1]; kNS; k++) hdr->CHANNEL[k].OnOff = 0; for (k=0; kNS; k++) { hdr->CHANNEL[k].GDFTYP = gdftyp; } hdr->AS.bpb = (GDFTYP_BITS[gdftyp]*a[1])>>3; hdr->FILE.POS = 0; size_t len = (GDFTYP_BITS[gdftyp]*a[1]*hdr->NRec*hdr->SPR)>>3; if ((GDFTYP_BITS[gdftyp]*a[1]) & 0x07) { /* hack: if SPR*NS*bits are not a multiple of bytes, hdr->AS.bpb would be non-integer causing some problems in SREAD reading the correct number of bytes. This hack makes sure that all data is loaded. */ len++; } hdr->AS.rawdata = (uint8_t*) realloc(hdr->AS.rawdata, len); size_t count = ifread(hdr->AS.rawdata,1,len,hdr); hdr->AS.first = 0; hdr->AS.length = (count<<3)/(GDFTYP_BITS[gdftyp]*a[1]); } if (VERBOSE_LEVEL>7) fprintf(stdout,"rawdata55: %s c=%i [%i, %i] sizeof(CHAN)=%i\n",fn,(int)count,(int)hdr->AS.first,(int)hdr->AS.length,(int)sizeof(hdr->CHANNEL[0])); free(fn); hdr->FileName = FileName; } stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/sopen_abf_read.c0000664000175000017500000013261613240263033021236 00000000000000/* $Id: sopen_abf_read.c,v 1.2 2009-02-12 16:15:17 schloegl Exp $ Copyright (C) 2012,2013,2014,2015 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include "../biosig-dev.h" #define ABFLONG int32_t #include "axon_structs.h" // ABF2 #include "abfheadr.h" // ABF1 #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) /* read data block of ATF file into the cache also HDR.NRec is defined here */ #if defined(WITH_ATF) EXTERN_C void sopen_atf_read(HDRTYPE* hdr) { ifseek(hdr,0,SEEK_SET); size_t ll; char *line = NULL; ssize_t nc; typeof (hdr->NS) k; // first line - skip: contains "ATF\t1.0" or alike nc = getline(&line, &ll, hdr->FILE.FID); if (VERBOSE_LEVEL>7) fprintf(stdout,"ATF line <%s>\n",line); // 2nd line: number of rows and colums if (line!=NULL) { free(line); line=NULL; } // allocate line buffer as needed nc = getline(&line, &ll, hdr->FILE.FID); char *str = line; hdr->NRec = strtoul(str,&str,10); hdr->SPR = 1; hdr->NS = strtoul(str,&str,10); hdr->SampleRate = 1.0; hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); if (VERBOSE_LEVEL>7) fprintf(stdout,"ATF line <%s>\n",line); // 3rd line: channel label if (line!=NULL) { free(line); line=NULL; } // allocate line buffer as needed nc = getline(&line, &ll, hdr->FILE.FID); if (VERBOSE_LEVEL>7) fprintf(stdout,"ATF line <%s>\n",line); typeof(hdr->NS) TIMECHANNEL = 0; /* TODO: distinguish between ATF files with single channel and multiple sections and and ATF files with single section and multiple channels */ int flag_sections_only=1; str = strtok(line,"\t\n\r"); for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; //init_channel(hc); hc->GDFTYP = 17; // float64 hc->PhysMin = -1e9; hc->PhysMax = +1e9; hc->DigMin = -1e9; hc->DigMax = +1e9; hc->Cal = 1.0; hc->Off = 0.0; //hc->Label[0] = '\0'; hc->OnOff = 1; hc->LeadIdCode = 0; hc->Transducer[0] = '\0'; hc->PhysDimCode = 0; #ifdef MAX_LENGTH_PHYSDIM hc->PhysDim[0] = '?'; #endif hc->TOffset = 0.0; hc->HighPass = NAN; hc->LowPass = NAN; hc->Notch = NAN; hc->XYZ[0] = 0; hc->XYZ[1] = 0; hc->XYZ[2] = 0; hc->Impedance = NAN; hc->bufptr = NULL; hc->SPR = 1; hc->bi8 = k * GDFTYP_BITS[hc->GDFTYP]; hc->bi = hc->bi8 / 8; hdr->AS.bpb += GDFTYP_BITS[hc->GDFTYP]/8; if (str != NULL) { size_t len = strlen(str); strncpy(hc->Label, str+1, len-2); // do not copy quotes if (strncmp(hc->Label,"Section",7)) flag_sections_only=0; // extract physical units enclosed in parenthesis "Label (units)" str = strchr(str+1,'('); if (str != NULL) { char *str2 = strchr(str,')'); if (str2 != NULL) { *str2 = 0; hc->PhysDimCode = PhysDimCode(str+1); } } if (!strncasecmp(hc->Label,"time",4)) { TIMECHANNEL = k+1; hc->OnOff = 0; // mark channel as containing the time axis if (k==0) hdr->SampleRate /= PhysDimScale(hc->PhysDimCode); } } // extract next label str = strtok(NULL,"\t\n\r"); if (VERBOSE_LEVEL>7) fprintf(stdout,"ATF label #%i:<%s>\n",(int)k,hc->Label); } hdr->HeadLen = iftell(hdr); // 4th line: 1st sample of time channel if (line!=NULL) { free(line); line=NULL; } // allocate line buffer as needed nc = getline(&line, &ll, hdr->FILE.FID); double t1 = strtod(line, &str); // 5th line: 2nd sample of time channel if (line!=NULL) { free(line); line=NULL; } // allocate line buffer as needed nc = getline(&line, &ll, hdr->FILE.FID); double t2 = strtod(line, &str); hdr->SampleRate /= (t2-t1); if (line!=NULL) { free(line); line=NULL; } // allocate line buffer as needed /* if ((size_t)(hdr->NRec * hdr->SPR) <= (ln+1) ) { hdr->NRec = max(1024, ln*2); hdr->AS.rawdata = realloc(hdr->AS.rawdata, hdr->NRec * hdr->SPR * hdr->AS.bpb); } TODO: this marks that no data has been read, and hdr->SampleRate, are not defined */ //biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "support for ATF files not complete"); hdr->AS.rawdata = NULL; } EXTERN_C void sread_atf(HDRTYPE* hdr) { if (VERBOSE_LEVEL>6) fprintf(stdout,"SREAD ATF [%i,%i]\n",(unsigned)hdr->NRec, (unsigned)hdr->SPR); if (hdr->AS.rawdata != NULL) return; //if (hdr->NRec * hdr->SPR > 0) hdr->AS.rawdata = malloc(hdr->NRec * hdr->SPR * hdr->AS.bpb); ifseek(hdr, hdr->HeadLen, SEEK_SET); size_t ll; char *line = NULL; if (VERBOSE_LEVEL>6) fprintf(stdout,"SREAD ATF\n"); size_t ln = 0; while (~ifeof(hdr)) { if (line!=NULL) { free(line); line=NULL; } // allocate line buffer as needed ssize_t nc = getline(&line, &ll, hdr->FILE.FID); if (nc < 0) break; if (VERBOSE_LEVEL>8) fprintf(stdout,"SREAD ATF 2 %i\t<%s>\n",(unsigned)ln,line ); if ((hdr->NRec * hdr->SPR) <= (long)(ln+1) ) { hdr->NRec = max(1024, ln*2); hdr->AS.rawdata = realloc(hdr->AS.rawdata, hdr->NRec * hdr->SPR * hdr->AS.bpb); } if (VERBOSE_LEVEL>8) fprintf(stdout,"SREAD ATF 4 %i\t<%s>\n",(unsigned)ln,line ); char *str = strtok(line,"\t"); typeof(hdr->NS) k; for (k = 0; k < hdr->NS; k++) { *(double*)(hdr->AS.rawdata + ln*hdr->AS.bpb + hdr->CHANNEL[k].bi) = strtod(str, &str); // extract next value //str = strtok(NULL,"\t"); } if (VERBOSE_LEVEL>8) fprintf(stdout,"SREAD ATF 6 %i\t<%s>\n",(unsigned)ln,line ); ln++; } free(line); ifclose(hdr); hdr->NRec = ln; hdr->AS.first = 0; hdr->AS.length = hdr->NRec; } #endif EXTERN_C void sopen_abf_read(HDRTYPE* hdr) { /* this function will be called by the function SOPEN in "biosig.c" Input: char* Header // contains the file content Output: HDRTYPE *hdr // defines the HDR structure accoring to "biosig.h" */ if (VERBOSE_LEVEL>7) fprintf(stdout,"sopen_abf_read 101\n"); if (VERBOSE_LEVEL>7) fprintf(stderr,"%s (line %i) %"PRIiPTR" %i %i %"PRIiPTR"\n",__FILE__,__LINE__, sizeof(struct ABFFileHeader),ABF_OLDHEADERSIZE, ABF_HEADERSIZE, offsetof(struct ABFFileHeader, lHeaderSize)); if (VERBOSE_LEVEL>7) fprintf(stderr,"%s (line %i) %i %"PRIiPTR" %i\n",__FILE__,__LINE__, ABF_BLOCKSIZE, offsetof(struct ABFFileHeader, lDataSectionPtr), ABF_BLOCKSIZE*lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lDataSectionPtr)) ); size_t count = hdr->HeadLen; hdr->VERSION = lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fFileVersionNumber)); hdr->HeadLen = ABF_BLOCKSIZE * lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lDataSectionPtr)); if (count < hdr->HeadLen) { hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header, hdr->HeadLen); count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); } if ( count < (hdr->VERSION < 1.6 ? ABF_OLDHEADERSIZE : ABF_HEADERSIZE) || count < hdr->HeadLen ) { biosigERROR(hdr, B4C_INCOMPLETE_FILE, "Reading ABF Header block failed"); return; } hdr->HeadLen = count; { struct tm t; uint32_t u = leu32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lFileStartDate)); t.tm_year = u / 10000 - 1900; t.tm_mon = (u % 10000)/100 - 1; t.tm_mday = (u % 100); u = leu32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lFileStartTime)); t.tm_hour = u / 3600; t.tm_min = (u % 3600)/60; t.tm_sec = (u % 60); //u = leu16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nFileStartMillisecs)); hdr->T0 = tm_time2gdf_time(&t); } uint16_t gdftyp = 3; switch (lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDataFormat))) { case 0: gdftyp = 3; break; case 1: gdftyp = 16; break; } if (VERBOSE_LEVEL>7) fprintf(stderr,"%s (line %i)\n",__FILE__,__LINE__); size_t slen; slen = min(MAX_LENGTH_MANUF, sizeof(((struct ABFFileHeader*)(hdr->AS.Header))->sCreatorInfo)); slen = min(MAX_LENGTH_MANUF, ABF_CREATORINFOLEN); strncpy(hdr->ID.Manufacturer._field, (char*)hdr->AS.Header + offsetof(struct ABFFileHeader, sCreatorInfo), slen); hdr->ID.Manufacturer._field[slen] = 0; hdr->ID.Manufacturer.Name = hdr->ID.Manufacturer._field; if (hdr->Version > 1.5) { slen = min(MAX_LENGTH_RID, sizeof(((struct ABFFileHeader*)(hdr->AS.Header))->sFileComment)); strncpy(hdr->ID.Recording,(char*)hdr->AS.Header + offsetof(struct ABFFileHeader, sFileComment), slen); hdr->ID.Recording[slen] = 0; } if (VERBOSE_LEVEL>7) { fprintf(stdout,"sCreatorInfo:\t%s\n",hdr->AS.Header + offsetof(struct ABFFileHeader, sCreatorInfo)); fprintf(stdout,"_sFileComment:\t%s\n",hdr->AS.Header + offsetof(struct ABFFileHeader, _sFileComment)); if (hdr->Version > 1.5) fprintf(stdout,"sFileComment:\t%s\n",hdr->AS.Header + offsetof(struct ABFFileHeader, sFileComment)); fprintf(stdout,"\nlHeaderSize:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lHeaderSize))); fprintf(stdout,"lTagSectionPtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lTagSectionPtr))); fprintf(stdout,"lNumTagEntries:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lNumTagEntries))); fprintf(stdout,"lVoiceTagPtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lVoiceTagPtr))); fprintf(stdout,"lVoiceTagEntries:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lVoiceTagEntries))); fprintf(stdout,"lSynchArrayPtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lSynchArrayPtr))); fprintf(stdout,"lSynchArraySize:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lSynchArraySize))); fprintf(stdout,"\nlDataSectionPtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lDataSectionPtr))); fprintf(stdout,"lScopeConfigPtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lScopeConfigPtr))); fprintf(stdout,"lNumScopes:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lNumScopes))); fprintf(stdout,"_lDACFilePtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, _lDACFilePtr))); fprintf(stdout,"_lDACFileNumEpisodes:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, _lDACFileNumEpisodes))); fprintf(stdout,"lDeltaArrayPtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lDeltaArrayPtr))); fprintf(stdout,"lNumDeltas:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lNumDeltas))); fprintf(stdout,"nDataFormat:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDataFormat))); fprintf(stdout,"nSimultaneousScan:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nSimultaneousScan))); fprintf(stdout,"lStatisticsConfigPtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lStatisticsConfigPtr))); fprintf(stdout,"lAnnotationSectionPtr:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lAnnotationSectionPtr))); fprintf(stdout,"lNumAnnotations:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lNumAnnotations))); fprintf(stdout,"\nlNumSamplesPerEpisode:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lNumSamplesPerEpisode))); fprintf(stdout,"lPreTriggerSamples:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lPreTriggerSamples))); fprintf(stdout,"lEpisodesPerRun:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lEpisodesPerRun))); fprintf(stdout,"lActualAcqLength:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lActualAcqLength))); fprintf(stdout,"lActualEpisodes:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lActualEpisodes))); fprintf(stdout,"lRunsPerTrial:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lRunsPerTrial))); fprintf(stdout,"lNumberOfTrials:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lNumberOfTrials))); fprintf(stdout,"fADCRange:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCRange))); fprintf(stdout,"fDACRange:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fDACRange))); fprintf(stdout,"lADCResolution:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lADCResolution))); fprintf(stdout,"lDACResolution:\t%i\n",lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lDACResolution))); fprintf(stdout,"\nchannel_count_acquired:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, channel_count_acquired))); fprintf(stdout,"nADCNumChannels:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCNumChannels))); fprintf(stdout,"fADCSampleInterval:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCSampleInterval))); fprintf(stdout,"nDigitalDACChannel:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDigitalDACChannel))); fprintf(stdout,"nOperationMode:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nOperationMode))); fprintf(stdout,"nDigitalEnable:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDigitalEnable))); fprintf(stdout,"\nfFileVersionNumber:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fFileVersionNumber))); fprintf(stdout,"fHeaderVersionNumber:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fHeaderVersionNumber))); fprintf(stdout,"fADCSampleInterval:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCSampleInterval))); fprintf(stdout,"fADCSecondSampleInterval:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCSecondSampleInterval))); fprintf(stdout,"fSynchTimeUnit:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSynchTimeUnit))); fprintf(stdout,"fSecondsPerRun:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSecondsPerRun))); fprintf(stdout,"fTriggerThreshold:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fTriggerThreshold))); fprintf(stdout,"\nfScopeOutputInterval:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fScopeOutputInterval))); fprintf(stdout,"fEpisodeStartToStart:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fEpisodeStartToStart))); fprintf(stdout,"fRunStartToStart:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fRunStartToStart))); fprintf(stdout,"fTrialStartToStart:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fTrialStartToStart))); fprintf(stdout,"fStatisticsPeriod:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fStatisticsPeriod))); fprintf(stdout,"fADCRange:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCRange))); fprintf(stdout,"fDACRange:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fTriggerThreshold))); fprintf(stdout,"fTriggerThreshold:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fDACRange))); fprintf(stdout,"dFileDuration:\t%g\n",lef64p(hdr->AS.Header + offsetof(struct ABFFileHeader, dFileDuration))); fprintf(stdout,"fTriggerThreshold:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fTriggerThreshold))); } if (VERBOSE_LEVEL>7) fprintf(stdout,"sopen_abf_read 201\n"); if (VERBOSE_LEVEL>7) fprintf(stderr,"%s (line %i)\n",__FILE__,__LINE__); hdr->NS = lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCNumChannels)); if (lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDigitalEnable))) hdr->NS += lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDigitalDACChannel)); hdr->SampleRate = 1e6 / (hdr->NS * lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCSampleInterval))); hdr->NRec = lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lActualAcqLength)) / lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCNumChannels)); hdr->SPR = 1; hdr->AS.bpb = hdr->NS*GDFTYP_BITS[gdftyp]/8; hdr->CHANNEL = realloc(hdr->CHANNEL, hdr->NS*sizeof(CHANNEL_TYPE)); uint32_t k1=0,k; // ABF is 32 bits only, no need for more for (k=0; k < ABF_ADCCOUNT + ABF_DACCOUNT; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k1; if ((k < ABF_ADCCOUNT) && (lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCSamplingSeq) + 2 * k) >= 0)) { hc->OnOff = 1; hc->bufptr = NULL; hc->LeadIdCode = 0; int ll = min(ABF_ADCNAMELEN, MAX_LENGTH_LABEL); strncpy(hc->Label, (char*)hdr->AS.Header + offsetof(struct ABFFileHeader, sADCChannelName) + k*ABF_ADCNAMELEN, ll); while (ll > 0 && isspace(hc->Label[--ll])); hc->Label[ll+1] = 0; char units[ABF_ADCUNITLEN+1]; { memcpy(units, (char*)hdr->AS.Header + offsetof(struct ABFFileHeader, sADCUnits) + k*ABF_ADCUNITLEN, ABF_ADCUNITLEN); units[ABF_ADCUNITLEN] = 0; int p=ABF_ADCUNITLEN; while ( (0PhysDimCode = PhysDimCode(units); } hc->Transducer[0] = '\0'; hc->LowPass = lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalLowpassFilter) + 4 * k); hc->HighPass = lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalHighpassFilter) + 4 * k); hc->Notch = NAN; hc->TOffset = NAN; hc->XYZ[0] = 0; hc->XYZ[1] = 0; hc->XYZ[2] = 0; hc->GDFTYP = gdftyp; hc->SPR = hdr->SPR; hc->bi = k1*GDFTYP_BITS[gdftyp]/8; hc->bi8 = k1*GDFTYP_BITS[gdftyp]; double PhysMax = lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCRange)); double DigMax = (double)lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lADCResolution)); double fTotalScaleFactor = lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fInstrumentScaleFactor) + 4 * k) * lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCProgrammableGain) + 4 * k); hc->Off = -lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fInstrumentOffset) + 4 * k); if (lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nSignalType) + 2 * k) != 0) { hc->Off -= lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fInstrumentOffset) + 4 * k); fTotalScaleFactor *= lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalGain) + 4 * k); } if (hdr->Version > 1.5 && lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nTelegraphEnable) + 2 * k) != 0) { fTotalScaleFactor *= lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fTelegraphAdditGain) + 4 * k); } hc->Cal = PhysMax / (fTotalScaleFactor * DigMax); hc->DigMax = DigMax-1.0; hc->DigMin = -hc->DigMax; hc->PhysMax = hc->DigMax * hc->Cal; hc->PhysMin = hc->DigMin * hc->Cal; if (VERBOSE_LEVEL>7) { fprintf(stdout,"==== CHANNEL %i [%s] ====\n",k,units); fprintf(stdout,"nSignalType:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nSignalType) + 2 * k)); fprintf(stdout,"nADCPtoLChannelMap:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCPtoLChannelMap) + 2 * k)); fprintf(stdout,"nADCSamplingSeq:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCSamplingSeq) + 2 * k)); fprintf(stdout,"fADCProgrammableGain:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCProgrammableGain) + 4 * k)); fprintf(stdout,"fADCRange:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCRange) + 4 * k)); fprintf(stdout,"fADCDisplayAmplification:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCDisplayAmplification) + 4 * k)); fprintf(stdout,"fADCDisplayOffset:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCDisplayOffset) + 4 * k)); fprintf(stdout,"fInstrumentScaleFactor:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fInstrumentScaleFactor) + 4 * k)); fprintf(stdout,"fInstrumentOffset:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fInstrumentOffset) + 4 * k)); fprintf(stdout,"fSignalGain:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalGain) + 4 * k)); fprintf(stdout,"fSignalOffset:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalOffset) + 4 * k)); fprintf(stdout,"fSignalLowpassFilter:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalLowpassFilter) + 4 * k)); fprintf(stdout,"fSignalHighpassFilter:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalHighpassFilter) + 4 * k)); if (hdr->Version > 1.5) fprintf(stdout,"fTelegraphAdditGain:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fTelegraphAdditGain) + 4 * k)); } k1++; } else if (k < ABF_ADCCOUNT) { // do not increase k1; if (VERBOSE_LEVEL>7) { fprintf(stdout,"==== CHANNEL %i ====\n",k); fprintf(stdout,"nADCPtoLChannelMap:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCPtoLChannelMap) + 2 * k)); fprintf(stdout,"nADCSamplingSeq:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCSamplingSeq) + 2 * k)); fprintf(stdout,"fADCProgrammableGain:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCProgrammableGain) + 4 * k)); fprintf(stdout,"fADCDisplayAmplification:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCDisplayAmplification) + 4 * k)); fprintf(stdout,"fADCDisplayOffset:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCDisplayOffset) + 4 * k)); fprintf(stdout,"fInstrumentScaleFactor:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fInstrumentScaleFactor) + 4 * k)); fprintf(stdout,"fInstrumentOffset:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fInstrumentOffset) + 4 * k)); fprintf(stdout,"fSignalGain:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalGain) + 4 * k)); fprintf(stdout,"fSignalOffset:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalOffset) + 4 * k)); fprintf(stdout,"fSignalLowpassFilter:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalLowpassFilter) + 4 * k)); fprintf(stdout,"fSignalHighpassFilter:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fSignalHighpassFilter) + 4 * k)); } } else if ( (k1 < ABF_ADCCOUNT+ABF_DACCOUNT) && (k < hdr->NS) ) { hc->OnOff = 1; hc->bufptr = NULL; hc->LeadIdCode = 0; strncpy(hc->Label, (char*)hdr->AS.Header + offsetof(struct ABFFileHeader, sDACChannelName) + (k-ABF_ADCCOUNT)*ABF_DACNAMELEN, min(ABF_DACNAMELEN,MAX_LENGTH_LABEL)); hc->Label[ABF_DACNAMELEN] = 0; char units[ABF_DACUNITLEN+1]; { memcpy(units, hdr->AS.Header + offsetof(struct ABFFileHeader, sDACChannelUnits) + (k-ABF_ADCCOUNT)*ABF_DACUNITLEN, ABF_DACUNITLEN); units[ABF_DACUNITLEN] = 0; int p=ABF_ADCUNITLEN; while ( (0PhysDimCode = PhysDimCode(units); } hc->Transducer[0] = '\0'; hc->HighPass = NAN; hc->LowPass = NAN; hc->Notch = NAN; hc->TOffset = NAN; hc->XYZ[0] = 0; hc->XYZ[1] = 0; hc->XYZ[2] = 0; hc->GDFTYP = gdftyp; hc->SPR = hdr->SPR; hc->bi = k1*GDFTYP_BITS[gdftyp]/8; hc->bi8 = k1*GDFTYP_BITS[gdftyp]; double PhysMax = lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fDACRange)); double DigMax = (double)lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lDACResolution)); hc->Cal = PhysMax/DigMax; hc->Off = 0.0; hc->PhysMax = PhysMax * (DigMax-1.0) / DigMax; hc->PhysMin = -hc->PhysMax; hc->DigMax = DigMax-1; hc->DigMin = -hc->DigMax; if (VERBOSE_LEVEL>7) { fprintf(stdout,"==== CHANNEL %i [%s] ====\nfDACScaleFactor:\t%f\n",k,units, lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fDACScaleFactor) + 4 * (k-ABF_ADCCOUNT))); fprintf(stdout,"fDACHoldingLevel:\t%f\n",lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fDACHoldingLevel) + 4 * (k-ABF_ADCCOUNT))); } k1++; } } /* ===== EVENT TABLE ===== */ uint32_t n1,n2; n1 = lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lActualEpisodes)) - 1; n2 = lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lNumTagEntries)); hdr->EVENT.N = n1+n2; /* add breaks between sweeps */ size_t spr = lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lNumSamplesPerEpisode))/hdr->NS; hdr->EVENT.SampleRate = hdr->SampleRate; hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, hdr->EVENT.N * sizeof(*hdr->EVENT.POS)); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, hdr->EVENT.N * sizeof(*hdr->EVENT.TYP)); for (k=0; k < n1; k++) { hdr->EVENT.TYP[k] = 0x7ffe; hdr->EVENT.POS[k] = (k+1)*spr; } /* add tags */ hdr->AS.auxBUF = realloc(hdr->AS.auxBUF, n2 * sizeof(struct ABFTag)); ifseek(hdr, lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lTagSectionPtr))*ABF_BLOCKSIZE, SEEK_SET); count = ifread(hdr->AS.auxBUF, sizeof(struct ABFTag), n2, hdr); if (count>255) { count = 255; fprintf(stderr,"Warning ABF: more than 255 tags cannot be read"); } hdr->EVENT.N = n1+count; for (k=0; k < count; k++) { uint8_t *abftag = hdr->AS.auxBUF + k * sizeof(struct ABFTag); hdr->EVENT.POS[k+n1] = leu32p(abftag)/hdr->NS; abftag[ABF_TAGCOMMENTLEN+4-1]=0; FreeTextEvent(hdr, k+n1, (char*)(abftag+4)); } // set HeadLen to begin of data block hdr->HeadLen = ABF_BLOCKSIZE * lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lDataSectionPtr)); ifseek(hdr, hdr->HeadLen, SEEK_SET); } // end of sopen_abf_read size_t readABF2block(uint8_t *block, HDRTYPE *hdr, struct ABF_Section *S) { S->uBlockIndex = leu32p(block + offsetof(struct ABF_Section, uBlockIndex)); if (S->uBlockIndex==0) return 0; S->uBytes = leu32p(block + offsetof(struct ABF_Section, uBytes)); if (S->uBytes==0) return 0; S->llNumEntries = leu64p(block + offsetof(struct ABF_Section, llNumEntries)); hdr->AS.auxBUF = realloc(hdr->AS.auxBUF, S->llNumEntries*S->uBytes); ifseek(hdr, S->uBlockIndex*(size_t)512, SEEK_SET); return ifread(hdr->AS.auxBUF, 1, S->llNumEntries*S->uBytes, hdr); } EXTERN_C void sopen_abf2_read(HDRTYPE* hdr) { /* this function will be called by the function SOPEN in "biosig.c" Input: char* Header // contains the file content Output: HDRTYPE *hdr // defines the HDR structure accoring to "biosig.h" */ if (VERBOSE_LEVEL>7) fprintf(stdout,"sopen_abf2_read 101\n"); // biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "ABF2 format currently not supported"); return; fprintf(stdout,"Warning ABF2 v%4.2f: implementation is not complete!\n", hdr->VERSION); if (hdr->HeadLen < 512) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, 512); hdr->HeadLen += ifread(hdr->AS.Header+hdr->HeadLen, 1, 512-hdr->HeadLen, hdr); } { struct tm t; uint32_t u = leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uFileStartDate)); t.tm_year = u / 10000 - 1900; t.tm_mon = (u % 10000)/100 - 1; t.tm_mday = (u % 100); u = leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uFileStartTimeMS))/1000; t.tm_hour = u / 3600; t.tm_min = (u % 3600)/60; t.tm_sec = (u % 60); //u = leu16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nFileStartMillisecs)); hdr->T0 = tm_time2gdf_time(&t); } hdr->SPR = 1; uint16_t gdftyp = 3; switch (lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDataFormat))) { case 0: gdftyp = 3; break; case 1: gdftyp = 16; break; } if (VERBOSE_LEVEL>7) { fprintf(stdout,"\nuFileInfoSize:\t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uFileInfoSize))); fprintf(stdout,"uActualEpisodes:\t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uActualEpisodes))); fprintf(stdout,"uFileStartDate:\t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uFileStartDate))); fprintf(stdout,"uFileStartTimeMS:\t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uFileStartTimeMS))); fprintf(stdout,"uStopwatchTime:\t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uStopwatchTime))); fprintf(stdout,"nFileType:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABF_FileInfo, nFileType))); fprintf(stdout,"nDataFormat:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABF_FileInfo, nDataFormat))); fprintf(stdout,"nSimultaneousScan:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABF_FileInfo, nSimultaneousScan))); fprintf(stdout,"nCRCEnable:\t%i\n",lei16p(hdr->AS.Header + offsetof(struct ABF_FileInfo, nCRCEnable))); fprintf(stdout,"uFileCRC: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uFileCRC))); fprintf(stdout,"uCreatorVersion: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uCreatorVersion))); fprintf(stdout,"uCreatorNameIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uCreatorNameIndex))); fprintf(stdout,"uModifierVersion: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uModifierVersion))); fprintf(stdout,"uModifierNameIndex:\t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uModifierNameIndex))); fprintf(stdout,"uProtocolPathIndex:\t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, uProtocolPathIndex))); fprintf(stdout,"ProtocolSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ProtocolSection.uBlockIndex))); fprintf(stdout,"ProtocolSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ProtocolSection.uBytes))); fprintf(stdout,"ProtocolSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ProtocolSection.llNumEntries))); fprintf(stdout,"ADCSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ADCSection.uBlockIndex))); fprintf(stdout,"ADCSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ADCSection.uBytes))); fprintf(stdout,"ADCSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ADCSection.llNumEntries))); fprintf(stdout,"DACSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DACSection.uBlockIndex))); fprintf(stdout,"DACSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DACSection.uBytes))); fprintf(stdout,"DACSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DACSection.llNumEntries))); fprintf(stdout,"EpochSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, EpochSection.uBlockIndex))); fprintf(stdout,"EpochSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, EpochSection.uBytes))); fprintf(stdout,"EpochSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, EpochSection.llNumEntries))); fprintf(stdout,"ADCPerDACSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ADCPerDACSection.uBlockIndex))); fprintf(stdout,"ADCPerDACSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ADCPerDACSection.uBytes))); fprintf(stdout,"ADCPerDACSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ADCPerDACSection.llNumEntries))); fprintf(stdout,"EpochPerDACSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, EpochPerDACSection.uBlockIndex))); fprintf(stdout,"EpochPerDACSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, EpochPerDACSection.uBytes))); fprintf(stdout,"EpochPerDACSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, EpochPerDACSection.llNumEntries))); fprintf(stdout,"UserListSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, UserListSection.uBlockIndex))); fprintf(stdout,"UserListSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, UserListSection.uBytes))); fprintf(stdout,"UserListSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, UserListSection.llNumEntries))); fprintf(stdout,"StatsRegionSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StatsRegionSection.uBlockIndex))); fprintf(stdout,"StatsRegionSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StatsRegionSection.uBytes))); fprintf(stdout,"StatsRegionSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StatsRegionSection.llNumEntries))); fprintf(stdout,"MathSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, MathSection.uBlockIndex))); fprintf(stdout,"MathSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, MathSection.uBytes))); fprintf(stdout,"MathSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, MathSection.llNumEntries))); fprintf(stdout,"StringsSection.uBlockIndex:\t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StringsSection.uBlockIndex))); fprintf(stdout,"StringsSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StringsSection.uBytes))); fprintf(stdout,"StringsSection.llNumEntries:\t%i\n",(int)lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StringsSection.llNumEntries))); fprintf(stdout,"DataSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DataSection.uBlockIndex))); fprintf(stdout,"DataSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DataSection.uBytes))); fprintf(stdout,"DataSection.llNumEntries:\t%"PRIi64"\n",lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DataSection.llNumEntries))); fprintf(stdout,"TagSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, TagSection.uBlockIndex))); fprintf(stdout,"TagSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, TagSection.uBytes))); fprintf(stdout,"TagSection.llNumEntries: \t%"PRIi64"\n",lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, TagSection.llNumEntries))); fprintf(stdout,"ScopeSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ScopeSection.uBlockIndex))); fprintf(stdout,"ScopeSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ScopeSection.uBytes))); fprintf(stdout,"ScopeSection.llNumEntries:\t%"PRIi64"\n",lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, ScopeSection.llNumEntries))); fprintf(stdout,"DeltaSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DeltaSection.uBlockIndex))); fprintf(stdout,"DeltaSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DeltaSection.uBytes))); fprintf(stdout,"DeltaSection.llNumEntries:\t%"PRIi64"\n",lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DeltaSection.llNumEntries))); fprintf(stdout,"VoiceTagSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, VoiceTagSection.uBlockIndex))); fprintf(stdout,"VoiceTagSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, VoiceTagSection.uBytes))); fprintf(stdout,"VoiceTagSection.llNumEntries:\t%"PRIi64"\n",lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, VoiceTagSection.llNumEntries))); fprintf(stdout,"SynchArraySection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, SynchArraySection.uBlockIndex))); fprintf(stdout,"SynchArraySection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, SynchArraySection.uBytes))); fprintf(stdout,"SynchArraySection.llNumEntries:\t%"PRIi64"\n",lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, SynchArraySection.llNumEntries))); fprintf(stdout,"AnnotationSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, AnnotationSection.uBlockIndex))); fprintf(stdout,"AnnotationSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, AnnotationSection.uBytes))); fprintf(stdout,"AnnotationSection.llNumEntries:\t%"PRIi64"\n",lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, AnnotationSection.llNumEntries))); fprintf(stdout,"StatsSection.uBlockIndex: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StatsSection.uBlockIndex))); fprintf(stdout,"StatsSection.uBytes: \t%i\n",leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StatsSection.uBytes))); fprintf(stdout,"StatsSection.llNumEntries:\t%"PRIi64"\n",lei64p(hdr->AS.Header + offsetof(struct ABF_FileInfo, StatsSection.llNumEntries))); } struct ABF_Section S; readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, ProtocolSection), hdr, &S); float fADCRange = lef32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, fADCRange)); float fDACRange = lef32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, fDACRange)); int32_t lADCResolution = lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lADCResolution)); int32_t lDACResolution = lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lDACResolution)); hdr->SampleRate = 1e6 / lef32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, fADCSequenceInterval)); if (VERBOSE_LEVEL>7) { fprintf(stdout,"nOperationMode:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nOperationMode))); fprintf(stdout,"fADCSequenceInterval:\t%g\n", lef32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, fADCSequenceInterval))); fprintf(stdout,"fSecondsPerRun:\t%g\n", lef32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, fSecondsPerRun))); fprintf(stdout,"fSecondsPerRun:\t%g\n", lef32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, fSecondsPerRun))); fprintf(stdout,"lNumSamplesPerEpisode:\t%i\n", lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lNumSamplesPerEpisode))); fprintf(stdout,"lPreTriggerSamples:\t%i\n", lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lPreTriggerSamples))); fprintf(stdout,"lEpisodesPerRun:\t%i\n", lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lEpisodesPerRun))); fprintf(stdout,"lRunsPerTrial:\t%i\n", lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lRunsPerTrial))); fprintf(stdout,"lNumberOfTrials:\t%i\n", lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lNumberOfTrials))); fprintf(stdout,"nDigitalEnable:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitalEnable))); fprintf(stdout,"nActiveDACChannel:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nActiveDACChannel))); fprintf(stdout,"nDigitalHolding:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitalHolding))); fprintf(stdout,"nDigitalInterEpisode:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitalInterEpisode))); fprintf(stdout,"nDigitalDACChannel:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitalDACChannel))); fprintf(stdout,"nDigitizerADCs:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitizerADCs))); fprintf(stdout,"nDigitizerDACs:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitizerDACs))); fprintf(stdout,"nDigitizerTotalDigitalOuts:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitizerTotalDigitalOuts))); fprintf(stdout,"nDigitizerSynchDigitalOuts:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitizerSynchDigitalOuts))); fprintf(stdout,"nDigitizerType:\t%i\n", lei16p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, nDigitizerType))); fprintf(stdout,"fADCRange:\t%f\n", lef32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, fADCRange))); fprintf(stdout,"fDACRange:\t%f\n", lef32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, fDACRange))); fprintf(stdout,"lADCResolution:\t%i\n", lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lADCResolution))); fprintf(stdout,"lDACResolution:\t%i\n", lei32p(hdr->AS.auxBUF + offsetof(struct ABF_ProtocolInfo, lDACResolution))); } readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, ADCSection), hdr, &S); hdr->NS = S.llNumEntries; hdr->CHANNEL = realloc(hdr->CHANNEL, hdr->NS*sizeof(CHANNEL_TYPE)); int k; for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->bufptr = NULL; hc->LeadIdCode = 0; hc->OnOff = 1; hc->LowPass = lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fSignalLowpassFilter)); hc->HighPass = lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fSignalHighpassFilter)); hc->GDFTYP = gdftyp; hc->SPR = hdr->SPR; hc->bi = k*GDFTYP_BITS[gdftyp] / 8; /* strncpy(hc->Label, (char*)hdr->AS.Header + offsetof(struct ABFFileHeader, sADCChannelName) + k*ABF_ADCNAMELEN, min(ABF_ADCNAMELEN,MAX_LENGTH_LABEL)); hc->Label[ABF_ADCNAMELEN] = 0; char units[ABF_ADCUNITLEN+1]; { memcpy(units, (char*)hdr->AS.Header + offsetof(struct ABFFileHeader, sADCUnits) + k*ABF_ADCUNITLEN, ABF_ADCUNITLEN); units[ABF_ADCUNITLEN] = 0; int p=ABF_ADCUNITLEN; while ( (0PhysDimCode = PhysDimCode(units); } */ double PhysMax = fADCRange; double DigMax = lADCResolution; hc->Cal = lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fInstrumentScaleFactor)) / lADCResolution; hc->Off = lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fInstrumentOffset)); hc->DigMax = lADCResolution-1.0; hc->DigMin = -hc->DigMax; hc->PhysMax = hc->DigMax * hc->Cal; hc->PhysMin = hc->DigMin * hc->Cal; if (VERBOSE_LEVEL>7) { fprintf(stdout,"nADCNum:\t%i\n", lei16p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, nADCNum))); fprintf(stdout,"nADCSamplingSeq:\t%i\n", lei16p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, nADCSamplingSeq))); fprintf(stdout,"nADCPtoLChannelMap:\t%i\n", lei16p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, nADCPtoLChannelMap))); fprintf(stdout,"fADCProgrammableGain:\t%f\n", lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fADCProgrammableGain))); fprintf(stdout,"fInstrumentScaleFactor:\t%f\n", lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fInstrumentScaleFactor))); fprintf(stdout,"fInstrumentOffset:\t%f\n", lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fInstrumentOffset))); fprintf(stdout,"fSignalGain:\t%f\n", lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fSignalGain))); fprintf(stdout,"fSignalOffset:\t%f\n", lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fSignalOffset))); fprintf(stdout,"fSignalLowpassFilter:\t%f\n", lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fSignalLowpassFilter))); fprintf(stdout,"fSignalHighpassFilter:\t%f\n", lef32p(hdr->AS.auxBUF + S.uBytes*k + offsetof(struct ABF_ADCInfo, fSignalHighpassFilter))); } } readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, DACSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, EpochSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, ADCPerDACSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, EpochPerDACSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, UserListSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, StatsRegionSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, MathSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, StringsSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, DataSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, TagSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, ScopeSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, DeltaSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, VoiceTagSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, SynchArraySection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, AnnotationSection), hdr, &S); readABF2block(hdr->AS.Header + offsetof(struct ABF_FileInfo, StatsSection), hdr, &S); /* hdr->NS = lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCNumChannels)); if (lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDigitalEnable))) hdr->NS += lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nDigitalDACChannel)); hdr->SampleRate = 1e6 / (hdr->NS * lef32p(hdr->AS.Header + offsetof(struct ABFFileHeader, fADCSampleInterval))); hdr->NRec = lei32p(hdr->AS.Header + offsetof(struct ABFFileHeader, lActualAcqLength)) / lei16p(hdr->AS.Header + offsetof(struct ABFFileHeader, nADCNumChannels)); hdr->SPR = 1; hdr->AS.bpb = hdr->NS*GDFTYP_BITS[gdftyp]/8; hdr->CHANNEL = realloc(hdr->CHANNEL, hdr->NS*sizeof(CHANNEL_TYPE)); */ // beginning of data block hdr->HeadLen = leu32p(hdr->AS.Header + offsetof(struct ABF_FileInfo, DataSection.uBlockIndex)) * 512; } stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/sopen_cfs_read.c0000664000175000017500000013113413240263033021253 00000000000000/* Copyright (C) 2010,2011,2012,2015,2016 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include "../biosig-dev.h" #define min(a,b) (((a) < (b)) ? (a) : (b)) uint16_t cfs_data_type(uint8_t dataType) { switch (dataType) { case 0: //int8 return 1; case 1: //uint8 return 3; case 2: //int16 return 3; case 3: // uint16 return 4; case 4: // int32 return 5; case 5: //float return 16; case 6: // double return 17; case 7: // char return 0; default: return 0xffff; } } /* trim_trailing_space: trims trailing whitespaces from pascal string (pstr), and the string becomes always 0-terminated. This may mean that the last string character might be deleted, if all bytes are filled with non-zero values. no memory allocation or reallication is performed, maxLength+1 is the size of the memory allocation for pstr (pstr[0] to pstr[maxLength]). maxLength specify the string length w/o count or terminating zero byte. pascal string: first byte contains lengths, followed by characters, not null-terminated */ char *trim_trailing_space(uint8_t *pstr, unsigned maxLength) { unsigned len = min(pstr[0], maxLength); while (isspace(pstr[len]) && (len>0)) { len--; } if (len==maxLength) fprintf(stdout,"Warning %s: last and %i-th character of string <%c%c%c%c...> has been deleted\n",__func__,len,pstr[1],pstr[2],pstr[3],pstr[4]); len = min(len+1,maxLength); pstr[len]=0; pstr[0]=len; return (pstr+1); } const char *Signal6_StateTable[]={ "","State 1","State 2","State 3","State 4","State 5","State 6","State 7","State 8","State 9", "State 10","State 11","State 12","State 13","State 14","State 15","State 16","State 17","State 18","State 19", "State 20","State 21","State 22","State 23","State 24","State 25","State 26","State 27","State 28","State 29", "State 30","State 31","State 32","State 33","State 34","State 35","State 36","State 37","State 38","State 39", "State 40","State 41","State 42","State 43","State 44","State 45","State 46","State 47","State 48","State 49", "State 50","State 51","State 52","State 53","State 54","State 55","State 56","State 57","State 58","State 59", "State 60","State 61","State 62","State 63","State 64","State 65","State 66","State 67","State 68","State 69", "State 70" }; EXTERN_C void sopen_cfs_read(HDRTYPE* hdr) { /* this function will be called by the function SOPEN in "biosig.c" Input: char* Header // contains the file content Output: HDRTYPE *hdr // defines the HDR structure accoring to "biosig.h" */ if (VERBOSE_LEVEL>7) fprintf(stdout,"%s:%i sopen_cfs_read started - %i bytes already loaded\n",__FILE__,__LINE__,hdr->HeadLen); #define H1LEN (8+14+4+8+8+2+2+2+2+2+4+2+2+74+4+40) size_t count = hdr->HeadLen; char flag_FPulse = 0; // indicates whether data was recorded using FPulse #define CFS_NEW // this flag allows to switch back to old version while (!ifeof(hdr)) { hdr->AS.Header = (uint8_t*) realloc(hdr->AS.Header,count*2+1); count += ifread(hdr->AS.Header+count,1,count,hdr); } hdr->AS.Header[count] = 0; hdr->FLAG.OVERFLOWDETECTION = 0; /* Implementation is based on the following reference: CFS - The CED Filing System October 2006 */ /* General Header */ // uint32_t filesize = leu32p(hdr->AS.Header+22); // unused hdr->FILE.size = leu32p(hdr->AS.Header+0x16); // file size hdr->NS = leu16p(hdr->AS.Header+0x2a); // 6 number of channels uint16_t n = leu16p(hdr->AS.Header+0x2c); // 7 number of file variables uint16_t d = leu16p(hdr->AS.Header+0x2e); // 8 number of data section variables uint16_t FileHeaderSize = leu16p(hdr->AS.Header+0x30); // 9 byte size of file header uint16_t DataHeaderSize = leu16p(hdr->AS.Header+0x32); // 10 byte size of data section header uint32_t LastDataSectionHeaderOffset = leu32p(hdr->AS.Header+0x34); // 11 last data section header offset uint16_t NumberOfDataSections = leu16p(hdr->AS.Header+0x38); // 12 last data section header offset // decode start time and date { struct tm t; char strtmp[9]; memcpy(strtmp, hdr->AS.Header+0x1a, 8); strtmp[8] = 0; // terminating null character if (VERBOSE_LEVEL>7) fprintf(stdout,"%s:%i sopen_cfs_read started [%s]\n",__FILE__,__LINE__,strtmp); t.tm_hour = atoi(strtok(strtmp,":/")); t.tm_min = atoi(strtok(NULL,":/")); t.tm_sec = atoi(strtok(NULL,":/")); memcpy(strtmp, hdr->AS.Header+0x22, 8); t.tm_mday = atoi(strtok(strtmp,"-:/")); t.tm_mon = atoi(strtok(NULL,"-:/"))-1; t.tm_year = atoi(strtok(NULL,"-:/")); if (t.tm_year<39) t.tm_year+=100; hdr->T0 = tm_time2gdf_time(&t); } if (NumberOfDataSections) { hdr->EVENT.TYP = (typeof(hdr->EVENT.TYP)) realloc(hdr->EVENT.TYP, (hdr->EVENT.N + 2*NumberOfDataSections - 1) * sizeof(*hdr->EVENT.TYP)); hdr->EVENT.POS = (typeof(hdr->EVENT.POS)) realloc(hdr->EVENT.POS, (hdr->EVENT.N + 2*NumberOfDataSections - 1) * sizeof(*hdr->EVENT.POS)); hdr->EVENT.TimeStamp = (typeof(hdr->EVENT.TimeStamp)) realloc(hdr->EVENT.TimeStamp, (hdr->EVENT.N + 2*NumberOfDataSections - 1) * sizeof(*hdr->EVENT.TimeStamp)); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) CFS - %d,%d,%d,0x%x,0x%x,0x%x,%d,0x%x\n",__FILE__,__LINE__,hdr->NS,n,d,FileHeaderSize,DataHeaderSize,LastDataSectionHeaderOffset,NumberOfDataSections,leu32p(hdr->AS.Header+0x86)); /* channel information */ hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); #define H2LEN (22+10+10+1+1+2+2) char* H2 = (char*)(hdr->AS.Header + H1LEN); double xPhysDimScale[100]; // CFS is limited to 99 channels typeof(hdr->NS) NS = hdr->NS; uint8_t k; uint32_t bpb=0; for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; /* 1 offset because CFS uses pascal type strings (first byte contains string length) in addition, the strings are \0 terminated. */ hc->OnOff = 1; hc->LeadIdCode = 0; hc->bi8 = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i) Channel #%i/%i: %i<%s>/%i<%s>\n",__FILE__,__LINE__,k+1, hdr->NS, H2[22 + k*H2LEN], H2 + 23 + k*H2LEN, H2[32 + k*H2LEN], H2 + 33 + k*H2LEN); strncpy(hc->Label, trim_trailing_space(H2 + k*H2LEN, 20), 21); // Channel name hc->PhysDimCode = PhysDimCode (trim_trailing_space(H2 + 22 + k*H2LEN,9)); // Y axis units xPhysDimScale[k] = PhysDimScale(PhysDimCode(trim_trailing_space(H2 + 32 + k*H2LEN,9))); // X axis units uint8_t dataType = H2[42 + k*H2LEN]; uint8_t dataKind = H2[43 + k*H2LEN]; //uint16_t byteSpace = leu16p(H2+44 + k*H2LEN); // stride //uint16_t next = leu16p(H2+46 + k*H2LEN); hc->GDFTYP = cfs_data_type(dataType); if (hc->GDFTYP > 580) // sizeof GDFTYP_BITS[] biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "CFS: unknown/unsupported data type !"); if (H2[43 + k * H2LEN] == 1) { // Matrix data does not return an extra channel, but contains Markers and goes into the event table. hc->OnOff = 0; NS--; } hc->bi = bpb; bpb += GDFTYP_BITS[hc->GDFTYP]>>3; // per single sample hc->Impedance = NAN; hc->TOffset = NAN; hc->LowPass = NAN; hc->HighPass = NAN; hc->Notch = NAN; hc->XYZ[0] = NAN; hc->XYZ[1] = NAN; hc->XYZ[2] = NAN; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(line %i) Channel #%i: [%s](%i/%i) <%s>/<%s> ByteSpace%i,Next#%i\n", __FILE__, __LINE__, k+1, H2 + 1 + k*H2LEN, dataType, dataKind, H2 + 23 + k*H2LEN, H2 + 33 + k*H2LEN, leu16p(H2+44+k*H2LEN), leu16p(H2+46+k*H2LEN)); } hdr->AS.bpb = bpb; size_t datapos = H1LEN + H2LEN*hdr->NS; /* file variable information : will be extracted as application specific information // n*36 bytes */ if (VERBOSE_LEVEL>7) fprintf(stdout,"\n******* file variable information (n=%i) *********\n", n); hdr->AS.bci2000= realloc(hdr->AS.bci2000, 3); hdr->AS.bci2000[0]='\0'; for (k = 0; k < n; k++) { int i=-1; double f=NAN; size_t pos = datapos + k*36; char *desc = (char*)(hdr->AS.Header+pos+1); uint16_t typ = leu16p(hdr->AS.Header+pos+22); char *unit = (char*)(hdr->AS.Header+pos+25); uint16_t off = leu16p(hdr->AS.Header+pos+34); // if (flag_FPulse && !strcmp(desc, "Spare")) continue; /* H1LEN General Header H2LEN*NS Channel Information a 48 byte n*36 File Variable information a 36 byte d*36 DS Variable information */ size_t p3 = H1LEN + H2LEN*hdr->NS + (n+d+2)*36 + off; /***** file variable k *****/ switch (typ) { case 0: case 1: i = hdr->AS.Header[p3]; break; case 2: i = lei16p(hdr->AS.Header+p3); break; case 3: i = leu16p(hdr->AS.Header+p3); break; case 4: i = lei32p(hdr->AS.Header+p3); break; case 5: f = lef32p(hdr->AS.Header+p3); break; case 6: f = lef64p(hdr->AS.Header+p3); break; } if (VERBOSE_LEVEL>8) { fprintf(stdout,"#%2i [%i:%i] <%s>",k,typ,off,desc); if (typ<1) ; else if (typ<5) fprintf(stdout,"[%d]",i); else if (typ<7) fprintf(stdout,"[%g]",f); else if (typ==7) fprintf(stdout,"[%s]",hdr->AS.Header+p3+1); fprintf(stdout,"[%s]\n",unit); } else if (VERBOSE_LEVEL>7) { if (typ==7) fprintf(stdout,"#%2i [%i:] <%s> <%s> <%s>\n",k,typ,desc, hdr->AS.Header+p3+1,unit); } if ((typ==7) && !strncmp(desc,"Script",6)) { char *scriptline=(char*)hdr->AS.Header+p3+1; if (!strncmp(desc,"ScriptBlock",11)) { // only the script block is extracted assert(hdr->AS.Header[p3]==strlen(scriptline)); assert(hdr->AS.Header[p3+1+hdr->AS.Header[p3]]==0); // replace '\r' with '\n' in scriptline while (*scriptline) { switch (*scriptline) { case '\r': *scriptline='\n'; } scriptline++; } scriptline=(char*)hdr->AS.Header+p3+1; hdr->AS.bci2000=realloc(hdr->AS.bci2000, strlen(hdr->AS.bci2000) + strlen(scriptline) + 1); strcat(hdr->AS.bci2000, scriptline); // Flawfinder: ignore } else if (!strncmp(desc,"Scriptline",10)) { hdr->AS.bci2000=realloc(hdr->AS.bci2000, strlen(hdr->AS.bci2000) + strlen(scriptline) + 3); strcat(hdr->AS.bci2000, scriptline); // Flawfinder: ignore strcat(hdr->AS.bci2000, "\n"); // Flawfinder: ignore } } if (k==0) { // File variable zero flag_FPulse = !strcmp(unit,"FPulse"); if (typ==2) hdr->VERSION = i/100.0; else fprintf(stderr,"Warning (%s line %i): File variable zeros is not of type INT2\n",__func__,__LINE__); char *e = (char*)&(hdr->ID.Equipment); memcpy(e,unit,8); lei16a(i,e+6); } } if (VERBOSE_LEVEL>7) fprintf(stdout,"\n******* Data Section variable information (n=%i,%i)*********\n", d,NumberOfDataSections); datapos = LastDataSectionHeaderOffset; //H1LEN + H2LEN*hdr->NS + n*36; // reverse order of data sections uint32_t *DATAPOS = (uint32_t*)malloc(sizeof(uint32_t)*NumberOfDataSections); uint16_t m; for (m = NumberOfDataSections; 0 < m; ) { DATAPOS[--m] = datapos; datapos = leu32p(hdr->AS.Header + datapos); if (VERBOSE_LEVEL>7) fprintf(stdout, "%s:%i sopen_cfs_read started: section %"PRIi16" pos %"PRIuPTR" 0x%"PRIxPTR"\n",__FILE__,__LINE__,m,datapos,datapos); } if (hdr->AS.SegSel[0] > NumberOfDataSections) { fprintf(stderr,"Warning loading CFS file: selected sweep number is larger than number of sweeps [%d,%d] - no data is loaded\n",hdr->AS.SegSel[0], NumberOfDataSections); NumberOfDataSections = 0; } else if (0 < hdr->AS.SegSel[0]) { // hack: if sweep is selected, use same method than for data with a single sweep DATAPOS[0] = DATAPOS[hdr->AS.SegSel[0]-1]; NumberOfDataSections = 1; } // void *VarChanInfoPos = hdr->AS.Header + datapos + 30; // unused char flag_ChanInfoChanged = 0; hdr->NRec = NumberOfDataSections; int Signal6_CodeDescLen = 0; size_t SPR = 0, SZ = 0; for (m = 0; m < NumberOfDataSections; m++) { int32_t tmp_event_typ=0; double tmp_event_pos=0; datapos = DATAPOS[m]; for (k = 0; k < d; k++) { /***** DS variable k information *****/ int i=-1; double f=NAN; size_t pos = H1LEN + H2LEN*hdr->NS + (n+k+1)*36; char *desc = (char*)(hdr->AS.Header+pos+1); uint16_t typ = leu16p(hdr->AS.Header+pos+22); char *unit = (char*)(hdr->AS.Header+pos+25); uint16_t off = leu16p(hdr->AS.Header+pos+34); if (flag_FPulse && !strcmp(desc, "Spare")) continue; /***** data section variable k *****/ size_t p3 = DATAPOS[m] + 30 + 24 * hdr->NS + off; switch (typ) { case 0: case 1: i = hdr->AS.Header[p3]; break; case 2: i = lei16p(hdr->AS.Header+p3); break; case 3: i = leu16p(hdr->AS.Header+p3); break; case 4: i = lei32p(hdr->AS.Header+p3); break; case 5: f = lef32p(hdr->AS.Header+p3); break; case 6: f = lef64p(hdr->AS.Header+p3); break; } if ((k==1) && (typ==4) && !strcmp(desc,"State")) { tmp_event_typ = i; if ((Signal6_CodeDescLen < i) && (i < 256)) Signal6_CodeDescLen = i; } else if ((k==3) && (typ==6) && !strcmp(desc,"Start") && !strcmp(unit,"s")) tmp_event_pos = f; if (VERBOSE_LEVEL>7) { fprintf(stdout,"#%2i [%i:%i] <%s>",k,typ,off,desc); if (typ<1) ; else if (typ<5) fprintf(stdout,"[%d]",i); else if (typ<7) fprintf(stdout,"[%g]",f); else if (typ==7) fprintf(stdout,"[%s]",hdr->AS.Header+p3+1); fprintf(stdout,"[%s]\n",unit); } } typeof (hdr->T0) TS = tmp_event_pos ? (hdr->T0 + ldexp(tmp_event_pos/(24.0*3600.0),32)) : 0; if (m>0) { hdr->EVENT.TYP[hdr->EVENT.N] = 0x7ffe; hdr->EVENT.POS[hdr->EVENT.N] = SPR; hdr->EVENT.TimeStamp[hdr->EVENT.N] = TS; hdr->EVENT.N++; } if (tmp_event_typ > 0) { hdr->EVENT.TYP[hdr->EVENT.N] = tmp_event_typ; hdr->EVENT.POS[hdr->EVENT.N] = SPR; hdr->EVENT.TimeStamp[hdr->EVENT.N] = TS; hdr->EVENT.N++; } if (!leu32p(hdr->AS.Header+datapos+8)) continue; // empty segment if (VERBOSE_LEVEL>7) fprintf(stdout,"\n******* DATA SECTION --%03i-- %i *********\n",m,flag_ChanInfoChanged); if (VERBOSE_LEVEL>7) fprintf(stdout,"\n[DS#%3i] 0x%x 0x%x [0x%x 0x%x szChanData=%i] 0x02%x\n", m, FileHeaderSize, \ (int)datapos, leu32p(hdr->AS.Header+datapos), leu32p(hdr->AS.Header+datapos+4), \ leu32p(hdr->AS.Header+datapos+8), leu16p(hdr->AS.Header+datapos+12)); uint32_t sz = 0; uint32_t bpb = 0, spr = 0; hdr->AS.first = 0; hdr->AS.length = 0; char flag_firstchan = 1; uint32_t xspr0 = 0; for (k = 0; k < hdr->NS; k++) { uint8_t *pos = hdr->AS.Header + datapos + 30 + 24 * k; CHANNEL_TYPE *hc = hdr->CHANNEL + k; // uint32_t bi = leu32p(pos); // unused uint32_t xspr = leu32p(pos+4); float Cal = lef32p(pos+8); float Off = lef32p(pos+12); double XCal = lef32p(pos+16); double XOff = lef32p(pos+20);// unused if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i/%i %i/%i %f+%f change SPR:%i->%i, Cal:%f->%f, Off: %f->%f\n", \ __FILE__,__LINE__, (int)m, (int)NumberOfDataSections, (int)k,(int)hdr->NS, XCal, XOff, \ (int)hc->SPR,(int)xspr,hc->Cal,Cal,hc->Off,Off); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) [%i %i] %i %i %p %i\n", __FILE__, __LINE__, m, k, xspr0, xspr, pos, (int)(datapos + 30 + 24 * k)); if (xspr0 == 0) xspr0 = xspr; else if (xspr>0) xspr0 = lcm(xspr0,xspr); else if (xspr==0) if (VERBOSE_LEVEL>7) fprintf(stdout,"Warning : #%i of section %i contains %i samples \n", (int)k, (int)m, (int)xspr); if (m > 0) { if ( (hc->Cal != Cal) || (hc->Off != Off) ) switch (hc->GDFTYP) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 16: hc->GDFTYP = 16; // float, single precision break; case 7: case 8: case 17: hc->GDFTYP = 17; // double break; case 18: // quadruple default: ; } } else { hc->Cal = Cal; hc->Off = Off; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i #%i: SPR=%i=%i=%i x%f+-%f %i x%g %g %g\n", __func__,__LINE__,m,k,spr,(int)SPR,hc->SPR,hc->Cal,hc->Off,hc->bi,xPhysDimScale[k], XCal, XOff); double Fs = 1.0 / (xPhysDimScale[k] * XCal); if ( (hc->OnOff == 0) || (XCal == 0.0) ) { ; // do nothing: } else if (flag_firstchan) { hdr->SampleRate = Fs; flag_firstchan = 0; } else if (fabs(hdr->SampleRate - Fs) > 1e-3) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "CED/CFS: different sampling rates are not supported\n"); } sz += hc->SPR * GDFTYP_BITS[hc->GDFTYP] >> 3; hc->bi = bpb; bpb += GDFTYP_BITS[hc->GDFTYP]>>3; // per single sample hdr->AS.length += hc->SPR; } SPR += xspr0; SZ += sz; hdr->AS.bpb = bpb; } if (Signal6_CodeDescLen > 0) { if (Signal6_CodeDescLen > 70) { // 19 is sizeof Signal6_StateTable fprintf(stderr, "Warning %s (line %i): Event code description exceed table (Signal6_CodeDescLen=%i)\n",__func__,__LINE__,Signal6_CodeDescLen); Signal6_CodeDescLen = 70; } hdr->EVENT.LenCodeDesc = Signal6_CodeDescLen+1; //70 is sizeof(Signal6_StateTable) hdr->EVENT.CodeDesc = realloc(hdr->EVENT.CodeDesc, sizeof(char*) * (Signal6_CodeDescLen+1)); for (int k=0; k <= Signal6_CodeDescLen; k++) { hdr->EVENT.CodeDesc[k] = Signal6_StateTable[k]; } } /* The previous and the next loop have been split, in order to avoid multiple reallocations. Multiple reallocations seem to be a major issue for performance problems of Windows (a 50 MB file with 480 sweeps took 50 s to load). However, the two loops might contain some redundant operations. */ hdr->AS.flag_collapsed_rawdata = 0; void *ptr = realloc(hdr->AS.rawdata, hdr->AS.bpb * SPR); if (!ptr) biosigERROR(hdr,B4C_MEMORY_ALLOCATION_FAILED, "CFS: memory allocation failed in line __LINE__"); hdr->AS.rawdata = (uint8_t*)ptr; SPR = 0, SZ = 0; for (m = 0; m < NumberOfDataSections; m++) { datapos = DATAPOS[m]; if (!leu32p(hdr->AS.Header+datapos+8)) continue; // empty segment uint32_t sz = 0; uint32_t bpb = 0, spr = 0; hdr->AS.first = 0; hdr->AS.length = 0; char flag_firstchan = 1; uint32_t xspr0 = 0; float Cal, Off; for (k = 0; k < hdr->NS; k++) { uint8_t *pos = hdr->AS.Header + datapos + 30 + 24 * k; CHANNEL_TYPE *hc = hdr->CHANNEL + k; //uint32_t bi = leu32p(pos); // unused uint32_t xspr = leu32p(pos+4); hc->SPR = leu32p(pos+4); hc->Cal = lef32p(pos+8); hc->Off = lef32p(pos+12); Cal = lef32p(pos+8); Off = lef32p(pos+12); double XCal = lef32p(pos+16); double XOff = lef32p(pos+20);// unused if (xspr0 == 0) xspr0 = xspr; else if (xspr>0) xspr0 = lcm(xspr0, xspr); else if (xspr==0) if (VERBOSE_LEVEL>7) fprintf(stdout,"Warning : #%i of section %i contains %i samples \n", (int)k, (int)m, (int)xspr); assert( (xspr==0) || ((xspr0 % xspr) == 0) ); double Fs = 1.0 / (xPhysDimScale[k] * XCal); if ( (hc->OnOff == 0) || (XCal == 0.0) ) { ; // do nothing: } else if (flag_firstchan) { hdr->SampleRate = Fs; flag_firstchan = 0; } else if (fabs(hdr->SampleRate - Fs) > 1e-3) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "CED/CFS: different sampling rates are not supported\n"); } sz += xspr * GDFTYP_BITS[hc->GDFTYP] >> 3; hc->bi = bpb; bpb += GDFTYP_BITS[hc->GDFTYP]>>3; // per single sample hdr->AS.length += xspr; } if (xspr0 > 0) { /* hack: copy data into a single block (rawdata) this is used as a data cache, no I/O is needed in sread, at the cost that sopen is slower sread_raw does not attempt to reload the data */ hdr->AS.first = 0; uint8_t ns = 0; for (k = 0; k < hdr->NS; k++) { uint8_t *pos = hdr->AS.Header + datapos + 30 + 24 * k; CHANNEL_TYPE *hc = hdr->CHANNEL + k; uint32_t memoffset = leu32p(pos); uint8_t *srcaddr = hdr->AS.Header + leu32p(hdr->AS.Header+datapos + 4) ; //uint16_t byteSpace = leu16p(H2+44 + k*H2LEN); uint8_t dataType = H2[42 + k*H2LEN]; uint8_t dataKind = H2[43 + k*H2LEN]; // equidistant, Subsidiary or Matrix data uint16_t stride = leu16p(H2+44 + k*H2LEN); // byteSpace uint16_t next = leu16p(H2+46 + k*H2LEN); uint16_t gdftyp = cfs_data_type(dataType); if (gdftyp > 580) // sizeof GDFTYP_BITS[] biosigERROR(hdr, B4C_DATATYPE_UNSUPPORTED, "CFS: unknown/unsupported data type !"); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) #%i %i,%i %i %i %i %i: %i @%p %i\n", __func__, __LINE__, k, dataType, dataKind, hc->SPR, gdftyp,hc->GDFTYP, stride, memoffset, srcaddr, leu32p(hdr->AS.Header+datapos + 4) + leu32p(hdr->AS.Header + datapos + 30 + 24 * k)); if (hc->OnOff==0) continue; // Time and Marker channels are not supported, yet if ((hc->SPR > 0) && (xspr0 != hc->SPR)) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "CED/CFS: samples-per-record (SPR) changes between channels - this is not supported yet."); } size_t k2; if (gdftyp == hc->GDFTYP) { for (k2 = 0; k2 < xspr0; k2++) { uint8_t *ptr = srcaddr + memoffset + k2*stride; uint8_t *dest = hdr->AS.rawdata + hc->bi + (SPR + k2) * hdr->AS.bpb; double val=NAN; switch (gdftyp) { // reorder for performance reasons - more frequent gdftyp's come first case 3: //val = lei16p(ptr); case 4: //val = leu16p(ptr); memcpy(dest, ptr, 2); break; case 16: //val = lef32p(ptr); memcpy(dest, ptr, 4); break; case 7: //val = lei64p(ptr); case 8: //val = leu64p(ptr); case 17: //val = lef64p(ptr); memcpy(dest, ptr, 8); break; case 0: //val = *( char*) ptr; case 1: //val = *( int8_t*) ptr; case 2: //val = *(uint8_t*) ptr; *dest = *ptr; break; case 5: val = lei32p(ptr); case 6: //val = leu32p(ptr); memcpy(dest, ptr, 4); break; default: val = NAN; biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "CED/CFS: invalid data type"); } if (hc->OnOff) continue; if (!strncmp(hc->Label,"Marker",6) && hc->PhysDimCode==2176 && hc->GDFTYP==5 && next != 0) { // matrix data might contain time markers. // memory allocation for additional events - more efficient implementation would be nice hdr->EVENT.TYP = (typeof(hdr->EVENT.TYP)) realloc(hdr->EVENT.TYP, (hdr->EVENT.N + NumberOfDataSections) * sizeof(*hdr->EVENT.TYP)); hdr->EVENT.POS = (typeof(hdr->EVENT.POS)) realloc(hdr->EVENT.POS, (hdr->EVENT.N + NumberOfDataSections) * sizeof(*hdr->EVENT.POS)); /* char Desc[2]; Desc[0] = srcaddr[hdr->CHANNEL[next].bi + k2*stride]; Desc[1] = 0; this does currently not work because FreeTextEvent expects that the string constant is available as long as hdr, which is not the case here. */ // typically a single character within a 4 byte integer, this should be sufficient to ensure \0 termination char *Desc = (char*)srcaddr + hdr->CHANNEL[next].bi + k2 * stride; Desc[1] = 0; FreeTextEvent(hdr, hdr->EVENT.N, Desc); hdr->EVENT.POS[hdr->EVENT.N] = lround( (val * hc->Cal + hc->Off) * hdr->SampleRate) + SPR; hdr->EVENT.N++; } } } else { for (k2 = 0; k2 < xspr0; k2++) { uint8_t *ptr = srcaddr + memoffset + k2*stride; uint8_t *dest = hdr->AS.rawdata + hc->bi + (SPR + k2) * hdr->AS.bpb; double val; if (hc->GDFTYP==16) { // float switch (gdftyp) { // reorder for performance reasons - more frequent gdftyp's come first case 3: val = lei16p(ptr) * Cal + Off; break; case 4: val = leu16p(ptr) * Cal + Off; break; case 16: val = lef32p(ptr) * Cal + Off; break; case 7: val = lei64p(ptr) * Cal + Off; break; case 8: val = leu64p(ptr) * Cal + Off; break; case 17: val = lef64p(ptr) * Cal + Off; break; case 0: val = (*( char*) ptr) * Cal + Off; break; case 1: val = (*( int8_t*) ptr) * Cal + Off; break; case 2: val = (*(uint8_t*) ptr) * Cal + Off; break; case 5: val = lei32p(ptr) * Cal + Off; break; case 6: val = leu32p(ptr) * Cal + Off; break; default: val = NAN; biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "CED/CFS: invalid data type"); } lef32a(val, dest); // hdr->AS.rawdata uses the native endian format of the platform } else { // any conversion to anything but float is not supported yet. biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "CED/CFS: data type changes between segments - this is not supported yet."); } // scaling has been already consider when converting to float, do not scale in sread anymore. hc->Cal = 1.0; hc->Off = 0.0; if (hc->OnOff) continue; if (!strncmp(hc->Label,"Marker",6) && hc->PhysDimCode==2176 && hc->GDFTYP==5 && next != 0) { // matrix data might contain time markers. // memory allocation for additional events - more efficient implementation would be nice hdr->EVENT.TYP = (typeof(hdr->EVENT.TYP)) realloc(hdr->EVENT.TYP, (hdr->EVENT.N + NumberOfDataSections) * sizeof(*hdr->EVENT.TYP)); hdr->EVENT.POS = (typeof(hdr->EVENT.POS)) realloc(hdr->EVENT.POS, (hdr->EVENT.N + NumberOfDataSections) * sizeof(*hdr->EVENT.POS)); /* char Desc[2]; Desc[0] = srcaddr[hdr->CHANNEL[next].bi + k2*stride]; Desc[1] = 0; this does currently not work because FreeTextEvent expects that the string constant is available as long as hdr, which is not the case here. */ // typically a single character within a 4 byte integer, this should be sufficient to ensure \0 termination char *Desc = (char*)srcaddr + hdr->CHANNEL[next].bi + k2 * stride; Desc[1] = 0; FreeTextEvent(hdr, hdr->EVENT.N, Desc); hdr->EVENT.POS[hdr->EVENT.N] = lround( (val * hc->Cal + hc->Off) * hdr->SampleRate) + SPR; hdr->EVENT.N++; } } } ns += hc->OnOff; } } SPR += xspr0; SZ += sz; datapos = leu32p(hdr->AS.Header + datapos); } free(DATAPOS); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): SPR=%i=%i NRec=%i @%p\n",__FILE__,__LINE__,(int)SPR,hdr->SPR,(int)hdr->NRec, hdr->AS.rawdata); // set variables such that sread_raw does not attempt to reload the data hdr->AS.first = 0; hdr->EVENT.SampleRate = hdr->SampleRate; if (NumberOfDataSections < 1) { hdr->SPR = 0; } else { hdr->SPR = 1; hdr->NRec = SPR; hdr->AS.length = SPR; size_t bpb = 0; for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; assert(hc->bi==bpb); bpb += GDFTYP_BITS[hc->GDFTYP] >> 3; hc->SPR = hdr->SPR; } assert(hdr->AS.bpb==bpb); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): SPR=%i=%i NRec=%i\n",__func__,__LINE__,(int)SPR,hdr->SPR,(int)hdr->NRec); datapos = FileHeaderSize; //+DataHeaderSize; if (flag_ChanInfoChanged) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "CED/CFS: varying channel information not supported"); } for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; switch (hc->GDFTYP) { case 0: case 1: hc->DigMax = 127; hc->DigMin = -128; break; case 2: hc->DigMax = 255; hc->DigMin = 0; break; case 3: hc->DigMax = (int16_t)0x7fff; hc->DigMin = (int16_t)0x8000; break; case 4: hc->DigMax = 0xffff; hc->DigMin = 0; break; case 16: case 17: hc->DigMax = 1e9; hc->DigMin = -1e9; break; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (%i): %f %f %f %f %f %f\n",__FILE__,__LINE__,hc->PhysMax, hc->DigMax, hc->Cal, hc->Off,hc->PhysMin, hc->DigMin ); hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (%i): %f %f %f %f %f %f\n",__FILE__,__LINE__,hc->PhysMax, hc->DigMax, hc->Cal, hc->Off,hc->PhysMin, hc->DigMin ); } #undef H1LEN } /***************************************************************************** SOPEN_SMR_READ for reading SON/SMR files son.h, sonintl.h are used just for understanding the file format. and are not needed for the core functionality. TODO: Currently waveform data is supported, events and marker information is ignored *****************************************************************************/ #if defined(WITH_SON) #include "sonintl.h" // defines __SONINTL__ #else #define ADCdataBlkSize 32000 #endif EXTERN_C void sopen_smr_read(HDRTYPE* hdr) { /*TODO: implemnt SON/SMR format */ fprintf(stdout,"SOPEN: Support for CED's SMR/SON format is under construction \n"); size_t count = hdr->HeadLen; if (count < 512) { hdr->HeadLen = 512; // make sure fixed header (first 512 bytes) are read hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen+1); count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); hdr->AS.Header[count]=0; } // get Endianity, Version and Header size hdr->FILE.LittleEndian = (*(uint16_t*)(hdr->AS.Header+38) == 0); // 0x0000: little endian, 0x0101: big endian if (hdr->FILE.LittleEndian) { hdr->VERSION = leu16p(hdr->AS.Header); hdr->HeadLen = leu32p(hdr->AS.Header + 26 ); // first data } else { hdr->VERSION = beu16p(hdr->AS.Header); hdr->HeadLen = beu32p(hdr->AS.Header + 26); // first data // TODO: relax this restriction biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "SON/SMR: big-endian file not supported,yet"); } size_t HeadLen = hdr->HeadLen; size_t size_factor = 1; if (hdr->VERSION >= 9) { size_factor = 512; HeadLen *= size_factor; if (sizeof(size_t) <= 4) { // TODO: relax that restriction biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "SON/SMR: version 9 (bigfile) not supported,yet"); return; } } if (count < HeadLen) { // read channel header and extra data (i.e. everything up to firstData) hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,HeadLen+1); count += ifread(hdr->AS.Header+count, 1, HeadLen-count, hdr); hdr->AS.Header[count]=0; } #ifdef __SONINTL__ if (VERBOSE_LEVEL > 6) { TFileHead *tfh = (void*)(hdr->AS.Header); TChannel *tc = (void*)(hdr->AS.Header+512); // debugging information fprintf(stdout,"\tsizeof TFileHead %i\n\tsizeof TChannel %i\n\tsizeof TDataBlock %i\n", (int)sizeof(TFileHead),(int)sizeof(TChannel),(int)sizeof(TDataBlock)); fprintf(stdout,"%i NS=%i %i %i %i\n", (int)sizeof(*tfh),hdr->NS,(int)offsetof(TFileHead,channels),(int)sizeof(TChannel),(int)sizeof(TDataBlock)); fprintf(stdout,"systemID\t%i %i %i\n",(int)offsetof(TFileHead,systemID), (int)sizeof(tfh->systemID),lei16p(hdr->AS.Header+offsetof(TFileHead,systemID))); fprintf(stdout,"copyright\t%i %i\n",(int)offsetof(TFileHead,copyright),(int)sizeof(tfh->copyright)); fprintf(stdout,"creator \t%i %i <%8s>\n",(int)offsetof(TFileHead,creator), (int)sizeof(tfh->creator),hdr->AS.Header+offsetof(TFileHead,creator)); fprintf(stdout,"usPerTime\t%i %i %i\n",(int)offsetof(TFileHead,usPerTime), (int)sizeof(tfh->usPerTime),lei16p(hdr->AS.Header+offsetof(TFileHead,usPerTime))); fprintf(stdout,"timePerADC\t%i %i %i\n",(int)offsetof(TFileHead,timePerADC), (int)sizeof(tfh->timePerADC),lei16p(hdr->AS.Header+offsetof(TFileHead,timePerADC))); fprintf(stdout,"fileState\t%i %i %i\n",(int)offsetof(TFileHead,fileState), (int)sizeof(tfh->fileState),lei16p(hdr->AS.Header+offsetof(TFileHead,fileState))); fprintf(stdout,"firstData\t%i %i %i\n",(int)offsetof(TFileHead,firstData), (int)sizeof(tfh->firstData),lei32p(hdr->AS.Header+offsetof(TFileHead,firstData))); fprintf(stdout,"channels\t%i %i 0x%04x\n",(int)offsetof(TFileHead,channels), (int)sizeof(tfh->channels),lei16p(hdr->AS.Header+offsetof(TFileHead,channels))); fprintf(stdout,"chanSize\t%i %i 0x%04x\n",(int)offsetof(TFileHead,chanSize), (int)sizeof(tfh->chanSize),lei16p(hdr->AS.Header+offsetof(TFileHead,chanSize))); fprintf(stdout,"extraData\t%i %i %i\n",(int)offsetof(TFileHead,extraData), (int)sizeof(tfh->extraData),lei16p(hdr->AS.Header+offsetof(TFileHead,extraData))); fprintf(stdout,"bufferSz\t%i %i %i\n",(int)offsetof(TFileHead,bufferSz), (int)sizeof(tfh->bufferSz),lei16p(hdr->AS.Header+offsetof(TFileHead,bufferSz))); fprintf(stdout,"osFormat\t%i %i %i\n",(int)offsetof(TFileHead,osFormat), (int)sizeof(tfh->osFormat),lei16p(hdr->AS.Header+offsetof(TFileHead,osFormat))); fprintf(stdout,"maxFTime\t%i %i %i\n",(int)offsetof(TFileHead,maxFTime), (int)sizeof(tfh->maxFTime),lei32p(hdr->AS.Header+offsetof(TFileHead,maxFTime))); fprintf(stdout,"dTimeBase\t%i %i %g\n",(int)offsetof(TFileHead,dTimeBase), (int)sizeof(tfh->dTimeBase),lef64p(hdr->AS.Header+offsetof(TFileHead,dTimeBase))); fprintf(stdout,"timeDate\t%i %i\n",(int)offsetof(TFileHead,timeDate),(int)sizeof(tfh->timeDate)); fprintf(stdout,"cAlignFlag\t%i %i\n",(int)offsetof(TFileHead,cAlignFlag),(int)sizeof(tfh->cAlignFlag)); fprintf(stdout,"pad0 \t%i %i\n",(int)offsetof(TFileHead,pad0),(int)sizeof(tfh->pad0)); fprintf(stdout,"LUTable \t%i %i\n",(int)offsetof(TFileHead,LUTable),(int)sizeof(tfh->LUTable)); fprintf(stdout,"pad \t%i %i\n",(int)offsetof(TFileHead,pad),(int)sizeof(tfh->pad)); fprintf(stdout,"fileComment\t%i %i\n",(int)offsetof(TFileHead,fileComment),(int)sizeof(tfh->fileComment)); fprintf(stdout,"==CHANNEL==\n"); fprintf(stdout,"delSize \t%i %i\n",(int)offsetof(TChannel,delSize),(int)sizeof(tc->delSize)); fprintf(stdout,"nextDelBlock\t%i %i\n",(int)offsetof(TChannel,nextDelBlock),(int)sizeof(tc->nextDelBlock)); fprintf(stdout,"firstBlock\t%i %i\n",(int)offsetof(TChannel,firstBlock),(int)sizeof(tc->firstBlock)); fprintf(stdout,"lastBlock\t%i %i\n",(int)offsetof(TChannel,lastBlock),(int)sizeof(tc->lastBlock)); fprintf(stdout,"blocks \t%i %i\n",(int)offsetof(TChannel,blocks),(int)sizeof(tc->blocks)); fprintf(stdout,"nExtra \t%i %i\n",(int)offsetof(TChannel,nExtra),(int)sizeof(tc->nExtra)); fprintf(stdout,"preTrig \t%i %i\n",(int)offsetof(TChannel,preTrig),(int)sizeof(tc->preTrig)); fprintf(stdout,"blocksMSW\t%i %i\n",(int)offsetof(TChannel,blocksMSW),(int)sizeof(tc->blocksMSW)); fprintf(stdout,"phySz \t%i %i\n",(int)offsetof(TChannel,phySz),(int)sizeof(tc->phySz)); fprintf(stdout,"maxData \t%i %i\n",(int)offsetof(TChannel,maxData),(int)sizeof(tc->maxData)); fprintf(stdout,"comment \t%i %i\n",(int)offsetof(TChannel,comment),(int)sizeof(tc->comment)); fprintf(stdout,"maxChanTime \t%i %i\n",(int)offsetof(TChannel,maxChanTime),(int)sizeof(tc->maxChanTime)); fprintf(stdout,"lChanDvd\t%i %i\n",(int)offsetof(TChannel,lChanDvd),(int)sizeof(tc->lChanDvd)); fprintf(stdout,"phyChan \t%i %i\n",(int)offsetof(TChannel,phyChan),(int)sizeof(tc->phyChan)); fprintf(stdout,"title \t%i %i %s\n",(int)offsetof(TChannel,title),(int)sizeof(tc->title),((char*)&(tc->title))+1); fprintf(stdout,"idealRate\t%i %i\n",(int)offsetof(TChannel,idealRate),(int)sizeof(tc->idealRate)); fprintf(stdout,"kind \t%i %i\n",(int)offsetof(TChannel,kind),(int)sizeof(tc->kind)); fprintf(stdout,"delSizeMSB\t%i %i\n",(int)offsetof(TChannel,delSizeMSB),(int)sizeof(tc->delSizeMSB)); fprintf(stdout,"v.adc.scale\t%i %i\n",(int)offsetof(TChannel,v.adc.scale),(int)sizeof(tc->v.adc.scale)); fprintf(stdout,"v.adc.offset\t%i %i\n",(int)offsetof(TChannel,v.adc.offset),(int)sizeof(tc->v.adc.offset)); fprintf(stdout,"v.adc.units\t%i %i\n",(int)offsetof(TChannel,v.adc.units),(int)sizeof(tc->v.adc.units)); fprintf(stdout,"v.adc.divide\t%i %i\n",(int)offsetof(TChannel,v.adc.divide),(int)sizeof(tc->v.adc.divide)); fprintf(stdout,"v.event.initLow\t%i %i\n",(int)offsetof(TChannel,v.event.initLow),(int)sizeof(tc->v.event.initLow)); fprintf(stdout,"v.event.nextLow\t%i %i\n",(int)offsetof(TChannel,v.event.nextLow),(int)sizeof(tc->v.event.nextLow)); fprintf(stdout,"v.real.min\t%i %i\n",(int)offsetof(TChannel,v.real.min),(int)sizeof(tc->v.real.min)); fprintf(stdout,"v.real.max\t%i %i\n",(int)offsetof(TChannel,v.real.max),(int)sizeof(tc->v.real.max)); fprintf(stdout,"v.real.units\t%i %i\n",(int)offsetof(TChannel,v.real.units),(int)sizeof(tc->v.real.units)); assert(sizeof(TSONTimeDate)==8); assert(sizeof(TFileHead)==512); assert(sizeof(TChannel)==140); assert(sizeof(TDataBlock)==64020); } #endif uint16_t timePerADC; uint32_t maxFTime; double timebase,dTimeBase; memcpy(&hdr->ID.Equipment, hdr->AS.Header+12, 8); if (hdr->FILE.LittleEndian) { timebase = hdr->VERSION < 6 ? 1e-6 : lef64p(hdr->AS.Header + 44); hdr->SampleRate = 1.0 / (timebase * leu16p(hdr->AS.Header + 20) ); hdr->NS = leu16p(hdr->AS.Header + 30 ); timePerADC = lei16p(hdr->AS.Header + 22); maxFTime = leu32p(hdr->AS.Header + 40); dTimeBase = lef64p(hdr->AS.Header + 44); } else { timebase = hdr->VERSION < 6 ? 1e-6 : bef64p(hdr->AS.Header + 44); hdr->SampleRate = 1.0 / (timebase * beu16p(hdr->AS.Header + 20)); hdr->NS = beu16p(hdr->AS.Header + 30); timePerADC = bei16p(hdr->AS.Header + 22); maxFTime = beu32p(hdr->AS.Header + 40); dTimeBase = bef64p(hdr->AS.Header + 44); } hdr->SPR = 1; while (!ifeof(hdr)) { // read channel header and extra data hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen*2); hdr->HeadLen *= 2; count += ifread(hdr->AS.Header+count, 1, hdr->HeadLen-count, hdr); } hdr->HeadLen = count; /********************************************* read channel header *********************************************/ hdr->CHANNEL = (CHANNEL_TYPE*)realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); typeof(hdr->NS) k; size_t bpb = 0; for (k = 0; k < hdr->NS; k++) { uint32_t off = 512 + k*140; CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->Cal = lef32p(hdr->AS.Header + off + 124); // v.adc.scale hc->Off = lef32p(hdr->AS.Header + off + 128); // v.adc.off hc->OnOff = 0; //*(int16_t*)(hdr->AS.Header + off + 106) != 0; hc->SPR = 0; hc->GDFTYP = 3; hc->LeadIdCode = 0; int stringLength = hdr->AS.Header[off+108]; assert(stringLength < MAX_LENGTH_LABEL); memcpy(hc->Label, hdr->AS.Header+off+108+1, stringLength); hc->Label[stringLength] = '\0'; { // extract Physical units (pascal string - first byte indicates the length, no 0-terminator) stringLength = hdr->AS.Header[off+132]; char PhysicalUnit[6]; assert( stringLength < sizeof(PhysicalUnit) ); memcpy(PhysicalUnit, hdr->AS.Header+off+132+1, stringLength); PhysicalUnit[stringLength] = '\0'; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): #%i <%s> <%s>\n",__FILE__,__LINE__, k+1, hc->Label, PhysicalUnit); if (!strcmp(PhysicalUnit,"Volt") || !strcmp(PhysicalUnit," Volt")) hc->PhysDimCode = 4256; else if (!strcmp(PhysicalUnit,"mVolt")) hc->PhysDimCode = 4274; else if (!strcmp(PhysicalUnit,"uVolt")) hc->PhysDimCode = 4275; else hc->PhysDimCode = PhysDimCode(PhysicalUnit); } uint32_t firstBlock = leu32p(hdr->AS.Header+off+6); uint32_t lastBlock = leu32p(hdr->AS.Header+off+10); hc->bi = bpb; hc->bi8= 0; uint8_t kind = hdr->AS.Header[off+122]; switch (kind) { case 0: // // ChanOff=0, /* the channel is OFF - */ hc->OnOff = 0; break; case 1: { // Adc, /* a 16-bit waveform channel */ hc->OnOff = 1; hc->GDFTYP = 3; hc->Cal = lef32p(hdr->AS.Header + off + 124) / 6553.6; hc->Off = lef32p(hdr->AS.Header + off + 128); hc->DigMax = (double)(int16_t)0x7fff; hc->DigMin = (double)(int16_t)0x8000; hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; uint32_t blocks = leu16p(hdr->AS.Header+off+14); size_t bpbnew = bpb + blocks * ADCdataBlkSize * 2; hdr->AS.rawdata = realloc(hdr->AS.rawdata,bpbnew); uint32_t pos = firstBlock; while (1) { uint32_t items = leu16p(hdr->AS.Header+pos+18); memcpy(hdr->AS.rawdata+bpb, hdr->AS.Header+pos+20, items*2); bpb += items*2; hc->SPR += items; if (pos == lastBlock) break; pos = leu32p(hdr->AS.Header+pos+4); }; hdr->SPR = lcm(hdr->SPR, hc->SPR); break; } case 2: // EventFall, /* Event times (falling edges) */ hc->OnOff = 0; break; case 3: // EventRise, /* Event times (rising edges) */ hc->OnOff = 0; break; case 4: // EventBoth, /* Event times (both edges) */ hc->OnOff = 0; break; case 5: // Marker, /* Event time plus 4 8-bit codes */ hc->OnOff = 0; break; case 6: // AdcMark, /* Marker plus Adc waveform data */ hc->OnOff = 0; break; case 7: // RealMark, /* Marker plus float numbers */ hc->OnOff = 0; break; case 8: // TextMark, /* Marker plus text string */ hc->OnOff = 0; break; case 9: { // RealWave /* waveform of float numbers */ hc->OnOff = 1; hc->GDFTYP = 16; hc->LeadIdCode = 0; hc->Cal = lef32p(hdr->AS.Header + off + 124) / 6553.6; hc->Off = lef32p(hdr->AS.Header + off + 128); hc->DigMax = +1e9; hc->DigMin = -1e9; hc->PhysMax = hc->DigMax * hc->Cal + hc->Off; hc->PhysMin = hc->DigMin * hc->Cal + hc->Off; uint32_t blocks = leu16p(hdr->AS.Header+off+14); size_t bpbnew = bpb + blocks * ADCdataBlkSize * 4; hdr->AS.rawdata = realloc(hdr->AS.rawdata, bpbnew); uint32_t pos = firstBlock; while (1) { uint32_t items = leu16p(hdr->AS.Header+pos+18); memcpy(hdr->AS.rawdata+bpb, hdr->AS.Header+pos+20, items*4); bpb += items*4; hc->SPR += items; if (pos == lastBlock) break; pos = leu32p(hdr->AS.Header+pos+4); } hdr->SPR = lcm(hdr->SPR, hc->SPR); break; } default: // unknown hc->OnOff = 0; fprintf(stderr,"SMR/SON: channel %i ignored - unknown type %i\n",k,kind); } if (VERBOSE_LEVEL > 6) { char tmp[98-26+1]; fprintf(stdout,"[%i].delSize\t%i\n",k,lei16p(hdr->AS.Header+off)); fprintf(stdout,"[%i].nextDelBlock\t%i\n",k,leu32p(hdr->AS.Header+off+2)); fprintf(stdout,"[%i].firstBlock\t%i\n",k,leu32p(hdr->AS.Header+off+6)); fprintf(stdout,"[%i].lastBlock\t%i\n",k,leu32p(hdr->AS.Header+off+10)); fprintf(stdout,"[%i].blocks\t%i\n",k,leu16p(hdr->AS.Header+off+14)); fprintf(stdout,"[%i].nExtra\t%i\n",k,leu16p(hdr->AS.Header+off+16)); fprintf(stdout,"[%i].preTrig\t%i\n",k,lei16p(hdr->AS.Header+off+18)); fprintf(stdout,"[%i].blocksMSW\t%i\n",k,lei16p(hdr->AS.Header+off+20)); fprintf(stdout,"[%i].phySz\t%i\n",k,lei16p(hdr->AS.Header+off+22)); fprintf(stdout,"[%i].maxData\t%i\n",k,lei16p(hdr->AS.Header+off+24)); stringLength = hdr->AS.Header[off+26]; assert(stringLength < sizeof(tmp)); memcpy(tmp, hdr->AS.Header+off+26+1, 9); tmp[stringLength] = 0; fprintf(stdout,"[%i].comment\t<%s>\n",(int)k,tmp); fprintf(stdout,"[%i].maxChanTime\t%i\t%i\n",(int)k,lei32p(hdr->AS.Header+off+98),*(int32_t*)(hdr->AS.Header+off+98)); fprintf(stdout,"[%i].lChanDvd\t%i\n",(int)k,lei32p(hdr->AS.Header+off+102)); fprintf(stdout,"[%i].phyChan\t%i\n",(int)k,lei16p(hdr->AS.Header+off+106)); stringLength = hdr->AS.Header[off+108]; assert(stringLength < sizeof(tmp)); memcpy(tmp, hdr->AS.Header+off+108+1,9); tmp[stringLength] = 0; fprintf(stdout,"[%i].title\t<%s>\n",(int)k,tmp); fprintf(stdout,"[%i].idealRate\t%f\n",(int)k,lef32p(hdr->AS.Header+off+118)); fprintf(stdout,"[%i].kind\t%i\n",(int)k,*(hdr->AS.Header+off+122)); fprintf(stdout,"[%i].delSizeMSB\t%i\n",(int)k,*(hdr->AS.Header+off+123)); fprintf(stdout,"[%i].v.adc.scale\t%f\n",(int)k,lef32p(hdr->AS.Header+off+124)); fprintf(stdout,"[%i].v.adc.offset\t%f\n",(int)k,lef32p(hdr->AS.Header+off+128)); stringLength = hdr->AS.Header[off+132]; assert(stringLength < sizeof(tmp)); memcpy(tmp, hdr->AS.Header+off+132+1, 5); tmp[stringLength] = 0; fprintf(stdout,"[%i].v.adc.units\t%s\n", (int)k, tmp); fprintf(stdout,"[%i].v.adc.divide\t%i\n", (int)k, lei16p(hdr->AS.Header+off+138)); fprintf(stdout,"[%i].v.real.max\t%f\n", (int)k, lef32p(hdr->AS.Header+off+124)); fprintf(stdout,"[%i].v.real.min\t%f\n", (int)k, lef32p(hdr->AS.Header+off+128)); fprintf(stdout,"[%i].v.real.units\t%s\n", (int)k, hdr->AS.Header+off+132+1); fprintf(stdout,"[%i].v.event\t%0x\t%g\n", (int)k, leu32p(hdr->AS.Header+off+124), lef32p(hdr->AS.Header+off+124)); } } hdr->NRec = 1; hdr->AS.bpb = bpb; } stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/axon_structs.h0000664000175000017500000002656113062445067021064 00000000000000// // This file is part of the Axon Library. // // Copyright (c) 2008-2009 Jakub Nowacki // // The Axon Binary Format is property of Molecular Devices. // All rights to the Axon Binary Format are reserved to Molecular Devices. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // /* modified for use with biosig Copyright (C) 2013 Alois Schlögl, This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /*! \file * \brief Header containing all structures of ABF */ #ifndef INC_PROTOCOLSTRUCTS_HPP #define INC_PROTOCOLSTRUCTS_HPP #pragma once #pragma pack(push, 1) //#define UINT unsigned int //#define LONGLONG long long #define bool int // GUID is normally defined in the Windows Platform SDK struct GUID { uint32_t Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8]; }; // All these structs are persisted to file -> their sizes must NOT be changed without careful // attention to versioning issues in order to maintain compatibility. typedef struct ABF_Section { unsigned int uBlockIndex; // ABF block number of the first entry unsigned int uBytes; // size in bytes of of each entry long long llNumEntries; // number of entries in this section } ABF_Section; #define ABF_FILESIGNATURE 0x32464241 // PC="ABF2", MAC="2FBA" struct ABF_FileInfo { unsigned int uFileSignature; unsigned int uFileVersionNumber; // After this point there is no need to be the same as the ABF 1 equivalent. unsigned int uFileInfoSize; unsigned int uActualEpisodes; unsigned int uFileStartDate; unsigned int uFileStartTimeMS; unsigned int uStopwatchTime; short nFileType; short nDataFormat; short nSimultaneousScan; short nCRCEnable; unsigned int uFileCRC; struct GUID FileGUID; unsigned int uCreatorVersion; unsigned int uCreatorNameIndex; unsigned int uModifierVersion; unsigned int uModifierNameIndex; unsigned int uProtocolPathIndex; // New sections in ABF 2 - protocol stuff ... ABF_Section ProtocolSection; // the protocol ABF_Section ADCSection; // one for each ADC channel ABF_Section DACSection; // one for each DAC channel ABF_Section EpochSection; // one for each epoch ABF_Section ADCPerDACSection; // one for each ADC for each DAC ABF_Section EpochPerDACSection; // one for each epoch for each DAC ABF_Section UserListSection; // one for each user list ABF_Section StatsRegionSection; // one for each stats region ABF_Section MathSection; ABF_Section StringsSection; // ABF 1 sections ... ABF_Section DataSection; // Data ABF_Section TagSection; // Tags ABF_Section ScopeSection; // Scope config ABF_Section DeltaSection; // Deltas ABF_Section VoiceTagSection; // Voice Tags ABF_Section SynchArraySection; // Synch Array ABF_Section AnnotationSection; // Annotations ABF_Section StatsSection; // Stats config char sUnused[148]; // size = 512 bytes }; struct ABF_ProtocolInfo { short nOperationMode; float fADCSequenceInterval; bool bEnableFileCompression; char sUnused1[3]; unsigned int uFileCompressionRatio; float fSynchTimeUnit; float fSecondsPerRun; ABFLONG lNumSamplesPerEpisode; ABFLONG lPreTriggerSamples; ABFLONG lEpisodesPerRun; ABFLONG lRunsPerTrial; ABFLONG lNumberOfTrials; short nAveragingMode; short nUndoRunCount; short nFirstEpisodeInRun; float fTriggerThreshold; short nTriggerSource; short nTriggerAction; short nTriggerPolarity; float fScopeOutputInterval; float fEpisodeStartToStart; float fRunStartToStart; ABFLONG lAverageCount; float fTrialStartToStart; short nAutoTriggerStrategy; float fFirstRunDelayS; short nChannelStatsStrategy; ABFLONG lSamplesPerTrace; ABFLONG lStartDisplayNum; ABFLONG lFinishDisplayNum; short nShowPNRawData; float fStatisticsPeriod; ABFLONG lStatisticsMeasurements; short nStatisticsSaveStrategy; float fADCRange; float fDACRange; ABFLONG lADCResolution; ABFLONG lDACResolution; short nExperimentType; short nManualInfoStrategy; short nCommentsEnable; ABFLONG lFileCommentIndex; short nAutoAnalyseEnable; short nSignalType; short nDigitalEnable; short nActiveDACChannel; short nDigitalHolding; short nDigitalInterEpisode; short nDigitalDACChannel; short nDigitalTrainActiveLogic; short nStatsEnable; short nStatisticsClearStrategy; short nLevelHysteresis; ABFLONG lTimeHysteresis; short nAllowExternalTags; short nAverageAlgorithm; float fAverageWeighting; short nUndoPromptStrategy; short nTrialTriggerSource; short nStatisticsDisplayStrategy; short nExternalTagType; short nScopeTriggerOut; short nLTPType; short nAlternateDACOutputState; short nAlternateDigitalOutputState; float fCellID[3]; short nDigitizerADCs; short nDigitizerDACs; short nDigitizerTotalDigitalOuts; short nDigitizerSynchDigitalOuts; short nDigitizerType; char sUnused[304]; // size = 512 bytes }; struct ABF_MathInfo { short nMathEnable; short nMathExpression; unsigned int uMathOperatorIndex; unsigned int uMathUnitsIndex; float fMathUpperLimit; float fMathLowerLimit; short nMathADCNum[2]; char sUnused[16]; float fMathK[6]; char sUnused2[64]; // size = 128 bytes }; struct ABF_ADCInfo { // The ADC this struct is describing. short nADCNum; short nTelegraphEnable; short nTelegraphInstrument; float fTelegraphAdditGain; float fTelegraphFilter; float fTelegraphMembraneCap; short nTelegraphMode; float fTelegraphAccessResistance; short nADCPtoLChannelMap; short nADCSamplingSeq; float fADCProgrammableGain; float fADCDisplayAmplification; float fADCDisplayOffset; float fInstrumentScaleFactor; float fInstrumentOffset; float fSignalGain; float fSignalOffset; float fSignalLowpassFilter; float fSignalHighpassFilter; char nLowpassFilterType; char nHighpassFilterType; float fPostProcessLowpassFilter; char nPostProcessLowpassFilterType; bool bEnabledDuringPN; short nStatsChannelPolarity; ABFLONG lADCChannelNameIndex; ABFLONG lADCUnitsIndex; char sUnused[46]; // size = 128 bytes }; struct ABF_DACInfo { // The DAC this struct is describing. short nDACNum; short nTelegraphDACScaleFactorEnable; float fInstrumentHoldingLevel; float fDACScaleFactor; float fDACHoldingLevel; float fDACCalibrationFactor; float fDACCalibrationOffset; ABFLONG lDACChannelNameIndex; ABFLONG lDACChannelUnitsIndex; ABFLONG lDACFilePtr; ABFLONG lDACFileNumEpisodes; short nWaveformEnable; short nWaveformSource; short nInterEpisodeLevel; float fDACFileScale; float fDACFileOffset; ABFLONG lDACFileEpisodeNum; short nDACFileADCNum; short nConditEnable; ABFLONG lConditNumPulses; float fBaselineDuration; float fBaselineLevel; float fStepDuration; float fStepLevel; float fPostTrainPeriod; float fPostTrainLevel; short nMembTestEnable; short nLeakSubtractType; short nPNPolarity; float fPNHoldingLevel; short nPNNumADCChannels; short nPNPosition; short nPNNumPulses; float fPNSettlingTime; float fPNInterpulse; short nLTPUsageOfDAC; short nLTPPresynapticPulses; ABFLONG lDACFilePathIndex; float fMembTestPreSettlingTimeMS; float fMembTestPostSettlingTimeMS; short nLeakSubtractADCIndex; char sUnused[124]; // size = 256 bytes }; struct ABF_EpochInfoPerDAC { // The Epoch / DAC this struct is describing. short nEpochNum; short nDACNum; // One full set of epochs (ABF_EPOCHCOUNT) for each DAC channel ... short nEpochType; float fEpochInitLevel; float fEpochLevelInc; ABFLONG lEpochInitDuration; ABFLONG lEpochDurationInc; ABFLONG lEpochPulsePeriod; ABFLONG lEpochPulseWidth; char sUnused[18]; // size = 48 bytes }; struct ABF_EpochInfo { // The Epoch this struct is describing. short nEpochNum; // Describes one epoch short nDigitalValue; short nDigitalTrainValue; short nAlternateDigitalValue; short nAlternateDigitalTrainValue; bool bEpochCompression; // Compress the data from this epoch using uFileCompressionRatio char sUnused[21]; // size = 32 bytes }; struct ABF_StatsRegionInfo { // The stats region this struct is describing. short nRegionNum; short nADCNum; short nStatsActiveChannels; short nStatsSearchRegionFlags; short nStatsSelectedRegion; short nStatsSmoothing; short nStatsSmoothingEnable; short nStatsBaseline; ABFLONG lStatsBaselineStart; ABFLONG lStatsBaselineEnd; // Describes one stats region ABFLONG lStatsMeasurements; ABFLONG lStatsStart; ABFLONG lStatsEnd; short nRiseBottomPercentile; short nRiseTopPercentile; short nDecayBottomPercentile; short nDecayTopPercentile; short nStatsSearchMode; short nStatsSearchDAC; short nStatsBaselineDAC; char sUnused[78]; // size = 128 bytes }; struct ABF_UserListInfo { // The user list this struct is describing. short nListNum; // Describes one user list short nULEnable; short nULParamToVary; short nULRepeat; ABFLONG lULParamValueListIndex; char sUnused[52]; // size = 64 bytes }; struct ABF_SynchArray { ABFLONG lStart; ABFLONG lLength; }; // Strings section structure not defined by Axon #pragma pack(pop) // return to default packing #endif // INC_PROTOCOLSTRUCTS_HPP stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/sopen_heka_read.c0000664000175000017500000010707313240263033021415 00000000000000/* Copyright (C) 2008-2013,2018 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include "../biosig.h" /* TODO: - need to separate sopen_heka() and sread_heka() - data swapping */ #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) /**************************************************************************** rational : computes the rational approximation of a floating point number such that n/d is an approximation for r with an relative error smaller than tol see Octave's rat.m ****************************************************************************/ void rational (double x, double tol, long *n, long *d) { if (x != x) { // i.e. isnan(x) *n = 0; *d = 0; return; } if (!finite(x)) { *n = x>0; // i.e. sign(x) *d = 0; return; } tol *= fabs(x); *n = lround(x); *d = 1; double frac = x - *n; long lastn = 1, lastd = 0; while (fabs((*d) * x - (*n) ) >= fabs((*d) * tol)) { double flip = 1.0/frac; long step = lround(flip); frac = flip - step; long nextn = *n, nextd = *d; *n = *n * step + lastn; *d = *d * step + lastd; lastn = nextn; lastd = nextd; } if (*d < 0) { *n = - *n; *d = - *d; } } /**************************************************************************** heka2gdftime converts heka time format into gdftime ****************************************************************************/ gdf_time heka2gdftime(double t) { t -= 1580970496; if (t<0) t += 4294967296; t += 9561652096; return (uint64_t)ldexp(t/(24.0*60*60) + 584755, 32); // +datenum(1601,1,1)); } /**************************************************************************** sopen_heka reads heka format if itx is not null, the file is converted into an ITX formated file and streamed to itx, too. ****************************************************************************/ void sopen_heka(HDRTYPE* hdr, FILE *itx) { size_t count = hdr->HeadLen; if (hdr->TYPE==HEKA && hdr->VERSION > 1) { int32_t Levels=0; uint16_t k; //int32_t *Sizes=NULL; int32_t Counts[5], counts[5]; //, Sizes[5]; memset(Counts,0,20); memset(counts,0,20); //memset(Sizes,0,20); uint32_t StartOfData=0,StartOfPulse=0; union { struct { int32_t Root; int32_t Group; int32_t Series; int32_t Sweep; int32_t Trace; } Rec; int32_t all[5]; } Sizes; // HEKA PatchMaster file format count = hdr->HeadLen; struct stat FileBuf; stat(hdr->FileName,&FileBuf); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, FileBuf.st_size); count += ifread(hdr->AS.Header+count, 1, 1024-count, hdr); hdr->HeadLen = count; hdr->FILE.LittleEndian = *(uint8_t*)(hdr->AS.Header+52) > 0; char SWAP = ( hdr->FILE.LittleEndian && (__BYTE_ORDER == __BIG_ENDIAN)) \ || (!hdr->FILE.LittleEndian && (__BYTE_ORDER == __LITTLE_ENDIAN)); if (SWAP) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster format requires data swapping - this is not supported yet."); return; } SWAP = 0; // might be useful for compile time optimization /* get file size and read whole file */ count += ifread(hdr->AS.Header+count, 1, FileBuf.st_size - count, hdr); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %i bytes read\n",__FILE__,__LINE__,__func__, count); // double oTime; uint32_t nItems; if (hdr->FILE.LittleEndian) { // oTime = lef64p(hdr->AS.Header+40); // not used nItems = leu32p(hdr->AS.Header+48); } else { // oTime = bef64p(hdr->AS.Header+40); // not used nItems = beu32p(hdr->AS.Header+48); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): nItems=%i\n",__FILE__,__LINE__,__func__, nItems); if (hdr->VERSION == 1) { Sizes.Rec.Root = 544; Sizes.Rec.Group = 128; Sizes.Rec.Series = 1120; Sizes.Rec.Sweep = 160; Sizes.Rec.Trace = 296; } else if (hdr->VERSION == 2) for (k=0; k < min(12,nItems); k++) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): HEKA nItems=%i\n",__func__,__LINE__, k); uint32_t start = *(uint32_t*)(hdr->AS.Header+k*16+64); uint32_t length = *(uint32_t*)(hdr->AS.Header+k*16+64+4); if (SWAP) { start = bswap_32(start); length = bswap_32(length); } uint8_t *ext = hdr->AS.Header + k*16 + 64 + 8; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): HEKA #%i: <%s> [%i:+%i]\n",__func__,__LINE__,k,ext,start,length); if (!start) break; if ((start+8) > count) { biosigERROR(hdr, B4C_INCOMPLETE_FILE, "Heka/Patchmaster: file is corrupted - segment with pulse data is not available!"); return; } if (!memcmp(ext,".pul\0\0\0\0",8)) { // find pulse data ifseek(hdr, start, SEEK_SET); //magic = *(int32_t*)(hdr->AS.Header+start); Levels = *(int32_t*)(hdr->AS.Header+start+4); if (SWAP) Levels = bswap_32(Levels); if (Levels>5) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster format with more than 5 levels not supported"); return; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): HEKA #%i Levels=%i\n",__func__,__LINE__,k,Levels); memcpy(Sizes.all,hdr->AS.Header+start+8,sizeof(int32_t)*Levels); if (SWAP) { int l; for (l=0; l < Levels; l++) Sizes.all[l] = bswap_32(Sizes.all[l]); } if (VERBOSE_LEVEL>7) {int l; for (l=0; l < Levels; l++) fprintf(stdout,"%s (line %i): HEKA #%i %i\n",__func__,__LINE__,l, Sizes.all[l]); } StartOfPulse = start + 8 + 4 * Levels; } else if (!memcmp(ext,".dat\0\0\0\0",8)) { StartOfData = start; } } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): \n",__FILE__,__LINE__,__func__); // if (!Sizes) free(Sizes); Sizes=NULL; /* DONE: HEKA, check channel number and label pass 1: + get number of sweeps + get number of channels + check whether all traces of a single sweep have the same SPR, and Fs + check whether channelnumber (TrAdcChannel), scaling (DataScaler) and Label fit among all sweeps + extract the total number of samples + physical units + level 4 may have no children + count event descriptions Level2/SeLabel pass 2: + initialize data to NAN + skip sweeps if selected channel is not in it + Y scale, physical scale + Event.CodeDescription, Events, resampling */ uint32_t k1=0, k2=0, k3=0, k4=0; uint32_t K1=0, K2=0, K3=0, K4=0, K5=0; double t; size_t pos; // read K1 if (SWAP) { K1 = bswap_32(*(uint32_t*)(hdr->AS.Header + StartOfPulse + Sizes.Rec.Root)); hdr->VERSION = bswap_32(*(uint32_t*)(hdr->AS.Header + StartOfPulse)); union { double f64; uint64_t u64; } c; c.u64 = bswap_64(*(uint64_t*)(hdr->AS.Header + StartOfPulse + 520)); t = c.f64; } else { K1 = (*(uint32_t*)(hdr->AS.Header + StartOfPulse + Sizes.Rec.Root)); hdr->VERSION = (*(uint32_t*)(hdr->AS.Header + StartOfPulse)); t = (*(double*)(hdr->AS.Header + StartOfPulse + 520)); } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): \n",__FILE__,__LINE__,__func__); hdr->T0 = heka2gdftime(t); // this is when when heka was started, data is recorded later. hdr->SampleRate = 0.0; double *DT = NULL; // list of sampling intervals per channel hdr->SPR = 0; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %s(...): %p\n",__FILE__,__LINE__,__func__,hdr->EVENT.CodeDesc); /******************************************************************************************************* HEKA: read structural information *******************************************************************************************************/ pos = StartOfPulse + Sizes.Rec.Root + 4; size_t EventN=0; for (k1=0; k17) fprintf(stdout,"HEKA L1 @%i=\t%i/%i \n",(int)(pos+StartOfData),k1,K1); pos += Sizes.Rec.Group+4; // read number of children K2 = (*(uint32_t*)(hdr->AS.Header+pos-4)); hdr->AS.auxBUF = (uint8_t*)realloc(hdr->AS.auxBUF,K2*33); // used to store name of series for (k2=0; k2AS.Header+pos+4); // max 32 bytes strncpy((char*)hdr->AS.auxBUF + 33*k2, (char*)hdr->AS.Header+pos+4, 32); hdr->AS.auxBUF[33*k2+32] = 0; SeLabel = (char*)hdr->AS.auxBUF + 33*k2; double tt = *(double*)(hdr->AS.Header+pos+136); // time of series. TODO: this time should be taken into account Delay.u64 = bswap_64(*(uint64_t*)(hdr->AS.Header+pos+472+176)); gdf_time t = heka2gdftime(tt); struct tm tm; gdf_time2tm_time_r(t,&tm); if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA L2 @%i=%s %f\t%i/%i %i/%i t=%.17g %s\n",(int)(pos+StartOfData),SeLabel,Delay.f64,k1,K1,k2,K2,ldexp(t,-32),asctime(&tm)); pos += Sizes.Rec.Series + 4; // read number of children K3 = (*(uint32_t*)(hdr->AS.Header+pos-4)); if (EventN <= hdr->EVENT.N + K3 + 2) { EventN = max(max(16,EventN),hdr->EVENT.N+K3+2) * 2; if (reallocEventTable(hdr, EventN) == SIZE_MAX) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "Allocating memory for event table failed."); return; }; } if (!hdr->AS.SegSel[0] && !hdr->AS.SegSel[1] && !hdr->AS.SegSel[2]) { // in case of reading the whole file (no sweep selection), include marker for start of series FreeTextEvent(hdr, hdr->EVENT.N, SeLabel); hdr->EVENT.POS[hdr->EVENT.N] = hdr->SPR; // within reading the structure, hdr->SPR is used as a intermediate variable counting the number of samples #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = t; #endif hdr->EVENT.N++; } for (k3=0; k3NRec++; // increase number of sweeps size_t SPR = 0, spr = 0; gdf_time t = heka2gdftime(*(double*)(hdr->AS.Header+pos+48)); // time of sweep. TODO: this should be taken into account gdf_time2tm_time_r(t,&tm); if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA L3 @%i= %fHz\t%i/%i %i/%i %i/%i %s\n",(int)(pos+StartOfData),hdr->SampleRate,k1,K1,k2,K2,k3,K3,asctime(&tm)); char flagSweepSelected = (hdr->AS.SegSel[0]==0 || k1+1==hdr->AS.SegSel[0]) && (hdr->AS.SegSel[1]==0 || k2+1==hdr->AS.SegSel[1]) && (hdr->AS.SegSel[2]==0 || k3+1==hdr->AS.SegSel[2]); // hdr->SPR if (hdr->SPR==0) hdr->T0 = t; // start time of first recording determines the start time of the recording else if (flagSweepSelected && hdr->SPR > 0) { // marker for start of sweep hdr->EVENT.POS[hdr->EVENT.N] = hdr->SPR; // within reading the structure, hdr->SPR is used as a intermediate variable counting the number of samples hdr->EVENT.TYP[hdr->EVENT.N] = 0x7ffe; #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp[hdr->EVENT.N] = t; #endif hdr->EVENT.N++; } pos += Sizes.Rec.Sweep + 4; // read number of children K4 = (*(uint32_t*)(hdr->AS.Header+pos-4)); for (k4=0; k4AS.Header+pos+36)); uint32_t DataPos = (*(uint32_t*)(hdr->AS.Header+pos+40)); spr = (*(uint32_t*)(hdr->AS.Header+pos+44)); double DataScaler= (*(double*)(hdr->AS.Header+pos+72)); double Toffset = (*(double*)(hdr->AS.Header+pos+80)); // time offset of uint16_t pdc = PhysDimCode((char*)(hdr->AS.Header + pos + 96)); double dT = (*(double*)(hdr->AS.Header+pos+104)); //double XStart = (*(double*)(hdr->AS.Header+pos+112)); uint16_t XUnits = PhysDimCode((char*)(hdr->AS.Header+pos+120)); double YRange = (*(double*)(hdr->AS.Header+pos+128)); double YOffset = (*(double*)(hdr->AS.Header+pos+136)); double Bandwidth = (*(double*)(hdr->AS.Header+pos+144)); //double PipetteResistance = (*(double*)(hdr->AS.Header+pos+152)); double RsValue = (*(double*)(hdr->AS.Header+pos+192)); uint8_t ValidYRange = hdr->AS.Header[pos+220]; uint16_t AdcChan = (*(uint16_t*)(hdr->AS.Header+pos+222)); /* obsolete: range is defined by DigMin/DigMax * DataScaler + YOffset double PhysMin = (*(double*)(hdr->AS.Header+pos+224)); double PhysMax = (*(double*)(hdr->AS.Header+pos+232)); */ if (VERBOSE_LEVEL>7) fprintf(stdout, "%s (line %i): %i %i %i %i %i %g %g 0x%x xUnits=%i %g %g %g %g %i %i\n", __FILE__,__LINE__, k1, k2, k3, k4, ns, DataScaler, Toffset, pdc, XUnits, YRange, YOffset, Bandwidth, RsValue, ValidYRange, AdcChan); switch (hdr->AS.Header[pos+70]) { case 0: gdftyp = 3; //int16 /* It seems that the range is 1.024*(2^15-1)/2^15 nA or V and symetric around zero. i.e. YOffset is zero */ DigMax = ldexp(1.0,15) - 1.0; DigMin = -DigMax; break; case 1: gdftyp = 5; //int32 DigMax = ldexp(1.0, 31) - 1.0; DigMin = -DigMax; break; case 2: gdftyp = 16; //float32 DigMax = 1e9; DigMin = -1e9; break; case 3: gdftyp = 17; //float64 DigMax = 1e9; DigMin = -1e9; break; default: DigMax = NAN; DigMin = NAN; biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster: data type not supported"); }; if (SWAP) { AdcChan = bswap_16(AdcChan); ns = bswap_32(ns); DataPos = bswap_32(DataPos); spr = bswap_32(spr); // avoid breaking strict-aliasing rules union { double f64; uint64_t u64; } c; c.f64 = dT; c.u64 = bswap_64(c.u64); dT = c.f64; c.f64 = YRange; c.u64 = bswap_64(c.u64); YRange = c.f64; c.f64 = YOffset; c.u64 = bswap_64(c.u64); YOffset = c.f64; //c.f64 = PhysMax; c.u64 = bswap_64(c.u64); PhysMax = c.f64; //c.f64 = PhysMin; c.u64 = bswap_64(c.u64); PhysMin = c.f64; c.f64 = Toffset; c.u64 = bswap_64(c.u64); Toffset = c.f64; } if (YOffset != 0.0) fprintf(stderr,"!!! WARNING !!! HEKA: the offset is not zero - " "this case is not tested and might result in incorrect scaling of " "the data,\n!!! YOU ARE WARNED !!!\n"); // scale to standard units - no prefix double Cal = DataScaler * PhysDimScale(pdc); double Off = YOffset * PhysDimScale(pdc); pdc &= 0xffe0; float Fs = 1.0 / ( dT * PhysDimScale(XUnits) ) ; // float is used to avoid spurios accuracy, round to single precision accuracy if (flagSweepSelected) { if (hdr->SampleRate <= 0.0) hdr->SampleRate = Fs; if (fabs(hdr->SampleRate - Fs) > 1e-9*Fs) { long DIV1 = 1, DIV2 = 1; rational(hdr->SampleRate*dT*PhysDimScale(XUnits), 1e-6, &DIV2, &DIV1); if (DIV1 > 1) { if ( ((size_t)DIV1 * hdr->SPR) > 0xffffffffffffffff) { fprintf(stderr,"!!! WARNING sopen_heka(%s) !!! due to resampling, the data will have more then 2^31 samples !!!\n", hdr->FileName); biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"HEKA file has more than 2^32 samples - this is not supported yet"); } hdr->SPR *= DIV1; hdr->SampleRate *= DIV1; hdr->EVENT.SampleRate = hdr->SampleRate; size_t n = 0; while (n < hdr->EVENT.N) hdr->EVENT.POS[n++] *= DIV1; } if (DIV2 > 1) spr *= DIV2; } // samples per sweep if (k4==0) SPR = spr; else if (SPR != spr) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster: number of samples among channels within a single sweep do not match."); return; } } char *Label = (char*)hdr->AS.Header+pos+4; for (ns=0; ns < hdr->NS; ns++) { if (!strcmp(hdr->CHANNEL[ns].Label,Label)) break; } if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA L4 @%i= #%i,%i, %s %f %fHz\t%i/%i %i/%i %i/%i %i/%i \n",(int)(pos+StartOfData),ns,AdcChan,Label,hdr->SampleRate,Fs,k1,K1,k2,K2,k3,K3,k4,K4); CHANNEL_TYPE *hc; if (ns >= hdr->NS) { hdr->NS = ns + 1; #ifdef WITH_TIMESTAMPCHANNEL // allocate memory for an extra time stamp channel, which is define only after the end of the channel loop - see below hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, (hdr->NS + 1) * sizeof(CHANNEL_TYPE)); #else hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); #endif hc = hdr->CHANNEL + ns; strncpy(hc->Label, Label, max(32, MAX_LENGTH_LABEL)); hc->Label[max(32,MAX_LENGTH_LABEL)] = 0; hc->Transducer[0] = 0; hc->SPR = 1; hc->PhysDimCode = pdc; hc->OnOff = 1; hc->GDFTYP = gdftyp; hc->LeadIdCode = 0; hc->DigMin = DigMin; hc->DigMax = DigMax; // TODO: case of non-zero YOffset is not tested // hc->PhysMax = DigMax * Cal + Off; hc->PhysMin = DigMin * Cal + Off; hc->Cal = Cal; hc->Off = Off; hc->TOffset = Toffset; #ifndef NDEBUG double Cal2 = (hc->PhysMax - hc->PhysMin) / (hc->DigMax - hc->DigMin); double Off2 = hc->PhysMin - Cal2 * hc->DigMin; double Off3 = hc->PhysMax - Cal2 * hc->DigMax; if (VERBOSE_LEVEL>6) fprintf(stdout,"HEKA L5 @%i= #%i,%i, %s %g/%g %g/%g \n",(int)(pos+StartOfData),ns,AdcChan,Label,Cal,Cal2,Off,Off2); assert(Cal==Cal2); assert(Off==Off2); assert(Off==Off3); #endif /* TODO: fix remaining channel header */ /* LowPass, HighPass, Notch, Impedance, */ hc->HighPass = NAN; hc->LowPass = (Bandwidth > 0) ? Bandwidth : NAN; hc->Notch = NAN; hc->Impedance = (RsValue > 0) ? RsValue : NAN; DT = (double*) realloc(DT, hdr->NS*sizeof(double)); DT[ns] = dT; } else { /* channel has been already defined in earlier sweep. check compatibility and adapt internal format when needed */ hc = hdr->CHANNEL + ns; double PhysMax = DigMax * Cal + Off; double PhysMin = DigMin * Cal + Off; // get max value to avoid false positive saturation detection when scaling changes if (hc->PhysMax < PhysMax) hc->PhysMax = PhysMax; if (hc->PhysMin > PhysMin) hc->PhysMin = PhysMin; if (hc->GDFTYP < gdftyp) { /* when data type changes, use the largest data type */ if (4 < hc->GDFTYP && hc->GDFTYP < 9 && gdftyp==16) /* (U)INT32, (U)INT64 + FLOAT32 -> DOUBLE */ hc->GDFTYP = 17; else hc->GDFTYP = gdftyp; } else if (hc->GDFTYP > gdftyp) { /* when data type changes, use the largest data type */ if (4 < gdftyp && gdftyp < 9 && hc->GDFTYP==16) /* (U)INT32, (U)INT64 + FLOAT32 -> DOUBLE */ hc->GDFTYP = 17; } if (fabs(hc->Cal - Cal) > 1e-9*Cal) { /* when scaling changes from sweep to sweep, use floating point numbers internally. */ if (hc->GDFTYP < 5) // int16 or smaller hc->GDFTYP = 16; else if (hc->GDFTYP < 9) // int32, int64 -> double hc->GDFTYP = 17; } if ((pdc & 0xFFE0) != (hc->PhysDimCode & 0xFFE0)) { fprintf(stdout, "ERROR: [%i,%i,%i,%i] Yunits in %s do not match %04x(%s) ! %04x(%s)\n",k1,k2,k3,k4, Label, pdc, PhysDim3(pdc), hc->PhysDimCode, PhysDim3(hc->PhysDimCode)); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster: Yunits do not match"); } if ( ( VERBOSE_LEVEL > 7 ) && ( fabs( DT[ns] - dT) > 1e-9 * dT) ) { fprintf(stdout, "%s (line %i) different sampling rates [%i,%i,%i,%i]#%i,%f/%f \n",__FILE__,__LINE__,(int)k1,(int)k2,(int)k3,(int)k4,(int)ns, 1.0/DT[ns],1.0/dT); } } if (YOffset) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster: YOffset is not zero"); } if (hdr->AS.Header[pos+220] != 1) { fprintf(stderr,"WARNING Heka/Patchmaster: ValidYRange not set to 1 but %i in sweep [%i,%i,%i,%i]\n", hdr->AS.Header[pos+220],k1+1,k2+1,k3+1,k4+1); } if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA L6 @%i= #%i,%i, %s %f-%fHz\t%i/%i %i/%i %i/%i %i/%i \n",(int)(pos+StartOfData),ns,AdcChan,Label,hdr->SampleRate,Fs,k1,K1,k2,K2,k3,K3,k4,K4); pos += Sizes.Rec.Trace+4; // read number of children -- this should be 0 - ALWAYS; K5 = (*(uint32_t*)(hdr->AS.Header+pos-4)); if (K5) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster: Level 4 has some children"); } } // end loop k4 // if sweep is selected, add number of samples to counter if (flagSweepSelected) { if ( hdr->SPR > 0xffffffffffffffffu-SPR) { biosigERROR(hdr,B4C_FORMAT_UNSUPPORTED,"HEKA file has more than 2^32 samples - this is not supported yet"); } hdr->SPR += SPR; } } // end loop k3 } // end loop k2 } // end loop k1 #ifndef NO_BI if (DT) free(DT); #else size_t *BI = (size_t*) DT; // DT is not used anymore, use space for BI #endif DT = NULL; #ifdef WITH_TIMESTAMPCHANNEL { /* define time stamp channel, memory is already allocated above */ CHANNEL_TYPE *hc = hdr->CHANNEL + hdr->NS; hc->GDFTYP = 7; // corresponds to int64_t, gdf_time strcpy(hc->Label,"Timestamp"); hc->Transducer[0]=0; hc->PhysDimCode = 2272; // units: days [d] hc->LeadIdCode = 0; hc->SPR = 1; hc->Cal = ldexp(1.0, -32); hc->Off = 0.0; hc->OnOff = 1; hc->DigMax = ldexp( 1.0, 61); hc->DigMin = 0; hc->PhysMax = hc->DigMax * hc->Cal; hc->PhysMin = hc->DigMin * hc->Cal; hc->TOffset = 0.0; hc->Impedance = NAN; hc->HighPass = NAN; hc->LowPass = NAN; hc->Notch = NAN; hc->XYZ[0] = 0.0; hc->XYZ[1] = 0.0; hc->XYZ[2] = 0.0; hdr->NS++; } #endif hdr->NRec = 1; hdr->AS.bpb = 0; for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; hc->Cal = (hc->PhysMax - hc->PhysMin) / (hc->DigMax - hc->DigMin); hc->Off = hc->PhysMin - hc->DigMin * hc->Cal; #ifndef NO_BI hc->bi = hdr->AS.bpb; #else BI[k] = hdr->AS.bpb; #endif hc->SPR = hdr->SPR; hdr->AS.bpb += hc->SPR * (GDFTYP_BITS[hc->GDFTYP]>>3); // multiplation must not exceed 32 bit limit } if (hdr->AS.B4C_ERRNUM) { #ifdef NO_BI if (BI) free(BI); #endif return; } hdr->ID.Manufacturer.Name = "HEKA/Patchmaster"; /****************************************************************************** SREAD_HEKA void sread_heka(HDRTYPE* hdr, FILE *itx, ... ) { ******************************************************************************/ if (VERBOSE_LEVEL > 7) fprintf(stdout,"HEKA: 400: %"PRIi64" %"PRIi32" %"PRIi64"\n",hdr->NRec, hdr->AS.bpb, hdr->NRec * (size_t)hdr->AS.bpb); size_t sz = hdr->NRec * (size_t)hdr->AS.bpb; if (sz/hdr->NRec < hdr->AS.bpb) { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "memory allocation failed - more than 2GB required but platform supports only 32 bit!"); return; } void* tmpptr = realloc(hdr->AS.rawdata, sz); if (tmpptr!=NULL) hdr->AS.rawdata = (uint8_t*) tmpptr; else { biosigERROR(hdr, B4C_MEMORY_ALLOCATION_FAILED, "memory allocation failed - not enough memory!"); return; } assert(hdr->NRec >= 0); memset(hdr->AS.rawdata, 0xff, hdr->NRec * (size_t)hdr->AS.bpb); // initialize with NAN's #ifdef NO_BI #define _BI (BI[k]) #else #define _BI (hc->bi) #endif /* initialize with NAN's */ for (k=0; kNS; k++) { size_t k1; CHANNEL_TYPE *hc = hdr->CHANNEL+k; switch (hc->GDFTYP) { case 3: for (k1=0; k1SPR; k1++) { *(uint16_t*)(hdr->AS.rawdata + _BI + k1 * 2) = 0x8000; } break; case 5: for (k1=0; k1SPR; k1++) *(uint32_t*)(hdr->AS.rawdata + _BI + k1 * 4) = 0x80000000; break; case 7: for (k1=0; k1SPR; k1++) *(int64_t*)(hdr->AS.rawdata + _BI + k1 * 4) = 0x8000000000000000LL; break; case 16: for (k1=0; k1SPR; k1++) *(float*)(hdr->AS.rawdata + _BI + k1 * 4) = NAN; break; case 17: for (k1=0; k1SPR; k1++) *(double*)(hdr->AS.rawdata + _BI + k1 * 8) = NAN; break; } } #undef _BI char *WAVENAME = NULL; if (itx) { fprintf(itx, "IGOR\r\nX Silent 1\r\n"); const char *fn = strrchr(hdr->FileName,'\\'); if (fn) fn++; else fn = strrchr(hdr->FileName,'/'); if (fn) fn++; else fn = hdr->FileName; size_t len = strspn(fn,"."); WAVENAME = (char*)malloc(strlen(hdr->FileName)+7); if (len) strncpy(WAVENAME, fn, len); else strcpy(WAVENAME, fn); // Flawfinder: ignore } if (VERBOSE_LEVEL>7) hdr2ascii(hdr,stdout,4); /******************************************************************************************************* HEKA: read data blocks *******************************************************************************************************/ uint32_t SPR = 0; pos = StartOfPulse + Sizes.Rec.Root + 4; for (k1=0; k17) fprintf(stdout,"HEKA+L1 @%i=\t%i/%i \n",(int)(pos+StartOfData),k1,K1); pos += Sizes.Rec.Group+4; // read number of children K2 = (*(uint32_t*)(hdr->AS.Header+pos-4)); for (k2=0; k2AS.Header+pos+4); // max 32 bytes Delay.u64 = bswap_64(*(uint64_t*)(hdr->AS.Header+pos+472+176)); if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA+L2 @%i=%s %f\t%i/%i %i/%i \n",(int)(pos+StartOfData),SeLabel,Delay.f64,k1,K1,k2,K2); /* move to reading of data */ pos += Sizes.Rec.Series+4; // read number of children K3 = (*(uint32_t*)(hdr->AS.Header+pos-4)); for (k3=0; k3NS-1]) #else #define _BI (hdr->CHANNEL[hdr->NS-1].bi) #endif gdf_time t = heka2gdftime(*(double*)(hdr->AS.Header+pos+48)); // time of sweep. TODO: this should be taken into account *(int64_t*)(hdr->AS.rawdata + _BI + SPR * 8) = t; #undef _BI #endif // WITH_TIMESTAMPCHANNEL // read sweep char flagSweepSelected = (hdr->AS.SegSel[0]==0 || k1+1==hdr->AS.SegSel[0]) && (hdr->AS.SegSel[1]==0 || k2+1==hdr->AS.SegSel[1]) && (hdr->AS.SegSel[2]==0 || k3+1==hdr->AS.SegSel[2]); if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA+L3 @%i=\t%i/%i %i/%i %i/%i sel=%i\n",(int)(pos+StartOfData),k1,K1,k2,K2,k3,K3,flagSweepSelected); pos += Sizes.Rec.Sweep + 4; // read number of children K4 = (*(uint32_t*)(hdr->AS.Header+pos-4)); size_t DIV=1; for (k4=0; k4AS.Header+pos+36)); uint32_t DataPos = (*(uint32_t*)(hdr->AS.Header+pos+40)); spr = (*(uint32_t*)(hdr->AS.Header+pos+44)); double DataScaler= (*(double*)(hdr->AS.Header+pos+72)); double Toffset = (*(double*)(hdr->AS.Header+pos+80)); // time offset of uint16_t pdc = PhysDimCode((char*)(hdr->AS.Header + pos + 96)); char *physdim = (char*)(hdr->AS.Header + pos + 96); double dT = (*(double*)(hdr->AS.Header+pos+104)); // double XStart = (*(double*)(hdr->AS.Header+pos+112)); // uint16_t XUnits = PhysDimCode((char*)(hdr->AS.Header+pos+120)); double YRange = (*(double*)(hdr->AS.Header+pos+128)); double YOffset = (*(double*)(hdr->AS.Header+pos+136)); // double Bandwidth = (*(double*)(hdr->AS.Header+pos+144)); uint16_t AdcChan = (*(uint16_t*)(hdr->AS.Header+pos+222)); /* double PhysMin = (*(double*)(hdr->AS.Header+pos+224)); double PhysMax = (*(double*)(hdr->AS.Header+pos+232)); */ switch (hdr->AS.Header[pos+70]) { case 0: gdftyp = 3; break; // int16 case 1: gdftyp = 5; break; // int32 case 2: gdftyp = 16; break; // float32 case 3: gdftyp = 17; break; // float64 default: biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster unknown data type is used"); }; if (SWAP) { AdcChan = bswap_16(AdcChan); ns = bswap_32(ns); DataPos = bswap_32(DataPos); spr = bswap_32(spr); // avoid breaking strict-aliasing rules union { double f64; uint64_t u64; } c; c.f64 = dT; c.u64 = bswap_64(c.u64); dT = c.f64; c.f64 = YRange; c.u64 = bswap_64(c.u64); YRange = c.f64; c.f64 = YOffset; c.u64 = bswap_64(c.u64); YOffset = c.f64; /* c.f64 = PhysMax; c.u64 = bswap_64(c.u64); PhysMax = c.f64; c.f64 = PhysMin; c.u64 = bswap_64(c.u64); PhysMin = c.f64; */ c.f64 = Toffset; c.u64 = bswap_64(c.u64); Toffset = c.f64; } double Fs = round(1.0 / dT); DIV = round(hdr->SampleRate / Fs); char *Label = (char*)(hdr->AS.Header+pos+4); for (ns=0; ns < hdr->NS; ns++) { if (!strcmp(hdr->CHANNEL[ns].Label, Label)) break; } CHANNEL_TYPE *hc = hdr->CHANNEL+ns; if (VERBOSE_LEVEL>7) fprintf(stdout,"HEKA+L4 @%i= #%i,%i,%i/%i %s\t%i/%i %i/%i %i/%i %i/%i DIV=%i,%i,%i\n",(int)(pos+StartOfData),ns,AdcChan,spr,SPR,Label,k1,K1,k2,K2,k3,K3,k4,K4,(int)DIV,gdftyp,hc->GDFTYP); if (itx) { uint32_t k5; double Cal = DataScaler; assert(hdr->CHANNEL[ns].Off==0.0); double Off = 0.0; fprintf(itx, "\r\nWAVES %s_%i_%i_%i_%i\r\nBEGIN\r\n", WAVENAME,k1+1,k2+1,k3+1,k4+1); switch (hc->GDFTYP) { case 3: for (k5 = 0; k5 < spr; ++k5) fprintf(itx,"% e\n", (double)*(int16_t*)(hdr->AS.Header + DataPos + k5 * 2) * Cal + Off); break; case 5: for (k5 = 0; k5 < spr; ++k5) fprintf(itx,"% e\n", (double)*(int32_t*)(hdr->AS.Header + DataPos + k5 * 4) * Cal + Off); break; case 16: for (k5 = 0; k5 < spr; ++k5) fprintf(itx,"% e\n", (double)*(float*)(hdr->AS.Header + DataPos + k5 * 4) * Cal + Off); break; case 17: for (k5 = 0; k5 < spr; ++k5) fprintf(itx,"% e\n", *(double*)(hdr->AS.Header + DataPos + k5 * 8) * Cal + Off); break; } fprintf(itx, "END\r\nX SetScale/P x, %g, %g, \"s\", %s_%i_%i_%i_%i\r\n", Toffset, dT, WAVENAME, k1+1,k2+1,k3+1,k4+1); fprintf(itx, "X SetScale y,0,0,\"%s\", %s_%i_%i_%i_%i\n", physdim, WAVENAME, k1+1,k2+1,k3+1,k4+1); } #ifdef NO_BI #define _BI (BI[ns]) #else #define _BI (hc->bi) #endif // no need to check byte order because File.Endian is set and endian conversion is done in sread if ((DIV==1) && (gdftyp == hc->GDFTYP)) { uint16_t sz = GDFTYP_BITS[hc->GDFTYP]>>3; memcpy(hdr->AS.rawdata + _BI + SPR * sz, hdr->AS.Header + DataPos, spr * sz); } else if (1) { double Cal = DataScaler * PhysDimScale(pdc) / hdr->CHANNEL[ns].Cal; assert(Cal==1.0 || hc->GDFTYP > 15); // when scaling changes, target data type is always float/double -> see above uint32_t k5,k6; switch (gdftyp) { case 3: switch (hc->GDFTYP) { case 3: for (k5 = 0; k5 < spr; ++k5) { int16_t ival = *(int16_t*)(hdr->AS.Header + DataPos + k5 * 2); for (k6 = 0; k6 < DIV; ++k6) *(int16_t*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 2) = ival; } break; case 5: for (k5 = 0; k5 < spr; ++k5) { int16_t ival = *(int16_t*)(hdr->AS.Header + DataPos + k5 * 2); for (k6 = 0; k6 < DIV; ++k6) *(int32_t*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 4) = (int32_t)ival; } break; case 16: for (k5 = 0; k5 < spr; ++k5) { int16_t ival = *(int16_t*)(hdr->AS.Header + DataPos + k5 * 2); for (k6 = 0; k6 < DIV; ++k6) *(float*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 4) = (float)ival * Cal; } break; case 17: for (k5 = 0; k5 < spr; ++k5) { int16_t ival = *(int16_t*)(hdr->AS.Header + DataPos + k5 * 2); for (k6 = 0; k6 < DIV; ++k6) *(double*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 8) = (double)ival * Cal; } break; } break; case 5: switch (hc->GDFTYP) { case 5: for (k5 = 0; k5 < spr; ++k5) { int32_t ival = *(int32_t*)(hdr->AS.Header + DataPos + k5 * 4); for (k6 = 0; k6 < DIV; ++k6) *(int32_t*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 4) = ival; } break; case 16: for (k5 = 0; k5 < spr; ++k5) { int32_t ival = *(int32_t*)(hdr->AS.Header + DataPos + k5 * 4); for (k6 = 0; k6 < DIV; ++k6) *(float*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 4) = (float)ival * Cal; } break; case 17: for (k5 = 0; k5 < spr; ++k5) { int32_t ival = *(int32_t*)(hdr->AS.Header + DataPos + k5 * 4); for (k6 = 0; k6 < DIV; ++k6) *(double*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 8) = (double)ival * Cal; } break; } break; case 16: switch (hc->GDFTYP) { case 16: for (k5 = 0; k5 < spr; ++k5) { float ival = *(float*)(hdr->AS.Header + DataPos + k5 * 4); for (k6 = 0; k6 < DIV; ++k6) *(float*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 4) = ival * Cal; } break; case 17: for (k5 = 0; k5 < spr; ++k5) { float ival = *(float*)(hdr->AS.Header + DataPos + k5 * 4); for (k6 = 0; k6 < DIV; ++k6) *(double*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 8) = (double)ival * Cal; } break; } break; case 17: switch (hc->GDFTYP) { case 17: for (k5 = 0; k5 < spr; ++k5) { double ival = *(double*)(hdr->AS.Header + DataPos + k5 * 8); for (k6 = 0; k6 < DIV; ++k6) *(double*)(hdr->AS.rawdata + _BI + (SPR + k5*DIV + k6) * 8) = ival * Cal; } break; } break; } } #undef _BI pos += Sizes.Rec.Trace+4; } if (flagSweepSelected) SPR += spr * DIV; } } } #ifdef NO_BI if (BI) free(BI); #endif hdr->AS.first = 0; hdr->AS.length = hdr->NRec; free(hdr->AS.Header); hdr->AS.Header = NULL; if (VERBOSE_LEVEL>7) fprintf(stdout,"End of SOPEN_HEKA\n"); } else { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Heka/Patchmaster format has unsupported version number"); } } #ifdef __cplusplus } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/t210/sopen_scp_read.c0000664000175000017500000016435113240263033021274 00000000000000/* Copyright (C) 2005-2018 Alois Schloegl Copyright (C) 2011 Stoyan Mihaylov This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. */ // #define WITHOUT_SCP_DECODE // use SCP-DECODE if needed, Bimodal, reference beat /* the experimental version needs a few more thinks: - Bimodal and RefBeat decoding do not work yet - validation and testing */ #include #include #include #include #include #if !defined(__APPLE__) && defined (_LIBICONV_H) #define iconv libiconv #define iconv_open libiconv_open #define iconv_close libiconv_close #endif #include "../biosig-dev.h" #define min(a,b) (((a) < (b)) ? (a) : (b)) #include "structures.h" static const uint8_t _NUM_SECTION = 20; //consider first 19 sections of SCP static bool add_filter = true; // additional filtering gives better shape, but use with care #ifdef __cplusplus extern "C" { #endif #ifndef WITHOUT_SCP_DECODE int scp_decode(HDRTYPE* hdr, struct pointer_section *section, struct DATA_DECODE*, struct DATA_RECORD*, struct DATA_INFO*, bool ); void sopen_SCP_clean(struct DATA_DECODE*, struct DATA_RECORD*, struct DATA_INFO*); #endif // Huffman Tables uint16_t NHT; /* number of Huffman tables */ typedef struct table_t { uint8_t PrefixLength; uint8_t CodeLength; uint8_t TableModeSwitch; int16_t BaseValue; uint32_t BaseCode; } table_t; typedef struct huffman_t { uint16_t NCT; /* number of Code structures in Table #1 */ table_t *Table; } huffman_t; huffman_t *Huffman; typedef struct htree_t { struct htree_t* child0; struct htree_t* child1; uint16_t idxTable; } htree_t; htree_t **HTrees; table_t DefaultTable[19] = { { 1, 1, 1, 0, 0 }, { 3, 3, 1, 1, 1 }, { 3, 3, 1,-1, 5 }, { 4, 4, 1, 2, 3 }, { 4, 4, 1,-2, 11}, { 5, 5, 1, 3, 7 }, { 5, 5, 1,-3, 23}, { 6, 6, 1, 4, 15}, { 6, 6, 1,-4, 47}, { 7, 7, 1, 5, 31}, { 7, 7, 1,-5, 95}, { 8, 8, 1, 6, 63}, { 8, 8, 1,-6, 191}, { 9, 9, 1, 7, 127}, { 9, 9, 1,-7, 383}, {10, 10, 1, 8, 255}, {10, 10, 1,-8, 767}, {18, 10, 1, 0, 511}, {26, 10, 1, 0, 1023} }; /* This structure defines the fields used for "Annotated ECG" */ typedef struct en1064_t { char* test; /* test field for annotated ECG */ float diastolicBloodPressure; float systolicBloodPressure; char* MedicationDrugs; char* ReferringPhysician; char* LatestConfirmingPhysician; char* Diagnosis; uint8_t EmergencyLevel; /* 0: routine 1-10: increased emergency level */ float HeartRate; float P_wave[2]; /* start and end */ float QRS_wave[2]; /* start and end */ float T_wave[2]; /* start and end */ float P_QRS_T_axes[3]; /***** SCP only fields *****/ struct { uint8_t HUFFMAN; uint8_t REF_BEAT; uint8_t DIFF;// OBSOLETE uint8_t BIMODAL;// OBSOLETE } FLAG; struct { //uint8_t tag14[41],tag15[41]; struct { uint16_t INST_NUMBER; /* tag 14, byte 1-2 */ uint16_t DEPT_NUMBER; /* tag 14, byte 3-4 */ uint16_t DEVICE_ID; /* tag 14, byte 5-6 */ uint8_t DeviceType; /* tag 14, byte 7: 0: Cart, 1: System (or Host) */ uint8_t MANUF_CODE; /* tag 14, byte 8 (MANUF_CODE has to be 255) */ char* MOD_DESC; /* tag 14, byte 9 (MOD_DESC has to be "Cart1") */ uint8_t VERSION; /* tag 14, byte 15 (VERSION has to be 20) */ uint8_t PROT_COMP_LEVEL; /* tag 14, byte 16 (PROT_COMP_LEVEL has to be 0xA0 => level II) */ uint8_t LANG_SUPP_CODE; /* tag 14, byte 17 (LANG_SUPP_CODE has to be 0x00 => Ascii only, latin and 1-byte code) */ uint8_t ECG_CAP_DEV; /* tag 14, byte 18 (ECG_CAP_DEV has to be 0xD0 => Acquire, (No Analysis), Print and Store) */ uint8_t MAINS_FREQ; /* tag 14, byte 19 (MAINS_FREQ has to be 0: unspecified, 1: 50 Hz, 2: 60Hz) */ char reserved[22]; /* char[35-19] reserved; */ char* ANAL_PROG_REV_NUM; char* SERIAL_NUMBER_ACQ_DEV; char* ACQ_DEV_SYS_SW_ID; char* ACQ_DEV_SCP_SW; /* tag 14, byte 38 (SCP_IMPL_SW has to be "OpenECG XML-SCP 1.00") */ char* ACQ_DEV_MANUF; /* tag 14, byte 38 (ACQ_DEV_MANUF has to be "Manufacturer") */ } Tag14, Tag15; } Section1; struct { } Section2; struct { uint8_t NS, flags; struct { uint32_t start; uint32_t end; // uint8_t id; } *lead; } Section3; struct { uint16_t len_ms, fiducial_sample, N; uint32_t SPR; struct { uint16_t btyp; uint32_t SB; uint32_t fcM; uint32_t SE; uint32_t QB; uint32_t QE; } *beat; } Section4; struct { size_t StartPtr; size_t Length; uint16_t AVM, dT_us; uint8_t DIFF; //diff: see FLAG uint16_t *inlen; int32_t *datablock; } Section5; struct { size_t StartPtr; size_t Length; uint16_t AVM, dT_us; uint8_t DIFF, BIMODAL; //diff, bimodal: see FLAG int32_t *datablock; } Section6; } en1064_t; en1064_t en1064; /* new node in Huffman tree */ htree_t* newNode() { htree_t* T = (htree_t*) malloc(sizeof(htree_t)); T->child0 = NULL; T->child1 = NULL; T->idxTable = 0; return(T); } /* check Huffman tree */ int checkTree(htree_t *T) { int v,v1,v2,v3; v1 = (T->child0 == NULL) && (T->child0 == NULL) && (T->idxTable > 0); v2 = (T->idxTable == 0) && (T->child0 != NULL) && checkTree(T->child0); v3 = (T->idxTable == 0) && (T->child1 != NULL) && checkTree(T->child1); v = v1 || v2 || v3; #ifndef ANDROID if (!v) fprintf(stderr,"Warning: Invalid Node in Huffman Tree: %i %p %p\n",T->idxTable,T->child0,T->child1); #endif return(v); } /* convert Huffman Table into a Huffman tree */ htree_t* makeTree(huffman_t HT) { uint16_t k1,k2; htree_t* T = newNode(); htree_t* node; for (k1=0; k1>=1) { if (bc & 0x00000001) { if (node->child1==NULL) node->child1 = newNode(); node = node->child1; } else { if (node->child0==NULL) node->child0 = newNode(); node = node->child0; } } node->idxTable = k1+1; } return(T); } /* get rid of Huffman tree */ void freeTree(htree_t* T) { if (T->child0 != NULL) freeTree(T->child0); if (T->child1 != NULL) freeTree(T->child1); free(T); } int DecodeHuffman(htree_t *HTrees[], huffman_t *HuffmanTables, uint8_t* indata, size_t inlen, int32_t* outdata, size_t outlen) { uint16_t ActualTable = 0; htree_t *node; size_t k1, k2, i; uint32_t acc; int8_t dlen,k3,r; k1=0, k2=0; node = HTrees[ActualTable]; r = 0; i = 0; while ((k1 < inlen*8) && (k2 < outlen)) { r = k1 % 8; i = k1 / 8; if (!node->idxTable) { if (indata[i] & (1<<(7-r))) { if (node->child1 != NULL) node = node->child1; else { return(-1); } } else { if (node->child0 != NULL) node = node->child0; else { return(-1); } } ++k1; } r = k1 % 8; i = k1 / 8; if (node->idxTable) { // leaf of tree reached table_t TableEntry = HuffmanTables[ActualTable].Table[node->idxTable - 1]; dlen = TableEntry.PrefixLength - TableEntry.CodeLength; if (!TableEntry.TableModeSwitch) // switch Huffman Code ActualTable = TableEntry.BaseValue; else if (dlen) { // no compression acc = 0; //(uint32_t)(indata[i]%(1<> (k3*8 - r - dlen)) & ((1L << dlen) - 1L) ; if (outdata[k2] >= (1 << (dlen-1))) outdata[k2] -= 1 << dlen; k1 += dlen; ++k2; } else { // lookup Huffman Table outdata[k2++] = TableEntry.BaseValue; } // reset node to root node = HTrees[ActualTable]; } } return(0); }; void deallocEN1064(en1064_t en1064) { /* free allocated memory */ if (en1064.FLAG.HUFFMAN) { size_t k1=0; for (; k1aECG)).Section1.Tag14.LANG_SUPP_CODE; iconv_t cd; if ((LanguageSupportCode & 0x01) == 0) cd = iconv_open ("UTF-8", "ASCII"); else if ((LanguageSupportCode & 0x03) == 1) cd = iconv_open ("UTF-8", "ISO8859-1"); else if (LanguageSupportCode == 0x03) cd = iconv_open ("UTF-8", "ISO8859-2"); else if (LanguageSupportCode == 0x0b) cd = iconv_open ("UTF-8", "ISO8859-4"); else if (LanguageSupportCode == 0x13) cd = iconv_open ("UTF-8", "ISO8859-5"); else if (LanguageSupportCode == 0x1b) cd = iconv_open ("UTF-8", "ISO8859-6"); else if (LanguageSupportCode == 0x23) cd = iconv_open ("UTF-8", "ISO8859-7"); else if (LanguageSupportCode == 0x2b) cd = iconv_open ("UTF-8", "ISO8859-8"); else if (LanguageSupportCode == 0x33) cd = iconv_open ("UTF-8", "ISO8859-11"); else if (LanguageSupportCode == 0x3b) cd = iconv_open ("UTF-8", "ISO8859-15"); else if (LanguageSupportCode == 0x07) cd = iconv_open ("UTF-8", "ISO-10646"); else if (LanguageSupportCode == 0x0f) // JIS X 0201-1976 (Japanese) - does not match exactly cd = iconv_open ("UTF-8", "EUC-JISX0213"); else if (LanguageSupportCode == 0x17) // JIS X 0208-1997 (Japanese) - does not match exactly cd = iconv_open ("UTF-8", "EUC-JISX0213"); else if (LanguageSupportCode == 0x1f) // JIS X 0212-1990 (Japanese) - does not match exactly cd = iconv_open ("UTF-8", "EUC-JISX0213"); else if (LanguageSupportCode == 0x27) cd = iconv_open ("UTF-8", "GB2312"); else if (LanguageSupportCode == 0x37) cd = iconv_open ("UTF-8", "UTF-8"); else if (LanguageSupportCode == 0x2F) // KS C5601-1987 (Korean) - does not match exactly cd = iconv_open ("UTF-8", "EUC-KR"); else { biosigERROR(hdr, B4C_CHAR_ENCODING_UNSUPPORTED, "SCP character encoding not supported"); return -1; } errno = 0; // reset error status int errsv; if (input[inbytesleft-1]==0) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(%i) decode_scp_text: input=<%s>%i,%i\n", __FILE__, __LINE__, input,(int)inbytesleft,(int)outbytesleft); // input string is 0-terminated iconv(cd, &input, &inbytesleft, &output, &outbytesleft); errsv = errno; } else if (inbytesleft < 64) { /* In case the string is not 0-terminated, * the string is copied to make it 0-terminated */ char buf[64]; char *tmpstr=buf; memcpy(buf,input,inbytesleft); tmpstr[inbytesleft++]=0; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(%i) decode_scp_text: input=<%s>%i,%i\n", __FILE__, __LINE__, input,(int)inbytesleft,(int)outbytesleft); iconv(cd, &tmpstr, &inbytesleft, &output, &outbytesleft); errsv = errno; } else { /* In case the string is not 0-terminated, * the string is copied to make it 0-terminated */ char *tmpstr=malloc(inbytesleft+1); char *bakstr=tmpstr; strncpy(tmpstr,(char*)input,inbytesleft); tmpstr[inbytesleft]=0; inbytesleft++; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(%i) decode_scp_text: input=<%s>%i,%i\n", __FILE__, __LINE__, tmpstr,(int)inbytesleft,(int)outbytesleft); iconv(cd, &tmpstr, &inbytesleft, &output, &outbytesleft); errsv = errno; free(bakstr); } if (errsv) biosigERROR(hdr, B4C_CHAR_ENCODING_UNSUPPORTED, "conversion of SCP text failed"); #ifdef DEBUG if (VERBOSE_LEVEL>7) fprintf(stdout,"%s(%i) decode_scp_text: [e%i ] output=<%s>%i,%i\n", __FILE__, __LINE__, errsv,start,inbytesleft,outbytesleft); #endif return (iconv_close(cd) || errsv); #else // if neither _ICONV_H nor _LIBCONV_H are defined if ((LanguageSupportCode & 0xFE) != 0) { biosigERROR(hdr, B4C_CHAR_ENCODING_UNSUPPORTED, "SCP character encoding not supported"); } else // ASCII encoding is UTF-8 compatible - no convesion needed strncpy(output, input, min(inbytesleft, outbytesleft+1)); return(LanguageSupportCode & 0xFE); #endif } int sopen_SCP_read(HDRTYPE* hdr) { /* this function is a stub or placeholder and need to be defined in order to be useful. It will be called by the function SOPEN in "biosig.c" Input: char* Header // contains the file content Output: HDRTYPE *hdr // defines the HDR structure accoring to "biosig.h" */ uint8_t* ptr; // pointer to memory mapping of the file layout uint8_t* PtrCurSect; // point to current section uint8_t* Ptr2datablock=NULL; // pointer to data block int32_t* data=NULL; // point to rawdata uint16_t curSect=0; // current section uint32_t len; uint16_t crc; uint32_t i,k1,k2; size_t curSectPos; size_t sectionStart; int NSections = 12; uint8_t tag; float HighPass=0, LowPass=INFINITY, Notch=-1; // filter settings uint16_t Cal5=0, Cal6=0, Cal0=0; // scaling coefficients uint16_t dT_us = 1000; // sampling interval in microseconds /* Try direct conversion SCP->HDR to internal data structure + whole data is loaded once, then no further File I/O is needed. - currently Huffman and Bimodal compression is not supported. */ struct aecg* aECG; en1064.Section5.inlen = NULL; en1064.Section5.datablock = NULL; en1064.Section3.lead = NULL; en1064.Section4.beat = NULL; if (hdr->aECG == NULL) { hdr->aECG = malloc(sizeof(struct aecg)); aECG = (struct aecg*)hdr->aECG; aECG->diastolicBloodPressure=0.0; aECG->systolicBloodPressure=0.0; aECG->MedicationDrugs = NULL; aECG->ReferringPhysician= NULL; aECG->LatestConfirmingPhysician=NULL; aECG->Diagnosis=NULL; aECG->EmergencyLevel=0; } else aECG = (struct aecg*)hdr->aECG; aECG->Section1.Tag14.VERSION = 0; // acquiring.protocol_revision_number aECG->Section1.Tag15.VERSION = 0; // analyzing.protocol_revision_number aECG->Section1.Tag14.LANG_SUPP_CODE = 0; aECG->FLAG.HUFFMAN = 0; aECG->FLAG.DIFF = 0; aECG->FLAG.REF_BEAT = 0; aECG->FLAG.BIMODAL = 0; #if (BIOSIG_VERSION < 10500) aECG->Section8.NumberOfStatements = 0; aECG->Section8.Statements = NULL; aECG->Section11.NumberOfStatements = 0; aECG->Section11.Statements = NULL; #endif en1064.FLAG.HUFFMAN = 0; en1064.FLAG.DIFF = 0; en1064.FLAG.REF_BEAT = 0; en1064.FLAG.BIMODAL = 0; en1064.Section4.len_ms = 0; struct pointer_section section[_NUM_SECTION]; #ifndef WITHOUT_SCP_DECODE struct DATA_DECODE decode; struct DATA_RECORD record; struct DATA_INFO textual; bool AS_DECODE = 0; decode.length_BdR0 = NULL; decode.samples_BdR0= NULL; decode.length_Res = NULL; decode.samples_Res = NULL; decode.t_Huffman=NULL; decode.flag_Huffman=NULL; decode.data_lead=NULL; decode.data_protected=NULL; decode.data_subtraction=NULL; decode.length_BdR0=NULL; decode.samples_BdR0=NULL; decode.Median=NULL; decode.length_Res=NULL; decode.samples_Res=NULL; decode.Residual=NULL; decode.Reconstructed=NULL; //variables inizialization decode.flag_lead.number=0; decode.flag_lead.subtraction=0; decode.flag_lead.all_simultaneously=0; decode.flag_lead.number_simultaneously=0; decode.flag_BdR0.length=0; decode.flag_BdR0.fcM=0; decode.flag_BdR0.AVM=0; decode.flag_BdR0.STM=0; decode.flag_BdR0.number_samples=0; decode.flag_BdR0.encoding=0; decode.flag_Res.AVM=0; decode.flag_Res.STM=0; decode.flag_Res.number=0; decode.flag_Res.number_samples=0; decode.flag_Res.encoding=0; decode.flag_Res.bimodal=0; decode.flag_Res.decimation_factor=0; #endif ptr = hdr->AS.Header; hdr->NRec = 0; sectionStart = 6; PtrCurSect = ptr+sectionStart; /**** SECTION 0 ****/ len = leu32p(PtrCurSect+4); NSections = min((len-16)/10,_NUM_SECTION); if (memcmp(ptr+16, "SCPECG\0\0", 8)) { fprintf(stderr,"Warning SOPEN (SCP): Bytes 11-16 of Section 0 do not contain SCPECG - this violates ISO/DIS 11073-91064 Section 5.3.2.\n" ); } section[0].ID = 0; section[0].length = len; section[0].index = 6+16; int K; for (K=1; K<_NUM_SECTION; K++) { section[K].ID = -1; section[K].length = 0; section[K].index = 0; } for (K=1; K= 0) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "SCP Section must not be defined twice"); return -1; } section[curSect].ID = curSect; section[curSect].length = leu32p(ptr+6+16+K*10+2); section[curSect].index = leu32p(ptr+6+16+K*10+6)-1; } } if (section[1].length) { /**** identify language support code - scan through section 1 for tag 14, byte 17 ****/ K = 1; curSect = section[K].ID; len = section[K].length; sectionStart = section[K].index; PtrCurSect = ptr+sectionStart; crc = leu16p(PtrCurSect); /* uint16_t tmpcrc = CRCEvaluate((uint8_t*)(PtrCurSect+2),len-2); uint8_t versionSection = *(ptr+sectionStart+8); uint8_t versionProtocol = *(ptr+sectionStart+9); */ // future versions might not need to do this, because language encoding is fixed (i.e. known). uint32_t len1; curSectPos = 16; while (curSectPos<=len) { tag = *(PtrCurSect+curSectPos); len1 = leu16p(PtrCurSect+curSectPos+1); curSectPos += 3; if (curSectPos+len1 > len) break; if (tag==14) { aECG->Section1.Tag14.LANG_SUPP_CODE = *(PtrCurSect+curSectPos+16); // tag 14, byte 16 (LANG_SUPP_CODE has to be 0x00 => Ascii only, if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) Language Support Code is 0x%02x\n",__FILE__,__LINE__,aECG->Section1.Tag14.LANG_SUPP_CODE); break; } curSectPos += len1; } } for (K=1; K7) fprintf(stdout,"%s (line %i): SCP Section %i %i len=%i secStart=%i HeaderLength=%i\n",__FILE__,__LINE__,K,curSect,len,(int)sectionStart,hdr->HeadLen); if (len==0) continue; /***** empty section *****/ if (sectionStart + len > hdr->HeadLen) { biosigERROR(hdr, B4C_INCOMPLETE_FILE, "%s (line %i): SOPEN(SCP-READ): File incomplete - Section length + start of section is more then total length of header"); break; } PtrCurSect = ptr+sectionStart; crc = leu16p(PtrCurSect); uint16_t tmpcrc = CRCEvaluate((uint8_t*)(PtrCurSect+2),len-2); uint8_t versionSection = *(ptr+sectionStart+8); uint8_t versionProtocol = *(ptr+sectionStart+9); #ifndef ANDROID if ((crc != 0xffff) && (crc != tmpcrc)) fprintf(stderr,"Warning SOPEN(SCP-READ): faulty CRC in section %i: crc=%x, %x\n" ,curSect,crc,tmpcrc); if (curSect != leu16p(PtrCurSect+2)) fprintf(stderr,"Warning SOPEN(SCP-READ): Current Section No does not match field in sections (%i %i)\n",curSect,leu16p(PtrCurSect+2)); if (len != leu32p(PtrCurSect+4)) fprintf(stderr,"Warning SOPEN(SCP-READ): length field in pointer section (%i) does not match length field in sections (%i %i)\n",K,len,leu32p(PtrCurSect+4)); if ((versionSection != 13) && (versionSection != 20) && (versionSection != (uint8_t)(hdr->Version*10))) fprintf(stderr,"Warning SOPEN(SCP-READ): Version of section %i is not 13 or 20 but %i. This is not tested.\n", curSect, versionSection); if ((versionProtocol != 13) && (versionProtocol != 20) && (versionProtocol != (uint8_t)(hdr->Version*10))) fprintf(stderr,"Warning SOPEN(SCP-READ): Version of Protocol is not 13 or 20 but %i. This is not tested.\n", versionProtocol); #endif if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): SCP Section %i %i len=%i secStart=%i version=%i %i \n",__FILE__,__LINE__, K, curSect, len, (int)sectionStart,(int)versionSection, (int)versionProtocol); curSectPos = 16; /**** SECTION 0: POINTERS TO DATA AREAS IN THE RECORD ****/ if (curSect==0) { } /**** SECTION 1: HEADER INFORMATION - PATIENT DATA/ECG ACQUISITION DATA ****/ else if (curSect==1) { struct tm t0,t1; t0.tm_year = 0; t0.tm_mon = 0; t0.tm_mday = 0; t0.tm_hour = 0; t0.tm_min = 0; t0.tm_sec = 0; t0.tm_isdst= -1; // daylight savings time - unknown hdr->T0 = 0; hdr->Patient.Birthday = 0; uint32_t len1; while ((curSectPos<=len) && (*(PtrCurSect+curSectPos) < 255)) { tag = *(PtrCurSect+curSectPos); len1 = leu16p(PtrCurSect+curSectPos+1); if (VERBOSE_LEVEL > 7) fprintf(stdout,"SCP(r): Section 1 Tag %i Len %i\n",tag,len1); curSectPos += 3; if (curSectPos+len1 > len) { #ifndef ANDROID fprintf(stdout,"Warning SCP(read): section 1 corrupted (exceeds file length)\n"); #endif break; } if (tag==0) { // convert to UTF8 if (!hdr->FLAG.ANONYMOUS) { // Last name or entire name if no first name is provided decode_scp_text(hdr, len1, (char*)PtrCurSect+curSectPos, MAX_LENGTH_NAME, hdr->Patient.Name, versionSection); } } else if (tag==1) { if (!hdr->FLAG.ANONYMOUS) { // First name size_t len = strlen(hdr->Patient.Name); if (len+3 < MAX_LENGTH_NAME) { // unit separator ascii(31), 0x1f is used for separating name componentes strcat(hdr->Patient.Name,"\x1f"); len+=1; decode_scp_text(hdr, len1, (char*)PtrCurSect+curSectPos, MAX_LENGTH_NAME-len+1, hdr->Patient.Name+len, versionSection); } } } else if (tag==2) { #ifndef ANDROID if (len1 > MAX_LENGTH_PID) { fprintf(stdout,"Warning SCP(read): length of Patient Id (section1 tag2) exceeds %i>%i\n",len1,MAX_LENGTH_PID); } #endif // convert to UTF8 decode_scp_text(hdr, len1, (char*)PtrCurSect+curSectPos, MAX_LENGTH_PID, hdr->Patient.Id, versionSection); hdr->Patient.Id[MAX_LENGTH_PID] = 0; if (!strcmp(hdr->Patient.Id,"UNKNOWN")) hdr->Patient.Id[0] = 0; } else if (tag==3) { if (!hdr->FLAG.ANONYMOUS) { // Second last name size_t len = strlen(hdr->Patient.Name); if (len+2 < MAX_LENGTH_NAME) { // unit separator ascii(31), 0x1f is used for separating name componentes strcat(hdr->Patient.Name,"\x1f"); len+=1; decode_scp_text(hdr, len1, (char*)PtrCurSect+curSectPos, MAX_LENGTH_NAME-len+1, hdr->Patient.Name+len, versionSection); } } } else if (tag==4) { } else if (tag==5) { t1.tm_year = leu16p(PtrCurSect+curSectPos)-1900; t1.tm_mon = *(PtrCurSect+curSectPos+2)-1; t1.tm_mday = *(PtrCurSect+curSectPos+3); t1.tm_hour = 12; t1.tm_min = 0; t1.tm_sec = 0; t1.tm_isdst= -1; // daylight saving time: unknown // t1.tm_gmtoff = 0; hdr->Patient.Birthday = tm_time2gdf_time(&t1); } else if (tag==6) { hdr->Patient.Height = leu16p(PtrCurSect+curSectPos); } else if (tag==7) { hdr->Patient.Weight = leu16p(PtrCurSect+curSectPos); } else if (tag==8) { hdr->Patient.Sex = *(PtrCurSect+curSectPos); if (hdr->Patient.Sex>2) hdr->Patient.Sex = 0; } else if (tag==9) { } else if (tag==10) { // TODO: convert to UTF8 } else if (tag==11) { aECG->systolicBloodPressure = leu16p(PtrCurSect+curSectPos); } else if (tag==12) { aECG->diastolicBloodPressure = leu16p(PtrCurSect+curSectPos); } else if (tag==13) { // TODO: convert to UTF8 aECG->Diagnosis = (char*)(PtrCurSect+curSectPos); } else if (tag==14) { /* Acquiring Device ID Number */ // TODO: convert to UTF8 #ifndef ANDROID if (len1>85) fprintf(stderr,"Warning SCP(r): length of tag14 %i>40\n",len1); #endif memcpy(hdr->ID.Manufacturer._field,(char*)PtrCurSect+curSectPos,min(len1,MAX_LENGTH_MANUF)); hdr->ID.Manufacturer._field[min(len1,MAX_LENGTH_MANUF)] = 0; hdr->ID.Manufacturer.Model = hdr->ID.Manufacturer._field+8; hdr->ID.Manufacturer.Version = hdr->ID.Manufacturer._field+36; int tmp = strlen(hdr->ID.Manufacturer.Version)+1; hdr->ID.Manufacturer.SerialNumber = hdr->ID.Manufacturer.Version+tmp; tmp += strlen(hdr->ID.Manufacturer.Version+tmp)+1; // skip SW ID tmp += strlen(hdr->ID.Manufacturer.Version+tmp)+1; // skip SW tmp += strlen(hdr->ID.Manufacturer.Version+tmp)+1; // skip SW hdr->ID.Manufacturer.Name = hdr->ID.Manufacturer.Version+tmp; /* might become obsolete */ //memcpy(hdr->aECG->Section1.tag14,PtrCurSect+curSectPos,40); //hdr->VERSION = *(PtrCurSect+curSectPos+14)/10.0; // tag 14, byte 15 aECG->Section1.Tag14.INST_NUMBER = leu16p(PtrCurSect+curSectPos); aECG->Section1.Tag14.DEPT_NUMBER = leu16p(PtrCurSect+curSectPos+2); aECG->Section1.Tag14.DEVICE_ID = leu16p(PtrCurSect+curSectPos+4); aECG->Section1.Tag14.DeviceType = *(PtrCurSect+curSectPos+ 6); aECG->Section1.Tag14.MANUF_CODE = *(PtrCurSect+curSectPos+ 7); // tag 14, byte 7 (MANUF_CODE has to be 255) const char *MANUFACTURER[] = { "unknown","Burdick","Cambridge", "Compumed","Datamed","Fukuda","Hewlett-Packard", "Marquette Electronics","Mortara Instruments", "Nihon Kohden","Okin","Quinton","Siemens","Spacelabs", "Telemed","Hellige","ESA-OTE","Schiller", "Picker-Schwarzer","et medical devices", "Zwönitz",NULL}; if (!strlen(hdr->ID.Manufacturer.Name)) { if (aECG->Section1.Tag14.MANUF_CODE < 21) hdr->ID.Manufacturer.Name = MANUFACTURER[aECG->Section1.Tag14.MANUF_CODE]; else fprintf(stderr,"Warning SOPEN(SCP): unknown manufacturer code\n"); } aECG->Section1.Tag14.MOD_DESC = (char*)(PtrCurSect+curSectPos+8); aECG->Section1.Tag14.VERSION = *(PtrCurSect+curSectPos+14); aECG->Section1.Tag14.PROT_COMP_LEVEL = *(PtrCurSect+curSectPos+15); // tag 14, byte 15 (PROT_COMP_LEVEL has to be 0xA0 => level II) aECG->Section1.Tag14.LANG_SUPP_CODE = *(PtrCurSect+curSectPos+16); // tag 14, byte 16 (LANG_SUPP_CODE has to be 0x00 => Ascii only, latin and 1-byte code) aECG->Section1.Tag14.ECG_CAP_DEV = *(PtrCurSect+curSectPos+17); // tag 14, byte 17 (ECG_CAP_DEV has to be 0xD0 => Acquire, (No Analysis), Print and Store) aECG->Section1.Tag14.MAINS_FREQ = *(PtrCurSect+curSectPos+18); // tag 14, byte 18 (MAINS_FREQ has to be 0: unspecified, 1: 50 Hz, 2: 60Hz) aECG->Section1.Tag14.ANAL_PROG_REV_NUM = (char*)(PtrCurSect+curSectPos+36); tmp = strlen((char*)(PtrCurSect+curSectPos+36)); aECG->Section1.Tag14.SERIAL_NUMBER_ACQ_DEV = (char*)(PtrCurSect+curSectPos+36+tmp+1); tmp += strlen((char*)(PtrCurSect+curSectPos+36+tmp+1)); aECG->Section1.Tag14.ACQ_DEV_SYS_SW_ID = (char*)(PtrCurSect+curSectPos+36+tmp+1); tmp += strlen((char*)(PtrCurSect+curSectPos+36+tmp+1)); aECG->Section1.Tag14.ACQ_DEV_SCP_SW = (char*)(PtrCurSect+curSectPos+36+tmp+1); // tag 14, byte 38 (SCP_IMPL_SW has to be "OpenECG XML-SCP 1.00") tmp += strlen((char*)(PtrCurSect+curSectPos+36+tmp+1)); aECG->Section1.Tag14.ACQ_DEV_MANUF = (char*)(PtrCurSect+curSectPos+36+tmp+1); // tag 14, byte 38 (ACQ_DEV_MANUF has to be "Manufacturer") if (aECG->Section1.Tag14.LANG_SUPP_CODE & 0xFE) { #if _ICONV_H fprintf(stdout, "Warning SCP-ECG: decoding of text strings not ready yet"); #else biosigERROR(hdr, B4C_CHAR_ENCODING_UNSUPPORTED, "SCP-SCP: Non-ASCII text string language - conversion not supported"); #endif } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): Version %i\n",__FILE__,__LINE__,aECG->Section1.Tag14.VERSION); } else if (tag==15) { /* Analyzing Device ID Number */ // TODO: convert to UTF8 //memcpy(hdr->aECG->Section1.tag15,PtrCurSect+curSectPos,40); aECG->Section1.Tag15.VERSION = *(PtrCurSect+curSectPos+14); } else if (tag==16) { /* Acquiring Institution Description */ size_t outlen = len1*2+1; hdr->ID.Hospital = malloc(outlen); if (hdr->ID.Hospital) { // convert to UTF8 decode_scp_text(hdr, len1, (char*)PtrCurSect+curSectPos, outlen, hdr->ID.Hospital, versionSection); hdr->ID.Hospital[outlen] = 0; } } else if (tag==17) { /* Analyzing Institution Description */ // TODO: convert to UTF8 } else if (tag==18) { /* Acquiring Institution Description */ // TODO: convert to UTF8 } else if (tag==19) { /* Analyzing Institution Description */ // TODO: convert to UTF8 } else if (tag==20) { // TODO: convert to UTF8 aECG->ReferringPhysician = (char*)(PtrCurSect+curSectPos); } else if (tag==21) { // TODO: convert to UTF8 aECG->MedicationDrugs = (char*)(PtrCurSect+curSectPos); } else if (tag==22) { size_t outlen = len1*2+1; hdr->ID.Technician = malloc(outlen); if (hdr->ID.Technician) { // convert to UTF8 decode_scp_text(hdr, len1, (char*)PtrCurSect+curSectPos, outlen, hdr->ID.Technician, versionSection); hdr->ID.Technician[outlen] = 0; } } else if (tag==23) { /* Room Description */ // TODO: convert to UTF8 } else if (tag==24) { aECG->EmergencyLevel = *(PtrCurSect+curSectPos); } else if (tag==25) { t0.tm_year = leu16p(PtrCurSect+curSectPos)-1900; t0.tm_mon = (*(PtrCurSect+curSectPos+2)) - 1; t0.tm_mday = *(PtrCurSect+curSectPos+3); } else if (tag==26) { t0.tm_hour = *(PtrCurSect+curSectPos); t0.tm_min = *(PtrCurSect+curSectPos+1); t0.tm_sec = *(PtrCurSect+curSectPos+2); } else if (tag==27) { HighPass = leu16p(PtrCurSect+curSectPos)/100.0; } else if (tag==28) { LowPass = leu16p(PtrCurSect+curSectPos); } else if (tag==29) { uint8_t bitmap = *(PtrCurSect+curSectPos); if (bitmap==0) Notch = NAN; // undefined else if ((bitmap & 0x03)==0) Notch = -1; // notch off else if (bitmap & 0x01) Notch = 60.0; // notch 60Hz else if (bitmap & 0x02) Notch = 50.0; // notch 50Hz } else if (tag==30) { /* Free Text Field */ // TODO: convert to UTF8 } else if (tag==31) { /* ECG Sequence Number */ // TODO: convert to UTF8 } else if (tag==32) { /* History Diagnostic Codes */ // TODO: convert to UTF8 if (PtrCurSect[curSectPos]==0) { unsigned k=1; for (; k < len1; k++) { if ((PtrCurSect[curSectPos+k] > 9) && (PtrCurSect[curSectPos+k] < 40)) hdr->Patient.Impairment.Heart = 2; else if (PtrCurSect[curSectPos+k]==1) hdr->Patient.Impairment.Heart = 1; else if (PtrCurSect[curSectPos+k]==42) { hdr->Patient.Impairment.Heart = 3; break; } } } } else if (tag==33) { /* Electrode Configuration Code */ // TODO: convert to UTF8 } else if (tag==34) { /* DateTimeZone */ // TODO: convert to UTF8 int16_t tzmin = lei16p(PtrCurSect+curSectPos); if (tzmin != 0x7fff) { if (abs(tzmin)<=780) hdr->tzmin = tzmin; else fprintf(stderr,"Warning SOPEN(SCP-READ): invalid time zone (Section 1, Tag34)\n"); } //fprintf(stdout,"SOPEN(SCP-READ): tzmin = %i %x \n",tzmin,tzmin); } else if (tag==35) { /* Free Text Medical History */ // TODO: convert to UTF8 } else { } curSectPos += len1; } hdr->T0 = tm_time2gdf_time(&t0); } /**** SECTION 2: HUFFMAN TABLES USED IN ENCODING OF ECG DATA (IF USED) ****/ else if (curSect==2) { aECG->FLAG.HUFFMAN = 1; en1064.FLAG.HUFFMAN = 1; NHT = leu16p(PtrCurSect+curSectPos); curSectPos += 2; if (NHT==19999) { en1064.FLAG.HUFFMAN = 1; Huffman = (huffman_t*)malloc(sizeof(huffman_t)); HTrees = (htree_t**)malloc(sizeof(htree_t*)); Huffman[0].NCT = 19; Huffman[0].Table = DefaultTable; HTrees [0] = makeTree(Huffman[0]); k2 = 0; #ifndef ANDROID if (VERBOSE_LEVEL==9) for (k1=0; k1NS = *(PtrCurSect+curSectPos); aECG->FLAG.REF_BEAT = (*(PtrCurSect+curSectPos+1) & 0x01); en1064.Section3.flags = *(PtrCurSect+curSectPos+1); if (aECG->FLAG.REF_BEAT && (aECG->Section1.Tag14.VERSION > 25)) { biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "REF-BEAT compression is invalid in SCP v3"); } if (aECG->FLAG.REF_BEAT && !section[4].length) { #ifndef ANDROID fprintf(stderr,"Warning (SCP): Reference Beat but no Section 4\n"); #endif aECG->FLAG.REF_BEAT = 0; } #ifndef ANDROID if (!(en1064.Section3.flags & 0x04) || ((en1064.Section3.flags>>3) != hdr->NS)) fprintf(stderr,"Warning (SCP): channels are not simultaneously recorded! %x %i\n",en1064.Section3.flags,hdr->NS); #endif curSectPos += 2; hdr->CHANNEL = (CHANNEL_TYPE *) realloc(hdr->CHANNEL,hdr->NS* sizeof(CHANNEL_TYPE)); en1064.Section3.lead = (typeof(en1064.Section3.lead))malloc(hdr->NS*sizeof(*en1064.Section3.lead)); uint32_t startindex0; startindex0 = leu32p(PtrCurSect+curSectPos); for (i = 0, hdr->SPR=1; i < hdr->NS; i++) { en1064.Section3.lead[i].start = leu32p(PtrCurSect+curSectPos); en1064.Section3.lead[i].end = leu32p(PtrCurSect+curSectPos+4); uint8_t LeadIdCode = *(PtrCurSect+curSectPos+8); if (LeadIdCode > 184) { // consider this as undefined LeadId LeadIdCode = 0; fprintf(stderr,"Warning (SCP): LeadId of channel %i is %i - which is unspecified\n",i+1, LeadIdCode); } hdr->CHANNEL[i].SPR = en1064.Section3.lead[i].end - en1064.Section3.lead[i].start + 1; hdr->SPR = lcm(hdr->SPR,hdr->CHANNEL[i].SPR); hdr->CHANNEL[i].LeadIdCode = LeadIdCode; hdr->CHANNEL[i].Label[0]= 0; hdr->CHANNEL[i].Transducer[0]= 0; hdr->CHANNEL[i].LowPass = LowPass; hdr->CHANNEL[i].HighPass= HighPass; hdr->CHANNEL[i].Notch = Notch; curSectPos += 9; #ifndef ANDROID if (en1064.Section3.lead[i].start != startindex0) fprintf(stderr,"Warning SCP(read): starting sample %i of #%i differ to %x in #1\n",en1064.Section3.lead[i].start,*(PtrCurSect+curSectPos+8),startindex0); #endif } } /**** SECTION 4: QRS LOCATIONS (IF REFERENCE BEATS ARE ENCODED) ****/ else if (curSect==4) { if (aECG->Section1.Tag14.VERSION > 25) biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "Section 4 must not be used in SCP v3"); en1064.Section4.len_ms = leu16p(PtrCurSect+curSectPos); // ### TODO: SCPECGv3 ### en1064.Section4.fiducial_sample = leu16p(PtrCurSect+curSectPos+2); // ### TODO: SCPECGv3 ### en1064.Section4.N = leu16p(PtrCurSect+curSectPos+4); // ### TODO: SCPECGv3 ### en1064.Section4.SPR = hdr->SPR/4; en1064.Section4.beat = (typeof(en1064.Section4.beat))malloc(en1064.Section4.N*sizeof(*en1064.Section4.beat)); curSectPos += 6; for (i=0; i < en1064.Section4.N; i++) { en1064.Section4.beat[i].btyp = leu16p(PtrCurSect+curSectPos); en1064.Section4.beat[i].SB = leu32p(PtrCurSect+curSectPos+2); en1064.Section4.beat[i].fcM = leu32p(PtrCurSect+curSectPos+6); en1064.Section4.beat[i].SE = leu32p(PtrCurSect+curSectPos+10); curSectPos += 14; } for (i=0; i < en1064.Section4.N; i++) { en1064.Section4.beat[i].QB = leu32p(PtrCurSect+curSectPos); en1064.Section4.beat[i].QE = leu32p(PtrCurSect+curSectPos+4); curSectPos += 8; en1064.Section4.SPR += en1064.Section4.beat[i].QE-en1064.Section4.beat[i].QB-1; } if (en1064.Section4.len_ms==0) { aECG->FLAG.REF_BEAT = 0; } } /**** SECTION 5: ENCODED REFERENCE BEAT DATA IF REFERENCE BEATS ARE STORED ****/ else if (curSect==5) { Cal5 = leu16p(PtrCurSect+curSectPos); en1064.Section5.AVM = leu16p(PtrCurSect+curSectPos); en1064.Section5.dT_us = leu16p(PtrCurSect+curSectPos+2); en1064.Section5.DIFF = *(PtrCurSect+curSectPos+4); en1064.Section5.Length = (1000L * en1064.Section4.len_ms) / en1064.Section5.dT_us; // hdr->SPR; en1064.Section5.inlen = (typeof(en1064.Section5.inlen))malloc(hdr->NS*2); for (i=0; i < hdr->NS; i++) { en1064.Section5.inlen[i] = leu16p(PtrCurSect+curSectPos+6+2*i); // ### TODO: SCPECGv3 ### if (!section[4].length && (en1064.Section5.Length < en1064.Section5.inlen[i])) en1064.Section5.Length = en1064.Section5.inlen[i]; } if (!section[4].length && en1064.FLAG.HUFFMAN) { en1064.Section5.Length *= 5; // decompressed data might need more space #ifndef ANDROID fprintf(stderr,"Warning SCPOPEN: Section 4 not defined - size of Sec5 can be only guessed (%i allocated)\n",(int)en1064.Section5.Length); #endif } en1064.Section5.datablock = NULL; if (aECG->FLAG.REF_BEAT) { en1064.Section5.datablock = (int32_t*)malloc(4 * hdr->NS * en1064.Section5.Length); Ptr2datablock = (PtrCurSect+curSectPos+6+2*hdr->NS); for (i=0; i < hdr->NS; i++) { en1064.Section5.inlen[i] = leu16p(PtrCurSect+curSectPos+6+2*i); // ### TODO: SCPECGv3 ### if (en1064.FLAG.HUFFMAN) { if (DecodeHuffman(HTrees, Huffman, Ptr2datablock, en1064.Section5.inlen[i], en1064.Section5.datablock + en1064.Section5.Length*i, en1064.Section5.Length)) { biosigERROR(hdr, B4C_DECOMPRESSION_FAILED, "Empty node in Huffman table! Do not know what to do !"); } if (hdr->AS.B4C_ERRNUM) { deallocEN1064(en1064); return(-1); } } else { for (k1=0; k1NS; k1++) for (ix = k1*en1064.Section5.Length+1; ix < (k1+1)*en1064.Section5.Length; ix++) data[ix] += data[ix-1]; else if (en1064.Section5.DIFF==2) for (k1 = 0; k1 < hdr->NS; k1++) for (ix = k1*en1064.Section5.Length+2; ix < (k1+1)*en1064.Section5.Length; ix++) data[ix] += 2*data[ix-1] - data[ix-2]; } } /**** SECTION 6 ****/ else if ((curSect==6) && (section[12].length==0)) { // Read Section6 only if no Section 12 is available hdr->NRec = 1; uint8_t FLAG_HUFFMAN = 0; uint16_t gdftyp = 5; // int32: internal raw data type hdr->AS.rawdata = (uint8_t*)realloc(hdr->AS.rawdata,4 * hdr->NS * hdr->SPR * hdr->NRec); data = (int32_t*)hdr->AS.rawdata; en1064.Section6.AVM = leu16p(PtrCurSect+curSectPos); en1064.Section6.dT_us = leu16p(PtrCurSect+curSectPos+2); hdr->SampleRate = 1e6/en1064.Section6.dT_us; en1064.Section6.DIFF = *(PtrCurSect+curSectPos+4); en1064.FLAG.DIFF = *(PtrCurSect+curSectPos+4); if (hdr->VERSION < 3.0) { en1064.Section6.BIMODAL = *(PtrCurSect+curSectPos+5); en1064.FLAG.BIMODAL = *(PtrCurSect+curSectPos+5); aECG->FLAG.BIMODAL = *(PtrCurSect+curSectPos+5); } else { en1064.Section6.BIMODAL = 0; en1064.FLAG.BIMODAL = 0; aECG->FLAG.BIMODAL = 0; FLAG_HUFFMAN = *(PtrCurSect+curSectPos+5); } Cal6 = leu16p(PtrCurSect+curSectPos); en1064.Section6.dT_us = leu16p(PtrCurSect+curSectPos+2); aECG->FLAG.DIFF = *(PtrCurSect+curSectPos+4); if ((section[5].length>4) && en1064.Section5.dT_us) dT_us = en1064.Section5.dT_us; else dT_us = en1064.Section6.dT_us; hdr->SampleRate = 1e6/dT_us; typeof(hdr->SPR) SPR = ( en1064.FLAG.BIMODAL ? en1064.Section4.SPR : hdr->SPR); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %i\n", __func__ ,__LINE__, dT_us, Cal5, Cal6); if ((Cal5==0) && (Cal6 >0)) Cal0 = Cal6; else if ((Cal5 >0) && (Cal6==0)) Cal0 = Cal5; else if ((Cal5 >0) && (Cal6 >0)) Cal0 = gcd(Cal5,Cal6); else biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "SCP with invalid AVM data !"); uint16_t cal5 = Cal5/Cal0; uint16_t cal6 = Cal6/Cal0; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i %i %i\n",__func__,__LINE__,dT_us,Cal5,Cal6); Ptr2datablock = (PtrCurSect+curSectPos + 6 + hdr->NS*2); // pointer for huffman decoder len = 0; size_t ix; hdr->AS.bpb = hdr->NS * hdr->SPR*GDFTYP_BITS[gdftyp]>>3; for (i=0; i < hdr->NS; i++) { if (VERBOSE_LEVEL>7) fprintf(stdout,"sec6-%i\n",i); CHANNEL_TYPE *hc = hdr->CHANNEL+i; hc->SPR = hdr->SPR; hc->PhysDimCode = 4275; // PhysDimCode("uV") physical unit "uV" hc->Cal = Cal0 * 1e-3; hc->Off = 0; hc->OnOff = 1; // 1: ON 0:OFF hc->GDFTYP = gdftyp; #ifndef NO_BI hc->bi = i*hdr->SPR*GDFTYP_BITS[gdftyp]>>3; #endif // ### TODO: these values should represent the true saturation values ### // hc->DigMax = ldexp(1.0,20)-1; hc->DigMin = ldexp(-1.0,20); hc->PhysMax = hc->DigMax * hc->Cal; hc->PhysMin = hc->DigMin * hc->Cal; uint16_t inlen = leu16p(PtrCurSect+curSectPos+6+2*i); // ### TODO: SCPECGv3 ### if (en1064.FLAG.HUFFMAN) { if (DecodeHuffman(HTrees, Huffman, Ptr2datablock, inlen, data + i*hdr->SPR, hdr->SPR)) { biosigERROR(hdr, B4C_DECOMPRESSION_FAILED, "Empty node in Huffman table! Do not know what to do !"); } if (hdr->AS.B4C_ERRNUM) { deallocEN1064(en1064); return(-1); } } else { for (k1=0, ix = i*hdr->SPR; k1 < SPR; k1++) data[ix+k1] = lei16p(Ptr2datablock + 2*k1); } len += inlen; Ptr2datablock += inlen; if (aECG->FLAG.DIFF==1) { for (ix = i*hdr->SPR+1; ix < i*hdr->SPR + SPR; ix++) data[ix] += data[ix-1]; } else if (aECG->FLAG.DIFF==2) { for (ix = i*hdr->SPR+2; ix < i*hdr->SPR + SPR; ix++) data[ix] += 2*data[ix-1] - data[ix-2]; } #ifndef WITHOUT_SCP_DECODE if (aECG->FLAG.BIMODAL || aECG->FLAG.REF_BEAT) { // if (aECG->FLAG.BIMODAL) { // if (aECG->FLAG.REF_BEAT { /* this is experimental work Bimodal and RefBeat decompression are under development. "continue" ignores code below AS_DECODE=1 will call later SCP-DECODE instead */ AS_DECODE = 1; continue; } #endif if (aECG->FLAG.BIMODAL) { // ### FIXME ### ix = i*hdr->SPR; // memory offset k1 = en1064.Section4.SPR; // SPR of decimated data k2 = hdr->SPR; // SPR of sample data uint32_t k3 = en1064.Section4.N-1; // # of protected zones uint8_t k4 = 4; // decimation factor do { --k2; data[ix + k2] = data[ix + k1 - 1]; if (k2 > en1064.Section4.beat[k3].QE) { // outside protected zone if (--k4==0) {k4=4; --k1; }; } else { // inside protected zone --k1; if (k20)); } if (aECG->FLAG.REF_BEAT) { /* Add reference beats */ // ### FIXME ### for (k1 = 0; k1 < en1064.Section4.N; k1++) { if (en1064.Section4.beat[k1].btyp == 0) for (ix = 0; ix < en1064.Section5.Length; ix++) { uint32_t ix1 = en1064.Section4.beat[k1].SB - en1064.Section4.beat[k1].fcM + ix; uint32_t ix2 = i*hdr->SPR + ix1; if ((en1064.Section4.beat[k1].btyp==0) && (ix1 < hdr->SPR)) data[ix2] = data[ix2] * cal6 + en1064.Section5.datablock[i*en1064.Section5.Length+ix] * cal5; } } } } en1064.Section6.datablock = data; curSectPos += 6 + 2*hdr->NS + len; if (VERBOSE_LEVEL>8) fprintf(stdout,"end sec6\n"); } /**** SECTION 7 ****/ else if (curSect==7) { #if (BIOSIG_VERSION >= 10500) hdr->SCP.Section7Length = leu32p(PtrCurSect+4)-curSectPos; hdr->SCP.Section7 = PtrCurSect+curSectPos; #endif uint16_t N_QRS = *(uint8_t*)(PtrCurSect+curSectPos)-1; uint8_t N_PaceMaker = *(uint8_t*)(PtrCurSect+curSectPos+1); // uint16_t RRI = leu16p(PtrCurSect+curSectPos+2); // uint16_t PPI = leu16p(PtrCurSect+curSectPos+4); curSectPos += 6; //size_t curSectPos0 = curSectPos; // backup of pointer // skip data on QRS measurements /* // ### FIXME ### It seems that the P,QRS, and T wave events can not be reconstructed because they refer to the reference beat and not to the overall signal data. Maybe Section 4 information need to be used. However, EN1064 does not mention this. hdr->EVENT.POS = (uint32_t*)realloc(hdr->EVENT.POS, (hdr->EVENT.N+5*N_QRS+N_PaceMaker)*sizeof(*hdr->EVENT.POS)); hdr->EVENT.TYP = (uint16_t*)realloc(hdr->EVENT.TYP, (hdr->EVENT.N+5*N_QRS+N_PaceMaker)*sizeof(*hdr->EVENT.TYP)); hdr->EVENT.DUR = (uint32_t*)realloc(hdr->EVENT.DUR, (hdr->EVENT.N+5*N_QRS+N_PaceMaker)*sizeof(*hdr->EVENT.DUR)); hdr->EVENT.CHN = (uint16_t*)realloc(hdr->EVENT.CHN, (hdr->EVENT.N+5*N_QRS+N_PaceMaker)*sizeof(*hdr->EVENT.CHN)); for (i=0; i < 5*N_QRS; i++) { hdr->EVENT.DUR[hdr->EVENT.N+i] = 0; hdr->EVENT.CHN[hdr->EVENT.N+i] = 0; } for (i=0; i < 5*N_QRS; i+=5) { uint8_t typ = *(PtrCurSect+curSectPos+i); hdr->EVENT.TYP[hdr->EVENT.N] = 0x0502; hdr->EVENT.TYP[hdr->EVENT.N+1] = 0x8502; hdr->EVENT.TYP[hdr->EVENT.N+2] = 0x0503; hdr->EVENT.TYP[hdr->EVENT.N+3] = 0x8503; hdr->EVENT.TYP[hdr->EVENT.N+4] = 0x8506; hdr->EVENT.POS[hdr->EVENT.N] = leu16p(PtrCurSect+curSectPos0); hdr->EVENT.POS[hdr->EVENT.N+1] = leu16p(PtrCurSect+curSectPos0+2); hdr->EVENT.POS[hdr->EVENT.N+2] = leu16p(PtrCurSect+curSectPos0+4); hdr->EVENT.POS[hdr->EVENT.N+3] = leu16p(PtrCurSect+curSectPos0+6); hdr->EVENT.POS[hdr->EVENT.N+4] = leu16p(PtrCurSect+curSectPos0+8); hdr->EVENT.N+= 5; curSectPos0 += 16; } */ curSectPos += N_QRS*16; // pace maker information is stored in sparse sampling channel if (N_PaceMaker>0) { hdr->EVENT.POS = (uint32_t*)realloc(hdr->EVENT.POS, (hdr->EVENT.N+N_PaceMaker)*sizeof(*hdr->EVENT.POS)); hdr->EVENT.TYP = (uint16_t*)realloc(hdr->EVENT.TYP, (hdr->EVENT.N+N_PaceMaker)*sizeof(*hdr->EVENT.TYP)); hdr->EVENT.DUR = (uint32_t*)realloc(hdr->EVENT.DUR, (hdr->EVENT.N+N_PaceMaker)*sizeof(*hdr->EVENT.DUR)); hdr->EVENT.CHN = (uint16_t*)realloc(hdr->EVENT.CHN, (hdr->EVENT.N+N_PaceMaker)*sizeof(*hdr->EVENT.CHN)); /* add pacemaker channel */ hdr->CHANNEL = (CHANNEL_TYPE *) realloc(hdr->CHANNEL,(++hdr->NS)*sizeof(CHANNEL_TYPE)); i = hdr->NS; CHANNEL_TYPE *hc = hdr->CHANNEL+i; hc->SPR = 0; // sparse event channel hc->PhysDimCode = 4275; // PhysDimCode("uV") physical unit "uV" hc->Cal = 1; hc->Off = 0; hc->OnOff = 1; // 1: ON 0:OFF strcpy(hc->Transducer,"Pacemaker"); hc->GDFTYP = 3; // ### these values should represent the true saturation values ###// hc->DigMax = ldexp(1.0,15)-1; hc->DigMin = ldexp(-1.0,15); hc->PhysMax = hc->DigMax * hc->Cal; hc->PhysMin = hc->DigMin * hc->Cal; } // skip pacemaker spike measurements for (i=0; i < N_PaceMaker; i++) { ++hdr->EVENT.N; hdr->EVENT.TYP[hdr->EVENT.N] = 0x7fff; hdr->EVENT.CHN[hdr->EVENT.N] = hdr->NS; hdr->EVENT.POS[hdr->EVENT.N] = (uint32_t)(leu16p(PtrCurSect+curSectPos)*hdr->SampleRate*1e-3); hdr->EVENT.DUR[hdr->EVENT.N] = leu16p(PtrCurSect+curSectPos+2); curSectPos += 4; } // skip pacemaker spike information section curSectPos += N_PaceMaker*6; // QRS type information N_QRS = leu16p(PtrCurSect+curSectPos); curSectPos += 2; } /**** SECTION 8 ****/ else if (curSect==8) { // TODO: convert to UTF8 #if (BIOSIG_VERSION >= 10500) hdr->SCP.Section8Length = leu32p(PtrCurSect+4)-curSectPos; hdr->SCP.Section8 = PtrCurSect+curSectPos; #else aECG->Section8.Confirmed = *(char*)(PtrCurSect+curSectPos); aECG->Section8.t.tm_year = leu16p(PtrCurSect+curSectPos+1)-1900; aECG->Section8.t.tm_mon = *(uint8_t*)(PtrCurSect+curSectPos+3)-1; aECG->Section8.t.tm_mday = *(uint8_t*)(PtrCurSect+curSectPos+4); aECG->Section8.t.tm_hour = *(uint8_t*)(PtrCurSect+curSectPos+5); aECG->Section8.t.tm_min = *(uint8_t*)(PtrCurSect+curSectPos+6); aECG->Section8.t.tm_sec = *(uint8_t*)(PtrCurSect+curSectPos+7); aECG->Section8.NumberOfStatements = *(uint8_t*)(PtrCurSect+curSectPos+8); aECG->Section8.Statements= (char**)malloc(aECG->Section8.NumberOfStatements*sizeof(char*)); curSectPos += 9; uint8_t k=0; for (; kSection8.NumberOfStatements;k++) { if (curSectPos+3 > len) break; aECG->Section8.Statements[k] = (char*)(PtrCurSect+curSectPos+3); curSectPos += 3+leu16p(PtrCurSect+curSectPos+1); } #endif } /**** SECTION 9 ****/ else if (curSect==9) { // TODO: convert to UTF8 #if (BIOSIG_VERSION >= 10500) // hdr->SCP.Section9Length = leu32p(PtrCurSect+4)-curSectPos; // hdr->SCP.Section9 = PtrCurSect+curSectPos; #else aECG->Section9.StartPtr = (char*)(PtrCurSect+curSectPos); aECG->Section9.Length = len; #endif } /**** SECTION 10 ****/ else if (curSect==10) { #if (BIOSIG_VERSION >= 10500) hdr->SCP.Section10Length = leu32p(PtrCurSect+4)-curSectPos; hdr->SCP.Section10 = PtrCurSect+curSectPos; #endif } /**** SECTION 11 ****/ else if (curSect==11) { // TODO: convert to UTF8 if(len= 10500) /* hdr->SCP.Section11 = realloc(hdr->SCP.Section11, len); memcpy(hdr->SCP.Section11, PtrCurSect+curSectPos, len); */ hdr->SCP.Section11Length = leu32p(PtrCurSect+4)-curSectPos; hdr->SCP.Section11 = PtrCurSect+curSectPos; #else aECG->Section11.Confirmed = *(char*)(PtrCurSect+curSectPos); aECG->Section11.t.tm_year = leu16p(PtrCurSect+curSectPos+1)-1900; aECG->Section11.t.tm_mon = *(uint8_t*)(PtrCurSect+curSectPos+3)-1; aECG->Section11.t.tm_mday = *(uint8_t*)(PtrCurSect+curSectPos+4); aECG->Section11.t.tm_hour = *(uint8_t*)(PtrCurSect+curSectPos+5); aECG->Section11.t.tm_min = *(uint8_t*)(PtrCurSect+curSectPos+6); aECG->Section11.t.tm_sec = *(uint8_t*)(PtrCurSect+curSectPos+7); aECG->Section11.NumberOfStatements = *(uint8_t*)(PtrCurSect+curSectPos+8); aECG->Section11.Statements= (char**)malloc(aECG->Section11.NumberOfStatements*sizeof(char*)); curSectPos += 9; uint8_t k=0; for (; kSection11.NumberOfStatements;k++) { if (curSectPos+4 > len) break; aECG->Section11.Statements[k] = (char*)(PtrCurSect+curSectPos+4); curSectPos += 3+leu16p(PtrCurSect+curSectPos+1); } #endif } #if defined(WITH_SCP3) /**** SECTION 12 ****/ else if ( (curSect==12) && (versionSection > 25) && (versionProtocol > 25) && (len > 70) ) { uint32_t sec12_LN = leu32p(PtrCurSect+curSectPos+62); uint32_t sec12_LMI= leu32p(PtrCurSect+curSectPos+66); uint32_t sec12_Len1 = 70+sec12_LN+sec12_LMI; uint8_t sec12_FRST = *(PtrCurSect+curSectPos+16); // TODO: get rid of this field, no benefit uint8_t sec12_FBMP = *(PtrCurSect+curSectPos+31); uint16_t gdftyp = 0; uint8_t bps = *(uint8_t*)(PtrCurSect+curSectPos+9); double DigMin = -1.0/0.0; double DigMax = +1.0/0.0; switch (bps) { case 1: gdftyp = 1; break; case 2: gdftyp = 2; break; case 3: gdftyp = 255+24; break; case 4: gdftyp = 5; break; default: biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "invalid number of bytes per samplein SCP3:Section12"); } DigMin = -ldexp(1.0,bps-1); DigMax = ldexp(1.0,bps-1)-1.0; // TODO: why is this needed, why is Section 1 not good enough ? struct tm t0; t0.tm_year = leu16p(PtrCurSect+curSectPos+10)-1900; t0.tm_mon = (*(PtrCurSect+curSectPos+12)) - 1; t0.tm_mday = *(PtrCurSect+curSectPos+13); t0.tm_hour = *(PtrCurSect+curSectPos+14); t0.tm_min = *(PtrCurSect+curSectPos+15); t0.tm_sec = *(PtrCurSect+curSectPos+16); hdr->T0 = tm_time2gdf_time(&t0); hdr->SampleRate = leu32p(PtrCurSect+curSectPos); hdr->NS = *(uint8_t*)(PtrCurSect+curSectPos+4); hdr->NRec = leu32p(PtrCurSect+curSectPos+5); hdr->SPR = 1; // multiplexed hdr->AS.bpb = bps*hdr->NS; hdr->AS.rawdata = (uint8_t*)realloc(hdr->AS.rawdata,4 * hdr->NS * hdr->SPR * hdr->NRec); data = (int32_t*)hdr->AS.rawdata; /* Leads Definition Block */ hdr->CHANNEL = (CHANNEL_TYPE *) realloc(hdr->CHANNEL,hdr->NS* sizeof(CHANNEL_TYPE)); for (i = 0; i < hdr->NS; i++) { CHANNEL_TYPE *hc = hdr->CHANNEL+i; uint8_t LeadIdCode = *(PtrCurSect+curSectPos+sec12_Len1+i*4); if (LeadIdCode > 184) { // consider this as undefined LeadId LeadIdCode = 0; fprintf(stderr,"Warning (SCP): LeadId of channel %i is %i - which is unspecified\n",i+1, LeadIdCode); } hc->bi = bps*i; hc->bi8 = (bps*i)<<3; hc->SPR = 1; hc->LeadIdCode = LeadIdCode; hc->Label[0] = 0; hc->Transducer[0] = 0; hc->OnOff = 1; hc->Impedance = 0.0/0.0; hc->GDFTYP = gdftyp; hc->DigMin = DigMin; hc->DigMax = DigMax; hc->Off = 0.0; hc->Cal = leu16p(PtrCurSect+curSectPos+sec12_Len1+i*4+1)*1e-3; hc->PhysDimCode = 4275; // PhysDimCode("uV") physical unit "uV" hc->PhysMin = DigMin*hc->Cal; hc->PhysMax = DigMax*hc->Cal; if (sec12_FRST) { hc->LowPass = leu16p(PtrCurSect+curSectPos+29); hc->HighPass = leu16p(PtrCurSect+curSectPos+27); hc->Notch = ((sec12_FBMP==0) ? 60 : ((sec12_FBMP==1) ? 50 : NAN)); } else { // From Section 1 tags 27-28 hc->LowPass = LowPass; hc->HighPass = HighPass; hc->Notch = Notch; } } /* size_t sz = GDFTYP_BITS[gdftyp] * hdr->NS * hdr->SPR * hdr->NRec / 8; hdr->AS.rawdata = (uint8_t*)realloc(hdr->AS.rawdata, sz); memcpy(hdr->AS.rawdata, PtrCurSect+curSectPos+sec12_Len1+hdr->NS*4, sz); */ hdr->AS.rawdata = PtrCurSect+curSectPos+sec12_Len1+hdr->NS*4; hdr->AS.first = 0; hdr->AS.length = hdr->SPR*hdr->NRec; } /**** SECTION 13 ****/ else if (curSect==13) { } /**** SECTION 14 ****/ else if (curSect==14) { } /**** SECTION 15 ****/ else if (curSect==15) { } /**** SECTION 16 ****/ else if (curSect==16) { } /**** SECTION 17 ****/ else if (curSect==17) { } /**** SECTION 18 ****/ else if (curSect==18) { } #endif else { } } /* free allocated memory */ deallocEN1064(en1064); return 0; #ifndef WITHOUT_SCP_DECODE if (AS_DECODE==0) return(0); /* --------------------------------------------------------------------------- Copyright (C) 2006 Eugenio Cervesato. Developed at the Associazione per la Ricerca in Cardiologia - Pordenone - Italy, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --------------------------------------------------------------------------- */ /* Fall back method: + implements Huffman, reference beat and Bimodal compression. - uses piece-wise file access - defines intermediate data structure */ #ifndef ANDROID fprintf(stdout, "\nUse SCP_DECODE (Huffman=%i RefBeat=%i Bimodal=%i)\n", aECG->FLAG.HUFFMAN, aECG->FLAG.REF_BEAT, aECG->FLAG.BIMODAL); #endif textual.des.acquiring.protocol_revision_number = aECG->Section1.Tag14.VERSION; textual.des.analyzing.protocol_revision_number = aECG->Section1.Tag15.VERSION; decode.flag_Res.bimodal = (aECG->Section1.Tag14.VERSION > 10 ? aECG->FLAG.BIMODAL : 0); decode.Reconstructed = (int32_t*) hdr->AS.rawdata; // TODO: check error handling biosigERROR(hdr, 0, NULL); if (scp_decode(hdr, section, &decode, &record, &textual, add_filter)) { if (Cal0>1) for (i=0; i < hdr->NS * hdr->SPR * hdr->NRec; ++i) data[i] /= Cal0; } else { biosigERROR(hdr, B4C_CANNOT_OPEN_FILE, "SCP-DECODE can not read file"); return(0); } // end of fall back method decode.Reconstructed = NULL; sopen_SCP_clean(&decode, &record, &textual); return(1); #endif }; #ifdef __cplusplus } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/biosig-network.c0000664000175000017500000005601713240265276020577 00000000000000/* Copyright (C) 2009,2015,2016 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include "biosig-network.h" #define min(a,b) (((a) < (b)) ? (a) : (b)) #ifdef _WIN32 #define TC (char*) // WINSOCK's send and recv require (char*)buf #if 0 /* these functions have a different name under windows, MinGW für windows requires these */ int creat(const char *path, mode_t mode) { // return(OpenFile(path, O_WRONLY|O_CREAT|O_TRUNC, mode)); return(OpenFile(path, , OF_WRITE|OF_CREAT )); } ssize_t write(int fildes, const void *buf, size_t nbyte) { ssize_t sz; WriteFile(fildes, buf, nbyte, &sz, NULL) return(sz); } int close(int fildes) { return(CloseFile(fildes)); { } // the following ones are not used /* int open(const char *path, int oflag) { return(OpenFile(path, oflag)); } int open(const char *path, int oflag, mode_t mode ) { return(OpenFile(path, oflag, mode)); } ssize_t read(int fildes, const void *buf, size_t nbyte) { return(ReadFile(fildes, buf, nbyte)); } */ #endif #else #define TC #endif uint64_t B4C_ID=0; // ID of currently open file const char *B4C_HOSTNAME = NULL; uint32_t SERVER_STATE; // state of server, useful for preliminary error checking /* converts 64bit integer into hex string */ int c64ta(uint64_t ID, char *txt) { const char hex[] = "0123456789abcdef"; int k=(BSCS_ID_BITLEN>>2)-1; for (; k>=0; k--) { txt[k] = hex[ID & 0x0f]; ID>>=4; } txt[BSCS_ID_BITLEN>>2] = 0; if (VERBOSE_LEVEL>8) fprintf(stdout,"c64ta: ID=%016"PRIx64" TXT=%s\n",ID,txt); return 0; } /* converts hex string into 64bit integer */ int cat64(char* txt, uint64_t *id) { uint64_t ID = 0; int k = 0; for (; txt[k] && (k<(BSCS_ID_BITLEN>>2));k++) { ID<<=4; if (isdigit(txt[k])) ID += txt[k]-'0'; else if (isxdigit(txt[k])) ID += toupper(txt[k])-'A'+10; else { *id = -1; return(-1); } } *id = ID; if (VERBOSE_LEVEL>8) fprintf(stdout,"cat64: ID=%016"PRIx64" TXT=%s\n",ID,txt); return(0); } // get sockaddr, IPv4 or IPv6: void *get_in_addr(struct sockaddr *sa) { if (sa->sa_family == AF_INET) { return &(((struct sockaddr_in*)sa)->sin_addr); } #ifndef _WIN32 return &(((struct sockaddr_in6*)sa)->sin6_addr); #else return(NULL); #endif } /**************************************************************************************** OPEN CONNECTION TO SERVER ****************************************************************************************/ int bscs_connect(const char* hostname) { int sd; struct sockaddr_in localAddr; if (hostname==NULL) hostname = "129.27.3.99"; B4C_HOSTNAME = hostname; #ifdef _WIN32 WSADATA wsadata; if (WSAStartup(MAKEWORD(1,1), &wsadata) == SOCKET_ERROR) { fprintf(stderr,"Error creating socket."); return(BSCS_CANNOT_CONNECT); } #endif int status; #if 1 // IPv4 and IPv6 struct addrinfo hints; struct addrinfo *result, *p; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_socktype = SOCK_STREAM; // TCP stream sockets hints.ai_flags = 0; hints.ai_protocol = 0; /* Any protocol */ status = getaddrinfo(hostname, NULL, &hints, &result); if (status != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); return(BSCS_UNKNOWN_HOST); } // loop through all the results and connect to the first we can #ifndef NI_MAXHOST #define NI_MAXHOST 1025 #endif for(p = result; p != NULL; p = p->ai_next) { char hostname1[NI_MAXHOST] = ""; int error = getnameinfo(p->ai_addr, p->ai_addrlen, hostname1, NI_MAXHOST, NULL, 0, 0); if (*hostname1) printf("hostname: %s\n", hostname1); if ((sd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("client: socket"); continue; } if (connect(sd, p->ai_addr, p->ai_addrlen) != -1) break; close(sd); } if (p == NULL) { fprintf(stderr, "client: failed to connect\n"); #ifdef _WIN32 WSACleanup(); #endif return(BSCS_CANNOT_CONNECT); } char s[INET6_ADDRSTRLEN]; #if !defined(_WIN32) // FIXME: does not compile with MXE for TARGET "i686-w64-mingw32.static" inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof(s)); #else strcpy(s," [Icannot get server name - NET_NTOP() not available]"); #endif printf("client: connecting to %s\n", s); freeaddrinfo(result); // all done with this structure #else // IPv4 only struct hostent *h; struct sockaddr_in sain; h = gethostbyname(hostname); if(h==NULL) return(BSCS_UNKNOWN_HOST); sain.sin_family = h->h_addrtype; memcpy((char *) &sain.sin_addr.s_addr, h->h_addr_list[0],h->h_length); sain.sin_port = htons(SERVER_PORT); /* create socket */ sd = socket(AF_INET, SOCK_STREAM, 0); if(sd<0) return(BSCS_CANNOT_OPEN_SOCKET); /* bind any port number */ localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = htonl(INADDR_ANY); localAddr.sin_port = htons(0); /* connect to server */ int rc = connect(sd, (struct sockaddr *) &sain, sizeof(sain)); if(rc<0) return(BSCS_CANNOT_CONNECT); #endif /* identification */ mesg_t msg; recv(sd,TC&msg,8,0); int len = be32toh(msg.LEN); if ((msg.STATE & (VER_MASK|CMD_MASK)) != (BSCS_VERSION_01 | BSCS_SEND_MSG)) // currently only V0.1 is supported { close(sd); return(BSCS_SERVER_NOT_SUPPORTED); } char *greeting = (char*)malloc(len+1); recv(sd,greeting,len,0); greeting[len]=0; //fprintf(stdout,"%s",greeting); free(greeting); return(sd); } /**************************************************************************************** CLOSE CONNECTION TO SERVER ****************************************************************************************/ int bscs_disconnect(int sd) { close(sd); #ifdef _WIN32 WSACleanup(); #endif } int send_packet(int sd, uint32_t state, uint32_t len, void* load) { mesg_t msg; msg.STATE = state; msg.LEN = htobe32(len); send(sd, TC &msg, 8, 0); if (len>0) send(sd, TC load, len, 0); } /* stores a bscs link file on client side for the currently open network file is stored in the directory "/tmp/" */ int savelink(const char* filename) { if ((SERVER_STATE & STATE_MASK)==STATE_INIT) return(-1); char *logpath = "/tmp/"; // perhaps some other directory const char *ext = ".bscs"; const char *fn = strrchr(filename,FILESEP); if (fn==NULL) fn = filename; else fn++; size_t l1 = strlen(logpath); size_t l2 = strlen(fn); size_t l3 = strlen(ext); size_t l4 = 10; char *logfile = (char*)malloc(l1+l2+l3+l4+1); memcpy(logfile, logpath, l1); memcpy(logfile+l1, fn, l2); strcpy(logfile+l1+l2, ext); int k=0; size_t sl = strlen(logfile); FILE *fid; // check whether file already exists while ((fid=fopen(logfile,"r")) != NULL) { fclose(fid); snprintf(logfile+sl, l4, ".%i", k); k++; } errno = 0; // fopen caused errno=2; reset errno fprintf(stdout,"savelink %s\n",logfile); fid = fopen(logfile,"w"); fprintf(fid,"bscs://%s/%016"PRIx64"\n",B4C_HOSTNAME,B4C_ID); fclose(fid); free(logfile); } /**************************************************************************************** OPEN FILE with ID ****************************************************************************************/ int bscs_open(int sd, uint64_t* ID) { if (SERVER_STATE != STATE_INIT) return(BSCS_ERROR); size_t LEN; mesg_t msg; if (*ID==0) { msg.STATE = BSCS_VERSION_01 | BSCS_OPEN_W | STATE_INIT | BSCS_NO_ERROR; LEN = 0; } else { msg.STATE = BSCS_VERSION_01 | BSCS_OPEN_R | STATE_INIT | BSCS_NO_ERROR; *(uint64_t*)&msg.LOAD = leu64p(ID); LEN = BSCS_ID_BITLEN>>3; } if (VERBOSE_LEVEL>8) fprintf(stdout,"open: %16"PRIx64" %016"PRIx64"\n",*ID,*(uint64_t*)&(msg.LOAD)); msg.LEN = htobe32(LEN); int s = send(sd, TC &msg, LEN+8, 0); // wait for reply ssize_t count = 0; count = recv(sd, TC &msg, 8, 0); LEN = be32toh(msg.LEN); SERVER_STATE = msg.STATE & STATE_MASK; if (VERBOSE_LEVEL>8) fprintf(stdout,"BSCS_OPEN %i:%"PRIiPTR": ID=%16"PRIx64" LEN=%"PRIx32" STATE=0x%08"PRIx32"\n",s,count,*ID,msg.LEN,be32toh(msg.STATE)); if ((*ID==0) && (LEN==8) && (msg.STATE==(BSCS_VERSION_01 | BSCS_OPEN_W | BSCS_REPLY | STATE_OPEN_WRITE_HDR | BSCS_NO_ERROR)) ) { // write access: get new ID count += recv(sd, TC ID, LEN, 0); *ID = htole64(*ID); B4C_ID = *ID; return(0); } if ((*ID != 0) && (LEN==0) && (msg.STATE==(BSCS_VERSION_01 | BSCS_OPEN_R | BSCS_REPLY | STATE_OPEN_READ | BSCS_NO_ERROR)) ) { ; // read access return(0); } uint8_t buf[8]; count = 0; while (LEN > (size_t)count) { count += recv(sd, TC &buf, min(8,LEN-count), 0); // invalid packet or error opening file } if (VERBOSE_LEVEL>7) fprintf(stdout,"ERR: state= %08"PRIx32" %08"PRIx32" len=%"PRIiPTR"\n",htobe32(msg.STATE),BSCS_VERSION_01 | BSCS_OPEN_R | BSCS_REPLY | STATE_OPEN_READ | BSCS_NO_ERROR,LEN); return(msg.STATE); } /**************************************************************************************** CLOSE FILE ****************************************************************************************/ int bscs_close(int sd) { int s; size_t LEN; mesg_t msg; msg.STATE = BSCS_VERSION_01 | BSCS_CLOSE | BSCS_NO_ERROR | SERVER_STATE; if (VERBOSE_LEVEL>8) fprintf(stdout,"close1: %08"PRIx32" \n",msg.STATE); msg.LEN = htobe32(0); if (VERBOSE_LEVEL>8) fprintf(stdout,"close2: %08"PRIx32" %"PRIiPTR" %"PRIi32"\n",msg.STATE,sizeof(msg),msg.LEN); s = send(sd, TC &msg, 8, 0); if (VERBOSE_LEVEL>8) fprintf(stdout,"close3: %08"PRIx32" %i\n",msg.STATE,s); // wait for reply s = recv(sd, TC &msg, 8, 0); LEN = be32toh(msg.LEN); SERVER_STATE = msg.STATE & STATE_MASK; if (VERBOSE_LEVEL>8) fprintf(stdout,"s=%i state= %08"PRIx32" len=%"PRIiPTR" %i %08"PRIx32"\n",s,msg.STATE & ~STATE_MASK,LEN,s,(BSCS_VERSION_01 | BSCS_CLOSE | BSCS_REPLY)); if ((LEN==0) && ((msg.STATE & ~STATE_MASK)==(BSCS_VERSION_01 | BSCS_CLOSE | BSCS_REPLY | BSCS_NO_ERROR)) ) // close without error return(0); if ((LEN==0) && ((msg.STATE & ~STATE_MASK & ~ERR_MASK)==(BSCS_VERSION_01 | BSCS_CLOSE | BSCS_REPLY)) ) // close with error return(msg.STATE & ERR_MASK); // invalid packet or error opening file if (VERBOSE_LEVEL>8) fprintf(stdout,"ERR: state= %08"PRIx32" len=%"PRIiPTR"\n",msg.STATE,LEN); return(msg.STATE); } /**************************************************************************************** SEND HEADER ****************************************************************************************/ int bscs_send_hdr(int sd, HDRTYPE *hdr) { /* hdr->AS.Header must contain GDF header information hdr->HeadLen must contain header length -------------------------------------------------------------- */ // ToDo: convert HDR into AS.Header if (SERVER_STATE != STATE_OPEN_WRITE_HDR) return(BSCS_ERROR); mesg_t msg; hdr->TYPE = GDF; hdr->FLAG.ANONYMOUS = 1; // do not store name struct2gdfbin(hdr); msg.STATE = BSCS_VERSION_01 | BSCS_SEND_HDR | STATE_OPEN_WRITE_HDR | BSCS_NO_ERROR; msg.LEN = htobe32(hdr->HeadLen); int s = send(sd, TC &msg, 8, 0); if (VERBOSE_LEVEL>8) fprintf(stdout,"SND HDR %i %i\n",hdr->HeadLen,s); s = send(sd, TC hdr->AS.Header, hdr->HeadLen, 0); if (VERBOSE_LEVEL>8) fprintf(stdout,"SND HDR %i %i\n",hdr->HeadLen,s); // wait for reply ssize_t count = recv(sd, TC &msg, 8, 0); if (VERBOSE_LEVEL>8) fprintf(stdout,"SND HDR %i %i %"PRIiPTR" %08"PRIx32"\n",hdr->HeadLen,s,count,msg.STATE); size_t LEN = be32toh(msg.LEN); SERVER_STATE = msg.STATE & STATE_MASK; if ((LEN==0) && (msg.STATE==(BSCS_VERSION_01 | BSCS_SEND_HDR | BSCS_REPLY | STATE_OPEN_WRITE | BSCS_NO_ERROR)) ) // close without error return(0); if ((LEN==0) && ((msg.STATE & ~ERR_MASK)==(BSCS_VERSION_01 | BSCS_SEND_HDR | BSCS_REPLY | STATE_OPEN_WRITE_HDR)) ) // could not write header return((msg.STATE & ~ERR_MASK) | BSCS_ERROR_COULD_NOT_WRITE_HDR); // invalid packet or error opening file return(msg.STATE); } /**************************************************************************************** SEND DATA ****************************************************************************************/ int bscs_send_dat(int sd, void* buf, size_t len ) { if (SERVER_STATE != STATE_OPEN_WRITE) return(BSCS_ERROR); size_t LEN; mesg_t msg; msg.STATE = BSCS_VERSION_01 | BSCS_SEND_DAT | STATE_OPEN_WRITE | BSCS_NO_ERROR; msg.LEN = htobe32(len); if (VERBOSE_LEVEL>8) fprintf(stdout,"SND DAT %"PRIiPTR" %08"PRIx32"\n",len,msg.STATE); ssize_t s; s = send(sd, TC &msg, 8, 0); s = send(sd, TC buf, len, 0); if (errno) fprintf(stdout,"SND DAT ERR=%i %s\n",errno,strerror(errno)); if (VERBOSE_LEVEL>8) fprintf(stdout,"SND DAT %"PRIiPTR" %08"PRIx32" %"PRIiPTR" \n",len,msg.STATE,s); // wait for reply s = recv(sd, TC &msg, 8, 0); LEN = be32toh(msg.LEN); SERVER_STATE = msg.STATE & STATE_MASK; if (VERBOSE_LEVEL>8) fprintf(stdout,"SND DAT RPLY %"PRIiPTR" %08"PRIx32" \n",s,msg.STATE); if ((LEN==0) && (msg.STATE==(BSCS_VERSION_01 | BSCS_SEND_DAT | BSCS_REPLY | STATE_OPEN_WRITE | BSCS_NO_ERROR)) ) // end without error return(0); if (LEN>0) return (BSCS_VERSION_01 | BSCS_SEND_DAT | BSCS_REPLY | STATE_OPEN_WRITE | BSCS_INCORRECT_REPLY_PACKET_LENGTH); if ((msg.STATE & ~ERR_MASK)==(BSCS_VERSION_01 | BSCS_SEND_DAT | BSCS_REPLY | STATE_OPEN_WRITE)) // could not write header return ((msg.STATE & ~ERR_MASK) | BSCS_ERROR_COULD_NOT_WRITE_DAT); // invalid packet or error opening file return(msg.STATE); } /**************************************************************************************** SEND EVENTS ****************************************************************************************/ int bscs_send_evt(int sd, HDRTYPE *hdr) { if (SERVER_STATE != STATE_OPEN_WRITE) return(BSCS_ERROR); int sze; char flag; size_t LEN; mesg_t msg; if ((hdr->EVENT.DUR!=NULL) && (hdr->EVENT.CHN!=NULL)) { sze = 12; flag = 3; } else { sze = 6; flag = 1; } size_t len = hdrEVT2rawEVT(hdr); if (VERBOSE_LEVEL>8) fprintf(stdout,"write evt: len=%"PRIiPTR"\n",len); msg.STATE = BSCS_VERSION_01 | BSCS_SEND_EVT | STATE_OPEN_WRITE | BSCS_NO_ERROR; msg.LEN = htobe32(len); int s1 = send(sd, TC &msg, 8, 0); int s2 = send(sd, TC hdr->AS.rawEventData, len, 0); if (VERBOSE_LEVEL>8) fprintf(stdout,"write evt2: %08"PRIx32" len=%"PRIiPTR"\n",msg.STATE,len); // wait for reply ssize_t count = recv(sd, TC &msg, 8, 0); LEN = be32toh(msg.LEN); SERVER_STATE = msg.STATE & STATE_MASK; if (VERBOSE_LEVEL>8) fprintf(stdout,"write evt2: %08"PRIx32" len=%"PRIiPTR" count=%"PRIiPTR"\n",msg.STATE,LEN,count); if ((LEN==0) && (msg.STATE==(BSCS_VERSION_01 | BSCS_SEND_EVT | BSCS_REPLY | STATE_OPEN_WRITE | BSCS_NO_ERROR)) ) // close without error return(0); if (LEN>0) return (BSCS_VERSION_01 | BSCS_SEND_EVT | BSCS_REPLY | STATE_OPEN_WRITE | BSCS_INCORRECT_REPLY_PACKET_LENGTH); if (msg.STATE & ERR_MASK) // could not write evt return (BSCS_ERROR_COULD_NOT_WRITE_EVT); // invalid packet or error opening file return(msg.STATE); } /**************************************************************************************** REQUEST HEADER ****************************************************************************************/ int bscs_requ_hdr(int sd, HDRTYPE *hdr) { mesg_t msg; int count; if (SERVER_STATE != STATE_OPEN_READ) return(BSCS_ERROR); msg.STATE = BSCS_VERSION_01 | BSCS_REQU_HDR | BSCS_NO_ERROR | (SERVER_STATE & STATE_MASK); msg.LEN = 0; count = send(sd, TC &msg, 8, 0); count = recv(sd, TC &msg, 8, 0); hdr->HeadLen = be32toh(msg.LEN); hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header,hdr->HeadLen); hdr->TYPE = GDF; count = 0; while (hdr->HeadLen > (size_t)count) { count += recv(sd, TC hdr->AS.Header+count, hdr->HeadLen-count, 0); } if (VERBOSE_LEVEL>8) fprintf(stdout,"REQ HDR: %i %s\n",count,GetFileTypeString(hdr->TYPE)); hdr->FLAG.ANONYMOUS = 1; // do not store name gdfbin2struct(hdr); return(count-hdr->HeadLen); } /**************************************************************************************** REQUEST DATA ****************************************************************************************/ ssize_t bscs_requ_dat(int sd, size_t start, size_t length, HDRTYPE *hdr) { /* bufsiz should be equal to hdr->AS.bpb*length */ mesg_t msg; size_t LEN; if (SERVER_STATE != STATE_OPEN_READ) return(BSCS_ERROR); msg.STATE = BSCS_VERSION_01 | BSCS_REQU_DAT | BSCS_NO_ERROR | (SERVER_STATE & STATE_MASK); msg.LEN = htobe32(8); leu32a(length,msg.LOAD+0); leu32a(start, msg.LOAD+4); int s = send(sd, TC &msg, 16, 0); ssize_t count = recv(sd, TC &msg, 8, 0); LEN = be32toh(msg.LEN); hdr->AS.rawdata = (uint8_t*) realloc(hdr->AS.rawdata,LEN); count = 0; while (LEN > (size_t)count) { count += recv(sd, TC hdr->AS.rawdata+count, LEN-count, 0); } hdr->AS.first = start; if (VERBOSE_LEVEL>8) fprintf(stdout,"REQ DAT: %"PRIiPTR" %i\n",count,hdr->AS.bpb); hdr->AS.length= (hdr->AS.bpb ? (size_t)count/hdr->AS.bpb : length); if (VERBOSE_LEVEL>8) fprintf(stdout,"REQ DAT: %"PRIiPTR" %"PRIiPTR"\n",hdr->AS.first,hdr->AS.length); return(0); } /**************************************************************************************** REQUEST EVENT TABLE ****************************************************************************************/ int bscs_requ_evt(int sd, HDRTYPE *hdr) { mesg_t msg; size_t LEN; if (VERBOSE_LEVEL>8) fprintf(stdout,"REQ EVT %08x %08x\n",SERVER_STATE, STATE_OPEN_READ); if (SERVER_STATE != STATE_OPEN_READ) return(BSCS_ERROR); msg.STATE = BSCS_VERSION_01 | BSCS_REQU_EVT | BSCS_NO_ERROR | (SERVER_STATE & STATE_MASK); msg.LEN = htobe32(0); int s = send(sd, TC &msg, 8, 0); // wait for reply s = recv(sd, TC &msg, 8, 0); LEN = be32toh(msg.LEN); if (VERBOSE_LEVEL>8) fprintf(stdout,"REQ EVT: %i %"PRIiPTR" \n",s,LEN); if (LEN>0) { hdr->AS.rawEventData = (uint8_t*)realloc(hdr->AS.rawEventData,LEN); int count = 0; while (LEN > (size_t)count) { count += recv(sd, TC hdr->AS.rawEventData+count, LEN-count, 0); } rawEVT2hdrEVT(hdr, count); // TODO: replace this function because it is inefficient } if (VERBOSE_LEVEL>8) fprintf(stdout,"REQ EVT: %i %"PRIiPTR" \n",s,LEN); #if 0 uint8_t *buf = hdr->AS.rawEventData; if (hdr->VERSION < 1.94) { if (buf[1] | buf[2] | buf[3]) hdr->EVENT.SampleRate = buf[1] + (buf[2] + buf[3]*256.0)*256.0; else { fprintf(stdout,"Warning GDF v1: SampleRate in Eventtable is not set in %s !!!\n",hdr->FileName); hdr->EVENT.SampleRate = hdr->SampleRate; } hdr->EVENT.N = leu32p(buf + 4); } else { hdr->EVENT.N = buf[1] + (buf[2] + buf[3]*256)*256; hdr->EVENT.SampleRate = lef32p(buf + 4); } int sze = (buf[0]>1) ? 12 : 6; hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, hdr->EVENT.N*sizeof(*hdr->EVENT.POS) ); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, hdr->EVENT.N*sizeof(*hdr->EVENT.TYP) ); #endif return(0); } /**************************************************************************************** PUT FILE ****************************************************************************************/ int bscs_put_file(int sd, char *filename) { size_t LEN; mesg_t msg; if (SERVER_STATE != STATE_OPEN_WRITE_HDR) return(BSCS_ERROR); struct stat FileBuf; stat(filename,&FileBuf); LEN = FileBuf.st_size; if (VERBOSE_LEVEL>8) fprintf(stdout,"PUT FILE(1) %s\n",filename); // int sdi = open(filename,O_RDONLY); // if (sdi<=0) return(BSCS_ERROR); FILE *fid = fopen(filename,"r"); if (fid==NULL) return(BSCS_ERROR); msg.STATE = BSCS_VERSION_01 | BSCS_PUT_FILE | STATE_OPEN_WRITE_HDR | BSCS_NO_ERROR; msg.LEN = htobe32(LEN); int s1 = send(sd, TC &msg, 8, 0); //if (VERBOSE_LEVEL>8) fprintf(stdout,"PUT FILE(2) %i %i\n",LEN,sdi); const unsigned BUFLEN = 1024; char buf[BUFLEN]; size_t count = 0; while (count7) fprintf(stdout,"%"PRIiPTR" LEN=%"PRIiPTR" %08x %08x %08x %08x\n",count,LEN,msg.STATE, BSCS_PUT_FILE | BSCS_REPLY , STATE_INIT, (BSCS_VERSION_01 | BSCS_PUT_FILE | BSCS_REPLY | STATE_INIT | BSCS_NO_ERROR)); if ((LEN==0) && (msg.STATE==(BSCS_VERSION_01 | BSCS_PUT_FILE | BSCS_REPLY | STATE_INIT | BSCS_NO_ERROR)) ) // close without error return(0); if (LEN>0) return (BSCS_VERSION_01 | BSCS_PUT_FILE | BSCS_REPLY | STATE_INIT | BSCS_ERROR); // invalid packet or error opening file return(msg.STATE); } /**************************************************************************************** GET FILE ****************************************************************************************/ int bscs_get_file(int sd, uint64_t ID, char *filename) { size_t LEN; mesg_t msg; #if _WIN32 mode_t mode = S_IRUSR | S_IWUSR; #else mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; #endif int sdo = creat(filename, mode); if (VERBOSE_LEVEL>7) fprintf(stdout,"get file (1) %i\n",sdo); msg.STATE = BSCS_VERSION_01 | BSCS_GET_FILE | STATE_INIT | BSCS_NO_ERROR; leu64a(ID, &msg.LOAD); LEN = BSCS_ID_BITLEN>>3; msg.LEN = htobe32(LEN); int s = send(sd, TC &msg, LEN+8, 0); if (VERBOSE_LEVEL>7) fprintf(stdout,"get file (1)\n"); // wait for reply ssize_t count = recv(sd, TC &msg, 8, 0); LEN = be32toh(msg.LEN); SERVER_STATE = msg.STATE & STATE_MASK; if (VERBOSE_LEVEL>7) fprintf(stdout,"get file (3) %"PRIiPTR"\n",LEN); const unsigned BUFLEN = 1024; char buf[BUFLEN]; count = 0; size_t len = 0; while ((size_t)count < LEN) { size_t len = recv(sd, buf, min(LEN - count,BUFLEN), 0); count+=write(sdo,buf,len); } if (VERBOSE_LEVEL>7) fprintf(stdout,"get file (1) %"PRIiPTR"\n",count); close(sdo); if (LEN-count) return(msg.STATE); else // close without error return(0); } /**************************************************************************************** NO OPERATION ****************************************************************************************/ int bscs_nop(int sd) { size_t LEN; mesg_t msg; msg.STATE = BSCS_NOP | SERVER_STATE; msg.LEN = htobe32(0); int s = send(sd, TC &msg, 8, 0); } stimfit-0.15.8/src/libbiosiglite/biosig4c++/physicalunits.h0000664000175000017500000000436713062445067020541 00000000000000/* % Copyright (C) 2005-2012,2015 Alois Schloegl % This file is part of the "BioSig for C/C++" repository % (biosig4c++) at http://biosig.sf.net/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /**************************************************************************** ** ** ** Conversion functions for encoded physical units according to ** ** ISO/IEEE 11073-10101:2004 Vital Signs Units of Measurement ** ** ** ****************************************************************************/ #ifndef __PHYSICALUNITS_H__ #define __PHYSICALUNITS_H__ #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef unsigned __int64 uint16_t; #else #include #endif #ifdef __cplusplus extern "C" { #endif uint16_t PhysDimCode(const char* PhysDim); /* Encodes Physical Dimension as 16bit integer according to ISO/IEEE 11073-10101:2004 Vital Signs Units of Measurement Leading and trailing whitespace are skipped. --------------------------------------------------------------- */ const char* PhysDim3(uint16_t PhysDimCode); /* converts PhysDimCode into a readable Physical Dimension --------------------------------------------------------------- */ double PhysDimScale(uint16_t PhysDimCode); /* returns scaling factor of physical dimension e.g. 0.001 for milli, 1000 for kilo etc. for undefined codes, not-a-number (NAN) is returned --------------------------------------------------------------- */ #ifdef __cplusplus } #endif #endif /* __PHYSICALUNITS_H__ */ stimfit-0.15.8/src/libbiosiglite/biosig4c++/gdftime.h0000664000175000017500000001004113062445067017243 00000000000000/* % Copyright (C) 2005-2013 Alois Schloegl % This file is part of the "BioSig for C/C++" repository % (biosig4c++/libbiosig) at http://biosig.sf.net/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /****************************************************************************/ /** **/ /** DEFINITIONS, TYPEDEFS AND MACROS **/ /** **/ /****************************************************************************/ #ifndef __GDFTIME_H__ #define __GDFTIME_H__ #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef __int64 int64_t; #else #include #endif #include #include #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C #endif /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Conversion of time formats between Unix and GDF format. The default time format in BIOSIG uses a 64-bit fixed point format with reference date 01-Jan-0000 00h00m00s (value=0). One unit indicates the 2^(-32) part of 1 day (ca 20 us). Accordingly, the higher 32 bits count the number of days, the lower 32 bits describe the fraction of a day. 01-Jan-1970 is the day 719529. time_t t0; t0 = time(NULL); T0 = (double)t0/86400.0; // convert seconds in days since 1970-Jan-01 floor(T0) + 719529; // number of days since 01-Jan-0000 floor(ldexp(T0-floor(T0),32)); // fraction x/2^32; one day is 2^32 The following macros define the conversions between the unix time and the GDF format. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ typedef int64_t gdf_time, gdftime_t; /* gdf time is represented in 64 bits */ #define t_time2gdf_time(t) ((gdf_time)floor(ldexp(((double)(t))/86400.0 + 719529.0, 32))) #define gdf_time2t_time(t) ((ldexp(((double)(t)),-32) - 719529.0)*86400.0) #define ntp_time2gdf_time(t) ((gdf_time)ldexp(ldexp(((double)(t)),-32)/86400 + 719529.0 - 70,32)) #define gdf_time2ntp_time(t) ((int64_t)ldexp((ldexp(((double)(t)),-32) - 719529.0 + 70) * 86400,32)) #ifdef __cplusplus EXTERN_C { #endif /* * converts struct tm into gdf_time format */ gdftime_t tm_time2gdf_time(struct tm *t); /* * gdf_time2tm_time converts gdf-time into struct tm format, */ struct tm *gdf_time2tm_time(gdftime_t t); /* * re-entrant version of gdf_time2tm_time, memory for t must be allocated */ int gdf_time2tm_time_r(gdftime_t t, struct tm *tm); /* char *gdftime2string(gdftime_t) char *gdfdate2string(gdftime_t) char *gdfdatetime2string(gdftime_t) gdftime_t string2gdftime(const char*) gdftime_t string2gdfdate(const char*) gdftime_t string2gdfdatetime(const char*) gdftime_t time2gdftime(int,int,float) gdftime_t date2gdftime(int,int,int) gdftime_t datetime2gdftime(int,int,int,int,int,float) void gdftime2datetime(&int,&int,&int,&int,&int,&float) void gdftime2time(&int,&int,&float) void gdftime2date(&int,&int,&int) */ #ifdef __cplusplus } #endif /****************************************************************************/ /** **/ /** EOF **/ /** **/ /****************************************************************************/ #endif /* __BIOSIG_EXT_H__ */ stimfit-0.15.8/src/libbiosiglite/biosig4c++/test0/0000775000175000017500000000000013315356572016601 500000000000000stimfit-0.15.8/src/libbiosiglite/biosig4c++/test0/sandbox.c0000664000175000017500000004752213240263033020317 00000000000000/* sandbox is used for development and under constraction work The functions here are either under construction or experimental. The functions will be either fixed, then they are moved to another place; or the functions are discarded. Do not rely on the interface in this function Copyright (C) 2008-2014 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include "../biosig-dev.h" #include "../biosig.h" // these functions are stubs #ifdef WITH_DCMTK #undef WITH_DICOM #undef WITH_GDCM EXTERN_C int sopen_dicom_read(HDRTYPE* hdr) { fprintf(stdout,"DCMTK is used to read dicom files.\n"); } #endif #ifdef HAVE_HDF #include #endif #ifdef HAVE_MATIO #include #endif #ifdef WITH_GDCM #undef WITH_DICOM #include "gdcmReader.h" //#include "gdcmImageReader.h" //#include "gdcmWriter.h" #include "gdcmDataSet.h" #include "gdcmAttribute.h" //#include "gdcmCommon.h" //#include "gdcmPreamble.h" #include "gdcmFile.h" #include "gdcmFileMetaInformation.h" #include "gdcmWaveform.h" /* This is the list from gdcmconv.cxx #include "gdcmReader.h" #include "gdcmFileDerivation.h" #include "gdcmAnonymizer.h" #include "gdcmVersion.h" #include "gdcmPixmapReader.h" #include "gdcmPixmapWriter.h" #include "gdcmWriter.h" #include "gdcmSystem.h" #include "gdcmFileMetaInformation.h" #include "gdcmDataSet.h" #include "gdcmIconImageGenerator.h" #include "gdcmAttribute.h" #include "gdcmSequenceOfItems.h" #include "gdcmUIDGenerator.h" #include "gdcmImage.h" #include "gdcmImageChangeTransferSyntax.h" #include "gdcmImageApplyLookupTable.h" #include "gdcmImageFragmentSplitter.h" #include "gdcmImageChangePlanarConfiguration.h" #include "gdcmImageChangePhotometricInterpretation.h" #include "gdcmFileExplicitFilter.h" #include "gdcmJPEG2000Codec.h" #include "gdcmJPEGCodec.h" #include "gdcmJPEGLSCodec.h" #include "gdcmSequenceOfFragments.h" */ EXTERN_C int sopen_dicom_read(HDRTYPE* hdr) { fprintf(stdout,"GDCM is used to read dicom files.\n"); gdcm::Reader reader; const gdcm::DataElement *de; reader.SetFileName( hdr->FileName ); if ( !reader.Read() ) { fprintf(stdout,"%s (line %i) \n",__FILE__,__LINE__); return 1; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i)\n",__FILE__,__LINE__); gdcm::File &file = reader.GetFile(); gdcm::FileMetaInformation &header = file.GetHeader(); if ( header.FindDataElement( gdcm::Tag(0x0002, 0x0013 ) ) ) const gdcm::DataElement &de = header.GetDataElement( gdcm::Tag(0x0002, 0x0013) ); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i)\n",__FILE__,__LINE__); gdcm::DataSet &ds = file.GetDataSet(); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i)\n",__FILE__,__LINE__); if ( header.FindDataElement( gdcm::Tag(0x0002, 0x0010 ) ) ) de = &header.GetDataElement( gdcm::Tag(0x0002, 0x0010) ); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x0002,0x0010> len=%i\n",__FILE__,__LINE__,de->GetByteValue() ); if (0) { gdcm::Attribute<0x28,0x100> at; at.SetFromDataElement( ds.GetDataElement( at.GetTag() ) ); if( at.GetValue() != 8 ) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x0002,0x0010> GetValue\n",__FILE__,__LINE__ ); return 1; } at.SetValue( 32 ); ds.Replace( at.GetAsDataElement() ); } { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x0008,0x002a>\n",__FILE__,__LINE__); gdcm::Attribute<0x0008,0x002a> at; ds.GetDataElement( at.GetTag() ); at.SetFromDataElement( ds.GetDataElement( at.GetTag() ) ); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x0008,0x002a>\n",__FILE__,__LINE__); // fprintf(stdout,"DCM: [0008,002a]: %i %p\n", at.GetNumberOfValues(), at.GetValue()); } { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x0008,0x0023>\n",__FILE__,__LINE__); gdcm::Attribute<0x0008,0x0023> at; ds.GetDataElement( at.GetTag() ); at.SetFromDataElement( ds.GetDataElement( at.GetTag() ) ); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x0008,0x0023>\n",__FILE__,__LINE__); } if (1) { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x003a,0x0005>\n",__FILE__,__LINE__); gdcm::Attribute<0x003a,0x0005> NumberOfWaveformChannels; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x003a,0x0005> %i\n",__FILE__,__LINE__, NumberOfWaveformChannels.GetValue()); // ds.GetDataElement( NumberOfWaveformChannels.GetTag() ); // NumberOfWaveformChannels.SetFromDataElement( ds.GetDataElement( NumberOfWaveformChannels.GetTag() ) ); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x003a,0x0005> %i\n",__FILE__,__LINE__, NumberOfWaveformChannels.GetValue()); } { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x003a,0x0010>\n",__FILE__,__LINE__); gdcm::Attribute<0x003a,0x0010> NumberOfWaveformSamples; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x003a,0x0010> %i\n",__FILE__,__LINE__, NumberOfWaveformSamples.GetValue()); // fprintf(stdout,"DCM: [0008,0023]: %i %p\n",at.GetNumberOfValues(), at.GetValue()); } gdcm::Attribute<0x003a,0x001a> SamplingFrequency; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): attr <0x003a,0x001a> %f\n",__FILE__,__LINE__, SamplingFrequency.GetValue()); return 0; } #endif #ifdef __cplusplus extern "C" { #endif #ifdef WITH_HDF int sopen_hdf5(HDRTYPE* hdr) { /* file hdr->FileName is already opened and hdr->HeadLen bytes are read These are available from hdr->AS.Header. ToDo: populate hdr */ size_t count = hdr->HeadLen; fprintf(stdout,"Trying to read HDF data using \"%s\"\n",H5_VERS_INFO); ifclose(hdr); return(-1); } #endif #ifdef HAVE_MATIO int sopen_matlab(HDRTYPE* hdr) { /* file hdr->FileName is already opened and hdr->HeadLen bytes are read These are available from hdr->AS.Header. ToDo: populate hdr sanity checks memory leaks */ ifclose(hdr); //size_t count = hdr->HeadLen; fprintf(stdout, "Trying to read Matlab data using MATIO v%i.%i.%i\n", MATIO_MAJOR_VERSION, MATIO_MINOR_VERSION, MATIO_RELEASE_LEVEL); mat_t *matfile = Mat_Open(hdr->FileName, MAT_ACC_RDONLY); matvar_t *EEG=NULL, *pnts=NULL, *nbchan=NULL, *trials=NULL, *srate=NULL, *data=NULL, *chanlocs=NULL, *event=NULL; if (matfile != NULL) { EEG = Mat_VarRead(matfile, "EEG" ); if (EEG != NULL) { Mat_VarReadDataAll(matfile, EEG ); pnts = Mat_VarGetStructField(EEG, "pnts", BY_NAME, 0); nbchan = Mat_VarGetStructField(EEG, "nbchan", BY_NAME, 0); trials = Mat_VarGetStructField(EEG, "trials", BY_NAME, 0); srate = Mat_VarGetStructField(EEG, "srate", BY_NAME, 0); data = Mat_VarGetStructField(EEG, "data", BY_NAME, 0); chanlocs = Mat_VarGetStructField(EEG, "chanlocs", BY_NAME, 0); event = Mat_VarGetStructField(EEG, "event", BY_NAME, 0); hdr->NS = *(double*)(nbchan->data); hdr->SPR = *(double*)(pnts->data); hdr->NRec= *(double*)(trials->data); hdr->SampleRate = *(double*)(srate->data); /* TODO CB hdr->NRec = ; hdr->SPR = ; hdr->T0 = 0; // Unknown; uint16_t gdftyp = ; 16: float; 17: double */ hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); size_t k; for (k=0; kNS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; sprintf(hc->Label,"#%2d",k+1); hc->SPR = hdr->SPR; /* TODO CB hc->GDFTYP = gdftyp; hc->Transducer[0] = '\0'; hc->LowPass = ; hc->HighPass = ; hc->Notch = ; // unknown hc->PhysMax = ; hc->DigMax = ; hc->PhysMin = ; hc->DigMin = ; hc->Cal = 1.0; hc->Off = 0.0; hc->OnOff = 1; hc->PhysDimCode = 4275; // uV hc->LeadIdCode = 0; hc->bi = k*GDFTYP_BITS[gdftyp]>>3; // TODO AS */ } size_t sz = hdr->NS*hdr->SPR*hdr->NRec*GDFTYP_BITS[gdftyp]>>3; hdr->AS.rawdata = realloc(hdr->AS.rawdata, sz); /* TODO CB memcpy(hdr->AS.rawdata,...,sz); */ hdr->EVENT.N = 0; // TODO CB hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, hdr->EVENT.N*sizeof(*hdr->EVENT.POS)); hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, hdr->EVENT.N*sizeof(*hdr->EVENT.TYP)); hdr->EVENT.DUR = (uint32_t*) realloc(hdr->EVENT.DUR, hdr->EVENT.N*sizeof(*hdr->EVENT.DUR)); hdr->EVENT.CHN = (uint16_t*) realloc(hdr->EVENT.CHN, hdr->EVENT.N*sizeof(*hdr->EVENT.CHN)); for (k=0; kEVENT.N; k++) { /* TODO CB hdr->EVENT.TYP[k] = FreeTextEvent(hdr, k, annotation) hdr->EVENT.POS[k] = hdr->EVENT.CHN[k] = 0; hdr->EVENT.DUR[k] = 0; */ } hdr->AS.bpb = hdr->NS*2; hdr->FLAG.OVERFLOWDETECTION = 0; // BKR does not support automated overflow and saturation detection Mat_VarPrint(pnts, 1); Mat_VarPrint(nbchan, 1); Mat_VarPrint(trials, 1); Mat_VarPrint(srate, 1); //Mat_VarPrint(data, 1); //Mat_VarPrint(chanlocs, 1); //Mat_VarPrint(event, 1); Mat_VarFree(EEG); } Mat_Close(matfile); } return (0); } #endif int sopen_fiff_read(HDRTYPE* hdr) { /* TODO: implement FIFF support define all fields in hdr->.... currently only the first hdr->HeadLen bytes are stored in hdr->AS.Header, all other fields still need to be defined. */ size_t k; /* define basic header */ hdr->NS = 0; // hdr->.... fill in all /* define channel headers */ hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * sizeof(CHANNEL_TYPE)); for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL + k; } /* define event table */ hdr->EVENT.N = 0; //reallocEventTable(hdr, 0); /* report status header and return */ hdr2ascii(hdr,stdout,4); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "FIFF support not completed"); return 0; } int sopen_unipro_read(HDRTYPE* hdr) { hdr->FILE.LittleEndian = (__BYTE_ORDER == __LITTLE_ENDIAN); char *Header1 = (char*)hdr->AS.Header; struct tm t0; char tmp[5]; memset(tmp,0,5); strncpy(tmp,Header1+0x9c,2); t0.tm_mon = atoi(tmp)-1; strncpy(tmp,Header1+0x9e,2); t0.tm_mday = atoi(tmp); strncpy(tmp,Header1+0xa1,2); t0.tm_hour = atoi(tmp); strncpy(tmp,Header1+0xa3,2); t0.tm_min = atoi(tmp); strncpy(tmp,Header1+0xa5,2); t0.tm_sec = atoi(tmp); strncpy(tmp,Header1+0x98,4); t0.tm_year = atoi(tmp)-1900; hdr->T0 = tm_time2gdf_time(&t0); memset(tmp,0,5); strncpy(tmp,Header1+0x85,2); t0.tm_mday = atoi(tmp); strncpy(tmp,Header1+0x83,2); t0.tm_mon = atoi(tmp)-1; strncpy(tmp,Header1+0x7f,4); t0.tm_year = atoi(tmp)-1900; hdr->Patient.Birthday = tm_time2gdf_time(&t0); // filesize = leu32p(hdr->AS.Header + 0x24); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "UNIPRO not supported"); return(0); } #ifdef WITH_DICOM int sopen_dicom_read(HDRTYPE* hdr) { fprintf(stdout,"home-made parser is used to read dicom files.\n"); char FLAG_implicite_VR = 0; int EndOfGroup2=-1; if (hdr->HeadLen<132) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, 132); hdr->HeadLen += ifread(hdr->AS.Header+hdr->HeadLen, 1, 132-hdr->HeadLen, hdr); } size_t count = hdr->HeadLen; size_t pos = 128; while (!hdr->AS.Header[pos] && (pos<128)) pos++; if ((pos==128) && !memcmp(hdr->AS.Header+128,"DICM",4)) { // FLAG_implicite_VR = 0; pos = 132; } else pos = 0; size_t bufsiz = 16384; while (!ifeof(hdr)) { hdr->AS.Header = (uint8_t*)realloc(hdr->AS.Header, count+bufsiz+1); count += ifread(hdr->AS.Header+count, 1, bufsiz, hdr); bufsiz *= 2; } ifclose(hdr); hdr->AS.Header[count] = 0; uint16_t nextTag[2]; struct tm T0; char flag_t0=0; char flag_ignored; uint32_t Tag; uint32_t Len; nextTag[0] = *(uint16_t*)(hdr->AS.Header+pos); nextTag[1] = *(uint16_t*)(hdr->AS.Header+pos+2); while (pos < count) { if ((__BYTE_ORDER == __BIG_ENDIAN) ^ !hdr->FILE.LittleEndian) { // swapping required Tag = (((uint32_t)bswap_16(nextTag[0])) << 16) + bswap_16(nextTag[1]); pos += 4; if (FLAG_implicite_VR) { Len = bswap_32(*(uint32_t*)(hdr->AS.Header+pos)); pos += 4; } else { // explicite_VR if (pos+4 > count) break; if (memcmp(hdr->AS.Header+pos,"OB",2) && memcmp(hdr->AS.Header+pos,"OW",2) && memcmp(hdr->AS.Header+pos,"OF",2) && memcmp(hdr->AS.Header+pos,"SQ",2) && memcmp(hdr->AS.Header+pos,"UT",2) && memcmp(hdr->AS.Header+pos,"UN",2) ) { Len = bswap_16(*(uint16_t*)(hdr->AS.Header+pos+2)); pos += 4; } else { Len = bswap_32(*(uint32_t*)(hdr->AS.Header+pos+4)); pos += 8; } } } else { // no swapping Tag = (((uint32_t)nextTag[0]) << 16) + nextTag[1]; pos += 4; if (FLAG_implicite_VR) { Len = *(uint32_t*)(hdr->AS.Header+pos); pos += 4; } else { // explicite_VR if (pos+4 > count) break; if (memcmp(hdr->AS.Header+pos,"OB",2) && memcmp(hdr->AS.Header+pos,"OW",2) && memcmp(hdr->AS.Header+pos,"OF",2) && memcmp(hdr->AS.Header+pos,"SQ",2) && memcmp(hdr->AS.Header+pos,"UT",2) && memcmp(hdr->AS.Header+pos,"UN",2) ) { Len = *(uint16_t*)(hdr->AS.Header+pos+2); pos += 4; } else { Len = *(uint32_t*)(hdr->AS.Header+pos+4); pos += 8; } } } /* backup next tag, this allows setting of terminating 0 */ if (pos+Len < count) { nextTag[0] = *(uint16_t*)(hdr->AS.Header+pos+Len); nextTag[1] = *(uint16_t*)(hdr->AS.Header+pos+Len+2); hdr->AS.Header[pos+Len] = 0; } flag_ignored = 0; if (VERBOSE_LEVEL>8) fprintf(stdout," %6x: (%04x,%04x) %8d\t%s\n",pos,Tag>>16,Tag&0x0ffff,Len,(char*)hdr->AS.Header+pos); switch (Tag) { /* elements of group 0x0002 use always Explicite VR little Endian encoding */ case 0x00020000: { int c = 0; if (!memcmp(hdr->AS.Header+pos-4,"UL",2)) c = leu32p(hdr->AS.Header+pos); else if (!memcmp(hdr->AS.Header+pos-4,"SL",2)) c = lei32p(hdr->AS.Header+pos); else if (!memcmp(hdr->AS.Header+pos-4,"US",2)) c = leu16p(hdr->AS.Header+pos); else if (!memcmp(hdr->AS.Header+pos-4,"SS",2)) c = lei16p(hdr->AS.Header+pos); else { if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) %i<%i %i>\n",__FILE__,__LINE__,pos,hdr->AS.Header[pos-8],hdr->AS.Header[pos-7]); biosigERROR(hdr, B4C_FORMAT_UNSUPPORTED, "DICOM (0002,0000): unsupported"); } EndOfGroup2 = c + pos; break; } case 0x00020001: break; case 0x00020002: { hdr->NS = 1; char *t = (char*)hdr->AS.Header+pos; while (isspace(*t)) t++; // deblank char *ct[] = { "1.2.840.10008.5.1.4.1.1.9.1.1", "1.2.840.10008.5.1.4.1.1.9.1.2", "1.2.840.10008.5.1.4.1.1.9.1.3", "1.2.840.10008.5.1.4.1.1.9.2.1", "1.2.840.10008.5.1.4.1.1.9.3.1", "1.2.840.10008.5.1.4.1.1.9.4.1" }; if (!strcmp(t,*ct)) hdr->NS = 12; break; } case 0x00020003: break; case 0x00020010: { char *t = (char*)hdr->AS.Header+pos; while (isspace(*t)) t++; // deblank char *ct[] = { "1.2.840.10008.1.2", "1.2.840.10008.1.2.1", "1.2.840.10008.1.2.1.99", "1.2.840.10008.1.2.2" }; if (!strcmp(t,*ct)) FLAG_implicite_VR = 1; else if (!strcmp(t,*ct+1)) FLAG_implicite_VR = 0; else if (!strcmp(t,*ct+3)) FLAG_implicite_VR = 1; break; } case 0x00080020: // StudyDate case 0x00080023: // ContentDate { hdr->AS.Header[pos+8]=0; T0.tm_mday = atoi((char*)hdr->AS.Header+pos+6); hdr->AS.Header[pos+6]=0; T0.tm_mon = atoi((char*)hdr->AS.Header+pos+4)-1; hdr->AS.Header[pos+4]=0; T0.tm_year = atoi((char*)hdr->AS.Header+pos)-1900; flag_t0 |= 1; break; } case 0x0008002a: // AcquisitionDateTime { struct tm t0; hdr->AS.Header[pos+14]=0; t0.tm_sec = atoi((char*)hdr->AS.Header+pos+12); hdr->AS.Header[pos+12]=0; t0.tm_min = atoi((char*)hdr->AS.Header+pos+10); hdr->AS.Header[pos+10]=0; t0.tm_hour = atoi((char*)hdr->AS.Header+pos+8); hdr->AS.Header[pos+8]=0; t0.tm_mday = atoi((char*)hdr->AS.Header+pos+6); hdr->AS.Header[pos+6]=0; t0.tm_mon = atoi((char*)hdr->AS.Header+pos+4)-1; hdr->AS.Header[pos+4]=0; t0.tm_year = atoi((char*)hdr->AS.Header+pos)-1900; hdr->T0 = tm_time2gdf_time(&t0); break; } case 0x00080030: // StudyTime case 0x00080033: // ContentTime { hdr->AS.Header[pos+6]=0; T0.tm_sec = atoi((char*)hdr->AS.Header+pos+4); hdr->AS.Header[pos+4]=0; T0.tm_min = atoi((char*)hdr->AS.Header+pos+2); hdr->AS.Header[pos+2]=0; T0.tm_hour = atoi((char*)hdr->AS.Header+pos); flag_t0 |= 2; break; } case 0x00080070: // Manufacturer { strncpy(hdr->ID.Manufacturer._field,(char*)hdr->AS.Header+pos,MAX_LENGTH_MANUF); hdr->ID.Manufacturer.Name = hdr->ID.Manufacturer._field; break; } case 0x00081050: // Performing Physician { strncpy(hdr->ID.Technician,(char*)hdr->AS.Header+pos,MAX_LENGTH_TECHNICIAN); break; } case 0x00081090: // Manufacturer Model { const size_t nn = strlen(hdr->ID.Manufacturer.Name)+1; strncpy(hdr->ID.Manufacturer._field+nn,(char*)hdr->AS.Header+pos,MAX_LENGTH_MANUF-nn-1); hdr->ID.Manufacturer.Model = hdr->ID.Manufacturer._field+nn; break; } case 0x00100010: // Name if (!hdr->FLAG.ANONYMOUS) { strncpy(hdr->Patient.Name,(char*)hdr->AS.Header+pos,MAX_LENGTH_NAME); hdr->Patient.Name[MAX_LENGTH_NAME]=0; } break; case 0x00100020: // ID strncpy(hdr->Patient.Id,(char*)hdr->AS.Header+pos,MAX_LENGTH_PID); hdr->Patient.Id[MAX_LENGTH_PID]=0; break; case 0x00100030: // Birthday { struct tm t0; t0.tm_sec = 0; t0.tm_min = 0; t0.tm_hour = 12; hdr->AS.Header[pos+8]=0; t0.tm_mday = atoi((char*)hdr->AS.Header+pos+6); hdr->AS.Header[pos+6]=0; t0.tm_mon = atoi((char*)hdr->AS.Header+pos+4)-1; hdr->AS.Header[pos+4]=0; t0.tm_year = atoi((char*)hdr->AS.Header+pos)-1900; hdr->Patient.Birthday = tm_time2gdf_time(&t0); break; } case 0x00100040: hdr->Patient.Sex = (toupper(hdr->AS.Header[pos])=='M') + 2*(toupper(hdr->AS.Header[pos])=='F'); break; case 0x00101010: //Age break; case 0x00101020: hdr->Patient.Height = (uint8_t)(atof((char*)hdr->AS.Header+pos)*100.0); break; case 0x00101030: hdr->Patient.Weight = (uint8_t)atoi((char*)hdr->AS.Header+pos); break; default: flag_ignored = 1; if (VERBOSE_LEVEL<7) fprintf(stdout,"ignored %6x: (%04x,%04x) %8d\t%s\n",pos,Tag>>16,Tag&0x0ffff,Len,(char*)hdr->AS.Header+pos); } if (VERBOSE_LEVEL>6) { if (!FLAG_implicite_VR || (Tag < 0x00030000)) fprintf(stdout,"%s %6x: (%04x,%04x) %8d %c%c \t%s\n",(flag_ignored?"ignored":" "),pos,Tag>>16,Tag&0x0ffff,Len,hdr->AS.Header[pos-8],hdr->AS.Header[pos-7],(char*)hdr->AS.Header+pos); else fprintf(stdout,"%s %6x: (%04x,%04x) %8d\t%s\n",(flag_ignored?"ignored":" "),pos,Tag>>16,Tag&0x0ffff,Len,(char*)hdr->AS.Header+pos); } pos += Len + (Len & 0x01 ? 1 : 0); // even number of bytes } if (flag_t0 == 3) hdr->T0 = tm_time2gdf_time(&T0); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i)\n",__FILE__,__LINE__); return(0); } #endif #ifdef WITH_PDP #include "../NONFREE/sopen_pdp_read.c" #endif #ifdef WITH_TRC #include "../NONFREE/sopen_trc_read.c" #endif #ifdef __cplusplus } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/eventcodes.i0000664000175000017500000003731313062445067017777 00000000000000#if 0 ### This file is autogenerated - Do not modify it !!! ### ### Table of event codes. # This table is also part of the specification of # GDF v2.x http://arxiv.org/abs/cs.DB/0608052 and # GDF v1.x http://pub.ist.ac.at/~schloegl/matlab/eeg/gdf4/TR_GDF.pdf # and part of the BioSig project http://biosig.sf.net/ # Copyright (C) 2004-2015 Alois Schloegl # # BioSig is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # Version 3 of the License, or (at your option) any later version. #endif { 0x0001, 0x0000, "condition 1" }, { 0x0002, 0x0000, "condition 2" }, { 0x0003, 0x0000, "condition 3" }, { 0x0004, 0x0000, "condition 4" }, { 0x0005, 0x0000, "condition 5" }, { 0x0006, 0x0000, "condition 6" }, { 0x0007, 0x0000, "condition 7" }, { 0x0008, 0x0000, "condition 8" }, { 0x0009, 0x0000, "condition 9" }, { 0x000a, 0x0000, "condition 10" }, { 0x000b, 0x0000, "condition 11" }, { 0x000c, 0x0000, "condition 12" }, { 0x000d, 0x0000, "condition 13" }, { 0x000e, 0x0000, "condition 14" }, { 0x000f, 0x0000, "condition 15" }, { 0x0010, 0x0000, "condition 16" }, { 0x0011, 0x0000, "condition 17" }, { 0x0012, 0x0000, "condition 18" }, { 0x0013, 0x0000, "condition 19" }, { 0x0014, 0x0000, "condition 20" }, { 0x0015, 0x0000, "condition 21" }, { 0x0016, 0x0000, "condition 22" }, { 0x0017, 0x0000, "condition 23" }, { 0x0018, 0x0000, "condition 24" }, { 0x0019, 0x0000, "condition 25" }, { 0x001a, 0x0000, "condition 26" }, { 0x001b, 0x0000, "condition 27" }, { 0x001c, 0x0000, "condition 28" }, { 0x001d, 0x0000, "condition 29" }, { 0x001e, 0x0000, "condition 30" }, { 0x001f, 0x0000, "condition 31" }, { 0x0020, 0x0000, "condition 32" }, { 0x0021, 0x0000, "condition 33" }, { 0x0022, 0x0000, "condition 34" }, { 0x0023, 0x0000, "condition 35" }, { 0x0024, 0x0000, "condition 36" }, { 0x0025, 0x0000, "condition 37" }, { 0x0026, 0x0000, "condition 38" }, { 0x0027, 0x0000, "condition 39" }, { 0x0028, 0x0000, "condition 40" }, { 0x0029, 0x0000, "condition 41" }, { 0x002a, 0x0000, "condition 42" }, { 0x002b, 0x0000, "condition 43" }, { 0x002c, 0x0000, "condition 44" }, { 0x002d, 0x0000, "condition 45" }, { 0x002e, 0x0000, "condition 46" }, { 0x002f, 0x0000, "condition 47" }, { 0x0030, 0x0000, "condition 48" }, { 0x0031, 0x0000, "condition 49" }, { 0x0032, 0x0000, "condition 50" }, { 0x0033, 0x0000, "condition 51" }, { 0x0034, 0x0000, "condition 52" }, { 0x0035, 0x0000, "condition 53" }, { 0x0036, 0x0000, "condition 54" }, { 0x0037, 0x0000, "condition 55" }, { 0x0038, 0x0000, "condition 56" }, { 0x0039, 0x0000, "condition 57" }, { 0x003a, 0x0000, "condition 58" }, { 0x003b, 0x0000, "condition 59" }, { 0x003c, 0x0000, "condition 60" }, { 0x003d, 0x0000, "condition 61" }, { 0x003e, 0x0000, "condition 62" }, { 0x003f, 0x0000, "condition 63" }, { 0x0040, 0x0000, "condition 64" }, { 0x0041, 0x0000, "condition 65" }, { 0x0042, 0x0000, "condition 66" }, { 0x0043, 0x0000, "condition 67" }, { 0x0044, 0x0000, "condition 68" }, { 0x0045, 0x0000, "condition 69" }, { 0x0046, 0x0000, "condition 70" }, { 0x0047, 0x0000, "condition 71" }, { 0x0048, 0x0000, "condition 72" }, { 0x0049, 0x0000, "condition 73" }, { 0x004a, 0x0000, "condition 74" }, { 0x004b, 0x0000, "condition 75" }, { 0x004c, 0x0000, "condition 76" }, { 0x004d, 0x0000, "condition 77" }, { 0x004e, 0x0000, "condition 78" }, { 0x004f, 0x0000, "condition 79" }, { 0x0050, 0x0000, "condition 80" }, { 0x0051, 0x0000, "condition 81" }, { 0x0052, 0x0000, "condition 82" }, { 0x0053, 0x0000, "condition 83" }, { 0x0054, 0x0000, "condition 84" }, { 0x0055, 0x0000, "condition 85" }, { 0x0056, 0x0000, "condition 86" }, { 0x0057, 0x0000, "condition 87" }, { 0x0058, 0x0000, "condition 88" }, { 0x0059, 0x0000, "condition 89" }, { 0x005a, 0x0000, "condition 90" }, { 0x005b, 0x0000, "condition 91" }, { 0x005c, 0x0000, "condition 92" }, { 0x005d, 0x0000, "condition 93" }, { 0x005e, 0x0000, "condition 94" }, { 0x005f, 0x0000, "condition 95" }, { 0x0060, 0x0000, "condition 96" }, { 0x0061, 0x0000, "condition 97" }, { 0x0062, 0x0000, "condition 98" }, { 0x0063, 0x0000, "condition 99" }, { 0x0064, 0x0000, "condition 100" }, { 0x0065, 0x0000, "condition 101" }, { 0x0066, 0x0000, "condition 102" }, { 0x0067, 0x0000, "condition 103" }, { 0x0068, 0x0000, "condition 104" }, { 0x0069, 0x0000, "condition 105" }, { 0x006a, 0x0000, "condition 106" }, { 0x006b, 0x0000, "condition 107" }, { 0x006c, 0x0000, "condition 108" }, { 0x006d, 0x0000, "condition 109" }, { 0x006e, 0x0000, "condition 110" }, { 0x006f, 0x0000, "condition 111" }, { 0x0070, 0x0000, "condition 112" }, { 0x0071, 0x0000, "condition 113" }, { 0x0072, 0x0000, "condition 114" }, { 0x0073, 0x0000, "condition 115" }, { 0x0074, 0x0000, "condition 116" }, { 0x0075, 0x0000, "condition 117" }, { 0x0076, 0x0000, "condition 118" }, { 0x0077, 0x0000, "condition 119" }, { 0x0078, 0x0000, "condition 120" }, { 0x0079, 0x0000, "condition 121" }, { 0x007a, 0x0000, "condition 122" }, { 0x007b, 0x0000, "condition 123" }, { 0x007c, 0x0000, "condition 124" }, { 0x007d, 0x0000, "condition 125" }, { 0x007e, 0x0000, "condition 126" }, { 0x007f, 0x0000, "condition 127" }, { 0x0080, 0x0000, "condition 128" }, { 0x0081, 0x0000, "condition 129" }, { 0x0082, 0x0000, "condition 130" }, { 0x0083, 0x0000, "condition 131" }, { 0x0084, 0x0000, "condition 132" }, { 0x0085, 0x0000, "condition 133" }, { 0x0086, 0x0000, "condition 134" }, { 0x0087, 0x0000, "condition 135" }, { 0x0088, 0x0000, "condition 136" }, { 0x0089, 0x0000, "condition 137" }, { 0x008a, 0x0000, "condition 138" }, { 0x008b, 0x0000, "condition 139" }, { 0x008c, 0x0000, "condition 140" }, { 0x008d, 0x0000, "condition 141" }, { 0x008e, 0x0000, "condition 142" }, { 0x008f, 0x0000, "condition 143" }, { 0x0090, 0x0000, "condition 144" }, { 0x0091, 0x0000, "condition 145" }, { 0x0092, 0x0000, "condition 146" }, { 0x0093, 0x0000, "condition 147" }, { 0x0094, 0x0000, "condition 148" }, { 0x0095, 0x0000, "condition 149" }, { 0x0096, 0x0000, "condition 150" }, { 0x0097, 0x0000, "condition 151" }, { 0x0098, 0x0000, "condition 152" }, { 0x0099, 0x0000, "condition 153" }, { 0x009a, 0x0000, "condition 154" }, { 0x009b, 0x0000, "condition 155" }, { 0x009c, 0x0000, "condition 156" }, { 0x009d, 0x0000, "condition 157" }, { 0x009e, 0x0000, "condition 158" }, { 0x009f, 0x0000, "condition 159" }, { 0x00a0, 0x0000, "condition 160" }, { 0x00a1, 0x0000, "condition 161" }, { 0x00a2, 0x0000, "condition 162" }, { 0x00a3, 0x0000, "condition 163" }, { 0x00a4, 0x0000, "condition 164" }, { 0x00a5, 0x0000, "condition 165" }, { 0x00a6, 0x0000, "condition 166" }, { 0x00a7, 0x0000, "condition 167" }, { 0x00a8, 0x0000, "condition 168" }, { 0x00a9, 0x0000, "condition 169" }, { 0x00aa, 0x0000, "condition 170" }, { 0x00ab, 0x0000, "condition 171" }, { 0x00ac, 0x0000, "condition 172" }, { 0x00ad, 0x0000, "condition 173" }, { 0x00ae, 0x0000, "condition 174" }, { 0x00af, 0x0000, "condition 175" }, { 0x00b0, 0x0000, "condition 176" }, { 0x00b1, 0x0000, "condition 177" }, { 0x00b2, 0x0000, "condition 178" }, { 0x00b3, 0x0000, "condition 179" }, { 0x00b4, 0x0000, "condition 180" }, { 0x00b5, 0x0000, "condition 181" }, { 0x00b6, 0x0000, "condition 182" }, { 0x00b7, 0x0000, "condition 183" }, { 0x00b8, 0x0000, "condition 184" }, { 0x00b9, 0x0000, "condition 185" }, { 0x00ba, 0x0000, "condition 186" }, { 0x00bb, 0x0000, "condition 187" }, { 0x00bc, 0x0000, "condition 188" }, { 0x00bd, 0x0000, "condition 189" }, { 0x00be, 0x0000, "condition 190" }, { 0x00bf, 0x0000, "condition 191" }, { 0x00c0, 0x0000, "condition 192" }, { 0x00c1, 0x0000, "condition 193" }, { 0x00c2, 0x0000, "condition 194" }, { 0x00c3, 0x0000, "condition 195" }, { 0x00c4, 0x0000, "condition 196" }, { 0x00c5, 0x0000, "condition 197" }, { 0x00c6, 0x0000, "condition 198" }, { 0x00c7, 0x0000, "condition 199" }, { 0x00c8, 0x0000, "condition 200" }, { 0x00c9, 0x0000, "condition 201" }, { 0x00ca, 0x0000, "condition 202" }, { 0x00cb, 0x0000, "condition 203" }, { 0x00cc, 0x0000, "condition 204" }, { 0x00cd, 0x0000, "condition 205" }, { 0x00ce, 0x0000, "condition 206" }, { 0x00cf, 0x0000, "condition 207" }, { 0x00d0, 0x0000, "condition 208" }, { 0x00d1, 0x0000, "condition 209" }, { 0x00d2, 0x0000, "condition 210" }, { 0x00d3, 0x0000, "condition 211" }, { 0x00d4, 0x0000, "condition 212" }, { 0x00d5, 0x0000, "condition 213" }, { 0x00d6, 0x0000, "condition 214" }, { 0x00d7, 0x0000, "condition 215" }, { 0x00d8, 0x0000, "condition 216" }, { 0x00d9, 0x0000, "condition 217" }, { 0x00da, 0x0000, "condition 218" }, { 0x00db, 0x0000, "condition 219" }, { 0x00dc, 0x0000, "condition 220" }, { 0x00dd, 0x0000, "condition 221" }, { 0x00de, 0x0000, "condition 222" }, { 0x00df, 0x0000, "condition 223" }, { 0x00e0, 0x0000, "condition 224" }, { 0x00e1, 0x0000, "condition 225" }, { 0x00e2, 0x0000, "condition 226" }, { 0x00e3, 0x0000, "condition 227" }, { 0x00e4, 0x0000, "condition 228" }, { 0x00e5, 0x0000, "condition 229" }, { 0x00e6, 0x0000, "condition 230" }, { 0x00e7, 0x0000, "condition 231" }, { 0x00e8, 0x0000, "condition 232" }, { 0x00e9, 0x0000, "condition 233" }, { 0x00ea, 0x0000, "condition 234" }, { 0x00eb, 0x0000, "condition 235" }, { 0x00ec, 0x0000, "condition 236" }, { 0x00ed, 0x0000, "condition 237" }, { 0x00ee, 0x0000, "condition 238" }, { 0x00ef, 0x0000, "condition 239" }, { 0x00f0, 0x0000, "condition 240" }, { 0x00f1, 0x0000, "condition 241" }, { 0x00f2, 0x0000, "condition 242" }, { 0x00f3, 0x0000, "condition 243" }, { 0x00f4, 0x0000, "condition 244" }, { 0x00f5, 0x0000, "condition 245" }, { 0x00f6, 0x0000, "condition 246" }, { 0x00f7, 0x0000, "condition 247" }, { 0x00f8, 0x0000, "condition 248" }, { 0x00f9, 0x0000, "condition 249" }, { 0x00fa, 0x0000, "condition 250" }, { 0x00fb, 0x0000, "condition 251" }, { 0x00fc, 0x0000, "condition 252" }, { 0x00fd, 0x0000, "condition 253" }, { 0x00fe, 0x0000, "condition 254" }, { 0x00ff, 0x0000, "condition 255" }, { 0x0101, 0x0100, "artifact:EOG (blinks, fast, large amplitude)" }, { 0x0102, 0x0100, "artifact:ECG" }, { 0x0103, 0x0100, "artifact:EMG/Muscle" }, { 0x0104, 0x0100, "artifact:Movement" }, { 0x0105, 0x0100, "artifact:Failing Electrode" }, { 0x0106, 0x0100, "artifact:Sweat" }, { 0x0107, 0x0100, "artifact:50/60 Hz mains interference" }, { 0x0108, 0x0100, "artifact:breathing" }, { 0x0109, 0x0100, "artifact:pulse" }, { 0x010a, 0x0100, "artifact:EOG (slow, small amplitudes)" }, { 0x0111, 0x0110, "eeg:Sleep spindles" }, { 0x0112, 0x0110, "eeg:K-complexes" }, { 0x0113, 0x0110, "eeg:Saw-tooth waves" }, { 0x0114, 0x0110, "eeg:Idling EEG - eyes open" }, { 0x0115, 0x0110, "eeg:Idling EEG - eyes closed" }, { 0x0116, 0x0110, "eeg:spike" }, { 0x0117, 0x0110, "eeg:seizure" }, { 0x0121, 0x0120, "VEP: visual EP" }, { 0x0122, 0x0120, "AEP: auditory EP" }, { 0x0123, 0x0120, "SEP: somato-sensory EP" }, { 0x012F, 0x0120, "TMS: transcranial magnetic stimulation " }, { 0x0131, 0x0130, "SSVEP" }, { 0x0132, 0x0130, "SSAEP" }, { 0x0133, 0x0130, "SSSEP" }, { 0x0140, 0x0140, "response code 0, or no response or false" }, { 0x0141, 0x0140, "response code 1, or correct response" }, { 0x0142, 0x0140, "response code 2" }, { 0x0143, 0x0140, "response code 3" }, { 0x0144, 0x0140, "Go, or response code 4" }, { 0x0145, 0x0140, "NoGo, or response code 5" }, { 0x0201, 0x0200, "Spike, action potential (fiducial point)" }, { 0x0202, 0x0200, "Burst " }, { 0x0203, 0x0200, "maximum slope time" }, { 0x0204, 0x0200, "peak time of spike" }, { 0x0300, 0x0300, "Start of Trial, Trigger at t=0s" }, { 0x0301, 0x0300, "class1, Left hand" }, { 0x0302, 0x0300, "class2, Right hand" }, { 0x0303, 0x0300, "class3, Foot, towards Right - cue onset (BCI experiment)" }, { 0x0304, 0x0300, "class4, Tongue" }, { 0x0305, 0x0300, "class5" }, { 0x0306, 0x0300, "class6, towards Down" }, { 0x0307, 0x0300, "class7" }, { 0x0308, 0x0300, "class8" }, { 0x0309, 0x0300, "class9, towards Left " }, { 0x030A, 0x0300, "class10 " }, { 0x030B, 0x0300, "class11 " }, { 0x030C, 0x0300, "class12, towards Up " }, { 0x030D, 0x0300, "Feedback (continuous) - onset (BCI experiment)" }, { 0x030E, 0x0300, "Feedback (discrete) - onset (BCI experiment)" }, { 0x030F, 0x0300, "cue unknown/undefined (used for BCI competition) " }, { 0x0311, 0x0300, "Beep (accustic stimulus, BCI experiment)" }, { 0x0312, 0x0300, "Cross on screen (BCI experiment)" }, { 0x0313, 0x0300, "Flashing light" }, { 0x0381, 0x0300, "target hit, task successful, correct classification" }, { 0x0382, 0x0300, "target missed, task not reached, incorrect classification" }, { 0x03ff, 0x0300, "Rejection of whole trial" }, { 0x0401, 0x0400, "Obstructive apnea/Hypopnea event (OAHE)" }, { 0x0402, 0x0400, "RERA #(Respiratory Effort Related Arousal)" }, { 0x0403, 0x0400, "Central Apnea/Hypopnea Event (CAHE)" }, { 0x0404, 0x0400, "CS Breathing #(Cheyne-Stokes Breathing)" }, { 0x0405, 0x0400, "Hypoventilation " }, { 0x0406, 0x0400, "Apnea " }, { 0x0407, 0x0400, "Obstructive apnea" }, { 0x0408, 0x0400, "Central apnea " }, { 0x0409, 0x0400, "Mixed apnea " }, { 0x040A, 0x0400, "Hypopnea " }, { 0x040B, 0x0400, "Periodic Breathing " }, { 0x040C, 0x0400, "Limb movement " }, { 0x040D, 0x0400, "PLMS" }, { 0x040E, 0x0400, "(time of) maximum inspiration " }, { 0x040F, 0x0400, "Start of inspiration, (end of expiration) " }, { 0x0410, 0x0410, "Sleep stage Wake" }, { 0x0411, 0x0410, "Sleep stage 1" }, { 0x0412, 0x0410, "Sleep stage 2" }, { 0x0413, 0x0410, "Sleep stage 3" }, { 0x0414, 0x0410, "Sleep stage 4" }, { 0x0415, 0x0410, "Sleep stage REM" }, { 0x0416, 0x0410, "Sleep stage ?" }, { 0x0417, 0x0410, "Movement time" }, { 0x0418, 0x0410, "Bruxism" }, { 0x0419, 0x0410, "RBD #(Rapid eye movement sleep behaviour disorder)" }, { 0x041A, 0x0410, "RMD #(Sleep related rhythmic movement disorder)" }, { 0x041B, 0x0410, "Sleep stage N" }, { 0x041C, 0x0410, "Sleep stage N1" }, { 0x041D, 0x0410, "Sleep stage N2" }, { 0x041E, 0x0410, "Sleep stage N3" }, { 0x0420, 0x0420, "Lights on " }, { 0x0431, 0x0430, "eyes left" }, { 0x0432, 0x0430, "eyes right" }, { 0x0433, 0x0430, "eyes up" }, { 0x0434, 0x0430, "eyes down" }, { 0x0435, 0x0430, "horizontal eye movement" }, { 0x0436, 0x0430, "vertical eye movement" }, { 0x0437, 0x0430, "eye rotation (clockwise)" }, { 0x0438, 0x0430, "eye rotation (counterclockwise)" }, { 0x0439, 0x0430, "eye blinks" }, { 0x0441, 0x0440, "left hand movement" }, { 0x0442, 0x0440, "right hand movement" }, { 0x0443, 0x0440, "head movement" }, { 0x0444, 0x0440, "tongue movement" }, { 0x0445, 0x0440, "swallowing" }, { 0x0446, 0x0440, "biting, chewing, teeth griding " }, { 0x0447, 0x0440, "foot movement" }, { 0x0449, 0x0440, "arm movement" }, { 0x044a, 0x0440, "arm (right) movement" }, { 0x0501, 0x0500, "ecg:Fiducial point of QRS complex" }, { 0x0502, 0x0500, "ecg:P-wave-onset, MDC_ECG_TIME_START_P" }, { 0x0503, 0x0500, "ecg:Q-wave-onset, QRS-onset, MDC_ECG_TIME_START_QRS" }, { 0x0504, 0x0500, "ecg:R-point" }, { 0x0505, 0x0500, "ecg:S-wave-onset, S-wave-peak" }, { 0x0506, 0x0500, "ecg:T-wave-onset, MDC_ECG_TIME_START_T" }, { 0x0507, 0x0500, "ecg:U-wave-onset" }, { 0x0580, 0x0580, "start" }, { 0x0581, 0x0580, " 25 Watt" }, { 0x0582, 0x0580, " 50 Watt" }, { 0x0583, 0x0580, " 75 Watt" }, { 0x0584, 0x0580, "100 Watt" }, { 0x0585, 0x0580, "125 Watt" }, { 0x0586, 0x0580, "150 Watt" }, { 0x0587, 0x0580, "175 Watt" }, { 0x0588, 0x0580, "200 Watt" }, { 0x0589, 0x0580, "225 Watt" }, { 0x058a, 0x0580, "250 Watt" }, { 0x058b, 0x0580, "275 Watt" }, { 0x058c, 0x0580, "300 Watt" }, { 0x058d, 0x0580, "325 Watt" }, { 0x058e, 0x0580, "350 Watt" }, { 0x7ffe, 0x7f00, "start of a new segment (after a break)" }, { 0x7fff, 0x7f00, "non-equidistant sampling value" }, stimfit-0.15.8/src/libbiosiglite/biosig4c++/t220/0000775000175000017500000000000013315356572016231 500000000000000stimfit-0.15.8/src/libbiosiglite/biosig4c++/t220/sopen_scp_write.c0000664000175000017500000006721113240263033021511 00000000000000/* Copyright (C) 2005-2018 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. */ #include #include #include #include #include "../biosig-dev.h" #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) #ifdef __cplusplus extern "C" { #endif int sopen_SCP_write(HDRTYPE* hdr) { /* This function is an auxillary function and is only called by the function SOPEN in "biosig.c" Input: HDRTYPE *hdr // defines the HDR structure according to "biosig.h" hdr->VERSION specifies the target version */ uint8_t* ptr; // pointer to memory mapping of the file layout uint8_t* PtrCurSect; // point to current section int curSect; uint32_t len; uint16_t crc; uint32_t i; uint32_t sectionStart; struct tm* T0_tm; double AVM, avm; uint16_t avm16; struct aecg* aECG; assert(hdr != NULL); assert(hdr->TYPE == SCP_ECG); if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) : V%f\n",__FILE__,__LINE__,hdr->VERSION); if ((fabs(hdr->VERSION - 1.3)<0.01) && (fabs(hdr->VERSION-2.0)<0.01) && (fabs(hdr->VERSION-3.0)<0.01)) fprintf(stderr,"Warning SOPEN (SCP-WRITE): Version %f not supported\n",hdr->VERSION); uint8_t versionSection = (hdr->VERSION < 3.0) ? 20 : 29; // (uint8_t)round(hdr->VERSION*10); // implemented version number uint8_t versionProtocol = versionSection; if (hdr->aECG==NULL) { fprintf(stderr,"Warning SOPEN_SCP_WRITE: No aECG info defined\n"); hdr->aECG = malloc(sizeof(struct aecg)); aECG = (struct aecg*)hdr->aECG; aECG->diastolicBloodPressure=0.0; aECG->systolicBloodPressure=0.0; aECG->MedicationDrugs="/0"; aECG->ReferringPhysician="/0"; aECG->LatestConfirmingPhysician="/0"; aECG->Diagnosis="/0"; aECG->EmergencyLevel=0; #if (BIOSIG_VERSION < 10500) aECG->Section8.NumberOfStatements = 0; aECG->Section8.Statements = NULL; aECG->Section11.NumberOfStatements = 0; aECG->Section11.Statements = NULL; #endif } else aECG = (struct aecg*)hdr->aECG; //fprintf(stdout,"SCP-Write: IIb %s\n",hdr->aECG->ReferringPhysician); /* predefined values */ aECG->Section1.Tag14.INST_NUMBER = 0; // tag 14, byte 1-2 aECG->Section1.Tag14.DEPT_NUMBER = 0; // tag 14, byte 3-4 aECG->Section1.Tag14.DEVICE_ID = 0; // tag 14, byte 5-6 aECG->Section1.Tag14.DeviceType = 0; // tag 14, byte 7: 0: Cart, 1: System (or Host) aECG->Section1.Tag14.MANUF_CODE = 255; // tag 14, byte 8 (MANUF_CODE has to be 255) aECG->Section1.Tag14.MOD_DESC = "Cart1"; // tag 14, byte 9 (MOD_DESC has to be "Cart1") aECG->Section1.Tag14.VERSION = versionSection; // tag 14, byte 15 (VERSION * 10) aECG->Section1.Tag14.PROT_COMP_LEVEL = 0xA0; // tag 14, byte 16 (PROT_COMP_LEVEL has to be 0xA0 => level II) // tag 14, byte 17 (LANG_SUPP_CODE has to be 0x00 => Ascii only, latin and 1-byte code, 0x37: UTF-8) aECG->Section1.Tag14.LANG_SUPP_CODE = (versionSection < 25) ? 0x00 : 0x37; aECG->Section1.Tag14.ECG_CAP_DEV = 0xD0; // tag 14, byte 18 (ECG_CAP_DEV has to be 0xD0 => Acquire, (No Analysis), Print and Store) aECG->Section1.Tag14.MAINS_FREQ = 0; // tag 14, byte 19 (MAINS_FREQ has to be 0: unspecified, 1: 50 Hz, 2: 60Hz) aECG->Section1.Tag14.ANAL_PROG_REV_NUM = ""; aECG->Section1.Tag14.SERIAL_NUMBER_ACQ_DEV = ""; aECG->Section1.Tag14.ACQ_DEV_SYS_SW_ID = ""; aECG->Section1.Tag14.ACQ_DEV_SCP_SW = "OpenECG XML-SCP 1.00"; // tag 14, byte 38 (SCP_IMPL_SW has to be "OpenECG XML-SCP 1.00") aECG->Section1.Tag14.ACQ_DEV_MANUF = "Manufacturer"; // tag 14, byte 38 (ACQ_DEV_MANUF has to be "Manufacturer") aECG->Section5.Length = 0; aECG->Section6.Length = 0; /* */ aECG->FLAG.HUFFMAN = 0; aECG->FLAG.REF_BEAT= 0; aECG->FLAG.DIFF = 0; aECG->FLAG.BIMODAL = 0; /* check channels: disable channels that do not have a known ECG LeadId disable channels with physical units other than Voltage. The number of channels for conversion is stored in NS. */ typeof(hdr->NS) NS = 0, k; for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE *CH=hdr->CHANNEL+k; if ( CH->LeadIdCode > 255) CH->OnOff = 0; if ( (CH->PhysDimCode & 0xffe0) != PhysDimCode("V")) CH->OnOff = 0; if (CH->OnOff != 1) continue; NS++; } if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) : v%f VERSION=%i\n",__FILE__,__LINE__, hdr->VERSION, versionSection); ptr = (uint8_t*)hdr->AS.Header; int NSections = (versionSection < 25) ? 12 : 19; // initialize section 0 sectionStart = 6+16+NSections*10; ptr = (uint8_t*)realloc(ptr,sectionStart); memset(ptr,0,sectionStart); uint32_t curSectLen; // current section length for (curSect=NSections-1; curSect>=0; curSect--) { curSectLen = 0; // current section length //ptr = (uint8_t*)realloc(ptr,sectionStart+curSectLen); // if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i) : Section %i/%i %i %p\n",__FILE__,__LINE__,curSect,NSections,sectionStart,ptr); if (curSect==0) // SECTION 0 { hdr->HeadLen = sectionStart; // length of all other blocks together ptr = (uint8_t*)realloc(ptr,hdr->HeadLen); // total file length curSectLen = 16; // current section length sectionStart = 6; curSectLen += NSections*10; } else if (curSect==1) // SECTION 1 { ptr = (uint8_t*)realloc(ptr,sectionStart+10000); PtrCurSect = ptr+sectionStart; curSectLen = 16; // current section length char *nextPartOfPatientName=hdr->Patient.Name; if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 0 \n"); // Tag 0 (max len = 64) if (!hdr->FLAG.ANONYMOUS && (nextPartOfPatientName != NULL) && strlen(nextPartOfPatientName)) { *(ptr+sectionStart+curSectLen) = 0; // tag len = strcspn(nextPartOfPatientName, "\x1f"); leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)ptr+sectionStart+curSectLen+3,nextPartOfPatientName,len); // field nextPartOfPatientName += len+1; curSectLen += len+3; } if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 1 \n"); // Tag 1 (max len = 64) Firstname if (!hdr->FLAG.ANONYMOUS && (nextPartOfPatientName != NULL) && strlen(nextPartOfPatientName)) { *(ptr+sectionStart+curSectLen) = 1; // tag len = strcspn(nextPartOfPatientName, "\x1f"); leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)ptr+sectionStart+curSectLen+3,nextPartOfPatientName,len); // field nextPartOfPatientName += len+1; curSectLen += len+3; } // Tag 2 (max len = 64) Patient ID if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 2 \n"); // if (hdr->Patient.Id != NULL) { if (strlen(hdr->Patient.Id)>0) { *(ptr+sectionStart+curSectLen) = 2; // tag len = strlen(hdr->Patient.Id) + 1; leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)ptr+sectionStart+curSectLen+3,hdr->Patient.Id,len); // field curSectLen += len+3; } // Tag 3 (max len = 64) Second Last Name if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 3 \n"); if (!hdr->FLAG.ANONYMOUS && (nextPartOfPatientName != NULL) && strlen(nextPartOfPatientName)) { *(ptr+sectionStart+curSectLen) = 3; // tag len = strcspn(nextPartOfPatientName, "\x1f"); leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)ptr+sectionStart+curSectLen+3,nextPartOfPatientName,len); // field nextPartOfPatientName += len+1; curSectLen += len+3; } // Tag 5 (len = 4) if ((hdr->Patient.Birthday) > 0) { T0_tm = gdf_time2tm_time(hdr->Patient.Birthday); *(ptr+sectionStart+curSectLen) = 5; // tag leu16a(4, ptr+sectionStart+curSectLen+1); // length leu16a(T0_tm->tm_year+1900, ptr+sectionStart+curSectLen+3);// year *(ptr+sectionStart+curSectLen+5) = (uint8_t)(T0_tm->tm_mon + 1); // month *(ptr+sectionStart+curSectLen+6) = (uint8_t)(T0_tm->tm_mday); // day curSectLen += 7; } // Tag 6 (len = 3) Height if (hdr->Patient.Height>0.0) { *(ptr+sectionStart+curSectLen) = 6; // tag leu16a(3, ptr+sectionStart+curSectLen+1); // length leu16a(hdr->Patient.Height, ptr+sectionStart+curSectLen+3); // value *(ptr+sectionStart+curSectLen+5) = 1; // cm curSectLen += 6; } // Tag 7 (len = 3) Weight if (hdr->Patient.Weight>0.0) { *(ptr+sectionStart+curSectLen) = 7; // tag leu16a(3, ptr+sectionStart+curSectLen+1); // length leu16a(hdr->Patient.Weight, ptr+sectionStart+curSectLen+3); // value *(ptr+sectionStart+curSectLen+5) = 1; // kg curSectLen += 6; } // Tag 8 (len = 1) if (hdr->Patient.Sex != 0) { *(ptr+sectionStart+curSectLen) = 8; // tag leu16a(1, ptr+sectionStart+curSectLen+1); // length *(ptr+sectionStart+curSectLen+3) = hdr->Patient.Sex; // value curSectLen += 4; } // Tag 11 (len = 2) if (aECG->systolicBloodPressure>0.0) { *(ptr+sectionStart+curSectLen) = 11; // tag leu16a(2, ptr+sectionStart+curSectLen+1); // length leu16a((uint16_t)aECG->systolicBloodPressure, ptr+sectionStart+curSectLen+3); // value curSectLen += 5; }; // Tag 12 (len = 2) if (aECG->diastolicBloodPressure>0.0) { *(ptr+sectionStart+curSectLen) = 12; // tag leu16a(2, ptr+sectionStart+curSectLen+1); // length leu16a((uint16_t)aECG->diastolicBloodPressure, ptr+sectionStart+curSectLen+3); // value curSectLen += 5; }; // Tag 13 (max len = 80) aECG->Diagnosis=""; len = strlen(aECG->Diagnosis); if (len>0) { *(ptr+sectionStart+curSectLen) = 13; // tag len = min(64,len+1); leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)(ptr+sectionStart+curSectLen+3),aECG->Diagnosis,len); curSectLen += 3+len; }; // Tag 14 (max len = 2 + 2 + 2 + 1 + 1 + 6 + 1 + 1 + 1 + 1 + 1 + 16 + 1 + 25 + 25 + 25 + 25 + 25) if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 14 \n"); // Total = 161 (max value) *(ptr+sectionStart+curSectLen) = 14; // tag //len = 41; // minimum length // leu16a(len, ptr+sectionStart+curSectLen+1); // length memset(ptr+sectionStart+curSectLen+3,0,41); // dummy value curSectLen += 3; leu16a(aECG->Section1.Tag14.INST_NUMBER, ptr+sectionStart+curSectLen); leu16a(aECG->Section1.Tag14.DEPT_NUMBER, ptr+sectionStart+curSectLen+2); leu16a(aECG->Section1.Tag14.DEVICE_ID, ptr+sectionStart+curSectLen+4); *(ptr+sectionStart+curSectLen+ 6) = aECG->Section1.Tag14.DeviceType; *(ptr+sectionStart+curSectLen+ 7) = aECG->Section1.Tag14.MANUF_CODE; // tag 14, byte 7 (MANUF_CODE has to be 255) strncpy((char*)(ptr+sectionStart+curSectLen+8), aECG->Section1.Tag14.MOD_DESC, 6); // tag 14, byte 7 (MOD_DESC has to be "Cart1") *(ptr+sectionStart+curSectLen+14) = versionSection; // tag 14, byte 14 (VERSION has to be 20) *(ptr+sectionStart+curSectLen+14) = aECG->Section1.Tag14.VERSION; *(ptr+sectionStart+curSectLen+15) = aECG->Section1.Tag14.PROT_COMP_LEVEL; // tag 14, byte 15 (PROT_COMP_LEVEL has to be 0xA0 => level II) *(ptr+sectionStart+curSectLen+16) = aECG->Section1.Tag14.LANG_SUPP_CODE; // tag 14, byte 16 (LANG_SUPP_CODE has to be 0x00 => Ascii only, latin and 1-byte code) *(ptr+sectionStart+curSectLen+17) = aECG->Section1.Tag14.ECG_CAP_DEV; // tag 14, byte 17 (ECG_CAP_DEV has to be 0xD0 => Acquire, (No Analysis), Print and Store) *(ptr+sectionStart+curSectLen+18) = aECG->Section1.Tag14.MAINS_FREQ; // tag 14, byte 18 (MAINS_FREQ has to be 0: unspecified, 1: 50 Hz, 2: 60Hz) *(ptr+sectionStart+curSectLen+35) = strlen(aECG->Section1.Tag14.ANAL_PROG_REV_NUM)+1; // tag 14, byte 34 => length of ANAL_PROG_REV_NUM + 1 = 1 uint16_t len1 = 36; char* tmp; tmp = aECG->Section1.Tag14.ANAL_PROG_REV_NUM; len = min(25, strlen(tmp) + 1); strncpy((char*)(ptr+sectionStart+curSectLen+len1), tmp, len); len1 += len; tmp = aECG->Section1.Tag14.SERIAL_NUMBER_ACQ_DEV; len = min(25, strlen(tmp) + 1); strncpy((char*)(ptr+sectionStart+curSectLen+len1), tmp, len); len1 += len; tmp = aECG->Section1.Tag14.ACQ_DEV_SYS_SW_ID; len = min(25, strlen(tmp) + 1); strncpy((char*)(ptr+sectionStart+curSectLen+len1), tmp, len); len1 += len; tmp = aECG->Section1.Tag14.ACQ_DEV_SCP_SW; len = min(25, strlen(tmp) + 1); strncpy((char*)(ptr+sectionStart+curSectLen+len1), tmp, len); len1 += len; tmp = aECG->Section1.Tag14.ACQ_DEV_MANUF; len = min(25, strlen(tmp) + 1); strncpy((char*)(ptr+sectionStart+curSectLen+len1), tmp, len); len1 += len; leu16a(len1, ptr+sectionStart+curSectLen+1-3); // length curSectLen += len1; // Tag 16 (max len = 80) if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 16 \n"); len = hdr->ID.Hospital ? strlen(hdr->ID.Hospital) : 0; if (len > 0) { *(ptr+sectionStart+curSectLen) = 16; // tag len = min(64,len+1); leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)(ptr+sectionStart+curSectLen+3),hdr->ID.Hospital,len); curSectLen += 3+len; } // Tag 20 (max len = 64 ) if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 20 \n"); len = aECG->ReferringPhysician ? strlen(aECG->ReferringPhysician) : 0; if (len > 0) { *(ptr+sectionStart+curSectLen) = 20; // tag len = min(64,len+1); leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)(ptr+sectionStart+curSectLen+3),aECG->ReferringPhysician,len); curSectLen += 3+len; }; // Tag 21 (max len = 64 ) if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 21 \n"); len = aECG->MedicationDrugs ? strlen(aECG->MedicationDrugs) : 0; if (len>0) { *(ptr+sectionStart+curSectLen) = 21; // tag len = min(64,len+1); leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)(ptr+sectionStart+curSectLen+3),aECG->MedicationDrugs,len); curSectLen += 3+len; }; // Tag 22 (max len = 40 ) if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 22 \n"); len = hdr->ID.Technician ? strlen(hdr->ID.Technician) : 0; if (len > 0) { *(ptr+sectionStart+curSectLen) = 22; // tag len = min(64,len+1); leu16a(len, ptr+sectionStart+curSectLen+1); // length strncpy((char*)(ptr+sectionStart+curSectLen+3),hdr->ID.Technician,len); curSectLen += 3+len; } // Tag 24 ( len = 1 ) if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 24 \n"); *(ptr+sectionStart+curSectLen) = 24; // tag leu16a(1, ptr+sectionStart+curSectLen+1); // length *(ptr+sectionStart+curSectLen+3) = aECG->EmergencyLevel; curSectLen += 4; // Tag 25 (len = 4) if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 25 \n"); gdf_time T1 = hdr->T0; #ifndef __APPLE__ T1 += (int32_t)ldexp(timezone/86400.0,32); #endif T0_tm = gdf_time2tm_time(T1); *(ptr+sectionStart+curSectLen) = 25; // tag leu16a(4, ptr+sectionStart+curSectLen+1); // length leu16a(T0_tm->tm_year+1900, ptr+sectionStart+curSectLen+3);// year *(ptr+sectionStart+curSectLen+5) = (uint8_t)(T0_tm->tm_mon + 1);// month *(ptr+sectionStart+curSectLen+6) = (uint8_t)T0_tm->tm_mday; // day curSectLen += 7; // Tag 26 (len = 3) *(ptr+sectionStart+curSectLen) = 26; // tag leu16a(3, ptr+sectionStart+curSectLen+1); // length *(ptr+sectionStart+curSectLen+3) = (uint8_t)T0_tm->tm_hour; // hour *(ptr+sectionStart+curSectLen+4) = (uint8_t)T0_tm->tm_min; // minute *(ptr+sectionStart+curSectLen+5) = (uint8_t)T0_tm->tm_sec; // second curSectLen += 6; if (NS>0) { CHANNEL_TYPE *CH = hdr->CHANNEL; while (CH->OnOff != 1) CH++; // Tag 27 (len = 3) highpass filter *(ptr+sectionStart+curSectLen) = 27; // tag leu16a(2, ptr+sectionStart+curSectLen+1); // length leu16a((uint16_t)CH->HighPass, ptr+sectionStart+curSectLen+3); // hour curSectLen += 5; // Tag 28 (len = 3) lowpass filter *(ptr+sectionStart+curSectLen) = 28; // tag leu16a(2, ptr+sectionStart+curSectLen+1); // length leu16a((uint16_t)CH->LowPass, ptr+sectionStart+curSectLen+3); // hour curSectLen += 5; // Tag 29 (len = 1) filter bitmap uint8_t bitmap = 0; if (fabs(CH->LowPass-60.0)<0.01) bitmap = 1; else if (fabs(CH->LowPass-50.0)<0.01) bitmap = 2; else bitmap = 0; *(ptr+sectionStart+curSectLen) = 29; // tag leu16a(1, ptr+sectionStart+curSectLen+1); // length *(ptr+sectionStart+curSectLen+3) = bitmap; curSectLen += 4; } // Tag 32 (len = 5) if (VERBOSE_LEVEL>7) fprintf(stdout,"Section 1 Tag 32 \n"); *(ptr+sectionStart+curSectLen) = 32; // tag leu16a(2, ptr+sectionStart+curSectLen+1); // length if (hdr->Patient.Impairment.Heart==1) { *(ptr+sectionStart+curSectLen+3) = 0; *(ptr+sectionStart+curSectLen+4) = 1; // Apparently healthy curSectLen += 5; } else if (hdr->Patient.Impairment.Heart==3) { *(ptr+sectionStart+curSectLen+3) = 0; *(ptr+sectionStart+curSectLen+4) = 42; // Implanted cardiac pacemaker curSectLen += 5; } // Tag 34 (len = 5) *(ptr+sectionStart+curSectLen) = 34; // tag leu16a(5, ptr+sectionStart+curSectLen+1); // length lei16a(hdr->tzmin, ptr+sectionStart+curSectLen+3); lei16a(0, ptr+sectionStart+curSectLen+5); curSectLen += 8; // Tag 255 (len = 0) *(ptr+sectionStart+curSectLen) = 255; // tag leu16a(0, ptr+sectionStart+curSectLen+1); // length curSectLen += 3; // Evaluate the size and correct it if odd if (curSectLen & 1) { *(ptr+sectionStart+curSectLen++) = 0; } if (VERBOSE_LEVEL>7) fprintf(stdout,"End-of-Section %i %p\n",curSect,ptr); } else if (curSect==2) // SECTION 2 { } else if (curSect==3) // SECTION 3 { ptr = (uint8_t*)realloc(ptr,sectionStart+16+2+9*NS+1); PtrCurSect = ptr+sectionStart; curSectLen = 16; // current section length // Number of leads enclosed *(ptr+sectionStart+curSectLen++) = NS; // ### Situations with reference beat subtraction are not supported // Situations with not all the leads simultaneously recorded are not supported // Situations number of leads simultaneouly recorded != total number of leads are not supported // We assume all the leads are recorded simultaneously *(ptr+sectionStart+curSectLen++) = (NS<<3) | 0x04; for (i = 0; i < hdr->NS; i++) { CHANNEL_TYPE *CH=hdr->CHANNEL+i; if (CH->OnOff != 1) continue; leu32a(1L, ptr+sectionStart+curSectLen); leu32a(hdr->data.size[0], ptr+sectionStart+curSectLen+4); *(ptr+sectionStart+curSectLen+8) = (uint8_t)CH->LeadIdCode; curSectLen += 9; } // Evaluate the size and correct it if odd if ((curSectLen % 2) != 0) { *(ptr+sectionStart+curSectLen++) = 0; } memset(ptr+sectionStart+10,0,6); // reserved } else if (curSect==4) // SECTION 4 { } else if (curSect==5) // SECTION 5 { curSectLen = 0; // current section length aECG->Section5.StartPtr = sectionStart; aECG->Section5.Length = curSectLen; } else if (curSect==6) // SECTION 6 { if (versionSection < 25) // SECTION 6 { uint16_t GDFTYP = 3; size_t SZ = GDFTYP_BITS[GDFTYP]>>3; typeof(hdr->NS) i=0; for (i = 0; i < hdr->NS; i++) { CHANNEL_TYPE *hc=hdr->CHANNEL+i; if (hc->OnOff != 1) continue; hc->GDFTYP = GDFTYP; } ptr = (uint8_t*)realloc(ptr,sectionStart+16+6+2*NS+SZ*(hdr->data.size[0]*hdr->data.size[1])); PtrCurSect = ptr+sectionStart; curSectLen = 16; // current section length // Create all the fields char flagfirst = 1; for (i = 0; i < hdr->NS; i++) { CHANNEL_TYPE *CH=hdr->CHANNEL+i; if (CH->OnOff != 1) continue; // check for physical dimension and adjust scaling factor to "nV" avm = CH->Cal * 1e9 * PhysDimScale(CH->PhysDimCode); if (flagfirst) { // Amplitude Value Multiplier (AVM) AVM = avm; flagfirst=0; continue; } // check whether all channels have the same scaling factor if (fabs((AVM - avm)/AVM) > 1e-14) fprintf(stderr,"Warning SOPEN (SCP-WRITE): scaling factors differ between channel #1 and #%i. Scaling factor of 1st channel is used.\n",i+1); }; avm16 = lrint(AVM); leu16a(avm16, ptr+sectionStart+curSectLen); avm = leu16p(ptr+sectionStart+curSectLen); curSectLen += 2; if (fabs((AVM - avm)/AVM)>1e-14) fprintf(stderr,"Warning SOPEN (SCP-WRITE): Scaling factor has been truncated (%f instead %f).\n",avm,AVM); // Sample interval AVM = 1e6/hdr->SampleRate; avm16 = lrint(AVM); leu16a(avm16, ptr+sectionStart+curSectLen); avm = leu16p(ptr+sectionStart+curSectLen); curSectLen += 2; if (fabs((AVM - avm)/AVM)>1e-14) fprintf(stderr,"Warning SOPEN (SCP-WRITE): Sampling interval has been truncated (%f instead %f us).\n",avm,AVM); // Diff used *(ptr+sectionStart+curSectLen++) = 0; // Bimodal/Non-bimodal *(ptr+sectionStart+curSectLen++) = 0; /* DATA COMPRESSION currently, no compression method is supported. In case of data compression, the data compression can happen here. */ // Fill the length block for (i = 0; i < NS; i++) { leu16a((uint16_t)hdr->data.size[0]*2, ptr+sectionStart+curSectLen); avm = leu16p(ptr+sectionStart+curSectLen); AVM = hdr->data.size[0]*2; if (fabs((AVM - avm)/AVM)>1e-14) fprintf(stderr,"Warning SOPEN (SCP-WRITE): Block length truncated (%f instead %f us).\n",avm,AVM); curSectLen += 2; } /* data in channel multiplexed order */ for (i = 0; i < hdr->NS; i++) { hdr->CHANNEL[i].SPR *= hdr->NRec; }; hdr->NRec = 1; // Prepare filling the data block with the ECG samples by SWRITE curSectLen += SZ * (hdr->data.size[hdr->FLAG.ROW_BASED_CHANNELS] * NS); // Evaluate the size and correct it if odd if ((curSectLen % 2) != 0) { fprintf(stderr,"Warning Section 6 has an odd length\n"); *(ptr+sectionStart+curSectLen++) = 0; } memset(ptr+sectionStart+10,0,6); // reserved aECG->Section6.StartPtr = sectionStart; aECG->Section6.Length = curSectLen; } } else if (curSect==7) // SECTION 7 { if (hdr->SCP.Section7 != NULL) { curSectLen = hdr->SCP.Section7Length+16; // current section length ptr = (uint8_t*)realloc(ptr,sectionStart+curSectLen); PtrCurSect = ptr+sectionStart; memcpy(PtrCurSect+16,hdr->SCP.Section7,hdr->SCP.Section7Length); } } else if (curSect==8) // SECTION 8 { if (hdr->SCP.Section8 != NULL) { curSectLen = hdr->SCP.Section8Length+16; // current section length ptr = (uint8_t*)realloc(ptr,sectionStart+curSectLen); PtrCurSect = ptr+sectionStart; memcpy(PtrCurSect,hdr->SCP.Section8,hdr->SCP.Section8Length); } } else if (curSect==9) // SECTION 9 { if (hdr->SCP.Section9 != NULL) { curSectLen = hdr->SCP.Section9Length+16; // current section length ptr = (uint8_t*)realloc(ptr,sectionStart+curSectLen); PtrCurSect = ptr+sectionStart; memcpy(PtrCurSect,hdr->SCP.Section9,hdr->SCP.Section9Length); } } else if (curSect==10) // SECTION 10 { if (hdr->SCP.Section10 != NULL) { curSectLen = hdr->SCP.Section10Length+16; // current section length ptr = (uint8_t*)realloc(ptr,sectionStart+curSectLen); PtrCurSect = ptr+sectionStart; memcpy(PtrCurSect+16,hdr->SCP.Section10,hdr->SCP.Section10Length); } } else if (curSect==11) // SECTION 11 { if (hdr->SCP.Section11 != NULL) { curSectLen = hdr->SCP.Section11Length+16; // current section length ptr = (uint8_t*)realloc(ptr,sectionStart+curSectLen); PtrCurSect = ptr+sectionStart; memcpy(PtrCurSect+16,hdr->SCP.Section11,hdr->SCP.Section11Length); } } else if (curSect==12) // SECTION 12 { if (versionSection > 25 ) // SECTION 12, SCP version 3 { uint16_t gdftyp= 0; uint8_t bps = 0; //double PhysMax = -1.0/0.0; uint16_t PhysDimBaseCode = 4256; // Volt for (k = 0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (hc->OnOff == 1) { if (bps < GDFTYP_BITS[gdftyp]) { bps = GDFTYP_BITS[hc->GDFTYP]; gdftyp = hc->GDFTYP; } } } if (NS>255) { NS=255; fprintf(stderr,"Warning SOPEN (SCP-WRITE): Number of channels exceeds 255, limited to 255.\n"); } bps = GDFTYP_BITS[gdftyp]>>3; double DigMax = ldexp(1.0, GDFTYP_BITS[gdftyp]-1)-1; int ns=0; for (k=0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (hc->OnOff > 0) { if (ns > 255) { hc->OnOff = 0; continue; } ns++; double scale = PhysDimScale(hc->PhysDimCode); hc->GDFTYP = gdftyp; hc->PhysMax = max(fabs(hc->PhysMax),fabs(-hc->PhysMin))*scale*1e9; hc->PhysMin = -hc->PhysMax; hc->Off = 0.0; hc->Cal = ceil(hc->PhysMax / hc->DigMax); // AVM must be integer //hc->DigMax = hc->PhysMax / hc->Cal; hc->DigMin = -hc->DigMax; hc->PhysDimCode = 4276; // nV } } curSectLen = 16 + 70 + NS * (4 + hdr->SPR*hdr->NRec * bps); // current section length without 16 bytes curSectLen+= (curSectLen & 1); ptr = (uint8_t*)realloc(ptr, sectionStart + curSectLen); memset(ptr + sectionStart, 0, 16+70); PtrCurSect = ptr + sectionStart + 16; leu32a((uint32_t)hdr->SampleRate, PtrCurSect); PtrCurSect[4] = (uint8_t)NS; leu32a((uint32_t)(hdr->NRec*hdr->SPR), PtrCurSect + 5); PtrCurSect[9] = (uint8_t)bps; // Recording Date and Time gdf_time T1 = hdr->T0; #ifndef __APPLE__ T1 += (int32_t)ldexp(timezone/86400.0,32); #endif T0_tm = gdf_time2tm_time(T1); leu16a(T0_tm->tm_year+1900, PtrCurSect+10); // year PtrCurSect[12] = (uint8_t)(T0_tm->tm_mon + 1); // month PtrCurSect[13] = (uint8_t)T0_tm->tm_mday; // day PtrCurSect[14] = (uint8_t)T0_tm->tm_hour; // hour PtrCurSect[15] = (uint8_t)T0_tm->tm_min; // minute PtrCurSect[16] = (uint8_t)T0_tm->tm_sec; // second // all other fields are set to zero. filter settings are defined in Section 1, Tags 27-29 /* Leads Definistion block */ PtrCurSect += 70; for (k=0,ns=0; k < hdr->NS; k++) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; if (hc->OnOff > 0) { PtrCurSect[ns*4] = hc->LeadIdCode; leu16a(hc->Cal, PtrCurSect+1+ns*4); // AVM per lead PtrCurSect[3+ns*4] = 0; ns++; } } /* ECG signals data block */ PtrCurSect += 4*NS; } aECG->Section12.StartPtr = sectionStart; aECG->Section12.Length = curSectLen; } else { } // write to pointer field in Section 0 leu16a(curSect, ptr+curSect*10+6+16); // leu32a(curSectLen, ptr+curSect*10+6+16+2); // length // Section start - must be odd. See EN1064:2005(E) Section 5.2.1 // write to Section ID Header if (curSectLen>0) { // Section 0: startpos in pointer field leu32a(sectionStart+1, ptr+curSect*10+6+16+6); // Section ID header (16 bytes) leu16a(curSect, ptr+sectionStart+2); // Section ID leu32a(curSectLen, ptr+sectionStart+4); // section length->section header ptr[sectionStart+8] = versionSection; // Section Version Number ptr[sectionStart+9] = versionProtocol; // Protocol Version Number if (curSect==0) { memcpy(ptr+16,"SCPECG",6); // defined as in ISO/DIS 11073-91064 Section 5.3.2 } else { memset(ptr+sectionStart+10,0,6); // reserved according to ISO/DIS 11073-91064 Section 5.2.7 } crc = CRCEvaluate(ptr+sectionStart+2,curSectLen-2); // compute CRC leu16a(crc, ptr+sectionStart); } sectionStart += curSectLen; // offset for next section } if (VERBOSE_LEVEL>7) fprintf(stdout,"SOPEN_SCP_WRITE 300\n"); // Prepare filling the data block with the ECG samples by SWRITE if (versionSection < 25) hdr->AS.rawdata = ptr+aECG->Section6.StartPtr+16+6+2*NS; else hdr->AS.rawdata = ptr+aECG->Section12.StartPtr+16+70+4*NS; hdr->AS.Header = ptr; if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line %i): %i,%i %i,%i \n",__func__,__LINE__,(int)aECG->Section6.StartPtr,(int)aECG->Section6.Length,(int)aECG->Section12.StartPtr,(int)aECG->Section12.Length); return(0); } #ifdef __cplusplus } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/t220/crc4scp.c0000664000175000017500000000667413062445067017670 00000000000000/* --------------------------------------------------------------------------- Copyright (C) 2005-2006 Franco Chiarugi Developed at the Foundation for Research and Technology - Hellas, Heraklion, Crete Copyright (C) 2009 Alois Schloegl This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. $Id$ --------------------------------------------------------------------------- */ #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned __int32 uint32_t; typedef __int32 int32_t; typedef unsigned __int16 uint16_t; typedef __int16 int16_t; typedef unsigned __int8 uint8_t; typedef __int8 int8_t; #else #include #endif #ifdef __cplusplus extern "C" { #endif /******************************************************************** * CRCEvaluate * * * * Parameters: datablock is the buffer on which to evaluate the CRC. * * datalength is the length of the whole buffer * * * * Description: Evaluate the SCP-ECG CRC on a data block * * (all file or a section) * * * ********************************************************************/ uint16_t CRCEvaluate(uint8_t* datablock, uint32_t datalength) { uint32_t i; uint16_t crc_tot; uint8_t crchi, crclo; uint8_t a, b; uint8_t tmp1, tmp2; crchi = 0xFF; crclo = 0xFF; for (i = 0; i < datalength; i++) { a = datablock[i]; a ^= crchi; crchi = a; a >>= 4; a &= 0x0F; a ^= crchi; crchi = crclo; crclo = a; tmp1 = ((a & 0x0F) << 4) & 0xF0; tmp2 = ((a & 0xF0) >> 4) & 0x0F; a = tmp1 | tmp2; b = a; tmp1 = ((a & 0x7F) << 1) & 0xFE; tmp2 = ((a & 0x80) >> 7) & 0x01; a = tmp1 | tmp2; a &= 0x1F; crchi ^= a; a = b & 0xF0; crchi ^= a; tmp1 = ((b & 0x7F) << 1) & 0xFE; tmp2 = ((b & 0x80) >> 7) & 0x01; b = tmp1 | tmp2; b &= 0xE0; crclo ^= b; } crc_tot = ((0x00FF & (uint16_t) crchi) << 8) & 0xFF00; crc_tot |= (0x00FF & (uint16_t) crclo); return (crc_tot); } /******************************************************************** * CRCCheck * * * * Parameters: datablock is the buffer on which to verify the CRC. * * It starts with the two CRC-CCITT bytes. * * datalength is the length of the whole buffer * * (including the two CRC bytes) * * * * Description: Check the SCP-ECG CRC on a data block * * (all file or a section) * * * ********************************************************************/ int16_t CRCCheck(uint8_t* datablock, uint32_t datalength) { uint16_t crc; crc = 0; if (datalength <= 2) return (-1); // Evaluate CRC crc = CRCEvaluate((uint8_t*) (datablock + 2), (uint32_t) (datalength - 2)); if (((uint8_t) ((crc & 0xFF00) >> 8) != (uint8_t) datablock[1]) || ((uint8_t) (crc & 0x00FF) != (uint8_t) datablock[0])) return (0); else return (1); } #ifdef __cplusplus } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/physicalunits.c0000664000175000017500000002201513240263033020507 00000000000000/* Copyright (C) 2005-2012 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include "physicalunits.h" #ifdef HAVE_PTHREAD // This is optional, because so far there are no multi-threaded applications for libbiosig. #include #endif /* physical units are defined in prEN ISO 11073-10101 (Nov 2003) Health Informatics - Point-of-care medical device communications - Part 10101:Nomenclature (ISO/DIS 11073-10101:2003) Table A.6.1: Table of Decimal Factors CEN/TC251/PT40 2001 File Exchange Format for Vital Signs - Annex A Table A.4.1: Table of Decimal Factors const double scale[32] = */ const struct PhysDimIdx { const uint16_t idx; const char* PhysDimDesc; } _physdim[] = { #include "units.i" {0xffff, "end-of-table" }, } ; /* compare strings, accept bit7=1 */ int strcmp8(const char* str1, const char* str2) { unsigned int k=0; int r; r = str1[k] - str2[k]; while (r==0 && str1[k]!='\0' && str2[k]!='\0') { k++; r = str1[k] - str2[k]; } return(r); } const char* PhysDimFactor[] = { "","da","h","k","M","G","T","P", // 0..7 "E","Z","Y","#","#","#","#","#", // 8..15 "d","c","m","u","n","p","f","a", // 16..23 "z","y","#","#","#","#","#","#", // 24..31 "\xB5" //hack for "µ" = "u" // 32 }; #ifndef NAN # define NAN (0.0/0.0) /* used for encoding of missing values */ #endif double PhysDimScale(uint16_t PhysDimCode) { // converting PhysDimCode -> scaling factor const double scale[] = { 1e+0, 1e+1, 1e+2, 1e+3, 1e+6, 1e+9, 1e+12, 1e+15, // 0..7 1e+18,1e+21,1e+24,NAN, NAN, NAN, NAN, NAN, // 8..15 1e-1, 1e-2, 1e-3, 1e-6, 1e-9, 1e-12, 1e-15, 1e-18, // 16..23 1e-21,1e-24,NAN, NAN, NAN, NAN, NAN, NAN, // 24..31 1e-6 // hack for "µ" = "u" // 32 }; return (scale[PhysDimCode & 0x001f]); } // DEPRECATED: USE INSTEAD PhysDim3(uint16_t PhysDimCode) __attribute__ ((deprecated)) char* PhysDim(uint16_t PhysDimCode, char *PhysDim) { #define MAX_LENGTH_PHYSDIM 20 // DEPRECATED - DO NOT USE // converting PhysDimCode -> PhysDim uint16_t k=0; size_t l2 = strlen(PhysDimFactor[PhysDimCode & 0x001F]); memcpy(PhysDim,PhysDimFactor[PhysDimCode & 0x001F],l2); PhysDimCode &= ~0x001F; for (k=0; _physdim[k].idx<0xffff; k++) if (PhysDimCode == _physdim[k].idx) { strncpy(PhysDim+l2, _physdim[k].PhysDimDesc, MAX_LENGTH_PHYSDIM+1-l2); PhysDim[MAX_LENGTH_PHYSDIM]='\0'; break; } return(PhysDim); #undef MAX_LENGTH_PHYSDIM } char* PhysDim2(uint16_t PhysDimCode) { // converting PhysDimCode -> PhysDim uint16_t k = 0; uint16_t l2 = strlen(PhysDimFactor[PhysDimCode & 0x001F]); for (k = 0; _physdim[k].idx < 0xffff; k++) if ( (PhysDimCode & ~0x001F) == _physdim[k].idx) { char *PhysDim = (char*)malloc(l2 + 1 + strlen(_physdim[k].PhysDimDesc)); if (PhysDim==NULL) return (NULL); memcpy(PhysDim, PhysDimFactor[PhysDimCode & 0x001F], l2); strcpy(PhysDim+l2, _physdim[k].PhysDimDesc); return(PhysDim); } return(NULL); } uint16_t PhysDimCode(const char* PhysDim0) { // converting PhysDim -> PhysDimCode /* converts Physical dimension into 16 bit code */ uint16_t k1, k2; char s[80]; char *s1; if (PhysDim0==NULL) return(0); while (isspace(*PhysDim0)) PhysDim0++; // remove leading whitespace if (strlen(PhysDim0)==0) return(0); // greedy search - check all codes 0..65535 for (k1=0; k1<33; k1++) if (strncmp(PhysDimFactor[k1],PhysDim0,strlen(PhysDimFactor[k1]))==0 && (PhysDimScale(k1)>0.0)) { // exclude if beginning of PhysDim0 differs from PhysDimFactor and if NAN strncpy(s, PhysDimFactor[k1],3); s1 = s+strlen(s); for (k2=0; _physdim[k2].idx < 0xffff; k2++) { strncpy(s1, _physdim[k2].PhysDimDesc, 77); if (strcmp8(PhysDim0, s)==0) { if (k1==32) k1 = 19; // hack for "µ" = "u" return(_physdim[k2].idx+k1); } } } return(0); } /*------------------------------------------------------------------------ * Table of Physical Units * * This part can be better optimized with a more sophisticated hash table * PhysDimTable depends only on constants, defined in units.csv/units.i; however, the table is only initialized upon usage. * These functions are thread safe except for the call to PhysDim2 which updates the table (it does a malloc). Everything else is just read operation, and the content is defined only by PhysDimFactor and PhysDimIdx, which are constant. * The implementation does not seem straightforward, but it should be faster to store already computed strings in a table, rather then recomputing them, again and again. *------------------------------------------------------------------------*/ #define PHYS_DIM_TABLE_SIZE 0x10000 static char *PhysDimTable[PHYS_DIM_TABLE_SIZE]; static char FlagInit_PhysDimTable = 0; #ifdef _PTHREAD_H pthread_mutex_t mutexPhysDimTable = PTHREAD_MUTEX_INITIALIZER; #endif /***** Release allocated memory *****/ void ClearPhysDimTable() { #ifdef _PTHREAD_H pthread_mutex_lock(&mutexPhysDimTable); #endif unsigned k = 0; while (k < PHYS_DIM_TABLE_SIZE) { char *o = PhysDimTable[k++]; if (o != NULL) free(o); } FlagInit_PhysDimTable = 0; #ifdef _PTHREAD_H pthread_mutex_unlock(&mutexPhysDimTable); #endif } /***** PhysDim3 returns the text representation of the provided 16bit code *****/ const char* PhysDim3(uint16_t PhysDimCode) { #ifdef _PTHREAD_H pthread_mutex_lock(&mutexPhysDimTable); #endif if (!FlagInit_PhysDimTable) { memset(PhysDimTable, 0, PHYS_DIM_TABLE_SIZE * sizeof(char*)); atexit(&ClearPhysDimTable); FlagInit_PhysDimTable = 1; } char **o = PhysDimTable+PhysDimCode; if (*o==NULL) *o = PhysDim2(PhysDimCode); #ifdef _PTHREAD_H pthread_mutex_unlock(&mutexPhysDimTable); #endif return( (const char*) *o); } /****************************************************************************/ /** **/ /** EOF **/ /** **/ /****************************************************************************/ #ifdef TEST_PHYSDIMTABLE_PERFORMANCE /*********************************** this is just for testing and is not part of the library ***********************************/ #include #include int main() { int k; char *s = NULL; struct rusage t[6]; struct timeval r[3]; /* #define PhysDim3(k) (PhysDim3(4275)) #define PhysDim2(k) (PhysDim2(4275)) */ int c[6]; memset(c,0,sizeof(c)); getrusage(RUSAGE_SELF, &t[0]); // initialize PhysDimTable for (k=0; k<0x10000; k++) c[0] += (PhysDim3(k)!=NULL); getrusage(RUSAGE_SELF, &t[1]); // recall PhysDimTable - many entries are Null, triggering a call to PhysDim2 for (k=0; k<0x10000; k++) c[1] += (PhysDim3(k)!=NULL); getrusage(RUSAGE_SELF, &t[2]); // recall PhysDimTable with a fixed code for (k=0; k<0x10000; k++) c[2] += (PhysDim3(4275)!=NULL); getrusage(RUSAGE_SELF, &t[3]); // trivial implementation PhysDimTable for (k=0; k<0x10000; k++) { s = PhysDim2(k); if (s!=NULL) { free(s); c[3]++; } } getrusage(RUSAGE_SELF, &t[4]); // trivial implementation PhysDimTable for a fixed code for (k=0; k<0x10000; k++) { s = PhysDim2(4275); if (s!=NULL) { free(s); c[4]++; } } getrusage(RUSAGE_SELF, &t[5]); // trivial implementation PhysDimTable for (k=0; k<0x10000; k++) { if ( (k & ~0x001f)==65408) continue; // exclude user-defined code for Bel, because it was later added in the standard s = (char*)PhysDim3(k); int m = PhysDimCode(s); c[5] += (m==k); if ((m!=k) && (s!=NULL) && (s[0]!='#')) { fprintf(stdout,"%s\t%d\t%d\t%s\n",PhysDimFactor[k & 0x1f],k,m,s); } } for (k=0; k<6; k++) { //fprintf(stdout,"=== [%i]: %d.%06d\t%d.%06d\n",k, t[k].ru_utime.tv_sec,t[k].ru_utime.tv_usec,t[k].ru_stime.tv_sec,t[k].ru_stime.tv_usec); if (!k) continue; timersub(&(t[k].ru_utime), &(t[k-1].ru_utime), &r[0]); fprintf(stdout,"usr [%i]: %d.%06d\t",k, r[0].tv_sec,r[0].tv_usec); timersub(&(t[k].ru_stime), &(t[k-1].ru_stime) ,&r[1]); fprintf(stdout,"sys [%i]: %d.%06d\t",k, r[1].tv_sec,r[1].tv_usec); timeradd(&r[0],&r[1],&r[2]); fprintf(stdout,"tot [%i]: %d.%06d\t%i\n",k,r[2].tv_sec,r[2].tv_usec,c[k-1]); } return 0; } #endif stimfit-0.15.8/src/libbiosiglite/biosig4c++/gdftime.c0000664000175000017500000001637713240263033017245 00000000000000/* Copyright (C) 2005-2013 Alois Schloegl This file is part of the "BioSig for C/C++" repository (biosig4c++) at http://biosig.sf.net/ BioSig is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Library function for conversion of gdf_time into other datetime formats. gdf_time is used in [1] and in Octave and Matlab. Also Python seems to use this format but with an offset of 366 days. References: [1] GDF - A general data format for biomedical signals. available online http://arxiv.org/abs/cs.DB/0608052 */ #include "gdftime.h" /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Conversion of time formats between Unix and GDF format. The default time format in BIOSIG uses a 64-bit fixed point format with reference date 01-Jan-0000 00h00m00s (value=0). One unit indicates the 2^(-32) part of 1 day (ca 20 us). Accordingly, the higher 32 bits count the number of days, the lower 32 bits describe the fraction of a day. 01-Jan-1970 is the day 719529. time_t t0; t0 = time(NULL); T0 = (double)t0/86400.0; // convert seconds in days since 1970-Jan-01 floor(T0) + 719529; // number of days since 01-Jan-0000 floor(ldexp(T0-floor(T0),32)); // fraction x/2^32; one day is 2^32 The following macros define the conversions between the unix time and the GDF format. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #define fix(m) (m<0 ? ceil(m) : floor(m)) gdf_time tm_time2gdf_time(struct tm *t){ /* based Octave's datevec.m it referes Peter Baum's algorithm at http://vsg.cape.com/~pbaum/date/date0.htm but the link is not working anymore as of 2008-12-03. Other links to Peter Baum's algorithm are http://www.rexswain.com/b2mmddyy.rex http://www.dpwr.net/forums/index.php?s=ecfa72e38be61327403126e23aeea7e5&showtopic=4309 */ if (t == NULL) return(0); int Y,M,s; // h,m, double D; gdf_time o; const int monthstart[] = {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275}; D = (double)t->tm_mday; M = t->tm_mon+1; Y = t->tm_year+1900; // Set start of year to March by moving Jan. and Feb. to previous year. // Correct for months > 12 by moving to subsequent years. Y += fix ((M-14.0)/12); // Lookup number of days since start of the current year. D += monthstart[t->tm_mon % 12] + 60; // Add number of days to the start of the current year. Correct // for leap year every 4 years except centuries not divisible by 400. D += 365*Y + floor (Y/4.0) - floor (Y/100.0) + floor (Y/400.0); // Add fraction representing current second of the day. s = t->tm_hour*3600 + t->tm_min*60 + t->tm_sec; // s -= timezone; o = (((uint64_t)D) << 32) + (((uint64_t)s) << 32)/86400; return(o); } struct tm *gdf_time2tm_time(gdf_time t) { // this is not re-entrant, use gdf_time2tm_time_r instead /* based Octave's datevec.m it referes Peter Baum's algorithm at http://vsg.cape.com/~pbaum/date/date0.htm but the link is not working anymore as of 2008-12-03. Other links to Peter Baum's algorithm are http://www.rexswain.com/b2mmddyy.rex http://www.dpwr.net/forums/index.php?s=ecfa72e38be61327403126e23aeea7e5&showtopic=4309 */ static struct tm tt; // allocate memory for t3; gdf_time2tm_time_r(t,&tt); return(&tt); } int gdf_time2tm_time_r(gdf_time t, struct tm *t3) { /* based Octave's datevec.m it referes Peter Baum's algorithm at http://vsg.cape.com/~pbaum/date/date0.htm but the link is not working anymore as of 2008-12-03. Other links to Peter Baum's algorithm are http://www.rexswain.com/b2mmddyy.rex http://www.dpwr.net/forums/index.php?s=ecfa72e38be61327403126e23aeea7e5&showtopic=4309 */ int32_t rd = (int32_t)floor(ldexp((double)t,-32)); // days since 0001-01-01 double s = ldexp((t & 0x00000000ffffffff)*86400,-32); // seconds of the day int32_t sec = round (s); // s += timezone; /* derived from datenum.m from Octave 3.0.0 */ // Move day 0 from midnight -0001-12-31 to midnight 0000-3-1 double z = floor (rd) - 60; // Calculate number of centuries; K1 = 0.25 is to avoid rounding problems. double a = floor ((z - 0.25) / 36524.25); // Days within century; K2 = 0.25 is to avoid rounding problems. double b = z - 0.25 + a - floor (a / 4); // Calculate the year (year starts on March 1). int y = (int)floor (b / 365.25); // Calculate day in year. double c = fix (b - floor (365.25 * y)) + 1; // Calculate month in year. double m = fix ((5 * c + 456) / 153); double d = c - fix ((153 * m - 457) / 5); // Move to Jan 1 as start of year. if (m>12) {y++; m-=12;} t3->tm_year = y-1900; t3->tm_mon = (int)m-1; t3->tm_mday = (int)d; t3->tm_hour = sec / 3600; sec = sec - (3600 * t3->tm_hour); t3->tm_min = sec / 60; t3->tm_sec = sec - (60 * t3->tm_min); //t3->tm_gmtoff = 3600; return(0); } #if 0 gdftime_t string2gdftime(const char* str) { struct tm t; strptime(str,"%d %b %Y",&t); t.tm_hour = 0; t.tm_min = 0; t.tm_sec = 0; return tm_time2gdf_time(&t); } gdftime_t string2gdfdate(const char* str) { struct tm t; strptime(str,"%d %b %Y",&t); t.tm_hour = 0; t.tm_min = 0; t.tm_sec = 0; return tm_time2gdf_time(&t); } gdftime_t string2gdfdatetime(const char* str) { struct tm t; return tm_time2gdf_time(getdate(str)); } #endif /* char *gdftime2string(gdftime_t) char *gdfdate2string(gdftime_t) char *gdfdatetime2string(gdftime_t) gdftime_t time2gdftime(int,int,float) gdftime_t date2gdftime(int,int,int) gdftime_t datetime2gdftime(int,int,int,int,int,float) void gdftime2datetime(&int,&int,&int,&int,&int,&float) void gdftime2time(&int,&int,&float) void gdftime2date(&int,&int,&int) strptime(line+p+1,"%H:%M:%S",&t); if (VERBOSE_LEVEL > 7) fprintf(stdout, "%s (line %i) %s\n", __FILE__, __LINE__, line); if (VERBOSE_LEVEL > 7) { char tmp[30]; strftime(tmp,30,"%F %T",&t); fprintf(stdout, "%s (line %i) %s\n", __FILE__, __LINE__, tmp); } } else if (!strncmp(line,"Date",p)) { strptime(line+p+1,"%d %b %Y",&t); t.tm_hour = 0; t.tm_min = 0; t.tm_sec = 0; if (VERBOSE_LEVEL > 7) { char tmp[30]; strftime(tmp,30,"%F %T",&t); fprintf(stdout, "%s (line %i) %s\n", __FILE__, __LINE__, tmp); } } else if (!strncmp(line,"Time Stamp",p)) { hdr->SampleRate *= hdr->SPR*hdr->NRec/strtod(line+p+1,NULL); } line = strtok(NULL, "\n\r\0"); */ /****************************************************************************/ /** **/ /** EOF **/ /** **/ /****************************************************************************/ stimfit-0.15.8/src/libbiosiglite/Makefile.in0000664000175000017500000014117313315356052015676 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libbiosiglite ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acsite.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/stfconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) am__DEPENDENCIES_1 = libbiosiglite_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libbiosiglite_la_OBJECTS = libbiosiglite_la-sopen_abf_read.lo \ libbiosiglite_la-sopen_alpha_read.lo \ libbiosiglite_la-sopen_axg_read.lo \ libbiosiglite_la-sopen_cfs_read.lo \ libbiosiglite_la-sopen_heka_read.lo \ libbiosiglite_la-sopen_igor.lo \ libbiosiglite_la-sopen_scp_read.lo \ libbiosiglite_la-scp-decode.lo libbiosiglite_la-crc4scp.lo \ libbiosiglite_la-sopen_scp_write.lo \ libbiosiglite_la-sandbox.lo libbiosiglite_la-biosig.lo \ libbiosiglite_la-biosig2.lo libbiosiglite_la-biosig-network.lo \ libbiosiglite_la-biosig-HL7aECG-stub.lo \ libbiosiglite_la-gdftime.lo libbiosiglite_la-mdc_ecg_codes.lo \ libbiosiglite_la-physicalunits.lo libbiosiglite_la_OBJECTS = $(am_libbiosiglite_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libbiosiglite_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(libbiosiglite_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libbiosiglite_la_SOURCES) DIST_SOURCES = $(libbiosiglite_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @BUILD_MODULE_TRUE@pkglibdir = ${PYTHON_TARGET_DIR}/stfio ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GT_CPPFLAGS = @GT_CPPFLAGS@ GT_CXXFLAGS = @GT_CXXFLAGS@ GT_LDFLAGS = @GT_LDFLAGS@ GT_LIBS = @GT_LIBS@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_LIBS = @HDF5_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBBIOSIG_LDFLAGS = @LIBBIOSIG_LDFLAGS@ LIBHDF5_LDFLAGS = @LIBHDF5_LDFLAGS@ LIBLAPACK_LDFLAGS = @LIBLAPACK_LDFLAGS@ LIBNUMPY_INCLUDES = @LIBNUMPY_INCLUDES@ LIBOBJS = @LIBOBJS@ LIBPYTHON_INCLUDES = @LIBPYTHON_INCLUDES@ LIBPYTHON_LDFLAGS = @LIBPYTHON_LDFLAGS@ LIBS = @LIBS@ LIBSTF_LDFLAGS = @LIBSTF_LDFLAGS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MACSETFILE = @MACSETFILE@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSTLINK_COMMAND = @POSTLINK_COMMAND@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_DIST_PKG = @PYTHON_DIST_PKG@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_NUMPY_INCLUDE = @PYTHON_NUMPY_INCLUDE@ PYTHON_PRE_DIST_PKG = @PYTHON_PRE_DIST_PKG@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ PY_AC_VERSION = @PY_AC_VERSION@ RANLIB = @RANLIB@ REZ = @REZ@ SED = @SED@ SETFILE = @SETFILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFIO_PYTHON_LIBNAME = @STFIO_PYTHON_LIBNAME@ STF_PYTHON_LIBNAME = @STF_PYTHON_LIBNAME@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ SWIG_PYTHON_CPPFLAGS = @SWIG_PYTHON_CPPFLAGS@ SWIG_PYTHON_OPT = @SWIG_PYTHON_OPT@ VERSION = @VERSION@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @BUILD_MODULE_TRUE@@ISDARWIN_FALSE@PYTHON_TARGET_DIR = ${PYTHON_PRE_DIST_PKG} @BUILD_MODULE_TRUE@@ISDARWIN_TRUE@PYTHON_TARGET_DIR = ${PYTHON_DIST_PKG} # PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} @BUILD_MODULE_TRUE@PYTHON_DEST_DIR = ${DESTDIR}${PYTHON_TARGET_DIR} pkglib_LTLIBRARIES = libbiosiglite.la libbiosiglite_la_SOURCES = \ biosig4c++/t210/sopen_abf_read.c \ biosig4c++/t210/sopen_alpha_read.c \ biosig4c++/t210/sopen_axg_read.c \ biosig4c++/t210/sopen_cfs_read.c \ biosig4c++/t210/sopen_heka_read.c \ biosig4c++/t210/sopen_igor.c \ biosig4c++/t210/sopen_scp_read.c \ biosig4c++/t210/scp-decode.cpp \ biosig4c++/t220/crc4scp.c \ biosig4c++/t220/sopen_scp_write.c \ biosig4c++/test0/sandbox.c \ biosig4c++/biosig.c \ biosig4c++/biosig2.c \ biosig4c++/biosig-network.c \ biosig4c++/biosig-HL7aECG-stub.c \ biosig4c++/gdftime.c \ biosig4c++/mdc_ecg_codes.c \ biosig4c++/physicalunits.c libbiosiglite_la_CPPFLAGS = -DWITH_BIOSIG2 -DWITH_ZLIB -DWITH_CHOLMOD -DWITHOUT_NETWORK libbiosiglite_la_LDFLAGS = libbiosiglite_la_LIBADD = $(LIBSTF_LDFLAGS) -lz -lcholmod all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libbiosiglite/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/libbiosiglite/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libbiosiglite.la: $(libbiosiglite_la_OBJECTS) $(libbiosiglite_la_DEPENDENCIES) $(EXTRA_libbiosiglite_la_DEPENDENCIES) $(AM_V_CXXLD)$(libbiosiglite_la_LINK) -rpath $(pkglibdir) $(libbiosiglite_la_OBJECTS) $(libbiosiglite_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-biosig-HL7aECG-stub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-biosig-network.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-biosig.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-biosig2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-crc4scp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-gdftime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-mdc_ecg_codes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-physicalunits.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sandbox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-scp-decode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sopen_abf_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sopen_alpha_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sopen_axg_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sopen_cfs_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sopen_heka_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sopen_igor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sopen_scp_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbiosiglite_la-sopen_scp_write.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libbiosiglite_la-sopen_abf_read.lo: biosig4c++/t210/sopen_abf_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sopen_abf_read.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sopen_abf_read.Tpo -c -o libbiosiglite_la-sopen_abf_read.lo `test -f 'biosig4c++/t210/sopen_abf_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_abf_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sopen_abf_read.Tpo $(DEPDIR)/libbiosiglite_la-sopen_abf_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t210/sopen_abf_read.c' object='libbiosiglite_la-sopen_abf_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sopen_abf_read.lo `test -f 'biosig4c++/t210/sopen_abf_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_abf_read.c libbiosiglite_la-sopen_alpha_read.lo: biosig4c++/t210/sopen_alpha_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sopen_alpha_read.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sopen_alpha_read.Tpo -c -o libbiosiglite_la-sopen_alpha_read.lo `test -f 'biosig4c++/t210/sopen_alpha_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_alpha_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sopen_alpha_read.Tpo $(DEPDIR)/libbiosiglite_la-sopen_alpha_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t210/sopen_alpha_read.c' object='libbiosiglite_la-sopen_alpha_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sopen_alpha_read.lo `test -f 'biosig4c++/t210/sopen_alpha_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_alpha_read.c libbiosiglite_la-sopen_axg_read.lo: biosig4c++/t210/sopen_axg_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sopen_axg_read.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sopen_axg_read.Tpo -c -o libbiosiglite_la-sopen_axg_read.lo `test -f 'biosig4c++/t210/sopen_axg_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_axg_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sopen_axg_read.Tpo $(DEPDIR)/libbiosiglite_la-sopen_axg_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t210/sopen_axg_read.c' object='libbiosiglite_la-sopen_axg_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sopen_axg_read.lo `test -f 'biosig4c++/t210/sopen_axg_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_axg_read.c libbiosiglite_la-sopen_cfs_read.lo: biosig4c++/t210/sopen_cfs_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sopen_cfs_read.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sopen_cfs_read.Tpo -c -o libbiosiglite_la-sopen_cfs_read.lo `test -f 'biosig4c++/t210/sopen_cfs_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_cfs_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sopen_cfs_read.Tpo $(DEPDIR)/libbiosiglite_la-sopen_cfs_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t210/sopen_cfs_read.c' object='libbiosiglite_la-sopen_cfs_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sopen_cfs_read.lo `test -f 'biosig4c++/t210/sopen_cfs_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_cfs_read.c libbiosiglite_la-sopen_heka_read.lo: biosig4c++/t210/sopen_heka_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sopen_heka_read.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sopen_heka_read.Tpo -c -o libbiosiglite_la-sopen_heka_read.lo `test -f 'biosig4c++/t210/sopen_heka_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_heka_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sopen_heka_read.Tpo $(DEPDIR)/libbiosiglite_la-sopen_heka_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t210/sopen_heka_read.c' object='libbiosiglite_la-sopen_heka_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sopen_heka_read.lo `test -f 'biosig4c++/t210/sopen_heka_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_heka_read.c libbiosiglite_la-sopen_igor.lo: biosig4c++/t210/sopen_igor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sopen_igor.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sopen_igor.Tpo -c -o libbiosiglite_la-sopen_igor.lo `test -f 'biosig4c++/t210/sopen_igor.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_igor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sopen_igor.Tpo $(DEPDIR)/libbiosiglite_la-sopen_igor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t210/sopen_igor.c' object='libbiosiglite_la-sopen_igor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sopen_igor.lo `test -f 'biosig4c++/t210/sopen_igor.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_igor.c libbiosiglite_la-sopen_scp_read.lo: biosig4c++/t210/sopen_scp_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sopen_scp_read.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sopen_scp_read.Tpo -c -o libbiosiglite_la-sopen_scp_read.lo `test -f 'biosig4c++/t210/sopen_scp_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_scp_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sopen_scp_read.Tpo $(DEPDIR)/libbiosiglite_la-sopen_scp_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t210/sopen_scp_read.c' object='libbiosiglite_la-sopen_scp_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sopen_scp_read.lo `test -f 'biosig4c++/t210/sopen_scp_read.c' || echo '$(srcdir)/'`biosig4c++/t210/sopen_scp_read.c libbiosiglite_la-crc4scp.lo: biosig4c++/t220/crc4scp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-crc4scp.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-crc4scp.Tpo -c -o libbiosiglite_la-crc4scp.lo `test -f 'biosig4c++/t220/crc4scp.c' || echo '$(srcdir)/'`biosig4c++/t220/crc4scp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-crc4scp.Tpo $(DEPDIR)/libbiosiglite_la-crc4scp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t220/crc4scp.c' object='libbiosiglite_la-crc4scp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-crc4scp.lo `test -f 'biosig4c++/t220/crc4scp.c' || echo '$(srcdir)/'`biosig4c++/t220/crc4scp.c libbiosiglite_la-sopen_scp_write.lo: biosig4c++/t220/sopen_scp_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sopen_scp_write.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sopen_scp_write.Tpo -c -o libbiosiglite_la-sopen_scp_write.lo `test -f 'biosig4c++/t220/sopen_scp_write.c' || echo '$(srcdir)/'`biosig4c++/t220/sopen_scp_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sopen_scp_write.Tpo $(DEPDIR)/libbiosiglite_la-sopen_scp_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/t220/sopen_scp_write.c' object='libbiosiglite_la-sopen_scp_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sopen_scp_write.lo `test -f 'biosig4c++/t220/sopen_scp_write.c' || echo '$(srcdir)/'`biosig4c++/t220/sopen_scp_write.c libbiosiglite_la-sandbox.lo: biosig4c++/test0/sandbox.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-sandbox.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-sandbox.Tpo -c -o libbiosiglite_la-sandbox.lo `test -f 'biosig4c++/test0/sandbox.c' || echo '$(srcdir)/'`biosig4c++/test0/sandbox.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-sandbox.Tpo $(DEPDIR)/libbiosiglite_la-sandbox.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/test0/sandbox.c' object='libbiosiglite_la-sandbox.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-sandbox.lo `test -f 'biosig4c++/test0/sandbox.c' || echo '$(srcdir)/'`biosig4c++/test0/sandbox.c libbiosiglite_la-biosig.lo: biosig4c++/biosig.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-biosig.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-biosig.Tpo -c -o libbiosiglite_la-biosig.lo `test -f 'biosig4c++/biosig.c' || echo '$(srcdir)/'`biosig4c++/biosig.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-biosig.Tpo $(DEPDIR)/libbiosiglite_la-biosig.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/biosig.c' object='libbiosiglite_la-biosig.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-biosig.lo `test -f 'biosig4c++/biosig.c' || echo '$(srcdir)/'`biosig4c++/biosig.c libbiosiglite_la-biosig2.lo: biosig4c++/biosig2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-biosig2.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-biosig2.Tpo -c -o libbiosiglite_la-biosig2.lo `test -f 'biosig4c++/biosig2.c' || echo '$(srcdir)/'`biosig4c++/biosig2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-biosig2.Tpo $(DEPDIR)/libbiosiglite_la-biosig2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/biosig2.c' object='libbiosiglite_la-biosig2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-biosig2.lo `test -f 'biosig4c++/biosig2.c' || echo '$(srcdir)/'`biosig4c++/biosig2.c libbiosiglite_la-biosig-network.lo: biosig4c++/biosig-network.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-biosig-network.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-biosig-network.Tpo -c -o libbiosiglite_la-biosig-network.lo `test -f 'biosig4c++/biosig-network.c' || echo '$(srcdir)/'`biosig4c++/biosig-network.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-biosig-network.Tpo $(DEPDIR)/libbiosiglite_la-biosig-network.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/biosig-network.c' object='libbiosiglite_la-biosig-network.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-biosig-network.lo `test -f 'biosig4c++/biosig-network.c' || echo '$(srcdir)/'`biosig4c++/biosig-network.c libbiosiglite_la-biosig-HL7aECG-stub.lo: biosig4c++/biosig-HL7aECG-stub.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-biosig-HL7aECG-stub.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-biosig-HL7aECG-stub.Tpo -c -o libbiosiglite_la-biosig-HL7aECG-stub.lo `test -f 'biosig4c++/biosig-HL7aECG-stub.c' || echo '$(srcdir)/'`biosig4c++/biosig-HL7aECG-stub.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-biosig-HL7aECG-stub.Tpo $(DEPDIR)/libbiosiglite_la-biosig-HL7aECG-stub.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/biosig-HL7aECG-stub.c' object='libbiosiglite_la-biosig-HL7aECG-stub.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-biosig-HL7aECG-stub.lo `test -f 'biosig4c++/biosig-HL7aECG-stub.c' || echo '$(srcdir)/'`biosig4c++/biosig-HL7aECG-stub.c libbiosiglite_la-gdftime.lo: biosig4c++/gdftime.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-gdftime.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-gdftime.Tpo -c -o libbiosiglite_la-gdftime.lo `test -f 'biosig4c++/gdftime.c' || echo '$(srcdir)/'`biosig4c++/gdftime.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-gdftime.Tpo $(DEPDIR)/libbiosiglite_la-gdftime.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/gdftime.c' object='libbiosiglite_la-gdftime.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-gdftime.lo `test -f 'biosig4c++/gdftime.c' || echo '$(srcdir)/'`biosig4c++/gdftime.c libbiosiglite_la-mdc_ecg_codes.lo: biosig4c++/mdc_ecg_codes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-mdc_ecg_codes.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-mdc_ecg_codes.Tpo -c -o libbiosiglite_la-mdc_ecg_codes.lo `test -f 'biosig4c++/mdc_ecg_codes.c' || echo '$(srcdir)/'`biosig4c++/mdc_ecg_codes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-mdc_ecg_codes.Tpo $(DEPDIR)/libbiosiglite_la-mdc_ecg_codes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/mdc_ecg_codes.c' object='libbiosiglite_la-mdc_ecg_codes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-mdc_ecg_codes.lo `test -f 'biosig4c++/mdc_ecg_codes.c' || echo '$(srcdir)/'`biosig4c++/mdc_ecg_codes.c libbiosiglite_la-physicalunits.lo: biosig4c++/physicalunits.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libbiosiglite_la-physicalunits.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-physicalunits.Tpo -c -o libbiosiglite_la-physicalunits.lo `test -f 'biosig4c++/physicalunits.c' || echo '$(srcdir)/'`biosig4c++/physicalunits.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-physicalunits.Tpo $(DEPDIR)/libbiosiglite_la-physicalunits.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='biosig4c++/physicalunits.c' object='libbiosiglite_la-physicalunits.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libbiosiglite_la-physicalunits.lo `test -f 'biosig4c++/physicalunits.c' || echo '$(srcdir)/'`biosig4c++/physicalunits.c .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libbiosiglite_la-scp-decode.lo: biosig4c++/t210/scp-decode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libbiosiglite_la-scp-decode.lo -MD -MP -MF $(DEPDIR)/libbiosiglite_la-scp-decode.Tpo -c -o libbiosiglite_la-scp-decode.lo `test -f 'biosig4c++/t210/scp-decode.cpp' || echo '$(srcdir)/'`biosig4c++/t210/scp-decode.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbiosiglite_la-scp-decode.Tpo $(DEPDIR)/libbiosiglite_la-scp-decode.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='biosig4c++/t210/scp-decode.cpp' object='libbiosiglite_la-scp-decode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbiosiglite_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libbiosiglite_la-scp-decode.lo `test -f 'biosig4c++/t210/scp-decode.cpp' || echo '$(srcdir)/'`biosig4c++/t210/scp-decode.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done @BUILD_MODULE_TRUE@install: install-am @ISDARWIN_FALSE@install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkglibLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkglibLTLIBRARIES .PRECIOUS: Makefile # don't install anything because it has to go into the app bundle @BUILD_MODULE_FALSE@@ISDARWIN_TRUE@install: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stimfit-0.15.8/src/pystfio/0000775000175000017500000000000013315356572012565 500000000000000stimfit-0.15.8/src/pystfio/unittest_stfio.py0000664000175000017500000000715413062445067016146 00000000000000""" unittest_stfio.py Tue, 20 Jul 2010 09:38:19 +0200 The unittest for stfio module created by Christoph, the stfio module is a Stimfit-independent python module to read/write electrophysiological data from/to different file formats. Note that to execute this test you need the following files: test.h5 test.abf test.dat These files correspond to the same recording with different file extensions; the recording contains the following properties: Number of channels = 4 Number of traces = 3 Sampling interval = 0.05 """ import numpy as np import unittest import stfio rec = stfio.read('test.h5') class DataListTest(unittest.TestCase): def testReadH5(self): """ testReadH5() Read HDF5 file system """ try: rec = stfio.read('test.h5') except SyntaxError: rec = None # test if Recording object was created self.assertTrue(True, isinstance(rec, stfio.Recording)) # def testReadCFS(self): # """ testReadCFS() Read CED filling system files""" # try: # rec = stfio.read('test.dat') # except SyntaxError: # rec = None # # test if Recording object was created # self.assertTrue(True, isinstance(rec, stfio.Recording)) # def testReadATF(self): # """ testReadATF() Read ABF files""" # try: # rec = stfio.read('test.atf') # except SyntaxError: # rec = None # # test if Recording object was created # self.assertTrue(True, isinstance(rec, stfio.Recording)) def testReadStfException(self): """ Raises a StfException if file format to read is not supported""" # should raise an StfIOException if filetype is not supported self.assertRaises(stfio.StfIOException, stfio.read, 'test.txt') def testWrite(self): """ testWrite() Returns False if file format to write is not supported""" # should raise an StfException if filetype is not supported rec = stfio.read('test.h5') res = rec.write('new.abf', 'abf') self.assertEquals(False, res) def testNumberofChannels(self): """ testNumberofChannels() returns the number of channels """ self.assertEquals(4,len(rec)) def testNumberofSections(self): """ testNumberofSections() returns the number of channels """ self.assertEquals(3,len(rec[0])) def testNumberofDataPoints(self): """ testNumberofDataPoints() returns the number of sampling points """ self.assertEquals(40000,len(rec[0][0])) def testunits(self): """ testunits() returns the units in the X/Y axis """ self.assertEquals('mV',rec[0].yunits) self.assertEquals('pA',rec[1].yunits) self.assertEquals('ms',rec.xunits) def testArrayCreation(self): """ testArrayCreation() creation of a numpy array""" self.assertTrue(type(rec[0][0].asarray()), type(np.empty(0))) def testChannelName(self): """ testChannelName() returns the names of the channels """ names = [rec[i].name for i in range(len(rec))] mynames = ['Amp1', 'Amp2', 'Amp3', 'Amp4'] self.assertEquals(names, mynames) def testSamplingRate(self): """ testSamplingRate() returns the sampling rate """ self.assertAlmostEqual(0.05, rec.dt, 3) def testDate(self): """ testDate() returns the creation date """ self.assertEquals(rec.date, '19/07/10') def testTime(self): """ testTime() returns the creation time """ self.assertEquals(rec.time, '23:24:42') if __name__ == '__main__': # test all cases unittest.main() stimfit-0.15.8/src/pystfio/pystfio.h0000775000175000017500000000143513062445067014356 00000000000000#ifndef _PYSTFIO_H #define _PYSTFIO_H #include "../libstfio/stfio.h" #include #define array_data(a) (((PyArrayObject *)a)->data) #if PY_MAJOR_VERSION >= 3 int #else void #endif wrap_array(); stfio::filetype gettype(const std::string& ftype); bool _read(const std::string& filename, const std::string& ftype, bool verbose, Recording& Data); PyObject* detect_events(double* data, int size_data, double* templ, int size_templ, double dt, const std::string& mode="criterion", bool norm=true, double lowpass=0.5, double highpass=0.0001); PyObject* peak_detection(double* invec, int size, double threshold, int min_distance); double risetime(double* invec, int size, double base, double amp, double frac=0.2); #endif stimfit-0.15.8/src/pystfio/__init__.py0000664000175000017500000000033113062445067014610 00000000000000# -*- coding: utf-8 -*- ''' Python module to read common electrophysiology file formats. ''' from .stfio import * from . import stfio_plot as plot try: from . import stfio_neo as neo except ImportError: pass stimfit-0.15.8/src/pystfio/Makefile.am0000664000175000017500000000470113062445067014540 00000000000000if ISDARWIN PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} else PYTHON_TARGET_DIR=${PYTHON_PRE_DIST_PKG} # PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} endif PYTHON_DEST_DIR=${DESTDIR}${PYTHON_TARGET_DIR} pkglibdir = ${PYTHON_TARGET_DIR}/stfio pkglib_LTLIBRARIES = libpystfio.la TESTS_ENVIRONMENT = cp ./test.h5 ./ && \ cp .libs/libpystfio.so ./_stfio.so && \ $(PYTHON) TESTS = ./unittest_stfio.py PYTHON_ADDINCLUDES = $(LIBPYTHON_INCLUDES) PYTHON_ADDLDFLAGS = $(LIBPYTHON_LDFLAGS) PYTHON_ADDLIBS = $(top_srcdir)/src/pystfio/pystfio_wrap.cxx $(top_srcdir)/src/pystfio/stfio.py: $(top_srcdir)/src/pystfio/pystfio.i $(SWIG) $(SWIG_PYTHON_OPT) -o $@ $< cat $(top_srcdir)/src/stimfit/py/gccwarn $(top_srcdir)/src/pystfio/pystfio_wrap.cxx > $(top_srcdir)/src/pystfio/pystfio_wrap_tmp.cxx mv $(top_srcdir)/src/pystfio/pystfio_wrap_tmp.cxx $(top_srcdir)/src/pystfio/pystfio_wrap.cxx nodist_libpystfio_la_SOURCES = $(top_srcdir)/src/pystfio/pystfio_wrap.cxx libpystfio_la_SOURCES = $(top_srcdir)/src/pystfio/pystfio.cxx noinst_HEADERS = $(top_srcdir)/src/pystfio/pystfio.h INCLUDES = $(LIBNUMPY_INCLUDES) $(PYTHON_ADDINCLUDES) EXTRA_DIST = ./pystfio.i ./unittest_stfio.py ./test.h5 libpystfio_la_CPPFLAGS = $(SWIG_PYTHON_CPPFLAGS) -I$(top_srcdir)/src libpystfio_la_CXXFLAGS = $(OPT_CXXFLAGS) libpystfio_la_LDFLAGS = $(PYTHON_ADDLDFLAGS) $(LIBSTF_LDFLAGS) libpystfio_la_LIBADD = $(PYTHON_ADDLIBS) ./../libstfio/libstfio.la ./../libstfnum/libstfnum.la if WITH_BIOSIGLITE libpystfio_la_LIBADD += ./../libbiosiglite/libbiosiglite.la endif # LTTARGET=${PYTHON_DIST_PKG}/stfio LTTARGET=${PYTHON_DEST_DIR}/stfio install-exec-hook: mv ${PYTHON_DEST_DIR}/stfio/${STFIO_PYTHON_LIBNAME} ${PYTHON_DEST_DIR}/stfio/_stfio.so if BUILD_DEBIAN chrpath -r ${PYTHON_DIST_PKG}/stfio ${PYTHON_DEST_DIR}/stfio/_stfio.so endif rm -f ${PYTHON_DEST_DIR}/stfio/*.la rm -f ${PYTHON_DEST_DIR}/stfio/*.a cp -p $(top_srcdir)/src/pystfio/__init__.py ${PYTHON_DEST_DIR}/stfio cp -p $(top_srcdir)/src/pystfio/stfio_plot.py ${PYTHON_DEST_DIR}/stfio cp -p $(top_srcdir)/src/pystfio/stfio_neo.py ${PYTHON_DEST_DIR}/stfio cp -p $(top_srcdir)/src/pystfio/stfio.py ${PYTHON_DEST_DIR}/stfio ${PYTHON} -m compileall -l ${PYTHON_DEST_DIR}/stfio chmod -x ${PYTHON_DEST_DIR}/stfio/* uninstall-hook: rm -f ${PYTHON_DEST_DIR}/stfio/*.so rm -f ${PYTHON_DEST_DIR}/stfio.pth rm -r ${PYTHON_DEST_DIR}/stfio clean-local: rm -f $(top_srcdir)/src/pystfio/pystfio_wrap.cxx $(top_srcdir)/src/pystfio/stfio.py rm -f test.h5 rm -f _stfio.so stimfit-0.15.8/src/pystfio/pystfio.cxx0000775000175000017500000001364013062445067014732 00000000000000#include #include #include #if 0 //def _WINDOWS #ifdef _DEBUG #undef _DEBUG #define _UNDEBUG #endif #endif #ifdef _POSIX_C_SOURCE #define _POSIX_C_SOURCE_WAS_DEF #undef _POSIX_C_SOURCE #endif #ifdef _XOPEN_SOURCE #define _XOPEN_SOURCE_WAS_DEF #undef _XOPEN_SOURCE #endif #include #ifdef _POSIX_C_SOURCE_WAS_DEF #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE #endif #endif #ifdef _XOPEN_SOURCE_WAS_DEF #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE #endif #endif #include #include #if 0//def _WINDOWS #ifdef _UNDEBUG #define _DEBUG #endif #endif #include "./../libstfnum/fit.h" #include "./../libstfnum/measure.h" #include "pystfio.h" #if PY_MAJOR_VERSION >= 3 int wrap_array() { import_array(); return 0; } #else void wrap_array() { import_array(); } #endif stfio::filetype gettype(const std::string& ftype) { stfio::filetype stftype = stfio::none; if (ftype == "cfs") { stftype = stfio::cfs; } else if (ftype == "hdf5") { stftype = stfio::hdf5; } else if (ftype == "abf") { stftype = stfio::abf; } else if (ftype == "atf") { stftype = stfio::atf; } else if (ftype == "axg") { stftype = stfio::axg; } else if (ftype == "biosig") { stftype = stfio::biosig; } else if (ftype == "gdf") { stftype = stfio::biosig; } else if (ftype == "heka") { stftype = stfio::heka; } else if (ftype == "igor") { stftype = stfio::igor; } else if (ftype == "tdms") { stftype = stfio::tdms; } else { stftype = stfio::none; } return stftype; } bool _read(const std::string& filename, const std::string& ftype, bool verbose, Recording& Data) { #ifndef TEST_MINIMAL stfio::filetype stftype = gettype(ftype); #else const stfio::filetype stftype = stfio::none; #endif // TEST_MINIMAL stfio::txtImportSettings tis; stfio::StdoutProgressInfo progDlg("File import", "Starting file import", 100, verbose); try { if (!stfio::importFile(filename, stftype, Data, tis, progDlg)) { std::cerr << "Error importing file\n"; return false; } } catch (const std::exception& e) { std::cerr << "Error importing file:\n" << e.what() << std::endl; return false; } return true; } PyObject* detect_events(double* data, int size_data, double* templ, int size_templ, double dt, const std::string& mode, bool norm, double lowpass, double highpass) { wrap_array(); Vector_double vtempl(templ, &templ[size_templ]); if (norm) { double fmin = *std::min_element(vtempl.begin(), vtempl.end()); double fmax = *std::max_element(vtempl.begin(), vtempl.end()); double basel = 0; double normval = 1.0; if (fabs(fmin) > fabs(fmax)) { basel = fmax; } else { basel = fmin; } vtempl = stfio::vec_scal_minus(vtempl, basel); fmin = *std::min_element(vtempl.begin(), vtempl.end()); fmax = *std::max_element(vtempl.begin(), vtempl.end()); if (fabs(fmin) > fabs(fmax)) { normval = fabs(fmin); } else { normval = fabs(fmax); } vtempl = stfio::vec_scal_div(vtempl, normval); } Vector_double trace(data, &data[size_data]); Vector_double detect(size_data); if (mode=="criterion") { stfio::StdoutProgressInfo progDlg("Computing detection criterion...", "Computing detection criterion...", 100, true); detect = stfnum::detectionCriterion(trace, vtempl, progDlg); } else if (mode=="correlation") { stfio::StdoutProgressInfo progDlg("Computing linear correlation...", "Computing linear correlation...", 100, true); detect = stfnum::linCorr(trace, vtempl, progDlg); } else if (mode=="deconvolution") { stfio::StdoutProgressInfo progDlg("Computing detection criterion...", "Computing detection criterion...", 100, true); try { detect = stfnum::deconvolve(trace, vtempl, 1.0/dt, highpass, lowpass, progDlg); } catch (const std::runtime_error& e) { std::cerr << e.what() << std::endl; return Py_BuildValue(""); } } npy_intp dims[1] = {(int)detect.size()}; PyObject* np_array = PyArray_SimpleNew(1, dims, NPY_DOUBLE); double* gDataP = (double*)array_data(np_array); /* fill */ std::copy(detect.begin(), detect.end(), gDataP); return np_array; } PyObject* peak_detection(double* invec, int size, double threshold, int min_distance) { wrap_array(); Vector_double data(invec, &invec[size]); std::vector peak_idcs = stfnum::peakIndices(data, threshold, min_distance); npy_intp dims[1] = {(int)peak_idcs.size()}; PyObject* np_array = PyArray_SimpleNew(1, dims, NPY_INT); if (sizeof(int) == 4) { int* gDataP = (int*)array_data(np_array); /* fill */ std::copy(peak_idcs.begin(), peak_idcs.end(), gDataP); return np_array; } else if (sizeof(short) == 4) { short* gDataP = (short*)array_data(np_array); /* fill */ std::copy(peak_idcs.begin(), peak_idcs.end(), gDataP); return np_array; } else { std::cerr << "Couldn't find 4-byte integer type\n"; return NULL; } } double risetime(double* invec, int size, double base, double amp, double frac) { wrap_array(); Vector_double data(invec, &invec[size]); double itLoReal, itHiReal, otLoReal, otHiReal; std::size_t argmax = 0; if (size > 0) { double max = data[0]; for (std::size_t nd=1; nd < data.size(); ++nd) { if (data[nd] > max) { max = data[nd]; argmax = nd; } } } return stfnum::risetime2(data, base, amp, 0, argmax, frac, itLoReal, itHiReal, otLoReal, otHiReal); } stimfit-0.15.8/src/pystfio/stfio_plot.py0000664000175000017500000005412213062445067015242 00000000000000""" Some plotting utilities to use scale bars rather than coordinate axes. 04 Feb 2011, C. Schmidt-Hieber, University College London From the stfio module: http://code.google.com/p/stimfit """ # TODO: Pin scale bars to their position # TODO: Implement 2-channel plots import os import sys import numpy as np import numpy.ma as ma HAS_MPL = True try: import matplotlib import matplotlib.pyplot as plt from mpl_toolkits.axes_grid.axislines import Subplot except ImportError as err: HAS_MPL = False MPL_ERR = err # dummy class class Subplot(object): pass scale_dist_x = 0.04 scale_dist_y = 0.04 graph_width = 6.0 graph_height = 4.0 key_dist = 0.04 def save_ma(ftrunk, marr): if not isinstance(marr, ma.core.MaskedArray): marr = ma.array(marr, mask=False) data = np.array(marr) mask = np.array(marr.mask) np.save(ftrunk + ".data.npy", data) np.save(ftrunk + ".mask.npy", mask) def load_ma(ftrunk): data = np.load(ftrunk + ".data.npy") mask = np.load(ftrunk + ".mask.npy") return ma.array(data, mask=mask) class Timeseries(object): # it this is 2d, the second axis (shape[1]) is time def __init__(self, *args, **kwargs): if len(args) > 2: raise RuntimeError( "Timeseries accepts at most two non-keyworded arguments") fromFile = False # First argument has to be either data or file_trunk if isinstance(args[0], str): if len(args) > 1: raise RuntimeError( "Timeseries accepts only one non-keyworded " "argument if instantiated from file") if os.path.exists("%s_data.npy" % args[0]): self.data = np.load("%s_data.npy" % args[0]) else: self.data = load_ma("%s_data.npy" % args[0]) self.dt = np.load("%s_dt.npy" % args[0]) fxu = open("%s_xunits" % args[0], 'r') self.xunits = fxu.read() fxu.close() fyu = open("%s_yunits" % args[0], 'r') self.yunits = fyu.read() fyu.close() fromFile = True else: self.data = args[0] self.dt = args[1] if len(kwargs) > 0 and fromFile: raise RuntimeError( "Can't set keyword arguments if Timeseries was " "instantiated from file") for key in kwargs: if key == "xunits": self.xunits = kwargs["xunits"] elif key == "yunits": self.yunits = kwargs["yunits"] elif key == "linestyle": self.linestyle = kwargs["linestyle"] elif key == "linewidth": self.linewidth = kwargs["linewidth"] elif key == "color": self.color = kwargs["color"] elif key == "colour": self.color = kwargs["colour"] else: raise RuntimeError("Unknown keyword argument: " + key) if "xunits" not in kwargs and not fromFile: self.xunits = "ms" if "yunits" not in kwargs and not fromFile: self.yunits = "mV" if "linestyle" not in kwargs: self.linestyle = "-" if "linewidth" not in kwargs: self.linewidth = 1.0 if "color" not in kwargs and "colour" not in kwargs: self.color = 'k' def __getitem__(self, idx): return self.data[idx] def __setitem__(self, idx, value): self.data[idx] = value def __add__(self, other): if isinstance(other, Timeseries): result = self.data + other.data else: result = self.data + other return self.copy_attributes(result) def __mul__(self, other): if isinstance(other, Timeseries): result = self.data * other.data else: result = self.data * other return self.copy_attributes(result) def __sub__(self, other): if isinstance(other, Timeseries): result = self.data - other.data else: result = self.data - other return self.copy_attributes(result) def __div__(self, other): if isinstance(other, Timeseries): result = self.data / other.data else: result = self.data / other return self.copy_attributes(result) def __truediv__(self, other): return self.__div__(other) def copy_attributes(self, data): return Timeseries( data, self.dt, xunits=self.xunits, yunits=self.yunits, linestyle=self.linestyle, linewidth=self.linewidth, color=self.color) def x_trange(self, tstart, tend): return np.arange(int(tstart/self.dt), int(tend/self.dt), 1.0, dtype=np.float) * self.dt def y_trange(self, tstart, tend): return self.data[int(tstart/self.dt):int(tend/self.dt)] def timearray(self): return np.arange(0.0, self.data.shape[-1]) * self.dt def duration(self): return self.data.shape[-1] * self.dt def interpolate(self, newtime, newdt): if len(self.data.shape) == 1: return Timeseries(np.interp(newtime, self.timearray(), self.data, left=np.nan, right=np.nan), newdt) else: # interpolate each row individually: # iparray = ma.zeros((self.data.shape[0], len(newtime))) # for nrow, row in enumerate(self.data): # flin = \ # interpolate.interp1d( # self.timearray(), row, # bounds_error=False, fill_value=np.nan, kind=kind) # iparray[nrow,:]=flin(newtime) iparray = ma.array([ np.interp( newtime, self.timearray(), row, left=np.nan, right=np.nan) for nrow, row in enumerate(self.data)]) return Timeseries(iparray, newdt) def maskedarray(self, center, left, right): # check whether we have enough data left and right: if len(self.data.shape) > 1: mask = \ np.zeros((self.data.shape[0], int((right+left)/self.dt))) maskedarray = \ ma.zeros((self.data.shape[0], int((right+left)/self.dt))) else: mask = np.zeros((int((right+left)/self.dt))) maskedarray = ma.zeros((int((right+left)/self.dt))) offset = 0 if center - left < 0: if len(self.data.shape) > 1: mask[:, :int((left-center)/self.dt)] = 1 else: mask[:int((left-center)/self.dt)] = 1 leftindex = 0 offset = int((left-center)/self.dt) else: leftindex = int((center-left)/self.dt) if center + right >= len(self.data) * self.dt: endtime = len(self.data) * self.dt if len(self.data.shape) > 1: mask[:, -int((center+right-endtime)/self.dt):] = 1 else: mask[-int((center+right-endtime)/self.dt):] = 1 rightindex = int(endtime/self.dt) else: rightindex = int((center+right)/self.dt) for timest in range(leftindex, rightindex): if len(self.data.shape) > 1: if timest-leftindex+offset < maskedarray.shape[1] and \ timest < self.data.shape[1]: maskedarray[:, timest-leftindex+offset] = \ self.data[:, timest] else: if timest-leftindex+offset < len(maskedarray): maskedarray[timest-leftindex+offset] = \ self.data[timest] maskedarray.mask = ma.make_mask(mask) return Timeseries(maskedarray, self.dt) def save(self, file_trunk): if isinstance(self.data, ma.MaskedArray): save_ma("%s_data.npy" % file_trunk, self.data) else: np.save("%s_data.npy" % file_trunk, self.data) np.save("%s_dt.npy" % file_trunk, self.dt) fxu = open("%s_xunits" % file_trunk, 'w') fxu.write(self.xunits) fxu.close() fyu = open("%s_yunits" % file_trunk, 'w') fyu.write(self.yunits) fyu.close() def plot(self): fig = plt.figure(figsize=(8, 6)) ax = StandardAxis(fig, 111, hasx=True) ax.plot(self.timearray(), self.data, '-k') class timeseries(Timeseries): def __init__(self, *args, **kwargs): super(timeseries, self).__init__(*args, **kwargs) sys.stderr.write("stfio_plot.timeseries is deprecated. " "Use stfio_plot.Timeseries instead.\n") class StandardAxis(Subplot): def __init__(self, *args, **kwargs): if not HAS_MPL: raise MPL_ERR hasx = kwargs.pop('hasx', False) hasy = kwargs.pop('hasy', True) kwargs['frameon'] = False super(StandardAxis, self).__init__(*args, **kwargs) args[0].add_axes(self) self.axis["right"].set_visible(False) self.axis["top"].set_visible(False) if not hasx: self.axis["bottom"].set_visible(False) if not hasy: self.axis["left"].set_visible(False) def average(tsl): # find fastest dt: dt_common = 1e12 for ts in tsl: if ts.dt < dt_common: newtime = ts.timearray() dt_common = ts.dt # interpolate all series to new dt: tslip = [ts.interpolate(newtime, dt_common) for ts in tsl] if len(tslip[0].data.shape) == 1: ave = np.empty((len(tslip), len(tslip[0].data))) else: ave = np.empty( (len(tslip), tslip[0].data.shape[0], tslip[0].data.shape[1])) for its, ts in enumerate(tslip): if len(ts.data.shape) == 1: ave[its] = ts.data else: ave[its, :, :] = ts.data[:, :] if len(ts.data.shape) == 1: return Timeseries(ma.mean(ave, axis=0), dt_common) else: avef = ma.zeros((tslip[0].data.shape[0], tslip[0].data.shape[1])) for nrow, row in enumerate(avef): avef[nrow, :] = ma.mean(ave[:, nrow, :], axis=0) return Timeseries(avef, dt_common) def prettyNumber(f): fScaled = f if fScaled < 1: correct = 10.0 else: correct = 1.0 # set stepsize try: nZeros = int(np.log10(fScaled)) except OverflowError: nZeros = 0 prev10e = 10.0**nZeros / correct next10e = prev10e * 10 if fScaled / prev10e > 7.5: return next10e elif fScaled / prev10e > 5.0: return 5 * prev10e else: return round(fScaled/prev10e) * prev10e def plot_scalebars(ax, div=3.0, labels=True, xunits="", yunits="", nox=False, sb_xoff=0, sb_yoff=0, sb_ylabel_xoff_comp=False, sb_ylabel_yoff=0, rotate_yslabel=False, linestyle="-k", linewidth=4.0, textcolor='k', textweight='normal', xmin=None, xmax=None, ymin=None, ymax=None): # print dir(ax.dataLim) if xmin is None: xmin = ax.dataLim.xmin if xmax is None: xmax = ax.dataLim.xmax if ymin is None: ymin = ax.dataLim.ymin if ymax is None: ymax = ax.dataLim.ymax xscale = xmax-xmin yscale = ymax-ymin xoff = (scale_dist_x + sb_xoff) * xscale if sb_ylabel_xoff_comp: xoff_ylabel = scale_dist_x * xscale else: xoff_ylabel = xoff yoff = (scale_dist_y - sb_yoff) * yscale # plot scale bars: xlength = prettyNumber((xmax-xmin)/div) xend_x, xend_y = xmax, ymin if not nox: xstart_x, xstart_y = xmax-xlength, ymin scalebarsx = [xstart_x+xoff, xend_x+xoff] scalebarsy = [xstart_y-yoff, xend_y-yoff] else: scalebarsx = [xend_x+xoff, ] scalebarsy = [xend_y-yoff] ylength = prettyNumber((ymax-ymin)/div) yend_x, yend_y = xmax, ymin+ylength scalebarsx.append(yend_x+xoff) scalebarsy.append(yend_y-yoff) ax.plot(scalebarsx, scalebarsy, linestyle, linewidth=linewidth, solid_joinstyle='miter') if labels: # if textcolor is not None: # color = "\color{%s}" % textcolor # else: # color = "" if not nox: # xlabel if xlength >= 1: xlabel = r"%d$\,$%s" % (xlength, xunits) else: xlabel = r"%g$\,$%s" % (xlength, xunits) xlabel_x, xlabel_y = xmax-xlength/2.0, ymin xlabel_y -= key_dist*yscale ax.text( xlabel_x+xoff, xlabel_y-yoff, xlabel, ha='center', va='top', weight=textweight, color=textcolor) # ylabel if ylength >= 1: ylabel = r"%d$\,$%s" % (ylength, yunits) else: ylabel = r"%g$\,$%s" % (ylength, yunits) if not rotate_yslabel: ylabel_x, ylabel_y = \ xmax, ymin + ylength/2.0 + sb_ylabel_yoff*yscale ylabel_x += key_dist*xscale ax.text(ylabel_x+xoff_ylabel, ylabel_y-yoff, ylabel, ha='left', va='center', weight=textweight, color=textcolor) else: ylabel_x, ylabel_y = xmax, ymin + ylength/2.0 + sb_ylabel_yoff ylabel_x += key_dist*xscale ax.text(ylabel_x+xoff_ylabel, ylabel_y-yoff, ylabel, ha='left', va='center', rotation=90, weight=textweight, color=textcolor) def xFormat(x, res, data_len, width): points = int(width/2.5 * res) part = float(x) / data_len return int(part*points) def yFormat(y): return y def reduce(ydata, dy, maxres, xoffset=0, width=graph_width): x_last = xFormat(0, maxres, len(ydata), width) y_last = yFormat(ydata[0]) y_max = y_last y_min = y_last x_next = 0 y_next = 0 xrange = list() yrange = list() xrange.append(x_last) yrange.append(y_last) for (n, pt) in enumerate(ydata[:-1]): x_next = xFormat(n+1, maxres, len(ydata), width) y_next = yFormat(ydata[n+1]) # if we are still at the same pixel column, # only draw if this is an extremum: if (x_next == x_last): if (y_next < y_min): y_min = y_next if (y_next > y_max): y_max = y_next else: # else, always draw and reset extrema: if (y_min != y_next): xrange.append(x_last) yrange.append(y_min) y_last = y_min if (y_max != y_next): xrange.append(x_last) yrange.append(y_max) y_last = y_max xrange.append(x_next) yrange.append(y_next) y_min = y_next y_max = y_next x_last = x_next y_last = y_next trace_len_pts = width/2.5 * maxres trace_len_time = len(ydata) * dy dt_per_pt = trace_len_time / trace_len_pts xrange = np.array(xrange)*dt_per_pt + xoffset return xrange, yrange def plot_traces(traces, traces2=None, ax=None, Fig=None, pulses=None, xmin=None, xmax=None, ymin=None, ymax=None, y2min=None, y2max=None, xoffset=0, maxres=None, plot_sb=True, sb_yoff=0, sb_xoff=0, linestyle_sb="-k", dashedline=None, sagline=None, rotate_yslabel=False, textcolor='k', textweight='normal', textcolor2='r', figsize=None, pulseprop=0.05, border=0.2): if ax is None: if figsize is None: Fig = plt.figure(dpi=maxres) else: Fig = plt.figure(dpi=maxres, figsize=figsize) Fig.patch.set_alpha(0.0) if pulses is not None and len(pulses) > 0: prop = 1.0-pulseprop-border else: prop = 1.0-border ax = Fig.add_axes([0.0, (1.0-prop), 1.0-border, prop], alpha=0.0) # This is a hack to find the y-limits of the # traces. It should be supplied by stf.plot_ymin() & stf.plot_ymax(). But # this doesn't work for a 2nd channel, and if the active channel is 2 (IN # 2). It seems like stf.plot_ymin/max always gets data from channel 0 (IN # 0), irrespective of which is choosen as the active channel. if y2min is not None and y2max is not None: ymin, ymax = np.inf, -np.inf for trace in traces: if maxres is None: xrange = trace.timearray()+xoffset yrange = trace.data else: xrange, yrange = reduce(trace.data, trace.dt, maxres=maxres) xrange += xoffset if y2min is not None and y2max is not None: ymin, ymax = min(ymin, yrange.min()), max(ymax, yrange.max()) # Hack to get y-limits of data. See comment above. ax.plot( xrange, yrange, trace.linestyle, lw=trace.linewidth, color=trace.color) y2min, y2max = np.inf, -np.inf # Hack to get y-limit of data, see comment above. if traces2 is not None: copy_ax = ax.twinx() for trace in traces2: if maxres is None: xrange = trace.timearray()+xoffset yrange = trace.data else: xrange, yrange = reduce(trace.data, trace.dt, maxres=maxres) xrange += xoffset y2min, y2max = min(y2min, yrange.min()), max(y2max, yrange.max()) # Hack to get y-limit of data, see comment above. copy_ax.plot(xrange, yrange, trace.linestyle, lw=trace.linewidth, color=trace.color) else: copy_ax = None if xmin is not None: phantomrect_x0 = xmin else: phantomrect_x0 = ax.dataLim.xmin if xmax is not None: phantomrect_x1 = xmax else: phantomrect_x1 = ax.dataLim.xmax if ymin is not None: phantomrect_y0 = ymin else: phantomrect_y0 = ax.dataLim.ymin if ymax is not None: phantomrect_y1 = ymax else: phantomrect_y1 = ax.dataLim.ymax ax.plot( [phantomrect_x0, phantomrect_x1], [phantomrect_y0, phantomrect_y1], alpha=0.0) if traces2 is not None: if y2min is not None: phantomrect_y20 = y2min else: phantomrect_y20 = copy_ax.dataLim.ymin if y2max is not None: phantomrect_y21 = y2max else: phantomrect_y21 = copy_ax.dataLim.ymax copy_ax.plot( [phantomrect_x0, phantomrect_x1], [phantomrect_y20, phantomrect_y21], alpha=0.0) xscale = ax.dataLim.xmax-ax.dataLim.xmin if dashedline is not None: ax.plot([ax.dataLim.xmin, ax.dataLim.xmax], [dashedline, dashedline], "--k", linewidth=traces[0].linewidth*2.0) gridline_x = ax.dataLim.xmax gridline_x += key_dist*xscale if sagline is not None: ax.plot([ax.dataLim.xmin, ax.dataLim.xmax],[sagline, sagline], "--k", linewidth=traces[0].linewidth*2.0) gridline_x = ax.dataLim.xmax gridline_x += key_dist*xscale if xmin is None: xmin = ax.dataLim.xmin if xmax is None: xmax = ax.dataLim.xmax if ymin is None: ymin = ax.dataLim.ymin if ymax is None: ymax = ax.dataLim.ymax ax.set_xlim(xmin, xmax) ax.set_ylim(ymin, ymax) if traces2 is not None: if y2min is None: y2min = copy_ax.dataLim.ymin if y2max is None: y2max = copy_ax.dataLim.ymax copy_ax.set_ylim(y2min, y2max) sb_xoff_total = -0.03+sb_xoff sb_yl_yoff = 0.025 else: sb_xoff_total = sb_xoff sb_yl_yoff = 0 if plot_sb: plot_scalebars( ax, linestyle=linestyle_sb, xunits=traces[0].xunits, yunits=traces[0].yunits, textweight=textweight, textcolor=textcolor, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, rotate_yslabel=rotate_yslabel, sb_xoff=sb_xoff_total, sb_ylabel_xoff_comp=(traces2 is not None), sb_ylabel_yoff=sb_yl_yoff) if traces2 is not None: plot_scalebars( copy_ax, linestyle=traces2[0].linestyle, xunits=traces2[0].xunits, yunits=traces2[0].yunits, textweight=textweight, textcolor=textcolor2, xmin=xmin, xmax=xmax, ymin=y2min, ymax=y2max, rotate_yslabel=rotate_yslabel, nox=True, sb_xoff=-0.01+sb_xoff, sb_ylabel_xoff_comp=True, sb_ylabel_yoff=-sb_yl_yoff) if pulses is not None and len(pulses) > 0: axp = Fig.add_axes( [0.0, 0.0, 1.0-border, pulseprop+border/4.0], sharex=ax) for pulse in pulses: xrange = pulse.timearray() yrange = pulse.data axp.plot( xrange, yrange, pulse.linestyle, linewidth=pulse.linewidth, color=pulse.color) plot_scalebars( axp, linestyle=linestyle_sb, nox=True, yunits=pulses[0].yunits, textweight=textweight, textcolor=textcolor) for o in axp.findobj(): o.set_clip_on(False) axp.axis('off') for o in ax.findobj(): o.set_clip_on(False) ax.axis('off') if traces2 is not None: copy_ax.axis('off') if ax is None: return Fig return ax # NOTE copy_ax HKT mod def standard_axis(fig, subplot, sharex=None, sharey=None, hasx=False, hasy=True): sys.stderr.write("This method is deprecated. " "Use stfio_plot.StandardAxis instead.\n") try: iter(subplot) if isinstance(subplot, matplotlib.gridspec.GridSpec): ax1 = Subplot( fig, subplot, frameon=False, sharex=sharex, sharey=sharey) else: ax1 = Subplot( fig, subplot[0], subplot[1], subplot[2], frameon=False, sharex=sharex, sharey=sharey) except: ax1 = Subplot( fig, subplot, frameon=False, sharex=sharex, sharey=sharey) fig.add_axes(ax1) ax1.axis["right"].set_visible(False) ax1.axis["top"].set_visible(False) if not hasx: ax1.axis["bottom"].set_visible(False) if not hasy: ax1.axis["left"].set_visible(False) return ax1 stimfit-0.15.8/src/pystfio/test.h50000644000175000017500000750063013240263412013716 00000000000000‰HDF  ÿÿÿÿÿÿÿÿ˜ÿÿÿÿÿÿÿÿ`ˆ¨ˆ¨TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@HEAP°PØê (VERSION3.0 ¨channels datetime„àpˆ ·—NMSNOD0 8X¾@Ü Hè xP TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( ¸ 19/07/10ØJ 8é‡ >9Ía *¸à"8é‡ Lç: ŒcP 8/¿¿ €À",u·ÌJ øóÛX/¿¿jýœ [ 23:24:429ÍôßÛÀóÛü0¿¿x/¿¿3_Íh™9/>9Íô¯=ü0¿¿¨/¿¿È{ ¸/¿¿?q„W] È{ ô¯=ÀóÛü0¿¿È/¿¿ôßÛÀóÛ8é‡ Ø/¿¿3_Íÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of test4.h5 8 FIELD_0_NAME channels 0 FIELD_1_NAMEdate 0 FIELD_2_NAMEtimex˜TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HEAPX ¸descriptioncomment8!·—NM˜SNODh ! ·—NM˜) HEAPX(Àch0ch1ch2ch30Amp1x-D HEAPXHd descriptionsection_0section_1section_2Amp2No descriptionNo commentš™™™™™©?msô¯=8é‡ mV¿F:”‰6 š™™™™™©?msô¯=8é‡ mV¿F:”‰6 š™™™™™©?msô¯=8é‡ mV¿F:”‰6 š™™™™™©?msô¯=8é‡ pA¿F:”‰6 ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec1 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitsAmp3Amp4TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0,  ·—NMSNOD +H½ÀU çTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨08 Hn_sections ÿÿÿÿÿÿÿÿð1 ·—NM (CLASSTABLE :¸SNOD˜/Ø:(¨»8x<TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(¼  (VERSION3.0 @TITLEDescription of channel 0 8 FIELD_0_NAME n_sections; =TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨>HEAPX @=datadescription8  @œð?q·—NM€SNOD˜=ð°ÀXÂÀqÂxÂÀXÂÀ?Â@3Â@3€9Â@3ÂÀ?€RÂ@eÂ@LÂ@3Â-ÂÀ?ÂÀXÂ@LÂ@LÂ@3Â@LÂÀ?Â@L€RÂ@LÂ_ÂÀq€k€RÂÀ?ÂÀ?ÂÀX€RÂ_Â_ÂÀXÂF€9Â@3Â-ÂFÂ@LÂFÂ-€9ÂÀ?Â@3ÂFÂFÂÀXÂ@e€kÂ_Â@eÂ@e€RÂÀXÂ@LÂ_ÂÀXÂF€RÂ@LÂ@3Â@eÂ_ÂÀXÂ@L€RÂ_ÂÀqÂÀqÂxÂÀqÂ@e‘Â@—‘ÂxÂ@~Â@~€„‘€„‘‘ÂÀŠ€„Â@~ÂÀŠÂÀŠÂ@~ÂxÂ@eÂ@e€„€kÂ@e€kÂÀqÂx€„‘‘‘€ÂÀ£Â@°ªÂÀ£Â@—Â@—€ÂÀ£Â@—€ÂÀ£ÂÀ¼Â@°ÂÀ£€¶Â@ÉÂÃÂÀÏÂÀÕÂ@âÂ@âÂÀÕÂÀÕÂÜÂ@âÂÀÕÂ@ÉÂÃÂ@ÉÂÀ¼Â@ÉÂÃÂÀÕÂÀÕÂ@ÉÂ@ÉÂÀÕÂÀÕÂ@°ÂÃÂÃÂÀ¼ÂÀÕÂ@ÉÂÀ¼Â@°Â@°ªªª€¶Â@É€ÏÂ@âÂÀî€èÂ@âÂÀÕÂ@ÉÂÃÂÜÂÀÕÂ@ÉÂÜÂ@âÂ@ÉÂÀÕÂÀîÂ@ÉÂ@ÉÂÀÕÂÀÕÂ@É€ÏÂÀÕÂÀî€èÂ@â€èÂ@âÂ@ûÂ@âÂÀîÂ@ÉÂÀÕÂÀîÂÜ€ÏÂÜÂ@û€Âà€Â@âÂÀÕÂ@ÉÂ@âÂõÂà€Âà€Âà€Â@ûÂÀ€Âà€Â@ûÂÀîÂ@âÂ@ûÂõÂÀîÂ@ûÂÀîÂÀ€ÂÀîÂ@ûÂ@âÂõÂ@âÂÀîÂ@ûÂ@ûÂÀ€Â@û €Âà€Â@ûÂÀîÂÜÂ@âÂÀî€Âà€Â@â€ÏÂ@âÂÀî€èÂÀî€èÂÜÂÀÕÂ@ÉÂÀîÂ@ûÂ@ûÂÀîÂÀÕÂÀÕÂ@âÂ@âÂÀîÂ@ûÂõÂÀîÂÀîÂ@âÂõÂ@ûÂ@âÂ@âÂÀÕÂ@ÉÂÀ¶ÂÀ£Â@°Â@°€€ªÂÀ£ÂxÂ@eÂÀqÂ@eÂÀXÂÀqÂx€kÂÀXÂÀqÂ@~Â@~Â@~ÂÀŠÂÀqÂ@~ÂÀqÂx€kÂÀXÂ@e€kÂxÂxÂ@~€kÂÀ?Â@3ÂÀ?Â@3Â@3ÂÀ?€RÂFÂÀ?ÂÀ?Â-ÂÀ?€RÂFÂÀ?Â@LÂÀ?Â-Â@3ÂÀ?ÂÀ?ÂÀ?Â@LÂ@LÂ_Â@LÂ@LÂ_ÂÀXÂÀ?ÂFÂ@Â@ÂÂÀ&Â-€ €9€9ÂÀ?Â-Â@3€ Â@€ € Â@Â@Â-ÂÀ&ÂÀ&ÂÀ&€9ÂÀ?ÂÀ&ÂÀ&Â@ÂÂ@ÂÀ €ÂÂ@Â@ÂÀô~Â@Â@ÂÀô~€Â@ÂÀô~Â@ÂÀ Â@Â@ÂÀÛ~ÂÀÛ~€î~€€Â@Â@Â@Â@€€ÂÀ ÂÀ ÂÀ ÂÂû~Â@ÂÀô~€Õ~ÂÀô~Â@è~ÂÀô~Âû~Â@Âû~Â@ÂÀô~ÂÀô~Â@è~Âû~€Âû~Â@Âû~Â@è~ÂÀô~Â@è~€Õ~ÂÀÛ~€Õ~ÂÀÛ~Â@Ï~ÂÀÛ~€Õ~ÂÀÂ~ÂÀÛ~ÂÀô~Âû~Â@Â@è~Â@è~€î~ÂÀô~€ÂÂ@Â@è~Âû~Âû~Ââ~ÂÀô~Â@è~€î~Â@è~ÂÀô~Ââ~Â@Ï~€¼~ÂÀÂ~ÂÀÛ~€Õ~ÂÀÂ~€¼~ÂÉ~Â@¶~ÂÉ~ÂÀô~ÂÀô~ÂÀô~Âû~Âû~Âû~€Õ~ÂÀÛ~Â@Ï~Â@Ï~Â@Ï~Â@Â@ÂÀ Âû~Â@è~Ââ~ÂÀÛ~€Õ~ÂÀÛ~Â@è~Ââ~€î~€î~ÂÀô~ÂÀô~Ââ~€î~ÂÀ Âû~ÂÀô~€î~ÂÀÛ~Â@Ââ~Â@è~Âû~ÂÀô~ÂÀ Â@è~€Õ~Ââ~€î~Â@è~ÂÀô~€î~ÂÀô~ÂÀô~€Â@Â@ÂÂ@Â@Âû~Âû~ÂÀ Âû~€ÂÂ@Â@ÂÀ ÂÀ ÂÀ ÂÀ ÂÂÀ ÂÂÂû~€î~€€Â@Â@ÂÂ@€ ÂÀ&ÂÀ&Â@3ÂÀ&ÂÀ Âû~ÂÂ@Â@ÂÀ ÂÀ €ÂÀ ÂÂ@ÂÀô~Â@Â@ÂÀ Â@Â@Â@€ Â-Â-ÂÀ&ÂÀ&Â@3ÂÀ&Â@3ÂÀ&€9ÂÀ?Â@3€ Â@3Â@3Â@3€ Â@Â@3€9ÂFÂÀ?ÂÀ?Â@3Â@ÂÀ&ÂÂÀ&Â-Â@L€9ÂÀ?ÂFÂFÂÀ?ÂÀ?Â@3Â@3Â@3ÂÀ&ÂÀ&Â@3ÂÀ?ÂF€9Â@LÂFÂ@eÂÀXÂÀXÂ_€RÂF€RÂ@eÂÀXÂ@eÂ_€RÂ@eÂ_Â@e€RÂÀ?ÂFÂ_ÂÀXÂ_ÂÀq€kÂÀXÂ@eÂ_€RÂ@L€R€9ÂF€RÂ@L€kÂ@eÂ_Â@eÂ@e€k€„€„ÂxÂ_Â_€9Â@3ÂÀ?ÂÀ?Â@LÂ@LÂFÂÀ?ÂFÂÀXÂ@LÂ@3Â-Â@3Â@3Â@3Â@3Â@LÂFÂ@3Â@Â@€9€9Â@3Â@LÂF€9ÂFÂÀXÂ@3ÂÀ?Â@3ÂÀ?Â@3ÂÀ?ÂÀ?ÂFÂ@3€R€9€RÂ@LÂ@LÂFÂ@eÂÀXÂÀ?ÂFÂÀ?ÂÀ?€9ÂÀ&Â-€ € ÂÀ&ÂÀ&Â-€ Â@3Â@3ÂÀ&ÂÂÀ&ÂÀ&ÂÀ ÂÂ@Â@3ÂÀ&ÂÀ&ÂÀ&ÂÀ&€ € Â@3Â@3€9Â@Â-ÂÀ&Â-Â-Â@3Â-Â@3ÂÀ&Â@Â@€ € Â-ÂÀ?Â-Â-ÂÀ&Â@3€9Â@LÂ@LÂÀ?Â@3Â-Â-Â-ÂÀ&Â@LÂ@3Â@3Â-Â@ÂÀ&ÂÀ&ÂÀ&ÂÀ&Â@3ÂÀ?ÂÀ?ÂF€RÂÀXÂÀX€RÂ@L€RÂ@LÂ@LÂÀXÂÀ?ÂÀ&ÂÀ?Â@LÂÀXÂ@LÂFÂ@3ÂÀ&ÂÀ&Â@€9ÂÀ?Â@3Â@3€9Â-Â@ÂÀ&ÂÀ&Â-Â@Â-Â@ÂÀ&Â@ÂÀ&Â@3ÂÀ?ÂFÂÀ?€9Â@3ÂÀ?ÂÀ?ÂÀ?Â@ÂÀ Â@ÂÀ&€9ÂÀXÂ_€kÂ@eÂÀXÂ@eÂxÂÀXÂÀ?ÂÀ?Â@eÂ@eÂ@eÂ@LÂÀqÂÀXÂ@LÂF€9ÂFÂF€RÂ@LÂFÂÀXÂ@eÂÀŠÂ@~ÂxÂÀqÂ@LÂ@eÂÀqÂ@~ÂÀŠÂÀqÂxÂÀqÂxÂ@eÂxÂ@~ÂÀŠ€kÂ@~ÂÀŠ‘Â@~ÂÀq€kÂ@~ÂÀŠÂ@—ÂÀŠÂ@—‘ÂÀŠÂ@~ÂÀqÂx€kÂ@~‘ÂÀ£ÂÀ£€ÂÀ£ÂÀ£Â@—Â@—Â@—‘‘ÂÀŠÂ@—ÂÀŠÂ@~Â@~ÂÀqÂxÂÀqÂ@~‘ªªÂ@ÉÂÃÂÀ¼€ÏÂ@âÂÜÂ@ÉÂÀ¼ÂÀÕÂ@ÉÂ@â€ÏÂÃÂÀ£Â@°ÂÀ¼Â@°Â@°Â@ÉÂÃÂÀÕÂ@âÂÀÕÂ@°Â@°€¶Â@É€ÏÂÀÕ€ÏÂÀÕÂÀÕ€ÏÂ@°€¶€¶ÂÀÕÂÀÕÂ@âÂÜ€ÏÂÀÕÂ@ÉÂÀÕÂÀÕÂÀÕ€èÂÀÕÂÀÕÂ@ÉÂÜÂÀÕÂÀÕÂÀ¼ÂÀÕÂ@âÂÀ€Â €Âà€Âà€ÂõÂ@ûÂ@û€èÂÀÕÂ@ÉÂ@É€ÏÂ܀πÏÂÀÕÂ@âÂÜÂÀÕÂ@ÉÂ@°Â@ÉÂ@ÉÂÃÂÀÕÂ@âÂÀîÂÜÂ@ÉÂÜÂ@ûÂà€Â €Â@ûÂõ€èÂõÂÀÕÂÜÂÀîÂ@ûÂà€Â`€Â`€Â €Âà€Â@ €Â€Â €ÂÀ€Â@ûÂÀîÂõÂ@âÂ@ûÂ@ûÂÀîÂÀîÂõÂ@ûÂ@ûÂ@ûÂõÂõÂà€Âà€Âà€ÂÀîÂ@ûÂ@ €Â@ €Âà€Âà€Âà€Âà€Â€Â €Â`€ÂÀ€Âà€Â €Â €Â@ €Â €Â €Â@ûÂ@ûÂõÂ@ûÂà€ÂÀ€Â@ûÂõÂ@ûÂà€Âà€Â@ûÂÀîÂÜÂ@âÂ@âÂõÂ`€Âà€Âà€Â@û €Â €Â€€Â`€Â@ €Â`€Â@û €Â`€Â €Â €Â€€Â€€Â€€Â@ €Âà€Â€€Â €ÂÀ€Â@ €Âà€Â €Â`€Âà€Â €Â €Â`)€Â #€Â€€Â€€Â`€Â €Â €Â€€Â@ €Â€Â@ €Â€€Â €Â`€Â €Â`€Â`€Â €Â`)€Â #€Âà€Â €Â €Â€,€Â #€ÂÀ€Â€€Âà€ÂÀ€Âà€ÂÀ€Â@&€Âà€Â #€Âà€Â €Â €Â #€ÂÀ2€Â€,€Â #€Â€,€Â€,€Â@&€Â €Â €Â #€Â /€Â€,€Â@&€Â #€ÂÀ€Â`€Â #€Â €Â`)€Â@&€Â@&€Â #€Â€,€Â€,€Â@&€Âà€Â €Â #€Â€,€Â€,€Âà5€Âà5€Âà5€ÂÀ2€Âà5€Âà5€Âà5€ÂÀ2€Âà5€Â H€Â <€Â€,€ÂÀ2€Â /€ÂÀ2€Â /€Â <€Â`B€Âà5€Â€,€Â /€Âà5€ÂÀ2€Â9€ÂÀ2€Âà5€Â /€Â /€Â€,€Â /€Â /€ÂÀ2€Â€,€Â`)€ÂÀ2€Âà5€Â9€Â <€Â <€Â9€Âà5€Âà5€Â H€ÂàN€ÂàN€ÂR€Â U€Â@X€ÂÀK€Â H€Â U€ÂàN€ÂàN€Â€E€Â@?€Â H€ÂàN€Â H€Â H€Â U€Â H€Â H€Â H€ÂÀK€Âà5€Â€E€Â€E€Â€E€ÂàN€Â@?€Â <€Â <€Â9€Â`B€Â@?€Â`B€Â`B€Â€E€ÂR€Â€E€ÂàN€Â U€ÂàN€Â@X€Â€^€Â`[€Â a€Â€^€ÂàN€Â H€Â H€Â€E€Â`[€ÂÀK€Â H€Â U€Â U€Â€E€Â <€Â`B€Â H€Â U€Â U€Â U€Â U€Â€^€Â a€Â@X€Â U€Â@X€ÂR€Â@X€Â U€Â a€Â U€Â€^€Â a€Âàg€Âk€ÂÀd€Â a€ÂÀd€Â n€Âk€Â€^€Â`[€Â`[€ÂR€ÂÀK€Â@X€Â`[€Â€^€Âàg€ÂÀd€Â U€Â`[€ÂÀd€Â@X€Â@X€ÂÀd€ÂÀd€Â€^€Â U€Â@X€Â a€Â a€Â`[€Â a€Â`[€Â€^€Â a€Â a€Â a€Â a€Â a€Â a€Â U€Â@X€Â a€Â a€Â@X€Â€^€ÂÀd€Âk€ÂÀd€Â n€Â@q€Âk€Â n€Âk€ÂÀd€ÂÀd€Âàg€ÂÀd€Â€^€ÂÀd€Âàg€Â`t€Â z€Â n€Â n€Â@q€Â€w€Â n€Â`t€ÂÀ}€Â@q€Â a€Â@X€Â`[€Â`[€Â`[€Âàg€Â`t€Â z€ÂÀ}€ÂÀ}€Âà€€Â z€Â n€Â@q€Â`t€Â`t€Â`t€Â z€Â`t€Âà€€Â ‡€Â ‡€Â@Š€Â ‡€Âà€€Â z€Â€w€Â`t€Âà€€Â z€Â€w€Â`t€Âàg€Â a€Â€^€Â a€ÂÀd€Âk€Â n€Âk€Â n€Â€^€Â`t€Â€w€ÂÀ}€ÂÀ}€Â z€Â`t€Â z€Â`t€Â`t€Â`t€Â`t€Â@q€Â n€Âàg€Â€w€Â n€Âàg€Âàg€Âk€Âk€Â n€Âk€Â n€Â a€Âàg€Â`[€Â a€Â€^€Â n€Â n€Â`t€Â n€Â z€Â z€Â€w€Â n€Âàg€Â n€Â n€Â n€Â`t€Â n€Â€w€Â z€Â z€Â n€Âàg€Â`t€Â`t€Âàg€Â n€Â a€Âàg€ÂÀd€ÂÀd€Âàg€Â n€Â@q€Â`t€Â@q€Â@q€Âàg€Â n€Â@q€Â a€Â€^€Â a€ÂÀd€Âk€Â`t€Â n€Â n€Â n€Â`t€Â z€Â„€Â ‡€Â`t€Â z€Â€w€Â€w€Â`t€ÂÀ}€Â€w€ÂÀ}€Â z€ÂÀ}€Â„€Â@Š€Â ‡€Âà€€Âà€€Â„€Â z€ÂÀ}€Â€w€ÂÀ}€Â€w€ÂÀ}€Â`t€Â€w€Âà€€ÂÀ}€Â z€ÂÀ}€Âà€€Â„€ÂÀ}€ÂÀ}€Â z€Â ‡€Â ‡€ÂÀ}€Âà€€ÂÀ}€Â€w€Â€w€Âà€€Â ‡€Â@Š€Â “€Â  €Âà™€Â`€ÂÀ–€Â€Â “€Â “€Â€€Â`€ÂÀ–€ÂÀ–€Âà™€Â€Â€€Â@Š€Â “€Âà™€Â`¦€Â€©€Â ¬€ÂಀÂ`¦€Âà™€ÂÀ–€Â@Š€Â ‡€Â ‡€Â z€Â ‡€Âà€€ÂÀ–€Âà™€Âà™€Â€Â@£€Â  €Â  €Â  €Â€©€Â  €Â ¬€Â€©€Â€©€Â€©€Â`¦€Â  €Â`¦€ÂÀ¯€Â ¹€ÂÀ¯€Â ¬€Â`¦€Â`¦€Â€©€Â`¦€Â ¬€Âಀ ¬€Â  €Â€Â  €Â`¦€Â@£€Â  €Âà™€Â  €Â@£€Â`¦€Âà™€Â  €ÂÀ¯€Â€©€Âಀ ¹€Â¶€ÂÀ¯€Â€©€Â  €Â`¦€Âಀ¶€Â@¼€Â ¹€Â ¹€ÂಀÂಀÂಀÂ@£€Â€Âಀ ¹€Â`¿€Â`¿€Â ¬€Â€©€Â`¿€Â`¿€Â Å€Â¶€Âಀ¶€ÂÀ¯€Â ¬€Â  €Â  €Â€©€Â€©€Â¶€Â ¹€Â ¹€Â¶€Â`¿€Â€Â€Â@¼€ÂಀÂಀ ¬€Â¶€ÂಀÂ@¼€Â Å€Â Å€Â@¼€Â€Â€Â Å€ÂÀÈ€Â@¼€Â¶€ÂÀ¯€Â@¼€Â`¿€Â ¹€Â ¹€Â`¿€Â€Â€Â ¹€Â ¬€Â ¹€Â Å€Â Å€Â€Â€Âàˀ ŀÂàˀ ŀÂàˀ Ҁ Ҁ ŀÂàˀ Ҁ ҀÂ`؀€ۀÂ`Ø€ÂÀÈ€Âàˀ€ۀÂ@Õ€Â@Õ€Â`؀ ҀÂÏ€Â@Õ€Â`؀ ހ€ۀÂ@Հ€ۀÂ@Õ€Âπ€ۀÂ@Հ ҀÂàË€ÂÏ€Â`؀ Ҁ ހÂÏ€ÂàË€ÂàË€Âπ Ҁ ŀÂàˀ ŀÂ@Õ€Â@Հ ŀ ŀÂ@¼€Â ¹€Â€Â€Â Å€Â Å€Â`¿€Â`¿€Â Å€ÂàË€Âàˀ Ҁ ҀÂÏ€Âàˀ€€€€¶€Â ¬€ÂಀÂಀÂÀ¯€Â€©€Â`¦€Â ¬€Â ¬€Â ¬€Â€©€Â ¬€Â ¬€Â  €Â ¬€ÂಀÂ@¼€Â ¹€Â`¦€Â€©€ÂÀ¯€ÂಀÂÀ¯€Â ¬€Â`¦€Â ¬€ÂಀÂಀÂಀÂÀ¯€Â ¬€Â ¬€ÂಀÂ@¼€Â`¿€ÂÀ¯€Â€©€Â€©€ÂಀÂಀ ¬€Â ¬€Â ¬€Âಀ¶€Â ¹€Âಀ ¬€Â ¬€Â  €Â€Â€©€Â ¬€Â ¬€ÂÀ¯€Âಀ ¬€Â ¬€Â ¹€Â ¹€Â@¼€ÂಀÂÀ¯€Â ¬€Â ¬€Â`¦€ÂÀ¯€Â ¬€Â€©€ÂÀ¯€Â`¦€Âಀ ¬€Â¶€Â ¬€Â@¼€Â@¼€Â ¹€Â€©€Â  €Â€©€Â€©€Â ¹€Â@¼€Â ¬€Â@£€Â  €Â`¦€Â€©€Â€©€Â ¬€Â`¦€Â “€Âà™€Â “€Â  €Â€©€Â`¦€Â`¦€ÂÀ¯€Âಀ ¹€Â ¹€Â¶€ÂÀ¯€Âಀ ¹€ÂÀ¯€ÂÀ¯€Â ¬€Â@£€Â€©€Â¶€Â ¬€Â ¬€ÂÀ¯€ÂÀ¯€Âಀ ¬€Â¶€Â ¬€Â ¬€Â  €Â  €Â€©€ÂÀ¯€Âಀ¶€Â ¹€Â ¬€Â ¬€Â ¬€Â ¬€Â ¬€Â`¿€Â`¿€Â`¿€Â Å€Â ¹€ÂಀÂಀ€©€ÂÀ¯€ÂÀ¯€Â€Â€Â€Â€Â Å€Â Å€Â Å€Â ¹€ÂಀÂ@¼€Âಀ ¬€Â ¬€Â ¬€Â¶€Âಀ ¹€Â@¼€Â¶€ÂಀÂÀ¯€Â€©€Â`¦€Â ¬€Â ¬€Â ¹€Â¶€Â ¹€ÂಀÂಀÂಀ¶€Âಀ¶€Â ¹€Â Å€Â`¿€Â¶€Âಀ ¹€Â€Â€Âಀ ¬€Â`¦€Â ¬€Â€©€Â ¬€Â ¬€Â ¬€Â ¬€Â€©€Â ¬€Â`¦€Â  €Â@£€Â€©€Â€©€Â€Â€©€Â¶€Â ¹€Â€Â€Â Ò€ÂàË€Â@¼€Â ¹€Â ¹€Â¶€Â¶€Âಀ¶€ÂಀÂಀÂ`¿€Â@¼€Â@¼€Â@¼€Â ¹€Â ¹€Â`¿€Âಀ ¬€Â ¬€ÂಀÂÀ¯€Â ¬€Â¶€ÂಀÂಀ¶€Â Å€Â Å€Âπ ŀ€€ÂàË€Â`؀ ҀÂàˀ ŀÂàˀ ŀÂÀÈ€Âàˀ ŀÂ`¿€Â Å€Â€Â€ÂÀȀ ҀÂàˀ€€ ҀÂ@Õ€Âàˀ ŀ ŀ€€ÂÀȀ ŀ€€ÂÀÈ€Âàˀ€€Â`¿€Â Å€Â€Â€Âಀ ¹€Â€Â€Â ¹€Â¶€Â ¬€Â Å€Â Å€Â Ò€Âàˀ ŀ ¹€Â ¹€ÂಀÂಀÂಀÂ`¿€Â€Â€ÂàË€Âàˀ ҀÂÀȀ€ۀÂàˀ€€€€ ŀ ŀ ¹€Â¶€Â ¹€Â Å€Â@¼€Â`¿€Â€Â€Â`¿€Â Å€Â€Â€Âàˀ ŀ ŀÂàË€Âàˀ ŀ ҀÂÀȀ€€Âàˀ ŀ€€Â@¼€Â ¹€Â`¿€Â`¿€ÂÏ€ÂàË€Âπ ҀÂÀÈ€ÂÀȀ ŀ ŀÂàË€Â@Õ€Âπ ҀÂàË€Âàˀ ŀÂ`¿€Â@¼€Â Å€ÂàË€ÂàË€Âàˀ ŀ ŀÂ`¿€Â@¼€Â Å€Â Ò€ÂÀÈ€Â`¿€Â`¿€Â€Â€Â`¿€Â€Â€Âàˀ ҀÂàˀ ¹€Â ¹€Â€Â€Â Å€Â`¿€Â`¿€Â€Â€Â ¹€Â ¹€ÂÀ¯€Â ¬€Âಀ¶€Â¶€ÂÀ¯€Â ¬€Â€©€Â ¬€ÂಀÂಀ¶€ÂಀÂಀÂÀ¯€Â€©€Â`¦€Â€Â`¦€Â`¦€Â  €Â€©€Â€©€ÂÀ¯€Â€©€Â€©€Â€Â “€Â “€ÂÀ–€ÂÀ–€Âà™€Â  €ÂÀ¯€Â ¬€ÂಀÂಀÂ@¼€ÂÀ¯€Â ¬€Â€Â “€Â`€Â€€Â`€Âà€€Â„€Â€€Â “€Â “€Â€€Âà™€Âà™€Âà™€Âà™€Â  €Â`¦€Â ¬€Â`¦€Â ¬€Â€©€Â€€ÂÀ–€Â ‡€Â`€Â€Â`¦€Â@£€Â@£€Â€Â`¦€Â`¦€Â€Â ¬€Â ¹€Â ¬€Â ¬€Âಀ ¬€Â`¦€Â@£€Â  €Â ¬€Â ¬€Â`¦€Â ¬€Â€Â€©€Â ¬€Â€©€Â`¦€Â`¦€Â ¬€Â  €Â€©€Â  €Â€Âà™€Âà™€Âà™€ÂÀ–€ÂÀ–€ÂÀ–€Â€€Â`€Â`€Â„€Â`€Â€€Â ‡€ÂÀ–€Âà™€Â@£€Â@£€Â@£€Â@£€Â`¦€Â€©€Â€©€Â€©€Â@£€Â@£€Â€©€ÂÀ¯€Â ¬€ÂÀ¯€Â`¦€Âಀ¶€Â ¬€ÂಀÂ`¦€Â  €Â  €Â€Â  €Âà™€Â€Â€Â@£€Â ¹€Â@¼€ÂÀ¯€ÂÀ¯€ÂÀ¯€Âಀ ¬€Â@£€Â  €Âà™€Â  €Â€©€Â  €Â`¦€ÂÀ¯€Âಀ ¬€Â`¦€Â@£€Â`¦€Â@£€Âà™€Âà™€ÂÀ–€Âà™€Âà™€Â “€ÂÀ–€Âà™€Â`¦€Â€©€ÂಀÂಀÂಀÂಀÂÀ¯€Â`¦€Â€©€Â ¬€Â ¬€Â ¬€Â€©€Â  €Â`€Â`€Â`€Â “€Â “€Â “€Â “€Â “€Â ‡€Â “€Â  €Â€Â€Âà™€Âà™€Âà™€Âà™€Â  €Â`¦€Â  €Â€Â  €Â@£€Â€Âà™€ÂÀ–€ÂÀ–€Âà™€Âà™€Â “€Â€€ÂÀ–€Âà™€Â  €Â`¦€Âಀ ¬€Â ¬€Â€©€Â`¦€Â€©€Â€©€Â€Â  €Â  €Â€©€ÂÀ¯€Â`¦€Â`¦€Â  €Â  €Â “€Âà™€Âà™€Â@£€Â  €Â@£€Â`¦€Â€©€Â@£€Â`¦€Â€©€Âà™€ÂÀ–€Â`€Â “€Âà™€Âà™€Âà™€Âà™€Â “€Â`¦€Â@£€Âà™€ÂÀ–€Â€Âà™€Âà™€Â  €Â  €Â  €Â ¬€Â`¦€Â@£€Âà™€Âà™€ÂÀ–€Âà™€Âà™€Â  €Â ¬€Â ¬€Â€©€Âà™€Â “€Â “€ÂÀ–€Âà™€Âà™€ÂÀ–€Â€€Âà™€Â€Âà™€Â@£€Âà™€Âà™€Â`€Â€€Â “€Â  €Â  €Â`¦€Â€©€Â ¬€Â ¬€Â@£€Â ¬€Â ¬€Â€Â  €Âà™€Â€Âà™€Â@£€Â`¦€Â@£€Â`¦€Â  €Â@£€Âà™€Â “€Â “€ÂÀ–€Â€Â€Â`¦€Â  €Âà™€Â “€Âà™€Â€€Âà™€Â€©€Â`¦€Âà™€Âà™€Âà™€Âà™€Âà™€Âà™€Âà™€Â  €Â`¦€Â@£€Â€©€Â€©€Â`¦€Â “€Â  €Â@£€Â`¦€Â  €Âà™€Â`¦€Â`¦€ÂÀ¯€Â€©€Â`¦€Â€Â`¦€Â@£€Â@£€Âà™€Â  €Â ¬€Â  €Â`¦€Â`¦€Â€©€Â@£€Â  €Â ¬€Â¶€Â`¿€Â ¹€Âಀ  €Â€Âà™€Â@£€Âà™€ÂÀ–€Âà™€Â “€ÂÀ–€Â  €Â€©€Â@£€Âà™€Â@£€Â€©€Â ¬€Â€©€Â ¬€Â€©€Â€©€Âಀ ¬€Â ¬€Â ¬€Â ¬€Â@£€Â  €Â ¬€Â¶€Â`¿€Â€Â€Â€Â€Â@¼€Â ¹€Â€Â€Â ¹€Â€Â€Â€Â€Âಀ¶€Â€Â€ÂಀÂ`¿€Â¶€ÂಀÂಀÂÀ¯€Â ¹€Â ¬€Â ¬€ÂಀÂಀÂ@¼€Â ¹€Â€Â€Â€Â€Â`¿€Â Å€Âπ Ҁ ҀÂÀȀ€€ ¹€Â ¹€ÂಀÂÀ¯€Âಀ ¬€Â ¬€Â ¹€Â ¬€Â`¦€Â ¬€Â`¿€Â ¹€Âಀ ¹€Â@¼€Â¶€Â`¿€ÂಀÂಀ ¹€Â ¹€Â@¼€Â ¹€Â Å€Â Å€Â Ҁ ŀÂ`¿€Âಀ ¹€Â@¼€Â@¼€Â@¼€Â€Â€Â€Â€Â@¼€Â@¼€Â€Â€Â ¹€Â Å€Â€Â€ÂÀȀ€€Â@¼€Â€Â€ÂàË€ÂàË€ÂÀȀ Ҁ ҀÂÏ€ÂÀÈ€Â`¿€Â€Â€Â€Â€Â Å€ÂàË€ÂàË€Âπ ҀÂÏ€Â@Հ Ҁ€ۀÂ@Õ€ÂÏ€ÂÀÈ€Â@¼€Â@¼€Â ¹€Â`¿€Â`¿€Â€Â€ÂàË€ÂÀȀ¶€Â`¿€Â`¿€Âπ Ҁ Ҁ ҀÂ@Հ ҀÂπ€ۀ ހ€ۀÂ`Ø€Âàä€Âàä€Âàä€Â Þ€Â€Û€Â`؀ ހÂÀá€Â Þ€Â Þ€Â`Ø€Â`Ø€Â`؀ ŀÂ@¼€Â€Â€ÂàË€Â`؀ ހ ހÂè€Âè€Â`ñ€Â ë€Âàä€Â`ñ€Â ÷€Â ë€Â`ñ€Â€ô€Â`ñ€Âè€Âàä€Â Þ€ÂÀá€Â€Û€Â ë€Âàä€Â Þ€Â`؀ ހ ހ ހÂ@Õ€Â`؀ ހ€ۀÂ@Õ€Â`Ø€Â@Հ ހ ހ€ۀ€ۀ ހÂè€Â ë€Â@î€Â`ñ€Â€ô€Â@î€Âàä€Âàä€Âàä€Âè€Âè€Âàä€Âè€Â ë€Â`ñ€Âàä€Â`Ø€Â@Հ Ҁ ҀÂ`Ø€Âàä€Â`ñ€ÂÀú€Â ÷€Â`ñ€Â`ñ€Â€ô€Â`ñ€Â@î€Â ë€Âè€Âàä€Âàä€Âàä€ÂÀá€Âàä€Â Þ€Â ë€Âàä€Â Þ€Â ë€ÂÀá€Â`ñ€Â@î€Âàä€Âàä€Âàä€Â Þ€Â`Ø€ÂÀá€Âàä€Âàä€Â€Û€Â Ò€Â`؀ ހ ހÂàä€Â ë€Âè€ÂÀá€Â Þ€ÂÀá€Âè€Âè€Âàä€Â`ñ€Â€ô€ÂÀú€Âàý€ÂÂè€ÂÀá€Â`ñ€ÂÀú€Â@Âàý€Â ÷€ÂÀú€Âàý€Â ë€Âàä€Âàä€Â`ñ€Â ÷€ÂÀú€Â ÷€Â€ô€Â ÷€ÂÀá€Â Þ€Âàä€Âàä€Â@î€Âè€Âè€Â Þ€Âè€Â€Û€Âàä€Â ë€Â€ô€Â ë€Â ë€Âàý€Â` Âàý€Â ÷€Â ÷€ÂÀú€Âàý€Âàý€Â`ñ€Â ÷€Âàý€ÂÀú€Â ÷€Â ë€Â ë€Â ë€Â€ô€ÂÀú€Â ÷€Â ÷€Â`ñ€Â ÷€Âàý€ÂÀú€Â`ñ€Âè€Â`؀ ހ ހ ހÂè€Â`ñ€Â@î€Â`ñ€Â@î€Â ë€ÂÀá€Â Þ€Âàä€ÂÀá€Âè€Â`ñ€Â€ô€ÂÀú€Â ÷€Âàý€Âàý€ÂÀú€Â€ô€ÂÀú€Âàý€Â Âàý€Âàý€ÂÀú€Â€ô€Â ÷€Â€ô€ÂÀú€Â ÷€Â ë€Â ë€Âàý€Â  € Â` Âàý€ÂÀú€ÂÀú€Âàý€ÂÀú€ÂÀú€ÂÀú€Â  Â`  ÂÀú€ÂÂàý€ÂÂÀú€Â €  Â` Âàý€Âàý€Â  Â` Âàý€Â ÂÀÂàÂÀÂ`  Â  € € Â@Â`   ÷€Âàý€Â@Â` Â` Â` € ÂàÂàÂÂ`#€&Â`#€& )Â`#ÂàÂà Â`# )Â@ Â@ Âà    €  Â` ÂàÂàý€Â€ô€Â ÷€Âàý€Â ÷€Âàý€Â Â@Â`  €  € Âà€  €  € Â@ÂÂ` €     Âàý€ÂÀú€Â€ô€Â ë€Â ÷€Â ë€Âè€Âàý€Â ÷€Â ë€ÂÀá€Âàä€Âàä€ÂÀá€Âàä€Â`ñ€Â ÷€Âàý€ÂÀú€Â€ô€Â€ô€Â ë€Â ë€Âàä€Âàä€Âè€Â`ñ€Â€ô€Â€ô€Âè€Â`ñ€Â ÷€Âè€Â Þ€Â Þ€Â@Հ ހ€ۀ ހÂÀá€Â@î€Â`ñ€Â ë€Âè€Â Þ€Â@Հ€ۀÂàä€Â Þ€Â@Õ€ÂÏ€Â@Õ€Â`؀ ހ ހÂ`Ø€ÂàË€Âàˀ Ҁ ҀÂπ ҀÂÏ€Âàˀ ŀÂ`¿€Â€Â€Âàˀ ŀÂ`¿€Â ¹€Â¶€Âಀ¶€Â ¹€Â@¼€Â Å€ÂÀȀ€€ÂÀȀ€€Â@¼€Â`¿€Â¶€Â¶€Â ¹€ÂಀÂಀÂ@¼€Â`¿€Â¶€Â¶€Â€©€Â  €Â`¦€Â@£€Â  €Â`¦€ÂÀ¯€Â`¦€Â ¬€Â ¬€Â ¬€Â`¦€Â@£€Â@£€Âà™€Â “€ÂÀ–€Â  €ÂÀ–€Â “€Â€Â€©€Â€©€Â`¦€Â ¬€Â  €Âà™€Â€€Â “€Â “€Â`€Â`€Â ‡€Â@Š€Â„€Â„€Â„€ÂÀ}€ÂÀ}€ÂÀ}€Â z€Â z€Â€w€Â@q€Â`t€Â`t€Â z€Âà€€Âà€€Â`t€Â@q€Â n€Â n€Â`t€Â n€Â a€Â a€Âàg€Âàg€Â n€Â n€Â@q€Â n€Âàg€Â a€Â@X€Â`[€Â`[€Â€^€Â`[€Â a€Â`[€Â€^€Â`[€Â@X€Â U€ÂÀK€Â U€Â@X€ÂàN€Â H€Â H€ÂàN€Â U€Â€E€Â H€Â`B€ÂàN€ÂR€ÂR€ÂàN€Â H€Â H€ÂÀK€ÂR€Â U€ÂàN€Â H€Â`B€Â`B€Â`B€ÂàN€Â€E€ÂàN€Â`B€Â H€ÂàN€ÂàN€Â H€Â@?€Âà5€Â@?€Â€E€Â€E€Â`B€Â@?€ÂÀ2€Â <€ÂÀK€Â€E€Â H€Â€E€ÂàN€Â`B€Â /€Â /€Â€,€Â /€Âà5€Âà5€Âà5€Â /€Â`)€Â #€Â #€Â /€Â /€Âà€Â €Â €Â`)€Â /€ÂÀ2€Âà5€Â9€ÂÀ2€Â /€Â`)€Â /€Â9€Â9€Â <€ÂÀ2€Â`)€Â €Â €Âà€Â #€Â €Â €Â €Â€€Â #€Â €ÂÀ€ÂÀ€Â €Â€€Â€€Â`€Â`€Â€€ÂÀ€Â@ €Â`€Â €Âà€Â €Â`€Â €Âà€Â@ €Â €Â@ €Â €ÂÀ€ÂõÂÀ€Â €Â@ €Âà€Â@ €Â`€Â €Â €Â €Â`€Â`€Â €Â`€Âà€Âà€Â€Â@ûÂà€Â€ÂÀ€Â@ûÂ@ûÂõ€€€Âà€ÂõÂà€Â@ûÂÀîÂ@âÂÀÕÂ@ÉÂÀÕÂ@âÂõÂ@ûÂõÂ@â€èÂ@âÂÀîÂÀî€ÏÂ@ÉÂÀ¼€ÏÂ@âÂ@ÉÂÜÂÜÂÀÕÂ@âÂÜÂÀÕÂ@ÉÂ@°ÂÀ¼Â@°ÂÀ¼ÂÃÂÀ¼Â@âÂÜÂÜÂ@ÉÂÜ€ÏÂÀ¼ÂÀ¼Â@°Â@É€¶ÂÀ¼ÂÃÂ@°ÂÃÂ@°ÂÃÂ@ÉÂÀ¼€ÏÂ@ÉÂ@ÉÂ@ÉÂ@ÉÂÀÕÂÀÕÂÀÏÂÀ¼Â@É€ÏÂÃÂÜÂ@°€ÏÂÜ€¶ªÂÀ£Â@—Â@—Â@—Â@°Â@°ÂÃÂÀ¼€¶ÂÀ¼ÂÀ¼Â@ÉÂÀÕ€èÂ@âÂ@ÉÂÃÂ@°Â@°€¶Â@ɀπÏÂ@ÉÂ@âÂÃÂÜÂÃÂÀ£ÂÀ£Â@—ÂÀ£ÂÀ£€Â@°Â@°Â@°Â@°ÂÃÂ@°Â@—ªÂ@°ÂÀ¶Â@°ÂÀ£ÂÀ£€¶Â@°Â@°ÂÀ£Â@—Â@°ÂÀ¼ÂÀ¼ÂÀ£ÂÀ£€¶Â@ÉÂÃÂ@ÉÂÃÂÃÂ@É€ÏÂÀ¼Â@°Â@°ªÂÀ£Â@ÉÂÀ¼ÂÀ¼Â@ÉÂÃÂÀ¼Â@ÉÂ@°ª€¶€¶Â@°ª€ÂÀ£ÂÀ£ªÂÀ£€Â@—‘‘ÂÀ£ÂÀ£Â@°ÂÀ£ªª€Â@—Â@—€¶Â@°ÂÀ£Â@°ÂÀ£ÂÀ£€¶ÂÀ¼€¶Â@°Â@°Â@—ÂÀ£ÂÀ£€¶ªÂÀ£€€„Â@°ÂÀ£Â@—Â@—ÂÀ£€¶Â@°ÂÀ£€¶€ÂÀŠ€„Â@—ÂÀŠÂ@—ÂxÂÀqÂÀq‘ÂÀ£‘Â@—ÂÀ£ÂÀ£ªÂÀ£ÂÀ£ÂÀ¼ÂÀ£Â@—€Â@ÉÂÜÂ@°ÂÀ£€„ÂÀŠÂÀŠÂ@~ÂÀqÂ@—‘Â@~ÂxÂ@~Â@~‘ÂÀŠÂÀ£Â@°Â@°ªÂ@°ÂÀ£ÂÀŠ‘Â@—Â@°Â@°€ÂxÂ@~ÂÀqÂ@~Â@eÂÀXÂÀXÂ@e€kÂ@~€„ÂÀŠÂ@~Âx€kÂ@eÂ_ÂÀqÂÀq€kÂxÂÀqÂ@~ÂÀŠÂ@~ÂÀqÂ@~Â@eÂÀXÂ@e€kÂxÂxÂ@~Â@eÂ_Â_Â_€kÂ@~€„Âx€k€RÂÀXÂ_ÂxÂ_ÂÀX€RÂ@eÂÀXÂ@LÂ@LÂFÂ@LÂ@LÂ@eÂ_Â@LÂ@3Â-ÂÀ&Â@3ÂÀ&ÂFÂ@LÂ@LÂFÂ@3Â@3Â@L€9Â@3ÂFÂÀ?€RÂ@3Â-€9Â@3€9ÂÀ?ÂÀ?Â@L€RÂ@LÂ@L€RÂ@3ÂÀ&Â@3Â@3Â@3€9Â@3Â@3Â@Â@3Â@3Â@3ÂFÂÀ?ÂÀ?ÂÀ?ÂÀ?Â@3Â@3Â@ÂÀ&€9Â@3€ ÂÀ&ÂÀ Â-ÂÀ?Â@LÂÀXÂ@eÂÀXÂÀXÂÀ?ÂÀ?Â@LÂ@LÂÀXÂFÂÀ?ÂFÂÀXÂ@3ÂÀ&Â@3ÂFÂFÂ@LÂ_Â@LÂ@LÂÀ?ÂFÂ@L€9ÂFÂÀ?Â@LÂÀ?Â@L€9Â@3ÂFÂ@LÂÀX€RÂ@LÂÀXÂÀ?€RÂ@LÂÀX€kÂ@LÂÀ?Â@LÂÀXÂFÂÀ?Â@3ÂÀ?ÂÀ?ÂÀ?Â_ÂÀqÂÀŠÂ@~ÂÀqÂ@—Â@—Â@~ÂÀqÂ@e€kÂ@eÂÀqÂ_€kÂ@eÂÀqÂ_Â_Â@eÂ@eÂ_ÂÀqÂ@~Â@~ÂxÂxÂÀqÂ@~Â@~Â@~€„ÂÀŠÂÀqÂÀq‘ÂÀqÂ@~€kÂ@eÂ@eÂ@eÂÀXÂÀXÂ@eÂ@eÂxÂ@eÂ_€kÂ@~€kÂÀŠ‘Â@—€Â@~Â@~€kÂ@~ÂÀŠÂ@—€„€kÂÀŠÂ@~ÂÀŠÂÀ£Â@~Âx€kÂ@eÂÀqÂxÂxÂ@~Â_Â@LÂ@LÂFÂ@3ÂÀ?Â@LÂ@LÂ@LÂ@LÂ_ÂÀqÂÀq€RÂÀXÂ_ÂÀqÂ@eÂ@~€„ÂÀŠÂÀŠÂ@~ÂÀqÂ@eÂ_Â@eÂxÂ@~ÂÀqÂ@eÂ@eÂ_Â@LÂ_Â_ÂÀX€R€kÂÀq€„ÂÀŠÂÀ£€ÂÀ£ÂÀ£ªÂÀ£‘ÂÀq€kÂ@eÂxÂxÂ@~€k€„Â@—ÂÀŠÂ@~Â@~ÂÀŠÂ@~ÂÀq€k€kÂ@eÂÀŠÂ@—€kÂ@~ÂxÂ@eÂx€kÂÀq€„‘ÂÀŠÂ@~Â@—Â@—Â@—Â_Â@eÂ@eÂxÂ@~ÂÀqÂ@eÂÀXÂÀqÂx‘€ÂÀŠÂ@—ÂÀŠÂx€kÂ@eÂxÂ_Â@eÂ_ÂxÂÀq€„ÂxÂ@~Â@~Â@~Â@eÂ@e€RÂÀ?Â@LÂÀXÂ@eÂx€„Â@—ÂÀŠÂ@~ÂxÂÀqÂÀqÂÀqÂÀqÂx€kÂ@eÂ@eÂÀXÂ_€k€RÂ@LÂÀXÂÀXÂ@eÂ@eÂ@eÂÀXÂ_Â@L€9€9Â@3€9Â@LÂÀXÂÀXÂ_Â_Â@LÂF€R€kÂ@~ÂÀŠÂ@~ÂÀqÂ@eÂ@eÂÀqÂ_ÂÀqÂxÂ@LÂ@3Â@3Â@L€R€RÂFÂFÂxÂÀŠÂ@eÂ_Â@~€RÂÀXÂ_ÂFÂÀ?Â_Â@LÂÀ?ÂFÂFÂÀ?ÂÀXÂ@3ÂF€R€RÂ@3Â-ÂÀ?Â@eÂ@eÂ_ÂF€RÂÀ?Â@LÂ@LÂ_Â@e€kÂ@eÂ@eÂ@eÂÀXÂFÂÀ?Â@3Â-ÂFÂ@eÂ_ÂÀqÂxÂÀqÂ_Â@eÂÀqÂÀqÂÀqÂÀqÂ@~ÂÀqÂ@eÂ_Â_ÂFÂ_Â_Â@e€RÂ@eÂ_Â@eÂ@eÂÀqÂÀqÂ@~Â@~ÂÀqÂÀqÂ@eÂ@eÂÀq€kÂxÂÀŠ‘€„ÂÀŠÂ@—€„€k€RÂ_€RÂ@LÂÀ?Â@3Â@LÂFÂÀXÂ_ÂÀqÂ@~ÂÀqÂÀŠÂ@—€„Â@~ÂxÂÀŠÂxÂ@eÂ@~ÂxÂ@eÂ@eÂÀq€kÂÀXÂ@eÂ@~ÂÀŠÂÀq€„Â@~Â@—Â@—€€ÂÀ£ªÂ@—€„€„Â@~Â@~ÂÀŠÂ@~€„Â@—‘ÂÀqÂÀqÂx‘€‘‘‘‘‘€„ÂÀŠÂ@—Â@—‘Â@—€¶€¶ÂÀ¼Â@°ÂÀ£€ÂÀ£ÂÀ£Â@°‘ÂÀ£ÂÀ£Â@—Â@~Â@~€ÂÀ£Â@°ª€¶Â@°Â@°ÂÀ£ÂÀ£ÂÀ£Â@—‘Â@~Â@—Â@—ÂÀŠÂ@~Â@—Â@°Â@—Â@°ÂÃÂ@ÉÂ@ÉÂÀÕÂ@ÉÂÀ¼ÂÃÂ@—Â@—€Â@—Â@°Â@°ÂÃÂ@°ÂÃÂÀ¼Â@°Â@É€¶Â@°Â@°€¶ªÂ@°ÂÀ£ªÂÀ£ÂÀ£€ÂÀ£Â@°Â@°Â@°Â@°Â@°ÂÀπÏÂÀÏÂÜ€ÏÂÀÕ€¶ÂÀ£Â@°ÂÀ¼Â@ÉÂÀÕÂõÂ@âÂÜÂÜÂ@ÉÂÀ¼Â@°Â@°ÂÃÂÃÂ@ÉÂÜÂ@ÉÂÃÂÀÕÂÀ¼€ÏÂ@â€è€ÏÂ@°Â@âÂÀîÂÀîÂÀîÂõÂ@â€ÏÂÃÂÃÂÜÂ@âÂÜÂ@âÂ@ÉÂ@ÉÂ@ÉÂ@â€ÏÂÀÕÂÜÂ@ÉÂÀîÂ@ûÂÀ€Â@ûÂ@ûÂ`€Â@ûÂ@û€èÂÀÕÂõ €Â €Â€€Â@ûÂ@ûÂõÂõÂõÂà€Â@ûÂ@ûÂÀîÂ@âÂ@âÂ@ûÂà€Â€Â €Â@ûÂ@ûÂÀ€ÂÀ€Â`€Â €Â@ûÂõÂÀ€Âà€Â@û€Â@â€èÂ@âÂ@â€èÂÜ€èÂÀÕÂ@É€¶€€„€kÂÀXÂF€ ÂÀ ÂÀÛ~Â@Ï~ÂÀÛ~ÂÀÛ~ÂÀÂ~Â@¶~Â@~ÂÀ~Â@„~Â@R~ÂÀE~ÂL~ÂÀ^~€q~ÂÀE~€?~Â@9~ÂÀ,~ÂÀ,~ÂÀú}ÂÀú}Â~Â@ ~Â@ ~ÂÀ~Â@ ~Â@ ~ÂÀ~ÂÀ~Â~Â~€ô}€ô}ÂÏ}Â@î}Â@Õ}ÂÏ}€Â}€Â}€Â}€Â}Â@£}Â@Š}ÂÀ–}ÂÀ–}Â@£}Â@£}Â@£}Â@£}Â}ÂÀ–}ÂÀ}}€^}ÂÀK}Â@X}Â@X}ÂR}ÂÀd}Â@X}€E}Â9}ÂÀ2}Â@&}ÂÀ}ÂÀ}Â}ÂÀ}Â}Â}Â}€ú|Â}Â}€}Â@ }Â@ }Â@ }Â}Â}Â}Â@ }Â}€ú|€ú|Â@Û|Â@Û|€ú|ÂÀç|€á|Â@Û|Â@Û|ÂÕ|Â@Û|ÂÀç|ÂÀç|ÂÀç|Â@Û|ÂÕ|Â@Û|¼|ÂÀµ|£|Â@w|Âq|Â@w|Š|€–|Â@|Š|Š|€}|Â@w|Âq|Â@w|ÂÀƒ|Âq|ÂX|ÂÀj|Â@^|€d|Â@^|ÂÀQ|ÂÀ8|Â@,|Â@E|Â?|Â@,|Â@,|ÂÀ8|Â?|Â@,|€2|Â@,|Â&|ÂÀ|Â@ú{ÂÀ|Âô{Â@á{ÂÛ{ÂÛ{ÂÀí{ÂÀÔ{ÂÀÔ{ÂÂ{Â@È{©{©{€œ{Â{Â@–{Â{Â@}{Âw{ÂÀ‰{Â{Â{€œ{ÂÀ‰{ÂÀ‰{Â@–{Â{Âw{Â@}{Â@d{Â^{Â@d{€Q{Â@d{€j{Âw{€j{Â@d{ÂÀW{Â@d{Â@K{ÂÀW{Â^{ÂÀp{€j{Â^{€Q{ÂE{€Q{ÂE{Â,{Â,{Â@2{Â@2{ÂÀ%{€8{€8{ÂÀ%{Â@{ÂÀ {ÂúzÂÀóz€{Â@{€{Â@{Â{ÂÀ%{Â@{Â,{€{€{Â@{Â@{ÂÀ {ÂÀ {Â{€{Â{Â@{Â@{ÂúzÂúzÂÀózÂ@çzÂÀÚzÂÀÁzÂázÂ@ÎzÂ@ÎzÂÀÚzÂÈzÂ@ÎzÂÀÁzÂÈzÂÈzÂ@ÎzÂ@ÎzÂáz€ízÂÀÚzÂÀÚzÂ@ÎzÂÀÁzÂ@µz–zÂÀzÂ@œz€¢zÂ@œzÂÀ¨z€¢z€¢z€¢zÂ@œzÂ@µzÂ@µz€ÔzÂ@ÎzÂÈzÂÀÚz¯z¯zÂ@œz–z–zÂ@jzÂ@ƒzÂÀzÂÀzÂ@œzÂÀ¨z€¢zÂÀ¨zÂÀzÂÀzÂ}zÂ@ƒz€‰zÂÀzÂ@ƒzÂ@ƒzÂ@ƒzÂÀvzÂÀzÂ@œzÂÀz–zÂÀzÂdzÂ@jz€pz€pzÂdzÂdz€pzÂÀvzÂdz€pzÂÀvzÂ}zÂ@jzÂ@jzÂÀvz€pz€pzÂÀvzÂdzÂdz€WzÂ@zÂ@z€%zÂÀDzÂÀ+zÂÀ+zÂ@8z€>zÂ@8zÂÀDzÂ2zÂÀ+zÂÀ+zÂ2zÂ@zÂ2zÂÀ+zÂ2zÂKzÂ@8z€%zÂÀzÂ@zÂ@zÂzÂÀ+zÂ@8zÂ@zÂzÂÀzÂzÂ@zÂz€ zÂÀzÂÀzÂzÂÀz€ zÂ@zÂÀ+zÂ@z€>z€%zÂ@z€%zÂ@8zÂÀ+zÂzÂzÂ@z€ zÂ@8zÂ@8zÂ@8zÂÀ+zÂ@z€%zÂzÂ@zÂz€óyÂzÂÀz€%zÂ@zÂ@zÂÀzÂ@zÂÀùy€óyÂ@íyÂ@íy€óyÂ@íyÂçyÂ@íyÂçyÂçyÂÀàyÂ@íy€óy€óyÂ@zÂ@íyÂzÂ@ÔyÂ@»yÂÀày€ÚyÂ@íyÂÀàyÂ@»yµyÂ@»yµyÂ@»yÂ@Ôy€óyÂçyÂçyÂçyÂÀàyÂÎyÂ@»yµyµyÂ@ÔyÂÀÇyÂÎyÂÀ®yÂ@¢yµy€ÚyÂÎyÂÀ®yÂÎyÂÀàyÂÀÇyÂÎy€Úy€ÚyÂ@ÔyÂÀàyÂ@ÔyÂ@ÔyÂ@Ôy€ÁyÂ@»yµyÂÀÇyµyµyÂ@»yÂÀày€ÚyÂÎyµyµyÂÀÇyµyµyÂ@»yµyÂ@»y€ÁyµyÂ@»y€¨yÂ@¢y€yÂÀ®yÂÀ®yµyÂÀ®yÂÀ®y€Áy€¨yÂ@¢yœyœyÂ@¢yÂ@»yÂÀ®yÂÀÇyÂÀÇyÂ@»yÂÎyÂÀÇyÂ@»yµyÂ@¢yÂÀ®yÂ@¢yÂ@»yµy€ÁyÂÀ®yµyµyÂ@¢yœy€ÁyÂÎyÂÀÇyµyµyÂ@»yÂÎyÂÎyÂ@»yÂ@»yÂÀ®yÂÀÇyÂ@»yÂÀ®y€¨yÂ@¢yÂÀ®yÂÎyÂÎyÂÎyÂÎyµyµyÂÀ®yÂÀÇyÂ@ÔyÂ@ÔyÂÀàyÂçyÂÀàyÂÀÇyµyÂ@»yÂ@ÔyÂÀÇyÂÀÇyÂÀÇyÂÀÇyÂ@»yÂÀ®y€ÁyÂ@ÔyÂ@ÔyÂÀÇyÂÀÇyÂÎyÂ@ÔyÂçyÂÀùy€ zÂ@íyÂçyÂzÂ@íyÂÀùyÂzÂz€óyÂzÂçyÂÀàyÂ@íyÂÀùyÂ@ÔyÂÀÇy€ÁyÂ@ÔyÂÀÇyÂçyÂ@Ôy€ÚyÂÀàyÂÀày€ÚyÂÀàyÂ@íy€ÚyÂÎyÂÀÇyÂ@ÔyÂÀàyÂÀàyÂÀùyÂÀùy€óyÂÀùyÂ@íyÂ@íyÂÀày€ÚyÂÀàyÂ@zÂzÂÀùyÂ@zÂÀzÂÀ+z€%zÂ@zÂ@zÂzÂ@íy€Úy€Úy€óyÂzÂ@zÂ@zÂ@zÂ@íy€óy€óyÂ@zÂzÂ@zÂ@zÂ@zÂÀ+zÂz€%z€ zÂÀùyÂÀùyÂÀùyÂÀzÂ@zÂ@zÂzÂz€óyÂz€ z€ zÂz€ zÂ@zÂ@8zÂ@8zÂÀDzÂ@8zÂ@zÂÀzÂ@zÂzÂÀzÂÀzÂzÂÀzÂ@z€ zÂzÂ@z€ zÂ@z€ zÂÀ+zÂ@zÂÀ+zÂ2zÂ2z€%z€ zÂ@íyÂÀùyÂÀz€ zÂ@zÂzÂzÂzÂÀzÂÀzÂzÂÀ+zÂ2zÂ2zÂ@8z€>zÂ2zÂzÂzÂÀ+zÂ@zÂ@zÂ@z€%zÂ@zÂ@zÂ@z€%zÂÀ+zÂÀ+zÂÀ+zÂ@zÂÀ+zÂÀ+zÂ2zÂzÂzÂzÂ@íyÂzÂ@zÂzÂÀ+zÂ2zÂ@8zÂKzÂ@8zÂÀ+z€%z€%zÂ@8zÂÀ+zÂzÂÀ+zÂ@8zÂ2zÂ@8zÂ@z€%zÂÀ+zÂÀ+zÂ@8zÂ@QzÂ@8zÂ@8zÂ@QzÂKzÂÀDzÂ@8zÂÀDzÂKzÂ@QzÂKz€>zÂ@QzÂKzÂ@8z€>zÂÀDzÂ@QzÂdzÂ@jzÂÀ]zÂ@jzÂ@jzÂ@jz€WzÂ@8z€>zÂ@8zÂÀ+zÂÀDzÂ@QzÂKz€>z€>zÂ@QzÂÀ]zÂdzÂdzÂÀ]zÂ@jz€pzÂ}z€pzÂÀvzÂ@jz€WzÂ@QzÂÀvzÂ@jzÂ@jzÂÀ]zÂ@QzÂÀȀ =ŸÂÀ‘·ÂÀ·Â :¬ÂàÙŸÂÔ”Â`–‹Â€eƒÂÀ¬qÂÀF€y¡Á¤5A€ÖBVBB’jB~B v‡B@¥ˆB€S†BeB€ŽuB€îeB€×TBÀþBB 1ByB@³BRýAWßAÍÃA€uªA€“Aw{ATSAp-A A,É@{@€»?x‚¿daÀŽÁÀ Áq1ÁßYÁÁ€v•ÁªÁ¹¾Á€`ÓÁ€LçÁÈúÁ«ÂCÂÀ>˜ÂÀN%ÂÀu+€Î0ÂY5ÂÀS9ÂÅ<ÂÀÅ?ÂÀOBÂ@›DÂÀ›FÂ@jH€J€wKÂ@ÏLÂÀN€-O€'PÂ@ÐPÂ@˜QÂ@.RÂðRÂ@sS€öSÂ@mT€×TÂÀZUÂ@ËUÂ)VÂÀTV€™VÂ@ÞVÂÀWÂÀNWÂnW‡WÂ@¦WÂ@¿WÂÀýWÂÀXÂ@#XÂ@UXÂÀzXÂ@‡XÂÀ“X€tXÂ@nX€tXÂÀzXÂXÂÀ“X€XÂ@‡XÂÀ“XÂÀ“XÂ@‡XÂ@‡XÂ@ XÂ@ XÂ@ XšXÂÀ“XÂ@ X³X³X³XÂ@ X€¦XÂÀ¬XÂ@¹XÂÀÅXÂÌX€¿XÂ@ÒXÂ@ëXÂÌXÂ@¹XÂ@ XÂ@ XÂ@‡XÂXÂÀ“XÂÀ“XÂÀ“XÂXÂ@nXÂÀ/XÂOXÂ@UXÂhXÂ@yÂÀcyÂÀ|yÂ@pyÂ@pyÂ@pyÂÀ|yÂÀ|yÂ@‰yÂÀ|yƒyƒyÂÀ•yÂÀ•yÂÀ•y€¨yÂ@¢yÂÀ®yÂÀÇy€ÁyµyµyÂÎyÂÀàyÂÀàyÂÀÇy€óyÂ@z€ zÂzÂ@zÂzÂÀ+zÂ2zÂ2z€>zÂ@zÂzÂÀzÂzÂÀ+zÂ@z€%zÂ@8zÂ@8zÂ2zÂÀ+z€%zÂÀ+zÂKzÂÀ]z€WzÂÀ]zÂ@jzÂ@jzÂÀ]zÂdz€pzÂ}z€‰zÂ@µzÂÈzÂ@µz€»z€»z€»z€ÔzÂÀÁzÂÀÁzÂÀÁzÂÀÚzÂÀÚzÂázÂÀÚzÂáz€{ÂÀ%{Â@{ÂÀ%{Â@2{€8{ÂÀ%{ÂÀ%{ÂÀ%{ÂÀ%{Â@{Â@{€{Â@{Â@{Â{Â@{Â{ÂÀ%{ÂE{Â@K{€Q{Â@d{Â@d{Â@d{Âw{Â@}{Â^{Â@d{ÂÀ‰{Â@–{ÂÀ¢{€œ{Â@–{Â@–{ÂÀ‰{Â@¯{Â@¯{Â@¯{ÂÂ{ÂÀÔ{ÂÀÔ{ÂÂ{ÂÛ{Âô{€|ÂÀí{€ç{ÂÀÔ{€ç{Â@ú{€|Â@á{ÂÀÔ{Â@ú{ÂÀ|ÂÀí{Â@ú{ÂÀ| |ÂÀ|€2|Â?|ÂÀQ|Â@,|Â@,|ÂÀQ|ÂÀQ|Â@^|€}|€d|ÂÀj|Â@|Â@|Â@|ÂÀœ|ÂÀƒ|ÂÀƒ|€}|Â@w|Â@w|€}|ÂÀƒ|€–|Â@|ÂÀœ|ÂÀœ|Â@©|ÂÀœ|ÂÀµ|Â@©|€¯|ÂÀµ|Â@Â|€È|Â@Û|ÂÀç|ÂÀ}Â@ }Â@ }ÂÀ}Â@ }€} } }ÂÀ}Â@&} }Â@&}Â9}Â@?}€,}Â@&}€}ÂÀ2}Â@?}Â@?}Â@?}ÂÀK}ÂR}ÂÀd}ÂÀd}Â@X}ÂÀd}Â@X}ÂR}Â@?}ÂR}ÂR}ÂÀd}ÂÀd}ÂÀ}}ÂÀ–}ÂÀ–}Â@£}ÂÀ¯}ÂÀÈ}ÂÏ}Â@¼}Â@¼}ÂÀÈ}ÂÀÈ}Â@Õ}ÂÀÈ}€Â}ÂÏ}Â@Õ}Â@Õ}ÂÀá}Âè}Â~Â~ÂÀ~Â@~Â@~Â~Â~ÂÀ~Â@~€ ~€ ~€&~Â@ ~Â3~Â@9~ÂÀE~ÂÀE~ÂÀE~Â@R~Âe~Âe~ÂÀw~Â~~Â@k~ÂÀ~ÂÀ©~Â@¶~Â@~ÂÀ~—~Â@~—~€Š~Â@„~€Š~ÂÀ~Â@~Â@~Â@~Â@¶~°~°~Â@~Â@~ÂÀ©~Â@¶~ÂÀÛ~ÂÀÛ~Â@è~Â@è~ÂÀô~Â@Â@ÂÂÀ Âû~Â@Â@Â@Â@ÂÀô~ÂÀ € Â-Â@3ÂÀ?ÂÀ?ÂÀ?ÂÀ?ÂÀ?€R€k€kÂ@eÂ_Â_Â@e€k€kÂÀqÂÀqÂ@eÂÀX€kÂ@~‘‘ÂÀ£ªÂÀ£ªÂÀ£Â@°ÂÀ¼€¶ÂÀÕ€ÏÂ@âÂÀîÂÀÕÂÜ€èÂà€Âà€Âà€Â@ €Â €Â €Âà€Â@&€Â #€Â €Â`)€Â #€Â €Â@&€ÂÀ2€Â /€Â /€ÂÀ2€Â /€Â@?€Â <€Âà5€Âà5€Â <€Â€E€Â H€Â€E€Â H€ÂàN€Â H€Â H€Â@?€Â`B€Â€E€Â H€Â U€ÂàN€Â U€ÂÀd€Âàg€ÂÀd€Â n€Âk€Â`t€Â n€ÂÀd€Â n€Â`[€Â U€Â a€Âàg€Â€w€Â n€Â`t€Â ‡€Â “€Â “€ÂÀ–€Âà™€Â “€Â@Š€Â`€Â`€Â€€Âà™€Â@£€Â€©€Â@£€Â  €Â@£€Â`¦€Â€©€Â€©€Â`¦€ÂÀ¯€Â`¦€Âಀ  €Â ¹€Â ¹€Â¶€Â€Â€Â€Â€Â Å€Â€Â€Â Ò€ÂÀÈ€Â`؀ ހ ހÂàä€Â`؀€ۀÂÀÈ€Â@Հ ހÂàä€Â Þ€Âè€Â@î€Âàý€ÂÂ@Â@ Âàý€ÂÀú€Âàý€Âàý€ÂÀú€Â ÷€Âàý€Â ÷€Â Â@ Âà€   ÂàÂàÂ` Â`  Â`# )Â`#Â@  )€& Â`#Âà/ 6 6€?ÂàHÂÀEÂ`<Âà/Â`<€?ÂÀEÂ`UÂ`UÂLÂÀE BÂLÂ`UÂ@RÂ@R BÂÀEÂàH€XÂ`UÂ`U O€X [Â`U [€XÂe€qÂ~€qÂÀw tÂ@k hÂ`n€qÂ`n t tÂàzÂàz t€qÂàz€q hÂàa€qÂàzÂÀwÂàzÂ~ Â@„Âà“Â` Âà¬Â` Âà“Â`‡Â   Â~Â@„€ŠÂÀÂà“Â` Â ¦Â ¦Â@Âà¬Â` Â ¦ÂÀ©Âà¬Â ¦Â€£Âà¬Â@¶Â ³Âà¬Â ¿ÂàÅ ¿ÂàÅÂ`¹Â ¿Â ¿Â€¼Â€¼Â@¶Â ¿Â ¿Â`¹Â ³Â ¿Â Ì ØÂÀÛÂÀÛÂÀÛ€ÕÂàÞÂàÞ€ÕÂâÂ@èÂà÷€î ñÂû þÂ@‚ÂÀôÂà÷ ñ ñÂÀôÂ@èÂâ€î€î€î þÂ`‚Âà÷Âà÷ÂûÂ`‚€‚Â`‚ þ  ‚ ‚€ ‚€ ‚Â`‚ÂÀ&‚Âà)‚ #‚Â`‚€ ‚ ‚€ ‚Â`‚ ‚Â@‚ 0‚Â`6‚ <‚Â`6‚Â@3‚Â@3‚ 0‚Â@3‚€9‚Â`6‚Â`6‚€9‚Â`6‚Â`6‚ <‚€9‚ÂÀ?‚ <‚ÂàB‚ÂàB‚Â`6‚ I‚ I‚ÂàB‚ <‚€9‚ I‚ÂàB‚ÂàB‚ÂàB‚ÂÀX‚Â@e‚€k‚Âàt‚ n‚Â@e‚Â_‚ n‚ n‚Âàt‚€k‚Â`h‚ b‚€k‚Â`h‚ n‚Âx‚Â@~‚Â@~‚ {‚Âx‚ {‚Âx‚Â`‚Â`‚Âx‚Âx‚Â@~‚Â@~‚Â`‚‘‚Âà‚ÂÀŠ‚ÂÀŠ‚Â‘‚Â`š‚  ‚ ­‚Â`³‚Âং€‚Âং ¹‚€¶‚ ¹‚ ­‚Â@°‚ª‚ ­‚ ¹‚Â@°‚ ¹‚€¶‚€¶‚ ¹‚Â`³‚ ­‚Â`³‚ ¹‚ ¹‚€¶‚Âà¿‚Â Æ‚Â`̂ ҂Â`å‚ ߂ ҂ÂÂÂÀ¼‚Â@°‚  ‚ ”‚ ‡‚ {‚Âàt‚ b‚Âà[‚ U‚ÂF‚ÂF‚ <‚Â`6‚Âà)‚€ ‚ ‚Â`‚  ‚  ‚  ‚  ‚ þÂû þÂà÷Âà÷€î€îÂà÷€î€î€îÂâ ØÂÀÛ€ÕÂàÞ ØÂâ åÂàÞ€ÕÂÀ ¿Â€¼Â`¹Â`¹Â ³Â€¼ÂÀ ³Â ³Â€¼Â€¼Â ³Â@¶ÂÉÂàÅÂàÅÂà۰€£Â` Â€£Â—Âà“ÂÀÂà“ šÂ@Â@ šÂ€ŠÂ@„Âàz Â`‡Â`‡Â     €ŠÂ€ŠÂ@„Â@„   Â`‡Âàz tÂàzÂàz t h€qÂ@k [ÂàaÂeÂàaÂe hÂ`n€q€qÂÀwÂ@kÂ@kÂ`nÂàaÂÀ^ OÂàa€XÂ`U OÂÀEÂLÂÀEÂ`U OÂ@RÂàHÂÀE OÂ`UÂÀ^ÂàaÂàa€XÂ`UÂ`UÂ`U€X [ÂÀ^€XÂ`U OÂàH O O€XÂ`U [€X [ [ O OÂàHÂLÂÀEÂ@RÂeÂÀ^ÂÀ^€XÂ`U€XÂÀ^ [€XÂ`UÂ@RÂ`U€XÂ`U€XÂÀ^ÂÀ^ÂÀ^ÂÀ^ÂeÂÀû„ K£Â€s»ÂàÿºÂà(°Â€ê£Â ý˜Âò pˆÂàÂ@&dÂõÿÁÀ¨ÀeAœùAÀ¶5BÔ_BÀ%{BÀâ„B€‡B`ˆ…B`#B‚uB€fB@ÑTB€ÆBBÂ0B€SBÀ¦B€ÛýA€¨àA]ÅA¬A€]•A€AŽZA…6AvAXã@ÄŸ@Ð6@0?H¼¿`jÀ¬¼ÀÜÁ”'Á_MÁsÁ€HŒÁüžÁ€á±Á€oÄÁ€²ÖÁ€‘èÁ€¨ùÁÀ⇠ÂÀ¡Â3 Ân%€C*Â@».ÂÏ2Â@@6Â@`9Â/<Â@>Â@³@ÂÀBÂ@7DÂÀ¡EÂ@óF€>HÂ@dIÂqJÂkKÂ@9LÂÀ MÂÜMÂÀ„NÂ@'OžO€'PÂ@žPÂQÂ@QÂ@ÊQÂ@.RÂŒRÂ@ÝR€.SÂ@ZS†S¸SÂÀãSÂ@"T€ZTÂÀyTÂÀ«TÂÀÝTÂýTÂÀ(UÂ@5UÂ@NUÂÀZUÂÀsU€†U€ŸUÂÀ¾UÂÅUÂÀðUÂV€VÂV€V€VÂ@V€V€VÂ@/VÂ)VÂ@/VÂ@/VÂ@/V€gVÂVÂ@¬VÂØVÂÀêV W€WÂÀWÂÀW WÂÀWÂÀWÂ@BWÂÀgWÂ@BWÂUWÂÀgW‡W‡W€zWÂÀ€WÂ@W€“WÂ@¦W€¬WÂ@¿WÂÀ²WÂÀËW€ÞW€ÞWÂëWÂëWÂÀXÂXÂ@#XÂÀ/XÂ@UXÂÀaX€tXÂÀ“XÂ@¹XÂÌXÂÀÅXÂ@ÒXÂÌXÂ@ëXÂþXÂÀ)YÂ@YÂ0YÂ@6YÂÀBYÂIYÂÀBYÂ@6YÂIYÂ@OYÂ@hYÂ@hYÂ{YÂ@YÂ@Y€ Y€ Y€¹Y€ÒYÂßYÂ@åYÂøY€ZÂ@ZÂÀ#ZÂ@0ZÂÀUZÂuZÂ@”ZÂ@”ZÂÀ¹Z€ÌZ€åZ€þZ [ÂÀ[Â$[ÂÀ[Â@C[Â@\[Â@u[ÂÀ[Â@Ž[Â@§[Â@À[Â@À[ÂÀÌ[Âì[Â\Â@ \Â@ \ÂÀ\ÂÀ\Â7\ÂÀI\ÂP\Â@o\€Ž\€À\Â@º\ÂÀÆ\Âæ\Â@]ÂÀø\Â@]Â@]Â@]Â@7]ÂJ]ÂÀC]ÂÀC]Â@P]ÂÀu]Â@´]Â@Í]Â@Í]Â@Í]ÂÀò]ÂÀ ^Â@ÿ]ÂÀ$^ÂÀ=^ÂÀ=^ÂÀ=^Â@J^€i^Â@|^ÂÀ¡^€Í^Â@à^€ÿ^ _Â@ù^Â@_ÂÀ_Â@+_€1_€J_ÂÀP_ÂÀ‚_Â@v_ÂÀ›_ÂÀ´_ÂÀ´_ÂÔ_ÂÀæ_Â@ `Â@ `ÂÀ`Â@%`Â8`ÂQ`ÂÀc`ÂÀ|`ÂÀ•`ÂÀ•`Â@¢`€¨`Â@¢`Â@»`Â@Ô`Â@í`Â@í`ÂÀù`ÂaÂaÂÀ+a€>aÂÀ]aÂ@jaÂÀvaÂÀvaÂ@ƒaÂ@ƒa¯aÂáaÂ@çaÂÀ bÂ@bÂ@2bÂ@KbÂ^b€ƒbÂÀ¢bÂ@¯bÂÂbÂÀÔbÂ@úbÂ@úbÂ@c€c€cÂ?cÂ@^cÂ@^cÂ@^cÂqcÂ@wcÂÀƒcŠcÂÀœcÂ@©cÂ@Ûc€ácÂ@ôcÂÀdÂÀd€,dÂÀKd€EdÂRd€^dÂ@qd„dÂd€ÂdÂ@¼dÂÀÈdÂ@¼dÂÀÈdÂ@ÕdÂ@îdÂÀúdÂÀe€&e€&eÂÀ,eÂÀEeÂeeÂÀweÂÀeÂ@eÂÀ©eÂ@¶eÂÀÛeÂ@èeÂûeÂ@fÂÀ&fÂ@LfÂ_fÂ@ef€kfÂÀqfÂ@—fÂÀ£fÂÀ¼fÂ@ÉfÂ@âf€gÂ@gÂÀgÂõfÂÀg€3gÂ@-gÂÀRg€egÂ@xgÂ@xg¤g½gÂ@ÃgÂÀègÂ@õgÂ!hÂ@@hÂ@@h€FhÂ@@hÂ@rh€‘hÂÀ—hÂ@‹hÂÀ—h·hÂ@ÖhÂéhÂÀûhÂ@iÂ@iÂiÂÀ-i€YiÂfiÂÀxiÂiÂ@…i€riÂ@…iÂiÂÀ‘iÂÀ‘i€½iÂ@éiÂ@éiÂãi€ïiÂÀõiÂÀõiÂÀõiÂÀjÂ@jÂÀ'j€:jÂ@fj€…jÂ@˜jÂ@±j€·jÂÀ½jÂ@ãjÂ@üjÂ@üjÂ@üjÂk€kÂ@GkÂAkÂAkÂÀ:kÂ@GkÂ@`k€kÂ@«kÂÀ·kÂ@Ýk l lÂÀlÂ"l€GlÂ@AlÂÀMlÂ@(lÂ@(l€GlÂ@AlÂÀfl€yl€ylÂÀ˜lŸl¸lÂ@¾lÂêlÂ@ðlÂÀülÂÀülÂ@ mÂm€AmÂ@TmÂgmÂNmÂÀym™m™m€¥mÂÀ«mÂÀ«m€¥m²mÂËmÂÀÝmÂ@êm€ nÂÀömÂ@nÂ@nÂÀ(nÂ/nÂ@5nÂ@NnÂan€mnÂ@gn€mnÂÀsnÂÀsnÂ@€n“n¬nÂ@ËnÂÅnÂ@²nÂÅn€ÑnÂÀ×n€ênÂÀ×nÂÀ×nÂÀ×n€ÑnÂÀ×nÂÅnÂÅn€ÑnÂÀðnÂÀ×nÂÀ×nÂ@än€ÑnÂÞnÂÞnÂ÷nÂÀ oÂÀ oÂ@oÂÀ"oÂ)o€5oÂÀ;o€NoÂ@HoÂÀToÂBoÂ)oÂ@HoÂÀToÂ@aoÂo€€oÂ@“o€™oÂÀŸoÂ@¬oÂÀŸoÂo¦oÂÀŸoÂÀ¸o¿oÂÀÑoÂ@÷oÂ@÷oÂ@÷oÂño p pÂÀpÂÀpÂÀpÂ@pÂÀp€/pÂyÂÀJyÂ@WyÂÀcyÂ@pyÂÀcyÂQy€]y€vyÂ@pyÂ@py€vyÂ@pyƒyÂ@¢yµyÂÀÇyµyÂÀ®yÂ@»yÂ@ÔyÂÀùyÂ@zÂ@íyÂ@íy€óyÂÀzÂ@zÂ2zÂKzÂÀDz€WzÂÀ]z€WzÂ@jzÂdzÂ@jz€‰z€‰zÂ@ƒzÂ@ƒz–zÂ@µz€»zÂ@ÎzÂáz€íz€ÔzÂÀÁzÂÈzÂÀÚz€ÔzÂázÂÀózÂ@{ÂÀ {ÂÀ%{€8{Â@2{Â@K{ÂÀW{€j{ÂÀp{Â@d{ÂÀ‰{Â{Â@}{ÂÀ‰{ÂÀ¢{Â{Â@–{Â@¯{€µ{€µ{Â@È{ÂÀ»{€µ{ÂÀ»{ÂÀ»{Â@È{ÂÀ»{Â@È{Â@á{€ç{Â@ú{€|ÂÀ|ÂÀ|Â@,|Â@E|€K|ÂÀQ|ÂÀQ|ÂX|€d|Â@^|€d|Âq|ÂÀƒ|€}|€–|Â@|Â@©|ÂÀœ|€¯|Â@Â|ÂÀÎ|ÂÀÎ|Â@Û|ÂÀç|ÂÀ}Â}€}Â@ }ÂÀ}ÂÀ}€} } }ÂÀ2}€E}€^}Â@q}ÂÀ}}Â@Š}Â@Š}ÂÀ}}Â@Š}ÂÀ–}Â@Š}Â}€}Â@£}¶}Â@¼}ÂÀá}ÂÏ}ÂÏ}ÂÏ}ÂÀá}Âè}Â~Â@~Â@~Â~Â~ÂÀ~Â@ ~€?~Â@9~ÂÀ,~€?~€X~Â@k~Â@R~ÂÀ^~Â@k~ÂÀw~Â@„~Â~~€Š~Â~~Â@„~Â@„~€Š~—~€£~Â@Ï~ÂÀÛ~Â@è~Âû~Âû~ÂÀ ÂÀ&Â@€ ÂÀ&€ Â@3Â@3Â@LÂFÂ@LÂ@eÂÀqÂ@~ÂxÂÀqÂ@eÂxªÂÀ£Â@°€¶€Ï€¶ÂÀ¼ÂÃÂÜÂÜÂÜÂÀîÂ@ûÂ@ûÂ@ûÂà€Â €Â`€Â`€ÂÀ€Â`)€Â #€Â`)€Â`)€Â€,€Â`)€Â /€Â <€Â`B€Â€E€ÂàN€Â U€ÂàN€ÂR€ÂR€ÂR€Â a€Âàg€Âk€ÂÀ}€Â z€Âà€€Â€w€Âà€€Â€€Â “€Â “€Âà™€Â  €Âà™€Â€©€Â`¦€Â€©€Â ¬€Âಀ ¬€Â@¼€Â@¼€Â Å€ÂàË€Âπ€€€€Â`¿€ÂàË€Âàˀ ҀÂ`؀€ۀ ë€Â ë€Âè€Â`ñ€Â ë€Â`ñ€Âàý€Â`  Â@ Âà €& )Â`#€&Â`# )Âà/Âà/€&€& ) 6Âà/€?ÂÀE [ [ÂÀ^ [€X [ h€qÂÀwÂ~Â@„Â`‡Â`‡Â`‡Â`‡Â`‡Â Âà“Â` Â ¦Â ¦Â` Â ¦Â€£Â ¦Â°Â ³Âà¬Â`¹Â ¿ÂàÅÂàÅÂ@Ï ÌÂàÅ ¿Â ¿Â ÌÂ`Ò ØÂ å€î ñ ñ€îÂÀôÂ@‚€‚Â@‚Âà‚  ‚ þ‚€ ‚ #‚ #‚Âà)‚ #‚ #‚ ‚Â`‚ 0‚Â@3‚ÂÀ&‚ 0‚Â@3‚Â`6‚ÂàB‚ <‚ÂàB‚ÂàB‚Â@L‚ U‚ U‚ÂÀX‚Â@e‚Â`h‚Âx‚ {‚Âàt‚ n‚€k‚Âx‚Â@~‚€„‚Âàt‚Â`‚Â@~‚ ‡‚ ‡‚ ”‚Âà‚‘‚ ”‚€‚Âং  ‚Â`š‚  ‚  ‚ª‚ ­‚Â@°‚Âং ¹‚Â`³‚ ¹‚ÂÀ¼‚ ƂÂ࿂€ςÂ`Ì‚ÂÀÕ‚ÂÀՂ ߂ ߂ÂàØ‚Â@â‚ ߂Â`å‚Âàñ‚Âàñ‚Âàñ‚Â`þ‚Âàñ‚Âàñ‚Âàñ‚€è‚Âàñ‚Â@û‚ ƒÂà ƒÂ ƒÂ`ƒÂ€ƒÂ ƒÂà#ƒÂ 6ƒÂ@-ƒÂ`0ƒÂ 6ƒÂ 6ƒÂ`0ƒÂ *ƒÂ`0ƒÂ *ƒÂ *ƒÂÀ9ƒÂà<ƒÂ CƒÂ€LƒÂ`IƒÂ€LƒÂ€LƒÂ OƒÂ \ƒÂàUƒÂ OƒÂàUƒÂÀkƒÂ@xƒÂ uƒÂ hƒÂ hƒÂànƒÂÀkƒÂ€~ƒÂà‡ƒÂ‹ƒÂà‡ƒÂà‡ƒÂÀ„ƒÂà‡ƒÂ ŽƒÂ`”ƒÂ€—ƒÂà‡ƒÂ€—ƒÂ §ƒÂࠃ §ƒÂ §ƒÂ@ªƒÂ §ƒÂà ƒÂࠃ¤ƒÂà ƒÂ`­ƒÂ ³ƒÂ€°ƒÂ½ƒÂ½ƒÂàÒƒÂ@܃ ك كÂàÒƒÂÀσ ̃ كÂ@܃ åƒÂàëƒÂÀèƒÂ@܃€âƒÂÀèƒÂ åƒÂàëƒÂàëƒÂàëƒÂ òƒÂïƒÂïƒÂ þƒÂ@õƒÂ þƒÂÀ„€ûƒÂà„Â`„„ „Âà„Âà„Â`„ÂÀ„€„€„Â!„Â@'„Â`*„ $„Â`*„Â@'„ 0„€-„Â`*„ $„Â`*„ =„ =„ =„ 0„Â`C„Â`C„Â`C„Â:„ =„ =„Â@@„Â@@„Â`C„€_„ÂÀe„€_„ÂÀe„€_„Âàh„ b„Â@r„€x„Â`u„Â`u„Â`u„ o„Â@r„€x„Â@r„Â@r„€x„Âà„ ”„Â`Ž„Â`Ž„Â ”„ ¡„Âàš„Âàš„Âž„Â`§„ ¡„€ª„ ¡„Â`§„ÂೄÂೄ ¡„Â`§„ÂೄÂ`À„Â`À„Â@½„Â`À„Â`À„Â@½„Â@½„Â`À„ÂàÌ„Â@½„Â`À„ Ƅ ӄÂ`Ù„Â@Ö„Â`ل€܄ ߄Âé„Â`ل ߄Âàå„ ì„Â`ò„ ø„ ì„Âé„ ø„Âàþ„Âàþ„Â…Âàþ„Â…€…€…Âà…Âà… … …€'… …Â…Â…ÂÀ…ÂÀ…Â…Â`$… *… *…Âà0… 7… C…ÂàI…Â`V… P… C…Â@:… 7…Âà0…Â4… 7… C…ÂàI…Â`V…€Y…Â`V… \…Âf… i… i… i…Â@l…Âf…Â`o… u…Â`o…ÂÀ_… i… i…Â`o… u…Â…Â…ÂÀx… u…ÂÀx…ÂÀx…Âà{…Â… ‚…Â@……Â…Â`ˆ…Â Ž…Â Ž…Â`ˆ…€‹…Â Ž…ÂÀ‘…ÂÀ‘…ÂÀ‘…ÂÀ‘…Â@ž…Â`¡…±…Âà­…Â ´… À… À…Â@·… ´…±…Â`º…Â@·…Â`º… À…ÂàÆ…Â À…Â@·…ÂàÆ…Â`º…Â`º…Â`º…Âʅ€օ مÂàß…Â æ…Âà߅€ï… æ…Âàß…Âã…ÂÀ܅ م مÂÀÜ…Âàß…Âàß…Â@é…Â`ì… æ… æ…Â`ì… ò… ò…€†ÂÀ†Â@†Â@†Â ÿ… ÿ…Â@†Â  †Âà†Â@†Â  †Â  †Âà†Âà†Âà†Â $†Â †Â€!†Â $†Â.†Âà*†Â@4†Â`7†Â@4†Â@4†Â 1†Â`7†Â`7†Â 1†Â 1†Â`7†ÂÀ@†Â =†Â`7†Â€:†Â€:†Â $†Â€!†Âà†ÂÀ†Â†Âà†Â†Â †Â@†Â†Â  †Â€†Â@†Â`†Â@†Â@†ÂÀ†Â€†Â€†Â€†Â`†Â ÿ… ÿ… ÿ…Â@†ÂÀ†Âà†Â@†Âà†ÂÀ†Â  †Â†Â€†Â€†Â€†Â€†Â@†Â  †Â€†ÂÀ†Â`†Âü…Â@†Â@†Â ÿ…Â`†Â  †Â  †Â  †Â@†Â@†Â€†Â  †Â€†Â€†Â€†Â€†Â  †Âà†Âà†ÂÀ†Âà†Â†Â †Â€!†Â@†Â@†Âà†ÂÀ†Â †Â`†ÂÀ'†Â€!†Â †Âà*†Â 1†Â.†Â $†Â`†Â`†ÂÀ'†Â@†Â`†Â †Â †Â`†Â †Â †Â †Â†Â $†Âà*†Â 1†Â€:†Â@4†Â`7†Â`7†Â@4†Â`7†Â 1†Â`7†Â@4†Â`7†Â 1†Â`7†ÂÀ@†Â =†Â =†ÂàC†Â =†Â.†Â@4†Â@4†Âà*†Â 1†Â€:†ÂG†Â J†ÂG†Â€:†Â`7†ÂàC†ÂG†ÂG†ÂàC†Â`P†Â c†ÂÀY†Â V†Â V†Â@M†Â J†Â€S†Â V†Â€S†Âà\†ÂÀY†Â@f†Â`†Âà\†Âà\†Â`†Â V†Âà\†Âà\†Âà\†Â V†Â V†ÂÀY†Â`P†Â`†Â V†ÂÀY†Âà\†Â c†Â`i†Â€l†Âàu†Âàu†Â@†Â`‚†Â`‚†Â |†Â |†Â€…†Â ˆ†ÂÀ‹†ÂÀ‹†ÂàŽ†Â •†Â€ž†Â€ž†Â@˜†Â€ž†Â`›†Â€ž†Â ¡†Â •†ÂàŽ†Â@˜†Â€ž†Â`›†Â৆«†Â ®†Â«†Â«†Â ®†Â৆ÂÀ¤†Â ¡†Â`´†Â@±†ÂÀ¤†Â ®†Â€·†Â dž dž džÂ@ʆÂÀ½†ÂÀ½†Â€·†Â ®†Â ®†ÂÀ½†Â€·†ÂàÀ†Â€Ð†Âàن à†Â`æ†Â€é†Â@ã†Â`æ†Â ì†ÂÀï†Âö†ÂÀï†Âàò†Âàò†ÂÀï†Â ù†Â@ü†Âö†Â@ü†Âö†Âö†Âàò†Â`ÿ†Â€‡Âà ‡Âà ‡Â ‡Â‡ÂÀ‡Â ‡Â€‡Âà ‡Â€‡Â€‡Â ‡Â ‡Âà ‡Âà ‡Â`‡Â ‡Â +‡Â€4‡ÂÀ:‡Â 7‡Â€4‡Â +‡Â€‡ÂÀ!‡Â +‡Â(‡ÂÀ!‡Â ‡Âà$‡Â`1‡Â€4‡Â€4‡Â D‡Â D‡ÂA‡Â D‡Â D‡Â P‡Â`J‡Â P‡Â P‡Â D‡ÂA‡Â D‡Â`J‡ÂZ‡ÂàV‡ÂàV‡Â P‡Â`J‡Â P‡Â ]‡Â`c‡Â i‡Â`c‡Âào‡Â v‡Â`|‡Â v‡Â v‡Âs‡Â`|‡Â€‡ÂÀ…‡Âàˆ‡Â`|‡Â ‚‡Â€‡Â ‚‡Â`|‡Â ‚‡Â ‚‡Â`|‡Â@y‡Â`|‡ÂŒ‡ÂŒ‡Â`•‡Â ‡Â ‡Â`•‡Â ‡Â ›‡Â ›‡ÂÀž‡Â`•‡Â`•‡Âàˆ‡Â ‚‡Âàˆ‡ÂÀž‡ÂÀž‡ÂÀž‡ÂࡇÂࡇÂÀž‡Â€˜‡Â ›‡Â ¨‡Â ¨‡Â€±‡Â€±‡Â ´‡Â ´‡Â`®‡Â@«‡Â`®‡Â¥‡ÂࡇÂ`®‡Â ¨‡Â¥‡ÂÀž‡Â ¨‡Â€±‡Â€±‡Â ´‡Â@ć Á‡Â Á‡Â`LJÂ@ćÂÀ·‡Â`LJ€ʇ ͇€ʇ¾‡Â¾‡Â Á‡Â`LJ Á‡Â Á‡Â ڇ ڇ ڇÂàÓ‡Â@݇Â`à‡Âàì‡Â æ‡Âàì‡Â ó‡Â`à‡Â€ã‡Â æ‡Â€ã‡Â€ã‡Âð‡Â€ã‡Â€ã‡Âàì‡Âð‡Â ó‡Â æ‡Âð‡Â@ö‡ÂàˆÂàˆÂàˆÂ ˆÂ ˆÂàˆÂ ˆÂàˆÂàˆÂÀˆÂÀˆÂ"ˆÂ"ˆÂÀˆÂ€ˆÂ ˆÂ€.ˆÂ 1ˆÂ@(ˆÂ@(ˆÂàˆÂàˆÂàˆÂ 1ˆÂ`+ˆÂ€.ˆÂ€.ˆÂÀ4ˆÂà7ˆÂÀê‹Â`¤ªÂ ½Â ÂÂàþ¶Âà—ªÂ ¡ŸÂ`Ÿ–ÂàXÂN‰Â€ù-€µÁÄÁ„@“ŠAÀ!BÀz?B€_hB@î€B€4‡BàiˆBã…B€BsB@¯bB@éPB€¬>Bv,B€ÕB@5 B7õAšØA<¾A€[¦AìAçyA/UA 2A\AÆÙ@œ•@( @¯>Èá¿zÀòÁÀ½Áå&ÁôIÁËmÁ‰Á€k›Á¢­Á€¦¿Á€lÑÁ€ÎâÁ€þóÁF€ð ÂÀ0ÂÀÔÂÀû€†#ÂÀn(Â@à,Âô0‘4Â@·7€y:Â÷<ÂÀý>Â@Ì@ˆBÂ@ìC€7EÂ@vFƒGÂ@œHÂIÂqJ€EKÂÀúK°LÂÀqMÂNÂ@‘NÂÀOÂlO·OÂ@!P€¤PÂQÂÀrQ€ÐQÂ@üQÂÀ!R€fRÂÀ·RÂÀSÂ@ASÂmSÂ@¥SÂÑSÂTÂÀ.TÂÀyTÂ@ŸTÂËTÂäTÂýT€ UÂUÂ@5UÂÀZU€mU€†UÂ@²UÂ@²UÂ@²UÂÞUÂ@VÂÀ;VÂ[VÂÀmV€€VÂ@“V€™V€ËV€ËVÂ@ÞV€ËVÂ@ÞVÂ@ÞVÂñVÂÀWÂ@W€/WÂ@)WÂÀ5W€/WÂ@[WÂ@tWÂÀgWÂ@tW€“WÂ@¦WÂ@¿WÂ@¿WÂ@¿WÂÀËWÂ@ØWÂÀXÂ@ XÂXÂ@#XÂ@UXÂ@nXÂÀzX€XÂÀ“XÂÀ¬X€¿XÂ@¹XÂÀÞXÂ@YÂ@YÂ@YÂ0YÂIYÂÀ[YÂ@hYÂ@hYÂ@YÂ@YÂÀYÂÀYÂÀ¦YÂ@³YÂÀ¿Y€ÒYÂÆYÂÀØYÂÀñYÂ@ZÂ@ZÂ@0ZÂÀUZÂÀnZÂÀ‡Z€šZÂ@­Z§ZÂÀ ZÂÀZÂòZÂ@øZÂ@*[Â@C[€b[ÂÀh[ÂÀ[ÂÀ[Â@§[ÂÀš[Â@§[Â@Ù[Â\Â\Â@$\Â7\€C\€C\ÂP\€\\ÂÀ”\ÂÀ­\ÂÍ\Âæ\€ò\Âÿ\Â]Â@]ÂÀC]Â@i]€o]ÂÀŽ]ÂÀ§]ÂÀÀ]€º]ÂÀÙ]Â@ÿ]ÂÀ ^Â+^ÂD^ÂÀV^€i^Âv^ÂÀˆ^Â@•^¨^€Í^ÂÀì^ÂÀ_ÂÀ_ÂÀ_Â@+_€_Â@+_Â@]_Â@v_Â@_€•_Â@Á_Â@Á_ÂÀÍ_Â@ó_Â`ÂÀ1`ÂÀ1`ÂÀJ`Â@W`ÂÀ|`€`ÂÀ•`Â@¢`ÂÀÇ`€Ú`Â@Ô`ÂaÂÀaÂÀ+aÂ@8aÂÀDaÂÀ]aÂ}aÂ@œaÂ@µaÂ@ÎaÂ@Îa€ÔaÂ@çaÂ@bÂEbÂ^bÂ@db€ƒb€œbÂ@¯b€µbÂÀÔbÂÀíb€cÂ@úb c€2cÂ@EcÂ@EcÂ@wcÂ@wcÂ@ÂcÂ@ÂcÂ@ôcÂÀd€,d€,dÂ@Xd€^dÂ@qdÂ@qdÂÀddÂÀdd€d¶dÂÏdÂe€&e€?eÂ3eÂLe€XeÂ@ReÂeeÂ@„eÂ@¶eÂÀÛeÂÀôeÂÀ fÂ@3fÂÀ?fÂ@LfÂ@efÂÀŠfÂ@—fÂÀ£fÂÀ¼fÂÜf€g€g€gÂ@-gÂ@gÂ@_gÂÀkgÂ@‘g¤g€—g€—gÂ@ÃgÂÀÏgÂÀègÂÀhÂÀhÂ@h€-h€FhÂÀ~hÂ@¤h·h€ÃhÂÀÉhÂÀâhÂÀûhÂÀi€'iÂ@!iÂÀFi€riÂiÂ@žiÂÀªiÂ@·iÂÀÃiÂãiÂÀõiÂ@j€!jÂ@4jÂÀ@jÂ@MjÂ@fj€…jÂÀ‹jÂÀ½j€ÐjÂ@ãjÂÀïjÂÀkÂÀkÂÀ!kÂZkÂskÂskÂ@’k€±kÂ@ÄkÂÀÐkÂ@ÝkÂðkÂ@ökÂ@ökÂÀlÂ"l lÂ@(l€.lÂ@AlÂÀMl€`lÂ@Œl€«lÂÀÊlÂ@×lÂêlÂÀmÂ5m€Am€AmÂ@TmÂÀymÂÀymÂ@mm€mÂ@Ÿm€×mÂÀÝmÂäm€ðmÂ@nÂ@nÂ@nÂÀ(nÂ@NnÂ@gn“n€Ÿn€¸nÂÀ¾n€¸nÂÀ¾nÂÀ×nÂ@ýn€oÂoÂ@oÂÀ;o€No€go€€o¦oÂÀ¸oÂ@¬o€ËoÂØo€äoÂ@p p€p€pÂ@)pÂÀ5pÂÀgpÂ@tpÂÀ™pÂ@¿p€ÅpÂÀËp€ÞpÂëp€÷pÂ@ñp€÷pÂÀqÂÀq€)q€BqÂ@Uq€tqÂÀ“qšqÂ@¹q³q³qÂÌqÂ@ëqÂ@ëqÂ@r€#rÂ@6rÂ@OrÂ@hr€‡rÂÀrÂ@šrÂÀ¦r”r”r€¹rÂ@ÌrÂÀØrÂ@þrÂørÂsÂ@0sÂ*sÂ@0sÂ@Is€OsÂÀUsÂ@bsÂus€šsÂÀÒsÂÀÒsÂÙs€åsÂòsÂ@øsÂÀësÂÀtÂÀtÂ@\t€{tÂÀtÂÀšt€­tÂ@§t€­tÂ@ÀtÂ@òtÂuÂuÂuÂÀ0uÂ@=uÂÀIuÂÀ0uÂPuÂ@VuÂ@VuÂ@ou‚u›u€ÀuÂÀßuÂ@ìuÂ@ìu€òuÂÀvÂ@vÂ@vÂ@7vÂ@PvÂ@PvÂ@ivÂ@‚v€ˆvÂ@›vÂÀ§v€ºv€ÓvÂ@ævÂ@ÿv€wÂ@1wÂ@1w€7wÂ@JwÂ]wÂ@cwÂ@cwÂ]wÂ@cwÂÀˆwÂÁwÂÀÓwÂÀìw€æw€ÿw€1xÂ@Dx€JxÂ@]xÂÀPxÂ@]xÂpx€cxÂpxÂ@x¢xÂ@ÁxÂÀÍxÂÀÍxÂíxÂÀæxÂ@ yÂyÂ@>yÂÀJyÂ@WyÂÀcyÂ@pyÂ@pyÂÀ|yƒyÂ@‰yµy€ÚyÂ@Ôy€Úy€ÚyÂÀày€óyÂÀùyÂÀùyÂÀzÂÀ+zÂ@8zÂÀ]zÂ@jzÂ}zÂÀz€¢zÂÀÁz€»zÂ@µzÂ@Îz€ÔzÂázÂáz€íz€{Â@{ÂÀ%{Â,{€Q{Â@d{ÂÀW{Â@d{Â@}{Â@}{Â@–{©{ÂÀ»{ÂÀ»{Â@È{Â@á{Â@á{ÂÀí{Â@ú{ÂÀ|ÂÀ|Â@,|Â@,|ÂÀQ|ÂÀQ|Â@E|Â@^|Âq|Â@w|Â@|£|£|Â@©|ÂÀµ|€¯|Â@Â|ÂÀÎ|ÂÕ|€á|Â@ô|ÂÀ}ÂÀ}ÂÀK}ÂR}ÂÀd}Â@q}Â@q}Â@q}ÂÀ}}Â@q}ÂÀ–}Â@£}ÂÀÈ}Â@¼}ÂÏ}Âè}ÂÀá}ÂÀú}Â@~Â@9~ÂÀE~ÂÀ^~Âe~ÂÀw~€q~ÂÀw~Â@„~Â@~ÂÀ~ÂÀ©~°~ÂÀ©~ÂÀÂ~Â@è~Âû~€Â@ÂÂ@3Â@3Â-Â-ÂÀ&Â@3Â@3€RÂxÂ@~ÂÀŠ‘Â@°Â@°ÂÀ£ÂÀ£Â@°Â@É€¶€¶Â@ÉÂÃÂÀÕÂÀîÂ@ûÂ`€Â €ÂÀ€Âà€Â #€Â@&€Â@&€Â /€Â@&€Â /€Âà5€Â <€ÂÀ2€Â /€Âà5€Â9€Â <€Âà5€ÂÀ2€ÂÀ2€Âà5€Âà5€Â9€Âà5€Â /€Â@?€Â`B€Âà5€Â /€Â /€Â #€Â €Â`)€Âà5€Â H€ÂàN€Â@X€Â@X€Â U€Â`[€Â a€Âàg€Âk€Â@q€Âk€Âk€ÂÀd€Â`t€Â z€ÂÀ}€Â z€Â@q€Â`t€Â`t€Â€w€Âà€€Â z€Âà€€Â„€Â ‡€Â ‡€Â@Š€Â`€Â€€Âà™€Â€©€Â`¦€Â ¬€Â¶€Â Å€ÂàË€ÂÀÈ€ÂÀȀ ŀÂ@Õ€Â`؀ ހÂ@Õ€Âπ ހÂ`Ø€ÂÀá€ÂÀá€Â Þ€Â Ò€ÂÀá€Â€ô€Â ÷€Â€ô€Â€ô€Âàý€Â Â@€ ÂÀÂ@    Â`#Â`#Âà/ 6Â`<Â`< B BÂÀE OÂÀ^Âàa hÂàaÂÀ^Âàa hÂÀ^Âe hÂeÂ`nÂ`nÂ~Â@„Â~  šÂ€£Â` Â šÂ——€£ÂÀ©Âà¬Â°Â`¹ÂàÅ€ÕÂ`Ò ÌÂ`ÒÂ`Ò€ÕÂÉ Ì ØÂàÞÂàÞ€î ñ ñÂû  ‚  ‚Âà)‚ #‚€ ‚Â`‚ ‚€ ‚ 0‚Â`6‚Â-‚Â-‚ #‚Âà)‚Â-‚€9‚ <‚ÂÀ?‚€R‚Âà[‚Âà[‚ b‚ b‚Â`h‚Â`h‚€k‚ÂÀq‚ {‚ ‡‚Â`‚Âà‚ ”‚Âà‚Âà‚ ‡‚Â`‚ ‡‚ ”‚Â`š‚ª‚ ­‚Âং ­‚Â`³‚Â`³‚Â࿂ ҂€ς ҂ÂàØ‚Â@â‚Â@â‚ ߂Â`å‚Âàñ‚ ë‚Âõ‚Âõ‚ ø‚€ƒÂ`þ‚Â`þ‚€ƒÂ ƒÂ ƒÂ€ƒÂ ƒÂ'ƒÂ'ƒÂ *ƒÂ€3ƒÂ 6ƒÂ 6ƒÂà<ƒÂ@FƒÂ@ƒÂ@ƒÂ`IƒÂ@ƒÂ OƒÂàUƒÂ@_ƒÂ hƒÂànƒÂànƒÂànƒÂ€eƒÂ hƒÂ uƒÂ@xƒÂ€~ƒÂ€~ƒÂ@‘ƒÂ šƒÂ`”ƒÂ šƒÂ šƒÂࠃ §ƒÂÀ¶ƒÂ€°ƒÂ ³ƒÂ ÀƒÂ ÀƒÂ@ýƒÂ`ƃÂ@àÀƒÂ½ƒÂ½ƒÂ@ÀɃÂÀσÂÖƒÂ@܃ÂÀèƒÂ åƒÂ@õƒÂàëƒÂïƒÂ`øƒÂ þƒÂ „€„€„ „Âà„ $„ 0„ÂÀ3„ =„Â@@„€F„Â@@„ I„Â`C„€F„ I„ÂS„€_„ÂÀe„Âàh„Â@r„Â@r„ o„ o„Â`u„Âàh„ o„ {„Â…„Â`Ž„Â`Ž„Â`Ž„Âàš„Â`Ž„ÂÀ—„Âàš„Â`§„ ­„Âೄ º„Â`À„ÂÀɄ ӄÂЄÂ@ք Ƅ º„ÂÀ°„·„ۀÂЄ ߄ ߄ ߄ ø„Â`ò„ ø„ ì„Â`ò„Âàþ„€… … …Â` …Â` … …Âà…Âà… …Â…Â@!…Â`$…Â@!…Â`$… *…Â4… C… C…ÂàI…ÂàI…ÂM…Â`V… \…ÂÀ_… i… i… i… i… u…Â`o… u…Â… ‚…Âà{…ÂÀx… ‚…Â@……Â Ž…Âà”…Â@ž…€¤…Âà­…Âà­…Â@·…Â`º…Â@·…Â୅ §…Âà­…Âà­…Âà­…Â୅€½…Â@Ѕ م مÂàß…Âà߅€ï…Â`ì… æ…Â`ì… م æ… æ…Â`ì…ÂÀõ…Â@†Âà†Â€†Â`†Âà†Â`†Â $†Â $†Âà*†Â.†Âà*†ÂÀ'†Â 1†ÂÀ@†Â J†ÂG†Â J†Â€S†Â`P†Â c†Â`P†Â@M†Â€S†Â J†Â€S†Â`P†Â@M†Â€S†Âà\†Â`†Â@f†Â`i†Â€l†ÂÀr†Â€…†Â ˆ†Â ˆ†Â`‚†Â ˆ†ÂàŽ†ÂàŽ†Â’†ÂÀ‹†ÂàŽ†Â’†Â •†Â •†Â •†Â@˜†Â`›†Â৆Â৆Â`´†Â º†ÂÀ½†ÂàÀ†Â º†Â džÂƀІ€ІÂàÙ†ÂàÙ†Â݆ÂÀï†Â`æ†Â ì†Â€é†ÂàÙ†ÂàÙ†ÂàÙ†Â`æ†Â à†Â`æ†Âàò†Â€é†Âàò†Âàò†Âàò†Â ù†Â`ÿ†Â ‡Â@ü†Â€‡Â€‡Â ‡ÂÀ!‡Â€4‡Â`1‡ÂÀ:‡Â€4‡Â@.‡Â€4‡Âà$‡Â`1‡ÂÀ:‡Âà=‡Â 7‡Â@G‡ÂZ‡ÂÀS‡ÂÀS‡Â€M‡Â€M‡Â D‡Â P‡Â€M‡Â€M‡Â P‡ÂàV‡ÂàV‡ÂZ‡Âào‡Â i‡Â i‡Â i‡Â`c‡Â@`‡ÂÀl‡Â v‡Â`|‡Â v‡Â@y‡Â€‡Âàˆ‡Â ‡Â ›‡Â ‡Âàˆ‡ÂÀ…‡Â ‡Â ‡Â ‡ÂÀž‡ÂÀž‡Â ¨‡Â ›‡Â€˜‡Â`•‡ÂࡇÂ`®‡Â ¨‡Â¥‡Â@«‡Â ´‡ÂÀ·‡Â ´‡Â@«‡Â@«‡Â@«‡Â@«‡Â ´‡Â Á‡ÂÀЇ ͇ Á‡Â Á‡Â`LJÂÀЇÂàӇ ڇ ڇ€ã‡Â€ã‡Â€ã‡Âàì‡Âàì‡ÂÀé‡Âàì‡Âàì‡Â ó‡Â`ù‡ÂÀˆÂ@ˆÂÀˆÂð‡Â ó‡Â€ü‡Â ÿ‡ÂÀˆÂ ˆÂ ˆÂàˆÂ@ˆÂ`ˆÂ ˆÂ ˆÂ ˆÂàˆÂàˆÂ@(ˆÂ %ˆÂ€.ˆÂà7ˆÂ`+ˆÂ€.ˆÂàˆÂàˆÂàˆÂ€.ˆÂ€.ˆÂ`+ˆÂÀ4ˆÂà7ˆÂ€.ˆÂ@(ˆÂ;ˆÂà7ˆÂ >ˆÂ@AˆÂ@AˆÂ€GˆÂ JˆÂ`DˆÂ€GˆÂ`DˆÂ JˆÂÀMˆÂÀMˆÂ JˆÂÀMˆÂ@ZˆÂ cˆÂ pˆÂmˆÂ |ˆÂà‚ˆÂ€yˆÂà‚ˆÂ |ˆÂ`vˆÂ pˆÂ pˆÂ`vˆÂ |ˆÂ pˆÂ pˆÂ`vˆÂÀˆÂ |ˆÂ€yˆÂ |ˆÂà‚ˆÂ†ˆÂ`ˆÂ†ˆÂ€yˆÂà‚ˆÂ ‰ˆÂ@ŒˆÂ€’ˆÂ ¢ˆÂà›ˆÂŸˆÂ ¢ˆÂà›ˆÂ@¥ˆÂ ¢ˆÂ€«ˆÂ ¢ˆÂ ¢ˆÂഈ »ˆÂ@¾ˆÂ¸ˆÂà´ˆÂഈ¸ˆÂ@¾ˆÂà´ˆÂഈ Lj LjÂ@׈Âà͈Âà͈Âà͈€݈Â@׈€݈€݈ àˆÂÀãˆÂêˆÂ íˆÂ íˆÂ íˆÂàÿˆÂ‰Â ‰ÂàÿˆÂ€öˆÂ@ðˆÂ€öˆÂ ‰Â ‰ÂàÿˆÂÀüˆÂ` ‰Â€‰Â ‰Âà‰Â€‰Â@ ‰Â ‰ÂÀ‰Â‰Â‰Â ‰ÂÀ‰Â ‰Â@"‰Â€(‰Â`%‰Â +‰Â`%‰Â`%‰Âà‰Â€(‰Âà1‰ÂÀ.‰Â +‰Â5‰Â5‰Âà1‰Â +‰Â€(‰Â€(‰Â`%‰Â`%‰Â +‰Â 8‰Âà1‰Â@;‰Â D‰Â Q‰Â`W‰Â Q‰Â ]‰Â€Z‰Âàc‰Â ]‰Â`W‰Â@T‰Â€Z‰ÂÀ`‰Âg‰Âàc‰Â v‰Â`p‰Âàc‰Â`p‰ÂÀy‰Â€s‰Â`p‰Â€s‰Â`p‰Â v‰ÂÀy‰Â v‰Â v‰Â€‰Â ƒ‰Â€Œ‰Â ‰Â™‰Â œ‰Âà•‰Â œ‰Âà•‰Âà•‰Â`¢‰Â`¢‰Âà•‰ÂÀ’‰Â`¢‰ÂÀ«‰ÂஉÂÀ«‰Â ¨‰Â²‰Â²‰Â²‰Â²‰Â µ‰Â µ‰Â@¸‰Â`»‰Â`»‰Â@¸‰Â µ‰Â€¾‰Â`»‰Â€¾‰Âàlj ډ ډÂ`Ô‰ÂàljÂÀ݉Âä‰Â ç‰Âä‰Âä‰Âàà‰Âàà‰Âä‰Â€×‰Âàà‰Â@ê‰Â ç‰Âàà‰Â`í‰Â ó‰Â`í‰Â ç‰Âä‰Â@ê‰Â ç‰Â ç‰Â`í‰ÂÀö‰Â`ŠÂ  ŠÂ  ŠÂ ŠÂ ŠÂ ŠÂàù‰ÂÀö‰Âý‰Âàù‰Â€ ŠÂ  ŠÂ€ ŠÂ  ŠÂ  ŠÂ  ŠÂ ŠÂ`ŠÂ %ŠÂ`ŠÂ`ŠÂ %ŠÂ 2ŠÂÀ(ŠÂ %ŠÂ 2ŠÂ`8ŠÂ 2ŠÂà+ŠÂà+ŠÂÀ(ŠÂ 2ŠÂà+ŠÂà+ŠÂ`8ŠÂ€;ŠÂÀAŠÂHŠÂàDŠÂ >ŠÂ`8ŠÂà+ŠÂ %ŠÂ@5ŠÂ >ŠÂ€;ŠÂàDŠÂ KŠÂ WŠÂà]ŠÂ`QŠÂ`QŠÂ WŠÂ WŠÂ@NŠÂÀZŠÂ dŠÂaŠÂà]ŠÂaŠÂaŠÂ`jŠÂàvŠÂ€mŠÂ pŠÂ@€ŠÂàvŠÂÀsŠÂ }ŠÂÀsŠÂàvŠÂÀsŠÂ dŠÂ dŠÂ pŠÂ€mŠÂÀsŠÂàvŠÂ`ƒŠÂ ‰ŠÂ ‰ŠÂÀŒŠÂ ‰ŠÂ }ŠÂ }ŠÂ`ƒŠÂ`ƒŠÂ ‰ŠÂ ‰ŠÂ –ŠÂ€†ŠÂ }ŠÂzŠÂ@€ŠÂ€†ŠÂ –ŠÂ –ŠÂ@™ŠÂ`œŠÂ`œŠÂ€ŸŠÂàŠÂÀŒŠÂ –ŠÂ€ŸŠÂ`œŠÂ`œŠÂ ¢ŠÂ ¯ŠÂਊ ¯ŠÂ ¢ŠÂ ¯ŠÂ@²ŠÂ`µŠÂ ¯ŠÂ ¯ŠÂÀ¥ŠÂ ¢ŠÂÀ¥ŠÂ ¯ŠÂ`µŠÂ`µŠÂ¬ŠÂ ¢ŠÂਊÂਊÂÀ¥ŠÂ`µŠÂ ¯ŠÂ`µŠÂ`µŠÂ`µŠÂ »ŠÂ »ŠÂ »ŠÂÀ¾ŠÂàÁŠÂ€¸ŠÂ€¸ŠÂ »ŠÂ ÈŠÂÀ¾ŠÂÅŠÂŊ ԊÂàڊ€êŠÂ€êŠÂ áŠÂ áŠÂ@äŠÂ áŠÂ@äŠÂ`çŠÂ`çŠÂ@äŠÂ ÔŠÂ ÈŠÂ@ËŠÂ@ˊ Ԋ€ъ Ȋ ԊÂÞŠÂÞŠÂ áŠÂ ÔŠÂ ÔŠÂàڊ€êŠÂ`çŠÂ áŠÂ€êŠÂ€êŠÂ€êŠÂ@äŠÂàڊ€ъÂàÚŠÂÀ׊ÂÞŠÂ`çŠÂÀ׊ÂàÚŠÂàÚŠÂÀ׊ áŠÂ áŠÂ áŠÂÀðŠÂ íŠÂ`çŠÂ íŠÂ`çŠÂ`‹Â úŠÂ€‹Â÷ŠÂ ‹Â`‹ÂÀðŠÂ€êŠÂÀðŠÂ úŠÂ@ýŠÂ ‹Â€‹Â@ýŠÂ ‹Â€‹ÂÀ ‹Â€‹Â ‹Âà ‹Â ‹Â ‹Âà ‹Â‹Âà ‹Â@‹Â€‹Â`‹Â€‹ÂÀ"‹Â ‹Â€‹Â€‹Â ‹Â@‹Â@‹Â€‹Âà ‹Â`‹Â ‹Â ‹Â@‹Â`‹Â‹Â`‹Â`‹Â`‹Âà%‹Âà%‹ÂÀ"‹Â 8‹Â`2‹Âà%‹Âà%‹Â 8‹Â 8‹Â ,‹Âà>‹ÂB‹Âà>‹Â`2‹Â`2‹Â€5‹Â 8‹Â 8‹ÂÀ;‹Â E‹Â€N‹Â`K‹ÂÀ;‹Âà>‹Â`2‹Â E‹Â€N‹Â`K‹Â E‹Â Q‹Âà>‹Â`K‹ÂB‹Âà>‹Â@H‹Â@H‹Â`K‹Â€N‹Â`d‹Â ^‹Â ^‹Â@a‹ÂàW‹Â ^‹ÂàW‹Â ^‹Â ^‹Â`d‹ÂÀm‹Ât‹Â€g‹Â€g‹Â@a‹Â€g‹Â€g‹Â`d‹Â ^‹ÂàW‹Â[‹Â ^‹Â€g‹Â j‹Â@a‹ÂàW‹Â ^‹Â j‹Âàp‹Â j‹Ât‹Â w‹Â w‹Âàp‹Â w‹Ât‹Ât‹Â w‹Â@z‹Â@z‹Â w‹Â w‹Â w‹ÂÀ†‹Â€€‹Â‹Â ‹Â ‹Âà‰‹Âà‰‹ÂÀ†‹Â ƒ‹Âà‰‹Â ‹Â`–‹Â`–‹Â@“‹Âà‰‹Âà‰‹Âà‰‹Â‹Â œ‹ÂÀŸ‹Â œ‹ÂÀŸ‹Â œ‹Â œ‹Â œ‹ÂÀ†‹Â`–‹Â`–‹Â@“‹Â ‹Â`–‹Â`–‹Âà‰‹Â ƒ‹Â ‹Â€™‹Â`–‹Â@“‹Â œ‹Â€™‹ÂÀŸ‹Â ©‹Â`¯‹Â@¬‹Â ©‹ÂÀŸ‹Â€™‹Âࢋ¦‹Â¦‹Â`¯‹Â`¯‹Â€²‹Â€²‹Â ©‹Â@¬‹Â ©‹Â`¯‹Â`¯‹Â€²‹Â µ‹Â µ‹ÂÀ¸‹Â໋Â໋ ‹ ‹ µ‹Â µ‹Â µ‹Â µ‹Â µ‹Â໋ ‹Â໋ µ‹Â€²‹Â€²‹Â µ‹ÂÀ¸‹Â µ‹Â µ‹Â໋Â໋Â໋Â໋ÂÀ¸‹Â¿‹Â ‹€ˋÂ໋€²‹Â µ‹Â໋Â໋ µ‹ÂÀ¸‹Â ‹ ‹Â@ŋ ‹Â`ȋ ۋÂ`á‹Â€ä‹Â Û‹ÂÀÑ‹Â Û‹ÂØ‹Â Î‹Âàԋ ΋Â`ȋ ‹ ΋ xÂÀ1®Â€JÆÂà¤Å ®ºÂ `®Â`ƒ£Â šÂàY“ wÂS„ÂÀ;=ÂçÁ€8—Áø'ÁÐ?5‰ATB@”AB’jBûB ˆB€öˆB†BÀ–€BÀ¦rBÀ bB€@PBÀê=BÀÙ+BeB€ð B´õA­ÙA€#ÀA$©AW”A3A+^A5;AîA€í@ˆ©@èK@€‰?Є¿ FÀ ¥À:èÀ–Á¥9ÁJ]ÁR€Á€ò‘Á€¸£Á@µÁ¢ÆÁ ×ÁïçÁÁ÷Á@_Âa Â@òÂÀ Â@‘Â@¾!€t&€Ù*Â@».ÂÀ2ÂÀ5Â@Ð7ÂÀf:ÂÀ¥< >€n@€B´C€7E€|FÂ@‰GÂ@ƒHÂÀWIÂ?JÂîJ„KÂ3LÂÉLÂÀXMÂ@âMÂÀ„NÂ@OÂ@‹OÂ@PÂPÂÀÃPÂÀõPÂÀ@Q€…QÂÄQÂ@üQÂ@R€4RÂ@yRÂ¥RÂÀÐRÂðR SÂ@(SÂ@ZSÂÀ˜SÂ@¾SÂ@×SÂÀãSÂÀüSÂÀTÂÀTÂÀTÂÀ.TÂ5TÂ@;TÂÀGTÂÀGTÂ@mT€sTÂ@ŸT€¥TÂÀÄTÂ@ÑTÂ@ÑTÂäTÂýTÂ@UÂ@UÂÀ(U€;UÂ@5UÂ@NUÂÀZUÂÀsUÂ@™UÂÀ¥U¬UÂÀ¥U¬UÂÀ¥UÂÀ¾UÂ@ËUÂ@ËU€êUÂ@ýUÂVÂVÂ@/VÂ@/VÂÀTVÂ@aVÂÀmVÂÀmV€€V¦VÂ@ÅV€äVÂÀWÂÀWÂ@)WÂÀ5WÂ@[WÂÀgWÂnWÂÀ€W‡WÂ@W WÂ@¿WÂÀ²W€ÅW€ÞWÂ@ XÂÀXÂXÂÀ/XÂOX€BXÂ@UXÂ@UXÂ@nXÂÀ“X³XÂ@ÒXÂ@ëXÂ@YÂ@YÂÀ)YÂIYÂbYÂ@Y”Y€ YÂ@³YÂÆY€ÒYÂÀñYÂÀñYÂÀ ZÂÀbÂ@KbÂ@KbÂ^bÂÀWbÂÀWbÂÀ‰bÂÂb€ÎbÂÀÔbÂôb€cÂÀ8cÂ@,cÂ@Ec€}cÂÀƒc€–c€¯cÂÀÎc€ácÂ@ôcÂ@ dÂ@?dÂÀKdÂ@XdÂÀ}dÂdÂÀ¯d¶dÂ@Õd€ôdÂ@îdÂÀeÂ@9eÂÀ^eÂ@„e—eÂ@¶eÂÀ©eÂÀ©eÂÀÛeÂâeÂ@èeÂ@fÂfÂ@3f€9fÂFfÂ@ef‘fÂÀ£fÂÃfÂÜfÂÜfÂ@âfÂ@ûfÂ'gÂ@-gÂ@gÂYg€egÂrg‹g‹gÂÀg½gÂ@ÜgÂïg€ûgÂhÂÀ3hÂÀLhÂ@Yh€_hÂÀ~hžhÂÀ°hÂÀâhÂ@iÂÀiÂ@!iÂ4iÂÀFi€YiÂ@liÂ@…iÂ@žiÂÀÃi€ÖiÂÀÜiÂ@éiÂÀõiÂÀjÂ@jÂjÂ@4jÂ`jÂ@fjÂ@j«jÂÀ½jÂÀÖjÂÝjÂÀïjÂÀïjÂ@kÂ@.k€MkÂsk€kÂŒkÂŒkÂ@’kÂ@«k€Êk€ÊkÂÀÐkÂÀlÂ"lÂ@AlÂÀ4lÂ@AlÂ@ZlÂ@Zl€`lÂ@sl†lÂÀ˜lÂÀÊlÂêlÂ@ mÂÀmÂ@;mÂÀ.m€AmÂgm€mÂÀymÂÀ’mÂ@Ÿm€¾mÂ@ÑmÂ@êmÂ@êmÂÀömÂ@nÂým€ nÂ/nÂ@NnÂanÂÀZn€mnÂ@€nÂ@™nÂÀ¥nÂ@²nÂ@ËnÂÀ×n€ênÂÀ oÂ@oÂ)oÂÀ;oÂ@HoÂ@HoÂÀToÂ@aoÂ@“oÂÀ¸oÂÀÑoÂÀÑo€ýo€pÂ#pÂxÂ@Dx€cxÂ@vxÂÀ‚xÂ@x€•xÂ@¨x»x»xÂÀ´x€ÇxÂÀæxÂ@óxÂ@ yÂ@%yÂÀ1yÂÀJyÂÀcyÂÀ|yœyÂÀ®yÂÀ®yµy€ÁyÂÀàyÂÀùyÂ@íy€ zÂzÂÀ+z€>zÂÀDzÂ@QzÂ@QzÂdzÂÀvzÂÀvzÂ@ƒz–z€¢z€»zÂ@çzÂ@{Â@{Â@{€{ÂÀ>{Â@K{€Q{Â@d{Â@}{Â{€œ{Â@–{ÂÂ{Â@È{Â@È{ÂÂ{€Î{Â@á{Â@ú{ |Â@|€|Â@|Â&|Â?|Â@^|ÂÀj|£|¼|ÂÀµ|€¯|Â@Â|ÂÀµ|ÂÀÎ|ÂÀç|Â@ô|Â@ô|Â@ }ÂÀ}€E}Â@?}ÂR}€w}Â@Š}€w}„}ÂÀ¯}ÂÏ}ÂÀá}ÂÀú}Â~ÂÀ~Â@ ~ÂÀ,~Â3~Â3~Â3~Â@9~Â@9~Â@R~Âe~Â@k~Â@k~€Š~ÂÀÂ~ÂÀÛ~ÂÀô~Â@è~Â@ÂÀ Â@Â-ÂÀ&ÂÀ&Â@3Â@3€R€k€kÂ@~ÂÀ£€¶ÂÃÂÀ¼Â@ÉÂÀÕÂÀîÂÀîÂõÂ@ûÂõÂà€Â`€Â €Â€,€ÂÀ2€Âà5€Â@?€Â€E€ÂàN€Â`[€Â€^€ÂÀd€Â a€Â a€Âàg€Âk€Â`t€ÂÀ}€Âà€€Â€€Â€Â`¦€Â¶€Â@¼€Â€Â€Â@¼€Â@¼€Â Å€Â€Û€Â Þ€Â`ñ€Â ë€Âàä€Â ë€Â`ñ€Â€ô€Âàý€Âàý€Â Âà )Âà/Â3Â@9 BÂLÂàHÂ`UÂ@RÂ`U [ [Âe€qÂ`nÂÀwÂ~€ŠÂÀ— šÂà“ÂÀ šÂ ¦ÂÀ©Âà¬Â@¶Â ¿ÂàÅÂàÅÂ@Ï ÌÂ`Ò ØÂàÞÂàÞÂ`ë ñÂ`‚€‚ÂÀ ‚Â@‚€ ‚Â`‚Âà)‚Â-‚€9‚Â`6‚Â@3‚ <‚ÂÀ?‚ÂàB‚ÂF‚ U‚ÂÀX‚€k‚ n‚Âàt‚€„‚Â`‚Â`‚Â@—‚€‚  ‚  ‚€‚  ‚ª‚Â`³‚Â`³‚ ¹‚Â@É‚Â`̂ ҂ÂÀÕ‚ÂàØ‚Â܂ ߂ ߂€è‚Âàñ‚Âõ‚Âàñ‚Âàñ‚Â`þ‚€ƒÂ ƒÂ@ƒÂà#ƒÂÀ ƒÂà#ƒÂ 6ƒÂ@ƒÂà<ƒÂ 6ƒÂ€LƒÂ OƒÂ€LƒÂ OƒÂ OƒÂ OƒÂÀRƒÂ \ƒÂànƒÂ uƒÂÀ„ƒÂ ƒÂ ŽƒÂÀ„ƒÂÀ„ƒÂÀ„ƒÂ ƒÂ@‘ƒÂ¤ƒÂ¤ƒÂ §ƒÂ ³ƒÂ ÀƒÂใ ÀƒÂใ½ƒÂ@ÃÂàÒƒÂÖƒÂ`߃€âƒÂ åƒÂ åƒÂÀèƒÂ åƒÂ åƒÂ@õƒÂ`øƒÂà„Â@„„ „ „ „ 0„ 0„Â@'„Â:„Â@@„Âà6„ 0„ 0„ÂÀ3„Âà6„Â@@„€F„ÂàO„ b„ÂÀe„ b„Âl„ {„ ˆ„Âà„Âà„Âà„Â@‹„€‘„ ”„Âàš„Â€‘„ÂÀ—„ž„ ¡„Â@¤„Â`§„ ¡„Âೄ Ƅ€ÄÂà̄ ӄÂ`ل ߄Â@ï„Âé„Âàå„ ߄ ߄Âé„ ì„Âé„ ø„Â…ÂÀû„Â…Â…Âà… … …Â@!…ÂÀ-…Â4… *… 7…Â4…Â`=… C… P… P…Â`V…€Y…Âàb…Âf…Âàb…Â`V…Â`V…Âf… u…Âà{…Âà{…ÂÀx… u… ‚… ‚…ÂÀx… ‚…Â`ˆ…ÂÀ‘…Âà”…Â˜… ›…Â`¡…ÂÀª…Âà­…Â ´…ÂÀÃ…Â Í…Â Í…Â@Ð…Â Í…Âà߅ مÂÀÜ…Âàß…ÂÀÜ…Â@Ð…Â æ…Âàø…Â ÿ…Âü…Âü…Â`†Â@†Â ÿ…Â`†Âà†Âà†Â  †Â€†ÂÀ†Â †Â€!†Âà*†Â.†ÂÀ'†Âà*†Â`7†ÂÀ@†ÂG†ÂàC†ÂÀ@†Â@M†Â V†Â`†Âà\†Â V†Â c†Â c†Â c†Â€l†ÂÀr†Â@f†Â`i†Â o†Â`‚†Â |†Â |†Â ˆ†Â’†Â`›†Â€ž†Â`›†Â€ž†Â€ž†Â ®†Â৆Â@±†ÂÀ¤†Â৆Â`´†Â º†Â º†Â dž dž€І€І ӆ ӆ ӆ ӆÂàÙ†Â`æ†Â ì†Â ‡Âà ‡Âà ‡Âà ‡ÂÀ‡Âà ‡Âà ‡Â‡Â`‡Â ‡Â€‡Âà$‡Â ‡Â@‡Â`‡Âà$‡Â@.‡Â`1‡Â@.‡Â`1‡Â D‡Âà=‡Âà=‡Â`J‡Â D‡Â P‡Â`J‡ÂàV‡Â ]‡Â€f‡Â i‡Â i‡Â`c‡Â@`‡Â`c‡Â`c‡Â i‡Â@y‡Â ‚‡Â`|‡Â`|‡Â€‡ÂŒ‡Â ‡Âàˆ‡ÂÀ…‡ÂŒ‡Â ›‡Â¥‡Â€˜‡Â`•‡Â`•‡ÂÀž‡Â ›‡Â`•‡Â ‡Â`•‡Â€˜‡Â ‡Â€˜‡Â@«‡ÂÀ·‡Â@«‡Â`®‡Â ¨‡Â@«‡Â Á‡Âງ Á‡Â Á‡Â Á‡Â@ć Á‡ÂÀ·‡Â Á‡ÂÀЇ ͇ ͇ÂàӇ ڇÂÀé‡Â ó‡Â@ö‡Â€ü‡Â@ö‡Â`ù‡ÂÀˆÂàˆÂ ÿ‡ÂàˆÂ ÿ‡ÂàˆÂ ˆÂ ÿ‡Â@ˆÂ ˆÂÀˆÂ"ˆÂ`+ˆÂ 1ˆÂ 1ˆÂ;ˆÂÀ4ˆÂà7ˆÂ >ˆÂ@AˆÂ >ˆÂ`DˆÂ€GˆÂ€GˆÂ@AˆÂ@AˆÂ€GˆÂ€GˆÂ JˆÂàPˆÂ JˆÂ`]ˆÂ`]ˆÂ`]ˆÂÀfˆÂmˆÂ pˆÂ`vˆÂmˆÂàiˆÂ`vˆÂ |ˆÂÀˆÂ |ˆÂ@ŒˆÂ€’ˆÂ •ˆÂ •ˆÂ •ˆÂ€’ˆÂ •ˆÂ ¢ˆÂà›ˆÂ€«ˆÂ@¥ˆÂà›ˆÂà›ˆÂ •ˆÂ€’ˆÂ ¢ˆÂ ®ˆÂÀ±ˆÂÀ±ˆÂ »ˆÂ ÇˆÂш€݈€݈ÂÀãˆÂÀãˆÂÀãˆÂ àˆÂàæˆÂÀãˆÂ€öˆÂ íˆÂ@ðˆÂ@ðˆÂ`óˆÂ`óˆÂ ùˆÂ ùˆÂàÿˆÂÀüˆÂ ùˆÂ`óˆÂ` ‰ÂÀüˆÂ íˆÂ@ðˆÂ€öˆÂ ‰Â ‰ÂÀ‰ÂÀ‰Âà‰Âà‰Â‰Â‰Â‰Â ‰Â€(‰Â ‰Â +‰ÂÀ.‰Âà1‰Â 8‰Â +‰Âà1‰Â +‰ÂÀ.‰Â@;‰Â€A‰ÂÀG‰Â D‰ÂàJ‰Â€A‰ÂN‰Â@T‰Â Q‰Â@T‰Â ]‰Â ]‰Âàc‰Â ]‰ÂÀ`‰Â j‰ÂÀ`‰ÂÀ`‰Â j‰Âà|‰Â ƒ‰Â@†‰Â@†‰Â€‰Â ƒ‰ÂÀy‰Â`p‰Â v‰Â€s‰Â€‰Â ƒ‰Â ƒ‰Âà|‰Âà|‰Â€s‰Â€s‰Â v‰ÂÀy‰Âà•‰Âà•‰Â€¥‰ÂÀ«‰Âஉ²‰Â µ‰Â ¨‰ÂÀ«‰Â ¨‰Âஉ µ‰ÂஉÂÀ«‰Â ¨‰Â`»‰Â@¸‰Â µ‰ÂÀĉÂàlj ΉÂˉÂ@щÂˉ ç‰Â ç‰Â Ú‰Âàà‰Â@ê‰Â ŠÂ@ŠÂ`ŠÂ@ŠÂ ŠÂ ŠÂ€ð‰Â`ŠÂàù‰Â€ð‰Â ç‰Â ç‰Â€ð‰ÂÀö‰Â ŠÂ  ŠÂàŠÂ ŠÂ€"ŠÂ %ŠÂ ŠÂàŠÂ€"ŠÂ 2ŠÂ %ŠÂ€"ŠÂ`ŠÂ€"ŠÂà+ŠÂ@5ŠÂ`8ŠÂ€;ŠÂàDŠÂ >ŠÂ KŠÂ@NŠÂHŠÂ >ŠÂàDŠÂàDŠÂHŠÂ`QŠÂ@NŠÂ€TŠÂ`QŠÂÀZŠÂÀZŠÂà]ŠÂà]ŠÂ dŠÂ`jŠÂ dŠÂ dŠÂ dŠÂà]ŠÂaŠÂà]ŠÂ@gŠÂàvŠÂ@€ŠÂ`ƒŠÂ`ƒŠÂ`ƒŠÂ`ƒŠÂ`ƒŠÂ`ƒŠÂ€†ŠÂ“ŠÂ –ŠÂàŠÂ –ŠÂàŠÂ€ŸŠÂ ¯ŠÂਊÂÀ¥ŠÂਊ ¢ŠÂਊ ¢ŠÂ¬ŠÂÀ¥ŠÂ ¢ŠÂ¬ŠÂ¬ŠÂ ¯ŠÂ@²ŠÂ@²ŠÂ ¯ŠÂ@²ŠÂÀ¾ŠÂ€¸ŠÂ »ŠÂ€¸ŠÂ »ŠÂŊ »ŠÂ€¸ŠÂ ÈŠÂàÁŠÂ`Ί€ъÂÀ׊€ъÂ`Ί Ȋ ȊÂ@ËŠÂÀ׊ áŠÂ áŠÂàÚŠÂàÚŠÂÀ׊ áŠÂÀðŠÂÀðŠÂ€êŠÂÀðŠÂ úŠÂ÷ŠÂ íŠÂ€êŠÂފ€êŠÂ`çŠÂÀðŠÂ÷ŠÂàóŠÂ úŠÂÀ ‹Â ‹Â ‹Â`‹Â‹Âà ‹Â`‹Â`‹Â@‹Âà ‹Â ‹Â ‹Â@‹Â ‹Â€‹Â`‹ÂÀ"‹Âà%‹Â ,‹Âà%‹Â ‹ÂÀ"‹ÂÀ"‹Â)‹Â ,‹Â€5‹Â 8‹Â 8‹ÂB‹Â`K‹ÂàW‹Â€N‹Â@H‹Â`K‹Â E‹Â E‹ÂÀT‹Â ^‹Â`d‹ÂàW‹Â ^‹ÂàW‹ÂàW‹ÂÀT‹Â ^‹Â€N‹Â`K‹Â`K‹ÂÀT‹Â Q‹Â`K‹Â ^‹Â`d‹Â j‹Â w‹Â`}‹Â ƒ‹Â ƒ‹Â w‹Â ƒ‹Âà‰‹Â‹Â‹Â`–‹Â`–‹Â‹Âà‰‹Â ƒ‹ÂÀ†‹Â ƒ‹Âà‰‹Â ƒ‹Â@“‹Â`–‹Â ‹Â€™‹Â€™‹Â`–‹Â¦‹Â@¬‹Â ©‹Â¦‹ÂÀŸ‹Â¦‹Â ©‹Â ©‹Â ©‹Â@¬‹Â໋ ‹Â@Å‹Â@ŋ¿‹Â໋ÂÀ¸‹Â µ‹Â ‹Â໋Â໋Â໋ ‹ ‹Â`È‹ÂÀÑ‹ÂÀÑ‹ÂÀы€ˋÂàÔ‹ÂØ‹Â€Ë‹Â`È‹Â Â‹Â Î‹Â Û‹ÂØ‹Âàԋ ۋ€ä‹Â@Þ‹Â`á‹Âàí‹Â@÷‹Â ô‹Â ç‹Â`á‹Â@Þ‹Â Û‹ÂØ‹ÂàÔ‹ÂØ‹Â`á‹ÂÀê‹Âñ‹Âàí‹Â ç‹Â ô‹Â@÷‹Â€ý‹Â€ý‹Â ŒÂ ŒÂ ŒÂ@ŒÂ ŒÂ`ŒÂàŒÂ`ú‹Â@÷‹Â ŒÂ ŒÂ ŒÂ ŒÂ ŒÂ ŒÂ@ŒÂàŒÂ ŒÂÀŒÂ &ŒÂ &ŒÂ &ŒÂ@)ŒÂ`,ŒÂ`,ŒÂ@)ŒÂ€/ŒÂ &ŒÂ#ŒÂ@)ŒÂàŒÂ &ŒÂ &ŒÂ 2ŒÂ 2ŒÂ ?ŒÂ@BŒÂ€HŒÂ@BŒÂà8ŒÂ KŒÂà8ŒÂ<ŒÂ`EŒÂÀNŒÂ KŒÂ ?ŒÂ ?ŒÂ 2ŒÂ 2ŒÂ ?ŒÂ KŒÂ KŒÂ KŒÂ KŒÂàQŒÂ ?ŒÂ`EŒÂ@BŒÂ€HŒÂ KŒÂ KŒÂÀNŒÂUŒÂ€aŒÂ€aŒÂàjŒÂ qŒÂ qŒÂnŒÂ dŒÂàjŒÂ qŒÂàjŒÂ XŒÂ XŒÂ XŒÂÀNŒÂ XŒÂ XŒÂ@[ŒÂ XŒÂ@[ŒÂ`^ŒÂ€aŒÂ€aŒÂ dŒÂnŒÂnŒÂàjŒÂ dŒÂ`^ŒÂnŒÂ@tŒÂ`wŒÂÀgŒÂÀgŒÂÀgŒÂnŒÂàjŒÂ@tŒÂ qŒÂnŒÂàjŒÂ qŒÂ qŒÂ qŒÂ qŒÂnŒÂàjŒÂàjŒÂÀgŒÂàjŒÂàjŒÂ@tŒÂ qŒÂ`wŒÂ`wŒÂàjŒÂnŒÂ }ŒÂÀ€ŒÂ ŠŒÂ€zŒÂ }ŒÂàƒŒÂ`ŒÂ`ŒÂ`ŒÂ@ŒÂ ŠŒÂ }ŒÂ ŠŒÂ€“ŒÂ –ŒÂ€“ŒÂ –ŒÂàœŒÂ ŒÂ ŒÂ ŒÂ€“ŒÂÀ™ŒÂ –ŒÂ€“ŒÂ€“ŒÂàœŒÂ £ŒÂ`©ŒÂ€¬ŒÂ€¬ŒÂ€¬ŒÂ`©ŒÂ £ŒÂ £ŒÂ ¯ŒÂ ¯ŒÂàœŒÂ ŒÂàœŒÂ £ŒÂ £ŒÂàœŒÂ £ŒÂ`©ŒÂൌ ¯ŒÂ ¯ŒÂÀ²ŒÂ ¯ŒÂൌ€¬ŒÂൌ€¬ŒÂ £ŒÂ £ŒÂ ŒÂ –ŒÂ€“ŒÂ€“ŒÂàœŒÂ€¬ŒÂ`©ŒÂ€¬ŒÂ€¬ŒÂൌÂൌ ¼ŒÂൌÂÀ²ŒÂ€¬ŒÂ@¿ŒÂ ¼ŒÂ@¿ŒÂ`ÂŒÂ@¿ŒÂ ÈŒÂàΌ ՌÂÀËŒÂ@، áŒÂ`ی Ռ Ռ Ȍ€ŌÂ`ÂŒÂÒŒÂ`ÂŒÂ@¿ŒÂ`Œ€ŌÂൌÂൌÂÀËŒÂÒŒÂÒŒÂ`ی áŒÂ€ÞŒÂÀäŒÂ úŒÂ îŒÂëŒÂàçŒÂëŒÂÀäŒÂ€ÞŒÂ Ռ ՌÂҌ Ȍ Ռ€ތ áŒÂ`ÛŒÂàçŒÂ áŒÂàçŒÂ áŒÂ áŒÂ€ÞŒÂ áŒÂàçŒÂ îŒÂ úŒÂ úŒÂ úŒÂ úŒÂ úŒÂ@ñŒÂ€÷ŒÂ îŒÂëŒÂëŒÂ îŒÂ úŒÂ€÷ŒÂ`ôŒÂà úŒÂ@ñŒÂ úŒÂ úŒÂàÂà úŒÂÀýŒÂ úŒÂ úŒÂàÂÀýŒÂÂÀýŒÂ € ÂÀÂ@ Â@  Â Âà  úŒÂÂ@ ÂÀÂà€ Âà€€ ÂÀÂàÂ@#ÂàÂÂ@#Â`& €)Â@#Â`&€) , 9Âà2Â@# €)Â@#Â`& €Â` Âà  Â`&  Â@#€) ,Â6 ,Â`& ,Â6Â6Âà2Âà2 9 9€BÂÀHÂ`?Âà2Âà2 9€BÂ6Âà2 9Â6 EÂ@<Â@< 9€B 9Â6 9Âà2Â6Â@<ÂàKÂàK€B EÂ`? EÂ`?Â`?€B€BÂ@<Â`?ÂàK EÂOÂàK RÂàKÂ@UÂÀH EÂÀHÂàKÂàKÂÀHÂÀH EÂàKÂà‘ ¾¯ÂÎÇ ÇÂÀ(¼Âá¯Â`ú¤ÂÀœÂàé”Â@€:†ÂÀ{CÂ@&Âh¿Á€ä‹Á5 Áô—@ó¬AÀB€LNBÀØrB„B@sˆB`ˆB`C„B€d|B@;mB@=\B€2JBÀõ7B€)&B€DBÀ_BgíA¥ÒA€.ºAÅ£A*A>xA5TA2AºA ß@:@6@H?h¦¿XÀ2¯ÀbòÀFÁñ=Á2aÁ-‚Á€i“Á¦¤Á¶Á€ÇÁ€¬×Á€ûçÁ€´÷Á€3ÂÀA ÂÀþÂ@ÂÖÂ"ÂÀÅ&ÂÀ+ÂÎ.ÂÀK2Â@x5Â@48€«:€Ñ<ÂÀ²>Â@h@ÂÀëAÂPCÂ@´D€æEÂÀÿFÂÀùGÂ@IÂÛI£JÂ@XKÂ@L°LÂÀ?MÂ@ÉMÂÀRN½NÂÀ3OÂ@‹OÂ@ïOÂ@:PÂ@…PÂ@·P€QÂÀYQÂ’QÂ@±QÂÀïQÂÀ!RÂARÂsR€˜RÂÀÐRÂðRÂÀSÂÀ4SÂ;SÂ@sSÂ@¥SÂ@¾S€ÝSÂÀüSÂ@;TÂ@TT€T™TÂÀÄTÂËTÂËTÂ@êTÂ@UÂ@5U€TUÂÀZUÂÀZUÂaUÂ@™UÂÀ¾UÂ@ËU€ÑUÂ@äU€êUÂÀ VÂÀ VÂ@V€NVÂ@aVÂ@zVÂÀ†V€™VÂÀ¸V€ËVÂÀÑVÂ@ÞVÂ@ÞVÂ@÷VÂ@)W€HWÂUWÂUWÂÀgW€zWÂ@WÂÀ€W€“W€ÅWÂ@ØWÂÀýWÂ@ XÂÀ/XÂOXÂ@nXÂXÂ@ XÂÀ¬X€ØXÂ@ëXÂ@YÂYÂ@6YÂÀBYÂÀ[YÂ@hYÂ@YÂÀ¦Y­YÂÀ¦Y€ÒYÂ@þY€ZÂ*ZÂCZÂ@bZÂ@{ZÂÀ ZÂÀ¹Z§ZÂ@ÆZÂ@ÆZÂ@ßZÂÀëZÂ@[Â=[ÂÀO[Â@u[ÂÀ[º[Â@À[Â@ò[Â@ò[Â\ÂÀ\Â7\ÂÀI\€\\Â@o\ÂÀ”\€§\Â@º\€ò\€ò\Â1]Â@7]Â@7]ÂÀ\]€o]•]ÂÀ§]€Ó]Â@ÿ]Â@^Â@1^ÂÀV^ÂÀo^Â@|^Â@|^Â@•^Â@Ç^€æ^€ÿ^€1_€J_Â@]_‰_€®_ÂÀ›_ÂÀ´_ÂÀÍ_Â@Ú_Â@ó_Â@ `Â`€D`Âj`ƒ`Â@‰`ÂÀ®`Â@»`ÂÎ`Â@í`Â@aÂ@aÂ@8aÂKaÂ@ja€‰a€¢aÂÈaÂ@ça€íaÂúaÂ@b€bÂ@KbÂ^bÂwbÂ@–bÂÀ»bÂ@ÈbÂÀíb cÂ&c€Kc€dcÂÀƒc£c¼c€ácÂ@ôcÂÀd€d dÂÀ2dÂÀKdÂkd„dÂ@£dÂ@£dÂÀÈdÂÀúdÂ@9eÂÀEeÂLe€qeÂÀ©eÂ@¶eÂÀÂeÂÉeÂâeÂÀÛeÂ@f€ fÂÀ?fÂ_fÂ@efÂÀqfÂxfÂÀ£fÂÀÕfÂõfÂ@ûfÂgÂ@gÂÀ g€3gÂ@_gÂÀkgÂÀgÂ@ªgÂ@ÃgÂïgÂÀh€-hÂ@'hÂShÂlhÂÀ~hžh€ÃhÂÐhÂ@ÖhÂ@ÖhÂÀûhÂÀiÂÀ-iÂ@SiÂfiÂi€‹iÂ@·iÂÀÜiÂ@j€jÂ@jÂ@4j€:jÂ`jÂÀrjÂ@˜j«jÂ@ÊjÂ@ãj€kÂk€4kÂÀlkÂÀ…k€˜kÂÀ·kÂÀÐkÂÀékÂ@ökÂÀlÂÀlÂ@l€lÂ@(lÂ@AlÂmlÂÀ˜lÂÑlÂ@×lÂÀãl€ölÂ@ mÂÀmÂmÂ@;mÂ@TmÂ@mmÂÀ’m€¥mÂÀÄmÂ@êmÂ@êmÂ@êmÂ@n€;nÂ@NnÂÀsnÂ@€n¬n€¸nÂ@ËnÂÀ×n€o€oÂÀ o€oÂÀ oÂ@/oÂ@HoÂ@aoÂÀmoÂÀ†o€²o€ËoÂÀÑoÂÀÑo€äoÂ@÷oÂÀpÂy€DyÂQyÂjyÂ@pyÂ@‰yµyÂ@»yµyÂ@ÔyÂ@íyÂÀùy€óy€ zÂÀ+zÂ2zÂ@8zÂ@8z€>zÂKzÂKzÂ@QzÂÀ]zÂÀvzÂ@ƒzÂÀzÂÀ¨z¯zÂ@ÎzÂÈz€ÔzÂÀóz€ízÂÀ {€{Â@2{Â@K{Â^{Â^{ÂÀp{Âw{ÂÀ‰{€œ{Â@–{ÂÀ¢{ÂÀ¢{Â@¯{Â@¯{ÂÀ»{ÂÀí{Â@ú{ÂÀ|ÂÀ|ÂÀ8|€K|ÂÀQ|ÂX|ÂÀƒ|ÂÀƒ|ÂÀƒ|ÂÀœ|Â@Â|ÂÕ|€á|€á|ÂÀç|Â} }ÂÀ}ÂÀ2}Â@X}Âk}Â@X}ÂÀd}Âk}€w}Â@Š}Â}Â@£}€©}€©}¶}Â@Õ}Â@î}ÂÀ~Â@~€&~ÂÀE~ÂL~Â@k~Â~~ÂÀ~Â@„~Â@„~€Š~Â@~€¼~€Õ~ÂÀÛ~Ââ~Âû~Ââ~Â@ÂÂÀ&€9Â@eÂ@eÂ@eÂ@~Â@~ÂÀŠÂ@—ÂÀ¼Â@ÉÂÃÂÀÕÂ@âÂÀÕÂÜÂÜÂà€Â €Â€€Â €Âà€Â €Â #€Â /€ÂÀ2€Â`B€Â€E€Â€E€ÂR€ÂR€ÂR€Â a€Â€w€Â z€Â€w€Â„€Â “€Â€Â@£€Â`¦€Â ¬€Â ¹€Â¶€Â ¹€Â ¹€Â@¼€Â Å€Â@Հ ҀÂ`؀ ހÂ@î€Â ë€Âàý€Â €  ÂÀ  Â@  ) B B€? O€XÂ`U€XÂe t Â`‡Â Â Â Â Â€ŠÂ Â` Â` Âà¬Â ¿Â@ÏÂ@Ï ØÂ ØÂ@è€îÂà÷ÂûÂ`‚ ‚ ‚€ ‚ ‚ #‚ #‚Âà)‚Â`6‚ <‚ <‚ I‚ U‚Âà[‚Âà[‚Âà[‚ b‚ n‚Â`h‚€k‚ {‚Âx‚€„‚‘‚Â`š‚Âংª‚ ­‚ ­‚Â@°‚Âà¿‚ÂÂÂ@ɂ€ς€ς ҂€è‚ ë‚ ø‚Âàñ‚ ø‚Â`þ‚€ƒÂ`þ‚ƒ ƒÂ`ƒÂ€ƒÂ ƒÂÀ ƒÂ ƒÂ'ƒÂ€3ƒÂ@ƒÂ@ƒÂ@FƒÂ€LƒÂ@_ƒÂ \ƒÂ€eƒÂÀkƒÂ hƒÂ@_ƒÂ hƒÂ \ƒÂ \ƒÂ hƒÂ@xƒÂ uƒÂ€eƒÂ hƒÂànƒÂ uƒÂ`{ƒÂ`{ƒÂ`{ƒÂ ƒÂà‡ƒÂÀ„ƒÂ ŽƒÂ@‘ƒÂ€—ƒÂ`”ƒÂ šƒÂ šƒÂ §ƒÂ€°ƒÂ`­ƒÂ€°ƒÂ ³ƒÂ ÀƒÂ ÀƒÂ½ƒÂใÂ@ÃÂใ½ƒÂ`ƃÂ`ƃÂàÒƒÂÀσ ̃ ̃ÂàÒƒÂ`߃ åƒÂàëƒÂ€ûƒÂ€ûƒÂ€ûƒÂ`øƒÂ þƒÂ þƒÂ€ûƒÂà„ÂÀ„„Â@„€„€„ $„ 0„Â@'„ 0„€-„€-„ $„Â!„Â`*„ 0„ =„€F„ÂÀL„ b„€_„ÂÀe„ÂÀe„Âàh„ b„Âl„€x„ {„ ˆ„Âàš„Â€‘„ ”„ ”„Â@¤„€ª„ º„ º„ÂÀ°„ ­„Â`À„ۀÂà̄ Ƅ Ƅ ӄÂ`ل€܄ ߄ÂÀâ„Â@ï„Âé„Â@ï„Â`ò„Â`ò„ ø„ ø„Âàþ„Âàþ„Â…€…Âà…Âà… … …Â@!… …Â`$… *…€'…ÂÀ-… 7… 7…€@…ÂÀF… P… \…Âàb…Â@l…Âf…€r…Â`ˆ…Â`ˆ…Â`ˆ…Â…Â`ˆ…€‹…Â@……Â`ˆ…Â Ž…Âà”…Â ›… ›…€¤… ›…Âà­…Â ´… ´…ÂÀª… ´…Â@·…Â`º… ´… À…ÂÊ…ÂÊ…Âʅ ͅ م م€օ€օ æ…Âã…Â`ì…Âã…Âã…Â@é… ò…Â@†Â`†Â ÿ…Âàø…Â ÿ…Â`†Â€†Â€†Âà†Â †Âà*†Â 1†ÂÀ'†Â`7†Âà*†Â@4†Â`7†Â`7†Â =†Â J†Â€S†Â`P†ÂàC†Â J†Â V†Â@f†Â o†Â€l†Â@f†Â o†ÂÀr†Â o†Â o†Â€l†Â o†ÂÀr†Â |†Â@†Â€…†Â’†Â€ž†Â ¡†ÂÀ¤†Â ®†Â«†Â ®†Â ®†Â@±†ÂàÀ†Â dž džÂàÀ†Â dž ӆ ӆ ӆÂÀֆ à†Â ì†Â ì†Âàò†Â ù†Â@ü†Âö†Âàò†Â ù†Â€‡Â ‡Â ‡Â ‡Âà ‡Â@‡Â`‡Âà ‡Â@‡Â`‡Â(‡Â(‡Â +‡Âà$‡Âà$‡Â +‡Â€4‡Â +‡Â +‡Â 7‡Â€4‡Â€4‡Â`1‡Âà=‡Â D‡Â`J‡ÂÀS‡ÂZ‡Â ]‡Â€f‡Â i‡Â i‡Â€f‡Â`c‡Â`c‡Â i‡Â i‡ÂÀl‡Âào‡Âào‡Â@y‡Â€‡Â€‡Â ‚‡ÂÀ…‡Â€‡Â€‡ÂŒ‡ÂŒ‡ÂŒ‡Â ‡Â ›‡ÂࡇÂࡇ¥‡Â`®‡Â¥‡Â€±‡Â`®‡ÂງÂ@ćÂ`LJ ͇Â`LJÂׇÂ@݇ÂàÓ‡Â@݇€ã‡Â ڇ æ‡Â€ã‡Â`à‡ÂÀЇÂ@݇ æ‡ÂÀé‡ÂÀé‡Âàì‡ÂÀé‡Â ó‡Âàì‡Â ó‡Â€ã‡Â æ‡Â ó‡ÂÀˆÂ ˆÂ`ˆÂ@(ˆÂ %ˆÂ"ˆÂàˆÂ`+ˆÂ %ˆÂ %ˆÂ@(ˆÂ@(ˆÂ 1ˆÂà7ˆÂà7ˆÂ 1ˆÂÀ4ˆÂÀ4ˆÂ 1ˆÂ 1ˆÂà7ˆÂ JˆÂàPˆÂTˆÂ@ZˆÂ cˆÂàiˆÂ pˆÂmˆÂÀfˆÂÀfˆÂmˆÂàiˆÂ pˆÂàiˆÂàiˆÂ cˆÂàiˆÂàiˆÂàiˆÂ |ˆÂ ‰ˆÂ@ŒˆÂ ‰ˆÂà‚ˆÂ ‰ˆÂŸˆÂ ¢ˆÂŸˆÂ`¨ˆÂ€«ˆÂ`¨ˆÂ ®ˆÂ@¥ˆÂ@¥ˆÂ€«ˆÂ€«ˆÂ ®ˆÂ€«ˆÂ€«ˆÂ ®ˆÂà´ˆÂà´ˆÂà´ˆÂÀ±ˆÂ »ˆÂ€ÄˆÂ€ÄˆÂà͈Âà͈Â@׈ ԈÂ`ڈ€݈ àˆÂêˆÂ íˆÂ íˆÂêˆÂ àˆÂ àˆÂ àˆÂ`óˆÂ`óˆÂ`óˆÂêˆÂ`óˆÂÀüˆÂ ‰Â ‰Â ‰Â@ ‰Â ‰Â€‰Â` ‰Â@ ‰Â‰Â ‰Â@ ‰Â` ‰Â‰Â ‰ÂÀ‰ÂÀ‰ÂÀ‰Â ‰Â` ‰Â ‰Â@"‰Â€(‰Â ‰Â‰Â‰Âà1‰Â@;‰Â`>‰Â D‰Â D‰ÂàJ‰Â D‰ÂÀG‰ÂN‰ÂàJ‰ÂàJ‰ÂÀG‰ÂàJ‰Â5‰Â D‰Â€A‰Â5‰Â5‰Â@;‰Â`>‰Â 8‰Â@;‰Â€A‰ÂN‰Â Q‰Â@T‰ÂàJ‰Â D‰Â D‰Â€A‰Â@;‰Â D‰Â Q‰Â`W‰Â ]‰ÂN‰Â Q‰ÂàJ‰ÂÀG‰ÂàJ‰Â Q‰Â ]‰Â ]‰Â ]‰Â ]‰Â j‰Â j‰Â j‰Â j‰Â j‰Â@T‰Â€Z‰Â ]‰Â j‰Âg‰Âg‰Â@m‰Â€s‰Âàc‰Âà|‰Âà|‰ÂÀy‰Â v‰Â€‰Â@m‰Â j‰Â@m‰Â€s‰Â€‰Â ƒ‰Â`‰‰Âà•‰ÂÀ’‰Âà•‰Â œ‰Â€¥‰Â²‰Â ¨‰Â`¢‰Â ¨‰Â²‰Â µ‰Â µ‰Â µ‰ÂஉÂÀ«‰Â µ‰Â@¸‰Âàlj Á‰ÂàljÂˉ ΉÂ`ԉ ΉÂ@щÂàà‰Â ç‰Â ç‰Â ç‰Âä‰Âä‰Â`í‰Âàà‰Â ç‰Âä‰Â Ú‰Â Ú‰ÂÀ݉ ç‰Â€ð‰Â ó‰Âàù‰Âàù‰Â`ŠÂ ŠÂ ŠÂàù‰Â`ŠÂ`ŠÂ€ ŠÂàŠÂàŠÂŠÂàŠÂ@ŠÂ ŠÂ  ŠÂàŠÂàŠÂ`ŠÂÀŠÂàŠÂ %ŠÂà+ŠÂ`8ŠÂ@5ŠÂÀ(ŠÂÀ(ŠÂ@5ŠÂÀAŠÂ >ŠÂ KŠÂ KŠÂ WŠÂ€TŠÂHŠÂ KŠÂ`QŠÂà]ŠÂ€TŠÂHŠÂ`8ŠÂHŠÂàDŠÂHŠÂàDŠÂà]ŠÂ dŠÂ€mŠÂÀsŠÂ@gŠÂ pŠÂàvŠÂàvŠÂ }ŠÂ }ŠÂ`ƒŠÂ`ƒŠÂ ‰ŠÂÀŒŠÂ@€ŠÂàŠÂàŠÂÀŒŠÂ`ƒŠÂ ‰ŠÂàŠÂ“ŠÂ€†ŠÂ`ƒŠÂ€†ŠÂÀŒŠÂÀŒŠÂ –ŠÂ@™ŠÂ ¯ŠÂ¬ŠÂ ¯ŠÂ€¸ŠÂ@²ŠÂÀ¥ŠÂ ¢ŠÂÀ¥ŠÂ ¯ŠÂ¬ŠÂਊÂ@²ŠÂ¬ŠÂ¬ŠÂ`µŠÂÀ¾ŠÂàÁŠÂ ÈŠÂŊ€ъÂ`ΊÂàÁŠÂàÁŠÂ Ȋ ԊÂ`Ί ȊÂ`ΊÂÀ׊ áŠÂ÷ŠÂà ‹Â ‹Â ,‹Â ‹Â@‹Â€‹ÂàóŠÂàóŠÂàóŠÂ€êŠÂ÷ŠÂàóŠÂàóŠÂÀðŠÂàóŠÂ íŠÂ€êŠÂ íŠÂ`çŠÂ íŠÂ€êŠÂ€êŠÂàóŠÂ`‹Â`‹Â@ýŠÂ€‹Â ‹Â@‹Â ‹Â ‹Â`‹ÂÀ"‹Â ,‹Âà%‹ÂÀ"‹Â ,‹Â`2‹Â ,‹Âà%‹Âà%‹Â ‹Âà%‹Âà%‹Â ,‹Â 8‹ÂB‹Â E‹Â E‹Â€N‹Â E‹Â@H‹Â Q‹Â Q‹Â Q‹Â E‹Â Q‹Â€N‹ÂÀT‹ÂÀT‹Â ^‹Â ^‹Â ^‹Â ^‹Â`d‹ÂÀm‹Â w‹Âàp‹Â€g‹Â€g‹Â@z‹Â ƒ‹Â€€‹Â`}‹Â w‹Â`}‹Â€€‹Â w‹Â€g‹Âàp‹Â w‹Â`}‹ÂÀ†‹Â€€‹Â w‹Â`}‹Â w‹Â w‹Ât‹Â€g‹ÂÀm‹Â w‹Â€€‹Â ‹Â ‹Â ‹ÂÀ†‹Â€€‹Â€€‹Â`–‹Â€™‹Âࢋ ©‹Â¦‹Â@¬‹Â µ‹ÂÀ¸‹Â໋ÂÀ¸‹Â`¯‹ÂÀ¸‹Â€²‹Â`¯‹Â ©‹Â@¬‹Â€²‹Â`¯‹Â µ‹Â µ‹Â¿‹Â ‹ ‹Â໋Â໋Â`ȋ€ˋÂ@Å‹Â@Å‹Â Â‹ÂØ‹Â؋ ۋÂ@Þ‹Âàԋ ΋Â@Þ‹Â`á‹Â ç‹ÂÀê‹Â@ދ€ä‹Â`ú‹Â€ý‹Â ô‹Â ç‹Â ç‹Â`á‹Â ç‹Â ç‹Âñ‹Â ô‹Â`ú‹Â`ú‹Â€ý‹Â ŒÂ`ú‹Âàí‹Â ç‹Â`ú‹Â ô‹Âàí‹Âñ‹Â ô‹Â€ý‹Â`ú‹ÂÀŒÂ ŒÂ ŒÂ ŒÂàŒÂ`ú‹Â ŒÂ ŒÂ ŒÂ`ŒÂ@ŒÂ@ŒÂ@ŒÂ€ŒÂ ŒÂÀŒÂ#ŒÂ€/ŒÂ`,ŒÂ@)ŒÂ€/ŒÂ#ŒÂ ŒÂàŒÂ &ŒÂ€ŒÂÀŒÂÀŒÂàŒÂ &ŒÂ€/ŒÂ`,ŒÂ€/ŒÂÀŒÂ#ŒÂ &ŒÂ &ŒÂàŒÂ#ŒÂ€/ŒÂà8ŒÂÀ5ŒÂà8ŒÂà8ŒÂ€HŒÂ ?ŒÂÀ5ŒÂ ?ŒÂ@BŒÂ ?ŒÂ@BŒÂ KŒÂ€HŒÂ€HŒÂÀNŒÂ€HŒÂÀNŒÂUŒÂ XŒÂ dŒÂÀgŒÂnŒÂ€aŒÂ dŒÂ dŒÂ dŒÂ@[ŒÂ@[ŒÂ€aŒÂ`^ŒÂ`^ŒÂàQŒÂàQŒÂ KŒÂàQŒÂUŒÂàQŒÂ XŒÂ XŒÂ@[ŒÂ`^ŒÂ`^ŒÂ XŒÂ dŒÂ qŒÂ@tŒÂ@tŒÂnŒÂnŒÂ`wŒÂ€zŒÂ }ŒÂ`wŒÂ }ŒÂ qŒÂ@tŒÂ qŒÂ qŒÂ }ŒÂ€zŒÂÀ€ŒÂ`wŒÂ€zŒÂ qŒÂ qŒÂ`wŒÂnŒÂ`wŒÂ }ŒÂ }ŒÂÀ€ŒÂÀ€ŒÂ }ŒÂ€zŒÂ }ŒÂ€zŒÂ }ŒÂ }ŒÂ }ŒÂ }ŒÂàƒŒÂàƒŒÂ qŒÂ@tŒÂ }ŒÂ }ŒÂ@ŒÂÀ™ŒÂ@ŒÂ€“ŒÂ ŠŒÂ€“ŒÂ`ŒÂ ŒÂ ŒÂ ŒÂ £ŒÂÀ™ŒÂ –ŒÂ –ŒÂàœŒÂ ŒÂ ŒÂÀ™ŒÂÀ™ŒÂ`©ŒÂ £ŒÂ £ŒÂ £ŒÂ@¦ŒÂ`©ŒÂ ¯ŒÂൌÂ@¿ŒÂ`ÂŒÂൌ ¼ŒÂ€ÅŒÂ ¼ŒÂ¹ŒÂ¹ŒÂ ¼ŒÂ€ÅŒÂ`Œ€ŌÂ`ÂŒÂൌÂÀ²ŒÂÀ²ŒÂ ¼ŒÂ ÈŒÂ ÈŒÂ`Œ€Ō€Ō Ȍ ȌÂÒŒÂ`ی áŒÂ€ÞŒÂ@ØŒÂҌ ՌÂàΌ€ތ áŒÂ€ÞŒÂ`ÛŒÂ`ÛŒÂ@ñŒÂ@ñŒÂ`ôŒÂ îŒÂàçŒÂ îŒÂàçŒÂ áŒÂàçŒÂàçŒÂ îŒÂ`ôŒÂÂÂ@   úŒÂÀýŒÂ úŒÂ ÂàÂ@     Â` ÂÂ`  Â`    ÂÂà Â`& ,   ,Âà2Â6Âà2Âà2€BÂ6Âà2Âà2ÂÀ/Â`& , ,Âà2Â@#Â@#€)€) ,Â6Â`& ,Â`&ÂÀ/ 9Â@< E€B EÂàKÂOÂÀHÂàKÂàK€BÂ6 9Â`?ÂÀHÂàKÂ@UÂ`X RÂ`XÂ`X ^€[ ^ ^ R RÂ`X ^ÂÀaÂh ^€[ k k ^Â`XÂ@UÂ`XÂ@UÂàdÂhÂàd ^€[Âàd kÂàd€[Â@U R€[ ^ÂÀaÂ`XÂhÂ@n wÂ`q kÂàd k k kÂàdÂh ^ ^ ^ÂàdÂh kÂÀz wÂà}Â@‡Â „Â`ŠÂÀz€t€tÂ@n€t „ÂÀ“Âà–Â`ŠÂ w „ ÂÀ“ÂÀ“€Â`ŠÂ „ € Â@‡Â „Â@‡Â Â „Âà}ÂÀzÂÀzÂà}Âà}Âà} „ „Âà}Âà} „€Â`ŠÂ`ŠÂ Â š  €ÂÀ“€šÂ`£Â`£Â`£Â  _‘ÂE°ÂÀ+È TÇ€T¼Â`°Â ¥Â œÂ€ù”Âà&Â`P†ÂÀßC€9€%ÈÁ€©™Á~3Á0r?ŸˆA€ÊB€ @BiB@Õ€B@˜†B€f‡B`u„B~B€ËoB€J_B€ÏMB€"”ÀbÙÀ=Á-4ÁUWÁzÁ0ŽÁ€lŸÁ€j°ÁßÀÁ.ÑÁ€WáÁñÁ€èÿÁÀ!ÂÀÅ ÂÀÂ@ÕÂ@fÂÀm$Â@)Â%-€Î0€4ÂÀû6ÂÀž9Â@<ÂÀ>Â@ë?€šAÂCÂ|DÂ@ÇEÂíFÂHÂ@çHÂÀÔIÂ@JÂ@XKÂ@îK€ŠLÂ@3MÂÀ¼MÂ'NÂÀ„NÂ@õNÂ@@OÂ@‹O€ÜOÂ@!PÂÀxP€ÖPÂÀ'QÂ@fQÂ@˜QÂ@ÊQ€éQÂÀRÂÀ!RÂARÂÀ…RÂÀ·RÂÀSÂÀMSÂ@ŒS¸SÂÑSÂ@×SÂêSÂ@ TÂ@"TÂNT€T€¥T€¾TÂÀöTÂÀUÂÀ(UÂ/UÂ@NUÂÀZUÂ@gUÂÀsUÂÀŒU“UÂÀ¾UÂÅUÂ@äUÂÀ"VÂBVÂ@HVÂ[VÂVÂÀŸVÂ@¬VÂ@ÅVÂÀÑV€äVÂ@WÂ#WÂÀ5W€/WÂÀgWÂ@tWÂ@¦WÂ@¿WÂÀËWÂÀýW€÷WÂëWÂ@ XÂ@#XÂ@UXÂ@nXÂÀzXÂ@ XÂÀÅX€ØXÂ@ëXÂÀ÷X€ YÂÀ)YÂIY€nY”Y­YÂ@³YÂÀØYÂ@åYÂøYÂZÂÀ#ZÂ@0ZÂ@IZÂ\ZÂ@{Z€šZ§ZÂÀ¹ZÂ@ßZ€þZÂ$[Â@*[Â=[Â@C[ÂV[ÂÀh[€”[Â@§[Â@ò[Â@$\ÂÀI\Â@V\Âi\ÂÀ”\´\Â@Ó\ÂÀß\ÂÀß\€ò\€ ]Â@]€=]€V]€o]Â@›]Â@Í]Â@æ]€^Â+^Â+^ÂD^ÂÀV^ÂÀˆ^ÂÀ¡^Â@Ç^€Í^Â@à^Â@ù^Â@ù^Â%_ÂÀ7_ÂÀi_ÂÀ‚_¢_»_»_Â@Á_Âí_ÂÀ`ÂÀ1`Â@W`ƒ`ÂÀ•`Â@¢`ÂÀÇ`ÂÀà`Â@í`ÂaÂÀa€%aÂÀ+aÂKa€WaÂÀaÂÀ¨aÂ@µaÂáaÂúaÂ@bÂ,bÂEbÂÀWbÂÀWbÂwb©bÂ@ÈbÂÛbÂôb€cÂ@EcÂ@^cÂÀjcÂ@cÂÀœcÂ@ÂcÂÀd€dÂÀ2dÂÀKdÂ@XdÂkdÂ@Šd€©d€ÂdÂÀádÂe€&eÂÀ,eÂ@9e€?eÂ@keÂÀwe—eÂ@ÏeÂ@fÂ@fÂ-fÂÀXfÂ_fÂ@efÂ@efÂ@~fÂÀŠfÂÀ£fÂ@ÉfÂ@ûfÂ@gÂ@-gÂ@FgÂÀRgÂÀRg€egÂ@‘gÂÀgÂÖgÂÀègÂïgÂhÂ!hÂ@@hÂÀehÂÀ~hžhÂ@½h€ÃhÂéhÂÀûhÂÀiÂ@!iÂMiÂ@liÂ@…iÂ@žiÂÀÃi€ïiÂÀõiÂüiÂ@jÂ@4jÂGjÂ@Mj€:jÂ@fjÂyj«jÂÄjÂ@üjÂ@üjÂöj€kÂAkÂÀSkÂ@ykÂ@’kÂ@«kÂÀ·kÂ@Ýk€ükÂ@lÂ@(lÂÀ4lÂ@AlÂÀMlÂÀflÂÀlÂÀÊlÂ@ðlÂmÂ@ m€(mÂÀ.mÂ5mÂÀ`m€m™mÂËmÂämÂýmÂÀömÂ@nÂ@nÂÀAnÂanÂznÂÀ¥nÂÀ¾nÂ@Ën€ênÂ÷nÂÀðn€oÂ)oÂÀ;oÂ[oÂ@zo€™oÂ@¬oÂØoÂ@÷o pÂ@pÂ@)pÂ@BpÂ@[pÂ@[pÂ@[pÂ@[p€HpÂ@tpÂÀ™p pÂ@¿p€ÅpÂ@ØpÂ@ñpÂ@ qÂ@ qÂÀýpÂÀ/qÂ@UqÂÀaqÂ@nq€tqÂÀ¬qÂ@ÒqÂ@ëq€ñqÂÀ÷qÂ@rÂ@rÂrÂÀ)r€#rÂÀ)r€ˆÂ;ˆÂ 1ˆÂ >ˆÂ >ˆÂ >ˆÂà7ˆÂ >ˆÂTˆÂàPˆÂ WˆÂÀMˆÂTˆÂ€`ˆÂ WˆÂÀfˆÂÀfˆÂàiˆÂmˆÂmˆÂ pˆÂ |ˆÂà‚ˆÂ ‰ˆÂ •ˆÂŸˆÂ@¥ˆÂ ¢ˆÂ`¨ˆÂ ®ˆÂ@¥ˆÂÀ±ˆÂ »ˆÂ »ˆÂ ®ˆÂ€«ˆÂ`¨ˆÂÀ±ˆÂ¸ˆÂ@¾ˆÂà͈Â`ڈ àˆÂêˆÂ`óˆÂ€öˆÂêˆÂ íˆÂ ùˆÂ ùˆÂàÿˆÂ ‰Â€‰Â` ‰ÂÀ‰Â ‰Â€‰Âà‰Â ‰Â€(‰Â`%‰ÂÀ‰Â`%‰Â5‰Â 8‰Â +‰Â 8‰Â`>‰Â@;‰Â 8‰Â€A‰ÂàJ‰ÂN‰ÂàJ‰Â Q‰Â ]‰ÂÀ`‰Â ]‰ÂÀ`‰Â ]‰Âàc‰ÂÀ`‰ÂÀ`‰Â ]‰ÂÀ`‰Â j‰Â ]‰Â ]‰Â@m‰Â`p‰Â v‰Âà|‰Â ƒ‰Â@†‰Âà•‰Âà•‰Â€¥‰Â€¥‰Â™‰Â œ‰Â œ‰Â œ‰Â@Ÿ‰Â`¢‰Â ¨‰Â µ‰Â€¾‰Â²‰Â`»‰Â µ‰Â Á‰Â`»‰Â Á‰ÂˉÂ@щÂ@щÂˉÂˉÂˉÂ@щ€׉ ډÂ`í‰Â ç‰Â ç‰Â`í‰Âàà‰Â ç‰Â€ð‰Â@ê‰Â`í‰Â€ð‰Âàù‰Â€ ŠÂ  ŠÂ  ŠÂÀŠÂŠÂ`ŠÂ€"ŠÂà+ŠÂà+ŠÂ %ŠÂ€"ŠÂ %ŠÂà+ŠÂ/ŠÂ€;ŠÂ@5ŠÂ/ŠÂ 2ŠÂà+ŠÂ >ŠÂ >ŠÂàDŠÂ >ŠÂàDŠÂàDŠÂ KŠÂ >ŠÂàDŠÂ WŠÂ WŠÂ WŠÂà]ŠÂ€TŠÂÀZŠÂ dŠÂ dŠÂ dŠÂà]ŠÂàvŠÂ }ŠÂÀsŠÂàvŠÂzŠÂ }ŠÂ }ŠÂ }ŠÂ`ƒŠÂ€†ŠÂ`ƒŠÂ`ƒŠÂ@€ŠÂ@€ŠÂ€†ŠÂ –ŠÂ“ŠÂ@™ŠÂ@™ŠÂ€ŸŠÂ ¯ŠÂ@²ŠÂਊÂ`œŠÂ€ŸŠÂ€ŸŠÂਊÂ@²ŠÂ`µŠÂ€¸ŠÂ Ȋ€ъ€ъ Ȋ Ԋ áŠÂ áŠÂ ÔŠÂàÚŠÂ`ΊÂÀ׊ÂàÚŠÂÞŠÂ áŠÂ áŠÂàÚŠÂàÚŠÂ`çŠÂ íŠÂàóŠÂ@ýŠÂ÷ŠÂ úŠÂ÷ŠÂ€‹ÂÀ ‹Â ‹Â€‹Â@ýŠÂ úŠÂÀðŠÂ ‹ÂÀ ‹Âà ‹Â ‹Â@‹Â ‹Â`‹Â`‹Â‹Â€‹Âà%‹Â)‹Â@/‹Â€5‹Â`2‹Â`2‹Â€5‹Â 8‹Âà>‹ÂB‹Â€5‹Â`2‹Â E‹Â`K‹Â`K‹Â E‹Âà>‹Âà>‹Â E‹Â@H‹Â E‹Âà>‹Â E‹Â`K‹Â€N‹Â`K‹ÂÀT‹Â j‹Âàp‹ÂÀm‹Â j‹ÂÀT‹Â`d‹Ât‹Â w‹Â@z‹Âàp‹Â€g‹Â€g‹Â€g‹Âàp‹Â`}‹Âàp‹Â w‹Ât‹Â w‹Â€€‹Â€€‹Â€€‹Â€€‹Â ƒ‹Âà‰‹Â ƒ‹Â‹Â@“‹Â@“‹Â`–‹ÂࢋÂ`–‹Â`–‹Â¦‹Â@¬‹Â@¬‹Â€²‹Â`¯‹Â ©‹Â`¯‹Â µ‹ÂÀ¸‹ÂÀ¸‹Â໋¿‹ÂÀ¸‹Â µ‹Â ‹Â@ŋ€ˋÂÀы ΋Â@Å‹Â`ȋ¿‹Â¿‹Â`ȋ ΋€ˋ µ‹Â¿‹Â໋€²‹Â@¬‹Â`¯‹ÂÀŸ‹Â ‹Â‹Â€€‹Â`}‹ÂÀm‹Ât‹Ât‹Â j‹ÂàW‹Â€N‹Â€N‹Â€5‹Âà>‹ÂB‹Â 8‹Â`2‹Â 8‹Â 8‹Âà%‹Â)‹Â ‹Â@‹Â ‹Â€‹Â€‹Â@‹Âà ‹Â‹ÂÀ ‹ÂÀ ‹Â ‹Â ‹ÂÀ ‹Â ‹Â ‹Â ‹Â ‹Â ‹ÂÀ ‹Â ‹Â‹Â ‹Âà ‹ÂÀ ‹Â ‹Âà ‹Â ‹Âà ‹Âà ‹Â ‹Âà ‹Â@ýŠÂ@ýŠÂ€‹Â`‹Â€‹Âà ‹ÂàóŠÂÀðŠÂàóŠÂ`‹Â`‹Â ‹ÂÀ ‹Â€‹Â€‹Â`‹Â€‹Âà ‹Âà ‹ÂÀ ‹ÂÀ ‹Â ‹ÂÀ ‹Â‹Â ‹Â€‹Â ‹Â`‹Â€‹Â ‹Â@‹Â ‹Âà ‹Â ‹Â ‹Â ‹Â ‹Â ‹Â ‹Âà ‹Â ‹Âà ‹Âà ‹Â‹Â‹Â‹Â ‹Â ‹Â€‹Â ‹Â@‹ÂÀ"‹Âà%‹Âà%‹Â ‹Â ,‹Âà%‹Â ,‹Â`2‹Â ,‹Â ,‹Â)‹Âà%‹ÂÀ"‹Âà%‹Â@/‹Â ,‹Â ,‹Â)‹Â@/‹Â ,‹Â€5‹Â 8‹Â@H‹ÂB‹ÂÀ;‹Â€5‹Â`2‹Â`2‹Â 8‹Â 8‹Â ,‹ÂÀ"‹ÂÀ"‹Â ,‹Â 8‹Â E‹Â€N‹Â@H‹Â E‹ÂÀ;‹ÂÀ;‹Âà>‹ÂB‹ÂÀ;‹Â`2‹Â`2‹Â€5‹Â 8‹Â 8‹Â`2‹Â`2‹ÂB‹Â 8‹Â E‹Â Q‹ÂàW‹Â`K‹Â E‹Â E‹Â E‹Â@H‹ÂÀT‹ÂB‹Â Q‹Â`K‹Â E‹Â Q‹Â Q‹ÂÀT‹Â ^‹Â€g‹Â`d‹Â`d‹ÂàW‹Â@H‹ÂàW‹Â ^‹ÂàW‹Â Q‹Â`K‹ÂÀT‹Â Q‹ÂÀT‹ÂàW‹Â Q‹Â`d‹Â€g‹Â ^‹Â ^‹Ât‹Â@a‹Â j‹Â€g‹Â ^‹Â@a‹ÂÀT‹Â`d‹Â[‹Â[‹Â`d‹Â ^‹Â ^‹Â€g‹Â@z‹Â j‹Â j‹ÂÀm‹Â j‹ÂÀm‹Â j‹Â w‹Â j‹Â j‹ÂÀm‹Ât‹Â j‹Â w‹Â w‹Âàp‹Â w‹Ât‹Ât‹ÂÀm‹Â w‹Â`}‹Â ƒ‹Â w‹Â`}‹Â€€‹Â ƒ‹Â`}‹Â ƒ‹Âàp‹Â w‹Â w‹Â€€‹Â w‹Â`}‹Â ‹Â ‹Â`–‹Â`–‹Â œ‹Âࢋ ‹Â ƒ‹Â ƒ‹Âà‰‹Â ‹Â‹Â ‹Â`–‹Â ‹Â ‹Â€™‹Â€™‹ÂÀŸ‹Â¦‹Â¦‹Â ©‹Â œ‹Â œ‹Â œ‹Â@¬‹Â œ‹Â€™‹ÂÀŸ‹Â œ‹Â`¯‹Â€²‹Â ©‹Â`¯‹Â`¯‹Â`¯‹Â œ‹ÂࢋÂࢋÂࢋÂÀŸ‹Â ‹Â@“‹ÂÀŸ‹Â ©‹Â ©‹Â@¬‹Â€²‹Â໋ µ‹Â µ‹ÂÀ¸‹Â໋Â`ȋ ‹€ˋÂàԋ€ˋÂ@Å‹Â`È‹Â@ŋ¿‹Â@ŋ€ˋ ‹Â@ŋ ‹Â@Å‹Â໋Â໋ÂÀ¸‹Â`¯‹ÂÀ¸‹Â€²‹ÂÀ¸‹Â¿‹Â¿‹Â Î‹ÂÀы€ˋ ΋€ˋ€ˋÂ`ȋ ‹¿‹Â`ȋ ۋ ۋ ۋ ۋÂ`á‹Â Û‹ÂØ‹Â€ä‹Â€ä‹Â؋ ΋ ΋Â`ȋ ΋ ۋÂ`á‹Â`á‹Â Û‹ÂàÔ‹ÂàÔ‹Â`á‹Â€ä‹Â`á‹Â@Þ‹Â`á‹Â€ä‹Â`á‹Â ç‹Â`á‹Âàí‹Â€ý‹Â`ú‹Â€ý‹Â`ú‹Â ŒÂàŒÂ ŒÂ ô‹Âàí‹Â€ý‹Â€ý‹ÂÀŒÂàŒÂ ŒÂ ŒÂ@ŒÂ`ŒÂàŒÂàŒÂ€ý‹Â ŒÂÀŒÂÀŒÂ ŒÂ ŒÂ ŒÂ€ŒÂàŒÂ€ŒÂ ŒÂ &ŒÂÀŒÂ ŒÂ`ŒÂ`ŒÂ ŒÂ ŒÂ@ŒÂ€ŒÂ &ŒÂ€/ŒÂ@)ŒÂ€/ŒÂ`,ŒÂ€/ŒÂàŒÂÀŒÂ &ŒÂà8ŒÂà8ŒÂ`,ŒÂ`,ŒÂ@)ŒÂ &ŒÂ@)ŒÂ`,ŒÂ &ŒÂàŒÂàŒÂÀ5ŒÂà8ŒÂÀ5ŒÂ€/ŒÂ 2ŒÂ<ŒÂ<ŒÂ`EŒÂ@BŒÂ ?ŒÂ@BŒÂ ?ŒÂÀ5ŒÂà8ŒÂ€HŒÂ KŒÂàQŒÂàQŒÂ XŒÂ@[ŒÂ€aŒÂUŒÂ@[ŒÂ dŒÂàQŒÂ ?ŒÂ ?ŒÂàQŒÂ XŒÂ`^ŒÂ dŒÂàjŒÂ dŒÂ`^ŒÂàjŒÂàjŒÂàjŒÂ dŒÂàjŒÂ`wŒÂ€zŒÂ‡ŒÂÀ€ŒÂÀ€ŒÂnŒÂnŒÂ€zŒÂ }ŒÂ€zŒÂ }ŒÂ }ŒÂ`wŒÂ }ŒÂàƒŒÂ }ŒÂàƒŒÂ }ŒÂ }ŒÂàƒŒÂ ŠŒÂàƒŒÂ ŠŒÂ`ŒÂÀ™ŒÂ –ŒÂ`ŒÂ@ŒÂ`ŒÂ ŠŒÂ@ŒÂ ŠŒÂàœŒÂàœŒÂ ŒÂ@¦ŒÂàœŒÂ £ŒÂ@¦ŒÂ@¦ŒÂ`ŒÂ –ŒÂ ŒÂ`©ŒÂ`©ŒÂ £ŒÂ ŒÂ`©ŒÂÀ²ŒÂൌ ¯ŒÂÀ²ŒÂ ¯ŒÂൌÂൌÂ`©ŒÂ@¦ŒÂ £ŒÂ`©ŒÂ@¦ŒÂ ¯ŒÂ`©ŒÂÀ²ŒÂൌ¹ŒÂ ¼ŒÂ`ÂŒÂ`Œ Ȍ Ȍ ȌÂ`Œ ȌÂ@¿ŒÂ ÈŒÂ ÕŒÂÒŒÂàÎŒÂàÎŒÂ`Œ ȌÂÒŒÂÀˌ ȌÂÀËŒÂ`ی€ތÂ@، ՌÂ@، Ռ ՌÂ`ÛŒÂ`ی áŒÂëŒÂ úŒÂ`ôŒÂ€÷ŒÂ`ôŒÂ  Â`ôŒÂëŒÂ îŒÂÀýŒÂ`ôŒÂ úŒÂ îŒÂ€÷ŒÂÀýŒÂ úŒÂàÂÂ` Â` Â@ €€Â` Â@ €Â` € ÂàÂà€Â` ÂÂàÂ`  Â` ÂÀÂà   Âà    €   Â`&€)€)Â`&Âà2 9ÂÀ/ 9 9 , ,€)ÂÀ/ 9 9 ,Â`&Â@#     ÂÂ`&€)ÂÀ/Âà‘ ²¯ÂjÇ ¥ÆÂ µ»Âd¯Â ƒ¤Â ”›Â`y”ÂÀ¦ŽÂ€½…€­B€XþÁ€†¼Á€×‰ÁTÁ Œ@‡¥A€iBçGB†lBàB@Ð…B@·…B <‚B€®xB€ÖiB€ñXB€GB5BÀs#B€ìBrB€lêA4ÐA€¸AÑ¡A³AæuA×RAŠ1A7AÂâ@¬£@DE@(‡?ðk¿<>À¢ÀèäÀÁÁ½5ÁÂ@@ BÂPCÂ|DÂ@•E»FµGÂ@ƒH€8IÂÀíI€}JÂÀKÂKÂ@ LÂÀLÂMÂÀqMÂ@ÉMÂ@FN€°NÂ@OÂÀeO€ÃOÂÀûO€@P€rPÂ@·P€QÂ@4QÂ@QÂ@±Q€RÂ@.RÂÀlRÂÀ…RÂ¥RÂ@ÄRÂ@ÝRÂ@öRÂ@(SÂ@sS¸SÂÀãSÂ@ TÂ@"TÂ@"TÂNTÂgTÂÀ’TÂ@ŸTÂ@ÑTÂÀÝTÂÀUÂ/U€TUÂ@gUÂÀŒU¬U€ÑUÂ@ËUÂÞUÂÀ VÂ)VÂ@HV€gVÂVÂV€™VÂ@“VÂÀ¸VÂØVÂñVÂ@WÂÀW€/W€aW€zWÂ@tWÂÀ€WÂÀ²WÂÀäWÂ@ñWÂÀýWÂXÂXÂÀXÂ@`ÂQ`Â@p`€v`Â@‰`€¨`Â@í`ÂaÂ@a€%aÂÀ+aÂÀ+aÂ@QaÂ@ƒaÂÀva€¢aÂ@µaÂÈaÂáaÂ@ça€bÂEbÂÀWbÂ@}b€jbÂÀ‰bÂÀ¢b€çbÂ@cÂ@,cÂXcÂ@wc£cÂÀµc€ÈcÂ@ÂcÂÕcÂ@Ûc€úc€,dÂ@?dÂkdÂ@ŠdÂ@£dÂÏd€ôdÂeÂÀ,eÂ@Re€XeÂee—e°eÂ@ÏeÂ@fÂÀ fÂÀ&fÂFfÂ@efÂ@ef€fÂ@ÉfÂÀîfÂõf€gÂ@gÂÀ9gÂÀRgÂYgÂÀgÂ@ªgÂ@ÃgÂ@ÜgÂÀègÂ@õgÂ@õgÂÀ3hÂlhÂ@rhÂÀ—hÂ@¤hÂÐhÂéhÂ@!iÂi€@iÂÀ_i€riÂÀxiÂÀ‘iÂÀÃiÂ@ÐiÂãiÂüi€!j€:jÂGjÂ@MjÂ@MjÂ@fjÂÀ¤jÂ@Êj€éjÂkÂ@.k€4kÂZkÂÀ…kÂÀ·kÂ×k€ãkÂÀlÂÀlÂÀl€.l€GlÂ@ZlÂÀlÂ@¥lÂÀÊl€ÝlÂ@ mÂ5m€ZmÂgm€mÂÀym€ŒmÂ@¸mÂ@Ñm€×mÂÀömÂ@n€"n€;nÂ@NnÂ@gnÂÀŒnÂÀ¥nÂÅn€ÑnÂ@änÂÀðn€oÂ)oÂÀ;oÂ@HoÂ@ao€€oÂ@¬oÂ@ÅoÂÀêo€äoÂ@÷o€pÂÀ5p€HpÂnpÂÀ€p€zpÂ@¦pÂ@¿pÂ@¿p€Åp€÷pÂqÂÀqÂ@#qÂÀaqÂ@nqÂ@‡qÂ@ q³q€¿qÂÌq€ñqÂÀ)rÂ@6rÂ@Or€nrÂ{r€nr€‡rÂÀ¦rÂÀØrÂÀñr€sÂsÂ@0s€OsÂÀ‡s§sÂÀ¹sÂ@ÆsÂ@ßs€åsÂ@øsÂÀtÂÀtÂ$t€0t€It€btÂ@ut¡tÂÀ³t€ÆtÂ@ÙtÂ@òtÂÀþtÂÀuÂ7uÂ@$uÂÀ0uÂÀIuÂÀ{u€ŽuÂÀ­uÂÍuÂ@ìu€òuÂÿuÂÿuÂvÂÀ*vÂ1v€=v€VvÂ@‚vÂ|vÂ@›vÂÀ§vÂÀÀvÂÀÀvÂùvÂ@wÂ+wÂDwÂ@JwÂ@cw€‚wÂÀˆwÂ@®wÂ@ÇwÂÀìwÂÀxÂ%xÂ@+xÂWxÂWx€|x€•xÂ@¨x»x»xÂ@ÁxÂíxÂy€y€+yÂ8yÂ@WyÂjyÂ@‰yœy€¨yÂ@»yÂÀàyÂÀùyÂzÂ@zÂÀzÂÀzÂÀ+zÂ@8zÂ@QzÂÀzÂ@µzÂázÂ@çzÂÀóz€{ÂÀ%{ÂÀ%{€8{ÂÀ>{Â@K{Â^{Â@}{ÂÀ‰{€œ{©{ÂÀ»{Â@È{Â@á{ÂÀí{ÂÀ|Â@,|€2|ÂÀ8|ÂÀQ|ÂÀj|ÂÀƒ|Â@©|¼|ÂÀÎ|ÂÀÎ|ÂÀç|Â}ÂÀ}ÂÀ}ÂÀ2}ÂÀK}Âk}€}ÂÀ–}Â@Š}ÂÀ–}€Â}Â@î}Â~Â@~€&~Â@9~ÂÀE~ÂL~ÂÀw~Â@„~€q~ÂÀw~—~Â@¶~€¼~ÂÉ~Âû~ÂÀô~Â@€9ÂÀXÂ@eÂx‘ÂÀŠ€ÂÀ¼€ÏÂ@âÂ@âÂõÂ`€Âà€Â €Â #€Â /€Â <€ÂÀK€Âk€Âàg€Â a€Âàg€Âàg€Â n€Âk€Â z€Â z€Â@Š€Â€Â ¬€Âಀ¶€Â@¼€ÂàË€Âàä€Â`ñ€Â€ô€ÂÀú€Â   Âà Âà/Âà/€?ÂÀEÂàHÂàHÂ`U [ÂÀ^ h€qÂÀw Âà“ ¦Â ¦Â°Â`¹Â ¿ÂàÅ Ì ØÂ ØÂ`ë€î ñ ñ ñÂû  ‚  ‚ ‚ #‚Âà)‚Â`6‚ <‚ÂÀX‚ÂÀX‚Â_‚Â@e‚ÂÀq‚ {‚Âx‚ n‚ {‚€„‚ ‡‚ ‡‚ ”‚Âং ­‚Â@É‚ÂàØ‚ÂÜ‚ÂÜ‚ÂàØ‚Â`å‚ÂÀî‚Â@û‚€ƒÂ ƒÂ€ƒÂ 6ƒÂ`0ƒÂ@-ƒÂ`0ƒÂÀ9ƒÂ CƒÂ CƒÂÀRƒÂÀRƒÂ hƒÂ uƒÂànƒÂ hƒÂ€eƒÂ@xƒÂ€~ƒÂ ŽƒÂ šƒÂ §ƒÂ §ƒÂ€°ƒÂ ³ƒÂ ³ƒÂใ½ƒÂ€ÉƒÂÀσ ̃Â@܃ åƒÂ€ûƒÂ þƒÂïƒÂ òƒÂÀ„ „ÂÀ„ $„ 0„Â:„Â@@„ÂàO„Â@Y„Â`\„€_„Âl„Âàh„ o„ o„Â@r„Â`u„Â@‹„ ¡„Âàš„Â ¡„€ª„Â`§„ÂÀ°„€Ä ӄÂ@ք ߄Â`Ù„Â@ք€܄Âàå„ÂÀû„Â` … …Âà… … *…Â4… C…Â@S… P… P… \…€Y…Âf… i…Â@l…€r… u…Âà{…ÂÀx…ÂÀx…Âà{…Â… ‚…Âà”…Â@ž… ›… §… §… §…ÂÀª…Â`º…€½…€½…ÂàÆ…ÂÊ…Â@Ð…Âàß…Âàß…Â æ…Â`ì… ò… ÿ…€†Âà†ÂÀ†Âà†Â@†Â†Â@†Â`†ÂÀ'†Âà*†ÂÀ'†Â@4†Â =†ÂàC†Â J†Â J†Â V†Â V†Â`†Â`†ÂÀY†Âà\†Â`†Â@f†Â o†Ây†Âàu†Â ˆ†Â`‚†Â ˆ†Â ˆ†ÂàŽ†ÂÀ‹†ÂÀ‹†Â •†Â€ž†ÂÀ¤†Â৆Â`´†Â º†ÂàÀ†ÂĆ dž ӆ ӆÂ݆ à†Â ì†Â ù†Â@ü†Âö†Â@ü†Â@ü†Â@ü†Â ‡Âà ‡Â`ÿ†Â`ÿ†Â ‡Â‡Â€‡Â ‡Â +‡Â€4‡Â 7‡Â`1‡Âà=‡Â 7‡Â D‡Â@G‡ÂZ‡Â`c‡Â i‡Â`c‡Â ]‡Â`c‡Â`c‡ÂÀl‡Âs‡ÂÀ…‡ÂÀ…‡Â@’‡Â ‡Â ›‡Â ¨‡Â¥‡Â ¨‡Âࡇ ¨‡ÂࡇÂ@«‡Â ´‡Â@ć Á‡Â`LJ€ʇÂ@݇ÂÀé‡Â@݇Â`à‡Âàì‡Âàì‡Âàì‡Âð‡Âð‡Â ó‡Â ÿ‡ÂàˆÂ ˆÂ ˆÂ€ˆÂ %ˆÂ`+ˆÂ`+ˆÂ %ˆÂà7ˆÂ WˆÂ`]ˆÂ cˆÂÀfˆÂàiˆÂÀfˆÂ€`ˆÂ cˆÂ pˆÂ |ˆÂ`vˆÂ |ˆÂ†ˆÂ†ˆÂ |ˆÂ`ˆÂ •ˆÂ •ˆÂà›ˆÂ ¢ˆÂ ¢ˆÂ ¢ˆÂ ®ˆÂ¸ˆÂà͈Âà͈Âà͈ Ԉ€݈€݈Â@׈Â`ÚˆÂêˆÂàæˆÂ àˆÂàæˆÂêˆÂÀãˆÂàæˆÂ`óˆÂ ùˆÂàÿˆÂ ‰ÂÀ‰Â‰Â@"‰Â`%‰Â€(‰ÂÀ.‰ÂÀ.‰Â5‰Âà1‰Â +‰Â +‰Â +‰Â€(‰ÂÀ.‰Â +‰Â€A‰Â Q‰ÂÀ`‰Â j‰Â v‰Â v‰Âà|‰Â j‰Â€s‰Â ƒ‰Â`‰‰Â€Œ‰ÂÀ’‰Â ‰ÂÀ’‰Âà•‰Â ‰Â@Ÿ‰Â€¥‰ÂÀ«‰Â ¨‰Â@Ÿ‰Â ¨‰Â`»‰Â`»‰Â€¾‰ÂàljÂ@щ ډ ډÂàà‰Â ΉÂ@щÂä‰Â@ê‰Â@ê‰Â`í‰Â ç‰Âä‰Â ç‰Â ŠÂàù‰Â€ ŠÂ`ŠÂ€ ŠÂ  ŠÂÀŠÂàŠÂÀŠÂ ŠÂ ŠÂ 2ŠÂ€;ŠÂÀAŠÂÀAŠÂHŠÂ >ŠÂ >ŠÂÀAŠÂàDŠÂÀAŠÂ`QŠÂ KŠÂ WŠÂ`jŠÂ dŠÂ dŠÂÀZŠÂ dŠÂ@gŠÂ@gŠÂ`jŠÂàvŠÂ@€ŠÂàŠÂ –ŠÂ`œŠÂÀ¥ŠÂÀ¥ŠÂ¬ŠÂÀ¥ŠÂਊ€ŸŠÂ ¯ŠÂ ¯ŠÂ`µŠÂ€¸ŠÂàÁŠÂÀ¾ŠÂ€¸ŠÂ@²ŠÂ »ŠÂ »ŠÂ ÈŠÂ ÈŠÂ ÈŠÂ@ˊ ԊÂÞŠÂàڊ ԊÂàÚŠÂàÚŠÂ áŠÂ€êŠÂÀðŠÂ€‹Â€‹Âà ‹Â`‹Â@ýŠÂ ‹Â`‹Â€‹ÂÀ ‹Â`‹Â`‹Â ‹Â ‹Âà ‹Âà ‹Â ‹Â`‹ÂÀ"‹Â ‹Â@/‹Â 8‹Â E‹ÂB‹Âà>‹ÂB‹Â@H‹Â€N‹ÂàW‹Â[‹Â ^‹Â j‹Â€g‹Â`d‹Â`d‹Â j‹Ât‹Âàp‹Â j‹Â@z‹Â€€‹Âà‰‹ÂÀ†‹Âà‰‹Â ƒ‹Â€€‹Â ƒ‹Â`–‹Â`–‹Â œ‹Â ©‹Â@¬‹Â`¯‹Â€²‹Â໋Â໋Â@ŋ€ˋÂ`È‹Â໋Â`¯‹Â µ‹Â µ‹ÂÀ¸‹Â ‹ ‹ÂÀÑ‹ÂÀê‹Â ç‹Â`á‹Â`á‹Â ç‹Â ô‹Â ô‹Â€ý‹Â`ú‹Â ŒÂ ŒÂÀŒÂ€ý‹Â ŒÂàŒÂÀŒÂ ŒÂ@ŒÂÀŒÂ`ŒÂ ŒÂ@ŒÂàŒÂ ŒÂ#ŒÂ`,ŒÂ@)ŒÂ@)ŒÂ@)ŒÂ 2ŒÂ 2ŒÂ 2ŒÂ ŒÂ ŒÂàŒÂ€/ŒÂ<ŒÂ@BŒÂ€HŒÂàQŒÂUŒÂàQŒÂ`EŒÂ`EŒÂ KŒÂ XŒÂ€aŒÂ`^ŒÂ@[ŒÂàjŒÂ qŒÂ@tŒÂÀ€ŒÂ }ŒÂ€zŒÂ€zŒÂ }ŒÂ€zŒÂ qŒÂ`wŒÂ`wŒÂ€“ŒÂ€“ŒÂ`ŒÂàƒŒÂ‡ŒÂ –ŒÂàœŒÂÀ™ŒÂ –ŒÂàœŒÂ –ŒÂ ŠŒÂ ŒÂ £ŒÂ`©ŒÂ ¯ŒÂ £ŒÂ ¯ŒÂ¹ŒÂÀ²ŒÂ ¯ŒÂ`Œ€ŌÂ`ÂŒÂÀˌ ՌÂ`Œ€Ō€Ō€Ō€Ō ՌÂ@،€ތ áŒÂ áŒÂ áŒÂ áŒÂ áŒÂÀäŒÂÀäŒÂëŒÂ áŒÂàçŒÂÀäŒÂ áŒÂëŒÂÀäŒÂ îŒÂ îŒÂà Â` Â`  €Â`  ÂÀÂ`&   Â   ÂÀ/Âà2Â6Â6Â@< 9 9 ,Â`&€) , ,Â`&Â6Â@< 9 EÂ`?Â`? 9 E 9Â6 9€BÂÀH RÂàd€[Â@U EÂàKÂàK RÂàKÂÀHÂàKÂÀH RÂàKÂàK€[ ^ÂÀa k ^ÂÀaÂàd ^Â`XÂ`XÂÀa kÂÀaÂh w€t wÂ@n wÂÀzÂ@‡ÂÂ@‡Â@‡ÂšÂà–Âà–Âà–€Â@ Â`£Â ©Â ©Âà¯Â³ÂÀ¬Âà¯Â€¦Â€¦Â€¦Â`£Âà¯ÂÀ¬Â ©Â ©ÂÀ¬Â ¶Â`¼Â Â€¿ÂÀÅÂ`Õ Ï ÏÂÌÂàÈÂàÈÂÌÂ@ÒÂ`ÕÂ@ÒÂÌÂ̠Ϡ۠ϠπØÂ€ØÂå è èÂåÂàá€ØÂ ÛÂåÂ@ë ô è ôÂþÂàúÂàúÂàúÂàú ŽÂ ôÂþ ŽÂ  ŽÂàŽÂ` ŽÂàŽÂÀŽÂàŽÂŽÂ@ŽÂ@ŽÂŽÂ &ŽÂŽÂŽÂ@ŽÂ€#ŽÂ€#ŽÂ€#ŽÂ ŽÂ€#ŽÂ 3ŽÂ@6ŽÂ ?ŽÂ ?ŽÂàEŽÂ LŽÂ LŽÂ ?ŽÂ ?ŽÂàEŽÂ@OŽÂ€UŽÂ XŽÂ LŽÂàEŽÂ@OŽÂ ?ŽÂ ?ŽÂ LŽÂ@OŽÂà^ŽÂà^ŽÂbŽÂbŽÂ@hŽÂ eŽÂ XŽÂÀ[ŽÂà^ŽÂà^ŽÂ eŽÂ`kŽÂ`kŽÂ qŽÂàwŽÂ@ŽÂ`„ŽÂ`„ŽÂ€‡ŽÂàwŽÂ ~ŽÂ ~ŽÂ ~ŽÂ@ŽÂàwŽÂ ~ŽÂ{ŽÂ€nŽÂ qŽÂ€nŽÂ€nŽÂ qŽÂ{ŽÂ@ŽÂ@ŽÂ`„ŽÂ`„ŽÂàŽÂÀŽÂ £ŽÂ`ŽÂ@šŽÂ —ŽÂ —ŽÂ —ŽÂ —ŽÂàŽÂ —ŽÂ £ŽÂ€ ŽÂ £ŽÂ੎€ ŽÂ £ŽÂ`ŽÂÀ¦ŽÂ £ŽÂ€ ŽÂ€ ŽÂ £ŽÂ­ŽÂ °ŽÂ £ŽÂ”ŽÂ —ŽÂ`ŽÂ £ŽÂ੎ £ŽÂ­ŽÂ€¹ŽÂ °ŽÂ ¼ŽÂ ¼ŽÂÀ¿ŽÂàŽ ¼ŽÂ­ŽÂ੎ °ŽÂ­ŽÂ °ŽÂ °ŽÂ °ŽÂ °ŽÂ °ŽÂ`¶ŽÂ`¶ŽÂàÂŽÂ ÉŽÂ`¶ŽÂ °ŽÂ °ŽÂ@³ŽÂ °ŽÂ °ŽÂ€¹ŽÂàŽ Ɏ ¼ŽÂ ¼ŽÂàÂŽÂàÂŽÂÀ¿ŽÂàÂŽÂàÂŽÂ ÉŽÂàÂŽÂ@ÌŽÂàÛŽÂ âŽÂ ÕŽÂ ÕŽÂÀ؎ ՎÂÀØŽÂ`ÏŽÂ`ÏŽÂ ÉŽÂߎÂߎ âŽÂ âŽÂ âŽÂ âŽÂàÛŽÂ âŽÂ âŽÂ@åŽÂ`èŽÂ`èŽÂàôŽÂ ûŽÂ` ûŽÂàôŽÂ ûŽÂøŽÂ ûŽÂ îŽÂ ûŽÂ` ûŽÂ ûŽÂ ûŽÂà €Â@þŽÂ ûŽÂ`ÂøŽÂøŽÂ` ûŽÂøŽÂ îŽÂ ûŽÂ ûŽÂøŽÂ ûŽÂàôŽÂøŽÂ ûŽÂ`  ûŽÂ@þŽÂ€Âà Â@  ûŽÂøŽÂ îŽÂ âŽÂ@åŽÂ@åŽÂ îŽÂ`èŽÂàôŽÂøŽÂ@þŽÂ ûŽÂàôŽÂàôŽÂøŽÂ`ÂÀñŽÂÀñŽÂ ûŽÂ ûŽÂ ûŽÂ îŽÂ@åŽÂàôŽÂ ûŽÂ ûŽÂ@þŽÂ ûŽÂ ûŽÂ€   ÂÀ Âà Â`ÂÂà Âà Â@þŽÂ ûŽÂ îŽÂ€ëŽÂàôŽÂÀñŽÂøŽÂ@þŽÂ€Âà Âà  ÂÀ   Â`€  Â`Â` €Âà   Â@ÂÀ#  €Â`  Â@0ÂÀ#ÂÀ#Âà&€6 -Âà&Â*Â*Â*Â`3 9€6 9Âà?ÂÀ< -ÂÀ# -€  €€€ -Â`3Â`3 - -Â*Â@0 9€6Â`3ÂÀ<Âà? F 9Â`3Â`3Â`3ÂÀ<Âà? 9ÂÀ<ÂÀ<ÂÀ< 9ÂÀ< F FÂà?ÂÀ<Âà?ÂCÂÀ<Âà? F F FÂÀ<Âà?ÂCÂ@I R RÂ`LÂCÂ@I _ _Â\Â@bÂàX€OÂ\ RÂ@I FÂ`L F€O€O R€O R RÂÀUÂ\ _Â\ _ k€h€hÂ\ÂÀU RÂ`L _ kÂàq kÂ`eÂàq xÂu x kÂ@bÂ\ÂÀUÂàX€h kÂÀn€hÂàqÂÀn€hÂ`e kÂu xÂàqÂàqÂuÂu x€€ÂàŠÂ „Â@{ xÂàqÂàqÂÀnÂ@{Â`~Â`~ „ x x xÂàqÂÀn€h xÂ`~ „ ‘ÂÀ‡Â „Â`~Â@{ „ÂÀ‡ÂŽÂŽÂ`—Â`—Â`—Ž „ „ „ÂàŠÂàŠÂàŠÂ „Â`—Â`— ‘Â@” Â`—   ŽÂ`— Â@”Â@”Â`—€šÂ Â Â€šÂ`—€šÂ€šÂ ‘Â@”Â`—Â`—Â@”Â`—Â`—Âà£ÂÀ Â@” ‘ÂŽÂ@”€šÂ€šÂ Âà£Â§Â`°Â€³Â ¶Â ¶Â€³Â€³Â ªÂ ªÂà£Â€šÂ Âà£Â@­Â€³Â`°Â@­Â ªÂ`°Â ¶Â`°Â ªÂ@­Â`°Â ¶Â€³Âà£Âà£Â€šÂ Â ªÂÀ Â ªÂ ¶Â ¶Â€³ÂÀÂà¼ÂÀ ¶Â ¶ÂÀ¹ÂÀ¹Â ¶Â ¶Â`°Â@­Â€³Â@­ÂÀ¹ÂÀÂÀ¹Âà¼Â à¶Âà¼Â`É ¶Âà¼Âà¼ÂÀ€Ì Ã Ã€ÌÂàÕ€ÌÂà¼ÂÀ¹Âà¼Âà¼Â ÃÂà¼Â ÃÂ`ÉÂà¼Â`ÉÂ`É€ÌÂà¼Â ¶Â ÃÂ@ÆÂ€ÌÂÀÒ Ü Ï ÏÂ`É€ÌÂÀÒÂÀÒ ÃÂÀ ÃÂÀ Ï Ï ÏÂàÕÂ`ÉÂ`É€ÌÂ`ÉÂÀÒÂÀÒ Ü ÜÂàÕ ÜÂàÕÂÀÒÂàY“£±Â ¸ÉÂ`5É K¾Âà²Â€ §Â` žÂ ä– !‘Â`¨ˆÂÀK€ €˜ëÁ€¯ÊÁ€ŠšÁ5"Á K@ÊžAæB€óGB€ŒmB@èBÀ½†BÀ½†B€3ƒB@ƒzBÀ·kBÀ[BEIB47B€z%B€•BéBíA ÓA€s»AÒ¥A´‘A¶}A\ZAö8AôAÞî@®@ÀZ@¯?0¿ô0ÀF›ÀÝÀÀÁ£1ÁTSÁuÁ€‹Á€R›Á€¡«ÁË»Á€ôËÁˆÛÁÄêÁ€vùÁ@ª€" Â=Â@íÂ@LÂ@. ¿$ÂÀë(€´,Â,0Â@R3Â!6€ž8ÂÀü:ÂÀð<ÂÀ²>ÂÀ[@€åAÂ@VC€¡DÂÁEÂÀÍFÂÀÇG¯H€œIÂÀQJÂ@ôJÂ@£KÂÀ,LÂ@¶LÂ@3MÂ@ÉMÂÀ9NÂ@ªNÂÀOÂ@rOÂÀâO€@P€¤P€QÂ@fQ€žQÂ@ãQÂÀ!RÂ@`RÂ@’RÂÀ·RÂÀÐRÂ@öRÂ"SÂ@ASÂÀS€«SÂÀüSÂÀ.TÂ@;TÂÀyTÂ@†TÂÀ’T€¾TÂ@ÑT€ðTÂ/UÂHUÂ@gU“U“U¬UÂ@ËUÂ@äUÂÀ VÂ@VÂ@/V€gVÂÀmVÂV¦VÂ@ÅVÂ@ÞVÂ@÷VÂ#WÂÀ5WÂUWÂ@tWÂÀ™WÂ@¦WÂ@¿WÂÀäWÂ@ñWÂX€)XÂOXÂ@nXÂXÂÀ¬X€ØXÂ@ÒXÂÀ÷XÂÀY€#YÂÀ)YÂÀBYÂÀ[Y”YÂ@šYÂÀ¦YÂ@³YÂÀØYÂ@þYÂ@IZÂ@bZÂÀ‡Z€šZÂ@­ZÂÀZÂÀëZÂÀëZÂ@ßZÂÀëZÂÀ[Â$[Â@*[€I[Âo[€{[¡[ÂÀÌ[Â@Ù[Âì[€ø[ÂÀ\Â7\Â@V\ÂÀ{\›\ÂÀ­\ÂÀÆ\€Ù\Â@ì\Â@ì\ÂÀ]Â@7]€V]Â@i]Â@›]€º]ÂÇ]€ì]Â@ÿ]Â@1^Â@1^ÂÀV^ÂÀo^ÂÀ¡^ÂÀº^Â@à^Â@ù^Â@_€1_ÂÀP_ÂÀi_Â@_ÂÀ´_ÂÔ_Âí_ÂÀ`€D`Âj`ƒ`€`ÂÀ®`Âç`ÂÀaÂÀ+aÂÀ+aÂKaÂ@QaÂ}aÂ@œaÂ@µaÂ@ÎaÂÀÚaÂÀ bÂ@2bÂ^bÂ@}b€ƒb€œb€µbÂÀÔbÂÀíbÂ@úbÂÀcÂ@EcÂXcÂ@cÂ@c¼c€ÈcÂ@ÛcÂîcÂÀdÂd€EdÂÀKdÂÀddÂd€ÂdÂÀádÂÀád€ eÂ3eÂ@ReÂeeÂÀweÂ@„eÂÀe€£eÂâeÂûe€ fÂÀ?fÂ@~f‘fÂ@°f€Ïf€èfÂ@ûf€gÂ@-g€LgÂ@_gÂ@‘g½gÂÀÏgÂÀÏgÂÀÏg€âgÂ@õgÂ@hÂ:hÂ@YhÂÀehÂÀ~hÂ@¤h€ÜhÂ@ïhÂÀûhÂ@iÂ@:iÂ@SiÂfiÂÀ‘i€¤i±i€ÖiÂÀõiÂjÂ@4jÂyjÂÀ‹jÂ@±jÂÀ¤jÂÀ½jÂÝjÂ@üjÂkÂAkÂ@`kÂskÂÀ…kÂ¥kÂ@ÄkÂ@ÝkÂ@ökÂ"lÂ"lÂ;lÂÀMlÂ@slÂÀ˜lÂ@¥lÂÀ±lÂÑlÂm€mÂ@"mÂÀGmÂÀ`mÂÀ`mÂ@†mÂ@ŸmÂÀÄmÂ@ÑmÂ@êmÂÀömÂ@nÂ@5nÂanÂznÂ@€nÂÀ¥nÂ@²nÂÅnÂÀ×nÂ@ýn€oÂÀ;oÂBoÂBoÂÀToÂÀmoÂÀmoÂ@zoÂtoÂ@¬o€²oÂÀ¸o€äoÂÀp pÂÀ5pÂUp€zp€zpÂ@pÂÀ™p¹pÂ@ØpÂq€)qÂ6qÂÀHq€[qÂ@nqšqÂ@ q³qÂÀÅqÂ@ëqÂ@rÂÀrÂIr€UrÂbrÂ{r”r€¹rÂÀ¿rÂßr€sÂ@s€6sÂ@IsÂÀUsÂ@bs€hsÂÀ‡sÂÀ s§sÂÀ sÂ@ÆsÂÀt€tÂ$tÂÀOtÂÀhtÂ@ut€”t€­tºtÂ@ÙtÂÀþt€øtÂuÂuÂuÂÀ0uÂ7uÂÀIuÂ@ouÂ@ˆu€ÀuÂÀßuÂ@ìuÂÀøuÂÿuÂÀv€ vÂ@7vÂcvÂ|vÂÀ§v€ºvÂ@ÍvÂàvÂÀÙvÂùvÂÀ wÂwÂ@1wÂ@JwÂ@cwÂvwÂÀ¡wÂÀºwÂÚwÂÀxÂÀ7xÂ@DxÂÀ7xÂWxÂ@]xÂ@vxÂ@vx€®xÂÀÍxÂíxÂÀyÂÀ1yÂ@>yÂÀ1yÂÀJyÂjyÂ@pyƒyœy€ÁyÂÀÇy€Úy€óyÂ@zÂÀùyÂzÂ2zÂKzÂ@jz€‰zÂÀ¨z€»zÂÈzÂ@ÎzÂáz€{ÂÀ%{ÂÀ%{Â@2{ÂÀ>{Â@d{Â@}{Â{ÂÀ¢{Â@È{Â@ú{€ç{ÂÀí{ÂÀí{Â@ú{Â@|Â@|Â@,|ÂÀQ|Â@^|ÂÀƒ|€–|ÂÀµ|Â@Â|€È|ÂÕ|€á|ÂÀ}Â@ }Â@?}€E}ÂÀK}Â@?}Â@X}€w}Â@q}€}Â}ÂÀÈ}ÂÏ}ÂÀú}ÂÀ~Â@ ~ÂÀ,~€?~ÂÀE~Â@R~€X~Â@k~ÂÀw~ÂÀ~—~€¼~ÂÉ~ÂÀÛ~€î~Â@Â@Â@3€ ÂÂÀXÂÀqÂÀŠ€Â@°Â@É€ÏÂ@âÂ@ûÂ@ €Â €Â €Â #€Â #€ÂÀ2€Â`B€Â@?€Â <€Â`B€Â@X€Â a€Â a€Âàg€Â@q€Â ‡€Â “€Â  €Â “€Â@£€Â¶€Â`¿€ÂàË€ÂàË€ÂÏ€Â`Ø€ÂÀá€Â`ñ€Â ÷€ÂÀú€Â€ ÂàÂ`#Â@  ) 6ÂàHÂ@RÂàH O€X [Â@kÂÀw —Â@ ¦Â ¦Â ³Â€¼Â ¿Â@Ï ØÂ ØÂ åÂÀôÂûÂ`‚  ‚Âà‚Âà‚ ‚ #‚ #‚ <‚Â`O‚€R‚€R‚ U‚Â_‚ n‚Âàt‚ {‚ {‚Âàt‚ {‚ ‡‚Â@—‚Â@—‚ÂংÂÀ¼‚€ς€ςÂÜ‚Â`å‚Â@û‚Â`þ‚Â`þ‚€ƒÂƒÂ ƒÂ€ƒÂÀ ƒÂ€ƒÂ€ƒÂ€ƒÂà#ƒÂ€3ƒÂ 6ƒÂ CƒÂ€LƒÂàUƒÂ \ƒÂ@_ƒÂÀkƒÂrƒÂ uƒÂà‡ƒÂ šƒÂà ƒÂÀƒÂà ƒÂࠃ §ƒÂ ÀƒÂ ÀƒÂ ÀƒÂÀσ€ɃÂ`߃ÂïƒÂàëƒÂàëƒÂïƒÂ þƒÂ þƒÂ`øƒÂ„Â`„Â@„Â!„ $„Âà6„ I„ÂàO„€F„ÂS„ÂàO„ÂÀL„ÂàO„€_„ o„ ˆ„ ”„Â@‹„ ”„ ¡„ ¡„ º„ º„Â@½„ÂÀÉ„ÂЄÂÀâ„Âé„Âàå„Â`ò„Â`ò„€õ„ ø„ … … …Â… *… 7…ÂÀF… C…Â`=…Â`=…ÂàI…Â`V…ÂàI…Â`V…Âàb… u…ÂÀx…Âà{…Â…Â@…… ‚…Âà”…Â ›… ´…Â@·… À…Â@·… À… À…Â@·…Â`º…ÂÊ…Â`Ó…Âã… æ…ÂÀÜ…Â æ…Âà߅€ï…Âü…Â`†Â  †Â†Â $†Â $†Âà*†Â`7†Â`7†Â`7†Â€:†Â 1†Â@4†ÂG†ÂG†Â J†Â V†Âà\†Âà\†Â€l†Â |†Â€…†Â ˆ†Â ˆ†Â ¡†Â`´†Â@±†Â@±†ÂĆÂÀÖ†ÂĆ º†Â`´†ÂĆÂàÙ†ÂàÙ†Â݆ ӆ€é†Â`æ†Â ù†Â`ÿ†Â ù†Âà ‡Â‡Â ‡Âà ‡Â`‡Â(‡Â +‡Â`1‡Â ‡Â@.‡Â`1‡Â€4‡Âà=‡ÂA‡Â D‡Â P‡ÂZ‡Â`c‡Â v‡Â`|‡Â v‡Â ‚‡Â`|‡Âàˆ‡Â@’‡Â€˜‡Â ›‡Â@’‡Â`•‡Â€˜‡Â¥‡Â`®‡Â ¨‡Â€±‡Â@«‡Â`®‡Â`®‡Â Á‡ÂàÓ‡Â`LJÂàÓ‡ÂàÓ‡ÂàÓ‡Â@݇€ü‡Â ÿ‡ÂÀˆÂÀˆÂ ÿ‡ÂàˆÂàˆÂ€ˆÂ ˆÂ ˆÂ@ˆÂ@(ˆÂ`+ˆÂ`+ˆÂ`+ˆÂ`+ˆÂÀ4ˆÂ@AˆÂ JˆÂ`]ˆÂ WˆÂ€`ˆÂ`]ˆÂ cˆÂmˆÂàiˆÂ cˆÂÀfˆÂÀfˆÂ@sˆÂ pˆÂà‚ˆÂà‚ˆÂ@ŒˆÂ†ˆÂ`ˆÂ`ˆÂ`ˆÂ@ŒˆÂà›ˆÂà›ˆÂà›ˆÂ`¨ˆÂà´ˆÂ@¾ˆÂÀʈÂ@׈Â`ڈ àˆÂ€ÝˆÂ Ԉ€݈ íˆÂêˆÂ àˆÂÀãˆÂ íˆÂàÿˆÂ‰ÂàÿˆÂÀüˆÂ` ‰Â€‰Â ‰Âà‰Â ‰Â ‰Â`%‰Â5‰Â@;‰Â€A‰Â`>‰Â D‰Â D‰ÂàJ‰ÂàJ‰ÂàJ‰ÂÀG‰Â ]‰Â ]‰Âg‰Âg‰Âg‰Â`p‰Âà|‰Â€‰Â v‰Â v‰Â ƒ‰Â@†‰Â€Œ‰Â ‰Âà•‰ÂÀ’‰Â™‰Â œ‰Â`¢‰Â€¥‰Âஉ²‰Â²‰Â µ‰Â µ‰Â µ‰Â€¾‰ÂàljÂàljÂˉ ΉÂ`Ô‰ÂÀ݉€׉ ډÂ`í‰Â€ð‰Â`í‰Âàù‰ÂÀö‰ÂÀö‰Â ŠÂ@ŠÂ ŠÂ ŠÂ %ŠÂÀ(ŠÂÀ(ŠÂ %ŠÂ %ŠÂ€"ŠÂ`ŠÂà+ŠÂ 2ŠÂÀAŠÂ >ŠÂàDŠÂàDŠÂ`QŠÂ€TŠÂ@NŠÂ KŠÂ KŠÂ@NŠÂ WŠÂà]ŠÂÀsŠÂ }ŠÂ`ƒŠÂ`ƒŠÂ`ƒŠÂ“ŠÂ`œŠÂ –ŠÂ –ŠÂ€ŸŠÂ ¢ŠÂ@²ŠÂ ¯ŠÂÀ¾ŠÂÀ¾ŠÂàÁŠÂÀ¾ŠÂÀ¾ŠÂàÁŠÂÀ¾ŠÂ@ËŠÂ ÈŠÂàÁŠÂ€ÑŠÂ ÈŠÂ@ËŠÂàÚŠÂ`çŠÂ€êŠÂÀðŠÂàóŠÂ@ýŠÂ úŠÂ@ýŠÂ`‹Â ‹Â ‹Â‹Â ‹ÂÀ ‹Â ‹ÂÀ"‹Â`‹Â`‹Â`‹Âà%‹Âà%‹Âà%‹Â ,‹Âà>‹Â E‹Â E‹ÂB‹ÂÀ;‹Â E‹Â Q‹Â E‹Â€N‹Â Q‹Â€N‹Â€N‹Â[‹Â@a‹ÂÀm‹Â`d‹Â`d‹Â w‹Â€€‹Â`}‹Â w‹Ât‹Â`}‹Â ‹Â€™‹Â‹Â`–‹Â œ‹Â ‹ÂÀŸ‹ÂÀŸ‹Â¦‹Â@¬‹Â µ‹Â`¯‹Â ©‹Â`¯‹ÂÀ¸‹Â¿‹ÂÀ¸‹Â µ‹ÂÀ¸‹Â ‹Â໋ ΋ ΋ ΋ ۋ€ä‹Âñ‹Â ô‹Â ç‹Â@÷‹Â ô‹Âàí‹Â€ý‹ÂÀŒÂ ŒÂ ŒÂ ŒÂ ŒÂÀŒÂ ŒÂàŒÂ`ŒÂ`ŒÂ`ŒÂàŒÂ`,ŒÂ`,ŒÂ€/ŒÂ`,ŒÂà8ŒÂ ?ŒÂ€HŒÂ KŒÂ€HŒÂ@BŒÂ ?ŒÂ<ŒÂ ?ŒÂ KŒÂàQŒÂ XŒÂ€aŒÂ`^ŒÂ`^ŒÂ dŒÂ€aŒÂ€aŒÂàjŒÂÀ€ŒÂ }ŒÂÀ€ŒÂàƒŒÂ@tŒÂÀ€ŒÂ‡ŒÂ@ŒÂ‡ŒÂ‡ŒÂ€“ŒÂ`ŒÂ€“ŒÂ`ŒÂ ŒÂàœŒÂàœŒÂ £ŒÂÀ²ŒÂ ¯ŒÂ ¯ŒÂ@¦ŒÂ ¯ŒÂ¹ŒÂ ¯ŒÂ`©ŒÂ`©ŒÂൌ ¼ŒÂ ÈŒÂ€ÅŒÂ€ÅŒÂ ÈŒÂ Ռ€ތ ՌÂàΌ€ŌÂàΌ ՌÂàçŒÂ áŒÂ áŒÂ@ñŒÂ`ôŒÂ îŒÂÀäŒÂ@ñŒÂ ÂÀýŒÂàÂàÂà Âà  Âà  ÂÀ €Â@ ÂàÂàÂÂ`&ÂÂà Â`&€) 9 9Â@< EÂàK E 9 E RÂO R€[€[ÂO RÂ`XÂÀa ^ k€tÂà} kÂàdÂÀaÂh ^ ^ÂÀa kÂh w wÂ`q€tÂÀzÂÂà} „ÂÀ“ šš Â@ Â Â€ÂÀ“ÂÀ“šÂ@ Â ©Â³Â ©Â ©Â ©Âà¯Â ¶Â ¶Â`¼Â³Â ¶Â ÂÂàÈÂÌ ÏÂ@Ò Ï ÛÂàá èÂàáÂÀÞ Û ÛÂ`ÕÂåÂ@ëÂÀ÷€ñ ôÂå è èÂ`î€ñÂ`î ôÂþÂ`ŽÂ  ŽÂ@ŽÂ`ŽÂ`ŽÂ€ ŽÂ€ ŽÂÀŽÂÀŽÂ  ŽÂ@ŽÂàŽÂ@ŽÂ€ ŽÂ€ ŽÂ ŽÂÀ)ŽÂà,ŽÂ &ŽÂà,ŽÂ &ŽÂà,ŽÂ &ŽÂ` ŽÂ &ŽÂ`9ŽÂ 3ŽÂ0ŽÂà,ŽÂ 3ŽÂ0ŽÂ ?ŽÂ€<ŽÂ 3ŽÂ ?ŽÂ ?ŽÂ@OŽÂ LŽÂ`RŽÂàEŽÂ€UŽÂÀ[ŽÂà^ŽÂ XŽÂ XŽÂà^ŽÂ`kŽÂ€nŽÂ€nŽÂ qŽÂ@hŽÂ`kŽÂ€nŽÂàwŽÂ qŽÂ`kŽÂ€nŽÂàwŽÂ`„ŽÂ ~ŽÂ ~ŽÂ ~ŽÂ`„ŽÂ€‡ŽÂ ŠŽÂ ŠŽÂ —ŽÂ —ŽÂ”ŽÂ`ŽÂ —ŽÂ £ŽÂ€ ŽÂ £ŽÂ £ŽÂ€ ŽÂ £ŽÂ`¶ŽÂ`¶ŽÂ °ŽÂ€¹ŽÂ€¹ŽÂ@³ŽÂÀ¦ŽÂ £ŽÂ £ŽÂ £ŽÂ੎­ŽÂ੎Â`¶ŽÂ ¼ŽÂ ÉŽÂàÂŽÂ ÉŽÂ@ÌŽÂ`ÏŽÂ`ÏŽÂÀØŽÂ`ÏŽÂ@ÌŽÂÆŽÂ ¼ŽÂÀ¿ŽÂ`ÏŽÂ`ÏŽÂ`ÏŽÂ@ÌŽÂÀØŽÂ@åŽÂ@åŽÂ€ëŽÂ€ëŽÂ`èŽÂ@åŽÂ âŽÂߎÂߎÂÀñŽÂ@þŽÂøŽÂøŽÂàôŽÂøŽÂøŽÂ ûŽÂ`Â`Â@þŽÂ€ Âà €Âà Âà  Âà Â@€€€€Â`Â`Âà&  €ÂÀ# - 9ÂÀ<ÂC FÂ`LÂÀ<Âà? F F F€O€OÂ`LÂ`LÂàXÂàXÂàXÂ\ _€h€h kÂ@b _ _Â@b€hÂ@b kÂàqÂu€h kÂ`e€h kÂ`~ÂÀ‡Â x x€Â`~€ „Â@”Â@{Â`~ÂÀ‡Â€Â „ÂàŠÂ ‘ÂàŠÂÀ‡ÂàŠÂ ‘Ž „ „ „ „ ‘ ‘ÂÀ‡Â`~ „ „Â`—€šÂÀ Â§Âà£Â§Â ªÂ ªÂ`°Â€³Â`°Â ªÂÀ Â ªÂ ¶Âà¼Â€³Â ¶Âà¼Â€³Â ÃÂà¼Âà¼Â ÃÂà¼Â€³Â§Â ¶ÂÀ¹Â€³ÂÀ ÏÂÀҀ̠̀ÀÌÂÀÂÀ¹Âà¼Â ¶Â`ÉÂ`ɀ̠ÜÂ@ß Ü Ï ÏÂÙ è€åÂàî€å ÜÂ@ß èÂ`â èÂ`âÂàՠ܀åÂ`â è€å è èÂ`âÂ@øÂ€þ€þÂ`ûÂ@øÂ`û õÂ`ûÂò õ Â`ûÂ`û õ€þ õÂòÂàîÂòÂ`ûÂ`û Âà Â@ ÂÀ  €ÂÀ€Â` ÂàÂàÂ` ÂàÂÀÂ@€€ Âà Âà  ' ' ' 'Â$Â$Â$ 'Âà9 3Âà9Â=Âà9Âà9 3 '€0 @Âà9ÂÀ6 @Â@*Â`-Â@*Âà9Â`-Â`-€0Â`-Âà9 @Â@C @Â`FÂ`F LÂ@C @Â= @Âà9Â= @ LÂ`F @Â`F L LÂàR LÂVÂàRÂ@\ÂàR L LÂ`F€IÂÀOÂàRÂÀO LÂàR€I€IÂàR L LÂàR Y€bÂ`_Â`_ÂàkÂoÂÀh r r rÂàkÂo r ~Â@ŽÂ ~ ~Â`xÂ`xÂ`x rÂ`xÂ@u€{ ~ÂÀ ~ ~Âà„ ‹Â ~Â`xÂ`xÂ@uˆˆ ~ ~ rÂo eÂÀhÂàkÂ@uÂà„ˆÂ@ŽÂà„€” — —ÂÀšÂà ¤Âà —Â`‘Âà„ˆ ‹Âà„Âà„ˆÂ`‘ —€”€”Â`‘ ‹Â€” ‹Â€” — ‹Â@ŽÂ`‘ÂÀšÂ —Âà —Â@§Â¡ÂàÂÀšÂ —¡Â@§Â@§Âà ¤ÂÀšÂ ‹Â ‹Â ‹Â@ŽÂ`‘ÂÀšÂ€” —€”ÂÀšÂ —¡Âà¶Âà¶Âà¶Â °Â °ÂºÂ °ÂºÂ °Â`ªÂ ¤Â@§Â ½Â ½Â ½ÂºÂ@À€ÆÂ€ÆÂ ÉÂÀÌÂ`àɀÆÂ@À ½Âà¶Â@À ½Â É ÉÂàÏÂÓÂÓÂÀÌ É É ÉÂ@À ½Â ½Â ½Â€ÆÂ É€ÆÂàϠɠɀÆÂӠ֠րߠրßÂàèÂì â€ß âÂ`Ü âÂ`Ü ÉÂàÏÂӀߠâÂàèÂÀå ï û ïÂìÂàèÂàèÂ@ـߠâÂ@ÙÂàèÂàèÂàèÂìÂ`õ ïÂì ï ‘ ‘ ûÂÀþ ûÂÀþ€øÂ€øÂ€øÂ û€øÂ‘ÂÀþ ûÂ`õÂ@òÂÀåÂì€øÂ`õÂ@ò€øÂà‘Âà‘€øÂàè â â€øÂ û û û€øÂÀþ û ‘€‘ ‘Â`‘ ‘ ‘ ‘ ‘€‘ÂÀ‘Â`‘Â@ ‘ ‘ ‘€‘€‘ ‘‘ ‘Â`‘ ‘ ‘Âà‘Âà‘Â`'‘Â`'‘ !‘Â`'‘€*‘ !‘‘‘ !‘ !‘€*‘ -‘Â`'‘€*‘Â`'‘ !‘Âà‘ !‘‘Â`'‘ !‘‘ !‘Â`'‘ÂÀ0‘ -‘€*‘Âà3‘€C‘ :‘Â@=‘Âà3‘ÂÀ0‘Â7‘Âà3‘ÂÀ0‘ -‘ -‘Â@$‘Â`'‘ ¾”Â`<³Â UË€¯ÊÂ`¼¿Âe³Â€h¨ÂÀrŸÂàT˜Â€¡’ 2ŠÂYN®€ýÁäÁ€«ºÁÿuÁ¬nÀØ=AžèA€d1B@à^B€ç{B€r…BÀl‡BàI…BR€BÀ¦rB€jbBÀÜPB€÷>BÀ-BÜB€² BµùA€PÞA]ÅA€®AR™A˜…AxfAiCA²"A-AìÂ@L@Èú?@¾DÀòÀBÖÀå Á}/ÁãPÁrÁ€¾‰Á€ šÁPªÁ€.ºÁ€ÎÉÁ€ ÙÁ€-èÁ€ÓöÁÀqÂêÂ@þÂ@ÚÂÀ,Â@M€ê#ÂÀ#(Â@ÿ+Â@j/€w2Â@F5ÂÀÃ7ÂÀ:ÂÀ<ÂÀ>š?Â@AÂ@uBÂÀÆCÂ@æDÂ@ùEÂ@ GÂ@ÔGÂÀÁHÂIÂÀQJ€K€ÂKÂ@kLÂûLÂ@~MÂ@âMÂ@_NÂÀ¶NÂ@OÂ@rOÂÀÉOÂÀP€rP±PÂÀõP€!QÂ@fQÂÀ¤QÂÀÖQÂöQÂÀ!RÂÀSR€RÂ@«RÂ@ÄRÂ@öR SÂÀ4S€`SÂ@sSÂ@¥SÂÀãS€öSÂTÂ5TÂÀGT€sTÂ@ŸTÂ@¸TÂäTÂ@UÂ@5UÂaU€†UÂÀŒU¬UÂ@ËUÂ@ËUÂÞUÂ÷UÂVÂÀ VÂ@/VÂÀ;V€NVÂÀTVÂÀmVÂ@zVÂÀŸVÂ@ÅVÂØVÂ@ÞVÂ@÷VÂ@)WÂ@BWÂÀNWÂÀNWÂÀgWÂÀ™WÂ@¦WÂÒWÂëWÂÀXÂÀ/XÂ@bÂÀWbÂÀpb©b€çbÂÀc€cÂÀ8cÂ@^cÂ@c€–c¼c€ácÂÀd€dÂ@&dÂÀKdÂÀ}dÂdÂÀ¯dÂÀÈd€ÛdÂe€&eÂÀ,eÂLeÂ@„eÂ@¶eÂÉe€Õe€îeÂÀ fÂ@3fÂ@LfÂÀXfÂxfÂÀ£fÂ@°fÂÀÕfÂõfÂÀ gÂ@FgÂ@xgÂ@ªg½gÂÀÏg€ÉgÂ@ÜgÂ@õgÂhÂÀhÂ@@hÂ@rhÂ@¤hÂ@½hÂÀâhÂ@ïhÂiÂ@iÂ@!iÂÀFiÂfiÂ@…iÂ@žiÂÀÃiÂ@éiÂ@jÂjÂ@4jÂ@fjÂ@jÂ@˜jÂ@±j€ÐjÂÀÖjÂ@ãjÂ@üjÂÀkÂ@.kÂ@GkÂÀlkÂ@ykÂÀžkÂ@«kÂ@Ýk€ük€l€.lÂ@AlÂ@sl€’lÂÀ±lÂÀÊlÂÀÊlÂÀãlÂmÂ@ mÂ@"mÂ@;mÂ@TmÂgm€¥m€¾m€×mÂýmÂn€"nÂ/n€TnÂÀsnÂ@™nÂÀ¥nÂ@²n€ÑnÂÀðnÂoÂ)oÂÀ;oÂÀToÂoÂ@“o¦o¿oÂ@ÞoÂñoÂÀpÂ#pÂÀNpÂ@tpÂ@pÂ@¦pÂ@ØpÂÀäpÂ@ñp€qÂÀ/qÂOqÂhqÂÀzq€¦qÂÀÅqÂ@ÒqÂ@ëqÂÀ÷qÂÀrÂ@rÂ@6r€UrÂ{rÂ@šrÂÀ¿rÂ@³r€ÒrÂørÂ@0s€6sÂ@IsÂCsÂ\sÂÀ‡s€sÂ@”sÂ@­sÂÀÒs tÂÀtÂÀ6tÂÀOtÂ@\tÂotˆt¡tÂ@Àt€ßt€øtÂ@ uÂ@=u€CuÂPuÂ@ouÂÀ{uÂ@ˆuÂÀ”uÂÀ­uÂ@ºu€ÙuÂ@vÂ@vÂ@7v€VvÂÀ\vÂÀuvÂ@‚vÂ@´v€ºvÂ@ÍvÂàvÂÀòvÂÀòvÂ@wÂ+wÂ@1wÂDwÂÀVwÂ@cwÂwÂÀ¡w€´w€´wÂ@àwÂówÂ%x€JxÂWxÂÀixÂÀixÂ@xÂÀ›xÂÀ´xÂÔxÂ@óxÂyÂ@%yÂ8yÂÀ1yÂ@>yÂ@Wy€vy€yœyÂ@»y€ÚyÂÀùyÂ@zÂÀ+z€>zÂ@jz–z€¢zÂÀzÂ@œz¯zÂ@ÎzÂ@çz€{Â@2{€j{Â^{ÂÀp{ÂÀp{Â@}{Â@}{€œ{€œ{Â@¯{Â@È{€Î{ÂÛ{Â@ú{€|ÂÀ|Â&|Â@^|Â@w|Â@|ÂÀœ|€¯|Â@Û|ÂÕ|Âî|Â@ô|€}Â@ }ÂÀ}Â@?}€^}Âk}Â@Š}Â@Š}Â@£}€Â}ÂÀÈ}Â@Õ}Â@î}ÂÀú}€ô}Â~Â@~€&~€&~Â@9~ÂÀ^~Â@k~Â~~€Š~°~Â@¶~ÂÉ~ÂÀÛ~ÂÀô~ÂÀ&Â@3ÂFÂFÂÀXÂ_Âx€„ÂÀŠÂ@—Â@°ÂÀ¼ÂÀ¼ÂÜÂ@ûÂ@ €Âà€Â €Â@&€Â /€Âà5€Â€E€Â`[€ÂÀd€Â`[€Â€^€Â n€Â n€Â z€Â„€Â “€Â  €ÂÀ¯€Â ¹€Â@¼€Â Å€Â@Հ€ۀ ë€Â`ñ€Â@î€ÂÀú€Â Â` Â@ÂàÂ@ €& )€&Âà/Â`<ÂàH OÂ`UÂ`n tÂàzÂàz  šÂ šÂ€£Â€¼Â ¿ÂÀÂÂàÅÂ`ÒÂÀÛÂ`ÒÂ`Ò ØÂâ€îÂû þÂ`‚ÂÀ ‚€ ‚Âà)‚Â`6‚€9‚ÂàB‚ÂF‚ U‚Â`h‚ n‚Â@~‚ ‡‚ ”‚€‚ÂÀ£‚ ­‚Â@°‚ ¹‚€ςÂ`̂ ҂ÂÀÕ‚ÂàØ‚Â ß‚Âõ‚ ø‚Âõ‚€ƒÂƒÂ ƒÂ ƒÂÀ ƒÂ *ƒÂ 6ƒÂ CƒÂ`IƒÂ OƒÂàUƒÂÀkƒÂànƒÂrƒÂ uƒÂ`{ƒÂà‡ƒÂ€—ƒÂ ŽƒÂ`”ƒÂࠃ€°ƒÂใ€°ƒÂ½ƒÂ ÀƒÂ€ÉƒÂ ÌƒÂ€ÉƒÂÀσÂÖƒÂ`߃ þƒÂà„Âà„Â`„ÂÀ„Âà„Â@'„€-„Âà6„Âà6„ 0„Âà6„Â:„ =„€F„€_„ b„Âàh„ {„ {„Âà„Â`Ž„ÂÀ—„Âàš„Âàš„Â`§„ ­„Â@½„ۀÂЄ ߄Â@ï„ÂÀû„ ø„Â… … … …€'…€'…€'… *… *… C… C… C… P… P…Â`V… \…Âf…€r… ‚…Â`ˆ… ‚…€‹…˜…Â`¡…Â@ž… §… ´…Â`º…ÂÀÃ…ÂàÆ…ÂàÆ…ÂÊ…Â`Ӆ م م مÂàß…Â æ…Âàø…Â`†ÂÀ†Âà†Â †Â`†Â $†Âà*†Âà*†ÂÀ'†Â 1†ÂàC†Â@M†Â€S†Âà\†Â`i†Â |†Â |†Â o†Âàu†Âàu†Â@†ÂÀ‹†Â’†Â •†Â€ž†ÂÀ¤†Â৆Â`´†ÂÀ½†ÂĆÂ@ʆÂÀֆ à†Â@ã†Â à†Â à†Âàن ӆÂ݆Âàò†Â ì†Â@ü†Â ‡Â ‡Âà ‡Â ‡Âà$‡Âà=‡ÂA‡ÂA‡Â D‡Â€M‡Â`J‡Â@G‡ÂZ‡Â ]‡Â€f‡Â ]‡Â i‡Â@y‡Â€‡Â€‡Â ‚‡Â ›‡Â¥‡Â@«‡Âງ¾‡Â Ú‡ÂàӇ ͇ ͇€ʇÂ@݇Âàì‡Â`ù‡Â ó‡Â€ü‡Â@ö‡Â æ‡Âàì‡Â€ü‡Â ˆÂ`ˆÂ@ˆÂ ˆÂ %ˆÂ€.ˆÂ;ˆÂÀ4ˆÂ 1ˆÂà7ˆÂ 1ˆÂ >ˆÂàPˆÂ`]ˆÂ WˆÂ cˆÂÀfˆÂ@sˆÂ@sˆÂà‚ˆÂ`vˆÂ pˆÂÀˆÂ†ˆÂ`ˆÂ ‰ˆÂ`ˆÂ ‰ˆÂ€’ˆÂÀ˜ˆÂ€«ˆÂ ®ˆÂ ®ˆÂ ®ˆÂ ®ˆÂ@¾ˆÂ ÇˆÂÀʈÂà͈ Ԉ€݈€݈€݈ÂÀãˆÂ@ðˆÂ@ðˆÂ ùˆÂ€‰Â ‰Â@"‰Â +‰Â€(‰Â@"‰Â@"‰Âà1‰Â@;‰Â`>‰Â`>‰Â`>‰Â@;‰Â`>‰Â€A‰ÂN‰ÂÀG‰ÂÀG‰Â Q‰ÂÀG‰Â Q‰Â@T‰Â Q‰Âàc‰Â@m‰Â@†‰Â ‰Âà•‰Â œ‰Â@Ÿ‰Â™‰Â@Ÿ‰Â™‰Â ‰Â€Œ‰Â™‰Â œ‰Â`¢‰Â€¥‰ÂÀ«‰ÂÀ«‰Â€¾‰Â Á‰Âàlj ΉÂÀ݉ÂÀ݉Â@ê‰Â`í‰Âàù‰Âàù‰ÂÀö‰Â ó‰Â ó‰Â@ŠÂàù‰Â@ê‰Â ó‰Âàù‰Â`ŠÂ€ ŠÂàŠÂ`ŠÂ@ŠÂ€"ŠÂ€"ŠÂ 2ŠÂ >ŠÂ KŠÂ KŠÂ`QŠÂà]ŠÂà]ŠÂ dŠÂ dŠÂ dŠÂÀsŠÂ`jŠÂ`jŠÂ }ŠÂ@€ŠÂzŠÂ }ŠÂàvŠÂ@€ŠÂ ‰ŠÂ€†ŠÂ@™ŠÂਊ ¯ŠÂ ¯ŠÂ ¯ŠÂ »ŠÂ`µŠÂ¬ŠÂ@²ŠÂ@²ŠÂ@²ŠÂ€¸ŠÂ ÈŠÂ`ΊÂÀ׊ÂÞŠÂàÚŠÂàÚŠÂ áŠÂ€êŠÂ íŠÂàóŠÂÀðŠÂàóŠÂÀðŠÂàóŠÂ`‹Â ‹Â€‹Â@‹Â€‹Âà%‹Â)‹Âà%‹Â)‹Â@/‹Â@/‹Â€5‹ÂB‹Â`K‹Â E‹Â€5‹Âà>‹Âà>‹Â`K‹ÂÀT‹Â ^‹Â€g‹Â j‹Ât‹Âàp‹Â j‹Âàp‹Ât‹Â ƒ‹Âà‰‹Â œ‹Âࢋ ©‹Â¦‹Â`¯‹ÂÀŸ‹Â ©‹Â¦‹Â ©‹Â@¬‹Â`¯‹Â`¯‹Â µ‹Â ‹ ‹€ˋÂÀÑ‹ÂàÔ‹Âàԋ€ˋÂ@Å‹Â`ȋ ۋÂ`á‹Âñ‹Âàí‹Â ç‹Â@÷‹Â€ý‹ÂÀŒÂ€ý‹Â ŒÂ ŒÂ`ŒÂ@ŒÂàŒÂ &ŒÂ`,ŒÂ`,ŒÂ€/ŒÂ &ŒÂ`,ŒÂ@)ŒÂ 2ŒÂ 2ŒÂ 2ŒÂ ?ŒÂàQŒÂàQŒÂ XŒÂ`^ŒÂ dŒÂ dŒÂ dŒÂàjŒÂ€aŒÂ`^ŒÂ qŒÂ@tŒÂ@tŒÂnŒÂ@tŒÂ@tŒÂ@tŒÂ€zŒÂ qŒÂ@tŒÂÀ€ŒÂàƒŒÂ ŠŒÂ`ŒÂ@¦ŒÂ £ŒÂ`©ŒÂൌ¹ŒÂ`©ŒÂ £ŒÂ £ŒÂ€¬ŒÂൌ ¼ŒÂ¹ŒÂÀ²ŒÂ ¼ŒÂÀËŒÂàΌ ՌÂÒŒÂÒŒÂ`ÛŒÂ`ÛŒÂ`ÛŒÂÀäŒÂ`ôŒÂÀäŒÂ áŒÂ îŒÂ`ôŒÂ€÷ŒÂ@ñŒÂëŒÂ@ñŒÂ€÷ŒÂ úŒÂ    Â@ Â` Â`& Âà   Â`&Â@#Â`&€)Â6Â6 ,Â6€BÂÀH E E EÂ`?Âà2ÂOÂ@U RÂ`XÂÀaÂàdÂh€[ kÂàdÂhÂ`q w wÂà}Â`ŠÂÀ“  Â`ŠÂ „ „Âà}Âà}Âà} „€Â@‡Â`ŠÂ Â Âà– Â`£Â`£Â ©Â ©Â ¶Â Â ÂÂÀÅ ÂÂÌÂ`Õ€ØÂÌÂ@ÒÂÀÞÂ@ëÂàá ÛÂàáÂ@ë èÂÀÞ èÂàáÂåÂ`îÂàúÂàú ôÂþÂ`ŽÂ ŽÂ ŽÂ ô ôÂ@ë è€ñ ôÂ`ŽÂ ŽÂ`ŽÂ@ŽÂ`ŽÂ`ŽÂ  ŽÂ`ŽÂÀŽÂÀŽÂàŽÂàŽÂŽÂ ŽÂ@ŽÂ &ŽÂÀ)ŽÂ &ŽÂ &ŽÂ@6ŽÂ 3ŽÂ 3ŽÂ 3ŽÂ ?ŽÂ`9ŽÂ ?ŽÂ 3ŽÂ€<ŽÂàEŽÂàEŽÂ ?ŽÂÀBŽÂ€<ŽÂ`9ŽÂ`9ŽÂÀBŽÂàEŽÂ@OŽÂ€UŽÂ€UŽÂ`RŽÂ XŽÂ€UŽÂÀ[ŽÂ eŽÂ@hŽÂ`kŽÂ qŽÂ qŽÂ qŽÂ ~ŽÂ{ŽÂ ~ŽÂÀtŽÂ ~ŽÂÀtŽÂ qŽÂàwŽÂ{ŽÂ`kŽÂ qŽÂ qŽÂ ~ŽÂ@ŽÂ ~ŽÂ ~ŽÂàŽÂ —ŽÂ”ŽÂàŽÂ@šŽÂ”ŽÂÀŽÂ ŠŽÂ —ŽÂ@šŽÂ@šŽÂ £ŽÂ £ŽÂ £ŽÂ £ŽÂ °ŽÂ °ŽÂ੎Â`¶ŽÂ€¹ŽÂ`¶ŽÂàÂŽÂÆŽÂÀ¿ŽÂàÂŽÂ`ώ€Ҏ€Ҏ Ɏ€ҎÂÀØŽÂàێ Ɏ€Ҏ âŽÂ âŽÂ€ëŽÂ âŽÂ âŽÂÀ؎€Ҏ ɎÂÀØŽÂ`èŽÂ âŽÂ âŽÂ îŽÂ îŽÂ ûŽÂàôŽÂ ûŽÂÀñŽÂ îŽÂøŽÂ ûŽÂ€Â` ûŽÂÀ  ûŽÂ ÂÀ  Âà  Â@Â`ÂÀ#Â*    Âà    Â`  Â* 9€6Â@0 -€6ÂÀ< 9 F R€O RÂ`L FÂ@IÂà?Â@I€O€OÂ`LÂ\ _Â\Â\ÂàX _ÂÀn xÂuÂÀnÂàq x xÂàq xÂu „Â`~Â`~€Â`~Â@{Â`~ „ÂàŠÂàŠÂàŠÂàŠÂ ‘€šÂ€šÂà£Â Â€šÂ@”Ž€šÂà£Â@­Â ªÂ ªÂ§Â ªÂà£Â`°Â@­Â ¶Â€³Â`°Â ¶Â ¶Â€³ÂÀÂÀ¹Âà¼ÂÀ ÃÂ`ɀ̀̀ÌÂ`É ÏÂàÕ ÏÂ`É€ÌÂàÕ€åÂàîÂÀë èÂ`âÂ`âÂ`âÂ@ßÂ@ßÂ@ßÂ@ß èÂàîÂÀëÂàî€å€åÂàîÂàî èÂ@ß èÂàî õÂàîÂàîÂò õ õ€þÂàÂàÂÀÂ@Â` Âà Â@Â` 'Â`-Â$Âà  'Â@*Â$Âà  Â@*Â`-Â`-Â$Â`-Â@*Â@*Â@*Â`- Â`-Â`-Âà9Âà9 3 3Âà9 @€I @ @ @€I€IÂ`F @€I LÂV L LÂÀOÂÀO€IÂàRÂÀO @Â@CÂ`F€I LÂV€I€IÂÀOÂàRÂàR YÂVÂàRÂV YÂVÂVÂ@\€b€b eÂàk rÂoÂ`_ eÂÀh€b€b eÂo e Y Y Y€b€b e€bÂ`_Â@\ÂÀhÂàk e€b€b e€b e e r ~€{Â`x r€{ rÂà„€{ rÂ@u r r rÂ@uÂ@uÂo€{ ~ÂÀ ~ˆ ‹Â ‹Â ‹ÂˆÂÀÂà„Âà„Âà„ ~ ~ ‹Âà„ ‹Â@ŽÂ`‘€”Â@ŽÂà„Â@u ~ÂÀ ~ÂÀ ‹Â —Âà€­Â`ªÂ@§Â ¤Â¡Â@§Â€­Â¡Â¡Â@§Â ¤Â@§Â ¤Âà¡ ¤ÂàÂàÂ@§Â@§Â`ªÂ ¤Â€­ÂÀ³Â@ÀÂ`ú °Â °ÂºÂ ½Â@À °Â€ÆÂ€ÆÂ`à½Âà¶Â ½Â@À °Âà¶Â ½Â ÉÂÓ ÖÂàÏÂàÏÂ`ÃÂÀÌÂÓÂÓ ÉÂ`à½Â É€ÆÂ`ÀÆÂàÏÂÓ€ÆÂ€ÆÂ Ö âÂ`ÜÂÓÂàÏ ÖÂ@ÙÂ`Ü âÂ`ÜÂàè â âÂ`Ü€ßÂàèÂàèÂ@ò û‘ û ûÂà‘ ûÂ`õ ïÂÀå ïÂ`õÂ`õ ûÂà‘ û ïÂ`õÂ`õÂÀþÂ@ ‘Â`‘Âà‘Âà‘ ‘ÂÀþÂà‘‘ ‘ ‘Â`‘ ‘Â`‘ ‘ ‘ ‘Â`‘Â`‘Â`‘ ‘Â`‘ÂÀ‘ ‘Â@ ‘ ‘ ‘ ‘ !‘Âà‘‘ !‘ !‘Âà‘ ‘Â@ ‘Âà‘ !‘Âà‘ ‘‘Â@$‘Â@$‘‘Âà‘Âà‘‘ÂÀ0‘Âà3‘ÂÀ0‘ -‘Â7‘Â`@‘Âà3‘ :‘€C‘ F‘ F‘€C‘€C‘Â`@‘€C‘ÂàL‘ F‘€C‘ F‘ÂàL‘ÂàL‘ F‘ F‘ F‘ÂÀI‘ÂP‘ÂP‘ F‘ÂÀI‘ÂÀI‘Â@V‘ _‘ÂÀb‘Âàe‘ l‘ÂÀb‘ÂÀb‘ _‘Â`Y‘Â@V‘€\‘ _‘Â@o‘ l‘Âi‘Âàe‘€\‘ _‘ l‘Â`r‘Âi‘Âàe‘Âàe‘ l‘ x‘€u‘ x‘ l‘Âàe‘Âi‘ l‘ l‘Â@o‘ x‘ÂÀ{‘€u‘ x‘ x‘Âà~‘ÂÀ{‘ x‘ x‘ x‘ x‘ÂÀ{‘Âà~‘ x‘ …‘ …‘ …‘Â@ˆ‘Â€Ž‘Âà—‘Â›‘Â€Ž‘Â …‘ …‘ ‘‘Â€Ž‘Â ‘‘Âà—‘Â€Ž‘Â`‹‘Âà—‘Â›‘Âà—‘Â ž‘›‘ ž‘ ž‘›‘ ‘‘Â`‹‘ ‘‘ÂÀ”‘ ‘‘ ‘‘Â@ˆ‘Âà—‘Â`¤‘ÂÀ­‘Âà—‘Â ‘‘Â@¡‘ ž‘ ‘‘Âà—‘Â ž‘Â`¤‘Â@¡‘Â`¤‘ ž‘Â఑ ª‘Â`¤‘ÂÀ­‘Â`¤‘Â@¡‘Â@¡‘Â@¡‘ ž‘ ª‘Â@¡‘ÂÀ­‘ ª‘ÂÀ­‘ÂÀ­‘Âà°‘Â ·‘ ·‘´‘Â@º‘€À‘Â@º‘€À‘ÂàÉ‘Âàɑ Ñ€À‘ Ñ€À‘ ÑÂ`½‘ÂÀƑ Ñ ÑÂ`½‘Âàɑ БÂÍ‘Â@Ó‘ÂÀÆ‘ÂÍ‘ÂÍ‘Â@ӑ Ñ ÑÂàÉ‘ÂÍ‘Â`Ö‘Â@Ó‘Â@Ó‘Â@ӑ ܑ€ّÂ`֑ ܑ ܑ ܑÂàɑ БÂ@ӑ БÂ`Ö‘ÂÀß‘Â`Ö‘Â`֑ ܑÂ@ì‘Â`ï‘Â`ï‘ é‘€ò‘Â`ï‘Âàû‘Âÿ‘ ’ õ‘ é‘œ• #´Â BÌ€ËÂàÀÂà)´Â 3©Â 7 Â ™Â€P“ÂàÚŠÂ@¤OÂ@ÁÂ@É€zðÁ€ËÁ€u‘ÁºôÀÆÙ@‡¾A€žBöQB@ÆsBÀRƒB à†B Ù…BÀB1vBxfB/UB€\CB€–1B@y BVB€ B°åAÌA€¶´A’ŸA€ý‹A*sAMPAœ.AÒ A6Ø@––@ì)@à?h¿¿„dÀâ³ÀöÀõÁ[=Á+^Á~~Á€ÌÁ€ Á€Q°Á€nÀÁ€ÃÏÁ ßÁ€¾íÁ€2üÁ@ÂÀŸ €òÂÀ¢Â@ÜŸ!ÂÀý%ÂÀå)Âp-ÂÀ»0Â@3ÂÀL6«8ÂÀã:€ê<€Å>Â{@ÂÀBÂÀ{C€ìDÂ%FÂ@%GÂÀHÂáHÂ@–IÂ@,J€áJÂÀ}KÂ@LÂ@„LÂûLÂ@eMÂÀÕMÂYN½NÂÀOÂ@‹OÂÀÉOÂPÂfPÂÊPÂQÂ@4QÂ@fQÂ@±QÂ@ÊQÂÀ!RÂ@`RÂÀ…RÂ@’RÂ@ÝR SÂÀSÂ@ASÂ@sSÂ@¥SÂÑSÂÀTÂ5TÂÀGT€ZT€ŒTÂ@ŸTÂ@¸TÂäTÂÀUÂ@NUÂaUÂ@€U¬UÂ@ËU€êUÂÀ VÂÀ"VÂÀ;VÂ[VÂ@zVÂV€²V€²V€ËVÂñVÂ@WÂ@)W€HW€zWÂ@W¹WÂ@ØWÂÀäW€XÂXÂOXÂ@UXÂXÂ@ XÂÌXÂ@ëXÂ@YÂÀ)YÂ@hYÂÀtY”YÂÀ¦Y­YÂ@³YÂÆY€ëY€ZÂCZÂÀUZÂ@{ZÂ@”ZÂŽZ€šZÂ@­ZÂÀÒZ€þZÂ@[ÂÀ6[Â@\[Âo[Â@§[º[Â@Ù[Â@ \ÂÀ\ÂÀ0\€C\Â@V\Â@ˆ\Â@¡\ÂÀÆ\ÂÍ\Â@ì\Â@]Â@]Â@7]Âc]Â@‚]€¡]€Ó]ÂÀò]€^Â@ÿ]Â+^Â]^Â^ÂÀ¡^Â@®^Â@Ç^ÂÚ^ÂÀ_€1_ÂÀ7_€J_ÂÀ‚_ÂÀ›_»_Â@Ú_Â@ó_Â`ÂÀ1`Â@W`ÂÀ|`œ`Â@¢`ÂÀÇ`Â@í`ÂaÂÀaÂ@8aÂ@jaÂ@œaÂ@ÎaÂÀóaÂ@bÂÀ>b€QbÂ@dbÂ@}b€µbÂÛbÂÀíb cÂÀ8cÂ?cÂ@^cÂ@wcÂÀœc¼cÂÀÎcÂ@ d€,dÂRd„d€©d¶dÂÏdÂ@îdÂeÂÀúd€&eÂ@9eÂ@ReÂÀweÂ@eÂ@¶eÂÀÛeÂÀôeÂ@fÂ-fÂÀ?f€kf‘fÂÀ¼f€Ïf€èf€gÂ'g€3gÂ@_g‹gÂÀ¶gÂ@ÜgÂ@õgÂ@hÂÀhÂSh€‘hÂ@¤h€Ãh€ÜhÂ@ÖhÂ@ÖhÂÀâhÂ@ïhÂ@iÂÀ-iÂÀFiÂi€‹iÂ@·iÂÀÜiÂÀõiÂÀjÂ@MjÂÀrjÂ@j€…jÂÀ¤jÂ@ÊjÂÀïjÂÀkÂÀ!kÂÀSkÂÀlkÂŒkÂÀžkÂ¥kÂ×kÂ@ök lÂ"lÂÀ4lÂ@ZlÂ@sl€’lÂ@¥lÂÑlÂ@×lÂÀülÂ@;mÂ@TmÂgm€Œm€Œm²m€×m€×mÂ@n€;n€mnÂ@€nÂÀŒn€ŸnÂÀ¥nÂÅnÂ÷n€oÂ@/o€No€goÂÀ†o€™o€²o€ËoÂÀêo€ýoÂ@pÂÀ5pÂÀ5pÂÀgp‡pÂ@p pÂ@¦pÂ@Øp€÷pÂÀqÂ@yƒyÂ@‰yÂ@‰yœyÂÀ®y€ÁyÂÀÇyÂÀàyÂ@zÂzÂ@zÂÀ]zÂdzÂ@jzÂ@ƒz€¢zÂ@ÎzÂÀÚz€íz€{Â@{€8{Â@K{Â@K{Â@d{ÂÀp{Â@–{ÂÀ¢{Â@È{€ç{ÂÀí{€|Â@E|ÂX|€d|Â@w|Â@|Â@|Â@©|ÂÀµ|€¯|€È|Â@Û|ÂÀ} }Â9}ÂR}Â@X}Âk}ÂÀ–}€©}ÂÀ¯}ÂÀÈ}ÂÀá}Â~ÂÀú}ÂÀú}Â@î}Â@~Â3~ÂÀE~Â@k~Â~~Â@¶~€Õ~Ââ~ÂÀô~Â@ÂÀ Â-Â@LÂ_ÂÀŠ‘Â@°€ÏÂÀÕÂ@â€èÂà€Â €Â@&€Â€,€Â /€ÂÀ2€Â@?€Âà5€Â€E€ÂR€ÂR€Â€^€Â n€Â€w€Â ‡€ÂÀ–€Âà™€Â`€Â “€Â€©€Â`¿€Âàˀ Ҁ ë€Â ÷€Â  ÂÂ@ Â`#€&ÂÀ,Â`< BÂL [ÂÀ^Âàa t€ŠÂ Â šÂ šÂ šÂ ¦Â@¶Â€¼ÂàÅÂàÅÂâÂâ å å ñ ñ þÂ@‚  ‚ #‚ 0‚Â-‚€9‚ÂàB‚€R‚ b‚Â`h‚Âàt‚Â`‚€„‚Âà‚ ”‚€‚Â@°‚€¶‚ÂÀ¼‚Â@ɂ ҂ ߂ÂÀî‚ ë‚Âàñ‚Â`þ‚Â@û‚Â@û‚ ƒÂà#ƒÂ 6ƒÂ`0ƒÂ`0ƒÂ@ƒÂà<ƒÂ CƒÂ OƒÂ@_ƒÂ`{ƒÂÀ„ƒÂ ƒÂà‡ƒÂ`”ƒÂ šƒÂ¤ƒÂ`­ƒÂÀ¶ƒÂ ³ƒÂ@à̃Âփ كÂ@܃ÂàëƒÂ@õƒÂ„€„€-„Â@'„€-„ 0„ 0„Âà6„ I„ I„Â`\„Â`u„ {„Âà„Â`Ž„Â…„Â@‹„Âàš„Âàš„Â€ª„€ª„ÂÀ°„Â`À„ÂÀÉ„ÂÀɄ ӄ ߄ÂÀâ„€õ„ ø„Â@…Âà… …Âà…Âà0…ÂÀ-… 7…€@…ÂàI… P… \… i…Â@l… i…Â`o…Âà{…Â@……Â Ž…Â@ž…ÂÀª…€¤… ›…ÂÀ‘… §…Â`º… À… ͅÂ`Ӆ مÂ`ì…€ï…Âü… ÿ…€ï…Â@é…ÂÀõ… ÿ…Âà†Â`†ÂÀ'†Âà*†ÂÀ@†Â J†Â J†ÂÀY†Âà\†Â V†Â c†Â`i†Â o†Â@†Â ˆ†Â •†Â •†Â`›†Â ¡†Â৆Â৆ ®†ÂÀ½†ÂÀ½†Â@ʆ ӆÂ݆ à†Â ì†Â ‡Â`ÿ†Â ù†Â€‡Â ‡Â ‡ÂÀ!‡Â(‡Â(‡Â 7‡Âà=‡Â€M‡Â P‡ÂZ‡ÂZ‡Â@`‡Â ]‡Â`c‡Â i‡Âào‡Â v‡Â ‚‡ÂÀ…‡Âàˆ‡Â`•‡Â€˜‡ÂÀž‡Â¥‡Â€±‡Âງ¾‡Â€Ê‡ÂàӇ ڇ ڇÂÀé‡Â ó‡Â@ö‡Â ÿ‡Â ˆÂ`ˆÂ`ˆÂ ˆÂ€.ˆÂ`+ˆÂ 1ˆÂ 1ˆÂ 1ˆÂÀ4ˆÂ@AˆÂ JˆÂàPˆÂTˆÂ@ZˆÂàiˆÂàiˆÂ`vˆÂà‚ˆÂ`ˆÂÀ˜ˆÂà›ˆÂ€’ˆÂà‚ˆÂà‚ˆÂ`ˆÂ`ˆÂ ¢ˆÂ@¥ˆÂ€«ˆÂഈ »ˆÂ`ÁˆÂ »ˆÂ ÇˆÂ€ÄˆÂ ÇˆÂ ÔˆÂÀãˆÂ€öˆÂàÿˆÂ ùˆÂàÿˆÂàÿˆÂÀüˆÂ ‰ÂÀ‰Â ‰Â`%‰Âà1‰ÂÀ.‰Âà1‰Âà1‰Â@;‰Â D‰ÂàJ‰Â D‰Â€A‰Â Q‰Â@T‰Â ]‰Â j‰Âg‰Âg‰Âg‰Â j‰ÂÀy‰Â ƒ‰Â ƒ‰Â€Œ‰Â ‰Â€Œ‰Â@†‰Â ƒ‰Â ‰Â€¥‰Â€¥‰Â`¢‰Â ¨‰ÂஉÂஉ µ‰Âàlj Ή€׉ Ή ډ€׉ ډÂàà‰Âàà‰Â€×‰Âàà‰Â ç‰Â ç‰ÂÀö‰Â@ŠÂ  ŠÂàŠÂŠÂ€"ŠÂ`ŠÂ ŠÂÀ(ŠÂ >ŠÂÀAŠÂHŠÂ KŠÂ€TŠÂ€TŠÂ WŠÂÀZŠÂ dŠÂ€mŠÂzŠÂ }ŠÂàvŠÂ }ŠÂ@€ŠÂ ‰ŠÂ ‰ŠÂàŠÂ ‰ŠÂ –ŠÂ –ŠÂ€ŸŠÂ¬ŠÂ¬ŠÂਊ¬ŠÂ€¸ŠÂ »ŠÂ »ŠÂ »ŠÂ€¸ŠÂ »ŠÂ ÈŠÂ@ËŠÂ@ËŠÂÀ׊ áŠÂ`çŠÂàóŠÂàóŠÂàóŠÂ÷ŠÂ€‹Â ‹Âà ‹Â‹Â ‹Â‹Â@‹Â`‹ÂÀ"‹Âà%‹Â ‹Â€‹Â ‹Â ,‹Â`2‹ÂÀ;‹Â`K‹ÂàW‹Â`d‹Â€g‹Â€g‹ÂÀm‹Â j‹Â j‹ÂÀm‹Â w‹Â w‹Â w‹Â€€‹ÂÀ†‹Â ƒ‹Âà‰‹Â@“‹Âà‰‹Â`}‹Â ƒ‹Â€™‹Â¦‹Â¦‹Â໋ µ‹Â€²‹Â µ‹ÂÀ¸‹Â ‹ ‹€ˋ ΋Â`È‹Â@Å‹ÂÀы ۋ ΋€ˋ€ˋÂÀы ç‹Â€ä‹Â ç‹Â€ä‹Â€ä‹Â ç‹Â€ä‹Â ç‹Â@÷‹Â ŒÂàŒÂ &ŒÂ@)ŒÂ &ŒÂà8ŒÂ 2ŒÂ<ŒÂÀ5ŒÂ 2ŒÂ 2ŒÂ€/ŒÂÀ5ŒÂ ?ŒÂ KŒÂ XŒÂ dŒÂ€aŒÂ`^ŒÂÀNŒÂ XŒÂ`^ŒÂ dŒÂàjŒÂ`wŒÂ€zŒÂ }ŒÂ`wŒÂ`wŒÂ`ŒÂ@ŒÂ‡ŒÂ –ŒÂàœŒÂàœŒÂ@¦ŒÂàœŒÂàœŒÂ`©ŒÂ@¦ŒÂ ŒÂ`©ŒÂ ¯ŒÂ€¬ŒÂ ¯ŒÂ ¼ŒÂÀËŒÂÀˌ ȌÂàÎŒÂàΌ ȌÂ`ÛŒÂÒŒÂàÎŒÂ`ی ՌÂ`ی áŒÂ áŒÂÀäŒÂÀäŒÂÀäŒÂ îŒÂ úŒÂàÂàÂÂ@ ÂÀ€Â` Â` Âà  ,€)Âà2Â6 EÂ@U€B€B E RÂàK€BÂàKÂàKÂàK RÂ`XÂ`XÂhÂ@nÂ@nÂ`q wÂà}Â`ŠÂ „Â@‡Â „Â`ŠÂÀ“    €¦ÂÀ¬Â€¦ÂÀ¬Â`£ÂÀ¬Â³Â ©ÂÀ¬Â ©Â ©ÂÀ¬Â ¶Â€¿Â ÂÂàÈÂÌÂàÈÂ@Ò Û ÛÂÀÞ ÛÂåÂÀ÷ ôÂ`î èÂåÂ@ëÂ`îÂàúÂÀ÷ÂàúÂàúÂ@ŽÂ€ ŽÂ  ŽÂ  ŽÂ  ŽÂàŽÂàŽÂ  ŽÂ  ŽÂ€ ŽÂ` ŽÂ` ŽÂ &ŽÂ &ŽÂà,ŽÂ 3ŽÂ€<ŽÂ`9ŽÂ`9ŽÂ 3ŽÂ ?ŽÂ€<ŽÂÀBŽÂ ?ŽÂ`9ŽÂ ?ŽÂ@OŽÂ`RŽÂ`RŽÂ@OŽÂà^ŽÂ eŽÂbŽÂà^ŽÂbŽÂbŽÂbŽÂ eŽÂ`kŽÂ@hŽÂ qŽÂ`kŽÂàwŽÂ{ŽÂ@ŽÂ@ŽÂÀtŽÂàwŽÂ`„ŽÂ@ŽÂ ŠŽÂ`ŽÂ€ ŽÂ —ŽÂ £ŽÂ`ŽÂ £ŽÂ £ŽÂÀ¦ŽÂ ¼ŽÂ`¶ŽÂÀ¦ŽÂ £ŽÂÀ¦ŽÂ੎ °ŽÂ £ŽÂ °ŽÂ­ŽÂ °ŽÂ€¹ŽÂ`¶ŽÂ ¼ŽÂ ¼ŽÂ ¼ŽÂ€¹ŽÂ ÉŽÂàÂŽÂàÂŽÂÆŽÂÆŽÂ ÉŽÂÆŽÂ€ÒŽÂ€ÒŽÂ ÕŽÂ`ώ€ҎÂߎ âŽÂ îŽÂÀñŽÂ ûŽÂ`Â` Â Âà  Â` ÂÂ@ÂÀ  ûŽÂøŽÂ@þŽÂ`ÂàôŽÂ@þŽÂ€Â* -Â`3 -Â@0Â*Â*Âà&€6Âà? F 9Â`3€6€6ÂÀ<€6Âà? F€OÂÀUÂ`L RÂÀU RÂàXÂ\Â`eÂ\ÂàqÂàq kÂàq xÂàqÂàqÂ@{Â@{€Â`~Â@{Â@{Â@{ xÂàq xÂ@{ÂàŠÂ „ „ÂŽÂ ‘Â@”Â`—Â`—Â@” ‘Â`—Â@”Â`— Â`—€šÂ Â@­Â ªÂà£Â ªÂ@­Â€³Â`°Â€³Â ÃÂà¼Âà¼Â ¶ÂÀ¹Âà¼Â@ÆÂ`ɀ̀̀̀ÌÂ`ÉÂàÕ ÏÂÙÂÙÂàÕÂÀÒÂàÕÂ`âÂàî õ õ õÂ`û€þ€þÂ`ûÂàîÂ@øÂ`û  ÂàÂ@Â@  €Â@Â`ÂÀÂ$Â@* 'Â`-Â`-Âà9Âà9€0 ' 'Â`-Â@*Âà9Âà9Âà9 @Â@CÂà9Âà9Â@C LÂàR L LÂ`F @ 3ÂÀ6Âà9€0 3 3Â@CÂ`F€I LÂ`FÂ`FÂ`FÂÀOÂàRÂàRÂV€b eÂàkÂÀhÂo e e r rÂàk eÂàRÂ@\Âàk eÂàkÂ@uÂ`x ~ ~ ~ ~ˆÂ`‘Âà„ˆˆˆÂà„€{ÂÀˆ —€” —ÂÀšÂ€” ¤ÂÀšÂ — —ÂࠤºÂà¶Â ½Â@§Â@§Â¡Âà ¤Â`ªÂ`ªÂ@§Â °Â€­Â`ªÂÀ³Â€­ÂºÂ`ÃÂàÏ ÖÂ`Ü âÂÀå€ßÂ@ÙÂàÏÂ`ÜÂÀÌ€ÆÂ ÉÂӠր߀߀ßÂàèÂìÂ`õÂ@ò€øÂ ïÂ`õÂà‘ û û û ûÂà‘‘ÂÀþ ï ïÂ@ò€øÂ û ûÂÀþÂ@ ‘ ‘Âà‘ÂÀþÂà‘Âà‘Â`‘ ‘€‘€‘ ‘ ‘Âà‘ ‘€‘Âà‘ ‘ÂÀ‘ÂÀ‘ ‘ ‘Âà‘ ‘Â`'‘ !‘ -‘ -‘Â`'‘Â`'‘Â`'‘Âà‘€*‘ :‘€C‘Â`@‘Â`@‘ :‘Â`@‘€C‘Â@=‘Â`@‘Â`@‘ÂàL‘ÂÀI‘ÂÀI‘ F‘€C‘Â`@‘€C‘ÂÀI‘ÂÀI‘ÂP‘Â@V‘Â@V‘ S‘Â`Y‘ S‘ÂP‘ÂP‘ F‘ÂÀI‘ÂàL‘ S‘ÂàL‘Â@V‘€\‘ _‘Âi‘Âi‘Âàe‘ÂÀb‘Âi‘ l‘ÂÀb‘ _‘Âàe‘Âi‘€u‘ÂÀ{‘Â@o‘ÂÀ{‘‚‘€u‘ÂÀ{‘Â@o‘ l‘Â@o‘ x‘ x‘ x‘ x‘Â`r‘ x‘ x‘ l‘Âàe‘Âi‘ x‘ x‘ÂÀ{‘€u‘€u‘ x‘ x‘ …‘Â@ˆ‘Â`‹‘Â@ˆ‘ …‘Â`‹‘ ‘‘Âà—‘Â ‘‘ …‘ÂÀ{‘‚‘Â€Ž‘Âà—‘Â ‘‘Â€Ž‘Â›‘Âà—‘Â€§‘Â`¤‘ ž‘ ž‘Âà—‘Â@¡‘ ž‘Âà—‘Âà—‘Â ž‘€§‘ ª‘ ª‘Â@¡‘ ª‘ÂÀ­‘´‘Â఑€§‘Â఑€§‘ ª‘´‘ÂÀ­‘´‘€§‘Â`¤‘€§‘´‘Âà°‘Âà°‘Â`½‘€À‘€À‘ÂÀÆ‘ÂàÉ‘ÂÍ‘Â͑ ÑÂ@º‘Â`½‘Â`½‘Â`½‘´‘´‘ ·‘Â`½‘ ·‘ ·‘Â`½‘ Ñ€ّÂÍ‘Â@Ó‘Â͑ Б Ñ БÂÀÆ‘ÂàÉ‘Â͑ Ñ Ñ Ñ ÑÂÀÆ‘ÂàÉ‘Â`֑ ܑÂàâ‘ é‘ é‘ é‘€ò‘ é‘Âæ‘Â@ì‘Âæ‘€ّ ܑÂàâ‘Âæ‘Â`ï‘Â`ï‘Âæ‘ é‘Âæ‘Âæ‘€ّ ܑÂàâ‘€ò‘ é‘Â`ï‘ é‘Â`ï‘ õ‘Â`ï‘ õ‘€ò‘ õ‘ ’Âàû‘ ’Âàû‘ ’ õ‘ õ‘€ò‘ÂÀø‘Â@ì‘Â`ï‘ é‘Âæ‘Âæ‘Â`ï‘ õ‘€ò‘Âæ‘Âæ‘ é‘ÂÀß‘Âàâ‘Â@ì‘€ò‘Âàû‘Âàû‘ õ‘ õ‘Âàû‘ ’Â`’ ’Â`’Âàû‘ õ‘ ’Â@’Âàû‘ õ‘€ò‘€ò‘Âàû‘Âÿ‘Â`ï‘€ò‘ÂÀø‘Âàû‘Âàû‘Âàû‘Âÿ‘€ ’ ’Â`’€ ’Â`’ÂÀ’Â’Â’€ ’Â`’Âà’ ’ ’ ’ ’ ’ ’ ’Âà’ÂÀ’ ’ ’Âà’Â@’Â’Â@’Â`!’€$’Â`!’€$’Â`!’Â`!’ '’ '’Â`!’Â`!’Â`!’Â’Â@’€$’Â’Â@’ ’ÂÀ*’ '’ '’Â@’Â’Â`!’ '’Âà-’€$’Â`!’€$’Â`!’Â@’€$’ÂÀ*’ÂÀ*’€$’ '’ÂÀ*’Â1’Â`!’Â@’€$’€$’ '’Â@’Â`!’ '’€$’ÂÀ*’Âà-’ '’ '’Â1’Âà-’Âà-’Â1’Â@7’ 4’€=’ @’Â`:’ 4’Â`:’Â`:’Â`:’Â1’ 4’Âà-’Â@7’ÂJ’ @’ @’ @’ÂÀC’ @’€=’ÂàF’Â`S’ Y’ Y’Âà_’Âc’ Y’ Y’€V’Â`S’Â`S’ Y’Â@P’ M’Â`S’ M’ÂJ’ÂàF’ÂJ’ÂàF’Â`S’Â@P’€V’€V’ f’ f’Âc’ f’€o’Â`l’Âc’ Y’ Y’Â@i’ f’ f’Âà_’Â`S’Â`S’Â`S’ M’ M’Â`S’Âc’ f’Â@i’Âc’ Y’ f’Â@i’€o’ f’ f’ Y’Â`S’Â`S’ÂJ’ Y’Âc’Âà_’ f’Â`l’Â`l’ f’ f’ f’Â`l’ r’ f’Âàx’€o’€o’ÂÀu’ÂÀu’ ’ÂÀu’ r’€o’Â|’ÂÀu’Â|’ r’€o’€o’Â`l’ f’Â`l’ f’Â`l’Â`l’Â`l’ r’ÂÀu’ r’ f’ f’Â`l’€o’Âàx’€o’ r’Âàx’ r’ÂÀu’ ’Â|’ÂÀu’Â`l’Â`l’ÂÀu’Âàx’Âàx’ r’Â|’Â`…’ÂÀu’Â`l’€o’Â`l’ r’€o’Âà_’ f’€o’ r’ÂÀu’Â@‚’Âàx’ ’ ’Âàx’Âàx’ÂÀu’ r’Âàx’Âàx’ÂÀu’Âàx’ ’Â|’ ‹’Â@‚’Âàx’Â@i’Â`l’€o’Âàx’ÂÀu’ r’ r’ ’Âàx’Âàx’ r’ f’ f’ f’Â`l’Â@i’Â`l’Â`l’Â@i’Â`l’Â`l’Â@i’ r’ ’ ’ÂÀu’€o’€o’€o’€o’ ’Â@‚’Â@‚’ ’ r’ f’ r’Â`l’Âc’ÂÀu’Â|’ ’Â|’Âàx’ ’Â|’ÂÀu’ r’ f’ÂÀu’Â|’ ’ ’Âàx’ÂÀu’Â@‚’Â@‚’•’Â`…’Â@‚’ ’Â|’ r’ÂÀu’Â|’Â@i’ r’Â@i’ f’Âc’Âc’ r’ r’ÂÀu’Âàx’ ’ ’Â`…’Â@‚’Âàx’Â@‚’Â@‚’€ˆ’Âà‘’Âà‘’Â ˜’Âà‘’ÂÀŽ’Â`…’Â`…’Â|’Â@‚’ ’€ˆ’ ’Â`…’Âà‘’ÂÀŽ’Âà‘’ÂÀŽ’Â@‚’Âà‘’Â ‹’ ‹’Â`…’ ˜’ ˜’•’ ˜’ ‹’ ’Â`…’ ‹’ ‹’ÂÀŽ’Â ˜’Â`ž’ ˜’Âà‘’Â ‹’ ’€ˆ’Âà‘’ÂÀŽ’Â ‹’€ˆ’ÂÀŽ’Â€ˆ’Âà‘’Âà‘’Â ‹’Âà‘’Â ˜’Â`ž’Â@›’ ¤’ ¤’ ¤’Â`ž’ ˜’ÂÀŽ’Âà‘’Â•’ ˜’ ˜’ ‹’Â@›’ ˜’Âà‘’Âà‘’ÂÀŽ’ÂÀŽ’Âà‘’Â ‹’ ‹’Âà‘’ÂÀŽ’Â€¡’ ¤’ ¤’ ±’€º’ ±’ ½’Â@´’ ¤’Â@›’Â@›’Â`ž’Â`ž’®’Â઒ ¤’ÂÀ§’Â઒Â઒€¡’Â઒®’ ±’ ±’Â઒®’ ±’Â@´’®’ ±’Â`·’Â઒ ±’Â઒ ±’ÂÀ§’€¡’ ¤’Â`ž’€¡’ ¤’ ¤’ÂÀ§’ ¤’®’ ¤’®’Â઒ÂÀ§’ÂÀ§’®’ ±’Â઒ ±’ ½’Â`·’ÂÀÀ’ÂàÃ’ÂàÃ’Â Ê’ÂÇ’ÂÀÀ’Â`·’€º’€º’€º’Â`·’Â`·’Â`·’ ±’®’Â઒®’ ±’Â`·’€º’ÂÇ’ÂàÃ’Â ±’Â`·’ ½’€º’Â`·’Â`·’ÂÀÀ’Â@´’€º’ÂàÃ’Â`Ð’Â Ê’Â Ê’ÂÀÀ’ÂàÃ’ÂàÃ’Â@͒ ֒Â`Ð’Â@͒€ӒÂ`Ð’Â Ê’ÂàÒ ʒ ֒ ֒Â`Ð’Â Ê’Â@͒ ֒Â`Ð’Â Ê’Â Ê’Â Ê’ÂàÃ’ÂÀÀ’Â@͒ ֒ÂÀْ ֒Âàܒ€ӒÂ@Í’ÂàÃ’Â Ê’Â@Í’Â@͒ ֒€Ӓ ʒ€º’Â`·’ ½’ÂÇ’Â@Í’Â Ê’Â`Ð’Â@Í’Â`В ֒€ӒÂǒ ʒ ֒€ӒÂàܒ ֒Âà’ ã’ ã’ÂÀْ€Ӓ ֒Â`Ð’Â`В ֒€ӒÂ@Í’Â Ê’ÂÀْ ֒ÂÀْ€ì’ ã’Âàܒ ֒Â@æ’ ã’ÂàÜ’ÂàÜ’ÂàÜ’ÂÀÙ’Âàܒ ֒Â`В ֒Â@Í’Â`Ð’ÂÇ’Â Ê’Â@Í’Â`Ð’ÂàÜ’ÂÀÙ’ÂàÜ’Â ã’ÂÀÙ’ÂàÜ’Âà’ ã’ÂàÜ’Â ã’ ã’ ã’Â@æ’Â`é’ ï’ÂÀò’Â@æ’Â`é’Âàõ’Âàõ’Âàõ’ ï’ÂÀò’€ì’€ì’€ì’€ì’ ü’ ï’ ã’ ï’€ì’Âàõ’Âù’Âàõ’ÂÀò’Âàõ’ ï’Âàõ’Â`é’Â`é’Âàõ’Âù’Âàõ’Âàõ’ ã’ÂàÜ’Â`钠쒀쒀ì’Âàõ’ ü’ ü’Â@ÿ’Â`“ ü’ÂÀò’€ì’€ì’ ü’Â@ÿ’Âàõ’Âù’Â@ÿ’€“Â@ÿ’ ü’€“Â@ÿ’Âù’Âù’ “€“€“€“ÂÀ “ “Â`“ “Â@ÿ’Â@ÿ’Â@ÿ’Â`“€“ ü’Âù’ ï’Âàõ’ÂÀò’ ï’Âàõ’Âù’Âàõ’ÂÀò’ÂÀò’ ï’ÂÀò’Â@ÿ’ÂÀ “Âà“ ü’ ü’ ü’ ü’ ü’ ü’Â`“Âàõ’ÂÀò’ ï’Â`é’€ì’Âàõ’Âù’Âàõ’ ï’ ã’ ï’Â@æ’€Ӓ ֒ÂÀÙ’Â ã’ ã’ ï’Âàõ’Âàõ’ ï’Â`é’ÂÀò’€“Âàõ’Âàõ’€ì’€ì’Âàõ’Â`é’Â@æ’ÂàÜ’Â ã’ÂàÜ’Â@撠㒠㒠㒀쒠㒠֒ ֒Â@æ’Â@æ’ ã’ÂàÜ’ÂàÜ’Âàܒ€ì’ ã’Âà’Â@æ’ ã’Âà’Âà’ ֒€ӒÂ@æ’ ã’ ã’ÂÀْ ֒Â@Í’Â Ê’Â Ê’Â`Ð’Â@͒€ӒÂàܒ ֒Âàܒ ֒ ֒ ʒ€ӒÂàܒ ֒Â`Ð’ÂÀْ ֒Â`Ð’Âǒ€Ӓ€ӒÂ`Ð’ÂàÃ’ÂÀÀ’Â@Í’ÂÇ’Â`Ð’ÂàÃ’ÂàÃ’Â`·’ÂàÃ’ÂÀÙ’Âà’ÂÀÙ’Âàܒ ֒Â`Ð’ÂÀÙ’Â`Ð’Â`Ð’Â Ê’Â Ê’ÂàÃ’ÂàÃ’ÂàÃ’ÂÇ’ÂÇ’Â`Ð’ÂÇ’Â Ê’Â@Í’Â@Í’Âǒ ½’ÂàÃ’Â`·’ ½’ÂÇ’ÂàÃ’Â Ê’Â`·’ÂàÃ’Â Ê’Â`Ð’Â`Ð’Â@͒ ½’€º’ÂàÃ’ÂàÒ ʒ€Ӓ ʒÂÇ’Â Ê’Â@͒ ½’ÂÇ’Â@͒ ʒ€ӒÂ`В€ӒÂàÜ’Â ã’ ã’ÂàÜ’Âà’Â@æ’ ֒ ֒€ӒÂ`В€ӒÂ`В ʒ€ӒÂ@͒€ӒÂàܒ€ӒÂàÜ’ÂÀÙ’Âà’ÂàÜ’ÂàÜ’Âà’ÂàÜ’ÂÀْ ֒ ֒€Ӓ€Ӓ ʒÂ`Ð’Â@͒ ֒Â`Ð’Â`Ð’Â Ê’ÂÀÙ’ÂÀÙ’Â@æ’ÂàÜ’ÂàÜ’ÂÀْ ֒Â@Í’Â`В ֒Âàܒ ֒ÂàÜ’ÂàÜ’Â ã’Âà’ÂÀÙ’ÂÀÙ’ÂÀْ€Ӓ€Ӓ ֒€ӒÂàܒ ֒ ֒ÂàÜ’Âàܒ€Ӓ€ӒÂ`Ð’Âà’ÂàÜ’ÂÀْ ֒Âàܒ ֒ ã’Â`é’Â`é’ÂÀÙ’ÂàÜ’Â ã’ ã’ ã’ÂÀْ ֒Â`В ʒ ʒ€ӒÂ@͒€Ӓ€ӒÂ@Í’Â@͒ ֒Âà’ÂàÜ’ÂÀْ ֒ÂÀÙ’Â@æ’Â@æ’ ã’ ã’ ã’ ã’ÂàÜ’ÂàÜ’Â ã’Â`é’ÂàÜ’Â`В ֒€ӒÂ`Ð’ÂÀÙ’ÂàÜ’Â ã’ ã’€ì’ÂÀò’ÂÀò’€ì’Âà’Âà’Âà’€ӒÂàܒ€ì’ ï’Âà’ ֒Â@͒ ֒€ӒÂà’ ã’Âà’Â`Ð’Â Ê’Â@Í’Â`В ֒€Ӓ ֒ÂÀÙ’Âàܒ ֒ ʒ ֒Â`В ֒ ʒÂÇ’Â@Í’Â`В ֒€ӒÂ`Ð’Â@Í’Â`·’ÂÀÀ’ÂàÃ’ÂàҀº’ÂàÒ ½’ÂÀÀ’ÂÀÀ’ ½’ ½’ ½’ ʒÂàÃ’ÂÀÀ’Âǒ ½’ÂÀÀ’€º’Â`·’ ±’®’Â઒ ±’Â઒ ¤’€¡’ ±’®’ ±’ÂÀ§’ÂÀ§’Â઒®’ÂÀ§’€¡’®’ ¤’ ±’ ±’ÂàÃ’ÂÀÀ’ ±’ ½’Â`·’Â@´’ ±’Â`·’€º’Â@´’ ±’Â`·’®’Â@´’ÂàÃ’Â`·’€º’ ±’ ¤’Â`ž’ ˜’ ¤’®’Â`ž’Â@›’•’ ˜’ÂÀŽ’Â ‹’ ‹’Â`ž’Â`ž’ ¤’ ±’Â઒®’€º’Â`·’ÂÀ§’ ¤’Â઒ ±’Â`·’ ±’€¡’Â@´’ ±’®’ ±’ ±’ ±’®’Â`·’ÂÀ§’Â઒ ¤’ÂÀ§’ ±’ ±’ ±’ÂÀ§’Â@›’ ˜’Â`ž’€¡’ ¤’®’ÂÀ§’®’Â઒ ¤’Â઒ÂÀ§’Â઒ ¤’ÂÀ§’Â@´’Â`·’Â઒ ±’ ±’€º’Â`·’ ±’Â઒Â઒Â઒€¡’ ¤’ ˜’ ˜’ ¤’€¡’€¡’ ¤’ ¤’€¡’®’ÂÀ§’ ±’Â઒ ±’Â઒®’ ±’€¡’ ¤’ ˜’Â`ž’ÂÀŽ’Â€¡’€¡’€¡’ ˜’ ‹’ÂÀŽ’Â ‹’€ˆ’Â@‚’Â@‚’ ’€ˆ’Â@‚’ ’ÂÀu’ r’ r’ÂÀu’Â`l’Â`l’ f’Â@i’ f’Âc’Âà_’Â`S’ M’Â@P’ Y’Âc’Â`S’ÂJ’ÂÀC’ÂJ’ M’Â`S’ @’€=’ 4’Â1’Âà-’Â1’Â1’Â1’€=’ @’Â1’Âà-’ÂÀ*’ÂÀ*’ ’ ’ ’Â`!’€$’ 4’ 4’ÂÀ*’€$’ '’Â’Â’ ’Âàû‘ÂÀø‘Âàû‘Âÿ‘Âàû‘ õ‘€ò‘ÂÀø‘ ’ ’Âàû‘ õ‘ õ‘Âàû‘Âÿ‘Â`’ ’€ ’€ ’ÂÀø‘Â@ì‘€ò‘ õ‘Â@ì‘Âàâ‘ é‘€ò‘Â`ï‘Âàû‘Âÿ‘Â`ï‘€ò‘Â`ï‘Âàû‘€ò‘ é‘Â`Ö‘Â`Ö‘ÂàÉ‘Âàɑ Б€ّ ܑ ܑÂàâ‘ é‘ÂÀߑ БÂàÉ‘Â@Ó‘Â@Ó‘Â@Ó‘ÂÀÆ‘ÂÍ‘ÂÍ‘Â@Ó‘Â@Ó‘ÂÍ‘ÂÀƑ Ñ БÂ`֑ ܑ ܑÂ@ӑ€ّÂ`֑ Б ÑÂÍ‘Â`Ö‘Â`Ö‘ÂÍ‘ÂÍ‘Â`Ö‘ÂàÉ‘Â@Ó‘Â`֑ БÂÍ‘Âàɑ БÂÀƑ ÑÂàÉ‘Â`½‘ ÑÂàÉ‘ÂÀƑ ÑÂàÉ‘ÂÍ‘ÂÍ‘ÂÀÆ‘ÂÀƑ ÑÂÀÆ‘ÂÀƑ ÑÂÍ‘Â͑ ÑÂÀÆ‘ÂÀÆ‘ÂÀÆ‘ÂàÉ‘Âàɑ Б€ّ Б БÂ͑ БÂÍ‘Âàɑ Ñ Ñ ÑÂ`½‘´‘´‘Â@º‘€À‘€À‘€À‘Â`½‘Â`½‘ БÂ`Ö‘ÂÀƑ ÑÂ`½‘Â`½‘ Ñ Ñ Ñ ÑÂàɑ Б БÂ@Ó‘Âàɑ€À‘Â`½‘ ÑÂÀÆ‘Âàɑ€À‘ Ñ€À‘€À‘€À‘ ·‘´‘Â`½‘Â@º‘´‘ ·‘Â`½‘ ·‘Âà°‘ÂÀ­‘´‘ ·‘€À‘Â@º‘ ÑÂÀÆ‘Â`½‘ ·‘ ·‘ÂÀƑ ÑÂ`½‘ ÑÂ@º‘ ·‘Â`½‘Â@º‘Â`½‘Â@º‘ ÑÂ`½‘€À‘Â`½‘Â`½‘€À‘Â`½‘ ÑÂ@º‘ ÑÂ`½‘´‘Âà°‘Â ·‘Â`½‘€À‘Â@º‘€À‘€À‘´‘ ·‘Â@º‘€À‘ ·‘Â఑´‘ ·‘Â@º‘ ·‘€À‘€À‘ ÑÂ`½‘ÂÀÆ‘Â`Ö‘ÂÍ‘Â`½‘Â@º‘Âà°‘Â ·‘´‘ÂÀ­‘ÂÀ­‘Â@º‘ ·‘ ª‘ÂÀ­‘ÂÀ­‘€§‘Âà°‘ÂÀ­‘ÂÀ­‘´‘Âà°‘Â`½‘ Ñ ÑÂÀƑ Ñ Ñ ÑÂ`½‘ÂàÉ‘Â`½‘€À‘Â`½‘ Ñ БÂÀÆ‘ÂÍ‘ÂÍ‘ÂàÉ‘Â͑ ·‘ ·‘ ·‘Â఑´‘Â`½‘ÂÀ­‘Âà°‘Â@º‘ ·‘Â@º‘Â@º‘Â`½‘ Ñ€À‘€À‘ Ñ Ñ ÑÂàɑ ÑÂ@º‘ Ñ ·‘ÂÀ­‘€§‘Â఑€À‘ Б БÂàÉ‘ÂÀÆ‘ÂÀƑ Ñ ·‘´‘ ·‘€À‘Â@º‘Â`½‘ÂÀÆ‘ÂàÉ‘ÂÀÆ‘Âàɑ БÂÍ‘Â`½‘ÂÀÆ‘ÂÍ‘ÂÍ‘ÂÍ‘Â@ӑ€ّ€ّ€ّÂÍ‘ÂàÉ‘ÂÀÆ‘Â͑€À‘Â@ӑ ܑÂàâ‘ÂÀߑ€ّ БÂàÉ‘ÂÍ‘Â`֑€ّ Б Б€ّÂ@Ó‘Â`Ö‘Â Ð‘Â€Ù‘Âæ‘ é‘ÂÀߑ ܑÂàÉ‘Â`Ö‘Âàɑ Ñ ÑÂàɑ БÂàâ‘Â`ï‘ é‘Âæ‘ é‘Â@ì‘€ò‘Â`ï‘Âæ‘Â`ï‘Â@ì‘Â`ï‘ é‘€ّÂ`֑€ّÂàâ‘Â`֑€ّ€ّÂàâ‘ ܑ€ّÂÀߑ€ّ é‘ÂÀø‘ õ‘Â@ì‘ õ‘ é‘Âæ‘Â`ï‘Â`ï‘ é‘Âæ‘Â`֑ ܑÂ@ì‘Â@ì‘Â@ì‘Â`ï‘Âæ‘Âàâ‘€ّÂ@Ó‘ÂàÉ‘Â@Ó‘ÂÍ‘Â`Ö‘Â͑ Ñ Ñ ÑÂ`½‘ ÑÂ@º‘ ª‘Â@¡‘Â@¡‘ ž‘ ‘‘Â@ˆ‘Âà~‘Âà~‘‚‘Â`‹‘ …‘€u‘Â`‹‘Â@ˆ‘‚‘Â`r‘Â`r‘ l‘ _‘Âàe‘ _‘ S‘ÂÀI‘€C‘€C‘Â`@‘€C‘Â@=‘ÂàL‘ S‘ÂP‘€C‘ÂàL‘ F‘Â@=‘ÂÀ0‘Âà3‘€*‘Â@$‘ !‘Âà‘Â`'‘Âà3‘ -‘€*‘Â`'‘Â@$‘ -‘Âà3‘ÂÀ0‘ÂÀ0‘€*‘ -‘ !‘ÂÀ‘ !‘ !‘ !‘Â`'‘ !‘Â`'‘Â`'‘ -‘ !‘Â`'‘ ‘Âà‘Âà‘ !‘Âà‘ ‘Â@ ‘€‘ ‘Âà‘€‘‘ !‘Âà‘ !‘ !‘Â`‘ ‘Â`‘Âà‘Âà‘‘ ‘ ‘Â@ ‘ ‘Â`‘ÂÀ‘Â`‘Â`‘Âà‘Âà‘ ‘ÂÀþÂÀþÂ@ ‘‘‘ ‘€‘Âà‘Âà‘Âà‘ÂÀþ‘‘ ûÂ`‘ !‘ !‘€‘Â@$‘ !‘Â`'‘Âà‘ ‘€‘ ‘ ‘ ‘ ûÂà‘ ûÂà‘ÂÀþÂÀþ û ‘‘ ‘‘‘Â`‘ ‘Âà‘ÂÀþ ûÂ`õ ûÂ`õ€øÂ û€øÂ û ‘Âà‘‘Âà‘Âà‘ÂÀþÂÀþ€øÂ`õ âÂì€øÂ û€øÂ`õ€øÂ ûÂà‘Âà‘ û û€øÂ€øÂ û ûÂÀþÂà‘€øÂÀåÂÀåÂàè ï ïÂìÂàè ï ûÂÀþÂ`õÂìÂ@ò ï ïÂ@ò€øÂ ïÂ@òÂ@ò€øÂ`õÂà‘Âà‘ÂÀþ û û ûÂ`õÂ`õ ïÂ`õÂìÂàèÂàèÂ`õÂì ïÂìÂ`Ü â€ß ÖÂ@ÙÂÓÂÀåÂàèÂàèÂÀå â ï ï ï€øÂ ûÂà‘Â@òÂ@ò ïÂìÂ`õ€øÂ€øÂ ï ïÂìÂÀå€ßÂ`ÜÂÀåÂàèÂìÂàèÂÀåÂÀåÂ@ÙÂàÏ Ö ÖÂ@Ù€ßÂ`ÜÂ@ÙÂ@ÙÂ`ÜÂìÂàè ïÂ`õ ï ïÂ@òÂàè ï ï€ßÂ`ÜÂàèÂìÂ@ò ï ïÂàè€ß€ßÂÓÂ`Ü ÖÂ`Ü ÖÂ`܀ߠâÂàè€ßÂ`ÜÂ`ÜÂàè â€ßÂ`Ü Ö âÂàè â âÂÀå€ßÂ@Ù Ö Ö€ßÂÀå âÂÀå ïÂ`õÂìÂÀå âÂàèÂìÂ`õÂ`õÂ@ò€øÂ€øÂ@òÂ@ò ïÂ`õ€øÂ€øÂ`õÂ`õÂ@òÂìÂÀåÂì â â â ïÂ@òÂ@òÂ`õÂàèÂ@ò ûÂàèÂìÂ@ò ï ïÂàèÂàèÂÀåÂÀå â€øÂÀþ ‘Âà‘ ûÂ`õ ï€øÂ€øÂ ï û û‘‘€øÂ‘ ‘Âà‘ ûÂÀþ€øÂ€øÂ ïÂìÂ`õ ïÂ`õÂ@ò€øÂ û û ûÂà‘ÂÀþÂÀþÂà‘ ‘€‘‘‘Â@ ‘‘Âà‘Âà‘Â@òÂ@òÂà‘‘‘ ‘Â@ ‘‘Âà‘‘‘ ‘ ‘ÂÀ‘Â`‘Âà‘Âà‘ !‘ -‘ -‘Âà3‘Â@$‘Âà‘ !‘ !‘‘ !‘Â@$‘Â`'‘‘ ‘ÂÀ‘Â`'‘Â@$‘Âà3‘ -‘ -‘€*‘ !‘Â`'‘Âà‘‘Âà‘Â`‘ !‘ÂÀ0‘Â`'‘ !‘ !‘ ‘ ‘ !‘€*‘€*‘ !‘Â@$‘Âà‘‘Â@$‘Âà‘Âà‘‘Âà‘Â@$‘ -‘ -‘Â`'‘€*‘€*‘Â`'‘Â`'‘ÂÀ0‘€*‘Â`'‘Â@$‘Â@$‘‘Â@$‘Â@$‘ -‘ !‘Â`'‘Â7‘ :‘Âà3‘Â`'‘ :‘ -‘ -‘ -‘Â`@‘ :‘Â@=‘Â@=‘Âà3‘€*‘ -‘Â`'‘Â`'‘€*‘ !‘Â`'‘€*‘Âà3‘ -‘ -‘Â7‘ÂÀ0‘€*‘‘€*‘Âà3‘ÂÀ0‘Âà3‘Â@=‘Â`@‘Â`@‘Â@=‘Âà3‘‘Âà‘‘ ‘€*‘Â7‘ -‘ :‘ :‘€C‘Â@=‘Â@=‘Â@=‘ :‘Âà3‘Â`@‘ F‘€C‘ :‘Âà3‘Âà3‘€*‘Â`'‘Â7‘Â@=‘ :‘Â@=‘ :‘Â@=‘Â7‘ÂÀ0‘ -‘ -‘Âà3‘ :‘Â7‘Â7‘Â@=‘Â@=‘Â@=‘Â@=‘ :‘ :‘ :‘ F‘€C‘Â7‘Â7‘ :‘ F‘ :‘ :‘Â`@‘ F‘ F‘ F‘ÂàL‘ÂP‘ÂàL‘ÂàL‘Â`Y‘ÂàL‘Â@V‘Â@V‘Â@V‘Â`Y‘ÂàL‘ F‘ S‘ S‘€C‘ F‘Â`@‘€C‘ :‘Â`@‘ F‘Â@=‘ :‘ :‘Âà3‘ :‘Â@=‘ :‘Â7‘Â`@‘Â@=‘Â7‘Â@=‘ F‘Â@V‘ S‘ S‘€\‘ S‘ S‘ÂàL‘ÂP‘ F‘Â@=‘ÂÀI‘ S‘ S‘Â@V‘Â`Y‘ _‘ S‘Â`Y‘ÂP‘ÂàL‘ F‘Â@=‘ F‘€C‘ F‘ÂàL‘ÂàL‘ S‘ S‘€\‘ÂÀb‘ÂÀb‘Âàe‘Â@V‘Â@V‘ÂP‘ S‘ÂÀI‘ÂàL‘€C‘ S‘ S‘ÂP‘ S‘ÂP‘ÂàL‘ÂàL‘ S‘ÂàL‘ÂàL‘€\‘€\‘Â@V‘ _‘€\‘Â`Y‘€\‘ _‘ S‘Â@V‘ F‘€C‘ÂÀI‘Â`Y‘ S‘ÂP‘ S‘ S‘ S‘ÂP‘ S‘ S‘Â@V‘ S‘ÂP‘Â@=‘Âà3‘Â7‘Â`@‘Â`@‘ F‘Â@V‘Â`Y‘ S‘ F‘ÂàL‘Â@V‘Â`Y‘ _‘Â`Y‘€\‘ _‘Â`Y‘ÂP‘ÂÀI‘Â`@‘ F‘€C‘ F‘ÂÀI‘ÂÀI‘ÂP‘ÂàL‘ÂàL‘ÂÀI‘ S‘ÂP‘ S‘ S‘Â`Y‘ÂP‘Â@V‘ÂP‘ÂP‘ÂÀI‘ F‘€C‘ÂÀI‘ F‘€C‘Â7‘Âà3‘€C‘ S‘Â@V‘ S‘ÂàL‘ F‘ÂÀI‘ÂP‘ÂÀb‘ S‘ S‘Â`Y‘ S‘Â@V‘Â`Y‘ S‘€\‘Âi‘Âàe‘€\‘Âàe‘Âàe‘Âi‘ _‘ l‘ S‘Â@V‘Â@V‘ÂÀI‘ÂàL‘ F‘ F‘ F‘Â`Y‘ _‘€\‘ _‘Âàe‘ l‘Â`Y‘ÂP‘ÂP‘€C‘Â`Y‘Â`Y‘€\‘Â@V‘Â`Y‘ S‘Â@V‘ÂP‘ÂàL‘ S‘Â`Y‘€\‘Â@V‘ÂP‘ÂàL‘ F‘€C‘ÂÀI‘€\‘ _‘Âàe‘Âàe‘ _‘Âàe‘ _‘Â@V‘ÂP‘ÂP‘ S‘Â@V‘ S‘€\‘€\‘ S‘Âàe‘ _‘ÂÀb‘ _‘ _‘Âàe‘ _‘ _‘Âàe‘Âàe‘Âi‘ l‘Â@o‘Â`r‘Âi‘Â@o‘ l‘Âi‘Âi‘Âàe‘Â@o‘ _‘ÂÀb‘ l‘€u‘ l‘Âàe‘Âi‘ _‘Âàe‘ l‘Âàe‘ l‘Âi‘ _‘Âàe‘Â@o‘ x‘€u‘ x‘ x‘ x‘Âi‘Â`r‘ÂÀ{‘‚‘ÂÀ{‘ÂÀ{‘€u‘ x‘€u‘Âà~‘ÂÀ{‘ x‘‚‘ÂÀ{‘ÂÀ{‘ x‘€u‘€u‘ l‘Â@o‘ l‘Â`r‘Â`r‘ …‘ …‘ …‘ …‘ …‘ ‘‘ ž‘›‘ ‘‘Â@ˆ‘ …‘ …‘€u‘ l‘Â`r‘‚‘Âà~‘ ‘‘Â@ˆ‘ÂÀ{‘ x‘ x‘€u‘Â`‹‘Â€Ž‘Â x‘Âà~‘Â`‹‘Â`‹‘ …‘‚‘€u‘‚‘ …‘Â€Ž‘Â`‹‘Â`‹‘ ‘‘ …‘ …‘Âà~‘ …‘Â€Ž‘Â`‹‘ÂÀ”‘Âà—‘Âà—‘Â›‘Â`¤‘€§‘Â@¡‘ ž‘Â@¡‘Â`¤‘ÂÀ”‘Âà—‘ÂÀ”‘Â€Ž‘Â`‹‘ ‘‘ ž‘ ª‘Â`¤‘ ª‘ ª‘Â@¡‘Â`¤‘ ª‘ÂÀ”‘ ž‘Âà—‘Â ‘‘ ‘‘ ‘‘›‘ÂÀ”‘ ž‘ ž‘Âà—‘ÂÀ”‘Âà—‘Âà—‘Â›‘ ‘‘Â€Ž‘Â ‘‘ …‘Âà~‘‚‘ …‘Âà—‘Âà—‘ÂÀ”‘Â`¤‘ÂÀ­‘Â`¤‘Âà—‘Â ‘‘ …‘‚‘Âà~‘ÂÀ{‘Âà~‘‚‘ …‘Â€Ž‘Â ‘‘Â€Ž‘Â€Ž‘Âà—‘Â ª‘Â@¡‘ ž‘Âà—‘Âà—‘ÂÀ”‘ ž‘Â`¤‘ ª‘€§‘€§‘Âà—‘Â›‘Âà—‘ÂÀ”‘Â`‹‘Âà—‘Â@¡‘€§‘›‘Â@¡‘ ž‘Âà—‘Â`¤‘ ‘‘Âà—‘ÂÀ”‘›‘ ž‘Â`¤‘€§‘ ž‘Â`¤‘Â`¤‘Â@¡‘€§‘›‘ ž‘Â`¤‘ÂÀ­‘Â`¤‘ ª‘Â`¤‘€§‘Â@¡‘›‘ ž‘ ž‘Âà—‘Âà—‘Â›‘ÂÀ”‘Â€Ž‘Âà~‘ …‘Â€Ž‘Â€Ž‘Â ‘‘Â@¡‘ ª‘Â@¡‘›‘ ž‘ ‘‘ …‘Â@ˆ‘ÂÀ”‘Âà—‘Âà—‘Â›‘ÂÀ”‘Â`‹‘Â€Ž‘Â€Ž‘Â ‘‘ …‘Â@ˆ‘Â€Ž‘Âà—‘Â@¡‘ ª‘Â@¡‘Â`¤‘Â`¤‘›‘ ž‘Â@¡‘ ž‘Â@¡‘ ž‘€§‘Â`¤‘ ž‘ ª‘Âà—‘Â ª‘€§‘€§‘Âà—‘Âà—‘Âà—‘ÂÀ”‘ ‘‘›‘ ž‘ ‘‘Â`‹‘›‘Âà—‘Â`‹‘Â`‹‘Â`‹‘Â€Ž‘Â€Ž‘Â`‹‘ ‘‘ …‘Â€Ž‘Â@ˆ‘ …‘ ‘‘Âà—‘Âà—‘Â`¤‘Â@¡‘›‘ ž‘ ‘‘Â@ˆ‘Â€Ž‘Â`‹‘ …‘Â@ˆ‘ÂÀ{‘Â`‹‘Â€Ž‘ÂÀ{‘ x‘Âà~‘Âà~‘Â`‹‘ ‘‘Âà—‘Âà—‘Â ‘‘ÂÀ”‘Âà—‘Â@¡‘Â€Ž‘Â ‘‘ÂÀ”‘›‘Â`¤‘Â`¤‘Â€Ž‘ÂÀ”‘ ‘‘Âà—‘Â`¤‘ÂÀ­‘€§‘ ž‘ ž‘›‘€§‘ ª‘ ª‘ ‘‘ ‘‘Â@¡‘ ž‘ÂÀ”‘›‘ÂÀ”‘ ‘‘ÂÀ”‘Âà—‘Â@¡‘€§‘Â`¤‘Â`¤‘Â`¤‘Â@¡‘Â`¤‘€§‘Â`¤‘€§‘ ª‘´‘ ·‘ÂÀƑ Б ÑÂ`½‘ Ñ ·‘Â`½‘ ª‘Â఑ ª‘ ·‘ ·‘Â`½‘€À‘´‘Â`½‘ÂÀ­‘ÂÀ­‘Âà°‘Âà°‘ÂÀ­‘ÂÀ­‘ ª‘€§‘Â`¤‘Â`¤‘Â`¤‘Â`¤‘Âà°‘Â`¤‘€§‘ÂÀ­‘ ·‘ ·‘ ·‘´‘´‘Âà°‘Âà°‘ÂÀ­‘€À‘ÂÀƑ€À‘Â@º‘Â఑´‘ ·‘Âà°‘ÂÀ­‘Âà°‘Â ·‘ÂÀ­‘Âà°‘Â఑´‘´‘´‘Â@º‘Â`½‘Â`½‘€À‘Â@º‘€À‘ ·‘Â@º‘ ·‘Âà°‘Â ·‘Â఑´‘ ·‘ÂÀƑ Б Ñ€À‘Â`½‘Â@º‘Â@º‘´‘ ª‘ÂÀ­‘ ·‘´‘Âà°‘ÂÀ­‘ ·‘Â@º‘ ÑÂàÉ‘ÂÍ‘Âàɑ ÑÂÀ­‘´‘ ª‘ ª‘´‘´‘ ·‘´‘ Ñ Ñ Ñ ÑÂ͑ ÑÂÀÆ‘Â`½‘Â`½‘ Ñ ÑÂ`½‘ Ñ Ñ€À‘´‘ ·‘€À‘Â`½‘ ·‘ÂÀÆ‘Âàɑ Ñ€À‘ ÑÂàɑ БÂ@Ó‘Â@ӑ Б БÂ`Ö‘Â@ӑ ܑÂ`Ö‘Â`Ö‘ÂàÉ‘Âàɑ БÂàɑ€À‘Â`½‘ÂÀÆ‘ÂàÉ‘ÂàÉ‘Â`֑ ÑÂàÉ‘Âàɑ Ñ ÑÂÀÆ‘Â͑ ܑ Б БÂàɑ ÑÂÀƑ€À‘ БÂ@Ó‘Â`Ö‘Â`Ö‘Â é‘Âàâ‘Âàâ‘ é‘Â@ì‘ÂÀß‘Â`֑ БÂÀߑ ܑ ܑ ܑ ܑ Б БÂ@Ó‘ÂÍ‘Â@ӑ€ّÂ`֑ ܑ Б Ñ€ّ ܑ é‘ é‘ ܑÂ@Ó‘Â`Ö‘Âàâ‘Âàâ‘ ܑ€ّ ܑ€ّ€ّ ܑ é‘Âæ‘ é‘Â@ì‘Â`ï‘Âàâ‘Âæ‘Âàâ‘ ܑ€ّ€ّ ܑÂÀß‘Âàâ‘ÂÀß‘Âàâ‘Â`ï‘€ò‘Â`ï‘ ܑ€ّÂÀß‘ÂÀß‘Âàâ‘Â@Ó‘Â`֑€ّ€ّ€ّ é‘ÂÀß‘Âæ‘€ò‘ é‘Â`ï‘ÂÀø‘ õ‘Â`ï‘Âàâ‘Âàâ‘Âàâ‘Âàâ‘€ّÂàâ‘Â@ì‘ õ‘ÂÀø‘ é‘Âæ‘Âæ‘Â`Ö‘Â`Ö‘Â`֑ ܑ€ّ Б€ّ ܑÂ@Ó‘Â@Ó‘Âàâ‘ÂÀߑ€ّÂàâ‘Âæ‘Âàâ‘€ّ é‘ é‘€ò‘ õ‘Â`ï‘Â@ì‘ é‘Â@ì‘ õ‘Â`ï‘Â@ì‘ÂÀß‘Âæ‘ ܑ õ‘€ò‘ õ‘€ò‘Âàâ‘€ّ€ّ ܑÂàâ‘ÂÀß‘Âæ‘€ò‘ é‘Âæ‘Âàâ‘Âæ‘ é‘Âàâ‘Âæ‘ÂÀß‘ÂÀߑ ܑ ܑ ܑ ܑÂÀß‘ÂÀß‘Âàâ‘Âàâ‘ÂÀß‘Âæ‘ÂÀß‘Â`Ö‘Âàâ‘ ܑÂàâ‘ ܑÂ`֑ ܑÂÀß‘Âæ‘ ܑ Б БÂ@ӑ€ّÂ@Ó‘Â€Ù‘Â€Ù‘Âæ‘Âàâ‘ ܑÂÀß‘Â`Ö‘Â@ӑ ܑ БÂ`Ö‘Â@ӑ ܑ БÂàɑ Б Б Ñ Ñ ÑÂ@Ó‘ÂàÉ‘Âàɑ ÑÂàɑ€À‘ ·‘´‘´‘ ª‘Âà°‘Â఑´‘Â`½‘ ÑÂ͑ ÑÂàɑ ÑÂ͑ ܑ Б Б ܑÂàâ‘ÂÀߑ ܑ Б БÂ͑ Б БÂ@ӑ€ّ Б Ñ€À‘€À‘ ÑÂ`½‘ÂÀƑ ÑÂ`½‘´‘ ·‘Â`½‘Âàɑ€À‘€À‘€À‘€À‘€À‘ÂÀÆ‘Â@ӑ БÂàɑ ÑÂ@Ó‘Â͑ Ñ€À‘´‘ ·‘ ·‘ ÑÂ`½‘Â@º‘€À‘€À‘ÂÀÆ‘Â`½‘ Ñ ÑÂàÉ‘ÂÀÆ‘ÂÀÆ‘ÂÍ‘ÂÀƑ ÑÂàÉ‘Â`Ö‘Âàɑ БÂàÉ‘ÂÍ‘Â@ӑ БÂ`½‘€À‘Âàɑ ܑ Б€ّ ܑÂ@ì‘ÂÀß‘ÂÀß‘Â`֑€ّ ܑÂàâ‘Âàâ‘Âàâ‘ ܑÂàâ‘Âàâ‘ é‘Âæ‘ é‘ÂÀߑ€ّ БÂ@Ó‘ÂÍ‘ÂÀÆ‘Â@Ó‘Â`֑ ܑÂàâ‘Âàâ‘Âàâ‘Âàâ‘ ܑÂ@Ó‘Â`֑ Б Б ÑÂ@Ó‘ÂàÉ‘ÂàÉ‘ÂÀƑ€ّ€ّ Б€ّÂàÉ‘ÂàÉ‘Âàɑ ·‘ÂÀƑ Ñ БÂ@Ó‘ÂÀÆ‘Âàɑ€ّ БÂ`֑ ܑ БÂÀÆ‘ÂÀƑ€À‘ ÑÂÀƑ Б€ّ Б Б БÂ@ӑ ÑÂàɑ БÂàÉ‘Â@Ó‘ÂÍ‘Â`֑ ܑÂ`Ö‘Â͑ Б Б Б Ñ ÑÂÀÆ‘ÂÀƑ Ñ ª‘ ª‘ÂÀ­‘ÂÀ­‘Â@º‘ÂàÉ‘ÂàÉ‘ÂÀƑ ÑÂ@º‘Âà°‘Â@º‘Â@º‘Â`½‘ Ñ€À‘Â`½‘´‘€§‘€§‘Â@¡‘€§‘ ª‘ ª‘Â`½‘ ·‘€À‘ÂÀƑ ÑÂ`½‘Â`½‘€À‘Â`½‘Â`½‘€À‘´‘Âà°‘Â`¤‘Â఑ ª‘ ª‘Âà°‘Â@º‘´‘Â`½‘€À‘ ÑÂÀÆ‘Â`½‘Â@º‘Â`½‘Â@º‘Â`½‘ ÑÂ͑€ّÂ@Ó‘Â͑ БÂàÉ‘Â`½‘Â`½‘ ·‘Âà°‘Â@º‘ ·‘´‘Â@¡‘Â@¡‘ ž‘ ª‘€§‘ ž‘ ª‘€À‘ ·‘ ·‘Âà°‘Âà°‘Â ·‘ ·‘Â@º‘Â`½‘ÂÀƑ ÑÂ@º‘´‘ÂÀ­‘Âà°‘Âà°‘ÂÀ­‘€§‘€§‘ ª‘ÂÀ­‘Â@¡‘€§‘Â`¤‘Â@¡‘Â`¤‘ ª‘Â`¤‘ ª‘Â`¤‘Âà—‘Âà—‘Â ž‘Â@¡‘ ž‘Âà—‘Â€§‘ ž‘Â`¤‘Â`¤‘Â@¡‘€§‘›‘Âà—‘Â›‘Â@¡‘ ž‘´‘ÂÀ­‘€§‘€§‘Â`¤‘ÂÀ”‘ ‘‘›‘Â@¡‘›‘Â`‹‘ ž‘ ž‘Â@¡‘€§‘ÂÀ­‘Âà°‘Â`½‘Âà°‘Â఑ ª‘ ·‘ ª‘ÂÀ­‘€§‘€§‘€§‘ ž‘ ‘‘ ‘‘Â`‹‘Â`‹‘Âà—‘Â›‘Â@¡‘›‘ ž‘Â@¡‘ ª‘€§‘ ª‘€§‘ ž‘ ž‘Âà—‘Â›‘›‘Â`¤‘Âà—‘Â`¤‘ ž‘Â€Ž‘Â`‹‘Â€Ž‘Â ‘‘ ‘‘Âà—‘ÂÀ”‘Âà—‘Â@¡‘€§‘ÂÀ­‘€§‘Â`¤‘Âà—‘Â ž‘Âà—‘Â ‘‘Âà—‘Â ž‘€§‘ÂÀ”‘Â@¡‘ ž‘€§‘Â@¡‘Â`¤‘Âà—‘Â@¡‘´‘Âà°‘Â`¤‘ ª‘ ž‘ ž‘ÂÀ”‘›‘›‘€§‘Âà°‘Â ·‘Âà°‘Â`¤‘Â`¤‘ ž‘ ž‘Âà—‘ÂÀ”‘ÂÀ”‘Âà—‘Â ž‘Âà—‘Â`¤‘ ž‘Â`¤‘€§‘€§‘ ª‘Âà°‘ÂÀ­‘ ª‘Â`¤‘Â`¤‘ ª‘€§‘Â`¤‘€§‘€§‘€§‘€§‘ ª‘ ª‘ÂÀ­‘´‘Â`¤‘Â@¡‘Â`¤‘€§‘ ª‘€§‘ ·‘ÂÀ­‘ ª‘Â`¤‘›‘ ‘‘›‘ ž‘ ª‘ÂÀ­‘Â఑´‘Â`½‘ ÑÂ@º‘Âà°‘Â@º‘Â`½‘Â`½‘ÂÀ­‘Â`¤‘Â@¡‘ÂÀ­‘€§‘ ª‘Â@¡‘ ž‘€§‘€§‘Â఑ ª‘´‘ ·‘€À‘´‘Â@º‘´‘Â`¤‘Â`¤‘ ª‘Âà°‘Âà°‘ÂÀ­‘Â`¤‘Â@¡‘ ž‘ ‘‘Â`¤‘ ž‘Â`¤‘›‘Â€Ž‘Âà—‘Â€Ž‘Â€Ž‘Â`‹‘Â€Ž‘Â`‹‘Â€Ž‘Â ‘‘Âà—‘Â`¤‘€§‘ ž‘Â`¤‘Â`¤‘€§‘€§‘Â`¤‘Â`¤‘ ª‘Â@º‘´‘ÂÀ­‘Â`¤‘ ª‘´‘ ª‘ ª‘Â@¡‘Âà—‘Â ž‘Â@¡‘ ª‘Â`¤‘ ª‘Â఑€§‘Âà°‘Â`¤‘ ž‘Â@¡‘Â`¤‘›‘ ž‘›‘Â`¤‘ ª‘Â`¤‘›‘ ‘‘ÂÀ”‘Â@¡‘Â`¤‘ ª‘´‘ÂÀ­‘ ž‘ ž‘ÂÀ”‘Âà—‘Â€Ž‘Â ‘‘Âà—‘Âà—‘Â ž‘€§‘Â`¤‘ ž‘›‘Âà—‘Âà—‘Â`¤‘Â`¤‘ ž‘Âà—‘Â€§‘ ª‘ ž‘€§‘Â@¡‘Â@¡‘Âà—‘Âà—‘ÂÀ”‘ ž‘ ž‘Â@¡‘ ª‘ ž‘›‘ ‘‘ ž‘Âà—‘ÂÀ”‘Â€Ž‘ÂÀ”‘›‘Âà—‘Â@¡‘€§‘Âà°‘Âà°‘Â ·‘ Ñ ÑÂ@º‘Â@º‘Â఑´‘ÂÀ­‘ ª‘ ª‘Âà°‘Â`¤‘›‘ ž‘ ª‘€§‘Â`¤‘ ª‘Âà°‘Â`½‘€À‘€À‘ ·‘Â఑´‘ ·‘ ·‘Âàɑ Ñ ·‘Â`½‘ ·‘ ·‘Â఑´‘Â@º‘ ÑÂ@º‘Â@º‘ Ñ ·‘ Ñ Ñ€À‘ÂàÉ‘ÂÀƑ Ñ Ñ ·‘ ·‘ ·‘ ·‘Â఑´‘Â`½‘€À‘ÂÀƑ БÂàɑ€À‘Â@º‘ÂÀÆ‘Âàɑ ÑÂ`½‘ ·‘ ·‘´‘Â఑´‘Â`½‘€À‘ ÑÂÀÆ‘ÂàÉ‘Â@Ó‘Â@Ó‘Âàɑ БÂ`Ö‘Â`Ö‘ÂÀÆ‘ÂÍ‘ÂÀÆ‘ÂÀÆ‘Âàɑ БÂàÉ‘ÂÀƑ ܑÂ@Ó‘Â`Ö‘Â`Ö‘Â@ӑ ܑ€ّ БÂ`Ö‘Âàâ‘Âàɑ БÂàɑ Ñ БÂ͑ Б БÂÍ‘Â`֑ БÂ@Ó‘Âàɑ Ñ€À‘Â@Ó‘Â@ӑ БÂ`Ö‘Â`Ö‘Âàɑ БÂ`Ö‘Âàâ‘Âàâ‘Âàâ‘ ܑ ܑÂ`Ö‘Â@Ó‘Â`Ö‘Â`֑ БÂÍ‘ÂÍ‘ÂÍ‘Â@ӑ Б БÂ`½‘€À‘Âàɑ Ñ ÑÂàɑ ÑÂàɑ Б Б€ّÂ`Ö‘Â@ӑ€ّÂ@ӑ Б ÑÂàÉ‘ÂÀß‘Â`֑ Б Б€À‘€À‘Âà°‘Âà°‘Â ·‘ ·‘€À‘Â@º‘ ·‘€À‘€À‘ ÑÂÍ‘ÂàÉ‘ÂÍ‘ÂÍ‘Âæ‘€ّÂ@Ó‘ÂàÉ‘ÂÀÆ‘ÂÀƑ ÑÂ`½‘€À‘ ÑÂÀƑ ÑÂ@º‘Â`½‘Â@º‘´‘Â఑ ª‘ÂÀ­‘ ª‘ÂÀ­‘ÂÀ­‘ ·‘ ª‘Â`¤‘ÂÀ­‘´‘ ·‘Â@º‘Â@º‘Â`½‘ ÑÂ@º‘´‘´‘´‘€À‘Â`½‘´‘´‘ ·‘´‘€À‘Â@º‘€À‘ÂÀÆ‘Â`½‘ Ñ´‘ ·‘€À‘€À‘Â@º‘€À‘´‘Â@º‘Â`½‘€À‘ ·‘ ·‘Â`½‘ÂÀÆ‘ÂàÉ‘Â`½‘Â@º‘ ·‘´‘´‘Â@º‘Â`½‘Â`½‘€À‘´‘´‘ ª‘Âà°‘Â@º‘´‘Â఑ ª‘Â@º‘ ·‘Â`½‘€À‘ÂÀÆ‘Â@º‘ ·‘Â`½‘€À‘Â͑ ÑÂ`½‘ ª‘ ª‘´‘ ª‘Â@¡‘ ·‘Â`½‘´‘ÂÀ­‘´‘ Ñ ·‘ ª‘Âà°‘Â@º‘ÂÀƑ Б Б БÂàÉ‘ÂÍ‘ÂàÉ‘Âàɑ€À‘ Ñ Б БÂ`½‘ÂÀÆ‘ÂàÉ‘ÂàÉ‘ÂÍ‘Âàɑ€À‘Â`½‘Â`½‘ ÑÂ͑€À‘ ÑÂ`½‘ÂÀƑ Ñ ·‘€À‘ÂàÉ‘Â͑ ÑÂàÉ‘Â`Ö‘Â`Ö‘ÂÀß‘Â`Ö‘Â@Ó‘Â`Ö‘ÂÍ‘Âàɑ ÑÂàɑ ÑÂ`½‘Â`½‘Â`½‘Âàɑ БÂ@Ó‘ÂàÉ‘Â@Ó‘Â@Ó‘Â`֑ БÂ@Ó‘Â͑ Б€ّ ܑÂÀߑ ܑ ܑÂ`Ö‘ÂàÉ‘Âàɑ Б БÂ`֑ БÂàɑ€À‘ÂàÉ‘Â@Ó‘Â@Ó‘ÂàÉ‘Â`Ö‘Â@Ó‘ÂÍ‘Â`Ö‘Â`Ö‘ÂÀß‘Âæ‘Âàâ‘ÂÀÆ‘ÂÀÆ‘Â`֑€ّÂ@Ó‘Â`֑ ܑ Б€ّ€ّ ܑÂàâ‘ é‘ é‘ é‘ é‘ é‘ ܑÂÀß‘Â@Ó‘ÂàÉ‘Âàɑ€À‘ Ñ Ñ ÑÂàɑ ÑÂ͑ БÂÀÆ‘Âàɑ ÑÂ`½‘ÂàÉ‘ÂÀÆ‘Âàɑ ܑ Б€ّ ܑÂàâ‘Âàâ‘Âæ‘ ܑ€ّÂàâ‘Â`֑ ܑÂÀߑ€ّ БÂàÉ‘ÂÍ‘Â`֑ ܑÂàâ‘Â@Ó‘Âàɑ БÂ`Ö‘ÂÀß‘Âæ‘ ܑ БÂÍ‘ÂÍ‘Â@Ó‘ÂàÉ‘ÂàÉ‘ÂàÉ‘ÂÀƑ Ñ ·‘Âàɑ€À‘ÂÀƑ ÑÂ`½‘ ÑÂàÉ‘ÂàÉ‘Â`½‘€À‘Âàɑ БÂ`Ö‘Â@Ó‘ÂÍ‘Âàɑ Б БÂ@º‘´‘ Ñ ÑÂ@ӑ ÑÂàÉ‘Â`½‘Âà°‘ÂÀ­‘´‘´‘Â@º‘Â`½‘ÂàÉ‘ÂÀÆ‘Â`½‘Âà°‘Â ·‘ ª‘Âà°‘Â ·‘ ·‘€À‘Â@º‘Â`½‘Â@º‘Â`½‘ Ñ ÑÂà°‘Â@¡‘ ž‘Â@¡‘Â@¡‘Â@¡‘ ª‘Â`¤‘Â@¡‘Âà—‘Â›‘ÂÀ”‘›‘ ª‘Â@¡‘Â@¡‘›‘Â`¤‘ ž‘ ž‘Âà—‘Â ž‘ ª‘€§‘ÂÀ”‘Â`¤‘€§‘ ª‘Â@¡‘Â`¤‘ÂÀ­‘ ª‘ ª‘ ž‘›‘ÂÀ”‘ÂÀ”‘Â`‹‘Â`‹‘ ‘‘ ‘‘ ž‘ ‘‘Â€Ž‘Âà—‘Âà—‘Â ‘‘ …‘ÂÀ”‘Âà—‘Â ‘‘Â€Ž‘Â`‹‘ …‘ÂÀ{‘‚‘ x‘ x‘Âà~‘ …‘‚‘ …‘Âà~‘‚‘‚‘ …‘ÂÀ{‘ÂÀ{‘Âà~‘‚‘ …‘‚‘ …‘Âà~‘Âà~‘ x‘ x‘ l‘ l‘ l‘ l‘ l‘€u‘ l‘Â@o‘ l‘€u‘ x‘Â`r‘ l‘€u‘Â@o‘Âi‘ l‘Â`r‘Â`r‘Â`r‘ l‘Â@o‘Â@o‘ÂÀ{‘Âà~‘Â@o‘ l‘Âi‘Â@o‘€u‘Âà~‘ …‘Âà~‘ x‘ x‘Â@o‘Â@o‘Â`r‘Â`r‘ x‘Â`r‘Â`r‘Â@o‘ x‘Âà~‘ x‘Â`r‘Â`r‘ l‘ l‘ l‘Âi‘ x‘€u‘Â@o‘Âi‘Âàe‘Âi‘Â@o‘ÂÀb‘ l‘Â`r‘Âà~‘ x‘Â`r‘ x‘ x‘Â`r‘Âi‘ÂÀb‘ l‘ x‘ x‘ÂÀ{‘ x‘ x‘Âàe‘ _‘ÂàL‘Â@V‘Â`Y‘€\‘Âàe‘Âàe‘ l‘Â`r‘‚‘ x‘Â`r‘Âàe‘Â@o‘Âàe‘ _‘ÂÀb‘Â@o‘Â`r‘Â@o‘Âàe‘Âàe‘ _‘ÂP‘€\‘ S‘ S‘Â`Y‘ _‘Â`Y‘€\‘ _‘ _‘ _‘ _‘ÂÀb‘ÂÀb‘€\‘ S‘Â@V‘ÂÀb‘Âàe‘Âàe‘ÂÀb‘ _‘ _‘Â`Y‘ S‘ÂP‘ S‘Â`Y‘Âi‘Â`r‘ x‘ l‘Â@o‘Âàe‘Âi‘ l‘€\‘€\‘Âi‘ l‘Â`r‘Â`r‘ l‘ l‘Âi‘ l‘Âi‘Âi‘ l‘Âi‘Âàe‘ l‘Â@o‘Âi‘Âi‘ l‘ l‘ l‘ l‘ l‘ÂÀb‘ l‘ l‘Â`r‘Âi‘ÂÀb‘ l‘Âi‘Âàe‘ _‘ _‘ÂÀb‘Âàe‘ l‘€\‘Âàe‘ÂÀb‘ _‘ _‘ _‘€\‘Â`Y‘ _‘ _‘ _‘ _‘Âàe‘Âàe‘Â`r‘Â`r‘ l‘ l‘Âi‘ l‘ l‘Âi‘ l‘Âàe‘ l‘Â@o‘ l‘Â`r‘ l‘ l‘Âàe‘Âàe‘ l‘Â@o‘€u‘Â`r‘Â@o‘Â`r‘Â@o‘ÂÀb‘ l‘Â@o‘ x‘Â@o‘Â@o‘ l‘Âàe‘Âi‘Â`r‘ x‘€u‘ x‘Â@o‘ x‘ l‘Âàe‘Â`r‘ l‘Âàe‘Âàe‘Â@o‘Â@o‘ l‘Â@o‘€u‘ l‘Âi‘Âàe‘ l‘ x‘ x‘ÂÀb‘€\‘Â`Y‘Âi‘Â`r‘Âàe‘ _‘ÂÀb‘ x‘€u‘€u‘Â`r‘Â`r‘Âàe‘ l‘ l‘Â`r‘ÂÀ{‘ x‘Â@o‘Âàe‘ l‘ _‘ÂÀb‘ l‘ x‘ x‘Â`r‘ x‘€u‘ÂÀ{‘€u‘ …‘ x‘Â@o‘ x‘Â`r‘ÂÀ{‘€u‘Â@o‘Â@o‘ l‘ x‘Âà~‘Â€Ž‘Â`‹‘Â€Ž‘Â ‘‘ ‘‘ ‘‘ÂÀ”‘ ‘‘‚‘Âà~‘€u‘Âàe‘Âàe‘Âàe‘Â@o‘ x‘Â`‹‘ x‘ x‘€u‘ l‘ _‘ _‘ÂÀb‘ÂÀb‘ l‘ l‘€u‘ x‘€u‘‚‘ÂÀ{‘ x‘€u‘ x‘ÂÀ{‘ x‘Âi‘ÂÀb‘Âàe‘€u‘€u‘Â`r‘Â`r‘Â`r‘Â`r‘Â@o‘Â@o‘ÂÀ{‘Â`r‘€u‘Âà~‘ …‘‚‘‚‘ÂÀ{‘ x‘Âà~‘ x‘ x‘€u‘ l‘ l‘Â`r‘Â`r‘Âi‘ _‘Âi‘ l‘€u‘Âà~‘Â`‹‘ …‘€u‘‚‘Â`‹‘Âà~‘ x‘Â@o‘€u‘Âi‘Âi‘Âàe‘Âi‘ l‘Â@o‘ l‘ l‘€u‘ x‘€u‘ _‘ l‘Âi‘ l‘€u‘ l‘Âàe‘ l‘ l‘Âi‘Âàe‘Âàe‘ _‘€\‘€\‘Âàe‘€\‘ _‘Â`Y‘ _‘€\‘€\‘ _‘ÂÀb‘ _‘ l‘Â@o‘Âi‘Âàe‘Âàe‘€u‘€u‘Â`r‘€u‘Â`r‘ÂÀb‘ l‘Â@o‘ _‘ÂÀb‘Â@V‘€\‘Âàe‘Âàe‘Â@o‘€u‘Âàe‘Âàe‘ _‘Âàe‘ _‘Â@V‘Â@V‘ _‘ l‘Â`r‘Âàe‘ _‘Âàe‘ _‘€\‘ l‘Âàe‘Â`Y‘€\‘ÂP‘ÂàL‘Â`Y‘ S‘Â`Y‘ÂÀb‘Âàe‘ÂÀb‘€\‘ _‘Âi‘Âàe‘ _‘Âàe‘Â@o‘ _‘Â`Y‘ F‘ÂP‘ S‘Â`Y‘Â`Y‘€\‘Â`Y‘ S‘ F‘ F‘Â`@‘€C‘ÂàL‘ S‘€\‘ _‘ _‘ S‘ _‘€\‘€\‘Â@V‘ S‘ÂàL‘ÂàL‘ÂàL‘ S‘ÂP‘Â@V‘Â`Y‘ÂàL‘ S‘€C‘ÂÀI‘ S‘Â`Y‘Â@V‘ÂàL‘ S‘ÂÀI‘ S‘ S‘ S‘ S‘€\‘€\‘Â@V‘Â`Y‘ÂàL‘ F‘ :‘ÂÀ0‘Â`@‘Â`@‘ÂàL‘ S‘ F‘ÂàL‘ F‘ F‘Â`@‘ F‘€C‘€C‘ÂàL‘ÂàL‘ÂP‘ S‘ÂP‘ÂàL‘ÂP‘ S‘Â`Y‘ÂàL‘€C‘ F‘ÂÀI‘ÂàL‘€C‘ S‘ÂàL‘€C‘Â`@‘Â@=‘€C‘ F‘€C‘ÂP‘ÂP‘ÂP‘ÂàL‘ S‘ S‘Â@V‘ÂP‘ÂP‘ÂàL‘ F‘Â@=‘ :‘Â7‘Â`@‘Â@=‘Â`@‘ÂP‘ F‘€C‘ÂP‘ F‘€C‘Â@=‘ F‘ :‘Â`@‘ :‘ÂÀI‘ÂàL‘ÂÀI‘ÂP‘ÂàL‘ S‘Â`Y‘ S‘ÂÀI‘ F‘ F‘ÂÀI‘€C‘€C‘ F‘ S‘ÂàL‘ F‘ÂàL‘Â`Y‘Â`Y‘ S‘Â@V‘Âàe‘ _‘ÂÀb‘€\‘€\‘ _‘ l‘Â@o‘Âàe‘€\‘Â@V‘Â@V‘ F‘ÂÀI‘Â@V‘€\‘ÂÀb‘ _‘Âàe‘Â`Y‘ _‘ l‘ x‘€u‘ l‘ l‘Â`Y‘ _‘ l‘Â`r‘ÂÀ{‘Â@o‘ÂÀ{‘Âà~‘ x‘ l‘ l‘€u‘‚‘ ‘‘ x‘Âàe‘ÂÀb‘ _‘ _‘ _‘Âàe‘Â@o‘Â@o‘ l‘ _‘Âàe‘€u‘Â`r‘€u‘Â@o‘ l‘ l‘ _‘Âàe‘Â@o‘Â`r‘ l‘€u‘Â`r‘€u‘ x‘ l‘ _‘Âàe‘ l‘Âi‘Âi‘ l‘Âàe‘ l‘ÂÀb‘Âàe‘Âi‘€u‘Â`r‘ÂÀb‘€u‘ x‘ x‘Âà~‘ …‘ x‘Â@o‘€u‘Âà~‘Â@o‘Âi‘Â@o‘ x‘ÂÀ{‘‚‘Â`r‘ x‘ x‘Âà~‘ÂÀ{‘ x‘Âà~‘Âà~‘ÂÀ{‘€u‘‚‘ x‘ x‘Â`r‘‚‘Â@ˆ‘ ‘‘Â€Ž‘ÂÀ”‘Â€Ž‘ÂÀ{‘Âà~‘ÂÀ{‘Âà~‘ x‘ x‘ …‘Â€Ž‘Â ‘‘Â@ˆ‘Âà~‘ x‘ …‘‚‘Â`r‘ x‘€u‘ x‘ x‘‚‘Â`r‘€u‘Â`r‘ÂÀ{‘ …‘ …‘‚‘ x‘ x‘€u‘Â`r‘€u‘Âàe‘ l‘Â`r‘Â`r‘€u‘‚‘‚‘Âà~‘ …‘‚‘Â`‹‘ …‘Â@ˆ‘Â`‹‘Â€Ž‘Â …‘Â€Ž‘Â`‹‘ ‘‘Â`‹‘ …‘ ‘‘‚‘‚‘‚‘ x‘€u‘ x‘ x‘Â`r‘ x‘Â`r‘Â`r‘ x‘Âà~‘Âà~‘ x‘Âà~‘‚‘‚‘‚‘Âà~‘Â`‹‘ x‘Âà~‘Âà~‘‚‘ x‘ l‘ …‘Â`‹‘Â€Ž‘Â …‘Âà~‘ÂÀ{‘ÂÀ{‘Â`r‘€u‘ x‘Âi‘ x‘€u‘Âà~‘€u‘Âà~‘ÂÀ{‘ÂÀ{‘€u‘Âà~‘Âi‘€u‘Â@o‘Âàe‘ l‘€u‘ÂÀ{‘ÂÀ{‘Âà~‘ÂÀ{‘ÂÀ{‘Âà~‘‚‘ÂÀ{‘Âà~‘€u‘ x‘€u‘€u‘ …‘Âà~‘‚‘ …‘ …‘‚‘€u‘ …‘Â`‹‘ ‘‘ÂÀ”‘ …‘Â@ˆ‘ …‘‚‘ÂÀ{‘ÂÀ{‘ x‘ x‘Âàe‘Âi‘Â`r‘Â@o‘Âàe‘€u‘Â`r‘Â`r‘€u‘ l‘Âi‘ÂÀb‘Âi‘Âàe‘ l‘Â@o‘Âi‘Âi‘ l‘Âi‘Â@o‘ l‘Âàe‘ l‘Â`r‘ l‘Â@o‘ l‘Â@o‘€u‘€u‘ÂÀb‘ _‘ _‘Â`Y‘Â`Y‘Â`Y‘ _‘ÂÀb‘Âàe‘Âàe‘Âi‘Â`r‘€u‘Âà~‘€u‘ x‘ x‘Â`r‘ x‘Â@o‘ x‘ l‘ l‘Â@o‘ l‘ _‘ S‘Âàe‘ÂÀb‘ _‘Â@V‘€\‘ _‘Âi‘Âàe‘Âàe‘Â`r‘ l‘Âi‘ l‘Âi‘Âàe‘ _‘Â`Y‘ _‘Âàe‘€u‘ÂÀ{‘Â`r‘ l‘ x‘ÂÀ{‘ÂÀ{‘€u‘€u‘ÂÀ{‘Â`r‘Âàe‘Â`Y‘Âi‘ l‘ l‘Â@o‘Â@o‘Â`r‘ l‘Âàe‘ _‘€\‘ _‘Âàe‘ l‘ l‘ l‘ l‘Â`r‘€u‘ x‘Â@ˆ‘ÂÀ{‘Âà~‘€u‘Â`r‘ l‘Â@o‘Â@o‘ l‘ l‘ÂÀb‘ _‘ÂÀb‘ _‘ÂÀb‘Â@o‘Âi‘Âàe‘Â@o‘Â@o‘Âàe‘ l‘€u‘ÂÀ{‘ x‘ l‘ l‘Âi‘Âàe‘Âi‘ l‘Â`r‘Âà~‘Â`‹‘ …‘ …‘ÂÀ{‘ x‘ l‘Âàe‘Âàe‘Â`r‘ÂÀ{‘ x‘Âà~‘‚‘ÂÀ{‘€u‘€u‘€u‘Â`r‘Â`r‘ x‘€u‘Â@o‘ x‘Â@o‘Â`r‘ l‘ l‘Â@o‘€u‘Â`r‘Âàe‘Âàe‘ _‘€\‘€\‘€\‘Âi‘Âàe‘ l‘Âàe‘€u‘Â@o‘ l‘Â`r‘Âà~‘Â`r‘ l‘Â@o‘Âi‘ l‘ÂÀ{‘Âà~‘Â`r‘ l‘Â@o‘Â`r‘Âà~‘ÂÀ{‘ …‘Â€Ž‘Âà~‘ÂÀ{‘ x‘ x‘Âà~‘Âà~‘Âà~‘ x‘ x‘ x‘Â@o‘ x‘ x‘Â@o‘Âi‘ _‘Âàe‘ _‘€\‘Âàe‘Â`r‘Âà~‘ÂÀ{‘€u‘ÂÀ{‘‚‘‚‘ x‘€u‘ …‘ …‘Â@ˆ‘ …‘‚‘‚‘ …‘Â`‹‘Âà~‘€u‘€u‘ x‘ x‘‚‘Â€Ž‘Â€Ž‘Â`‹‘Â`‹‘Âà—‘Â`‹‘ …‘ÂÀ{‘ …‘Â`‹‘Âà~‘Âà~‘Â@ˆ‘ ‘‘ ‘‘‚‘ ‘‘Â@ˆ‘ …‘ …‘ …‘ x‘Âà~‘Â€Ž‘Âà—‘Âà—‘Â ‘‘ÂÀ”‘ ‘‘ ž‘ ª‘Â`¤‘ ž‘ ž‘ ž‘›‘Âà—‘Â`‹‘Âà—‘Â`¤‘ ž‘ ž‘ ž‘Âà—‘Â`‹‘Â`‹‘Â€Ž‘Â‚‘ÂÀ{‘‚‘‚‘ …‘‚‘Â€Ž‘Â€Ž‘Â …‘Âà—‘ÂÀ”‘ÂÀ”‘ÂÀ”‘Â`¤‘Â`¤‘ ž‘›‘ ž‘Âà—‘ÂÀ”‘Â€Ž‘Â`‹‘Â`‹‘ …‘Â@ˆ‘Âà—‘Â@¡‘›‘›‘ÂÀ”‘ ‘‘Âà—‘Âà—‘Â@¡‘€§‘›‘€§‘´‘ ·‘ ª‘Â@¡‘ ª‘Â`¤‘€§‘ ž‘›‘ ž‘Â@¡‘›‘ ª‘Â఑ ª‘ÂÀ­‘ÂÀ­‘ ª‘ ž‘Â`¤‘›‘ ž‘€§‘Â@¡‘ ª‘€§‘Â఑ ª‘ ª‘Â@¡‘ ª‘ ·‘€À‘€À‘ ·‘ ·‘Â఑ ª‘Â`¤‘ ž‘ ž‘ ž‘Âà—‘Âà—‘Â€§‘Â`¤‘ ª‘Â`¤‘Âà—‘Â ‘‘Â€Ž‘Â ‘‘ÂÀ”‘ ‘‘ ‘‘ ž‘Â`¤‘Âà°‘Â఑€§‘€§‘Â`¤‘ ž‘Â`¤‘›‘Âà—‘Â ž‘€§‘›‘Âà—‘Â ‘‘Â`¤‘ ž‘ ž‘ ž‘Â@¡‘Â@¡‘Âà—‘ÂÀ­‘€§‘ ª‘ ž‘€§‘Â఑´‘ ·‘´‘Âà°‘ÂÀ­‘Â@¡‘Â@¡‘ ž‘ ž‘ ª‘ ª‘Â`¤‘ÂÀ­‘ ª‘Â఑€À‘ ·‘Â`½‘´‘´‘ÂÀ­‘ ·‘ ª‘Â`¤‘Â@¡‘ ª‘ÂÀ­‘Â`¤‘ ž‘ ‘‘ ‘‘Âà—‘Â ž‘€§‘Â@¡‘€§‘Â`¤‘Â@¡‘ ª‘ ª‘€§‘Â`¤‘›‘Â@¡‘Â`¤‘Âà—‘Â ž‘€§‘ ª‘Â@º‘Â@º‘Âà°‘Â`½‘ ·‘ ·‘Â`½‘ ·‘Â`½‘ ÑÂÍ‘Â@º‘´‘ ·‘Â`½‘ÂÀÆ‘ÂàÉ‘Â@º‘ ·‘Â@º‘ ·‘ÂÀ­‘€§‘ ª‘ÂÀ­‘ ª‘ ª‘ÂÀ­‘Âà°‘Â఑´‘ ·‘ Ñ ÑÂ`֑ Б ÑÂ`½‘ÂÀƑ ÑÂÀƑ ÑÂÀÆ‘Â`½‘ÂÀÆ‘Â@º‘Â`½‘ ÑÂàÉ‘ÂÀƑ€À‘Â`½‘Â`½‘´‘ÂÀ­‘Â`¤‘ ª‘Â@º‘€À‘Â@º‘Âà°‘Âà°‘Â ·‘Â఑ ª‘´‘Â`½‘ Ñ Ñ БÂàÉ‘Âàɑ€À‘ ÑÂàÉ‘Â͑ Ñ ÑÂÀÆ‘ÂÀƑ Ñ€À‘ÂÀÆ‘Â@º‘€À‘Â`½‘ÂÀƑ€À‘ Ñ Ñ ÑÂ@Ó‘Â͑€À‘ ÑÂ`½‘ Ñ ÑÂàɑ ·‘Â`½‘´‘Âà°‘Â`½‘Â`½‘ ÑÂÀƑ Ñ Ñ Ñ ÑÂ`½‘ ÑÂ@º‘´‘ÂÀ­‘ÂÀ­‘ÂÀ­‘€À‘€À‘Â`½‘Â`½‘Â@º‘ ·‘Â@º‘Â@º‘Âà°‘ÂÀ­‘´‘ Ñ€À‘Â`½‘ ·‘´‘ÂÀÆ‘ÂÍ‘Â@Ó‘ÂàÉ‘Â@ӑ БÂàɑ Ñ€À‘Â`½‘Â`½‘€À‘´‘ ·‘ ·‘´‘ ·‘Â`½‘ Ñ Ñ Б БÂÍ‘ÂàÉ‘Âàɑ Ñ Ñ ÑÂàÉ‘ÂàÉ‘ÂàÉ‘ÂàÉ‘ÂÍ‘ÂÍ‘Âàɑ ÑÂàÉ‘ÂÀÆ‘ÂàÉ‘Â`½‘ÂÀÆ‘ÂÀƑ ÑÂ`½‘ Ñ Ñ ÑÂÀƑ ÑÂ@Ó‘ÂÍ‘Â@ӑ Б ܑ БÂÍ‘ÂÀÆ‘ÂÀƑ Б€ّÂàâ‘€ّ€ّ€ّÂÍ‘Â͑ Ñ ÑÂàÉ‘ÂÀÆ‘ÂÀÆ‘ÂÀƑ БÂÀƑ Ñ Ñ ÑÂàɑ Б ÑÂÍ‘Â`½‘€À‘ÂÀÆ‘ÂÍ‘Â@Ó‘Â`֑ БÂÍ‘Â`Ö‘Â@ӑ€À‘Â`½‘€À‘ ÑÂ@º‘ ·‘Â`½‘€À‘Â`½‘ ÑÂàÉ‘ÂÍ‘Â͑€À‘ БÂ`֑ Б€À‘ÂÍ‘Âàɑ ÑÂàɑ ÑÂÀÆ‘Â@Ó‘Â`Ö‘Â͑€À‘Âàɑ€À‘€À‘ÂÀÆ‘ÂàÉ‘ÂÀƑ ·‘´‘Â఑€À‘Â`½‘ Ñ Б БÂàÉ‘ÂÍ‘Âàɑ€À‘€À‘Âàɑ БÂ`֑ ܑÂ`֑€ّÂ@Ó‘ÂÀÆ‘ÂÍ‘ÂàÉ‘ÂÍ‘Âàɑ Б Б€ّ БÂ`֑€ّÂÀß‘Â@ӑ БÂ@Ó‘ÂàÉ‘Âàɑ Ñ ÑÂàɑ Ñ€À‘Â`½‘ÂÀÆ‘ÂÀƑ ÑÂ`½‘€À‘Â@ӑ Б БÂàɑ БÂ`Ö‘Âàɑ€ّÂÍ‘ÂÍ‘Âàɑ ÑÂàÉ‘Â͑ БÂ`Ö‘Â@Ó‘Â͑ ÑÂ`½‘Âàɑ Б Б БÂ@ӑ БÂ@Ó‘Â`Ö‘Â͑ Б БÂàÉ‘Â`֑€ّÂ`Ö‘ÂÍ‘Â`½‘Â@º‘ ÑÂàÉ‘Â`½‘€À‘ Ñ Ñ Ñ Ñ БÂ͑ Б БÂàÉ‘Âàɑ БÂ@Ó‘ÂàÉ‘Â`Ö‘ÂÍ‘ÂÍ‘ÂÀÆ‘Â`½‘ Ñ ÑÂÀÆ‘Â@ӑ Б Б ÑÂ@º‘ÂÀƑ€À‘€À‘ Ñ БÂ`֑€ّÂ@ӑ БÂÍ‘Â@Ó‘ÂÀÆ‘ÂàÉ‘ÂàÉ‘Âàɑ ÑÂ@º‘Â`½‘´‘´‘Â఑´‘ÂÀ­‘ ª‘ ž‘›‘Â`¤‘Â`¤‘€§‘Â`¤‘€§‘Â@¡‘›‘€§‘Â఑€§‘Âà°‘Âà°‘Âà°‘Â@º‘Â`½‘€À‘´‘Âà°‘Â@º‘Â`½‘ ·‘ ·‘ÂÀ­‘ ž‘Â`¤‘Â@¡‘€§‘ ª‘€§‘Â@¡‘ ž‘ ž‘ ž‘Â`¤‘ ª‘ ª‘ ª‘ÂÀ­‘€§‘Â`¤‘Â`¤‘Â`¤‘Â@¡‘Âà—‘Â›‘Âà—‘Â ž‘Â`¤‘ ž‘ ž‘€§‘€§‘€§‘ ª‘ ž‘Â`¤‘ ž‘Â@¡‘€§‘Â`¤‘Â@¡‘€§‘€§‘ÂÀ­‘Âà°‘Â ·‘´‘´‘ ·‘ ·‘ ª‘Âà°‘ÂÀ­‘Â`¤‘ ž‘›‘Âà—‘ÂÀ­‘ ž‘Â`¤‘Â`¤‘ ž‘Âà—‘Â ‘‘ÂÀ”‘Âà—‘ÂÀ”‘ ‘‘ÂÀ”‘Âà—‘Â@¡‘Â`¤‘›‘Âà—‘Âà—‘Âà—‘ÂÀ”‘Â`‹‘ ‘‘ ‘‘ÂÀ”‘Â@¡‘›‘Âà—‘Â ª‘Â఑ ª‘Âà°‘Âà°‘Âà°‘Â`¤‘Âà—‘Â›‘€§‘€§‘ÂÀ­‘´‘ ª‘Âà°‘Â`½‘Â`¤‘ ž‘€§‘´‘´‘ ª‘€§‘ ª‘ ·‘ÂÀ­‘€§‘ ž‘€§‘€§‘Â`¤‘€§‘Âà°‘Â఑´‘Â`¤‘ ž‘€§‘ÂÀ”‘ ‘‘ÂÀ”‘Âà—‘Â@¡‘ ª‘ÂÀ­‘ÂÀ­‘€§‘ ª‘Â`¤‘€§‘ ª‘ ·‘Â఑ ª‘€§‘ÂÀ­‘ÂÀ­‘ ž‘›‘Â@¡‘Â@¡‘ ž‘ ž‘Â`¤‘ ª‘Â@¡‘Â`¤‘Â@¡‘€§‘€§‘€§‘€§‘ ž‘ ž‘ ž‘ ž‘Â@¡‘ ž‘Âà—‘Â@¡‘Âà—‘Â ž‘›‘ ‘‘ ž‘ ž‘ ž‘Â@¡‘€§‘Â@¡‘ ž‘ ž‘Â@¡‘›‘ ž‘›‘Âà—‘Â ž‘ ž‘ ‘‘›‘ ž‘›‘Â€Ž‘Â`‹‘ …‘Â`‹‘Âà—‘Â`‹‘Â€Ž‘Âà—‘Â ž‘Âà—‘Âà—‘ÂÀ”‘Â`‹‘ÂÀ”‘Âà—‘ÂÀ”‘Â€Ž‘Â@ˆ‘ ‘‘ ‘‘ ‘‘Â€Ž‘Â …‘ …‘Â@ˆ‘Â€Ž‘Â`‹‘Â`‹‘Â€Ž‘Â€Ž‘Âà—‘Âà—‘ÂÀ”‘ ž‘ ž‘ÂÀ”‘Â@ˆ‘Â€Ž‘Â€Ž‘ÂÀ”‘ ‘‘Â`‹‘‚‘ ‘‘ …‘Â`‹‘ …‘Â`‹‘ x‘Âà~‘Âà~‘‚‘Â@ˆ‘ ‘‘Â`‹‘Âà~‘ÂÀ{‘€u‘Âi‘ x‘Âà~‘ …‘ÂÀ{‘Â`r‘ÂÀ{‘ÂÀ{‘ x‘ x‘ÂÀ{‘ÂÀ{‘ x‘ l‘Â`r‘Â`r‘ x‘Â`r‘Â@o‘ _‘ _‘Âàe‘ _‘ÂÀb‘Âàe‘ x‘ l‘ x‘€u‘ÂÀb‘ _‘Âàe‘Âàe‘ÂÀb‘Â@o‘ l‘Â`r‘Â`r‘Â`r‘ l‘ l‘Âi‘Â`r‘Â@o‘ l‘ l‘Âi‘Âàe‘Âàe‘ l‘ _‘Âàe‘ l‘ÂÀb‘€\‘Â`r‘Â@o‘ l‘Âàe‘ _‘Âi‘ l‘Â`r‘€u‘ x‘€u‘Â`r‘ _‘ S‘Â@V‘Âàe‘ÂÀb‘ l‘ l‘ x‘€u‘€u‘€u‘ÂÀ{‘ x‘ …‘Âà~‘€u‘Â@ˆ‘ÂÀ{‘ÂÀ{‘ x‘Âà~‘Âà~‘Âà~‘‚‘Â@ˆ‘ …‘ x‘ x‘Âà~‘Âà~‘ x‘Âà~‘Âà~‘ x‘ l‘€u‘ x‘€u‘ …‘ÂÀ{‘€u‘ …‘Âà~‘Â`‹‘Âà~‘Âà~‘ x‘Â@o‘€u‘Âà~‘ÂÀ{‘ x‘ x‘ x‘Âà~‘ x‘‚‘‚‘ x‘€u‘ x‘Â`r‘Â`r‘Â`r‘Â@o‘Â`r‘Â@o‘Âàe‘€u‘ …‘Â@ˆ‘Â@ˆ‘Â`‹‘ …‘Â`‹‘Â€Ž‘Â@ˆ‘ x‘Âà~‘Â`r‘ l‘€u‘ x‘Âà~‘Âà~‘ …‘Â@ˆ‘ …‘Â@ˆ‘Â€Ž‘Â`‹‘‚‘ …‘‚‘Â`‹‘Â`‹‘Âà—‘Â ‘‘Â`‹‘Â`‹‘Â€Ž‘Â€Ž‘Â ‘‘ÂÀ”‘Âà—‘Â ‘‘ ‘‘ ‘‘Â€Ž‘Â@ˆ‘‚‘ …‘ …‘‚‘Â@ˆ‘ …‘Â@ˆ‘Â`‹‘Â`‹‘Â@ˆ‘Â`‹‘Â`‹‘ ‘‘ ‘‘ ‘‘Â`‹‘ ž‘Âà—‘Â ‘‘ …‘Â€Ž‘Âà—‘Â ‘‘›‘ÂÀ”‘ÂÀ”‘ÂÀ”‘ÂÀ”‘ ž‘ ž‘ ž‘Âà—‘Â€§‘Âà—‘Â ‘‘ ‘‘Âà—‘ÂÀ”‘›‘Â@¡‘Â`¤‘ ª‘Âà°‘Â ·‘Âà°‘Âà°‘Â`¤‘ ž‘Âà—‘Â ž‘ ž‘ ž‘ÂÀ”‘Âà—‘Â ž‘ÂÀ­‘´‘ ª‘€§‘€§‘ ª‘ÂÀ­‘Âà°‘Â`½‘´‘´‘Â@º‘´‘Âà°‘Âà°‘Âà°‘Âà°‘Â఑ ª‘Âà°‘Â@º‘Â@º‘ Ñ ·‘ ·‘ ª‘€§‘Â`¤‘Â@¡‘€§‘Â఑€À‘ ·‘ ·‘´‘ ª‘ ª‘ ·‘Â`½‘Â`½‘ÂÀÆ‘ÂÀƑ€À‘€À‘ ÑÂ@º‘€À‘€À‘Â`½‘ Ñ€À‘ ·‘Âà°‘Âà°‘Â ·‘Â఑ ª‘ ª‘ ª‘ ª‘ÂÀ­‘ ·‘Â`½‘ÂÀÆ‘ÂÀƑ Ñ ÑÂÀÆ‘Â͑ ÑÂ@º‘Â@º‘ ÑÂ`½‘Â`½‘ ·‘ ÑÂàÉ‘ÂÍ‘ÂàÉ‘ÂÍ‘Âàɑ ÑÂ@º‘Â`½‘Â@º‘ÂàÉ‘ÂÀÆ‘ÂàÉ‘ÂÀƑ ·‘Â@º‘Âà°‘Â`½‘ Ñ ·‘Â@º‘Âà°‘Âà°‘Â఑´‘ ·‘ ·‘Â`½‘ Ñ Ñ ÑÂÀÆ‘ÂÀƑ€À‘Â`½‘Â఑ ª‘Â`½‘Â`½‘Â`½‘Âà°‘ÂÀ­‘Âà°‘Âà°‘ÂÀ­‘€§‘ ª‘´‘ÂÀ­‘Â@º‘ ·‘´‘ ·‘Â`½‘€À‘€À‘€§‘Â`¤‘€§‘Âà°‘Â@º‘Âà°‘Âà°‘Â఑´‘ ·‘´‘Âà°‘Â`¤‘€§‘Â఑ ª‘Â`¤‘ ª‘Â@¡‘ ž‘ ª‘ ª‘ ·‘ ª‘´‘Â@º‘€À‘´‘€§‘ ª‘ ª‘€§‘€§‘ ª‘Âà°‘Âà°‘Âà°‘ÂÀ­‘ ª‘Â`¤‘›‘€§‘€§‘€§‘Â`¤‘ÂÀ­‘´‘´‘Â఑ Ñ Ñ Ñ Ñ€À‘ ª‘Âà°‘ÂÀ­‘Â@º‘ ª‘ ª‘ ª‘ÂÀ­‘ÂÀ­‘ ª‘ ª‘ ª‘´‘Â@º‘€À‘Â@º‘Â`½‘€À‘ÂÀƑ€À‘ ÑÂ`½‘Â఑ ª‘Â`½‘´‘Âà°‘ÂÀ­‘ÂÀ­‘´‘Â`½‘ ·‘´‘Â@º‘Â@º‘Âà°‘Âà°‘Â`½‘ÂàÉ‘Âàɑ ·‘Âà°‘Â ·‘ ·‘´‘Â`½‘ ÑÂ͑ Ñ€À‘ ÑÂ`½‘ ·‘Âà°‘Âà°‘Â ·‘ ·‘Â`½‘´‘Â`½‘ ·‘ ·‘ ·‘Â@º‘Â@º‘Â@º‘ ·‘Â`½‘´‘Â఑ ÑÂ@Ó‘ÂàÉ‘ÂàÉ‘Â`Ö‘Â@ӑ€ّÂàâ‘ÂÀߑ Б Б ܑÂàÉ‘Â`½‘Â`½‘€À‘ ·‘ÂÀ­‘´‘Â`½‘Â`½‘ ·‘Â@º‘Â`½‘ÂàÉ‘ÂÀƑ€À‘ ÑÂÀƑ ÑÂ`½‘Â@º‘Â@º‘ ·‘ ÑÂ`½‘Â@º‘Â`½‘Â`½‘´‘´‘ÂÀ­‘ÂÀ­‘Âà°‘Âà°‘Â ·‘Âà°‘Âà°‘Â ·‘ ·‘Â`½‘€À‘Â`½‘Â`½‘Â`½‘Â@º‘ ·‘ ·‘ ·‘ ·‘Â`½‘Â`½‘€À‘Â`½‘Â@º‘Â`½‘Â`½‘ ·‘ ·‘ ÑÂ`½‘Â@º‘ ÑÂÀƑ Ñ´‘Â`½‘Âà°‘Â ·‘ ·‘ Ñ ·‘´‘Â`½‘ ·‘Â@º‘€À‘€À‘ Ñ Ñ ÑÂÀƑ Б БÂàɑ€À‘Â`½‘ÂàÉ‘ÂàÉ‘Â`½‘ ÑÂàÉ‘ÂàÉ‘Â`½‘ БÂÀߑ€ّÂÀÆ‘Â͑ Ñ Б Б ÑÂ@º‘€À‘ÂÀƑ Б ܑÂÀߑ€ّ ܑÂàâ‘ ܑÂ@ӑ Б€À‘ÂàÉ‘Â@Ó‘ÂàÉ‘Âàɑ Ñ Ñ Б€ّ ܑ é‘€ّÂÀߑ ܑÂÀƑ ÑÂàÉ‘ÂÍ‘Â`֑ БÂÀƑ Б БÂÀƑ€À‘Â`½‘ÂÀÆ‘ÂÍ‘ÂÀƑ БÂÀÆ‘ÂàÉ‘Âàɑ Б Б€ّ ܑ€ّ ܑ€ّ€ّ БÂÍ‘Â@Ó‘Â@Ó‘ÂÀÆ‘ÂÀÆ‘Â@º‘ ·‘Â@º‘Â`½‘ Ñ ÑÂÀÆ‘ÂàÉ‘Â@Ó‘ÂàÉ‘Âàɑ Ñ€À‘ ÑÂàÉ‘Â`Ö‘Â`Ö‘Âàɑ БÂ@Ó‘ÂÀÆ‘Â@Ó‘Â@Ó‘ÂàÉ‘Â`֑ ܑ ܑ€ّÂÀß‘Â@ӑ Ñ Б ܑ€ّÂ@Ó‘ÂàÉ‘Â`֑ ܑÂ`֑ ܑÂàâ‘ õ‘ é‘€ّÂ@ӑ€ّ€ّ ܑÂÀߑ€ّ ܑ€ّ ܑ€ّ БÂÀÆ‘Â͑ ܑ€ّÂ`֑ Б ܑÂàâ‘ÂÀߑ БÂÍ‘Â@Ó‘Â@Ó‘Â`Ö‘Â`Ö‘ÂàÉ‘ÂÀƑ БÂÀߑ ܑ€ّÂ`Ö‘Â`ï‘Âæ‘Âàâ‘ ܑÂÀß‘Âàâ‘Â`Ö‘Âàâ‘ ܑÂÀߑ€ّ БÂÀƑ Ñ€ّÂ`Ö‘Â͑ ܑÂ`֑ ܑÂ@Ó‘ÂÀߑ é‘ é‘Â`ï‘ é‘Âæ‘ÂÀß‘ÂÍ‘Â@Ó‘Â`֑ ܑ ܑ ܑÂÀß‘Â`֑€ّ ܑ€ّ ܑÂ`Ö‘Â`Ö‘Â`Ö‘Âæ‘ ܑÂàâ‘€ّÂàɑ БÂ@Ó‘Â`Ö‘Â@Ó‘Â`֑€ّ€ّ БÂàɑ БÂ͑ БÂ`Ö‘Â`Ö‘Â`֑ Б ÑÂ@º‘ ·‘Â@º‘Â@º‘Â`½‘ÂÀƑ€À‘Â`½‘ ÑÂ`½‘ÂÀƑ Ñ Б БÂàɑ Ñ БÂÀƑ ÑÂ`½‘Â`½‘ ÑÂàɑ Ñ€À‘ ·‘ ·‘ÂÀ­‘Â`½‘Â`½‘€À‘€À‘Âàɑ БÂ͑ ÑÂ`½‘ ÑÂà°‘Â఑´‘ ÑÂàɑ€À‘Â`½‘€À‘ ÑÂ`½‘ÂÀ­‘ÂÀ­‘ÂÀ­‘ ª‘Â@º‘Â`½‘ ÑÂàɑ БÂàÉ‘ÂÀÆ‘Â@º‘Â`½‘ Ñ€À‘ÂÀÆ‘ÂÀÆ‘Âàɑ Ñ ÑÂÍ‘Â͑ ÑÂ`½‘Â`½‘Â`½‘ Ñ Ñ Б Б€À‘€À‘ Б€À‘ ·‘Â@º‘ÂÀÆ‘ÂàÉ‘ÂàÉ‘Â`Ö‘Â@ӑ Б БÂ`Ö‘Â`֑ ܑ БÂ`Ö‘Â͑ БÂ`Ö‘Â`֑ ܑ ܑ ܑÂ@Ó‘Â͑€ّ€ّÂàâ‘ ܑÂÀß‘Â`Ö‘Â͑€À‘€À‘€À‘ÂàÉ‘ÂÍ‘ÂÀƑ ÑÂàɑ Б БÂàÉ‘Â@º‘ ·‘Â@º‘Â͑ Б€ّ БÂ`֑ БÂ@ӑ БÂ`Ö‘Â@Ó‘ÂÀß‘ÂÀߑ€ّ Б Б БÂàÉ‘Â͑ ÑÂÀƑ ·‘Â`½‘Â@º‘Âà°‘Â ·‘Â`½‘€À‘ÂÀ­‘ ·‘Â`½‘Âà°‘ÂÀ­‘ ª‘ÂÀ­‘Âà°‘ÂÀ­‘Â`½‘Â@º‘ ·‘Âà°‘Âà°‘ÂÀ­‘´‘´‘´‘€À‘Â`½‘ÂÀÆ‘ÂÍ‘ÂàÉ‘ÂàÉ‘ÂÀÆ‘Â͑ Ñ ÑÂ`½‘ÂÀÆ‘ÂÀÆ‘ÂàÉ‘ÂàÉ‘ÂÀƑ€À‘Âà°‘Â`½‘ ÑÂ`½‘Â`½‘Â`½‘Âà°‘Âà°‘Â`½‘Â@º‘Â@º‘ÂÀÆ‘Â@º‘ ÑÂ`½‘ÂÀƑ Ñ´‘ ·‘ ª‘ÂÀ­‘ÂÀ­‘Â఑ ª‘ÂÀ­‘ ª‘´‘Â`½‘´‘´‘ ·‘Âà°‘Â఑ ª‘Â఑€§‘ ª‘€§‘ ª‘Âà°‘Âà°‘Â ·‘Â`½‘ ·‘Â@º‘Â@º‘ ÑÂ`½‘Â`½‘ ·‘€À‘Â@º‘Âà°‘Â఑´‘ ª‘ ž‘Âà—‘Â ž‘Â@¡‘Â`¤‘ ª‘€§‘ ª‘€§‘Â`¤‘Â@¡‘´‘ ª‘ ª‘Â@¡‘Â`¤‘€§‘Â`¤‘ÂÀ­‘Â఑´‘Â఑ ª‘ ž‘ ª‘Â`¤‘Â`¤‘ ª‘ ª‘€§‘Â@¡‘ ž‘›‘Â`¤‘ÂÀ­‘€§‘Â`¤‘Â`¤‘€§‘ ª‘€§‘ ª‘Â`¤‘Â@¡‘Â@¡‘€§‘ÂÀ­‘´‘ ª‘ÂÀ­‘ ª‘Âà°‘Â`¤‘Âà—‘Â ž‘ ž‘ ‘‘Â@ˆ‘Â€Ž‘Â€Ž‘Â ž‘ ª‘ ª‘ÂÀ­‘€§‘€§‘ÂÀ­‘Â@¡‘Â`¤‘Â`¤‘Â@¡‘ ª‘Â`¤‘Â@¡‘ÂÀ­‘ ª‘€§‘€§‘ ž‘ ‘‘Âà—‘Â›‘Â`¤‘ ž‘Â`¤‘ ž‘€§‘Â఑ ª‘´‘ ·‘ ·‘Â`½‘Â@º‘ ÑÂ఑ ª‘ ª‘ ª‘Â఑´‘ ·‘´‘ÂÀ­‘ ª‘€§‘Â`¤‘ ª‘Â`¤‘ÂÀ­‘ÂÀ­‘ ª‘ ž‘Â`¤‘Âà°‘Âà°‘Â ž‘ÂÀ”‘Âà—‘Â@¡‘ÂÀ­‘ÂÀ­‘€§‘ ª‘Â఑´‘Â఑ ª‘€§‘ÂÀ­‘Âà°‘Âà°‘Â఑´‘ ·‘ ·‘ ·‘Â`½‘ ·‘€§‘Â`¤‘Â`¤‘ ª‘ ª‘ÂÀ­‘Âà°‘Âà°‘ÂÀ­‘ÂÀ­‘´‘Âà°‘Â఑ ª‘ ª‘ ª‘´‘ ·‘Â@º‘Â`½‘€À‘ÂàÉ‘ÂÍ‘ÂàÉ‘ÂàÉ‘Â@º‘´‘´‘ ·‘Â఑€§‘€§‘ ª‘ ª‘ ·‘´‘ ž‘Â`¤‘Â`¤‘´‘ ·‘ Ñ€À‘Â`½‘€§‘Â`¤‘Â@¡‘Â`¤‘Â`¤‘ÂÀ­‘Âà°‘ÂÀ­‘ ª‘ÂÀ­‘ ª‘ÂÀ­‘€§‘ ž‘Â@¡‘ ž‘ ž‘€§‘ ª‘ ª‘€§‘ ª‘Â`¤‘ ž‘ÂÀ”‘Â`¤‘ ž‘ ž‘ ž‘›‘Âà—‘Â€Ž‘Â ž‘Â@¡‘Âà—‘Â ž‘€§‘Â`¤‘Â@¡‘ ª‘ ª‘Â@¡‘€§‘€§‘€§‘€§‘Â@¡‘ ž‘Â`¤‘€§‘ ª‘€§‘Â@¡‘ ª‘´‘€§‘ ª‘Âà°‘Â఑ ª‘ ª‘ÂÀ­‘Â`½‘ Ñ ÑÂ`½‘ ·‘ ·‘ÂÀ­‘ ·‘ ª‘ ª‘Âà°‘Â`¤‘ ª‘€§‘€§‘Â@¡‘Â@¡‘Âà—‘Âà—‘Â ž‘ ž‘›‘Âà—‘Âà—‘Âà—‘ÂÀ”‘ÂÀ”‘ÂÀ”‘Âà—‘Â›‘ ª‘ÂÀ­‘ ª‘Âà—‘Â›‘Â@¡‘Â@¡‘€§‘Â@¡‘›‘ÂÀ”‘Â`¤‘€§‘Â@¡‘ ž‘ ª‘Â`¤‘Âà—‘Â@¡‘€§‘´‘ ·‘Â`½‘ ·‘Â`¤‘Â@¡‘ ž‘›‘Â`¤‘Â`¤‘ ž‘›‘Â`¤‘€§‘Â@¡‘€§‘ ª‘Â`¤‘ÂÀ­‘Âà°‘Â఑ ª‘Â఑´‘Â`½‘Â`½‘Â@º‘ÂÀ­‘€§‘€§‘Â@¡‘Â@¡‘€§‘€§‘Â`¤‘ ª‘Â@¡‘ ž‘Âà—‘Â€§‘€§‘ ª‘Â@¡‘Â@¡‘ÂÀ­‘€§‘Â`¤‘ ª‘ ª‘Â@¡‘€§‘ÂÀ­‘€§‘ ª‘ ª‘ ª‘ÂÀ­‘ÂÀ­‘ ª‘Â@¡‘ ž‘Âà—‘ÂÀ”‘Âà—‘Â`¤‘Âà—‘Âà—‘Â@¡‘€§‘Â`¤‘Â@¡‘Âà°‘Â`¤‘€§‘Â@¡‘Â@¡‘Â@¡‘ ž‘€§‘ ª‘€§‘Â఑ ª‘ÂÀ­‘´‘ ·‘Âà°‘ÂÀ­‘ÂÀ­‘ ·‘Âà°‘Â`½‘´‘ ÑÂ@º‘ÂÀ­‘ ª‘Â@¡‘ÂÀ­‘Â@º‘Â`½‘´‘ ª‘Â`¤‘ÂÀ­‘ÂÀ­‘Â`¤‘Â`¤‘Â`¤‘Â`¤‘ ž‘Â@¡‘Â`¤‘ÂÀ­‘Âà°‘Â`½‘Â@º‘Â`¤‘ ž‘ ž‘Â@¡‘ ª‘ ª‘ÂÀ­‘´‘ ª‘Â఑´‘€À‘€À‘ ·‘´‘Âà°‘Â఑ ª‘ ª‘ ·‘´‘Â`¤‘€§‘ ª‘ ª‘Â`¤‘€§‘Â`¤‘€§‘Â@¡‘Â@¡‘Â`¤‘ÂÀ­‘ ª‘ ž‘Â@¡‘ ž‘Â`¤‘›‘€§‘€§‘Â@¡‘ ª‘Â`½‘´‘ ª‘ ª‘ ª‘Â఑ ª‘ ·‘Â఑€§‘ ª‘Â@º‘´‘Â@º‘Â@º‘´‘´‘Â`½‘Â`½‘ ÑÂ`½‘ ª‘ ª‘ÂÀ­‘€§‘Â@º‘Â`½‘Â@º‘ ·‘Â఑ ª‘€§‘Â`¤‘€§‘Âà—‘ÂÀ”‘ ‘‘ ‘‘Âà—‘Â€§‘Âà°‘ÂÀ­‘ÂÀ­‘Âà°‘Â఑ ª‘€§‘ ·‘ ·‘ ·‘ ·‘Â@º‘´‘ ª‘ÂÀ­‘´‘ ª‘ ª‘Â`¤‘Â@¡‘€§‘Â`¤‘ ª‘ ª‘ ª‘ ·‘ ª‘€§‘ ª‘Â`¤‘ ª‘€§‘€§‘Âà—‘Âà—‘Â ž‘Â@¡‘Â@¡‘ ž‘›‘Â@¡‘Â@¡‘ÂÀ­‘Â@º‘Â఑´‘ ª‘€§‘Â`¤‘ ª‘ ª‘ÂÀ­‘ ª‘ ª‘€§‘ ž‘Â@¡‘ ž‘Âà—‘Â ž‘›‘Â`¤‘Âà—‘Âà—‘Âà—‘Â ž‘ ª‘ ·‘´‘Â`¤‘›‘›‘Â`¤‘ ª‘ ª‘ ª‘Â`¤‘ ž‘Â`¤‘ ž‘€§‘Â`¤‘ ž‘ ‘‘Âà—‘ÂÀ”‘›‘Â@¡‘ ž‘Â`‹‘Â`‹‘ÂÀ”‘Â`¤‘ ª‘€§‘Â`¤‘ ž‘Â@¡‘Âà—‘Âà—‘Â ž‘ ž‘Â`¤‘€§‘ ª‘´‘ÂÀ­‘ ª‘ ª‘Â@¡‘€§‘Âà°‘Âà°‘Âà°‘Â఑ ª‘Â@¡‘Âà—‘Â ‘‘Âà—‘Â@¡‘€§‘Â@¡‘ ž‘ÂÀ”‘›‘Âà—‘ÂÀ”‘Âà—‘ÂÀ”‘›‘Â`¤‘€§‘ ª‘€§‘Â఑ ª‘´‘€§‘Â`¤‘Âà—‘Â`¤‘ ·‘Â@ì‘ ܑÂ@º‘ ª‘Â఑ ª‘Â`¤‘ ª‘Â఑ ª‘€§‘€§‘ ª‘Â@º‘ ·‘€§‘€§‘Â@¡‘Âà—‘Âà—‘Â ‘‘›‘Âà—‘Â€§‘€§‘Â`¤‘ ª‘´‘Âà°‘ÂÀ­‘€§‘Â`¤‘ÂÀ­‘ ª‘ÂÀ­‘Â`¤‘Â`¤‘Â@¡‘Â`¤‘Â`¤‘ ž‘ÂÀ”‘ …‘Â@ˆ‘Â@ˆ‘‚‘Â€Ž‘Â ‘‘Â`¤‘ ž‘€§‘ÂÀ­‘€§‘ ž‘Â@¡‘Â`¤‘Â`¤‘Â@¡‘ ž‘Â@¡‘ ž‘Âà—‘Â›‘ ž‘ÂÀ­‘Â@¡‘€§‘€§‘Â఑€À‘Â@º‘Â఑´‘Âà°‘Âà°‘ÂÀ­‘€§‘Â@¡‘ ª‘Â`¤‘Â`¤‘Âà°‘Âà°‘Â@º‘€§‘Â`¤‘Âà°‘Âà°‘Âà°‘Â ·‘ ·‘Â`½‘ ·‘Â఑ ª‘Â`¤‘€§‘ ª‘ ª‘ÂÀ­‘ÂÀ­‘Âà°‘ÂÀ­‘ÂÀ­‘€§‘ ª‘ ª‘€§‘ ª‘ ª‘ ª‘ÂÀ­‘€§‘ÂÀ­‘ÂÀ­‘€§‘Â`¤‘ ž‘ÂÀ­‘ÂÀ­‘ ª‘Â`¤‘ ž‘›‘ÂÀ”‘ ‘‘Â€Ž‘Â`‹‘Â`‹‘Âà~‘ x‘Âà~‘‚‘Â@ˆ‘Âà~‘‚‘ …‘Â@ˆ‘ …‘ …‘ x‘ l‘Âà~‘Âà~‘ x‘Â`r‘ x‘€u‘ x‘€u‘Â`r‘ÂÀb‘ÂÀb‘Âàe‘ l‘€\‘ _‘Âàe‘Â`r‘ l‘€\‘ÂÀb‘€\‘€\‘ _‘ _‘Âàe‘ _‘Â@V‘ S‘€\‘Â`Y‘Âi‘Â`r‘Âi‘Âàe‘ l‘ _‘Âi‘Â`r‘Âàe‘Â`r‘Â@o‘ l‘ l‘ l‘ _‘ÂÀb‘Âàe‘ÂÀb‘ l‘Âàe‘ _‘€\‘Â`Y‘ S‘ l‘ÂÀb‘Âàe‘ _‘Âàe‘ l‘Â`r‘ l‘Âàe‘ÂÀb‘ _‘Âàe‘ l‘Âi‘Âàe‘Âàe‘Âi‘Â`r‘Âàe‘Âàe‘Â`r‘ÂÀ{‘Â@o‘Âàe‘ÂÀb‘ÂÀb‘Âi‘ l‘Âàe‘Âàe‘ _‘Â@V‘ S‘Â@V‘ _‘Âàe‘€\‘ _‘ÂÀb‘ÂÀb‘ÂÀb‘ l‘ l‘ _‘ÂÀb‘ _‘Âàe‘ l‘Â`r‘ÂÀb‘€\‘Âi‘ l‘ l‘ _‘Âàe‘Âàe‘Âi‘ÂÀb‘ l‘Âàe‘Âàe‘Â@V‘Â@V‘ _‘Âàe‘Â@V‘€\‘Âàe‘Âi‘€u‘€u‘ l‘Âàe‘ l‘ÂÀb‘ S‘ S‘ÂÀI‘ÂP‘ S‘Â`Y‘€\‘ S‘ _‘Âi‘€\‘Â`Y‘€\‘Âi‘ÂÀb‘Â`Y‘Â`Y‘ÂÀb‘ l‘Âàe‘ _‘Â`Y‘€\‘ _‘ _‘ S‘Â@V‘ÂP‘ S‘ S‘Â`Y‘Â`Y‘Â`Y‘ S‘ÂP‘Â@=‘ :‘Âà3‘ -‘ -‘Â7‘Â`@‘Â@V‘ S‘Â`Y‘ l‘€\‘ _‘ _‘ _‘ÂÀb‘ _‘Â`Y‘Â@V‘€\‘ÂP‘ÂÀI‘ÂP‘ÂÀI‘ÂàL‘ S‘ S‘ S‘ S‘ S‘Âàe‘ÂÀb‘Â`Y‘ S‘ S‘Â`Y‘ S‘ÂàL‘ S‘ÂP‘ÂÀI‘€C‘Â`@‘ F‘ _‘Â@V‘ÂÀI‘€C‘Âà3‘Â7‘ :‘€C‘ F‘ÂàL‘ F‘Â@V‘ F‘ÂP‘ÂàL‘ÂÀI‘ÂàL‘ F‘€C‘ F‘ F‘ÂP‘€C‘ F‘Â7‘ -‘ :‘Â@=‘ :‘Âà3‘Â7‘ F‘Â`@‘Âà3‘ÂÀ0‘ -‘Âà3‘Âà3‘Âà3‘ :‘ :‘Âà3‘Âà3‘ -‘ :‘Â@=‘Â@=‘€C‘Â`@‘Â`@‘ÂÀI‘€C‘ÂÀ0‘ -‘ -‘ :‘Â`@‘€C‘ F‘ F‘ÂÀI‘Â`@‘ :‘Â7‘ :‘Â`@‘ :‘ÂÀ0‘Âà3‘Â7‘ :‘ -‘Â7‘ :‘€C‘€C‘Â`@‘Â`@‘ F‘ S‘ F‘ÂàL‘ F‘ S‘ S‘ÂàL‘ S‘ÂP‘ÂÀI‘Â`@‘€C‘Â`@‘ :‘Â7‘Â@=‘ :‘Â`@‘ F‘Â`@‘€C‘Â`@‘ F‘ÂÀI‘ F‘Â@=‘ :‘Â`@‘ :‘ F‘ F‘€C‘Â`@‘Â`@‘€C‘ÂÀI‘€C‘Â@=‘ :‘ÂP‘ÂàL‘Â`@‘ :‘Â@=‘€C‘ F‘ F‘ F‘ÂàL‘ S‘ÂP‘ÂÀI‘ÂÀI‘€C‘ÂP‘Â@V‘ÂÀb‘ l‘ l‘ÂÀb‘Âàe‘ _‘ S‘Â`Y‘Â@V‘ÂP‘ _‘ S‘ S‘Â@V‘Â`Y‘ _‘Âi‘Âi‘ l‘Âàe‘Â`Y‘ _‘ _‘Â`Y‘ÂÀI‘ÂÀI‘ F‘ F‘ S‘Â`Y‘€\‘ÂÀb‘Âàe‘€\‘€\‘Â`Y‘Â`Y‘ _‘Â`Y‘€\‘ _‘Âàe‘ÂÀb‘ _‘ÂÀb‘Âàe‘ l‘ l‘Â@o‘Âi‘€\‘Âàe‘ÂÀb‘Âàe‘Âàe‘ÂÀb‘Âàe‘ _‘Âàe‘€\‘ S‘ S‘Â`Y‘€\‘ _‘ÂÀb‘ _‘Âàe‘Âàe‘ l‘€u‘ x‘Â@o‘ÂÀb‘ l‘ l‘Â@o‘ l‘Â@o‘Â@o‘ x‘Â@o‘ l‘Âàe‘Â@o‘ l‘€u‘ l‘ l‘Âi‘ÂÀb‘Âàe‘Âàe‘Âàe‘€\‘ _‘Âàe‘ l‘ l‘ x‘ x‘ x‘ l‘ l‘ x‘ …‘‚‘Âà~‘Âà~‘ÂÀ{‘Â@ˆ‘Âà~‘Âà~‘ÂÀ{‘‚‘ x‘Â`r‘Â@o‘ÂÀb‘ _‘ÂÀb‘Âi‘ x‘ÂÀ{‘Âà~‘Â`‹‘ …‘‚‘Âà~‘Âà~‘ …‘ …‘ÂÀ{‘Â`r‘ x‘€u‘Â`r‘Â`r‘ l‘ _‘ _‘Âàe‘Âàe‘ x‘€u‘Âà~‘‚‘Âà~‘Âà~‘ …‘‚‘ x‘Âà~‘ÂÀ{‘Âà~‘ …‘‚‘‚‘ …‘Âà~‘Â@ˆ‘Âà~‘Âà~‘ x‘€u‘€u‘ x‘Â`r‘Â`r‘ x‘ x‘ x‘Â@ˆ‘Âà~‘ÂÀ{‘ÂÀ{‘ÂÀ{‘ x‘€u‘‚‘ …‘ x‘ x‘Âà~‘ x‘ x‘ÂÀ{‘ÂÀ{‘ÂÀ{‘ x‘ x‘ÂÀ{‘ …‘‚‘ …‘ x‘Â@ˆ‘Â€Ž‘Â ž‘ÂÀ”‘Â€Ž‘Â`‹‘ x‘ÂÀ{‘ÂÀ{‘ x‘Â`r‘Â@o‘€u‘ x‘Âà~‘ x‘Âà~‘Âà~‘ÂÀ{‘ x‘ …‘Â€Ž‘Â ‘‘‚‘ …‘‚‘Âà~‘ l‘ l‘Âi‘Â`r‘ x‘ x‘ …‘Âà~‘ x‘‚‘ …‘ …‘Â€Ž‘Âà—‘Â ‘‘Â€Ž‘Â …‘Âà~‘ÂÀ{‘ x‘Â`r‘Âà~‘ x‘€u‘ÂÀ{‘ÂÀ{‘ÂÀ{‘Â@ˆ‘Â€Ž‘Â€Ž‘Â`‹‘ …‘ …‘ …‘ …‘Â@ˆ‘Â`‹‘Â`‹‘ ‘‘ ‘‘Â€Ž‘Â …‘ …‘ÂÀ{‘€u‘ x‘Â`r‘Âi‘ÂÀb‘ l‘€u‘‚‘ …‘‚‘ x‘ÂÀ{‘Â@o‘ x‘€u‘€u‘€u‘ x‘Â@o‘€u‘Â`r‘Â`r‘Â`r‘ÂÀ{‘Âà~‘ÂÀ{‘Âà~‘ x‘ l‘ l‘ l‘ÂÀb‘Âi‘ l‘Â@o‘Â`r‘Â`r‘ x‘Âà~‘Âà~‘€u‘Â`r‘€u‘ x‘Â`r‘Âi‘ l‘Â@o‘ x‘Âà~‘ x‘€u‘€u‘€u‘ l‘ l‘ l‘Âàe‘Âàe‘Âàe‘ l‘€u‘ x‘ x‘ x‘Âà~‘ …‘ÂÀ{‘ l‘Âi‘Âàe‘Âàe‘ l‘ x‘Â`r‘Âàe‘Âàe‘Âi‘ _‘Âi‘Âàe‘ l‘Âà~‘ l‘Â@o‘Â@o‘ l‘ _‘Âàe‘Â@o‘ _‘Â@V‘ _‘ _‘ _‘ÂÀb‘ _‘Âi‘ l‘ l‘ _‘ _‘ _‘ÂÀb‘Âàe‘ _‘ l‘€\‘ l‘Â@o‘€u‘Âà~‘Â@ˆ‘Âà~‘ÂÀ{‘‚‘Âà~‘Â`r‘Âàe‘Â`r‘ l‘€u‘ x‘ x‘ x‘ÂÀ{‘ …‘‚‘ x‘ÂÀ{‘Â`r‘ÂÀ{‘€u‘Â@o‘ l‘ x‘Âà~‘‚‘ …‘Â`‹‘Â`‹‘ …‘Âà~‘ …‘ÂÀ”‘Â€Ž‘Â@ˆ‘Â€Ž‘Â@ˆ‘Âà~‘€u‘Â`r‘Âàe‘Âi‘ l‘ l‘ l‘ÂÀb‘Â`Y‘Â`Y‘€\‘ÂàL‘Âà3‘Âà3‘Â7‘Â@=‘€*‘ -‘€*‘ -‘Â`'‘ !‘Â@ ‘Âà‘ ûÂà‘€øÂ ïÂ@ò ïÂ@òÂàè â€ß ÖÂ@Ù Ö€ßÂàÏÂ@ÙÂ`ÜÂÓÂàÏÂÓÂÀ̠ɀÆÂ ½Â °Âà¶Â ½Â °Â@§Â ¤Â ¤Â€”Â@ŽÂ€”ˆ€”Â@ŽÂ@ŽÂ ‹Â ‹Â ‹ÂˆÂ ‹Â ~Âà„Âà„Â`‘Â@ŽÂÀÂàk€b e rÂo rÂàkÂ@u r e rÂVÂ@\Â`_ e€bÂàk rÂàkÂàk rÂoÂàkÂV L€IÂ`F @ LÂ@C€IÂV Y YÂÀO€I @Âà9Âà9 @ @Â`F€IÂ`FÂ`F @ @ 3 3Âà9 @Â@C @ @Â= @ÂÀ6Â=ÂÀ6€0Â`- 'Â$ '€0 ' 'Â@*€0Â`-€0€0 'Â$  Â`Â@Â@ €Â`Â` Â`  Âà €þ€þÂÀ    Â`ûÂ@øÂ õ     €þ õÂ@øÂ Âà  Â@øÂàî õ€å èÂàîÂòÂàîÂòÂàîÂàî èÂ@ßÂ`âÂ`â ÜÂ@ßÂÙÂ`âÂàÕ€ÌÂàÕÂàÕÂàÕÂÙÂ`â èÂàîÂ@øÂ õÂò è€å èÂ@߀åÂ`â ÜÂÙÂ@ßÂ`â Ü ÏÂàÕ ÜÂÙÂàÕ ÃÂÀÒ ÏÂ`ÉÂ@ÆÂà¼Â€Ì Ï ÏÂ`ÉÂ@ÆÂ@ÆÂÀ Ã Ã ÃÂÀÂÀ ÃÂ@ÆÂ`ÉÂÀ Ã ÏÂ@ÆÂÀÂÀÂÀ ÃÂ`ÉÂ`ÉÂ@ÆÂ Ï Ã ÃÂÀ¹Â ¶Â€³Â ¶ÂÀ¹Âà¼Â@­Â`°ÂÀ¹Â ¶Âà¼Â@­Â ªÂ ªÂ ªÂ ªÂ@­Â`°Â ªÂ ªÂ`°Â ªÂà£Â ªÂ ¶Âà¼ÂÀ¹Âà¼Â`°Â ªÂ ªÂ ªÂ ªÂà£ÂÀ Â`°Â§Âà£Â@­Â ªÂà£Â ªÂ§Â§Â ªÂà£Â ªÂ ªÂ ªÂ`°Â`°Â`°Âà£Â Â ‘Â@” ‘ÂàŠÂ „ „ÂàŠÂàŠÂÀ‡Â ‘ ‘ ‘Â@”Âà£Â ÂàŠÂ ‘Â@”  §ÂÀ Â@­Â ªÂÀ Â Â ‘€šÂ€šÂ€šÂ ªÂ ªÂ§Â ªÂ`°Â€³Â ªÂ ªÂ@­Â ¶Â€³Â`°Â ªÂà£Â ªÂ ªÂà£Â@­Â`°Â@­Â@­Â ªÂÀ Â Â ‘Â@” ‘ „ kÂàXÂà?Â@0 € îŽÂ@åŽÂàێ€ҎÂ`¶ŽÂÀ¦ŽÂ€ ŽÂ`ŽÂàŽÂ ~ŽÂÀtŽÂ`kŽÂ eŽÂ XŽÂ LŽÂàEŽÂ 3ŽÂÀ)ŽÂ` ŽÂàŽÂ`ŽÂ ŽÂ  ŽÂàúÂ`îÂàáÂàáÂÌÂàÈ ÂÂà¯Â€¦Â Âà–Âà–€Âà–š€ÂÂà} wÂ@nÂàd ^ÂÀHÂàKÂ@UÂ@U E EÂ@<ÂÀ/€)Â6Âà2Â@<Â@<Â6  €Â@ ÂÀýŒÂ€÷ŒÂàÂàÂ`ôŒÂ úŒÂ úŒÂ€÷ŒÂàçŒÂ áŒÂ€ÞŒÂ€ÞŒÂ ÕŒÂÒŒÂ`Œ¹ŒÂൌÂ`©ŒÂ ¯ŒÂ`©ŒÂ@¦ŒÂൌÂÀ²ŒÂÀ²ŒÂ ¯ŒÂ £ŒÂàœŒÂ@¦ŒÂ€¬ŒÂ £ŒÂ –ŒÂàƒŒÂàƒŒÂÀ€ŒÂ }ŒÂ`wŒÂ }ŒÂ qŒÂ dŒÂàjŒÂ€aŒÂ@[ŒÂ XŒÂUŒÂUŒÂ XŒÂ@[ŒÂ KŒÂ XŒÂ`^ŒÂ`^ŒÂ@[ŒÂ KŒÂ ?ŒÂà8ŒÂ€HŒÂ<ŒÂà8ŒÂÀ5ŒÂ 2ŒÂ`,ŒÂ€/ŒÂ€/ŒÂ &ŒÂ`,ŒÂ &ŒÂ 2ŒÂ@)ŒÂà8ŒÂ<ŒÂ 2ŒÂ 2ŒÂà8ŒÂÀ5ŒÂ &ŒÂÀŒÂ ŒÂ`ŒÂ ŒÂ ŒÂ ŒÂ ŒÂ@ŒÂàŒÂ ŒÂ€ý‹Â ô‹Â`ú‹Âñ‹Âñ‹Âñ‹Â ç‹Âàí‹Âàí‹Â ç‹Â€ä‹Â Û‹Â Û‹ÂØ‹Â Û‹Â Û‹Â Û‹ÂØ‹ÂØ‹Â`á‹Â`á‹Â Û‹Âàԋ ΋Â@Å‹Â@ŋ¿‹Â@ŋ€ˋÂ`ȋ€ˋÂàÔ‹Âàԋ ۋ ΋ÂÀÑ‹Â`È‹Â@Å‹ÂÀ¸‹Â€²‹Â µ‹Â µ‹Â µ‹Â໋Â໋ µ‹Â ©‹Â œ‹Â œ‹Â œ‹Â œ‹Â ©‹Â€²‹Â µ‹Â ©‹Â¦‹Â`¯‹Â@¬‹Â¦‹Âࢋ œ‹Â@“‹Â@“‹Â œ‹Â@“‹Â œ‹Â`–‹Âà‰‹Â€€‹Â w‹Â ƒ‹Âà‰‹ÂÀ†‹ÂÀ†‹Â ƒ‹ÂÀ†‹Â ƒ‹Â ƒ‹Ât‹Âàp‹Âàp‹ÂÀ†‹Âà‰‹Â€€‹Â`}‹Â€€‹Â w‹Â€€‹Â€€‹Â`}‹Â w‹Â ƒ‹Â`}‹Â w‹Â w‹Ât‹Ât‹Â€g‹Â@a‹ÂàW‹Â@a‹Â[‹Â[‹Â ^‹Â ^‹Â ^‹Â ^‹Â`d‹Â ^‹ÂàW‹ÂàW‹ÂàW‹Â ^‹Â@a‹Â`d‹Â ^‹Â`d‹Â ^‹Â€g‹Â ^‹ÂÀT‹Â`d‹Â ^‹Â[‹Â[‹ÂàW‹Â ^‹ÂÀT‹Â ^‹Â[‹Â ^‹Â@a‹Â€g‹Â ^‹Â ^‹Â ^‹Â ^‹ÂàW‹Â Q‹Â Q‹Â Q‹Â€N‹ÂÀT‹Â`K‹ÂÀT‹ÂÀT‹Â Q‹Â[‹Â[‹Â ^‹Â ^‹Â j‹Â`d‹Â ^‹Â@a‹Â ^‹Â@a‹Â j‹ÂÀm‹Â ^‹ÂàW‹ÂÀT‹ÂÀT‹Â[‹Â`d‹Â€g‹ÂÀT‹Â Q‹ÂàW‹Â ^‹Â€N‹Â E‹Âà>‹Â E‹Â E‹Â`K‹ÂàW‹Â[‹ÂàW‹Â@a‹Â ^‹ÂàW‹Â j‹Â€g‹Â@a‹Â[‹ÂàW‹Â[‹Â ^‹Â@a‹Â[‹Â€N‹Â Q‹Â@H‹Â`K‹Â`K‹ÂÀT‹ÂàW‹ÂàW‹Â`d‹Â@a‹Â j‹Â€g‹Â@a‹Â`d‹Â@a‹Â`d‹Â ^‹Â ^‹Â@a‹Â@a‹Â@a‹ÂÀT‹ÂàW‹Â[‹Â[‹ÂàW‹Â[‹Â ^‹Â ^‹ÂÀT‹Â`K‹ÂàW‹Â Q‹ÂàW‹ÂàW‹ÂàW‹Â Q‹ÂÀT‹Â€g‹Â@a‹Â ^‹ÂàW‹Â ^‹Â ^‹Â`d‹Âàp‹Â€g‹Â@a‹ÂàW‹Â Q‹ÂÀT‹Â`K‹Â Q‹Â Q‹Â E‹Â`K‹ÂàW‹Â@a‹Â@a‹Â ^‹Â[‹Â[‹ÂàW‹Â Q‹Â€N‹Â`K‹Âà>‹Â@H‹Â€N‹Â`K‹Â`K‹Â`K‹ÂÀT‹Â€N‹Â`K‹Â€N‹Â Q‹Â`K‹Â Q‹Â@H‹Â Q‹ÂàW‹ÂàW‹Â Q‹ÂÀT‹ÂÀT‹Â E‹Â`K‹ÂB‹ÂÀ;‹ÂÀ;‹ÂÀ;‹ÂÀ;‹Â@H‹Â Q‹Â€N‹Â€N‹Â€N‹Â€N‹ÂÀT‹Â Q‹ÂàW‹Â[‹Â€N‹Â E‹Â E‹Â Q‹Â Q‹ÂÀT‹ÂàW‹ÂÀT‹Â`K‹Â@H‹Â`K‹Â€N‹Â€N‹Â`K‹Â`K‹Â@H‹Â E‹Â 8‹ÂB‹ÂÀ;‹Â 8‹ÂB‹ÂÀ;‹Â@H‹Â Q‹ÂàW‹Â`K‹Â@H‹Â`K‹Â€N‹Â`K‹Â`K‹Âà>‹Â€N‹ÂB‹ÂÀT‹Â[‹Â Q‹Â€N‹Â Q‹Â Q‹ÂàW‹Â[‹ÂàW‹ÂÀT‹Â Q‹Â`K‹ÂàW‹Â ^‹Â@a‹ÂàW‹Â€N‹Â Q‹ÂàW‹Â@a‹Â`d‹Â@a‹Â€g‹ÂàW‹Â[‹Â[‹Â Q‹Â Q‹ÂàW‹Â€g‹Â ^‹Â ^‹Â[‹Â ^‹ÂàW‹Â ^‹Â Q‹ÂàW‹ÂàW‹Â€N‹ÂÀT‹Â Q‹ÂàW‹Â ^‹ÂÀT‹Â`K‹Â[‹ÂàW‹Â@a‹Â`d‹Â`d‹Â ^‹Â@a‹Â j‹Ât‹Â€g‹Â ^‹ÂÀT‹ÂàW‹Â ^‹Â j‹Â€g‹Â ^‹Â€g‹Â`d‹Â ^‹ÂàW‹Â ^‹Â@a‹Â@a‹Â`d‹Â`d‹Â j‹Â€g‹Â€g‹Âàp‹Â€g‹Â[‹Â`d‹ÂÀm‹Ât‹ÂÀm‹Â`}‹Â ƒ‹Ât‹Â w‹Â`}‹Â@z‹Â w‹Â ƒ‹Â`}‹Â@z‹Â w‹Â w‹Â€€‹Ât‹Â€€‹ÂÀ†‹Âà‰‹Â€€‹Â‹Âà‰‹Â`–‹Â ‹Â ‹Â ‹Â‹Â ‹Âà‰‹Âà‰‹Â‹Â€™‹Â@“‹Â ‹Â‹Â ƒ‹Â‹Â@“‹Âà‰‹Â€™‹Â ‹Â`–‹Â@“‹Â€™‹Â ‹Â`–‹Âà‰‹Â@“‹Â œ‹Â@¬‹Â@¬‹Â¦‹Â@¬‹Â`¯‹Â@¬‹Â@¬‹Â ©‹Â ©‹Â ©‹Â œ‹Â œ‹ÂÀŸ‹Â œ‹Â œ‹Â`–‹Â€™‹Â ©‹Â µ‹Â µ‹Â໋Â໋ÂÀ¸‹Â µ‹Â໋ÂÀ¸‹Â µ‹Â`¯‹ÂÀ¸‹Â¿‹Â ‹¿‹ÂÀ¸‹Â ‹ ‹ ‹Â`È‹Â໋ µ‹Â€²‹ÂÀ¸‹Â໋Â`ȋ ‹Â໋Â໋Â@Å‹Â`ȋ¿‹Â໋Â໋Â໋ÂÀ¸‹Â໋€ˋ ‹ ΋ÂÀы€ˋÂ@Å‹ÂàÔ‹Â Û‹ÂàÔ‹ÂàÔ‹ÂàÔ‹Â໋€²‹Â@ŋ ΋ÂÀÑ‹ÂÀÑ‹ÂÀы ΋ ‹ ΋Â`á‹Â ç‹Â`á‹Â€ä‹Âàí‹ÂÀê‹Â ç‹Â`á‹Â ç‹Â€ä‹Â`á‹ÂàÔ‹Âàԋ ۋ ç‹Â€ä‹Âàí‹Â ç‹Â ô‹Â ŒÂ`ú‹Âàí‹ÂÀê‹Â`á‹Â؋ ۋÂ@Þ‹Â Û‹Â`á‹Â ç‹Âàí‹ÂÀê‹ÂÀê‹ÂÀê‹Âñ‹Â`ú‹Âàí‹Â ç‹Âàí‹Â@÷‹Âàí‹Âàí‹Âàí‹Â ç‹Â@÷‹Â€ý‹Âñ‹Â ç‹Â ç‹Â ç‹Âàí‹Âàí‹Â@÷‹Âàí‹Â ô‹Âàí‹Âñ‹Âàí‹Â`ú‹Â ŒÂ@÷‹Â ô‹Â`ú‹Âñ‹Âàí‹Â@÷‹Â ç‹Âàí‹Â@÷‹Â@÷‹Â`ú‹Â@÷‹Â`ú‹Â`ú‹Â`ú‹Â ŒÂ ŒÂ ŒÂ@÷‹Â ŒÂ€ý‹ÂàŒÂ ŒÂ`ŒÂ`ŒÂ ŒÂ ŒÂ ŒÂàŒÂ`ŒÂàŒÂ ŒÂÀŒÂÀŒÂ@÷‹Â`ú‹ÂÀŒÂÀŒÂ€ý‹ÂÀŒÂàŒÂàŒÂ ŒÂàŒÂ@ŒÂÀŒÂàŒÂàŒÂ@)ŒÂ &ŒÂ ŒÂ`ŒÂ`ŒÂ€ŒÂÀŒÂ ŒÂàŒÂ#ŒÂ#ŒÂ@)ŒÂ 2ŒÂ<ŒÂ ?ŒÂ`,ŒÂ 2ŒÂ<ŒÂ@BŒÂ KŒÂàQŒÂ KŒÂ€HŒÂàQŒÂ KŒÂ`EŒÂ@BŒÂ`EŒÂ KŒÂ KŒÂ`EŒÂ€HŒÂ`EŒÂ`EŒÂ KŒÂàQŒÂ@[ŒÂÀgŒÂ@tŒÂ@tŒÂ }ŒÂ€zŒÂ@tŒÂÀgŒÂ dŒÂ`^ŒÂ dŒÂàQŒÂ KŒÂ`EŒÂÀNŒÂÀNŒÂ€aŒÂ dŒÂàjŒÂ }ŒÂ qŒÂ@tŒÂ qŒÂ€aŒÂÀgŒÂnŒÂ@tŒÂnŒÂ qŒÂ€zŒÂ }ŒÂÀ€ŒÂÀ€ŒÂ –ŒÂ –ŒÂ`ŒÂàƒŒÂ ŠŒÂ ŠŒÂ‡ŒÂ@ŒÂ`ŒÂ@ŒÂ ŠŒÂ ŒÂàœŒÂÀ™ŒÂÀ™ŒÂ€“ŒÂ ŠŒÂ`ŒÂàœŒÂàœŒÂàœŒÂ £ŒÂ`©ŒÂ £ŒÂ@¦ŒÂ@¦ŒÂ £ŒÂÀ™ŒÂ £ŒÂÀ™ŒÂ€“ŒÂ`ŒÂ€“ŒÂ ŒÂ £ŒÂ ¯ŒÂ@¿ŒÂ ÈŒÂ ÈŒÂ`ÂŒÂ`ÂŒÂ`Œ¹ŒÂ@¿ŒÂ€ÅŒÂ ÈŒÂ`ÂŒÂ`Œ ȌÂÒŒÂ`ÂŒÂ@¿ŒÂ ¼ŒÂ¹ŒÂ€ÅŒÂ`ÂŒÂ@¿ŒÂ@¿ŒÂ@¿ŒÂ ÈŒÂ`Œ ¼ŒÂ@¿ŒÂൌÂ@¿ŒÂ ¼ŒÂ`ÂŒÂàÎŒÂàÎŒÂàΌ ȌÂ`Œ€ŌÂàΌ€ތ€ތÂàçŒÂ Ռ Ռ€ތ áŒÂ€ÞŒÂ€ÞŒÂ îŒÂàçŒÂ îŒÂ îŒÂëŒÂ îŒÂ`ôŒÂ`ôŒÂ€÷ŒÂ@ñŒÂ îŒÂàçŒÂ ÕŒÂ@، áŒÂàçŒÂ áŒÂàçŒÂ îŒÂ€÷ŒÂ`ôŒÂ îŒÂ@ñŒÂ€÷ŒÂ úŒÂàÂ`ôŒÂ îŒÂ`ôŒÂ úŒÂ€÷ŒÂ€÷ŒÂ úŒÂ úŒÂ€÷ŒÂ€÷ŒÂ€÷ŒÂÂàÂ@ñŒÂ úŒÂ € Â` ÂÀ Â` ÂÀ ÂàÂ@#Â`&  Â@#€) , , ,€)Âà2Â@< , ,Â`&Â`&Â`&Â`&ÂÀ/ÂÀ/Â6ÂÀ/Â6 , 9 9Â6Â6 9Â`?Â`? 9ÂÀHÂàKÂàKÂàK€B EÂOÂ@<Âà2Â`&Â@#€) ,Â6Â6Â6 9 EÂ`?€BÂàKÂÀHÂàK RÂ@UÂÀa ^ ^ RÂàKÂÀHÂàKÂàKÂÀHÂÀHÂàKÂO R R R RÂ`X€[ÂàdÂh ^ kÂhÂàdÂhÂ@n k kÂ`q w w wÂÀz wÂ@nÂhÂh kÂh€tÂ`qÂ@n „Â`ŠÂ€Â@‡Â w „Âà}Âà}€ „€ÂÀ“  €¦Â Âà–šš €¦ÂšÂà–Â@ ÂšÂšÂ  ©Â ©Âà¯Âà¯ÂÀ¬Â@¹Â ¶Â@¹Â`¼Â³Â@¹Â@¹Â`¼Â€¿Â ÂÂ`¼Â`¼Â€¿Â ÂÂ`ÕÂàÈ€¿Â ¶Â`¼Â`¼Â Â Â ÂÂÀÅÂ@Ҡπ¿Â`¼Â€¿ÂÌÂ̠ϠπØÂåÂàáÂÀÞÂÀÞ€ØÂÀÞ Ï Ï ÏÂ@Ò€ØÂÀÞÂàáÂàáÂ@ë èÂàáÂàáÂàá€ñÂÀÞÂ`ÕÂÀÞ Û€ñ è èÂ@ëÂ@ëÂ`îÂÀ÷ ô ôÂ@ë ô ô€ñÂ`îÂ`îÂ@ëÂ@ëÂ`î ô ôÂþÂþ ŽÂ`ŽÂ ŽÂ@ŽÂ`ŽÂ@ŽÂàú ŽÂ  ŽÂ ŽÂ€ ŽÂ  ŽÂÀŽÂ@ŽÂ`ŽÂ€ ŽÂþÂ@ŽÂ`ŽÂàúÂþÂþ ŽÂ  ŽÂŽÂ@ŽÂ &ŽÂÀ)ŽÂ 3ŽÂ 3ŽÂ€#ŽÂà,ŽÂ0ŽÂ`9ŽÂ 3ŽÂ &ŽÂÀ)ŽÂ€#ŽÂ0ŽÂ€<ŽÂ 3ŽÂ`9ŽÂ 3ŽÂ0ŽÂ &ŽÂ &ŽÂ0ŽÂÀ)ŽÂ &ŽÂ€#ŽÂà,ŽÂ 3ŽÂ@6ŽÂ`9ŽÂ ?ŽÂ ?ŽÂ 3ŽÂ@6ŽÂ 3ŽÂ 3ŽÂ 3ŽÂ0ŽÂ@6ŽÂ0ŽÂ &ŽÂ` ŽÂ` ŽÂ€#ŽÂ0ŽÂ` ŽÂ &ŽÂà,ŽÂ0ŽÂ ?ŽÂ`9ŽÂ ?ŽÂÀBŽÂ ?ŽÂàEŽÂIŽÂÀBŽÂàEŽÂ LŽÂ`RŽÂIŽÂ ?ŽÂ€<ŽÂ€<ŽÂàEŽÂ`RŽÂ`RŽÂ€UŽÂ€UŽÂ LŽÂ€UŽÂ XŽÂ`RŽÂ`RŽÂàEŽÂ LŽÂ@OŽÂÀBŽÂÀBŽÂÀBŽÂ€<ŽÂ€<ŽÂ LŽÂ€UŽÂIŽÂ`RŽÂ@OŽÂà^ŽÂ€UŽÂ eŽÂ XŽÂÀ[ŽÂà^ŽÂ XŽÂ XŽÂbŽÂbŽÂ`kŽÂ qŽÂbŽÂ@hŽÂ`kŽÂÀ[ŽÂ XŽÂà^ŽÂ€nŽÂ€nŽÂàwŽÂÀtŽÂ€nŽÂ qŽÂ`kŽÂ eŽÂ`kŽÂ€nŽÂ@hŽÂ`kŽÂ qŽÂ`kŽÂbŽÂ eŽÂ@hŽÂ€nŽÂ€nŽÂ qŽÂÀtŽÂàwŽÂ qŽÂÀtŽÂ qŽÂbŽÂ eŽÂ eŽÂ@hŽÂ{ŽÂ`„ŽÂàŽÂàŽÂ ŠŽÂ€‡ŽÂ ~ŽÂàwŽÂ ~ŽÂ€nŽÂàwŽÂ€nŽÂ{ŽÂ€‡ŽÂ€‡ŽÂ@ŽÂàwŽÂ qŽÂ ~ŽÂ ~ŽÂ{ŽÂ@hŽÂ`kŽÂ qŽÂ`„ŽÂ ~ŽÂàwŽÂ ~ŽÂ€‡ŽÂ ŠŽÂÀŽÂ ŠŽÂÀŽÂ€ ŽÂ”ŽÂ ŠŽÂ ŠŽÂ ~ŽÂ ~ŽÂ ŠŽÂàŽÂ”ŽÂàŽÂ ŠŽÂ”ŽÂàŽÂ`„ŽÂ`„ŽÂ ŠŽÂ ŠŽÂàŽÂ€‡ŽÂàŽÂÀŽÂàwŽÂÀtŽÂ qŽÂàwŽÂ”ŽÂ€‡ŽÂ`„ŽÂ ŠŽÂ ŠŽÂ ŠŽÂ”ŽÂ”ŽÂ”ŽÂÀŽÂ€‡ŽÂ”ŽÂ ŠŽÂ ŠŽÂ ŠŽÂ ŠŽÂ ŠŽÂ ŠŽÂ ŠŽÂÀŽÂàŽÂ ŠŽÂ —ŽÂ`ŽÂ —ŽÂ€ ŽÂ”ŽÂ —ŽÂ`ŽÂ —ŽÂ`ŽÂ`ŽÂ€ ŽÂ —ŽÂ੎Â੎Â@šŽÂ —ŽÂ@šŽÂ੎Â੎Â੎ £ŽÂ £ŽÂÀ¦ŽÂ@šŽÂ £ŽÂ੎­ŽÂ £ŽÂ੎­ŽÂ £ŽÂ€ ŽÂ °ŽÂ@³ŽÂ੎­ŽÂ@³ŽÂ ¼ŽÂ ¼ŽÂ ¼ŽÂ€¹ŽÂ °ŽÂ­ŽÂÀ¦ŽÂ੎ °ŽÂ­ŽÂ੎Â੎­ŽÂ ¼ŽÂ`¶ŽÂ`¶ŽÂ@³ŽÂ€¹ŽÂÀ¿ŽÂ °ŽÂ`¶ŽÂ@³ŽÂ­ŽÂ€¹ŽÂ °ŽÂ °ŽÂ@³ŽÂ€¹ŽÂ€ÒŽÂ€ÒŽÂ@ÌŽÂ ÉŽÂ`ÏŽÂÆŽÂàÂŽÂ`¶ŽÂ€¹ŽÂÆŽÂÆŽÂÀ¿ŽÂÆŽÂ@ÌŽÂ@ÌŽÂÀ¿ŽÂ ¼ŽÂ@ÌŽÂÆŽÂ ÉŽÂÆŽÂ ÉŽÂÀ¿ŽÂ@³ŽÂ@³ŽÂ ¼ŽÂ Ɏ Ɏ ¼ŽÂ€ÒŽÂ`ÏŽÂ ÉŽÂ@ÌŽÂ`ώ ՎÂàێ Վ ՎÂ`ÏŽÂ@ÌŽÂàÂŽÂ`ÏŽÂ`ÏŽÂÆŽÂ`ÏŽÂ@̎ Ɏ Ɏ ՎÂÀØŽÂ@åŽÂߎÂ@åŽÂ îŽÂàÛŽÂÀØŽÂ ÕŽÂ ÉŽÂÆŽÂàÂŽÂÀØŽÂÀ¿ŽÂ`¶ŽÂ`¶ŽÂ °ŽÂ੎€¹ŽÂÀ¿ŽÂàŽ€¹ŽÂÀ¿ŽÂ ÉŽÂ ÉŽÂÆŽÂÆŽÂÆŽÂ`ÏŽÂߎÂ`ÏŽÂÆŽÂàÂŽÂ`¶ŽÂ °ŽÂ ¼ŽÂ ÉŽÂ@ÌŽÂ ÉŽÂÆŽÂ@ÌŽÂ@ÌŽÂÆŽÂàŽ Ɏ Ɏ€ҎÂ@ÌŽÂÆŽÂ ÉŽÂÆŽÂàÂŽÂÆŽÂ`ÏŽÂ ÉŽÂàÂŽÂ@ÌŽÂ ÉŽÂ ÉŽÂÆŽÂ ¼ŽÂÆŽÂ`¶ŽÂ ¼ŽÂàŽ€Ҏ ɎÂàÂŽÂÆŽÂ ¼ŽÂÀ¿ŽÂ ¼ŽÂàÂŽÂ ÉŽÂ ÉŽÂ ÉŽÂ ÉŽÂÀ¿ŽÂ ¼ŽÂÀ¿ŽÂ ¼ŽÂ ¼ŽÂ ¼ŽÂ ÉŽÂÆŽÂ`¶ŽÂ€¹ŽÂ`¶ŽÂ ¼ŽÂ€¹ŽÂ`¶ŽÂÀ¿ŽÂÀ¿ŽÂÀ¿ŽÂ`¶ŽÂƎ Ɏ ¼ŽÂƎ ¼ŽÂàÂŽÂÆŽÂ Ɏ€ҎÂ`ÏŽÂ@ÌŽÂàÂŽÂ ÉŽÂÀØŽÂ ÉŽÂ`ÏŽÂàÂŽÂÆŽÂ Ɏ Ɏ€ҎÂÀØŽÂ`ώ Վ ՎÂߎÂàÛŽÂ âŽÂ âŽÂàÛŽÂàÛŽÂàÛŽÂÀØŽÂ@ÌŽÂ ÉŽÂ ÉŽÂÀØŽÂߎ âŽÂ âŽÂàÛŽÂߎ âŽÂ€ëŽÂߎ âŽÂ âŽÂ`èŽÂ@åŽÂ€ëŽÂøŽÂ€ëŽÂ`èŽÂ`èŽÂ€ëŽÂ@åŽÂÀØŽÂߎÂßŽÂøŽÂàôŽÂ@þŽÂøŽÂàôŽÂ îŽÂ îŽÂàôŽÂ€ëŽÂ`èŽÂ€ëŽÂ€ëŽÂ@åŽÂ€ëŽÂ`èŽÂ`èŽÂ îŽÂ îŽÂ îŽÂ€ëŽÂÀñŽÂàôŽÂ îŽÂøŽÂøŽÂøŽÂ`€Â`Âà € ûŽÂøŽÂ@þŽÂ@þŽÂøŽÂàôŽÂøŽÂÀñŽÂ ûŽÂ@þŽÂ`€ ûŽÂ€  ÂÀ Â@€ Âà Âà Â`ÂÀñŽÂ îŽÂøŽÂ ûŽÂøŽÂ îŽÂ`èŽÂàôŽÂøŽÂÀñŽÂøŽÂ ûŽÂ`Â`ÂøŽÂ@þŽÂ ûŽÂÀ Â@þŽÂàôŽÂ ûŽÂ€€€Â` ûŽÂøŽÂ@þŽÂ@þŽÂ ûŽÂ ûŽÂ`€ÂÀ  € €€ÂÀ Âà   ÂÀ  ÂÀ  €€Â*Â@  €Â`€ÂÀ#   €  €     €ÂÀ#ÂÀ#Âà&Â@0ÂÀ#Âà&Â* - - -Âà&Â@0ÂÀ# -Â`3Â*€Â`Â*ÂÀ#ÂÀ#€  Â* -ÂÀ#Â`€Âà& -Âà& - -ÂÀ# -Â`3Â`3Â* -Â*Â@0Â* 9€6ÂCÂà? 9€6 9Â@0 -€6Â`3Â@0Âà?Âà? FÂ`L€OÂà?ÂÀ<Âà? F F F FÂ`LÂC F€OÂÀUÂ\Â\ÂàX€O RÂ\ _ÂÀU RÂÀU€O R R R€OÂàXÂ@bÂàX RÂ\Â`eÂ`e _€hÂ@bÂàqÂuÂ@{ xÂàq€hÂ`eÂ@bÂ`eÂÀnÂuÂu€hÂ`eÂ`e _Â@b _€h€h k kÂàXÂ@b k kÂàqÂ`~ xÂàqÂàq x xÂàqÂ@{Â@{Âàq xÂ@{ „ „ x x k kÂ`~Â`~Âu k kÂàq€ „ „ÂàŠÂ ‘ÂŽÂàŠÂàŠÂ ‘ ‘ Â@”Ž „ÂàŠÂÀ‡ÂŽÂ@”Â`—Â`—€šÂ€šÂ@” ‘ÂŽÂàŠÂàŠÂÀ‡ÂŽÂ „ „ÂŽÂÀ‡Â „ „ÂŽÂàŠÂàŠÂÀ‡Â@”ÂÀ Â Â`—ÂàŠÂ ‘€šÂÀ Â`—€šÂÀ Â Â€šÂ ªÂà£Â§Â ¶Â@­Âà£Âà£Â Â Â ‘ÂàŠÂàŠÂ`— Â`—Â`—§ ªÂ§Â§Â§Âà£Â Âà£Â ªÂ@­Â ªÂ@­Âà£Â€³Â`°Â ªÂà£Â ªÂ€³Â`°Â€³Â ¶ÂÀ¹Â ¶Â`°Â€³Âà£Â ªÂ ªÂ@­Â Â Âà£Âà£Â@­Â ¶ÂÀ¹Â@­Â ¶Â ¶Âà¼Â ÃÂÀÂ@­Â ÃÂ@ÆÂ àÃÂàÕ ÜÂàÕ Ï ÃÂ@ÆÂ ÏÂ`ÉÂà¼Â ÃÂà¼ÂÀ€³Â`°Â@­Â ªÂÀ¹Â ÃÂÀÂ`É ÃÂÀÂ`ÉÂÀ ÃÂ`ÉÂÀÒÂÀÒ Ü ÜÂÙÂàÕ ÜÂàÕÂ@ßÂ`â ÜÂ`ɀ̀ÌÂ@ÆÂ€Ì Ï€ÌÂ`ɠàϠàÀ̠̀ÃÂ`É€ÌÂ`ÉÂ@ÆÂÀÒ ÜÂ`âÂÀÒÂÀÒÂ`ÉÂà¼ÂÀÂ@ÆÂ@ÆÂ ÃÂ@ÆÂ€Ì€ÌÂÀÒÂÀÒÂàÕÂ@ߠܠ܀å€åÂ@ßÂ@ßÂ`â èÂÙÂ`â ÜÂÙÂàÕÂàÕÂàÕÂàÕÂàÕÂàÕÂàÕ ÃÂ@ÆÂ ÏÂÀÒÂàÕÂàÕÂÀÒÂàÕ€ÌÂ@ÆÂ ÏÂàÕ Ü ÜÂ@ßÂÀëÂàî ÜÂÀÒ ÏÂàÕÂÙÂÙ ÜÂ@ßÂàÕÂàÕÂàÕ ÃÂ@ÆÂ ¶Â ¶Â@ÆÂ ÏÂàÕÂàÕ Ü Ï ÜÂ`â€å èÂÀë ÜÂàî èÂàîÂòÂÀëÂàîÂòÂòÂÀë€åÂ@ßÂ`âÂàî õ€þ õÂò èÂÀëÂÀë õÂàîÂàîÂàîÂàîÂòÂ@øÂò õÂ@øÂÀë€å è€å è€åÂÙÂÙ ÜÂ`âÂ@ßÂ`â€åÂÙÂÙÂÙÂÙÂÙÂàÕÂÙÂ`âÂ٠܀åÂ`âÂ`â è€å èÂàîÂàîÂàÕÂ@ßÂ@ßÂ`â Ü€å è€åÂ@ß èÂÀë è èÂàî õÂòÂÀëÂàî õÂ@øÂò èÂÀë èÂ@øÂ õÂòÂò€þÂÀ õÂ`û€åÂàî è€åÂò õÂ`û Â`ûÂ`ûÂ`û€þÂ`û€þÂàÂ`ûÂ`û Âà Â`ûÂ`ûÂ`ûÂ@øÂ õÂ@øÂàî Â`ûÂ@øÂ€þÂ@øÂ@øÂ@øÂ@øÂ õÂ`û  Âà€þ€þ  Â`ûÂ`ûÂ@øÂ õ Âà   Â@Âà  ÂàÂà Â`Â@ Â@  Âà ÂÀÂÀÂ@Â@€þ õÂ`ûÂà  Â`ÂÀÂ`-ÂÀÂà  Â` Â@Â` Â` Â`  Âà Âà ÂÀ Â`Âà ÂàÂàÂ@€  'Â$€Â` 'ÂÀ ' 'Â@*Â@*€0 3Â@C 3 3Â`-Â`-Â`-ÂÀ6Âà9 3ÂÀ6Â= 3ÂÀ6€0Âà9 @Â=Âà9€0€0€0Â@*€0€0€0 3 @Â= @Â`FÂ@CÂ@CÂ@C LÂ@CÂ`F€IÂàRÂÀO L @€IÂ@CÂÀ6ÂÀ6Âà9 @ @Âà9 @Â`FÂàRÂàR LÂà9 @Â@C @Â@CÂ`F L L L L€IÂ=Âà9Â@C€I LÂ`FÂ@C @Â`F€IÂàR LÂÀO€I @Â@C€IÂÀO @ @Â=Â`FÂ`FÂ@CÂÀOÂ`F LÂ@CÂ`F L YÂVÂ`_ÂÀhÂÀhÂ@\ eÂÀh€b Y eÂ@\€bÂàkÂàkÂo eÂÀh e e€bÂÀhÂàkÂàk e€b e eÂoÂÀhÂ`x r eÂo eÂÀh eÂàkÂ`_ÂàRÂVÂ@\Âàk€b e€b eÂ`_ e e eÂÀhÂ@\ÂàRÂ@\Â`_€b eÂVÂV Y e€{Â@u r e e YÂ@\ Y e€b€bÂ`_ e€b€b e rÂàkÂàk eÂÀhÂoÂ@u eÂ`_ÂàRÂÀOÂÀO YÂ`_€bÂÀh e r ~Â@u rÂàk rÂo r rÂàk€bÂàkÂàk e eÂ@\ eÂÀh€b eÂ`xÂoÂàkÂoÂàkÂàkÂàkÂàk rÂoÂ`x ~Â`x rÂ@uÂ`xÂàkÂ`x r rÂ`xÂ`x r r ~ÂÀ€{€{ ~Âà„ÂÀ ~ ~Âà„Âà„Âà„Â`xÂ@u ~ ‹Â@ŽÂà„ ~ÂÀÂ`xÂo eÂ@uÂ`xÂ`x€{Âà„Â@ŽÂ ‹ÂÀÂÀÂà„ˆÂà„ ~ ~€{ÂÀ€{ÂÀ€{ ‹Â€”€”ÂÀšÂÀšÂ€”Â`‘ÂÀšÂàÂ`‘Â@ŽÂ€”Â`‘Âà„€” ‹Â@ŽÂ`‘ÂÀšÂ — ¤ÂÀ³Â °Â`ªÂ`ªÂ@§Â`ªÂ ¤Â ¤ÂàÂàˆˆÂà„€” — —ÂàÂ`‘Â`‘ÂàÂ`ªÂ€­Â °Â ¤Â`ªÂ ¤Â ¤Â@§Â ¤Â@§ÂÀ³Â€­Â ½Â@À ½Â€­Â€­ÂÀ³Â@À É ÉÂ`ÃÂà¶Âà¶Â@ÀÂÀ³Â °Â@§Â ¤Âà¶Â`ªÂ¡Â ¤Â`ªÂ`ªÂà¶Âà¶Â`ªÂà¶Â`ªÂ °ÂÀ³ÂÀ³Âà¶Âà¶Â ½Â ½Âà¶Â ½Âà¶ÂºÂà¶ÂÀ³Â °Âà¶Âà¶Â ½Â ½Â`à½Â ½Âà¶Â °Â€­ÂÀ³Âà¶Â ½Â ½Â@ÀÂ`ÃÂ@À ½Âà¶Â ½Â ½Â ÉÂ@À ½Â`àɀÆÂ€ÆÂ É ÉÂàÏÂàÏÂ@À ÉÂ`ÃÂàÏ ÖÂàÏ ÖÂ`Ü ÖÂàÏ ÉÂÓ ÖÂàÏ ÉÂÀÌÂàÏ€ßÂàÏ ÖÂÓ É ÖÂàÏ€ßÂ`Ü€ßÂàÏÂÓÂÀÌÂàÏÂ`ÜÂÀå ïÂàèÂÀåÂàè âÂÀåÂàè âÂì âÂÀå€ß Ö ÖÂÓÂÓ ÉÂÓÂÓ ÖÂàè ï ïÂ`õÂìÂàèÂàèÂì ïÂ`õÂà‘ ïÂì ï ûÂÀþÂÀþ€øÂ`õÂÀþÂ`õ€øÂ€øÂ û û€øÂ ï€øÂ`õ ïÂ`õÂà‘ ûÂ@ò û ‘Âà‘Â@ ‘Â@ ‘ ‘ ‘ ‘ ‘ ûÂà‘ ûÂ`õÂ@ò€øÂ`õ ûÂÀþÂ`‘Âà‘€øÂ`õ ï ïÂÀþÂà‘Â`õ€øÂ‘ ‘ ‘ÂÀ‘Âà‘Âà‘Â@ ‘ ‘ ‘Â`‘€‘ ‘Â@ ‘ ‘ ‘Âà‘ ûÂ@ ‘‘‘ÂÀ‘ ‘ ‘€‘ÂÀþ€øÂ€øÂ ï€øÂ`õ€øÂ ûÂà‘ÂÀþ ‘Â`‘ ‘Â@ ‘‘Â@ ‘Â`‘€‘Â`‘Â`‘Â@ ‘ ‘ ‘ ‘Âà‘ ‘ ‘Â@ ‘ ‘Â@ ‘ ‘‘‘ ‘ÂÀ‘€‘ÂÀ‘€‘ÂÀ‘ÂÀ‘Âà‘‘€‘ ‘ ‘‘ ‘ ‘ ‘Â@ ‘Âà‘ ûÂÀþÂ@ ‘Â`‘Â@ ‘Âà‘‘ ‘ ‘ ‘ÂÀ‘Â`‘€‘ !‘‘ ‘ ‘ÂÀ‘€‘ ‘‘Âà‘Â@ ‘ ‘ÂÀþÂà‘ û ‘ ‘Âà‘Â@ ‘Â`‘ ‘Â`‘Â`‘ÂÀ‘ !‘ !‘€‘Âà‘ÂÀþ ‘Â@ ‘Â`‘ ‘ !‘‘ !‘ !‘ !‘€‘ ‘Â@ ‘ ‘ ‘Âà‘Â`‘Â@ ‘‘‘ ‘ !‘Âà‘‘Â`‘‘‘ ‘Âà‘ ‘€‘ ‘‘Âà‘‘‘Âà‘Âà‘ÂÀ‘ÂÀ‘ÂÀ‘Â`‘Â@ ‘ ‘Âà‘ ‘Â`‘Â`‘ ‘ ‘ ‘ ‘Â`‘ ‘‘ ‘Â@ ‘Â@ ‘ ‘Âà‘Âà‘ ‘ ‘Â`‘Â@ ‘€‘€‘Â`‘€‘Âà‘ÂÀ‘ÂÀ‘ ‘ÂÀ‘ÂÀ‘Âà‘ÂÀ‘ ‘ÂÀ‘Âà‘ !‘ÂÀ‘€‘ ‘€‘€‘ ‘ ‘Â@ ‘€‘‘Â@$‘‘ÂÀ‘€‘ ‘ ‘ÂÀ‘€‘Â@ ‘€‘ÂÀ‘‘Â`'‘ !‘ !‘Â`'‘ !‘Âà‘Âà‘ ‘ ‘ !‘Âà‘Âà‘Âà‘ ‘ ‘ ‘ ‘Âà‘Âà‘ ‘Â`‘ ‘Âà‘ !‘ !‘Âà‘‘Â`'‘Âà‘Âà‘Âà‘Âà‘ ‘ !‘Âà‘ !‘ !‘Âà‘ !‘Â@$‘Â`'‘€*‘€*‘ -‘ÂÀ0‘ :‘Â`@‘ F‘ F‘ F‘ :‘ÂÀ0‘Âà3‘Âà3‘Âà3‘Â7‘ :‘Âà3‘ -‘ÂÀ0‘ :‘€C‘ F‘Â`@‘ :‘ÂÀ0‘ :‘ -‘Â7‘Âà3‘Â7‘ :‘ :‘ :‘€C‘Â7‘ -‘ÂÀ0‘€C‘€C‘Â`@‘Â@=‘Âà3‘Â7‘ :‘Â`@‘ :‘ÂÀI‘ F‘ S‘ S‘ÂP‘ÂàL‘ÂP‘ F‘Â@=‘ :‘ F‘Â`@‘Â7‘ :‘ F‘Â@=‘ -‘Âà3‘Âà3‘Âà3‘Â`@‘ :‘ :‘Âà3‘Â@=‘€C‘Â@V‘€\‘Â`Y‘ÂàL‘Â@=‘ÂÀI‘ S‘ S‘ÂÀI‘ F‘ F‘ÂàL‘ÂP‘ S‘ S‘ÂP‘ S‘Â`Y‘ S‘€\‘€\‘Â`Y‘€\‘Â`Y‘Â`Y‘Â`Y‘€\‘€\‘ _‘ _‘Âi‘ _‘ l‘Â@o‘€u‘Â`r‘€u‘ l‘ l‘Âi‘ _‘Âi‘Â`r‘ x‘Â`r‘ l‘€u‘ x‘€u‘‚‘Âà~‘Âà~‘‚‘‚‘Âà~‘Âà~‘Âà~‘ x‘ x‘ x‘Âà~‘Âà~‘ x‘Âà~‘ÂÀ{‘ x‘ x‘€u‘Â`r‘ l‘ l‘ l‘Âàe‘Âi‘Â@o‘Â`r‘Â@o‘Â@o‘Âàe‘Âàe‘ _‘ _‘Âi‘Â@o‘Â@o‘Â`r‘Â@o‘Âàe‘Â`r‘ x‘€u‘Â`r‘ x‘Â@o‘ l‘Â`r‘€u‘ x‘€u‘€u‘Â`r‘€u‘ x‘ x‘ x‘ x‘€u‘Â`r‘Â`r‘ÂÀ{‘ÂÀ{‘ x‘ l‘ l‘Â@o‘Â`r‘Â`r‘ÂÀb‘ l‘Âi‘ x‘ x‘€u‘Âà~‘Â`‹‘Â@ˆ‘Âà~‘ÂÀ{‘ÂÀ{‘ …‘Â€Ž‘Â …‘ …‘€u‘ x‘‚‘‚‘Â`‹‘ …‘ …‘Â`‹‘Â`‹‘Â`‹‘ …‘ …‘Â@ˆ‘Âà—‘Â`‹‘Âà~‘€u‘Â`r‘€u‘Â@o‘Â`r‘Â`r‘Âà~‘Â@ˆ‘ÂÀ{‘Âà~‘ÂÀ{‘ ‘‘Â€Ž‘Â€Ž‘Âà~‘‚‘‚‘Â@ˆ‘Âà~‘Â`‹‘Â`‹‘ …‘Â@ˆ‘Â€Ž‘Â …‘Â@ˆ‘Â€Ž‘Â ‘‘ ‘‘ ž‘ ž‘ ‘‘‚‘Â`‹‘ …‘Âà~‘ÂÀ{‘ …‘‚‘‚‘Âà~‘Â€Ž‘Â`‹‘‚‘ …‘Â@ˆ‘ …‘Â€Ž‘Âà—‘Â ‘‘Â@ˆ‘ …‘ ‘‘Â€Ž‘Â€Ž‘Â€Ž‘Â€Ž‘Â ‘‘Â`‹‘›‘ ‘‘Â€Ž‘Â›‘Â@¡‘ ž‘Âà—‘Â›‘ ‘‘Â`‹‘Â€Ž‘Â€Ž‘Âà—‘Â ž‘›‘Âà—‘ÂÀ”‘ ‘‘ÂÀ”‘Âà—‘ÂÀ”‘Âà—‘Â›‘Â`¤‘ ª‘Âà—‘ÂÀ”‘ ž‘›‘Âà—‘Â ž‘ ‘‘Âà—‘Â@ˆ‘ …‘ ‘‘ ‘‘Â€Ž‘Â€Ž‘Âà—‘Â ‘‘ ‘‘Â@ˆ‘ ‘‘ÂÀ”‘ ž‘ ž‘Âà—‘Â ž‘€§‘›‘Â`‹‘Âà—‘Â ‘‘ ž‘ ž‘Â@¡‘ ž‘ ž‘Â@¡‘Â`‹‘Â`‹‘Â`‹‘Â@ˆ‘ …‘Âà~‘ÂÀ{‘ÂÀ{‘Â@ˆ‘Âà~‘ x‘Âà~‘Â`‹‘Â€Ž‘Â …‘Â@ˆ‘Â@ˆ‘ ‘‘Â@ˆ‘ÂÀ{‘Âà~‘ …‘Â`‹‘ÂÀ”‘ÂÀ”‘ÂÀ”‘ ‘‘Â`‹‘ ‘‘Â@ˆ‘ …‘ x‘Âà~‘Â`‹‘Â`‹‘Âà~‘ …‘Â`‹‘ ‘‘ …‘ …‘€u‘ x‘ …‘Âà~‘‚‘Âà~‘Âà~‘Â@o‘ l‘Âàe‘Âàe‘Âàe‘ l‘ l‘ _‘€\‘Â`Y‘ _‘€\‘ÂàL‘ÂP‘ S‘ÂÀI‘ÂàL‘ÂàL‘ F‘ :‘Â`@‘Â`@‘Â`@‘ÂP‘ÂÀI‘ F‘€C‘€C‘Â`@‘Â7‘Â`@‘ -‘ÂÀ0‘ -‘Â7‘ -‘ -‘Âà3‘ :‘ -‘Â`'‘ -‘€*‘€*‘€*‘ÂÀ0‘Â7‘Â7‘€C‘Â`@‘Â`@‘ÂÀ0‘ÂÀ0‘Â@$‘ !‘‘ !‘ !‘‘ !‘ !‘ -‘ !‘ ‘ ‘ ‘‘Âà‘€*‘ -‘ÂÀ0‘ÂÀ0‘Âà3‘Âà3‘Âà3‘Â`'‘€*‘ !‘Â`'‘ !‘Âà3‘Âà3‘Âà3‘Â@$‘Â@$‘€*‘€*‘ -‘Â`'‘Â@$‘Â@$‘‘€*‘€*‘ !‘€*‘Â`'‘‘Â`'‘ -‘ -‘€*‘Â@$‘ !‘ !‘ !‘€*‘ !‘Â`'‘Â`'‘ !‘€*‘ !‘€*‘€*‘ÂÀ0‘€*‘Âà‘ ‘ ‘ÂÀ‘ÂÀ‘ ‘ ‘Âà‘Â`‘ ‘Âà‘ÂÀ‘‘ !‘ ‘‘Â@$‘€*‘Â@$‘ !‘Âà‘‘‘€*‘€*‘ -‘Â@$‘‘Âà‘Â`'‘€*‘Â@$‘€*‘ !‘ !‘‘ ‘ !‘ !‘Â@$‘Â`'‘Â@$‘ -‘Â`'‘Â`'‘‘Âà‘ ‘ !‘ÂÀ0‘Â`'‘ !‘ !‘Â`'‘ !‘Â@$‘ !‘€*‘Â`'‘ !‘‘Âà‘Âà‘ ‘ !‘Âà‘Âà‘Âà‘Âà‘ÂÀ‘ ‘€‘ ‘ ‘Âà‘ -‘Â`'‘Â`'‘ -‘ -‘€*‘Â`'‘Âà‘‘‘Âà‘ !‘Âà‘ !‘‘Âà‘ÂÀ‘ ‘ ‘Â`‘€‘ ‘Â`‘€‘Âà‘Â`'‘Âà3‘Â@$‘€*‘ !‘ !‘ !‘ !‘ ‘ ‘Âà‘ !‘Âà‘ ‘Âà‘‘ÂÀ‘ ‘ÂÀ‘Â`‘Â@ ‘€‘ ‘Âà‘Â`‘€‘€‘ ‘Âà‘€‘ÂÀ‘ !‘‘Âà‘ !‘ ‘Âà‘ÂÀ‘Âà‘ !‘ ‘ ‘Âà‘ ‘ ‘ ‘Âà‘Â`'‘ !‘‘‘‘‘Âà‘Âà‘ÂÀ‘ !‘Â@$‘€*‘ -‘Â@$‘Â`'‘ !‘ !‘Â`'‘‘ !‘Â@$‘€*‘ -‘Âà3‘€*‘ -‘ÂÀ0‘€*‘Â`'‘Â@$‘Â@$‘‘ !‘ !‘Â@$‘ ‘ ‘‘‘Â`'‘Â`'‘ -‘ -‘Âà3‘ :‘Â7‘Â`@‘ÂÀ0‘ !‘Â`‘ÂÀ‘‘Âà‘Â@$‘ !‘ÂÀ0‘Âà3‘Â7‘ :‘ÂÀ0‘ -‘€*‘Âà3‘Â7‘Â@=‘Â`@‘Â@=‘Â@=‘Â`@‘Â@=‘ -‘Âà3‘Âà3‘Âà3‘Âà3‘Â@=‘Â@=‘ÂÀ0‘ÂÀ0‘Âà3‘€C‘Â7‘Â7‘ -‘ -‘ :‘Â`@‘Âà3‘Âà3‘Â7‘Â@=‘€C‘Â`@‘Â`@‘ÂàL‘ÂàL‘ÂÀI‘€C‘ F‘ÂÀI‘ÂàL‘ÂP‘ F‘€C‘ÂÀI‘Â@V‘Â@V‘Â@V‘Â@V‘ÂP‘ÂP‘ÂàL‘ÂP‘ F‘€C‘ F‘€C‘Â@=‘Â@=‘ÂàL‘ S‘ÂP‘ÂàL‘Â@V‘ÂàL‘ S‘Â`Y‘Â@V‘Â`Y‘ S‘ S‘Â`Y‘€\‘€\‘ S‘€\‘Â@V‘ÂàL‘ÂàL‘ F‘ÂP‘ F‘ÂP‘ÂP‘Â`Y‘Â`Y‘ÂÀI‘ F‘ S‘ F‘ÂàL‘ F‘ÂÀI‘ S‘Âàe‘ÂÀb‘ÂÀb‘ÂÀb‘Âàe‘ _‘ S‘€\‘ S‘€\‘Â@V‘ÂàL‘ F‘ S‘ÂÀI‘ S‘ S‘Â`Y‘ _‘Âi‘ l‘ÂÀb‘ l‘Âàe‘Âi‘Â`Y‘Âi‘ _‘ÂÀb‘Âàe‘Â@V‘ÂÀb‘Âàe‘ l‘ _‘ _‘Â`Y‘ÂÀb‘Âàe‘ _‘ l‘ l‘Â`r‘Âi‘€u‘ x‘Â`r‘ x‘ l‘Âàe‘Â@o‘ l‘Âàe‘ÂÀb‘ÂÀb‘€\‘ÂP‘ÂP‘Â`Y‘ _‘ _‘Âàe‘Âi‘ÂÀb‘Âàe‘Â@o‘Â`r‘€u‘Âà~‘Âà~‘Â@o‘Â`r‘Â@o‘ x‘ÂÀ{‘ x‘ l‘ l‘Â@o‘Â@o‘Âàe‘Âi‘€u‘ÂÀ{‘ x‘ÂÀ{‘€u‘Âà~‘‚‘Â@ˆ‘Â`‹‘ ‘‘Âà—‘Â`‹‘‚‘ …‘Âà~‘ x‘Â@o‘€u‘Âà~‘ …‘ x‘Âà~‘ÂÀ{‘ …‘Âà~‘Âà~‘ x‘Â`r‘Â`r‘Â`r‘ x‘ x‘Â`r‘ l‘ l‘ l‘Â`r‘ l‘ l‘ l‘Â`r‘ x‘Âàe‘ x‘ÂÀ{‘ÂÀ{‘ x‘ x‘‚‘‚‘Âà~‘ x‘ …‘ x‘ …‘Âà~‘ x‘Â`r‘€u‘ l‘ l‘Â@o‘ x‘ l‘ _‘ l‘ x‘Âà~‘ x‘Â@o‘ l‘ l‘Â@o‘€u‘Â@o‘Âàe‘ _‘€\‘ _‘ _‘ÂÀb‘ _‘Âàe‘ _‘ÂÀb‘ÂÀb‘ÂÀb‘€\‘€\‘Âi‘ÂÀb‘ l‘Âi‘Âàe‘ l‘Â`r‘ l‘Âàe‘ l‘ l‘ _‘ _‘Âi‘Âàe‘ l‘ l‘ÂÀb‘ S‘ÂÀI‘ÂÀI‘Â`Y‘ÂÀb‘ÂÀb‘ÂàL‘ S‘ _‘Âàe‘€u‘ x‘ l‘€u‘Â`r‘Âi‘ÂÀb‘Âàe‘ÂÀb‘ÂP‘€\‘ S‘ÂP‘ÂÀI‘ÂàL‘ F‘€C‘ S‘ F‘ÂàL‘ÂàL‘ÂàL‘ÂàL‘ F‘ÂP‘ÂàL‘ F‘Â7‘Âà3‘Â@=‘Â`@‘Â@=‘ -‘ -‘Â7‘ :‘Âà3‘Âà3‘Âà3‘ÂÀ0‘€*‘€*‘Â`'‘Â@$‘Â@$‘Â`'‘Â@$‘‘ ‘Âà‘ ‘ÂÀ‘Âà‘Â`'‘‘€‘ !‘ !‘‘Âà‘ !‘Â`'‘Â`'‘Â`'‘ !‘€*‘ !‘Â@$‘ !‘ÂÀ‘‘Â@$‘ !‘‘ !‘ÂÀ‘Âà‘ÂÀ‘Âà‘ÂÀ‘‘ -‘ÂÀ0‘Â`'‘ !‘Âà‘ ‘€‘ !‘ !‘ÂÀ‘ ‘Â@ ‘Â`‘ ‘Âà‘Â@$‘ ‘Â@ ‘ÂÀ‘Â@ ‘€‘ ‘Â`‘Âà‘ !‘ ‘Âà‘‘ÂÀ‘ÂÀ‘Âà‘€‘€‘ ‘ ‘ ‘Âà‘ ‘‘Â@ ‘ ‘Âà‘ ûÂ@ò€øÂà‘€øÂ@òÂ`õ€øÂ€øÂàèÂ@ÙÂ`ÜÂ@ÙÂ@Ù€ßÂÀå ÖÂ@Ù€ßÂÓÂàÏ ÉÂÀÌ É ½Â`ÀÆÂà¶Âà¶ÂÀ³Â€­Â ¤Â ¤Â`ªÂ@§Â ¤Â@§Â`ªÂÀ³Â °Â ¤Â¡Â@§ÂàÂà ¤Â@§Â ¤Â ¤Â —Â@ŽÂàÂàÂà —Â@ŽÂ@ŽÂ@ŽÂ`‘ ‹Âà„ ‹Âà„Â@ŽÂ —ˆÂ`xÂoÂàkÂÀhÂ`xÂà„ ~ÂÀˆÂ@ŽÂ ~ ~ ~ÂÀ ‹Â ‹Â ~ ~ ~ ~Â`x€{ÂÀh YÂ@\ÂàRÂV eÂoÂ@\€b e e e€bÂVÂ`_Â`_Â`_€bÂàkÂÀh eÂàR L LÂàRÂàR YÂ@CÂVÂ`_ Y€IÂ`F @ @Â`FÂ`F @€I LÂV€IÂÀOÂV LÂàRÂàR L€IÂ`F @ @Â`F @ LÂÀO€I @Â`FÂà9ÂÀ6Â@CÂ`FÂ`F @€IÂàRÂàRÂàR L @Âà9Â`FÂ`F @Â= @ÂÀ6Â=Â`F€IÂ`FÂ`FÂ@C @ @ÂÀ6ÂÀ6 3 3Âà9Â=Â=ÂÀ6Âà9 3Â`- 3ÂÀ6 3Â`-Â`-Â`- 'Â@*Â@* 'Âà  'Â$Âà Â@*ÂÀ 'Âà Âà Â`€Â`Â`Â@* Â@   Âà   €Â` €Âà  '€0Â$ ' ' '   Â`Â`ÂàÂ@ÂàÂ@ ÂàÂà  €Â@€ € Â` €þÂà  Â@  ÂÀÂÀÂÀ Â`ûÂ`û€þÂ`ûÂàÂÀ  ÂòÂ@øÂ€þÂÀ€þ  ÂÀ€þ      €þ€þ ÂòÂ@øÂ`ûÂ`û õ€þÂò õÂ@øÂ`ûÂÀÂà Â@øÂ`ûÂ@øÂ èÂÀëÂ@ßÂ`âÂ`âÂ`âÂ@߀å ÜÂ@ߠܠܠ܀åÂàÕÂ`â Ü ÜÂàÕÂ@ÆÂ ÃÂ@ÆÂ ÏÂÙÂÙ ÜÂ`âÂ`âÂ`âÂ`â Ï Ã Ï ÃÂ`ɠπÌÂÀÒÂ@ßÂ٠ϠπÌÂàÕ Ü ÜÂÙÂàÕÂÀÒÂÀÒÂÙÂ@ßÂÀÒÂàÕÂÙ€åÂ@ßÂ@ßÂÙ€ÌÂÀÒÂ٠π̠̀ÏÂ`É ÏÂÙÂàÕ Ü Ü ÜÂÙÂÙÂàÕÂ`ÉÂÀ¹ÂÀ¹ÂÀ ÃÂà¼Â ÀÌÂ`É ÃÂÀÂ@ÆÂ€ÌÂàÕÂàÕ Ü ÜÂàÕÂàÕÂÙÂÙÂ`âÂ`âÂ@ß Ü ÜÂàÕ€ÌÂ`ɀ̠ÏÂàÕÂÙÂ`â ÜÂàÕ ÏÂàÕÂàÕÂ@ßÂàÕ ÏÂ@ÆÂ`ÉÂàÕ ÜÂÀÒ Ï ÜÂ`â èÂ`âÂ`âÂ@ߠ܀ÌÂÀÒÂ@ßÂ@߀åÂ`âÂÙÂÙÂ`â ÏÂ`ÉÂ@ÆÂ€ÌÂÀÒÂàÕ Ü ÜÂàÕÂàÕ ÏÂàÕÂàÕÂ`â ÜÂàÕ Ï Ü Ü ÜÂÀҠܠ܀å èÂàî õ õ õÂò è€å èÂÙÂ@ßÂ@ßÂ@ß ÜÂ`âÂ`âÂ@øÂàî è èÂÀë€åÂàî€þÂ`û€þÂÀÂÀÂ`û õÂ@øÂàîÂàîÂòÂàîÂàî õ€þÂÀÂ`ûÂ`ûÂÀ€þ   ÂÀ   ÂàÂÀÂà   Âà ÂÀ  ÂàÂÀÂÀ ÂÀ Â`ûÂ`ûÂò õ ÂàÂ`€Âà Âà Âà    Âà Â`Â`Â@€€Â@ Â@ Âà Âà Âà Âà Âà  €€ ÂÀÂà  €Â`Â`Âà €0ÂÀ6Â@* 'Â`-€0 'Âà  '€0 3Â@* 'Â`-Âà Âà Â$Â`-€0Â@* 'Â@*Â$Â@*Â`- 'Â`-Â@*Â@*Â`- 'Â@*€0Â`- 'Â$Â@* 'Âà9Âà9 3€0€0Â@CÂ`FÂ= @Âà9Âà9Âà9Âà9Â=Â= @Âà9Âà Âà ÂÀÂ@*Â@*Â`-€0 3Âà9 3Â`- 3Âà9ÂÀ6€0Â@* 3Âà9 3Â@*Â`-Â$Â`-Âà9Â`-ÂÀ6 3Âà9 @ 'Âà Â$€0 3Â`-Âà9Âà9 3Â$Âà9 3 3€0 3 'Âà Â`-Â`-€0 3€0 3 'Â`-Âà Â@* 'Âà Âà Â$ 'Âà  ' 'Âà Â`Â@ Âà  €þ €þ€þ€þ Âà€þ€þÂ`ûÂ@øÂ`ûÂàîÂ`û Â`û õÂ`û €þÂòÂ@øÂ@øÂ õÂ@øÂ@øÂ õÂòÂàî€þ  ÂÀ €þÂà€þÂÀ Â@øÂÀëÂàî õ õÂòÂÀëÂòÂ@øÂÀ õÂ@øÂòÂòÂàîÂ`û€þÂ`û  õÂÀëÂàî õ€þ€þÂ`ûÂÀë õ õ€þÂ`û€þÂàîÂÀëÂòÂàîÂÀëÂàî õÂ`ûÂ@øÂ`û €þ Â@øÂàî èÂòÂ@øÂàî õÂ`ûÂ`û€þÂ`û  Âà  ÂÀÂÀÂ@øÂ õ Âà Â@€ÂÀ Â`€€  Â@Â`Â`Â@  Â@Â`  Â`û Â@€€  Âà Â`- ' '€0 3€0Â@*Â$Â$Âà  Â`-€0Âà9Â@C @Â`F L L LÂV L @Âà9 @Â@C @ @Âà9 @Â=ÂÀ6ÂÀ6€0ÂÀ6ÂÀ6Âà9Â= 3€0€0Â`-Â@* 3Â= @Â= @ L LÂ@CÂ@C @Â@C€I @Â`F @ÂÀOÂàRÂVÂ`F LÂ`FÂÀO YÂVÂVÂ@\ÂàRÂàRÂàR YÂàR Y YÂ@\ YÂÀOÂàR YÂàR YÂ`_ Y YÂ@\ YÂ`_€bÂàk€{€{€{ ~Â@uÂ@uÂàkÂàkÂ`xÂo rÂàkÂàk e e€b Y€bÂàkÂàkÂ@uÂ`xÂ@u r rÂoÂ`xÂàkÂàk rÂ`x rÂo r rÂoÂ@u ~ÂÀÂ@uÂ@uÂÀÂ`x ~€{ rÂàkÂo eÂÀhÂàk e eÂÀhÂoÂàk eÂo rÂàkÂàk rÂ@u€{€{Âà„Âà„€{ ~€{ ~ r rÂàkÂ`_€bÂÀhÂÀh e e€bÂàkÂoÂàkÂ`x€{ r€b eÂoÂ@uÂ`xÂÀÂà„ ~€{Â@uÂÀÂ`xÂ`xÂ@uˆ ‹Â ‹ÂÀÂÀÂÀÂ@ŽÂˆÂà„ ‹Â`‘Âà„ÂÀ ‹ÂÀ€{ ~ ~Âà„ÂÀˆ —Âà€”Â`‘Â`‘Â@ŽÂ@ŽÂà ¤Â@§Â — —Âà€” —¡ ¤Â — —Â`‘ˆÂà„ˆÂÀÂ`‘¡ ¤Â`ªÂ@§Â`ªÂ`ªÂàÂà —¡Â`ªÂÀ³Â@§Â ¤Â`ªÂ@§Âà — ¤Â —ÂàÂà¡ —€” ‹Â ‹Â@ŽÂ€”€” —ÂÀšÂ¡Â¡Â °Â °Â€­Â °Â °ÂºÂÀ³Â °ÂÀ³Â °Â`ªÂ °Âà¶Â€­Â`ªÂÀ³ÂÀ³Â`ªÂ€­Â °Â °ÂÀ³ÂÀ³Â °ÂÀ³ÂÀ³Â °ÂÀ³Â °Â`ªÂ`ªÂ °Âà¶Â€­Â ¤Â`ªÂà¶Â °Â ½ÂºÂ@ÀÂà¶ÂºÂ ½Âà¶Â`ªÂÀ³Â`ÃÂàÏ ÉÂÓ€ÆÂ`à½Âà¶Â@À ½Â ½Â`ÃÂ`ÃÂàÏÂ`ÃÂ@ÀÂ`ÃÂ@Àº ÉÂÀÌÂÀÌÂàÏÂÀÌÂÀÌÂàÏÂ@Àº€ÆÂàÏ ÉÂ@ÀÂ`ÃÂÀÌÂÓ€ÆÂ É€ÆÂ É É ½ÂàÏ ÖÂ`Ü€ßÂ`Ü€ßÂ@ÙÂàÏÂ@ÀÂ@ÀÂÓÂàÏÂÓÂÀÌ ÖÂ@ÙÂàÏ ÖÂ`Ü ÖÂàϠր߀ßÂàÏÂÀÌ É Ö ÖÂ`ܠրߠâÂàÏÂ`Ü ÖÂàÏÂ`Ü ÖÂ`ÜÂàèÂàèÂìÂ@òÂ@òÂàè Ö âÂ`ÜÂ`܀ߠâÂì€ßÂ`Ü ÖÂ`ÜÂ`ÜÂÓÂ@Ù€ßÂ`܀߀ßÂàèÂì âÂàèÂìÂàèÂìÂàè ïÂàèÂàèÂÀå€ß âÂÀåÂÀåÂÀå ï ïÂ`Ü â â€ßÂàè âÂìÂÀåÂ`ÜÂ`Ü ÖÂӀߠâÂ`ÜÂ`Ü ïÂìÂàè â âÂ@Ù Ö ÖÂ@Ù ÖÂ@Ù€ßÂàè â ÖÂ`Ü âÂàèÂàèÂàè â âÂìÂÀåÂàèÂÀåÂÀåÂàè€ß â âÂ@Ù€ßÂÓ Ö â ÖÂ@ÙÂӠɀÆÂ`ÃÂ`ÃÂàÏ Ö Ö ÉÂàÏ Ö Ö ÖÂàÏ É ÖÂàÏ Ö ÖÂÓÂàÏÂàÏÂàÏÂÀÌ€ÆÂ`ÀÆÂÀÌ ÉÂÀÌÂÀÌÂ`ÀÆÂ`ÃÂ@Ù€ßÂÓ€ÆÂ@ÀÂÀÌ ½Â É É ÉÂ@À ÉÂàÏÂàÏÂÓ ÖÂ`܀߀ßÂÀå€ß€ßÂ@ـߠ֠ɠÖÂÀÌ ÉÂàÏÂÓÂÀÌ Ö ÖÂ`Ü€ßÂàÏ€ÆÂàÏÂ@ÙÂàÏ É ½Â€ÆÂ ½Â@ÀÂ@À€ÆÂ€ÆÂ É ÉÂÀÌÂàÏÂàÏÂàÏÂ@Ù ÉÂÀÌ ÖÂàÏ ÖÂÓ ÉÂ`àɀÆÂ â Ö Ö Ö€ß€ßÂàÏÂÓ Ö€ÆÂ ÉÂàÏ ÉÂàÏ€ÆÂàÏÂÓÂÀÌÂ`ÀÆÂ€ÆÂ€ÆÂàÏ ÖÂÀÌÂ`ÃÂà¶Âà¶Â °Âà¶ÂºÂ`ÀÆÂàÏÂÓ ÖÂÓ€ÆÂ`à½Â@À ½Â€ÆÂºÂ`àɠɠÖÂàÏ ÉÂàÏ ÉÂ`ÃÂ@À€ÆÂ`ÀÆÂ€ÆÂ É€ÆÂ É É€ÆÂ€ÆÂ ½Â ÉÂàÏÂàϠɠ֠ɠɀÆÂ ½Â`ÀÆÂ ÉÂ`ÃÂ`ÃÂàÏ ÖÂ@ÙÂàÏÂàÏÂàÏ É ÉÂàÏÂÀÌÂ@ـߠÖÂÓÂàÏÂàÏÂàϠɀÆÂàÏÂàÏ€ÆÂàÏÂàÏÂÀÌÂàÏÂàÏÂ`ÜÂàÏ€ÆÂ ÉÂàϠɠɀÆÂàÏÂÀÌ ÖÂÓ ÉÂÀ̠ɠɀÆÂ É ½Âà¶Â€ÆÂ@ÀÂÀÌ ÖÂ@ÙÂ`ÜÂàÏ€ßÂ@ÙÂàÏÂàÏÂ`Ü€ßÂ@ÙÂ`Ü â ÖÂÓ ÉÂàÏÂàÏ Ö Ö É Ö Ö â Ö€ßÂÀåÂàè ï ï ïÂàèÂ`ÜÂ@ـߠïÂ@ò ïÂ`õ âÂ@ÙÂàÏÂÓ Ö€ßÂ@ÙÂ`Ü ¨(dt ?@4 4ÿxunitsyunits@ºh² (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ! (ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec0 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitsлð½TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿx¿HEAPX ¾datadescription8  @œÀÀq·—NM€SNODh¾À1Àå âÂ`ÜÂ`܀ߠâÂÀåÂ`ÜÂ@Ù€ßÂàèÂìÂàèÂàèÂÀå â ïÂìÂ`ÜÂì û€øÂ ûÂà‘‘‘ ûÂìÂàè â âÂ`ÜÂÀåÂ@òÂ@ò ïÂàè ïÂ@òÂàèÂàèÂÀå âÂàèÂ`õÂ@òÂ@ò ïÂ`õÂÀþÂÀþÂÀþ€øÂ ûÂÀþ ‘ ‘ÂÀþÂà‘Âà‘Â`õ û û û ûÂÀþ ‘ ‘‘ÂÀþÂà‘ ‘ÂÀþ û€øÂ ‘‘‘€‘€‘Âà‘ÂÀ‘‘ !‘‘Âà‘ ‘ ‘Âà‘Â`'‘‘ ‘ÂÀ‘Âà‘Â`'‘Â`'‘ -‘ÂÀ0‘€*‘ -‘ÂÀ0‘ -‘€*‘ !‘€*‘ !‘‘ÂÀ‘Â@$‘€*‘Â`'‘ -‘ -‘Âà3‘ :‘€C‘Â`@‘Â7‘Âà3‘Â7‘Âà3‘Âà3‘Â7‘€C‘ :‘Â@=‘Â7‘ -‘ -‘ :‘ -‘€*‘ÂÀ0‘ -‘ -‘€*‘ -‘ÂÀ0‘Â`@‘Â`@‘Â`@‘Â`@‘ :‘€C‘Â@=‘Âà3‘ :‘Âà3‘ :‘ :‘€C‘ :‘ÂÀ0‘Âà3‘ÂÀ0‘ÂÀ0‘ÂÀ0‘ÂÀ0‘€*‘Â`'‘ -‘ÂÀ0‘Â`@‘€C‘€C‘ :‘Âà3‘ !‘ !‘Â`'‘€*‘Â`'‘ !‘Â@$‘ -‘ !‘Â`'‘ -‘ :‘ F‘Â`@‘Â@=‘Â`@‘€C‘€C‘Â7‘ -‘€*‘Â`'‘Âà3‘Âà3‘Âà3‘€*‘ !‘Â`'‘Â`@‘Â@=‘ÂÀ0‘ÂÀ0‘ÂÀ0‘ -‘ -‘ -‘Â`'‘ -‘ :‘ :‘Âà3‘Âà3‘ !‘ -‘€C‘ F‘€C‘ :‘ÂÀ0‘Âà3‘Â@=‘€C‘ F‘ÂàL‘€C‘ F‘€C‘ :‘Â@=‘Â`@‘€C‘ÂÀI‘ÂÀI‘€C‘ÂàL‘ÂàL‘€\‘Â`Y‘ÂÀI‘ÂàL‘ F‘Â7‘Â@=‘ :‘ÂÀ0‘ :‘Â`@‘ÂÀI‘€C‘Â@=‘€C‘ F‘ S‘€C‘ F‘ S‘ÂàL‘€C‘ F‘ :‘Â@=‘ :‘Âà3‘ -‘€*‘€*‘ -‘ÂÀ0‘Â`@‘ :‘Â7‘ÂÀ0‘ -‘ -‘ -‘ :‘ F‘Â`@‘ F‘€C‘ :‘Â`@‘ :‘ :‘Â7‘ :‘€C‘ÂÀI‘ F‘ F‘ F‘€C‘ :‘ÂÀ0‘€C‘Â@=‘Â@=‘Â7‘Â`'‘ ‘Â@ ‘Âà‘Âà‘Âà‘Âà‘Â`‘ û ï ïÂ`õÂ`õ ûÂ`õÂàèÂàèÂ`܀߀ßÂÓ ÖÂàÏÂ@ÙÂàÏ É ÖÂÀÌÂàÏ€ÆÂ ÉÂ`à½Â ÉÂàÏÂàÏ ½ÂÀÌ ½Â€ÆÂ`ÀÆÂàÏÂàÏÂàÏÂ`ÀÆÂ@À ½Â€ÆÂ ½ÂºÂ`ÃÂ`àɀÆÂ`àɀÆÂ@ÀºÂà¶Â€­Â`ªÂ ¤ÂàÂàÂ`ªÂ€­Â@§Â¡Â€”¡ ¤Â¡Â ¤Â€­Â`ªÂ¡Â`ªÂ@§Â ¤Â¡Â ¤Â`ªÂ °Â °Â °Â`ªÂ€­ÂÀ³Â °Â ¤Âà ¤ÂàÂà —Âà — — —€”Âà —Â@ŽÂ ‹Â ‹ÂÀšÂÀšÂ@§Â¡Â ¤Â`ªÂ ¤Â °Â ¤Â —€”€”€”Â`‘ —Â`‘Âà„€”€”Â`‘Â@ŽÂ — —Â`‘€”€”€” —Â@§Â ¤ÂàÂÀšÂÀšÂࠤ¡ —Â`‘ ‹Â€”ˆ ‹Â ‹ÂÀˆÂ`‘Â`‘ —€”Â@ŽÂà„ ‹Â ‹Â@ŽÂ@ŽÂ ‹Â@ŽÂ ‹Â€”Â`‘ —€”Â@ŽÂà„ˆ ‹Âà„ ‹Âà„ ~ÂÀ ~ ~ˆÂ`‘ ‹Â€”Â`‘€” —Â@ŽÂ€”ÂÀšÂ —ÂÀšÂà —Âࠤ€”Â`‘€”ˆÂ`xÂà„ÂÀÂÀÂà„ÂÀ ‹Â —Âà€”€” — ‹Â`‘ ‹Âà„ÂÀˆÂ@ŽÂÀ ‹Â ‹Â —ÂàÂàÂÀšÂà —ÂÀšÂ ‹Â€{Â`xÂÀˆÂÀ€{Âà„ˆ ‹ÂÀ ~Â`x ~Âà„ ~€{ˆ ‹Â ‹Â@ŽÂ`‘ —€”€” ‹Âà„Â`‘Â@ŽÂ — ¤Âà —¡Âà€”Âà„Âà„Âà„ˆˆ ~ÂÀÂÀ ‹Â@ŽÂ`‘ ‹Â ~€{€{Â`xÂ`x rÂo rÂÀÂà„ˆÂà„ÂÀÂà„€{ ~ ~€{ ~ ~€{Â`xÂà„ ‹Â ‹Âà„ rÂ`x rÂ@u eÂo rÂÀÂ@ŽÂˆÂ@ŽÂà„Âà„Âà„ ‹Â ‹Â ~Â`x€{Â@uÂoÂ`xÂo rÂ@uÂ`xÂ`xÂ@uÂ`xÂoÂàkÂàkÂ`x ~Â@uÂÀhÂ`x rÂ@u€{ rÂ@u€{ ~ ~Â`x€{€{ ~ ~Â@ŽÂà„Âà„Âà„ˆ€”Â@ŽÂˆÂˆÂ`xÂ`xÂ`x€{ ~€{ ~Âà„ÂÀÂÀ ~Â`x€{Âàk€bÂÀhÂoÂàkÂ@u ~ ~ ~ ~Â@uÂ`x€{Â`x rÂ`xÂ`xÂàkÂÀhÂàk€{ÂoÂàk r€{Â`‘€”€”Â`‘ ‹Â ~Âàk rÂàkÂoÂà„Â@ŽÂ@ŽÂˆÂˆÂÀÂÀÂà„ˆÂÀ ~Âà„ ~€{ˆÂ@ŽÂ`‘€”Â`‘ ‹Â`‘Â`‘Â`‘Âà„ ~ÂÀ ‹Â ‹Â@ŽÂà„ÂÀ ‹Â ~Â`x€{ÂoˆˆÂà„ˆˆÂà„Âà„ˆÂ`‘Â`‘Âà„Â@ŽÂà„Â@ŽÂ@ŽÂ ‹Â ‹Âà„ ‹ÂˆÂ ‹Â ‹ÂÀ ~ÂÀÂà„ ~ ‹Â ‹Â ‹ÂˆÂ@ŽÂà„ ‹Âà —Âà€” ‹Â`‘ ‹Â@ŽÂÀˆ€{ ~ ‹Â ‹ÂˆÂà„Âà„ ~Â`xÂ@u ~ÂÀ ‹ÂÀšÂÀšÂà€”Â`‘€”ÂÀšÂ@ŽÂ€”ÂàÂà — — ‹Â ‹Â€”ÂàÂà —Â@ŽÂ`‘¡Âà¡Âà¡Â`ªÂÀšÂ ¤Â`ªÂ€­Â@§Â¡Â¡Âࠤ¡ ¤Â@§Â ¤Â ‹Â€” — ¤Â ¤Â€­Â °Â ½Â ½ÂºÂà¶ÂÀ³ÂÀ³Âà¶Â °Â °ÂºÂ ½Â ½Â`ÃÂ`ÃÂ@Àº °Â ¤Â`ªÂ`ªÂ`ªÂ€­Â °Â °Â`ªÂ ¤Â`ªÂÀ³Â@À€ÆÂ ÉÂ`à½Â@ÀÂàÏ ÉÂ`ÃÂ@À ½Â€ÆÂ`à½ÂºÂºÂºÂ ½Â@ÀÂ@ÀÂ@À€ÆÂ ÉÂÓ ÉÂ@À É °Â ½Â ½Â ½Â °Â`ªÂ€­Â€­Â °Âà¶Âà¶Â@ÀÂÀÌÂàÏÂàÏÂàÏ Ö Ö Ö€ÆÂà¶Â@ÀºÂ`ÀÆÂ ÉÂÓ Ö É Ö Ö ÖÂ`ÜÂ`ÜÂ`܀߀ߠâÂ`ÜÂӠր߀ߠâ âÂ@ÙÂàÏÂàϠրߠ֠֠â âÂ`ÜÂ@Ù âÂÀåÂ`ÜÂ`ÜÂàÏÂÓ Ö Ö Ö Ö€ßÂ`ÜÂÀå â â€ß ÖÂ`ÜÂÀåÂì ÖÂ`Ü€ßÂÓÂ@ـߠâ â âÂ`Ü€ßÂàè ïÂìÂàè ïÂì ï â âÂàèÂàè ï ïÂàè â âÂ@òÂÀåÂ`ÜÂ`õ ïÂàèÂàèÂ@ò ûÂ`õÂìÂì ïÂ`õ û€øÂ@ò ïÂì â€ß âÂàèÂàèÂÀå â âÂìÂ`õ€øÂ@ò ï€øÂ€øÂ`õ ï ûÂàè€ßÂ@ÙÂìÂ@òÂ`õÂ`õ û€øÂ û€øÂ@ò€øÂ`õ ûÂ`õÂìÂ`Ü âÂàè ïÂÀå ïÂÀå û û ûÂ@òÂ@òÂ@ò û û ‘‘Âà‘Âà‘ ‘Âà‘€øÂ ïÂì ï€øÂ ï ïÂàèÂ`õÂ@òÂÀå âÂÀå ïÂ@ò ïÂ`õ€øÂ@òÂìÂÀå ïÂ`õÂ`õ ûÂ@òÂ`õ ûÂà‘ ûÂà‘Âà‘Âà‘ ï ï û û ïÂ`õÂ@ò€øÂ`õÂ`õ û€øÂà‘Âà‘‘ û û€øÂ€øÂ@ò û ûÂ`õ€øÂ€øÂ@òÂ`õÂ`õ€øÂ ûÂ`õ ï€ßÂàè ï ï ïÂÀþÂà‘ û û û€øÂ€øÂ€øÂ ïÂàèÂì ï â âÂÀåÂÀå â âÂìÂàè ïÂÀþ ‘ ûÂà‘Âà‘ û û ûÂ`õ û€øÂ ïÂ`õ ûÂÀþÂà‘ û ûÂ@ò âÂàèÂàè ï€øÂ€øÂ`õÂì ï ï€øÂ@ò ïÂÀþÂà‘ÂÀþ ûÂ@ò ïÂàè âÂÀåÂìÂì â âÂ@Ù ÖÂàÏ€ÆÂ Ö âÂàèÂÀåÂ`ÜÂ`ÜÂ@Ù ÖÂÓ€ßÂ`Ü Ö â€ßÂàÏÂàÏÂÓ ÖÂÓ ÖÂàè â â€ßÂ`Ü ÖÂ@Ù â€ß€ßÂàÏ ÉÂÀÌ€ÆÂÓÂàÏÂàÏÂ`à½Â`ÃÂ`àɀÆÂàÏÂàÏÂÀÌÂàÏ ÉÂÀÌ ÉÂ@ÀÂà¶Â€ÆÂ ½Â€ÆÂ€ÆÂ ÉÂàÏÂàÏÂӀߠÖÂÓ€ÆÂ É ÉÂàÏÂÀÌ ÉÂÀÌ€ÆÂ ÉÂ`àÉÂàÏÂ`Ü â âÂàèÂàèÂ`Ü âÂ@ÙÂ`Ü ÖÂ`ÜÂ`ÜÂ@ÙÂӀߠâÂ`Ü€ßÂ`Ü ÖÂàÏÂ`Ü â â ÖÂàÏ€ÆÂ`àɀÆÂ րߠâ â Ö ÖÂ`ÜÂ`ÜÂ`Ü ÖÂ`Ü Ö â ï ïÂ`õ â âÂ`Ü ÖÂ@ÙÂ`ÜÂӀߠâ â Ö ÉÂÓÂ`Ü â€ßÂ`Ü€ßÂì â ïÂÀå â â âÂàè âÂàèÂ@ò â€ßÂ`ÜÂ@ÙÂ`Ü â€ßÂÀåÂàè ïÂìÂì âÂÀåÂàÏ ÖÂÀ̠ɠրߠâ â â ÖÂ@ÙÂ`ÜÂ@ÙÂàèÂàèÂàèÂÀå â ïÂàèÂàèÂìÂì ï€øÂ@òÂàèÂÀåÂàè ïÂàèÂàè€ßÂàèÂàè âÂ@ÙÂ`Ü â€ß€ß ÉÂàÏ ÖÂàÏÂÓ ÖÂ@ÙÂàè â€ß ÖÂàèÂìÂàè ï ïÂàèÂìÂ@òÂìÂÀåÂì âÂì â€ßÂàèÂàèÂìÂ`Ü ÖÂ@Ù ÖÂàÏ Ö ÖÂÓÂ`܀ߠâ€ßÂ@ÙÂ@ÙÂ`Ü ÖÂ@ÙÂÓ€ßÂ`ÜÂàÏÂ`Ü ÖÂ@ÙÂ@ÙÂ`Ü âÂÀåÂàè€ßÂ@ÙÂ`Ü Ö ÖÂ`ÜÂàÏÂ`àÉÂàÏ ÖÂàÏ€ßÂÀå Ö€ßÂàÏ ÖÂÓÂàÏ ÉÂàÏÂàÏÂ`à½Â`ÀÆÂ ÖÂÓ Ö ÖÂÓÂÀÌ É ÖÂ@ÙÂàÏÂ`ÀÆÂ ÉÂàÏ É É Ö Ö€ÆÂ É ½Â`à֠ÉÂÀÌ ÖÂ`Ü ÖÂÓÂàÏÂÓÂàÏ Ö Ö É ½Â ½Â ½ÂºÂ ½ÂÀ³Â ½Â`à½ÂºÂà¶Â °ÂºÂºÂ@À€ÆÂºÂ É ÉÂ`ÃÂ@ÀÂ@À€ÆÂ€ÆÂ ÉÂàÏÂ`Ü€ßÂ`ÜÂ`ÜÂÓÂàÏ ÖÂàÏÂ`ÜÂ@Ù Ö Ö€ßÂ@ÙÂàÏ â â â â€ßÂìÂ`ÜÂÓ ÉÂÓ Ö ÉÂÓÂÓÂàÏ ÖÂàÏ ÉÂÀÌÂÀÌÂàÏ ÖÂ`ÃÂàÏ ÉÂÓÂàÏÂàÏÂàÏÂÓÂÓÂ`ÜÂÓ É ÉÂàÏ ÖÂÀå ÖÂ@Ù Ö€ÆÂàÏ ÖÂÀÌ€ÆÂàÏ ÖÂàÏÂàÏ Ö âÂàè û û ûÂ@ò â€ß€ß âÂàè ïÂàèÂìÂàè€ßÂ`Ü ÖÂ@ÙÂ@Ù€ßÂ`ÜÂÓ É É ÉÂàÏÂàÏÂàÏ âÂÀåÂàèÂ`ÜÂ`Ü âÂ`ÜÂ`ÃÂÓÂ@Ù Ö Ö ÖÂ`Ü âÂÀåÂ`ÜÂàÏÂÓÂÀ̠ɠɀÆÂ€ÆÂ É ÉÂÀÌ ÉÂÀÌ€ÆÂ€ÆÂÀÌ€ßÂÀåÂàèÂ@٠֠րߠâÂàè€ß€ß âÂÀåÂàè â ï û ‘ ‘Âà‘ ûÂÀþ û ‘ ûÂà‘Âà‘ ûÂà‘Â`õ û ûÂ@òÂÀþÂÀþ ‘€øÂ@òÂìÂ`õ ûÂ@òÂàè€ß€ßÂ@ÙÂàè€ß ïÂÀþÂà‘ û€øÂ€øÂà‘ ‘Â@ ‘€‘€‘Â`‘€‘Â@ ‘Â@ ‘Â@ ‘Âà‘Âà‘€øÂ`õÂ`õ û‘Âà‘ ûÂÀþÂ`‘ ‘ ‘ ‘ÂÀþ ûÂ@ò ïÂ@òÂà‘€øÂ ïÂì€øÂà‘‘Â@ ‘ ‘ ûÂ`õ ûÂÀþ û ïÂ@ò ïÂ@ò û€øÂ û ûÂà‘ ‘Â@ ‘ ‘ÂÀ‘Â`‘‘ û‘ û û€øÂ ûÂÀþ ûÂÀþÂ@ ‘ ‘‘Âà‘‘ û€øÂÀþ ûÂ`õÂ@ò ï ïÂìÂàè â ï ï€øÂ ïÂ`õ âÂÀåÂàè â€ßÂàè ïÂìÂ@ò û ûÂ`õÂ`õÂÀþÂ`õÂ`õ û ï ïÂàèÂ@ÙÂÀå âÂì ï ïÂìÂì ïÂàèÂ`õÂ`õÂì â â âÂ`ÜÂ`ÜÂÓ ÖÂÀå ï ï€øÂ ïÂàè€ßÂ@٠֠րߠâ€ßÂ`ÜÂ`Ü ÖÂ`Ü ÖÂÓÂÀÌÂÓÂÓ ÖÂÀÌÂÀÌÂ`àÖÂÓÂÓ ÉÂàÏ É Ö Ö ÖÂ@ÙÂ`Ü€ßÂàÏÂÓÂàÏÂàÏÂÀÌÂ@ÀÂ@À É ÉÂ`úÂà¶ÂºÂÀ³Â@À€ÆÂ ½Â`àÉÂÀ̠ɠɀÆÂ ½Â@À ½ÂºÂºÂ ½Â ½Â ½Â ½Â`à½ÂºÂ ½Â@ÀºÂ`ªÂ °ÂÀ³Â€­Â °Â€­Â¡Â`ªÂÀ³ÂÀ³Â`ªÂ€­Â`ªÂÀ³Â ½Â ½Â@À ½Â ½ÂÀ³Â ½Âà¶Âà¶Â °Â ½Â ½ÂÀ³ÂºÂà¶Âà¶ÂºÂ °Âà¶ÂºÂ ½Â@À€ÆÂ ½Âà¶ÂÀ³Â ½ÂºÂ °Â€­Â °Â`ªÂÀ³ÂÀ³ÂºÂºÂ ÉÂ@ÀÂ`ÃÂÀ³Âà¶Âà¶ÂºÂ ½Âà¶ÂÀ³ÂÀ³ÂºÂºÂ °Âà¶Â`ÃÂ`à½Â ½Â`ÃÂà¶Â ½Â`à½Â@À °Â`ÃÂ`ÃÂ`ÀÆÂ`à½Â °ÂºÂ€ÆÂ É€ÆÂ ÉÂ`àɀÆÂ ½Â ½ÂÓ ÖÂàÏ ÉÂ`ÃÂ`àÉÂ`ÃÂ@ÀººÂà¶Â`ÃÂ`ÀÆÂ@ÀÂ`ÀÆÂ ÖÂÀÌÂÓÂÀÌÂàÏ ÉÂàϠɀÆÂ€ÆÂ`ÃÂ`ÃÂàÏ Ö É ÖÂ`ÜÂàÏ É ÖÂÀÌÂ`ÃÂ`ÃÂàÏ Ö âÂì€ßÂ@ÙÂÀÌ É ½Â`ÃÂ@À€ÆÂ É ÉÂÓ ÖÂ@ÀÂàÏÂàÏ ÉÂ`ÃÂàÏÂàÏÂàÏ€ÆÂ É ÉÂàÏÂàÏ É Ö€ßÂàèÂ`ÜÂàÏÂÓÂ`Ü€ÆÂºÂ ½Â ÉÂ`ÀÆÂ`àÖÂàÏÂàÏÂӀߠâ â â€ß€ßÂàèÂàè âÂÀåÂÀå Ö ÖÂ@ÙÂ`܀߀ߠâ Ö€ß âÂ`Ü ï€ßÂìÂ`ÜÂàèÂàèÂì ï€ßÂÀå âÂàèÂìÂàèÂìÂ@ò ûÂ`õÂàè â âÂàÏÂÓÂ`ÜÂ`Ü Ö ÖÂ@Ù€ßÂàèÂàèÂÀå€ß€ßÂÀå ï Ö Ö ÖÂ@ÙÂàèÂ`õ ï ïÂàèÂÀå€ß âÂìÂì â âÂìÂìÂÀåÂì€ßÂ`Ü âÂàè ïÂÀå âÂÀåÂÀåÂÀåÂàèÂàè ïÂ`õ û€øÂ ïÂÀå ïÂ`õÂ`õÂ`õ ï ï€øÂ@òÂàèÂ`ÜÂ`Ü â â ÖÂÀåÂàè ï ï ïÂ`õ ïÂÀåÂÀå â â â â€ßÂ@ـ߀߀ߠâÂÀåÂàè âÂ@Ù Ö Ö âÂ@Ù Ö Ö ÖÂàÏ ÖÂì ïÂàè ï ï ï âÂ`Ü Ö Ö Ö Ö â ÖÂÓÂàÏ ÉÂàÏÂ@Ù âÂì â âÂàèÂàè âÂ`ÜÂàÏÂ@ـߠâÂì ïÂì âÂ@ÙÂ@ÙÂÀå€ßÂÓ ÖÂÓÂàÏÂ`ÜÂÀåÂàè â€ßÂ@ÙÂ@ÙÂ`ÜÂ`ÜÂ`ÜÂàèÂì ï ïÂ`õ ûÂà‘ û ûÂì âÂÀåÂì âÂÀåÂ`õÂ`õ ïÂ`õ ïÂÀå ï ï ïÂ`õÂìÂì ïÂìÂ@òÂ@òÂ@òÂ@òÂìÂàè â â€ß âÂàèÂìÂ`õÂà‘Â@ ‘ÂÀþ ‘‘Âà‘‘ ‘Âà‘Â`õ ûÂ@ò û û ï ï€øÂ ï âÂàèÂàè ï€øÂ ïÂàè âÂÀåÂÀåÂì â âÂàèÂìÂìÂàè€ß€ß€ß€ß€ß âÂÀå€ßÂàè€ß€ßÂàèÂìÂÀåÂ`ÜÂÀå âÂàÏ É ÉÂ`ÜÂàè€ßÂÓ ÉÂàÏÂ`Ü â€ßÂÀåÂì€øÂ û ïÂàèÂìÂàèÂìÂàèÂàè€ßÂàè âÂ@ÙÂÓÂàÏÂÓÂàÏÂàÏÂàÏÂÓÂàπߠâÂ`܀ߠâ ÖÂàÏÂ@ÙÂàÏ É ÉÂÓÂ@Ù Ö ÖÂ@ÙÂÓÂàÏ É ÉÂ`ÃÂ`ÃÂàÏÂÀÌÂӠɀÆÂ ÖÂÀÌÂÀÌ É ÉÂàÏÂÓ ÖÂ`Ü ÖÂàÏÂÓÂàÏ ÖÂ@ÙÂ`ÜÂàÏÂÀÌÂ`ÃÂàÏÂàÏ ÖÂàÏÂàÏ ÉÂÀÌÂ`àÉÂÓÂÓ ÉÂàÏ É Ö€ßÂ@ÙÂÓÂÓÂàÏ ÉÂàÏÂ@ÙÂ`Ü€ßÂ`Ü Ö ÉÂÓ ÖÂ@ÙÂ@ÙÂÀÌÂ@ÙÂӠրߠÖÂàÏ ÉÂàÏÂàÏÂàÏ ÉÂ`ÃÂ`àÉÂ`ÃÂàÏÂàÏ ÖÂ`ÜÂÓ Ö€ÆÂ Éº ÉÂ`ÃÂàÏÂÀÌÂàÏÂ`ÃÂàÏ ÖÂàÏÂ@Ù Ö€ÆÂ ÉÂàÏÂàÏÂÀÌÂ@ÀÂ`ÃÂ@ÀÂ@ÀÂ`ÀÆÂ ½Â@À€ÆÂ`ÃÂ@ÀÂàÏÂÀÌ ½Â€ÆÂ`àÉÂ`à½Â`ÀÆÂ É ÉÂÀÌÂàÏÂÀÌ€ÆÂ ÉÂÀÌ€ÆÂÀÌÂÓÂàÏÂàÏÂÀÌÂ@À ½Â@À ÉÂ`à½Â ½ÂºÂàÏÂàÏ É ÉÂ`àÉÂ@À ½Â€­Â °Â ½Â`à½Â ÉÂ`ÀÆÂ ÉÂÀÌÂ`àÉÂ`ÃÂ@ÀÂ`àÉÂÀÌÂ@ÀÂàÏÂàÏÂàÏ ½Â ½ÂºÂÀ³Â€­ÂÀ³ÂÀ³Â`ªÂà¶Â@ÀÂ`ÀÆÂÀÌ€ÆÂ É É É ÖÂàÏÂàÏÂ@ÙÂàÏÂàÏÂÓÂÀÌÂ`ÃÂ`ÃÂÀ̠ɀÆÂ ÉÂàϠɺºÂ`à½Â ½ÂÀ³ÂºÂ ½Â€ÆÂà¶ÂÀ³Âà¶ÂÀ³Â °ÂºÂ ÉÂ@Ù û ï âÂ`Ü ÖÂàÏÂÓ Ö Ö ÖÂÀÌÂàÏÂàÏÂàÏ ÖÂÓ ÖÂÀÌ ÉÂ`àÉÂÀÌÂàÏÂÀÌ Ö ÉÂÓ ÉÂÓÂÀ̠ɀÆÂ€ÆÂàÏÂàÏ É ½Â ½Â@À€ÆÂ€ÆÂ`ÀÆÂ@ÀÂ@ÀÂ`ÃÂÀÌÂÀÌ Ö ÉÂ`à½Â`àÉÂàÏ É ½Â ½Â ÉÂàÏÂÓÂÀÌÂÀÌ€ÆÂ É€ÆÂ`ÃÂ`àÉÂ`ÜÂÀÌÂ@À É É ÖÂÓÂÓ ÖÂ`ÜÂ`ÜÂ`Ü âÂÀåÂÀå€ßÂÓÂàÏÂàÏÂÓÂàÏÂÀÌÂàÏÂ`Ü â€ßÂ@Ù ÉÂ`ÜÂ`ÜÂ`Ü€ßÂìÂàèÂàè€ß€ß âÂ@ـ߀ßÂ@ÙÂ`Ü âÂàèÂ`ܠɠɀߠâÂ`ÜÂ`Ü€ßÂ@òÂ`õÂ`õ ï ïÂàè ï ïÂ@ò ï ï€øÂ ïÂ@òÂ@òÂàèÂàè ïÂ@òÂàè ïÂÀåÂìÂàèÂàè ïÂ`õÂÀþÂ`õ€øÂ€øÂ@òÂÀåÂÀåÂÀåÂì û ïÂ`õÂ@ò ïÂ`Ü€ßÂàèÂÀå€ß âÂàèÂì€øÂÀåÂìÂ`õÂìÂàè ïÂ`õÂ@ò ï ïÂìÂ@òÂàèÂàèÂÀå ïÂ@ò ïÂ`õÂ@ò ïÂàè ïÂ`õ ïÂÀåÂÀåÂàèÂ@ò€øÂàè ïÂàèÂàè âÂ@ò€øÂ ûÂ`õ ï ï ïÂÀåÂì ïÂ`õ€øÂÀþÂ`õ ûÂìÂ`ÜÂ`Ü â€ß â€ßÂàèÂìÂàèÂìÂ`õ€øÂ€øÂÀþÂÀþ û ûÂà‘ ûÂ`õ û€øÂ û û û ûÂà‘Âà‘‘Â`‘€‘ ‘‘ÂÀ‘ÂÀ‘‘€‘Â`‘Â`‘ ‘€‘ ‘€‘Âà‘€‘ ‘ÂÀ‘€‘Â`‘ ‘ ‘ !‘Âà‘€‘ ‘€‘€‘€‘Âà‘Â`'‘ !‘Âà‘Âà‘ÂÀ‘Â`‘ ‘Â@ ‘Â`‘ÂÀ‘ ‘€‘ÂÀ‘ ‘€‘Âà‘‘Â@$‘‘ ‘ ‘Âà‘ ‘Â`‘Â`‘Â`‘€‘Â`'‘Âà‘ ‘‘Âà‘ ‘Â@ ‘Â@ ‘ ‘‘ ‘Âà‘‘ÂÀ‘Â@ ‘Â`‘Â`‘ÂÀ‘ ‘ ‘ ‘Â`‘€‘ ‘Â`‘ ‘ÂÀ‘Âà‘Âà‘ !‘ !‘€*‘Â`'‘€*‘Âà‘Âà‘€‘Â`‘Â`‘‘ ‘ÂÀþ‘ ‘ÂÀþ€øÂ€øÂ ïÂàè€ßÂàèÂàèÂÀåÂàè â â âÂàÏÂàÏÂÓ Ö€ÆÂ€ÆÂ€ÆÂ ÉÂ@ÙÂ@ÙÂàÏÂ@ÙÂ`Ü€ßÂÓÂ@Ù ÉÂàÏÂ@ÙÂàÏÂӠɺ€ÆÂ`àÉÂ`ÀÆÂ ½ÂºÂºÂ`à½Â`ÃÂ`ÃÂ`à½Â °Âà¶ÂºÂ@Àº ½Âà¶Â`ÃÂ`ÃÂ@ÀÂ@ÀÂ`ÃÂÀÌ É É ½Âà¶Â °Â`ªÂ@§Â€­Â@§Â¡Â ¤Â ¤Â`ªÂ¡Â ¤Â@§Â ¤Â€­Â °Â`ªÂà ¤Â`ªÂ °Â °Â€­Â@§Â€­ÂàÂÀšÂ ¤Â — —ÂàÂ@§Â€­ÂÀšÂ ‹Â@ŽÂÀšÂ¡Âࠤ¡¡ÂÀšÂ`‘€” ‹Â —Âà °Â`ªÂ`ªÂ ¤ÂàÂ`ªÂ`ªÂ@§Â ¤Â`ªÂ ¤Â@§Â€­Â€­Â ¤ÂÀ³Â ½ÂºÂ °Â °Â ¤Â —Â`‘ —¡ÂÀšÂàÂÀšÂ@§Â@§Â ¤Âà€”€” — —€”ÂÀÂà„ ‹Âà„Âà„ ‹Â€”ÂÀšÂ ¤Â ¤Â ¤ÂàÂà„Â`‘ —ÂÀšÂÀšÂà€”Âà¡ÂÀšÂ —ÂÀšÂ€” —€”ÂàÂ@§Â@§Â ¤Âà —ÂÀšÂàÂàÂÀšÂàÂà¡Âà¡ÂàÂ`‘ ‹Â€”Â@ŽÂ€”Â`‘€”ÂÀšÂ`‘Âà„€{ ~ÂÀ€{Âo r r ~€{Â@u€{ÂÀ ~ÂÀ€{ rÂ@u ‹Âà„ÂÀÂà„Âà„ ‹Â ~Âà„€{ ~Â`xÂo rÂ`x€{ rÂo ~Âà„Â@ŽÂ — ~ ~ÂoÂ`x ~€{€{Â`x€{€{Â`xÂ`x€{Â`xÂ`x ~ÂÀÂÀ€{Âà„ ~Â`xÂàk eÂ`_ÂÀh eÂÀhÂ`xÂo r e e€bÂÀhÂ`xÂÀ ‹Â ‹Â€” —ÂÀšÂ@ŽÂà„Âà„ ‹Âà„ ‹Â`‘Âà„ ‹ÂÀ rÂoÂà„ÂÀÂà„Â`x ~ r eÂàk e€bÂàRÂ`_Â`_€bÂoÂÀhÂ`xÂà„ ~ ~Â@u r eÂàkÂàkÂÀhÂo€{ ~Â`x€{ˆˆÂà„€{Âàk e€{€{Â`xÂ`xÂ`x€{Â@uÂ`xÂoÂoÂoÂ`xÂoÂÀhÂ@\ÂVÂ@\ eÂo r€{ ~Â@uÂ`x rÂàk€{€{ r ~€{Â`xÂ@u ~€{Â`xÂà„ÂÀ ~ ~Âo e YÂ`_ eÂ@uÂ`x rÂàkÂ@uÂ@u rÂàkÂàkÂoÂàkÂoÂo rÂàkÂàkÂ`_Â`_€b eÂàk eÂ`x rÂàkÂ`_ Y€bÂ`_ YÂÀOÂÀO L Y YÂÀOÂàRÂV YÂ@\ YÂVÂàRÂàRÂàRÂVÂ`_Â@\ÂàRÂàRÂàRÂàRÂVÂVÂ@\ eÂ@\Â`_Â`_ÂàRÂÀO YÂ@\Â`_Â`_ YÂÀOÂ`FÂàRÂàRÂ@\ YÂ@\ÂàR L YÂ`_ÂàRÂàRÂ`_€bÂ@uÂ`x rÂ`xÂ@uÂ@u eÂÀh e€b€b eÂV€b eÂ@\ÂàRÂVÂÀOÂÀO Y Y eÂàkÂàkÂ`_ YÂV YÂ`_Â@\ YÂVÂ@\Â`_Â@\Â@\ÂVÂV YÂ`_ e e YÂàR YÂVÂàRÂVÂ`_€bÂ`_Â@\ Y LÂàRÂ@\ YÂ@\Â@\ÂVÂ`_ e eÂ@\ÂàRÂ@\ÂVÂàR LÂàR€I€IÂ`FÂ@CÂ`F€IÂàR LÂÀOÂ@\Â`_ÂàRÂàRÂÀO @€IÂ`FÂ`F€IÂ`FÂ`FÂ`F LÂÀOÂV Y YÂVÂÀOÂÀO€I€IÂ`F€IÂàRÂ`F @Â`FÂ`F L€I€I€I @ @ 3 @Â@C @Â@CÂ=Âà9Âà9 @ @Â@CÂ@CÂÀOÂÀO L LÂàR€IÂ`F @Âà9Âà9Â@*Â=Â@C LÂ`FÂ`FÂÀ6Âà9 @Â`FÂ`F€IÂ`F @ 3ÂÀ6 3 3 3Âà9€0Â`- 3Â@* 'Âà  3Â`-Â`-Â$Âà Âà Âà ÂÀÂ@*Â`-Â`- 3Âà9Âà9 @ @ÂÀ6Â`-Â@* 'Â@* 'Â@*Â@*€0€0Â@*Â$Â$ Âà Â`Âà Â$ 'Â@*ÂÀ€Â@Âà €  Â@ Â`Â`  Â@€Â`  Âà Â@* 'Â@*Â`- 'Âà Â` Â` ' 3Â`-  Â`-€0 ' 'Âà Â` Â$Â@*Âà ÂÀ 'Â$ €€ÂÀ ' 'Â$Â` Â$ 'Âà Âà Âà Â@* 3Âà Â$Âà Âà ÂÀÂ`Â` Â$Âà Â$Âà Âà Â@*Â$Â$ €  ÂÀÂà Âà Â`- ' 'Âà Â@*Â$Âà ÂÀ  Â@ Â$ ' 'Â`-Â@* ' 3€0Âà Â`Â`Âà €Â@ €Âà   € Âà  Â` € 'Âà Âà Âà ÂÀÂà €  ÂÀ 'Âà Â$ 'Â$ ' 'Â@*€0€0Â@*Âà €ÂÀÂ` Â$ Â`€ÂÀ€Âà    €€€Âà Â@*Âà Âà  'Âà €€ÂÀÂÀÂ`  'Âà ÂÀ Â@Â@ Â`  €Â@Â@Â`Â`Â@€ÂÀ €€€  Â`     €Â`Â`  Â`€ €Â@*Â@* 'Â$ÂÀÂ$€Â`  Âà€Â`  ÂÀ€þÂÀ€þ     €Â@Â`Âà  Â`€Â@*Â@*Â@*Âà  'Âà Â$ Â`€Â@  Â@€ÂÀÂà  'Â$ € ÂàÂàÂ`  € Â`Â@Â` ÂÀÂ`û   Â`ÂÀÂà ÂÀÂà  Âà Âà  'Â$Â@*Â`-Â@* ÂÀ '€0 'Â$ÂÀÂÀÂ$Âà  'Â`-Âà Â$ 'Â@*Â$Â`- 3Âà9€0Â@* ' 'ÂÀÂ`Â$Âà9ÂÀ6 3ÂÀ6Â`- 3 3 ' 3Â`- 3Âà9Â= @ @Âà9Âà9Âà9€I L @ @Â@CÂà9Âà9 @ @ @ 3Â@* '€0 3Â`- 3 3 3Â`-Âà9 3Âà9 @ @Â`F @€0Â`- 3Âà9Âà9ÂÀ6 3€0 'Â`-Â@*Â`-€0Âà9Âà9ÂÀ6Â@C @Â`F @Âà9€0Â`F @Âà9€0Â@*Â`-Â`-Â`-ÂÀ6Âà9Â=Âà9 3€0€0Â@*Â@*€0Âà9Â=Â@C€IÂàR LÂ=Âà9Âà9 @ÂÀ6€0ÂÀ6Â@CÂ`F LÂ@CÂ`F @Â@C @ @ @ @Â@C @Âà9Âà9Âà9 @Â`F @ÂÀ6Â=€IÂÀOÂàR€IÂ`FÂ`FÂà9 3Â=Âà9Â=ÂÀ6 @Â`FÂàR @Â@CÂà9 3 3Âà9 @ @Â@C€I @Â`FÂ`FÂ@CÂÀ6 3Âà9Âà9Âà9 @Â`F L L LÂ`FÂà9 @ÂÀO€IÂ`F L @Â@CÂàRÂVÂàRÂ`_ YÂàR L LÂàRÂ`F LÂÀOÂ@C LÂàR€IÂÀOÂàR€bÂÀhÂàk eÂ@\Â@\Â@\ÂàRÂÀOÂVÂVÂ`_ eÂ`_ eÂÀhÂ`_ YÂàR YÂÀOÂ`FÂVÂVÂ`_ YÂV€bÂ@\€b e eÂàkÂ@\ eÂ`_Â`_Â`_Â@\ YÂÀO Y YÂ`_ e€b e e Y Y eÂ@\Â@\ Y Y LÂÀOÂà9Âà9 @ÂV L€I€IÂ`FÂà9Âà9€I L @ @Â=Â@CÂÀ6Âà9 @ÂÀ6 3€0Âà9 3 'ÂÀÂ`-Â=Âà9ÂÀ6 ' 'Âà Â$ Â`Â@ Â@ Âà  Â$Âà  Â$  'Âà    Âà   Âà Â@Â`€ Â@*Â@*Â$ ÂÀÂÀ €   Â$Âà Â` Âà ÂàÂàÂà   Â`û€þÂ`û Âà Âà   €€€Â@€ÂÀÂ@ÂàÂÀÂàÂàÂàÂÀÂà õÂò õ€þ õ€þÂÀ €þ€þ ÂÀÂàîÂàî õÂòÂ`û€þÂ@øÂ`ûÂ`û õÂò õ  ÂàÂ@øÂÀëÂàî èÂàî õÂòÂàî õÂòÂàî èÂòÂàî èÂàîÂàîÂòÂàî è è õ€þ ÂÀÂ@øÂ õ è€åÂ@ß ÜÂÙ ÜÂ`â èÂ`ûÂ@øÂ õÂàîÂ@ß ÜÂ`â ÜÂ`âÂÀë èÂ`âÂò õ õÂàîÂàîÂÀëÂòÂò èÂ`â ÜÂÙÂàÕÂÙ è è è€åÂÀëÂòÂàî è èÂàîÂ@øÂ  õÂÀë èÂò è€å è èÂ@ßÂòÂ@øÂ è ÜÂÙ Ü ÜÂ`â€å ÜÂÀÒÂÀÒ Ï ÜÂÀÒÂÀÒÂ@ÆÂ`É€ÌÂÀҠ܀å€åÂÙÂ`â è è èÂÙ Ï Ï Ï ÜÂ@ß õÂÀëÂ@ßÂàÕ Ï ÜÂ@ß ÜÂàÕÂàÕÂ`É€å€åÂ`â è èÂò õÂàîÂàîÂàî õ€å õÂàî€å èÂ@ß èÂ`â è è è è èÂ`âÂ`âÂÀë è è è è€å è èÂÀë èÂàîÂÀë€åÂ`â õ è€å èÂÀë è è è Ü Ü èÂÀëÂòÂàî èÂòÂòÂàîÂ`â€å èÂò è èÂ`â€åÂàîÂàîÂàî õÂÀëÂò õÂÀëÂ@øÂ@øÂ õÂòÂàîÂ`âÂàÕÂÙÂàÕÂ@ß ÏÂàÕÂÙ ÜÂÀë õÂ`ûÂ@øÂ è è€å èÂÀë è è èÂ@ß Ü ÜÂàîÂàî ÜÂàÕ è€å€åÂ`âÂàÕÂ@ßÂÀëÂòÂ`ûÂòÂ@ßÂ@ß è èÂàî èÂÀëÂàîÂò èÂ`â ÜÂ@ßÂ@ß Ü ÜÂ`âÂàî èÂ`â Ü ÜÂÙ èÂàîÂò õÂò õÂ@øÂ õÂ@øÂ è ÜÂÙ ÜÂ`â ÜÂ`â€å è èÂòÂàî èÂ@ß è è€å Ü èÂ@øÂÀë è è è€å€åÂÀë èÂ٠܀å è õ èÂ`â ÜÂÙ Ü Ü è ÜÂÙÂ`â èÂ`âÂ@ßÂ`âÂÙÂ`â€åÂ`âÂÙÂÙ Ï Ï ÜÂ`âÂÀë õÂàîÂòÂò è ÜÂÀë€åÂàî èÂàîÂÀë è è è èÂÀë è èÂòÂ@ßÂàÕ ÜÂÀë õÂò€å€åÂàî€åÂ`âÂÀëÂò èÂàîÂÀë õÂòÂàîÂàî€å€å ÜÂàÕ è€åÂ`âÂ`â Ü Ü ÜÂÙÂàÕÂÙ€åÂàî è èÂàî€å èÂÀëÂàîÂ@øÂ  õÂ`ûÂ@øÂ õ€þ    Â`û    Â`ûÂ@øÂ`û ÂàÂ`ûÂ@øÂ`û   €þÂòÂ@øÂ õÂòÂò õ õ õ    ÂàÂÀ  Â@øÂ õÂ@øÂ`û€þ Â`ûÂ`û õÂ@øÂ€þÂàîÂàîÂòÂòÂàîÂ`û õÂÀëÂàî€åÂòÂ`ûÂòÂ@øÂàîÂ`ûÂò õ õ õ€þÂò õ€þ   Âà ÂÀÂ`û  €þ    Âà   ÂàÂà ÂàÂà   Â`  Â@øÂ  Âà  Â@ÂÀÂ`Â@ÂÀ   Âà   Â@€ Â@Â@Â@ ÂàÂà ÂÀ€þ  Âà  € ÂàÂ@Â`€ Â@ € Â` Â`€Â` Â$ 'Â`- 'Â`-Â@*Â@*Â`-Âà Âà  Âà  € Â$Âà Â$   Â`Â@€Âà Â`Â`  ÂÀÂ@  €  Âà Âà  €Â@ Â`Â`Â`Â` Â@ Âà  ’“ ر ÷ÉÂÀ‰ÉÂ@¦¾Â a²Â€n§ÂÀxžÂàA— l‘Â@¾ˆÂÀpIÂ:¿Á€R‚Á–¯À²"A€ãA33BÀ2dB@ÏBÀö‰BàQŒBHŠB`=…B€d|BðkBÀ#ZB€¨GB€~5B€ê#B€7BÀ¶BëAGÑA€¹A€ê£A€åAÈzAÒWAª4AºA\Ú@¨“@È@–<,Àî˜ÀâåÀŠÁU>Á¼cÁž„Á€Q—ÁªÁz¼Á€ûÎÁ€ÚàÁ0òÁ@RÂÀ. Â@uÂEÂ@‹ÂÀZ#ÂÀÒ(ÂÀÿ-Â@£2ÂÐ6Ÿ:€ý=ÂÀñ@Â@ºCÂÀFÂÀDHÂ@,J¶KÂ@MÂÀkNÂÐO€ïPÂ@R€üR€ÄSÂgTÂUÂÀ¾UÂ@HVÂ@¬VÂ#WÂ@WÂëWÂ@yÂÀJyÂQyÂjy€yœyµyÂÀÇyÂÀÇyÂ@ÔyÂÀàyÂ@íyÂÀzÂzÂ2z€>z€>zÂ@8zÂ@QzÂ@QzÂ@jzÂÀz¯zÂÀÁzÂ@çzÂ@çzÂ@çzÂ@çzÂázÂ@çzÂ@{€{Â@{ÂÀ%{ÂÀ>{ÂÀW{Â@}{€ƒ{Â@}{Â@–{Â@–{Â@¯{€µ{€µ{€Î{ÂÛ{€ç{€|Â@ú{ÂÀ|Â@ú{ÂÀ|Â@,|Â@,|Â?|ÂÀQ|Â@w|Â@w|Â@w|Â@|£|ÂÀœ|£|Â@©|¼|€È|€á|€ú|Â@ } }ÂÀ}Â@&}€,}Â@&}Â@?}Â@X}€^}ÂÀ}}Â@Š}€}€©}¶}ÂÀ¯}ÂÀ¯}ÂÏ}ÂÏ}Âè}Â~ÂÀ~Â@ ~Â@ ~€&~€?~ÂÀE~Â@R~ÂÀ^~Âe~Âe~€q~Â@„~Â~~Â@~€¼~ÂÀÂ~€Õ~Â@è~Âû~€ÂÂÀ&Â@LÂFÂFÂ@LÂ_Â@eÂx€„Â@~€„Â@—ÂÀ£‘Â@°Â@°ÂÀ¼Â@°Â@ÉÂÃÂÃÂÀîÂ@ûÂà€Â €Â€€ÂÀ€Â@&€Âà5€ÂÀ2€ÂÀ2€Â <€Âà5€Â@?€Â`B€ÂàN€Â U€Â@X€Â a€Âàg€Â n€Â`t€Â„€ÂÀ}€Â z€Â z€Â z€ÂÀ}€Â@Š€Â€€ÂÀ–€Â€Â`¦€ÂÀ¯€Â ¬€Â ¹€Â€Â€Â¶€Â Å€Âàä€ÂÀá€Â Þ€Â`؀ ހÂè€Â`ñ€Â ÷€Â€  Â` ÂÂ`# 6 BÂ`< )Âà/ÂÀEÂ@RÂàHÂ@R€XÂàaÂ`nÂe hÂe h t tÂ~Â@„€ŠÂà“— ¦Â ¦Â@¶Â@¶ÂàÅ ØÂ ØÂÀÛÂâÂ@è åÂ@è åÂâ å€îÂà÷Âà÷Âû€‚ ‚‚ ‚Â@‚Â`‚€ ‚ #‚ 0‚ 0‚€9‚ I‚Â@L‚€R‚Âà[‚Â_‚ b‚Â`h‚Âàt‚Âàt‚Â@~‚ {‚ {‚Â@~‚Âàt‚ {‚ ‡‚Â`š‚€‚€‚  ‚Âং  ‚  ‚Â`š‚ÂÀ£‚€‚ÂংÂ@°‚ ¹‚ ¹‚Â`³‚ ƂÂ`Ì‚ÂÀÕ‚ÂàØ‚ÂàØ‚Â܂ ߂ ߂Âàñ‚Âõ‚€ƒÂ`þ‚Âà ƒÂ`ƒÂ ƒÂÀ ƒÂÀ ƒÂà#ƒÂ€3ƒÂ`0ƒÂ *ƒÂ *ƒÂ *ƒÂ`0ƒÂà<ƒÂ@ƒÂ CƒÂ€LƒÂ€LƒÂ€LƒÂàUƒÂ \ƒÂàUƒÂ@_ƒÂ€eƒÂ`bƒÂ hƒÂànƒÂÀkƒÂ`{ƒÂ ƒÂ‹ƒÂ‹ƒÂ@‘ƒÂ ŽƒÂ€—ƒÂ ŽƒÂ`”ƒÂ ŽƒÂ šƒÂ šƒÂ`­ƒÂ ³ƒÂÀ¶ƒÂ½ƒÂ ÀƒÂ ÀƒÂใÂใÂใ½ƒÂ@àÀƒÂ ÀƒÂ€ÉƒÂàÒƒÂ@܃Â@܃€âƒÂ€âƒÂ òƒÂ þƒÂ@„ „ „ÂÀ„Âà„Â`*„Â`*„Â@'„ $„ $„ 0„ 0„Âà6„Â:„Â`C„ÂÀL„ÂÀL„ÂÀL„ I„ÂàO„ÂàO„Â`\„Â`\„Â`\„Âl„ o„€x„Âà„ ”„ÂÀ—„ ”„ÂÀ—„ž„ ¡„ÂÀ—„Âàš„Â`§„€ª„Â`§„ÂÀ°„ÂÀ°„·„ ­„ º„ ƄÂЄ ߄ ӄÂ`ل ߄Â`ل ߄Â`Ù„Â`ل€܄Âé„Â@ï„Â…Â… …Â` … …Â` …ÂÀ… …ÂÀ… …Âà… *…Â4… 7… 7… 7…Â4…Â`=… C…ÂàI… P… P… P… P… P… P…Â@S…Â`V…ÂÀ_…Âàb…Â`o…ÂÀx…€r…Â`o…Â`o…Âà{…Â`ˆ…Â`ˆ…Â@…… ‚…ÂÀ‘…Â Ž…Â ›…€¤…ÂÀª…±… ´…€½…Â@·… ´… ´…€½… À… ´…±…Â୅€½… ͅÂàÆ…ÂÊ…Â`Ó…Â Í…ÂÊ…Â`Ó…Â`Ó…Âã…Âã… ò…ÂÀõ… ÿ…Âü…Âàø…Â ÿ…  †Â€†Â  †Âà†ÂÀ†Â  †Â@†Âà†Â †Â $†Âà*†Âà*†Âà*†Â 1†Â.†Âà*†Â€!†Â 1†ÂàC†Â =†ÂàC†Â J†Â€S†Â€S†Â€S†Â`†Â o†Â c†Âà\†Â c†Â c†Â o†Âàu†Â@†Â`‚†Â o†Â€…†Â@†Â€…†Â`‚†Â€…†Â€…†ÂàŽ†Â ¡†Â ®†Â ®†Â ¡†Â ®†Â@±†Â«†Â ¡†Â ®†Â º†ÂàÀ†Â`͆ ӆÂ݆ à†Â à†Â Ó†ÂÀÖ†ÂàÙ†Â݆ à†Â݆Âàن ì†Âàò†Â@ü†Âö†Â ù†Â ù†Â`ÿ†ÂÀ‡Âà ‡Âà ‡Âà ‡Â ‡Â ‡Â€‡Â ‡ÂÀ!‡Âà$‡Â +‡Â€4‡Â@.‡Â€4‡Â€4‡ÂA‡Âà=‡Âà=‡Â 7‡Â D‡Â€M‡Â P‡Â P‡Â ]‡ÂZ‡Â€M‡Â`J‡Â€M‡ÂàV‡Â ]‡Â@`‡Â ]‡Â ]‡Â i‡Â v‡Â v‡Â@y‡Â v‡Â€‡Â v‡Â ‚‡Â€‡Â€‡Â ‚‡Âàˆ‡ÂŒ‡Â@’‡Â ›‡Â ›‡Â€˜‡ÂࡇÂ@«‡Â ´‡Âງ ´‡ÂÀ·‡Â¾‡ÂÀ·‡Âງ¾‡ÂÀ·‡Â€±‡Âງ¾‡Â€Ê‡Â`à‡Â@݇Â`à‡Â Ú‡ÂàӇ ڇÂ@݇ æ‡Â æ‡Âàì‡Âð‡Â@ö‡Â ÿ‡Â ÿ‡Â€ü‡Â ó‡ÂÀˆÂÀˆÂ ˆÂ ˆÂ ÿ‡Â ˆÂ ˆÂ ˆÂ€ˆÂ ˆÂ ˆÂ`ˆÂ %ˆÂ@(ˆÂ 1ˆÂà7ˆÂ 1ˆÂ >ˆÂ@AˆÂ >ˆÂ`DˆÂ@AˆÂ >ˆÂ`DˆÂ`DˆÂÀMˆÂTˆÂàPˆÂ`]ˆÂàPˆÂ WˆÂ`]ˆÂ cˆÂ cˆÂ cˆÂmˆÂÀˆÂà‚ˆÂ`vˆÂ`vˆÂ@sˆÂ€yˆÂà‚ˆÂ`ˆÂ ‰ˆÂ |ˆÂ |ˆÂ |ˆÂà‚ˆÂà‚ˆÂ ‰ˆÂ •ˆÂŸˆÂ`¨ˆÂ ¢ˆÂ€«ˆÂ ®ˆÂ@¥ˆÂ`¨ˆÂ ®ˆÂ ®ˆÂഈ€Ĉ€ĈÂ@¾ˆÂ »ˆÂÀʈÂ@׈Â`ÚˆÂ@׈Â@׈Â@׈€݈Â`ÚˆÂшÂà͈Â@׈ ԈÂ`ÚˆÂ`ÚˆÂ@׈Â@׈ Ԉ€݈ÂÀãˆÂ`óˆÂ íˆÂ íˆÂ`óˆÂ ùˆÂ‰Â` ‰Â ‰Â ‰Â@ ‰Â ‰ÂÀ‰Â ‰Â`%‰Â ‰ÂÀ.‰Â`%‰Â`%‰ÂÀ.‰Â +‰Âà1‰Â€(‰ÂÀ.‰Â€A‰Â@;‰Â@;‰Â€A‰ÂN‰Â`W‰Â D‰Â D‰ÂÀG‰Â Q‰Â ]‰ÂàJ‰Â Q‰ÂÀG‰Â D‰Â Q‰Â Q‰ÂÀ`‰Âàc‰ÂÀ`‰Â@T‰Â€Z‰Âg‰Â v‰ÂÀy‰Â v‰ÂÀy‰Â€‰Â€Œ‰Â`‰‰Â`‰‰Â€Œ‰Â€‰Â€s‰Â€s‰Â€s‰Â ƒ‰Â ƒ‰Â ƒ‰Â ƒ‰Â ƒ‰Âà•‰Âà•‰ÂÀ’‰Â€Œ‰Â ‰Âà•‰ÂÀ’‰Â ‰Â ‰Â ‰Â`‰‰Âà|‰Â ‰Â œ‰Â€¥‰Â ¨‰Â ¨‰Â µ‰Â€¾‰Â µ‰Â`»‰Âàlj Á‰Â`»‰Â µ‰Â@¸‰Â€¾‰Âàlj Á‰ÂàljÂ@щ ډÂÀ݉ ډÂ@ê‰Â ç‰Âàà‰ÂÀ݉ ډÂä‰Â Ú‰Â@ê‰Â@ê‰Â`í‰Âàù‰Â ŠÂàù‰Âàù‰ÂÀö‰Â ó‰Âý‰Âàù‰Â ŠÂ`ŠÂ ŠÂ %ŠÂ€"ŠÂŠÂŠÂ@ŠÂàŠÂ  ŠÂàŠÂ€ ŠÂ  ŠÂàŠÂŠÂŠÂ@ŠÂ@ŠÂ€"ŠÂ 2ŠÂ/ŠÂ@5ŠÂ 2ŠÂ@5ŠÂ`8ŠÂà+ŠÂ@5ŠÂ >ŠÂHŠÂHŠÂ`QŠÂ KŠÂÀAŠÂàDŠÂÀZŠÂÀZŠÂHŠÂàDŠÂ KŠÂ€TŠÂ`QŠÂàDŠÂ KŠÂHŠÂ`QŠÂ KŠÂHŠÂÀAŠÂàDŠÂ KŠÂHŠÂ`QŠÂ€TŠÂ€TŠÂÀAŠÂ@NŠÂ KŠÂ dŠÂ`jŠÂaŠÂ dŠÂ`jŠÂ€mŠÂ pŠÂÀsŠÂ pŠÂ pŠÂàvŠÂ }ŠÂàvŠÂàvŠÂ }ŠÂzŠÂàvŠÂ€mŠÂ }ŠÂ`ƒŠÂÀŒŠÂÀŒŠÂàŠÂ ‰ŠÂ –ŠÂàŠÂ@€ŠÂ }ŠÂ€†ŠÂ ‰ŠÂàŠÂàŠÂ ‰ŠÂàŠÂ ‰ŠÂ“ŠÂ“ŠÂ –ŠÂ –ŠÂ€ŸŠÂÀ¥ŠÂ`œŠÂ€ŸŠÂ`œŠÂ ¢ŠÂ¬ŠÂਊ ¯ŠÂ@²ŠÂàÁŠÂÅŠÂÀ¾ŠÂŊ »ŠÂ€¸ŠÂ¬ŠÂ ¯ŠÂ@²ŠÂਊ ¯ŠÂ@²ŠÂÀ¾ŠÂàÁŠÂ Ȋ€ъÂ@ËŠÂŊ Ԋ€ъÂ@ˊ Ԋ Ԋ ԊÂàÚŠÂ@äŠÂàÚŠÂ áŠÂ`çŠÂàÚŠÂ`Ί ȊÂÞŠÂ áŠÂ`çŠÂ íŠÂ€êŠÂ€êŠÂ áŠÂ`çŠÂ íŠÂ íŠÂ÷ŠÂàóŠÂ÷ŠÂ íŠÂ úŠÂ€‹ÂÀ ‹Â‹Â ‹Â‹Â€‹Âà ‹ÂÀ ‹Â ‹Â€‹Â ‹Â@‹Â ‹Â ‹Â`‹Â ‹Â ‹Â ‹Â`‹Â ‹Â ‹Â ‹Â)‹Â@/‹Â@/‹Â@/‹Â ‹Â ‹Â ‹Âà%‹Âà>‹Â 8‹Â 8‹Âà%‹Â€‹Â)‹Âà%‹Â ,‹Â)‹Â ,‹Âà%‹Â)‹Â ,‹Â ,‹Â ,‹Â€5‹Â@/‹Â`2‹Â 8‹Â`2‹Â ,‹Â@/‹Â ,‹Âà%‹Â ‹Â@‹Â€‹ÂÀ"‹Âà%‹Â ,‹Â 8‹Â 8‹Âà>‹ÂÀ;‹ÂÀ;‹Âà>‹Âà>‹ÂÀ;‹Âà>‹ÂÀ;‹Â€5‹Â€5‹Â ,‹Â ,‹Â@/‹Âà>‹Âà>‹Â E‹Â E‹Â E‹ÂB‹Âà>‹ÂB‹Âà>‹Â`K‹Â@H‹Â E‹Â€5‹Â 8‹Â€5‹Â 8‹ÂÀ;‹ÂB‹Â E‹Â Q‹Â E‹Â€N‹Â Q‹Â@H‹Â E‹Â@H‹Â@H‹Â€N‹ÂÀT‹Â€N‹ÂB‹Â€N‹ÂàW‹Â ^‹Â Q‹ÂÀT‹Â ^‹Â Q‹Â Q‹Â€N‹Â`K‹Â`K‹Â@H‹ÂÀT‹Â Q‹Â[‹ÂàW‹Â€N‹Â Q‹Â@H‹Â`K‹Â`K‹Â E‹Â 8‹ÂB‹ÂB‹Â€N‹Â Q‹Â`K‹Â ^‹ÂàW‹ÂÀT‹Â Q‹ÂÀT‹ÂÀT‹Â@a‹Â`d‹Â ^‹Â j‹Â ^‹ÂàW‹Â ^‹Â€g‹Â@a‹Â j‹ÂÀm‹Â j‹Â@a‹Â€g‹Â ^‹Â ^‹Â ^‹Â ^‹Â`d‹Â`d‹ÂàW‹Â ^‹Â€g‹Â`d‹Âàp‹Â`d‹Â[‹Â ^‹Â`d‹Âàp‹Â`}‹Â`}‹Â ƒ‹Â w‹Â w‹Â`}‹Â`}‹Â ƒ‹Â@z‹Â@z‹Â w‹Âàp‹Â@z‹Â@z‹Â`}‹Â ƒ‹Âà‰‹Âà‰‹ÂÀ†‹Â€€‹Âà‰‹Â ‹Â ‹Â ‹Â œ‹Â€™‹Â ‹Â@“‹Â ‹Â ‹Â€™‹Â@“‹Â‹Â ‹Â‹Â‹Â‹Â ‹Â ƒ‹Â`}‹Âà‰‹Â@“‹Â ‹Â ‹Â@“‹Â`–‹ÂࢋÂ`¯‹Â¦‹Âࢋ¦‹ÂࢋÂ@¬‹ÂÀŸ‹Â ‹Â€™‹Â œ‹Â¦‹Â ©‹Â ©‹Â¦‹Â ©‹Â@¬‹Â`¯‹Â`¯‹Â¦‹Âࢋ¦‹Â œ‹Â ©‹Â@¬‹Â ©‹Â@¬‹ÂÀ¸‹Â µ‹Â µ‹ÂÀ¸‹Â ©‹Â ©‹Â€²‹Â€²‹Â ‹¿‹Â€Ë‹ÂàÔ‹ÂàÔ‹ÂÀÑ‹ÂàÔ‹ÂàÔ‹Â@Þ‹ÂÀы€ˋÂ`ȋ€ˋ€ˋ€ˋ¿‹Â ‹Â`ȋ ΋ÂàÔ‹ÂàÔ‹ÂÀÑ‹Â`á‹Â ç‹Â€ä‹Â`á‹Â ô‹Â@÷‹Â ô‹Âàí‹Â ô‹Â ŒÂ`ú‹Â ô‹ÂÀê‹Â`ú‹Â ô‹Â@÷‹ÂÀŒÂÀŒÂ`ú‹Â ô‹Â ô‹Â ç‹Â`á‹Âàí‹Âàí‹Â@÷‹Â€ý‹Â ŒÂ`ú‹Â ŒÂ€ý‹Â`ú‹Â ŒÂ ŒÂàŒÂ@ŒÂàŒÂ ŒÂ ŒÂàŒÂÀŒÂÀŒÂ€ŒÂ`ŒÂ`ŒÂàŒÂ@)ŒÂ &ŒÂ ŒÂ@)ŒÂ@)ŒÂ &ŒÂ#ŒÂ`,ŒÂ 2ŒÂ &ŒÂ`,ŒÂà8ŒÂ`,ŒÂà8ŒÂ<ŒÂ€/ŒÂ 2ŒÂ &ŒÂ`,ŒÂ 2ŒÂ 2ŒÂ ?ŒÂ@BŒÂUŒÂ@[ŒÂ KŒÂàQŒÂ@[ŒÂ dŒÂ€aŒÂ€aŒÂ@[ŒÂ€aŒÂÀgŒÂàjŒÂ XŒÂUŒÂàQŒÂÀNŒÂ dŒÂ`^ŒÂ dŒÂ€aŒÂÀgŒÂ€aŒÂ€aŒÂ€aŒÂ`^ŒÂàjŒÂ€aŒÂnŒÂàjŒÂàjŒÂàjŒÂnŒÂ qŒÂÀgŒÂ@tŒÂ@tŒÂ qŒÂnŒÂàjŒÂàjŒÂ }ŒÂ ŠŒÂ@ŒÂ€zŒÂ`wŒÂnŒÂnŒÂ }ŒÂ }ŒÂÀ€ŒÂàƒŒÂ ŠŒÂ }ŒÂ€zŒÂ ŠŒÂ@ŒÂ ŠŒÂ ŠŒÂ‡ŒÂàƒŒÂ ŠŒÂ`ŒÂ`ŒÂ`ŒÂ`ŒÂ ŠŒÂàƒŒÂ ŠŒÂ –ŒÂÀ™ŒÂ –ŒÂ –ŒÂ £ŒÂÀ™ŒÂ ŒÂ@¦ŒÂ ¯ŒÂ@¦ŒÂ ¯ŒÂ@¦ŒÂ ŒÂ £ŒÂ ¯ŒÂ`©ŒÂ`©ŒÂ ¯ŒÂÀ²ŒÂ€¬ŒÂÀ²ŒÂൌÂൌ ¯ŒÂ ¯ŒÂÀ²ŒÂ ¯ŒÂ@¦ŒÂ`©ŒÂ ¯ŒÂ`©ŒÂ £ŒÂ ¯ŒÂ ¼ŒÂ`ÂŒÂ`Œ ¯ŒÂ€¬ŒÂ ¼ŒÂൌ¹ŒÂൌ ¯ŒÂ@¦ŒÂ @Â`¾®Â@óÆÂàlÆÂ ƒ»Â 5¯Â E¤Â U›Â (”Âà^ŽÂ ›…ÂÀ¹A€CõÁ€uªÁ{YÁÄ8ÀJDAŒëA€Û2B`B€ú|Bü…BÀé‡B@·…BÀ–€B@þrBwbBÀxPB >B€º+BBÀ« BÓôAÌØAO¿Aø§A|’A~A³XA5ADA ä@¸¡@ä;@ÐO?p­¿,bÀü·ÀRýÀ"ÁÇDÁ:hÁÊ…Á€j—Á$©Á€ÄºÁ€qÌÁ€ºÝÁ€TîÁ€&þÁÀ¤€¿ ÂÀ‚€î¾ €)&ÂÀø*ÂÀD/€?3·6Â×9ÂÀŒ<Â?ÂÀy€]yÂ@pyÂ@‰yœy€¨yÂÀ®yÂ@¢y€¨y€Áy€ÚyÂÀùyÂÀzÂ@zÂ@8zÂKzÂKz€WzÂ@jzÂÀvzÂ}zÂ@µz€ÔzÂ@ÎzÂÀózÂ@{Â@{ÂúzÂ@{€{€Q{Â@d{Â^{Â@d{ÂÀp{Â@d{Â@}{€œ{€µ{Â@á{Âô{ |€|ÂÀ|ÂÀ|ÂÀ|Â@,|ÂÀ8|ÂÀ8|ÂX|Âq|Š|ÂÀœ|ÂÀµ|Â@©|€È|Âî|Â@ô| }ÂÀ}Â@?}ÂR}ÂÀd}Âk}Â@q}€w}Â@Š}Â@£}ÂÀÈ}Â@Õ}Âè}ÂÀá}Â@~€ ~Â~ÂÀ,~Â@9~Â@R~Â@R~€X~ÂÀw~ÂÀ~ÂÀ©~Â@¶~Â@Ï~ÂÀÛ~ÂÀÛ~Â@è~Â@è~Â@€ ÂÀ?€R€RÂ_ÂÀqÂÀŠÂÀŠÂÀ£ÂÀÕÂÀîÂõÂ@âÂ@û€ €Â €Â`)€Âà5€Â€E€Â@X€Â€^€Â a€Âàg€Â a€ÂÀd€Â`[€Â a€Âàg€Â a€Âk€Âà€€Âà€€Â€€ÂÀ–€Â  €Â`¦€ÂÀ¯€Â@¼€Â€Â€Â Å€Â Ҁ ހÂ`ñ€Â Âàý€Â Âàý€Â` ÂÀÂ@  )Â@9ÂÀEÂL€XÂÀ^€XÂàH€XÂÀ^ [ h tÂàz Â`‡Â€ŠÂ Â@°Â`¹Â@¶Â@¶Â ¿Â ¿Â€ÕÂàÞ€îÂà÷Âà÷Â`‚ þÂà‚Âà‚Â@‚Â@‚ #‚Â-‚Â`6‚ÂàB‚ÂF‚€R‚Âà[‚ b‚ b‚ b‚ b‚Â`h‚€k‚Â`h‚Âàt‚Â`‚ÂÀŠ‚Â@—‚Â@—‚Â@—‚  ‚ÂংÂংª‚Â@°‚Â`³‚ ¹‚ Ƃ€ς€è‚Â@â‚ÂÜ‚Â@â‚Âàñ‚€ƒÂà ƒÂ ƒÂ ƒÂ€ƒÂ ƒÂà#ƒÂà#ƒÂÀ ƒÂ ƒÂ *ƒÂà<ƒÂ`IƒÂ \ƒÂ€eƒÂ€eƒÂÀkƒÂ hƒÂ hƒÂ \ƒÂÀkƒÂànƒÂ uƒÂ€~ƒÂ`{ƒÂ‹ƒÂ šƒÂÀƒÂ@ªƒÂ §ƒÂ`­ƒÂ¤ƒÂ`­ƒÂ ³ƒÂใÂ`ƃÂà҃ كÂ`߃Â`߃Â`߃€âƒÂàëƒÂ@õƒÂà„€ûƒÂà„Â`„€„€„ „ $„Â@'„€-„Âà6„ =„Âà6„ 0„Â`C„ÂÀL„ V„€_„ÂÀe„ÂÀe„Âàh„Â`u„Â…„€‘„€‘„€‘„Âàš„Â ¡„€ª„Âೄ ­„Âೄ·„Â`À„ÂàÌ„ÂЄÂà̄ ӄÂ`Ù„Âàå„Âàå„Â`ò„Âàþ„Âàþ„ …€…Â` …ÂÀ… …ÂÀ…Âà…Âà…Âà… …Â@!…€'… *…Â4…Âà0…€@…ÂÀF…ÂàI…ÂàI…Â@S… \…ÂÀ_…Â@l… u…Â`o… u…Â…Â Ž…Â˜…ÂÀ‘…Â Ž…Â Ž…Â˜… §…±… §… ´… ´…Â`º…Â`º…Âà­…Â@·… À… À… ͅÂàÆ…Â`Ó…Âã…Â`ì… ò…€ï… ò…Âü…Âàø…Â`†Â€†ÂÀ†Â $†Â€!†Â $†Â †Â`†Â`†Â $†ÂÀ'†Â 1†Â`7†Â`7†Â =†Â@4†Â =†Â =†ÂàC†Â J†Â€S†Â`†ÂÀY†Âà\†Â c†Â V†Â c†Â@f†Â o†Ây†Â@†Â€…†Â€…†Â ˆ†Â •†ÂàŽ†ÂàŽ†Â ¡†Â ¡†Â৆€·†Â º†Â€Ð†Â džÂĆÂƀІ€ІÂÀֆ ӆ€І à†Â ì†ÂÀï†Âàò†Â ù†Â ù†Â€‡Âà ‡Âà ‡Âà ‡Â ‡Â ‡Â ‡Â ‡Âà$‡Â ‡Â ‡Âà$‡Â@.‡ÂA‡Â`J‡Â P‡Â`J‡Â@G‡Â@G‡Â P‡Â ]‡ÂZ‡ÂZ‡Â@`‡Âào‡Â`|‡Â ‚‡Â€‡Âàˆ‡Âàˆ‡Â ‡Â ›‡Â ‡Â ‡Â¥‡Â ¨‡Â@«‡Â¥‡Âࡇ ›‡ÂÀž‡Â ¨‡Â€±‡Â Á‡Â€Ê‡Â€Ê‡Â@ć ͇ ڇÂ@݇ ڇ ó‡Â€ü‡Â€ü‡Âàì‡Â ó‡Â ó‡Â`ù‡Â ÿ‡Â@ˆÂ ˆÂ€ˆÂ@ˆÂ ˆÂ ÿ‡Â ÿ‡Â ˆÂÀˆÂ ˆÂàˆÂ %ˆÂ 1ˆÂ 1ˆÂÀ4ˆÂ`DˆÂ`DˆÂ`DˆÂ@AˆÂ JˆÂ WˆÂÀfˆÂ cˆÂ pˆÂ@sˆÂ€yˆÂà‚ˆÂà‚ˆÂ ‰ˆÂÀˆÂà‚ˆÂ`vˆÂà‚ˆÂ ‰ˆÂ`ˆÂ€’ˆÂÀ˜ˆÂ ¢ˆÂ`¨ˆÂ`¨ˆÂഈ¸ˆÂ€ÄˆÂ`ÁˆÂ@¾ˆÂ ÇˆÂ ÇˆÂà͈Âà͈ÂшÂ`ڈ àˆÂêˆÂàæˆÂ`óˆÂÀüˆÂ ‰Â ‰Â` ‰Â@ ‰ÂàÿˆÂ ‰Â ‰Â@"‰Â€(‰Â€(‰Â +‰Â +‰Â`%‰Âà1‰Â +‰ÂÀ.‰Â5‰Â@;‰ÂÀG‰Â D‰Â€A‰Â Q‰Â@T‰Â€Z‰Â j‰Âàc‰Â Q‰Â Q‰ÂÀ`‰Âàc‰ÂÀ`‰Â j‰Â@m‰Â€s‰Â`p‰Â€‰Â ƒ‰Â€Œ‰Â€Œ‰Â€Œ‰Â ‰Âà•‰Âà•‰Â ¨‰Â€¥‰Â@Ÿ‰Â™‰Â ‰ÂÀ’‰Â`¢‰Â ¨‰Âஉ µ‰Â@¸‰Â µ‰Â µ‰Â µ‰Â€¾‰Â Á‰Â@щ ΉÂÀĉÂàlj ΉÂ@щ€׉Âàà‰ÂÀ݉Â@ê‰ÂÀö‰Â ó‰ÂÀö‰Âý‰Â ŠÂàù‰Âàù‰Â ŠÂ€ ŠÂ€ ŠÂ ŠÂ  ŠÂŠÂàŠÂ@ŠÂà+ŠÂ 2ŠÂ 2ŠÂ 2ŠÂà+ŠÂ 2ŠÂ@5ŠÂÀ(ŠÂ€;ŠÂÀAŠÂàDŠÂÀAŠÂÀAŠÂHŠÂ KŠÂHŠÂ dŠÂà]ŠÂ WŠÂ KŠÂaŠÂ dŠÂ dŠÂ@gŠÂ`jŠÂÀsŠÂ€†ŠÂ€†ŠÂ€†ŠÂ@€ŠÂ ‰ŠÂàŠÂ –ŠÂàŠÂ ‰ŠÂàŠÂ ‰ŠÂ ‰ŠÂàŠÂ ¢ŠÂ ¯ŠÂ@²ŠÂ€¸ŠÂ`µŠÂ »ŠÂàÁŠÂ€ÑŠÂ`Ί Ȋ Ȋ ȊÂÅŠÂ`ΊÂ@ˊ ԊÂÞŠÂ áŠÂÞŠÂ`Ί ԊÂ`çŠÂ@äŠÂ`çŠÂ€êŠÂ íŠÂàóŠÂ íŠÂàóŠÂ`‹Â`‹Â ‹Â ‹Âà ‹Âà ‹ÂÀ ‹Â ‹Â ‹Â€‹Â ‹Âà%‹Âà%‹Â ‹Â ‹Â ,‹Â`2‹Â ,‹Â@/‹Â ,‹Â)‹Â)‹Â€5‹ÂÀ;‹Â E‹ÂB‹Â E‹Â Q‹Â E‹ÂàW‹Â[‹Â€g‹Âàp‹Â w‹Â w‹Â@z‹Â`}‹Â€€‹Â ƒ‹Âà‰‹Â@z‹Â ƒ‹Â ƒ‹Â ƒ‹Â`}‹Â€€‹Â ‹Âà‰‹Â ‹Â@“‹Â¦‹Â¦‹Â µ‹Â µ‹Â`¯‹Â`¯‹Â ©‹Â µ‹Â໋ ‹€ˋ¿‹Â ‹ ‹Â`ȋ€ˋÂ@ŋ€ˋÂÀÑ‹Â`á‹Âàí‹ÂÀê‹Â؋ ۋ€ä‹Â Û‹Âàԋ€ä‹Âàí‹ÂÀê‹Âàí‹Â`ú‹ÂÀŒÂ€ý‹Â€ý‹ÂÀŒÂ ŒÂ ŒÂ€ŒÂ€ŒÂ ŒÂ€ŒÂ`ŒÂ€ŒÂ@ŒÂ€ŒÂ &ŒÂ`,ŒÂ ŒÂ ŒÂ#ŒÂ@)ŒÂ@)ŒÂ 2ŒÂà8ŒÂ ?ŒÂ ?ŒÂ`EŒÂ KŒÂ KŒÂ KŒÂ KŒÂÀNŒÂ KŒÂàQŒÂ`^ŒÂ`^ŒÂ`^ŒÂ dŒÂ dŒÂÀgŒÂ@tŒÂ@tŒÂ€zŒÂ@tŒÂnŒÂàƒŒÂÀ€ŒÂ@tŒÂ qŒÂ }ŒÂ€zŒÂ€zŒÂàƒŒÂÀ€ŒÂ‡ŒÂ ŠŒÂ £ŒÂ ŒÂàœŒÂàœŒÂ –ŒÂ ŒÂ £ŒÂ £ŒÂ £ŒÂàœŒÂ€“ŒÂ@¦ŒÂ`©ŒÂ`©ŒÂ`©ŒÂ £ŒÂ€¬ŒÂ€¬ŒÂൌ ¯ŒÂ@¿ŒÂ`ÂŒÂÀËŒÂ@ØŒÂàΌ ՌÂ@، Ռ ՌÂàΌ ՌÂ@ØŒÂëŒÂàçŒÂ`ôŒÂ`ôŒÂëŒÂ`ôŒÂ€÷ŒÂà Â` Â@ Â@  Â@  úŒÂ Â`   Â@ Â@ ÂÀÂÀÂÂÀÂàÂà €)ÂÀ/Â6Âà2Â6 9€BÂ`?Â`? EÂ`X ^Â`XÂOÂàKÂO RÂ@U R R R ^Â@UÂ`X ^ÂàdÂh k w€tÂÀzÂÀz€t€tÂhÂ`qÂÀzÂà}Â@‡Â „Â`ŠÂÀ“ÂÀ“Âà–š Â@ Â  šÂ`£Â@¹Â³Â ÂÂ@¹Â ¶Â ¶Â³Â@¹Âà¯Âà¯Â€¿Â`¼ÂÀŠ€¿Â`¼Â€¿Â Â ÂÂÌÂÌÂ`Õ€ØÂ ÛÂåÂàáÂå è è èÂåÂ`î ô èÂ`îÂÀ÷ÂàúÂ`ŽÂ€ ŽÂ`ŽÂ`ŽÂ€ ŽÂ`ŽÂ  ŽÂ  ŽÂàŽÂàŽÂ  ŽÂ  ŽÂàŽÂàŽÂ ŽÂ€#ŽÂ &ŽÂ &ŽÂÀ)ŽÂÀ)ŽÂà,ŽÂ0ŽÂ &ŽÂ 3ŽÂÀ)ŽÂ 3ŽÂ0ŽÂà,ŽÂ`9ŽÂ€<ŽÂ`9ŽÂàEŽÂàEŽÂ LŽÂIŽÂ`RŽÂ LŽÂ ?ŽÂ ?ŽÂ€<ŽÂ@6ŽÂ€<ŽÂ€<ŽÂ€<ŽÂIŽÂ€UŽÂ XŽÂ XŽÂ LŽÂ LŽÂàEŽÂ€UŽÂbŽÂà^ŽÂ@hŽÂ eŽÂ@hŽÂ XŽÂ XŽÂà^ŽÂbŽÂ`kŽÂÀtŽÂàwŽÂàwŽÂÀtŽÂ ~ŽÂ`„ŽÂàwŽÂ qŽÂ ~ŽÂ ŠŽÂ ŠŽÂ`„ŽÂÀŽÂÀŽÂ”ŽÂ —ŽÂ`ŽÂ”ŽÂ`ŽÂ ŠŽÂ ŠŽÂ”ŽÂ`ŽÂ€ ŽÂ€ ŽÂ@šŽÂ £ŽÂ੎­ŽÂ`¶ŽÂ`¶ŽÂ€¹ŽÂ­ŽÂ °ŽÂ °ŽÂ`¶ŽÂ °ŽÂ £ŽÂ@³ŽÂÀ¿ŽÂàÂŽÂàÂŽÂàÂŽÂàÂŽÂÆŽÂ ÉŽÂ`ώ ՎÂ`ώ ՎÂߎÂÀØŽÂÀØŽÂàÛŽÂߎÂàÛŽÂàÛŽÂÀØŽÂ âŽÂàÛŽÂ âŽÂ`èŽÂ€ëŽÂ@åŽÂàôŽÂ€ëŽÂ€ëŽÂ`èŽÂÀñŽÂ îŽÂ ûŽÂøŽÂøŽÂàôŽÂÀñŽÂ@åŽÂ€ëŽÂ`èŽÂ îŽÂ îŽÂÀñŽÂ`èŽÂ îŽÂàôŽÂ îŽÂøŽÂ ûŽÂ@þŽÂ îŽÂ`èŽÂ âŽÂ€ëŽÂ@þŽÂàôŽÂ ûŽÂ€ÂøŽÂ ûŽÂ ûŽÂ ûŽÂøŽÂàôŽÂ` ûŽÂÀ   Âà Âà  €€Â`Â` ûŽÂ îŽÂ îŽÂ îŽÂ îŽÂàôŽÂøŽÂøŽÂ` ÂÀ Âà Âà&    Â@Â`Â@€   Âà&Âà&Â@€€Â Â@€Â` Â`Âà& -Âà& - -ÂÀ#Â@€  Â*Â*Â* - - - 9€6 F FÂÀ<ÂC F F FÂà? F R FÂCÂ`3ÂCÂà?€O€O RÂ`L R€OÂ`LÂàX€OÂà? F F F€OÂ`L€OÂÀUÂ\Â@b€hÂ\ÂÀUÂàXÂ\Â`e€h€hÂ\ÂàXÂ\ÂàXÂ\Â@bÂ`e€hÂ@b€h _ _ _Â`e€h€h kÂàq€hÂ`e€h k xÂàq xÂÀn€hÂ@{Â@{Â`~€Â`~ „ÂàŠÂ ‘Â`~ÂàqÂàq xÂu xŽ „ÂÀ‡ÂàŠÂÀ‡Â`~Â`~ÂàŠÂÀ‡Â ‘ ‘ ‘ÂŽÂàŠÂ`— ‘Â@” Âà£Â Â ªÂ Â Â ªÂ ªÂ€³Â`°Â€šÂà£Âà£Âà£Â ªÂ ªÂ§Â§Â@­Â§Âà£Â ªÂà£Â ¶ÂÀ¹ÂÀÂÀ¹Â ÃÂ@ÆÂ@ÆÂ`É ÏÂ@ÆÂ À̠π̠܀åÂ@ߠܠ܀ÌÂàÕÂàÕ ÏÂàÕÂàÕÂÙÂ`ÉÂ`ÉÂ`ÉÂàՀ̠Ϡܠè ÜÂò€å èÂ`âÂÀë€å€åÂÀëÂàî õ õÂ@øÂòÂò õ õÂàî õÂòÂ@øÂ€þÂàîÂ@øÂ õ õ€þÂàÂ` Â` €Â@€ ÂàÂà€ €€Â` Â`Â`Âà  'Â@*Â`- 'Â@* 3€0 3ÂÀ6Â`-Â@* 3ÂÀ6ÂÀ6Âà9 @ 3Âà9Â`FÂ@C @ @Â`F @Â`F L LÂàR LÂ@\ L€IÂàRÂ`FÂàRÂàR Y YÂàR LÂÀOÂàR LÂàR YÂ`_ YÂàRÂÀO Y e eÂÀh€bÂ`_ Y Y€bÂàR LÂVÂ`_Â`_Â@\ e€b Y YÂV Y eÂ`_Â`_ e€b e eÂ`xÂ`x rÂ@uÂ`x ~ r ~€{ rÂo rÂo rÂàkÂ`x rÂÀhÂoÂ`x ~ ~ ~€{€{ ~ ~ ~€{€{Âà„Â`.”€©²Â€ÈÊÂÀ8ÊÂ`X¿Â ³Â€6¨Â VŸÂ 5˜Â|’ ŠÂÀŠMÂ@øÂïÁîÊÁd–Áå Á ­@¶A·B€4RB@ˆuBÀ°„BÀfˆBs‡Bà#ƒBÀ1yB€@iB€¬WBÀVEB€ 3BÀf!BÓBLBFæAÏËA~³ASAêˆATlA–HA6&A…ApÆ@ü…@Ø @€ >Põ¿À>ÆÀ˜Áu(ÁLLÁ[oÁшÁè™Á€ŽªÁ€»Á€ËÁ€åÚÁ€lêÁ€DùÁÀ¶€; Â@ŽÂÀÂÀ9Âm!Â@#&Â@o*€].Â@ô1Â@5ÂÀ@8Â@ ;ÂÀm=ÂÀ¬?§AÂiCÂÀ EÂ@vFÂÀÇGÂIÂ@EJÂÀKK€&LÂûLÂÀ¼M€eNÂÀOÂÀ°OÂMPÂ@éPÂÀYQÂ@ÊQÂ(R€RÂ@ÝRÂ@(SÂmSÂÑSÂTÂgTÂÀ«T€ UÂ@NUÂzU€¸UÂ@äUÂÀ"VÂ[VÂÀ†V€²VÂÀêVÂÀW€/WÂÀNWÂÀ€WÂÀ™WÂ@¿WÂëWÂ@ X€)XÂÀ/XÂÀHXÂOXÂ@nXÂ@‡XÂ@‡X³XÂÌXÂÀÞXÂÀ÷XÂ0YÂIYÂÀtYÂ@Y”YÂÀ¦YÂÀ¿Y€ëYÂÀ ZÂ*ZÂ@0ZÂÀUZ€hZÂÀnZÂÀ‡Z€ÌZÂ@ßZÂ@[Â@[ÂÀO[Â@u[ÂÀš[º[ÂÀÌ[€ß[Â@ \Â@=\Â@V\ÂÀ{\ÂÀ{\€§\ÂÀÆ\ÂÀß\ÂÀß\Âÿ\€ ]Â@]Â]Â1]Âc]ÂÀu]ÂÀŽ]®]Âà]Âù]€^ÂÀ ^Â+^ÂD^Â]^ÂÀo^ÂÀˆ^ÂÀ¡^Â@Ç^ÂÀì^ÂÀ_Â%_ÂW_Â@]_ÂÀ‚_€•_ÂÀ›_ÂÔ_Â@ `Â`Â@>`ÂÀJ`€]`Â@‰`Â@¢`ÂÎ`ÂÀà`Â@aÂ@aÂ@8aÂÀ]aÂ@jaÂÀvaÂÀ¨aÂÀÁaÂÀóaÂÀ bÂ@2bÂÀWbÂÀWbÂ@KbÂ@KbÂ@}bÂ@¯bÂ@ábÂÀcÂÀcÂ@cÂ@,c€KcÂ@^cŠc€¯cÂ@ÂcÂÕcÂÀçcÂdÂ@&dÂ@?dÂ@XdÂÀ}dÂÀ–dÂÀ¯dÂ@¼dÂ@ÕdÂÀeÂ@ eÂÀEeÂ@keÂ@„e°e€¼eÂ@ÏeÂ@èeÂûeÂ-fÂÀ?fÂÀqfÂÀŠfªfÂÀÕfÂÀÕfÂÀgÂÀ g€3gÂ@FgÂ@xgÂ@‘gÂÀgÂ@ÃgÂ@hÂ!hÂ@@hÂÀLhÂ@rh€xhÂ@¤hÂ@½h€ÜhÂ@i€'iÂÀ-iÂ@SiÂfi€YiÂ@liÂÀ‘iÂÀÃiÂÀÜi€ïiÂ@jÂüiÂjÂ@4j€SjÂ@fjÂyjÂÀ‹jÂ@±jÂÀÖjÂÝjÂ@üjÂÀk€4kÂÀ:kÂ@GkÂ@`k€k€±kÂ×kÂÀékÂÀlÂÀlÂ@AlÂ@slÂÀlÂÀlŸlÂÀ±l€Ýl€ölÂmÂÀmÂ@;mÂgmÂÀym™m€¥m²m€×mÂämÂýmÂ@5n€;nÂÀsnÂ@€nÂ@™nÂÀ¥nÂÅn€ÑnÂ@änÂ@ýn€oÂÀ;oÂÀToÂtoÂ@“o€²oÂÀ¸oÂÀêoÂ@÷oÂÀpÂ@)pÂÀ5p‹ E‹Â`K‹ÂÀT‹Â E‹Â@H‹Âà>‹Â 8‹Â E‹Â@H‹Â€N‹Â Q‹Â@a‹Â€g‹Â€g‹Â ^‹Â€g‹Ât‹ÂÀm‹Âàp‹Ât‹Â€€‹Â`–‹Â€™‹Â€™‹Â@“‹Â œ‹ÂÀŸ‹Â ©‹Â@¬‹Â ©‹Â µ‹Â@¬‹Â ©‹Â¦‹Â ©‹Â`¯‹Â µ‹ÂÀ¸‹ÂÀ¸‹Â µ‹Â໋€ˋ ‹ ‹Â໋Â`È‹ÂÀы€ˋÂàÔ‹Â`á‹Âàí‹Âàí‹Â ç‹Â€ä‹Â ç‹Â ç‹Â ç‹Âàí‹Â@÷‹Â€ý‹ÂÀŒÂ ŒÂ@÷‹Â ŒÂàŒÂàŒÂàŒÂ€ŒÂ`ŒÂ€ŒÂÀŒÂ€ŒÂ€ŒÂàŒÂ`,ŒÂ 2ŒÂÀ5ŒÂà8ŒÂ ?ŒÂ<ŒÂ@BŒÂ ?ŒÂÀ5ŒÂ 2ŒÂ ?ŒÂ<ŒÂ`EŒÂ€HŒÂ€HŒÂàQŒÂ XŒÂàQŒÂ KŒÂ€HŒÂàQŒÂ`^ŒÂ€aŒÂàjŒÂnŒÂ dŒÂ`^ŒÂ€aŒÂàjŒÂ dŒÂàjŒÂ@tŒÂ€zŒÂ }ŒÂnŒÂÀgŒÂ@tŒÂ }ŒÂàƒŒÂàƒŒÂ ŠŒÂàƒŒÂ }ŒÂ }ŒÂàƒŒÂ ŠŒÂ@ŒÂ‡ŒÂ –ŒÂ –ŒÂÀ™ŒÂ ŒÂÀ™ŒÂ€“ŒÂ –ŒÂÀ™ŒÂ –ŒÂ £ŒÂ€¬ŒÂ ¯ŒÂ ¯ŒÂ ¼ŒÂ€ÅŒÂ€ÅŒÂ ¼ŒÂ ¼ŒÂൌ ¼ŒÂ`ÂŒÂ@¿ŒÂ ÈŒÂÒŒÂ`ی€ތ áŒÂ áŒÂ`ÛŒÂ`ÛŒÂ`ی îŒÂàçŒÂàçŒÂ€÷ŒÂ îŒÂàçŒÂ€ÞŒÂ áŒÂ€ÞŒÂ îŒÂ úŒÂ€÷ŒÂàçŒÂ îŒÂ úŒÂ úŒÂ`ôŒÂëŒÂ@ñŒÂ`ôŒÂ îŒÂ@ñŒÂëŒÂ îŒÂ îŒÂ úŒÂ úŒÂ ÂÂÀýŒÂàÂÀýŒÂ úŒÂ€€€Â` ÂÂ@ Âà Âà2€)Â`&Â@#ÂàÂ@#  Â`&Â@#Â`&Âà Âà Â@#€)€)ÂÀ/ ,Â6Âà2 9Â@<Â`?Â6 EÂ@< 9€B€BÂàK€[€[Â`X RÂ@UÂ`XÂ@U ^ÂÀa ^ R RÂ`X EÂ`?Âà2€)€)Âà€Â@ €ÂÂ@ñŒÂ îŒÂ îŒÂ îŒÂ îŒÂ îŒÂ`ÛŒÂҌ Ȍ¹ŒÂൌ £ŒÂàœŒÂ@ŒÂ€“ŒÂ‡ŒÂ }ŒÂ }ŒÂ qŒÂ dŒÂ€aŒÂ XŒÂ KŒÂ XŒÂ KŒÂ€HŒÂ`EŒÂ ?ŒÂ 2ŒÂ€/ŒÂ€/ŒÂ€/ŒÂ &ŒÂàŒÂ`ŒÂ@ŒÂ€ŒÂ`ŒÂ ŒÂ ŒÂ€ý‹Âàí‹Â@÷‹Âñ‹ÂÀê‹Â@Þ‹Â Û‹Â Û‹ÂàÔ‹ÂÀÑ‹ÂØ‹ÂØ‹ÂÀÑ‹ÂØ‹Â Î‹Â@ŋ ‹ ‹ µ‹Â¿‹Â໋Â໋ÂÀ¸‹Â¿‹Â`¯‹Â@¬‹Â ©‹Â¦‹Â œ‹Â¦‹Â@¬‹Â ©‹Â ©‹Âࢋ ©‹Â ©‹ÂࢋÂÀŸ‹Â ©‹Â¦‹Â¦‹Â€™‹Â ‹Â‹ÂÀ†‹ÂÀ†‹Âà‰‹Âà‰‹Â€€‹Â`}‹Â w‹Â`}‹Â w‹Â`}‹ÂÀ†‹Â@z‹Â`}‹Â€€‹Â w‹Â`}‹Â j‹ÂÀm‹Â€g‹Â`d‹Â`d‹Â Q‹Â[‹Â Q‹Â Q‹ÂàW‹Â€N‹Â Q‹Â`K‹Â@H‹Â`K‹Â ^‹Â@a‹Â[‹ÂàW‹Â ^‹ÂÀT‹Â Q‹Â`K‹Â E‹Âà>‹Â`2‹Â@/‹Â ,‹Â ,‹Â ‹Âà%‹Âà%‹Â)‹Â ‹Â ,‹ÂÀ"‹Â ‹Â)‹Â ‹Âà%‹Â ‹Â€‹Âà ‹Â ‹Â ‹Â ‹Â ‹Âà%‹Â)‹Â ‹Â ‹Â ‹Â@‹Â@‹Â@‹ÂÀ ‹Â€‹Â ‹Â ‹Âà ‹Â ‹Â ‹Â úŠÂ úŠÂ€‹Â ‹Â€‹Âà ‹Â@‹Â@‹Â ‹Â@‹Â€‹Â‹Â‹Â ‹Â‹Â ‹Â ‹Âà ‹Â ‹Â÷ŠÂÀðŠÂ@äŠÂ íŠÂàóŠÂàóŠÂàóŠÂ ‹Â`‹Â€‹Â`‹Â`‹ÂàóŠÂàóŠÂàóŠÂ@ýŠÂàóŠÂ úŠÂ€‹Â€‹Â@ýŠÂ úŠÂ÷ŠÂ÷ŠÂ íŠÂ€êŠÂ÷ŠÂ€‹Â ‹Âà ‹Â ‹Â€‹Â@ýŠÂ ‹Â ‹ÂÀ ‹ÂÀ ‹ÂÀ ‹Â€‹Â€‹Âà ‹Â ‹Â‹Â ‹Â€‹Â ‹Â ‹Â ‹ÂÀ ‹ÂÀ ‹Â@‹Âà ‹Â ‹Â ‹Â ‹Â ‹Â ‹ÂÀ ‹Â€‹Â`‹ÂÀ ‹Â ‹Âà ‹Â@‹Â ‹Â‹Âà ‹Â@‹Â ‹Â ‹Â ‹Â)‹Â ‹Â ‹ÂÀ"‹Â ‹Âà%‹Âà%‹Â ‹Â ‹Â ,‹Âà%‹Â ‹Âà%‹Â ,‹Âà%‹Âà%‹Â ,‹Â€‹Â ‹Â ,‹Â ,‹Â 8‹Â€5‹Â ,‹Â ,‹Âà%‹Âà%‹Âà%‹Â@/‹Â@/‹Â 8‹ÂB‹ÂÀ;‹Â E‹ÂÀ;‹Â`2‹Â€‹Â`‹Â€‹Â ‹ÂÀ"‹Â ,‹Â@/‹Â)‹Â@/‹Âà%‹Â€5‹Â 8‹Â`2‹Â ,‹Â`2‹Â 8‹Â`2‹Â`2‹Â 8‹Âà%‹Â@/‹Â€5‹Â€5‹Âà>‹ÂB‹Â€N‹Â€N‹Â`K‹Â E‹Â€N‹Â`K‹Â`K‹Â E‹Â@H‹Â E‹ÂB‹Â E‹Â@H‹Â E‹Â`K‹Â€N‹Â E‹ÂB‹Â 8‹Â 8‹Â 8‹Â 8‹Âà>‹Â@H‹Â E‹Â E‹Â`K‹Âà>‹ÂÀ;‹Â€5‹ÂÀ;‹ÂB‹ÂB‹Â E‹Â E‹Â@H‹Â E‹ÂÀ;‹ÂB‹Âà>‹Â E‹Â Q‹Â Q‹Â€N‹Â€N‹Â`K‹Â€N‹Â€N‹ÂÀT‹Â€N‹Â[‹Â€N‹Â Q‹ÂÀT‹ÂàW‹ÂàW‹Â[‹Â ^‹Â ^‹Â ^‹Â`d‹Â j‹Â j‹Â€g‹Â w‹Â w‹Â@z‹Â`}‹Â€€‹Ât‹Â j‹Â@z‹Â`}‹Âà‰‹Â‹Â€€‹Â€€‹Â€€‹ÂÀ†‹Â@“‹Âà‰‹Â`}‹Â ƒ‹Â@“‹Â ‹Â œ‹Â€™‹Â œ‹Â`–‹Â@“‹Â@“‹Â œ‹Âࢋ¦‹Â ©‹Â ©‹Â œ‹Â ©‹ÂÀŸ‹Âࢋ¦‹ÂࢋÂ`–‹Â`–‹Â ‹Â ©‹ÂÀŸ‹Â ©‹Â µ‹Â µ‹Â µ‹Â@¬‹Â€²‹Â€²‹Â@¬‹Â`¯‹Â`¯‹Â@¬‹Â@¬‹Â€²‹Â໋Â@Å‹Â@ŋ€ˋ€ˋÂ@ŋ ΋Âàԋ€ˋÂ`È‹Â`ȋ€ˋ€ˋ€ˋ ΋Âàԋ€ˋÂ`ȋ¿‹Â¿‹Â`È‹Â Î‹Â Û‹ÂØ‹Â Î‹Â€Ë‹Â Î‹Â ç‹Â ç‹Â@Þ‹Â Û‹Â`á‹ÂÀê‹Âñ‹Âàí‹Â ô‹Â@÷‹Âñ‹Â ô‹Â ô‹Â ô‹Âàí‹Âàí‹Â`á‹Â`ú‹Â ŒÂÀŒÂ ŒÂ ŒÂ€ý‹Â@÷‹Â`ú‹Â@÷‹Â€ý‹Â€ý‹Â€ý‹ÂàŒÂ ŒÂ`ŒÂ ŒÂ`ŒÂ ŒÂ#ŒÂ &ŒÂ#ŒÂ ŒÂÀŒÂàŒÂ€ŒÂ ŒÂ ŒÂàŒÂ &ŒÂ@)ŒÂ &ŒÂ`,ŒÂ`,ŒÂ€/ŒÂàŒÂ`,ŒÂ€/ŒÂÀ5ŒÂ ?ŒÂ@BŒÂ<ŒÂ`EŒÂ€HŒÂ KŒÂÀNŒÂ€HŒÂ ?ŒÂ`EŒÂ ?ŒÂ`EŒÂà8ŒÂ<ŒÂ€HŒÂÀNŒÂÀNŒÂ€HŒÂ€HŒÂ€HŒÂ`EŒÂ@BŒÂ€HŒÂàQŒÂ XŒÂ`^ŒÂ€aŒÂ XŒÂàQŒÂUŒÂ`^ŒÂÀgŒÂ dŒÂÀgŒÂ qŒÂ qŒÂÀgŒÂàjŒÂÀgŒÂÀgŒÂÀgŒÂ qŒÂ qŒÂ@tŒÂ`wŒÂàƒŒÂ ŠŒÂ`ŒÂ€zŒÂÀ€ŒÂ€zŒÂ€zŒÂ }ŒÂÀ€ŒÂàƒŒÂ ŠŒÂ€“ŒÂ€“ŒÂ ŒÂ@¦ŒÂ€¬ŒÂ ¯ŒÂ ¯ŒÂ ¯ŒÂ@¦ŒÂ@¦ŒÂ`©ŒÂ ¯ŒÂ`©ŒÂ`©ŒÂ ¯ŒÂÀ²ŒÂ ¯ŒÂ ¼ŒÂ@¿ŒÂ`ÂŒÂ`Œ ¼ŒÂ ¼ŒÂ ¼ŒÂ ¼ŒÂàÎŒÂ@¿ŒÂàΌ Ȍ Ȍ€Ō ȌÂ@¿ŒÂ@¿ŒÂ ¼ŒÂ€ÅŒÂÀËŒÂàÎŒÂàçŒÂëŒÂàçŒÂàçŒÂëŒÂàçŒÂÀäŒÂ îŒÂ îŒÂ€÷ŒÂ`ôŒÂ`ôŒÂ úŒÂ úŒÂ€÷ŒÂ úŒÂ úŒÂà  ÂÀýŒÂàÂà úŒÂà Â`  ÂàÂà ÂàÂàÂ`&ÂÀ/ , ,Â`&€)€)   , ,€)ÂÓÂ2¯Â "ÇÂÀ´ÆÂ@ê»Â ²¯ÂÀê¤Â`œÂ@ •Â@I€ž†ÂÀoE€—€íÈÁ€Û™ÁÉ3Á°L?G†A€½B€€=BÀ^eB¶}B o„B…BÀ ‚B»xB€jB€Â@³@ÂÀOBÂ@ÓCÂDEÂ@FµGÂ@ÎHÂ@ÈIÂÀµJÂ@ŠKÂeLÂ@3MÂÀîMÂrNÂOÂ…OÂÀûOÂ@lP€ïP€lQ€·Q€RÂ@GRÂ@’RÂðRÂ@(S†SÂÀÊSÂÀTÂ@mTÂÀ’TÂÀÝTÂ/U€†U¬UÂ@äUÂÀ VÂÀ"V€NV€gVÂÀ†V¿V€äVÂÀWÂ@[WÂ@tWÂ@WÂ@¦WÂÒWÂ@ñWÂÀXÂÀ/XÂÀaX€XÂÀ¬X€ñXÂ@YÂ@6YÂIY€UYÂÀ[Y€‡YÂ@³YÂ@åYÂ@þYÂÀ`€v`Â@¢`Â@»`Â@Ô`ÂÀù`ÂaÂÀ+aÂÀDaÂ@ja€‰aÂÈaÂ@çaÂÀ bÂ,bÂÀ>bÂ@dbÂÀ‰bÂbÂÀ¢bÂ@¯bÂ@áb€cÂ&cÂ&cÂ?cÂ@wcÂ@cÂ@©cÂÀÎcÂÀçc€dÂÀ2dÂ@?dÂ@Xd€^dÂ@ŠdÂ@£dÂ@¼d€ÛdÂÀeÂ3eÂÀEeÂeeÂ@ke€qe€£eÂÀÂeÂÀÛeÂÀôeÂÀ fÂ@3fÂÀXfÂ@~fÂ@~f€„fÂÀ£fÂ@Éf€èfÂ@gÂ@-gÂ@FgÂYgÂ@xgÂ@‘gÂ@ªg½gÂïgÂÀhÂÀ3hÂÀLh€xhÂ@‹hžhÂÀ°hÂÀ°hÂ@ÖhÂéh€i€'iÂ@SiÂ@…iÂ@žiÂ@·iÂÀÜiÂÀõiÂ@j€:jÂGjÂ`jÂ@jÂ@˜jÂ@±jÂ@ãjÂ@üjÂÀkÂAk€fkÂ@ykÂ@’kÂÀ·kÂÀÐkÂðkÂ@lÂÀ4lÂTl€ylÂÀ±lÂ@¾lÂ@¾l¸lÂÑl€ÝlÂmÂÀmÂmÂÀGmÂÀym€¥mÂ@ÑmÂ@êmÂ@nÂÀAnÂ@gnÂÀŒn“n€Ÿn€¸nÂÀ×nÂ÷nÂ÷nÂ@oÂÀ;oÂÀToÂ@zoÂÀŸo€²oÂÀÑoÂÀÑoÂñoÂ@pÂÀ5pÂ@[pÂnpÂÀ€pÂÀ²pÂÀäpÂ@#qÂÀ/qÂ@UqÂ@UqÂ@UqÂ@nqÂÀ“qÂ@‡q€¦qÂÌqÂåqÂÀr€#r€#rÂIrÂIrÂbrÂ@hrÂ@r€ rÂÀ¿rÂÀñrÂÀ#s€OsÂusÂusÂÀ‡sÂÀ s§sÂÀÒsÂÀësÂ@*tÂÀ6tÂ@CtÂÀOtÂ@utˆtÂÀštÂ@ÀtÂÀÌtÂ@ÀtÂ@ÙtÂ@ uÂ7uÂ@VuÂiuÂ@ˆuÂÀ”u›uÂ@ºu€Ùu€òu€$vÂ@7vÂ@Pv€ˆvÂÀŽv®vÂ@ÍvÂ@ævÂùvÂÀ w€7wÂ@1wÂÀ=wÂÀowÂÀˆwÂÀ¡w¨w€´w€ÍwÂÀÓw€ÿwÂÀxÂ@DxÂ@vx€|x‰xÂÀ´xÂÀ´xÂÀ´xÂ@ÚxÂíx€ùxÂ@ yÂ@%yÂÀ1y€DyÂÀ1y€]y€vyœyÂ@»yÂÀÇyÂ@ÔyÂÎyÂ@ÔyÂ@íyÂzÂ@8zÂ@8z€WzÂ}z–zÂ@œzÂÀÁzÂÀÚzÂÀózÂÀ {€{Â@2{ÂÀW{ÂÀp{€j{€ƒ{©{ÂÂ{ÂÀí{ÂÀ|Â@,|€2|Â@,|ÂÀ8|€d|ÂÀƒ|Â@|Â@|€¯|ÂÀµ|Â@Â|Â@ô|Â@ }Â@&}€,}ÂÀ2}ÂÀK}€w}Â@Š}€©}¶}€Â}ÂÀÈ}Âè}Â~ÂÀ~Â3~Â@R~€X~Â@k~Â@k~Â@„~Â~~Â@~Â@¶~Â@Ï~Â@Â@Â@Â@3Â@LÂÀ?Â@e€„‘ªÂÀÕÂõÂ@ûÂà€Â€€Â #€Âà5€Âà5€Â@?€Â€E€ÂR€Â@X€Â@X€ÂÀd€Â@q€Â@q€Â`€ÂÀ–€Â€Â ¬€Â ¹€Â`¿€ÂÀÈ€Â`Ø€ÂÀá€Âè€Â@î€Â ë€Âàý€Â@ ÂàÂ@ Âà/Â@9Â`< BÂLÂ`U€q Â~ Â`‡Â šÂ ¦Â ³Â`¹ÂÀÂÂÉ€ÕÂàÞ€î þÂ`‚  ‚‚ ‚Â`‚Âà)‚ <‚ÂàB‚Â`O‚ÂÀX‚ b‚Âx‚ ‡‚Â`š‚ÂংÂÀ£‚  ‚  ‚ ­‚Âà¿‚Â@ɂ Ƃ€ςÂ`å‚Â@₀肠날ø‚Âà ƒÂ ƒÂ@ƒÂà#ƒÂ€3ƒÂà<ƒÂ CƒÂ@ƒÂ@ƒÂ€LƒÂ \ƒÂ`bƒÂrƒÂÀ„ƒÂ`”ƒÂࠃ¤ƒÂࠃ §ƒÂ@ªƒÂ ³ƒÂใ ÀƒÂ ÙƒÂÖƒÂÖƒÂàÒƒÂÀσ كÂàëƒÂ@õƒÂÀ„ „€„Âà„Â`*„ =„€F„ V„ V„€_„Âàh„Âà„€x„ {„Â`u„Â`u„Âà„ ”„Âàš„Âàš„Â@¤„ º„Â`À„Â`À„ÂЄ ߄Â`ò„€õ„ ø„ …€… … …Â`$… *…Â4… C… P… P… \… \…Âf… i… u…Âà{… ‚… ‚… ‚…ÂÀ‘… ›…€¤…Âà­…Âà­…Â ´… ´…Â`º…ÂÊ…ÂÀÃ…ÂàÆ…Â Í…Â Ù…Â æ…€ï…Âàø…Â ÿ…€†Â†Âà†Â $†Â.†Â`7†Â@M†ÂàC†Â V†Â`†Â`i†Â`i†Â o†Â o†Â o†Â o†Âàu†Â@†Â ˆ†ÂàŽ†Â’†Â •†Â`›†ÂÀ¤†Â ®†Â«†Â`´†ÂàÀ†Â`͆ ӆ ӆÂ`æ†Â ì†Â`ÿ†Â ‡Â ‡Â ‡Â +‡Â +‡Â +‡Âà$‡Â`1‡Â D‡ÂA‡Â@G‡Â@G‡ÂàV‡Â P‡Â P‡Â ]‡ÂàV‡Â ]‡Â`c‡Âào‡Âào‡Â`|‡Â ‚‡Â@’‡Âࡇ ¨‡Â ¨‡Â ¨‡ÂÀ·‡Â`LJ Á‡ÂÀ·‡Âງ¾‡Â Í‡Â€Ê‡Â@݇ÂàÓ‡Â`à‡Â€ã‡Âàì‡Â`ù‡Â ÿ‡Â ˆÂÀˆÂ"ˆÂ %ˆÂ@(ˆÂ %ˆÂ 1ˆÂ@AˆÂ JˆÂTˆÂ WˆÂàiˆÂ@sˆÂ pˆÂ`vˆÂ`vˆÂ |ˆÂ |ˆÂ`vˆÂ`vˆÂ†ˆÂ@ŒˆÂ€’ˆÂ`¨ˆÂ`¨ˆÂ ¢ˆÂ@¥ˆÂ€«ˆÂ »ˆÂഈ¸ˆÂ¸ˆÂ€ÄˆÂ@¾ˆÂ ÔˆÂàæˆÂàæˆÂêˆÂàæˆÂêˆÂ àˆÂ@ðˆÂ€öˆÂ€‰ÂÀ‰ÂÀ‰Â ‰Â +‰Â@"‰Â 8‰Â@;‰Âà1‰Â`>‰Â D‰Â€A‰Â D‰Â D‰Â D‰ÂN‰Â Q‰Â ]‰Â@m‰Â@m‰Â@m‰Â ]‰Â`p‰Â`p‰Â v‰Âà|‰Â ƒ‰Â ‰ÂÀ’‰Â œ‰Â œ‰Â@Ÿ‰Â`¢‰Â œ‰Â™‰ÂஉÂ`»‰Â`»‰ÂàljÂ`Ô‰Â`ԉ Ή Ή€׉ ډ ډÂàà‰Âàà‰ÂÀ݉Âä‰Â Ú‰Âàà‰Âàà‰Âàà‰Â ç‰Â  ŠÂàŠÂ ŠÂ ŠÂ ŠÂÀ(ŠÂà+ŠÂ`8ŠÂHŠÂHŠÂ€TŠÂ`QŠÂ WŠÂà]ŠÂaŠÂà]ŠÂà]ŠÂ@gŠÂ€mŠÂ€mŠÂ`jŠÂàvŠÂàvŠÂ }ŠÂ@€ŠÂ`ƒŠÂ ‰ŠÂ –ŠÂ ¢ŠÂ ¢ŠÂ ¢ŠÂ ¢ŠÂਊÂÀ¥ŠÂ ¯ŠÂ€¸ŠÂ`µŠÂ »ŠÂ »ŠÂ »ŠÂàÁŠÂàÁŠÂÅŠÂÀ¾ŠÂ@²ŠÂÀ¾ŠÂ »ŠÂ@ËŠÂ ÈŠÂÅŠÂÅŠÂàÁŠÂ`ΊÂ`Ί ԊÂÞŠÂ`çŠÂàÚŠÂÞŠÂÞŠÂÞŠÂàÚŠÂ@äŠÂ€êŠÂ íŠÂàóŠÂ€‹Â ‹Â ‹Â ‹Â ‹Â`‹Â ‹Âà ‹Â ‹Â ‹Â`‹Âà%‹Â ,‹Âà%‹Â€5‹ÂB‹ÂÀ;‹Âà>‹ÂB‹Â`K‹Â@H‹Â@H‹Â E‹Â E‹Â@H‹Â Q‹ÂàW‹Â Q‹ÂÀT‹Â[‹Â`d‹Â`d‹Â j‹ÂÀm‹Ât‹Â`}‹Â ƒ‹Â w‹Â€€‹ÂÀ†‹Âà‰‹Â ‹Â€™‹Â@“‹Â`–‹Â¦‹Â ©‹Â ©‹Â€²‹Â€²‹Â€²‹Â@ŋ€ˋ ΋Â@Å‹Â`È‹ÂØ‹Â€ä‹Â ç‹Â ç‹Â ç‹Â`á‹ÂÀê‹ÂÀê‹Â Û‹ÂÀê‹Âàí‹Â@÷‹Â€ý‹Â`ú‹Â@÷‹Â€ý‹Â ŒÂ@ŒÂÀŒÂ ŒÂ &ŒÂ`,ŒÂ 2ŒÂ 2ŒÂ 2ŒÂ 2ŒÂ<ŒÂà8ŒÂà8ŒÂ 2ŒÂ<ŒÂ@BŒÂÀNŒÂ`EŒÂ`EŒÂUŒÂàQŒÂàQŒÂàQŒÂ XŒÂ dŒÂnŒÂ dŒÂnŒÂ`wŒÂàƒŒÂ€“ŒÂ@ŒÂ€“ŒÂ ŠŒÂÀ™ŒÂ –ŒÂÀ™ŒÂ –ŒÂ`ŒÂ@ŒÂ ŠŒÂ`ŒÂ £ŒÂ £ŒÂ ¯ŒÂ ¯ŒÂÀ²ŒÂ ¼ŒÂ ¼ŒÂൌ ¯ŒÂ`ÂŒÂàÎŒÂàÎŒÂ`ÂŒÂ`Œ€ŌÂàΌ€ތÂ`ÛŒÂàçŒÂ`ÛŒÂÒŒÂ@، áŒÂ áŒÂàçŒÂ@ñŒÂ îŒÂ îŒÂëŒÂ€÷ŒÂà ÂÀÂà ÂÀÂà ,Â6ÂÀ/Âà2Â`?€B€BÂ6Âà2 9 9€BÂ`?ÂàKÂ@UÂàKÂàKÂàKÂ@UÂ`XÂàdÂàd wÂà}Âà}Âà} wÂà} „Â`ŠÂà}€tÂà}Â@‡Â „€Â@ Â ÂšÂ  €¦Â`£Â@ ÂÀ¬Âà¯Â@¹Â Â€¿Â€¿Â Â ¶Â ÂÂ@¹Â Â ÂÂàÈÂàÈ ÂÂÀÅ ÂÂÌÂ`ÕÂ@Ò Ï ÂÂÌÂÀÅÂàÈ ÂÂàÈÂ`ÕÂ`ÕÂÀÞ€ØÂ ÛÂÀÞ ÛÂÀÞÂàá ÛÂ@ë ô€ñ ô ô ô ô èÂ`î ô ôÂÀ÷ ŽÂþÂ@ŽÂ  ŽÂ  ŽÂÀŽÂ`ŽÂÀŽÂ ŽÂ@ŽÂ &ŽÂ` ŽÂÀ)ŽÂ ŽÂ ŽÂÀ)ŽÂ€#ŽÂ` ŽÂ ŽÂàŽÂ &ŽÂ &ŽÂà,ŽÂ0ŽÂ`9ŽÂ@6ŽÂIŽÂ€<ŽÂ LŽÂ eŽÂ eŽÂ`RŽÂ€UŽÂ@hŽÂà^ŽÂà^ŽÂ qŽÂ€nŽÂ@hŽÂ XŽÂ XŽÂà^ŽÂ eŽÂ@hŽÂ€nŽÂ ~ŽÂ ~ŽÂ ~ŽÂ€‡ŽÂ ~ŽÂ€‡ŽÂ ~ŽÂ`„ŽÂ€‡ŽÂàŽÂ”ŽÂ`ŽÂ —ŽÂ —ŽÂ@šŽÂ@šŽÂÀŽÂ€ ŽÂÀ¦ŽÂ­ŽÂ £ŽÂ £ŽÂ੎Â`¶ŽÂ °ŽÂ`¶ŽÂ੎Â@³ŽÂÀ¿ŽÂ`ÏŽÂ ÉŽÂàÂŽÂÀ¿ŽÂ€¹ŽÂ ÉŽÂ@ÌŽÂ ÉŽÂàÂŽÂ@̎€ҎÂàÂŽÂ ÉŽÂ`ÏŽÂ ÉŽÂÀØŽÂ`èŽÂ`èŽÂ îŽÂ€ëŽÂ`èŽÂ@åŽÂ âŽÂߎÂàێ€ëŽÂÀñŽÂàôŽÂ ûŽÂ€ÂÂà  Â`Â@þŽÂ@þŽÂ ûŽÂøŽÂàôŽÂÀñŽÂ ûŽÂøŽÂ`Â@þŽÂ`Â`ÂÀ Â@  Âà&€Âà&€Âà&Âà&Âà&Â* -Â@0 -Â@0ÂÀ<Âà?ÂÀ<ÂÀ<Âà?Âà?Â@IÂ@bÂ`e _ÂÀUÂÀUÂÀUÂÀUÂàX _ _ _ _€h kÂàqÂ`~ xÂÀn kÂàq€Â`~Â@{ÂÀn kÂàqÂ@{ x xÂ`~ „€ÂàŠÂàŠÂàŠÂ€Â „ÂÀ‡Â „ÂàŠÂàŠÂ ‘ÂŽÂ ‘€šÂ€šÂ`— ÂÀ Â€šÂÀ Âà£Â§ÂÀ Â§Â@­Â ªÂ@­Â ªÂÀÂà¼Â€Ì Ï€ÌÂ`ÉÂà¼Â À̠àÏÂàՀ̠ÃÂà¼Â ÃÂ`É ÃÂ@ÆÂ€Ì ÏÂàÕ Ü Ü Ü ÏÂÀÒ è èÂÀëÂòÂàîÂÀëÂ@øÂ`ûÂ`ûÂ`û Âò€þÂ`û€þ õ€þ€þÂ`ûÂàÂà €þÂ`û€þ€þÂ`ûÂà   Â`ÂàÂà  € Âà € Â`  Â`-€0Â`- 'Â$ 'Âà Â$Â$ÂÀÂÀÂà   € 'Â@* ' 'Â`-Â`- 3€0Âà9€0 3 3€0Â=Â=ÂÀ6Â=Âà9Â@CÂàRÂàR LÂ`F€IÂ@CÂ`F 3ÂÀ6ÂÀ6 @Â@C @€I @ÂÀ6 @Â@CÂ@CÂ@CÂ`FÂàR Y L @ @ @ @ÂÀ6€I€I LÂ`_ e€b e e Y Y€bÂÀh r eÂo e eÂàkÂ`_Â`_Â@\ÂàR YÂ@\Â`_Â`_ eÂàkÂÀh eÂo rÂoÂ`xÂ@uÂÀh rÂ@uÂàkÂoÂàk r ~Â@ŽÂ —ÂÀšÂ`‘Â@ŽÂ@ŽÂ@ŽÂàÂÀšÂ€”Â@ŽÂ ‹Â€”Â`‘ —Â`‘ —€”€” — —¡€­Â °Â`ªÂ ¤Â`ªÂ ¤Â`ªÂ ¤Â@§Â¡Â ¤Â¡Â ¤Â °Â °Â€­Â ¤Â`ªÂ °Âà¶Â`ªÂ@§Â@§Â`ªÂ`ªÂ °Â °ÂàÂÀšÂÀšÂ ¤Â@§Â °Â °ÂºÂà¶Â`à½Â€ÆÂ ÉÂàÏ ÉÂ@ÀÂ@ÀÂà¶ÂºÂà¶ÂºÂà¶Â ½Â ½Â`à½Â ½Â ½Â ½Â É€ÆÂàÏÂ`ÃÂ`ÃÂà¶Â@ÀÂ`ÀÆÂ€ÆÂ€ÆÂÀÌÂÀÌÂàÏÂÓ ÖÂ@Ù Ö ÖÂÓÂÓ Ö€ÆÂàÏÂÓÂ@ÙÂÀÌÂàÏÂÓ€ÆÂ`ÃÂ`ÃÂ@ÀÂ@ÀÂÀÌ€ßÂ@ÙÂàÏ ÖÂ`܀ߠâ âÂàèÂì âÂÀåÂàè âÂàèÂìÂ`õ û€øÂ@ò ïÂ`õ ûÂ@òÂ`õ û‘€‘‘Âà‘ û ‘ ‘€‘Â`‘Â`‘ ‘Â@ ‘Âà‘ ‘Âà‘Âà‘ÂÀþÂ`‘€‘€‘Âà‘Âà‘Â`'‘€*‘ !‘Â`'‘ !‘Â`'‘Â@$‘Â@$‘Âà‘Âà‘Â@$‘ !‘ÂÀ0‘ -‘ :‘ :‘€C‘Â`@‘Â7‘ÂÀ0‘ -‘ -‘€*‘ -‘ -‘ :‘ :‘ :‘ÂÀ0‘Â7‘ :‘Âà3‘ÂÀ0‘ -‘ :‘Â7‘Âà3‘Â@=‘Â@=‘Â`@‘ F‘Â`@‘Â`@‘ F‘ F‘ÂÀI‘Â`@‘ÂàL‘ÂÀI‘ F‘€C‘ÂàL‘ÂàL‘ÂÀI‘ F‘ F‘Â`@‘€C‘ F‘ :‘€C‘ F‘Â`@‘Â@=‘Â@=‘ F‘ S‘Â@V‘Â`Y‘ _‘€\‘€\‘ÂÀb‘Âi‘ÂÀb‘ l‘Â@o‘ x‘Â`r‘ l‘ _‘Âàe‘ _‘Âàe‘Â@o‘ l‘ l‘Âàe‘ x‘ x‘Â`r‘ x‘‚‘ …‘Âà~‘ …‘Âà~‘Â@ˆ‘Â`‹‘Â€Ž‘Âà—‘Â@¡‘ÂÀ”‘Â@ˆ‘Âà—‘Â@¡‘Â`¤‘Â@¡‘ ž‘›‘ÂÀ”‘ ž‘Â€Ž‘Â ‘‘ÂÀ”‘€§‘Â`¤‘ ª‘€§‘Â@¡‘Â`¤‘ ª‘ ª‘ÂÀ­‘ ·‘´‘ÂÀ­‘€§‘€§‘Â`¤‘ ª‘ ª‘ ª‘´‘€§‘´‘ ·‘ ª‘ ª‘€§‘ÂÀ­‘€À‘Â`½‘Â@º‘€§‘ ª‘ÂÀ­‘Â఑´‘ ·‘€À‘Â`½‘€À‘ ÑÂàÉ‘Â`½‘´‘ ÑÂ@Ó‘Â@Ó‘Â@Ó‘Âàɑ ÑÂàÉ‘Â@Ó‘Â`֑€ّÂàɑ БÂ`֑ БÂÍ‘Â`֑ БÂàâ‘ ܑÂ@ì‘Âæ‘ é‘Â`ï‘Âæ‘Âàâ‘Âàâ‘Âàâ‘Âàâ‘Âæ‘ÂÀß‘Âæ‘€ò‘ÂÀø‘Âÿ‘ÂÀ’Â@’ ’Âÿ‘ ’Âàû‘Âàû‘Â`ï‘Â@ì‘Âæ‘€ò‘ õ‘ õ‘ ’Âÿ‘Âàû‘Â@’ ’Â`’Â`’ ’ ’Âÿ‘ ’ ’Âà’€ ’ÂÀ’ ’€ ’Â@’ ’Âàû‘ ’Â@’Â`’Â`’ ’Â`’ ’Â’ ’Âà’Â@’Â`!’Âà’Â@’Â`!’Âà’Â@’ ’ '’€$’€$’Â`!’ '’Âà-’Â@7’ 4’ÂÀ*’Âà-’ÂÀ*’Âà-’ 4’Â1’Âà-’Â`:’ 4’ 4’Â1’Â@7’ @’ @’ÂàF’ @’ 4’ÂàF’ @’Â@7’Â1’Â@7’€=’Â@7’ @’ÂàF’Â`:’ÂÀC’Â@P’Â@P’ Y’€V’ Y’Â`S’ÂJ’ Y’Â@P’Â`S’ @’ÂÀC’Â@P’Â`S’ M’Â`S’ M’ – ­´Â Ì ÒËÂßÀÂ`š´Â ½©Â`Ǡ ¬™ÂÀ”Âà‰‹Â@QÂ,ÂÀ‹€óùÁ€;ÕÁ€£šÁ6 Áx´@M·AžB’QB€btBÀèƒB€‡By†BÀ ‚BùvBÜfB@NUB€*CBÀ81B@ÊB€OBªÿA€KãA€œÉA€,²A‹œA€öˆA¸lA&JA$)A"A¤Î@nŒ@@@>Xü¿ÖƒÀÇÀÁh&ÁƒGÁéhÁ€…Á€•Á€Þ¥Á€x¶Á€•ÆÁ[ÖÁ€£åÁ=ôÁ@ ÂÀéÂ@h‰€&ÂÀrÂÀT$Â@ß(Âó,Â@¯0€4Â7¾9Â<Â<>Â@@€åAÂÀ{CÂ@ÍDÂÀFÂÀcGÂ@jHÂwIÂ@^JÂÀKKÂÀ,LÂâLÂ@—MÂÀ9NÂ@ÃNÂÀeOÂ@ÖOÂÀFPÂ@·PÂ@QÂyQÂÀÖQÂ@.RÂsRÂ×RÂ"S†S€ÄSÂÀT€ZTÂ@ŸTÂÀÝTÂÀAUÂÀZUÂ@™UÂÀ¾U€êU€VÂÀ;VÂ@aVÂ@zVÂÀŸVÂ@ÅVÂÀêVÂ@)WÂUWÂnW€“W¹WÂëWÂ@ X€)XÂ@UXÂhXÂÀzXÂÀ¬XÂÌXÂ@ëXÂ@YÂ@6YÂ@OYÂÀ[YÂ@Y€ YÂÀ¿YÂÀ¿YÂ@åYÂ@þY€6Z€OZÂ@bZÂ@{ZÂÀ‡ZÂÀ ZÂ@ÆZ€þZÂ$[ÂÀO[ÂÀh[ÂÀ[Â@§[Â@§[Â@À[Â@ò[Â@ \ÂÀ0\Â@=\Â@V\ÂÀ{\Â@ˆ\Â@¡\ÂÀÆ\€Ù\Âÿ\Â@]€=]€V]ÂÀŽ]ÂÀ§]Âà]ÂÀò]Â@ÿ]Â@^€7^Â@c^Â@|^ÂÀˆ^ÂÀ¡^ÂÁ^ÂÀÓ^ÂÀ_Â@+_ÂÀ7_ÂÀP_€|_Â@_Â@_Â@¨_Â@Ú_ÂÀ`ÂÀ1`Â@W`Â@p`ÂÀ|`Â@¢`Â@»`ÂÀà`Â@í`Â@aÂ@aÂ@QaÂ}a€‰a€ÔaÂ@çaÂ@bÂ@bÂ@2bÂ@KbÂ@}b©bÂ@ÈbÂ@ÈbÂÀÔbÂÀíbÂôbÂÀcÂ@,cÂ@EcÂ@,cÂ@Ec€}cÂÀœc¼cÂîcÂd€,d€EdÂkdÂÀ}dÂ@ŠdÂ@£dÂÀÈdÂ@eÂÀeÂeeÂ@„eÂ@eÂÉe€ÕeÂ@fÂ@fÂ-fÂÀ?fÂ@LfÂ@~fÂ@—fÂÀ¼fÂÀÕfÂõf€3gÂ@gÂYg€egÂ@‘gÂ@ªgÂÀÏgÂÖgÂïgÂ@õgÂÀh€-h€-hÂ:hÂlh€ªhÂÀ°hÂ@ÖhÂ@iÂ4iÂÀ_iÂ@li€‹i€¤iÂ@ÐiÂãiÂ@éiÂ@j€:jÂ@fjÂyjÂ@˜jÂÀ¤jÂÀ½jÂÀïjÂöjÂÀkÂÀ!kÂ@GkÂÀlkÂÀlkÂÀ…kÂÀ·kÂ@ÝkÂ×kÂ@ökÂ@(l€GlÂÀfl€ylÂ@Œl¸lÂÀ±lÂÀÊlÂ@ðl€(mÂ@;mÂ@Tm€smÂÀ’mÂÀ«mÂ@ÑmÂÀömÂ@nÂ@5nÂÀ(nÂ@Nn€mnÂ@€nÂÀ¥nÂÀ¾nÂÞnÂ@än€oÂ@oÂ)oÂ[oÂ@zo€™o¦o€ËoÂÀêoÂÀpÂ@)pÂzÂ@QzÂdzÂ@ƒz–zÂ@µz¯zÂÀÚzÂúzÂ{ÂÀ>{Â,{Â@K{Â@d{Âw{€ƒ{Â@–{©{€Î{ÂÀí{ÂÛ{ÂÀí{Â@|Â@,|€K|€d|Â@w|€}|€–|ÂÀƒ|Â@|€¯|Â@Û|Â@ô|Â@ } }ÂÀ2}Â9}ÂÀK}€^}ÂÀ}}€}ÂÀ¯}ÂÏ}ÂÀÈ}Â@î}Â~ÂÀ~Â@9~Â@R~Â@k~€Š~ÂÀ~Â@~€¼~ÂÀÛ~Â@è~€Â@ÂF€RÂ@eÂx‘ÂÀŠ‘ÂÀ¼ÂÀÕÂÀîÂ@ûÂ`€Â #€Â`)€Â /€Â9€Â@?€Â U€Â€^€Â n€ÂÀ}€Â`€Â “€Â€Â€©€Â ¬€Â€©€Âಀ Ҁ€ۀÂè€Â ë€Â ë€Â ÷€Â€  €& 6Â@9ÂÀE O€XÂ`UÂàa t  — ÂÀÂ@€£Â ³Â@¶ÂÀ©Âà¬Â`¹Â`Ò ØÂÀô þÂà‚‚ ‚Â`‚Âà)‚Â-‚Â@3‚ÂÀ?‚ÂàB‚ U‚Â_‚ n‚Â@~‚ ‡‚Âà‚Â@—‚Â@—‚  ‚Âংª‚ ­‚Â@°‚ ƂÂàØ‚Â ß‚Â@â‚ÂÀî‚Âàñ‚ ë‚Â@û‚ÂÀƒÂ@ƒÂ`0ƒÂ@ƒÂ`IƒÂàUƒÂàUƒÂÀRƒÂ€eƒÂrƒÂ uƒÂà‡ƒÂ@‘ƒÂ@‘ƒÂ šƒÂ¤ƒÂ€°ƒÂ ³ƒÂใ ÀƒÂ@à̃ ك åƒÂïƒÂ þƒÂ`„€„Â`„Â`„ $„Â`*„ 0„Âà6„Â`C„ÂS„Â`\„Âàh„ÂÀe„€x„Â@‹„€‘„Âàš„ÂÀ—„Â`§„·„ º„ Ƅ ƄÂ`À„ ƄÂàÌ„Â`Ù„Âàå„ ì„€õ„Âàþ„€…ÂÀ… … *…Â@:…Â@:… 7…ÂÀF…Â@S…€Y…Âàb…Âf…Â@l…ÂÀx… u… u…Âà{…Â@……˜…Â@ž…Â୅€½…ÂàÆ…Â€½…ÂÀÃ…ÂÀÃ…Â`Ӆ€օÂàß…Â`ì…Âàø…Âü…Â`†ÂÀ†Â`†Â@†Â`†ÂÀ'†Â 1†Â`7†Â =†Â€S†Â€S†Â€S†Â c†Âàu†Ây†Â |†Â€…†Â`‚†ÂàŽ†Â`›†Â€ž†Â৆«†ÂĆ ӆÂÀÖ†Âàن€é†Âàò†Âö†Â ù†Â`ÿ†Â€‡Â‡Â ‡Â€‡Â€‡Â€‡Â ‡Â@.‡Â 7‡Â D‡Â P‡ÂàV‡Â`c‡Â`c‡Â€f‡Â`|‡Â`|‡Â`|‡Â@y‡Â`|‡ÂÀ…‡Âàˆ‡Â ‡Â ‡Â`•‡Â ¨‡Â`®‡ÂງÂ`LJÂÀЇÂ`à‡Â@݇Â`à‡Â æ‡Â ó‡Â ÿ‡Â`ˆÂ ˆÂ ˆÂÀˆÂ %ˆÂ@(ˆÂÀ4ˆÂ€GˆÂ@AˆÂ WˆÂàPˆÂ JˆÂ`DˆÂ JˆÂ JˆÂÀMˆÂ`]ˆÂÀfˆÂ pˆÂ€yˆÂ |ˆÂ ‰ˆÂ •ˆÂ •ˆÂ •ˆÂà›ˆÂà›ˆÂ`¨ˆÂÀ±ˆÂ¸ˆÂ`ÁˆÂ ÇˆÂ@׈ÂàæˆÂ@ðˆÂ íˆÂ íˆÂ íˆÂ íˆÂàÿˆÂ ‰Â@ ‰Â@ ‰Â` ‰Â@ ‰ÂÀ‰Â ‰Â€(‰ÂÀ.‰ÂÀ.‰Âà1‰Â D‰Â D‰ÂàJ‰Â`W‰ÂàJ‰Â D‰Â D‰ÂàJ‰Â ]‰Â€s‰Âà|‰Â ‰Â ‰Âà•‰Â™‰Â@Ÿ‰Â`¢‰Â ¨‰ÂஉÂÀ«‰ÂஉÂ`»‰Â²‰Â µ‰Âஉ µ‰Â€¾‰Â Á‰Â€×‰Â€×‰Âàà‰Âä‰Â ç‰Â ç‰Âý‰Â`ŠÂàŠÂ€"ŠÂŠÂ ŠÂ ŠÂ`ŠÂ/ŠÂ %ŠÂ`8ŠÂ >ŠÂàDŠÂ€TŠÂ`QŠÂ`QŠÂ`QŠÂ€TŠÂ WŠÂà]ŠÂ dŠÂ€mŠÂ }ŠÂ }ŠÂ`ƒŠÂÀŒŠÂ@™ŠÂàŠÂ`œŠÂ€ŸŠÂ ¢ŠÂ ¯ŠÂ`µŠÂ€¸ŠÂÀ¾ŠÂ€¸ŠÂÀ¾ŠÂ ÔŠÂàÚŠÂ áŠÂ áŠÂÞŠÂàÚŠÂ áŠÂ@äŠÂ@äŠÂ€êŠÂ áŠÂ`çŠÂÀðŠÂ úŠÂ`‹ÂÀ ‹Âà ‹Â ‹ÂÀ ‹Â€‹Âà ‹Âà ‹Â ‹Â€5‹Âà>‹Â€N‹ÂàW‹Â ^‹Â Q‹Â@a‹ÂàW‹Â`d‹ÂÀm‹Âàp‹Â@z‹Â w‹Â ƒ‹Âà‰‹Âà‰‹Â ‹Â@“‹Â œ‹Â`–‹Â`–‹Âà‰‹Â`–‹Â œ‹Â`¯‹Â ©‹Â໋Â໋ µ‹Â ‹Â@Å‹Â@ŋ ΋ ۋÂ`á‹ÂÀê‹Âàí‹Âàí‹Âàí‹ÂÀê‹Âàí‹Âàí‹Â`ú‹Â ŒÂ€ý‹ÂÀŒÂ ŒÂ ŒÂ &ŒÂÀŒÂÀŒÂ#ŒÂ 2ŒÂ 2ŒÂ ?ŒÂ`EŒÂ KŒÂàQŒÂàQŒÂ`^ŒÂ€aŒÂ XŒÂ`^ŒÂ XŒÂUŒÂ`^ŒÂÀgŒÂÀgŒÂ qŒÂnŒÂ qŒÂ‡ŒÂ ŠŒÂ€“ŒÂ –ŒÂÀ™ŒÂ ŒÂ £ŒÂ £ŒÂ€¬ŒÂ ¯ŒÂÀ²ŒÂ ¼ŒÂ`Œ€Ō€Ō€Ō ¼ŒÂ€ÅŒÂàΌ áŒÂëŒÂàçŒÂ€ÞŒÂàçŒÂÀäŒÂëŒÂ@ñŒÂ`ôŒÂ€÷ŒÂ  € Â`& ,ÂÀ/ÂÀ/ , ,Â@< E EÂ@< E€BÂÀH E RÂàd€[ÂÀa ^€tÂÂÀzÂÀzÂÂà}Â`ŠÂ Âà–ÂÀ“Âà–šÂà–  €¦Âà¯Â ¶Â`¼Â@¹Â`¼Â@¹Â³Â`¼ÂÀÅÂÌ Ï ÛÂàá Û Û ÛÂå è ôÂþ ŽÂ ŽÂ€ ŽÂ€ ŽÂàŽÂ@ŽÂ ŽÂ` ŽÂ &ŽÂà,ŽÂ &ŽÂà,ŽÂà,ŽÂ€<ŽÂ`9ŽÂ LŽÂ ?ŽÂÀBŽÂ€<ŽÂàEŽÂ`RŽÂbŽÂ`RŽÂÀ[ŽÂà^ŽÂ€nŽÂ`kŽÂ€nŽÂ qŽÂ€nŽÂ qŽÂ ~ŽÂ ~ŽÂ{ŽÂÀtŽÂ@ŽÂÀŽÂ ŠŽÂ ~ŽÂ`„ŽÂ ŠŽÂ@šŽÂ £ŽÂ੎Â੎ °ŽÂ­ŽÂ °ŽÂ੎­ŽÂ °ŽÂ`¶ŽÂ ¼ŽÂ ÉŽÂ@ÌŽÂ@ÌŽÂ ÉŽÂÆŽÂ`ώ€ҎÂàÛŽÂÀØŽÂߎ€ëŽÂ`èŽÂ@åŽÂ îŽÂøŽÂ`ÂÀñŽÂ@þŽÂ ûŽÂ@þŽÂ Âà  Âà  Â ÂÀ    ÂÀ#€€Â* 9Â`3ÂÀ<€6ÂÀ< FÂ`L R€O RÂ`LÂÀUÂàX _Â@b kÂÀn€h€h€h kÂuÂ@{Â`~ xÂ`~ „ ‘ ‘ÂàŠÂ`—€šÂ`—   ªÂ€³Â€³Â€³Âà£Âà£Âà£Â€³Â€³Â ¶Âà¼Â`ÉÂàÕ ÏÂàÕÂ`âÂàÕÂàÕÂ@ßÂ@ß ÜÂ@ßÂ@ßÂ@ß èÂÀëÂòÂàîÂÀëÂÀë èÂòÂ`û ÂàÂà  Â@   Âà €0 ' 3ÂÀ6Â@CÂ`FÂ=Â@CÂ`FÂàRÂàRÂ@\ Y YÂàRÂVÂàR L YÂàR YÂ@\ L Y L€IÂ@CÂàRÂÀOÂV Y YÂ@\Âàk r rÂo€{ ~€{ ~Âà„ˆÂ@ŽÂ`‘ —Â@ŽÂ —ÂÀšÂà —¡Â@§Â`ªÂÀ³Â`ªÂÀ³Â °ÂÀ³Â °Âà¶Â`ÀÆÂ€ÆÂàÏ ÖÂ@ÙÂÓÂàÏ ÉÂàπߠÖÂ`Ü âÂÀåÂàèÂÀå€ß ÖÂÓÂÓÂ`Ü â âÂàèÂàè â â âÂàèÂà‘Â`‘€‘Â@ ‘Â`‘ ‘Â@ ‘Â`‘Âà‘ÂÀ‘ ‘Âà‘Âà‘‘Âà‘ ‘ ‘€‘ÂÀ‘Âà‘Â@$‘ !‘Âà3‘€*‘ -‘ -‘Â`'‘Â`'‘€*‘ -‘Âà3‘Â`@‘ :‘€C‘ :‘ F‘ÂÀI‘ F‘ÂàL‘ F‘ F‘ÂP‘ F‘ÂàL‘ÂP‘ÂàL‘ F‘ÂàL‘ÂàL‘ F‘ S‘Â@V‘Â`Y‘Âi‘Âàe‘ l‘€u‘€u‘Âi‘Â`r‘ l‘ l‘Â`r‘ x‘ÂÀ{‘ÂÀ{‘Âà~‘ …‘‚‘Âà~‘Âà~‘Â`‹‘ ‘‘ ‘‘Âà—‘Â ž‘Â`¤‘ ž‘ ž‘Â@¡‘ ª‘ ª‘Â఑€§‘´‘´‘ ·‘ ·‘ ·‘Â@º‘ Ñ€À‘Â@º‘Â఑€À‘€À‘ÂÀƑ Ñ ·‘Â`½‘ Ñ€À‘Â`½‘Âà°‘Â@º‘ÂÀÆ‘Âàɑ БÂàÉ‘ÂÍ‘ÂàÉ‘Â`½‘Â@º‘Â͑ БÂ@Ó‘Âàâ‘ÂÀß‘Âæ‘ é‘Âæ‘ ܑÂÀß‘Âæ‘Â@ì‘ õ‘ ’ ’Â@’Â`’€ ’ ’Âàû‘€ò‘€ò‘Âàû‘Âÿ‘ ’€ ’€ ’Âà’Âà’ ’Â`!’ÂÀ’Âà’Âà’ ’Â’ '’Â@’ '’€$’Â`!’ ’Â’ÂÀ’€$’ '’€$’Âà-’Âà-’ 4’ 4’Â`:’€=’Â@7’Â@7’Â1’€=’ÂÀC’ÂJ’ Y’€V’ Y’Â`S’Â@P’ÂàF’ÂàF’Â`S’€V’Â`S’Â@P’ Y’ÂÀ\’Âc’Â@i’ f’ÂÀ\’Â`S’€V’ Y’Âà_’ÂÀ\’ Y’Âc’ f’Âc’Â`l’Âc’Âà_’Â@P’ Y’Âc’Â`l’€o’ r’ÂÀu’ÂÀu’Âàx’ r’Â`l’Â@i’€o’ r’Â|’ ‹’€ˆ’€ˆ’Â@‚’ ’Âàx’Â`l’Âàx’ ’ ’Â`…’Â@‚’Âàx’Â`…’ ’ ’Âàx’Â`…’€ˆ’Âà‘’Â€ˆ’ ‹’Âà‘’Â ‹’ ’•’Âà‘’Âà‘’Â@›’Âà‘’Â ˜’Âà‘’Âà‘’Â•’ÂÀ§’Â઒ ˜’€¡’ÂÀ§’Â઒Â઒®’ ±’ ±’ ±’ ¤’Â`ž’Â`ž’Â`ž’ ˜’Â@›’Â઒ ±’Â઒ÂÀ§’Â@´’Â`·’€º’Â`·’Â઒Â`·’ ½’ ½’ÂàÃ’ÂÀÀ’ÂÀÀ’ÂàÃ’ÂÇ’Â Ê’Â`·’Â઒®’ ±’€º’ ½’Â@͒ ʒ€ӒÂ`В ½’ ½’Â`Ð’Â Ê’Â@͒ ֒€ӒÂ`В€Ӓ€ӒÂ`В ֒ ֒Â@Í’Â`Ð’Â`Ð’Â Ê’ÂÇ’Â Ê’Â`Ð’Â@Í’Â@͒€ӒÂ`В€ӒÂÀْ ֒ ֒Â`Ð’Â`Ð’Â Ê’Âǒ ʒ ֒ ֒ÂÀْ€ӒÂàÜ’ÂÀْ€ӒÂà’Â`é’ÂÀò’Â`é’ÂàÜ’Âà’ ã’Â@æ’€ì’ÂÀò’€ì’Â`é’Â`é’Â@æ’€ì’Âàõ’€ì’ ï’ ï’Â@æ’Â`é’Â`é’Â@æ’Â`é’ ã’Âà’Â`é’Â`é’Â`钀쒠ï’Âàõ’ ü’Âàõ’ ü’Âàõ’Âàõ’ ï’Âù’ ï’Âàõ’Âàõ’Âàõ’ÂÀò’ ï’ ï’ÂÀò’Â`“Â@ÿ’ ü’Âù’Âàõ’Âàõ’ ü’ ü’Â@ÿ’Âù’Âàõ’ ü’ ï’Â@æ’Â@æ’Âù’Âù’ÂÀ ““ “Â@“€“Âà“€“ “Âà“Âà“Â`“€“““Âà“Âà“ÂÀ “Âà“ ““ ““ ““ !“ !“ !“ !“Â`“ “Â@“ !“ !“ÂÀ$“ !“ .“ .“Â`4“Â@1“Â+“Âà@“ÂÀ=“ :“ :“ :“Â`4“ÂÀ=“ :“Â@1“Â+“€7“ÂÀ=“ :“Âà@“ÂD“Â`4“Â`4“Â`4“ :“Â@1“ .“€7“Â+“Â@1“Â@1“Âà@“ :“Â`4“€7“ :“ G“Â]“€P“€P“€P“ÂàY“ÂàY“Â]“ÂÀV“ÂÀV“ S“ÂàY“ `“Â]“€P“ S“ÂÀV“ÂÀV“ `“ `“ÂàY“ÂàY“ÂÀV“ `“Â@c“ l“ l“Âàr“€i“ `“ `“Â@c“ l“ y“Âàr“€i“ l“€i“Â@|“ÂÀo“ l“ y“Â`“ y“Âv“ l“ÂÀo“ l“€i“ l“ÂÀo“ `“Â@c“Â`f“ y“Â`“€‚“€‚“Â`“Âàr“Â@|“Âàr“€‚“Â@|“Â`“Â@|“Â`“Â`“ …“ y“ y“ y“€‚“Âà‹“ÂÀˆ“Â`“ y“ …“ ’““ …“ …“€‚“ÂÀˆ“ÂÀˆ“Â@•“Â@•“ ž“ ž“ ž“ ’“ ’“ ’“Â@•“ ’““Â`˜“ …“ …“Â`˜“Â`˜“Â`˜“Â@•““ ž“ÂÀ¡“ ž“Â`˜“ ž“ ’““ÂÀˆ““Â@•“Â`˜“Â@•“ÂÀˆ“ …“€›“Â`˜“Âओ ž“Â`˜“Â@•“ÂओÂओÂ`˜“¨“ÂÀ¡“ «“ÂÀ¡“ÂÀ¡“¨“¨“Â@®“¨“ ž“€›“€›“ÂÀ¡“Â`±“Â@®“Â`±“€´“ ·“ ēÂÁ“ÂÁ“ÂÁ“ ēÂནÂན ·“ÂÀº“ ē ē ēÂÁ“ÂནÂན ē€͓ÂÀÓ“ÂÀÓ“ÂÀӓ€͓ÂàÖ“ÂàÖ“ÂÀÓ“ÂÀÓ“ÂÚ“ÂÚ“ÂàÖ“Â@à“ ݓ€͓ÂÁ“ÂÀº“ ē ē Г ݓ ݓÂ`ã“ ݓÂ`ã“Â`ã“Â@à“ÂàÖ“ÂàÖ“ÂàÖ“Âà֓ ݓ ݓ€͓Â`ʓ€͓ ГÂà֓€͓€͓Â@Ç“Â`Ê“Â@à“Â@à“Â@à“Â@à“Âà֓ ݓ Г ݓÂÀÓ“ÂàÖ“Â “—¶ ÆÍÂ@Í 3ÂÂàëµÂ`«Â€(¢Â›ÂÀc•ÂàçŒÂ@ TÂ@èÂ@ñ ÂÀ!€/ðÁ€T¼ÁeÁ(Ò¿˜iAÉþAŸ:BLeBÀ¼BÀ@†BA‡Bl„B€Â}B@oBÀV^B—LB€«:B€)B@^BÀ˜B$ôAIÙA€‡ÀAªAµ•A€¶‚AÈaAI@A’AFÿ@0À@L@¤@H<üÀZ‡ÀèËÀmÁ¡)ÁKÁ5mÁ€˜‡Á€d˜Á€þ¨Á€±¹Á?ÊÁ€6ÚÁéÁ€øÁõ€¥ €þ€óÂ@~€± Ân%Â@À)ÂÀ´-€d1Â@°4Â@…7Â@(:Â@™<ÂÀË>ÂÀ¿@ÂÀšBÂÀCDÂÀºEÂ@ GÂ@H€8IÂ@,JÂ@ KÂèKÂÀÂL€„MÂÀ9N€âNÂÀeOÂÀûOÂ@lPÂ@éPÂ`QÂ@ÊQÂ@.R€±R€.SÂÀSÂÑSÂ5T€sTÂ@¸TÂÀöTÂÀAUÂÀsUÂÀ¾UÂ@V€NVÂÀ†VÂÀŸVÂÀÑVÂñVÂ@WÂÀ5WÂUWÂ@tW€¬WÂÀ²WÂÀäW€XÂ6XÂXšXÂÀÅXÂÀÞXÂÀ÷XÂYÂ@6YÂ@hY”Y€¹YÂÆYÂ@ÌYÂÀñYÂÀ ZÂÀ{€Q{ÂÀp{€ƒ{Â@–{ÂÀ»{ÂÀÔ{€ç{ |ÂÀ|€2|ÂÀ8|ÂÀj|ÂÀƒ|€–|Â@Â|€È|ÂÀç|€}Â@&}Â9}Â@X}€w}Â@Š}Â@£}€©}€©}ÂÀÈ}Â@Õ}€Û}ÂÀú}Â@ ~Â3~ÂL~ÂÀw~Â~~Â@k~ÂÀ~ÂÀ©~Â@¶~Â@Ï~ÂÀô~ÂÀ ÂÀ Â@Â@3€R€R€kÂx‘ÂÀ£€¶Â@°ÂÜÂ@âÂà€Â€€Âà€Âà€Â€,€Â /€ÂÀ2€Â <€ÂÀK€ÂàN€Â@X€Âk€Â@q€ÂÀ}€Â„€Â`€Â  €Â@£€Â ¬€Â`¿€Â Ò€Âàˀ ހ ހÂàä€Â ë€Â ÷€Â@€ Â`   )Â`<€? B OÂ`n Â`‡Â€ŠÂ šÂ` ÂÀ©Â°Â€¼ÂÀ ̠ØÂ ØÂâÂ@èÂà÷Â@‚  ‚Â@‚ #‚ 0‚ÂàB‚ I‚ U‚ b‚Â`h‚Â@e‚€k‚ {‚ ”‚  ‚ª‚€¶‚Âà¿‚Âà¿‚Â@ɂ ߂ ë‚Âàñ‚Âõ‚€ƒÂƒÂ`ƒÂ ƒÂ'ƒÂ'ƒÂ`0ƒÂ 6ƒÂ@FƒÂ€LƒÂ`bƒÂànƒÂ ƒÂ ŽƒÂ@‘ƒÂ šƒÂ¤ƒÂ §ƒÂ ³ƒÂ ÀƒÂÀσÂ`߃ åƒÂ€âƒÂ òƒÂ þƒÂ þƒÂ@„ „Â`„€„Â@'„ÂÀ3„Â`C„ÂàO„Â@Y„ b„Âl„Â`u„Âàh„Â`u„ ˆ„€‘„Âàš„Â`§„ ­„ ¡„€ª„ º„ÂÀÉ„ÂЄÂÀâ„ ì„ÂÀû„ ø„ ø„Âàþ„Âà…Â…Â… *…Âà0…Â@:… 7… C…ÂàI…Âf…Âf…Âf… i… i…Â@l…Â`o…Â`ˆ…Â@ž…€¤…Âà­…Â ´…ÂàÆ…ÂàÆ…Â À…ÂÊ…Â Í…Â`Ó…ÂÊ…Â`Ó…Â`ì… æ…Â`ì…Â`†ÂÀ†Â †Â`†Â€!†Â@†Â $†Â€!†Â.†Â€:†ÂÀ@†ÂàC†Â`P†Â`†Â€l†ÂÀr†Â@†Â@†Â |†Â ˆ†Â€ž†Â ¡†Â`´†ÂàÀ†Â Ó†Â Ó†Â à†Â@ã†Â à†Â ì†Âö†Â€‡Â€‡Â ‡Â€‡ÂÀ‡Âà ‡ÂÀ!‡Â@.‡Â`1‡Â€4‡Â 7‡Â 7‡Â`J‡Â€M‡Â`J‡Â P‡Â P‡Â ]‡Â i‡Âào‡Â v‡Â@y‡Âàˆ‡Â`•‡Â@«‡Âງ ´‡Â¾‡Â¾‡Â Á‡Â Í‡ÂÀЇÂàӇ ڇ æ‡Â`à‡Âð‡ÂÀé‡Âð‡ÂàˆÂ ˆÂ ˆÂ"ˆÂ@(ˆÂ 1ˆÂà7ˆÂ@AˆÂ`DˆÂTˆÂàPˆÂ`]ˆÂàiˆÂ`vˆÂ`vˆÂ |ˆÂ†ˆÂ ‰ˆÂ •ˆÂ ¢ˆÂà›ˆÂà›ˆÂ@¥ˆÂ »ˆÂÀ±ˆÂ »ˆÂ@¾ˆÂ`ÁˆÂÀʈÂшÂ@׈€݈€݈ÂêˆÂ`óˆÂ`óˆÂÀüˆÂ ‰Â ‰Â€‰Â ‰Â`%‰Â€(‰Â 8‰Â D‰ÂàJ‰ÂÀG‰Â Q‰Â`W‰Â ]‰Â j‰Âg‰Â j‰Â v‰Â€‰Â ƒ‰Â€‰Â`‰‰Â@†‰Â ‰Â`¢‰Â€¥‰Â€¥‰ÂஉÂ`»‰ÂÀĉ€¾‰ÂàljÂˉ ΉÂÀ݉Âä‰Âä‰Â@ê‰Â€ð‰Â ç‰Â ŠÂ  ŠÂÀŠÂÀŠÂŠÂ  ŠÂ  ŠÂ ŠÂ ŠÂà+ŠÂ 2ŠÂ@5ŠÂ/ŠÂ€;ŠÂ€;ŠÂ€;ŠÂàDŠÂ KŠÂ WŠÂ€mŠÂàvŠÂàvŠÂ@€ŠÂ@€ŠÂ }ŠÂ`ƒŠÂàŠÂ@™ŠÂਊ ¯ŠÂ ¯ŠÂਊÂਊÂ@²ŠÂ`µŠÂ ÈŠÂ ÈŠÂÅŠÂ`Ί€ъÂ@ˊ ԊÂÞŠÂ áŠÂ`çŠÂ íŠÂ`çŠÂ€êŠÂ íŠÂÀðŠÂ íŠÂ`‹Â€‹Â€‹Â ‹Â ‹Â‹Â`‹Â ‹Â€‹Â€‹Â@‹Â@‹Âà%‹Âà%‹Â`2‹Â)‹Â ‹Â ‹Â)‹Â ,‹Â)‹Âà>‹ÂB‹Â E‹Â E‹Â`K‹Â Q‹ÂÀT‹ÂàW‹Â ^‹ÂàW‹Â`d‹Â€g‹Â w‹Ât‹Â`d‹Âàp‹Â w‹Âàp‹ÂÀ†‹Â`}‹Â€€‹Â`}‹Â ƒ‹ÂÀ†‹ÂÀ†‹Â ‹Â ‹Â œ‹Âࢋ œ‹Âࢋ ©‹Â`¯‹Â໋ ‹Â໋ÂÀ¸‹Â`¯‹Â¿‹Â ‹Â`ȋ€ˋ ۋÂàí‹Â ç‹Â€ä‹Â ç‹ÂÀê‹ÂÀê‹ÂÀê‹Â ô‹Â`ú‹Â`ú‹ÂàŒÂàŒÂ ŒÂ ŒÂ€ŒÂ &ŒÂ &ŒÂ &ŒÂ &ŒÂ 2ŒÂ 2ŒÂ`,ŒÂ€/ŒÂ 2ŒÂ 2ŒÂà8ŒÂ<ŒÂÀ5ŒÂ`EŒÂ<ŒÂ ?ŒÂ`EŒÂ€HŒÂÀNŒÂ XŒÂ€aŒÂàjŒÂnŒÂ`wŒÂ`wŒÂ qŒÂ }ŒÂ }ŒÂàƒŒÂ ŠŒÂàƒŒÂ‡ŒÂ ŠŒÂ€“ŒÂàœŒÂ ŒÂ ŒÂ@¦ŒÂàœŒÂ –ŒÂ ŒÂ€¬ŒÂ€¬ŒÂ€¬ŒÂ€¬ŒÂ ¯ŒÂ@¿ŒÂ@¿ŒÂ ÈŒÂàΌ ՌÂàΌ Ռ Ռ ՌÂ@، áŒÂ€ÞŒÂëŒÂÀäŒÂ€÷ŒÂ ÂÂàÂÀýŒÂà   ÂÀ  ,ÂÀ/ÂÀ/ , ,Âà2Â`?ÂÀHÂOÂÀHÂÀH E E E E RÂ@n k kÂà}ÂÀzÂÂà}€Â`ŠÂÀ“Â`ŠÂ Â ÂÀ“Âà– „Â@‡Â€Â@ Â³Âà¯Âà¯Âà¯Â ¶ÂàÈÂÌ€¿ÂàÈÂàÈÂàÈ ÏÂ@ÒÂàá èÂ@ëÂ`î èÂ`îÂàá ôÂàúÂþ ô ôÂ@ŽÂ`ŽÂ ŽÂŽÂ  ŽÂ@ŽÂ &ŽÂà,ŽÂ 3ŽÂ 3ŽÂà,ŽÂ0ŽÂ`9ŽÂ ?ŽÂÀBŽÂ@OŽÂ€UŽÂ XŽÂ`RŽÂ XŽÂ`RŽÂ`RŽÂ`RŽÂbŽÂ XŽÂÀ[ŽÂ€UŽÂ XŽÂ eŽÂbŽÂà^ŽÂ€UŽÂ XŽÂbŽÂ@hŽÂ€nŽÂàwŽÂ{ŽÂ ~ŽÂ qŽÂ`kŽÂÀtŽÂ`„ŽÂ”ŽÂÀŽÂÀŽÂÀŽÂ€‡ŽÂÀŽÂÀŽÂ —ŽÂ —ŽÂ —ŽÂ€ ŽÂ £ŽÂ £ŽÂ੎ÂÀ¦ŽÂ€ ŽÂ °ŽÂ@³ŽÂ­ŽÂ@³ŽÂ ¼ŽÂ@ÌŽÂ`ÏŽÂ@̎€Ҏ€ҎÂߎÂàÛŽÂàÛŽÂ âŽÂ@åŽÂ`èŽÂ îŽÂÀñŽÂ`ÂÀ Â`€ÂøŽÂøŽÂ ûŽÂ` Â`  Âà&ÂÀ# Â@Â@    -ÂÀ#ÂÀ# - 9Âà?ÂÀ< F FÂC FÂCÂà? FÂÀ< F€OÂ\ _Â@bÂ`e€hÂ@bÂ\ _ÂàXÂ\Â@b _Â@b RÂ@b k€h xÂ`~€ „ÂàŠÂàŠÂŽÂàŠÂ „ „ÂàŠÂ`—ÂÀ ÂÀ Â€šÂ Â ÂÀ Âà£Â Â€šÂ€šÂ€šÂ Â€šÂÀ Â§Âà£Â€³Â ªÂ`°Â€³Â ¶Â€³Â@­Â@­Â€³Â ¶Â ¶Â ¶Â€³Âà¼ÂÀ¹ÂÀÂ`ÉÂ`ÉÂ@ÆÂ`ÉÂ`É ÏÂ`ɀ̀å èÂàÕÂÀÒÂÀë€å èÂ`â Ü€ÌÂ`â õ õÂ`ûÂÀëÂ@ß ÜÂàî õÂÙÂàîÂàî ÂàÂÀÂà  ÂÀÂàÂ`ÂÀÂà  'ÂÀÂà  'Â`-Â`-Â`- 3ÂÀ6ÂÀ6Âà9 @ @ @ @ @Â@CÂ@CÂàR Y eÂ`_ÂV LÂÀOÂ@\ eÂ@\ e eÂ`_Â`_ YÂ@\€bÂàk€{Â`x rÂoÂ`x rÂo rÂoÂ@u€{ ~€{€{ ‹Â`‘ÂÀšÂ —ÂàÂࠤ ¤ÂàÂà — ¤Â ¤Âà€”¡ ¤Â`ªÂ °ÂºÂà¶Âà¶Âà¶Â ½Â@À ½Â€ÆÂ€ÆÂ@À€ÆÂ ÉÂÀÌÂÓÂ@ÙÂ`Ü â âÂÀåÂÀåÂàè âÂ`Ü Ö âÂàèÂàè ï ïÂ@ò ïÂìÂàèÂÀåÂÀåÂÀå û€øÂ`õ€øÂ@òÂ`õ û ‘ ‘Â@ ‘ ‘Â`‘€‘ÂÀ‘€‘Âà‘‘ !‘ !‘Âà‘ ‘ ‘Âà‘ !‘ÂÀ0‘Â@=‘Â@=‘Â7‘Âà3‘Â7‘ -‘ -‘Âà3‘Âà3‘ :‘Â`@‘ F‘ÂàL‘ÂÀI‘ F‘ S‘Â`Y‘Âàe‘ÂÀb‘ l‘ l‘Âàe‘Âàe‘Âàe‘Âàe‘Âàe‘ÂÀb‘ÂÀb‘ _‘Â`Y‘Âàe‘ x‘ÂÀ{‘€u‘ x‘Â`‹‘ …‘ …‘Âà~‘Â`‹‘ ‘‘Â@ˆ‘ …‘Â€Ž‘Â ‘‘Âà—‘Â ž‘ ‘‘ ‘‘Â€Ž‘Â`‹‘Â€Ž‘Â›‘Âà—‘ÂÀ”‘Â@¡‘ ž‘Â@¡‘Â@¡‘Â`¤‘ ž‘Âà—‘Â›‘Â`¤‘€§‘Â@¡‘Â@¡‘Â`¤‘€§‘ ·‘Â@º‘€À‘€À‘ÂÀƑ ÑÂÀÆ‘ÂÍ‘ÂÀÆ‘Â@º‘ ÑÂ@º‘ Ñ ·‘Â`½‘Â@º‘ Ñ ÑÂ@º‘Â`½‘´‘Âà°‘Â`½‘ÂÀƑ БÂÀÆ‘ÂàÉ‘ÂÍ‘Â@Ó‘Â@Ó‘Â`֑ ܑ ܑ€ò‘Âàâ‘Âàâ‘ÂÀß‘Â@ì‘Â`ï‘€ò‘Âàû‘ õ‘ÂÀø‘ õ‘Âÿ‘ õ‘ õ‘€ò‘ õ‘Âÿ‘ ’ ’Âÿ‘ õ‘Âàû‘ÂÀø‘Âàû‘Âàû‘ÂÀø‘ ’Âÿ‘ÂÀø‘Âàû‘Âàû‘ ’ ’Âà’Â@’€$’ '’€$’ '’Â1’Âà-’€=’ 4’Â1’Âà-’ '’ '’ÂÀ*’Â`:’Â@7’Â`:’Â1’ÂÀ*’ÂÀ*’ 4’Â`:’Â`:’ÂàF’ÂJ’ÂÀ\’Â`l’€o’ f’Âc’ f’Âà_’Âc’Âà_’ f’ f’ f’ r’€o’Â@i’Âà_’ f’€o’€o’ f’ f’Â`l’Â`l’Âàx’€o’ f’ f’Â`l’ÂÀu’Â`l’€o’€o’ r’Âàx’ ’Â@‚’ r’Âàx’ ’ r’ r’Â`l’ÂÀu’Â@‚’Âàx’Âàx’ r’Â|’Â|’Âà‘’Â ‹’Âà‘’Â ˜’Âà‘’Â€ˆ’Âà‘’Â`ž’€¡’Â`ž’Â`ž’Â`ž’ ˜’•’•’Â@›’ ˜’€¡’ ¤’Â઒ÂÀ§’ÂÀ§’Â`ž’€¡’ ˜’Â@›’€¡’ÂÀ§’ÂÀ§’Â`·’Â઒Â઒Â`·’Â@´’Â@´’Â઒Â઒ ¤’®’ ±’®’ ¤’ÂÀ§’ÂÀ§’®’ ±’Â`·’Â`·’€º’Â@´’ÂÀÀ’ÂàÃ’Â`В€ӒÂ`Ð’ÂÀْ ֒Â`é’€Ӓ ֒ ʒÂ`В€ӒÂ`Ð’ÂÀÙ’Âàܒ ֒ÂÀْ ֒Âà’ÂÀÙ’Â ã’ÂàÜ’Â`é’Â@æ’ ã’Âà’ ֒ÂàÜ’Âà’ÂàÜ’Â ã’ ã’ÂàÜ’Âàܒ ï’Â`é’Âàõ’Âàõ’€ì’Â`é’ ï’ ï’Âàõ’ ï’Âàõ’Âàõ’ ü’Âàõ’Âù’ “ “€“Â`“Â`“ “Â`“Â`“Â`“ ü’ÂÀ “ ““Â@ÿ’€“Â`“Â`“Â`“Â`“€“€“ “ÂÀ ““ “Â`““€“Â@“ÂÀ$“ .“Â`4“ !“ .“Âà'“Âà'“ !“ÂÀ$“ÂÀ$“Âà'“ .“Â`4“Â`4“€7“ :“ :“ .“Â@“Â`““€“Âà'“Â`4“ .“ .“ .“Â`4“Â`4“ :“Â`M“€P“Â`M“ S“ S“ÂàY“ `“ÂàY“ÂàY“Â@c“ `“Â]“ÂÀV“ S“€P“Âà@“ÂD“ S“ `“Â@c“€P“ÂàY“ÂàY“Â@c“ l“Âv“ÂÀo“ÂÀo“ l“Âàr“ y“Â@|“Âàr“Â`“ÂÀo“Âv“Âàr“Âàr“ y“Â`“ÂÀˆ“ …“Â`“Âà‹“Â …“Â`“ …“Â`“Âà‹“Âà‹“Â€‚“ÂÀˆ“Â@•“€›“Â`˜“Â@•“““ …“Âà‹“Âà‹“Âà‹“Âà‹“Â ’“ ’“€›“¨“Â@®“ «“ «“ ž“¨“¨“ÂÀ¡“Â`±“ÂÁ“ ēÂན ·“ ·“ ·“ ·“ ·“ÂÁ“Âན ·“€´“ ·“ÂནÂ`ʓ ēÂན ·“ÂÁ“ÂÁ“ÂÁ“Âན ēÂÀӓ ГÂ`Ê“Â`Ê“ÂÁ“ ēÂ`ʓ ēÂནÂན ē€͓ÂàÖ“Â`ʓ Г ГÂÚ“Â`ã“Â@à“€͓€͓ Г€͓ Г Г€͓Â`ʓ Г Г€͓Â`Ê“Âà֓ ГÂÀÓ“ÂÀÓ“ÂàÖ“ÂÚ“Âړ ГÂàÖ“ÂàÖ“Âà֓ Г ēÂàÖ“ÂÚ“ÂÀÓ“ÂàÖ“ÂÀÓ“Âà֓ Г ēÂÀº“ÂÁ“ Г€͓€͓€͓ ГÂ@Ǔ Г€͓Âà֓ ГÂÀÓ“Âà֓€͓€͓ÂÀÓ“ÂàÖ“Â Ý“Â`㓀擀æ“Â`ã“ ݓÂ@à“ ݓ€æ“ é“ é“Â`ã“ÂàÖ“ÂÀӓ€͓ÂàÖ“ÂÚ“Â@à“Â@à“ÂàÖ“ÂÚ“ÂÀÓ“ÂÚ“ÂàÖ“ÂàÖ“Â`ã“Â`ã“ é“Â`ã“Â`ã“ ݓ€æ“ é“Â`ã“ ݓ€æ“ ݓ ݓ€æ“Â`ã“ÂàÖ“Â`ã“Âà֓ ГÂ`Ê“ÂÀÓ“Âړ é“ é“ÂÀ쓀擠铀擠é“Âàï“Âó“Âàï“ é“€µ— I¶ÂÀîÍÂà)ÍÂ`-ÂÂ`ߵ õªÂ@ ¢Â þšÂÀc•ÂÀäŒÂ€TÂ@âÂ@”Â@[ €9ÿÁžÏÁØ‹ÁÒ¾ÀÁA€ÝÓA€)B€ YB€1xBÀe„B݆B@ï„B@ €B€nrB€jbB€ïPBÀ?B€J-B@FB# B2úAÞA€‚ÅA€¨®A€©™A†A¤gAEAØ$AfAèË@0Ž@Ð@á>€Ô¿ìtÀh¿ÀâÁ$ÁƒGÁüiÁ.†Á€8—Á€Ò§ÁG¸ÁÈÈÁ³ØÁ€-èÁ€÷ÁÀ£ÂN ÂÀ ÂÀ•Â@€ Â@Å$ )ÂÀ-Â@¯0ÂÀô3Â7ÂÀé9Â@€<ÂÀË>Âø@ÂÀÌBÂÀuDÂÀìEÂ8GÂ@jHÂwIÂ@wJÂ@qKÂ@RLÂ@M€ÏMÂÀkNÂOÂ@¤OÂÀFPÂ@ÐPÂ@fQÂÝQÂÀ:R€±RÂÀSÂ@sSÂÑSÂÀTÂÀGT™TÂ@êT€;UÂÀŒUÂÅUÂ@ýUÂÀ;V€€VÂ@¬VÂÀêVÂÀWÂ@BWÂÀgWÂÀ™WÂÀ²WÂ@ØWÂëWÂXÂÀ/XÂÀaXÂ@‡XÂÀ¬XÂÀÞX€ YÂÀ)YÂIYÂ@OY€‡YÂÀ¦YÂÀñYÂ@ZÂ*ZÂ@IZ€hZÂ@{Z€šZÂÀZÂÀÒZÂ@øZÂ@[ÂÀ[€I[Â@\[Â@u[¡[ÂÓ[Â@Ù[ÂÀå[Â@ \ÂÀ0\ÂÀb\Âi\€u\Â@ˆ\Â@º\ÂÀß\€ ]€$]Â1]Â@7]ÂJ]€o]Â@‚]Â@›]ÂÀÀ]ÂÀò]€^Â]^ÂÀo^ÂÀˆ^ÂÀ¡^ÂÁ^Â@à^ÂÀì^Â@+_Â@]_ÂÀ‚_¢_€®_ÂÀÍ_Âí_Â@%`ÂÀ1`ÂÀc`Â@p`ƒ`Â@»`€Ú`Â@aÂ@aÂ@aÂKaÂ@ja–aÂÀ¨aÂÀÁaÂ@ÎaÂ@bÂEbÂÀ‰bÂÀ‰bÂÀ»b€Îb€çbÂ@úb€cÂÀ8cÂÀjcÂÀœc£cÂÀÎcÂîcÂ@ dÂ9dÂÀKdÂkd€wdÂ@£dÂÀ¯dÂÏdÂeÂÀ,e€XeÂÀwe€ŠeÂ@eÂÉeÂÀôeÂ@fÂ@3fÂÀXfÂ@~fÂ@—fÂÀ¼fÂÀîfÂÀgÂ@-gÂ@g€eg¤gÂ@Ãg€Ég€âgÂh€-hÂÀ3h€FhÂÀehÂÀ—hÂ@½hÂÀâh€'iÂÀFiÂMiÂ@liÂ@ži€½iÂ@éiÂÀõiÂÀjÂÀ@jÂ@fj«jÂ@Êj€kÂÀ!kÂÀ!kÂAkÂZkÂÀ…kÂÀ·kÂ×kÂ@ökÂÀlÂ@(lÂÀMlÂ@ZlÂ@ZlÂÀlÂ@¥l€ÄlÂêl€(mÂ5mÂ@;m€ZmÂ@ŸmÂ@¸mÂämÂämÂÀnÂ@5n€;nÂ@5nÂÀsn€†n¬nÂ@ËnÂÀðnÂ@oÂ@/o€NoÂo€™o¦o€ËoÂØoÂ@÷oÂ@÷o€/pÂ@BpÂnpÂÀ™pÂ@¿pÂÒp€÷pÂ@ qÂÀ/qÂ@Uq€tqšqÂÀÅq€ñqÂ@rÂ@rÂ0rÂ@OrÂ{r”r­rÂ@ÌrÂ@årÂÀ sÂ*sÂ@IsÂ@bsÂÀ sÂÀsÂÀësÂ@tÂ@CtÂÀOtÂVtÂ@utˆt€”tÂ@ÀtÂÓtÂ@Ùt€øtÂ@$uÂ@VuÂ@ou‚uÂ@ˆuÂ@¡uÂÀÆuÂ@ìu€$vÂ@7vÂÀ\vÂcv•v®vÂ@ÍvÂ@ÍvÂÀòvÂwÂ@1wÂ]w€‚wÂ@®wÂ@ÇwÂów xÂ@+xÂ>xÂÀ7xÂWxÂÀix‰x‰x€®xÂÔxÂ@óxÂyÂyÂÀyÂÀ1yÂÀJyÂÀcy€vy€yÂÀ®yµyÂ@ÔyÂzÂ2zÂÀ]zÂÀvzÂ}zÂ@ƒzÂ}z€¢zÂ@œz€»zÂ@çzÂúzÂÀ%{Â@2{Â@K{ÂÀW{Â@}{€œ{©{Â@È{Â@á{Â@á{ |€2|Â@E|ÂÀj|Â@w|Â@|Â@©|ÂÀµ|¼|€á|ÂÀç|ÂÀ}Â@&}ÂÀ}ÂÀ2}ÂÀK}Âk}ÂÀ}}ÂÀ–}Â@¼}ÂÀá}ÂÀá}€ô}€ ~Â~Â3~€X~Â@k~Â@„~€£~°~ÂÀÂ~Â@è~Â@è~€€Â@3ÂFÂ@eÂ_ÂxÂ@—ªÂÀ¼Â@âÂõÂ@ €Â €Â /€Âà5€Â <€Â H€Â`[€Âàg€Â`t€Â€€Â`€Â “€Âà™€Â€©€ÂàË€Â@Õ€ÂÀá€Â`؀€ۀ ހ ë€Â €  )€? BÂàHÂÀEÂàH€XÂ`U [Âàa t€ŠÂÀ šÂ€£Â ³Â€¼Â`¹Â`¹Â ÌÂ`ÒÂâ ñÂ@‚ ‚ #‚€ ‚Â-‚ÂàB‚ <‚ I‚ÂÀX‚Âà[‚ÂÀX‚€k‚Âàt‚€„‚ ”‚  ‚ª‚€¶‚Â`³‚Â࿂€ςÂ܂ ë‚€ƒÂ€ƒÂ€ƒÂ@ƒÂ€3ƒÂ`0ƒÂ€3ƒÂÀ9ƒÂÀ9ƒÂ`IƒÂ \ƒÂ hƒÂ@xƒÂ`{ƒÂ ŽƒÂ §ƒÂ`­ƒÂࠃ€°ƒÂ`ƃÂ@à̃Âփ ̃Â`߃Â`߃ÂÀèƒÂ òƒÂà„Â`„Â!„ $„Â`*„Â:„Â`C„Â@Y„€_„Âàh„ o„Â`u„Â`u„Â`u„Â…„ÂÀ—„Âàš„Â€ª„Â@½„Â@½„Â@Ö„Â`ل ӄ€܄Â@ï„Âàþ„ÂÀû„ … …Â@!… …Â`$…ÂÀ-…Â@:…€@…Â@S…Âf… i… i… u…Â…€‹…Â`ˆ…Â@……Â Ž…Â §…€½…Âʅ م ͅ€օÂàß…Â æ… æ…Â@é… ÿ…€†ÂÀ†Â`†Âà*†ÂàC†Â@M†Â@M†Â V†ÂÀY†Â€S†Â`†Â@f†Â o†Ây†Â`‚†Â ˆ†Â’†Â ¡†Â ®†Â ®†Â º†Â@ʆÂĆ dž ӆÂÀÖ†ÂÀÖ†Â`͆€é†Â€‡Â ‡ÂÀ‡Â ‡Âà$‡Â +‡Â 7‡ÂÀ:‡ÂA‡Â D‡Â€M‡Â P‡Â ]‡Â ]‡Â€f‡Â€‡ÂŒ‡ÂŒ‡Â ‡ÂÀž‡Â€±‡Â ´‡Â ´‡Â€±‡Â ´‡Â€±‡ÂÀ·‡Â Á‡Â Í‡Â ڇ æ‡Â`ù‡ÂàˆÂ€ˆÂ ˆÂàˆÂ ˆÂ€.ˆÂ€.ˆÂ€.ˆÂ >ˆÂ€GˆÂ WˆÂ cˆÂÀfˆÂ pˆÂ`vˆÂàiˆÂ€yˆÂ@ŒˆÂ •ˆÂ •ˆÂÀ˜ˆÂ ¢ˆÂ ¢ˆÂ€«ˆÂà´ˆÂ@¾ˆÂ@¾ˆÂ »ˆÂ`ÁˆÂ@¾ˆÂ€ÄˆÂ`ÚˆÂ`ڈ àˆÂ íˆÂ@ðˆÂàÿˆÂàÿˆÂ@ ‰Â ‰Â ‰Â`%‰Â‰Â ‰Âà‰Âà‰Â‰Â€(‰Âà1‰Â@;‰Â 8‰ÂàJ‰ÂàJ‰Â Q‰Â Q‰ÂN‰Â ]‰Â ]‰ÂÀy‰Â€‰Â`‰‰Âà•‰Â ‰Â`¢‰Â`¢‰Â€¥‰ÂÀ«‰Â µ‰Â€¾‰ÂÀĉÂÀĉ Ή ΉÂÀĉÂˉÂ`ԉ€׉Âàà‰ÂÀ݉€ð‰ÂÀö‰Â`ŠÂ€ ŠÂ`ŠÂàù‰Âý‰Â  ŠÂàŠÂŠÂ@ŠÂ`ŠÂ %ŠÂÀ(ŠÂ 2ŠÂà+ŠÂ@5ŠÂ`8ŠÂàDŠÂ KŠÂ`QŠÂ€TŠÂà]ŠÂ€TŠÂ WŠÂà]ŠÂ dŠÂ€mŠÂ€mŠÂÀsŠÂ pŠÂ@€ŠÂ@€ŠÂ€†ŠÂ@€ŠÂ }ŠÂàŠÂ`œŠÂ ¢ŠÂ¬ŠÂ`µŠÂ ÈŠÂ`Ί ȊÂ@ˊ ԊÂÀ׊ÂÀ׊ áŠÂ áŠÂ`çŠÂ@äŠÂ€êŠÂ íŠÂ`‹Âà ‹Â ‹Â@ýŠÂ€‹Â ‹Â€‹Â`‹ÂÀ"‹Â ‹Âà%‹ÂÀ"‹Âà%‹Âà%‹Â ‹Â ,‹Â ,‹Â€5‹Âà>‹Â@H‹Â Q‹Â€N‹ÂÀT‹Â@a‹Â j‹ÂÀm‹ÂÀm‹Â j‹ÂÀm‹Ât‹Â`}‹Â€€‹Â ‹Â@“‹ÂÀŸ‹Â œ‹Â ©‹Â€²‹Â µ‹Â໋ ‹€ˋÂ`È‹Â@ŋ ΋Âàԋ ΋ ۋÂ@Þ‹Â`á‹Âàí‹Â@÷‹Âñ‹Âñ‹Â ŒÂ ŒÂ`ŒÂ`ŒÂ€ŒÂ`ŒÂ ŒÂ`ŒÂ#ŒÂ`,ŒÂ€/ŒÂ€/ŒÂ<ŒÂ ?ŒÂ`EŒÂ KŒÂ XŒÂ@[ŒÂ XŒÂ XŒÂ XŒÂ`^ŒÂàjŒÂàjŒÂnŒÂ@tŒÂ@tŒÂ@tŒÂ€zŒÂ€zŒÂ`wŒÂ ŠŒÂ ŠŒÂ€“ŒÂ ŠŒÂ ŠŒÂ@ŒÂ –ŒÂ –ŒÂàœŒÂàœŒÂ £ŒÂ ¯ŒÂ€¬ŒÂ ¯ŒÂ ¼ŒÂ`Œ ȌÂÀËŒÂÀˌ ՌÂÒŒÂàçŒÂ@ñŒÂ`ôŒÂ€÷ŒÂ úŒÂ@ñŒÂ úŒÂà€Â@  Â   Â Â`&  , 9ÂÀH E RÂOÂ@UÂàdÂàd k kÂ`q k€t wÂà}Âà}Âà}Âà}Â`ŠÂ€Â Â Âà–Âà–Âà–€¦Â`£Â`£Â ©Â ¶Â ¶Â³Â@¹Â ¶Â€¿Â`¼Â€¿Â ÂÂàÈÂàá èÂ`î ôÂàúÂàúÂ@ë ôÂÀ÷ÂÀ÷€ ŽÂ€ ŽÂàŽÂ€ ŽÂŽÂ &ŽÂ &ŽÂ 3ŽÂ0ŽÂ0ŽÂ 3ŽÂ`9ŽÂà,ŽÂ ?ŽÂ LŽÂ LŽÂ LŽÂ€UŽÂ€nŽÂ XŽÂÀ[ŽÂ@hŽÂ€nŽÂ`kŽÂ€nŽÂ@hŽÂ€nŽÂ qŽÂ`„ŽÂ`„ŽÂ”ŽÂÀŽÂÀŽÂàŽÂ —ŽÂ —ŽÂ@šŽÂÀ¦ŽÂ £ŽÂ`ŽÂ`ŽÂ੎ °ŽÂ °ŽÂ °ŽÂ ¼ŽÂ@³ŽÂ@³ŽÂ Ɏ€Ҏ âŽÂ`èŽÂ`èŽÂ îŽÂ âŽÂ âŽÂ âŽÂ@åŽÂ`èŽÂ€ëŽÂ îŽÂàôŽÂ@þŽÂÀñŽÂøŽÂ ûŽÂ€ÂÀ Âà Âà €€  Â`Â*Â*Â@0  Âà&Â*Â`3 9Â`3 9ÂÀ< F€OÂÀU _Â`e€h kÂ`eÂÀn€hÂàqÂ`~ „€ xÂ`~ÂàŠÂ ‘ÂàŠÂ`— ªÂ§Â€šÂ ªÂÀ Âà£Â Â€šÂ ªÂ`°Â€³Âà¼ÂÀÂà¼ÂÀÂ`ÉÂ`É€ÌÂÙ ÜÂ@ßÂ`âÂ@ßÂ`âÂ@ß èÂ`â ÜÂÀë õÂàîÂÀë õÂÀÂÀÂ`ûÂ@øÂ€þÂ@ Â$ 3€0€0 'Â`-Âà ÂÀ 'Â@*€0Â`-Â`-Â`-€0Â`-ÂÀ6Â`F€IÂ@C€IÂ`F€IÂàRÂVÂ@\ÂàR eÂÀhÂàkÂ`x€{Â`xÂ`x€{ ‹ÂˆÂ ~€{€{ ~ ‹Â@ŽÂ ‹Â ‹Â€”ÂàÂ@§Â`ªÂ`ªÂ ¤Â@§Â °ÂÀ³ÂÀ³Â °Â °ÂºÂ`ÀÆÂ`ÃÂ`ÃÂ`úÂ@ÀÂàÏ€ßÂìÂìÂÀå€ßÂ@òÂìÂìÂàèÂ`ÜÂàèÂì ïÂàè€øÂà‘Âà‘Âà‘Â@ ‘ ‘ ‘ ‘Âà‘Âà‘Âà‘Âà‘Âà‘€‘Â`‘Â@ ‘ ‘Â@ ‘ !‘Â7‘ -‘€*‘€*‘€*‘ -‘ÂÀ0‘Âà3‘ :‘Â7‘ -‘Âà3‘Â7‘Â`@‘ÂÀI‘ÂÀI‘ F‘ÂP‘ÂàL‘ÂàL‘Â`@‘ :‘Âà3‘Â7‘ :‘Â@=‘ F‘ÂàL‘ S‘ÂÀb‘Âàe‘ _‘ÂÀb‘ÂÀb‘ÂÀb‘ l‘Â@o‘Âi‘Âi‘ l‘Â@o‘Âàe‘ÂÀb‘€u‘ÂÀ{‘ x‘Â`‹‘ …‘Â@ˆ‘Â€Ž‘Â …‘ …‘ ‘‘›‘Âà—‘Â ‘‘Â@¡‘€§‘€§‘Â`¤‘Âà—‘Âà—‘Â ž‘ÂÀ”‘Âà—‘Â@¡‘Âà°‘Âà°‘Â ·‘´‘Â@º‘Â@º‘ ·‘€À‘ÂÀƑ БÂ@Ó‘Â`֑€ّ ܑ ܑÂ`Ö‘Â`Ö‘Â`Ö‘Â é‘Â@ì‘Âàâ‘Âàâ‘ÂÀߑ é‘€ò‘€ò‘Â`ï‘Â@ì‘Âæ‘Âæ‘ é‘Â`ï‘ é‘ õ‘Âàû‘ ’Â`’Â`’Â`’Â@’ÂÀ’ ’ ’Â’ ’Â’ ’Â@’Âàû‘ ’Âÿ‘€ ’Â`’ ’Â’Â’€$’ '’Â`!’ ’ ’Âà’ ’Âà’ ’ÂÀ*’ 4’Â`:’Â`:’ÂJ’ M’ M’ M’ M’ÂJ’Â@P’ÂÀ\’Âà_’€V’ M’€V’ Y’Âc’Âc’Â@i’Â`l’ÂÀu’ r’Âàx’€o’Âàx’Â|’€ˆ’€ˆ’•’ ‹’ ’ÂÀŽ’Â ‹’ÂÀŽ’ÂÀŽ’Â@›’Â@›’Â`ž’Â`ž’ÂÀ§’ ¤’ ˜’ ˜’ ¤’ ¤’Â઒Â઒Â઒ÂÀ§’ÂÀ§’Â`ž’ ˜’ÂÀ§’ ±’Â@´’€º’€º’€º’Â`·’ÂÀÀ’Â`Ð’Â`Ð’ÂÀÙ’ÂàÃ’ÂÇ’ÂàÃ’Â`Ð’Â@͒ ֒ÂÀÙ’Âà’Âà’ ã’Â@æ’ÂàÜ’ÂÀÙ’Â@æ’Â`é’Â`é’€ì’Â@æ’Âàܒ ֒ÂàÜ’ÂàÜ’Âà’ÂàÜ’ÂàÜ’Â ã’ ֒ ֒ ã’Âà’Â`钀쒠ã’Â`é’ ï’Â`é’Â`é’Â`é’Â`é’ ã’ ã’Â`钀쒀쒠ã’ÂÀْ ֒ ֒ ֒ ã’ÂÀÙ’Â@æ’ÂàÜ’Âà’Â`é’ ã’Â@æ’ ã’ ֒ ֒€Ӓ ֒ ã’Â`é’Â@æ’ ã’Â`é’Âà’ ֒ ֒ ֒Â@Í’ÂÀÙ’ÂàÜ’Âà’ ã’Âà’ ã’ ã’Â@æ’Âàõ’Âàõ’ÂÀò’ ï’Â@撀쒠ì’Â`é’ ã’Â`é’ ï’ ï’Â`é’ ï’Â`é’ ï’Âàõ’Âàõ’ ï’€ì’€ì’€ì’€ì’ ã’Â@æ’Âà’Âà’ ã’€ì’€ì’ ï’Â@ÿ’Â@ÿ’€“Â`“Âù’Â`“ “ÂÀ “€““ “ “ “Â`“Â`“€“€“€“ÂÀ “Âà“ “ ü’Â`“Â`“Â`“ “ “€“Â@ÿ’€“€“ ““ “ “ “ÂÀ “ “Â`“€“Âà“Âà“Âà““Â`“€“ÂÀ$“€“ !“ “Â@“Â`“ÂÀ$“ !“Â`“ “ÂÀ “Âà“Â@“ !“Âà'“ !“ÂÀ$“ .“ .“Â`4“Â`4“Â@1“€7“Â`4“ .“ÂÀ=“€7“ :“Âà@“Âà@“ :“ .“Â@1“ :“ G“€P“€P“ G“Â@J“ÂD“€7“ :“ :“Â`M“ G“Â`M“Â`M“Â@J“Â`M“ÂD“Â`M“ G“Â`M“ S“ G“ÂàY“ÂàY“Â`f“ l“Â@c“€i“ l“ l“€i“ S“Â`M“€P“Â`M“Â`M“ÂàY“Â]“ `“ `“Â`f“Â`f“Â@c“Â`f“Âàr“ l“ÂÀo“€i“Âàr“ l“Âàr“Âàr“Âv“ l“ÂÀo“€i“ÂÀo“ y“ y“ l“ÂÀo“Â`“Â@|“€‚“Âà‹“Â y“ y“ y“Âà‹“Â ’“ ’“ ’““ …“Â`“ÂÀˆ““Â`˜“Â@•“ ž“€›“Â@•“ ’““Âà‹“Âà‹“ÂÀˆ“ …“““ ’“€‚“€‚“ …“Âà‹“Âà‹“Âà‹“Â€›“Â`˜“ ’“Â@•“ ž“€›“Â@®“Â`±“ «“Âओ «“Âओ€›“ ž“ ž“€›“ ž“ÂÀ¡“ ž“ ž“ ž“ ž“ÂÀ¡“ ž“¨“ «“ «“Â`±“Âན€´“ ·“€´“€´“Â@®“Â@®“€´“ÂÀº“ ·“Âན€´“ «“ ·“ÂÁ“ÂནÂན ēÂ@Ç“ÂÀÓ“Â@Ǔ ГÂà֓ ГÂàÖ“ÂàÖ“Â`ã“ é“Â`㓀擠ݓ Г ГÂà֓ Г ݓÂà֓ Г ГÂÀÓ“Â@à“ ݓ ݓ€æ“€æ“ é“Âó“ÂÀì“Âó“ ö“ ö“ ö“ ö“ é“ é“€æ“Â`ã“ ö“Â`ü“€ÿ“ÂÀ”ÂÀ”Â`ü“ ”€ÿ“Âà”€ÿ“Â`ü“€ÿ“ ”Â@ù“€ÿ“ ö“Âàï“ ”Â`ü“Âà” ” ”Â`”Â@”Â`”Â`”ÂÀ” ”Âà!”€” ” ” ” ” ”Âà” ” ”€ÿ“ ö“Â`ü“ ” ” ”Â`” ”Â`” ”Â`” ” ”Â%” ”€”ÂÀ” ”ÂÀ”€”ÂÀ”€”Â`” ”Âà!”ÂÀ” (”Â@+”Â`.”Â@+”Âà!”Âà!”Â`.” (”Â%”ÂÀ”Â`.” (”Âà!”ÂÀ” ”Â%”ÂÀ” (” 4”Â>”ÂÀ7” 4” 4” A”Â@D” 4”Âà:” 4”ÂÀ7” 4”Â@+”Â@+”€1” A”€1”Â`.”Â@+”€1”ÂÀ7”Â`.”€1”€1”Âà:” A” A” M” A” A” A” A” A”Â@D”Â`G”Â`G”€J”Â>” A”Â`G” A” A”Âà:”ÂÀ7” A”€J” M” M”ÂÀP” M”ÂàS”ÂÀP”ÂàS” Z”ÂàS”ÂàS”Â`G” M” M” M”ÂÀP”ÂW”€J”ÂàS” Z”ÂàS” Z”€c”ÂÀi” s”Âp”Âàl”Âàl”Â`y” s”Âàl”Âàl”Â@v” s” ”Â`y” s”Â@v” ”Â@v”Âp”Âp”Âàl”Â@v” f”Âàl”Âàl” s” s”Âàl”Âp”Âp” s”€c”€c” f” f” f”ÂÀi” f”ÂÀi”€c” f” f”Âàl”Â@]”€c”Âàl” f”Âô—ÂÀ3¶ÂÀRΠÆÍÂàÏÂÂ@‹¶Âà‘«Â@Ÿ¢ÂÀŠ›Â ê•³ÂÀmVÂ@r‚Â@IÂ@ªÂøÙÁ€™ÁÁ8Ç@TºA€B€ïPBørB ø‚B€l†B`V…Bàý€B€uBÀweB€ZTBˆBBô0BÄB€B@ŠB€?åA€ ÌA€Ï´A«ŸAñ‹AusA«QAô0AºA&ã@n¥@¤N@¸¡?pF¿Ð6ÀÊžÀ^âÀ•Á°3ÁêSÁÙsÁ€"ŠÁ€¼šÁ€o«Á€×»Á€ ÌÁ€ßÛÁ(ëÁ€ úÁ@'Â@Ë ÂÂ@Â@‘¸!Â@n&€§*€¨.Â@?2ÂÀk5ÂÀ@8Âê:€N=ÂÀz?ÂÀUA€CÂÀuDÂóEÂQGÂ@ƒHÂ@–I€}JÂ@XKÂ@9LÂûLÂÀŠMÂ'NÂÀÏNÂSOÂÀÉO€@P€¤PÂ@QÂ@QÂÀïQ€MRÂ@«RÂ@öRÂ@ZS€ÄSÂ@ TÂ@TTÂ@ŸTÂ@êTÂ@UÂ@gU“UÂ@ËU€VÂÀTVÂV¿VÂ@ÞVÂ@WÂbÂÀWbÂÀWb€ƒb€œbÂ@¯bÂÛbÂ@úb cÂ?c€dc€–cÂÀœc¼cÂ@ôc dÂÀ2dÂÀddÂ@qdÂ@£dÂ@ÕdÂ@îd€ôdÂÀeÂLeÂ@ke—eÂÀÂe€îeÂf€ f€9fÂ@efÂÀŠf‘fÂ@ÉfÂ@âf€gÂ'g€egÂÀ„gÂÀ¶g€âg€ûgÂ@'hÂÀLhÂ@rh€‘h·h€ÃhÂ@ÖhÂ@iÂi€@iÂÀxiÂi±iÂãiÂ@jÂ@jÂGjÂ`jÂ@˜jÂ@±jÂÀÖjÂöjÂÀ!kÂ@`kÂÀ…kÂŒk¾kÂÀék€lÂÀlÂÀMlÂ@ZlÂÀflÂÀ˜lÂÀ±lÂÑlÂ@ mÂ@"mÂ@TmÂ@†mÂ@ŸmÂÀ«mÂ@ÑmÂÀöm€ nÂ@5nÂ@Nn€mnÂÀsn€ŸnÂÅnÂ@änÂ÷nÂoÂ)oÂBoÂÀmoÂÀ†oÂÀŸoÂ@ÅoÂÀÑo€ýoÂ@p€/pÂÀNpÂ@tp€“p pÂ@¿pÂÀäpÂq€Bq€[qÂ@nqÂÀzqÂ@‡qÂ@¹q€ØqÂÀ÷qÂrÂÀBrÂ@Or€nrÂÀrÂ@šrÂ@årÂÀ sÂ@0sÂ\sÂÀnsÂÀ‡sÂ@­sÂ@ßsÂÀtÂÀtÂ@*tÂ@*tÂÀOt€bt€”tÂ@§tÂ@ÀtÂ@ÙtÂÀþtÂuÂ@=uÂPu€\uÂ@ouÂ@ˆu€§uÂ@ºuÂæuÂÿuÂ@vÂ@PvÂÀuvÂ@‚v€¡vÂÀÙv€wÂ@wÂ@wÂ@1wÂ]w€‚wÂ@•w€´wÂ@ÇwÂÀìwÂÀxÂ@xÂ%xÂ@]xÂpxÂÀ‚xÂ@xÂÀ´x€Çx€ÇxÂÀæxÂ@ yÂ@>yÂ@>yÂÀ1yÂ@>yÂ@pyÂ@¢y€Áy€ÚyÂÀàyÂÀzÂ@zÂ@8zÂ@jz€Wz€pzÂÀzÂ@µz€»zÂ@çzÂÀóz€{Â@K{Â@d{ÂÀ‰{Â@–{©{ÂÀ»{€Î{€Î{Â@á{Â@ú{ÂÀ8|€d|Â@w|ÂÀœ|¼|ÂÕ|ÂÀç|ÂÀç|€á|Â}€}Â@?}Â@X}€^}Â@X}ÂÀd}Â@Š}ÂÀ¯}€Â}€ô}€&~Â@R~Â@R~Â@„~ÂÀ~Â@¶~ÂÀÂ~ÂÀô~ÂÀô~ÂÀô~Â@ÂÀ ÂFÂ@eÂ@~‘€¶ÂÀÕÂ@âÂõÂà€Â €Â €Âà€Â /€Â9€Â`B€Â U€ÂÀd€Â`t€Â@q€ÂÀ}€Â ‡€Â “€Â@£€Â`¦€Â€©€ÂಀÂÀȀ ҀÂàä€Â€ô€Â ÂÂÂ`# ) )Âà/Â`<ÂàHÂ@RÂeÂe€q t tÂ@„Âà“€£Â€£Â`¹Â€¼ÂàÅ ØÂ`ëÂ`ëÂà÷Â@‚€‚  ‚Â`‚Â@3‚ÂÀ?‚ U‚ÂÀX‚Â`h‚ b‚ b‚Â`h‚ n‚€„‚€„‚Âং ¹‚ÂÀ¼‚Â`Ì‚ÂàØ‚Â`傀肠ë‚Â@û‚ ƒÂà ƒÂ@ƒÂÀ ƒÂ *ƒÂà<ƒÂ CƒÂ`IƒÂàUƒÂ`bƒÂ uƒÂ ƒÂ€—ƒÂ šƒÂ`­ƒÂใ ³ƒÂใ ÀƒÂ ÌƒÂ@܃ ̃Âà҃€âƒÂàëƒÂ òƒÂÀ„€„ $„Â:„€F„ =„Â@@„ÂÀL„ V„ b„Â@r„ {„Â…„Â`Ž„Â`Ž„Â`Ž„Â@¤„ÂÀ°„ÂೄÂ`À„ ƄÂЄ ì„ ø„Âàþ„ … …Â`$…Â`$…Âà0…€@… C…€@…Â`=…ÂàI… \… \…€Y…Âf…€r… ‚…ÂÀ‘…Â@ž…Â`¡…±…€½… ͅÂàß…Â æ…ÂÀ܅€օÂ`ì…Âàø…Â ÿ…  †ÂÀ†Â †ÂÀ'†Â 1†Â€:†Â.†ÂÀ'†Â@4†Â.†Â =†Â J†Â`†Â`i†Â@†ÂàŽ†Â’†Â’†Â’†Â`›†Â€ž†Â ¡†Â«†Â€·†ÂÀ½†Â€Ð†Â à†Â݆ ì†Â ù†Â€‡Â ‡Âà ‡Â ‡Â 7‡Â 7‡Â€4‡Âà=‡Â D‡Â P‡Â P‡Â@`‡Âào‡Âào‡Â v‡Â ‚‡Â ‡Â ›‡Âࡇ€±‡Â ´‡Â ´‡Â¾‡Â@ć ͇Â`à‡Â`à‡Â æ‡Âàì‡Â@ö‡Â€ü‡Â ÿ‡Â€ˆÂ ˆÂ`ˆÂ ˆÂ€ˆÂ"ˆÂ 1ˆÂ >ˆÂ`DˆÂÀMˆÂ@ZˆÂ`]ˆÂ`]ˆÂmˆÂ@sˆÂ |ˆÂ€’ˆÂ ‰ˆÂ ‰ˆÂ ‰ˆÂ€’ˆÂŸˆÂ ®ˆÂ ®ˆÂ€«ˆÂÀ±ˆÂ ®ˆÂ¸ˆÂ`ÁˆÂ@¾ˆÂш àˆÂàæˆÂàÿˆÂ@ ‰Â ‰Â@ ‰Â€‰ÂÀ‰Â@"‰Â +‰Â 8‰Â@;‰Â Q‰ÂN‰Â@T‰Âàc‰Â€s‰Â v‰Â v‰Â€s‰Â`p‰Â`‰‰Â ‰Â`¢‰Â µ‰ÂஉÂ`»‰Â µ‰Â@¸‰Â@¸‰Â Á‰ÂàljÂàljÂ@щ ډ ó‰Â`í‰Â@ê‰Â ç‰Â€ð‰Â ç‰Âàà‰Â`í‰Â`í‰Â ó‰Âàù‰Â€ ŠÂ ŠÂ ŠÂ %ŠÂ ŠÂŠÂàŠÂÀŠÂÀŠÂ@ŠÂ€"ŠÂ %ŠÂà+ŠÂ 2ŠÂ >ŠÂHŠÂ`QŠÂÀZŠÂÀZŠÂ dŠÂ WŠÂ WŠÂ WŠÂà]ŠÂ@gŠÂ`jŠÂ`jŠÂaŠÂ`jŠÂaŠÂ`jŠÂ dŠÂ`jŠÂ dŠÂ dŠÂÀsŠÂ`jŠÂ dŠÂaŠÂà]ŠÂ`jŠÂ dŠÂ`jŠÂzŠÂ`ƒŠÂàvŠÂzŠÂzŠÂ`ƒŠÂ@€ŠÂzŠÂ ‰ŠÂ }ŠÂÀsŠÂàvŠÂÀsŠÂÀsŠÂ }ŠÂ€†ŠÂ€†ŠÂ ‰ŠÂÀŒŠÂ`œŠÂ –ŠÂ`œŠÂ@™ŠÂ€ŸŠÂÀ¥ŠÂ ¢ŠÂ ¯ŠÂ`µŠÂÅŠÂ@ˊ Ԋ€ъ€ъ€ъ€ъÂ`Ί€ъÂÀ׊ÂÞŠÂ`çŠÂ`çŠÂ íŠÂ úŠÂ`‹ÂÀ ‹Â ‹Â ‹Â úŠÂ`‹Â ‹Â ‹Â€‹Â ‹Âà ‹Â ‹Â ,‹Âà%‹ÂÀ"‹ÂÀ"‹Â€‹Â€‹Â€‹Â ,‹Â@/‹Â`2‹Âà>‹Â`K‹Â€N‹Â€N‹Â€N‹Â[‹Â j‹Â j‹Â w‹Â`}‹Ât‹Â@z‹Â€€‹Â€€‹Â€€‹Âà‰‹ÂÀ†‹Â`–‹Â ‹Â`–‹ÂࢋÂ`¯‹Â`¯‹Â@¬‹Â ©‹Â໋ µ‹ÂÀ¸‹Â ‹ ‹ ‹ÂÀÑ‹ÂÀÑ‹ÂàÔ‹Âàԋ€ä‹Âñ‹Â ç‹Â`á‹Â ç‹Âñ‹Â ô‹ÂàŒÂàŒÂ ŒÂÀŒÂ@ŒÂ ŒÂÀŒÂÀŒÂàŒÂ`,ŒÂ#ŒÂ€/ŒÂà8ŒÂà8ŒÂ 2ŒÂ 2ŒÂà8ŒÂ 2ŒÂ ?ŒÂ`EŒÂ@BŒÂ`EŒÂ`EŒÂ`EŒÂ KŒÂ`^ŒÂ€aŒÂ XŒÂ`^ŒÂ dŒÂÀgŒÂ qŒÂ@tŒÂ qŒÂ }ŒÂ }ŒÂ ŠŒÂ€“ŒÂ€“ŒÂ€“ŒÂ`ŒÂ –ŒÂ £ŒÂ`©ŒÂ`©ŒÂ`©ŒÂ ¯ŒÂ ¯ŒÂ¹ŒÂ ¼ŒÂ`Œ€ŌÂàΌ€Ō Ȍ ȌÂÀˌ ȌÂàΌ áŒÂàçŒÂ`ôŒÂ îŒÂ€÷ŒÂ`ôŒÂàçŒÂ îŒÂ`ôŒÂÀýŒÂÂ` Â` ÂàÂ`&Â@< 9 EÂ`?€BÂ`?Â@< 9Â`?Â@<Â6Â@< E 9Â`?ÂÀHÂàKÂ@U€[Â@UÂàdÂÀzÂàdÂ@n€t „ÂÂ@‡Â „ „Âà–Â`£Â ©Â`£Â  ©Âà¯Â`¼Â`¼Â`¼Â`¼ÂÌÂÌ ÏÂ`Õ Ï ÏÂ@Ò ÏÂ`ÕÂÀÞÂå ÛÂ@ë ô èÂ`î€ñ ô€ ŽÂ  ŽÂŽÂ  ŽÂ ŽÂ ŽÂ &ŽÂ` ŽÂ &ŽÂ0ŽÂà,ŽÂ`9ŽÂ€<ŽÂ ?ŽÂIŽÂ LŽÂIŽÂ€UŽÂ LŽÂ LŽÂ@OŽÂ€UŽÂ@OŽÂà^ŽÂÀ[ŽÂ eŽÂ XŽÂ XŽÂbŽÂbŽÂ@hŽÂ qŽÂ€nŽÂ`kŽÂ€nŽÂÀtŽÂ@ŽÂ ŠŽÂ`ŽÂ`ŽÂ —ŽÂÀŽÂ@šŽÂÀ¦ŽÂ€¹ŽÂ@³ŽÂ੎ÂÀ¦ŽÂÀ¦ŽÂ °ŽÂ °ŽÂ€¹ŽÂ ¼ŽÂ ¼ŽÂ€¹ŽÂÀ¿ŽÂ@³ŽÂ`¶ŽÂ ¼ŽÂ€¹ŽÂàÂŽÂ`ÏŽÂ`ÏŽÂ`ÏŽÂߎ âŽÂ€ëŽÂÀñŽÂ ûŽÂ@þŽÂàôŽÂ`Â`Âà Âà ÂÀ Â@ €Â   -Â*Âà&      ÂÀ#ÂÀ#Âà& -Â`3 9€6 9 F FÂC R _Â@bÂ\ _ÂÀUÂàXÂàXÂ@bÂ`e k€h x xÂuÂàqÂÀ‡Â ‘Â@”Ž „ÂàŠÂ ‘ „Â`—Â`—ÂÀ ÂÀ ÂÀ Âà£Â€šÂ@” Âà£Âà£Âà£Â€³Â@­Â ¶ÂÀ¹ÂÀÂÀ¹Â€³Â€³ÂÀ Ã ÏÂÙ ÜÂàÕ ÏÂÀÒÂàÕÂÀÒÂàÕ õ õÂ`û õ€þÂ`ûÂ@øÂ€þ  ÂÀÂÀÂ`û€þ€þ €þ Âà €þ ÂÀ  Â`  ÂàÂ@Â@ÂÀ Â@*Âà9Âà9ÂÀ6Âà9 3ÂÀ6 3€0 @ÂÀOÂ`FÂ=Â= 3 3 @€IÂÀOÂ`_ Y Y€b Y eÂo€{ ~ ‹Â ‹Â ‹Âà„Âà„€{Â@u€{Âà„ˆ ‹Â ‹Â@ŽÂÀ ‹Â`‘ÂàÂàÂà °Â ½Â ½Â ½ÂºÂ€­Â`ªÂà¶ÂºÂ ½Â ½ÂºÂ@À °Â ½ÂºÂ ½Â`ÃÂÀ̺Â@ÀÂàÏÂ@ÙÂàè€ßÂ`ÜÂàÏÂ@ÙÂÀåÂÀåÂ`ÜÂ`õ û ‘Âà‘ ûÂ`õÂ`õ ïÂ`õ‘‘ÂÀþÂ@ ‘Â@ ‘ ‘‘Âà‘€‘Âà‘ ‘€‘€‘€‘ÂÀ‘ !‘ !‘Â@$‘Â`'‘ÂÀ0‘Â7‘ÂÀ0‘ -‘ -‘€*‘ÂÀ0‘ :‘Â@=‘Â`@‘ÂÀI‘ F‘€C‘€C‘Â@=‘ F‘€C‘ÂÀI‘Â`Y‘ÂP‘Â`Y‘ÂàL‘Â`Y‘Â`Y‘Âàe‘€u‘€u‘€u‘€u‘Â`r‘ x‘ l‘Â`r‘ x‘ x‘Âàe‘Âàe‘Â`r‘Âà~‘ x‘ x‘Âà~‘ …‘Â`‹‘Â`‹‘Â`‹‘Â€Ž‘Â‚‘‚‘Â€Ž‘Â`‹‘ ‘‘ÂÀ”‘ ‘‘ÂÀ”‘Âà—‘ÂÀ”‘Â€Ž‘ÂÀ”‘ ž‘ ž‘€§‘Â`¤‘€§‘ÂÀ­‘Â`¤‘ ª‘Â`¤‘ ª‘€§‘ ·‘Â`½‘Â@º‘€À‘€À‘€À‘ÂÀÆ‘ÂàÉ‘ÂàÉ‘ÂÀÆ‘ÂàÉ‘ÂàÉ‘ÂàÉ‘Â͑ БÂ@Ó‘Â`֑ ܑ ܑÂàâ‘Âæ‘ é‘Â`ï‘ é‘ÂÀߑ ܑÂÀß‘ÂÀß‘Âàâ‘Â@ì‘Â`ï‘ ’ ’ ’ ’Â`’ ’€ ’ ’Â’ÂÀ’Â`’Â`’ ’ ’ ’ ’€ ’Â@’€ ’ÂÀ’Âà’ ’€$’ ’Â’€$’Â@’Â’ ’ '’Â1’ 4’ '’ 4’ 4’ 4’ '’Âà-’Â`:’€=’€=’Â@7’€=’ÂÀC’€=’Â`:’ @’€=’ 4’ÂàF’Â@P’Â@P’ Y’Âà_’Âà_’Âà_’ f’Â@i’€V’ Y’ Y’ Y’ÂÀ\’€V’Âà_’Â`l’€o’ r’Âàx’Âàx’Â|’Âàx’€o’Âàx’Â`…’Â`…’€ˆ’Â|’Â`…’Â@‚’ ’ ’Â`…’ ’ ’Âàx’Â|’Â|’Âàx’Â@‚’ ’Â@‚’Â|’ ‹’Âà‘’Â€ˆ’€ˆ’Âà‘’Â ‹’€¡’ ˜’ ˜’Â઒€¡’ ˜’ ¤’ ±’Â@´’ ±’€º’ ±’ ±’€º’ ½’ÂÀÀ’ ½’ ±’ ±’Â઒ÂÀÀ’ÂàÃ’ÂàÃ’Âǒ ½’ ʒ ʒÂ`Ð’Â@Í’Â@͒ ֒€ӒÂ`Ð’Â`Ð’Â`В ֒ÂÀÙ’ÂàÜ’ÂÀÙ’ÂàÜ’Â ã’ ã’ÂàÜ’ÂÀÙ’Â`Ð’ÂÀÙ’Â`В ʒ€ӒÂàܒ€ì’ÂÀò’ ü’Âù’ ü’Âàõ’€ì’Â@ÿ’€“Â@ÿ’Â`“Âàõ’€“ “ “Â@ÿ’ÂÀò’Âà“ “Âà“Â`“€“ÂÀ “ÂÀ “ “ “ÂÀ “ ““€“ ““Â`“Â`“ !“ !“ “Â`“€“ .“ .“Â+“Â+“Â+“ :“Â@1“Â`4“ :“ :“Âà@“ :“ :“ :“Â@J“Â@J“ G“ÂD“ G“ :“€7“Âà@“ÂD“ G“Âà@“Âà@“Âà@“Âà@“ÂD“ G“Â@J“Â`M“Â`M“ S“ÂD“Âà@“ÂD“ :“ÂÀ=“ :“Âà@“ÂÀ=“ÂD“Â`M“€P“€P“ G“Â`M“Âà@“ÂD“€P“ S“Â]“ S“Â]“ `“ `“€i“€i“Â@c“€i“ l“ l“ÂÀo“ y“Âv“ l“ l“Âv“ y“ y“Âv“Âàr“€‚“ÂÀˆ“ ’“Âà‹“Â“Âà‹“ÂÀˆ““ ’“ …““ ’“ ’“Âà‹“Â`˜“ ž“ÂÀ¡“ ž“Â@•“Â`˜“ ’“ÂÀˆ“Âà‹“Â`˜“€›“ «“Âओ¨“ÂÀ¡“ ž“ ’“ ’“ ’“Â`˜“ «“ÂÀ¡“ ·“Âན ē€´“ ·“Â`±“Â@®“Â@®“ÂओÂ`˜“ ž“€›“ÂओÂÀ¡“ÂÀ¡“¨“€´“ ·“ÂནÂÁ“Â`Ê“Â`ʓ ГÂÀÓ“ÂàÖ“Âà֓ Г€͓ ГÂà֓ ГÂÀÓ“Â Ý“ÂÚ“Â@à“ ݓ ݓÂ@à“Â`ã“Â@à“ÂÀӓ Г Г ē ēÂནÂནÂ`Ê“Â`ʓ ГÂÀÓ“Âà֓ Г ГÂàÖ“ÂÀÓ“ÂàÖ“ÂÀÓ“Âړ ݓ ݓ€æ“Â@à“Â`㓀擠铠ö“ ” ö“Âó“ é“ ö“Â`ü“€ÿ“Â`ü“ ö“Âàï“ ö“ ö“Â`ü“€ÿ“€ÿ“ ”ÂÀ” ” ”Âà”Â@”€”ÂÀ” ”€”Â`”€” ”Âà” ” ”Â@”Âà!” ” ”Â@”Â`”€” ”€”Â`”Â%”Â%”Âà!” (”Â@+”Â@+”Â@+”Â@+”€1”ÂÀ7”Â@+” 4” 4”ÂÀ7”Â`.” (” 4”€1”€1”Â>”Â>”Â>”Âà:” A” 4” 4”Âà:”Âà:”Â>”Â`G”Â`G”€J” M”Â`G”Â`G” M”Â`G” A” M” Z”ÂàS”Â@]” Z”ÂÀP”ÂàS” Z”€c” Z”€c”Â@]”ÂW” M”ÂW”ÂàS” M”ÂW” Z” Z”Â@]”Â``”€c”Â``” f”Â``”Âàl”ÂÀi”Â``”Â@]”Âàl”Â`y”Â@v”Âp” f”Âàl”ÂÀi”ÂÀi”Âàl”Âàl”Âàl” f”Âàl”ÂÀi”Âàl” f”ÂÀi” s” s”Â`y” s”ÂÀ‚”€|”‰”‰”€|”Â@v”Â`y” s”Âp”Â`y”Âàl”Âp”Âàl” s” ”Âà…”Â@”Âà…”Â Œ” Œ” ” ” ”€•” ¥”€®”Âàž”Âàž”Â€•”Â`’”€•” ¥” ¥”€®”¢”ÂÀ›”Âàž”ÂÀ›”¢”Âàž”Â@” ˜”Âàž”Â@¨”Â@¨”Â@¨” ¥”¢”Âàž”Â€•”€•”Â`’”€•” ¥”Â`«”Â`«” ¥” ±” ±”€®”€®”ÂÀ´”ÂÀ´”»” ¾” ¾”ÂÀ´”€®”Â`«”€®”ÂÀ´”Âු»”»” ¾”»”ÂÀ´”Â`Ĕ»” ¾” ¾” ¾”»”Â@Á”Âු N˜Â€ª¶Âà¹Î ÎÂ`'ÃÂж ֫Â`í¢Â ߛ 5– ŽÂÀ5W€ÖÂ@ÂÀÓÂÀ €¤éÁ€›¬Ál6ÁØ @d–A€#B€EB€˜kB BÀÜ…B`º…B‚BÀÓwB€xhBÂ@@Â@\BÂÀøCÂ@cE»FÂ@íGÂÀóHÂ@áIÂÀÎJÂKÂ@kLÂ-MÂÃMÂÀkNÂ@õNÂ…OÂÀPÂÀ‘P€QÂÀrQÂ@ãQÂZR¾R€.SÂÀ±SÂTÂÀ`TÂÀ’TÂ@ÑTÂ@UÂÀZU“UÂÀ×UÂ@VÂ@aV¦VÂ@ÞV WˆÂàPˆÂ€`ˆÂ cˆÂ pˆÂÀˆÂ@ŒˆÂ†ˆÂ |ˆÂà‚ˆÂ€’ˆÂà›ˆÂ ®ˆÂÀ±ˆÂ¸ˆÂ€ÄˆÂ€ÄˆÂà͈Âà͈Â`ڈ íˆÂ ùˆÂàÿˆÂ€‰Â ‰Â` ‰Â`%‰ÂÀ.‰Âà1‰Â +‰Â€A‰ÂàJ‰Â Q‰Â€Z‰Â ]‰Â@T‰ÂÀ`‰Â€s‰Â`p‰Â@m‰Â€s‰Âà|‰Â`‰‰Â ‰Â ‰Â œ‰Â ¨‰Â`¢‰Â@Ÿ‰Â²‰Â@¸‰Â@¸‰Â€¾‰Âˉ ډÂÀ݉Âàà‰Â ç‰Â`í‰Â ŠÂ€ ŠÂ ŠÂ`ŠÂà+ŠÂ@5ŠÂ 2ŠÂà+ŠÂà+ŠÂ/ŠÂ`8ŠÂàDŠÂHŠÂ KŠÂ WŠÂ€TŠÂ@gŠÂ pŠÂ pŠÂ }ŠÂ€†ŠÂ ‰ŠÂ –ŠÂ –ŠÂ€ŸŠÂ`œŠÂ ¢ŠÂ@²ŠÂ`µŠÂÀ¾ŠÂ€¸ŠÂàÁŠÂ ÈŠÂ@ˊ€ъ€êŠÂ úŠÂàóŠÂ úŠÂ`‹Â€‹Â ‹Â ‹Â ‹Â@/‹Âà%‹Â`2‹Â@/‹Âà>‹Â E‹Â€N‹Â`K‹ÂB‹Â E‹Â`K‹ÂàW‹ÂÀm‹Ât‹Â j‹Â w‹Â ƒ‹Â ‹Â`–‹ÂÀŸ‹Â ©‹Â`¯‹ÂÀ¸‹Â€²‹Â µ‹Â µ‹Â@ŋ ΋Â`È‹Â`È‹Â`ȋ€ˋÂ@Þ‹Â`á‹Â€ä‹Âñ‹Â ô‹Â`ú‹Â ŒÂ ŒÂàŒÂ ŒÂ ŒÂÀŒÂ€/ŒÂ<ŒÂ 2ŒÂà8ŒÂ 2ŒÂÀ5ŒÂ 2ŒÂ 2ŒÂ<ŒÂà8ŒÂ ?ŒÂ`EŒÂ KŒÂ@[ŒÂ`^ŒÂÀgŒÂ qŒÂ }ŒÂ }ŒÂ ŠŒÂàœŒÂ £ŒÂ ŒÂ ŒÂ`©ŒÂ ¯ŒÂ £ŒÂ@¦ŒÂ`©ŒÂÀ²ŒÂ@¿ŒÂ¹ŒÂ@¿ŒÂàΌ ȌÂ@ØŒÂàΌ Ռ Ռ áŒÂàçŒÂàçŒÂ€÷ŒÂ úŒÂ@   ÂÀ Â@#Â@# ,€) ,Âà2 , E€BÂÀHÂ`?ÂàK RÂàdÂÀa€[€[ÂÀaÂÀa k „€ ÂÀ“€€€ÂÀ“  €¦Âà–Â`£Â ©Â³Â@¹ÂàÈ€¿Â`¼Â ÏÂ̠πØÂ ÛÂÀÞ ÛÂàáÂàáÂàáÂàú ôÂ`îÂ`îÂàúÂ@ŽÂŽÂ€#ŽÂ€#ŽÂà,ŽÂ 3ŽÂ 3ŽÂ ?ŽÂàEŽÂ ?ŽÂ ?ŽÂ ?ŽÂ@OŽÂ`RŽÂ`RŽÂ`RŽÂ€UŽÂ`RŽÂbŽÂ@hŽÂ qŽÂ qŽÂ ~ŽÂ€‡ŽÂ€‡ŽÂ ŠŽÂÀŽÂ —ŽÂÀŽÂ ŠŽÂ —ŽÂ@šŽÂ £ŽÂÀ¦ŽÂ`¶ŽÂ ¼ŽÂ ¼ŽÂÀ¿ŽÂ ¼ŽÂ ¼ŽÂ`¶ŽÂƎ ՎÂàÛŽÂàÛŽÂ âŽÂ âŽÂ`èŽÂ€ëŽÂ îŽÂ€ëŽÂ€ëŽÂàôŽÂ  Â`Â@  Âà&   - - 9 - -Â`3Â`3€6Â@0Âà& - 9Âà?€6ÂÀ<Â@IÂÀUÂàX _€hÂàqÂ@{Â@{Âàq x xÂ`~ „ÂÀ‡Â „ ‘Â`— ÂÀ Â Âà£Â€³Â ¶ÂÀ¹ÂÀ¹Â ÃÂ@ÆÂ Ï€Ì ÏÂÙ ÜÂÙÂàÕÂÀëÂàîÂÀëÂòÂòÂò õÂÀ Â`û  Â@ÂÀÂ$€0€0 'Â`-€0Â`-ÂÀ6Â@CÂ`FÂ`F LÂÀOÂàR Y eÂ@\Â`_ eÂ@\ Y€b e e e eÂ`x€{Âà„ ‹Â —€”Â`‘ — —Âà —ÂÀšÂ¡Â@§Â`ªÂ€­Âà¶Âà¶Â€ÆÂ@À ½Â É É ÖÂàÏ Ö Ö â€ßÂ@Ù âÂàèÂàè âÂàè ïÂìÂ`õÂ`õÂà‘ÂÀþ û ûÂÀþÂÀþ ûÂÀþÂ`‘Âà‘ÂÀ‘ ‘€‘ ‘ !‘Â@$‘ÂÀ‘€*‘€*‘ -‘ :‘ F‘Â@=‘Â`@‘Â`@‘ F‘ :‘Â`@‘ :‘€C‘ÂP‘ÂP‘ S‘Â`Y‘ÂÀb‘€\‘€\‘ÂÀb‘€\‘ _‘ÂÀb‘ l‘ÂÀ{‘Âà~‘Â@ˆ‘‚‘ …‘Âà~‘ …‘ …‘ …‘ ‘‘Âà—‘Â@¡‘Â`¤‘ ž‘›‘ ž‘ ž‘ ž‘Â`¤‘ ž‘ ž‘Âà—‘Â€§‘Â@º‘€À‘ Ñ€À‘ÂàÉ‘ÂàÉ‘ÂàÉ‘Â`֑ БÂ`Ö‘Â`Ö‘Â`Ö‘Â`֑ ܑÂ@ì‘Âæ‘Âàâ‘Âæ‘ é‘Âæ‘ é‘Â@ì‘ é‘Âàâ‘€ò‘ÂÀø‘ÂÀø‘Âàû‘€ò‘ÂÀø‘ ’ õ‘Âàû‘Âàû‘Âàû‘Â`’ ’Âà’Âà’ÂÀ’ ’Âÿ‘ÂÀø‘ ’ÂÀ’Â’ ’Â’Â’Â@’Â`!’ ’Âà’Â’Âà’ ’ '’€$’ '’€$’ÂÀ*’Â1’ÂÀ*’ 4’ 4’Â@7’ 4’€=’Â@P’ÂJ’ @’ÂJ’ M’€V’ÂJ’Â`S’Â`S’€V’ÂÀ\’Â@P’ Y’Âà_’Âà_’Âà_’ Y’ f’ÂÀ\’ f’ r’ r’ ’ ’Â`…’Â`…’Â|’Âàx’ ’Âàx’€o’ ’€ˆ’Â`…’ ’€ˆ’ ‹’Âà‘’Â ‹’ÂÀŽ’Âà‘’ÂÀŽ’Âà‘’Â•’Âà‘’Â`ž’®’ÂÀ§’®’®’Â@´’Â઒®’Â@´’ ±’Â`·’ ±’ ±’ ¤’®’ ±’®’ ±’ ½’Â`·’Â`·’ ½’Âǒ ʒ€Ӓ ֒ ֒ÂÀْ€ӒÂàܒ€ӒÂàÜ’Âà’ ã’ ï’ÂàÜ’Â`Ð’Â`В€ӒÂÀÙ’Â ã’Âà’€ӒÂǒ€Ӓ ֒ ã’Â`é’ ï’€ì’Â@撀쒠㒠ã’Â`é’Âàõ’ ï’ÂÀò’Âù’ ï’ÂÀò’ÂÀò’ÂÀò’Â@ÿ’€“ÂÀ “Â`“Â`“Â@ÿ’ÂÀ “ “ ü’ “€“Âà“ “€“€““€“€“Â`“ “ “ “€“Â`“ !“Âà'“Âà'“€“Â`“ “€“ .“Â@1“Â`4“Â@1“ÂÀ$“ÂÀ$“Â`4“Â`4“ :“ÂÀ=“ G“ G“Â`M“ÂàY“ÂÀV“Â`M“ G“Â@J“€P“Â`M“ S“Â`M“ÂàY“ S“ S“€P“ÂàY“ `“ `“Â@c“Âàr“€i“€i“ `“ `“Âàr“Âàr“ÂÀo“ l“ÂÀo“ÂÀo“Âàr“Âv“€‚“Âàr“ y“Âà‹“Â ’“Â`˜“Â@•“€›“Â`˜“€›“ ž“ÂओÂओÂÀ¡“Â@•“ ’“Â`˜“€›“€›“ ž“€›“ ’“Â`˜“Â@•“ÂÀ¡“ ž“ÂÀ¡“ «“ ž“ ž“ÂओÂÀ¡“ ž“ ž“Âओ¨“Âओ¨“ «“ÂÀ¡“€´“Âན ēÂ@Ç“Â`ʓ€͓Â@Ç“Â@Ç“Â`ʓ€͓Â@Ç“Â`Ê“Âړ Г Г ГÂà֓€æ“ ݓÂ`ã“€æ“Â`ü“ÂÀì“ ö“Âàï“Â`ʓ ēÂ@à“ ݓ é“ÂÀì“ÂÚ“ÂàÖ“Âà֓ ݓ ݓÂ@à“€æ“Âàï“€ÿ“ ö“Â@ù“ ”€ÿ“ ”Â`ü“ÂÀ”Âà” ”Âà” ”Âà” ” ”Âà”€”Âà!”€”Â`” ” (”Âà!” (”Â`.” 4”Â@+” (” (”Â%”Âà!”ÂÀ” ” ” ” ” (”Â@+”Â`.”Âà!”Âà!”Â@+”€1” 4” A”Â@D” A” A”Â>”Â>”Âà:” 4”Âà:”Âà:”Âà:”ÂÀ7” A” A” A” M” M”ÂàS”ÂàS”ÂàS”€J” M”ÂàS”Â`G” A”Â`G”Â`G”Â@D” A”Â@D”Â`G”ÂW”€c”€c”ÂÀi” f”Â``”ÂàS”Â@]”ÂW”ÂàS”Â``”Â@]”ÂÀP”ÂÀP”ÂàS”Â``”Â@]”€c”€c”Âàl”Âp” s” f”Âp”Âp”ÂÀi” s”ÂÀ‚”Â`y” s”Â@v”Â`y”Âàl”ÂÀi”ÂÀi” s”Â`y”ÂÀ‚”Â`y” s” s” s”ÂÀi”Âàl” s” s”€|”Â`y”Â`y” ”ÂÀ‚”€|” s”Â`y” s”Âàl”Â`y” s”ÂÀ‚”Â`y”ÂÀ‚”‰”€|”€|” ”Â`y”Â`y” ” ” ”Âà…”Â‰”Âà…”Âà…”ÂÀ‚”ÂÀ‚”Âà…”Â@” Œ”ÂÀ›” ˜” Œ”‰”Âà…”Â€|”ÂÀ‚” ” ” ”ÂÀ‚”Âà…”Â€•”Âàž”Âàž”Â ˜”€•”ÂÀ›” ˜”Âàž”Âàž”Â¢”Â`«” ±”Â@¨” ¥” ¥” ¥” ±”»” ¾” ±”€®” ±”€®”€®”Â`«”Â`«” ±”€®”Â@¨”¢”Â@¨”€®”Â`«”Â`«”€®”Âà·”Âà·”Â`Ĕ ʔÂÔ”ÂàД€ǔ ¾”Â`Ä”ÂÀÍ”ÂÀÍ”ÂԔ הÂàД€ǔÂÀÍ”ÂÔ”Â`Ý”Â`Ý”ÂÔ”ÂàДÂÀÍ”Â`Ä”Â`Ĕ ʔÂàД הÂ`Ý”Âàé” ã”€à”€à” ה€à”ÂÀæ”€à” ã”€à”€à” הÂ@ڔ€à”ÂÀæ”Â`ݔ ã”Â@ڔ ה€à”€à” ה€à”Âàé” ð”Âàé”Â@ó”Â`ö”€ù” ü”Âà•Â@ó” ð”Â@ó”Âí”Âàé” ð”Âí”Âí” ü”Â`ö”Âà• ü”ÂÀÿ”• • ü”Â`ö” ð” ã”Âí”Â@ó”Â`ö”Â`ö”Â`ö”Â`ö”Â@ó”Â`ö”€ù”Â픀ù”€ù” ü”ÂÀÿ” •ÂÀÿ”Âà•€•Â`•Â`• • • •Âà•ÂÀÿ”Â@ ••Â`ö” ü”ÂÀÿ”€ù”€•Âà•Â@ •ÂÀ•• "•Âà•• "• "•Â@%•Â`(• "•€+• "• "•Âà•€•€• • •€•Âà••Âà• "•Âà• "•Â@%• "• "•€+• .•€+• "•Âà•ÂÀ•Âà•Â@%• "•Âà• •• "•Âà•Âà•ÂÀ•Âà• • "• •Âà•Â@%• "•ÂÀ1•ÂÀ1•Âà4•Âà4• ;•Â`A• ;•Â8•ÂÀ1•Â8•€+•Â8•€+• ;• ;•Âà4•ÂÀ1•Âà4•Â8•Âà4• .• ;• .• ;• ;• ;•ÂÀ1•Âà4• ;•Â8• G•Â`A• G•Â@>•ÂÀJ•€D• G• G•Â`A•Â@>•Â8• .• ;• ;•Â`A•ÂÀ1•€+• .•Âà4• ;•Â`A•ÂàM• T•ÂàM•ÂàM• G•ÂàM•ÂÀJ• G•ÂàM•ÂàM•Â@>•Â8• ;•Â`A•ÂàM•€D•Â@>•ÂÀJ•Â@>•Â`A•ÂÀJ• G•ÂàM• T•ÂQ• T• G•ÂÀJ• G• G•ÂàM•ÂàM•ÂÀJ• G• G•Â`A•Â`A•Â`A•Â`A• ;•Âà4• ;• ;• G•Â@>• G•ÂÀJ•€D•Â`A•Â8• ;•Âà4•€D•€D•€D• G•Â8• ;•Â`A• G•Â`A• ;•Âà4• ;•Â@%• ;• ;•Âà4•Âà4• ;•€D•Â`A•ÂàM•€D•€D• ;•Âà4• .•Â8•Âà4•ÂÀ1•€+• ;• G• G• G•ÂQ•ÂàM•€D•Â8••Â`(•••€•Âà•Â`(•Â@%•€+• .• ˘Â·Â€âΠ\ÎÂà~àC·Â@c¬Â }£Â hœÂÈ–Â@ŽÂ€[XÂ@. Â@‰€ÂÀ ÂaîÁ€–±ÁoBÁ–?AÀÄ BÀAB€'iB€^€B€‹…B±…B€9‚B»xBÀªiB@ëXBQGB€e5BÀ"$B¨B€_BTìAsÒA€A»A€¦A|’A €AÇ]AzÂÀ@ÂVBÂ@DÂ@•EÂ@óFÂHÂÀ>IÂ@EJÂ@?KÂLÂâLÂ@~MÂ'N½NÂSOÂ@ïO€rPÂQÂ’QÂ@R€˜RÂÀéRÂ;S†SÂÑSÂTÂ@TT²TÂÀöTÂ/UÂ@gUÂÀŒUÂÅUÂÞUÂÀ"VÂÀTVÂÀ†VÂÀ¸V€ýVÂÀ5W€aWÂÀ™WÂ@ØWÂ@ XÂ6X€[XšX€¿XÂþXÂ@YÂÀBY€UYÂ@hY”Y­Y€¹YÂ@åYÂZÂ@IZÂ@bZÂuZ€šZÂÀ ZÂ@ÆZÂ@ßZÂ@øZÂÀ[Â$[Â@C[Â@\[€{[ÂÀ[Â@Ž[ÂÀÌ[Â@ò[€\Â@=\Â@o\Â@ˆ\Â@¡\Â@Ó\ÂÀø\Â@]ÂÀ\]•]ÂÇ]€ì]Â@^ÂD^Â@c^ÂÀo^ÂÀ¡^€Í^Âó^Â%_ÂÀP_‰_€®_ÂÔ_€à_ÂÀ`Â@>`ÂÀc`€v`ÂÀ•`ÂÀ®`ÂÎ`ÂÀà`ÂaÂ@QaÂÀvaÂÀ¨a€Ôa€bÂ@bÂ@KbÂ@db€ƒbÂ@¯bÂ@ÈbÂÛbÂ@cÂ@,cÂXcŠc€¯cÂ@ÛcÂdÂ@ dÂ@&dÂRd€wdÂdÂ@¼dÂ@îdÂ3eÂ@ReÂeeÂ~eÂÀ©eÂâeÂ@fÂ@3fÂFfÂÀŠfÂ@—fÂÀ¼fÂÀîfÂ@gÂ@gÂ@_gÂÀRgÂrgÂ@xgÂÀ„gÂÀ¶gÂïgÂ!hÂÀ3hÂÀLhÂ@rh€‘hÂ@½h€ÜhÂ@ïhÂÀiÂÀFiÂÀxiÂÀ‘iÂ@·iÂ@éiÂÀ'jÂÀYjÂ@j€·jÂ@ãjÂÝjÂ@üjÂkÂ@.kÂZkÂ@’kÂÀžkÂÀ·kÂ@ÝkÂ@ökÂ"lÂÀMlÂ@sl€’lÂ@¥lÂ@×lÂÀülÂmÂ@;m€Zm€ŒmÂ@¸mÂËmÂým€"nÂÀAnÂÀZnÂ@€n€†nÂ@²nÂÅnÂÞnÂo€NoÂ@zoÂ@¬oÂ@ÅoÂÀÑoÂ@÷oÂ@pÂ@)pÂ@BpÂnp€“pÂÀËpÂ@ØpÂ@ñpÂqÂÀ/qÂ@Uq€tqÂÀ“q€¿qÂÌq€ØqÂ@ëqÂ@rÂÀBrÂ@OrÂ@rÂ@³rÂ@ÌrÂÀñrÂ@þrÂ*sÂ\sÂusÂ@”s§sÂ@­sÂÀësÂÀtÂÀt€0tÂVtÂÀtÂ@ŽtÂÀ³t€ßtÂ@ uÂ7uÂÀbuÂ@ou€uuÂÀ{uÂ@ˆuÂÀ­uÂÀßuÂÀøuÂÀv€=vÂcvÂ@‚v®vÂÀÀvÂÇvÂÀÙvÂÀòvÂ@ÿvÂ+wÂDwÂ@cw€›w€›wÂ@®w€æwÂ@+xÂ@DxÂÀPxÂ@vxÂ@vxÂÀ›xÂ@ÁxÂ@óxÂ@ yÂÀ1yÂ@WyƒyÂ@‰yÂÀ®yÂ@»yÂ@»yÂÀàyÂ@zÂ@zÂ@8zÂdzÂ}zÂÀvz€‰z¯zÂ@µz€ÔzÂ@çz€{ÂÀ%{ÂE{ÂÀW{ÂÀp{ÂÀp{ÂÀ‰{ÂÀ»{€Î{Â@á{Â@ú{€|ÂÀ|Â?|ÂX|ÂÀj|Âq|Š|£|€¯|ÂÀÎ|Â}ÂÀ2}Â@X}ÂÀK}€w}Â@q}€}€©}ÂÀÈ}Â~ÂÀ~Â@ ~Â@R~€X~€q~ÂÀw~ÂÀ©~Â@Ï~Ââ~Â@€€ ÂÀ?€k€kÂÀqÂÀŠ€ÏÂÀÕÂ@ûÂà€Âà€Â@&€Â /€Âà5€Â H€Â a€Âk€Â`t€Â`t€Âà€€Â`€Â€€Â  €Â€©€Âಀ Ҁ€ۀ ހÂÀú€ÂÀú€Â@ )Â3€?Â@RÂ@RÂÀ^ÂÀwÂ~Â`‡Â€ŠÂà“Â` Âà¬Â°Â`¹Â@Ï ØÂ åÂ`ë ñÂà÷Â@‚  ‚Â`‚ #‚ 0‚Â`6‚ <‚€R‚ b‚Â`h‚ n‚ ‡‚ÂÀŠ‚Â ”‚€‚ª‚ ¹‚Â@ɂ ë‚ ø‚Âà ƒÂà ƒÂ`ƒÂ€ƒÂà#ƒÂ@-ƒÂ 6ƒÂ`IƒÂYƒÂ \ƒÂ hƒÂ uƒÂ ƒÂ‹ƒÂ šƒÂ€—ƒÂ §ƒÂ ³ƒÂใ ÀƒÂ ÀƒÂàÒƒÂ`߃ÂàëƒÂ þƒÂÀ„ „ÂÀ„ÂÀ„Âà6„ =„Â`C„ =„€F„ÂàO„ b„ b„Â@r„ {„Âà„ÂÀ—„ÂÀ—„Â@¤„ ¡„ÂÀ°„ÂೄÂ`À„ۀÂЄÂ`ل€܄ ø„ ø„Â…Â` … … *… 7…Â@:…ÂàI… P…Âàb…Âàb…Âf… i… u…Â… ‚…Â Ž…Â ›…Â@ž…€¤…Â@·…ÂÀÃ…Â@Ð…Âàß…Âàß…Â æ…Â`ì…Â@†ÂÀ†Âà†Â`†Â.†ÂG†ÂG†Â V†Â J†Â V†Â c†Â`†Âàu†Â |†Â •†Â@˜†Â`›†Â ¡†Â৆ ®†Â ®†ÂÀ½†Â džÂàÀ†Â@ʆÂÀÖ†Â݆Â`æ†Âàò†Â`ÿ†Â ‡Â ‡Â ‡Â`‡Â(‡Â +‡Â 7‡Â D‡Â€M‡Â€M‡Â€M‡Â D‡ÂÀS‡Â ]‡ÂÀl‡Â v‡Â@y‡ÂÀ…‡Â ‡Â ›‡Âࡇ€±‡Â ¨‡Â ´‡Â Á‡Â Í‡Â Í‡ÂàӇ€ʇÂ@݇ÂÀé‡Â ó‡ÂÀˆÂ@ˆÂ`ˆÂÀˆÂàˆÂ 1ˆÂ 1ˆÂ;ˆÂ`DˆÂ WˆÂ€`ˆÂàiˆÂ@sˆÂ pˆÂ |ˆÂ ‰ˆÂ •ˆÂ ¢ˆÂ ®ˆÂ ®ˆÂ€«ˆÂÀ±ˆÂ¸ˆÂ »ˆÂ »ˆÂ ÇˆÂà͈ÂàæˆÂ íˆÂ ùˆÂ@ ‰Â ‰Â ‰Â‰Â`%‰ÂÀ.‰Â 8‰Â€A‰Â D‰ÂN‰Â@T‰Â ]‰Â€Z‰ÂÀ`‰Âàc‰Â@m‰Â€s‰Â`p‰Â v‰Âà|‰Â`‰‰Â ‰Â œ‰ÂÀ«‰Â€¾‰Â Á‰Âàlj Á‰ÂˉÂàà‰Â`í‰Â€ð‰Â ó‰Â`ŠÂ€ ŠÂŠÂàŠÂ@ŠÂ@ŠÂ ŠÂÀŠÂ@ŠÂ %ŠÂ@5ŠÂ >ŠÂàDŠÂ KŠÂ€TŠÂ€TŠÂà]ŠÂ@gŠÂ pŠÂ }ŠÂ`ƒŠÂ }ŠÂ`ƒŠÂ }ŠÂ`ƒŠÂÀŒŠÂÀŒŠÂ –ŠÂ`œŠÂ¬ŠÂ ¯ŠÂ@²ŠÂàÁŠÂÀ¾ŠÂ@ËŠÂÞŠÂ áŠÂ áŠÂ€êŠÂ íŠÂÀðŠÂÀðŠÂàóŠÂ‹Â ‹Â ‹Â ‹Âà%‹Â`2‹Â ,‹Â`2‹Â@/‹Â€5‹Âà>‹ÂÀ;‹Â`K‹Â Q‹Â[‹Â`d‹Â j‹Â j‹Âàp‹ÂÀm‹Â€€‹Â€€‹Âà‰‹Âà‰‹Â ‹Â@“‹ÂÀŸ‹Âࢋ ©‹Â€²‹Â µ‹Â€²‹Â¿‹Â`È‹ÂàÔ‹ÂØ‹Âàԋ€ä‹ÂÀê‹Âñ‹Â ô‹Â`ú‹ÂÀŒÂ ŒÂ€ŒÂ€ŒÂ ŒÂ€ŒÂ€ŒÂÀŒÂ`ŒÂ`ŒÂ€ŒÂ`,ŒÂ 2ŒÂ 2ŒÂà8ŒÂ<ŒÂ`EŒÂ`EŒÂ`^ŒÂÀgŒÂàjŒÂ€aŒÂ€aŒÂ€aŒÂ dŒÂàjŒÂàjŒÂ qŒÂ`ŒÂ`ŒÂ€“ŒÂ€“ŒÂÀ™ŒÂ £ŒÂ £ŒÂ€¬ŒÂ€¬ŒÂ ¼ŒÂ ¼ŒÂ`Œ Ռ€ތ€ތÂàçŒÂ Ռ€ތÂàçŒÂ`ôŒÂ îŒÂ@ñŒÂ`ôŒÂ€÷ŒÂ úŒÂÀýŒÂàÂàÂàÂ@#Âà2 ,Â`?ÂàKÂOÂàK ^Â@U R R€[ ^€[ ^ ^Â`q „Âà} „Â`ŠÂ „Âà}€  Âà–  ©Â ¶Â`¼Â@¹Â Â Û€ØÂàáÂåÂå ÛÂàáÂå€ñ è èÂþÂàúÂþÂþ ŽÂ€ ŽÂ ŽÂàŽÂŽÂŽÂ€#ŽÂ€#ŽÂ€#ŽÂ€#ŽÂ@ŽÂ@ŽÂ` ŽÂ &ŽÂ &ŽÂ€<ŽÂÀBŽÂàEŽÂàEŽÂ LŽÂ@OŽÂ`RŽÂ eŽÂ`kŽÂ qŽÂ qŽÂ€nŽÂ qŽÂàwŽÂàwŽÂ`„ŽÂ ~ŽÂ ŠŽÂ ŠŽÂ —ŽÂàŽÂÀŽÂ —ŽÂ`ŽÂ`ŽÂ £ŽÂ­ŽÂÀ¦ŽÂ`¶ŽÂ`¶ŽÂ€¹ŽÂàÂŽÂ@̎ Ɏ ¼ŽÂ@ÌŽÂ âŽÂ âŽÂÀØŽÂÀØŽÂ âŽÂ`èŽÂ îŽÂàôŽÂ îŽÂ€ëŽÂ âŽÂÀñŽÂ`èŽÂÀñŽÂàôŽÂà ÂÀ  Â@ÂÀ# -Â@0Â`3Â`3€6ÂÀ< FÂ@IÂ`L R _ _Â`eÂàq€ xÂuÂàq „ÂàŠÂàŠÂàŠÂàŠÂ`—Â`— ‘Â`~€€Â`— ÂÀ Â Â§Â§Â§Â ¶Â ÃÂ`ɠπ̠À̀ÌÂ`ɀ̠̀ÏÂàÕ ÜÂ`â è èÂàîÂòÂ@øÂÀë õ€åÂàîÂ@øÂ`û Â@ÂÀÂà €   Âà  ' 3€0ÂÀ6 @Â`FÂ`F€IÂÀO L L LÂÀOÂàRÂ`_ e e eÂàk e e rÂ`x ~ÂÀÂ`xÂà„Âà„ÂÀ ‹Â@ŽÂ — —€­Â °Âà¶Â °ÂºÂ`ªÂ`ªÂÀ³Â`ªÂÀ³Âà¶Â °ÂºÂ`ÃÂÀÌ É ÉÂÀåÂÀåÂÀåÂÀåÂì â â â âÂÀåÂÀåÂàè ï ïÂ@ò ûÂÀþÂà‘ ‘Âà‘‘ ûÂ`‘ÂÀ‘ÂÀ‘‘ !‘ !‘ !‘Â@$‘Âà3‘ -‘ -‘ :‘Âà3‘Â7‘Â`@‘Â`@‘ F‘ S‘ S‘ÂàL‘ÂÀI‘ S‘Â@V‘Â`Y‘ S‘ S‘Â@V‘Â`Y‘ _‘ÂÀb‘ l‘Âi‘Âàe‘ l‘Âà~‘Â`‹‘Â€Ž‘Â …‘ ‘‘Âà—‘ÂÀ”‘›‘Â`¤‘€§‘€§‘Â`¤‘ÂÀ­‘Â`¤‘ÂÀ­‘€§‘Â఑ ª‘ÂÀ­‘Â఑ ª‘Â఑€À‘ÂàÉ‘Â͑€ّÂ@Ó‘Â@Ó‘Â é‘ÂÀߑ€ّÂ`֑€ّÂ`֑ ܑ€ò‘€ò‘Âàû‘ ’Â@’ ’ ’Â@’Âàû‘Âàû‘Âàû‘€ ’€ ’ ’ÂÀ’Â@’ ’Â`’Â’Âà’Â@’Â`’€ ’Âà’Â`!’ '’Â@’€$’ '’ 4’Âà-’ 4’€=’ @’ÂÀC’ÂÀC’Â@P’Â@P’€V’ @’ @’€=’ 4’ 4’ 4’Âà-’ÂÀC’Â@P’ Y’ÂÀ\’ÂÀ\’Âà_’Âà_’Âc’Âà_’ f’ f’€o’Â@‚’ ’Âàx’Â|’Â|’€ˆ’Â`…’ ’Â`…’Â|’Â@‚’Â`…’Â`…’ÂÀŽ’Â•’Âà‘’Âà‘’ÂÀŽ’Â€¡’Âà‘’Â@›’Â઒€¡’€¡’ ¤’ ¤’ÂÀ§’®’€º’®’ ±’Â@´’Â`·’ÂàҀº’ ±’€º’Â`·’ ±’ ±’Â`·’ÂàÒ ½’ ½’€º’ÂàÃ’Â`В ֒ ֒Â`В ֒ÂàÜ’Â ã’€ì’Âà’€ӒÂ`é’ ï’ ï’€ì’Â`钀쒠ì’Â@æ’€ì’Âù’ ü’ “ “Âà“Â`“Â@“ !““Â@“Â@“Â`“ !“ÂÀ$“€“€“Âà'“ !“€“ !“€7“€7“Â`4“Â@1“Â@1“Â`4“ .“Â@1“ :“€7“Â`4“ÂÀ=“ÂÀ=“Âà@“ G“ÂàY“ S“ S“ S“€P“ S“ S“ S“Â`f“€i“Â`f“Âàr“Âàr“Âàr“Â@c“ l“Âàr“€i“€i“ÂÀo“Âàr“€i“ l“ÂàY“ `“€i“€i“ l“ÂÀo“Â@|“€‚“Âà‹“Âà‹“Âà‹“Â€›“Â`˜“ ’“Âà‹“Âà‹“Â …“ÂÀˆ“ ’“Â`˜“Âà‹“Âà‹“Â“Â ž“ ž“ÂÀ¡“ÂÀ¡“ ž“ ž“€›“€›“¨“Â`±“ «“Âओ€›“ ž“ ž“ «“Âओ¨“ «“Â`±“Â@®“Â`±“€´“Â@®“€´“ÂÀº“ÂནÂÀº“ ·“ÂནÂÀº“ÂÀº“ ēÂནÂ`ʓ ГÂà֓ ݓ é“ÂÀì“Âàï“ é“€æ“Â`ã“Â@à“ é“Â`ã“Â`ã“ Г ݓÂàÖ“ÂÀÓ“Â`ã“€æ“Âàï“ ö“Â`ü“ ” ” ”€ÿ“ ”Â`” ”Âà”Âó“Â@ù“Âà”Â`” ”€”Â`”Â@”Â`” ”ÂÀ”Âà!”Âà!” (”Âà!” (”€1”Â@+”Âà!”Â%” 4”Âà:” 4” 4”Âà:” 4”Â`G” A”Â@D”Â@D” A” M”€J”ÂàS”Â@]” M”ÂàS” M”ÂàS” M”Â@D” A”ÂÀP”ÂàS”Â``”Âàl” s” s” s” f” f”ÂàS”Â@]” Z”ÂW”Â``”Â``” f” f”Âp”Âàl”Â@v”ÂÀi” f”ÂÀi” f”Â@v” ”Â@”Â@”‰” ” Œ”Â@” ˜”Âàž”Âàž”Â ˜” Œ”€•”€•”Â`’”Â`’”Âàž”Â ¥”Âàž”Âàž”Â¢”€®”€®”€®”Â@¨”Âු»” ʔÂ@Á”Â`Ĕ ʔ€ǔ ¾”€ǔÂ`Ĕ ʔ ʔ הÂàДÂàДÂԔ ה הÂ@ڔ€à”€à”€à” ã”€à”ÂԔ הÂÔ”ÂÀ͔ הÂàДÂàДÂÀÍ”ÂàД הÂ`Ý”ÂÀæ” ã”Â`ݔ€à”Â`Ý”Â`ݔ ã” ã”Â@ڔ ʔÂàДÂԔ€à”Âàé” ü” ü”Â`ö” ð”€ù”Âí” ð” ã” ð”Â@ó”Â@ó” ü”Â@ •Â`•Â`• •Â@ •ÂÀ•€• "• •ÂÀ• "•€••Âà•€• • • •€• •Âà•Â`(•€+•€+•€+• .•Â8• .•Â8•Â`(•€+• "•ÂÀ• •Â`••Â@%•ÂÀ1•ÂÀ1• ;• .• .•Âà4•Â8•Âà4• ;•Â8• G•ÂÀJ•ÂàM• G•ÂQ•ÂQ•Â`Z• T•ÂQ• G•€D• G• G•ÂàM•ÂàM• G•ÂQ•ÂÀJ•ÂàM•ÂàM• ;• ;• G•ÂàM•ÂÀJ•ÂQ• T•ÂàM•ÂàM•€D•Â`A•Â@W• `•ÂÀc•Âj•Âj• m•Âj•Âàf•ÂÀc•Â`Z•ÂQ• T•Â@W•Â@W•Â`Z•€]• `• `•Âàf•ÂÀc• m• m• `•ÂàM•ÂQ• T•Â@W•Â@W•Â@W• T•ÂQ•ÂQ•ÂQ•Â`Z•Â@W•Â`Z•Â@W• G•ÂQ•ÂQ• T•ÂÀJ•Â`A•ÂÀJ• G• ;•Âà4•€D•ÂàM•ÂàM• G•ÂÀJ• T•ÂQ• T•Â@W• G•€D• G•ÂÀJ•ÂÀJ• T•Â`Z•Âàf•Â@W• T•ÂàM•Â@W•ÂàM• G• G• T•Â@W•Â@W•Â`Z•ÂàM•ÂàM•€D•ÂàM•ÂÀJ•Â`Z•ÂQ•ÂQ•€]•Â`Z• `•Âàf• `•ÂÀc•Âj•Âàf• m•Â`s•Âj•ÂÀc•ÂÀc• `•Â@W•Â`Z•€]•Âàf• `•€]• `• `• m•ÂÀc•€]•€]•Âàf• m•ÂÀc•ÂÀc• m•Âàf•Â`s•Âà• y• m•Âj•Âàf•Âj•Âj•Âàf•Âàf•Âj• m• m•Â@p•€v•ÂÀ|•€v•Â@p•Âj•Â@p•Â`s• y•Âj• `•Â@W•ÂQ•€]•Âàf• m•Â`s•Âà• †• y•Âà• †•Â@‰•ƒ• †• †•ÂÀ|•Â`s•Â@p•Âj• y• y• y• m• y• †•Âà•Âà•ÂÀ|• †•Âà•Â`Œ•Â@‰•€•Â`Œ•€•€• ’• ’•Â`Œ•Âà˜•Â€•Âà˜•Âœ• Ÿ•€¨•œ•Âà˜•Â€•Â@‰•Â@‰•Âà•€v•Âà• ’•€•ÂÀ••€•Â@‰•€•Â`Œ• ’•ÂÀ•• Ÿ•œ•ÂÀ•• Ÿ• Ÿ• Ÿ• ’•Â@‰•€•Â`Œ•Âà•€v• y• y•ƒ•Â@‰•ÂÀ••Â`Œ•ÂÀ|• y•Âà•Â`Œ•€•Â`Œ• ’• ’•ÂÀ••ÂÀ••€•€•Â`Œ• ’• Ÿ•ÂÀ••ÂÀ••Âà˜•Â@‰• †•Âà˜•Âœ• «•Âà˜•Â ’•Â`Œ• ’•ÂÀ••ÂÀ®•Â`¥• Ÿ•œ•Âà˜•Â Ÿ• ’• Ÿ• Ÿ• «• Ÿ• Ÿ• «• «•µ•€¨•Â`¥•ÂౕÂÀǕ€Á• ĕÂÀǕ ĕÂౕ ¸• ¸•ÂÀ®•€¨• «•Â@»• ĕ€Á•Â`¾•€Á•Â`¾• «• «•Â`¥•€¨• «•€¨•ÂౕÂÀ®• «•ÂÀ®•Â`¥• «•Â@»•Â@»•Â`¾•Â`¾• ¸•Â`¾• ¸•ÂÀ®•ÂÀ®•Âౕ «•€¨• ¸• ¸•Â@»• ĕ€Á• ĕÂΕ ĕÂàʕ ѕÂΕ€Á•Â`¾•Â@»• ¸• ¸• ¸•Âౕ ĕ ¸•ÂÀ®•Âౕ ĕÂ`¾•ÂౕÂ`¾•Â@»• ¸•Â@»•Â@»• ĕÂ`¾• ¸•µ•ÂౕÂౕÂౕÂ`¥•€¨•ÂౕÂÀ®• «•Âౕ ¸•Âౕ ¸•Â`¾•€Á•Â@»•ÂàÊ•ÂÀÇ•ÂàÊ•ÂΕÂÀǕ ĕÂ@»• ĕÂÀÇ•ÂÀÇ•Â`¾•Â@»• ¸•ÂౕÂÀ®• ¸•Â`¾• ĕ ĕ ĕÂ`¾• ĕ ¸•Âౕ ¸•ÂౕÂౕ ¸•ÂÀ®•Âౕ€Á• ¸•Â@»•€Á•Â`¾• ĕÂΕ ѕÂΕÂÀÇ•Âàʕ ĕÂÀÇ•ÂÀÇ•ÂΕÂΕÂ`¾• ¸•µ• ¸•ÂÀÇ•Â@Ô•Â`וÂ@Ô•Â@Ô•Â@Ô•Â Ñ•ÂÀǕ ĕ ѕÂ@ԕ ѕ ѕÂ`¾•ÂÀǕ ĕÂΕ€Á• ĕ ĕ€Á• ¸• ĕ ĕÂàÊ•ÂΕÂÀǕ ĕ€Á•€Á•ÂàÊ•Âàʕ€Á•ÂàÊ•ÂΕ ݕÂ`וÂàʕ ĕÂàÊ•ÂΕÂΕ ѕ ѕÂàÊ•Â`ו€ڕÂÀà•€ڕÂ`וÂ@ԕ ݕÂ@ԕ ѕ€Á•ÂàÊ•ÂàÊ•ÂàÊ•Â@ԕ€ڕ ê• ê•Â`ð•Â`ð•Â@í•Â@í• ݕÂàã•Âç•€ڕÂ`ו ݕ€ڕ ݕÂ@í•Â`ו ѕÂ`וÂ`ð•€ó•Âàã•ÂÀù• ö•Â`ð• ê•Â@í•Â@í•Â@í•Â`ð•Âç• ݕÂ`וÂÀà• ѕÂ`ו ê• ê• ê•Âàã•€ڕ ݕÂ`ו€ڕ ѕ ݕ ݕÂ`ð•Â@í•Â`ð•Â`ð•ÂÀù• ö• ö•ÂÀù• ö•Â`ð•Â@í•Âàã•Âç•Â@í•Â`ð• ö•€ó•€ó•Â`ð•Â`ð•ÂÀù•Âàü•ÂÀù• ––Âàü• ö• – – ö•ÂÀù•Âàü•Â` – –ÂÀ– – ––Â` –Â@–ÂÀù•€ó•€ó•Â`ð•Âàã• ê• ê•Âàã• ݕÂç•Âç•Âàã•ÂÀà•€ڕ€ڕÂ`וÂ`ו ݕ ݕÂ`וÂ`ו ݕÂç•ÂÀà• ݕ ѕ ѕÂ`וÂ`וÂ`וÂÀǕ ĕÂÀÇ•ÂÀǕ ѕÂ`ו ѕ ݕ ê•Âàã•Âàã•€ڕÂàã•Âç•Âàã• ݕÂ@Ô•Â@Ô•Â Ñ•Â`וÂàã•Âàã•Âàã•Âàã•ÂÀà•Â`וÂΕ ѕ ѕÂàÊ•ÂΕÂàÊ•ÂÀÇ•ÂΕ ĕ ѕ ѕ€ڕ ѕÂ@Ô•Â`ו€ڕ ݕ ݕÂç•Âàã•Â`ð•€ó•Â`ð•€ó•Â@í•€ó•Â`ð• ö•Âàã•Âç•Âç• ê•€ó•– –Âàü• ö•Â`ð•Â`ð•Â`ð•Â`ð• ê• ê•€ó•ÂÀù•ÂÀù•Âàü•Â@––Âàü•Â` – – – –Âàü•€ó• ö•Â`ð• ö• ê•Â`ð• ö•€ó•€ó•€ó•Â@í•€ó•Â`ð•ÂÀù• ö•Â@í•€ó•ÂÀù• –Âàü• – – ö•Â`ð• ö• ––Â@–Â@–Âà– –Â`"–€%– – –Â`"–– ––Â` –Â` –€ –––––Â` –Â@–Â` – – –Â@–Â` – – –Âàü•Âàü• – –Âàü•Â@–Â@–€ –Â`"––Â@–ÂÀ– – –Â` – –Âà–Âà– – – –Âà– –Âà–€ – – –Âà–Â`"–ÂÀ+–ÂÀ+– (––Âà–Âà– – –€ – –€ –Â` – –Â` ––Âà– –Â`"–Â`"– (–Â@– –Â`"–Â@– ––Â@–Â@–Â@– – (– (– (–Âà.–ÂÀ+–€%–€%– (–€%– (–Â`"–Â`"–Â@– (–Â@–Â`"–€%– (– (–Âà.–ÂÀ+– –Â@– 5–ÂÀ+–Âà.–ÂÀ+–Âà.–Â2–Â`"– –€%–ÂÀ+–Â@8– 5– (–€%–ÂÀ+–Âà.–Âà.–Âà.–Â`;–€>– A–Â@8–Â@8–Âà.–Âà.–Â2–Â2–Â@8–Â2– 5– 5–Â@8–Â`;– 5– A–Â`;–€>– A–€W–ÂK– A–Â`;–Âà.– 5– A– A–Â`;–ÂàG–€>–Â`;– 5–Â`;– A–Â@8–Â@8–€>–€>–ÂK– A–ÂK– A– A–€>–Â`;–ÂÀ+–Â@8–Â2– 5– A–Â@8–Âà.– 5–€>– A–ÂàG–Â`;– 5–Âà.–Âà.– 5–Â`;–€>– A–€>–Â@8– 5–Â@8–€>– A–Â@8–ÂàG–Â@8–Â@8–Â2–Â`;– A–ÂK– N–Â@Q–ÂàG– N– Z–Â@Q– A– A–€>– A–ÂàG–ÂK–ÂàG–ÂK–Â@Q–Â@Q–ÂàG–Â@Q–€W–Âà`–Â@Q– N– N–ÂàG–€>–ÂÀD–ÂàG–ÂàG– N– N– Z– N–ÂàG– A– A–ÂÀD–ÂK–ÂàG– N–ÂK–Â@Q–Â@Q–€W– Z–€W– Z–Âà`– Z–Âà`– N– Z– Z– Z– g–€p–Â`m– s–€p– g– Z–Âà`–Âà`–ÂÀ]–€W– N–€W–Âà`– g–€W–€W– Z–ÂÀ]–Â`m–Âà`–Âd–Âà`– g–Â@j– g–Âd– Z–€W–Â`T–Â`T– Z– g–Â@j–Âd–Âà`– g–Âd– s– s– g–€p–€p–Âày– s–€p–Âày– s–Âà`–Âà`–Âà`– Z– Z–Âd–Âd–Â`m–Â`m– g–Â`m–€p–Âày– s–Â@j–Â`m–Â`m–ÂÀv–Â@j–ÂÀ]– g– g–€p–Â`m– g– s–Â`m–Âày–€p– s–ÂÀv–€p–Â@j–€p–€p–€p– s–Âày–€p–Â`m–€p–ÂÀv–Âày– s–Â}– €–Âày–€‰–Âà’–Â`†–Âà’–Â Œ–Âà’–ÂÀ–€‰– Œ–Â`†–ÂÀ––– ™– ™–ÂÀ–€‰– Œ–Â@ƒ– €–Âày–Â@ƒ–€‰– €– s– s–€‰–Â`†–Â`†–€‰– Œ–Â@ƒ–Â@ƒ–Â@ƒ–Â@ƒ–Âà’–ÂÀ– ™–Âà’–Â€‰– Œ–Âà’–ÂÀ–Â`†–€‰–Â`†–€‰– Œ– ™–Âà’–Â Œ– Œ–€‰–Â`†–€‰–€‰–ÂÀ– ™– ¥– ¥–Âà«–Â@œ– ™–Â`Ÿ– ¥–ÂÀ¨–ÂÀ¨–Â`Ÿ– ™–Â`Ÿ– ¥– ¥–Â૖¯–Âà«–Âà«–ÂÀ¨–€¢– ¥–€¢–Âà’–Â€‰– €– €– Œ–€‰–Âà’–Â ™–Â`Ÿ– ™–ÂÀ–€‰– €–Â@ƒ–€‰– Œ–€‰–Â`†–€‰– €– €–Â}–Â`†–€‰– Œ– Œ–––Âà’–Â€‰–Âà’–Âà’–Â ™––– Œ–Â@ƒ–Â`†– Œ–––Â@œ–––Â`†– €–Â@ƒ– s–Âày–Â`†–ÂÀ–Âà’–Âà’–Âà’–Âà’–Â––ÂÀ–ÂÀ– Œ–Â@ƒ–Â@ƒ– €–ÂÀv–Â@ƒ– Œ–Âà’–Â ™– Œ–Â`Ÿ–Â`Ÿ–––ÂÀ–€‰– €– €– €– s–Âày– €– s–€p–€p–€p– €–Âày–Â`†–Â@ƒ–Âày–Âày–Âày– €–Â}–Âày– €–Âày–Âày–Âày– Œ–Â`†– Œ–€‰–––ÂÀ– Œ–––Âà’–Â`†– Œ–Â`†–€‰–€‰–ÂÀ–Â@ƒ– €–Âày–€p–Â`m–Â`m–Â`m– s–Âày–Â}– s–Â`m– s– s– s–€p–Âày–Â@ƒ–€‰–ÂÀ–Â`†–€‰– Œ–Â`†–€‰–€‰–Â`†–Â@ƒ– €––– Œ–€‰–ÂÀ–Â@œ–Â`Ÿ– ™– Œ–€‰– Œ–Â@ƒ–Â`†–Â`†– €– €–ÂÀv– €– Œ–Â`†–Â`†– €– €–Â}–Â`†–Âà’–Â Œ–Âà’–Â@œ–ÂÀ–Â@œ–Â@œ–Â@œ– ¥–€¢–Â`Ÿ– ™–Â`Ÿ–Â`Ÿ– ™–Â`Ÿ–€¢–––€‰– ™– ¥– ™–––––€¢––– ™–€¢–ÂÀ¨–ÂÀ¨–Â૖¯–ÂÀ¨–ÂÀ¨–Â@œ–Â`Ÿ– ¥–ÂÀ¨– ¾–€»– ²– ²–Â@µ–ÂàĖ ¾–ÂȖ ¾–Â@µ–Â`¸–€»–€»–Â`¸– ¾– ²–€»– ¾–ÂÀÁ–ÂȖ ¾– ¾–Â`¸–ÂÀÁ–ÂàÄ–ÂÈ–ÂàÄ–ÂÀÁ–Â`¸–ÂàÄ–ÂȖ ˖ ˖€»– ¾– ˖Â@Ζ זÂÀÚ–ÂàÝ–ÂàÝ–Â`Ñ–Â`Ñ–Â`і€Ԗ€ԖÂàÝ–ÂàÝ–Âá– ˖ ˖ÂàÄ–ÂÈ–ÂÈ–ÂàĖ ˖ ז זÂ`і זÂÀږ€Ԗ ˖€ԖÂÀږ€ԖÂȖ זÂÀÚ–Â@ç– ä–€í–Â`ê–ÂàÝ–ÂÀÚ–Â ä–Âá–ÂÀږ€ԖÂ`і ז זÂàÝ–ÂÀÚ–ÂÀږ€ԖÂàÝ–Âá–€ԖÂÀÚ–ÂÀږ ז זÂ`і ז€ԖÂàÝ–Â`ê–Â`ê–Â@ç– ð–Âú–Âàö–Âú–Âú–Âàö–Âàö–€í–Â`ꖀ햠ð–ÂÀó–ÂÀó– ý–Âú–Â`ê–Â@ç–Âàö– ý–Â`— ý–€—€—ÂÀ —Âà—Âà—€—ÂÀ —ÂÀ — — —Âà—Â`—Â@— — —Â@—Â@— —Âà—€—Â@—€—€—ÂÀ —Âà— —Â@—€—Â@—€—Â@—€— ——Â`—Â@—Â`—€—Âà(— "— "— /— /—Âà(—ÂÀ%— /— "—Âà(— "—Âà(— "— "—Â,— /—Â`5— ;—ÂÀ>— ;—€8—€8— "— "——Âà— "— "—Â@—Â`—€— "— "— /— /— /—ÂÀ%—Âà(—Âà(—ÂÀ%—Â@—Âà(—Âà(—Â,—ÂÀ%—ÂÀ%—€— "— —€—Â`— "— "— "—ÂÀ%—Âà(—Âà(—ÂÀ%— "— "—€—€— "—Â,— ;—Â`5—Â`5—ÂE—Â@K— H—ÂÀ>—ÂÀ>— ;—ÂE— H— ;—Â`5—€8— ;— H—Â@K— H—€Q—Â`N—ÂàA—ÂÀ>—ÂàA—Â`5—ÂÀ%—Â,—Âà(—Â,—Â,— /—€8—Â@2—ÂàA—ÂàA—ÂÀ>— H— H—ÂE—ÂàA—ÂàA—€8—ÂE— ;— ;— ;—ÂÀ>—ÂàA— ;— ;—ÂÀ>— ;—ÂàA—Â`N—€Q— H—ÂàA—ÂE— H—Â`N— T—Â^—Â@K— ;— ;—Â`5— ;— ;—ÂàA— H—Â@K— ;—ÂàA—Â@K—Â`N—Â`N—Â@K— H—Â@K— T—ÂÀW— a—ÂàZ—Â@K— T—Â`N— H—Â@K—Â`N—ÂàZ—Â@d— a— a—Â^—Â^—ÂàZ—ÂÀW—ÂàZ— a—Â`g— m—€j—Â`g—Â`g— a—€Q— T—ÂàZ— T— T—ÂÀW—ÂÀW—Â`N—ÂE—Â@K—€Q— H— H— H—Â@K—Â`N—ÂàZ—ÂÀW—Â`N—Â@K—Â`N— H— H—ÂE—ÂàA—Â`N— T— T— T—ÂàZ—ÂÀW— T—€Q—ÂàZ—€Q—Â`N—Â^— T— T—Â^—Â^—ÂÀW—Â`N—Â`N—ÂàZ— T— H—Â`N— T— T— T—Â^— a— T— a—ÂàZ—ÂÀW—€Q— a—Â`g—€j— m— a—Â^—ÂÀW—ÂÀW—ÂàZ— T—€Q—Â@K—€Q—ÂÀW— a—Â^— a—Â@d—Â^—ÂÀW—ÂàZ— T— T— T—€Q— a—Â^—Â`N— T— T—ÂÀW—ÂàZ—Â`g— m— m—Â^—Â@d—ÂàZ— T— a— a—Â`g—Â@d—€j—Â@d—ÂàZ—Â`g— m— m—Â@d—Âàs— m—€j—Âàs—ÂÀp—Â@d— a—ÂÀp—ÂÀp— m— m—ÂÀp—Âàs—ÂÀp— m—ÂÀp—ÂÀp— z—Âàs—Â@}— m— z—Âw—Â@}— z— z—€ƒ— z— z— m—Âàs— z—Â`€—€ƒ—Âw—Âàs— z—Âàs— z—ÂÀp—Âw— z—Â@}— †— †—ÂÀ‰—Â`€—Â@}—€ƒ—Â`€— †—Â`€—€ƒ— †—Âàs— z— z—Â`€—€ƒ—ÂàŒ—ÂÀ‰—ÂàŒ—Â€œ— “—— “—— “— “—ÂÀ‰—€ƒ— z—ÂÀp—Âàs—Â`€—€ƒ—€ƒ—Â`€—Â`€— †—Â`€—ÂàŒ—ÂàŒ—ÂÀ‰——— †—— “—ÂàŒ—Â †—ÂÀ‰—€ƒ—€ƒ—Â`€—Â`€—Â`€—€ƒ— †— “—Â@–—Â`™—€œ— “— †—Âw— z— †——ÂàŒ—Â@–—€œ—€œ—€œ—Â@–——— “— “—ÂàŒ—ÂàŒ—Â—ÂÀ‰— †—ÂàŒ—Â€ƒ——— “—ÂàŒ—Â@–—€œ—Â`™— Ÿ—Âॗ Ÿ—ÂàŒ—Â@–— Ÿ—ÂॗÂ`²—Â`²—ÂÀ»— ¬—Âॗ ¬—ÂÀ¢—Âॗ ¬— ¬—Â`™——Â`™— “——— “—Â`™—— Ÿ—ÂÀ¢— ¬—ÂॗÂÀ¢—ÂॗÂÀ¢—ÂÀ¢—ÂÀ¢—Â@¯—€œ—Â`™—Â`™— “—€œ—€œ—Â`™— “—Â`™— “— “—Â`™— “—ÂàŒ—Â—ÂàŒ—Â “—ÂàŒ—ÂÀ‰—€œ— Ÿ—ÂॗÂॗÂÀ¢—Â`™—Â@–—ÂÀ¢—ÂॗÂॗÂ@¯—ÂÀ¢— Ÿ—ÂॗÂॗ€œ— Ÿ—ÂॗÂ`²—Â@¯— ¬—€œ—Â@–— Ÿ—Â@–— “—ÂàŒ—ÂàŒ—Â “— Ÿ—Â`™—Â`™—Â`™— Ÿ—€œ—Â@–— “—ÂàŒ—Â€ƒ—Â`€— †— †— z—Âàs— m—Â`g—Â`g— m—Âw—Âàs—ÂàZ—€j—Âàs—Â@}—ÂÀp—€j— a— a— m— a— a—€j—€j—€j—€j—Â`g—ÂàZ— T— a—Â`g— a— a— a— a—Â`g— m— m—Âw— m— z—Âw—Âàs—€j—€j— a— T— T—€Q— T—Â`N—Â`N—Â`N—Â`N—Â@K—Â@K—Â`N— T— T—€Q—Â@K— T—Â`N—€Q—ÂàZ—€Q—Â@K—Â`N—Â@K—ÂÀ>—ÂàA—ÂÀ>—ÂE—Â@K—Â`N—€Q— T— H—ÂàA— H— H—ÂàZ—ÂÀW—€Q— T—ÂàZ—€Q—€Q— T—ÂÀW—ÂàZ— T—ÂÀW—Â^—ÂàZ— m—€j— m—ÂàZ—ÂÀW—€Q— T—Â`N—ÂàZ— T— T—€Q—€Q—ÂàZ—ÂÀW—€Q—€Q— T— T—Â`N—ÂàA—€8—ÂàA—Â@K—€Q— a— a— a—Â^—ÂàZ—Â`N—ÂE—ÂàA— H—ÂE—Â`N— H—Â`N—ÂÀW—ÂàZ— T— T—€Q—€Q— T—ÂÀW— T—€Q— a— T—ÂÀW— T— T— a—Â@d—Â`g— a—Â@d—Â@d—Â@d—ÂàZ—ÂàZ— T—Â@d— a— T—Â^—ÂàZ—Â`N—Â`N—Â`N— T—ÂÀW—ÂÀW— T—ÂÀW— a—ÂÀW—Â@d—Â^— a—€Q— T—Â^— m—Â@d—€j— m— m—Âw—ÂÀp—Â^—Â`g—Â`g—Â`g—Â@d—Â^— a—Â^—€Q—€Q—Â^— a—Â`g—Â^—ÂàZ— T—ÂàZ—€Q—ÂÀW—Â^—Â@d—Â`g—Â@d— m— a—Â^—Â@d— m— z—Âàs—Âàs— m—€j—Â`g—Â^—Â^—Â@d—ÂÀW— a— T—ÂÀW—ÂàZ—ÂàZ—ÂÀW— a— a—Â@d—Â@d—Â@d— m— m—Âàs—€j— m—Â`g—Âàs—Â@}—Â@}— z— z— m— m—Â`g—Â`g—€j— m— m—Â`g— m—Â`g—€j—Âàs—Â`€— z—Âw—Âàs—€j— a—ÂÀp— z—Âàs—Âàs—Âw—Â`€—ÂàŒ—Â †—Â`€—Â`€— z—Âw—Â`€— z—ÂÀp—Âàs— m—Âw—Â@}—Âàs—Âw—Âàs— z—Âw—Âàs—Âw—ÂÀp— z— z—Â`€— †—€ƒ—Â`€—Â`€—ÂÀp— m—Âàs— z—Âw—Â`€— z— z—Âàs— z—Âw—€ƒ—Âw—Âàs—Âàs—Â`g—€j—Â`g— a—€j—Â@}—Âàs— z—Â`€— z—Âàs—Âàs— a—Â^— a—Â^— a— a— a—Â`g— m— z— m—Â@d—Â@d— m— z— m— a—Â@d—€j—Â`g— z— z—Âàs—Âàs— z— z— z—Âw—Âw— m— m— m—Âàs—€j—Â^—€j—Â`g— m— a—Â^— m—Âàs—Âw— m— z—ÂÀp—Âàs—€j— m— m—€j—Â`g—ÂÀp—Âàs—ÂÀp— m—Âw— z—Âàs—ÂÀp— m—Â@}—Â`€— m—Âàs—Âàs—Â`€— z—Âw—Âàs—Â@}— †—Â`€— †— †— †—Âàs—Âàs—Âàs—Â`g—Âàs—Â`€—Â@}— z— z—Âàs—Â@}— †—ÂàŒ—Â “—ÂÀ‰— z—Â`€—€ƒ—€ƒ— z—Â`€—ÂÀ‰— †—Â@}—Â@}—Â`€— †—Â`€—Âw—Â`€—Â@}—Âw—Â`€—Â`€—€ƒ—ÂÀ‰—ÂàŒ—ÂÀ‰— z—ÂÀp—Âw—Â@}— z—Âàs—Â`€— †— z— z—Â`€— z—ÂÀ‰—€ƒ—Â`€—ÂÀ‰— †—Â`€—ÂàŒ—ÂÀ‰—€ƒ—Â`€— †—Âw—€ƒ—Â`€—Âw—Âàs—Âw— z— †—ÂÀ‰— †—€ƒ—Â`€—€ƒ— z— †—ÂàŒ—Â—ÂàŒ—ÂàŒ—Â †— †— †—ÂÀ‰— †—ÂÀ‰— †— †— †— †—Â@}—Â@}—Âàs—Â`€— †—€ƒ— †— †——ÂàŒ—Â z—Âàs— m—ÂÀp—Â`g—Â`g—Â`g—Âàs— z—ÂÀp— m—Âàs— z—Âw—Â@}—Â@}— z—Â@}— z—Âw— m— a— a—Â`N—ÂÀW—Â@d—Â`g—€j—€j—Â@d—Â@d—Â@d— m—Â`g— T—ÂàZ—ÂàZ—€Q—ÂÀW—€Q—€Q—ÂÀW— T—ÂàZ— T— H— H—ÂE— H—ÂàA— ;—€8— /—Â,— /—Â`5—ÂàA— H— ;—Â@2—Âà(—Âà(— "— "—Â`—€—Â`—Â@—Â`—Â`—Â@—€— "— "—Â`——Âà—  —ÂÀ —ÂÀ —  —Â`—  —Â@—Â@2—€—Âà—ÂÀ —  —Â`—Âú– ý– ý– ý–  —Â`—ÂÀ —Âà— ý–Â@—Âàö–Âú– ý– ð–Â`ê–Âá–Â@疀햠ð–Âú–Âàö– ý– ý–Â@ç–Âàö– ð–Â`ê– ð–€í– ä–Â`ê– ð–Âàö–  —Âú–Â`ê–Â`ê– ä–€ԖÂ@ΖÂ`Ñ–ÂàÝ–ÂÀږ€ԖÂᖀ햀햠ð–€í– ð–€í–€í– ä–Â`ꖀ햀í–Â@ç–Âá–€Ԗ€Ԗ€ԖÂ`і€Ԗ ז€Ԗ ä–Âá–ÂàÝ–ÂàÝ–ÂÀږ ז€Ԗ ז ז זÂ@ΖÂ@Ζ ˖Â`і זÂ@Ζ€Ԗ זÂ`і ¾–Â`¸– ¾–ÂÈ–ÂȖ€ԖÂ`Ñ–Â@Ζ זÂàÝ–Â`ê–€í–Â@ç– זÂ@ΖÂàÄ–ÂÈ–ÂàÄ–ÂÈ–Â Ë–Â@ΖÂ@ΖÂ@Ζ ˖ÂÈ–ÂÈ–Â Ë–Â Ë–Â@ΖÂ@ΖÂÈ–Â Ë–ÂÈ–Â Ë–Â`¸–ÂÀ¨– ²–€»– ²– ²–¯–ÂÀÁ–ÂàÄ–ÂÈ–ÂàÄ–ÂÀÁ–ÂàÄ–Â`¸–¯– ¾–Â૖ ¥–Â૖¯–ÂÀÁ–ÂÀÁ–Â`Ñ–Â`Ñ–ÂÈ–Â Ë–ÂÀÁ–€»– ²– ¾–ÂÀÁ– ¾–ÂÈ–Â@ΖÂàÄ–Â ²– ²– ²– ²–Â૖¯–¯– ²– ²– ¾– ²–¯– ¥– ¥– ¥–Â૖ ¥–Âà«–Â ²–Â`¸–Â`¸– ²–Âà«–ÂÀ¨–Â`Ÿ– ¥–ÂÀ¨–¯–ÂÀ¨–Â૖ ¥–ÂÀ¨– ²–Âà«–Â૖ ¥–€¢–ÂÀ¨–Âà«–Â ™–Â`Ÿ–€¢– ¥– ¥–ÂÀ¨– ¥–Â`Ÿ–Â`Ÿ– ¥–ÂÀ¨–ÂÀ¨–Â`Ÿ–Âà«–ÂÀ¨–€¢–Âà’–Âà’–ÂÀ– ™– ™–ÂÀ– Œ–ÂÀ– Œ–ÂÀ––– Œ–Â`†–ÂÀ–€‰–Â@ƒ– Œ–Â`†– Œ–Â@œ–Â`Ÿ–Â@œ–ÂÀ¨–¯– ²–Â`Ÿ–Â`Ÿ– ™– ™–€¢–Â@œ–Â@œ––– ™–Â@œ–Â@œ–Â`Ÿ– ™–€¢–Â`Ÿ–Â`Ÿ–€¢–€¢–ÂÀ– Œ–ÂÀ–ÂÀ–Âà’–Â Œ–€¢–€¢–ÂÀ–Âà’–Â€¢–Â૖€¢–Â@œ–Âà’–Â ™–Âà’–Â Œ–€‰––– ™– Œ– ™–Â`Ÿ–––ÂÀ–Âà’–Â€‰–€‰––– ™– Œ– Œ–ÂÀ–––Âà’–Â Œ–Âà’–Â€‰–Â`†– Œ––– ™–––Âà’–Â@œ–Â@œ–Â`Ÿ–––€‰–€‰– Œ–€‰–Â@ƒ–Â@ƒ–Âày–Âày– €–ÂÀv– €– €–ÂÀ–Âà’–Â Œ–Â`†– s– s–Âày–Â@ƒ– Œ–Â`†– Œ–€‰–Âà’–Â€‰–Â@ƒ–ÂÀ–€‰– €– €–Â@ƒ– s–Âày– s–Âày– €–Â@ƒ– Œ– Œ–€‰–Â`†– Œ– €– s–Â`m– s–Âày–Âày–Âày–Â}–Â}–Âày– s–€p–ÂÀv–Âày–Âày– s–€‰–Â`†–Âày– s– s–ÂÀv–Âày– s–€‰–Âà’–Âà’–Â Œ–ÂÀ–Â`†–€‰– €–Âày– s– s– €–ÂÀv– €–ÂÀ––––––– ™–Â`†–€‰–Â`†– €– €–Âày–Â}–Â}–Â}–€p–Â`m–€p–Â@j–Âd–Âd–Â`m–Âà`– Z– Z–Âà`– s–€p–€p–Âà`–€W–€W– Z–Â@j–Â@j–Â`m– g–ÂÀ]– Z–Â`T–Âà`– g–ÂÀ]– Z– Z– g–Â`m– g–Â`m–Â`m– g–ÂÀ]–ÂÀ]–Âd–Â@j–Â`m–€p–ÂÀv– €– €– €–Â@ƒ–Âày–Â`m–Âà`–Âà`–Â@j–Â@j–Âà`–Â`m–Â}–Â`m–Â@j– g–Â`m–Â`m–Â@j–Âày– s– s–ÂÀv–Âày– s–ÂÀv–Â`†– s–ÂÀv– s–€p–Â@j– g–Âd– g–Âd–Âà`– Z– g– g– g–Â`m–€p–Â`m–Âày–Â@j–Â@j– s– s–€p– s–Âd– g–Â`m– s–Â`m–€p– g–Âà`–Âà`–Â@j–Â}– s–Â`m–ÂÀv– €–Â`†– s–Âày– €– s–Â`m–Â`m–Âày–Â@j– g–Â`m– s–Âày–Âày–Â`m– €–Â@ƒ– €–€‰–Â}–Âày– €–Â@ƒ–Âày–Âày–Âày–Â@ƒ–Âày–Âày– s–ÂÀv– Œ–Â`†–Â`†– €–ÂÀv–ÂÀv–Âày– Œ–€‰–Âày–ÂÀv– s– s– €– €– €– s–Âày–Âày– €–Âày–€p–Âày– s– s– s–Âày– €– Œ–€‰–Âày–Âày–ÂÀv–ÂÀv–€p–Â`m–Âày–€p– s– s–ÂÀv– €–Â`†– s– €– €–€‰–Â@ƒ–ÂÀv–ÂÀv– €–Â}– €– €–Âày–Â@ƒ– €–Â}– s–Â`m– g–Âà`–Âà`– g–Â`m– s–Â`m–€p– s– s– s–Â`m–ÂÀv–Â}–Â`†–ÂÀ– Œ–Â@ƒ–Â}– €– €–Â@ƒ– €–ÂÀv–Â}– €–ÂÀv–ÂÀv–Â@j–Âày–Â@ƒ–€‰–Â`†– €–Â@ƒ– €–ÂÀv–Â`†–Âày– €–Â}– €–Â}–Â}–Â}–Âày– €–Â@ƒ–Âày– €– s–€p–Âày–ÂÀv– €–Âày–ÂÀv–Âày–Â`†–Âày– €– €– €– Œ–ÂÀ–Â`†–Â`†– Œ–––Â`†– €– €– €–Âày–Âày– €– €– €–Â@ƒ– €–Â`†–Âày–Âày– €– s–Â`†– Œ– Œ–ÂÀv–Â@ƒ– €–€‰–Âà’–Â ¥–Â@œ––– ™– ™–ÂÀ–ÂÀ– Œ–––€‰–€‰–ÂÀv–Â@ƒ– Œ–Â`†–€‰–Â@ƒ–Â`†– Œ– Œ–Âà’–Â@œ––– ™–––€‰–Â`†– €–Â@ƒ–Â}– Œ–Âà’–Â Œ–––Â@œ–Âà«–Âà«–ÂÀ¨–€¢–ÂÀ¨– ²– ²–€¢– ¥–¯–Âà«–Âà«–Â૖€¢–€¢– ¥–Âà«–ÂÀ¨– ¥–¯–Â૖ ¥– ²–Â`¸–ÂÀ¨–Â`Ÿ–Â@œ–€¢– ¥–Âà«–ÂÀ¨–Â@œ––––– ™– ¥–Â`Ÿ––– ™– ¥– ™–€¢– ¥–Â`Ÿ–Â`Ÿ– ¥– ²–Â@µ–ÂÀ¨–€¢– ™–Â@œ–ÂÀ¨– ²–Âà«–Â`Ÿ–Â`Ÿ– ™– Œ–ÂÀ–Âà’–Â ™– ™– ¥–Âà«–Â`Ÿ–€¢–€¢–€¢–€¢–¯– ²–¯–¯– ¥–€¢–¯– ²– ²– ¥– ™–Â`Ÿ–Âà«–ÂÀ¨–€¢–ÂÀ¨–€¢– ¥–Â`Ÿ–ÂÀ¨– ¥– ™–Â`Ÿ– ¥–Â૖¯–Â@µ–€»–¯– ²–Â@µ–¯–ÂÀÁ–ÂàÄ–ÂÈ–ÂàÄ–ÂÀÁ– ¾– ²– ²–Âà«–Â ²–ÂÀ¨–€¢–ÂÀ¨– ²– ¾– ²–€»–Â@µ–Â@µ– ²– ²– ²– ¥–Âà«–Â@µ–Â`¸– ²–Â`¸–Â`¸–€»–Â`¸– ²– ²–ÂÀÁ– ¾–Â`¸–Â`¸– ¾– ²–Âà«–Â`¸– ²– ¥–Âà«–Â ²–Â@µ–€»–ÂÀÁ–€»–¯– ²–Â૖ ¥–Â`Ÿ–€¢–€¢–€¢– ™–Â`Ÿ–ÂÀ– ™–€¢–€¢–Â`Ÿ–Â@œ–Âà’–Â@œ–€¢–ÂÀ¨–Â`Ÿ–€¢–Â@œ– ¥– ™– ™–Âà’–Â ™––– ™– ™– Œ– ™– ™– ¥– ¥–ÂÀ¨– ™–Â@œ–€¢– ¥–¯–ÂÀ¨–Â`Ÿ–Âà’–Â Œ– ™–Â`Ÿ–Â`Ÿ– ¥– ¥–ÂÀ¨–€¢– ¥– ™–Âà’–Â@œ–Â@œ–Â`Ÿ––– ™–ÂÀ¨–Â@œ–€¢–Â@œ– ™–––Âà’–Â––––Âà’–Â Œ–––Âà’–Âà’–Âà’–Âà’–Â Œ–Âà’–ÂÀ–ÂÀ– Œ–Âà’–Âà’–Â@ƒ– €– €– Œ–€‰–Â`†– €– €–Âày–Âày–Â@ƒ–Â@ƒ– Œ–ÂÀ–Âà’–Â–– ™–€¢– ¥–Â@œ– ™–Âà’–Âà’–Â Œ–€‰– ™–Â@œ– Œ–ÂÀ– Œ–Âà’–Â––Â@œ– ™– ™–€¢–ÂÀ–€‰–Â`†–Âày– s–Âày–Â@ƒ– Œ– Œ– Œ–Âà’–Â Œ–ÂÀ–ÂÀ–Â`†– €–€‰–Â}–Âày– s–Âày–Â}–Âày– €–Â@ƒ–Â@ƒ–ÂÀ–ÂÀ– Œ–Â`†–Â@ƒ–Â@ƒ– Œ– Œ– Œ–€‰– €– €–Âày–Â}–€p– g– g–Â`m– s–Âày– €–Â@ƒ–Âày– Œ– €–Âày– s–ÂÀv–ÂÀv–€p– s– s–Âày–ÂÀv–Â}– €– s– €–ÂÀv–Â`m–ÂÀv– s–ÂÀv–Â@ƒ–Â@ƒ–Âày– s–Â`m–Âà`–Âd–Â`m–ÂÀv–€p–Â@j–Âd– g–Â`m– g–Âd–Â@j– g– g–€p–Â`m–Â`m–Â@j– g–€p– g–€p– s–€p– s– s–Â`m–€p–€p–Âd–Âà`– s–Â@j–€p–Â`m–Â@j– Z–€W–ÂÀ]–Âà`– g–Âà`– g–Âd–ÂÀ]–Â@j–Â@j– g–Â@j– g– g– s–Âày–Âày– s–Â}–Âày–Â@j– Z–ÂÀ]– s– Œ– Œ– €–Â@ƒ–Â`†–Â@ƒ–Âày–Â`m– s– €–€‰–Â`†–Â`†– €– s– s–Âày– s– s–Âày–Â`†–Â`†– s–Â}–Â`†–€‰–Â`†–Â`†– Œ–––––Â@œ–ÂÀ–––––Âà’–Â ™– Œ– Œ– €– Œ– Œ– Œ– Œ–Âà’–Â Œ– Œ–Â`†– €– €–Â}–ÂÀv–Â@ƒ–Â`†–€‰–Â@ƒ– Œ–––Â@œ–€¢–€¢–Â@œ–Âà’–Â Œ– Œ–Â`†–€‰–Âà’–Â Œ–Âà’–Âà’–Â Œ–ÂÀ–Â@œ–––––––––Â`Ÿ–Â`Ÿ– ™– ™–Â@œ–Â@œ–Â@œ– ™–ÂÀ– ™–Âà’–Â ™–Âà’–Â ™–––Â@œ–Â@œ–––Â`Ÿ– ¥–€¢– ¥–Â`Ÿ–––€‰–Â}–Â@ƒ–€‰–––Â@œ–Â`Ÿ–Â`Ÿ– ™–ÂÀ¨–Â`Ÿ– ™– Œ––– ™– ¥–––Â`†––– ¥–Âà«–ÂÀ¨–Â`Ÿ– ™– ¥–€¢–Â`Ÿ– ™––– ™– ™– Œ– Œ–Âà’–Â Œ–Âà’–Âà’–Âà’–Â`Ÿ–Â@œ–€¢––––– ™–Â`Ÿ– ™–Â`Ÿ–Â@œ–Âà’–Â`Ÿ–€¢–Âà«–Â@µ–Â૖€¢–Â`Ÿ–€¢– ™– ™– ™– ¥–¯–Â@µ– ¥– ²– ²– ²–Â૖ ¥–Âà«–Â ²–¯–Â`Ÿ–Â`Ÿ– ¥–¯– ¥–€¢–€¢– ™– ™– ™– ¥–¯– ²– ¾– ¾–Â@µ–¯–Â`¸–Â@µ–ÂÀ¨–Â૖¯–Â@µ–ÂÀÁ–Â@µ– ²–Âà«–ÂÀ¨–¯– ²– ²–Âà«–Â`Ÿ–€¢–Â@œ–€¢– ¥–ÂÀ¨–ÂÀ¨– ¥–ÂÀ¨–ÂÀ¨– ²–¯– ¥–¯–¯–Âà«–Â@µ– ¾–€»–Â`¸– ¥–Â@œ–Â`Ÿ– ¥–Â`Ÿ–€¢– ¥– ²–Â@µ–Â`¸–Â૖ ¥– ¥– ²– ²– ²–Â`¸–Â`¸–Â`¸– ²–¯–Â`¸–Â@µ– ²– ²–€»–€»–Â`¸–Â@µ–€»–Â`¸–Â@µ–Â૖¯– ¥–ÂÀ¨–ÂÀ¨–¯–ÂÀ¨–€»–€»– ¾– ¾– ¾–ÂÀÁ–ÂàÄ–Â@µ– ¾–Â`¸–Âà«–Â@µ–Âà«–Â૖€¢–Âà«–Â ²–Â`¸–Â@µ–€»–ÂÈ–Â Ë–Â Ë–ÂÀÁ–€»–ÂÀÁ–ÂÀÁ– ¾– ²–Â@µ–Âà«–ÂÀ¨–€¢–€¢–Âà«–Âà«–Âà«–Âà«–Â`¸–¯– ²– ²–Â`¸–Â@µ–€»– ²–Â`¸–Â`¸–Â`¸–€»–¯–Â@µ– ²– ²–€¢–Â`Ÿ–Âà«–Â@µ– ²– ²–¯–¯– ²– ²–Â`¸–Âà«–ÂÀ¨–¯–Â`¸–Â`¸–Â`¸–€»–€»–¯–Âà«–ÂÀ¨–Â`Ÿ–ÂÀ¨–€¢–ÂÀ¨–ÂÀ¨– ¥–Âà«–Âà«–Â૖ ¥–Âà«–Âà«–Â૖¯–Âà«–Â`¸–Â@µ–¯– ¥–¯– ²– ²–Âà«–Â ²–ÂÀ¨–€¢–ÂÀ¨– ¥–€¢–¯–¯–Â`¸– ²–Â`¸– ²– ²– ¾–Â@µ–¯–Âà«–Â ²– ²–Âà«–Â ²–Â૖ ¥–¯–Â@µ–€»– ¾– ²–¯– ²– ¾–ÂàĖ€»– ¥–Â૖€»– ¾–ÂàÄ–ÂÈ–Â`Ñ–ÂÈ–Â`¸–€»–Â`¸– ¾–Â`¸–Â`¸– ¾– ¾–ÂÀÁ– ¾–ÂàÄ–ÂàĖ ¾– ²–Â@µ– ²– ²–Â૖¯– ²–¯–Â`¸– ²– ¾– ˖ÂÀÁ–Â`¸– ¾–€»– ˖€»–ÂÀÁ–ÂàĖ ¾– ¾–€»–€»–ÂȖ ˖ ˖ ˖€ԖÂÀږ ז€Ԗ ˖ÂàÄ–ÂÀÁ–Â@ΖÂȖ ¾–ÂàÄ–ÂÀÁ– ¾– ˖ ¾–ÂàÄ–ÂȖ ¾–ÂàÄ–ÂàĖ€»–Â`¸– ²–ÂÀÁ–ÂàÄ–ÂàĖ ¾–ÂÀÁ–ÂÀÁ–Â@ΖÂÀÚ–Â Ë–Â@ΖÂ`Ñ–ÂÈ–ÂàÄ–ÂàÄ–ÂÀÁ– ˖Â@ΖÂÀÁ– ˖ זÂ@ΖÂ@ΖÂ@ΖÂ@ΖÂàÝ–Â Ë–ÂÈ–Â Ë–Â Ë–Â@Ζ ז ä–Â`ê– ä– זÂá– ˖ÂàĖ ¾–ÂÈ–ÂÈ–ÂàĖ ¾–ÂÀÁ– ¾–ÂÀÁ–Â`і ז€ԖÂÀږ ז€ԖÂàÝ–ÂàÝ–ÂÈ–ÂàĖ ¾–Â`¸– ¾– ¾–Â`¸–ÂàÄ–Â Ë–Âàݖ ז ז ז€ԖÂàݖ€í–Â`ê– ä–ÂàÝ–Â ä–ÂÀÚ–Âàݖ ז זÂ@ç–ÂàÝ–Âàݖ ז ז זÂ`і€ԖÂ@Ζ זÂàÝ–ÂàÝ–Â ä–Â@ç–Â@ç–Âá– ז€ԖÂàÝ–Â`і€ԖÂÀږ€í–Â`ê–Â`ꖀ햠ä–ÂàÝ–ÂàÝ–Âá–ÂÀږ זÂá–ÂÀÚ–Âàݖ זÂ`Ñ–Â`Ñ–Â@ΖÂàÄ–ÂȖ ˖ ˖ ˖€ԖÂÈ–Â@Ζ ˖ ˖€Ԗ ä– ז€ԖÂàĖ ¾–ÂàÄ–ÂàÄ–ÂàÄ–ÂàÄ–ÂȖ ˖ ˖ זÂ`і€ԖÂÀږ€Ԗ ז זÂ`і ˖€»–Â`¸– ²– ²– ²–Â`¸– ¾–ÂàÄ–ÂàÄ–Â Ë–ÂàÄ–ÂÀÁ–Â`і€ԖÂÀږ זÂ@ΖÂàÄ–ÂàÄ–ÂÀÁ–Â@Ζ ˖ÂÈ–ÂÈ–ÂÈ–Â`Ñ–Â Ë–ÂÀÁ–ÂÈ–ÂÀÁ– ˖ÂÈ–ÂÈ–Â Ë–Â@Ζ ˖ זÂÀÚ–Â@Ζ ז ˖€ԖÂ`і ˖ ˖ ¾–ÂȖ ¾–€»–€»–Â@Ζ€Ԗ ˖ ˖Â`Ñ–Â`Ñ–Â@ΖÂÀÁ–ÂÀÁ–€»–Â@µ–¯–Â`¸– ¾–ÂàÄ–Â Ë–ÂàĖ ˖ ¾–€»– ¾– ¾– ¾–ÂÀÁ–ÂÀÁ–Â`Ñ–Â@ΖÂȖ ¾– ¾– ¾–Â`¸–Â`¸– ²–ÂÀ¨–Âà«–Â`¸–€»– ²–Â@µ– ²–¯–¯– ²–Â@µ–Âà«–Â@µ–¯–Âà«–Âà«–Â૖ ¾–€»–€»–€»–Âà«–Â૖ ¥–Â`Ÿ– ¥– ²–€»–Â@µ– ²– ²–Â@µ– ²– ²–Â૖ ¥–Â`Ÿ–Â`Ÿ– ¥–Âà«–Âà«–ÂÀ¨– ²– ¥– ¥–ÂÀ¨– ²–ÂÀ¨–Âà«–Â૖€¢–ÂÀ¨–ÂÀ¨–ÂÀ¨–Â૖€¢–€¢– ²–Â`¸–Â`¸–Â@µ– ²– ¥– ¥– ¥– ¥–Âà«–ÂÀ¨– ²–Â`¸–Â@µ–ÂÀ¨– ¥– ¥–Â@µ– ²–Â`¸–Â૖ ¥–€¢– ¥–Âà«–ÂÀ¨–ÂÀ¨–ÂÀ¨–€¢–Â`Ÿ– ¥–Â૖€¢– ¥–ÂÀ¨–Âà«–Â@µ–€¢–Âà«–Âà«–ÂÀ¨–Â૖¯– ¾–Â`¸– ¾–Â`¸–€»–ÂÀÁ– ¾–€»– ²–Â૖€¢–Â`Ÿ– ¥– ¥– ²– ²–€»– ¾– ¾–ÂÀÁ– ¾–ÂȖ€»– ¾–ÂÀÁ–ÂàÄ–ÂÀÁ–€»–ÂàÄ–Â`¸–Â`¸–€»– ²–Â૖¯– ²–Â@µ–€»–€»–ÂÀÁ–Â@Ζ ¾–ÂàĖ€»–ÂȖ ˖€»–€»–€»– ¾–Â`¸–Âà«–Âà«–Â ²–Âà«–Â`¸–Âà«–Âà«–Â ²–Â`¸–€»–ÂÀÁ–ÂÀÁ– ˖ÂàÄ–Â@ΖÂÀÁ–Âà«–Â`¸–Â@µ–Â@µ– ²–¯–Â@µ–Â`¸– ¾– ²–Â@µ– ²–Âà«–Â ²–Â@µ–Âà«–ÂÀ¨–Â૖ ¥–€¢–Â@µ– ¾–ÂàĖ ¾–Â`¸–Â@µ–Â`¸–Âà«–Â ²–€»– ¾–Â`¸–Âà«–Âà«–ÂÀ¨–ÂÀ¨–Â`¸– ¾– ¾– ˖Â@Ζ ˖ ˖Â@Ζ ˖ÂÈ–ÂÀÁ–ÂÈ–ÂȖ ¾–Â`¸–ÂÈ–Â`¸– ²–Â@µ–Â`¸– ¾–Â@µ–¯–¯–Âà«–Â@µ– ¾– ¾–Â@µ–¯– ²–€»– ²– ²–€»–ÂÀÁ–ÂàÄ–ÂÀÁ–ÂàÄ–ÂàÄ–ÂÈ–ÂàĖ ¾– ¾–€»–Â`¸– ¾–ÂÈ–Â@ΖÂȖ ¾–ÂÈ–ÂÈ–Â`Ñ–Â@Ζ€Ԗ€ԖÂàÄ–ÂÈ–Â Ë–ÂÈ–Â Ë–ÂàÄ–ÂàÄ–Â`Ñ–Â`Ñ–Â`Ñ–Â@ΖÂàÄ–Â@Ζ זÂ`Ñ–Â Ë–ÂÀÁ–ÂÀÁ–ÂÀÁ–Â@ΖÂȖ ¾– ¾–€»– ²–¯– ²–€»– ¾–ÂàÄ–ÂàÄ–ÂÀÁ– ¾–ÂàĖ ˖ זÂÀږ ז€ԖÂ@ΖÂ`Ñ–Â@Ζ ˖Â`Ñ–Â`Ñ–ÂÀږ ז ˖ÂàÄ–ÂàÄ–Â@ΖÂ@Ζ€Ԗ€Ԗ€Ԗ€ԖÂ@ΖÂ@Ζ€ԖÂ`і€ԖÂ`Ñ–Â`Ñ–Â Ë–Â`Ñ–Â@Ζ ˖ ˖ ˖ ¾–ÂÀÁ–ÂÈ–ÂÈ–ÂàÄ–ÂàÄ–ÂÈ–Â`¸–Â@µ–Â`¸–€»– ¾– ˖Â@Ζ ¾–Â`¸–Â૖€»– ²–Âà«–ÂÀ¨–Â`¸–Â`¸–€»– ¾–Â`¸–Â@µ– ¾–€»–Â`¸–Â`¸–Â@µ–Â`¸– ²–€»– ¾–ÂÀÁ– ¾–€»–Â@µ–ÂÀ¨–Â@µ–Â@µ–ÂàÄ–ÂÀÁ– ˖ÂàĖ ¾–ÂȖ€»– ²–Â`¸–ÂÀÁ–ÂàĖ ˖ ¾–€»– ¾–ÂàÄ–ÂÈ–Â Ë–Â@ΖÂàÄ–ÂàĖ ¾– ¾–Â`¸–€»–€»–ÂÀÁ– ¾–ÂÀÁ–Â@µ–Âà«–Â ²– ¾–ÂÀÁ–ÂȖ€Ԗ ˖ ˖ÂàÄ–Â Ë–Â@ΖÂ`Ñ–ÂȖ ˖ ¾–ÂÀÁ–Â`¸– ¾– ¾–€»–€»–Â@µ–Â૖ ¥– ¾–ÂÀÁ–€»– ¾–ÂÀÁ–ÂÈ–ÂȖ ˖ זÂÀږ ז ז זÂ`і€Ԗ ז ä– ז€ԖÂÀږ זÂàݖ זÂÀÚ–ÂàÝ–Â ä–€í–Âá–Â`ê– ä–Â`ê–€í–Â`ê–Â@ç– ä–Â`ê–ÂàÝ–ÂàÝ–Â`і ז€ԖÂàÝ–ÂàÝ–Â@Ζ זÂÀږ זÂá–Â@ç–Â`ê–Âàݖ זÂÀږ 䖀햀햠ð– ð–Â@ç– ð–€í– ä–ÂàÝ–ÂàÝ–Â ä– ð–Âàö–Â@—Âàö–Âàö–Âàö–Âàö–ÂÀó– ð–Âú–Â@—Â@—Â`—  —  —Â`—  —  —€—ÂÀó– ä–ÂÀó–Âú– ý–Â@—ÂÀ —€—  —Âà—€—Â`—Âàö– ð–ÂÀó–Âú–Âàö– ð–Âú–€— —Âà——ÂÀ —Â`—Âà—  —  —ÂÀ —Â`—Â@—€—Â`—  —Âà—Âà—  —ÂÀ —€—  —  —  —Â`—  —Âà—Âà—ÂÀ ——ÂÀ —ÂÀ —Âà— — — —Â@—Â`—Â@—Âà—Â`—— —  —  —  —ÂÀ —€—  —Â@— ý–Âú– ý–Âàö– ý–Â`—€—  —  —Â`—€—Âà—Âà— —Âà—€—ÂÀ —Âà—Âà— ——Â@—  —Â`—Âà—Âà— —ÂÀ —Âà—  —€— —Â`— —Âà(— "—Âà(—Â,—ÂÀ%—Âà(— /— /—Â@— — — — —Âà—Âà—Âà—Âà——Âà—ÂÀ ——Â@—Â`— — —Â`—Â`— "—€—Â@——— — ——Â@—— —Âà——€—Â`—Â`—Â`—ÂÀ%—Â,— "— "—Âà(—Âà(— "— "— "— "— "—Â`—ÂÀ%—Âà(— /—Â`—Â`—€— "—Â`—Âà(— /— /— /—Âà(— /— ;—€8—Âà(— "—Â`— "— "— — —Â`——Â`—ÂÀ%— "—Â`—Â`—Â`— "—Âà(— "— "— "—Â,—Âà(— "— "— "—ÂÀ%—Â@— —  — "—Â,—Â@—€— —Â`—Â@— — — "— "—€—ÂÀ%— "—€—ÂÀ%—Â,— /—Âà(—€— —Âà—€—Â@—Â`—ÂÀ%—Â`—€—Âà(—Âà(—Â,— /—Â,—€8— /—Â,— "—Â`—ÂÀ%— —Â@— —Âà—Âà— — — "— "—Â`——  —ÂÀ ———Â`—Â`—Â@—Â`— —Âà— —  —  —  —Âà— —Âà—€——Â@—€—€—  — — "— — — —Â`—ÂÀ%— "—Â`—Â`—Â`——Â@—Âà—Âà—  —€—Â`—€—  —Âà—  —  —Âà—ÂÀ —  —— — "— —  —ÂÀ —€—Âà—ÂÀ —ÂÀ —Â@—Âà—ÂÀ —  —  —  —€—  —  —Â@— —Âà— —Â`—€— ——  —ÂÀ —€—  —Âà—Âà—  —Â`— —Â`—Â`—Â`—Âà—Âà—€—Â`—Âà— — —€—Â@—ÂÀ —  —€—Âà—Âà—Âà—€— — —Âà—ÂÀ —  —  —ÂÀ — — "— "—ÂÀ%—€—€—Â`——  —Âà——Â@—€— —ÂÀ —  —Âà——Â`— "—Â@—Âà—Â`—ÂÀ%—Â`— — "—€—ÂÀ%— "— "—ÂÀ%— "—Â`—ÂÀ — —Â@—Â`—Âà(—Âà(—Â@—Â@—Â@—Â@—€—€—Âà— —ÂÀ —  —Â@—Â`—€—  —ÂÀ —Âà—Â`—ÂÀ%—ÂÀ%— /—Âà(—ÂÀ%—Â,—Âà(—Â,—Âà(— /— "—Âà(— "—€—Â`—Âà(—ÂÀ%— /—Âà(—Âà(— /—€8—ÂÀ>—ÂE— ;—Â@2—Â,— /— "—Âà(—ÂÀ%—ÂÀ%— /—Â`5—Â,—Âà(—Â,—Â@2—€8—Â@2—Â@2—Â`5—Â`5—Â`5—Â`5— /—Â,— /— "—Â,—ÂÀ%—Â`—Âà(—Âà(—Â`—€——  —  — — "—Â@2—ÂÀ%—Âà(—Âà(—Â,—€8—Â,—Âà(— /—Â@2— /— /— /— /—Â`5— /—Â,— ;—Â`5— ;—ÂÀ>— ;—ÂÀ>—ÂàA—Â`5—Â@2—Â@2—Âà(—ÂÀ%—ÂÀ%—Âà(— /—€8—€8— ;—€8—Â`5—Â,— /—Â,—Â`5—€8— ;—€8—Â`5—Â@2— /— /—Âà(—Âà(— "—ÂÀ%— /— /—€—Âà(— /—Â@2—Â`5—Â`5—Â,—Â`— "—Âà(— "— /— ;—Â,— ;— ;— ;—Â`5— "—Âà(— "— /— ;—€8—Â@2—Â`5—ÂàA— ;— ;—Â`5— /— /— ;—€8—Â`5— /—ÂÀ%—ÂÀ%—Â,— /—€8— /—Âà(—Âà(— /—Âà(— /—€8—ÂE—ÂÀ>—Â@2—ÂÀ%— /— ;—Â`5— /—Â@2—Â,—€— /—€8—Â,—Â`5—ÂÀ>—Âà(—Â`—Â@——€—€—Â`— "— "—Â`— —Â@—€—€—€— "—Â@— "— "— "— "—Â@2—Âà(—Â`5—Â,— "—€—Â@— —Â`—Âà—Âà—Âà—Â@——Â`— "—€—€—Â@—€—Âà(—€— —— —Âà—Â@—Â`—€—€—Â`—Âà—ÂÀ — —Âà—€—€—Â@—  —  ——Â@— —Âà— — — — —  —€— —Âà—  —Â`—Âà——  —Â`—  —Âà—Â`—Âà(—Â`——Âà— —  —Âà—Â`—Â@——Âà—€—Âú–Â`—€—Âú– ý– ý–Â`—Â`— ý–€—  ——Âà—Â`—  — ý–Âú–Âàö– ð– ý– ý–Â@—Â`—Âà—  —€— ý–Â`— ý– ý–€—Â`—ÂÀ —Âà—  —Âà—ÂÀ —  —Â`—  —€—Â`—Âú–Â`—Âàö–Âàö–Â@—€— — —Â`—Âà—  —Â`—ÂÀ —Âà— — —Âà— ý–Â`— ý–Âàö–€í–Â`ê–ÂÀó–Âàö–Â`—  —€—Âà— —Â@—ÂÀ —ÂÀ —€—ÂÀ —  —  —  —Âà—ÂÀ —Â`—Â`—Â`—Âú–Âú– ý–Â@—ÂÀó–ÂÀó–Â@— ý–Â@—€—Âà—€—Â@—  —Â@—€—ÂÀ%—ÂÀ%—Âà(—ÂÀ%—€—Â`—  —ÂÀ —Â@—ÂÀ —Â@—€— —Âà—Â@—  —€—  —Âà——Â`—€—Âà— — — — ——Â`—ÂÀ%—€—ÂÀ%— "—Â@—Âà— —Âà—Â@—€—  —— —Âà—Â@—Â`—Â@— —Â`——ÂÀ —€—€—€— —Â`—Âà—Âà—  —ÂÀ —ÂÀ —Â`—Âà— — ——Âà—Âà——Â@—€—€—Â`— "—€—Â`5—Â@2—Âà(— /—Âà(—ÂÀ%—— —ÂÀ —Â`— "—Âà(—Â`—€—€—Âà(—€8—€8—€8— ;—Â`5— /— /—Â,—ÂÀ%—Âà(— "— /—ÂÀ%— /—Âà(— "—Âà(—Âà(—Â,—ÂÀ%— "—€—Âà(— /—€8— /—Â,— /— /—Âà(— "— "— "— "— "—€—€— "—ÂÀ%— /— /—Â`5—Â@2— /—ÂÀ%—Âà(—Âà(—Â,— /—Âà(—Â,—Âà(—Âà(— "—ÂÀ%—Â,—€8—€8—Â,—Â`5— /— /—Âà(—Â`5— ;—ÂÀ>—Â`5—€8—Â`5—Â@2—Âà(—Âà(— "— "— "— "—Âà(—Âà(— /—Â`5— /— /—Â@2—Âà(— —ÂÀ —Âà—€—€— "—Âà(— "— /—Âà(—Âà(—Âà(—Â,—Â,—Â`— /—Âà(—€—Â@— —€— "— "— "—ÂÀ%— "— "— /—Â,—€—Â@—Âà—Â`—€— —ÂÀ%—Âà(—Â,—Â,—Â,—Â,—Â`5—Â`—Â`— —Â`— "— "— /—Â,—Â,—Â,—ÂÀ%— "—Â`—Â@—Â`—€— —€— "—Â@— —Âà——Âà—  —  —  —Âà—Âà—Â@— —Â`— "—€— "—— —Â`— "—Â,—Â,—Âà(— /—Âà(—Âà(—ÂÀ%—€—Â`—Âà—Âà— —Â@—€—€——Âà—€—  —Âà— —Â@—ÂÀ —Â@— —Â`——Âà— —Â@——€—Âà—Âà— —€—Âà(— "—€— — "—€—Â@— —Â`—€—Â,— /—Â`—ÂÀ — — "— —Âà—Â`—€—ÂÀ%—Âà—Â`—Â@—ÂÀ%— "— "—Â`5— /—Â,—Âà(— "—ÂÀ%— "—Â`— — "— "—Â`— —Â@—Â`—Â`—Â@—Â`—Â,—€—Â`— —ÂÀ —  —Â@—Â@—€—  —Â@—Â`—Â`— "— "—ÂÀ%—€—ÂÀ%— /—Âà(—€8—Â@2—Âà(—Âà(—ÂÀ%—Â@—Â`—Âà(—Â@—Â@—ÂÀ —  ——Â@—€—Â`—Âà—€—  —  —Âà— — ——— — "—Â`—Â`—Â`——Â`—€—€—Â`—Â`— "—ÂÀ%— — "—€—Âà(—Âà(— "— "— "— "—€—Â`— —€—€— "—Âà—Â@—€—ÂÀ%—ÂÀ%—Âà(— /— /— "—Â,—ÂÀ%—Âà(—Âà(— "— "—Âà(—Â@—Â@—Â`—ÂÀ%—Âà(—€8—€8—Â`5—Âà(—Â,—Â`5—Â@2—Â,—€8— /— ;—Â`5— ;—ÂÀ>—€8— H— H—Â`5— ;—ÂàA— ;—Â@2—Â@2—ÂÀ%—Âà(—€—Â,—Âà(—Â,— /—Â`5—€8—€8— /— /— /—Â,—ÂÀ>—ÂàA— H—ÂàA—Â`5—Â`5—Â,— ;— /—Â,—Â@2— ;—€Q—€Q— H— H— H— H— T—Â`N—Â@K—Â`N—ÂàA—ÂàA—ÂÀ>—Â@K—Â`N— H—Â@K— H—€8— ;— H— H—Â`N—Â@K—Â@K—Â`N—ÂàA— ;—ÂÀ>—ÂE—ÂàA—€8—ÂàA—Â`N— H— H—Â`N—ÂÀW—Â@K—€Q—Â`N—Â`N—Â@K—ÂE—Â`N—Â@K—Â`N—Â`N— a—ÂàZ—Â`g—Â@d— a— T— H—ÂE—ÂÀ>—ÂE—ÂE—€Q— H—€Q—€Q—Â@K— T—ÂàZ—ÂÀW— a—Â^—ÂÀW—Â`N—€Q— T—ÂàZ—ÂÀW— T—Â`g— a—Â`g—Â`g—€j—Â`g—€j—Â`g—Â^—ÂÀW—ÂàZ—ÂàZ—ÂàZ—Â@d—Â@d— a—Â@d— m—Â`g— a—Â`g— m— a—Â^—ÂÀW—€Q—Â@K—Â`N—ÂÀW—ÂàZ—Â^—ÂàZ—Â^—Â^—Â^—ÂàZ—€Q— T— T— a—Â@d— m—ÂÀp—Âw—ÂÀp— m—ÂÀp—Â@d— a—Â`g—Â@d—€j—ÂàZ— a— a—Â^—ÂàZ—Â^—Â^—ÂàZ—€Q—ÂÀW—ÂÀW—Â^— a— m—Âàs—Âàs— m— a—Â@d—ÂàZ—Â@K—Â@K— T— H—Â@K—Â@K—Â@K—Â`N—Â^—Â`g—ÂàZ—€Q—Â@K— T— a—Â@d— m—Â@d—ÂàZ—Â^—Â^—Â^— a—Â^— T—ÂàZ— T—€Q—ÂàZ—ÂÀW—€Q—Â@K—€Q— T— T— T—Â`N—Â`N— T—Â`N—ÂÀW—Â`g— a—Â^— a—Â@d— a— T—ÂÀW—Â`N—€Q— T—ÂàZ—Â`g—Â`g—Â@d— a— a—Â^—ÂàZ—ÂàZ—ÂàZ—ÂÀW—Â`N—ÂàA—Â@K—Â`N— a—ÂàZ— a—Â^—Â^—Â`g—Â`g—Â@d—Â`g—€j— m—ÂàZ— T—€Q—€Q—€Q—ÂàZ— a— a—Â@d— a—Â`g—Âàs— m—Â@d—Â@d— a—Â@d—ÂàZ—Â@K—Â`N—ÂàZ—Â^—Â@d— m— a—Â`g—ÂàZ— T— a—ÂàZ—Â`N—Â@K— T— T— T—ÂàZ—€Q—€Q—Â`N—Â`N—Â@K—Â`N— T—Â^— a—ÂàZ—Â^—ÂàZ—ÂàZ—ÂàZ— T—ÂÀW— T—ÂàZ— T—Â`N— T—€Q— T—€Q—Â@d—Â`g—Â`g—ÂàZ—€Q—Â`N— T—ÂàZ—€Q—Â@K—€Q—Â`N—ÂàZ—Â^— a—ÂàZ— a—ÂàZ—Â^— a—Â@d—Â@d— a—Â@d—€j— m— a— a—Â`g— a—ÂÀW—€Q—ÂÀW—€Q— T—Â@d—ÂàZ— a—Â`g—ÂÀp— m— m— a—ÂÀW—€Q— T—ÂàZ—Â^—Â^—ÂàZ—Â@d— a—ÂàZ—ÂàZ— T—ÂàZ—Â@d—ÂàZ—Â^—Â^— a—Â^— T—ÂàZ—ÂàZ—€Q—Â@K— H—ÂàA—Â@K—ÂàZ—€Q—ÂàZ—ÂàZ—Â`N— H— ;—Â`5—ÂÀ>—ÂàA—Â@K— H—ÂàA—ÂàA—ÂÀ>—€8—Â@2— /—Âà(—Âà(— "—Â`—€—Â,— /—Âà(—Âà(— "—Âà(—Âà(— "—Â@— "—Âà—Â`—Â`—Âà— — —Â@— "—— —Âà——ÂÀ —ÂÀ —Â`—Âà—Âà—Â`— ý–Â`— ð–€í–€í–Â`ê– ä–Â`ê–ÂàÝ–Âá–Âàݖ ז€ԖÂàÄ–ÂàÄ–Â@µ–ÂàÄ–Â@ΖÂ@ΖÂàĖ ¾– ¾– ¾– ¾– ¾– ¾–Â`¸–Â`¸–Â`¸–Â@µ–¯– ¥– ¥– ²–Â૖ ¥–€¢–Â@œ–Âà’–Â Œ– Œ– Œ– €–Â`†–Â}–€‰–Âà’–Âà’–Âà’–Âà’–Â Œ–––ÂÀ– Œ–Â`†–Âà’–Â––Âà’–Â Œ–€‰–Â`†–Âà’–Â Œ–Âày–ÂÀv– €–Â}–€p– €–ÂÀv–Â`m–Âd– g–Âd–Â@j–Â@j– g–Â@j–Â@j–Â`m–Â`m–Â`m–ÂÀ]–Âà`–Â`m– g–€W– Z–€W– N– N–Â@Q–ÂàG–ÂàG–ÂK–ÂàG–ÂàG–ÂàG–Â`;–€>–ÂÀD–ÂàG–ÂK– N– A– 5–Â@8–€>–ÂÀD–ÂÀD– A–Â@8– 5–Âà.–Âà.–Âà.– (–Âà.– (– 5– 5–Â2– 5–Â2– 5–Âà.– 5–Â`;– 5–Âà.–ÂÀ+–Âà.–ÂÀ+– 5– 5– 5– 5– A– 5– 5–Âà.– (–ÂÀ+–Â@– –Â`"–€%– (–€%–Â@–Â@–Â@– – –Â`"–Â`"–ÂÀ– –€%– –Â@– (– –Â@–Â`"––Âà– –Âà–ÂÀ–Âà–ÂÀ– –Â` –ÂÀ–Âà–ÂÀ––ÂÀ–Âà–Âà––Âà– –€ –Â@–Â` –– –Â` –Â@–€ – – –Â` –Â` – –€ –€ –Â@–€ –Â` – –Âàü•–Â` – –Âàü•Â@–Â` – ö•ÂÀù• ö• –€ó•€ó•Âç• ê•Â@í•ÂÀù• –Â@–Â` – ö•ÂÀù•ÂÀù• –– ö•–Â@– –Â` – –Â` –ÂÀù•Â@–ÂÀ–Â` – ––Âàü• ö•Â`ð•€ó•Âàü• –ÂÀù•Â`ð• ö• ö•– ö•Âàü•– –––Â` –Â` –Âàü• – – –€ –Âàü•– –– –Â@– – –Â@–€ – –ÂÀù•– – –Â@–€ –€ –€ –Âàü•Âàü•– –Â@–Âàü•–Â`ð•€ó•Âàü•–Âàü•Â`ð• ê•Â@í•Âàü•ÂÀù•Â` ––€ó•–ÂÀù• – ö• ö•Â`ð•Â`ð•Â`ð•€ó•ÂÀù•Â`ð•Â@í•Â`ð• ö•Âàü• – ––Âàü•Âàü•€ó• ö• ö•Âàü• ö•Âàü• –Â` –Âà– – –– –Âà– –Â@–€ –€ –€ – – – – –Â` –Â@– – –Âàü•Âà–Â@––Âà–Âà– – –Âà–ÂÀ–ÂÀ–€ –ÂÀ–Â` – –Âà–– –Â` –Âà– (– – – –Â@– –Â` –Â` – – –Â@–€ –€ – –Âàü•Âàü•€ ––Â` –Âà–Âà–Âà–Â`"–Â@– –€ –Â@– –€ –ÂÀ– –ÂÀ–€ –Â` – – – –€ –Âà–ÂÀ–Âà–ÂÀ– –€ – – –Âà–Âà– –Â`"– –Âà–Âà– – – – ––Â@–Â`"– –Âà.– (– –Âà––– –Âà– –ÂÀ–ÂÀ– –Âà–Â` –Âà–€%– –Â` –€ –Â` –€ – –Âà–Âà– –Â`"–ÂÀ+–Â`"–Â`"–Â@–– –ÂÀ–– (–––Âà–– –– – – –ÂÀ– – – – –Â@––€%– ––€ – –Â`"–€%–Â`"–Âà.–ÂÀ+– –Â`"– (– (– (– (– (–ÂÀ+–Âà.–ÂÀ+–Â@8– 5– (–Â@– –ÂÀ+–Â2–Âà.–Â`"–Âà.–Âà.–Â`"–€%–€%–Âà–Âà– – (–Âà.–Âà.–Âà.–€%–€%– (–Â@–€%– (–€%–ÂÀ+– (–Â`"–Â2–Â2–Â2– 5–Âà.– 5– (– (– (–€%– (– (–Â2–Â2– A– A– A–€>–Â`;–Â@8–ÂÀ+–Â2– (–ÂÀ+–Â`"–Âà.–Âà.–Âà.– (–€%–Âà.– 5–ÂÀ+–Â2–Â2–Â`;– (–Â@–Âà.–ÂÀ+–Âà.– (–€%–€%– (–Âà.–ÂÀ+–Â@8–Â2–Âà.–Âà.–Â2–€%–ÂÀ+–Âà.–Â2– 5–Â2–ÂÀ+–Âà.–Â2–Â2–Âà.–€%–Â2–Â2–Â@8– 5–Â`;– 5–Â2– 5–Âà.– (–Â`"–Âà.–Âà.– (–Âà.–Âà.–ÂÀ+–Â2–Âà.–Âà.–ÂÀ+–Â2– 5–€>–Âà.– (–Â@8– 5–Â@8–ÂÀD–ÂàG– N–ÂÀ]– Z– N–Â`T–Â`T–Â@Q–Â@Q–ÂK– N–€>–ÂàG– N– N– N– N–ÂK–ÂÀD–€>–€>–ÂàG–Â@Q–ÂK–€>–€>– A–€>–Â`;–€>–ÂÀD–Â`;– A– A– N–ÂÀD– N–Â`T–ÂàG–ÂÀD–€>–Â`;– A– A– N–Âà.– 5– 5– (–Â2– 5–ÂàG–ÂàG–Â@Q–€W–€W–ÂK–Â`T–ÂK–Â`;–ÂK–ÂàG–€>–Âà.–Â@8– A–Â`;–ÂK–ÂK–€W–ÂÀ]– Z– Z–Âà`– Z–Âà`– g–ÂÀ]– N–Â@Q– N–Â@Q– N– Z– g–Â`T–€W–ÂÀ]–ÂÀ]– g–Â`T–€W– N–€W–Âà`–Âà`–Âd–Âà`–€p–Â`m–Âà`–Â@j–Â`m–Â@j–Â`m–Â`m–Â`m–Âd–Âà`–ÂÀ]–ÂÀ]– g– g–Â`m–Âày–ÂÀv–Â`m–Â@j–Â`m–ÂÀv–Âày–Âày–Â}–Âày–ÂÀv–€p–Â}–€p–ÂÀv–ÂÀv–ÂÀv–ÂÀv– s–Âày– s–€p–ÂÀv–Âày– s– €–Â@ƒ– €– Œ– €–Â}–ÂÀv– s–Âày–Â`†– €–Â}–€‰–ÂÀ–Â}–€p– s–ÂÀv–Âày– €–ÂÀ–Âà’–Â}–Â}– €–Â@ƒ– €–Â`†–Â}– €–Â`†– €– €–Â}–ÂÀv–Âày–Âày–Â}– s– €– €–Â@ƒ–Âày–Â`†– €– Œ–ÂÀ–Âà’–Â Œ–€‰– €–Âày– €–Â@ƒ–€‰–Âà’–Âà’–Â@ƒ–Â`†–Â`†–Â`†–Â`†– €–ÂÀv–ÂÀv–€p– s– s– s– €–Â`†–Âà’–Âà’–Â ™– ™– ™–Âà’–Â ™– Œ–Âà’–Â ™– ™– ™–––€‰– Œ–Â`Ÿ– ¥–Â`Ÿ– ¥–––Â@œ–––ÂÀ– Œ– Œ–Â`†–€‰–€‰– Œ–Â`†–Âà’–Â Œ–Âà’–Âà’–Â ™– ¥– ¥–Â@œ–Â@œ– ™– ™– Œ–€‰–€‰–Âà’–Âà’–Â`Ÿ–Â`Ÿ–Âà’–Â–– ™–ÂÀ¨–Â`Ÿ– ¥–Â`Ÿ––– Œ–Âà’–Â@œ– ™–Â@œ– ¥–––Â`†–Âà’–Â ¥–€¢– ¥– ¥–Â`Ÿ–––––€¢–Â@œ–Â`Ÿ–€¢–Â@œ– ™– ™–Â@œ– ™–––Â`†–Âà’–Âà’–Â@œ–Âà’–Â ™– ™–Â`Ÿ–€¢–Â૖€¢–Â@œ––– ™– ¥–€¢–€¢–€¢–Â`Ÿ–Â`Ÿ– ™– Œ–Â`†–ÂÀ–Â@œ–€¢–ÂÀ¨– ²–Â`¸–Â`¸– ¥–Âà«–Â@µ–Â૖€¢–Â`Ÿ– ™–Â`Ÿ– ¥– ¥–€¢– ²–€»–Â`¸–Â`¸– ²– ²–¯– ²–Âà«–Â ²–ÂàÄ–Â@ç–Âá–ÂÈ–ÂàÄ–ÂàÄ–Â Ë–Â`¸–Â`¸–Â`¸– ²–Â`¸–ÂÀÁ–ÂàĖ ¾–Â૖¯– ²–Â@µ– ²– ²–Â`¸–Â`¸–Â`¸–ÂÈ–ÂÀÁ–€»– ²– ²– ¥–¯– ¾– ¾–€»–ÂàÄ–Â Ë–ÂàĖ ¾–Â`¸– ²– ²– ²–€»–ÂàÄ–ÂàÄ–ÂàÄ–Â`Ñ–Â`і זÂ@ΖÂȖ ˖ זÂÀÚ–Â Ë–Â@ΖÂ@ΖÂ@ΖÂ`і€ԖÂÈ–ÂȖ ¾–ÂÀÁ–Â@Ζ ˖Â@ΖÂ@ΖÂÀږ זÂ`Ñ–Â`і€Ԗ€Ԗ€ԖÂàÝ–ÂÈ–Â`і€Ԗ ˖ÂàĖ ¾–Â@ΖÂ`Ñ–Â`Ñ–Â`Ñ–Â Ë–Â Ë–ÂàÄ–ÂÀÁ–ÂàĖ ˖ ˖€ԖÂ`Ñ–ÂÀÚ–Âá–Â@ΖÂ`Ñ–ÂàÄ–ÂÈ–Â`Ñ–Â Ë–ÂàĖ€»–ÂàĖ ˖ ז ז זÂàÝ–Âá–ÂÀÚ–Â`Ñ–Â`і ז ז€ԖÂÀÚ–ÂàÝ–Â`Ñ–Â@ΖÂ`і€Ԗ זÂÀÚ–ÂàÝ–Â ä– ð– ð– ä–ÂÀÚ–ÂàÝ–Âá–Âá–Â@ç– ä–Â@ç– ä– ä–Âá–ÂÀÚ–Â ä– ð–Âàö– ð– ð–Â`ê–Âàö–Âú–Âàö– ð–Âàö–Âàö–Âú–ÂÀó–Â`— ð– ý–Âú– ð–Âàö–Âú– ý–Â@—Âú–€—Âà—Â`—€—Â`—ÂÀ —€— ý–€— ý–Â@—Â`— ý–Âú–Â@—€—€—Â`—Â`—€—Â`—Â@—€—  —  —  —  —  —Â`— ý– ý–Â`—Â`—  ——  —Âú–Âàö–€—  —Âà—Âà—Â@—Â@— ——€—Âà—  — —Âà(— "—€—€—€— — —Âà—Â`—Âú–Âàö–Âàö–Âàö– ý–Â`—  —Â`—  ——Â@—Â`— ——ÂÀ —Â@—— —€— "— "— "— /— "—€—Â,—ÂÀ%—Â@—ÂÀ —Â`—Â`—Âà—Âà—Â`—Â`—Âàö–ÂÀó–Âú–Âàö– ð– ð– ð–ÂÀó– ä–€í– ð–Âàö–ÂÀó– ý–Â`—Â@—Â`—ÂÀ —Âà—€—  —  — ý–Â`—€—Â@—Â@— ý– ý–€í– ý– ý– ð– ð–Âàö– ý–Â`—€— ý–  —Â@— ý– ð–€í– ð–ÂÀó–Âú– ý–Âàö–Âàö– ð–ÂÀó– ð–€í– ð– ý– ð–Âàö– ð–Â`ê– ý–Âú– ý–Âú–Â@— ð–Â`ê– ä– ä–Âàݖ 䖀햀햀햀햠ä–ÂÀó–Â`ê–Âá–ÂÀږ€ԖÂ`Ñ–Â`Ñ–ÂàÝ–ÂÀÚ–ÂÀÚ–ÂàÝ–ÂàÝ–Âá–Âàݖ ז ˖Â@ΖÂàÄ–Â`і זÂÀÚ–Â ä–Âá–Â@ç– ä–€ԖÂÈ–Â Ë–ÂÈ–Â Ë–Â`Ñ–ÂȖ¯–Â@µ–Âà«–Â ²–Â૖ ¥–€¢– ¥– ¥– ¥– ™––– Œ–€‰–€‰– Œ–Â`†–ÂÀ–€‰–€‰–Â`†–Â@ƒ– €– s– g–Â`m– s–€p– s–€p–€p–Â`m–Âà`–Â`m–Â@j– Z– N– A– A–Â`;–€>–Â`T– N–€W– N–Â`T–ÂàG–€>–€>–Â`;– 5–€>– A–ÂàG–€>–€>– N– A–Â@8–Âà.–Â2–ÂÀ+–Âà.–Âà.–Â`"–Â`"–€%–€%–€%– – –ÂÀ– – –Âà––Âà– – – –Âà–€ –€ –Â` –€ – –Âà––ÂÀ–Â@–Â` –Â` – –€ –€ –Âà– ––Â` –€ –€ – –Â@– ––Â` – –ÂÀù• ö• ö•€ó• ö•Â`ð•€ó•€ó• ö•Â`ð•Â@í•Â`ð•Â`ð•Â@í•Âàã• ê• ê•Âàã• ê• ݕÂ`ð•Â`ð•€ڕÂ`ו€ڕ€ڕ ѕ ѕÂÀÇ•ÂÀÇ•ÂÀÇ•Â`וÂ`וÂàÊ•Â@Ô•Â Ñ•Â@Ô•Â Ñ•ÂΕ ѕÂÀà•Âàã•€ڕÂÀà•Âç•Â`ð•Â@í•ÂÀà•ÂÀà• ݕÂ@í•Â@í• ê•Âç• ê• ݕÂ`ו€ڕ ݕ ݕÂ@ԕ ݕ ݕÂ`ð•ÂÀù•€ó•Â@í•Âàã•€ڕ ݕ€ڕÂç• ê•ÂÀà•Âàã•Â`ð•Â@í• ê•Âàã•Âç•Âç•Âàã•ÂÀà•Â@Ô•Â`ו ݕÂç• ê• ê• ê•Âç•Â@í•Âç• ê•Â`ð•Âàã• ݕ ѕ ݕ ݕ ê•Âç•Âàã•Â`ו€ڕ ݕÂ`ו ݕ ݕÂç• ê•€ڕ€ڕ ݕÂÀà• ݕÂÀà•Â`וÂ@ԕ€ڕ ݕ ݕ ѕÂÀÇ•ÂÀÇ•ÂΕÂΕÂ@ԕ ѕ ݕ ݕ ѕÂ@Ô•Â`ו ê• ݕ€ڕ€ڕÂàÊ•ÂàÊ•ÂΕ ѕÂΕÂΕ ѕÂÀà• ê• ê• ê•Âàã• ݕÂ@Ô•ÂÀǕ ѕÂàʕ ѕ ѕÂ`ו ݕ ݕ ݕ ݕ ݕ ݕ€ڕÂàã•ÂÀà•€ڕÂÀà• ݕ ݕ ݕÂÀà•Âàã• ê•Âç•Âç•Â`וÂ`ו ݕÂàã•Âàã•Â@ԕ ѕ ѕÂ`וÂÀà•ÂÀà•Â`וÂÀà•Â`ו ݕ€ڕ ѕ ѕÂàã•ÂÀà• ݕÂ`וÂàʕ ĕ ѕ ѕ ѕ€ڕ ݕÂàã• ݕ ݕÂàã• ê• ݕÂ`וÂàã•€ڕÂàã• ݕÂÀà•ÂΕ ѕ ݕ€ڕÂΕ ĕÂàÊ•Â`וÂ@Ô•Â`ו ݕÂàã•Â`וÂ`ו€ڕÂ@Ô•Âàã•Âàã•Â`ð•€ó•Â`ð• ê•Âàã• ê• ݕÂàã•Âç•Â`ð•Â`ð•ÂÀù•€ó•Â@í• ê• ݕÂÀà• ݕÂàã•Âàã•Â@í•Âàã•Â`וÂàʕ ݕÂàã•Â@í•€ó•€ó•€ó• ê•Â@í• ê•Âàã•€ó•Â@í•Âàã•€ó• ö•Âàü•Âàü• ö•Â@í•Â`ð•Â@í•Â`ð• ö•Â`ð•Â`ð• ê•Â@í•Â`ð•Âç• ê•€ó• ê•Âàã•Â`וÂàÊ•ÂàÊ•Âàʕ ѕÂàã•Â`ð• ö•Âàü•––Âàü•Âàü•Â`ð• ö•ÂÀù• –Âàü• –– – ––Âàü•Â` – – –– ê• ö• ö• – –ÂÀ–Â` – – – – –Â` –Â` – ö•ÂÀù• ö• ö•Â@–Â` – –Â@– –Âà– –ÂÀ–€ – ––Âà–Âà–– –Âà– –Âà–€ –€ – –Âà– –ÂÀ– –Âà––Âà–Âà– –ÂÀ–€ –Â` – –Â@– –€ –€ – – – –Âà– –€ –ÂÀ– – ö•Âàü•– –Âà–ÂÀ–ÂÀ–Âà–€ –€ – –€ – – –Âà–Âà–Âàü•Â@–€ –Âà–Â`"–Â`"– –ÂÀ–€ –€ –ÂÀ–Â` –Â` –ÂÀ– –Âà–ÂÀ–Â` –Â@–ÂÀ–€%–€%–Â`"–Â`"–Âà–ÂÀ–Âà–Âà–ÂÀ–ÂÀ–€ –ÂÀ–Âà–Âà–ÂÀ– – –Âà–– ––€%–Â`"–Â`"–Âà.–ÂÀ+– –Âà– –Â`"–€%–Âà.– (–Âà.–Â2–€%– –ÂÀ+– 5–Â`;–Â@8–Âà.– (– (– (– – –Â@–Â@–Â`"–€%–€%–Âà.–Âà.– (– (–Â`"–Â`"–Âà.–Âà.–€>–Â@8– 5–Â@8–Â@8–€>– A–€>–Â@8–Â`;–Â`;–€>–Âà.– (– 5–Â`;– A–Â`;–Â@8–Â`;–ÂÀD– N– N– A– 5– A–Â@Q–Â@Q–Â`T–€W–€W–Â`T– Z–Â@Q–ÂK–ÂK–ÂK– A–ÂàG–ÂàG–ÂàG–€>–€>–ÂK–ÂK–ÂàG–€>–ÂK–Â@Q– A–Â`;–Â`;– A–Â@Q–Â`T– Z– Z–ÂÀ]–Âà`–Â`T–ÂàG–Â`T–€W– Z–ÂÀ]– g–Âd– g–Âà`–Âd–ÂÀ]–Â`m–€p– s–Â@j–€p– s–€p–Â@j–Â@j–Â@j–Â`m– s–ÂÀv– s–Âày– s–Âày– €–Âày–Â}–Âày–Â}– €–Â@ƒ–ÂÀv–ÂÀv–Âày–€p– s–Â}– €–Âày–Â`†–€‰–Â@ƒ–Â}– €– Œ–Âày–Âày–Â`m–Â}–ÂÀv–Âày– €–Â@ƒ– €–€‰–ÂÀ– Œ– €– €– €– Œ– Œ–€‰– ™– ™–Âà’–Â@œ–€¢–Â@œ––– Œ–ÂÀ– Œ–Âà’–Â Œ–Â`†–€‰– Œ– Œ– Œ–Â`†–€‰–Â`†– ™–Âà’–Âà’–Â`Ÿ–Â@œ– ™–Â`Ÿ–€¢– ™– ™– ™–Â@œ– ¥–Â@œ–Â@œ– ™–Â@œ–Â@œ–€¢–Âà’–Â€‰–Â`†–€‰–€‰– Œ– ™––– ™–Â@œ–Â@œ–––Âà’–ÂÀ– Œ– Œ– Œ–€‰– Œ– Œ– €– €–€‰–€‰–Âà’–Â––Â`Ÿ– ¥–Â`Ÿ–––Â@ƒ–Â`†– Œ– Œ– ™– ™– ¥– ™–––––Âà’–Â`Ÿ– ™–Â@œ–€¢–Â@œ–€¢–€¢– ™–Âà’–Â ™–Âà’–Â@œ–Â@œ– ™– ™–Âà’–Â ™––– ™–––Âà’–Â ™–Â@œ– ™–€¢–€¢– ¥–€¢– ¥– ¥–€¢– ™– ¥– ¥–Â`Ÿ–ÂÀ¨–¯– ²–€¢– ™–€¢– ™–––Âà’–Â Œ– Œ–ÂÀ–€‰– Œ–Â`Ÿ– ¥– ¥–€¢–Â`Ÿ– ™–Âà’–Âà’–Â ™–ÂÀ– Œ–––Â`Ÿ–€¢– ¥– ¥–ÂÀ¨–¯– ¥– ¥–ÂÀ¨–¯–Â`Ÿ–€¢–€¢– ¥– ¥–€¢– ™–€‰––– ™–––Âà’–ÂÀ–Â@œ–Â`Ÿ––––– ™– ¥– ¥–€¢– ¥–Â`Ÿ– ™––– ™– ™–Â@œ–Â`Ÿ–€¢–€¢– ™–Âà’–Â Œ– ™–€¢– ²–€¢–Â`Ÿ–Âà«–Âà«–Â ²– ²–¯–€¢–Â૖¯–ÂÀ¨–Â`Ÿ–€¢–Â@µ–¯–Â@µ–Â૖€¢–Â`Ÿ– ¥– ™–€¢–€¢–€¢–Â@œ–Âà’–Â€¢–Â@œ–Â`Ÿ–€¢– ¥–ÂÀ¨– ™–Â@œ–Â@œ– ¥–Âà«–ÂÀ¨–Âà«–Âà«–Â ²–Â@µ–ÂÀ¨– ¥– ¥–Âà«–ÂÀ¨– ¥–Â`Ÿ–ÂÀ¨–Â`Ÿ–Â@œ– ™– ™–Â@œ–Âà’–ÂÀ–Â`Ÿ–€¢– ¥– ¥–ÂÀ¨– ²–€»– ¾–Â`¸–Â@µ–Â`¸– ¾–€»–Â@µ–ÂÀ¨–Â૖ ¥– ¥–ÂÀ¨– ¥–Â`Ÿ–Â`Ÿ–€¢– ¥–€¢–Âà«–Â ²– ²–Â`¸– ²– ¥–Âà«–Âà«–Âà«–Â૖ ¥–Âà«–Â ²– ²– ²– ˖ÂÈ–ÂàÄ–Â`¸–Â`¸–€»–Âà«–Âà«–Â ²–Â@µ– ¾– ¾–Â`¸– ²–Â@µ– ¾– ¾– ¾–Â`¸– ¾– ¾– ¾–€»– ¾–Â@µ–Âà«–Â૖¯– ¾–ÂÈ–ÂÀÁ–ÂÀÁ–¯–Â`¸–Â`¸– ²–Âà«–Â`¸–ÂÀÁ– ˖ÂÈ–ÂàÄ–Â`¸–Âà«–ÂÀ¨–Âà«–ÂÀ¨–¯–Â`¸–Â`¸–Â@µ– ²– ²– ²–Â@µ–Â`¸–Â૖ ¾–ÂàĖ€»–€»–€»– ²– ¾–€»–Â@µ– ²– ²–Âà«–Â@µ– ˖ ¾–ÂÀÁ– ¾– ¾–Â`¸– ¾–Â`¸–€»– ²– ¾–ÂÈ–ÂÈ–Â Ë–ÂÈ–ÂÈ–ÂàĖ€»–ÂàĖ ¾– ¾–ÂȖ ¾–€»–Â@µ–Âà«–Â@µ–Â`¸–ÂÀÁ–€»–€»–ÂÀÁ– ¾–ÂȖ ¾– ¾– ¾– ¾– ¾– ²–¯– ²–Â૖ ¥–ÂÀ¨– ¥– ²–Â`¸– ²– ¥–Â@µ–ÂÀÁ– ¾–Â@ΖÂ@Ζ ¾– ¾–Â@µ–Â@µ–€»–€»–Â`¸–Â`¸–€»– ¾–Â`¸–€»– ¾– ¾–ÂàÄ–ÂàĖ ¾–€»–Â@µ–€»–€»–€»–€»–ÂàÄ–Â Ë–Â`Ñ–Â`Ñ–Â@Ζ ˖ÂÈ–ÂàÄ–ÂÈ–Â Ë–Â@ΖÂàĖ€»– ¾– ¾– ¾–ÂàÄ–ÂàĖ ¾– ˖ÂÀÁ– ²–Â`¸–€»–ÂÈ–ÂȖ ז ז זÂàݖ זÂÈ–ÂÀÁ– ¾–ÂÈ–ÂÀÁ–ÂÀÁ– ¾– ¾– ¾–ÂàÄ–ÂÀÁ– ˖ÂàĖ ˖€ԖÂȖ ¾– ¾–€»– ²–€»– ¾– ¾–€»–Â@µ–¯– ˖ÂÈ–ÂÀÁ–€»–ÂÀÁ–ÂàĖ ¾–ÂÀÁ–ÂÈ–ÂÀÁ–€»– ¾–€»–Â`¸–Â`¸–Â`¸– ²–€»–Â`і ˖ ˖ ˖ ז ז ז€ԖÂàÄ–Â Ë–ÂàĖ€»–ÂÈ–ÂàÄ–ÂÈ–Â@ΖÂ@Ζ ˖ÂÀÚ–Âàݖ ז ˖ÂÈ–Â@ΖÂȖ ¾–ÂÈ–Â Ë–ÂàÄ–ÂàÄ–Â Ë–Â`Ñ–ÂÀÚ–Â`Ñ–Â`Ñ–Â`і ז€ԖÂ@ΖÂÀږ€Ԗ ˖€Ԗ€Ԗ€Ԗ ז זÂàÝ–Âá–€ԖÂ@ΖÂ@Ζ€Ԗ€Ԗ ä– ä–Â`ê– ä– זÂ`і זÂàݖ זÂàÝ–Âá–Âàݖ ז ז ˖ ˖ ˖Â`Ñ–Â`Ñ–Â Ë–Â`і ז זÂ`Ñ–Â`Ñ–Â`і ˖ ¾–ÂàĖ ¾–Â`¸–ÂàÄ–Â`Ñ–Â@ΖÂ`Ñ–Â Ë–Â`Ñ–Â`Ñ–ÂàÄ–ÂàÄ–Â Ë–Â Ë–ÂÈ–ÂàÄ–Â Ë–ÂÈ–Â Ë–Â`Ñ–Â Ë–Â Ë–ÂÀÁ–Â`¸–€»–ÂÀÁ– ¾– ˖ÂÀÚ–Â`Ñ–Â`Ñ–Â`Ñ–Â`Ñ–ÂàÝ–ÂàÝ–Âá– ä–Âá– ä–ÂÀÚ–Âá–ÂàÝ–ÂàÝ–ÂàÝ–Â@ç–Âá–Â`ê–€í–Â`ê–ÂàÝ–Â@ç–ÂàÝ–ÂÀږ€Ԗ ז ä–Âá–Â`ê–€Ԗ€ԖÂ@Ζ€ԖÂÀږ ð–Â`ê– ä–ÂàÝ–ÂàÝ–Â ä–Âá–Âàݖ 䖀햠ð–Â@ç–€í–Âú–Âú– ð–Âàݖ ז ä– ä–Â`ê– ז€ԖÂàÝ–Â`Ñ–Â`Ñ–Âàݖ€Ԗ€ԖÂ`і€ԖÂ@Ζ ˖ÂÀÚ–Âá– ä–Âàݖ€í– ä–Â@ç–ÂàÝ–ÂàÝ–Â@ç–ÂàÝ–ÂÀږ€Ԗ ז ז זÂ`Ñ–Â@ΖÂàÄ–ÂÀÁ–€»–ÂÀÁ–ÂÈ–ÂàÄ–Â Ë–ÂÀÁ– ˖ ˖ÂÈ–ÂàĖ ¾– ²–Â@µ– ²–¯–ÂÀ¨–€¢–€¢–€¢–Âà«–Â ²–ÂÀÁ–ÂàÄ–Â`¸–Â`¸–Â`¸–Â@µ–Â@µ– ²– ¾–ÂÀÁ– ¾–Â@µ– ²– ²–€»–Â૖€¢–Â`Ÿ– ™– ¥–€¢–ÂÀ¨–Âà«–Â ²–Â૖ ¥–€¢–€¢– ¥– ¥– ¥–ÂÀ¨–€¢–€¢– ¥–Â@œ– ¥– ²– ²–€»–Â@µ– ²– ¥–Âà«–Â ²–€»–Â@µ–Âà«–Â`¸– ²–ÂàÄ–ÂȖ€»– ¾– ¾–ÂÀÁ–Â`¸–Â૖¯–ÂÀ¨–¯– ²–Â`¸–€»– ²– ²– ¥– ¥– ¥– ¥–ÂÀ¨–ÂÀ¨–€¢–Â@œ– ¥–Â`Ÿ–€¢– ¥– ¥–Â@µ– ²–€»– ²–Âà«–Âà«–Âà«–Âà«–ÂÀ¨–€¢–Â@œ– ™–Â`Ÿ–¯–Â`Ÿ–Â`Ÿ– ™–€¢–€¢–ÂÀ¨– ¥–Â`Ÿ–Â@œ–Â`Ÿ–€¢–ÂÀ¨–ÂÀ¨– ¥– ¥– ¥–Â@œ– ™––– ™– ¥–Â`Ÿ–Â@œ–Â@œ– Œ–Âà’–Â@œ– ™–––Âà’–ÂÀ–ÂÀ–Â`Ÿ–Â`Ÿ–Â@œ–Âà’–Âà’–Â`Ÿ––– Œ–––Â`Ÿ–€¢–ÂÀ¨–ÂÀ¨– ¥–€¢–€¢– ™––– ™–Âà’–Â@œ–––€¢– ™–Â`Ÿ– ™– ™– ™– ™– ™––– ™–––––Âà’–Â Œ–ÂÀ–Âà’–Â––Â@œ–Âà’–ÂÀ– Œ–Âày–Â`†–Âà’–Â`Ÿ–Â`Ÿ– Œ– ™– Œ–Â`†–Â@ƒ–Â}–Âày–Âày– €–€‰–ÂÀ– Œ–Âà’–Âà’–Â ™– ™–Âà’–Â ™–€¢– ¥–€¢– ¥–€¢–Â`Ÿ– ¥–Âà«–Â`Ÿ– ™– Œ–Â`†– Œ– Œ–––––Âà’–Â–– Œ–€‰–ÂÀ–––––Â`Ÿ–ÂÀ¨–Â`Ÿ–Â`Ÿ– ¥–Âà’–Âà’–Âà’–Â€‰–€‰–Â`†– €–Â`†– Œ– Œ–€‰–Â@ƒ–€‰– Œ– ™– ¥– ¥–Âà’–ÂÀ– ™– ™–Â`Ÿ–€¢–Â`Ÿ–€¢–Â@œ–Â`Ÿ–€¢–€¢–Â`Ÿ–Â`Ÿ–Â`Ÿ–ÂÀ¨–Â@œ–Âà’–Â ™– ¥–Â૖ ¥–Â૖ ¥–Â`Ÿ– ™– Œ–Â`Ÿ–Â`Ÿ–ÂÀ¨–€¢–Âà«–Â૖–– Œ– Œ– Œ–Â@œ– ™–€¢–Â@œ–ÂÀ– Œ– ¥– ¥–Âà«–Â ™–€¢–Â`Ÿ–––€‰–Âà’–Â ™–€¢–Â@œ– ™– ¥– ¥– ¥–Â`Ÿ–Â`Ÿ– ™– ™–Â`Ÿ– ¥–ÂÀ¨–€¢–Â@œ–¯–Âà«–Â ²–ÂÀ¨–Â`Ÿ–Â૖¯–ÂÀ¨–Âà«–Â@µ–¯–¯–€¢–€¢– ¥–€¢–€¢– ™– ¥–ÂÀ¨–Âà«–Â@œ–Â`Ÿ– ™–Â`Ÿ–€¢–ÂÀ¨–Â૖ ¥–Â`¸–Â૖€»–ÂÀÁ–ÂÀÁ–ÂȖ ¾–€»–Â`¸– ¾–Â`¸–€»– ¾–ÂàÄ–Â Ë–Â Ë–ÂȖ ˖ ¾–€»–ÂÀÁ–Â`¸–¯–Â`¸– ²–Â`¸–Â@µ–€»–€»–ÂÀÁ–ÂàĖ ¾– ¾–Â`¸–€»–Â`¸–€»– ¾–ÂȖ ¾–Â`¸–€»– ¾–ÂàÄ–ÂÈ–Â`¸– ¾–ÂÈ–ÂàÄ–ÂÀÁ–ÂàÄ–Â@ΖÂ@ΖÂ@ΖÂàĖ ¾–ÂàĖ€ԖÂÀÚ–Âá–Â`ê–Âàݖ€Ԗ זÂá– ז€ԖÂÀÚ–Âàݖ€Ԗ ˖ÂÈ–ÂȖ ˖ ˖ ז ˖ זÂÀÚ–Â ä– ז€Ԗ€ԖÂ`Ñ–Â`і€Ԗ ז זÂàÝ–Â ä–ÂàÝ–Â ä– ä–ÂÀږ זÂàÝ–Âàݖ זÂ@ΖÂàÄ–Â Ë–Â@ΖÂàÝ–Â ä– ä–ÂÀÚ–Â`Ñ–Â`Ñ–ÂÀÚ–ÂàÝ–Â`ê–Â`ꖀ햠ä–Â`ê– ä–Â@ç–ÂÀږ ז€ԖÂàÝ–ÂàÝ–Âàݖ ז ä– ז ז ז ä–Â@ç–Âú–Â@ç–Â@ç–Â@ç– ä–ÂÀÚ–ÂàÝ–Â ä–Âàݖ€í– ð– ð–€í–Â@ç–€í–ÂÀó–Â@ç– ð–Â`ê–Â@ç–Âá–Â@ç–€í–Â`ꖠ䖀햠ð–ÂÀó– ð–ÂàÝ–Â ä–Â@ç–Â@疠䖀햠ý–Â`—Â@—Âú– ý– ð–Âàö–€í– ä–Âá–Â@ç– ð–Âú–ÂÀó–Âàö–Â`ê– ä–ÂàÝ–Â ä–Â@ç– ð–€í–Â`ê–Âú–ÂÀó–Â@ç–Âàݖ זÂá– ä–Âá– ä– ä–Â`ꖀ햠ð– ä–ÂÀó– ð–Â`ê–€í–Â@ç–Â@ç–ÂÀó–Âú– ý–Â@—ÂÀó–Âàö–ÂÀó–Âú–Âàö– ð–Â@—ÂÀó– ð–Â`ê– ä– ä–€í–Âàö–Â@ç– ä–ÂàÝ–Â ä–ÂÀÚ–Â ä–Âàö–Â`ê– ð–€í–ÂÀó–Âàö– ý–Âú–Âàö– ð– ð– ð–Âàö– ð–Â`ê– ð– ð– ð– ð–Âú– ý–Â`—Â`— ý–ÂÀó– ð– ð– ð– ð– ý–Âú–Â`—Âàö– ý–Âàö–€í–ÂÀó– ð–Âú–Âú– ý–Âú–Âú–ÂÀó–Âú–Âàö–Â`ê– ð– ð– ð–Â`ê–ÂÀó–Âàö– ý–Âú– ð–€í– ð–Âàö–Âàö– ý–Âú–Âàö– ð–Âàö– ý–Âàö–ÂÀó–ÂÀó–Âú–Âú–€í–Âàö–Âú–Âú– ý– ý–Â`—€—ÂÀ —ÂÀ —  —€—Âà—€—€— ý–€—Â@—Âú–Â`—€—Â`— ý–Âàö– ð– ð–Âú–Âú–  —€—€—€—€—Âú–Â`—€—Âàö– ý–Â`—€—€—€—Â@— ý–ÂÀó– ð–Âàö–€—Â@—ÂÀ —  —  —  —€—  —ÂÀ —  —  —  —Â@—  —Âà—Âà—Â`—€—Â`—  —€—  —Â@—Â`———Âà—€—€— ý–  —  —Â`—Â`—  — — —ÂÀ —Â`—ÂÀ%—Âà(— "—€—ÂÀ%— "—ÂÀ%— /— "—€— "— "—€—Â@—Â`—Â@— "— "—ÂÀ%—Âà(—Â`5—€8—€8—Â`5—Â@2—Â@2—Âà(—Â@2—Â,— /—€8—ÂE—Â`5—Â,—ÂÀ%— /—€8— ;—Â`5—€8—Â`5— /— /—Â,— /— "—Â`——Â,— ;— H—ÂE—ÂÀ>— ;—Â,—Â@2—ÂàA— ;—€8—ÂÀ>—€8—Â@2—€8—ÂàA— ;— H—Â`N—Â`N—ÂàZ—ÂàZ—Â`N—Â`N— H— ;—ÂE—Â`N—ÂàA— ;— H— ;—ÂÀ>—ÂÀ>—Â`N— H—ÂE—ÂÀ>— H—ÂE— H—Â@K—Â@K— H—ÂàA—ÂE— ;—Â`5—€8—€8—€8— /—Â`5—€8— H—ÂàA—€8—€8—Â@2—Â`5—Â`5— ;—ÂàA—ÂàA—ÂàA—ÂàA— H— ;—€8— ;—ÂàA—ÂàA—ÂÀ>— ;— ;— /— /—Â`5— ;—Â,— "—Â`— /—€8—Â,—€8— /— /—€—Âà(—€8— ;— ;— /—Â`5— /—Â,— "—Âà(—€8— "—Â,— /—€8— ;— /—€8—Â`5—ÂÀ%—ÂÀ%— /—Â@2—ÂÀ>—€8— /—Â`5—Â@2—Â@2—ÂÀ%—Âà(—ÂÀ%—€— "— "—Âà(— "— "—ÂÀ%—€—€—€—€— "—Âà(—ÂÀ%—Â,—Âà(—Â,— /— /—ÂÀ%— "—ÂÀ%—Â@—€—€—Â`— "—Â`—Âà(—Â@2—Â`5—Â@2— ;— /— /—Âà(—Â,—€8—Â`5— /—€8—Â,— /—Â,— /—Â,—Â`5—Â,— "—Â`5— /—ÂÀ%—€—Â`—Â`—Â`—Â`— "—ÂÀ%—€—€— /—ÂÀ>—ÂÀ>—Â@2—Â,— —Â@—Âà—ÂÀ — — "—Â`—Â`—Â`—Â@—Â`— "—€—€— "— "— "—Â,— "— "—Â`—Â`—Âà(—Â`— —Â`—€— /—Â,—Â,—ÂÀ%—Â`—Â`—ÂÀ%—ÂÀ%—Âà—  —  — —ÂÀ —  —Âà—  —Â`—€— "—€—€—Â`—Âà(—Â@——ÂÀ ——Â@—Â`—€—Â`— — —  —  —Â@— —€—Â`—€—Âà(—Â,— /—Âà(—€—ÂÀ —€—Â`—  —€—Âà—ÂÀ —  — —Â`—€—Â@—Â`—Âà— —  —Âà—  —— ——ÂÀ —Âà—Âà— — "—€—Â`—Â@—Â`— ——Â@—Â`—€—Â@— — —Â`—€—Â`—Âà—Âà—ÂÀ —Âà—Âà—Â`— "—€—Â`—Âà—Âà—ÂÀ —ÂÀ —Âà—  —Âà—ÂÀ — —Âà—Âà—Â`—Â`——Â@—Â`—Â@— —Âà—Âà——Â@— "—Â,—€— "—ÂÀ%—€—Â`—€—€—ÂÀ%— "— — —Âà— —Â,—Âà(—€— "— "— "— "—Â,— "— — "—Âà(—Â`5—€8—ÂÀ>—ÂÀ>—ÂÀ>—ÂàA—Â`5— ;—ÂÀ>— ;— /—€8—Â`5—€8— /— /—Â`5—Âà(—Âà(— "— "— /—€8—Â@2—€8— ;— ;—€8— ;—Â@2— ;— ;—ÂàA— ;—Â`5— /— /— /—Â`5— /— /—Âà(— "—€— "—Â@2—€8— /—ÂÀ>— ;—Â@K— ;— /— /—Â`5—Â@2—€8—ÂÀ>—ÂàA—ÂàA—ÂÀ>—Â`5— ;—ÂÀ>—ÂE— ;—€8—ÂÀ>— ;—€8—€8—€8—ÂE—ÂàA—ÂE— ;—€8—€8—ÂÀ>— ;—ÂàA—Â@K—ÂàA— H— H—ÂàA—ÂàA— ;—Â`5—Â`5— ;—€8—€8— ;—€8—Â`5—€8— ;—Â`5— ;— ;—ÂÀ>— /— /—Â`5—€8—Â`5—€8—€8—Â@2—Â,—Â`5— ;—Â`5—Â`5— /— ;— ;— ;—Â`5— ;— ;—€8— ;—€8— ;—ÂàA—ÂE—ÂE—Â`N—ÂE— H— H— H— H—€Q—Â`N—Â@K—ÂàA—ÂE— H—Â`N— H—ÂàA—ÂàA—ÂàA—ÂàA—ÂàA—Â@2— ;— H—ÂE—ÂàA—ÂE—ÂE— H—€Q— a—Â`N—ÂàA—ÂàA— ;—ÂàA—€8—ÂÀ>— ;—Â,— ;—ÂE—ÂÀ>—ÂàA—ÂàA—€Q—Â@K—Â`N—Â@K—ÂE—ÂÀ>—ÂE— H— T—Â@K—ÂàA—Â`N—Â`N—Â`N— H—Â@K—Â@K— H—ÂE—ÂE—Â`N—ÂÀ>—€8—Â`5— ;—€8— ;— ;—ÂàA— ;—ÂÀ>—ÂàA—ÂE—ÂÀ>—€8—ÂE—ÂàA— H—Â@K—Â@K— H—ÂàA—ÂÀ>— ;—ÂàA—€Q— ;—ÂàA— ;— ;— /—Â@2—Â`5—ÂÀ>—Â@2—Â,—Âà(— /—Â`5— /—Â@2—Âà(—Âà(—Âà(—ÂÀ%—Â,—Â`5—ÂàA—ÂàA—ÂàA— H— H—ÂàA—ÂE—Â@K—ÂàA—ÂàA— ;— ;— ;— ;—ÂE—Â@2— /— /—Â`5— ;—ÂàA— ;— ;—€8—Â,—Â`5—€8— ;—Â`5— ;—ÂàA—ÂE— H—Â@K— H—Â`N—Â`N—ÂE—ÂàA—€8—Âà(— /— ;—ÂàA—ÂE—€8— /— /—ÂÀ>—ÂE—ÂE—Â@K—Â@K—ÂàA—€Q—Â`N— H— ;—ÂàA—Â`N—€Q— H—ÂÀ>—ÂE— H—Â`N— H—ÂÀ>— ;—Â`5—€8— ;—€8— ;— ;—ÂÀ>—ÂàA—ÂàA— H—Â@K—ÂE—ÂE— H— H—Â@K—Â`N—ÂàZ— H—ÂE—ÂàA— ;—Â@2— ;— /—Â,—Â@—Â@—€— "—ÂÀ%— "—€—Â`—€—€—Â@—Âà— —Â`— ——Âà——Â@—Âà—Â@— "—ÂÀ%— "—Âà(—ÂÀ%— /—Â,— /— "—Â`—Âà—ÂÀ ——Âà—ÂÀ —€—€—Âà—Âà—Â@—Â`— "—Â@— —Â@—Âà—Â`— ý–Âú–€—Âú–  —Â`— ý–Âú–  —ÂÀ — —ÂÀ ——Â@—Â@— — —Â`—Â`—Âà—Â`— ý– ý– ý–  —  —€— —Â`—Â`—ÂÀ —Âà—ÂÀ — — —Âà—ÂÀ —Âà—ÂÀ —  —  —€—Âà—€— ý– ý–Â`— ý–Âú– ð–Âú– ý– ý–Â`—Â`—  —  —  —€—€—Âà—  —€—Â@—Â@—Âú–Â@—Â@—Â`—€—ÂÀ —  — ý–Âú–€—  —ÂÀ — ——Â@—Â@—€— ——ÂÀ —  —Â`—Âà—ÂÀ —Âà—Âà— — —Âà——  —Âà—Âà— —Â`— —— —Âà—Âà—ÂÀ —  —  —Âà—Âà—Â@—Âà—Âà—Âà—€—Âàö–Â`ꖀ햠ð–Â@—Â@—Â@—€—€—Â@—ÂÀ —Âà—Â@—Âà—Âà—Âà—  —Â`—ÂÀ —  —€—€—  —Â@—€—ÂÀ —ÂÀ —  —ÂÀ —ÂÀ —€—€—Âà———Âà—€—Âà—ÂÀ —  —Âà—ÂÀ —ÂÀ —Âà—  —  ——Â`—Âà—Â@——Â@—  —  —  —Â`—Âà—  —  —— ý–ÂÀó–Âàö–Âú–Âàö–Â`—  —  —ÂÀ —€—Â`—€—ÂÀ —ÂÀ —  —ÂÀ —Âà—Âà—  —Âà—  —€—Âà—Âà—Âà— — —Â`—Â`—€—Â@—Â@—Âà—  —Â`—Âàö–  —€— ý– ý– ý–€—Â`—  — ý–Âàö–ÂÀó–ÂÀó– ý–Âú– ý– ý–€— ý–Âú–Â@—€—  —ÂÀ — ý–Âú–Âàö– ý–Âú–Â@—Â@— ý– ð–Â@ç–Âàö–ÂÀó– ð– ð– ä–Âá–Â`ê– ä–Âàö–€— ý–Âàö–Âú– ý–Âàö–  —€——Âà—Âà— ð–Âú–€í– ý– ð–€í– ý– ý–Â@—Â@— ý–Âú– ý–Âú–€í– ä–Â@ç–Â@ç–Âú–Âàö–ÂÀó–Âàö–ÂÀó– ð– ð–Âàö– ð–€í–Âàö– ä– ä–Â@疠䖀햠䖠䖠䖠ä–ÂÀږ ז ז ä–Â@ç–Â@疠䖀햀í–Â@ç–ÂàÝ–Â ä–Âᖀ햀Ԗ€Ԗ זÂ`ê–Â`ê– ð–Âú–Âú–Âàö–€í–ÂÀó– ð– ð– ý–Âú–€— ý–Âú–ÂÀó– ð– ð–€í–€í– ä–ÂÀó–Â@ç–Âá– ä–Â`ê– ä– ð–ÂÀó–Â`ꖀ햀햠ä–Â@ç– ä– ä–Â@ç–ÂÀó–Âú–Âàö– ð–Â`ê–Âá– ä–Â@ç–Â`ê– ä–Â`ê–Â@ç–Â@ç–ÂàÝ–ÂàÝ–Â ä–Â@ç– ð– ð–Â`ê–ÂÀó– ð–Âú– ð– ý–ÂÀó– ð–€í–Â@ç–Â`ê– ä– ז זÂÀږ זÂàÝ–ÂàÝ–ÂÀÚ–Â@ç–ÂÀÚ–Â@疀햠ä–ÂàÝ–ÂàÝ–Â`ê–Âá–Âá–Âá– ä–Â`ê–ÂÀó–Â`ê– ä– ä–Âá–ÂÀږ€í– ð–€í–Â`ê–Â@ç–Â`ê– ä– ä–ÂàÝ–Â`ê–Â`ê–Âú–Â`ê–Â`ê–Âá–Â@Ζ ˖ ˖€ԖÂàÝ–Â ä–ÂàÝ–ÂàÝ–Â`ê–Âá–Âá–Â@ç–Â`ê–Â@ç–€í–Âàݖ ð–Â`ê– ä–€ԖÂÀږ זÂ`ê–Â`ê– ä–Â@ç–ÂÀó–Â`ê– ä–Â`ê–ÂàÝ–ÂÀÚ–Âàݖ זÂ@ç– ä– ä–Â@ç– ä– ä– ä–Â@ç–Â`ê– ä–ÂàÝ–ÂàÝ–Â`ê–Â`ê–Â@ç– ð–Âú–Âàö– ð–Â`ê–Âàö–€í– ð–Â`ê–Â@ç–ÂàÝ–Â ä–Âá–ÂÀÚ–Â ä–Â@ç–Â`ê– ä–Â`ê–Âú–Âú–€í–€í–ÂÀó– ý–  —Â`—Â@—€—  —€—ÂÀó–Âú–Âàö–Âàö–Âàö–ÂÀó– ð– ð–Âú–Âàö–Âàö– ð– ý–Âú–Âàö– ð– ð– ð–€í–Âàö– ð– ð–Âàö–€í– ð–ÂÀó– ð–Âú– ð–Âàö–ÂÀó–€í–Âú–Â@—Â`— ý– ð–Âàö– ý– ð–Â@—Â@—ÂÀó–Âú–Âàö–Âàö–€í–ÂÀó–Âàö–Âàö–Âàö–ÂÀó–Âú– ý–Â@—Âàö–Âú–€—Âà—ÂÀ —Â`—Â@— ý–Âú–Âàö– ð–Âàö–€í–Âàö– ý–ÂÀó–Âàö–ÂÀ — ý–Âàö–Â`ê–Âá–Â`ê– ä–€í–Â`ê–Â@ç– ä–Â@疠䖀햠䖠ä–Â@ç–Â@疀햀í–Â`ê– ð– ð– ä– ä–Âá– ä–Â@ç–Âá– זÂàÝ–Â@ç– ז€ԖÂàÄ–Â@ΖÂ@ΖÂ`Ñ–Â@Ζ€Ԗ ˖ÂàĖ ˖ ˖ ז€Ԗ ä–Â@ç–ÂàÝ–Â@ΖÂ`Ñ–Â Ë–ÂÈ–Â ²– ¾– ¾–ÂàÄ–ÂàĖ€»– ¾–ÂàÄ–Â@ΖÂȖ€ԖÂ@ΖÂ`Ñ–ÂàĖ ¾–Â`¸– ¾– ¾–€»–Â`¸–Â૖ ¾–ÂàÄ–ÂÀÁ–ÂȖ ¾–ÂàÄ–ÂÀÁ–ÂÀÁ– ²–Âà«–Â@µ– ²–¯–Âà«–Â ²– ²–Â@µ– ²–Â`¸–€»–ÂÀÁ–Âà«–ÂÀ¨–Â`¸–Âà«–Âà«–Âà«–Â૖ ¥–¯–Â૖¯–Â@µ– ¾–Â`¸–Â@µ–Â@µ– ²–Âà«–ÂÀ¨– ¥–ÂÀ¨–¯–¯– ¥–Â`Ÿ–Â`Ÿ– ¥– ¥–Â૖¯–Â૖¯– ²– ¾–Â`¸– ¾–Âà«–Â૖€»– ¾–Â`¸–Âà«–ÂÀ¨– ¥–Â@œ– ¥–Âà«–Âà«–Â`Ÿ– ²–¯–ÂÀ¨–€¢– ¥– ¥–ÂÀ¨–Â૖ ¥–Â૖¯–€»–Âà«–Â@µ–Â@µ–€»–Â`¸–ÂàÄ–ÂÀÁ– ¾–Â`¸–¯–Â@µ– ²–€»–Â@µ– ²– ¾–Â`¸–¯– ¥– ¥– ²–Âà«–Â@µ–Â@µ– ¾–¯–Â`Ÿ–Â`Ÿ–€¢– ¥– ²–¯–€»–Â`¸–Â@µ– ²–Â@µ–¯–ÂÀ¨– ²–Â`Ÿ–Â`Ÿ– ¥–ÂÀ¨–Â@œ–Â`Ÿ– ¥–ÂÀ¨–€¢–¯–€»– ¾–Â`¸– ˖Â`¸–Â@µ–ÂÀ¨– ¥–Â@œ–Â@œ–Â`Ÿ–Â`Ÿ–€¢– ¥– ¥– ¥–Â`Ÿ– ¥– ¥– ²–¯– ²–Â@µ– ¾– ¾–Â`¸–ÂàÄ–ÂàĖ€»–Âà«–Â ²–¯–Â`¸– ¾–Â`¸–Â@µ–Â`¸– ¾–ÂÀÁ– ¾– ¾–ÂÀÁ–ÂàĖ ˖ ˖ ¾–Â`¸–€»– ¾–ÂàÄ–Â Ë–ÂàÄ–Â`¸– ¾– ¾–Â`¸– ¾– ˖ ˖Â`Ñ–Â`Ñ–Â Ë–ÂȖ ˖ ˖ זÂá–ÂàÝ–ÂÀÚ–Â Ë–ÂÀÁ–ÂàÄ–ÂÀÁ– ˖ ˖ÂÈ–Â`Ñ–ÂȖ ¾– ˖ ˖ ²– ¥–Âà«–Â ²– ¾– ˖ ˖ ˖ ˖ ˖ ¾– ¾– ¾–¯–€»–€»–€»–Â`¸–Â૖¯– ²– ²– ²–Â`¸–€»– ¾– ¾– ¾–€»–Â`¸–¯– ²–Â`¸–€»–ÂàÄ–ÂÀÁ– ¾–ÂÈ–Â`і ז זÂ@ΖÂ@Ζ ˖ÂÈ–ÂÈ–Â`Ñ–ÂÈ–ÂÈ–ÂàĖ ¾– ¾–ÂàĖ ¾–Â@µ–ÂÀÁ–€»– ¾–Â`¸– ²–ÂÀÁ–ÂÈ–ÂÀÁ– ¾– ¾–€»– ¾–ÂàĖ ˖ ¾–ÂÈ–ÂÀÁ–€»– ¾– ¾–Â`¸– ²– ²–¯– ¾– ¾–ÂÀÁ–ÂàÄ–ÂàÄ–ÂàĖ ¾–ÂÈ–ÂàÄ–ÂàÄ–ÂÀÁ– ²–Âà«–ÂÀ¨–Â૖€»– ²–ÂÀ¨– ¥–Âà«–Â ²–ÂÀÁ– ¾– ¾–€»–Â૖ ¥– ¥–Â૖€¢– ¥–ÂÀ¨–€¢– ¥–ÂÀ¨– ²–€»–Â`¸–Â@µ–Â`¸– ²– ²–¯– ¥–ÂÀ¨–Âà«–Â ²–Â`¸– ²–Âà«–Âà«–Â ²–Â@µ–Â@µ–€»–€»–Âà«–ÂÀ¨– ¥–ÂÀ¨–Âà«–Â@µ– ²– ¾– ¾– ¾–Â`¸– ²– ²–Â`¸– ¾– ²– ²–ÂÀ¨–¯–Â@µ–ÂàĖ ˖ ¾–ÂÀÁ– ¾–Â@µ–Â`¸–Â@µ–Â૖ ¥–Âà«–Â ²–€¢–€¢– ¥–ÂÀ¨–Â૖ ¥–¯– ²–Â૖¯– ²– ²–Â@µ–Â૖ ¥–ÂÀ¨– ¥–ÂÀ¨–Âà«–Âà«–Â૖€»–€»–Â૖€¢– ™– ¥– ¥– ¥–ÂÀ¨–¯–Âà«–Â`Ÿ–Â@œ–Â@œ–ÂÀ¨–Â૖ ¥–Â`Ÿ–Â@œ–Â`Ÿ–Â@œ–Â@œ–€¢–Â@œ–––ÂÀ–ÂÀ–Â@œ–Â@œ–ÂÀ¨–Â`Ÿ– ¥–€¢–€¢–Â@œ–Â@œ–Â@œ– ¥–Â`Ÿ– ¥–Â`Ÿ–€¢– ™–ÂÀ–Âà’–Âà’–Âà’–Â@œ– ™–Â@œ– ™– Œ–Âà’–Â`Ÿ–€¢– ™– ™–Âà’–Âà’–Â ™–ÂÀ– ™–€¢– ¥–––ÂÀ–Â`†– Œ–Âà’–Âà’–Â Œ–ÂÀ– ™–Âà’–Â@œ–€¢–ÂÀ¨–ÂÀ¨– ¥– ™–Âà’–Â@œ– ¥–Â`Ÿ– ™–Â@œ–Âà’–Â ™–Âà’–Âà’–Â`†–Â`†–Â`†–€‰– Œ–€‰–€‰– Œ–Â`†– €–Â`†–Â`†–Â`†–Â}– s–€p–€p–Â`m–ÂÀv– €– Œ–Â`†– Œ– Œ–ÂÀ–Âà’–Â Œ–Â@ƒ– Œ–Â@ƒ– Œ–€‰–Â`†– €– €–€‰– €–€‰– €– s–Âày– s–Âày–Âày– €– €–Â`†–Â@ƒ– €–€‰– ™–––Âà’–Â Œ– €–Â}–Âày– €– s– €–€‰––– ™–Âà’–Â Œ– Œ– €–€‰–ÂÀ–Â@œ–€¢–Â`Ÿ– ™–Â`Ÿ–€¢–€¢– ™–Â`Ÿ–Âà’–Â––Â`Ÿ–Â`Ÿ–Â`Ÿ–ÂÀ¨–Â@œ–Â@œ– ™–€¢–Â`Ÿ–Âà’–Âà’–Â@œ–Â@œ–––Â`Ÿ– ™–ÂÀ–Âà’–Â Œ–Âà’–ÂÀ–Âà’–ÂÀ–ÂÀ–ÂÀ–Â`Ÿ– ™– ¥–Â`Ÿ–Â@œ– ¥–€¢–ÂÀ¨–Âà«–Â`Ÿ– ²–¯–Â`Ÿ–Âà’–Â Œ–––€‰–Â`†–ÂÀ–Âà’–Â@œ–ÂÀ–ÂÀ–Â@ƒ––– Œ–Â@ƒ– €–Â@ƒ–€‰–Â`†– €–Â`†– Œ– Œ– Œ– ™––– ™–––Âà’–Â ™– Œ–Â`†–Â`†–Â`†–€‰–Âà’–Â–– Œ–Â`†– Œ– Œ–€‰– €–Â}– €–Â`†–ÂÀ–Â@ƒ–Â`†–Â`†–€‰– Œ– ™– Œ–€‰–Â}–Âày– s–Â}–Â}–Â}–Â@ƒ–Âày–Â@ƒ–Â`m– s–€p– s–ÂÀv–Â`m– s–€p– s–ÂÀv– s– g–Â`m– s–Â}– €–€p– s–€p– s–Âày– s–ÂÀv–Â}–Â@ƒ–Â}–Âày–€p–€p–€p–Âà`– N– Z– Z–Â@j–Âd–Âà`–Â@j–€p–Â`m–Â@j– g–Â`m–Â`m– g–Â`m–€p–€p–€p–€p– g– g– g–Âà`–Âà`–Â@j–Â}–Âày–Âày–Âày–Â`m–€p–Â@j–€p–Â`m–Â@j– g–Âà`–Âd–Âd–Âà`–Âd– g–Â@j–Â@j–ÂÀ]–Âà`–Âà`– g–Â`m–€p–Â`m–Âd–Âà`– Z– g– g–Âà`– Z–Â`T–Â`T–€W– N– Z–Âà`– Z– Z–Â`T– Z–ÂÀ]–€W– N– A–ÂàG– A–ÂÀD–ÂÀD–ÂàG– Z–€W–Â`T–€W– Z–Âà`–Âà`– N–Â`T–€W– N– A– A– 5– 5– (–Âà.–Â`;– A–Â`;–€>–€>–Â`;–€>– A– A– A–ÂÀD–ÂàG–ÂàG– A–Â@Q–ÂK–Â`T–Â`T–ÂK–ÂK– A–ÂK– N–ÂàG–ÂàG– A–Â`;–Â`;–€>–ÂàG–ÂK–Â`T–Â@Q– N–ÂÀD–ÂàG– N– N–ÂK– N– N–ÂàG–€>– A–Â@8–Â@8–Â2–€>–€>–ÂK–Â@8–Âà.– 5– 5– A–€>– A–€>–Â@8–Â`;– 5– 5–€>–€>–ÂÀD–ÂàG–ÂÀD–Â`;–€>–Â@8–Âà.–Â2–Â@8–Â`;– 5–ÂK– A–€>– 5– A–Â@Q–€W–€W–ÂK–€>–ÂÀD–€>–Â`;– 5– 5–Â@8–ÂÀD– A– A– A–Â`;– A–€>–Â@8–Â`;–Â@8–Âà.–ÂÀ+–Âà.–€>–Â`;–Â@8–Â`;– 5– (–Âà.–ÂÀ+–Âà.–Â2–Â`;– 5– 5–Â`;–Â@8– 5– 5– A–€>–€>–Âà.– 5–Â@8– 5–€>– A–ÂàG–ÂàG–€>–ÂàG– A– N– N–Â`T–ÂK– N–ÂàG–€>–Â@8–€>–Â`;– 5– (–Âà.–Â2–Â2–Â`"–Â@– (–ÂÀ+–Â2–ÂÀ+–Âà.– 5–Â`;– 5–Â@8– A– A–€>–Â`;– A–ÂàG–ÂàG–Â`;–€>–€>–€>– A–€>–ÂàG– A–ÂàG– A– 5–€>–ÂàG–ÂàG– A–ÂÀD–ÂÀD–ÂÀD– A–Â`;– A–Â`;– 5– 5– A–€>–Â@8–Â@8–Â`;–ÂÀD–Â`;–€%– (–Â2–ÂÀ+–Â2–Â`;–Â@8– (–Âà.–Â2–€>–Â`;–Â2–Âà.–Âà.– 5– 5–Â2–Â2–€>–€>–Â`;–ÂÀD–ÂÀD– A–Â@8–Â`;– A– A–€>– A–ÂàG– N–ÂK–ÂàG–ÂàG–ÂàG– Z– Z–€W–ÂàG–ÂK–ÂK– N–ÂàG–ÂK– A–ÂÀD– A– N–ÂK–ÂÀD–ÂàG–Â`T–Â`T–Â`T–Â@Q– Z–€W–Â`T–ÂÀ]– Z–Â@Q–ÂàG–Â`;–Â@8–Â`;–ÂÀD– A–ÂàG–Â`T–Â`T–Â@Q–€W–Â`T–Â@Q–ÂàG–ÂàG– N–Â`T– Z– Z–Âd–Â`m–Â@j–Âà`– g– g–Âà`– Z–ÂÀ]–Â@Q–€W– Z–Â`T– Z–Â`T–Â`T–€W–Â`T–ÂÀ]– g–Â`T–ÂàG–ÂK–ÂàG–Â@Q–Â@Q–€W–Âà`–Â@j–€p–€p–Âà`– Z–€W–Âà`–€W–Âà`–Âd– N–Â@Q–€W–Âà`– g–€p–€p– g– g–Â@j–€p– s– Z–€W–Â`T–Âd–Â`m– g–ÂÀ]–Âd–ÂÀ]–Âà`–ÂÀ]–Âà`– Z–Â@Q– N–€>– A–ÂK–ÂK–Â@Q–Â`T–Â@Q–ÂàG– A– A– A– Z– Z–Âà`–Âà`–Â`T–Â`T–€W–Â@Q–ÂK– A– A– A–Â@Q–Â@Q–ÂÀD– A– N–€W–€W–Â`T–ÂàG– A–ÂK–ÂÀD–Â@Q– N–Â`T–Â`T–€W– g– Z–€W–Â`T–Âà`–Âà`– Z– Z–Â`T–ÂK–ÂÀD– N–ÂàG–ÂàG–ÂàG– N–ÂK–ÂK–ÂàG–ÂK–ÂàG– N– N– N–ÂK–ÂÀD– A–ÂàG–ÂK–ÂàG– A– A–ÂàG– N–Â@Q–Â`T–ÂàG–ÂK–Â`T–ÂàG–ÂàG–ÂÀD–ÂàG– N– A– A–ÂK– A– N–€W–Â`T–Â`T–ÂàG–Â@Q–ÂÀ]–Â`T–€W–€W–Â@Q– Z–Âà`–ÂÀ]–ÂàG–ÂK– N–Â`T–€W–€W– N– A–€>– A–€>– N–ÂàG–€W–Â@Q–ÂàG–Â@8– 5– 5– 5– 5–Â@8–Â`;–Â2–Â`;– – (–ÂÀ+–Â2–€%–Â`"––Â`"– (–€>–ÂàG–€>–Â`;–Âà.– (–Â2–Âà.–Âà.–€%– 5– 5–Â2–ÂÀ+–€%– (– (– (– 5–€>– 5–ÂÀD– A–Â@8–Â`;– 5– 5–Â`;–Âà.–ÂÀ+–ÂÀ+–Âà.– 5–Âà.–Â@8–Â2–Â2–Â`;– A–ÂàG–ÂàG–€>–Â@8–Â@8– 5– 5–€>– A–Â`;–Â2–Â2–Â`"–€%–Â@– (–Â`"– (–Âà.–€%– (–Â@– (– (–Âà.–Â`;–Â@8– 5–Â2–Âà.– A– A–ÂÀD–Â`;–Â`;– A–€>–€>–Â`;– 5–ÂÀ+–Â`;–Â`;–Â`;–Âà.– 5–Â@8–Â2–Âà.– (–Âà.–Â`;–Â@8–Â2–Âà.–Â`;– A– A–€>–€>–Â`;– 5–Â@8– 5– A–ÂàG–€>–Â@8– 5– 5–Â@8–ÂÀD–ÂK–ÂÀD–ÂÀD–€>–ÂÀD–€>–ÂÀ+–Â2–Â2– 5– (–Â`"–Âà.–Â`;– 5– 5– A–Â`;–ÂÀD–ÂÀD– N–ÂàG–ÂÀD–ÂàG–ÂK–ÂÀD– A–ÂàG– N–ÂàG– A–ÂàG–ÂàG–ÂÀD–Â@Q– Z– N– A–€>–€>–Â`;–ÂÀD–ÂàG–ÂàG– N– N–ÂàG– A–ÂàG– N–ÂK– A–€>– A–€>– A–€>–€>– A– A– A–Â@8– A–ÂàG–Â@Q– N– N–Â`T– N– N–ÂÀ]–€W– Z– Z–Â@Q–Â@Q–ÂàG–€W–€W–ÂÀ]– Z– Z–ÂÀ]–ÂÀ]–ÂÀ]– Z– N– Z–Â`T–ÂàG–ÂK–ÂK–ÂàG–ÂàG– N–€W–ÂK–ÂK–Â@Q–Â`T–Â`T–ÂÀ]–ÂÀ]–ÂÀ]– g–Âd–Âà`–Â@j–Âd– g– Z–ÂÀ]–€W–Â`T–Â`T–Â`T–€W–ÂÀ]– g–Âd–Âà`–Âà`– Z–Âà`–ÂÀ]–€W–€W– Z– Z–Âà`– Z–ÂÀ]–Â@Q–Âà`–ÂÀ]–Â`T– A–€>–ÂàG– A–Â`;– N–€W–Â@Q–Â`T–Â`T– N– N– Z–ÂK–ÂK–€W–ÂÀD–ÂK–ÂàG–Â`T–€W–Â@Q–ÂàG–ÂàG–ÂàG–ÂÀD–Â@8–€>–ÂÀD–ÂK–ÂàG–ÂàG– A–ÂK–ÂàG–ÂàG–ÂÀD–Â@Q– N–ÂàG–€>– A– A– A–Â`;– A–ÂÀD–ÂÀD– A– A–ÂÀD–ÂàG–ÂàG–Â@Q–Â`T–ÂK– N–ÂK–ÂK–€W–ÂàG–Â@Q– N– N–Â`T– N– Z–€W–ÂàG–ÂàG– A–Â`;–ÂàG–Â@Q– N–€W–€W–€W– Z–€W– N–ÂK– A– N–ÂK–€>–€>–€>–ÂàG–ÂàG–ÂàG–ÂK– A–ÂK– A–ÂK– A–ÂÀD–Â`;– A–ÂàG– N–Â@Q–ÂàG–ÂàG–ÂàG– N–Â@Q–Â@Q– N– N–ÂàG–€>–Âà.–Â`;– 5– A–€>– 5–Â`;–Â@8– A–€>–ÂÀD– A–€>–Â@8–Â2–Â`;–Âà.–Â@8– 5–Âà.–Â2–Â2–Âà.–Âà.– (– – – –ÂÀ+–Â`"–€%–ÂÀ+–Âà.– (–€%–€%– (–Â`"–Â`"–Â`"– – –ÂÀ–– –€ –Âà–€ –Â` – –Âàü•Â` – –Â`"–€%– (–€%– –Âà– – – –ÂÀ– – –Â@–Â` –Â@–Â` ––ÂÀù• – – –€ –Â@––Âàü•Âàü•Â@–Â@–Âà–€ –Âàü•–Âàü•Âàü•– –ÂÀù• –Âàü• ö•Â`ð•Â`ð• ö• ö•Â`ð• ö•Â`ð• ê•Â`ð•Âç• ݕ ݕÂÀà•Â@ԕ ѕ ݕÂÀà•Â`וÂΕ ѕ ѕÂ`ו ѕÂàÊ•ÂÀÇ•ÂàÊ•ÂàÊ•Â`וÂÀà•€ڕ ݕ€ڕ ݕÂàã•ÂÀà• ݕÂ@Ô•Â`וÂ`וÂàÊ•ÂΕ ĕÂàʕ ѕ ѕÂ`ו€ڕ€ڕ ѕ ѕÂ`וÂàʕ ĕ ¸•ÂàÊ•ÂÀÇ•ÂàÊ•ÂàÊ•ÂΕÂ`ו€ڕ ݕ ݕÂ@í•Âàã• ö• ê• ê•Â@í• ê•Âç• ê• ö•Âàü•€ó• ê•Âàã•Â@í•Â`ð• ê•Â@í•Â`ð• ݕ ݕÂ`וÂΕÂ@Ô•Â`ו ѕÂ@Ô•ÂΕ ѕÂ`וÂ`וÂÀà• ݕ ݕ ݕ ݕ ݕÂç•Âàã• ݕÂ`וÂ`ו€ڕ€ڕ€ڕ ݕ€ڕ ݕ€ڕÂÀà• ê•Âç•Âç• ݕ€ڕÂ`וÂ`ו ݕÂàã• ݕÂàã•Âç• ê• ݕ ݕÂ@Ô•ÂΕÂàÊ•ÂΕÂΕ ĕ ĕÂ`¾• ĕ ĕ ĕÂÀǕ ĕÂΕÂÀǕ ĕ ĕ ѕ ѕÂàʕ€Á•ÂÀÇ•ÂÀÇ•ÂàÊ•ÂàÊ•ÂΕÂ@ԕ ѕ ĕÂàÊ•Â`¾• ¸•Â`¾• ĕÂ`¾•€Á• ѕÂ@Ô•Â Ñ•ÂΕ ѕÂÀÇ•Â@ԕ€ڕÂ`וÂ`וÂàã•ÂÀà•Âàã•Â`ו€ڕ ѕÂ`ו ѕ ѕ ѕ€Á•ÂàÊ•ÂàÊ•ÂÀÇ•ÂàÊ•ÂàÊ•ÂΕÂ@ԕ€ڕ ѕ ѕÂàʕ€Á•Â`¾• ¸•Â`¾•€Á•Â`¾•Â`¾•Â`¾•Â`¾• ¸•Â@»•Â`¾•ÂΕÂΕÂÀÇ•ÂÀÇ•ÂàÊ•Âàʕ ĕ ¸•ÂౕÂౕ ¸•Âౕ ¸•€Á•€Á• ¸• ¸•€Á•Â`¾•€Á• ¸•€Á•Â`¾•€Á• ĕÂ@»•€Á•ÂàÊ•ÂÀǕ ĕÂàʕ ĕÂΕÂΕ€Á•Â`¾•ÂÀǕ€Á• ¸•Â@»• ¸• «•µ• ¸• ¸•Âౕ ¸• «•µ•ÂౕÂ@¢•µ• ¸•Â`¾• ¸•ÂౕÂౕµ•ÂÀ®•€¨•Âౕœ•Âà˜•Â Ÿ•Â`¥•Â@¢•Âà˜•Â`¥• ¸•ÂౕÂÀ®• «• «•€¨• Ÿ•€¨• Ÿ•Â`¥•Â`¥•ÂÀ®•ÂౕÂ`¥•Â@¢• Ÿ•Â`¥•Â@¢•ÂÀ®•µ•Â`¥•Â@¢•Â`¥•Â`¥• «•Âà˜•Âœ•Âà˜•Â Ÿ•€¨•€¨•Âà˜•Â`¥• «•µ•ÂÀ®•Âౕ «•ÂÀ®• «• «•ÂÀ®•€¨•ÂÀ®•ÂౕÂౕ ¸•Â@»• ĕÂ`¾•Â@»•Âౕ «•Âౕ Ÿ•€¨• Ÿ•Â`¥•µ•ÂౕÂౕÂౕÂౕ€¨•ÂÀ®•Â`¥•Âౕµ•€¨•Âౕ€¨•µ•Â`¾•Â`¾•Â`¾•€Á•€Á• ĕ€Á•Â`¾•Â@»•Â@»•Â`¾• ¸•Â`¾•Â@»•Â`¾• ĕÂΕÂ@»•Â@»•Â`¾•Â`¾•µ• «• «•Â`¥• «•Â`¥•€¨•ÂÀ®• «• «•ÂÀ®•Â`¥• «•Â`¥•€¨•Âà˜•Âà˜•Âà˜•Â Ÿ•Â`Œ•Â@‰•ƒ•Â`Œ•Â`Œ• †• y•Âà• †• †• †•Âà•Âà•ÂÀ|•Â@p•Â`s•Â`s•Âà•Â`s•Â@p•€v•Âà•Âà•Â`s•Â@p•€v• y• y•Â`s•Â`s• y•Âà•ÂÀ|•Âà• †• †•ÂÀ|•ƒ•Â`Œ•Â`Œ• ’• ’• ’•ÂÀ••Âà˜•Â †• ’•Â`Œ• ’•œ•œ•œ•Â@¢•œ•ÂÀ•• ’•Â`Œ• †•€• ’•ÂÀ••Âà˜•Âà˜•Â@‰•Â@‰•ƒ•€• †• †•Âà•€v• y•ÂÀ|•Âà•ƒ• y•Â@p•Â`s•Âà•Â@‰•Â@‰•ƒ• y• y• y• y• y• m•Â@p• `• `•Âj•Âàf•Â`s• m• m•Â`s• y•Â`s•Âàf•€]•€]•€]•Âàf• m•Âj•Âàf•Âàf• m•Âàf•€]•Â`Z•ÂÀc•Â@W•€]•€]•Â`Z•Â`Z• `•€]• `•ÂQ• T•ÂÀc•Âàf• m•€]•Â@W•Â`Z•Â`Z•ÂÀc•€]•Â`Z•Â`Z•€]•ÂÀc• `• `• `•Âàf• `•Âàf•Â`Z•ÂÀc• `•Âj•Âàf•Âj•Â`s•Âj•Â`Z•Â@W•Â@W•Â@W• T• T• T•Â`Z• T•€]• `•€]• `•€]•Â`Z• T•Â`Z• T•€]•ÂÀc•€]•Â`Z• T• T•Â@W•€]•€]•Â`Z•Â`Z•Â`Z•Â`Z•Â`Z•Â`Z• `• `• T•ÂÀJ•ÂÀJ•ÂàM• T•ÂQ• T• T•Âàf•Âàf•Âàf•Âàf•Â@p• `•€]• `•Âàf•€]•ÂàM•Â@W• T• G• G•ÂÀJ•ÂQ•Â`A•Â`A•ÂàM•Â@W•€]•ÂÀc•Âj• `•ÂÀc• `•Â`Z•ÂàM• G•Â`A•Â8• ;•Â`A•Â8•Âà4• .• ;•Âà4•Â8• .•Âà4• ;•Â`A•Â8•Âà4•Âà4•Â8•ÂÀ1•Âà4• .• ;•ÂÀ1• ;•Âà4• ;• G•Â@>•Â@>• ;•ÂÀ1•ÂÀ1• ;•Â@>•Â8•Â@>•Â@>• ;• G•Â`A•Â`A•Â@>• ;•€D•Â@>•Âà4•Â8• ;• ;•€+••€••Â`(•Â`(•ÂÀ1•ÂÀ1• ;• ;• ;• ;•Â@>• ;•€+• .•ÂÀ1•Â`(• .• ;•ÂÀ1•Â8• .•Â@%•Â`(• "•€+• "• •€•Â`• •Â@ •€•Âà•€• •Â@ ••Â`•€• • •€•Â@ •Â@ • ü”Âà•Âà•Â@ • •Â`•Â@ •Â@ ••Â@ • •ÂÀÿ”€ù”Â`ö” ð”Â@ó”€ù”€•Â@ •Âà•€ù”Âà•Â`ö”Â@ó” ð” ð”Âà锠㔀à”Âà销ù”Âí”Âí” ð” ð” ð” ð” ð”ÂÀæ”ÂÀæ”Âàé”€à”€à”Â`Ý”Â@ڔ ã”Â`Ý”Â@Ú”Â`ݔ ה ה הÂ`Ý”ÂÀ攀à”Â`Ý”Â`ݔ הÂÀæ”Âàé” ð” ð”€ù”€ù”•ÂÀÿ”ÂÀÿ”Âà•Â`ö”Âà•Â@ó” ð”Â@ó”Â@ó”Âàé”Âàé”ÂÀæ” ã”Âàé” ð”Â`ö”Â@ó” ã” ð”Âàé”Âàé”Â@Ú”Âàé”Âí”Â`ö”ÂÀÿ”€ù” ü”Âà•Âà• ü”€ù”Âà• ð”Âàé”Â@ó”Â`ö” ü”Âà••Âà•ÂÀÿ”Âà•€ù”• • ü”Â`ö”Â`ö”Â`ö”€ù”Â`ö”Â`ö”€ù”Âà•Âà••Âà• •€• •€• • •ÂÀ•€•Âà•€ù”Âà• • •€•Â`•Â`•€• • •ÂÀ• •ÂÀÿ”ÂÀÿ”• • •€•Â@ •Â`• •Â@ •Â`•Â@ • •Â@ •Âà• ü”•• •ÂÀÿ” •Â`•• ••€•Â`•Â`•ÂÀ•• •€•€• • • • • •€•€•Â@ •Â`•ÂÀ•Âà•€+• "• "•Â`(•€+•Â`(•Â@%•Âà• •ÂÀ•€• •Âà• "•€+•Â`(•Â`(•ÂÀ1•ÂÀ1• "•Â@%• "••Âà•• "•Âà•Â`•Â`• •Âà• "•Â`(• •€•Âà•ÂÀ•• •• "•Â@%•Â`(••€+•€+•Âà4• .•Â`(• "•• •Âà•Âà•Âà• "•Âà••Âà••Âà• "• •Âà• "•Â`(• "• "•Â`(•• "•€•€•€•Â@ •Â`•€• •Â`•€•Â`• •€•Âà•Âà• •€•€• • "•ÂÀ• • ü”€ù”Â`ö” ü”Â@ •Â`•ÂÀÿ” ü”•Â@ ••ÂÀÿ”Â`•€•Â`•ÂÀÿ” ü”Â`ö” ð”€ù”Â`• ü”Âà•Â@ • •Â`•€• •Âà• "• • •Â`•Â`•€• •€•ÂÀ• •Â@ •Âà•Â@ •ÂÀ•ÂÀ•€+••Âà•Âà•Âà• "•• • •€• • ü”ÂÀÿ”ÂÀÿ”Â@ •€•• "•Âà•Âà• •ÂÀ• "• • •€• •Â@ •€•€• • •€• • • •Â`•Â@ •€•€• •€• • •Â`•€• •€•Â@ • • •••Â@%•Âà• •• • • •ÂÀ• • •• "•Âà••€+•Â`(• "•Â`(•€+•Â@%•ÂÀ1•€+• "•Â@%•Âà•ÂÀ•Â@%•Â`(•Â@%•Â`(• .• .•Âà4•Â`(• "•Âà•ÂÀ• •ÂÀ•Âà••Â`•Âà• • •€•Â`•ÂÀ•Âà•€• •Âà•Âà•• •Â@%•€+•Â`(•€+•€+•Â`(•Â@%•Â`(•Â@%•• "•€+•Âà•Âà•€•Âà••Âà• "•Â@%• .•ÂÀ1•€+•Â`(•Â@%• .•Â@%• "•Â@%•Âà•Â`(•€+•€+•Âà4•Â8• .•Â@%•Âà•Âà• •Âà• "• "• •• • • "• .•Â8•€+• .• .•ÂÀ1•Â8•Â@>• ;• .•€+•ÂÀ1• .• .•Âà4• .• .•€+•ÂÀ1• ;• .• .•Â`(•€+•Âà4•ÂÀ1•Âà4•Â8•€+•ÂÀ1• .•Â@%•ÂÀ1• .•Â`A•Â`A•Âà4• ;• G•Â@>• G• G•Âà4•Â8•ÂÀ1• ;•Â`A• ;•Â8•Â8•Â8•Â8•Â8•Â8•Â8•Âà4• ;•ÂàM•€D•ÂàM• G•Â`A• ;• .•ÂÀ1•€+•Â`(• ;•Âà4•€D•ÂàM•ÂÀJ•ÂàM•€D•ÂàM•ÂÀJ• G•ÂÀJ• G• T•€]• m•Âj•Âj•Âj•Âàf•Âàf•Âàf• m• `•Âàf•ÂÀc•ÂàM• T• T•€]•ÂÀc•Â`Z•€]•Â`Z•€]• `•ÂQ•ÂQ• G•Â@W•€]•Âàf•Âj•Âj• `•ÂÀc•€]•ÂÀc•Â@W•Â`Z•Â`Z•Â@W• T•€]•Âàf• `•Âàf•Âj•Âàf• `• `•Â`Z•Â`Z•Â`Z•€]• `•ÂÀc•€]•Â@W• T•Â`Z•Â`Z• `•Âj•€v• y• m•Â`s• m•Âàf• m•Â`s• y•Â@p•Â@p•Âàf• `•€]•Â@W•Âàf•Âj•Âàf•Âàf•Âàf• `• `•Â@p•Â`s•Â@p•Âj•Â`Z•ÂÀc• m•Âàf•ÂÀc•Âj• `•Âàf•Âj•Â@p• m•Â`s• m•Â@p•Â`s• m•Âàf• `•ÂÀc•Â`Z• T•ÂàM•Â`Z• `•ÂÀc•ÂÀc•Â`Z•Â`Z•€]•€]•€]• T•Â@W•Âàf•ÂÀc•€]• `•ÂÀc• m•Â`s• m•Âj• m•Âàf• `• m•Â@p• `•Â`Z•Â`Z•ÂàM•ÂQ•€]•Âàf• m•€]•Âàf•ÂÀc• T•ÂàM•ÂQ•ÂàM•Â`Z• `• `•Â`Z•ÂàM•Â`Z•Â`Z•ÂÀc•ÂÀc•Âàf•ÂÀc• `•Â`Z•ÂÀc•Â`Z• `• `• `•Âàf• m• m•Âàf• `•Â`Z•€]• `•ÂÀc•Â@W•€]•Â`Z• `•€]• `•Â`Z• m•ÂÀc•Âàf•Âàf• `•€]•€]• `•ÂÀc•€]•€]•Âàf• `• T•ÂQ•€D•Â`A•Â@>•€D•ÂQ•€]•Â@W•Â`Z•€]• `•ÂàM•Â@W•Â`Z•Â`Z•Â`Z• T• T•ÂÀJ•ÂÀJ•ÂàM•ÂÀJ•ÂQ•ÂQ• T•ÂQ•€]•Â@W•Â@W•€]•ÂàM•ÂQ•ÂàM•ÂÀJ• G•Â@W•Â@W•ÂàM• T• `•Â`Z•Â`Z•Â`Z•Âj•ÂÀc•Â`Z•€]•Âj•Â@p• m•Â`s• `• `•Âj• m•Âàf•Â`Z•Âàf•€]• `•€]• T•Â`Z• T•ÂàM•ÂàM•ÂÀJ•ÂÀJ• G•ÂàM•ÂÀJ• T•ÂQ•Â@W•Â`Z•Â@W•Â@W•ÂQ•€]•Â`Z•ÂàM• T•ÂàM• G•ÂÀJ• T•ÂàM•ÂQ•Â`Z• T•Â@W• T•€]•ÂÀc• `•Âàf• m•Â`s•€v• y•Â@p•ÂÀc•€]•Â@W•ÂÀc• `• `• `• T•ÂàM• T• `•Â@W•ÂàM•ÂàM• T•Â@W•Â@W• T• T•Â`Z• T• T• T• T• T• T•ÂQ• T• T• m• m•€]• T•ÂQ•ÂÀJ•ÂÀJ•ÂÀJ•ÂàM•ÂàM•ÂQ•ÂàM•€D• G•Â@W•Â`Z•Â@W• T•ÂQ•ÂÀJ•Â`Z• `•ÂÀc•Â`Z•Â@W• T• `•Âj•Âàf•Âàf•€]• G• G•ÂàM•ÂàM• T•€]• m•Â@p•Âàf•Âàf•ÂÀc•Â`Z•Â@W•Â`Z• T•€]•Â`Z•Â@W•€]•€]•Â@W•Â`Z•€]•ÂÀc• `• `•Â@W•Â`Z•Â`Z•ÂQ•€]• `•€]•Âàf•Âàf• T• T•Â@W•€]•Â@W•ÂQ•ÂàM• T•Â`Z•ÂàM•ÂQ• T• T•ÂQ•Â@W•ÂQ•€]• `• m• m•Â@p•Â@p•€v•Â`s•Â@p•Â@p• m• m•Â@p•Â@p•ÂÀ|•Â`s•Â`s•Â`s•Â`s•Âàf•Â`s•€v•ÂÀ|•ÂÀ|• y•€v•Âj•ÂÀc•€]•Âàf• m•€v•Â`s•Âà• y• †•Âà•Â`s•€v• y•Â`s• y• †• †• †•Â`Œ•Â`Œ• †•Â@‰•Â`Œ•Â`Œ• ’•Â`Œ•Â@‰• †•Âà•ƒ•Â`Œ•€• †•Âà•Âà• y•ÂÀ|• y•Âà•€v•€v•ƒ•Â`Œ•Â`Œ•Â`Œ•Â@‰•€• ’•ÂÀ••ÂÀ•• Ÿ• Ÿ•Â@¢•œ•€•ƒ• y•Â`s•Â`s•€v•Âà• y•Âà•€•Âà˜•ÂÀ•• ’• ’•€• ’•€• ’• ’•€•€• †•€• ’•Âà˜•Â`Œ•€• ’•€• †•Â`Œ•Âà˜•Â€• ’• ’•€• ’•Â@‰•Âà•ƒ• †•Â`Œ•€• ’•ÂÀ••€•Â`Œ•ƒ•€v•ƒ•Âà•€v•Â`s• y•Âà• †•Âà•Âà•ƒ• †• †•ÂÀ|•Âà•ƒ•ÂÀ|• y•Â`s•€v•ÂÀ|•ÂÀ|• †• †• †•ƒ•Âà•ÂÀ|•Âà•Â@‰• ’•ÂÀ••Â@‰• †•Â`Œ•€• ’•Â@‰•Â@‰•œ•€¨•ÂÀ•• ’•ƒ•ƒ•€•œ•œ•ÂÀ••Â@‰•ÂÀ•• ’•Âà˜•Â ’•Âà˜•Â`Œ•Â@¢•ÂÀ••ÂÀ•• ’• ’• ’•Â`Œ• ’•Âà˜•Â€•Â`Œ• †•ƒ•Â`Œ•Â@‰• †• †• †•€•Âà•ÂÀ|•ƒ•ÂÀ••€• ’•Â@‰• †• †•Âà•ÂÀ|•€v•Â`s•ÂÀ|•€v•Â`Œ• ’•Â`Œ• †•€•Âà˜•Âà˜•Âà˜•Âœ•ÂÀ••€•Â`Œ•ƒ•Â@‰• †• †•Â`Œ• ’• ’•ÂÀ•• ’•Âà˜•Â`¥•Âà˜•Â€¨• «• Ÿ•œ•œ•œ•€•ÂÀ••ÂÀ••ÂÀ•• †•Â`s•ÂÀ|•Â@‰• †• †•Â@‰•€•ÂÀ•• ’• †•Â@‰•€•Â`Œ•Â`Œ• ’•Âà˜•Â ’• †• †•Âà• †•Â`Œ•Âà•Â@‰•Â`Œ•Â@‰• †•€• †• †• y•Âà• †• †• †•Âà•Âà• †•Â@‰•€• ’•€•Â`Œ•Â`Œ• †• y• y• y•ƒ•ƒ•Âà•Â@‰•Â`Œ• †• †• †•ÂÀ|•ÂÀ|• ’•ÂÀ•• ’•œ•Âà˜•Âœ•€• †•ƒ•Âà•Âà• †•ÂÀ••œ•Â`¥• ’•€• †•Âà•€• ’•Â`¥• Ÿ•Âà˜•Â Ÿ•Â@¢• ’• ’• Ÿ•Â@¢•Â@¢• Ÿ• ’• ’•œ• ¨(dt ?@4 4ÿxunitsyunits;hà2 (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿª" (ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec1 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunits <À>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH@HEAPX à>datadescription8  @œAq·—NM€SNOD8?² «•Â`¥• «•Â@¢•Âౕ «•ÂÀ®• Ÿ• Ÿ•€¨•Â`¥•ÂÀ••Â`Œ•Âà˜•ÂÀ••Âà˜•Â Ÿ• Ÿ•œ•Â`¥• Ÿ• «• «• «•Â`¥•Â@¢• Ÿ•œ•Âà˜•Âà˜•Âà˜•ÂÀ••œ•œ•Â`¥•€¨• «•Â`¥•Â@¢•€¨•Â`¥•€¨• «• ¸•µ•Âౕµ•ÂÀ®•ÂౕÂÀ®•€¨•€¨•ÂÀ®• ¸• ĕÂ@»•Â@»• ¸• ¸• ¸•€¨•ÂÀ®• «•€¨• «•ÂౕÂ@»•Â@»•Â@»•ÂàÊ•ÂàÊ•Âàʕ ѕÂàʕ ĕ ĕÂ`¾• «• ¸•µ•Â@»•€Á•Â@»• ¸• ¸•Â`¾•€Á•ÂàÊ•ÂàÊ•Â`וÂàʕ ĕ ĕ ĕ€Á•Â`¾•ÂౕÂ`¾•€Á•ÂàÊ•ÂΕÂ@Ô•ÂÀà•€ڕ€ڕÂàã• ê• ݕ ݕÂ`וÂ`ו ݕ€ڕÂ`ו ĕÂΕÂ`ו€ڕ ѕÂΕ ѕÂΕÂàʕ€Á• ĕÂÀǕ€ڕ€ڕÂΕÂàʕ ¸•Â`¾• ĕ ĕÂ@»•€Á•ÂÀǕ€Á•Â@»•Â`¾•€Á•µ•µ•Â@»•Â`¾•µ•Â`¾• ĕÂ`¾•€Á• ¸•€¨• «•ÂÀ®•Â`¾• ¸•Â`¾•€Á•µ•µ•µ• ¸•Â`¾•ÂàÊ•ÂÀÇ•ÂàÊ•ÂΕ ѕ ѕÂàʕ ѕÂ@Ô•Â@ԕ ĕ ĕÂ`¾•Â`¾• ĕ ¸• ¸•€Á•ÂàÊ•ÂàÊ•Âàʕ ĕÂÀǕ ĕÂ@»•Â@»• ¸•Â`¾•ÂÀÇ•Â`¾• ¸• ¸•Â@»•ÂàÊ•ÂÀÇ•Âàʕ ĕ ¸•€Á•ÂÀÇ•Â`¾•µ•µ•ÂÀ®•µ• «•ÂÀ®•ÂౕÂ@»• ĕÂౕ «•Â`¾•€Á• ĕÂౕÂౕ ĕ€Á•Âàʕ ѕÂ@Ô•ÂàÊ•Â`¾• ¸• ¸•µ•Â@»• ĕÂÀÇ•ÂÀÇ•ÂÀǕ ĕÂÀÇ•Â`וÂ`ו ĕµ•Â@»•€Á•µ• ¸•ÂౕÂ`¾•Â`¾• ĕ ĕ ¸• ¸•Â@»• ¸•ÂÀ®•µ•€Á•ÂÀǕ ѕ ĕÂ`¾•Â@»• ĕ ĕÂ`¾•€Á•Â`¾•ÂÀǕ ĕ ĕÂàÊ•Âàʕ ĕ ѕÂ`ו€ڕÂ@Ô•ÂΕÂ`ו€ڕÂ`ו ݕ ݕÂÀà•€ڕ€ڕÂ@Ô•Â@ԕ ݕ ݕÂ@Ô•Â`וÂ@Ô•ÂÀǕ ѕÂàʕ ݕÂ`ו ݕÂ`ו ݕ ݕ€ڕ€ڕ€ڕÂ@Ô•Â@ԕ€ڕÂ`ו ݕÂàã•€ڕ ݕ ê•Âç•Âç•€ڕÂç•Âàã•Â`וÂÀà• ê• ê• ê• ê•ÂÀà•Âàã• ê•Âç• ê•Âç• ê•€ó•Â@í• ݕÂ`וÂ`ו€ڕ€ڕ ݕ ѕÂ@Ô•Â`וÂΕÂàʕ€ڕÂç• ݕ ݕ ݕ ݕÂ@í•Â`ð•Â@í•Âàã•Â`ו ѕ ѕ ĕÂ`¾•Â`¾• ĕ€Á•ÂàÊ•Â@ԕ€ڕ ݕÂÀà• ݕ ݕ€ڕÂ`וÂàʕ ĕ ĕÂàʕ ѕÂàÊ•Â@ԕ ݕÂàã•Â@Ô•Â@Ô•ÂàÊ•ÂΕÂΕÂ`ו ݕÂç•Â`ו€ڕ€ڕÂ`ו ݕ ݕ€ڕ ݕÂÀà•Â`וÂ`וÂΕ ѕ ѕ ѕÂ@Ô•ÂΕÂ`וÂΕÂ`וÂç•Âàã• ݕÂàã•Âàã•€ó•Â`ð•Â`ð•Â@í• ݕ€ڕ ݕÂ`ו ѕ ѕÂ`ו€ڕ ݕ€ڕÂÀà• ѕÂ`וÂÀà•ÂÀà• ê•Â`ð•Â`ð• ê• ê•Âç• ݕÂàã•Âàã• ݕÂΕÂΕ ݕÂàã•Âç•Âàã•ÂÀà• ݕ€ڕ ݕÂÀà•Âàã•€ڕ ê•ÂÀà• ݕ ê•Âàã•€ڕ€ڕ€ڕ€ڕ€ڕ€ڕÂΕÂàÊ•Â`וÂΕ€ڕÂ`וÂ@Ô•Â@Ô•Â`ו€ڕÂ`וÂ`וÂ`וÂ`ו ѕÂàÊ•ÂΕÂΕÂ@ԕ ѕ ѕÂàÊ•Â`¾•ÂÀǕ ĕÂ@»•Â@»•µ• ¸• ¸• ¸•Â`¾•€Á•€Á•Âàʕ ĕÂ`¾•Â@»•Âౕ «•Â`¥•€¨• Ÿ• «•Â`¥• Ÿ•ÂÀ••Âà˜•Âà˜•Â ’•€• ’• ’•Âà˜•Â@¢•€¨• Ÿ•Âà˜•Âœ•Â`¥•ÂÀ®•Â@»•µ•ÂÀ®•ÂౕÂÀ®•ÂÀ®•ÂÀ®•µ•µ• «• ’•Âà˜•Âà˜•Â`¥• «•Â@¢•Â@¢•€¨•Â`¥• «•Â`¥• Ÿ•Âà˜•Â ’•Âà˜•Â ’•œ• Ÿ•Âà˜•ÂÀ••Â`Œ•Â`Œ• †•Â`Œ• ’•€•Â`Œ•ÂÀ••Âà˜•ÂÀ•• †•Â@‰•œ• Ÿ• Ÿ•Âà˜•ÂÀ••€•€• ’•€•ƒ•ƒ•Â@‰•Â@‰•Â`Œ• †•ÂÀ•• Ÿ• ’•€•€•€• ’•Â`Œ•€•Â@‰• ’• ’• †•ƒ•Â`Œ• ’• ’• Ÿ•ÂÀ•• ’•Â@‰•Â`Œ•Â@‰•€•Â`Œ• †•Â`Œ• ’• ’•€• ’• Ÿ• Ÿ•Â`¥• «•µ•ÂÀ®•Â`¥• Ÿ•Â`¥• Ÿ• «•€¨•Â@¢• Ÿ•ÂÀ••œ• Ÿ•Âà˜•Âà˜•ÂÀ••Â`Œ•Â`Œ•Â@‰•Âà• †•Â@‰•€•€• ’•Â`Œ•€•Âà˜•Âà˜•Âœ• ’•€•Â@‰• y•ÂÀ|•Â`s•Âà•Âà•Â@‰•ÂÀ•• ’• ’•€•Â`Œ•Â@‰• †•Â`s•Â@p•€v•Âà•Âà•ÂÀ|•Âà• †•Âà•Âà•Âà•ƒ• ’•ÂÀ•• ’• †•ÂÀ|•Â`s•Âà•ÂÀ|•Â@p•Âj•Âj•Âàf• `• `• `•€]•Âàf•Âàf•Â@p• y• y•Â`s•€v• m•Â@W• `•Âj•Â`s•Â@p• y•Âà•Â`s•Â@p• m•Âj• y•Âà• y•Â@p•Âàf•€]•Âàf•€v•Âà•Âà•€v• m•Â@p•Âj•Â`s•Âj• m•ÂÀ|• y•€v•Â`s•€v• m•€v• y• y• y• y• y•ÂÀ|• y•ÂÀ|• †•Â@‰•Â@‰• †• †• †• †•Â@‰•ƒ•€v• y•Âà• †• †•€• †•Â`Œ•€•Âà˜•Â`Œ•Â`Œ•ÂÀ••Âà˜•Â Ÿ•Âà˜•Â Ÿ•ÂÀ••Â`Œ•ƒ•ÂÀ|•ÂÀ|• †• †• ’• ’• ’•Â@‰•Â`Œ• ’•Â`Œ• ’•Âà˜•Âœ• ’•€•Â`Œ•Âà•€v•ÂÀ|• y•€v•Âà•Âà•ƒ•Âà• †• ’•Â@‰•Â@‰• ’•Âà˜•Â`Œ• ’• Ÿ•Â`Œ• †•Âà• y•ƒ• †• y•Âà• y•Âà•Âà• y•Âà•Â@‰• †• †• †•Â@‰•ƒ• †• †•€• †•Â@‰•Âà• y•€v• y• y• y•ÂÀ|• y•Â`s•ÂÀ|•ÂÀ|•ƒ• y•ÂÀ|•Âà•ƒ•€•Â@‰•€• †• y•€v•Â`s•Âàf•Âàf•Â`s• y• m•€]•Âj• m•Â@p• `•€]• m•Âj•Â@p•Âj•Âàf•ÂÀc•Âj•ÂÀc•Âàf•Â@p•Âj•ÂÀc•Âj•Âj•Âàf•Âàf•Â`Z•Â`Z• T•Â@W• T• `• `•Â`Z•Âàf•ÂÀc• `•Â`Z• T•Âj•ÂÀc•Âàf•Â`s• m•Âàf•Âàf• m•Âàf• `• m• m• m• m•Âàf•€]•Â`Z• T•Â@W•ÂàM•ÂQ•Â`Z•Â`Z•Âj• `•ÂÀc• `•Â@W• T•ÂàM•ÂQ•ÂàM•ÂQ• T• T•ÂQ• T•ÂàM•ÂàM•ÂQ•Â`Z• T•Â@W•Â`Z•Â`Z•Â@W• `•Â`Z•Â@W•€]•Â`Z•Â@W• T•Â@W•Â`Z•ÂàM• G•ÂQ•Â`Z•€]• `• `•€]•Â`Z•Âàf• m•Âàf• y•Â`s•ÂÀ|•Âà• †•ÂÀ|• y• m•Âj•Â`Z•ÂàM•Â@>• G• G•€D•€D•€D• G•ÂQ• T•ÂàM•ÂÀJ•Âàf•Â@W•€]•€]•Â`Z• T•Â@W•Â@W• T•Âj•ÂÀc• `• `•Â`Z• `•€]• T•ÂàM•ÂÀJ• G•ÂÀJ• T•ÂQ•ÂàM•Â@W• `•€]• T•Â@W•ÂàM•ÂÀJ•Â`Z• T•ÂÀJ• G• T• T•ÂÀJ• G•ÂàM•ÂQ•ÂàM•ÂÀJ•ÂàM• G• G• G• G•ÂàM• T• T•ÂQ•ÂQ•Â`A•ÂÀ1• .•Â`A•Â`A•Âà4•€+• .• ;• G• G•€D• G•Â8• ;• ;•Âà4• .•Â8•Âà4•Âà4• .• ;•€+• .•Âà4• ;•Âà4•Âà4•Â8•Â8•Âà4•ÂÀ1•Âà4•Âà4• .•ÂÀ1•ÂÀ1• ;• ;• ;•Â8•€+•Âà•Â@%•€+• .• "•• "•ÂÀ1•€+•€+•Âà•Â@%•Âà4•Âà4•Â8• .• .•Âà4•Â@%• "•Â`(•€+•Â@%• "•Â`(•Âà4•Â8•ÂÀ1•Â`(•Âà4• .•Â`(•ÂÀ1•Âà4•Â8•ÂÀ1•Âà4•Âà4• ;• .• .•Âà4•€+•ÂÀ1• .• "•€+•ÂÀ1•€+•€+•Â@%•Â@%•• "•Â`(• .•Â8•Âà4• ;•Â`A•Â8•ÂÀ1• ;•Âà4•€+•Â`(• .•ÂÀ1• ;•ÂÀ1• ;• ;• ;•Âà4•Â8• .•ÂÀ1•Â8• ;•Âà4• ;•€+•Â@%••Âà• "• .•ÂÀ1•ÂÀ1•ÂÀ1•Âà4•Âà4•Â8•Âà4•Â8•Âà4•Â@>•Â`(•Â`(• .• "•Â@%• "•• "• "•Âà• ••Â@%•Â@%•Âà• •Âà•ÂÀ• •Âà•Â`(•Â`(•Â@%•Âà•€•Âà•Âà•Â@%•• • • "•Â`(•Âà• • •Âà•ÂÀ•Âà• "• "•ÂÀ•ÂÀ• • •Â`• •Âà•• • •ÂÀ• •Âà•Âà•€•ÂÀ•Âà• "•Âà•€+•Â`(• "•Â@%• .•Â8•Âà4• .•Â`(• "• • •Âà• •Âà•Âà••Â@%•Â`(•Â`(• .•Âà4•Âà4•Â@%•Â@%• • •Âà• "• "•€+•ÂÀ1•Â@%•€+• "•Â@%•Â`(•Â`(• "•••Â`(• "•Â`(•Â@%•€+•Âà• "••Â`(• "•Âà• • • "•Â@%•Â`(• "• "•ÂÀ•Â`••ÂÀ• • • •Â`••Âà• ü”€ù” ð”ÂÀÿ”Â@ó” ü”Â`ö”Â`ö”Âà•Âà•€ù” ü” ••Â`•€•Âà• •Âà•Âà•ÂÀ•Â`• •€• •Âà• •ÂÀ•Âà•Â`(•€+•€+•Â@%•Âà•Â@%••ÂÀ• "•Âà• • •Âà• •Â@ •Â`•ÂÀ•ÂÀ••• "••Âà•Â`• •ÂÀ• "•€• •ÂÀ• • "• "•• •• "• "• •€•€•Â@ •€• •Âà•Â`• • "•€+• "••€•Â`•• "•€+•Â8•Âà4•€+•Â`(• "•€• •ÂÀ• "•Âà•Â`(•Â`(• "•Â@%• .•ÂÀ1•€+•Âà4•ÂÀ1•ÂÀ1• .• .• .•Â@%•Â`(•ÂÀ1•Â8•Â`(•Â@%• "•Â`(•ÂÀ•ÂÀ•Â`•€•Âà•Âà••Â`(•Âà• "• .•ÂÀ1•Â@%• "•ÂÀ•Â`(•€+•ÂÀ•Âà••Âà•Âà• "•Âà•ÂÀ• "•Âà•€+• "•ÂÀ• •• "•Â`•Â`•€• •Âà•ÂÀ• • •ÂÀ•ÂÀ•Â`(•€+••ÂÀ•€•€• • • •Â`• •ÂÀ•€•€•Â@ •Âà• • • •Â@ ••Âà••ÂÀÿ”Âà••ÂÀÿ”•ÂÀÿ” ü”• •ÂÀÿ”Âà•ÂÀÿ”Â`•€•Â`•Â@ • •€•Âà•Âà•Âà•€•Â`•Â@ •Âà•Â`• • •Âà•Â@ •Â`•Âà•Â@ •Â@ ••• • •€•Â`• •Â`•Âà•€•ÂÀ•ÂÀ• "•Âà•Â`• • •ÂÀÿ”Âà• •• • •Âà•Â`•Â`•Â@ • •Âà•Âà• • •Âà•ÂÀÿ”Â@ó”•Â@ •Â@ • •Â@ •Â`••Âà•ÂÀÿ” ü” •€•Â`•€•ÂÀ•Â`•€•ÂÀ•• •€•Â`••Â@ •Â`•€• •Âà•€• •Âà• "• •Âà•ÂÀÿ”• ü”Â@ •Â@ •Â`••Â`• •Âà•Âà•ÂÀÿ” •Âà•ÂÀ• •Â@ • •ÂÀ• •Âà•Âà•• "•Â`(• "•ÂÀ•ÂÀ•Âà••Â`(• "•• ••Âà•ÂÀ• •Â`•ÂÀ•• "• "•Â`(• "•€+• "•Â@%•Â`(• .•Â`(•ÂÀ1••Âà• "•Â@%•Â`(• "• "• .• .•ÂÀ1•€+•€+• .• .•Â8•€D• ;•Â8•ÂÀ1•Âà4•Âà4•€+•€+• .•Â8•Âà4•Â8•ÂÀ1• .•Â8•ÂÀ1•Âà4• .•Âà4•Âà4•Â8•Âà4•Â`A•Â8•Âà4• ;• .•€+•Âà4•€+• .•ÂÀ1•ÂÀ1•Â8• .•Â`(•Â`(• "•ÂÀ1•ÂÀ1• ;•Âà4•Â`(•Â`(•Âà4•Â@>•Âà4• ;•ÂÀ1•ÂÀ1•Âà4• .•Â8• .•€+•Â`(•€+• .•Â8•Â8• .• .•ÂÀ1•€+• "• "•Âà•ÂÀ•Â`• • •Â`• •Â`•ÂÀ••ÂÀ•Â`•Â@ •Âà•Âà•ÂÀÿ” ü” •Â@ •Âà• • ü”€ù”Â`ö” ð”ÂÀæ”Âí”ÂÀæ”Âí”Âí” ü”Âà•Âà•Âà•ÂÀÿ”ÂÀÿ”€ù” ü”Â@ó”Â`ö”€ù”Â@ó”Â`ö”Âà••€ù”ÂÀ攀à”ÂÀæ” ה ה הÂ`Ý”Â@ڔ הÂàДÂÀ͔ ʔÂàДÂ`Ý”Â`ݔ הÂÔ”ÂàДÂàДÂÔ”ÂàДÂԔ הÂàДÂÀÍ”ÂÀÍ”ÂÀÍ”ÂàД ʔÂÔ”ÂÔ”ÂԔ הÂàДÂ`ݔ ã”ÂԔ ʔÂàД ʔÂ`Ĕ ¾”Â`Ä”ÂÀÍ”Â`Ĕ ¾” ¾”€ǔÂÀÍ”Â`Ĕ ʔÂԔ ʔ ¾”ÂÀ´”Âà·”Â`«” ¥”ÂÀ´”ÂÀ´”ÂÀ´”Â@Á” ¾”Â@Á”ÂÀ´” ±”Âු€®”€®” ¥” ¥”Â@¨”ÂÀ´”Â`«”€®”ÂÀ´” ±”Âු»”€ǔÂ`Ä”Â`Ä”Â`Ĕ€ǔÂ`Ä”Â`Ä”Â`Ä”Âà·”Âà·”Â@Á”»”€ǔ ¾”Â`Ĕ ¾”ÂÀ´”Âà·”Âà·”Â@¨”Â`«” ¥” ¥” ¥”¢”¢”Âàž”Â`«” ˜” ˜”Âàž”Â ˜”€•” ˜” ¾”»”€®” ¥”ÂÀ›” ˜”Âàž”Â ±” ±” ±”ÂÀ´”Â@¨”Âàž”Â¢”Â`«”ÂÀ›”ÂÀ›”€•”Â`’” ˜”€•” ˜” Œ”€•”Â`’”Â`’” ˜” ¥” ±”ÂÀ´”ÂÀ´”Âු ±”€®”€®”Â`«” ±” ±” ±”Âු ±”Â`«” ¥”Â`«” ¥”ÂÀ›”Â`’” ¥” ¥”¢”¢”¢”Âàž”Â¢”¢”Â`«”Â@¨”Â`«”Â`«”ÂÀ›”ÂÀ›”ÂÀ›”ÂÀ›”ÂÀ›”Â`’”Â@”€•”€•”ÂÀ›” ˜”Â`’” Œ” ”ÂÀ‚” ” s”Âp”Â`y” ”Âà…”Â‰”€•”Â@”€•”Â`’”Â@”Â@”Â@”Â@” ”€|”Â`y”Â@v”Â@v”€|” ”ÂÀ‚” Œ”Âà…”ÂÀ‚”€|”Â`y” ” ”ÂÀ‚” s” s”Âp”€|”ÂÀ‚”€|”€|”Â@v” s”Â@v” ” ”Âp”Â@]” Z”Â``” f”€c” f”Âàl”Âp”Âp”Â`y” s”€|” ”Â@v”Â``”Âp” s” s”Âp” f”Âp” f”ÂÀi” f”Â@]”€c”Â``”Â``” Z”€c”ÂÀi”Â@]”€c”Â@]” Z”€c” f”Â``” Z” f”ÂÀi”Âàl”Âàl”Âàl” f”Â``”ÂÀi”Â`y”Â@v”Â`y”Â`y”Âp”Âàl” f”ÂÀi”Âàl”ÂÀi” s”Â`y”€|”Âà…”Â ” ”Â@v”Âàl”ÂÀi” f” f”€c”Â@v” s”Âp” s”Â@v” f”€c”Âàl” f”ÂÀi”ÂÀi”Â@]”Â@]”Â``”Â@]”Â@]” f” f”Â``”ÂW”ÂàS”ÂàS”Â``”ÂW” M”ÂàS”ÂàS” M” M”ÂàS”Â``”ÂÀP”ÂÀP”ÂÀP”Â@D”ÂÀ7”Â`.”Âà!” (”ÂÀ” ”Â`” ”€ÿ“Â󓀿“Â@à“ ݓÂà֓ ГÂ`Ê“Â`Ê“Â`Ê“Â`Ê“Â@Ç“Â`ʓ ēÂནÂ`±“ ž“€›“ ž“ ’““ ’“ ’““Âà‹“Â …“Âà‹“Âà‹“Âà‹“ÂÀˆ“ …“€‚“ l“ l“Âàr“Âàr“ÂÀo“ÂÀo“ÂÀo“Âàr“ÂÀo“ l“ l“Â@c“Â`f“ `“ S“€P“€P“ G“ .“Â@1“ .“Â+“Â`4“€7“€7“Â`4“ .“ .“Âà'“Â+“€“Âà“ “Â`“ “ “Âà“Âà“Â@“Â`“Â@“Âà“Âà“€“ “““Âà“ “Â@“ ““Âà“ “““Â`“ “ ““Â`“ ü’Âàõ’ÂÀò’Âàõ’ ï’Â`é’Âù’Â@ÿ’Â@ÿ’Âù’Âàõ’Âàõ’ ã’ÂàÜ’Â`é’ ï’€ì’Â@æ’Â`é’Â`é’Âà’ ã’Â`é’ ã’Â`钠쒀쒠ã’Â@æ’Â`é’ ã’Âà’Â`é’Âà’ ã’ÂàÜ’Âà’ÂÀْ ֒ ֒Â`Ð’Â@͒€Ӓ ֒ ֒Â`Ð’Â`Ð’Â@͒ ֒Â@Í’Â@͒ ֒ÂàÜ’ÂàÜ’ÂÀÙ’Â ã’ ã’Âàܒ ֒ ֒€Ӓ ֒ ֒ ʒ ʒÂàÃ’Â Ê’ÂÇ’Â Ê’Â`·’ ½’ÂàÃ’Â`В ֒ ֒€ӒÂ`Ð’ÂàÃ’Â`Ð’ÂÇ’Â Ê’Â`Ð’Â`В€ӒÂÀْ€Ӓ ʒ€ӒÂÀْ ֒ ֒ ֒Âàܒ ֒ÂÀْ ֒ ֒€ӒÂ`В ʒ€º’ÂàÃ’ÂÀÀ’ ʒ ʒÂ`В ½’ÂàÃ’Â@´’€º’€º’ ±’ÂÀÀ’Â`·’Â`·’ ±’ÂÀÀ’ÂàÃ’Âǒ€ӒÂ`Ð’Â@Í’ÂÀÙ’Â`Ð’ÂàÒ ½’ÂàҀº’ÂàÃ’ÂàÃ’ÂàÃ’ÂÀÀ’ÂÀÀ’Âǒ ½’ÂÀÀ’€º’ÂàÃ’Â Ê’ÂàÃ’Â`Ð’ÂàÜ’ÂÀÙ’Â@Í’ÂÇ’ÂÀÀ’ÂàҀӒ ʒÂÀÀ’€º’ ½’€º’ ½’ ֒Â`Ð’Â`Ð’ÂàÃ’Â`Ð’Â`Ð’ÂàÃ’Â Ê’Â@Í’Â Ê’ÂÀÀ’€º’ ½’ÂÀÀ’Âǒ ֒ÂÀÙ’Â`В ֒ ֒ ֒ÂàÜ’ÂÀْ ֒Âàܒ ֒ ã’Â`Ð’ÂàÜ’Â@Í’Âǒ ʒ€ӒÂàÜ’Âà’ ã’€ӒÂÀْ€ӒÂ@͒€Ӓ ã’Â@撠㒀쒠ï’Â`é’Â`钀쒠ã’ÂàÜ’ÂàÜ’Â ã’ ã’ ã’ ï’Â`é’ ï’€ì’ÂÀò’Âù’Âàõ’Â`é’ÂàÜ’Â`é’Â`é’€ì’Â@æ’ ã’Â`é’ ï’Âù’ ü’ÂÀò’ÂÀò’Â`“€“ÂÀò’Âàõ’Â@ÿ’Â`“Â@ÿ’Â`“Â`“Â`“Âù’Â@ÿ’Â@ÿ’Â`“Â`““€“Âàõ’Âù’Âàõ’Â`“Â`“€“ “ “ “Â`“Â@ÿ’€“ “Â`“ÂÀ “€““ “Âà“Âà“€“€““ ““ “ “ “ÂÀ$“ !“ “ “ “Â`“€“Âà'“ !“€“Â`“Â`“Â`“ “ “Âà“ “Âà“€“Â+“ .“ :“€7“ÂD“ :“ :“€7“Â`4“ .“Â`4“ .“Âà'“ÂÀ$“Â`4“Âà'“ !“Âà'“ÂÀ$“ ““ “Âà“€“ !“Â`“€“€“€“Âà'“ÂÀ$“ !“Âà'“ !“Â@“€“Â`“Â`“€“ÂÀ$“Âà'“€“ !“Âà'“ .“Âà'“Â+“€7“Â@1“ .“Âà'“ÂÀ$“Â@1“Âà'“ÂÀ$“€“ !“€“ .“Âà'“Âà'“Âà'“ .“Â`4“Â`4“Â`4“Â`4“Â@1“ .“€7“Âà@“ÂÀ=“ :“ÂÀ=“ :“ÂÀ=“ G“Âà@“ÂD“ G“Â`4“Âà'“ .“Â@1“ .“ :“Â`4“ .“ :“ G“ÂD“ .“Âà@“ :“Â`4“ .“ .“Âà'“ !“ .“Â@1“Â@1“Â`4“ :“Âà@“Âà@“ :“Âà@“ G“ G“ G“Âà@“€7“Â`4“Â@1“ :“Âà@“ G“ÂÀV“ G“ÂD“Âà@“ S“ S“ G“Âà@“ÂÀ=“ÂÀ=“ÂD“Âà@“ :“ :“ÂD“ :“€7“€7“€7“ :“Â`4“€7“ÂÀ=“Â@J“ÂÀ=“Âà@“Âà@“ :“Â`4“Â@1“€7“ :“ G“ÂÀ=“ÂÀ=“Âà@“ÂÀ=“ÂÀ=“ G“ G“ G“ÂD“ :“ G“Â@J“ G“ S“Â]“ÂàY“ÂàY“€P“ S“ S“ S“Â@J“Âà@“ :“Âà@“ G“ G“ G“ G“€P“ÂàY“ÂàY“ÂàY“ `“Â]“ÂÀV“ÂàY“Â]“Â@c“ S“ `“ÂàY“ `“Â`f“€i“ l“Â]“€i“ l“€i“ÂàY“ `“Â`f“ÂÀo“Âàr“ÂÀo“Â]“ `“Â`f“Â@c“ l“ l“Â@c“Â`f“Â`f“€i“Â@c“ÂÀo“Âv“€‚“ y“Âàr“Âàr“Âàr“ y“ÂÀo“€i“Âv“ y“Âàr“Âv“Â`“€‚“ y“Â`“ y“ y“ y“€‚“€‚“Â`“ …“ …“Â@•“€›“ ’“ÂÀˆ“Â@|“ …“ÂÀˆ“Âà‹“Â …“Âà‹“Âà‹“Â ’““ ž“ÂओÂ`˜“Â`˜“Â@•““Â@•“ ’“Â`˜““ÂÀˆ“Âà‹“Â@•“ÂओÂओÂ@®“ ·“€´“ÂओÂओÂओ¨“ÂÀ¡“ «“ «“ «“ «“ÂओÂ`±“Â`±“Âओ¨“¨“Â`±“¨“¨“ÂओÂओÂནÂÁ“ ē ·“ÂÁ“ ēÂ`ʓ€͓ Г ГÂ`Ê“Â@Ç“ÂÁ“€͓Â`Ê“Â@Ç“Â@Ǔ Г ݓ é“ ݓÂàÖ“ÂàÖ“ÂÀӓ ݓ ݓÂàÖ“Â Ý“Â`ã“ÂÀì“Âàï“Â󓀿“ ݓ é“Â@ù“Â@ù“ ö“ÂÀì“Â`ã“€æ“ÂÀì“ÂÀì“€æ“Âàï“ ö“Âàï“Âà擠é“Âó“ ” ö“Â`ü“ ö“Âó“ é“Âàï“Âàï“Â`ã“ é“Âàï“ ö“Â`ü“Âà” ” ”ÂÀ” ö“Â@ù“Âà” ”Âà” ”Âà” ”Â@” ”ÂÀ”€ÿ“ ” ”Â@ù“Âó“€ÿ“Â`ü“ ”€ÿ“€ÿ“ ” ” ”Â`” ”Â@”Â`”Â@” ”Âà”Âà”Â`ü“Âà”ÂÀ”ÂÀ”ÂÀ”Â@” ” ö“ ö“Âàï“ ö“ ” ”Âà” ”Â@” ”€”Â`”€” ”Âà!” (”Â`.”Â`.” (”Â`”Â@”Â`” ”Â@” ”Â`”€” ” ” ”Â%”Â%”Âà!”ÂÀ” ” ”Âà!” ” (” ”Â%”Â%” ” ”€” ”Âà”ÂÀ” ” ”Âà!”ÂÀ”Âà!” (” ”€”€”€” ”Â`”€”Â%”Â@+”Â`.”Â@+”Âà!”Âà!” (”Âà!” (” (”Â@+” (” (”Â@+”Âà:” A”€1”€1” 4” 4” 4”Â`.”€1”€1”€1”ÂÀ7”€1”Âà:” 4” 4”€1”Âà:” 4”€1”€1” 4” 4”ÂÀ7” 4”Â`.”Â`.”Â@+”Â@+” (” (”Â`.”Â`.”Â`.”Â%”Âà!”Â%”Â`.” 4”ÂÀ7”ÂÀ7”Âà:”ÂÀ7”ÂÀ7”ÂÀ7” (”Â`.”ÂÀ7”Â`.”ÂÀ7” 4”€1”ÂÀ7” A”Âà:”Âà:”Âà:”€1”ÂÀ7” A”Â@D”Â`G”€J” A” A” A” A”Â`G”Â`G”Â`G” M” Z” M”€J”Â@D”Â`G” M”€J”Â>”Âà:”ÂÀ7”Âà:” A”Â`G”€J”€c” Z”Â``”Â``”€c” f”Â``” Z”ÂW”ÂW”Â``” f” f”ÂÀi”Âàl” Z”ÂàS” Z”Â``” f”Âp”ÂÀi” Z” M”Â@]”Â``” f” f”Â``” f” f” s” f” Z” f”ÂÀi” f”ÂÀi”Âp” f” f” f” f”Â``”€c”ÂÀi” f” s”Âp”ÂÀi”Âàl” f” s”Âàl” f” s”Â`y” ”€|”Â@v”Â@v”€|”€|” ”Â`y” s”€|” ”Âp”€|”Âà…”Â ” s”€|” ”ÂÀ‚”ÂÀ‚”Âà…”Â ”Â@v” ” ”€|” s” s”Â`y”Â@v”Â`y”€|”€|” ” ”ÂÀ‚”ÂÀ‚” Œ” Œ”€•”€•” ˜”Â@”Âà…”Â@”Âà…”Â‰” ”Âà…”Â‰”ÂÀ‚”€|”Âà…”ÂÀ‚”Âà…”Â@”Â@”Â`’”Â`’”Â`’”Â@” ˜”Âàž”Â€•” ˜” ˜”Âàž”Â ˜”Â`’”€•”Â@”Â`’” ˜” ˜”Âàž”Â¢”€•”‰”‰”Â`’” Œ”ÂÀ›” ¥”¢”€•”€•” ˜”ÂÀ›”¢”¢”Âු ±”ÂÀ´”ÂÀ´” ¾”»” ±”ÂÀ´”ÂÀ´” ¥” ¥”Â@¨”€®”Âà·”Âà·”Â@Á”ÂÀ´”Â`«” ±”»”»”Âà·”Âු»” ¾” ¾”Â@Á”Â`Ĕ€ǔ ʔÂÀ͔ הÂÔ”ÂàДÂàДÂÀÍ”ÂàДÂÔ”ÂàДÂÔ”Â`Ý”Âàé”€à” ã”Â`ݔ ã”Âà销à”ÂàДÂàДÂ@Á” ה הÂ@Ú”ÂÀ͔ ה€à”€à”Â`ݔ הÂ`Ý”Â`Ý”Â`Ý”Â`ݔ€à”ÂÀæ”Âí” ü”€ù”Â`ö”€ù”ÂÀÿ”•••ÂÀÿ”€ù”Âà•• ü”Â@ó” ü”Â`ö”Â`ö”€ù”Âà• • • •Â`• •Â`•Â`• •Âà•• •Â@ ••ÂÀÿ”Â@ •Â@ •Â`•€•Â`•€• ••ÂÀ•Âà•Âà•ÂÀ• "• •€•€•Âà•€•Â@ •ÂÀ•Âà••• •ÂÀ•• •€•Âà• • "•€+•Âà4• ;• ;•Âà4•Â8•Âà4•Â8• .•ÂÀ1• .•Âà4•ÂÀ1•€+• .•€+•€+• "•Â`(•Â@%• "•Âà•Âà•Âà• "•€+• .• "•Â`(•€+• "• "•Â`(• "•ÂÀ•Â@%•Â@%•Â`(• .• "•Â`(•Â`(•ÂÀ1• .•Âà4•Â8• .•€+•Â`(• .• .• .•Â@>•€D•Â8•ÂÀ1•Â8•Âà4•€+•Â@%• .•• "••Â`(•Â@%•Â8•Âà4•€+•Âà4•Â8• ;•Âà4•ÂÀ1•ÂÀ1•€+• .• ;•ÂÀ1•ÂÀ1•Â@%•Â`(•Âà4• .•ÂÀ1•€D• ;•Âà4•Âà4•Â`A•Â8•Â@>• ;•Â8•Â8•Â8•Âà4•€+• "• .•Âà4• ;•Â@>•ÂàM•ÂàM• T• T•ÂÀJ•ÂàM•ÂQ•ÂàM•€D• G•ÂÀJ•Â@>•Â8•Â@>• G•ÂàM•€D• ;•€D• ;•Âà4•Â`A•€D•€D•Â`A•€D•€D• G• G•Â`A• G• G•€D• G•ÂàM•€D•Â`A•Â`A• G•ÂQ•ÂQ• G•ÂÀJ•ÂÀJ•ÂàM• G•€D•Â@>•Â`A•Â`A•€D•ÂàM• T• T•ÂQ•ÂÀJ• T•ÂàM•€D•ÂàM•ÂàM•Â@W•€]• T• T• G• G• ;•Â`A•ÂÀJ•ÂàM• G•Â`A• ;• G•ÂÀJ•ÂàM•Â@>•Â`A•Â@>•€D• G•ÂÀJ• G•Â@>•Â@>•Â@>•€D•€D• G•€D•Â`A•ÂÀJ•ÂQ• G•Â`A• G•ÂàM• G•ÂàM• G•ÂàM•ÂQ•ÂÀJ•€D• ;•€D• ;• .•€+•Â@%•Â`(•Â@%•Â@%•Â`(• "•Âà•ÂÀ•€•Âà•Â@%•Â`•• •€•€•Â@ •Â@ • • •Â@ •Âà• ü”••Â@ó”Â`ö” ð” ð”Â`ö”Â`ö” ð” ð”Â@ó” ð”Âí”Âí” ð”Âí” ã”€à” הÂ`ݔ ה ã” ã” ה ã”€à”€à”ÂÀ͔ ʔ ʔ€ǔ€ǔ ʔ ʔ ʔ€ǔ€ǔ€ǔ€ǔÂ@Á”Â`Ä”Â@Á”Â`Ä”Â`Ĕ ¾”€ǔ€ǔ ʔÂ`Ä”Âà·”Âà·”Âු ʔ ¾” ʔ ¾”»”»” ¾”Â@Á” ¾”»”Âà·”Â`Ä”Âු€®” ¥”€®”Â`«”ÂÀ´”€®”Âàž”Â ¥”Â`«”Â`«” ¥”ÂÀ´” ±”Âු€®”Â`«”€®” ±” ±” ±”€®” ˜”€•” ˜”¢”¢”Â@¨”€®” ±”ÂÀ´”Â`«”Âු€®”Â`«” ¥”Â@¨”Â@¨”Âàž”ÂÀ›” ˜”€•”€•”€•”Â`’”ÂÀ›”¢”€®”Âු ¥”ÂÀ›” ˜”Â`’” Œ”ÂÀ‚” Œ”Â`’” ˜”Âàž”Âàž”Â`’”Â`’”‰”Âà…”Â`’”€•” ˜” ¥”Âàž”ÂÀ›”Âàž”Âàž”Â ˜” ˜”Â`’”Â@”Â@”€•”ÂÀ›”€•”ÂÀ›” ˜” ¥” ˜”¢” ¥” ¥”Âàž”Âàž”Â`’”Â`’”Â@”Â`’”‰”Â`’”Â@”Â`’”€•”Â@¨” ¥”¢”Âàž”Â Œ” ˜”¢” ¥”ÂÀ›”ÂÀ›”¢” ¥”Âàž”Â€•”Â@”Âà…”Â‰”‰” ”‰”Â@” ˜” ˜”¢”Âàž”ÂÀ›” Œ”Â@”Â`’” Œ” Œ”‰”Âà…”Â Œ”€•”€•” Œ” Œ”Âà…”Âà…”Â‰”Â`’” Œ” Œ” ” ”Âà…”Â Œ”Âà…”Â‰” Œ”Â`’”€•”‰”Âà…”Â Œ”Â@v” s”ÂÀi”Âp”Âà…”Â Œ” Œ” Œ”Âà…”Â‰”€•” Œ”ÂÀ‚”ÂÀ‚”Âà…”Â Œ”Â`’”‰”‰”Âà…”Â`’”€•”€•” ˜”Âàž”Â€•”Â`’” Œ”ÂÀ‚”Âà…”Â`’”Â`’” Œ” Œ”Âà…”Âà…”ÂÀ‚”Âà…”Â Œ”Âà…”Â‰” Œ”€•”Â`’” ˜” ˜” Œ”Âà…”Âà…”ÂÀ‚”Âà…”Â‰” Œ”‰” Œ”Âà…”ÂÀ‚” ”Â@v”Âp”Âp” ” ” ” ”Â`y” ”‰” Œ”Â@” Œ”Âà…”Âà…”Â‰” ”ÂÀ‚” ”Â`y” Œ”Â`’” Œ”‰” Œ”Âà…”Âà…”Â‰” Œ”Â`’”Â@”Â`’” ˜”€•”¢”€•”€•” Œ”ÂÀ‚” ”Âà…”ÂÀ‚” Œ”Â`’”‰”‰” Œ”‰”Â`’”€•”Â`’” Œ” ˜”Â`’” Œ”€•” Œ” ˜” ˜”Â`’” Œ” Œ”‰”‰” Œ” ˜” ¥”€®”Â`«” ¥”¢” ˜” Œ”Â`’”Â@” Œ” Œ” Œ”€•” ˜” Œ”Â@”Âàž”Â¢”¢” ˜”¢” ˜” ¥” ¥” ¥”€®”Â`«”€®”¢”¢”ÂÀ›” ˜”Âàž”ÂÀ›”Â`’”ÂÀ›” ˜”Âàž”Â ˜” ˜”Â`«” ¥” ¥”Âàž”Â ¥”Â`«”¢”Â@¨”Â@¨”¢”Â`’” ˜”Âàž”Â¢” ˜”ÂÀ›”Âàž”Â ¥”Â`’”€•”ÂÀ›” ˜” ¥” ¥”Â`«”Â`«”Âàž”Â ˜”Â`«”¢”Âු ±” ±” ±” ±” ±”Â@¨”€®”Â`«” ¥”¢”Âàž”Â¢”Â`«”€®” ±”Â@Á”Âු ¾” ¾”Â`Ĕ ¾” ¾” ¾”Âà·”Âු ±”ÂÀ´”Â@¨”ÂÀ´”Â`«”€®”ÂÀ´” ±”Âà·”Âà·”Âු»”»” ¾” ¾”Â`Ä”Â`Ĕ»”»”€ǔÂ`Ä”ÂàДÂ`Ä”Â`Ĕ€ǔÂ`Ä”Âà·”Â`Ä”Â`Ĕ ¾”Âà·”Âු»” ¾”Âු€®”Âà·”Â@Á”ÂÀ´”ÂÀ´” ±”€®”ÂÀ´” ¾” ¾”Âු ¾”ÂÀ´”€®”»” ±”Âු ¾”Âà·”Âු ¾” ±”Âà·”ÂÀ´”Âු»”ÂÀ´”€®”Â@¨”Âු ¾”»” ¾”Â`Ĕ ¾” ±”ÂÀ›”¢”Â`«”Âà·”ÂÀ´”»”Â`«”Â`«”¢”ÂÀ›”ÂÀ›”ÂÀ›”Â`’” ¥”Âàž”Âàž”Â ˜”Âàž”Âàž”Â`«”Âà·”Â`«”Â`«” ±”€®”Â@¨” ±”€®”¢” ¥” ¥”¢”Âàž”Â€•”Â`«” ¥”¢”ÂÀ›”¢” ±”»” ¾”ÂÀ´”ÂÀ´” ±”Â`«”Â@¨”Âàž”Â€®” ¥” ¥” ¥”ÂÀ›”Âàž”Âàž”Â¢”€®” ¥” ¥” ˜”€®”Â`«”€®”Â`«” ¥”€®”ÂÀ›” ˜”Âàž”Âàž”Â ¥” ˜” ˜”‰”Â`’”€•”Â@” Œ”€•”Â`’” ˜”Âàž”Âàž”Â Œ”Âàž”Â¢”¢” ¥” ¥”Âàž”Â€•”€•” Œ” ˜”€®”Â`«” ˜”€•”Â`’” Œ”€•” Œ”€•”€•” ”‰”Â@”Âà…”Â Œ”Â@”Â`’”Âà…”ÂÀ‚”‰”‰”Âà…”Â Œ”Âà…”Âà…”Â‰” ”ÂÀ‚” ”ÂÀ‚”‰” ” ”€|” s” ”Âà…”ÂÀ‚” ” ”€|” ” ” ”€|” ”Â`’”€•”€•”Â`’”€•”Â`’”‰”‰”€|” ” ”Â@v” s”ÂÀi” f”€c”Âàl”Âàl”€|”Â`y”Â`y”Âp”Â@v”Âp” ” ” ”€|”‰”Âà…”Â€|” ” ”€|”Â`y”ÂÀi” s”Â`y”Âàl”Âp”Âàl”€c”Âp” s”Â@v” ”Â`y”Âàl” s”Âàl” f” s”Â`y”Â@v” s”ÂÀi” s”Âàl”ÂÀi”ÂÀi”Â`y”Âp” f”ÂÀi” f”Âàl” s” ”Âà…”Â ”Âà…”Âà…”Â`y” ”€|”ÂÀi”Âp”ÂÀi”Âp”Â`y” s” s”Âàl” s”€|”Âà…”Âà…”ÂÀ‚”€|”Âà…”Â Œ”Âà…”Âà…”Â ” s”€|” s”ÂÀi” f”Âàl”Âàl”€|” ”ÂÀ‚”€|” ”€|”€|”Âà…”Âà…”Â@v”Â@v” s”Â@v”€|”Âp”Âàl”Â`y”€|”ÂÀ‚” ”Â`y”Â`y” s” s”Â@v”Âàl”€|”Â@v”Âà…”Â Œ”‰”Âà…”Âà…”Â Œ”Â`’”Â`’”€•”Âàž”Â ˜” ˜”Â`’”Â`’”Â@”Â`’” Œ”€|”€|” ”Â`y”Â@v”Â`y”ÂÀ‚” Œ”Â`’”Âà…”Â‰”Âà…”Â ˜”€•”€•” Œ”Âà…”Â ˜” ˜” ˜”Âà…”Âà…”Â‰” s”Âà…”Âà…”Â`’” Œ” Œ”Âàž”Â`’”Â@”Â`’”Â@”Â@”€•”Âàž”Âàž”Âàž”Â¢”€•”Â`’”Âà…”Âà…”Â`’”‰” Œ”Â@”ÂÀ‚” ” ” ”Â@”Â`’” Œ”Â`’” ˜” ˜”€•”Â`’”Â@” ˜”€•”€•” Œ”‰”Â@”€•”Â`’” ˜” ¥” ¥”Â`«”Â@¨”Âàž”Â@”Â@”Â`’” Œ”Â`’” ¥”¢”Âàž”Â ˜”Â@¨” ¥” ˜” ˜”¢”Â@¨”¢”Â`«”Â`«”Â`«”€®”Â`«”€®”Â@¨” ¥” ¥”Â@¨”¢”ÂÀ´” ¾”»”»” ¾”»”Â`«”Â`«”Â@¨” ¥”€®”ÂÀ´”€®”»”€®”Âà·”Âà·”Â`«” ±”€®” ±”Âà·”Âà·”ÂÀ´”ÂÀ´”»” ±”ÂÀ´” ±” ±” ±” ±” ±” ±”»” ±” ±”Â@¨”Â@¨” ¥” ¥”€®”€®”ÂÀ´”Âà·”Âු ±”Âà·”Âු ʔ ¾”Âà·”Âු ±”»” ¾”Â`Ä”Âà·”Âà·”Â@Á”Â`Ĕ€ǔÂ`Ä”Â@Á”Â@Á”Âà·”ÂÀ´” ±” ±” ±”Â@¨”€®” ¾”€ǔÂ`Ä”ÂàДÂ@Á” ¾” ¾”Â`Ä”ÂàДÂàД€ǔ ʔÂ`Ĕ ¾” ¾” ¾” ¾” ʔ ã” ã”Âàé”Âà锠㔀à”Â`Ý”ÂÔ”ÂàД ʔ ʔ€ǔ ±”Â@Á” ʔ ʔ ʔ ʔÂàД ʔÂÔ”ÂàДÂÀ͔ ¾” ʔ€ǔ ʔÂàДÂ`Ý”Â`ݔ ã” הÂ`Ý”ÂԔ הÂÀæ”Âí”Âàé”Â`Ý”Â`Ý”ÂÀæ” ã” ã”€à”€à”ÂÀæ”€à” ã”ÂÀ攀à”Â`Ý”Â`ݔ€à” הÂàД הÂ`ݔ ה ʔ הÂàДÂÀÍ”Â@ڔ הÂÀÍ”ÂàДÂ@Ú”ÂàД ה ה€à” ã”Âàé” ã”Âà销à”ÂÀæ” ã” ð” ã”Âí”Â픀à”Â`Ý”ÂÀæ” ה הÂÔ”Â`Ý”ÂàДÂàДÂÔ”Â@ڔ€à”Âàé”Âàé” ã”Âàé”€à” ã”Âàé” ã” ð” ð”Âàé”Âàé”Âàé” ã” ð” ü”€ù” ð” ð” ã”ÂÀæ” ã”€à”€à” ð”Â@ó”€à” ã”Â@ó”Âàé”Âí” ã”Â@ó”€ù”Â@ó”Âàé”Â`Ý”Â`ݔ€à” ה ã”Âí”Âí”Âàé” ã” הÂ`ݔ ã”ÂÔ”Â@Ú”Â`Ý”Â`Ý”Âàé”ÂÀæ” ã”ÂÀ攠㔠㔀à”ÂÀæ” הÂ@Ú”Â`ݔ€à” הÂàДÂԔ ʔÂ`Ä”ÂԔ ʔÂ@ڔ ה ã” ã”€à”Âàé”Âàé”ÂÀæ”Â`ݔ€à” ʔÂàДÂàД ʔ הÂàДÂ@Ú”Â`Ý”Â@Ú”Â`ݔ הÂàДÂÀ͔€à” ã” ã” ã” ã”€à”Â@ڔ€à”Â`Ý”Â@Ú”ÂàДÂÔ”Â@Ú”ÂàДÂԔ הÂÔ”Â@Ú”ÂÔ”ÂàДÂ`Ä”ÂÀÍ”ÂԔ הÂÀ͔ ʔÂÔ”ÂÔ”ÂÀÍ”ÂԔ ã” ה ʔÂ`Ĕ ʔ€ǔ€ǔ ה הÂ@ڔ€à”Â@Ú”ÂàД ʔÂÀÍ”ÂàДÂ`ݔ ה ה ã”€à”ÂÀ攀à”ÂàД€à”Â`Ý”Â`ݔ ה ה ה ה€à”€à” הÂàДÂÀÍ”ÂÀ͔€ǔÂ`Ĕ€ǔÂÀ͔ הÂàД ה הÂ`Ý”Â@Ú”Â@ڔ€à”Â`ݔ הÂ@ڔ הÂ`ݔ€à”Â`ݔ הÂÔ”ÂàДÂÀÍ”ÂÔ”Â`ݔ הÂÀÍ”Â`ݔ הÂԔ הÂÀÍ”ÂԔ הÂ`ݔ€à”Â@ó”Â@ó” ã” ã”Â@Ú”ÂàД ה הÂ`Ý”Â@Ú”ÂÔ”ÂԔ€ǔ ʔÂàДÂ`Ý”Â`ݔ€à”€à”€à”€à” הÂ`Ý”Â@Ú”Â`ݔ הÂ`ݔ הÂ@ڔ הÂԔ הÂ`Ý”Â@ڔ ã”€à” ã” הÂàДÂàДÂ`Ý”Âí”Âàé”Âàé”Âí” ð” ð”Â`ö”Âàé”Â`ö”Âà•Âà•Â`ö”Â`ö”ÂÀæ”ÂÀæ” ð”Âàé”Âàé” ã”Â`Ý”ÂÀæ”Âí” ð”Â@ó”Â@ó” ð”Â`ö”€ù”Â@ó”Â@ó”Â@ó”Â`ö”Âàé” ã” ð”Âí” ã”ÂÀæ” ü”Âà• •Â@ •Âà••ÂÀÿ”•Âà•€ù”Â`ö” ü”ÂÀÿ”••Âà•Âà• ü” • ü”Âà• •Âà• ü”Âà•Â`••Â@ •Âà•Â@ •Â@ •ÂÀÿ”•• •Â`• •Â@ •Â`ö” ü” ü” ü”•Â`•Â`•• • •Â@ •ÂÀ•ÂÀ•€•€• •Â`•Â@ •• •Âà•ÂÀÿ”••ÂÀÿ”€ù”Âà•€•Â`• •Â@ •Â@ •€•• ü” •Â`• • • ü”• ••• • • ü”ÂÀÿ” • ˜ÂÀ°¶ÂÖ΀LΠ_Àõ¶Âù«Â€ð¢ÂÛ –ÂàÈ€VÂÀ^€ª€°çÁ€w²ÁÙAÁ/@€uªA@¤BÀŸVB@Û|B@"‰B@ÀªÀ0òÀ¤Á0@Á¼cÁ¤ƒÁ€D•Á³¦Á€¸Á€íÈÁÆÙÁ€SêÁ€>úÁ@Ö€a Â@|Â@RÂÀž Â@n&Âà+Â@á0Â@F5ÂA9ÂÀð<Â@6@ÂÀ0C€æEÂÀDH€KJÂÀLÂ@—MÂÀOÂÀFP€lQÂÀlR€`SÂ@"T€ðTÂÀ¥UÂBVÂ@ÞVÂ@[WÂX€¦XÂ@YÂ@hYÂÀØYÂ*ZÂ@{ZÂÀ¹ZÂ@ßZÂÀ[Â$[ÂÀ[ÂÀ³[Âì[Â\Â@V\Â@o\€Ž\Â@Ó\ÂÀø\ÂÀ]Â@]ÂÀ*]ÂÀC]€o]€ˆ]Â|]•]®]ÂÀ§]ÂÀ§]€Ó]Âù]ÂÀ ^€^€^Â@1^Â@1^Â@J^€P^€i^€‚^ÂÀ¡^Â@•^€´^ÂÀº^€Í^Âó^Â@ù^ÂÀ_€_€_Â%_ÂÀ7_ÂÀ7_Â@D_Â@]_Âp_Â@¨_Â@Á_ÂÀÍ_Â@ó_ÂÀÿ_Â@ `Â`Â`Â@>`Â@>`ÂQ`ÂÀJ`Âj`€v`ÂÀ•`œ`ÂÀ®`Â@Ô`ÂÀù`Â@aÂÀDaÂÀ]aÂda€WaÂ@jaÂÀvaÂÀ¨a€»aÂÀÁaÂ@çaÂ@bÂÀ%bÂ@2bÂ@db€jbÂ@–bÂ@¯bÂÀÔb€çb€çb cÂÀcÂÀ8cÂ?cÂ@EcÂÀjcÂÀƒc£cÂÀµcÂÕc€ácÂ@ôcÂ@ d dÂÀ2dÂÀKdÂkdÂÀ}dÂdÂ@¼dÂ@¼dÂÀádÂÀeÂ@9eÂÀEe€qe—e—eÂ@¶eÂ@Ïe€fÂf€f€fÂÀ fÂFfÂ@ef‘fÂ@°fÂÃfÂÀÕf€èfÂgÂ@FgÂÀ9gÂYgÂÀkgÂÀ„gÂ@‘g¤g€Ég€âg€âgÂ@õg€hÂ@'hÂ:hÂ@rhÂÀ—hÂÐh€ÜhÂéh€õhÂiÂiÂ@!iÂ@:iÂ@liÂ@…iÂÀ‘iÂÀªiÂ@ÐiÂ@éiÂüiÂÀjÂ@jÂÀ'jÂGjÂÀYjÂÀrjÂ@˜jÂÀ¤jÂ@ÊjÂ@ãjÂÀïjÂÀïjÂkÂ(k€MkÂ@yk€˜kÂÀ·kÂ@Äk€ãkÂÀékÂÀlÂ@(lÂ@AlÂ@AlÂTlÂÀlŸl¸lÂ@×lÂÀülÂÀmÂ5mÂ@;mÂÀGmÂ@TmÂ@mmÂ@†mÂ@ŸmÂËmÂÀÝmÂÀöm€"n€"nÂÀAn€TnÂÀAnÂ@gnÂÀsnÂ@™n¬nÂÀ×nÂ@änÂ@oÂ)oÂBoÂ[oÂÀmoÂ@“oÂ@Åo€äoÂ@÷oÂ@pÂÀp€/pÂ@[pÂUpÂnpÂ@tpÂÀ€p€“p€¬p€¬p€ÅpÂÒpÂ@ØpÂ@ q€)qÂ@Uq€tqÂÀzqÂqÂ@ q€¿qÂÀÞqÂ@ëqÂÀ÷qÂ@rÂÀ)rÂ@6rÂIrÂÀtrÂ@hr€nrÂÀrÂÀr€¹rÂßrÂsÂÀ#sÂÀUsÂ@bsÂ@{s€šsÂ@­s€Ìs€ås€åsÂ@ÆsÂ@ßsÂÀtÂ$tÂ@*tÂ@CtÂotÂÀštÂÀštÂÀšt¡tÂ@ÀtÂ@ÀtÂÀ³tÂ@ÙtÂÀuÂuÂ@=uÂ@VuÂiuÂ@ˆuÂÀ”uÂÀ­u›uÂÀ­uÂ@ºuÂæu€òu€ vÂÀ*vÂÀ*vÂÀ\vÂÀ\vÂ@ivÂ@‚vÂ@›vÂÀÀvÂÀÀv€ÓvÂ@æv€wÂÀ wÂ@wÂ+w€7wÂÀowÂ@|wÂ@•wÂ@®w€´wÂ@ÇwÂ@ÇwÂÚwÂówÂ@ùwÂÀx€1xÂ@DxÂWxÂpxÂÀ‚xÂ@xÂÀ›x€®x»xÂ@ÁxÂÔxÂ@ÚxÂÀÿxÂÀ1yÂÀJyÂÀJyÂQy€]yÂ@WyÂ@WyƒyÂ@¢yÂÎy€ÚyÂ@íyÂ@zÂzÂÀz€%zÂ@8zÂÀ]zÂdzÂ}zÂÀzÂÀ¨z€¢z–zÂ@µzÂáz€ízÂ@{Â@{Â,{€8{ÂE{ÂÀW{Â@d{Â@}{ÂÀ‰{ÂÀ¢{€µ{ÂÂ{Â@á{ÂÀí{Âô{Â@|ÂÀ8|Â@E|Â@^|Â@w|Â@w|ÂÀƒ|Â@|€¯|ÂÕ|ÂÀÎ|ÂÀÎ|ÂÀÎ|ÂÀç|ÂÀ}Â@ }ÂÀ}ÂÀ2}Â@?}Â@?}€^}Â@q}ÂÀ}}€w}„}ÂÀ–}Â@¼}ÂÀá}ÂÀ~Â@ ~ÂÀ,~Â3~ÂÀE~ÂÀE~€?~ÂÀ^~ÂÀw~Â@k~Âe~Âe~Â~~—~ÂÀ©~ÂÉ~°~ÂÀÂ~Â@è~ÂÀ Â@Â-ÂÀ?ÂÀXÂ@eÂ@LÂ_ÂÀqÂ@~Â@—€Â@ÉÂÀÕ€èÂõÂ`€Â €Â`€Â`€Â@ €Â`€Â €ÂÀ€Â €ÂÀ2€Â H€ÂÀK€Â€^€Âk€Â z€Â z€Â z€Â`€Â “€Â  €Â€Â€Âà™€Â€©€Â€©€Â ¹€Â Å€Â@Õ€ÂàË€ÂÀá€Â@î€Â ÷€Â ÷€Â ÷€Â€   ) 6Â`<ÂL O O [ [Â`nÂ`nÂ@k€qÂÀw€ŠÂ šÂÀ©Â` Â` Â ¦Â`¹ÂàÅ ÌÂÉ ÌÂ`ÒÂÀÛÂàÞÂ`ëÂà÷Â@‚ þ€‚Â`‚€‚ ‚Â-‚Â`6‚€9‚Â`6‚Â`6‚ <‚ÂF‚€R‚€R‚€R‚Â_‚Â`h‚€k‚Âàt‚Âàt‚Â`‚Â@~‚ÂÀŠ‚Â‘‚Â@—‚Â`š‚ª‚€¶‚ ¹‚ÂÀ¼‚ ҂Â`å‚ ë‚Â`þ‚Â`þ‚Âõ‚Â@û‚ ƒÂ@ƒÂ`ƒÂà ƒÂƒÂ€ƒÂ *ƒÂ€3ƒÂà<ƒÂ CƒÂ OƒÂ@FƒÂà<ƒÂ`IƒÂÀRƒÂYƒÂ \ƒÂànƒÂ`{ƒÂ ƒÂÀ„ƒÂÀ„ƒÂà‡ƒÂ@‘ƒÂࠃ šƒÂ¤ƒÂ@ªƒÂใÂ`ƃ ̃ÂàÒƒÂÖƒÂàëƒÂ òƒÂ þƒÂ`øƒÂ@õƒÂ`øƒÂ þƒÂ€ûƒÂ`øƒÂÀ„Â@„ „Âà„€-„Â`*„Â@'„€-„ÂÀ3„Â:„ I„Â`\„Â`\„ÂÀe„ o„Â`u„ ˆ„ÂÀ—„ž„ ¡„ž„Âàš„Âž„Â@¤„€ª„€ª„Â@¤„ÂÀ°„Â`À„ Ƅ ƄÂÀÉ„ÂÀÉ„ÂàÌ„Â@ք ߄ ߄Â`ò„Â… …Âàþ„ …Â` …ÂÀ… … …Â`$…€'…Â@!… *…€@… C…Â`=…ÂàI… P… P…Â@S… \…Â@S…Âàb…Âàb…Â`o…€r… u…Â`ˆ…Â`ˆ…Â Ž…Â Ž…ÂÀ‘…˜…˜…˜…˜… ›…Â`¡… §…Â୅ À…ÂÀÃ…ÂàÆ…ÂÊ…ÂÊ…ÂàÆ…Â Í…ÂàÆ…ÂÀ܅€օÂ`Ӆ مÂ`ì…€ï…Â@é…Â@é…Â`ì… ò…€ï… ò…Âü…Â`†Â ÿ…€†Â †Â€!†Âà*†ÂÀ'†ÂÀ'†Â $†Â`7†Â 1†Â@4†Â@4†Â =†Â`7†ÂàC†Â V†Â€l†Â o†Ây†ÂÀr†Â€l†Â`i†Â o†Â o†Â o†Â o†Âàu†Â@†Â ˆ†Â ˆ†Â ˆ†Â’†Â«†Â`´†Â€·†Â`´†ÂàÀ†ÂàÀ†ÂĆÂ`͆ÂàÙ†ÂàÙ†ÂàÙ†ÂàÙ†Â`æ†Â€é†Âàò†Âö†Â ‡Â`ÿ†Â€‡Â ‡Â‡Âà ‡Â‡Âà ‡Â€‡ÂÀ!‡Â ‡Âà$‡Â(‡Â 7‡Â€M‡Â`J‡ÂÀS‡ÂZ‡ÂZ‡Â ]‡Â i‡Â i‡Â€‡Â v‡Âs‡Â v‡Â v‡Â`|‡Â v‡Â€‡Âàˆ‡Âàˆ‡Â`•‡ÂÀž‡Â ¨‡ÂࡇÂÀž‡Â ¨‡Â€±‡Â ´‡Âງ Á‡ÂງÂງÂ@ćÂ`LJÂງÂງ¾‡Â Ú‡ÂׇÂàӇ æ‡Âàì‡Â æ‡Âàì‡Âàì‡Â æ‡Â ó‡Â€ü‡Â€ü‡Â ÿ‡Â@ˆÂ ˆÂ@ˆÂ`ˆÂ ˆÂÀˆÂ ˆÂ`ˆÂ %ˆÂ€.ˆÂ;ˆÂ`DˆÂ€GˆÂ JˆÂ`DˆÂ€GˆÂ€GˆÂàPˆÂ cˆÂÀfˆÂ pˆÂ`vˆÂ pˆÂ pˆÂ`vˆÂ |ˆÂà‚ˆÂ ‰ˆÂÀˆÂ ‰ˆÂ`ˆÂ •ˆÂ ¢ˆÂ •ˆÂ •ˆÂ`¨ˆÂ€«ˆÂà´ˆÂÀ±ˆÂ¸ˆÂ¸ˆÂ¸ˆÂ¸ˆÂ`ÁˆÂ ÇˆÂ ÇˆÂà͈ àˆÂàæˆÂ`óˆÂêˆÂêˆÂ`óˆÂ€öˆÂ ùˆÂ ‰Â@ ‰Â` ‰Â‰Â€‰Âà‰Â ‰Â€(‰ÂÀ.‰Â5‰Â`>‰Â5‰Âà1‰Â5‰Â`>‰ÂàJ‰Â Q‰Â`W‰Â ]‰Â ]‰Â j‰Âàc‰Âàc‰Âàc‰Âg‰Â j‰Â€s‰Âà|‰Â`‰‰Â ‰Â ‰Â€Œ‰Â ‰Â œ‰Â ¨‰Â€¥‰Â€¥‰Â ¨‰Â ¨‰Â œ‰Â`¢‰Âஉ ¨‰Â@¸‰Â Á‰ÂÀĉ Á‰Â Ή Ή ΉÂ`Ô‰Â@щÂÀ݉Âä‰Â ç‰Â ç‰Â ó‰Â€ð‰Â ó‰Â ŠÂ`ŠÂÀŠÂ  ŠÂ`ŠÂ`ŠÂŠÂÀŠÂ  ŠÂàŠÂŠÂàŠÂ ŠÂ %ŠÂ 2ŠÂ€;ŠÂ 2ŠÂ >ŠÂ`QŠÂ€TŠÂ WŠÂ WŠÂ WŠÂ€TŠÂ€TŠÂHŠÂ€TŠÂÀZŠÂÀZŠÂÀZŠÂ@gŠÂ pŠÂzŠÂzŠÂàvŠÂ }ŠÂ }ŠÂ`ƒŠÂ ‰ŠÂ“ŠÂ –ŠÂ@™ŠÂ –ŠÂ@™ŠÂ@™ŠÂÀ¥ŠÂ`œŠÂ€ŸŠÂ¬ŠÂÀ¥ŠÂ »ŠÂ€¸ŠÂ »ŠÂ »ŠÂ ÈŠÂ@ˊ Ȋ ԊÂàÚŠÂ`çŠÂ íŠÂàóŠÂ€êŠÂ@äŠÂàÚŠÂÀ׊ÂÞŠÂ áŠÂ íŠÂÀðŠÂ úŠÂ úŠÂ`‹Â`‹Â`‹Â ‹Â ‹Â‹Â`‹Â)‹Âà%‹Â ,‹Â ,‹Â ,‹Â`2‹Â 8‹Â 8‹Â E‹Â@H‹Â@H‹Â€N‹Â[‹ÂàW‹Â ^‹Â ^‹ÂàW‹Â ^‹Â[‹ÂÀT‹Â€N‹Â@a‹Âàp‹ÂÀm‹Ât‹Â w‹Â@z‹Â`}‹Â ƒ‹Â ƒ‹Â ƒ‹Â`–‹Âà‰‹Â‹Â`–‹Â ©‹Â¦‹Â¦‹Â ©‹Â¦‹Â@¬‹Â¦‹Â`¯‹Â µ‹Â ‹Â`ȋ ΋Â`È‹Â@ŋ ΋Âàԋ ۋ ΋ÂàÔ‹Â Û‹ÂÀÑ‹Â Û‹ÂØ‹Â@ދ€ä‹Âàí‹Â ô‹Â ô‹ÂàŒÂàŒÂàŒÂàŒÂ ŒÂ`ú‹Â€ý‹Â ŒÂ ŒÂ`ŒÂ€ŒÂ ŒÂ ŒÂ@ŒÂ ŒÂ€ŒÂ@)ŒÂ`,ŒÂ€/ŒÂà8ŒÂ€HŒÂàQŒÂ@[ŒÂ XŒÂàQŒÂ XŒÂ`^ŒÂ€aŒÂ`^ŒÂ@[ŒÂ XŒÂ@[ŒÂ dŒÂ@[ŒÂ XŒÂ dŒÂ qŒÂ qŒÂ qŒÂnŒÂ`wŒÂ`wŒÂ€zŒÂ€zŒÂÀ€ŒÂÀ€ŒÂàƒŒÂ ŠŒÂ –ŒÂ€“ŒÂ‡ŒÂ }ŒÂ }ŒÂ }ŒÂ`wŒÂ }ŒÂÀ™ŒÂàœŒÂ@¦ŒÂ £ŒÂ ŒÂ £ŒÂ ŒÂ £ŒÂ`©ŒÂ¹ŒÂൌ ¼ŒÂ@¿ŒÂൌÂÀ²ŒÂ€¬ŒÂൌÂൌÂൌÂൌ ¼ŒÂ¹ŒÂ ¼ŒÂ ¯ŒÂൌ ¼ŒÂ@¿ŒÂ@¿ŒÂ Ռ Ȍ Ȍ ¼ŒÂ ¼ŒÂ¹ŒÂ ÈŒÂ`ÂŒÂ`Œ ՌÂàΌ€ŌÂàÎŒÂ`ÛŒÂ@، áŒÂ áŒÂ áŒÂ`ÛŒÂàΌ áŒÂ áŒÂ€ÞŒÂ áŒÂàçŒÂëŒÂàçŒÂ îŒÂëŒÂëŒÂëŒÂ áŒÂ áŒÂ Ռ€ތ áŒÂàçŒÂ îŒÂàçŒÂ@ñŒÂ îŒÂ@ñŒÂ îŒÂàçŒÂàçŒÂ áŒÂàçŒÂ îŒÂ úŒÂàÂ@ €Â  €)Â`&Â@#Â`&Â@#Â`&€)Â`& Âà2  Â`& ,ÂÀ/Âà2 9 9 9Â6 9Âà2Â6Â6Â`? 9Â`? EÂ`XÂàK RÂO ^ ^ ^Âàd ^Â@U ^ k k kÂàd k k k k k wÂà} „Âà}ÂÀz€t wÂà} Â@‡Â€Â`ŠÂ`ŠÂà–  ©Â@ Â@ Â  €¦Â Â Â€Âà– €¦ÂÀ¬Â`£Âà¯Âà¯Â`¼ÂÀÅ ¶Â³Â€¿Â@Ò ÂÂ`¼ÂÀÅÂàÈ Ï ÏÂàȠ€¿Â`¼ÂàÈ€ØÂ`Õ èÂåÂÀÞ èÂàá ÛÂàáÂ@ëÂ`îÂå èÂÀÞ ÛÂÀÞÂ`îÂ`î€ñÂ@ëÂ`î ô€ñ ŽÂþÂ`ŽÂ`ŽÂÀŽÂŽÂ@ŽÂÀŽÂàŽÂàŽÂ€ ŽÂÀŽÂ  ŽÂ  ŽÂ@ŽÂ@ŽÂ€#ŽÂ` ŽÂ &ŽÂ &ŽÂ@ŽÂà,ŽÂà,ŽÂÀ)ŽÂà,ŽÂ0ŽÂ 3ŽÂ0ŽÂ` ŽÂ &ŽÂÀ)ŽÂ@6ŽÂÀBŽÂ LŽÂ LŽÂ LŽÂàEŽÂàEŽÂàEŽÂàEŽÂ`RŽÂ LŽÂIŽÂ`RŽÂ@OŽÂ XŽÂ XŽÂà^ŽÂbŽÂÀ[ŽÂ qŽÂ qŽÂ€nŽÂ€nŽÂ qŽÂàwŽÂÀtŽÂ qŽÂ qŽÂ qŽÂ`kŽÂ€nŽÂ{ŽÂ@ŽÂ ~ŽÂ`„ŽÂàwŽÂÀtŽÂ ~ŽÂ@ŽÂÀŽÂ —ŽÂ€‡ŽÂ@ŽÂÀŽÂ —ŽÂ £ŽÂ€ ŽÂàŽÂàwŽÂàwŽÂ`„ŽÂ ŠŽÂ —ŽÂÀ¦ŽÂ °ŽÂ­ŽÂ@³ŽÂ€¹ŽÂ °ŽÂ€¹ŽÂ@³ŽÂ ¼ŽÂ ¼ŽÂÀ¿ŽÂàÂŽÂ ÉŽÂ€ÒŽÂ ÉŽÂ ÉŽÂÆŽÂÆŽÂàŽ€¹ŽÂ@̎ Ɏ ՎÂ@ÌŽÂàÛŽÂߎÂàÛŽÂ âŽÂ`ώ€Ҏ âŽÂ âŽÂ€ëŽÂàێ Վ âŽÂߎ âŽÂ€ëŽÂàôŽÂøŽÂøŽÂàôŽÂàôŽÂøŽÂàôŽÂàôŽÂ îŽÂ@þŽÂ ûŽÂøŽÂ`€€€Âà   ûŽÂ`Â@þŽÂ`Â`Â`€  ÂÀ ÂÂà Âà   ÂÀ#Âà&  Â`Â@ €Â@0Â@0Â`3 -Â@0 9€6Â@0Â* 9€6€6 FÂCÂà?ÂÀ<ÂÀ<Â`3Â`3 9 FÂC RÂ`L FÂ`LÂàXÂ\ _ _ _Â@b kÂ`eÂ@b RÂ@IÂ@IÂC€O R€OÂ`L RÂàX _Â\ _ _ _ kÂÀnÂ`e kÂ@{ÂÀ‡ÂàŠÂàŠÂ „ÂàŠÂ „ÂàŠÂàŠÂÀ‡Â ‘ÂàŠÂ „ ‘ÂàŠÂ€Â@{ÂàŠÂ ‘€šÂ ÂÀ Â€šÂ Â Âà£Âà£ÂÀ Â Â§Â§Âà£Â@­Â ¶Âà¼ÂÀ ÃÂÀ¹Âà¼ÂÀ ÃÂ`ÉÂ`ÉÂ`ɠàÏÂÙ Ü ÜÂÀÒÂ@ßÂ@ßÂ`â èÂàîÂÀëÂ`âÂÀëÂÀëÂ`âÂ`âÂò õ õÂò õ õÂò õ õ õÂò õ Âà ÂÀÂàÂà Â`û õÂòÂ`ûÂàÂÀÂàÂ@ÂÀ  Â@€  Âà ÂÀ 3€0 3€0€0 3 3Âà9Â= @ 3€I€I @Â`F L LÂ`FÂÀO LÂÀO @ LÂÀOÂVÂàRÂàR YÂ`_ e YÂV Y eÂàkÂàk e€bÂàk€{ r€{€{€{ÂÀÂà„Âà„ ‹Â€”Âà„Âà„ˆÂ@ŽÂ`‘¡ °Â`ªÂ ¤Â ¤Â`ªÂ@§Â€­Â`ªÂ`ªÂ °ÂÀ³Â °Â °Âà¶Â`à½Â °ÂºÂ€ÆÂºÂ °Â °Â °Âà¶Â`àɠÉÂ`Ü ÖÂÓÂ@ÙÂ`Ü ÖÂàÏÂ`Ü€ßÂ@ÙÂ@ÙÂ`ÜÂÀåÂàèÂÀå ïÂ@òÂì ïÂ`õÂ`õ ûÂÀþÂà‘ û€øÂ€øÂ ûÂà‘ ûÂ`õ€øÂÀþÂÀþ‘Â`‘ ‘Â@ ‘Â`‘€‘€‘Â`‘ !‘€*‘ !‘ÂÀ‘Â`‘ ‘ ‘Âà‘ !‘ÂÀ0‘Â`'‘€*‘ -‘ -‘Â7‘Âà3‘ -‘Â`'‘Âà3‘ÂÀ0‘Â`'‘ -‘Âà3‘Â7‘Â7‘Â`@‘ÂÀI‘ÂàL‘ÂàL‘Â`@‘ F‘ F‘ÂàL‘ÂàL‘ F‘ S‘ _‘ _‘ l‘ _‘Â`Y‘ _‘ _‘Â`Y‘Â`Y‘Â@V‘ S‘Â@V‘Â`Y‘Â`Y‘ _‘€\‘Â@o‘Â`r‘€u‘€u‘Â`r‘Â`r‘ …‘Â€Ž‘Â€Ž‘Â@ˆ‘Â@ˆ‘ ‘‘ …‘Â@ˆ‘Â`‹‘Â€Ž‘ÂÀ”‘ ‘‘Âà—‘Â ‘‘ ‘‘Â€Ž‘Â`‹‘ ‘‘Âà—‘Â ž‘€§‘ ž‘ ‘‘Âà—‘Â`¤‘ ª‘Â`½‘´‘Â఑ ª‘´‘´‘Â@º‘Â`½‘´‘ ª‘ ª‘Â఑´‘Â@º‘Â@º‘Â`½‘ ÑÂ`½‘€À‘Â`½‘ БÂ@ӑ ܑÂàâ‘€ّÂàâ‘€ّ ܑÂ@Ó‘Â`֑ ܑÂ@Ó‘Â`֑ ܑ ܑÂàÉ‘Âàɑ ܑ€ّ Б€ّ ܑ€ّÂ@Ó‘Â`Ö‘Âàâ‘ ܑÂàâ‘ é‘Â`ï‘Â`ï‘Â`ï‘ õ‘ õ‘Â`ï‘Âàâ‘Âæ‘ ܑ é‘ õ‘Âàû‘Â`’Â@’Â@’€•ÂଳÂà™Ë ËÂ@6ÀÂ@è³Â@ø¨ÂöŸÂ`ޘ .“ ԊÂÀFPÂÀ›ÂþÁ€1ßÁ€ ¯Á¼JÁ K?VA0B€¨GB€€oB`{ƒBÀˆBÀfˆBž„BÀœ|BÀãlB€I[BáHBl6B@“$BÀ¡B€âB€lêA€xÏA·A¥ Añ‹AþqAÖNA>-A‡ A6Ø@&˜@X1@`Q?È–¿˜PÀD¬ÀþñÀFÁt=Á¢_Áè€Á€$’Á€T£Á€¶´Á€ÿÅÁ ×Á€ÉçÁ€æ÷ÁÀÂ@² Â@¡Â@Â@:Â@ý#ÂÀ6)€.ÂÀd2Â@Y6Â@ö9ÂÀ;=Â@@Â@§BÂ@æDÂÀÍFÂÀH€2J¶KÂ@MÂ'NÂÀ3OÂÀ-PÂ@QÂ@ãQÂ@«RÂÀfS€öSÂÀ’TÂUÂÀ¥UÂ@ýUÂÀTV¦V€ýVÂ@[WÂÀ²WÂ@ñWÂ@ˆÂà7ˆÂ;ˆÂ@AˆÂàPˆÂTˆÂ JˆÂàPˆÂ@ZˆÂ cˆÂ cˆÂ pˆÂ€yˆÂ†ˆÂ@ŒˆÂ€’ˆÂ@ŒˆÂà›ˆÂà›ˆÂ€«ˆÂ@¥ˆÂ ®ˆÂÀ±ˆÂ@¾ˆÂà͈ÂшÂà͈ Ԉ Ԉ àˆÂàæˆÂ@ðˆÂ íˆÂêˆÂ ùˆÂ€öˆÂ ùˆÂàÿˆÂ` ‰Â ‰Â ‰Â`%‰Â +‰ÂÀ.‰Â5‰Â D‰Â Q‰ÂN‰Â Q‰Â@T‰Â€Z‰Â€Z‰Â€Z‰ÂÀ`‰Â ]‰ÂÀ`‰Âg‰Â€s‰ÂÀy‰ÂÀy‰Â ƒ‰Â€‰Â`‰‰Â@†‰Â@†‰Â€Œ‰Âà•‰Â ¨‰Â€¥‰Â`¢‰ÂஉÂஉ²‰Â€¾‰Â Á‰Â@щ Ή€׉Âä‰Â ç‰Âàà‰Âàà‰Â`í‰ÂÀö‰Â€ð‰Âàù‰Â@ŠÂ  ŠÂ`ŠÂÀ(ŠÂ %ŠÂà+ŠÂ€;ŠÂ€;ŠÂ`8ŠÂ/ŠÂà+ŠÂ€;ŠÂ >ŠÂ€;ŠÂÀAŠÂ KŠÂ`QŠÂÀZŠÂà]ŠÂ WŠÂ€TŠÂ dŠÂ@gŠÂ`jŠÂàvŠÂ }ŠÂzŠÂ@€ŠÂ@€ŠÂ“ŠÂ ‰ŠÂàŠÂ“ŠÂ ¢ŠÂ`œŠÂ€ŸŠÂ ¢ŠÂਊÂ`µŠÂ »ŠÂ ¯ŠÂ@²ŠÂ »ŠÂàÁŠÂàÁŠÂ ÔŠÂ`çŠÂÀðŠÂ`‹Â úŠÂ`‹Â€‹Â÷ŠÂ÷ŠÂÀðŠÂ€‹Âà ‹Â@‹Â‹Âà ‹Â`‹Â@‹ÂÀ"‹Âà%‹Â ,‹Âà%‹Â`2‹Âà>‹Â E‹ÂB‹Â E‹Â`K‹Â`K‹Â@H‹ÂàW‹Â`d‹Âàp‹Âàp‹Â w‹Â w‹ÂÀm‹Â j‹Âàp‹Âàp‹Â`}‹Â€€‹ÂÀ†‹Â`–‹Â€™‹Â œ‹Â œ‹ÂࢋÂ@¬‹Â@¬‹Â€²‹Â໋ÂÀ¸‹ÂÀ¸‹Â໋¿‹Â¿‹Â`ȋ µ‹Â ‹€ˋÂàԋ ΋ ç‹Â ç‹Â ç‹Â€ý‹Â ŒÂ ŒÂ ŒÂ ŒÂ`ŒÂ ŒÂ ŒÂ &ŒÂ@)ŒÂ€/ŒÂ 2ŒÂ<ŒÂà8ŒÂ`EŒÂ KŒÂ KŒÂ KŒÂ€HŒÂàQŒÂUŒÂàQŒÂUŒÂ@[ŒÂÀgŒÂnŒÂàjŒÂnŒÂ }ŒÂ@tŒÂàƒŒÂÀ€ŒÂ‡ŒÂ`ŒÂ ŒÂ`©ŒÂÀ²ŒÂ€¬ŒÂ ¯ŒÂ€¬ŒÂൌÂ@¦ŒÂÀ²ŒÂ ¼ŒÂ¹ŒÂ@¿ŒÂ@¿ŒÂ`ÂŒÂҌ Ռ ՌÂÒŒÂÀäŒÂ îŒÂ€÷ŒÂ`ôŒÂ`ôŒÂ úŒÂ€÷ŒÂÀýŒÂàÂÀýŒÂ€ Â`  ÂÀÂàÂÂÀÂ`& ,ÂÀ/Â@<Â@< E€BÂ`? 9Â@<ÂÀHÂ`?Â`?ÂÀH R ^ÂÀaÂh€tÂ`qÂ`q wÂ`ŠÂ Â š Âà–Âà– Â`£Âà¯ÂÀ¬Â`£Â`£Â€¦ÂÀ¬Â ¶Â`¼Â`¼Âà¯Â ©Â ©Â³ÂÀ¬ÂÀ¬Â@¹Â Ï ÛÂàáÂ`î ô ŽÂþÂ@ŽÂ ŽÂþÂþÂ`ŽÂŽÂ€#ŽÂ€#ŽÂ@ŽÂ@ŽÂ` ŽÂŽÂàŽÂŽÂ ŽÂ€#ŽÂ@ŽÂà,ŽÂà,ŽÂà,ŽÂ`9ŽÂà,ŽÂ &ŽÂ0ŽÂÀ)ŽÂ 3ŽÂ ?ŽÂ@OŽÂ€UŽÂ XŽÂ XŽÂ€UŽÂ€UŽÂ LŽÂ€UŽÂ LŽÂ@OŽÂ`RŽÂ`RŽÂ XŽÂbŽÂ eŽÂ`kŽÂ qŽÂ{ŽÂ€‡ŽÂ`„ŽÂ`„ŽÂ€‡ŽÂ@ŽÂ@ŽÂ ŠŽÂÀŽÂ ŠŽÂ@šŽÂ —ŽÂ`ŽÂ@šŽÂ@šŽÂ­ŽÂ­ŽÂÀ¦ŽÂ@šŽÂ £ŽÂ੎Â੎Â੎ÂÀ¦ŽÂ੎ °ŽÂ­ŽÂ੎Â੎ °ŽÂ °ŽÂ °ŽÂÀ¦ŽÂ@³ŽÂàÂŽÂÀ¿ŽÂÀ¿ŽÂ ¼ŽÂ@ÌŽÂ@ÌŽÂÀ؎ ՎÂàÛŽÂߎÂàÛŽÂàÛŽÂàÛŽÂàÛŽÂ@åŽÂ€ëŽÂ@åŽÂ îŽÂ îŽÂøŽÂ ûŽÂàôŽÂàôŽÂøŽÂ € Âà  € Â Â`ÂÀ#Âà& -Â@0 9Â`3 9 9 9ÂCÂC F F FÂÀU _ _ÂÀU _Â`eÂ@b _€h _ÂÀUÂàXÂàX _€hÂ@{Â`~Â`~ „ÂuÂ`~ÂàŠÂ „ÂŽÂÀ‡Â`~€ŽŽ ‘€šÂ`—ÂÀ ÂÀ Â ªÂÀ Â ªÂ`°Â`°Âà£Â€šÂ@­Â ¶Â ÃÂ`ÉÂ`É ÃÂà¼Â`É Ï ÏÂ`ɠàπ̠ÏÂàÕÂàÕ ÜÂ@ßÂÀë õ õÂò è èÂÀë€å€å èÂòÂò Â`û€þ Âà Âà   €þ Âà ÂàÂ@Â`Âà Âà Âà Âà Âà  Âà Â@*€0€0ÂÀ6Â=Âà9 3Âà9Â@C @ @Â`F L€IÂ`FÂ@CÂ`F Y YÂVÂV Y eÂÀhÂÀhÂÀhÂ`xÂÀh€b e e€b eÂàk rÂoÂ@u ~Âà„Âà„Â@ŽÂ`‘ ‹Â —ÂàÂàÂ`‘¡ —Âà ¤Â@§Â ¤Â ¤Â@§Â °Âà¶Âà¶Â ½Â`àÉÂ`à½Â`à½Â ½Â ½Â °Â€­Â °Â °Â °Â`ÃÂÀÌ â€ßÂ@ÙÂ`ÜÂ@Ù â â€ß ÖÂàϠ֠րߠâ ïÂÀþÂ@ ‘Â@ ‘ ‘Âà‘ ‘Âà‘ÂÀþÂà‘‘ ‘Âà‘Â`õ ï€øÂà‘Âà‘Âà‘ ‘Â`‘Â`‘ ‘ ‘ ‘Â`‘Âà‘Â`'‘Â@$‘Â@$‘Â`'‘‘ -‘Âà3‘Âà3‘Âà3‘Â@$‘ -‘ !‘Âà‘ !‘€*‘ -‘€*‘ÂÀ0‘ÂÀ0‘Â`@‘ÂàL‘ÂàL‘ÂÀI‘ S‘ÂàL‘ _‘Âàe‘ l‘Âàe‘Â@o‘Âàe‘ l‘ l‘€u‘ l‘Âàe‘€\‘€\‘€\‘Âi‘Âàe‘Â@o‘Âi‘ÂÀ{‘‚‘ x‘ l‘Â`r‘ …‘Â@ˆ‘ …‘ …‘Â@ˆ‘Â`‹‘ …‘Â`‹‘Â@ˆ‘Â`‹‘Âà—‘Â`‹‘ …‘ …‘Â@ˆ‘Â`‹‘Â€Ž‘Â ž‘ ž‘Â@¡‘Â`¤‘ÂÀ­‘ ª‘ ·‘´‘Â఑´‘ÂÀ­‘ ª‘Âà°‘ÂÀ­‘ÂÀ­‘´‘€À‘ ·‘Â`½‘ ·‘ÂÀ­‘Âà°‘Â ·‘ÂàÉ‘ÂÍ‘ÂàÉ‘ÂàÉ‘Â`֑€ّ€ّ ܑ БÂÀÆ‘Âàɑ Б БÂ͑€À‘ Ñ€À‘ Ñ Ñ Б€ّ€ّÂ@Ó‘Â@ӑ€ّ ܑ é‘Âàâ‘Âàâ‘Âàâ‘Â@ì‘Âàâ‘ÂÀø‘Âàû‘€ò‘Â`ï‘ õ‘ÂÀø‘Âÿ‘ õ‘€ò‘ õ‘ õ‘Âÿ‘€ ’ ’€ ’ ’ ’Â@’Â`’ÂÀ’€ ’ ’Â`’ÂÀø‘ õ‘Âàû‘ ’Âÿ‘Â`’ ’Â’Â’€ ’ ’ ’ ’Âà’Â’ ’Â’ '’Âà-’Âà-’Âà-’ '’Â@’Â@’ '’ '’ÂÀ*’Â@7’Âà-’ÂÀ*’Â`!’Â`!’Â@’ '’Âà-’ 4’ @’ @’ @’Â`:’ÂàF’ÂàF’ @’Â@7’ 4’ 4’ @’Â@P’Â@P’ M’Â`S’Âc’Âà_’ f’ÂÀ\’Âc’ Y’Â`S’Â@P’ Y’ÂÀ\’ÂÀ\’Âà_’ Y’Âà_’Âà_’ Y’ Y’ Y’Âc’ f’ f’Â@i’Â@i’ f’ f’€o’ r’€o’ r’ r’Âàx’Â|’Â|’Â@‚’Â@›’Â@›’ ˜’ ¤’Âà‘’Â`ž’ ¤’Â`ž’Â@›’Â`ž’ÂÀ§’Â`ž’Â`ž’Â`ž’Â`ž’Â`ž’€¡’ ¤’®’ ±’ ¤’Â`ž’Â@›’ ¤’€¡’ ¤’ÂÀ§’ ¤’ ±’ÂÀÀ’ ½’ ±’Â@´’ÂÀÀ’Â`Ð’Â Ê’Â Ê’ÂÀÀ’ÂÀÀ’ÂÇ’ÂàÃ’ÂÀÀ’Â@͒€Ӓ ֒Â`В€Ӓ ֒ ã’ÂÀÙ’Âà’Âà’Â`é’ ã’ ֒€ӒÂàÜ’Â@æ’ ã’ ã’ÂàÜ’Âà’ÂÀÙ’Â ã’Âà’ ֒ ʒ ֒ÂÀْ ֒ ã’€ì’Â@æ’Â`é’Â@撀쒠ï’Âù’ ï’ ü’€“Â`“ÂÀ “ÂÀ “Â`“Â@ÿ’Âù’ ü’ ü’ ü’ “€“€“ ““Âà“€“€“€“Â`“ “ “Âà“ÂÀ “Âà“Â`“Â`“Â+“€“ !“Â@“ “ .“Â@1“Â@1“ .“€7“ .“Â`4“€7“ :“Âà@“Â@1“ÂÀ=“ G“Â`M“ÂD“ G“ÂD“ÂD“ÂÀ=“Âà@“ÂÀ=“€7“Âà@“ G“Â`M“ÂÀV“ S“ S“ S“Âà@“ G“Â`M“€P“ S“€P“ G“ S“€P“ S“ÂÀV“ `“Â`f“Â@c“ l“ l“Âàr“Â`f“Â`f“€i“ l“€i“ l“Âv“Âàr“Â`f“Â@c“Â`f“ÂÀV“ÂÀV“ l“Â`“ y“Â`“Â`“Â@|“ÂÀˆ“ ’“€›“Â@•“Â`˜““ÂÀˆ“Âà‹“Â@•“Â@•“Â`˜“Â`˜“Â@•“Â`˜“€›““ÂÀˆ“ ’“€›“€›“Â`˜“€›“€›“Âओ «“ ž“¨“ÂÀ¡“ÂओÂओÂÀ¡“ÂओÂओÂ@®“ ·“ÂནÂÁ“ ēÂནÂÁ“Â@Ǔ ·“€´“€´“€´“ ·“ ·“ ·“ÂÀº“Â@Ç“Â`ʓ€͓ÂÀÓ“ÂÀÓ“Â`ʓ ГÂړ Г ГÂ`Ê“Â`ʓ Г ГÂ@Ǔ€͓ ГÂ@à“ ݓÂ@à“Â`ã“ÂÚ“Â`ã“€æ“ÂàÖ“ÂàÖ“Â@à“ÂÀÓ“Â`ã“Â@à“ é“Â`ã“ÂÀì“ é“Â`ã“ é“Â@à“ ݓ ݓÂ`ã“ÂÚ“Â`ã“ÂÚ“ÂàÖ“Âړ ݓ ݓ é“Âàï“ é“ÂÀì“Âàï“Âó“Âó“Âàï“ ö“Â@ù“Âó“ ö“Âó“Â`ü“Â`ü“ ö“Â@ù“€ÿ“Âà” ” ”ÂÀ”€ÿ“€ÿ“ ” ”Âà!”Â`”Â`”Âà” ”€”€”Â`”Âà” ” ”Âà” ”€ÿ“ ” ”Âà” ”Âà”ÂÀ” ”Â`”€”€” ”€”€”€” ¬—Âֵ ¹ÍÂ-ÍÂàR¶Âà«Â ¢Â›Â@p• Â@UÂ_ÂB Â@€•ßÁ€ä¤ÁT!Á”Ž@á¯A€B€QB€uB@¤„BmˆB`|‡B@ƒB@‰yB€ÖiB€tXB€cFBÀ?4B€Œ"BÀøBÀqB€‘èAYÎA€‘¶A¾ A€HŒA{rA¤NAÚ,A[ AÖ@ ”@H#@€Ô>ˆÛ¿PuÀš¿À_ÁÅ#ÁùDÁ_fÁ€ÉƒÁ¢”Á‡¥Á€x¶Á€ÚÇÁÌØÁ€YéÁ€ùÁÀ~Â@¬ €VÂ@wÂ4Â@™#€š( -Â@,1Â@É4€:8€;¿=ÂÀ)@Â@*BÂ@D€ÍEÂjGÂÈH JÂÀ2KÂLLÂ@LMÂ@NÂ@OÂ@ÖOÂ@žPÂ@MQ€éQÂsRÂ@SÂ@ŒSÂÀüSÂÀGTÂÀÄTÂ@5UÂ@²UÂV€gV€ËV€/WÂ@[WÂ@¦WÂ@ñWÂ@‹ÂÀ;‹ÂÀ;‹ÂB‹Â@H‹Â`K‹ÂàW‹ÂÀm‹ÂÀm‹ÂÀm‹Ât‹Âàp‹ÂÀm‹Â w‹Â`}‹Â€€‹ÂÀ†‹Â ƒ‹Âà‰‹Â@“‹ÂࢋÂ`¯‹Â`¯‹Â@¬‹Â@¬‹Â µ‹ÂÀ¸‹ÂÀ¸‹Â@ŋ€ˋÂàÔ‹Â`á‹Â€ä‹Â ç‹Â Û‹ÂÀÑ‹Âàԋ€ä‹ÂÀê‹Âàí‹Âñ‹Â ŒÂ@ŒÂ`ŒÂÀŒÂ ŒÂ`ŒÂ€ŒÂàŒÂ@)ŒÂ€/ŒÂ`,ŒÂà8ŒÂ ?ŒÂ@BŒÂàQŒÂ XŒÂàQŒÂÀNŒÂÀNŒÂàQŒÂ€aŒÂ dŒÂnŒÂ`wŒÂ }ŒÂÀ€ŒÂÀ€ŒÂ }ŒÂ@ŒÂ€“ŒÂ –ŒÂ ŒÂ`©ŒÂ€¬ŒÂ@¦ŒÂ€¬ŒÂ £ŒÂ€¬ŒÂÀ²ŒÂÀ²ŒÂൌ¹ŒÂ@¿ŒÂ`ÂŒÂÀËŒÂàÎŒÂÀˌ Ȍ ՌÂ@ØŒÂ`ی áŒÂ`ôŒÂ€÷ŒÂ îŒÂ@ñŒÂ  Â` € Â@#Â@#Â`&Â`&Âà2 ,ÂÀ/ÂÀ/Â`?ÂàKÂ`?Â`?Âà2 EÂàK ^Â@n€t wÂàdÂ@n k w€t w Â`ŠÂ`ŠÂ@‡Â@‡ÂÀ“Âà– š€¦Â ¶Â€¿Â€¿Â€¿Â Â Ï ÛÂàá Û è è€ñ€ñ ô ô ôÂÀ÷ÂþÂàúÂàú€ ŽÂàŽÂàŽÂ` ŽÂ &ŽÂ` ŽÂ &ŽÂ` ŽÂ0ŽÂÀ)ŽÂ0ŽÂÀBŽÂ LŽÂÀ[ŽÂÀ[ŽÂ€UŽÂÀ[ŽÂ LŽÂ€UŽÂ XŽÂ€UŽÂbŽÂ`kŽÂ`kŽÂbŽÂ`kŽÂ€nŽÂÀtŽÂ€nŽÂ qŽÂ€nŽÂ`kŽÂ qŽÂ ~ŽÂàwŽÂàwŽÂ ŠŽÂ —ŽÂ@šŽÂ £ŽÂ­ŽÂ °ŽÂ@³ŽÂ€¹ŽÂÀ¿ŽÂÀ¿ŽÂ`¶ŽÂ ¼ŽÂ€¹ŽÂ€¹ŽÂ ÉŽÂ`ÏŽÂ`ώ€ҎÂÀØŽÂÀØŽÂ`ÏŽÂàÛŽÂ@åŽÂ âŽÂߎÂàێ îŽÂÀñŽÂ ûŽÂ`€Â`ÂÀ ÂÀ  ûŽÂ@þŽÂ`Â@þŽÂà     -Â@0Â*€6€6Â`3€6 9 F FÂCÂ`LÂCÂ`L RÂÀUÂàXÂ@b€h _ _€OÂàXÂ\Â@bÂ\Â`eÂàqÂàqÂuÂ`~ xÂ`~ „ÂŽÂ ‘ ‘Â`—ÂàŠÂ`— § ¶Â ¶Â@­Â§Âà£Âà£Â§Â€³Â àÃÂÀ Ï ÜÂÙÂÀÒ ÏÂàÕÂÀҠπ̠πÌÂàÕÂ`âÂ@ßÂÀëÂÀëÂÀëÂ@ßÂò€å€å õÂ@øÂ Â@øÂ`ûÂÀÂ`û Âà ÂÀÂÀÂà   Â`Â@   €  Â@Â@€ €ÂÀ   'Â`- 3Â=Âà9€0ÂÀ6 3 3ÂÀ6Âà9 @Âà9Â@C€I€IÂ`FÂÀOÂàRÂ@C L€IÂÀO LÂÀhÂàk e YÂ@\ YÂ`_ YÂ@\€bÂÀhÂ@uÂ`x r€{Â@uÂ@uÂoÂ@uÂ`x ‹ÂˆÂ`‘Âà —ÂÀšÂ¡Â€­Â@§Âà€­Âà ¤Â`ªÂ@§Â@§Â@§Â ¤Â ¤Â€­Â`à½Âà¶Â ½Â€ÆÂ€ÆÂÓ ÖÂàÏÂàÏ ÖÂÓÂÓÂàÏÂ`ÜÂ`ÜÂ@ÙÂ@ـ߀ߠâ â€ß€ßÂìÂìÂì€øÂ@ò€øÂ€øÂ€øÂà‘Âà‘ ‘Â`‘Âà‘Â@ ‘Â`‘Â`‘Â`‘€‘Âà‘€‘Âà‘€‘€‘Âà‘Âà‘ÂÀ‘ÂÀ‘Âà‘Â@$‘ -‘Â7‘Â7‘Â@=‘€C‘€C‘€C‘ :‘Â`@‘ÂÀI‘Â@V‘ S‘Â`Y‘ÂP‘ÂP‘Â`@‘Â`@‘Â`@‘€C‘ÂàL‘ S‘ÂÀb‘ÂÀb‘ l‘ l‘Â@o‘ l‘Âàe‘Â@o‘ l‘Â@o‘Â`r‘ x‘ÂÀ{‘ …‘Âà—‘ÂÀ”‘Â`‹‘Âà~‘ …‘ x‘ l‘Â`r‘Âà~‘ÂÀ{‘ …‘ÂÀ”‘Â@¡‘ ž‘€§‘€§‘Â`¤‘ ž‘€§‘Â`½‘Â`½‘ ÑÂ@º‘ ·‘ ·‘ ·‘´‘Â`½‘ ·‘€À‘Â`½‘ ÑÂàÉ‘Âàɑ€À‘Âàɑ€ّÂÀß‘Âæ‘Â@ì‘ é‘Â@ì‘Â`ï‘Â@ì‘ é‘ é‘ é‘ é‘Âæ‘ é‘Â`ï‘€ò‘ é‘Â@ì‘Â`ï‘Â`ï‘Âÿ‘Â`’ ’Âÿ‘Â@’Â`’ ’Â@’ ’Â@’ '’ '’Â@’€$’Â’ÂÀ’ ’ ’ ’ ’€$’Â1’Â@7’Âà-’ 4’Â@7’Â`:’ÂÀC’ÂÀC’ÂàF’ M’Â@P’ÂàF’ÂÀC’ÂJ’ M’ M’ M’ M’ M’ Y’ Y’ÂÀ\’Âc’ Y’ M’ Y’Âc’Â`l’ f’Â@i’€o’€o’Âàx’ r’Â`…’€ˆ’Â`…’ ’Â|’Â@‚’Âà‘’Â`…’Â@‚’ ’Â`…’ ’Â|’ÂÀu’Â@‚’ ’Â|’€ˆ’ ‹’€ˆ’Âà‘’Âà‘’Â ‹’ ˜’ ˜’ ˜’ ¤’ÂÀ§’Â઒Â@´’Â@´’Â@´’Â઒®’€º’Â`·’ ±’®’ ¤’ ¤’®’ ±’Â`·’ ½’ÂÇ’Â@Í’ÂàҀº’ÂàÃ’ÂÀÀ’Â`Ð’ÂÇ’ÂàÃ’ÂàҀº’Â@Í’Â`Ð’ÂÀÙ’ÂàÜ’Â@æ’€ì’Â`é’€ì’Â`é’ ï’Â@撀쒠㒠ã’Â`é’ ï’ÂÀò’ ï’ ï’ ï’ ã’ ã’Â`é’Âàõ’ ü’ÂÀò’€ì’€ì’Â`é’Âàõ’Âàõ’ ü’ “ “ “Âà“Âà“ÂÀ “ “Â`“ “ !“ !“ÂÀ$“ !“Âà'“€“Â`“€“Â@“Â`“ !“Âà'“ÂÀ$“ :“Âà@“ÂD“ G“ G“ÂD“Âà@“ÂD“ G“ G“ÂD“ :“Âà@“ G“Âà@“Â`4“ :“ÂD“ÂD“ G“Â`M“ G“Â@J“Â@J“ G“€P“Â@c“ `“ÂÀV“ÂàY“Â]“ l“ `“Â`f“€i“Âàr“ÂÀo“Âàr“Âàr“€i“Â@c“ÂÀo“€i“ l“Â@c“ÂÀV“ S“ÂàY“ `“ÂàY“ `“ÂÀV“ÂàY“€i“ `“€i“Âàr“Âàr“ÂÀo“ÂÀo“Â`f“ÂÀo“Âàr“ÂÀo“Â`“ y“ y“ y“ y“Â`“Âv“Â`“Â`“Âv“Â@|“€‚“ …“““Â`“ …““Âà‹“Âà‹“Â“Â ’“Â`˜“ ž“Â`˜“Â@•“Âà‹“Â ’“¨“€›“ÂÀ¡“€›“ÂÀ¡“ «“ «“ÂÀ¡“ÂओÂओ€›“ ž“ÂओÂÀ¡“ ’“ ž“ÂÀ¡“ «“¨“ÂओÂ`˜“ ž“ÂÀ¡“Âओ «“Â`±“ «“€›“ ž“¨“Â`±“€´“ ·“ ·“ÂÀº“ ·“ «“€´“ «“¨“ ·“ÂནÂནÂན ·“ ·“Âན€͓€͓Â@Ç“Â@Ǔ ēÂ`ʓ€͓ÂÀӓ€͓ ГÂ@Ǔ€͓ ГÂàÖ“ÂàÖ“Â@à“Â@à“Âړ ГÂÀÓ“ÂàÖ“ÂÀÓ“ÂàÖ“ÂÚ“Âà֓ ГÂÚ“Âړ ГÂàÖ“Âà֓ ГÂÀÓ“Â@à“ÂÀì“Â@ù“Â@ù“ ö“ é“ÂÀì“ é“ é“Â`ã“ ݓÂ`㓠铀擀æ“Âàï“Â`ü“Âà” ”Â@”Â@”Âà”Âà” ”€” ” ”Âà” ” ” ” ” ”€” ” ”Â`.”Â@+”Â@+”Âà!”Â@+” ”Âà!”Âà!” ” ”€”Â@”ÂÀ”Â%” 4”ÂÀ7”Â@D” A” A”Âà:” A”Â@D”Â`G”€J” A”€J”ÂÀP” M” M”Â`G” M”ÂÀP”ÂàS”ÂàS”Â``”€c”ÂÀP” M”Â`G”€J”Â>” A”ÂàS”€J”ÂàS”Â`G” M”ÂàS”Â``” Z”ÂàS” M”Â@]”ÂW” Z”ÂàS” f”Âàl” s” s”Âp”Âàl”Âp”Â`y”Â`y”Âàl” f”Âàl” f”Âp” f”Âp”€|”ÂÀ‚” ”Âà…”Â ”ÂÀ‚” ”Â`y” s” s”Âàl”Âp”Â@v”€|”Âàl”Â@v”Â`y”ÂÀ‚”Âà…”Â@”Â`’”Â@”‰” Œ”‰”ÂÀ‚” ” ” Œ”Âà…”Â@v”€|”€|”Â@” Œ”ÂÀ‚”Â`y”Â`y”Âà…”Â€|” s”€|” ”€|” ”Âà…”Â ” Œ” Œ” Œ”Âà…”Â‰”Â@” Œ”‰” Œ”€•” ˜”‰” Œ” Œ”Âàž”Â@¨”Â@¨”¢” ˜” ˜” Œ”Â@” Œ” Œ”Â`’”Â@” ˜”Â@” Œ”Â`’”Â`’”Â`’” Œ”€•”¢”Â`«”Â`«”ÂÀ´”¢” ˜”€®” ±” ±” ¾”Â@Á” ±”Â@¨”¢”Â`«”ÂÀ´”Â`«”Â`«”€®” ±” ¥”¢” ¥”ÂÀ´” ±”Âු ¾” ±” ¾” ¾” ¾”ÂÀ´”»” ¾”€ǔÂàД ʔ€ǔÂ`Ä”Â`Ä”Â`Ä”Â@Á” ʔÂ`Ĕ ±”€®” ±”Â`Ä”Â`Ä”Âà·”Âු»” ¾”ÂÀ´”Â`«”Â`«”Âà·”ÂÀ´” ±” ±”Â`Ĕ ¾” ¾”Â@Á”ÂÀ´”Âු»”Âු»”»” ʔ ¾”Â`Ä”Â`Ä”Â@Á” ¾” g˜Â ­¶Â€~΀ÏÍÂàÏÂÂÀ~¶Â ˜«Â²¢Â€›Â ö•ÂÀ¬ÂÀ;VÂlÂ@IÂê€<òÁ€½ÁáaÁ0r¿R}AÀFBþ?B€ÖiB`‡BZ‡B€ã‡Bž„BÀd}B/nB@]B€,KBA9BÀ¿'B€íB€BOñA€€ÖA¿½AI§A€¡’AFA [AÄ8A,A²í@Ú¬@ÌX@¯?/¿„2À¤œÀÈáÀDÁ…6Á­YÁŠ|Á€Á€˜ Á€¯±Á€”ÂÁ€GÓÁŠãÁ€6óÁ@RÂ@¾Â@­€%ÂÀ Â@¾!Âå&ÂÀ§+ÂÀÁ/ÂÀw3€Ã6ÂÀÐ9ÂÀs<ÂÒ>Â@å@Â@ÙBÂÀŽD€1FµGÂÀ IÂÀQJÂkKÂ@„LÂ@—M‹NÂSOÂPÂÊPÂÀrQÂ@RÂ@«R€GSÂÀÊSÂNT€×TÂ@5UÂÀ¾UÂVÂÀmV€ËVÂ@)WÂ@tWÂÀ²WÂÀËWÂÀX€[XÂ@ XÂÀÅX€ñXÂ@6YÂÀtYÂ@šY€¹Y€ëYÂZÂCZÂÀnZÂÀ ZÂ@ÆZÂ@øZ€0[ÂÀO[ÂÀ[¡[¡[ÂÓ[Â@ò[€\Â7\Â@V\Â@o\Â@¡\ÂÍ\Â@]ÂÀ*]Â@P]Âc]Â@‚]Â@›]Â@Í]Â@ÿ]ÂÀ ^ÂÀ$^ÂÀ=^Â@|^€‚^Â@®^Â@Ç^ÂÚ^ÂÀ_Â@_Â>_€c_ÂÀ›_ÂÀ›_€Ç_Âí_Â`Â@W`€v`µ`ÂÎ`Â@í`ÂÀ+aÂÀDaÂÀ]aÂ}aÂ@œaÂÈaÂÀóaÂbÂ,b€8bÂÀWbÂ@}bÂ@¯bÂ@ÈbÂ@Èb€çb cÂÀ8cÂ@^cÂÀƒc£c¼cÂ@ÛcÂ@ôcÂÀdÂ9dÂÀ2dÂRdÂ@Šd€ÂdÂÀádÂeÂÀeÂ3eÂ@ReÂÀweÂÀeÂ@¶eÂÀÛeÂÀôe€f€ fÂFf€kfÂ@—fÂÃf€èfÂ@âf€g€3gÂ@_gÂÀ„g¤g€ÉgÂ@õg€h€-hÂÀ3hÂÀehÂlh€xhÂ@¤h€ÜhÂÀûhÂ4iÂ@SiÂ@SiÂ@li˜iÂÀªiÂ@·iÂ@Ði€ïiÂüiÂÀ'jÂ`j€…jÂÀ¤j€·jÂ@±jÂÝjÂ@üjÂÀ!kÂ(kÂ@.kÂÀSkÂÀ…kÂÀžk¾kÂ@ÝkÂ@ökÂ@(lÂÀMlÂmlÂ@ŒlÂ@¥lÂ@¾lÂ@ðlÂ@ mÂ5mÂÀ`mÂgmÂgmÂÀ’mÂ@ŸmÂ@ÑmÂÀömÂÀn€"n€;n€TnÂÀsn€†nÂ@™nÂ@ËnÂ÷nÂ@oÂÀ"oÂÀ"oÂ@aoÂtoÂÀ†oÂÀŸo¦oÂ@ÅoÂØo€äoÂÀêoÂ@pÂÀ5pÂÀ€pÂÀ™pÂ@¿pÂ@ØpÂÀýp€qÂÀ/qÂÀaq€qšqÂ@¹qÂåqÂÀ÷qÂ@r€#rÂ@OrÂÀ[r€nrÂ{rÂ@šrÂ@³rÂ@ÌrÂ@årÂ@sÂ*sÂÀyÂÀJyÂQyÂ@pyœy€¨y€ÁyÂ@íyÂzÂ@8zÂÀ]zÂ}zÂ@ƒz–z–zÂÀ¨zÂ@µz€Ôz€ízÂ{ÂÀ%{€8{Â^{Â{Â@¯{Â@È{€Î{ÂÛ{Â@á{Â@ú{Â@|ÂÀ|Â@,|Â@E|€d|Š|ÂÀµ|€á|€ú|Â@ }Â@&}Â@?}€E}ÂÀK}Â@q}„}ÂÀ–}€©}€Â}Â@î}ÂÀ~Â@ ~€&~€?~€X~ÂÀw~€Š~Â@~€¼~€Õ~€Õ~Â@Ï~€î~ÂÀ ÂÀ Â@3ÂÀXÂ@eÂ@~Â@—ÂÀîÂÀ€Â €Â€€ÂÀ€Â #€Â /€Âà5€Â H€ÂÀK€ÂàN€Â`[€Â a€Âàg€Âà€€Â ‡€Âà™€Â€©€Â@¼€Âàˀ€ۀÂàä€Â`ñ€Â@î€Â€ô€Â ÷€Â€ ÂÀ   ) 6 O OÂ@RÂeÂÀw €ŠÂà“Â` Â ¦Â@¶ÂàÅ€ÕÂâ ñÂÀô þ  ‚ ‚ ‚ #‚ #‚Â@3‚Â`6‚ÂF‚ I‚€R‚ b‚ÂÀq‚Âàt‚ {‚ ‡‚€‚  ‚ÂÀ£‚Âংª‚ ¹‚ ҂ ҂ ߂ ߂Â`å‚ ë‚ ë‚ ø‚Âà ƒÂà#ƒÂ`0ƒÂÀ9ƒÂà<ƒÂ@FƒÂ OƒÂYƒÂÀkƒÂànƒÂ`{ƒÂÀ„ƒÂà‡ƒÂ ŽƒÂ€—ƒÂ€°ƒÂ€°ƒÂ@à̃Â`߃ òƒÂ òƒÂ òƒÂÀ„„Âà„„€„ „Â!„ $„ 0„ =„ I„Â@Y„ÂÀe„€x„ ˆ„Â`Ž„Â€‘„ ¡„Â`§„Â`§„€ª„Â`À„ÂÀɄ ƄÂ@ք ߄Âàå„ ì„ÂÀû„€… … *…Âà0… 7…€@…€@…ÂÀF… P… P…Â`V… i…€r…Â… ‚…Â`ˆ… ›… ›…Â@ž…Âà­…Â ´… À…ÂÀÅ À… ͅ ͅÂàß…Â@é… ÿ…  †Â`†Âà*†Â.†Â 1†Â€:†Â =†ÂàC†ÂàC†ÂG†Â V†Âà\†Â o†Â o†Ây†Âàu†Ây†Âàu†Âàu†Âàu†ÂÀ‹†ÂàŽ†Â`›†Â ®†Â৆€·†Â º†Â`͆ džÂƀІÂ`æ†Â ì†Â`ÿ†Â‡Â ‡Â@‡Â€‡ÂÀ!‡Â ‡Â ‡Â€4‡Â D‡Â D‡Â 7‡Â`J‡ÂÀS‡ÂàV‡ÂZ‡Â€f‡Â v‡Â v‡ÂÀ…‡Â€‡ÂÀ…‡ÂÀ…‡Âàˆ‡Â@’‡Â ¨‡ÂÀ·‡Âງ Á‡Â`LJ ڇÂ`à‡Â`à‡Â`à‡Â€ã‡Âàì‡Â ó‡Â`ù‡Â ó‡Â ˆÂàˆÂ`+ˆÂà7ˆÂ >ˆÂ JˆÂ JˆÂàPˆÂ`]ˆÂÀfˆÂ pˆÂ |ˆÂ |ˆÂ@ŒˆÂ ¢ˆÂ€’ˆÂ •ˆÂ ¢ˆÂŸˆÂ ®ˆÂ¸ˆÂ »ˆÂ ÇˆÂÀʈÂ@׈ÂшÂ@׈Â@ðˆÂàÿˆÂàÿˆÂ` ‰Â@ ‰Â ‰Â€‰Â€‰ÂÀ‰Â ‰Â ‰Âà‰Â@"‰ÂÀ.‰Â 8‰Â@;‰Â@;‰ÂàJ‰Â Q‰ÂN‰Â`W‰Â`W‰Â ]‰Â ]‰Â€s‰Â€s‰Â€s‰ÂÀy‰Â`‰‰Â€Œ‰Â`‰‰Â@Ÿ‰Â@Ÿ‰Â ¨‰Â`»‰Âàlj ΉÂàà‰Â ç‰Âä‰Â ó‰Âàù‰Â ŠÂ ŠÂ€ ŠÂ  ŠÂÀŠÂàŠÂ  ŠÂ ŠÂŠÂ/ŠÂ >ŠÂàDŠÂàDŠÂ`QŠÂ WŠÂ WŠÂaŠÂ dŠÂ`jŠÂÀsŠÂàvŠÂ pŠÂ€mŠÂÀsŠÂ€†ŠÂ“ŠÂ“ŠÂ ‰ŠÂ –ŠÂ ¢ŠÂÀ¥ŠÂ@²ŠÂ`µŠÂ ¯ŠÂ@²ŠÂ`µŠÂàÁŠÂ ÈŠÂ`ΊÂ`Ί ԊÂ@äŠÂ`çŠÂ€êŠÂÀðŠÂ`çŠÂÀðŠÂ íŠÂàóŠÂ@ýŠÂà ‹Â ‹Âà ‹Â ‹Â ‹Â)‹Âà%‹Âà%‹Â`2‹Â€5‹ÂÀ;‹ÂÀ;‹Â€N‹ÂàW‹ÂàW‹Â[‹Â[‹Â ^‹Â j‹Â€€‹ÂÀ†‹ÂÀ†‹Âà‰‹Âà‰‹Â`–‹Â`–‹Â¦‹Â ©‹Â@¬‹Â ©‹Â ©‹Â@¬‹Â µ‹Â ‹ ΋¿‹ÂÀ¸‹Â@Å‹ÂØ‹Â€ä‹Â ç‹Â€ä‹Â€ä‹Â ç‹Â ç‹Â ç‹Â€ä‹Â ŒÂ ŒÂ ŒÂ€ý‹ÂÀŒÂ@ŒÂ@ŒÂ`ŒÂ`ŒÂ ŒÂ &ŒÂ€/ŒÂ ?ŒÂ ?ŒÂ ?ŒÂÀNŒÂ KŒÂ KŒÂ€aŒÂ€aŒÂÀgŒÂ qŒÂ qŒÂ qŒÂ`wŒÂ`wŒÂ`wŒÂ qŒÂàƒŒÂÀ€ŒÂ€“ŒÂ –ŒÂ`ŒÂ ¯ŒÂൌ¹ŒÂ¹ŒÂ@¿ŒÂàΌ Ռ Ȍ ¼ŒÂ€ÅŒÂ ÈŒÂ@ØŒÂÒŒÂ`ÛŒÂ@ØŒÂÀäŒÂ€÷ŒÂ úŒÂ ÂàÂÂ@ ÂàÂàÂ@ ÂàÂ`    ,Âà2ÂÀ/Â@< EÂ@<Â6Â`? E EÂàKÂ@UÂ@n w „€t€tÂ@nÂ`qÂÀz kÂà}Âà} „ „Â@‡Â Â`ŠÂÀ“Âà–Â@ Â`£Â`¼Â Â€¿Â Â ¶Â ¶Â ¶Â`¼Â Ï ÏÂÀÞ ÏÂàáÂ@ëÂ`îÂÀ÷ ô ŽÂ ŽÂ€ ŽÂàŽÂ`ŽÂ ŽÂ  ŽÂ@ŽÂ &ŽÂ 3ŽÂ@6ŽÂ`9ŽÂ€<ŽÂ 3ŽÂ@6ŽÂà,ŽÂ0ŽÂàEŽÂ`RŽÂÀ[ŽÂ eŽÂ@hŽÂ eŽÂ XŽÂà^ŽÂbŽÂ€nŽÂ€nŽÂÀtŽÂÀtŽÂ@ŽÂàwŽÂàwŽÂ ~ŽÂàŽÂ”ŽÂ`ŽÂ`ŽÂ —ŽÂ —ŽÂ@šŽÂ —ŽÂ £ŽÂ­ŽÂ °ŽÂ °ŽÂàÂŽÂ`ώ Վ€ҎÂàÛŽÂߎÂÀØŽÂàێ€ëŽÂ€ëŽÂ€ëŽÂ@åŽÂ îŽÂ îŽÂàôŽÂ îŽÂ`èŽÂ îŽÂ ûŽÂ€€ Âà  Âà ÂÀ Â@Âà  Âà& -Â@0Âà?ÂÀ<Âà?Â`3Â@0ÂÀ<Âà? F F FÂ\Â@b€h k€h _ kÂÀn kÂ`e kÂàqÂ@{Â@{€ „ÂàŠÂ`— Â@”ÂÀ Âà£Â ªÂ§Â@­Â ªÂ`°Â€³ÂÀÂà¼Â ¶Â ÃÂ`ÉÂ@ÆÂ`É ÃÂÀÒ ÜÂ`ÉÂÀÒ ÜÂ`â Ü èÂàî õÂ`û ÂàÂàÂÀÂà €þÂà  ÂÀÂà ÂÀÂ@€ ÂÀÂ` Âà €0Â`- 3Â@*Â`-Â`-ÂÀ6Â=Â`FÂ`F L YÂàRÂVÂÀO LÂàRÂàRÂVÂÀO YÂ`_€bÂàkÂ`_ÂàkÂo r€{ r r rÂo rÂ`x ~Âà„Âà„Â`‘ ‹Â —Â`‘Â@ŽÂ€” — —Â`‘ÂÀšÂàÂ@§Â@§Â€­ÂºÂà¶Â@ÀºÂà¶Â °Âà¶Â ÉÂàÏÂ@Ù â â âÂÓ ÖÂ`Ü Ö Ö âÂì€øÂÀþÂ@òÂ`õ ûÂÀþ û€øÂ û û ûÂÀþÂ`‘‘Â`‘€‘Â`‘Â`‘Âà‘‘Â`'‘Â`'‘ !‘Â@$‘ !‘‘ ‘Âà‘‘Â`'‘ -‘Â7‘€C‘ F‘ÂàL‘ F‘ÂÀI‘ÂP‘ÂP‘Â`Y‘ S‘ÂàL‘ F‘Â@V‘€\‘ _‘€\‘ _‘Â`Y‘Âàe‘ l‘ l‘Â@o‘ x‘€u‘Â@o‘€u‘€u‘€u‘Â@o‘ÂÀ{‘Âà~‘Âà~‘‚‘Âà~‘‚‘ ‘‘Â`‹‘‚‘ x‘ …‘ …‘Â`‹‘ …‘ ‘‘›‘ ž‘ ª‘Â఑´‘ ·‘ ·‘ Ñ БÂÀÆ‘Âàɑ Ñ ÑÂàÉ‘ÂàÉ‘ÂÀÆ‘Âàɑ БÂàÉ‘ÂàÉ‘Âàɑ Ñ Ñ ÑÂÍ‘Â@ӑ Б БÂ@ӑ€ّÂÀߑ ܑÂàâ‘Âàâ‘Âàâ‘Âæ‘ÂÀߑ é‘ õ‘ é‘€ò‘Âàû‘ ’€ ’€ ’Â`’ ’ ’€ ’ ’Â`’Â@’Âàû‘Â`’€ ’Â`’ ’Âà’ ’Â’ ’ ’ ’ÂÀ’Âà’Âà’Âà’Â@’Â@’Â`!’ '’ 4’ 4’Â`:’ÂJ’ÂJ’ÂàF’ÂàF’Â@P’ M’€V’Â`S’Â`S’ÂÀ\’Âà_’Âc’ f’Âà_’Â`l’ f’€o’Âc’Âà_’ f’ÂÀu’ÂÀu’Â|’Â|’Â|’ÂÀu’€o’ r’Â`l’Âàx’ ’Â@‚’ ‹’ÂÀŽ’Â ‹’€ˆ’Â`…’Âà‘’Â ˜’ÂÀŽ’Âà‘’Â€¡’€¡’ ¤’ ˜’ ˜’Â`ž’ ˜’€¡’ ˜’Âà‘’Â ˜’ ˜’€¡’Â઒ ±’ÂÀÀ’ÂàÒ ʒ ½’€º’Â`·’Â`·’€º’Â@´’®’Â઒Â@´’ ʒ ֒ ã’Â@æ’ÂàÜ’ÂÀÙ’ÂÀْ ֒ÂÀْ€Ӓ€ӒÂàÜ’Â ã’Â`é’Â`é’ ã’ ã’Â`é’ ã’Â@æ’Âàõ’Â@ÿ’Â`“ “ÂÀ “ ü’€“ “ÂÀ ““Âà“Âà“ÂÀ “Â@“Â+“Â`“€“ÂÀ$“Â+“Â`4“Â+“Â`“ !“ !“ÂÀ$“Âà'“Âà'“Â+“ .“ !“Â@1“Âà@“ G“Âà@“Â`M“ S“ G“ :“€7“ G“Â`M“ G“Âà@“ :“ :“ÂÀ=“Â`M“Â`M“ÂàY“ÂàY“ÂàY“Â]“ `“ÂàY“ S“Â`M“ G“ S“ÂàY“Â@c“€i“Â`f“Â@c“Âàr“ l“Â`f“Â@c“Âàr“€i“Âàr“Â@|“ …“Â`“Â@|“€‚“ y“ y“€‚“ y“Â@|“Â`“ y“ l“ÂÀo“ y“ …“ …“Âà‹“Â“Â`˜“ ž“ÂÀ¡“ÂओÂ@•“€›“ ž“ «“€´“ÂओÂ@®“¨“ ž“¨“ ž“Âओ «“Â`±“ «“ÂÀ¡“ «“ÂÀ¡“Âओ€´“ ·“€´“ÂÁ“ ēÂ@Ǔ€͓€͓€͓ Г€͓ Г ГÂà֓ Г Г ГÂ`ã“€æ“Â`ã“Â@à“Âà֓ Г ГÂÚ“Â`ã“ÂÀÓ“Âړ€æ“ ö“ é“ÂÀì“ÂÀì“Â`ã“ é“€æ“Â`ã“€æ“Â@à“ é“€æ“€æ“ ö“ ö“Â@ù“€ÿ“ ”Â@”ÂÀ”ÂÀ”Âà”€ÿ“ ”Âà” ”Âà” ” ” ” ”€”Â@”Âà”ÂÀ”Âà”ÂÀ”Â@” ”Â`” ” ” ” ”ÂÀ”€” ” ” ”€”ÂÀ”Âà!”ÂÀ”ÂÀ” ” ”Â`.”€1” 4”Â`.” (” (” (”Âà!”ÂÀ”Â%”Â%” (”Â%”Â`.”€1”€1” 4”€1” 4” A” A”Â`G”Â>” A”Â`G”ÂÀ7” 4”€1” 4” A” A”€J”Â>”ÂÀ7”Âà:”Âà:”Â>”Â`G”Â>”Â`G”Âà:”ÂÀ7”Â>”€J”€J”€J”Â`G”ÂÀP”ÂàS”ÂàS” Z”ÂW”ÂW”ÂàS” M”ÂàS”ÂàS”ÂW”ÂàS” Z” Z”ÂÀP”ÂàS”ÂàS” M”ÂÀP”ÂàS”ÂàS”ÂàS” Z” Z”Â@]” M” M” M”ÂW”ÂàS”ÂàS”Â``”ÂàS” Z”Â@]”ÂàS”€c” Z” Z” f”Âp” s”Âp”Âàl”Âp” s”Âàl”Âàl”Âàl”Âàl”ÂÀi”€c”€|”Â`y” s”Âàl”Âp”Âàl”Â@v”Â`y”Â`y”Âp”€|” ”Â`y”Â`y”Âà…”Â`’”Âàž”Â Œ”Âà…”Â`’”Â@” ˜”ÂÀ›” Œ” ” s”Âàl”Âp”€|”€|”Âà…”Â Œ”Â`’” Œ”‰” ˜”Â@”Â@” ˜”Â`’”Â`’”‰”Âà…”Âà…”Â`’”Â`’”Â@” ˜”€•” ˜”€•”Â`’”€•”€•” ˜”Â`’”€•” ˜” ¥”ÂÀ›” ¥”€®” ¥”ÂÀ´”Â@¨”€®”€®”Â`«”Â`«”€®”€®” ¥”€®”Â`«”€®”Âු»”Âු ¾”€ǔ€ǔÂÀ͔€ǔÂ@Á” ¾” ¾” ¾”€ǔÂ`Ĕ€ǔ ʔÂÀ͔ ʔÂàДÂàДÂàД הÂàДÂ`Ĕ ¾” ʔÂÀÍ”ÂàД ʔÂÔ”ÂÔ”Â@ڔ ã”ÂÀæ” ã”€à” ã” ã”Â@Ú”Âàé” ð” ð”Âàé” ð” ü” ü”•Âí”Â@ó”Âí”Âàé”ÂÀæ”ÂÀæ”Âàé”Âàé”Âàé”Â@ó” ð”Â@ó”Â`ö”Â@ ••Âà•ÂÀÿ” ü”€ù” ü”€•Â`• ü”Â`ö”Âà• • • • •Â`•Â`•Â`•Â`• •ÂÀ• "•Âà•• "•Â`(• "•Âà•••Â`(•Â@%•Â@%•• "•••Â@%•ÂÀ1•Â8• ;•Â`A•Â`A• ;•Âà4•€+•Â@%••Âà•Â@%•Â`(• .•Â`(•Â@%•Â@%•€+• .•Â`(• .•Âà4• .•Â8•Â8• ;• G•€D•ÂàM•ÂÀJ•Â`A• G•ÂàM• ;• ;•Â@>•Â`A•Â8•ÂÀ1•Âà4• ;•Â@>• ;•Â8• ;• ;•Â`A• ;•Â8•Â`A•€D•€D•€D•Â@>•Â`A• G•ÂàM• G• G•Â`A•€D•Â`A• G• G•€D• G• G•ÂQ•Â@W•€]•€]•Â`Z•€]•€]•ÂÀc•ÂàM•ÂQ•ÂàM• T•ÂàM• T•Â`Z• T• T• T•ÂàM•Â@W•€]• T• `•Â`Z•ÂàM•ÂàM• G•ÂàM•ÂàM•€D•ÂQ•€D•Â`A•€D•ÂàM• G•ÂàM• G•€D•Âî˜Â C·ÂÏÂ`bÎÂÀ{à·Â`4¬Â`8£Âà#œÂ€‰– ŽÂ#W€ÖÂÀuÂ@þÂ@耒ÓÁߎÁpÆÀ®AäÔA€*B@IZB€vyB€õ„BZ‡B€Y…B€^€BßrB€œbB€QB€?B@]-B€eB€z B€ûA»ßA>ÆA¯A€Û™AG†A:hA FAÒ%A`AÍ@þ@°@ÀÁ>¨Þ¿´uÀ6¿ÀÉÁz#Á•DÁfÁ€âƒÁ€|”Á ¥Á€3µÁDÅÁ€TÕÁ€ôäÁ€0ôÁ@RÂ"ÂÀ¦Â@óÂÀÛ€M €a%ÂÀþ)Â@W.€E2Â@ª5ÂÀÖ8€Œ;€ý=€#@ÂÀBÂÀßCÂÀoE€àFÂÀDHÂwIÂ@©JÂÀ¯KÂ@„LÂ_MÂ@N½N€_OÂ@ïO€‹P€QÂÀ‹QÂ@ãQÂsRÂ@öRÂ@sSÂTÂ@TTÂ@ŸTÂýTÂ@gUÂÅUÂ@ýUÂÀTVÂ@“V¦VÂ@ÅVÂ@÷VÂÀWÂ@[WÂ@WÂ@¦WÂëWÂ@ XÂ@UXÂÀzX€X€¿XÂÀ÷XÂ@YÂ@6Y€nYÂÀ¦YÂÀØY€ZÂÀ{ÂÀW{€ƒ{Â{ÂÀ»{ÂÀÔ{€Î{ÂÀÔ{€Î{Âô{Â@|ÂÀ|€2|Â@E|Â@^|Â@w|€–|ÂÀµ|ÂÕ|ÂÀç|Â@ }ÂÀ2}€E}ÂR}Â@q}„}Â@Š}€}Â@¼}€ô}ÂÀ~ÂÀ~Â@ ~€?~ÂL~Âe~Â@„~Â@¶~Â@¶~ÂÉ~ÂÀÛ~ÂÀÛ~Â@è~ÂÂ-ÂÀ&ÂÀXÂÀq‘‘Â@°ÂÃÂ@âÂ@ûÂ@ûÂ@ €Â €Âà€Â €ÂÀ2€Â@?€Â <€Â H€Â U€Â€^€Â n€Â n€Â€w€Â “€Â  €Â ¬€Â ¹€Â ¹€Â Å€ÂàË€ÂÀá€Â`ñ€ÂÂà€&Â3€&Âà/ÂàH€XÂÀ^ h t  €ŠÂ Â` Â°Â@¶Â`¹Â Ì åÂÀôÂà÷  ‚Âà‚€ ‚ #‚ #‚Âà)‚Â`6‚ÂF‚ I‚Â_‚Â`h‚Âàt‚ ‡‚  ‚ÂংÂ@°‚Â@°‚ ­‚ ¹‚ ƂÂÀÕ‚Â ß‚Â`å‚€è‚Âàñ‚€ƒÂ@û‚ÂÀƒÂ ƒÂ ƒÂà#ƒÂ€3ƒÂ@ƒÂ 6ƒÂ@ƒÂàUƒÂ`bƒÂ hƒÂ hƒÂ@xƒÂ`{ƒÂÀ„ƒÂ ŽƒÂÀƒÂà ƒÂ`­ƒÂ½ƒÂ ÀƒÂ`ƃÂÀσÂ`߃ÂàëƒÂ òƒÂ òƒÂ€ûƒÂ „Â`„€„Â`*„€-„Âà6„ÂàO„€_„Âàh„ o„ {„Â`u„ ˆ„Âà„ ”„ž„ÂÀ°„ÂÀɄ€Ä ӄ€܄Âàå„Â`ò„€õ„Â… … …Âà… …Â`$… 7…Â@:…€@…ÂàI…€Y…Âf…Â`o… i…Â`o…Â`o… i…Â@……ÂÀ‘…Âà”…Â`¡… ´…Â`º…ÂàÆ…ÂÀÅ م مÂ`ì…Â`ì…Âü… ÿ… ÿ… ÿ…  †Â †ÂÀ'†Â`7†Â =†Â`P†ÂÀY†Â c†Â`i†Â o†ÂÀr†Â |†Â€…†Â`‚†Ây†Â`‚†Â ˆ†Â€ž†Â ¡†ÂÀ¤†Â º†Â º†Â º†ÂàÀ†Â@ʆÂàò†Â ù†Â`ÿ†Â`ÿ†Â ‡Â ‡Â ‡Â ‡Â@‡Â +‡Â +‡Â 7‡Âà=‡Â 7‡Âà=‡ÂÀ:‡ÂA‡Âà=‡Â€M‡Â@`‡Â i‡Â v‡Â`|‡Âàˆ‡ÂÀ…‡Â`•‡Â¥‡Â ¨‡Â ´‡Â ´‡Â€±‡Âງ ͇ ͇ Á‡Â Ú‡ÂàӇ€ã‡Â æ‡Â ó‡Â@ö‡Â€ü‡ÂàˆÂ ˆÂ ˆÂ %ˆÂ€.ˆÂ 1ˆÂ >ˆÂ >ˆÂ@AˆÂàPˆÂ WˆÂ WˆÂ€`ˆÂ`]ˆÂ pˆÂ@sˆÂ |ˆÂ†ˆÂ •ˆÂ •ˆÂà›ˆÂŸˆÂ`¨ˆÂ ®ˆÂ€«ˆÂ ®ˆÂ ®ˆÂഈ LjÂшÂÀãˆÂ íˆÂ`óˆÂ€öˆÂ ùˆÂ ùˆÂàÿˆÂ` ‰Â ‰Âà‰Â‰Â@"‰Â`%‰Â +‰Â 8‰Â@;‰Â€A‰ÂÀG‰Â`W‰Âàc‰Â`p‰Â`p‰Âàc‰Â v‰Â ƒ‰Â ‰Â ‰Â€Œ‰Â ‰Â€Œ‰Â™‰ÂÀ«‰Â`»‰Â€¾‰Â Á‰Â µ‰Â`»‰ÂÀĉÂàlj€׉Âä‰Â ç‰Â ó‰Âý‰Â ó‰Âàù‰Â ŠÂ€ ŠÂ  ŠÂ %ŠÂ`ŠÂ/ŠÂ€"ŠÂÀ(ŠÂà+ŠÂ@5ŠÂ@5ŠÂ >ŠÂ KŠÂ WŠÂà]ŠÂ@gŠÂÀZŠÂ€mŠÂ@gŠÂ dŠÂà]ŠÂ WŠÂÀZŠÂ WŠÂ KŠÂ`QŠÂ KŠÂ`QŠÂ€TŠÂ KŠÂ@NŠÂÀZŠÂaŠÂ WŠÂ KŠÂ KŠÂàDŠÂ@NŠÂ@NŠÂ€TŠÂÀZŠÂ WŠÂ`jŠÂ€mŠÂ pŠÂ pŠÂ€mŠÂzŠÂ@€ŠÂ@€ŠÂzŠÂ pŠÂ`jŠÂ€mŠÂ }ŠÂ ‰ŠÂ ‰ŠÂ ‰ŠÂ“ŠÂ –ŠÂ ¢ŠÂ ¯ŠÂ@²ŠÂਊ »ŠÂ€¸ŠÂ€¸ŠÂ Ȋ ԊÂàÚŠÂàÚŠÂ áŠÂ áŠÂàÚŠÂÞŠÂ áŠÂ€êŠÂÀðŠÂ ‹Â@ýŠÂ ‹Â ‹Â€‹Â€‹Â`‹Â€‹Â ‹Â@‹Â ‹Â`‹Â@‹Â@‹Â`‹Â`‹Âà%‹Âà%‹Â ,‹ÂÀ"‹Â ,‹Â@/‹Â`2‹ÂÀ;‹Âà>‹Â€5‹Â€5‹Â`K‹Â€N‹Â€N‹ÂÀT‹Â`d‹Â€g‹Â`d‹Â w‹Âàp‹Â w‹Â€€‹Â`}‹Â`}‹Â w‹Â ƒ‹Â@“‹Â@“‹Â‹Â‹Â œ‹Â œ‹Â ©‹Â µ‹Â¿‹Â`ȋ€ˋ ΋ ΋Â@ŋ ‹ ‹Â`ȋ¿‹Â@Å‹ÂØ‹Âàԋ€ä‹Â ç‹Â ô‹Â ô‹Âàí‹Â`ú‹Â`ú‹Â`ú‹Â ŒÂàŒÂ ŒÂ@ŒÂ ŒÂ`,ŒÂ 2ŒÂ 2ŒÂÀ5ŒÂ &ŒÂ`,ŒÂ€/ŒÂ@)ŒÂ 2ŒÂ`,ŒÂ 2ŒÂ ?ŒÂÀNŒÂàQŒÂÀNŒÂàQŒÂ XŒÂ XŒÂ€aŒÂ dŒÂàjŒÂÀgŒÂàjŒÂÀgŒÂÀgŒÂ qŒÂ`wŒÂàƒŒÂ –ŒÂ –ŒÂ £ŒÂàœŒÂ`ŒÂ€“ŒÂ –ŒÂ ŒÂ £ŒÂàœŒÂ€“ŒÂ`ŒÂÀ™ŒÂ £ŒÂ`©ŒÂ€¬ŒÂ ¼ŒÂ ¼ŒÂÀËŒÂÀËŒÂÒŒÂàÎŒÂÀËŒÂ@ØŒÂ@ØŒÂàÎŒÂàΌ Ռ ՌÂÀËŒÂÀËŒÂÒŒÂ@ØŒÂàçŒÂ`ôŒÂ úŒÂÂ`  ÂÀ Â@# Â@# ÂàÂÂ`&Â6Â`&Âà2ÂÀHÂO€[Â`X RÂ@UÂ`XÂOÂOÂOÂ`XÂÀaÂÀaÂ`qÂà} „Â@‡Â`ŠÂà–šÂ`£Â`£Â³Â ©Â€¦ÂÀ¬Â€¦Â@ Â@ Â`£Â@¹ÂÀÅÂÀŠ ÂÂàÈÂ@Ò€ØÂåÂåÂ`Õ ÛÂàá€ØÂ`Õ ÛÂåÂ@ëÂ`î ôÂàúÂÀ÷Â@ŽÂ  ŽÂ  ŽÂŽÂàŽÂ ŽÂàŽÂ` ŽÂ€#ŽÂ`9ŽÂ ?ŽÂ LŽÂàEŽÂ ?ŽÂ ?ŽÂIŽÂàEŽÂàEŽÂ ?ŽÂ ?ŽÂ ?ŽÂ ?ŽÂÀBŽÂ LŽÂ€UŽÂÀ[ŽÂÀ[ŽÂ eŽÂ@hŽÂ ~ŽÂ`„ŽÂ ~ŽÂ qŽÂ{ŽÂ ~ŽÂàŽÂ€‡ŽÂ ~ŽÂ@ŽÂ ~ŽÂ ŠŽÂ ŠŽÂ`„ŽÂ€‡ŽÂ€‡ŽÂ”ŽÂàŽÂ@šŽÂ`ŽÂ੎ ¼ŽÂ`¶ŽÂ`¶ŽÂÀ¿ŽÂÆŽÂ ÉŽÂÆŽÂ€ÒŽÂ€ëŽÂ`èŽÂ€ëŽÂ îŽÂàôŽÂøŽÂ îŽÂ@åŽÂ`èŽÂ îŽÂÀñŽÂøŽÂ ûŽÂ€€Â`ÂÀ     Â@Â`Âà&Â`€Âà&Â* 9ÂÀ<ÂC F FÂà?Âà? FÂàX R _Â@bÂàX _ k xÂu€h kÂàqÂ@{€Â`~ÂàŠÂ „ x „ xÂ@{ xÂ@{€ÂÀ‡ÂŽÂàŠÂ ‘ÂÀ‡ÂàŠÂ ‘ ‘ÂŽÂàŠÂ ‘€šÂ`—Â`—€šÂ§Â§Â`°Â`°Â`°Â ªÂ ªÂ ªÂ ªÂ€³Â`°Â€³Âà¼ÂÀ Ã ÃÂà¼Â ¶Âà¼Â@ÆÂÀ ÃÂ`É ÏÂàÕÂÀҠ܀åÂàî èÂàîÂàîÂ`â èÂ`âÂ`â õ õ èÂàî èÂòÂàî  Âà  Â@Â@€Â@Â@Â@ Â@€€ Â`€þÂà€ÂÀÂ$  Â$Â$Â@*Â`-Âà9Âà9Âà9 @ @ @ 3€0€0 3ÂÀ6Â@CÂ`FÂÀOÂàRÂàR LÂÀO YÂ@\ YÂVÂVÂVÂàRÂ@\ÂÀh€b€b€b€b YÂàk€bÂàkÂàk e eÂoÂàkÂàkÂ@uÂ@u ~€{ r ~ÂÀÂ`xÂÀh r rÂo rÂ`x rÂ`xÂ@uÂ`x ~Âà„ ‹Â`‘Â@ŽÂ€”Â@ŽÂà¡ÂàÂ@§Â ¤Â ¤Â€­Â`ªÂ`ªÂ °Âà¶Âà¶Â °Â ½Â@ÀÂ`ÃÂÀÌÂÀÌÂÀÌ É ÖÂàè€ßÂ`ÜÂàèÂÀåÂ`ÜÂ`Ü Ö ÖÂ`Ü âÂàèÂ@ò€øÂ ï€øÂ`õ ûÂ`‘Âà‘‘Âà‘ ‘ ‘€‘ ‘ÂÀ‘Âà‘‘ !‘Âà‘ ‘Â`'‘Âà3‘Â7‘Â@$‘ -‘Âà3‘ -‘ :‘ÂP‘ÂP‘ÂP‘ÂàL‘ÂÀI‘ F‘ S‘ S‘Â`Y‘€\‘Â`Y‘Â`Y‘Â@V‘ÂÀb‘ÂÀb‘ _‘€\‘ _‘€\‘ _‘ l‘ x‘Âà~‘€u‘Â@o‘Â@o‘ l‘ l‘Âi‘€u‘Âà~‘ x‘Âà~‘Â`‹‘ ‘‘Â`‹‘Â`‹‘ …‘ÂÀ{‘Â€Ž‘Â ‘‘ ž‘Âà—‘Â ‘‘Âà—‘Â@¡‘Âà—‘Â@¡‘ ª‘ ª‘Â఑´‘ ª‘ ª‘Â`¤‘Â@¡‘Âà—‘Â`¤‘ÂÀ­‘ ·‘Â`½‘Â`½‘ ÑÂÍ‘Âàɑ€ّÂ@Ó‘Âàɑ€À‘ ÑÂÀƑ БÂ@Ó‘ÂÀß‘ÂÀß‘Â`Ö‘Â`Ö‘Â`֑ ܑÂ`ï‘Â@ì‘ õ‘Â@ì‘Âæ‘Â`ï‘Â`ï‘Â`ï‘Âàû‘ ’Â`’Âÿ‘ ’ ’€ ’ÂÀ’Âà’Âà’ ’Âà’Â@’ ’Â@’Â@’€$’Â@’Âà-’ '’€$’€$’ 4’Â@7’ 4’Â`:’ÂÀ*’Â1’€=’Â`:’ @’ÂàF’ÂJ’ÂàF’ M’ÂÀC’Â`:’€=’ 4’€=’ @’ M’ M’ M’Â`S’€V’€V’ Y’ Y’€V’Âà_’Âà_’Âà_’ f’ Y’Â`S’ Y’Â`S’Â@P’Â`S’ Y’Âà_’ f’ r’ r’€o’ r’Âàx’ ’Â`…’ ’Âà‘’Â ˜’Âà‘’Â€ˆ’€ˆ’Â`…’ ‹’Â@‚’Â@‚’Â|’Â|’ ’Â@‚’ ‹’Âà‘’Â€¡’ ˜’Â઒ ±’ ±’ ±’ ¤’ÂÀ§’ ±’Â@´’Â`·’ ½’Â`·’€º’ÂàÃ’ÂàÃ’Â Ê’ÂàÒ ½’ÂàÃ’ÂàҀº’ÂàÃ’ÂÇ’Â`Ð’Â`Ð’ÂÇ’Â`·’Â@´’Â`·’ ½’€º’ ½’ÂàÒ ʒ ֒ ã’ÂÀÙ’ÂàÜ’ÂÀÙ’Â ã’ÂÀÙ’ÂàÜ’ÂÀÙ’ÂàÜ’Â@撠쒀쒠ü’ ü’Âàõ’€ì’ ï’Âàõ’ ü’ ü’ ü’ ï’Â@æ’Â@æ’Âàõ’ ï’ ü’Â@ÿ’ÂÀ “ “ÂÀ “€“ “€“Âà“““ “ “Âà“ !“Âà'“ÂÀ$“Âà'“Âà'“ÂÀ$“ÂÀ$“ !“Âà'“ÂÀ$“ÂÀ$“ .“Â@1“Â@1“ .“ .“Â@1“ .“ÂÀ$“€“Â`4“ .“ .“Â+“ .“ :“ÂD“Âà@“ :“ :“ :“Â`4“Â@1“ :“Âà@“Âà@“ÂD“ S“Â`M“ G“€P“Â`M“€P“ G“ S“Â@J“ S“ G“ÂD“ G“Âà@“Â`M“ S“ S“ `“Â]“Â]“Â]“ÂÀV“ÂàY“Â`f“Âàr“ l“ l“ `“ `“Â@c“Â@c“ÂàY“Â]“Â]“ `“Âàr“ y“ l“ÂÀo“ l“Âàr“Â@|“Âv“Âv“ y“Â@|“Â@|“ l“Âv“Âàr“Â@|“Â`“Â`“ y“Âv“ l“Â`“Â`“Â`“€‚“€‚“Â`“€‚“Â@|“ y“Â`“ y“ …“€‚“Âà‹“ÂÀˆ“Âà‹“Â€‚“Â@|“ÂÀˆ“ ’“ÂÀˆ“ …“Â@•“ …“€‚“Âà‹“Â“ÂÀˆ“ …“Âà‹“ÂÀˆ“ …“Â`“ …“ …“Âà‹“Â@•““€‚“ ’“ÂÀˆ“ …“Â@|“€‚“Â`“ÂÀˆ““Â`˜“Âà‹“Â ’“Â@•“€›“Âओ€›“Â`˜“Âà‹“Â ’“ ž“Â`˜“ «“ «“Â`±“ «“Â@®“ÂÀ¡“ ž“ ·“ ·“ÂÀº“ «“¨“ÂओÂओÂÀ¡“ÂÀ¡“ ·“Âན ē€͓Â`ʓ ēÂན ēÂà֓ Г ē€͓ÂÚ“Âړ Г ݓ ݓ Г€͓Â@Ǔ ·“ ēÂ@Ǔ ēÂ`Ê“ÂནÂ@Ǔ ē ·“ ·“Âན ē Г Г€͓ ē€͓Â`ʓ€͓ ГÂ@Ǔ ēÂÀӓ ГÂ`ʓ€͓ ГÂÀӓ€͓ÂÀӓ Г Г€͓ ГÂÀÓ“ÂàÖ“Â Ý“Â@à“Â`ã“ÂÚ“Â`ʓ ēÂ@Ǔ€͓Â@Ç“Â`ʓ€͓ ГÂ@Ç“ÂÀÓ“Âړ ݓ é“ é“ é“ é“€æ“ ö“Â@ù“Âàï“Âàï“ é“Â`ã“ ݓÂ@à“Â`ã“Âó“ é“Âàï“Âàï“ÂÀì“ÂÀì“ ö“Â`ü“Â`ü“ ö“Â`ü“Â@ù“Â@ù“€ÿ“Â`ü“€ÿ“Âó“Â@ù“Â@ù“ ”Âà” ”Âà” ” ” ” ” ” ” ”Â`”Â`” ”€”Â`”ÂÀ” ”ÂÀ”Âà”€ÿ“ÂÀ”Âà” ”Â@”€”€” (” (”Â%”ÂÀ” (”ÂÀ”Âà!”Âà!” ” ”Â`”€”Â@+”Â`.”Â`.”€1”€1” (”Â%”Â%”€”Â@” ” ” ”€”ÂÀ” (”Â%” (”Â@+”Â%” (”Â`.”Â`.”Âà:”Âà:”€1”€1”Â`.”Â@+” (”Âà!” 4”Â`.”€1” 4”Â`.” (”Âà!”ÂÀ” ”Âà!” (”Â`.”Â`.”Â`.”Âà:” 4”Â`.” 4”Âà:”Âà:”€J” A”Âà:”Âà:”Â`G” M”Â`G”Â`G”Â`G”ÂÀ˜Â =¶Â ÒÍ #Í 3€âµÂàûªÂ¢Â ñšÂ G• îŒÂÀ(U€FÂ@òÂÀH ÂÀK€ïÐÁÁŽÁÀvA¸ÓA€³(B€[XB€7wB@ÃBÀ†BÀ„B€X~B€“pB€v`B€OBB=B|+B€£B€Ÿ B]÷AÜAÃAD¬A€Q—AïƒA¼cAÀAA( Aþ@"º@ðk@È?°¿¼1À@œÀ>ßÀºÁÂ0ÁGQÁ³qÁ5‰Á€™Á€ø©Á€.ºÁqÊÁ€OÚÁãéÁ€ÇøÁ@‘€T €ÆÂáÂ@‘Â@×!Â@¹&ÂÀ*+€W/ÂÀá2€F6ÂA9Âý;ÂÀN>Â{@ÂoBÂÀ*DÂÀºEÂÀ1G€‰HÂÛIÂ@ KÂ3LÂ@LMÂ@FNÂ!OÂÐOÂPÂQÂÀ‹QÂ@RÂÀžRÂ"SÂÀ±SÂÀ.TÂ@†TÂ@êTÂÀAU€ŸU€êUÂ@HVÂÀŸVÂñVÂ@)WÂ@[WÂÀ™WÂ@ØWÂ@ X€BXÂ@nXšXÂÀ¬XÂ@ëX€#Y€UYÂ@Y€¹YÂ@åY€ZÂÀ#ZÂ@IZÂuZÂÀ¹Z€åZÂ@øZ€0[ÂÀO[ÂÀh[ÂÀš[Â@À[Â@ò[€\Â@=\€\\Â@ˆ\´\Â@Ó\Â@]Â@]Â@]Â]€=]Âc]ÂÀ§]€ì]Â@ÿ]ÂÀ=^ÂÀ=^€i^Âv^ÂÀˆ^Â@•^ÂÁ^Â@ù^€_Â@D_ÂW_‰_ÂÀ´_ÂÀÍ_Â@Ú_ÂÀÿ_ÂÀ1`€D`ÂÀc`Â@‰`Â@»`ÂÀù`€%aÂÀDaÂÀva¯aÂÀÚa€íaÂ@bÂÀ>bÂ@dbÂÀ‰bÂÀÔbÂ@úb cÂ@,cÂXcÂ@cÂ@ÂcÂîcÂ@&dÂ@?dÂ@XdÂ@qd€d¶d€ÛdÂÀeÂeÂ3eÂeeÂ@ke—eÂ@ÏeÂ@fÂÀ&fÂÀ?fÂ@ef€„f€fÂ@ÉfÂ@ûfÂ@gÂ@gÂ@-gÂ@_gÂ@xg¤gÂ@ªgÂ@ÜgÂïgÂÀhÂÀ3hÂÀehÂ@‹hÂ@¤hÂÀ°hÂ@ÖhÂ@ïhÂiÂÀFiÂ@liÂÀxiÂÀ‘iÂ@·iÂãiÂ@jÂ@jÂÀ@jÂ@Mj€ljÂ@jÂ@˜jÂÀ½jÂÀïjÂ@kÂAkÂsk€kÂ¥k€ÊkÂÀékÂÀlÂ@ZlÂÀlÂ@ŒlÂÀ±lÂ@×lÂ@ðlÂÀmÂÀ.mÂNmÂÀ`m€mÂ@ŸmÂ@Ÿm€¥m€×mÂýmÂÀnÂ/n€TnÂ@gn€ŸnÂÀ×nÂ@ýnÂ@oÂ@HoÂÀTo€€oÂ@¬o€Ëo€äoÂ@÷oÂ#pÂyÂ@>yÂ@WyÂÀcyÂ@‰yœyÂ@¢y€ÁyÂ@íyÂzÂ@zÂ2zÂ2z€>zÂÀ]zÂÀzÂÈzÂÀÚz€ízÂÀ%{Â@2{€Q{Â^{Â@K{Â@d{Â@d{€œ{ÂÂ{ÂÀÔ{Â@ú{€|€2|ÂÀ8|ÂÀQ|ÂÀQ|Â@w|Â@|€¯|ÂÀÎ|€á|Â@ô|Â@ }€,}Â@?}ÂÀd}„}Â@£}€Â}Â@Õ}€ô}Â~Â@9~ÂÀE~Â@R~ÂÀw~Â~~Â@~Â@~Â@¶~Â@Ï~Â@è~ÂÀô~Â@ÂÀ&Â-€RÂÀX€„Â@—ÂÀ¼ÂÀÕÂõ €Âà€Â #€ÂÀ2€ÂÀ2€Â`B€ÂÀK€Â U€Â`[€Â€w€Â z€Âà€€Â “€Â`¦€Â€©€Â ¹€Â ¹€Â Å€ÂàË€Â`Ø€ÂÀá€Â€ô€Â ÷€Â@ Âà/€?ÂLÂÀ^Âàa hÂ`nÂàzÂ~  Â` Âà¬Â€¼ÂàÅÂÀÂÂ@Ï€îÂ@‚€‚Â@‚€ ‚ÂÀ&‚Âà)‚Âà)‚Â`6‚ÂÀ?‚ I‚ U‚Â`h‚Âx‚Â`‚ ”‚ÂÀ£‚ª‚ª‚ ­‚€¶‚Â`̂ ҂ÂàØ‚Â€è‚Â@û‚€ƒÂƒÂ ƒÂ ƒÂ@ƒÂà#ƒÂ@-ƒÂà<ƒÂ OƒÂ \ƒÂ hƒÂ uƒÂ uƒÂ@xƒÂà‡ƒÂ`”ƒÂ šƒÂ@ªƒÂ ³ƒÂ½ƒÂ ÀƒÂà҃ كÂ`߃ åƒÂ òƒÂà„Â@„Â`„ „ $„ 0„Â:„ÂS„ b„ o„€x„ÂÀ~„ ˆ„ ”„€ª„ÂೄÂ`À„ ƄÂÀÉ„Âà̄ ߄ ì„€õ„ … … …Â… *… 7… C…ÂàI…ÂàI…ÂàI…ÂM… P…€Y…€Y… i…ÂÀx…Â`ˆ…Â Ž…Â Ž…Â ›… §… À…Âʅ ͅ مÂã…ÂÀÜ…Â`ì…Âã… ÿ…Âà†Â †Â`†Â`†Â`7†ÂàC†ÂG†Â`P†Âà\†Â`i†Â€l†Âàu†Âàu†Â ˆ†Â’†Â৆€·†Â º†Â º†Â@ʆ ӆ€é†ÂÀï†Â ù†Â ‡Â ‡Â ‡Âà$‡Â@.‡Â€4‡Â +‡Â +‡Â 7‡Âà=‡Âà=‡Â P‡Â€M‡Â ]‡ÂÀl‡Âào‡Â`|‡Â€‡ÂŒ‡Â@’‡Â`•‡Â ›‡Â ›‡ÂࡇÂ@«‡Â€±‡Â€±‡Â`LJ€ʇ ڇÂ`à‡Â æ‡Â æ‡Â€ü‡Â ˆÂ ˆÂÀˆÂ %ˆÂ€.ˆÂ€.ˆÂ 1ˆÂ 1ˆÂ JˆÂàPˆÂ WˆÂ`]ˆÂàiˆÂ`vˆÂ`vˆÂÀˆÂ`ˆÂà›ˆÂÀ˜ˆÂ`¨ˆÂ€«ˆÂ€«ˆÂ ®ˆÂ »ˆÂ¸ˆÂഈ Lj Ԉ€݈€݈ íˆÂ€öˆÂ€öˆÂàÿˆÂ€‰Â‰Â`%‰Â€(‰Âà1‰Â D‰Â`W‰Â`W‰Â`W‰ÂÀG‰Â Q‰Â@T‰Â@T‰Â ]‰Â`p‰Â v‰ÂÀy‰Â`‰‰ÂÀ’‰ÂÀ’‰Âஉ ¨‰Â µ‰Â€¾‰Â Á‰Â ΉÂ`ԉ ډ ډ€ð‰Â€ð‰Â ŠÂÀŠÂ€ ŠÂ ŠÂŠÂ ŠÂ ŠÂ`ŠÂ %ŠÂ/ŠÂà+ŠÂ`8ŠÂ€;ŠÂ KŠÂàDŠÂàDŠÂ€TŠÂ€TŠÂÀZŠÂ WŠÂà]ŠÂÀZŠÂ€TŠÂà]ŠÂà]ŠÂÀZŠÂà]ŠÂ pŠÂÀsŠÂàvŠÂ }ŠÂàvŠÂzŠÂ ‰ŠÂ“ŠÂÀŒŠÂ –ŠÂàŠÂ€ŸŠÂ€ŸŠÂਊÂਊ€¸ŠÂ »ŠÂ ÈŠÂÀ¾ŠÂ`ΊÂàڊ€ъ Ȋ ȊÂÀ׊ áŠÂ áŠÂ@äŠÂ íŠÂ úŠÂ`‹Â ‹Âà ‹ÂÀ"‹Â`2‹Â`2‹Â€5‹Â`2‹Â)‹Â@/‹ÂÀ;‹Â 8‹ÂB‹Âà>‹Â E‹ÂB‹ÂB‹Â`K‹ÂàW‹Â€g‹Â€g‹Ât‹Â€g‹Âàp‹Â€€‹Âà‰‹Â ƒ‹Â€€‹Âà‰‹Â€™‹Â¦‹Â`¯‹ÂࢋÂ`¯‹Â µ‹Â໋ ‹Â`È‹Â€Ë‹Â€Ë‹Â€Ë‹ÂØ‹ÂàÔ‹Âàԋ ç‹Â ç‹Â@ދ ç‹Âàí‹Â@÷‹Â ŒÂ ŒÂ ŒÂ ŒÂ€ŒÂ`,ŒÂ€/ŒÂÀ5ŒÂÀ5ŒÂ 2ŒÂÀ5ŒÂ€/ŒÂÀ5ŒÂ@BŒÂ€HŒÂ€HŒÂà8ŒÂ€HŒÂàQŒÂUŒÂ dŒÂ XŒÂ`^ŒÂ dŒÂÀgŒÂ`wŒÂ€zŒÂàœŒÂàœŒÂ ŒÂ –ŒÂ@ŒÂ –ŒÂÀ™ŒÂ ¯ŒÂ€¬ŒÂൌÂൌ ¼ŒÂ`Œ Ȍ Ռ ȌÂàΌ€ތ ՌÂ@ØŒÂҌ áŒÂ îŒÂ áŒÂ îŒÂ îŒÂ îŒÂ`ôŒÂàÂÀýŒÂ€Â`   ÂàÂà  ,Â@<ÂÀHÂ`?€BÂÀHÂàK RÂ`X€[€[€[ÂÀaÂ`X ^ÂàdÂ@nÂ`q€tÂÀz   Â`£Â ©Âà¯Âà¯Â ¶Â ¶Âà¯Â@¹Â€¿ÂàÈ Ï Ï ÏÂàáÂåÂàáÂàá èÂ`î è€ñÂàú ŽÂ€ ŽÂ€ ŽÂ  ŽÂ ŽÂàŽÂàŽÂ` ŽÂ &ŽÂ &ŽÂÀ)ŽÂà,ŽÂ`9ŽÂà,ŽÂ 3ŽÂÀBŽÂ`9ŽÂ€<ŽÂIŽÂàEŽÂ`RŽÂ XŽÂbŽÂÀ[ŽÂà^ŽÂ eŽÂ`kŽÂ eŽÂà^ŽÂ eŽÂàwŽÂ ~ŽÂ ~ŽÂ@ŽÂ ŠŽÂ ~ŽÂ@ŽÂ`„ŽÂ€‡ŽÂ —ŽÂ`ŽÂ€ ŽÂ€ ŽÂ੎Â`¶ŽÂ °ŽÂ ¼ŽÂÆŽÂàÂŽÂÀ¿ŽÂàÂŽÂ`ÏŽÂàێ€ҎÂàێ€ëŽÂ îŽÂ îŽÂàôŽÂ`Â@þŽÂ ûŽÂ €ÂàôŽÂ`€Âà  €€  Â`€Âà&€6ÂCÂÀ< FÂ`L R RÂàXÂ`eÂàqÂu k kÂÀnÂ@{ xÂ`~ x xÂ`~ÂŽÂàŠÂàŠÂàŠÂ ‘Â@”  ªÂà£Âà£Â`°Â ªÂ@­Â€³Â@­Â`°Â ¶ÂÀÒ ÜÂÀÒ Ü ÜÂ@ßÂ@ßÂàÕ€å€åÂàÕÂ@ßÂòÂÀë õÂÀÂÀÂàÂÀÂàÂÀ€þ     € Âà  'Âà Â`Â$Âà Âà Â`-ÂÀ6ÂÀ6ÂÀOÂàR LÂ`F€IÂ`FÂ`FÂàRÂàRÂàRÂÀOÂ`_€bÂàkÂàk e e eÂàk rÂàk rÂ`x ~ÂÀ€{€{Â@uÂÀÂà„ ‹Â€”Â@ŽÂ`‘Â`‘ˆˆ ‹ÂÀšÂ ¤Â ¤Â`ªÂ€­Â`ªÂà¶Â ½Â ÉÂ@ÀÂ`ÃÂÀ³ÂºÂ °Âà¶ÂÀ³Â€­Âà¶Â`àɠɠÉÂ`ÀÆÂÓÂàÏÂ`ÜÂ@ـߠâÂÀåÂ@ò û û û€øÂ ‘Â`‘Âà‘ ûÂà‘Âà‘Âà‘ ‘ ûÂà‘ ‘€‘ÂÀ‘ !‘Âà‘ !‘ !‘ !‘Â`'‘ -‘Â`@‘ -‘ -‘Âà3‘Â`@‘Â@=‘Â`@‘ :‘ :‘€C‘€C‘ F‘Â@=‘Â@=‘ :‘ÂàL‘ F‘ S‘Â`Y‘ÂàL‘ÂP‘ S‘Â`Y‘€\‘Â`Y‘Â`Y‘€\‘ÂÀb‘ÂÀb‘ _‘€\‘ _‘Âàe‘ _‘€\‘Â@V‘ÂP‘ÂÀb‘ l‘ l‘€u‘ l‘ x‘ …‘‚‘ …‘ …‘Â`‹‘Â@ˆ‘Â@ˆ‘Â@ˆ‘Â€Ž‘Â ‘‘›‘Âà—‘ÂÀ”‘Âà—‘Â`¤‘´‘Âà°‘Â ·‘ Ñ€À‘ Ñ€À‘ÂÀƑ Ñ Ñ€À‘€À‘ÂÀƑ€À‘ Ñ Б БÂ@Ó‘Â@Ó‘Â@ӑ€ّÂàâ‘ é‘ é‘ é‘ õ‘Âàû‘ ’Âÿ‘Âÿ‘€ò‘ õ‘ õ‘Âÿ‘€ ’Â`’Â`’Â`’ ’€ ’Â’ ’€ ’Â@’Â’Â@’Â`!’Â@’Âà-’Âà-’Âà-’Âà-’Â1’ÂÀ*’ 4’Â`:’Â`S’ Y’ Y’ Y’Â`S’Â`S’Â`S’€V’Â`S’ÂàF’ @’ÂJ’ M’ÂJ’ Y’Â@i’Â`l’ r’Âàx’ ’Âàx’Â@‚’Â`…’Â|’Â|’Âàx’Â`…’ ‹’Â`…’Âàx’ r’ r’ ’€ˆ’Âà‘’Â•’ ˜’ ¤’ÂÀ§’ ¤’Â઒Â@´’Â઒ÂÀ§’Â઒Â`·’ ½’ÂÇ’ÂÀÀ’ÂÇ’Â`Ð’Â@Í’Â`Ð’Â@͒ ʒ€º’€º’Â`·’ÂàҀӒÂ@Í’ÂÀÙ’Â`Ð’Â`В ֒Â`Ð’Â ã’Â`é’Â`é’€ì’ÂÀò’ÂÀò’Âù’Âàõ’ÂÀò’ÂÀò’Âù’Âù’Â`“ “ “€“ÂÀ “ !“€“Â@“ “Â`“€“€“€“Â@“Âà'“Âà'“Âà'“ÂÀ$“Â+“Âà'“Â+“Â+“Â+“Âà'“ .“ .“Â`4“€7“ :“€7“ :“Â`4“Â@1“€7“Âà@“€P“ÂàY“ S“ S“ S“ S“€P“€P“€P“Â`f“ l“€i“ÂÀo“Â`“Âv“ l“Âv“€‚“Âv“Â`“ÂÀo“ l“Â`f“ l“ l“Âàr“ …“€‚““Âà‹“Â“Â“ÂÀˆ“ ’“Âà‹“Âà‹“Âà‹“Â ’“ ’“Âओ ž“€›“ ž“ ž“€›“Â@•“Â`˜“ «“¨“ÂÀ¡“Âओ «“ ž“ ’“ÂÀ¡“€›“Âओ€´“ ·“ ē ēÂ`Ê“ÂÀº“Â`˜“ ’“Â@•“ ’“Â`˜“ÂओÂओÂÀº“ÂནÂÁ“Â`Ê“Â`Ê“ÂÁ“ ē ēÂÀº“ÂÀº“€͓ÂÀÓ“Â Ý“Â@à“ÂÚ“ÂàÖ“ÂÚ“Âړ Г€͓Â`Ê“Â`Ê“ÂÀÓ“ÂàÖ“ÂÀÓ“Â Ä“Â@Ǔ Г ݓ é“Â`ã“ÂÀì“Â@ù“Âàï“Â@ù“Âó“Âàï“Â`ü“ ö“ ö“ ö“Â`ü“Âó“ ” ”€ÿ“ ”Â`ü“€ÿ“ ” ” ”€ÿ“ ”ÂÀ”Â@”Â@” ”Â@ù“Â@ù“Âà”Âà”Âà” ” ”€”Â`”ÂÀ”ÂÀ”Â`.”Â@+”Âà:”Âà:”Âà:” 4” (”Â@+”ÂÀ7”Â`.” 4”Â@D”ÂÀP”ÂÀ7”ÂÀ7”ÂÀ7”Â>”Â@D”€J”€J”€J”ÂàS” Z”Â``”Â@]”ÂW”ÂàS”Â``”Â``”€c”ÂÀi”ÂàS”ÂÀP” Z”ÂW”ÂÀP”ÂW” Z” Z” Z”ÂW”ÂàS”ÂàS”ÂW”Â``” s” ”€|”Â@v” s”ÂÀi”ÂÀi”Âp” s” s” s”€|”Âà…”Â Œ”Â`’” ˜” ˜”ÂÀ›” ˜”Âàž”Â@¨”Â`«”¢”Â@¨”ÂÀ›”ÂÀ›”ÂÀ›”¢”Âàž”Â ¥”€®”€®”€®” ¾”»” ±”Âු»” ±”€®” ±” ±” ±” ±”ÂÀ´”ÂÀ´”»” ¾” ¾” ±”Âු ¾” ±”Âු ¾” ¾”»”Â`Ä”Â@Á” ʔÂ@ڔ הÂàДÂàД ʔ ¾”€ǔ€ǔ ʔÂÀÍ”Â`ݔ ã” ã”Â`Ý”ÂàД הÂÀÍ”ÂàД€ǔÂàДÂ@Ú”ÂԔ הÂ`ݔ ã”Âàé”Â`Ý”ÂԔ ʔÂÔ”ÂÔ”ÂÀÍ”ÂÔ”Â@Ú”Â`ݔ ã”€à” ã” ã”Â`Ý”Â@ڔ ð” ð” ð” ð” ð”€ù”Â`ö” ð” ð”Â`ö” ü”Âà• ü”€ù” •Âà•Âà•Âà•ÂÀÿ” ü”Âà•Âà•€ù”€ù”•Â`•Â@ •Â`•€•€• • • •Âà•€•ÂÀ• "• "•••Âà•ÂÀ• .•€+•ÂÀ•Â`(•ÂÀ1• ;• ;• ;•Âà4•ÂÀ1•Â`(•Âà•€•Âà•€•Âà• "••Â`• •Â@%•ÂÀ1• ;• ;• G•Â@>•€D• G•Â`A•ÂàM• G•Â`A• ;•Âà4•Â8•Â@>• G•ÂQ•ÂQ•ÂQ•ÂàM•Â`Z• `•Â@p•Âàf• `•Âj• m•Â`s•Â`s•Âj•Âj• m•Â`s•€v•Â`s• m• m•Âàf•Â`Z•€]•Â`Z• `•Âàf•ÂÀc•€]• `• `•€]•Âàf•Âàf• `•ÂQ• T•€]•ÂÀc• T•€]• T•Â`Z•Âàf•Â`Z• T• G•Â8•Â8•€D•€D•ÂàM•ÂàM•€D• G•ÂQ•Â`Z•Â`Z•ÂQ•ÂQ• T•ÂQ•ÂàM•Â`A•Â@>•Â`A•Â`A•Â`A•ÂÀJ• T• T•ÂàM•ÂàM• T•€]•Â`Z•Â@W•Â`Z•€]•Â@W•Â@W•Â`Z•ÂÀc•€]•ÂQ•ÂQ• `• `•Â@W•Â`Z• `• `•Â@W• T•Â`Z•ÂÀc• `•€]•€]•€]• `• `•Âj• `•Âàf•Âj•Â`s•Âà•€v•Âàf•Â@p•Â`s•Âj•ÂÀc•ÂÀc• m•Âj•Â`Z•Â`Z•Â`Z•€]• T•ÂàM• `•Â@p•Âàf•Âàf•Âàf•Â`Z•€]•Â`Z• `• `• `• T•Â@W• `•€]•Â`Z•Âàf•ÂÀc•€]•ÂQ•Â`Z•Â@W•€D•€D•ÂàM•Â8•Â8• ;• G•€D• G• T•ÂàM•€D•Â8•Â8•Âà4•Â8•ÂÀ1•ÂÀ1•Â`(•ÂÀ1•Â8•ÂÀ1•Â@%••€+•Â8• ;• ;•€+• "•Â@%•Â`(• .•€+•€+• .•Âà4•Âà4• ;•Â`(•€+• "• "• "•Âà• • •Â@ •€•€• •Â@ • • •€•ÂÀ• • •Â`(• .•Âà• • •Â@%•• • •• "• "•Â@%• "•Âà•Âà•Âà• •ÂÀ•€•Â`•Â`•Â@ •• •€•Âà• •Â`•Â@ •Â@ • • ñ˜Â u·Â`ÏÂÀ9ÎÂàL÷ !¬Â %£ÂœÂÀ]– èÂ@“VÂ@逿ÂÀuÂs ãÁ€¤ÁÁ¬Š@PªAÀ%BKB€goBâB`Ó…Bàþ„BÏ€B@ÀtB€&eBêSB$BB@d0B€:B@þBªÿA€dãA€µÉA€Â²AéA¬ŠAqA@NA>-Aë A\Ú@Lš@X1@€;?8®¿D^ÀR²ÀæõÀYÁÅ<Á|]ÁFÁ€­Á¸¡Á€^²Á€ÆÂÁ€üÒÁâÁ€ØñÁ@XÂ@`€ Â>Â@Â@fÂ[$ÂÀë(€ÿ,ÂÀ»0ÂÀ?4ÂÀ‘7ÂÀf:ÂÀ =ÂÀa?Â@{AÂiCÂEÂ@ÁFÂ2H€ƒIÂ@ÂJ€ÛKÂ@ÏLÂÃMÂ@ªNÂ@‹O€'PÂ@ÐPÂÀrQÂRÂŒRÂ@S†SÂêS€ZTÂÀÄTÂÀ(UÂÀŒUÂ@ËUÂVÂ[VÂ@“VÂØVÂ@WÂÀ5WÂÀgWÂ@¦WÂ@ØWÂÀXÂÀHXÂXÂ@¹X€ØXÂ@YÂ@YÂIYÂ@hYÂ@šYÂÀØYÂ@ZÂÀ#ZÂ@IZ€ZÂ@ÆZ€[€I[Â@\[¡[ÂÀÌ[Â@ò[ÂÀ\Â@=\Â@o\Â@¡\Â@º\ÂÀß\Â@Ó\€ò\Â@]Â1]ÂÀC]Âc]€o]Â@‚]Â@‚]®]€ì]Â+^Âv^€›^ÂÁ^€ÿ^Â@+_Â@D_Â@D_€c_‰_Â@¨_»_ÂÀÿ_Â@%`Â@>`ÂÀc`ƒ`ÂÀ®`Â@Ô`Â@í`ÂaÂÀa€>aÂÀaÂ@µaÂÀÚaÂbÂ@2bÂ@KbÂwbÂÀ¢bÂ@–bÂÀ»b€ÎbÂôbÂ@c€KcÂqc€¯c€¯cÂ@ÛcÂÀdÂÀdÂ9dÂÀddÂÀ–dÂ@ÕdÂ@îdÂÀúdÂÀeÂÀEeÂÀwe—eÂÀÂeÂÀÛeÂûeÂ@fÂ@3f€RfÂ@~fÂÀ£f€ÏfÂÀîfÂgÂÀ gÂÀ9gÂYgÂ@‘gÂÀgÂÀ¶gÂÀègÂ@õgÂhÂ@'hÂlhÂÀ~h€ªh·hÂ@ïhÂ@!iÂÀFiÂfiÂ@…i€¤i€½i€ÖiÂüiÂ@jÂÀ@jÂÀYjÂyjÂÀ¤jÂÀ½j€éjÂÀkÂ@.kÂZkÂskÂÀ…kÂ@«k€ÊkÂ@ÝkÂÀlÂÀ4lÂÀMl€ylÂ@Œl¸lÂ@×lÂmÂ5mÂNm€ŒmÂÀ«m€¾mÂÀÝmÂÀömÂýmÂ/nÂÀZnÂÀsn“n€¸n€ÑnÂ@ýnÂÀ"oÂ[oÂÀŸoÂØoÂ@ÞoÂñoÂñoÂ@)pÂ@BpÂÀ€pÂÀ²p€ÅpÂ@ñpÂÀýpÂ@ qÂqÂOqÂÀzqšqÂ@¹qÂ@ëqÂ@rÂrÂ0r€Ur€‡rÂ@³rÂÀ¿r€Òr€sÂ*sÂ@0sÂCsÂ@bsÂŽsÂ@­sÂ@ßsÂòsÂ@*tÂ=tÂ@CtÂÀht€{t€”t€ÆtÂÓtÂÀþt€uÂÀIuÂiu›uÂÀ­uÂÍuÂæuÂ@vÂ@v€=vÂ@iv€ˆvÂ@‚vÂÀ§vÂÇvÂàvÂ@ÿv€wÂ@JwÂ@cwÂÀowÂÀˆwÂÀ¡w€ÍwÂ@ùw xÂÀ7x€JxÂÀ‚xÂÀ›xÂ@ÁxÂ@ÚxÂÀæxÂÀÿxÂÀ1yÂ@>yÂÀJyÂjyÂ@‰yÂ@¢y€Áy€ÚyÂÀùyÂ@zÂÀzÂÀzÂ@8zÂ@jzÂ@ƒzÂ@µzÂÀ¨zÂÀÁz€ÔzÂÀózÂÀ {€8{ÂE{ÂÀ>{Â@d{Âw{Â@–{ÂÀ»{Â@È{€ç{€|Â@ú{Â@|ÂÀ8|Â@E|Âq|Š|Â@©|¼|ÂÕ|Â} }€,}Â@?}€E}€^}€}€}ÂÀ¯}Â@¼}ÂÀá}Â@î}Âè}ÂÀú}Â~Â3~Â@9~€q~—~ÂÀ©~Â@Ï~Â@è~ÂÂÀ&ÂÀ&ÂÀ?Â@LÂ_Â@e‘€¶Â@â€èÂÀ€Â`€Â €Â €Â /€Â H€Â`[€Âk€Â n€Â z€Â€w€Â z€Â„€Â “€Â€ÂಀÂಀ€€ Ҁ ހÂàä€Â ë€Â€ô€Â@ Â`#Âà/Âà/ B€?ÂàHÂàaÂeÂÀwÂ@„— ³Â`¹Â ÌÂ`ÒÂàÞÂ`ë þ€‚Âà‚€ ‚ #‚Âà)‚Â`6‚ <‚ I‚ U‚ b‚ n‚ÂÀŠ‚Â ‡‚€‚ÂÀ£‚ ­‚ ­‚Â࿂ ҂€ς ߂Â`å‚Âàñ‚€ƒÂ ƒÂ ƒÂà#ƒÂ`0ƒÂ€3ƒÂ€3ƒÂà<ƒÂ@ƒÂÀRƒÂ`bƒÂÀkƒÂànƒÂànƒÂ@xƒÂ@‘ƒÂ`”ƒÂÀƒÂ`­ƒÂ½ƒÂ ÌƒÂà҃ åƒÂ òƒÂ òƒÂ þƒÂ „Â`„Â!„ 0„Âà6„€F„ÂS„ÂàO„Â`\„ b„Âàh„ o„ {„Â@‹„ ¡„€ª„Âೄ º„Â@½„€Ä ӄÂЄ ӄ ߄ ì„ ø„Â…€… … *…Âà0… C…ÂàI…€Y…Âàb…Â@l…€r… u… ‚…Â@……Â`¡… §…±…€½…Âʅ مÂà߅ ò…ÂÀõ…€ï…Â`ì… ÿ…ÂÀ†Â†Â $†Â $†ÂÀ'†Âà*†Â =†Â`P†Âà\†Â`†Â c†Âàu†Ây†Â`‚†Â’†Â€ž†Â ¡†Â«†ÂÀ½†ÂàÀ†Â`͆ÂàÙ†Âàن ì†ÂÀï†Â@ü†Â ‡Â€‡ÂÀ‡Â ‡Âà ‡Â€‡Â(‡Âà=‡Âà=‡ÂàV‡ÂZ‡ÂZ‡Â€f‡Âào‡Âào‡Â v‡Â`|‡Â ‚‡ÂÀ…‡Âàˆ‡Âàˆ‡ÂŒ‡Â ›‡Â@«‡Â`®‡Â`®‡Â ´‡Â`LJ ͇ ڇÂ@݇Âàì‡ÂÀˆÂàˆÂ`ˆÂ€ˆÂàˆÂ"ˆÂ"ˆÂ€.ˆÂà7ˆÂ >ˆÂ JˆÂ JˆÂàPˆÂ WˆÂÀfˆÂ pˆÂ†ˆÂ`ˆÂŸˆÂ€«ˆÂ@¥ˆÂ ®ˆÂ ®ˆÂ »ˆÂÀʈÂш àˆÂ€öˆÂ€öˆÂ€öˆÂ`óˆÂ`óˆÂ ùˆÂÀüˆÂ‰Â@ ‰Â` ‰Â ‰Â`%‰Â 8‰ÂÀG‰Â Q‰Â`W‰Â@T‰Â ]‰Â`p‰Â€s‰Â`p‰Â v‰Â ƒ‰Âà|‰Â€‰Â@†‰Â ‰Â™‰Â€¥‰ÂÀ«‰ÂஉÂஉ Á‰ÂˉÂ`Ô‰ÂÀ݉ÂÀ݉Â@ê‰Â ó‰Â ó‰Âý‰Âý‰Â`ŠÂ`ŠÂ  ŠÂŠÂ`ŠÂ@ŠÂ %ŠÂà+ŠÂ€;ŠÂ KŠÂ KŠÂ€TŠÂ`QŠÂà]ŠÂ€mŠÂ }ŠÂ€†ŠÂ –ŠÂ –ŠÂ`œŠÂ ¢ŠÂ¬ŠÂ`µŠÂ`µŠÂÀ¾ŠÂàÁŠÂ€¸ŠÂ`ΊÂ@äŠÂàÚŠÂ@äŠÂ€êŠÂ÷ŠÂ@ýŠÂ úŠÂ ‹Âà ‹Â@‹Â ‹ÂÀ"‹Âà%‹Â ,‹Âà>‹Â E‹Â Q‹Â Q‹Â€N‹Â E‹ÂB‹ÂÀ;‹Â€N‹Â ^‹Â j‹ÂÀm‹Â€€‹Â`–‹Â ‹Â ƒ‹Â ‹Â€™‹Â€™‹ÂÀŸ‹Â€²‹Â µ‹Â ©‹Â€²‹Â¿‹Â Î‹Â€Ë‹ÂØ‹Â`á‹Â€ä‹Â ç‹Â ç‹ÂÀê‹Â ç‹ÂÀê‹Âàí‹Â ŒÂÀŒÂàŒÂ ŒÂ`ŒÂ`ŒÂÀŒÂ &ŒÂ &ŒÂ@)ŒÂÀ5ŒÂ`EŒÂ ?ŒÂ ?ŒÂÀNŒÂàQŒÂ`^ŒÂ dŒÂ qŒÂ }ŒÂ@ŒÂ€“ŒÂ –ŒÂ@ŒÂ`ŒÂàœŒÂ`©ŒÂ€¬ŒÂ€¬ŒÂ`©ŒÂ@¦ŒÂ ŒÂÀ²ŒÂÀ²ŒÂൌ ¼ŒÂ€ÅŒÂ ÈŒÂàÎŒÂ`ÛŒÂÒŒÂàçŒÂ îŒÂ€÷ŒÂ`ôŒÂ@ñŒÂÂàÂÂàÂà  ,Â6 9Â@< EÂO R€[ E EÂ@UÂhÂ@nÂàdÂhÂhÂàdÂÀa k k€t w Âà– €¦Â€¦Â€¦Â`£Âà¯Â ©Â³Âà¯Â`¼ÂÀÅÂàÈÂÀÅÂ@ÒÂ@ÒÂÌ€ØÂ`îÂþÂ@ŽÂ ŽÂ ŽÂ ŽÂ@ŽÂ  ŽÂ  ŽÂ  ŽÂàŽÂ@ŽÂ &ŽÂ€#ŽÂà,ŽÂ`9ŽÂàEŽÂÀBŽÂàEŽÂàEŽÂ€UŽÂ XŽÂbŽÂbŽÂà^ŽÂ eŽÂbŽÂbŽÂ@hŽÂ qŽÂ€nŽÂ eŽÂ€nŽÂ`kŽÂ€nŽÂàwŽÂ ~ŽÂ€‡ŽÂ€‡ŽÂ”ŽÂ —ŽÂ`ŽÂ`ŽÂ —ŽÂ ŠŽÂ`ŽÂ £ŽÂ@³ŽÂ °ŽÂ °ŽÂ °ŽÂ@ÌŽÂ`ÏŽÂ`ÏŽÂ`ÏŽÂÀØŽÂ âŽÂàێ€ëŽÂ€ëŽÂàÛŽÂ`èŽÂ@åŽÂ âŽÂߎÂ`èŽÂ€ëŽÂ€ëŽÂ@þŽÂ` Â`Â` Â`€Â@ Â Â* -Â*Âà? RÂ`LÂ`L€O R RÂÀUÂ\Â`eÂ@bÂÀUÂ\Â`eÂ\ÂÀnÂàqÂ@{€ ‘€šÂÀ Â Â Â ªÂà£Â€³Âà¼Â ¶Â€³Â ¶ÂÀÂà¼Âà¼Â ¶Â€³Âà¼ÂÀÂàՠ܀å èÂàî õÂòÂòÂÀë€þÂÀ   Â`  €Âà Â`-€0€0Â$Â@* 3Â`F @€I LÂ`FÂàR LÂ`F L YÂ`_€b eÂo€b e e eÂoÂ`xÂ@uÂ`xˆÂàÂࠤ —Â@§Â`ªÂ€­Â`ªÂ@§Â€­ÂÀ³ÂºÂ`àÖÂÓ Ö€ßÂÀåÂìÂÀåÂ`õ ïÂ`õÂÀþÂÀþÂ`õ€øÂÀþ ‘€‘Â@ ‘Â`‘ ‘ ûÂà‘ ûÂà‘Â@ ‘Â@ ‘Â`‘Âà‘Â`'‘€*‘Â`'‘Â@$‘ ‘ ‘Â@$‘Â`'‘ -‘ÂÀ0‘ :‘Âà3‘Â`@‘Â`@‘Â`@‘ÂàL‘ÂàL‘ S‘Â`Y‘ÂàL‘ S‘Â`@‘ÂàL‘ S‘ÂP‘ S‘ _‘ _‘€\‘€\‘ÂÀb‘Â@o‘€u‘ÂÀ{‘Âà~‘ÂÀ{‘ x‘ x‘Â`r‘Â`r‘ÂÀ{‘Â@ˆ‘Â€Ž‘Â›‘Âà—‘Â@ˆ‘ …‘Â`‹‘Â`‹‘Â€Ž‘ÂÀ”‘Â@ˆ‘Â@ˆ‘ ‘‘ ‘‘ÂÀ”‘ ž‘€§‘ ·‘ ·‘´‘Â@º‘ÂàÉ‘ÂÍ‘ÂÀÆ‘Âàɑ Ñ Ñ€À‘Â`֑ БÂÍ‘ÂÍ‘ÂÍ‘ÂÀÆ‘ÂÀÆ‘Â͑ Б€ّ ܑ€ّ ܑÂÀߑ€ّ é‘Â@ì‘ é‘Âàâ‘ ܑÂ@ì‘ õ‘ õ‘Âàû‘Â`ï‘Â@ì‘Â`ï‘Âàû‘ ’Âàû‘€ ’Â@’€ ’ ’Â’Âà’Â@’ ’€$’Âà-’Âà-’ '’€$’€$’ ’Â`!’Â`!’ '’ 4’ 4’ÂÀC’ @’ÂàF’ M’Â@P’ M’Â`S’Â`S’ Y’ Y’€V’€V’€V’ Y’Âà_’Â@i’ f’ f’ f’Âc’Â`l’Â@i’€o’Â`l’ r’ÂÀu’Âàx’Â|’Âàx’ ’ ‹’ÂÀŽ’Â ‹’Âà‘’Â•’ ˜’€¡’Â@›’ ˜’ ˜’ ˜’Âà‘’ÂÀŽ’Â ‹’•’Â`ž’Â`ž’•’Â`ž’®’ ¤’ ¤’®’®’ÂÀ§’Â઒ ±’ ʒ ʒ ʒÂÇ’ÂÀÀ’ ½’ ʒÂ@Í’Â`Ð’Â@͒ ֒ÂàÜ’ÂàÜ’Â ã’ ã’Â`é’Âà’ÂÀْ€Ӓ ֒ ã’ ã’ ֒Â@æ’Âà’Â@æ’Âà’Âàܒ€ì’ÂÀò’€ì’Â`é’ ï’ ü’Âàõ’Â`“Â@ÿ’ ü’Âàõ’ ï’Âàõ’Âù’ ü’Âà““Âà“ “Âà“Â`“ !“ !“ !“Â@1“ .“ .“ .“ .“ :“ :“€7“ :“Â`4“Â@1“Â`4“€7“Â@1“ :“ :“Â`M“Â`M“ G“Â`M“Â`M“ÂàY“Â`f“ l“ l“Â`f“€i“€i“ÂÀo“Â`f“€P“ÂàY“ `“ÂàY“ `“€i“€i“ l“Âàr“ y“ y“Â@|“ y“Â`“ …““ ’“ ’“ ’“€›“ ž“Âओ¨“ÂओÂÀ¡“Â`˜“€›“ ž“ ž“ÂओÂ@®“¨“Âओ€´“Â`±“ ·“€´“ ·“ ·“€´“ ·“ «“Â@®“ÂÀº“€͓Â`Ê“ÂÁ“ÂནÂན€͓ÂàÖ“Â Ý“Â`ã“ é“ é“ é“€æ“Âà擀擠铠ö“Âàï“ ö“ ö“ ö“Â`ü“Â`ü“ ö“Âó“Â`ü“Âà” ” ” ” ” ” ”€”ÂÀ” (”Â`.” (”€1”Â`.” (”Â%”ÂÀ” ” (”Â%”Â@+”€1”Â@+”Â@+”€1”Âà!”Â@+”€1”ÂÀ7” A”Â`G”€J” A” A” A” M”ÂàS” M” M”€J”ÂW”ÂW”€c” f”€c”Âàl”ÂÀi” f” f”€c” Z”ÂàS” Z”Â``” Z”Â@]”Âàl”ÂÀi” f” f”Âp”Âp” ” ”ÂÀ‚” ” ”Â@” ˜”€•”€•”Â`’”€|”€|” s” s” ”‰”Â`’”Â@”Âà…”Â ”‰” Œ” ˜”Âàž”Âàž”Â ¥” ˜” ˜”¢”¢”ÂÀ›”¢” ¥”€®”Âු ¾”Âු ±” ¾”»”Â`Ä”Âු ¾” ±” ±”Â@Á” ʔ ʔ€ǔÂÀ͔€à”Â@Ú”ÂÀ͔€ǔ€ǔ€ǔÂàД הÂÔ”Â`Ý”Â@Ú”Â`ݔ€à”ÂÀæ” ð” ã”Âàé”Âí”Â`Ý”Â@ڔ ã” ã”Âàé” ã”Â`Ý”Âàé”Â`ö” ð” ð” ð”Â`ö” ü”Â`ö”Â@ó”Â`ö”€ù”ÂÀÿ”Â`ö”Â`ö”Âí”Â`ö”Â`ö”€ù”ÂÀÿ” ü” ü”ÂÀÿ” ü”Â@ •€•••• •Âà•• •Â@ ••ÂÀÿ”Âà• • •Â`•Âà• ••Âà•• "•Âà•Â`•Â@ •ÂÀ• "• "• "•€+• .•Âà4•Âà4• ;• ;• ;•€+••Âà•Â@%••Â@%•€+•€+•Â`(•ÂÀ1•ÂÀ1• .• .• .•ÂÀ1• .• .•Âà4•€D•Â8•Â`A• ;•Â`A•ÂÀJ•ÂàM• G•ÂÀJ• T• G•ÂÀJ• T• G• G•€D•Â8•€D• G•ÂQ•Â`Z• T• T• T•€D•ÂQ•ÂàM•Â@W•Â@W•Â`Z•Â`Z•€]• `•Âàf•ÂÀc•ÂÀc•Âàf• m•Â`s• m•Âàf• m•Â`s• m•Âàf• m•ÂÀc• m•Â@p•Â@p•Â@p• m•Â@p•Â`s•Â@p• y• y• y• †•€•€•Â`Œ• †•Â@‰•Â@‰•€• †• †• †•Âà• †• †• †•Â@‰• †• ’•Âà˜•ÂÀ••Âà˜•Âà˜•Âà˜•Âœ•ÂÀ••Âà˜•Âà˜•ÂÀ••ÂÀ••Â`Œ• †• †•ÂÀ|• †•ÂÀ••ÂÀ••€• ’• Ÿ•œ•œ•Â@¢• Ÿ•Âà˜•Â@¢•Â@¢•ÂÀ•• ’•Âà˜•Â ’•œ•Â`¥•Â@¢•œ•Â`¥•Â`¥•Â`¥•Â@¢• «•µ•ÂౕÂÀ®• «• «•µ•Â@»• ¸•€Á• ĕ ¸• «•Âౕµ•Â`¾• ¸• «•µ• ¸•ÂÀǕ ĕÂàʕ ĕÂÀÇ•ÂÀǕ ĕÂ`¾• ĕÂàʕ ѕÂ`ו ѕ€ڕÂ`וÂ@Ô•Â Ñ•Â`וÂ@ԕ ݕÂ`ו ݕ ѕÂ`ו€ڕ€ڕÂç•€ڕ ݕ ݕÂç•Â@í•Â`ð•Â`ð•ÂÀù• ö•€ó•Â@í•Âç•Â@í•Âç•Âàã• ö•Â`ð• ö•ÂÀù• ö• ö•€ó•€ó•€ó• ê• ö•Âàü•Âàü• – – – –Â@–Âàü•Â` –Â` –Â@– – –Â@–Â` – –Â` –Â` – – –Â@–€ – –ÂÀ– –Âà–Â@– – – ––Â@–Âà––Âà–Âà–Âà– ––€%–Âà.– (–Â2–ÂÀ+–€%–Â`"–Â`"–€%–ÂÀ+– 5–ÂÀ+– (–ÂÀ+– (–ÂÀ+–Âà–€ –Â` –Âà–Â@– – – ö•Â@–– ö•Â`ð•Â`ð• ö•Âàü•€ –ÂÀù•Âàü• ö•Â`ð• ö• ö•Â`ð•Â@í• ê• ê• ê•Âàã•Âàã•Â`ð•Â`ð• ê•ÂÀà•Âàã•Âç• ݕ€ڕÂàÊ•ÂàÊ•Â@Ô•ÂΕ ĕ ĕÂΕÂ@Ô•Â Ñ•Â`וÂ@Ô•ÂΕÂàʕ ѕÂàʕ€Á•Âàʕ ĕÂÀÇ•ÂÀÇ•ÂΕÂΕÂÀǕ€Á• ¸•µ• ¸•Â`¾• ¸•Â@»•ÂౕÂÀ®•€¨• «•ÂÀ®• «•Â`¥• Ÿ•Â@¢•€¨•Â`¥•Â@¢•ÂÀ••€• †• †•Âà˜•Â Ÿ•Â`¥•Âà˜•Âà˜•ÂÀ••ÂÀ•• ’• ’• ’•ÂÀ••Â`Œ•Â@‰•Âà•Â@‰•€•ÂÀ••€•ÂÀ|•ÂÀ|• †•Â`Œ•Âà•ƒ•Âà•ƒ• y•ƒ•Âà• †• †•€v•ÂÀ|•Âà•Â`s• m• m• m• m•Âàf•ÂÀc• `• `• `• `• `•€]•Â`ޘ ·Â€ûÎÂ@_Πlà·Â`¬Â 2£Â œÂày–Â`RŽÂ@ØWÂ@f€ù€Â@ €™ïÁ3³Á%FÁ0r?€5‹A€ÝB­@B€âgB€kB@Ö„Bàþ„B~B€wBÀhBUWBÁEBÀ 4B€ð"B€¡BYB.êAÐA.¸A€(¢AÌAJvAŸSAR2A1ALå@ؤ@H@ Œ?{¿\AÀê¡À äÀùÁ~3ÁÑSÁ¡tÁ€ÑŠÁ›Á€ «Á€ÄºÁ£ÊÁ€ÚÁéÁÚ÷ÁÀ Â@ê €bÂÀÂ@_ÂÑ!³&ÂÀ+€>/ÂÀÈ2ÂÀ6Â@ü8ÂÀ«;Â@)>ÂI@Â@BÂ@ºCÂ+EÂÀ›FÂÀàGÂ@IÂÀJ€,KÂÀ,LÂÀ MÂ@ÉMÂ@‘NÂ:OÂ@ïOÂÀxPÂ@QÂÀ‹QÂÀRÂsRÂÀÐRÂ@AS€«SÂ@ðS€ZTÂ@¸TÂ@UÂÀZU€ŸUÂ@äUÂÀ"VÂ@HVÂ@“VÂñV€/W‡WÂÀ²WÂ@ XÂÀaXÂ@ XÂÀÞXÂ@YÂÀBYÂ@Y€ YÂ@³YÂÀØYÂ@þYÂÀ#ZÂ@bZÂŽZÂ@ÆZÂ@øZÂ@[€0[€b[€”[º[€ß[Â@ \Â@V\ÂÀ{\Â@ˆ\€Ž\Â@º\Âæ\Â@ì\ÂÀ]Â1]Â@P]ÂÀu]ÂÀ§]Âù]Â^€7^€i^Â^Â@Ç^Âó^ÂÀ7_Â@D_Â@]_Â@_€®_ÂÀÍ_€ù_Â@%`€]`Â@‰`Â@¢`Â@»`Â@í`ÂaÂÀ+aÂÀDaÂdaÂÀa¯aÂ@çaÂúa€b€8bÂÀWbÂ@}bÂÀ¢bÂÂb€cÂ@,cÂ@EcÂXcÂÀƒcÂÀµcÂÀçc€úcÂ@&dÂ@Xd„d¶dÂ@Õd€ôdÂ@e€?eÂÀ^eÂ~eÂ@¶eÂâeÂ@fÂ@3fÂ_fÂÀŠfÂÃfÂ@âfÂÀg€gÂ@-gÂ@_g€—gÂÀ¶gÂÖgÂhÂ@'hÂÀehžhÂ@¤hÂÀÉhÂ@ïhÂÀiÂ4iÂ@SiÂ@liÂ@ži€½iÂüi€!jÂ@MjÂ@fjÂÀ‹jÂ@ÊjÂöjÂÀ!kÂ@.kÂ@GkÂÀSk€kÂÀžkÂ@ÝkÂðkÂ@lÂÀ4lÂml†lÂ@¥lÂ@¾lÂêlÂ@ mÂÀ.mÂÀ`mÂÀ’mÂÀ«mÂ@¸mÂÀÝmÂÀömÂÀ(nÂÀAnÂÀsnÂ@€nÂ@€n€ŸnÂÀ¾nÂÀ×nÂÀðn€o€5oÂ@aoÂÀ†oÂ@¬oÂ@ÅoÂ@÷o€pÂÀ5pÂÀNpÂnp€“p¹pÂëpÂqÂÀýp€qÂ@ˆÂ`DˆÂÀMˆÂ JˆÂ WˆÂ WˆÂ cˆÂÀfˆÂà‚ˆÂà‚ˆÂ€’ˆÂ •ˆÂà›ˆÂ ¢ˆÂ@¥ˆÂ ¢ˆÂ@¥ˆÂ@¾ˆÂ`ÁˆÂ€ÄˆÂ`ڈ àˆÂ ùˆÂ‰Â` ‰Â` ‰Â ‰Âà‰Â ‰Â€(‰Âà1‰Â D‰Â D‰ÂÀG‰Â Q‰Â Q‰Â ]‰Âàc‰Â€Z‰ÂÀ`‰Â j‰Â@m‰Â`p‰ÂÀy‰Âà|‰Â@†‰Â œ‰Â ¨‰Â ¨‰Â µ‰Â Á‰ÂˉÂ`Ô‰Âàà‰Â@ê‰Â@ê‰Âä‰Â ç‰Âàù‰Â ó‰Âàù‰Â`ŠÂ ŠÂ %ŠÂà+ŠÂ 2ŠÂ`8ŠÂÀAŠÂ KŠÂ€TŠÂ WŠÂÀZŠÂ`jŠÂ pŠÂ€†ŠÂ –ŠÂ ‰ŠÂ –ŠÂ@™ŠÂਊ ¯ŠÂ »ŠÂ`µŠÂ€¸ŠÂ »ŠÂ Ȋ€ъ ԊÂÀ׊ÂàÚŠÂàÚŠÂ@äŠÂÀðŠÂàóŠÂ úŠÂà ‹Â€‹Â ‹Â€‹Â‹Â`‹Âà%‹Âà%‹Â`2‹Â€5‹ÂB‹Â@H‹Â`K‹Â€N‹ÂàW‹ÂàW‹Â ^‹ÂÀT‹Â j‹Âàp‹Â`}‹Â ƒ‹Â`}‹Âà‰‹Â@“‹Â œ‹Â¦‹Âࢋ µ‹Â¿‹Â ‹Â`È‹Â Î‹Â Î‹Â Û‹ÂØ‹Â€ä‹Â`á‹Â€ä‹Â ô‹Â€ý‹ÂàŒÂ ŒÂ ŒÂàŒÂ ŒÂ ŒÂ@ŒÂ ŒÂ &ŒÂ 2ŒÂÀ5ŒÂ€/ŒÂÀ5ŒÂà8ŒÂ<ŒÂ ?ŒÂÀNŒÂUŒÂ dŒÂ dŒÂÀgŒÂ dŒÂ@tŒÂ qŒÂ dŒÂ }ŒÂ€zŒÂÀ€ŒÂ‡ŒÂ`ŒÂ€“ŒÂ –ŒÂ £ŒÂ€¬ŒÂൌ ¼ŒÂ€ÅŒÂ@¿ŒÂ ÈŒÂ ÈŒÂ Ռ ՌÂ@ØŒÂ@ØŒÂ`ی îŒÂàçŒÂ@ñŒÂ îŒÂëŒÂ îŒÂàçŒÂ úŒÂÀýŒÂ` €ÂàÂ@#Â@#€)€) , , 9€B€B R RÂOÂ@UÂÀaÂàdÂh kÂhÂ@nÂà}€  Âà–€ Âà–ššš€¦Â€¦Âà¯Â ¶Â ¶Â³Â`¼ÂÀÅÂÀÅ€¿Â Â Ï€ØÂÀÞÂàá ÛÂåÂ`î€ñÂ`ŽÂ  ŽÂàŽÂŽÂÀŽÂ  ŽÂ  ŽÂÀŽÂ` ŽÂ ŽÂ` ŽÂ€#ŽÂà,ŽÂ 3ŽÂ`9ŽÂ€<ŽÂàEŽÂ LŽÂ XŽÂ eŽÂ eŽÂà^ŽÂà^ŽÂ€nŽÂàwŽÂ ~ŽÂ{ŽÂ@ŽÂ@ŽÂ`„ŽÂ ŠŽÂ”ŽÂ@šŽÂ€ ŽÂ £ŽÂ੎Â`ŽÂ £ŽÂ £ŽÂÀ¦ŽÂ °ŽÂ€¹ŽÂ ÉŽÂàÂŽÂ`ÏŽÂ@ÌŽÂ`ÏŽÂàÛŽÂàÛŽÂ`èŽÂ`èŽÂ€ëŽÂÀñŽÂøŽÂ`Â`Âà Âà  Â`  Â*Âà&Â*   -Âà? 9€6ÂC FÂ`L R _ÂàXÂàX _Â@b€h kÂ`e kÂ@b _Âàq€ „€šÂà£Â@­Â€³Â ¶Â@­Â ¶Â@ÆÂ ÀÌÂàÕ èÂòÂÀë è èÂ@øÂ õ  ÂÀ  Â$ 'Âà Â$€0ÂÀ6€0ÂÀ6Â`FÂ@\Â@\ÂàRÂV Y Y LÂàRÂÀOÂVÂVÂàRÂàRÂÀO Y€b e r€{Â`x€{€{Âà„Âà„ˆ — ¤Â ¤Âà — ¤Â€­Âà¶ÂºÂºÂ`ÃÂàÏÂÀÌÂàÏÂ@ÙÂ`Ü Ö âÂì€øÂÀþ ‘Âà‘ ïÂ`õÂà‘Â@ ‘ÂÀþÂà‘Âà‘ÂÀ‘‘ÂÀ‘ !‘ -‘Âà3‘€C‘€C‘ F‘ F‘ :‘ :‘ÂàL‘€\‘ _‘Âàe‘ _‘Âàe‘Âi‘Âàe‘ _‘ l‘Â@o‘Â`r‘ x‘Âà~‘Â@ˆ‘Âà~‘‚‘€u‘Â`‹‘ ‘‘ÂÀ”‘Âà—‘Âà—‘Âà—‘Âà—‘Âà—‘Âà—‘Â@¡‘ ·‘ ·‘€À‘´‘€À‘ÂÍ‘ÂÍ‘Â`½‘ÂàÉ‘ÂàÉ‘Âàɑ€ّÂ`֑ БÂÀß‘Âæ‘Â`ï‘ é‘Â`ï‘ÂÀø‘Âàû‘Â`’Â`’€ ’Âÿ‘ÂÀø‘ÂÀø‘ ’Âàû‘Âÿ‘ ’Âà’Â’Âà’Â’ÂÀ’ ’ÂÀ’ ’ ’ÂÀ*’Â1’Âà-’Âà-’Âà-’€=’ÂàF’Â`S’ M’ @’€=’Â@7’ @’€V’ Y’Âà_’ Y’€V’Âà_’Âc’€o’ÂÀu’ r’Âàx’ r’ r’Â`l’ r’ ’ r’Â@‚’ ‹’ ’Â@‚’ ‹’Â@‚’€ˆ’ ‹’•’ÂÀŽ’Â ‹’ ‹’€ˆ’Âà‘’Â•’Â`ž’®’Â@´’®’ ¤’€¡’ ¤’ ±’ ±’ ±’Â઒ ±’ ±’ ½’ÂÀÀ’€º’ ½’€º’€º’ÂàÃ’ÂÀÙ’Âà’Â`é’ÂàÜ’Âà’ ã’Âà’ÂÀÙ’Â@æ’Âà’Â@æ’Â`é’ÂÀò’ ï’Âù’ ü’Âà“Âà““ “€“€“ÂÀ$“Â+“Â+“ÂÀ$“Â+“ .“ .“ !“ÂÀ$“€“€“ÂÀ$“ :“€7“ G“Âà@“ G“€P“€P“ÂàY“€P“ S“ÂàY“ÂàY“€i“ `“Â`f“Â`f“Â@c“ l“ l“ÂÀo“ y“ y“Âàr“Âàr“Â`“ …“Â@|“ y“ …“Âà‹“Â€›“ ž“ÂÀ¡“€›“Â@•“Â`˜“ ’“ ž“¨“ÂओÂओ ž“Â`˜“ ž“ÂÀ¡“Â`˜“Âओ «“ «“Âओ€›“ «“ «“ ·“ ē ēÂ`Ê“Â`ʓ€͓Âà֓€͓ÂÀÓ“ÂàÖ“Â`ã“Âà֓ ݓ ݓÂ@à“€æ“Â@à“ é“ ݓÂ`ã“ é“ é“Âàï“ é“€æ“Â`ã“€æ“ÂÀì“ ö“€ÿ“€ÿ“€ÿ“Âà” ” ” ”Â`” ”Â%”Â%”Â%”Â@+”ÂÀ7”€1” (” ” ”Â`” ” ” ”Âà!”Â%”Âà!”Â`” ”ÂÀ”Â`.” 4”€1”Â@+” (”Â%”€1”Â`.”Âà:”Â`.”€1” (”€1”ÂÀ7”€1”Â%”Âà!”Â`.”Â`.”Â>”Â@D”ÂàS” M” A”Â@D”Â`G”Â>” 4” A”Â@D”ÂÀ7”€1” A”Âà:”Âà:”Â>”Â>”Âà:”Â@D”Â>”€J” A”€J” M”ÂàS”€c” f” f”ÂàS”ÂÀP”ÂÀP”ÂW”ÂW” f”Âp” s” ”Â`y”Â`y”Â`y” s” ” ”ÂÀ‚”Â@v” s”Âà…”Â€•”Â`’” Œ” Œ”Â`’” Œ” Œ”ÂÀ‚” Œ”€•”Âàž”Â ¥” ˜”¢”¢” ¥”¢”ÂÀ›” ˜”ÂÀ›”Â@”Â`’”Âàž”ÂÀ›”Âàž”Â@¨”€®” ±”Âà·”ÂÀ´” ¾”Â@Á”Â`Ä”Â@Á”Â`Ä”Â`Ä”Âà·”ÂÀ´”Â`Ĕ הÂàД€ǔÂ`Ĕ הÂ`ݔ€à” ã”Â@Ú”ÂàД ã” ã”€à”ÂÀ攀à”Âàé” ð”ÂÀÿ”€ù”Â@ó”ÂÀæ” ð” ð”Âàé”Âàé” ã”Âàé” ð” ð”ÂÀÿ”ÂÀÿ”Âà• ü” •ÂÀÿ”Âà•Âà•ÂÀÿ”€• •Â`• • •ÂÀ•Â`•ÂÀÿ” • •Â`•Â@ •Â`•ÂÀ•Â`•€•Â@ •Â`•ÂÀ•ÂÀ•Â@ • •ÂÀ• •ÂÀ•€•Â`•Â`•Âà•Â@%•Âà4•Âà4•ÂÀ1• .•€+• .••Âà•Âà•ÂÀ•ÂÀ• "• .•Âà4•Âà4•Âà4•Âà4•Âà4•Âà4•Âà4• ;•Âà4• ;• ;•Â8•Â8• ;• G•Â`A•€D•€D•Â`A•Âà4•Â@>•Â`A• ;•ÂÀJ•€D• G•ÂÀJ• T•ÂQ•ÂàM•ÂÀJ•ÂQ• G• G•ÂàM•Â@W• `• `•€]• `• m• m• m•ÂÀc•ÂQ•ÂÀJ•ÂQ•Â@W• T•€]• T•ÂÀc•Âàf•Âàf•Âàf• `•Âàf•Âàf• `•Âj• y• †•Â`Œ•ƒ•€v•Âj•Âj• m•ÂÀc•€]•ÂÀc•Âj•Âj• m•Â@p•ÂÀ|•ƒ• †• †•Âà•€v• y•Â@‰•Â@‰•€•Â@‰•€• ’• ’• ’•€• Ÿ•Â`¥• Ÿ•Âà˜•Â ’•ÂÀ••œ•€¨• «•€¨•€¨•Â@¢• Ÿ• Ÿ• Ÿ•Â`¥•Â`¥• Ÿ•Âà˜•Â`¥• «•€¨•ÂÀ®•ÂÀ®• «•Â`¥•€¨• «•ÂÀ®•Âౕµ• «•ÂౕÂౕÂÀ®•Â@¢• «•Â`¥•€¨• «•µ• «•ÂౕÂౕÂÀ®•ÂౕÂౕÂౕ «•Â`¾• ĕÂ@»•Â`¾•ÂÀǕ ĕÂàÊ•ÂÀǕ ĕ ĕ ѕÂàÊ•ÂΕÂ`¾• ¸•Â`¾•Â`¾• ѕ ѕ ݕÂ@ԕ ѕ ĕ€Á•€Á•ÂΕ ѕÂ`וÂ@Ô•Â@ԕ ѕ€ڕ€ڕÂàã• ê•Âàã• ݕÂç•Âàã•Âàã•Âç•ÂÀà• ݕ€ڕ ݕ ݕ€ڕ ݕ ê•Â@í•€ó•€ó•€ó•Â`ð•Âàü•Âàü•Â`ð• ö• ê• ݕÂàã• ݕÂàã•Âàã•€ó•ÂÀà• ê• ê•Âàã•Â@í• ê• ê•Âç•Â`ð• ê•€ó• –Âàü•ÂÀù•Âàü•ÂÀù•–Â` –––Â` –Â@–€ –Âàü• –Âàü•Âàü•Â`ð• ê•Â`ð•ÂÀù•Â`ð•Â`ð• ê• –€ó•Âàü• – –Âàü• –€ ––Â` –Â@–Â` –€ –ÂÀ–– –Âà–€ –Âà–€%–€%– –ÂÀ– – – (– (– –Â@–Â`"–€%–Â@– –€%–ÂÀ+–Â2–€%– –Âà– –€%– (–Â2– (– 5–€>–Â2–ÂÀ+–Â2–Âà.–Â2– A–ÂK–Â@Q–Â@Q–Â@Q– N–ÂK– N–Â@Q–Â`T– N– N–Â`T–€W– Z–Âà`–Â`T–Â`T–Â@Q–ÂàG–ÂàG– N–Â`T–Â`T–ÂK–€W– Z– Z–ÂÀ]–Â`T–ÂK–Â`T– Z–Âà`–€W–Âd–Âd– Z–ÂÀ]– Z– Z– Z–Â`T–€W–Â@j–Âà`–Âd–Â`m–Âd– g–Âd–Â`m– s– €– €– €– Œ–Â`†–ÂÀv– €–€‰– €– s–€p– s–Âày– €–Â@ƒ–€‰–€‰–€‰–€‰–Â`†– Œ–ÂÀ–Âà’–Âà’–Â ™–Â@œ–Â@œ–€¢– ™–––Âà’–Â ™–Â`Ÿ–Â૖ ¥–Âà«–Âà«–Âà«–Âà«–Â`Ÿ––– ™–ÂÀ–ÂÀ– ™–Â@œ– ¥–ÂÀ¨–Â`Ÿ– ¥–ÂÀ¨–€¢–€¢–€¢– ¥– ¥–Â`Ÿ–€¢–¯–Â`¸–Â`¸– ²– ²–Â`¸–ÂÀÁ–€»– ¾–ÂÈ–Â Ë–ÂÈ–ÂÈ–ÂàÄ–ÂàÄ–ÂàĖ ˖ ˖€Ԗ€Ԗ ˖ÂàÄ–ÂàÄ–Â Ë–ÂàÄ–ÂàĖ ˖ ז€Ԗ ז זÂàÝ–Â`і זÂ@ΖÂȖ€Ԗ ז€ԖÂàݖ זÂàݖ€í–€í– ð–Â`ê–Âá–Â`ê–Âá– ä–Âá–Â@ç– ä–Â`ꖀ햀í–Âàö–Âú– ý–Â`—Â`— ý– ý– ý–  —Âà—  —Â`—Âú– ý–Âàö–Âàö– ý–Âàö–ÂÀó–Â`—Â`—Âà—  —€— ý– ý–€—€—  —  —  —Â`—€—Âà“šÂ º¸Âà”ЀõÏÂ`Å€ž¸Â ˜­ÂࢤÂ@‹ÂÀ헀̀þZÂÀZ#€£€SÂÀÛÂ@† €§ÜÁ€Ú•Á¸ìÀ˜é@¡ÂAT!B€ãRBÀsB€è‚B@é…B b„B@~B€#rBEbB€QB€?B€.B:Bh B€©ýAÛâA&ÊA€q³AMžAÅŠA‡pAYNAÚ,A An×@,—@ -@0'?8®¿0YÀ¢­ÀÞîÀ©Á`8ÁbYÁázÁ€¿Á€ÜÁ¢­Á€N½Á€îÌÁ€ßÛÁ€…êÁ€®øÁÀ €Œ Â@ÆÂÀ®Â@ÂA €ý$Â@\)€c-€1‘4±7Âm:Â@ä<ÂÀ?€AÂ@ CÂÀŽDÂÀFÂ@WG–HÂÀ»IÂ@ÛJ€ÛK°LÂxMÂÀRNÂÀOÂ@¤OÂ@:PÂÀÃPÂÀYQ€ÐQÂ@.R€˜RÂ@öRÂ@sSÂ@×SÂ@TT€¾TÂ@UÂ@gUÂÀ¾UÂÀ VÂÀ;VÂÀmVÂÀŸVÂ@ÅVÂÀWÂÀNWÂ@W¹WÂÀäWÂ@#XÂhX€tXÂ@ XÂÀÞXÂ@YÂÀBYÂ{Y­YÂÀØYÂÀ ZÂ@0ZÂ@bZÂÀ ZÂÀÒZ [€0[Â@\[Â@u[Â@§[Â@Ù[Â@ \ÂÀ0\Â@V\ÂÀ{\Â@¡\ÂÀ­\ÂÍ\Âæ\€ ]ÂÀC]ÂÀu]ÂÀ§]ÂÇ]Â@ÿ]Â@^Â@1^Â]^ÂÀo^ÂÀˆ^Â@®^€Í^ÂÀ_Â@D_Â@v_Â@_Â@¨_Â@Á_Â@ó_Â`Â8`Â@W`Â@p`œ`ÂÀÇ`Â@í`ÂÀù`Â@aÂÀDaÂ}aÂ@œaÂÈa€bÂ,bÂ@KbÂ^bÂwbÂ@}bÂ@–bÂ@¯bÂÀíbÂ@cÂ@,cÂ?cÂ@wc£cÂÀÎcÂÀçc dÂ9dÂ@XdÂ@qdÂ@qd€dÂÀ¯dÂÏdÂ@îdÂ@9eÂeeÂÀwe€£eÂ@¶e€îeÂ@f€ fÂ@LfÂxfªfÂ@ÉfÂ@ûfÂÀg€3gÂ@gÂ@FgÂ@xgÂÀgÂÀÏg€âg€hÂÀ3hÂ@rhÂÀ—hÂ@½hÂéhÂ@iÂÀ-iÂ@SiÂÀ_i€‹iÂÀÃiÂ@éiÂ@jÂÀ@jÂ`jÂyjÂÀ‹j€žjÂÀÖjÂ@üjÂÀ:kÂ@`kÂ@ykÂÀ…kÂ@’kÂÀÐk€ükÂ"lÂÀMlÂ@slÂ@Œl¸lÂÑl€ÝlÂ@ðl€(mÂÀGmÂÀymÂÀ’mÂ@ŸmÂËmÂÀÝmÂÀöm€ nÂ/nÂ@NnÂÀsnÂÀŒn€¸nÂ@änÂÀ oÂBoÂtoÂÀ†oÂ@¬oÂ@Þo€äoÂÀpÂÀ5p€HpÂÀgp‡p¹pÂÀËp€ÅpÂ@ñpÂqÂ@#qÂÀ/qÂOqÂ@nq³qÂ@Òq€ñqÂrÂ0rÂ@hrÂ{r­rÂ@³rÂ@år€ër€sÂÀˆÂ >ˆÂàPˆÂ cˆÂ`]ˆÂ WˆÂ€`ˆÂ cˆÂ€`ˆÂmˆÂ pˆÂ |ˆÂà‚ˆÂ€’ˆÂ@¥ˆÂഈ ®ˆÂ »ˆÂ@¾ˆÂà͈Â`ڈ àˆÂ íˆÂ@ðˆÂ ‰Â@ ‰Â ‰Â ‰Â`%‰Â€(‰Â 8‰Â€A‰Â@T‰ÂÀ`‰Â j‰Â j‰Â`p‰Â€s‰ÂÀy‰Â ‰Â œ‰Â@Ÿ‰Â`¢‰Âஉ Á‰Â Á‰ÂàljÂˉ ډÂàà‰Â@ê‰Â ó‰Â€ð‰Â ŠÂ€ ŠÂÀŠÂ ŠÂà+ŠÂà+ŠÂà+ŠÂ`8ŠÂ`8ŠÂ >ŠÂàDŠÂ WŠÂà]ŠÂ dŠÂ pŠÂ }ŠÂÀŒŠÂ –ŠÂ“ŠÂ –ŠÂ@™ŠÂਊÂਊÂ`µŠÂ€¸ŠÂàÁŠÂÀ¾ŠÂ`Ί€ъÂÀ׊ÂÞŠÂ`çŠÂ íŠÂàóŠÂ`‹ÂÀ ‹ÂÀ ‹Â ‹Âà%‹ÂÀ"‹Â`2‹Â`2‹Â ,‹Â 8‹Â E‹Â Q‹ÂÀT‹Â`d‹Â w‹Â€€‹Â€€‹Â ƒ‹Âà‰‹Â ƒ‹Â ƒ‹ÂÀ†‹Â€™‹Â ©‹Â ©‹Â µ‹ÂÀ¸‹Â ‹€ˋÂ`ȋ ۋÂÀê‹Â@÷‹Â`ú‹Â@÷‹Â ŒÂÀŒÂ ŒÂ ŒÂÀŒÂ€ŒÂàŒÂ ŒÂ ŒÂ &ŒÂ@)ŒÂ€/ŒÂà8ŒÂ KŒÂ€aŒÂ€aŒÂ qŒÂ`^ŒÂ dŒÂnŒÂ`wŒÂ€“ŒÂ –ŒÂ –ŒÂàœŒÂàœŒÂ £ŒÂ@¦ŒÂ ¯ŒÂ ¯ŒÂ@¿ŒÂ ÈŒÂàΌ ՌÂ`ی îŒÂ îŒÂÀäŒÂ îŒÂ îŒÂ îŒÂ`ôŒÂ úŒÂ  ÂÀÂÂà  ,Âà2Â`? EÂ@UÂ`X ^ ^ÂàdÂh kÂ@nÂ`qÂà}€ Â`ŠÂ „Â`ŠÂ Âà– Â`£Â€¦Âà¯Â ¶Â ÂÂàÈ ÂÂÌÂ@ÒÂàá ôÂ`î ôÂ@ëÂàúÂàú ŽÂ@ŽÂ  ŽÂŽÂ` ŽÂ` ŽÂÀ)ŽÂ0ŽÂ ?ŽÂ LŽÂ LŽÂàEŽÂ LŽÂ€UŽÂ LŽÂ`RŽÂÀ[ŽÂ€nŽÂ qŽÂ qŽÂàwŽÂ`„ŽÂ ŠŽÂàŽÂ —ŽÂàŽÂàŽÂ —ŽÂ £ŽÂ £ŽÂ€ ŽÂ੎­ŽÂÀ¦ŽÂ £ŽÂ€¹ŽÂ`ώ Վ âŽÂ€ëŽÂ ûŽÂ ûŽÂÀ ÂøŽÂ€ ÂÀ ÂÂ`ÂÀ# -ÂÀ# - -Â@0Â@0Â`3 -Â@0€6€6Âà? F€O€O R RÂÀUÂàXÂ`e€hÂu€ „ÂàŠÂ „ÂàŠÂàŠÂ€šÂ ÂÀ Â@­Âà£Âà£Â`°Âà£Â ¶ÂÀ ÃÂ`ÉÂà¼Â ÃÂ`ÉÂÙ Ü Ü èÂàî õÂòÂ@øÂ@øÂ õ õÂÀë õÂ@øÂ õ€þÂàÂÀ   €Â$Â@* 3 @Âà9Â@C @Â@CÂ`F Y eÂàk rÂàkÂàkÂ@uÂ`x ~Â`x ~Â`‘Â`‘Â@ŽÂˆÂ ‹Â€” ¤Â¡Â`ªÂÀ³Âà¶Â ÉÂàÏÂàÏÂàÏ ÖÂÓÂÓ Ö Ö â€ß âÂàèÂ`õ ïÂì ïÂÀå û€øÂ ‘ ‘Âà‘Âà‘Âà‘Â`'‘ !‘‘Â`'‘€*‘ -‘Â7‘ÂÀ0‘ :‘Â`@‘Â`@‘Â`@‘Â@=‘€C‘ÂÀI‘Â@V‘Â@V‘ S‘ _‘Âàe‘Âi‘Â`r‘ l‘ l‘ _‘ l‘ÂÀ{‘Âà~‘ ‘‘Âà—‘Â ž‘ ª‘ ª‘ ª‘Â`¤‘ ª‘Â`¤‘€§‘Â`¤‘ÂÀ­‘ ·‘´‘€À‘Â`½‘ Ñ Б€ّÂ`֑€ّ é‘ é‘Â@ì‘ é‘Âàâ‘Â@ì‘Âàâ‘Â@ì‘ õ‘Âÿ‘Âÿ‘Âÿ‘Âÿ‘Âàû‘Â@’ ’Âàû‘Âàû‘Âÿ‘Â@’ÂÀ’ ’ ’Â`!’Â`!’Â`!’ ’€$’ '’€$’ '’Â`:’ÂàF’ÂJ’ @’ @’ @’Â@P’Âà_’Âc’ f’ f’Â`l’ f’Âc’Âà_’Âc’ f’Â@i’ f’Âàx’Â`l’ÂÀu’Â|’Â`…’€ˆ’ ‹’•’ ˜’•’Â@›’€¡’®’Â`·’®’Â઒Â઒Â઒ ±’ ¤’Â@´’ ¤’ÂÀ§’ ±’ÂÀÀ’ ʒÂ@͒ ֒Âà’Âà’Âà’ ã’ ã’€ì’ ï’€ì’ ã’ÂàÜ’Â ã’Âà’ ã’ ï’Â@æ’ ï’Âàõ’ ü’Â@ÿ’ “Â@ÿ’Â@ÿ’ “Âà“ “Â`“€“ !“€“Âà'“ÂÀ$“Â+“Âà'“Â+“Â@1“ :“ :“Â+“Â@1“ :“ÂÀ=“ :“ G“ÂÀ=“ :“ G“Â`M“ G“ÂàY“ S“ `“Â@c“ÂÀo“ y“Âv“€i“ `“€i“ l“ l“ l“ÂÀo“Âv“Âv“Â`f“ l“Âv“Â`“Â@|“€‚“ …“ÂÀˆ“ ’“¨“ «“ ·“ «“ «“ «“ «“ «“ «“€´“Â`±“€´“ ·“ ·“ÂནÂÁ“ ē ēÂནÂÁ“ÂÀº“Â@Ç“Â@Ǔ ГÂàÖ“Â Ý“ÂÀÓ“Â Ý“ÂÀÓ“Âړ€æ“Â`ã“€æ“ÂÀ쓀擀æ“ÂÀì“Âàï“ ö“ ö“Âàï“Â@ù“€ÿ“ ”Âà” ”Âà”Â`”€” ”Âà!”Âà!”Â%” (” (” (” ” (”Â%” (”ÂÀ7”Âà:”Âà:”Â>”Âà:”Âà:”Âà:”Â`G” A”Â>”Â>”€J”Â@D”€J”ÂàS” Z” M”ÂW”ÂW”ÂÀi”Â``” Z”Â``”Âàl” f” s” s”Â`y” ”Âp”Â@v”Âp” s”€|”€|”Âp” ”Â@”Âà…”Â Œ”Â`’”Â@”Âà…”Âà…”Â€•”ÂÀ›”¢”¢” ¥” ±” ¾”ÂÀ´” ±” ¾” ʔ ʔ ¾” ¾” ¾”Â@Á” ¾”Â@Á” ¾”Â@Á” ʔÂÀÍ”ÂàД הÂԔ ã”Âàé”Âà销à”Â`Ý”Âàé” ã”€à” ã”Âàé” ð” ð”Â`ö”€ù”Â@ó” ð” ü” ü”••Â`• • •Â`• • "•Â`(•• • •Âà•Âà•ÂÀ••Â@%• .•€+•Â8•Â8•Â8•ÂÀJ•ÂÀJ•Â`A• ;•Â8• G• G•ÂàM• G•€D• G• G•ÂÀJ•€D•ÂQ•Â`Z• `•Âàf•Âj•Âàf•Âj•Âàf•Âàf•Â@W• T• `•Âàf•Âàf•Â`s•Â@p•Âàf• m•Â`s•Â@p• m•€v•€v•Âà•€•ƒ• †•Â`Œ•ÂÀ••œ• Ÿ• Ÿ•€¨•ÂÀ®•Â@»• «•Â@¢•Âౕ ¸•€¨• Ÿ•Â@¢• Ÿ•œ•Âౕµ•Â@»•Â@»•Â`¾•Â@»•€Á•Â`¾• ¸•µ• ¸•Âౕ ĕ ѕ€ڕÂ`ו€ڕÂ@Ô•Â`ו ݕ ݕÂàã• ê•Âàã•€ó•€ó•–Âàü• ö•Âàü•€ó•ÂÀù•Â`ð•€ó•ÂÀù•Âàü•– – –€ –Â@– – – –ÂÀ––Â@– –Âà.–ÂÀ+– (–Âà.–Âà.–ÂÀ+– 5–Âà.– 5–Âà.–Âà.– (– (–Âà.– 5– 5– 5– 5–ÂàG–€>–€>–€>–Â`;–€>–ÂK–ÂK–ÂàG–ÂàG–ÂàG– N– N–Â@Q–€W– N–Â`T– N– N–€W– Z– Z–Â`T–Â`T– N–Â`T–Â`T– N– N–Â`T–Â`T– Z–Âà`– g– Z–€p– s– s–€p–Â@j–Â`m– g–Âà`– Z– N– Z–Âà`– g– g– s–€p–€p–Â`m– g–Â`m–€p– s– s– s–Â`†–Â`†– €–Â@ƒ–Â@ƒ–ÂÀv–Â@ƒ–ÂÀv–Â`†–Âà’–Âà’–Â`Ÿ–Â@ƒ–Âày–Â}–Â`†–€‰–€‰– Œ– €– €–Â`†–€‰–€‰– €–€‰–Â`†–€‰– Œ– ™–€¢–€¢–Â@œ– ™–Â`Ÿ– ¥–ÂÀ¨–ÂÀ¨–Âà«–Â@µ– ²– ²– ¥–€¢– ¥– ²–Â`¸–ÂÀÁ– ˖ ¾– ¾–Â`¸–Â`¸– ²– ²– ²–Âà«–ÂÀ¨– ¥–¯–Â૖€»– ˖Â`Ñ–Â`Ñ–Â@ΖÂ@ΖÂȖ ¾–ÂÀÁ–Â@ΖÂ`Ñ–Â Ë–Â Ë–ÂàÄ–ÂÀÁ–ÂÈ–Â@ΖÂÀÁ–Â@Ζ ˖ ז ז ז ˖ÂÈ–ÂàÄ–Â Ë–Â`Ñ–Â ä–ÂÀږ€ԖÂàݖ ז€Ԗ זÂÀÚ–ÂÀÚ–Â`Ñ–Â`і€Ԗ ˖€Ԗ ä–Â@ç–Âàö– ä–Âá– ä–Â@ç–Â`ê–€í–Â@疀햠ð– ð–ÂÀó– ð– ð–Âú–Âú–€—Â`—Âú–Âàö– ý–Â@—Â@—Â`—Âú– ý–Âàö– ý–Â`—€—Â`—€—€—Â`—Â@—Âàö–Â@—€—  —Âà—— ——Â@— —ÂÀ —  —— "—Â`—Â@—Â`—€——Âà—ÂÀ —Âà—  — ý–ÂÀ —Âà—Â`—Â@—Â`—€— —€—Â`—ÂÀ%—ÂÀ%—€—Â`—Â`—€—Âà(— /—Â,—Âà(—ÂÀ%—Âà(—€—Âà(—Â`5—Â`5— ;— ;—Â`5— ;— ;— ;—ÂÀ>— H—ÂàA—Â`5— ;—ÂE—Â@K— H—Â`N—ÂÀ>—ÂàA— ;—Â`N—ÂàA—€8— ;—Â`5—€8—ÂàA—ÂàA—ÂE— H— H—€Q—Â@K—ÂE—€Q— T—€Q—ÂàA—Â`N—€Q— T—ÂàZ—Â`N—Â@K—ÂÀW— T—€Q— T— T— a—Â^—€j—Â`g—Âàs—€j— m—€j—€j— m—ÂÀp—€j—Â`g— m—ÂÀp—Âw—Â@}—€ƒ—ÂÀ‰— †—Â`€—Â@}—Âàs— †—Â@}—Â`€— z—Âàs—Âw—Â`€—Â`€— z— †——ÂàŒ—Â`€— z—€ƒ—€ƒ— “—ÂÀ‰— “— “—Â@–—Â`™— Ÿ—Â`™— “— “— “—— “—Â@–—Â`™—Â`™—Â@–— Ÿ— Ÿ—ÂॗÂ@–—€œ— Ÿ—Â`™—ÂÀ‰——€œ— Ÿ—€œ— “— “—Â@–— Ÿ—Âॗ ¬—©— ¬—©—©—ÂÀ¢— ¬—Â@¯— ¬—€œ— “—€œ—Â@–—Â`™—Â`™— “—€œ— Ÿ—€œ— Ÿ—Âॗ Ÿ— ¸—ÂÀ»—ÂÀ»— ¸— ŗÂÀ»—ÂÀ»—Âྗ ŗÂྗ ŗÂྗ ¸—€µ—ÂྗÂྗ€µ—©—Â`²—ÂÀ»—Âྗ— ¸— ¸—€µ—ÂॗÂÀ‰—Â@}— m—Â^— ;—Â@—€—Âú–ÂàÝ–Â@Ζ€»– ™–Â`Ÿ–€‰– s–Â`m–ÂÀ]–€W– N– A–Âà.–€%–€%– – – –Â` – – ö•€ó•Âç• ݕ ݕÂÀà•Â@ԕ ݕÂ`וÂÀǕ ĕÂ`¾•ÂౕÂ`¥•Â`¥• Ÿ• «•Â@¢•Âà˜•Â`Œ• †•ƒ•ÂÀ|• m• m•Â@p•Âj•Âàf•Âàf•ÂÀc•ÂàM•ÂàM•ÂàM• G•ÂÀJ•ÂàM•€D•Â8• .•Â`(•ÂÀ1•€+•ÂÀ1•Â`(•Â`(•€+• "••Â`••Âà•Âà•Âà•ÂÀÿ” ü” ü” ð” ã”Âàé”Âàé”Â`ö”Â@ó” ð” ð”ÂÀƒ˜Â ­¶ÂànÎÂ`ÌÍÂÓÂÂ…¶Â•«Â@Ÿ¢Â ”›Âàü• ÂÂ@÷VÂÀ@ÂÀJ–Â{€ŽõÁ€öºÁòZÁI¿JvA€qBÀü:B€,dBR}B…„B@!…B@‚B€•xBÀõiB€nYBÀàGBS6B@)%BÀÍBB“îAgÔA€m¼AO¦A´‘AŠ|A³XA7AáAäí@œ®@¨^@PÃ?€Ô¾XÀhÀÊÐÀý Áÿ*ÁLÁ¸lÁ€·†Á€—Á€ §Áü·ÁÈÁn×Á€„æÁìôÁ@RÂ@ÝÂÀ÷ ÂÁÂ9ÂfÂ@N#Âø'Â@1,Â@0€Š3ÂÀ°6€9ÂÀ<Â@[>ÂÀ[@ÂVBÂÀD€´EÂÀGÂÀ]HÂÀ‰I£JÂKÂÀwLÂÀ?M€èM€°NÂÀ~OÂ@!PÂÀªPÂÀ'QÂÀ½QÂ@.RÂ@’RÂÀSÂÀfS€ÝS€ATÂ@ŸTÂ@êTÂ@5UÂ@€UÂÀ¾UÂ@ýUÂÀ;V€€VÂ@ÅVÂñVÂ@BW€aW WÂÀËWÂ@ñWÂÀ/XÂÀHXÂXÂÀÅXÂÀ÷XÂY€UYÂÀYÂ@³Y€ëYÂ*ZÂÀUZÂ@”Z€ÌZÂÀëZ [€I[Âo[Â@Ž[ÂÀš[ÂÀ³[Â@Ù[Â@ \Â7\ÂÀ{\ÂÀ­\ÂÀß\Â]Â@7]€V]ÂÀu]ÂÀ§]Â@Í]Â@æ]ÂÀò]Â@^Â@1^€7^€P^Â^Â@®^ÂÀÓ^€æ^Â@ù^Â>_€•_Â@¨_Â@Ú_Â`Â@>`Â@W`Âj`ÂÀ|`ÂÀ®`Â@í`ÂÀaÂ@QaÂdaÂ@jaÂÀaÂ@µa€ÔaÂÀ b€8b€jb€œbÂ@ábÂÀcÂ@c€KcÂ@wcÂÀœcÂÀµcÂîc dÂ@?dÂRdÂ@qdÂÀddÂÀ–dÂÏdÂÀúdÂ@ eÂeeÂ@keÂÀwe€£eÂ@ÏeÂ@èeÂfÂÀ?fÂ@Lf€kf‘fÂÃfÂÀîf€gÂ@-gÂ@_g‹gÂ@‘gÂ@ÃgÂ@ÜgÂhÂÀhÂÀLhÂÀ~hÂÀ—hÂ@½hÂ@ïhÂiÂMiÂfiÂ@…i±iÂ@ÐiÂ@ÐiÂÀjÂ@4jÂÀYjÂ@j«j€ÐjÂÀkÂÀ!k€4kÂÀSk€fk€k€˜k¾kÂðkÂ@lÂ@AlÂmlÂ@ŒlÂÀ˜lÂ@¥lÂÀãlÂ@ðlÂmÂ5mÂÀ`mÂ@†m€¾mÂ@nÂ@n€"nÂÀ(nÂ@NnÂznÂ@™n€¸nÂ@ËnÂÀ×nÂ÷nÂÀ;oÂÀmoÂ@ao€€oÂoÂ@ÅoÂØoÂ@ÞoÂ@pÂ@)p€/pÂÀNpÂ@tpÂ@¦pÂ@¿pÂÀËpÂëpÂÀqÂ@yÂ@WyƒyœyµyÂÀÇyÂ@íyÂzÂÀz€>zÂÀvz–zÂÀÁzÂÀÁzÂáz€íz€{Â@K{Âw{Âw{Â{Â@È{Â@á{ÂÀí{ÂÀí{ÂÀ|Â?|Â@^|Âq|Š|ÂÀœ|Â@Â|€á|ÂÀ}Â}€}ÂÀ2}ÂÀK}Â@q}€}Â@£}Â@¼}ÂÀá}ÂÀ~Â3~ÂL~ÂL~€q~—~ÂÀÂ~€Õ~Âû~ÂÀ&ÂÀ&ÂÀ?€RÂ_ÂÀŠÂ@°ÂÃÂÜÂõÂ@û€€Â €Â`)€Â <€Â <€ÂR€Â a€Â n€Âà€€ÂÀ–€Â “€ÂÀ¯€Â ¹€Â@¼€Â Å€Â`Ø€Â`Ø€Â`؀ ހ€ô€Â ÂÀ Â@  )Â3ÂLÂ`UÂàa€qÂàzÂà“Âà“ šÂ ¦Â`¹Â ¿Â ÌÂàÞÂÀô  ‚Â@‚ÂÀ&‚Â-‚ 0‚ <‚€9‚ <‚ I‚€R‚ b‚€k‚Â@~‚ÂÀŠ‚Âà‚Â@—‚ÂংÂ`³‚ ¹‚Â@É‚ÂÜ‚Â܂ ø‚ ƒÂ`ƒÂ€ƒÂ€ƒÂ *ƒÂà#ƒÂ@ƒÂ OƒÂ \ƒÂ@_ƒÂ€eƒÂ hƒÂ@xƒÂà‡ƒÂ`”ƒÂ¤ƒÂ@ªƒÂ`­ƒÂ ³ƒÂ@ÃÂփ كÂïƒÂ òƒÂ þƒÂ„ÂÀ„ $„Âà6„Â`C„ I„Â`\„€_„Âàh„Âl„ {„Âà„Â@‹„Â`Ž„Âž„€ª„ º„Â`À„Â`Ù„Â ì„Âàþ„€…Â… …Âà0… 7…Â`=… C…ÂàI… P… i…Âà{… ‚…Â Ž…Â`ˆ…˜…€¤…Âà­…Â`º… À…ÂÀÅ مÂà߅ ò…ÂÀõ…  †Â`†Â`†Â€!†Âà*†Â =†Â J†Â V†Â o†Â o†Â@f†Â€l†ÂÀr†Â`‚†Â ˆ†Â ˆ†ÂàŽ†Â •†Â ®†Â º†Â`͆€ІÂÀֆ à†Â ì†ÂÀï†Â€‡Â ‡Â@‡Â ‡Â +‡ÂÀ!‡Â`1‡ÂA‡Â 7‡Â 7‡ÂÀ:‡Â D‡ÂÀS‡Â P‡ÂÀS‡Â€f‡Âào‡Â v‡Â v‡Â`|‡Â ‚‡ÂÀ…‡Â ‚‡ÂŒ‡Â`•‡Â€˜‡ÂࡇÂ`®‡ÂÀ·‡Â@ćÂ@ćÂàÓ‡Â`à‡Â`à‡Â@ö‡Â`ù‡Â€ü‡Â ˆÂ@ˆÂàˆÂ@(ˆÂ€.ˆÂ 1ˆÂ >ˆÂ 1ˆÂ`DˆÂ JˆÂ WˆÂ€`ˆÂ€yˆÂ†ˆÂ@ŒˆÂ`ˆÂ`ˆÂ`ˆÂ •ˆÂÀ˜ˆÂ ¢ˆÂ ®ˆÂ@¾ˆÂ ÇˆÂà͈ àˆÂ`ÚˆÂêˆÂêˆÂ`óˆÂÀüˆÂÀüˆÂàÿˆÂàÿˆÂàÿˆÂ‰Â` ‰ÂÀ‰Â@"‰Â +‰Â 8‰Â€A‰Â@T‰Â Q‰Â j‰Â`p‰Â€s‰Â€‰Â ‰Â@Ÿ‰Â™‰Â€¥‰Â ¨‰Â€¥‰Â`¢‰Â€¥‰ÂÀ«‰Â`»‰Â Á‰Âàlj Ή ډÂÀ݉ÂÀö‰ÂÀö‰Â ŠÂ€ ŠÂŠÂ`ŠÂ@ŠÂà+ŠÂ 2ŠÂ@5ŠÂàDŠÂ€;ŠÂ`8ŠÂ >ŠÂ KŠÂà]ŠÂ`jŠÂ dŠÂ dŠÂ dŠÂ pŠÂ }ŠÂzŠÂàŠÂ –ŠÂ ¢ŠÂ ¯ŠÂ`µŠÂÅŠÂ`Ί€ъÂ`Ί ԊÂàÚŠÂ áŠÂ€êŠÂ@äŠÂ íŠÂ íŠÂÀðŠÂ@ýŠÂ ‹Â‹Â‹Â‹Â€‹Âà%‹ÂÀ"‹Â ,‹Â 8‹Âà>‹Âà>‹Âà>‹Âà>‹Â€N‹ÂàW‹Â ^‹Â@a‹Â ^‹Âàp‹Â w‹Â ƒ‹Âà‰‹Â‹Â`–‹ÂࢋÂ@¬‹Â€²‹ÂÀ¸‹Â€²‹Â¿‹Â Î‹ÂØ‹ÂÀы ۋ ۋÂÀê‹Âàí‹Âñ‹Â€ý‹Â`ú‹Â€ý‹Â ô‹Â@÷‹ÂÀŒÂ ŒÂÀŒÂ ŒÂ€/ŒÂ 2ŒÂà8ŒÂ<ŒÂ@BŒÂ€HŒÂ KŒÂUŒÂÀNŒÂÀNŒÂ XŒÂ€aŒÂàjŒÂ qŒÂÀ€ŒÂ }ŒÂ }ŒÂ –ŒÂ –ŒÂàœŒÂÀ™ŒÂÀ™ŒÂ –ŒÂ ŒÂ€¬ŒÂ ¯ŒÂ ¯ŒÂÀ²ŒÂ¹ŒÂ`Œ ՌÂàΌ ՌÂÀäŒÂ€÷ŒÂ úŒÂ úŒÂ úŒÂ`ôŒÂ€÷ŒÂ ÂÀÂà  , 9Âà2Âà2 9Âà2Âà2€B R€[ ^Âh kÂÀzÂà} „ „ „Â@‡Âà– €¦Â@ Â@ Âà¯Â ©Â ³ ÂÂàÈ€¿Â`¼ÂÌ Ï ÏÂàáÂ@ë€ñ ôÂÀ÷ ŽÂ ôÂàú ŽÂÀŽÂ@ŽÂ &ŽÂ€<ŽÂ ?ŽÂ`9ŽÂ€<ŽÂ ?ŽÂàEŽÂàEŽÂ@OŽÂ LŽÂ`RŽÂ€UŽÂ@OŽÂÀ[ŽÂ@hŽÂ€nŽÂ qŽÂàwŽÂÀtŽÂ`„ŽÂÀŽÂ —ŽÂ —ŽÂ੎ ¼ŽÂ­ŽÂ­ŽÂ੎ °ŽÂƎ Ɏ ¼ŽÂàÂŽÂàŽ€Ҏ Ɏ ՎÂàێ€ëŽÂ@þŽÂ ûŽÂ ÂÀ Âà  €Â@    €  Â@0€6Â`L€O R R RÂàXÂàX _Â@b _Â@b€h k xÂ@{ „Â`~ „ ‘ÂŽÂ@” €šÂÀ ÂÀ ÂÀ Â§Â`°Â ¶ÂÀ¹Â ¶Â`°ÂÀ€Ì ÏÂÀÒÂàÕÂ`âÂòÂ`ûÂÀÂàÂà ÂàÂ`û Â@Â`Â$ 'Âà Âà Â`-€0 'Â@*Â`-Â`- 3Â@C€IÂÀOÂVÂ@\€b eÂ@\ eÂoÂ@u ~ˆˆÂÀ€”Â`‘ ‹Â`‘€”ÂÀšÂ ¤Â€­Â`ªÂ °Â`ªÂ€­Âà¶Â€ÆÂ`à½Â€ÆÂàÏÂ@Ù Ö â ïÂ`õ€øÂ€øÂ ïÂàèÂìÂ@òÂ`õ€øÂ`‘€‘ ‘ ‘Âà‘‘ -‘Âà3‘€*‘Â@$‘ÂÀ0‘Âà3‘Âà3‘Âà3‘Âà3‘ :‘Â`@‘ÂàL‘ S‘ÂP‘€\‘ _‘Â@o‘Â@o‘€u‘€u‘ x‘ x‘ÂÀ{‘Âà~‘€u‘Â@o‘ x‘Âà~‘‚‘ …‘Â@ˆ‘ ‘‘ ‘‘ ‘‘ ž‘ ž‘ ž‘Â`¤‘Â`¤‘Âà°‘Âà°‘Â`¤‘ ª‘€À‘ÂÀƑ Б БÂ`֑€ّ ܑÂÀߑ ܑ ܑÂÀߑ é‘Â`ï‘ÂÀø‘ÂÀø‘€ò‘Â`ï‘Âàâ‘Âàâ‘ é‘€ò‘ÂÀø‘Âàû‘€ ’ÂÀ’Âà’ ’Âà’ ’ '’€$’Â`!’€$’ '’Â1’Âà-’Âà-’ 4’Â`:’ÂJ’Â@P’ M’ÂÀC’ M’Â`S’ Y’Â`S’€V’Âà_’Â`l’Â@i’€o’Â`l’€o’Â|’Â|’Â`…’ÂÀŽ’ÂÀŽ’Âà‘’Â ‹’Â`…’•’Â@›’€¡’Â`ž’ ˜’Â@›’ ¤’®’ ¤’Â઒Â઒Â@´’ÂàÃ’Â Ê’Â@͒ ֒Âàܒ ֒€Ӓ€Ӓ ã’Â`é’ ã’Â@æ’Â@æ’Âàõ’Âàõ’ ü’ÂÀò’ ü’ ü’ ï’Âàõ’Â`é’Â`é’Âàõ’Â`“Âà“€“ “Âà“Â@“ !“Â`“Âà“Â`“ ““ !“ÂÀ$“ÂÀ$“ .“ .“Â`4“ .“Âà'“ .“Âà'“Â`4“ :“ :“ :“ÂÀ=“ÂD“Â`M“ÂÀV“ `“ÂÀV“Â@c“ `“€i“Â`f“€i“ÂàY“ÂàY“ÂàY“ `“ `“Â@c“ l“Â`f“ l“ y“ y“Â`“ y“ y“Â@|“ ’“Â`˜“Âà‹“Â“Â`˜“ÂÀ¡“ÂÀ¡“¨“ÂओÂओÂÀ¡“¨“Â`±“ÂओÂÀ¡“ «“ «“Â@®“€´“Â`±“Âན «“ «“Â`±“ÂÀº“ ēÂ`ʓ ēÂནÂནÂÁ“€͓Â`Ê“Â`Ê“ÂནÂ`ʓ ē ГÂ`ʓ€͓Â@à“Â@à“Â`㓀擀擠é“Â`㓀擠ö“Âàï“ é“ÂÀì“ ö“Â`ü“Âó“Âàï“Âó“Â`ü“Âà”Âà” ” ” ”Â@” ”Â`”€”€”Âà!”Âà!”Âà!”Â%” (” (”Âà!”Â`.”Â`.” (”Â`.”€1”Â>”Âà:”Â>” 4”€J” M” Z”ÂàS”ÂÀP” Z”ÂW”Â``” f” f”Âàl”ÂÀi”ÂÀi” f”Âàl”Âp”Â`y” s” s”€|” Œ” Œ” Œ”Âà…”Â`’”Â@”Â`’”‰” Œ”Â`’”€•”Âàž”Â¢” ¥” ¥”¢”¢”Â@¨” ¾”Âු€®” ±”Âු€®”€®”ÂÀ´”Â`«”€®” ¾”Â`Ä”Â`Ĕ ¾”Â`Ĕ€ǔÂ`Ĕ€ǔ ʔÂÀÍ”ÂÔ”Â@Ú”Â@Ú”Â`Ý”ÂÀæ” ã”Â`Ý”Â@ڔ€à”Âí” ð” ð”Âàé” ð”Â@ó”Â`ö”Â`ö”ÂÀÿ” ð”Â`ö”Â`ö”Âà•€• •Â@ •€•ÂÀ•ÂÀ••ÂÀ•Âà•• "•Â@%• "••Âà•€•ÂÀ• •€• • "•€+•Â@%•€+•€+•Â`(• "•Âà• "• "•Â`(•€+•ÂÀ1•Â`A•Â`A•ÂÀJ• G•€D• G•Â`A• G•ÂÀJ•€D•€D• G•ÂQ• T•Â@W• T•Â`Z• `• `•€]•Âàf•Âàf•ÂÀc• m• m• y• y• y•Âà• †•Âà•Â@p• y•Â@p• y• y•ƒ• ’•Â`Œ•Âà•Â@‰•Â`Œ•Âà˜•Â Ÿ•Âà˜•Â Ÿ• «•Â@¢•Â@¢•ÂÀ••Âà˜•Âœ•Âà˜•Âà˜•Âœ• «• Ÿ•Â`¥•ÂÀ••€•Âà˜•Â`¥•€¨•Â`¾•Â`¾•µ•Â@»• ĕÂΕÂàʕ ѕÂàÊ•ÂàÊ•ÂàÊ•Âàʕ ѕÂΕÂàʕ ѕÂ`ו ê• ê•Â`ð• ê• ê•Âàã• ݕ€ڕ ݕ€ڕ ݕÂ@ԕ ݕÂàã•Âàã• ê•Âç•ÂÀà• ê• ê•Â@í•ÂÀù•Â`ð•Â`ð•Âàü• ö• ö•Âàü•–ÂÀù•––Âàü•–ÂÀù•–ÂÀ–Â` – – –Â@–€%–€%–Â`"–Â@–€%– (–Â`"–Âà.– 5–Âà.– 5–ÂÀ+–ÂÀ+–ÂÀ+– (–ÂÀ+– (– (–Â2– 5– 5–Â`;–€>– A–ÂàG– N– N–€W–€W–ÂK–ÂàG– N–Â@Q–ÂK– A–ÂàG–Â@Q– Z–€W–Â`T–ÂK–ÂK– N–Â@Q–Â@Q–€W–€W–ÂÀ]– Z–Âd–Â@j–Â`m–€p–€p– s– s– s–ÂÀv–Âày– s–Â}–Âày–Â@ƒ–€‰–€‰–Âà’–Â€‰–Â`†–Âày–Âày–Â}– €–Â@ƒ– €–Â}– €– €– €– s–Â@ƒ– Œ–€‰– Œ– ™– ™– ™– ™–ÂÀ– Œ–Â`†– €–Â`†– Œ–Â@ƒ–€‰–€‰–€‰– Œ– Œ– Œ–ÂÀ–––€‰–Â`†–ÂÀ– ™–€¢–Âà«–ÂÀ¨–Â૖€»–€»–ÂàÄ–ÂÀÁ– ¾– ¾– ¾–Â`¸–Â@µ–Â`¸– ¾–€»–Â@µ– ¾–€»– ¾–€»– ¾– ˖ÂàÝ–ÂàÝ–ÂÀږ ז€ԖÂÈ–ÂÀÁ– ¾–ÂÈ–Â@Ζ ˖Â`і זÂ`і ז€Ԗ ז זÂ`Ñ–ÂàÝ–Âá–Âá– ä–ÂàÝ–Âàö–€í–Â@ç–Â@ç– ä– ð–Â`ê– ä– ð–Â`ê– ð–€í– ð– ý– ð–€í– ð–Âàö–Âàö– ý–  — ý–Âú–Â@— ý– ý–Âàö–Âú–Âàö–Â`—ÂÀ —Âà—€—Âàö–Âàö– ý–  —  —Â@—  —Â@—€—ÂÀ —Â`— ——ÂÀ —Âà—Â`—€—Â@— ý–Â`—  —Âà— —Â@—€—€—€—Â,—Â,— ;—Â@2— ;—ÂÀ>— H—Â@K—ÂàA—€8—Â`5— ;—ÂÀ>—ÂÀ>—ÂàA—ÂÀ>— ;—Â`5—ÂàA—ÂÀ>—Â`N—Â`N—Â@K— H—Â`N—Â@K—ÂÀ>—ÂàA—Â@K— H—Â`N—Â@K— H—Â`N—€Q—ÂàZ—ÂàZ—ÂàZ—Â^—Â^—Â^—ÂàZ— T—€Q—ÂÀW—Â^— a—Â@d—€j— m—Âàs—Âàs— †—Â`€— z— a— a— a—€j—Â@}—Â@}—Â`€—Â`€—Âàs—Âàs—Â`€— z— z—ÂÀp— z— z— z—Â@}— †— †— †— †—ÂÀ‰—ÂÀ‰— †—— “—ÂàŒ—ÂàŒ—Â “—ÂÀ¢—ÂÀ¢—€œ——Â@}— †—ÂàŒ—Â—Â@–—€œ— “— Ÿ— Ÿ— Ÿ—©—Â@¯—ÂॗÂॗ ¬— ¬—Â`²—Â@¯—ÂÀ¢—Âॗ€œ—ÂÀ¢—©—Â`²—ÂÀ¢—ÂॗÂॗ©—Â`²—€µ— ŗ ŗ€µ—ÂྗÂÀ»—ÂÀ»— ¸—ÂྗÂÀ»—ÂÀ»— ¸—Â@ȗ ŗ—— ŗ ŗ ¸— ¸—Â@¯— ¬—©—Â`²— ŗ ŗ ŗ ŗÂÀÔ—ÂÀÔ—ÂÛ—ÂÀԗ€ΗÂÀԗ їÂàח їÂ@È—Â@ȗ їÂ@á—Â@á—ÂÛ—Â`ä—Âۗ€ç— ê—Âàð—€ç— ê—Â`ä— ê— ê— ޗ€ç—Â@ú— ÷—Âô—Â`ý—€˜Âô— ê—Â`ý— ÷—Âô—Âô—Âàð— ÷— ÷—Âàð—ÂÀí—Â`ý—Â`ý— ˜Â@ú—€˜Â ˜Âà ˜ÂÀ˜Â ˜Âà ˜Â@˜Â ˜Â`˜Â ˜Â ˜Â ˜Âà ˜Â ˜Â@˜Âà ˜Â ˜Âà ˜Âà ˜Â@˜Â`˜Â@˜Â ˜ÂÀ˜Â ˜Â ˜Â ˜Â ˜Â€˜Â€˜Â€˜ÂÀ˜Â`˜Â&˜Â€˜Â€˜Â€˜Â@˜Â€˜Â ˜Â ˜Â ˜Â`˜Â`˜Â ˜Â&˜Â`˜Â@˜Â ˜Â ˜Â€˜Â@˜Â ˜Â ˜Âà ˜Âà ˜Â`˜Â`˜Â€˜Âà"˜Âà"˜Â&˜Â ˜Â`˜Â ˜Â ˜Â`ý—Â@ú—Â`ý— ˜Â`˜Â`˜ÂÀ˜Â ˜ÂÀ˜Âà"˜Â )˜ÂÀ˜Â€˜ÂÀ˜Â@˜Â ˜Â€˜Â ˜Â ˜Âà"˜Â )˜Â@,˜Â`/˜Â ˜Â`˜Â ˜Â ˜Â ˜Â ˜Â )˜Â )˜ÂÀ˜ÂÀ˜Â`˜Âà"˜Âà"˜Â )˜Âà"˜Âà"˜Âà"˜Â&˜Â&˜Â&˜Â&˜ÂÀ˜ÂÀ˜Â ˜Â`˜Â`˜Â€˜Â@,˜Â€2˜Â 5˜Âà;˜Â 5˜Â€2˜Â`/˜Â€2˜Â`/˜Â )˜Â&˜Â&˜Âà"˜Âà"˜Â@,˜Â`/˜Â 5˜Âà;˜Â B˜Â`H˜Â?˜Âà;˜ÂÀ8˜Â€2˜Â€2˜Â`/˜Â€2˜Â@,˜Â&˜Â )˜Â )˜Â@,˜Â )˜Âà"˜Â`/˜Â`/˜Â?˜Â 5˜ÂÀ8˜Â?˜ÂÀ8˜Â 5˜Â 5˜Â B˜Âà;˜Â@E˜Â@E˜Â?˜ÂÀ8˜Â€2˜Â B˜Âà;˜Â B˜Â`H˜Â€K˜Â`H˜Â€K˜Â`H˜Â N˜Â€K˜ÂàT˜Â [˜ÂÀQ˜Â [˜Â N˜Â@E˜Â@E˜Â B˜Âà;˜Â@E˜Â N˜Â`H˜Â`H˜Â@E˜Â`H˜Â B˜Â@E˜Â€K˜Â N˜Â€K˜ÂÀQ˜ÂX˜ÂàT˜Â [˜Â@^˜Â [˜ÂX˜Â€d˜Â g˜Â`a˜ÂX˜Â N˜Â g˜Â g˜Â€d˜Â`a˜ÂX˜ÂX˜ÂàT˜ÂX˜Â`a˜Â€d˜Â`a˜Â [˜ÂX˜ÂÀQ˜Â€K˜Â€K˜Â`H˜Â`H˜ÂàT˜Â@^˜Â@^˜ÂàT˜ÂàT˜Â@^˜ÂÀj˜Âàm˜Â g˜Â g˜Âàm˜Âàm˜Â t˜Âq˜Âàm˜Âq˜Â t˜Âàm˜Â€d˜Â g˜Âàm˜Â@w˜Â`z˜Â@w˜Â`z˜Â@w˜Âàm˜Âq˜Âàm˜Â`a˜Â [˜Â [˜Â [˜Â g˜ÂÀj˜Â€d˜ÂÀj˜Â g˜Âq˜Â`z˜Âq˜Âq˜Âq˜Â t˜Â`z˜Âàm˜Âàm˜Â€d˜Â@^˜ÂàT˜ÂX˜Â [˜Â@^˜Â [˜Â N˜Â`a˜Â€d˜Â`z˜Â@w˜Â €˜Â@w˜Âq˜ÂÀj˜Â€d˜Â€d˜ÂÀj˜Â@^˜Â@^˜Â`a˜Â [˜Â g˜Â g˜ÂÀj˜Âq˜ÂÀj˜Â g˜Â g˜Â`a˜Â`a˜ÂÀj˜Â g˜Â@^˜ÂàT˜Â [˜ÂX˜Â€K˜ÂX˜Â g˜Â€d˜Â@^˜ÂX˜Â [˜Â@^˜Â`a˜Âàm˜Â t˜Âàm˜Âàm˜ÂàT˜Â`a˜Â€d˜Â@^˜ÂÀQ˜ÂÀQ˜Â N˜Â`H˜Â B˜Â B˜Â B˜Â B˜ÂX˜ÂX˜Â N˜Â N˜Â€K˜Â€K˜Â N˜ÂàT˜Â [˜ÂàT˜ÂÀQ˜Â€K˜ÂàT˜ÂX˜ÂàT˜ÂX˜ÂàT˜Â@^˜Â@^˜Â [˜Â [˜Â [˜ÂÀQ˜Â [˜Â`a˜ÂÀQ˜ÂàT˜ÂÀQ˜Â N˜Â [˜ÂàT˜ÂàT˜ÂàT˜Â`a˜Â`a˜Â@^˜Â [˜Â [˜ÂX˜ÂàT˜ÂàT˜Â@E˜Â@E˜Â [˜Â g˜ÂÀj˜Â`a˜ÂX˜ÂàT˜Â@^˜Â [˜Â@^˜Â N˜Â [˜Â`a˜Â€d˜ÂÀj˜Â€d˜ÂÀj˜Â€d˜Â g˜Â g˜Âàm˜Â`a˜Â@^˜Â [˜Â g˜Â€d˜Â g˜Â g˜ÂàT˜ÂX˜Â€d˜Â€d˜Â€K˜Â N˜Â`H˜Â N˜Â [˜ÂÀQ˜Â N˜Â@^˜Â [˜Â@^˜Â`a˜Â [˜ÂX˜Â@^˜ÂX˜Â N˜Â€K˜Â?˜Â€K˜ÂàT˜ÂàT˜ÂàT˜Â N˜Â N˜Â N˜ÂX˜Â [˜Â [˜ÂàT˜Â [˜ÂàT˜ÂX˜ÂÀQ˜ÂàT˜Â€K˜Â N˜ÂX˜Â N˜Â`H˜Â B˜Â@E˜Â@E˜Â@E˜Â B˜Â@E˜Â N˜Â N˜Â [˜ÂàT˜ÂX˜Â€d˜Â [˜Â@^˜Â`a˜Â`a˜Â@^˜Â [˜Â N˜Â`H˜Â?˜Âà;˜Â€K˜Â`H˜Â N˜Â N˜ÂàT˜ÂàT˜ÂX˜Â N˜Â N˜Â€K˜Â`H˜ÂàT˜ÂàT˜ÂàT˜Â N˜Â?˜Â B˜Â€K˜ÂàT˜ÂX˜ÂàT˜ÂàT˜ÂàT˜Â [˜ÂÀQ˜Â N˜Â N˜ÂÀQ˜Â [˜Â [˜ÂÀQ˜ÂàT˜ÂÀQ˜Â [˜ÂàT˜Â€K˜Âà;˜Â B˜Â`H˜Â N˜Â`a˜ÂÀQ˜Â [˜Â`a˜Â g˜Âàm˜Âàm˜Âq˜Â`a˜Â€d˜Â`a˜Â`a˜Â€d˜Â`a˜Â N˜Â N˜ÂàT˜Â [˜Â [˜Â N˜Â N˜Â€K˜Â@E˜Â N˜ÂÀQ˜Â€K˜Â€K˜ÂàT˜ÂÀQ˜Â N˜ÂX˜Â [˜Â [˜Â [˜Â€d˜Âq˜ÂÀj˜Â`a˜Â [˜Â [˜ÂàT˜ÂÀQ˜Â@E˜ÂX˜Â [˜Â@^˜ÂX˜Â [˜Â g˜Â [˜Â€d˜Â€d˜Â`a˜Â@^˜ÂÀQ˜ÂàT˜ÂàT˜ÂàT˜ÂàT˜ÂÀQ˜ÂÀQ˜Â N˜ÂX˜ÂX˜Â@^˜Â`a˜Â€d˜Â€d˜Â [˜ÂàT˜ÂÀQ˜ÂàT˜ÂÀQ˜ÂàT˜Â`a˜ÂÀj˜Â@^˜Â`a˜Â g˜Â g˜Âq˜Â t˜Âàm˜ÂÀj˜Â g˜Â€d˜ÂàT˜Â€K˜Â N˜Â`H˜ÂÀQ˜Â N˜ÂÀQ˜Â€d˜Â€d˜Â€d˜Â€d˜ÂÀj˜ÂÀj˜ÂÀj˜Â g˜Â g˜Â [˜Â [˜Â`a˜Â g˜Â`a˜ÂÀj˜ÂÀj˜Âàm˜Â g˜Â€d˜Â€d˜Â@^˜Â g˜Âàm˜Âàm˜Â €˜Â`z˜Âq˜ÂÀj˜Â t˜Âq˜Âàm˜Âq˜Â@w˜Â@w˜Â t˜Â t˜ÂÀƒ˜Â€}˜Â€}˜Âq˜Âàm˜Âàm˜Âàm˜Â t˜Âàm˜Â g˜Â t˜Â`z˜Â€}˜Â €˜Âà†˜ÂŠ˜Âà†˜Â`“˜Âà†˜Â €˜Âà†˜Â ˜ÂŠ˜ÂŠ˜Â ˜Â ˜Â €˜Â €˜Â t˜Â@w˜Â`z˜Â €˜Â €˜Â €˜Âq˜Âq˜Â€}˜Â €˜Âà†˜Âà†˜Â`“˜Â ˜Â€–˜Â ˜ÂÀƒ˜ÂÀƒ˜Â€}˜Â€}˜Â €˜Âà†˜Â`z˜Â t˜Â`z˜Â €˜Â €˜ÂŠ˜ÂÀƒ˜Âà†˜Âà†˜Â €˜Â@˜ÂŠ˜Â ˜Â`“˜ÂàŸ˜Â ™˜Â@˜Â@˜Â ˜Â`“˜Âà†˜Â ˜ÂŠ˜Â`“˜Â`“˜Â ™˜Â ™˜Â ™˜Â ™˜ÂÀœ˜Â€–˜Â€–˜Â ™˜Â€–˜ÂÀœ˜Â€–˜Â`“˜ÂàŸ˜Â ™˜Â£˜Â ¦˜ÂÀœ˜ÂàŸ˜Â ¦˜Â ™˜ÂàŸ˜Â ¦˜ÂàŸ˜Â€–˜Â`“˜Â€–˜ÂàŸ˜ÂàŸ˜Â£˜Â`¬˜Â€¯˜Â ¦˜ÂàŸ˜Â ™˜Â`“˜ÂŠ˜Â ˜ÂŠ˜Â ™˜Â ™˜Â£˜Â£˜Â ¦˜Â`¬˜Â ²˜Â ¦˜Â`¬˜Â@©˜Â ¦˜ÂàŸ˜Â£˜ÂÀœ˜Â`¬˜Âธ ²˜Â ¦˜Â€¯˜Â ²˜ÂÀµ˜Â`¬˜Â ¦˜ÂàŸ˜Â€¯˜Â`¬˜Â@©˜Â`¬˜Â£˜Â ²˜Â@©˜ÂàŸ˜Â@©˜Â ²˜Â¼˜Â¼˜Â¼˜Â€¯˜ÂÀµ˜ÂธÂÀµ˜Âธ€¯˜Â@©˜Â£˜ÂàŸ˜Â ¦˜Â ¦˜Â ¦˜Â ²˜Â`¬˜Â ²˜Â ²˜Â ²˜Â ²˜ÂธÂธ ¿˜Â¼˜Â ¿˜Â ¿˜Â ²˜Â ²˜Â€¯˜Â ²˜Â€¯˜Â€¯˜ÂธÂธÂธÂธÂÀµ˜Â€¯˜Â ²˜Â`¬˜Â`¬˜Âธ ¿˜Â@˜Â`Ř ¿˜Â Ë˜Â ¿˜ÂÀµ˜ÂธÂธ¼˜Â ¿˜Â ¿˜Â@˜ ˘ ¿˜Â ¿˜Â ¿˜Â¼˜ÂÀµ˜Â`¬˜ÂธÂ`¬˜Â£˜Â ™˜Â€–˜Â ¦˜Â`¬˜Â€¯˜Â`¬˜Â€¯˜Â€¯˜Â ¿˜Â ¿˜Â`¬˜Â ²˜Â ²˜ÂÀµ˜Âธ€Ș¼˜Âธ€Ș€Ș ˘Â`ŘÂÀµ˜Âธ ¿˜Â ²˜Â`¬˜Â`¬˜Â£˜Â ¦˜Â`¬˜Â ²˜ÂÀµ˜Â€¯˜Â`¬˜Â`¬˜Â ²˜Â ¦˜ÂàŸ˜Â£˜Â`¬˜Â ™˜Â`“˜Â ˜ÂŠ˜Â ™˜ÂÀœ˜Â€–˜Â£˜Â`¬˜Â@©˜ÂÀµ˜Â¼˜Â ¿˜Â ²˜ÂàŸ˜Â@©˜ÂàŸ˜Â€–˜Â€–˜ÂàŸ˜ÂàŸ˜ÂÀœ˜Â ¦˜Â£˜ÂàŸ˜Â£˜Â@©˜Â@©˜ÂÀœ˜ÂàŸ˜ÂàŸ˜Â`“˜ÂÀœ˜Â@˜Â`“˜Â@˜Â ™˜Â€–˜Â ™˜Â ™˜Â€–˜ÂàŸ˜Â ™˜Â ˜ÂŠ˜ÂÀƒ˜Â€}˜Â €˜Â €˜Âà†˜Âà†˜Â ˜Â ™˜Â ™˜ÂàŸ˜Â ™˜Â@˜Â@˜Â ˜Â ™˜Â`“˜ÂŠ˜Â`“˜Â€–˜Â€–˜ÂÀœ˜Â ¦˜ÂàŸ˜Â ¦˜Â ¦˜Â@©˜Â ¦˜Â ™˜ÂÀœ˜Â ™˜Â€–˜Â£˜Â@©˜Â€¯˜Â`¬˜Â ¦˜Â`¬˜ÂÀœ˜ÂàŸ˜ÂÀœ˜Â£˜ÂàŸ˜Â ¦˜Â`¬˜Â@©˜Â€¯˜Â@©˜Â`¬˜Â ²˜Âธ ²˜Â ²˜ÂÀµ˜Â€¯˜Â`¬˜Â ¦˜Â€¯˜Âธ ¦˜Â ¦˜Â`¬˜Â£˜Â ¦˜Â@©˜Â€¯˜Â ²˜Â ²˜ÂธÂ@©˜Â ²˜Â€¯˜Â ¦˜ÂÀµ˜Â ²˜Â ²˜Â`¬˜Â`¬˜Â€¯˜Â€¯˜Â ¦˜Â ¦˜ÂàŸ˜ÂÀœ˜ÂàŸ˜Â ¦˜ÂÀµ˜Â€¯˜Âธ ²˜ÂÀµ˜ÂธÂÀµ˜Â€¯˜ÂธÂ`¬˜Â ¦˜Â ¦˜ÂàŸ˜Â ¦˜Âธ¼˜Âธ¼˜Â ¿˜Â€È˜Â Ë˜Â`ŘÂธÂÀµ˜ÂÀµ˜Â€¯˜Âธ ¿˜ÂธÂ@˜¼˜Â`Ř ˘ ˘€ȘÂ`ŘÂ@˜Â`Ř¼˜Â@©˜Â ²˜Â`¬˜Â ²˜Â ²˜Âธ€¯˜Â€¯˜Â ²˜Â¼˜Âธ¼˜Â€¯˜ÂÀµ˜Â ²˜Â`¬˜ÂธÂÀµ˜Â ²˜Â ²˜ÂธÂธÂธ ˘Â`Ř ¿˜Â@˜ ¿˜Â ¿˜Â ¿˜Âธ ¿˜Â ¿˜Â`ŘÂàј ˘ ˘ ¿˜Â ¿˜Â€È˜Â¼˜ÂธÂธÂธ ¿˜Â Ë˜Â ؘÂÀΘÂ`ŘÂธÂ`Ř ˘Â`Ř ˘ ˘ÂÀΘ€ȘÂàј€Ș ˘ ؘÂ@ۘ ˘Â@˜ ˘ÂÀΘ€Ș€Ș ¿˜Â ¿˜Â ¿˜Â ¿˜ÂàјÂÕ˜Â՘€Ș€Ș ˘€Ș ˘ ˘ÂÕ˜Âàј ˘Âธ€Ș€Ș€Ș ˘Â`Ř ˘ÂÀΘÂàј ˘€Ș ˘ ¿˜Â€È˜Â`؀ȘÂ`ŘÂàјÂàјÂ`ŘÂ@˜ ¿˜Â€È˜Â ¿˜Â Ë˜Â Ë˜Â Ë˜Â Ë˜ÂàјÂàјÂ`ŘÂ`Ř ˘Âàј€Ș ˘ÂàјÂ@Û˜Â`Þ˜ÂàјÂàјÂàјÂàјÂàј ˘ÂÀΘÂÀΘ ˘ÂÕ˜ÂÕ˜ÂàјÂàјÂÀΘ¼˜Â Ë˜Â ؘ ä˜Â€á˜Â ؘ ä˜Â`ޘ ä˜Â€á˜Â€á˜Â@ۘ ä˜Âàê˜Â`Þ˜Â`ޘ ؘ ؘÂ`ޘ ñ˜Âàê˜Âàê˜ÂÀç˜Â@ۘ€á˜Â@Û˜Âàј ˘€Ș ˘ ؘÂÕ˜ÂàјÂ՘€á˜Â ؘÂàј ؘ€á˜Â ä˜Â ä˜ÂÕ˜Â`Þ˜Â`Þ˜Â`Þ˜Âàê˜Â€ú˜Â ý˜Âà™Â`÷˜Â ñ˜Âî˜ÂÀç˜Â`Þ˜Â`ޘ€á˜Â ä˜Â€á˜Â ä˜Â ñ˜Âî˜Â ñ˜Â`÷˜Âàê˜Âàê˜Â ñ˜Â ñ˜Âî˜Â@ô˜Â ñ˜Âàê˜Âàê˜Â ñ˜Â ñ˜Â ä˜Âî˜Â@ô˜Â ñ˜Â ñ˜Âà™Â`÷˜Â ý˜Âà™Â ý˜Â ñ˜Â@ô˜Âàê˜Â ñ˜ÂÀç˜Âàê˜Â ä˜Â ä˜Â ñ˜Âàê˜Âàê˜Âàê˜Âî˜Â`÷˜Âî˜Â ñ˜Â ä˜Â@Û˜Â@ۘ€á˜Â@Û˜Â`Þ˜Â@ۘ ؘ ä˜ÂÀç˜Â ñ˜Âàê˜Âî˜Â€ú˜Â`÷˜Â ý˜Â€ú˜Â ñ˜Â ñ˜Âî˜Âàê˜Âàê˜Âàê˜Âàê˜ÂÀç˜Â ñ˜Âàê˜Âàê˜Â`Þ˜Â`Þ˜ÂàјÂ@ۘ€á˜Â ä˜Â ä˜Â ñ˜Âàê˜Â ä˜ÂÀç˜Â ñ˜ÂÀ™ÂÀ™Â@ ™Â€™Âà™Â`÷˜Âî˜Â`÷˜Â ñ˜Â ñ˜Â€ú˜Âà™Â`÷˜Âî˜Âî˜Â@ô˜ÂÀç˜Â ä˜Â`Þ˜ÂÀç˜Âî˜Â ý˜Â ñ˜Â ñ˜Â@ô˜Â ñ˜Âàê˜Â ñ˜Âàê˜Â ä˜Â€á˜Âàê˜Âàê˜Â ñ˜Â@ô˜Â ý˜Â ñ˜ÂÀç˜Â€á˜Â ؘ ä˜Â ä˜Âî˜Â ñ˜Â ñ˜Â`÷˜ÂÀ™Â@ô˜Â ý˜Â@ô˜Â ñ˜Â ñ˜Âàê˜Â ñ˜Â€ú˜Â€ú˜Â ™Âà™Â€ú˜Âî˜Â ñ˜Â@ô˜Âî˜Âàê˜Âî˜Â ä˜Â ä˜Â ä˜Âàê˜Â@ô˜Â`÷˜Â`÷˜Â@ô˜Âî˜Âî˜Â ý˜Â ý˜ÂÀ™Â@ô˜Âî˜Â ñ˜Âàê˜Â ä˜Â`ޘ ñ˜Â@ô˜Âàê˜Â ä˜Â ä˜Â€á˜ÂÀç˜Âàê˜Â ñ˜Âî˜Âàê˜Â ñ˜Âî˜Â ä˜Â@ۘ ä˜Â`Þ˜Â@ۘ ؘ ä˜Â`ޘ€á˜Â€á˜Â`Þ˜Â`ޘ ؘ ؘ ؘ ؘÂàјÂ՘ ؘÂàј ˘Â՘€á˜Â ä˜ÂàјÂÀΘÂÀΘ ؘÂàјÂàјÂ`ŘÂ`Ř ˘Âàј ˘Â@˜ ؘÂ`ޘ€á˜Â ؘ ؘÂàј€ȘÂÀΘÂ`Ř ˘ ¿˜Â€È˜Â Ë˜Â€È˜Â Ë˜Â՘ ؘÂ@Û˜ÂàјÂ@˜Âธ ˘Â`ŘÂÀΘÂàјÂÀΘÂ@Û˜Â`Þ˜Â`ޘ ؘÂàјÂÀΘÂ@Û˜Â`Þ˜Â`ޘ€á˜Â ä˜Â ä˜Â`Þ˜ÂàјÂÀΘÂ`ŘÂ@ۘ ؘÂ`Þ˜Â`ޘ€á˜Â`ޘ ؘÂÀΘÂàјÂÀΘÂ`Þ˜Â`ޘ ä˜Â ؘÂ`Þ˜Â`Þ˜Â`ޘ ä˜ÂÀΘ ؘÂÀΘÂÀΘ ˘Â@˜€Ș€Ș ¿˜ÂธÂ`ŘÂÀΘ ؘÂàјÂàјÂÕ˜Âàј€Ș€Ș ¿˜Â ¿˜Â@˜Â`Ř ˘ÂธÂ`؀Ș ˘Â`ŘÂธ€¯˜ÂÀµ˜Â Ë˜Â€È˜ÂÀΘ€á˜Â`Þ˜Â@Û˜ÂÕ˜ÂÀΘÂ`Ř¼˜Â@˜ ¿˜Âธ€ȘÂ`Ř ˘ÂÀΘ ˘ÂÕ˜ÂÀΘÂÀΘÂÀΘÂ՘ ؘÂàј ؘÂÀΘ€Ș€ȘÂ@˜ ˘Â`Ř ¿˜Â€È˜Â€È˜ÂÀµ˜Â ¿˜Â Ë˜Â€È˜Â ؘÂàјÂ՘€á˜Â ä˜Â@Û˜ÂÀç˜Â ä˜Âàê˜ÂÀç˜Â€á˜Â`ޘ ؘÂàјÂàј ؘ ؘÂ`Þ˜Â`ޘ ؘÂ`ŘÂ`ŘÂÕ˜Â@Û˜Â@Û˜Â`Þ˜Â@Û˜ÂÕ˜Â@Û˜Â՘€á˜Â@ۘ ؘ€á˜Â ä˜Âàê˜Â ä˜Â`Þ˜Â`Þ˜Âî˜Âî˜Â ä˜Â ä˜Â€á˜Â ä˜Â`ޘ ؘÂÕ˜Â@Û˜Â`ޘ ä˜Â ä˜Â ؘ€á˜Â`Þ˜ÂÀΘÂàјÂàјÂ@Û˜Âàј€ȘÂธÂ`ŘÂàј€á˜Â`ޘ ؘ€ȘÂ@˜€Ș€ȘÂ@˜ ˘Âàј€ȘÂ`ŘÂ`؀Ș€ȘÂÀΘ€ȘÂàј€Ș€Ș€Ș ˘Âàј€Ș ˘ ˘€ȘÂàјÂàјÂàјÂ՘ ˘Âàј ؘ ؘÂÕ˜Â`ޘ ؘ ؘÂ@Û˜ÂÀΘ ؘÂàјÂ`ޘ ؘÂ՘ ؘ ؘÂÕ˜ÂàјÂÀΘ ؘ ؘÂàјÂÀΘÂÀΘÂÀΘÂÀΘÂÀΘÂÕ˜ÂàјÂÀΘ ˘ ؘ ؘ€á˜Â ؘ ؘ ˘ÂÕ˜Â@ۘ ä˜ÂÀç˜ÂÀç˜Â`ޘ€á˜Â ä˜Â@ۘ ä˜Â€á˜Â€á˜Â@Û˜Â`ޘ ä˜Âàј ؘÂ`Þ˜Â@Û˜Â`Þ˜Â`ޘ ؘÂ`Ř ؘ ؘ ä˜Â ä˜Â@ۘ ä˜Â€á˜Â ä˜Â@Û˜Â`Þ˜Â`Þ˜Â@ۘ ä˜Â ä˜Â€á˜Â@Û˜Âàê˜Âî˜Â ä˜Â ؘ ؘ€á˜Âàê˜Âàê˜Âàê˜Â`Þ˜Â՘ ؘ€á˜Âàê˜Âî˜Âî˜Â ä˜Â€á˜Â@Û˜Â`ޘ€á˜Â@ô˜Â@ô˜Â`÷˜Â ñ˜Â`÷˜Â`÷˜Â ý˜Â@ô˜Â`÷˜Â`÷˜Â ý˜Âî˜ÂÀç˜Â ä˜Âî˜Â ñ˜Â ñ˜Â€ú˜Âàê˜Â`÷˜Â`÷˜Â ä˜Â ؘ ä˜ÂÀç˜Âàê˜Âî˜Âî˜Âàê˜Â`÷˜Â ý˜Â€ú˜ÂÀ™Â ý˜Â€ú˜Â`÷˜Â ñ˜Â ñ˜Âà™Â`÷˜Â`÷˜Â ý˜Â@ô˜Â ñ˜Â€ú˜Â ý˜Â ý˜Â ý˜Â ý˜Â ™Âà™Â ý˜Â ™Â™Â ™Â ™Â ý˜Â€ú˜Â ñ˜Â€ú˜Â ý˜Â ñ˜Â ñ˜Â ñ˜Âà™Â™Â™ÂÀ™Â ý˜Âà™Â€ú˜Â€ú˜Â€ú˜Â ñ˜Â ñ˜Â€ú˜Â ñ˜Â`÷˜Â ñ˜Â€ú˜Â€ú˜Â€ú˜Âà™Â@ ™Âà™ÂÀ™Âà™Â ™Â`™Â€™Â`™Â ™ÂÀ™Âà™Âà™Â ý˜Â€ú˜Â ™Â@ ™Â`™Â ™Â ™Â ™Âà™Â ™Â ™Â ™Â€™Âà™ÂÀ™ÂÀ™Â€™ÂÀ™Âà™ÂÀ™Â`™Â ™Â`™Â ™Â`™Âà™ÂÀ™ÂÀ™Â ™Â ™Â ™Â`™Â ™Âà™Â@ ™Â@ ™Â`™Â`™Â ™Âà™Â ™Â ™Â ™Â€™Â`™Â ™Â`™Â`™Â€™Âà™Â ™Â ™Âà™Â ™ÂÀ™Â ™Â€™Â`™Â ™Âà™Âà™Â@&™Â@&™Â #™Â #™Â ™ÂÀ™Â`™Â€™Â@ ™Â€™Â ™Â€™ÂÀ™ÂÀ™Â ™Âà™ÂÀ™Â€™Â`™Â ™Â ™ÂÀ™Â€™Â ™Â`™Â€™Â@ ™Â ™Â ™Â`™Â ™Â€™Â ™Â@ ™Â€™Â`™Â ™Â ™Â€™Â`™Â ™Â ™Âà™Â ™Â€™Â ™Â`)™Â #™Â@&™Â #™Â`)™Â`)™Â ™Â ™Â ™Â ™Â #™Â ™Â@&™Âà™Â #™Âà™Âà™Â #™Â€,™Â /™ÂÀ2™Âà5™Â€,™Â /™ÂÀ2™ÂÀ2™Âà5™Â /™Â@&™Âà5™Â@?™Â <™Â /™Â€,™Â@&™Â #™Âà5™Âà5™Â <™Â@?™Â@?™Â <™Â@?™Â@?™Â@?™Â H™Â H™Â H™Â`B™Â€E™Â€E™Â`B™Âà5™Â9™Â9™Â`B™Â <™ÂÀK™ÂàN™ÂàN™ÂR™Â U™Â€E™Âà5™Âà5™Â9™Â <™Â@?™ÂR™Â€E™Â`B™Â@?™Â@?™Â@?™Â€E™Âà5™Â9™Âà5™Â9™ÂÀ2™Âà5™Â <™Â@?™ÂÀ2™Â /™Â€,™Â /™Â9™Â9™Âà5™Â`B™Âà5™Âà5™Â`)™Â /™Â /™Â@?™Âà5™Â`)™Âà5™Â@?™Âà5™Â€,™Âà5™Â <™Â /™Â /™Âà5™Â /™Â /™Â /™Â€,™ÂÀ2™Â /™Âà5™Â /™Â /™Â€,™Â #™Â #™Â€,™Â€,™Â /™Â€,™Â #™Â`)™Â@&™Â€,™Â #™Âà™Â ™ÂÀ™Â #™Âà™Â #™Â #™Â ™Â@ ™Â ™Âà™ÂÀ™Â #™ÂÀ™Âà™Â ™Â ™Â ™ÂÀ™Â€™Â`™Â ™Â@ ™Âà™Â@&™Â ™Â ™Âà™Âà™Â ™Â`™Â@ ™Â ™Â`™Â™Âà™Â@ ™Â ™ÂÀ™Â ™Â ™ÂÀ™Â`™Â`™Âà™Â™Â™Â€™Â@ ™Â€™Âà™Â ™Â™Â€ú˜Â ý˜Â ™Â ™Â ™Â@ ™ÂÀ™Â ý˜Â ™Â ý˜Âà™Â ™Â ™Â ™Â`™Âà™Â€ú˜Â ñ˜Â`÷˜Â ñ˜Â ñ˜Â€ú˜Â ý˜Â`™Â`™Â ™Â€ú˜ÂÀ™ÂÀ™Â`÷˜Â`÷˜Â`÷˜Â`÷˜Â ý˜Â ý˜Â`÷˜Â ñ˜Âà™Â ý˜Â€ú˜ÂÀ™Â`™Â`™Â ™Âà™Â™Â ™Â™Âà™ÂÀ™Â ™Â ™Â€™Â@ ™Âà™Â`™Â ™Â ™Â ™Â@ ™Â ™Â ™Âà™Â ñ˜Âàê˜Â ñ˜Â€ú˜ÂÀ™ÂÀ™Â ™Â€™Â@ ™Â`™Â ý˜ÂÀ™Â™Âà™Â€™Â ™Â`™Â€™Â ™Â`™ÂÀ™Âà™Â`™Â #™Âà™Â`™Â@ ™Âà™ÂÀ™ÂÀ™Â ™Â ™Âà™Â`)™Â@&™Â ™Â ™Â€™Â`™Â ™Â ™Â ™ÂÀ™ÂÀ™Â ™Â@ ™Âà™ÂÀ™Â ™Â ™Â ™Âà™Âà™Â€™Â@ ™Â€™Âà™Â`™Â@ ™Â ™Âà™Âà™Â ™Â ™Âà™Â€,™Â #™Â@&™Â€,™Â€,™Â #™Âà™Â ™Â ™Â`™Â ™Â ™Â€™Â ™Â #™Â`)™Â #™Â #™Â@&™Â #™Âà™Âà™ÂÀ™Âà™Â #™Â`)™ÂÀ2™Â`)™Âà™Â ™Âà™Â ™Âà™Â ™Â ™Â ™Â ™Âà™Â ™Â ™ÂÀ™Â ™Â@&™Â #™Â@&™Â ™Â #™Â /™Â@&™Â€,™Â€,™Â@&™Â ™Â`)™Â ™Â ™Â ™Â@&™Â€,™Â@&™Âà™Â ™Â ™ÂÀ™Âà™Â€™Âà™Âà™Â€™Â ™Âà™Â ™Â@ ™ÂÀ™Â ™Â #™Â`)™Â`)™Â`)™ÂÀ2™ÂÀ2™Â`)™Âà5™Â€,™Â <™Â@?™Â€E™Â@?™Â <™Âà5™Â€,™Â€,™Â <™Â`B™Â <™Âà5™Âà5™Â /™Â€,™Â€,™ÂÀ2™Â /™Â9™Âà5™Â9™Â9™Â <™Â@?™Â`B™Â€E™Â`B™Â€E™Â€E™Â@?™ÂÀ2™ÂÀ2™Â`)™Â /™Â #™Â /™Â <™Â <™Â`B™Â@?™Â <™Â@?™Â`B™Â@?™Â9™Â <™Âà5™Âà5™Âà5™Â /™ÂÀ2™Â /™Â`B™Â€E™Â@?™Â <™Â <™Â@?™ÂÀ2™Âà5™Â <™Â H™Â9™Âà5™Â9™Â <™Â /™Âà5™Âà5™Â`)™ÂÀ2™Â@&™Â #™Âà™Â ™Â ™Â #™Âà5™Â@?™Â@?™Â H™Â`B™Â€E™Â`B™Â9™Â9™Â`B™Â@?™Â9™Âà5™ÂÀ2™Âà5™ÂÀ2™ÂÀ2™Â@&™Â@&™Â@&™Â #™Â /™ÂÀ2™Â <™Â€E™Â`B™Â`B™Â <™Â€E™Â`B™Â`B™Â€E™ÂÀ2™Â <™Â`B™Â <™ÂÀ2™Âà5™Âà5™Â€,™Â@&™Â #™Â /™Âà5™Â9™Â€,™Â`)™Â@&™Â #™Âà™Â ™Â ™Â@&™Â #™Â`)™Â`)™Â9™Âà5™Â <™Â9™Â <™Â`B™Â@?™Â`B™Âà5™Â /™Â`)™Â`)™ÂÀ2™Â@?™Â <™Â9™Â@?™Â <™Â@?™ÂÀ2™Â`)™Â ™Â #™Â`)™Â ™Â@&™Âà™Â@&™Â@&™Â`)™ÂÀ2™Âà5™Â9™Â9™Âà5™Âà5™Â`)™Â@?™Â9™Â9™ÂÀ2™Â /™Â`)™Â`)™Âà™Â ™Âà™Âà™Â`)™Âà5™Â /™Âà5™ÂÀ2™Â9™ÂÀ2™Â@&™Â€,™Âà5™Â@?™Â`B™Â`B™Âà5™Â /™Âà5™ÂÀ2™Â <™Â <™Âà5™Â€,™Â`)™Â€,™Â`)™Â #™Â€,™Â€,™Â /™Âà5™Â9™Âà5™Â <™Â /™Âà5™Â@&™Â #™Â #™Â /™Â #™ÂÀ™ÂÀ™Â ™Â@&™Â`)™Â@&™Â #™Â`)™Â@&™Â /™Â@&™Â #™Â€,™Â€,™Â`)™Â@&™Â`)™Âà5™Âà5™Â`B™Â <™Âà5™Â9™Â <™Â <™Â@?™Â <™Â <™Âà5™Â9™Â <™Â@?™Â`B™ÂÀK™ÂÀK™Â U™Â H™ÂÀK™Â H™Â@?™Â€E™Â`B™Â`B™ÂÀK™Â H™Â€E™ÂÀK™ÂàN™Â U™ÂR™Â H™Â U™ÂÀd™Â n™Âàg™Âk™Âàg™Â a™Âàg™ÂÀd™Â a™Âàg™Â`[™ÂÀd™Âàg™Âàg™Â€^™Â a™Â n™Â€w™Âà€™Â`t™Â€w™Â@q™Â n™ÂÀ}™Â z™Âà€™Âà€™Â€w™Â n™Âk™Âàg™Â n™Â€w™Â n™Â€w™Â`t™Â€w™Â€w™Â@q™Â`t™Â z™Â z™Âà€™Â€w™Â z™Â€w™Â@Š™ÂÀ}™Â z™Âà€™Â€w™Â`t™Â n™Â n™Â z™Â n™Â n™Â`t™Âk™Âk™ÂÀd™Â n™Â`t™Â z™ÂÀ}™Â`t™Âk™Â n™Â z™Â„™Â@Š™Â ‡™Â z™Â€w™Â`t™Â z™Âà€™Â ‡™Â@Š™Â@Š™Â„™Â z™Â€w™Â`t™Â`t™Â€w™Â`t™Â@q™Â z™Â z™Âà€™Â„™ÂÀ}™Â„™Â„™Â z™Â€w™Â z™Â`t™Â@q™Â`t™Â z™ÂÀ}™Â„™Â„™Âà€™Â@Š™Âà€™ÂÀ}™Â z™Â„™Âà€™Â z™Â@q™Âk™Â n™ÂÀd™Âàg™Âàg™Â z™Â@q™Â@q™Âk™Âàg™ÂÀd™Â U™Â€^™Âàg™Âàg™ÂÀd™Â€^™Â a™Âàg™Âàg™Â a™Âk™Âàg™Â€^™Â`[™Â U™Â@X™Â U™Â a™Âàg™ÂÀd™ÂÀd™Âàg™ÂÀd™Â`t™Â z™Â z™Â@q™Âàg™Âàg™Â€w™Âàg™Âàg™Âk™ÂÀd™Â n™Â€w™Â`t™Âk™Â n™Â`t™Â@q™Â`t™Â n™Â n™Âk™Â a™Â a™Â a™Â n™Âàg™Â n™Âk™Â a™Â€^™Â@X™Â€^™Â@X™Â`[™ÂÀd™ÂÀd™Â a™Âàg™Â n™Âàg™Â€^™Â@X™Â€^™Â a™Â a™Â a™Â a™ÂÀd™Â€^™Â€^™Â@X™Â€^™Â a™ÂÀd™Âàg™Â a™Â a™Âk™Â n™ÂÀd™Â€^™Â`[™Â U™Â@X™Â U™Â`[™Â€^™Â`[™ÂàN™ÂÀK™Â`[™Âàg™Â@q™Â@q™Â@q™Â@q™Â n™Â a™Âàg™Â€^™Â`[™ÂR™Â U™Â€^™Â a™Â`[™Â`[™Â€^™Â n™Âàg™Âàg™ÂÀd™Â`[™Â`[™Â@X™Â`[™Âàg™Â a™Â€^™Â`[™Â a™Â`[™Â`[™Â U™ÂÀK™Â U™Â U™ÂR™ÂàN™ÂR™ÂR™Â U™Â€^™Â€^™Â€^™Â a™Â a™Â a™Âàg™Âàg™Â n™Â a™Â€^™Â a™Â€^™Â`[™Â a™ÂàN™Â H™Â`B™ÂÀK™ÂR™Â€^™Â a™Â a™Â`[™Â U™Â`B™Â€E™ÂR™ÂÀK™ÂR™ÂÀK™Â`B™ÂàN™Â@X™Â€^™Â n™Â@q™Âàg™Â a™Â€^™ÂÀd™Â a™Â U™Â U™ÂàN™ÂÀK™Â H™Â@X™Âàg™Âàg™ÂÀd™Â`[™Â€^™Â n™Â€^™Â U™Â U™Â U™Â U™Â`[™Â U™Â@X™Â`[™Â`[™Â`[™Âàg™Âk™Â n™Âàg™Âàg™Â a™Â a™Â U™Â@X™Â€^™Â a™Âàg™ÂÀd™Â n™Â@X™Â U™Â€^™Â€^™Â`[™Â@X™ÂR™Â U™Â U™Â a™Âk™Âk™Â€^™Â@X™Â a™Âàg™Â`t™Â@q™Â a™Â a™Â a™Âàg™Â a™Â`[™Â€^™Âàg™Â n™Â€^™Â€^™ÂÀd™Âàg™Â€^™Â U™ÂR™Â@X™Â a™Âàg™Âàg™Âàg™Â@q™Â`t™ÂÀ}™ÂÀ}™Â n™Â@q™Â n™Âàg™ÂÀd™Âk™ÂÀd™Âàg™Â`t™Â n™Â@q™Âk™Âk™Âk™Â n™Â n™Â`[™Â@X™Âàg™Âk™Â n™Â z™Âà€™Â@Š™Â€™Â ‡™Â€w™Â€w™Â€w™Â@q™Â n™Âàg™Âàg™Â n™Âàg™Â a™Âk™Â@q™Â€w™Â`t™Âà€™Âà€™Â ‡™Â z™Â„™Â„™Â„™Â`™Â ‡™ÂÀ}™Â€w™Âk™Â z™Âk™Âk™ÂÀd™Â`[™ÂÀd™Â n™Â n™Â`t™Â@q™Â n™Â`t™Â@q™Âk™Âàg™Â€w™Â`t™Â n™ÂÀ}™ÂÀ}™Â z™Âà€™Â z™Â z™Â€w™Â z™Â z™Â z™Â n™Â n™Âàg™Â z™ÂÀ}™Â n™Âàg™Â n™Â n™Â n™Â€w™Â„™Â ‡™Â@Š™Â@Š™Âà€™Â z™Â€w™Â n™Â`t™Â z™Â z™Â`t™Â z™Â z™Â€w™Â`t™ÂÀ}™Âà€™Âà€™ÂÀ}™Â z™Â€w™Âk™Â@q™Â`t™Â@q™Â`t™Â€w™Â`t™Â z™Â z™Â`t™Âà€™ÂÀ}™Â€w™Â z™Â z™Â@q™Â@q™Â`t™Â z™ÂÀ}™Â€w™Â z™Â z™Âk™Â€^™ÂÀd™ÂÀd™Â`t™Â`t™Â n™Â€w™Â z™Â z™Â z™Â z™Âà€™Â`t™Â@q™Â`t™Â z™Â`t™Âà€™Â z™Â z™ÂÀ}™Â`t™Â`t™Â`t™Â€w™Âà€™Â@Š™Â@Š™Â„™Â€™Â€™Â„™Â„™Â„™Âà€™ÂÀ}™Â€w™Â`t™Âk™Â n™Âk™Â n™Â`t™Â n™ÂÀd™Â`[™Â`[™Â n™Âk™Âk™Âàg™Âk™Â a™Âàg™Â n™Â`t™Â€w™Â z™Â`t™Â n™Â n™ÂÀd™Â n™Â`t™Â n™Â n™Âk™Âàg™Âàg™Â`[™Â`[™Âàg™ÂÀd™Â€^™Â€^™Â n™Âk™Â n™Â n™Âàg™Â€^™ÂÀd™Âàg™ÂÀd™Â@q™Â z™Â@q™Â n™Â`t™Â n™ÂÀd™Â€w™Â`t™Â@q™Âàg™Â`t™Âàg™Â n™Â`t™Â n™Â n™Âàg™Â@q™Â€w™Âàg™Â n™Â n™Â n™Â`t™Â@q™Â`t™Â a™Â€^™Â`[™Â`[™Â a™Â n™Â`t™Âk™Âàg™ÂÀd™Âk™Â z™Â n™Âk™Â€w™Â z™Â`t™Â n™Â z™Â ‡™ÂÀ}™Â€w™Â€w™Â`t™Â n™Â€w™Â€w™Â z™ÂÀd™Âk™Â@q™Â`t™ÂÀd™Â`[™Â€^™Â n™Â n™Â`t™ÂÀd™ÂÀd™Â a™Âàg™Âk™Â n™Â a™Â€^™Âàg™Â`t™ÂÀ}™Â z™ÂÀ}™Â€w™ÂÀ}™Âà€™Â z™Â`t™Â€w™Â@q™Â n™Â`t™Â z™Â z™ÂÀ}™Â ‡™Â`™Â ‡™Â z™Â€w™Â`t™Â n™Âk™Âàg™Âàg™Â@q™Â z™Â n™Â n™ÂÀd™Â€^™Â@X™Â`[™Â a™Âàg™Âàg™Âàg™Âk™Âàg™Âk™Âàg™Âàg™Â€^™Âk™Â€w™Â€w™Â@q™Â z™Â z™Â`t™Â n™Â`t™Â€w™Â z™Â z™ÂÀ}™Âà€™Â z™Â z™Â z™Â`t™Âàg™Âàg™Â n™Â`t™Â n™Âàg™Â n™ÂÀd™Â€^™Â`[™Â a™Â€w™Â€w™Â n™Â`t™Â`t™Â@q™Â`t™Âàg™Â a™Â n™Âà€™Âà€™Â ‡™Â@Š™Â ‡™Â ‡™Â ‡™Â n™Â`t™Âà€™Â„™Âà€™Âà€™Â z™Â z™Â€w™Âà€™Â z™ÂÀ}™Â z™Â€w™Â z™Â z™Â„™Âà€™Âà€™Â z™ÂÀ}™Â`t™Â`t™ÂÀ}™Â`™Â„™Â„™Âà€™Â ‡™Â„™Â ‡™Â„™Âà€™Â„™Â ‡™Â@Š™Â ‡™Â z™Âà€™ÂÀ}™Âà€™Âà€™Âà€™Â„™Â ‡™Â ‡™Â„™ÂÀ}™Â„™ÂÀ}™ÂÀ}™Â„™Â ‡™Â ‡™ÂÀ}™Â`t™ÂÀ}™Âà€™Â z™Â`t™Âà€™Â„™Â`™Â  ™Âà™™Âà™™Â  ™Â “™Â “™Â “™Â “™Â`™Âà€™Â`™Â ‡™Âà€™Âà€™Â€w™Â n™ÂÀd™Â@q™Â€w™Â„™Âà€™Â ‡™Â “™Âà™™Â “™ÂÀ–™Â  ™Â@£™Â “™Â„™Â€™Â€™Â ‡™ÂÀ}™Âà€™Â z™Â z™Â„™Â„™Â@Š™ÂÀ}™Â z™Âà€™Â “™Â “™Â€™Â€™Â@Š™Â`™Â “™Â€™Â`™Â@Š™Â “™Â “™ÂÀ–™Â “™Â  ™Â  ™Â™Âà™™Â@£™Â™Â  ™Â™Âà™™Â “™Â “™Â  ™Â  ™Â`¦™Â`¦™Â  ™Âà™™Â`¦™Â@£™Â@£™Â@£™Â`¦™Â@£™Âà™™Â€©™Â@£™ÂÀ–™Âà™™ÂÀ–™Â “™Âà™™ÂÀ–™Â`™Â€™Â`™Â€™ÂÀ–™Â “™Â “™Â  ™Âà™™ÂÀ–™Â`™Â€™Â™Âà™™Â™Â  ™Â  ™Â€©™Â`¦™Â`¦™Âà™™Â@£™Âà™™Âà™™Â@£™Â@£™ÂÀ¯™Â ¬™Â ¬™Â@£™Âà™™Â ‡™Â ‡™Â`¦™Â`¦™Â`¦™Â`¦™Â`¦™Â€©™Â@£™Â™Â€©™Â  ™Â™Â@£™Âà™™Â@£™Âà™™Âà™™Â™Âà™™Â “™ÂÀ–™ÂÀ–™Â@£™Âಙ ¬™Â  ™Â  ™Â  ™Â  ™Â`¦™Â  ™ÂÀ–™Âà™™Â@£™Â`™Â`™Âà™™ÂÀ–™Â`¦™Â  ™Â ¬™ÂಙÂಙ€©™Â ¬™Â`¦™Â  ™Â€©™Â€©™Â  ™Â`¦™Â ¬™Â ¬™Â`¦™Â€©™Â€©™Â ¬™Â@£™Âà™™Â “™Âà™™Â  ™Â@£™Â@£™Â`¦™Â™Â`¦™Â@£™Â`¦™Â ¬™Â`¦™Â€©™Â`¦™Â  ™Â`¦™Â  ™Â  ™Â`¦™Â ¬™Â@¼™ÂಙÂ`¦™Â ¬™Â`¦™Â`¦™Âà™™Âà™™Âà™™Â@£™Â  ™Â  ™Âà™™Âà™™Âà™™Â€™Â€™Â “™Â`™Â “™Â “™Âà™™Âà™™Â@£™Âà™™Â€™Â@Š™Â@Š™Â “™Â€™ÂÀ–™Â€™Â„™Â “™Âà™™Â  ™Â  ™Â  ™Â`¦™Â™ÂÀ–™ÂÀ–™Â`™Â€™Âà™™Â  ™ÂÀ–™Â “™ÂÀ–™Â  ™Â  ™Â€™Âà™™Â@£™Â™Â™Â  ™Â “™Â€™Âà™™ÂÀ–™Âà™™ÂÀ–™ÂÀ–™Â`¦™Â`¦™Â@£™Â€™Â “™Â`™Â@Š™Â`™Â„™Â`™Â “™Â “™Â “™Â “™Â€™Âà™™Â€©™Â  ™Â  ™Âà™™Â`™Â@Š™Â„™Â ‡™Â`™Â “™Â`™Âà™™Â™Â™Â “™ÂÀ–™Â “™Â™Â “™Â@Š™Â„™Â ‡™Âà€™Â„™Â@Š™Â “™Â “™Â “™ÂÀ–™ÂÀ–™Â™Â “™Â “™Â “™Â “™ÂÀ–™Â€™Â “™Âà™™Â  ™Âà™™Â™Â  ™Â  ™Â  ™Â™Â@£™Â`¦™Â@£™Â ¬™Â ¬™Âà™™Â€™Â z™Â`™Â€™Â@Š™Â€™Â€™Â`™Â ‡™Â`™Âà™™Â™ÂÀ–™Â`¦™Â@£™ÂÀ–™Â€™Â “™ÂÀ–™Â™Â@£™Â™Â`¦™Â@£™Â@£™Âà™™Â  ™Â  ™Â “™ÂÀ–™Â€™Â “™Â  ™Âà™™ÂÀ–™Â™Â™Â™Â  ™Â  ™Â  ™Â@£™Â  ™Â`¦™Â ¬™Â€©™Â€©™Â@£™Âà™™Â “™ÂÀ–™Â “™Â  ™Âà™™Â  ™ÂÀ–™Âà™™Â  ™Â@£™Â™Â “™Â “™Â  ™Â  ™Â  ™Â@£™Â@£™Â`¦™Â@£™Â ¬™Â@£™Â€©™Â ¬™Â ¬™Â ¬™Âಙ¶™Âಙ ¬™Â@£™Â  ™Â`¦™Â`¦™Â  ™Â€©™Â`¦™Â ¹™Âಙ¶™Â ¹™Â ¬™Â ¹™Â¶™Â@¼™Â¶™ÂಙÂ`¦™Â@£™Â`¦™Â  ™ÂÀ–™Â™Â@£™Â@£™Â  ™Â ¬™Âಙ ¹™Âಙ€©™Â€©™Â ¬™Â ¬™Â ¬™Â ¬™Â€©™Â`¦™Â ¬™Â€Â™Â`¿™Â@¼™Â Å™Âà˙€™ ¹™Â@¼™Â`¿™Âಙ¶™Â@¼™Â@¼™Â`¿™Â ¹™Â@¼™Â ¹™Â Å™Â`¿™Â`¿™Â Å™Â@Õ™Âà˙ řÂà˙ ř€™Â`¿™Â Å™ÂàË™ÂàË™Âà˙ řÂàË™Â`¿™Â Å™Â€Â™Â`¿™Â€Â™ÂàË™ÂÀș€™ÂÀÈ™ÂàË™ÂÏ™Â`ؙ ҙÂàË™Âà˙ řÂÀș ř řÂàË™Âà˙ ¹™Â€Â™Â ¹™Â Å™Â€Â™Â€Â™Â Å™Â ¹™Â`¿™Â@¼™Â@¼™Â`¿™Â`¿™Â`¿™ÂÏ™ÂàË™Â`Ø™Â@Õ™ÂÏ™Â@ՙ ҙÂàË™ÂÀÈ™ÂàË™ÂÀș ҙ ҙÂÀá™Â`Ø™ÂÀș řÂಙÂಙÂàË™ÂÀș ř ř řÂÀÈ™ÂàË™Â@¼™ÂÀÈ™ÂÀÈ™Â@Õ™ÂàË™Â@¼™Âಙ ¹™Â€Â™Â€Â™ÂàË™ÂÀș řÂàË™Â`ؙ ҙ€ۙ ҙÂ@ՙ ҙÂ`ؙ ҙ řÂ`¿™Âಙ ¹™Â€Â™Âà˙ ҙ ҙÂà˙ ř ř€™ ř€™ ř řÂàË™ÂàË™ÂÏ™Â@Õ™ÂÏ™ÂÏ™ÂÀș ř€™ řÂ`¿™Â ¹™Â`¿™Â ¹™Â`¿™Â€Â™Â€Â™Â Å™ÂÏ™ÂàË™Â`ؙ ޙ€ۙ ҙÂàË™Â`¿™Â€Â™Âಙ€™ÂÏ™ÂàË™Âà˙ řÂà˙ ҙ ҙÂè™Âàä™Â ë™Â ë™ÂÀá™ÂÀá™Âàä™Â€Û™Â ҙ ř ҙÂ@Õ™Â`Ø™ÂÏ™Â@ՙ řÂàË™Âà˙€ۙÂÏ™ÂàË™ÂàË™ÂÀș řÂ`¿™Â Å™Â`¿™Â Å™Â Å™ÂÀÈ™ÂàË™ÂÀș€™€™ÂàË™ÂÏ™ÂàË™Âà˙ ř řÂ`¿™ÂÀș řÂ`¿™Â`¿™Â`¿™Âà˙ ҙÂϙ€ۙ€ۙÂ@Õ™Âà˙€™Â@¼™Â@¼™Â Å™ÂÏ™Âϙ ҙÂÀá™ÂÀá™Â Þ™Â Þ™Â Þ™Â Þ™Âàä™Â Þ™Â`ؙ ҙÂÀÈ™Â@ՙ řÂϙ ҙ ҙÂ@Õ™Â`ؙ ޙÂ`Ø™Â@ՙ ޙÂ@Õ™ÂÏ™Â`Ø™ÂÀá™Â@Õ™Â`ؙ ҙ ҙÂà˙ ҙÂ`ؙ ޙ€ۙÂÏ™ÂÀá™Â€Û™Â Þ™Â@î™ÂÀá™Âàä™Â ҙ ҙ ҙÂ@ՙ ޙ ޙ€ۙÂ`ؙ ҙÂà˙ řÂÀÈ™ÂàË™Âϙ ҙÂ`Ø™Âϙ ҙ ҙ ޙ ޙ ޙÂÀá™ÂÀá™ÂÀá™Âàä™ÂÀá™Âàä™Â`ؙ ҙÂàË™Âϙ€ۙÂÀá™ÂÀá™ÂÀá™Âè™Â`ؙ ҙÂ`ؙ ޙÂàä™Â€Û™ÂÀá™Â@î™Â`ñ™Â@î™Â Þ™Â€Û™Âàä™Âàä™Â Þ™Â`Ø™Â@Õ™Âϙ€ۙÂè™Â Þ™Â ë™Âè™Âè™Âè™Âè™Â`ñ™Â`ñ™Â ÷™Â ÷™Â`ñ™Â ë™Â@î™Â ë™Â€ô™Âàý™ÂÀú™Â@î™Âè™Â@î™Â ë™Â`ñ™Â ë™Âè™Â ë™ÂšÂàý™Â šÂàý™Â ÷™Â@î™Â ë™Âè™Â@î™Â`ñ™Â ÷™ÂšÂ šÂàý™Â ÷™Âàý™Â ÷™Â€ô™Â€ô™Â ÷™Â@î™Â€ô™Â ë™Âàä™Â@î™Â ë™Â ë™Âàä™Â ë™Â ë™Â ë™Âàä™Â ë™Â`ñ™ÂÀú™Â šÂ ÷™Â€ô™ÂÀú™Â`ñ™Â@î™Â`ñ™Â€ô™Â ÷™Â`ñ™Â`ñ™Â ÷™Â ë™Â ë™Â@î™Â€ô™Â šÂ ÷™Â@î™Â`ñ™ÂÀú™ÂÀú™Âàý™Â šÂ šÂ€ šÂšÂàý™Â ÷™ÂÀú™Â šÂàý™ÂšÂ šÂšÂšÂ šÂšÂšÂ šÂ šÂ@šÂ šÂ šÂ` šÂàý™Â` šÂ šÂ šÂàý™Â ÷™Â šÂ` šÂ@šÂ šÂ ÷™Â`ñ™Â@î™Â@î™Â`ñ™Â`ñ™Â ÷™Â€ô™Â`ñ™Â@î™Â€ô™Â`ñ™Âàä™Â€ô™Â€ô™Âàý™Â€ô™Â€ô™Â`ñ™ÂÀú™Â ÷™Â ÷™Â€ô™Â ÷™Â ÷™Â`ñ™Â@î™Â@î™Â`ñ™Â ÷™Â ÷™Âàý™Â`ñ™Â€ô™Âàý™Â€ô™Â šÂ šÂ@šÂ` šÂ šÂšÂ ë™Â@î™Â ÷™Â€ô™Â ÷™Â ÷™Â`ñ™Â ÷™Âàý™Â ÷™Â ÷™Â€ô™Â ÷™Â ÷™Â`ñ™Â ÷™Â`ñ™Â ÷™ÂÀú™Â šÂàý™Â ÷™Â ÷™Â ÷™ÂÀú™Â ÷™Âàý™Âàý™ÂÀú™Â€ô™Âàý™Âàý™Â@î™Â€ô™Âè™Â ë™Â ë™Âàä™Âàä™ÂÀá™Âàä™Âè™Â ÷™Â`ñ™Â@î™Â ë™Â`ñ™ÂÀú™Â@î™Â Þ™Âàä™Âè™Â@î™Âàä™Â`ñ™Â`ñ™Â ë™Â ÷™Â ÷™Â ÷™Â€ô™ÂÀú™ÂÀú™Â šÂàý™Â`ñ™Â ÷™Â@î™Â`ñ™Â€ô™ÂšÂ€ô™Â`ñ™Â`ñ™Âàä™Âè™Â`ñ™Â ë™ÂÀá™Â`ؙ€ۙÂ`Ø™Âàä™Â€ô™Â ë™Âàä™Â Þ™ÂÀá™Âè™Â€ô™Â€ô™Â šÂ šÂ šÂàý™Âàý™ÂÀú™Â ÷™Â€ô™Â ÷™Â ÷™Â€ô™Â€ô™Â`ñ™Â ë™Â@î™Âàý™Â ÷™Â`ñ™Â€ô™Â ë™Â ÷™Âàý™Â` šÂšÂ šÂÀú™Â šÂ@šÂ€ šÂ@šÂàý™Â ÷™Â ÷™Â`ñ™Â ë™Â€ô™Âàý™Â šÂšÂ@î™Â€ô™Â ÷™Â ë™Â ÷™Â ÷™Â ÷™Â ÷™Â šÂ` šÂšÂ ÷™Â ÷™Â ÷™Â`ñ™ÂÀú™Â`ñ™Â ÷™Â€ô™Âàý™Â šÂàý™Â šÂÀú™ÂšÂ` šÂ` šÂ šÂ šÂ` šÂ€ šÂ` šÂ šÂ€ šÂ šÂ@î™Â@î™Â ÷™Â@šÂ šÂ@šÂ` šÂàý™ÂšÂàý™Âàý™ÂšÂšÂšÂ` šÂ šÂ` šÂ@šÂ@šÂàý™Â`ñ™Â ë™Â`ñ™ÂÀú™Âàý™Âàý™Â@šÂ šÂ@šÂ@šÂ€ šÂ@šÂšÂàý™Â` šÂ šÂ@šÂÀšÂ šÂ@šÂ` šÂ` šÂ` šÂ šÂàšÂšÂ šÂ` šÂ` šÂ€ šÂÀšÂšÂ€ šÂ€ šÂ šÂàšÂàšÂÀšÂ@šÂ šÂàý™Â ÷™Â ÷™Âàý™Â ÷™Â€ô™ÂÀú™Â ÷™Â ë™Â`ñ™Â ÷™Â@î™ÂÀú™Â ÷™Â`ñ™Â@î™Â`ñ™Âàý™Âàý™Â ÷™Â€ô™Â@î™Â@î™Â@î™Â ÷™Â ë™ÂÀá™Â Þ™Â`Ø™ÂÀá™Â Þ™Â ҙ€ۙ€ۙ ޙ ޙ€ۙÂ@Õ™Â`ؙ ҙÂ`Ø™Â`ؙ€ۙÂ`Ø™Â`ؙ€ۙÂϙ ޙÂè™Âè™Â@Õ™Âϙ ҙ€ۙÂÏ™ÂÏ™Âϙ€™Â@¼™ÂÀș řÂ@¼™Â@¼™Â¶™Â ¹™Â@¼™Â€Â™Â@¼™Â@¼™Â¶™Â ¹™Â Å™ÂಙÂಙ€©™Â@£™Â€©™Â ¬™Âಙ ¹™Â ¹™Âಙ¶™ÂÀ¯™Â`¦™Â  ™Â ¬™Â ¬™Â ¹™ÂÀ¯™Â ¬™Â ¬™Â`¦™Â€©™Â ¬™Â¶™Â ¬™Â`¦™Â@£™Â  ™Â@£™Âà™™Â™Â™Â  ™Â ¬™Â€©™Â`¦™Â ¬™Â`¦™Â`¦™Â`¦™Â ¬™Â@£™Âà™™Âà™™ÂÀ–™Â “™Â™Âà™™Â™Â€™Âà™™Â™Â “™Â€™Â€™Âà™™Â`™Âà™™Â “™Â “™Â`™Â ‡™Â@Š™Â “™ÂÀ–™ÂÀ–™Â  ™Âà™™Â™Â  ™Â`¦™Â™Âà™™Â  ™Âà™™Â`™Â€™Â “™Â`™Â€™Â`™Â„™Â ‡™Âà€™Â€w™Â z™Â z™Â ‡™Â@Š™Â`™Â ‡™Â€™Â`™Â„™Â„™Â@Š™Â ‡™Â z™Â`t™Â€w™Âà€™Â z™Â n™Âàg™Â a™ÂÀd™Â a™Â a™Âk™ÂÀd™Âàg™ÂÀd™Â`t™Â n™Âàg™Â`t™ÂÀ}™Â z™Âàg™ÂÀd™ÂÀd™ÂÀd™Â€^™ÂÀd™Â@X™ÂR™Â U™Â U™ÂR™Â U™Â`[™Â€^™Â€^™Â`[™Â`[™Â a™Â`[™Â U™Â@X™Â U™Â`[™Â`[™Â U™ÂàN™Â U™Â U™Â U™ÂR™ÂÀK™Â€^™ÂÀd™Â a™Â`[™Âàg™Â`t™Â@q™Â n™Âàg™Â a™Â€^™Â€^™ÂàN™ÂR™Â@X™Â U™Â a™Â@X™ÂàN™ÂàN™ÂàN™ÂàN™Â U™Â U™Â H™Â€E™ÂÀK™Â`B™Â H™Â H™Â H™Â`B™Â /™Â /™Â@?™Â H™Â H™Â H™Â@?™Â <™Â€E™Â9™Â9™Âà5™ÂÀ2™Âà5™Â€,™Â@&™Â€,™Â€,™Â #™Â /™Â #™Â`)™Â #™Â ™Â€,™Â`)™Â`)™Â€,™Â`)™Â€,™Â`)™Â@&™Â #™Â #™Â`)™Â€,™Â@&™Â #™Â #™Â€,™Â@&™Â€,™Âà™ÂÀ™Â ™Â@ ™Â™Â ý˜Âà™Â ™Âà™Â #™Â #™Â`)™Â ™Â`)™Âà™Â@ ™Â ™Â`™Â`™Â ™Â ™Â ™Â™Âà™Âà™Â€ú˜Âàê˜Âî˜Âî˜Âàê˜Â ä˜ÂÀç˜Âàê˜Â ñ˜Âàê˜Âî˜ÂÀç˜Â ä˜Â ä˜Âàê˜Â ä˜Â`Þ˜Â`Þ˜Â`ޘ€á˜Â ä˜Â ñ˜Âàê˜Â€á˜Â ä˜Â`ޘ€á˜Â@Û˜ÂÀç˜Â ñ˜Âàê˜Â ñ˜Âî˜Â ä˜Â`ޘ€á˜Â ä˜Â ñ˜ÂÀç˜Â՘ ؘÂÕ˜Â@Û˜Â՘ ؘÂÕ˜ÂÀΘÂàј ؘÂ`Þ˜Â`ޘ ؘÂÀΘ€á˜Â€á˜Âàê˜Â ä˜Â ؘÂÀΘÂàјÂàјÂàјÂÀΘ ä˜Â ä˜Â@Û˜Â՘ ؘ ؘÂÀΘÂ՘ ˘€Ș ˘ ؘ ؘ ؘÂ@Û˜Â՘ ؘÂàјÂàјÂÀΘÂàјÂ`ޘ€á˜Â ؘ ؘ ؘÂ@ۘ ؘÂ@Û˜Â@ۘ ä˜Â՘€ȘÂ`Ř ˘€Ș ˘ ¿˜ÂÀµ˜ÂÀµ˜Â ¿˜Â Ë˜ÂÀΘÂ`ޘ€á˜Â€á˜Â ؘ ؘÂ@Û˜Â`Þ˜Â`Þ˜Â@ۘ ؘ ؘ ؘ ؘÂ`Þ˜Â@ۘ€á˜Â ä˜Â€á˜Â ؘÂÕ˜Âàј ˘ ؘ ؘÂ`ޘ ä˜Â ؘÂàј ؘÂÀΘÂÀΘ ؘ€á˜Â ؘ€á˜Â ؘ ؘ ؘ ؘ ؘÂ`Þ˜ÂàјÂ`ޘ€á˜ÂÀç˜ÂÀç˜Â`Þ˜Â`Þ˜ÂÕ˜ÂàјÂàј ؘÂàјÂ՘ ؘÂ`Þ˜Âàê˜Â€á˜Â@Û˜Â@Û˜ÂÀç˜Â ä˜Â ä˜Â ñ˜Â€ú˜Â€ú˜Â ñ˜Âàê˜Â ä˜Â ä˜Â ñ˜Â@ô˜Â ñ˜Â ñ˜Â ñ˜Â`÷˜Âà™Âà™Â ñ˜Â ñ˜Â ñ˜Â`÷˜Â`÷˜Â ñ˜Â€ú˜Â ñ˜Â`÷˜Â@ô˜Âàê˜ÂÀç˜Â ä˜Â€á˜Â`Þ˜Â`Þ˜Â`Þ˜Â՘ ؘÂ`Þ˜ÂÀç˜Â`Þ˜Â`Þ˜Â`ޘ ä˜Â`ޘ€á˜ÂÀç˜ÂÀç˜Â€ú˜Â@ô˜Â`÷˜ÂÀç˜Â@ô˜Â`÷˜Â ñ˜Â ñ˜Â ñ˜Â ñ˜Â@ô˜Â€ú˜Â`÷˜ÂÀç˜Â ä˜Â ä˜Â`ޘ€á˜Â€á˜Â€á˜Â€á˜Â@ۘ€á˜Â€á˜Â€á˜Â ä˜ÂÀç˜Â@ô˜Â€ú˜Âà™Â ý˜Âàê˜Â ñ˜Âàê˜Âàê˜Âàê˜Â`ޘ ؘÂ`ޘ ؘ ؘ ؘ ؘÂ`Þ˜Âàј ؘÂ@ۘ ؘÂ@Û˜ÂÕ˜ÂàјÂ՘€á˜Â`Þ˜Â`Þ˜Â`ޘ ؘÂ`Þ˜Â@Û˜ÂÀΘ ˘Âàј ؘ ˘ÂÀΘÂàј ˘ÂÀΘÂÕ˜Âàê˜Âàê˜Â ä˜Â@ۘ ˘Â`؀ȘÂÕ˜Â`ŘÂ@˜ ˘Â`ŘÂÀΘÂ՘€ȘÂàјÂÀΘ€Ș ˘ ˘ ˘Âàј ؘÂàј€Ș ¿˜Â ¿˜Â ¿˜ÂธÂ`ŘÂ@˜ ˘ÂÀΘ€Ș€ȘÂธÂ@©˜Â£˜ÂàŸ˜ÂÀœ˜Â`“˜Â`“˜Â€–˜Â€–˜ÂÀœ˜Â`“˜ÂÀƒ˜ÂŠ˜ÂÀƒ˜Âà†˜ÂŠ˜Â €˜ÂŠ˜Âà†˜ÂŠ˜Â@˜Â ˜Â`“˜Â`“˜Â€–˜Â`“˜Â ˜Â€}˜Â €˜Â@w˜Â t˜Â g˜Â g˜Â g˜Â g˜Â [˜Â`a˜Â g˜Â€d˜Âàm˜Â`z˜Â`z˜Â@w˜Âàm˜Âq˜Âàm˜Âq˜Âàm˜Â g˜Â`a˜Â g˜Âq˜Â€d˜Â€d˜Â@^˜Â€d˜Â€d˜Â€d˜Â [˜ÂàT˜ÂàT˜Â`a˜Â@^˜ÂÀQ˜Â [˜Â`a˜Â [˜Â [˜Â g˜Â`a˜Â€d˜Â€d˜Â g˜Â`a˜ÂàT˜Â N˜ÂàT˜Â`H˜Â€K˜ÂÀQ˜ÂÀQ˜Â N˜ÂX˜Â [˜ÂàT˜ÂX˜Â [˜ÂàT˜Â`a˜Â€d˜Â`a˜Â [˜Â`a˜Â€d˜Â N˜Â N˜Â@E˜Â N˜ÂàT˜Â N˜Â [˜Â [˜ÂàT˜Â B˜Âà;˜Â B˜Â€K˜Â`H˜ÂÀQ˜Â N˜ÂX˜Â [˜ÂÀQ˜Â`H˜ÂÀ8˜Â?˜Âà;˜ÂÀ8˜Â?˜ÂÀ8˜Â B˜Â B˜Â@E˜Â`H˜Â@E˜Â€K˜Â B˜Â@E˜Â€K˜Â N˜Â [˜ÂàT˜ÂX˜ÂX˜Â`H˜Â?˜Â N˜ÂX˜Â€K˜ÂX˜Â N˜ÂÀQ˜Â`H˜Âà;˜Â 5˜Â`H˜Â B˜Â€2˜Â`/˜Â 5˜Â?˜Â`H˜Â`H˜Â N˜ÂàT˜Â [˜ÂàT˜Â N˜ÂÀQ˜Â N˜Â`H˜Â`H˜Â`H˜Â N˜ÂÀQ˜Â€K˜Â`H˜Â N˜ÂX˜Â`a˜ÂàT˜ÂàT˜Â N˜Â€K˜ÂX˜ÂàT˜Â N˜Â N˜Â N˜Â N˜ÂX˜Â [˜Â [˜ÂàT˜ÂàT˜Â€K˜Â N˜Â`H˜Â€K˜Â N˜Â€K˜ÂàT˜ÂàT˜Â [˜Â@^˜ÂàT˜ÂÀQ˜Â€K˜ÂÀQ˜ÂÀQ˜Â`H˜Â N˜ÂàT˜ÂàT˜ÂàT˜Â N˜Â [˜ÂàT˜Â N˜ÂX˜Â N˜Â [˜ÂX˜Â [˜Â g˜Â g˜Â€d˜Â g˜Â@^˜ÂX˜ÂàT˜Â [˜ÂX˜Â@^˜Â@^˜Â [˜ÂX˜Â [˜Â [˜Â [˜Â [˜Â`a˜Â@^˜Â [˜Â [˜Â@^˜Â [˜ÂX˜ÂàT˜ÂàT˜Â N˜ÂàT˜Â`H˜Â@E˜ÂÀ8˜Â?˜Â B˜Â?˜Â B˜Â`H˜Â€K˜Â@E˜Â@E˜Â@E˜Â B˜Â€K˜Â`H˜Â N˜ÂàT˜ÂàT˜Â`a˜Â [˜Â@^˜Â g˜Â`a˜Â€d˜Â [˜Â N˜Â`H˜Â N˜Â B˜Â B˜Â`H˜Âà;˜Â€K˜ÂàT˜ÂX˜ÂàT˜Â N˜Â@E˜Â€K˜Â N˜Â`H˜Â N˜Â€K˜Â`H˜Â?˜Â B˜Â@E˜Âà;˜Â 5˜Âà;˜Â€2˜Â@,˜Â 5˜Â )˜Â ˜Â€˜Â€˜Â@˜Â`˜Â`˜Âà ˜Â€˜Â`˜Â ˜Âà ˜ÂÀ˜Â€˜Â€˜Âô—Âô—Âô—€˜Â@ú— ÷— ˜Â@ú—Â`ý—Âàð— ê— ê—Âô—Âàð— ÷— ê—€ç—ÂÛ—ÂÀÔ—Â Þ—Â Þ—Âۗ їÂ@ȗ їÂ`˗—ÂྗÂ@ȗ—ÂྗÂ`˗ ї€ΗÂ`Ë—Â`˗ їÂ`˗ ї їÂàח€Η ї ޗÂ@á— ї ŗÂ`˗€Η ŗÂ—Â@ȗ——— ŗ€ΗÂ@È—Âྗ ŗ ŗ ŗ ŗ ŗ ї€ΗÂ@È—Â Å—Âྗ— ŗÂ— ŗ ¸—Â`²— ¸— ¸— ¸—Â`²— ¸—€µ— ¸—ÂÀ»— ¸— ¸—€µ—Âྗ їÂ@È—Â Å—Â Å—Â@È—Â`˗—ÂÀ»—€µ— ¸—ÂÀ»—ÂÀ»—ÂÀ»—€µ— ¸— ¸— ¸— ŗÂྗÂྗÂྗ ¸—Â@¯—©—ÂॗÂॗÂÀ¢—ÂॗÂॗÂॗ€µ— ¸—©—Â@¯— ¸——€µ—Â@¯— ¬—©— ¬—ÂÀ¢—Â@¯—€µ—ÂÀ»—ÂÀ»——€µ—Â`²—Â`²— ¬—€µ—ÂÀ»— ¸—Âྗ—ÂÀ»—ÂྗÂÀ»— ¸— ŗ€µ—€µ— ¬—ÂÀ»— ¸—Â`²— ¸—Â`²— ¬—ÂॗÂॗÂÀ¢— ¬—ÂÀ»— ŗÂ—Â@È—Â Å—ÂÀ»——ÂྗÂྗ——ÂÀ»— ŗ€Η€ΗÂÀÔ—Â`Ë—Â`Ë—Â Å—Â@ȗ€Η€ΗÂ@È—Â`˗ ¸— ŗ ¸—ÂÀ»—ÂÀ»—ÂྗÂÀ»—ÂÀ»—ÂྗÂྗÂ@È—Â`˗ ¸———€Η ŗÂ`˗€Η€ΗÂàח їÂÀÔ—ÂÀÔ—Âà×—ÂÀÔ—Âà×—ÂÀԗ€Η їÂà×—Âàח€Η їÂ`˗ ї їÂàח ї€ΗÂÀÔ—ÂÛ—Â Þ—Âà×—Âàח€Η€ΗÂà×—Â Þ—Âàð—Âô—Âàð— ê— ê—€ç—€ç—€ç—ÂÀí—Âàð— ê— ÷—Âô—Âàð—€ç—€ç—Â@á—Âàð—€ç—Â`ä—Âàח ޗ€ç—Â`ä—ÂÀí—Âàð—Â`ä—Â`䗠ꗀ痀痠ꗠê—Âàð—Âô— ê— ê—ÂÀí—Âô—Âàð—Âàð—Â@ᗀ痀痀ç—Â@á—Â@á—Âàð— ÷—€˜Â ÷—Â`ý—Âà ˜Â`ý— ÷— ê— ê—Â`ý— ˜Â ˜Â ˜ÂÀ˜ÂÀ˜Â€˜Â€˜Â ˜ÂÀ˜Â ˜Â ˜Âà ˜Âà ˜Â`ý— ÷—ÂÀ˜ÂÀ˜ÂÀ˜Â ˜Â ˜Â ˜Âà ˜ÂÀ˜Â ˜Â ˜Â ˜Âà ˜Â@˜Â ˜ÂÀ˜ÂÀ˜Â ˜Â@˜Â ˜Âà ˜Â€˜Â€˜ÂÀ˜Â ˜Â@˜Â ˜Â`˜Âà"˜Â ˜Â ˜Âà"˜Âà"˜Â ˜Â )˜Â )˜Â@,˜Â€2˜Â€2˜Âà;˜Â€2˜Â )˜ÂÀ˜Â`˜Âà"˜Â ˜Âà"˜Â€˜Â )˜Â )˜Â@,˜Â`/˜Â`/˜Â )˜Â@,˜Â )˜Â@,˜Â 5˜Â`/˜Â€2˜Â 5˜Âà;˜Âà;˜Â?˜Â?˜Â@,˜Â&˜Â&˜Â ˜Â`/˜ÂÀ8˜Â 5˜Â 5˜Â 5˜Â 5˜Âà;˜Âà;˜Â )˜Â€2˜Â 5˜Â?˜Â?˜Âà;˜Â 5˜Âà;˜Â B˜Â B˜Â`H˜Â`H˜Â 5˜Â€2˜ÂÀ8˜Â?˜Â N˜ÂÀQ˜ÂàT˜Â€K˜ÂÀQ˜Â N˜Â N˜Âà;˜Â`H˜ÂX˜ÂàT˜ÂX˜Â [˜ÂàT˜Â N˜Â N˜Â N˜Â B˜Â B˜Â`H˜Â B˜Â B˜Âà;˜Â B˜Â@E˜ÂX˜ÂÀQ˜Â N˜Â€K˜Â N˜ÂX˜Â N˜Â N˜Â`H˜Â`a˜Â`a˜Â [˜Â N˜Â B˜Â N˜Â N˜ÂÀQ˜Â [˜Â@^˜Â`a˜Â [˜ÂÀQ˜ÂàT˜ÂÀQ˜Â [˜Â@^˜Â`a˜Âàm˜Â`a˜Â [˜Â`a˜Â`a˜ÂÀQ˜ÂX˜ÂÀQ˜ÂàT˜Â€d˜Â`a˜ÂX˜Â N˜Â€K˜Â€K˜Â`H˜Â N˜Â N˜ÂàT˜ÂX˜Â@^˜ÂÀQ˜ÂÀQ˜Â [˜ÂX˜Â [˜Â@^˜Â [˜ÂX˜Â€d˜Â€d˜Â`a˜Â g˜Âàm˜Â t˜Âq˜Â t˜Â@w˜Â`z˜Â €˜Â g˜Âàm˜Âq˜Â t˜Âàm˜Âq˜Â@w˜Â t˜Âàm˜Âq˜Âq˜Â €˜ÂàŸ˜Â€–˜Â`“˜Âà†˜Â@w˜Â`z˜Âàm˜Â@w˜Â@w˜Â@w˜Â g˜Â g˜Âàm˜Âq˜Â t˜Âq˜Â@w˜Âq˜ÂÀj˜Â`z˜Â@w˜Â€}˜Â ˜Â €˜Â €˜Âà†˜Â ˜Â€}˜ÂÀƒ˜Â€}˜Âàm˜Âàm˜Â t˜Â`z˜Â €˜Â €˜Âà†˜Â`z˜Â t˜Â`z˜Âà†˜ÂÀƒ˜Â€}˜Â`z˜Â €˜Â€}˜Â t˜Â@w˜Â@w˜Â@w˜Â`z˜Â t˜Â t˜Â €˜Â €˜Â ˜ÂÀƒ˜Âà†˜Â ˜ÂÀƒ˜Â€}˜Â €˜ÂÀƒ˜Â ˜ÂŠ˜Â €˜Â €˜Âà†˜ÂŠ˜ÂÀƒ˜Â@w˜Â t˜Â t˜Â t˜Â ˜ÂŠ˜Â €˜ÂŠ˜Âà†˜Âà†˜Â@˜Â ™˜Â ™˜Â ˜Âà†˜Â€}˜Âà†˜Â €˜Â@w˜Â€}˜Âà†˜ÂÀƒ˜ÂŠ˜Â@˜Â`“˜ÂŠ˜Â ™˜ÂàŸ˜Âà†˜Â€–˜Â€–˜ÂÀœ˜Â€–˜ÂÀœ˜ÂàŸ˜Â£˜ÂàŸ˜Â@©˜Â ²˜Â€¯˜Â ¦˜Â ²˜Â`¬˜Â`¬˜Â£˜Â ¦˜Â£˜Â ™˜ÂŠ˜Â ˜Â ˜Â €˜Â@˜Â€–˜Â€–˜Â ™˜ÂàŸ˜Â ¦˜Â`¬˜Â ¦˜Â ¦˜Â€¯˜Â ¦˜Â`¬˜Â@©˜ÂàŸ˜Â ¦˜Â ¦˜Â£˜Â`¬˜Â€¯˜Â€¯˜Âธ ¿˜Â`¬˜Â€¯˜Â`¬˜Â€¯˜Â`¬˜Â€¯˜Â€¯˜Â`¬˜Â`¬˜Â`¬˜Â ¦˜ÂàŸ˜Â@©˜Â€¯˜Â€¯˜Â¼˜Â ¿˜Â Ë˜Â€È˜Â ¿˜Â ¿˜Â@˜Â`ŘÂ@˜¼˜ÂÀµ˜Â¼˜Â€¯˜Âธ ¿˜Â ¿˜ÂธÂ@˜Â`؀Ș ˘Â՘€Ș ˘€ȘÂÀΘÂàјÂàјÂàј ä˜Â ä˜Âàê˜Âàê˜Âî˜ÂÀç˜Â ä˜Â€á˜Â`ޘ ä˜Â`ޘ ؘ ä˜Â`Þ˜ÂÀç˜ÂÀç˜Âàê˜Â@ۘ ؘÂ@ۘ ؘ ؘ ä˜Âàê˜Âàê˜Â ä˜Â`ޘ ؘ€á˜Â ä˜ÂÀç˜Â ä˜Âàê˜Âàê˜Âàê˜Âàê˜Â ä˜Â€á˜Â ñ˜Â ñ˜Âàê˜Â€á˜Âàê˜Â ñ˜Âàê˜Âî˜Â ñ˜Âî˜Âàê˜Âàê˜Â ñ˜Â@ô˜Â ñ˜Â`÷˜Â€ú˜Â€ú˜Â€ú˜ÂÀ™Â ý˜Âà™Â ñ˜Â€ú˜Â ý˜Â`÷˜Â ñ˜Âàê˜Âî˜Âî˜Â ñ˜Â€ú˜Â ™Â ý˜Â ™ÂÀ™Â`™ÂÀ™Â`÷˜Â ý˜Â`÷˜Â€ú˜Â ý˜Â€ú˜Â ý˜Âà™ÂÀ™Â€ú˜Â@ô˜Â@ô˜Â`÷˜Â€ú˜ÂÀ™Âà™ÂÀ™ÂÀ™Â ý˜Â™Â ý˜Â ý˜Â€ú˜Â ý˜Âà™Â ™Âà™Âà™Â@ ™Âà™Â™Â™Â@ ™Â€™Â™ÂÀ™Â™Â€™Âà™Â ™Â ™Â@ ™Â ™Â ™Â ™Â@ ™Â`™Âà™Â ™Â ™Âà™Âà™Â ™Â`™Â ™ÂÀ™Â€™Â ™Â`™Â€™Â`™Â`™Â€™Â€™Â ™Â ™Â`)™Â #™Â ™Â@ ™Â ™Â€™Â ™Â ™Â€™Â`™Â@ ™Â@ ™Â ™Â ™Â ™Â€™Â`™Â€™Âà™ÂÀ™ÂÀ™Â ™Âà™Â`™Â ™Â ™Â™Â™Â ™Â`™Â€™Â`™Â ™Â ™Âà™Âà™Â ™Â ™Â ™Â ™Â`™Â ™Â`™ÂÀ™Âà™Â`)™Â #™ÂÀ™Â€,™Â #™Âà™Â`™Â ™Â ™Â`™Â ™Â #™Â ™ÂÀ™ÂÀ™Â ™Â ™Âà™Â`™Â€™ÂÀ™Â`)™Â ™Â`)™Â ™Â #™Â /™Â`)™Â9™Â@&™Â€™Â ™Â ™Â ™Âà™Â ™Â /™Â€,™ÂÀ2™Â`)™Â`)™Â /™Â /™Â`)™Â /™Â /™ÂÀ2™Â /™Â`)™Âà™Âà™ÂÀ™Â ™Âà™Âà™Â€™Â ™Â ™ÂÀ™ÂÀ™ÂÀ™Â #™Â #™ÂÀ™Â ™Â ™Â #™Â€,™Â #™Â@&™Â ™ÂÀ™Âà™Â ™Âà™Â #™Â #™Â #™Â #™Â@&™ÂÀ™Â ™Âà™Â ™ÂÀ2™Â€,™Â /™Â /™Âà5™Â9™Â <™Â /™Â <™Â <™Â9™ÂÀ2™Â€,™Âà5™Â9™ÂÀ2™Â9™Â9™Âà5™Â9™ÂÀ2™Âà5™Â <™ÂÀ2™Â /™Âà5™Âà5™Â <™Â`B™Â <™Â <™Âà5™Â@?™Â <™Â9™Â9™Â`B™Â`B™Âà5™Â /™Â9™Â H™ÂR™ÂR™Â <™Â /™Â9™Â <™Â@?™Â9™Â9™Â`B™Â€E™Â€E™Â <™Â <™Â /™Âà5™Â <™Âà5™Â@?™ÂÀ2™Âà5™ÂÀ2™Â9™Âà5™Â <™Âà5™ÂÀ2™Â <™Â@?™ÂÀK™ÂÀK™Â H™Â`B™Â H™ÂàN™Â U™ÂR™Â`[™Â`[™Â€^™Â@X™Â U™ÂàN™Â€E™Â`B™ÂàN™ÂàN™ÂàN™ÂàN™ÂÀK™ÂÀK™Â H™Â H™Â@X™Â U™Â@X™Â€^™Â U™Â€^™Â@X™Â H™ÂàN™Â H™Â`B™Âà5™Â@&™Â€,™Â€,™Â@&™Â@&™Â€™Â ™Âà™Â ™Â`)™Â€,™Â@&™Â #™ÂÀ™Â`™Â™ÂÀ™ÂÀ™Âà™Â ™Âà™Â ™Â`™Âà™Â ý˜Âàê˜Â€ú˜Â ý˜Â@ô˜Â@ô˜Â€ú˜Â ý˜Â ñ˜Â@ô˜Â€ú˜Â ý˜Âà™Â€ú˜Â@ô˜Âàê˜Â ä˜Â`ޘ ä˜Â`ޘ ؘÂàê˜Âî˜Â`÷˜Â ä˜Â ä˜Â`÷˜Â ñ˜Â`÷˜Âàê˜Âàê˜Â`ޘ ؘÂàј ˘Â`Ř ¿˜Â@˜ÂÕ˜Â`Þ˜Â@ۘ€á˜Â ä˜Â`ޘ ؘÂàјÂÕ˜ÂÀΘ ˘Â@˜Â@˜ ¿˜Â`ŘÂÀΘÂ`Ř ¿˜Â Ë˜Â Ë˜Â`ŘÂàјÂÀΘ¼˜Â ¿˜ÂÀµ˜ÂÀµ˜ÂÀµ˜Â ¿˜Â`ŘÂ՘€Ș¼˜Â`Ř ˘ ¿˜Â`ŘÂ`؀ȘÂ@˜Âธ ²˜Â ¿˜Â ¿˜Â¼˜Âธ ¿˜ÂธÂธ ¿˜Âàј ˘Â@˜Â@˜Â@˜ ¿˜Â ¿˜ÂธÂธÂธÂธ¼˜ÂÀµ˜Â ²˜Â ¿˜Â ²˜Â@©˜Â ²˜ÂธÂÀµ˜Â€¯˜Â@©˜Â ²˜Â€¯˜Â`¬˜Â@©˜Â`¬˜Â ²˜Â ²˜Â@©˜Â@©˜ÂÀµ˜Â¼˜ÂÀµ˜Â`¬˜ÂÀµ˜Â¼˜Â ²˜Â€¯˜Â`¬˜Â ¦˜Â£˜Â@©˜ÂàŸ˜Â ²˜Â€¯˜Â`¬˜Â`¬˜ÂàŸ˜Â@©˜Â ¦˜Â ¦˜Â ²˜Â@©˜ÂàŸ˜Â£˜Â€–˜Â@˜Â ˜Â`“˜Â ™˜Â ¦˜Â`¬˜Â`¬˜Â ™˜Â€–˜Â ¦˜ÂÀœ˜Â£˜Â£˜Â@©˜Â€¯˜Â`¬˜ÂÀœ˜ÂÀœ˜ÂÀœ˜ÂàŸ˜Â€–˜Â`“˜Â€–˜Â`“˜Â`“˜Â€–˜ÂÀœ˜ÂÀœ˜Â ¦˜Â£˜Â ¦˜ÂàŸ˜ÂàŸ˜Â ™˜Â€–˜Â ˜ÂÀƒ˜Â €˜Â €˜Â`z˜Âà†˜Âà†˜Â ˜Âà†˜Âà†˜Âà†˜Âà†˜ÂÀƒ˜ÂÀœ˜ÂÀœ˜Â`“˜ÂŠ˜Â ˜Âà†˜ÂÀƒ˜ÂÀƒ˜Â`z˜Â€}˜ÂÀƒ˜Âà†˜ÂŠ˜Â ˜Â`“˜Â€–˜Â`“˜Â ™˜Â ™˜ÂÀœ˜Â€–˜Â ™˜Â`“˜ÂŠ˜Âà†˜Â ˜ÂŠ˜Â €˜Â€}˜ÂŠ˜Â €˜Â €˜Â ˜ÂÀƒ˜Â €˜Â €˜Â €˜Â €˜Âà†˜Âà†˜Â@˜Â€–˜Â@˜Â ™˜ÂÀœ˜Â ™˜Â ™˜ÂàŸ˜Â ¦˜ÂàŸ˜ÂÀœ˜Â@©˜Â€¯˜ÂàŸ˜Â`“˜ÂàŸ˜ÂàŸ˜Â`“˜Â ™˜Â€–˜Â ™˜Â ™˜Â ¦˜Â`¬˜Â ¦˜Â€¯˜ÂÀµ˜Â€¯˜ÂàŸ˜ÂàŸ˜Â£˜ÂàŸ˜Â`“˜ÂÀœ˜Â€–˜Âà†˜Â ˜Â€–˜ÂàŸ˜ÂÀœ˜Â ˜Â`“˜Â`“˜Â`“˜Â ™˜Â`“˜ÂÀœ˜Â`“˜Â ™˜Â`“˜Â`“˜Â€–˜Â ™˜Â@©˜Â€¯˜Â£˜Â`“˜Â@˜Â ™˜Â ™˜Â ™˜Â£˜Â ¦˜ÂàŸ˜Â€–˜Âà†˜ÂÀƒ˜Â €˜ÂŠ˜Â €˜ÂŠ˜Â ˜Â ™˜Â£˜Â`¬˜ÂÀµ˜Âธ€¯˜Â`¬˜Â@©˜Â ²˜Â@©˜Â£˜Â ¦˜Â ¦˜Â`¬˜Â@©˜ÂÀœ˜Â ™˜ÂÀœ˜ÂÀœ˜Â ™˜ÂàŸ˜ÂàŸ˜Â`¬˜Â`¬˜Â€¯˜Â ²˜Â@©˜ÂธÂ@˜ ˘ ˘ÂÀΘ ˘Â`Ř ¿˜Â¼˜Âธ¼˜Âธ¼˜ÂธÂ`ŘÂ`Ř ˘ ˘ ¿˜Â@˜Âธ ¿˜Â`؀Ș ¿˜Â ²˜Â€¯˜Â ²˜Â ²˜ÂÀµ˜Â¼˜Â@˜Â@˜¼˜Â ¿˜Â ¿˜ÂÀΘ€ȘÂ`Ř ¿˜Â€È˜Â€È˜Â ¿˜Â€È˜Â€È˜Â Ë˜ÂÀΘÂÕ˜Â@Û˜ÂàјÂÀΘÂàј ˘€ȘÂÀΘÂÀΘ ˘€Ș ˘Â@Û˜ÂàјÂ`Þ˜Â`Þ˜ÂàјÂÀΘÂàјÂàјÂàјÂÀΘÂ@Û˜Â՘ ˘ ؘ ؘÂàјÂàј ˘€Ș ˘ ؘ ؘ ˘ ˘Âàј ؘ€á˜ÂÀç˜Âî˜Âî˜Â`Þ˜Â@Û˜Â`Þ˜Âàê˜Â€á˜Â`Þ˜Â՘ ˘ ؘÂÕ˜Â@Û˜Â`Þ˜Â`ޘ ؘ ؘ ؘÂ@Û˜Âî˜Âî˜ÂÀç˜Â€á˜Â ؘÂàјÂàј ؘÂÀç˜Â€á˜Â€á˜Â ä˜Â`ޘ ä˜Â€ú˜Â`÷˜Â ý˜Â@ô˜Âàê˜Â ä˜Âàê˜Â ñ˜Âàê˜Â ñ˜Âî˜Â ñ˜ÂÀç˜Âàê˜Âî˜Â ä˜ÂàјÂ@Û˜ÂàјÂ`ޘ ä˜Âî˜Â ñ˜Â ñ˜Âàê˜Âî˜ÂÀç˜Â`ޘ ä˜Â ä˜Â ä˜Â ä˜Âî˜Âî˜Âàê˜Â€ú˜Â@ô˜Âî˜Âàê˜Â`÷˜Â@ô˜Â ñ˜Âî˜Âî˜Â@ô˜Â ñ˜Â`÷˜Â`÷˜Â@ô˜Â€ú˜Â@ô˜Â€ú˜Â@ô˜Â`÷˜Â ñ˜Â`÷˜Âàê˜ÂÀç˜Â ä˜Âàê˜Â ä˜Â ä˜Âàê˜Âî˜Â@ô˜Â ñ˜Âàê˜Â€á˜Â ؘ ä˜Â`ޘ ä˜ÂÀç˜ÂÀç˜Â`Þ˜ÂÀç˜Â`ޘ ؘ ä˜Âàê˜Âàê˜Âî˜Â ä˜ÂÀç˜Âî˜Â ý˜ÂÀ™Â`÷˜Â ñ˜ÂÀç˜Â`Þ˜Â@Û˜Â`Þ˜Â@Û˜Â`ޘ€á˜Â ä˜Â€á˜Â€á˜Â ä˜Â ä˜Â ä˜Â ä˜Â ä˜Â ؘÂ@ۘ€á˜Â ؘÂ`ޘ ä˜Â ä˜Â€á˜ÂàјÂÀΘÂÀΘÂàјÂ`ޘ ؘ ؘ€Ș ؘ€á˜Â`Þ˜Â@ۘ ؘ€á˜Â ؘÂ`Þ˜Â`Þ˜Â@Û˜Â@ۘ ˘ÂàјÂÀΘ€ȘÂÀΘ ˘Â`ޘ€á˜Â€á˜Â ä˜Â€á˜ÂÀç˜Â€á˜Â€á˜Â`Þ˜Â@Û˜ÂÀΘ ˘ ؘÂàј ؘÂ`ŘÂàјÂÀΘÂÕ˜ÂàјÂÀΘ ؘ ؘ ؘÂ`Þ˜Â`ޘ ؘÂÕ˜ÂàјÂàјÂàјÂ`Ř ˘¼˜Â ¿˜Â ¿˜ÂÀµ˜Âธ ¿˜ÂàјÂÀΘÂàј ؘ ؘÂ@Û˜ÂÀΘÂàјÂ`ޘ ä˜Â@ۘ ˘ ˘ÂÀΘÂàј ˘ÂàјÂàј€ȘÂ`ŘÂ`ŘÂ@˜€Ș ˘Â`ŘÂàј ˘ ˘ÂàјÂàј ؘ ؘÂ@Û˜Â@ۘ ؘ ؘÂ@Û˜Â`Þ˜Â`ޘ€á˜Â€á˜Â@ۘ ؘÂ@Û˜Âàј ä˜Â`ޘ ؘ ä˜Â`Þ˜Â՘ ؘ€á˜Â`Þ˜Â@Û˜Â`Þ˜Â`ޘ€á˜Â`Þ˜Â@Û˜ÂÀΘÂàј ؘ€á˜Â ä˜Â€á˜Â ä˜Â`Þ˜ÂàјÂÀΘÂÀΘ ؘÂ@Û˜Â@ۘ ؘÂ@Û˜Â`ޘ ä˜Âàê˜Âàê˜Â ñ˜Âàê˜Â€á˜Â ä˜ÂÀç˜Â ñ˜Â@ô˜Â€ú˜Â€á˜ÂÀç˜Â€á˜Âàê˜Â€á˜Â@Û˜ÂÀç˜Âàê˜Â€á˜Âàê˜Âàê˜Âî˜Âî˜Âàê˜Âàê˜Â ä˜Âàê˜Â ä˜Âàê˜Âî˜Â`÷˜Âàê˜Â@ô˜Â€ú˜Â`÷˜ÂÀ™Â ý˜Âà™Â ý˜Â`÷˜Â ý˜Â ý˜Âà™Âà™ÂÀ™Â€ú˜Â`÷˜Â ñ˜Âàê˜Â@ô˜Âàê˜Â ñ˜Â`÷˜Â€ú˜Â ý˜Â`÷˜Â`÷˜Â@ô˜Â`÷˜ÂÀ™Â ý˜Â`÷˜Â ñ˜Â ý˜Âà™Â€ú˜Â€ú˜ÂÀ™Â ý˜Â™Â ý˜Â ý˜Â ñ˜Â ñ˜Â`÷˜Â€ú˜Âà™ÂÀ™Â€™Â€™Â ™Â ™Â ™Â ý˜Â€ú˜Âî˜Â ñ˜Â€ú˜Â ý˜Â ý˜ÂÀ™ÂÀ™Âà™Â ™Â ™Â€™Â ™Â™Â`÷˜Â`÷˜Â€ú˜Â ý˜Â€ú˜Â ý˜Â ý˜Â€ú˜Â ý˜Âà™ÂÀ™Âà™Â`™Â@ ™Â™Â ™Â ™Â ý˜Â™Â™Â@ ™Âà™Â ™ÂÀ™Â™Â`÷˜Âà™Â™Â ™Â@ ™Â`™Â™Â ™Â@ ™Â@ ™Âà™ÂÀ™Â`™Â ™Â ™Â€™Âà™Â`™Â@ ™Â`™Â ™Â ™Â€™Â€™Â`™Âà™Âà™ÂÀ™Â ™Â #™Â #™Â ™Â€™Â ™Â ™Â #™Â #™Â€,™Â #™Â€™Â ™ÂÀ™Â ™Â #™Â ™Â€™Â`™Â ™Â ™Â ™ÂÀ™Â #™Âà™Â`)™Âà™Â ™Â ™Â #™Â€,™Â`)™Â ™Â #™Â #™Âà™ÂÀ™Âà™Â`)™Â`)™Â€,™Â <™Â <™Â@?™Â9™ÂÀ2™ÂÀ2™Â #™Â ™ÂÀ™Â ™Â ™Â ™Â@&™Â #™Â #™Â€,™ÂÀ2™Âà5™Â€,™Â9™Â€,™Â€,™Â€,™Â@&™Â`)™Â@&™Â€,™Â #™Â@&™Â€,™Â@&™Âà5™Â /™Âà5™Â <™Â€,™Â€,™Âà5™Âà5™ÂÀ2™Â€,™Â`)™Â`)™Â #™Âà™ÂÀ™Âà™Âà™ÂÀ™Â #™Â`)™Â #™Â`)™Âà5™Â9™Âà5™Â /™ÂÀ2™Â /™Â /™Â <™Â`B™ÂÀK™Â <™Â9™Â <™Â <™Âà5™Â /™ÂÀ2™ÂÀ2™Â /™Â /™Âà5™Â <™Âà5™Â€E™Â€E™Â@?™Â9™Â9™ÂÀ2™Â`)™Â@&™Â€,™Âà5™Â9™ÂÀ2™Â`)™ÂÀ2™Â /™ÂÀ2™Â /™ÂÀ2™Âà5™Â <™Â`B™Â <™Â`B™Â H™ÂÀ2™ÂÀ2™Â`)™Â€,™Âà5™Â <™Â`B™Â`B™Â H™Â@?™Â€E™Â <™Âà5™Â <™Â <™Â <™Â9™Â€,™Â€,™Âà5™Â@?™Âà5™Â /™Â€,™Â€,™Â€,™Âà5™Â`B™Â H™Â`B™Â H™Â H™Â H™Â€E™Â`B™Â H™Â`B™Â <™Â <™Â <™Â`B™Âà5™ÂÀ2™Â@?™Â H™Âà5™Â <™Â H™ÂÀK™ÂàN™Â U™Â U™Â@X™Â`[™Â U™Â H™Â H™Â <™Â <™Â`B™Â H™ÂR™ÂR™ÂàN™Â H™Â`B™Â U™ÂàN™Â U™Â`[™Â€^™Â@X™Â@X™Â U™Â@X™ÂàN™ÂÀK™Â H™Â`B™Â H™ÂÀK™Â H™ÂàN™Â`B™Â H™Â`B™Â <™ÂÀK™ÂÀK™Â H™ÂàN™Â`[™Â U™Â H™Â H™Â€E™ÂÀK™Â H™ÂàN™Â H™Â9™Â€,™ÂÀ™Â`)™ÂÀ™Â€™Â@ ™Â ™ÂÀ™Â™ÂÀ™Â ý˜Âà™Â™Â ý˜Â@ô˜Â@ô˜Â ñ˜Âî˜Âî˜Â ñ˜Â@ô˜Âî˜Â@ô˜Âàê˜Â ä˜ÂÀç˜Â ä˜Â ä˜ÂÀç˜Â ý˜Â@ô˜Â ñ˜ÂÀç˜Â@ô˜Â€ú˜Â ñ˜ÂÀç˜Âàê˜Â ñ˜Âàê˜Â€á˜Â ä˜Â ؘÂ@Û˜Âàј ؘ€á˜Â€á˜Â@Û˜ÂÀç˜Â ä˜Âàê˜ÂÀç˜Â ä˜Â ä˜Â ä˜Â`ޘ ؘ€á˜Â ä˜ÂÀç˜Â€á˜Â ؘ ؘÂàê˜Â ؘÂàјÂàјÂàјÂÕ˜ÂàјÂàјÂÀΘÂ@ۘ ä˜Â ä˜Â@Û˜Â`Þ˜Â`Þ˜ÂÕ˜ÂàјÂÀΘÂàјÂ@Û˜Â@Û˜Â`Þ˜ÂàјÂàјÂ@Û˜Â@Û˜Â`ޘ ä˜ÂÀç˜Â@Û˜ÂÕ˜Â`ŘÂ`ŘÂธ¼˜Â¼˜Â ²˜Â ¦˜ÂàŸ˜Â ˜ÂŠ˜Â€}˜Â t˜Âàm˜ÂÀj˜ÂàT˜ÂX˜Â N˜ÂàT˜ÂàT˜Â`a˜Â N˜ÂÀQ˜Â B˜ÂÀQ˜Â€K˜Â?˜Â€2˜Âà;˜Âà;˜Â@E˜Â 5˜Â@,˜Â )˜Â@,˜Â ˜Â ˜Â ˜Â ˜Â ˜Â ˜Â`˜Â ˜Â@˜Â ˜Â ˜Â ˜Â ˜Â`ý—Â`ý—Â`ý— ÷—Âô— ˜Â ˜Â ˜Â€˜Â`ý—€˜Â ÷— ê—€ç— ê— ޗ ޗ ޗÂ@á—Âà×—Âۗ ޗ€ç—Â`ä—Â@á—Â@á—Âۗ ޗ€ç—Â`ä—ÂÀí—Â`ä—Â@á—€Η€Η ї ї€ΗÂ@ȗ ї€Η€Η— ŗÂ@ȗ— ŗ ŗ ŗÂ@È—Â`Ë—Â@È—Â@ȗ ŗ ї ŗÂྗ—— ŗÂ`Ë—Â@ȗ€ΗÂ`˗— ¸—€µ—Â`²—Â`²— ¸—€µ— ¸— ¸— ¸— ¸—Âྗ ŗ ŗ ŗÂྗÂྗ€µ——Â`²—€µ— ¸— ¸— ¸—€µ——ÂÀ»—€µ—ÂÀ»— ¸—ÂྗÂ`²—ÂÀ»— ¸—ÂÀ»— ¸—ÂྗÂྗÂ@¯—Â`²—Â`²—Â`²—ÂÀ»— ¸—ÂÀ»— ¸—ÂÀ»—ÂྗÂ`²— ¸—Â`²— ¸—Â`²— ¸—ÂÀ»—€µ—Â`²—Â`²—Â`²— ¬— ¬—©—Â@–—ÂॗÂÀ¢—Â@¯—Â@¯—ÂÀ¢— ¬—Â`²— ¸— ¸— ¬—Â@¯—Â`²—Â`²—ÂÀ»— ¸—ÂྗÂ`²—€µ—Â`²—€µ—€µ—Â`²— ¬—ÂॗÂÀ¢— ¬— ¸—Â@¯—ÂÀ»— ¸—€µ—ÂÀ¢—©—Â`²— ¸—Âྗ ¸—Â@¯—Â`²— ¬—Âॗ©—Âॗ “—ÂàŒ—Â€œ— Ÿ—ÂÀ¢— Ÿ—©—Â`™—— “— “— Ÿ— Ÿ— Ÿ—ÂॗÂॗÂ`²— ¬— ¬—©—Âॗ€œ— “—€œ— Ÿ—Âॗ Ÿ— “—Â@–—ÂÀ‰— “—Â@–—ÂàŒ—Â “—Â`™—€œ—Â`™—Â`™— “— “— Ÿ— ¬—Âॗ Ÿ—Â@¯—©—©— Ÿ—Â`™—Âॗ Ÿ—Â@–— Ÿ—Â`™— ¬—Âॗ ¬—Âॗ Ÿ— ¬—Â`²—Â@¯—Âྗ€µ— ¬— ¸—Â`²—€µ—€µ—€µ—Â`²— ¬— ¬—©— ¬—Âॗ©— ¬— ¬—©— ¸—€µ—©— ¬—ÂॗÂ`™—€œ—€œ—Â`™— Ÿ—Â@¯— ¸—ÂÀ»—ÂÀ»—Â`²— ¸—Â@¯—©—ÂÀ»— ¸—ÂÀ»—Âྗ—ÂÀ»— ŗ ŗ ¸—€µ—Â@¯— ¸— ¸—Â@¯—ÂÀ»— ŗ ї€ΗÂà×—Âàח ŗ ŗ ¸—€µ—Âྗ ŗÂ@È—Â@È—Â`Ë—Â`Ë—ÂÀÔ—Â`Ë—Â@ȗ їÂà×—Âà×—Â@á— їÂàח€ç—Â`˗— ŗ їÂà×—Â@á—Â`ä—Â`ä—Â@á—€ç—Â@á— їÂàח ї€Η ї їÂà×—Âà×—Âà×—Âàח€ç—Â`ä—€ç—ÂÀí—Âô—Âàð—Âô— ê— ޗ їÂà×—Âà×—Â Þ—ÂÀÔ—Âà×—Â@á—Âàח ޗ€ç—€ç—ÂÀí—ÂÀí— ê—Â`ä—Â`ä—Âàח їÂÀԗ€ç—Â`ä—Âàð— ÷— ÷— ê—Âà𗀘Â`ý—Â`ý—€˜Âàð—Âàð— ÷— ÷—€˜Â€˜Â€˜Â€˜Â ˜Â€˜Â ˜Â ˜Â€˜Â`ý—Â`ý—Âà ˜Â ˜Â`˜Â@˜Â ˜Â@˜Â ˜ÂÀ˜Â ˜Âô—Âô— ÷—Âà𗀘Âô— ÷—Â`ý—€˜Â ˜Â ˜Â ˜Â`ý—Â@˜Â`˜Âà ˜Â ˜ÂÀ˜Â ˜Âà ˜Â ˜Â ˜Â ˜Â€˜Â€˜Â ˜Â@,˜Â`/˜Â`/˜Â&˜Â ˜ÂÀ˜Âà"˜Â&˜Âà"˜Â ˜Â ˜Â€˜Âà"˜Â ˜Âà"˜Â&˜Â&˜Â&˜ÂÀ˜Â ˜Â ˜Âà"˜Â`˜Â@˜Â ˜Âà ˜ÂÀ˜Â@˜Â ˜Â ˜Â@˜Âà"˜ÂÀ˜Â€˜Â@˜Â`˜Â ˜Â€˜Â€˜Â`˜Â`˜Â ˜Â`˜Âà ˜Â ˜Â ˜Âà ˜Âà ˜Âà ˜Âà ˜Â ˜Â€2˜Â )˜Â ˜Â€˜Â ˜Âà"˜Âà"˜Âà ˜Âà ˜Âà ˜Â ˜ÂÀ˜Â ˜Â ˜Â`ý— ˜Â ˜Â ˜Â ˜Â ˜Â`˜Â`˜Âà ˜Â€˜ÂÀ˜Â ˜Â€˜Â`˜Â ˜Â@˜Â`˜Â ˜Â&˜Â )˜Â€˜Â ˜Â`˜Â€˜Âà"˜Â€˜Â ˜Â ˜Â`˜Â ˜Â ˜Â ˜Â ˜Â@˜Â ˜Â ˜Â ˜Â`˜Â€˜Â ˜Â€˜Â ˜Â ˜Âà ˜Â ˜Â ˜Â ˜ÂÀ˜Â ˜Â ˜Â ˜Â ˜Âà ˜Â ˜ÂÀ˜Â`˜Â`˜Â ˜Â€˜Âà"˜Â`˜Â ˜Â ˜Â@˜Â ˜Âà ˜Â€˜Â ˜Â ˜ÂÀ˜Â ˜Â ˜Â€˜Â`˜Â ˜Â`˜Â€˜Âà ˜ÂÀ˜Â ˜Â ˜Â ˜Âà ˜Â ˜Â ˜ÂÀ˜Â ˜Â`˜Â ˜Âà ˜Âà ˜Â ˜Â€˜Â`ý— ˜Â`˜Â ˜Â€˜Â ˜Âà ˜Âà ˜Â ˜Â`ý— ˜Â`˜Â ˜Â ˜Â ˜Âà ˜Â ˜Â@˜Â`˜Â ˜Â ˜ÂÀ˜Â ˜Â€˜Â ˜Â ˜Â ˜Â ˜Â`˜Â`˜Â ˜Â`˜Â`˜Â`˜Â ˜Â€˜Âà ˜Âà ˜Â ˜Âô—Â@ú—€˜Â ê—ÂÀÔ—Â Å—Â`²— ¬—Â@–— †—Â`€—Â`€—Âàs—Â@d—ÂàZ— T—ÂÀW—ÂàZ—ÂàA— /—€—ÂÀ%—€—Â@—Â`—€—Âà— —— —Âà—Âà——  —Âà—  —Â@—€—Âú–€í–Â@ç–Âàݖ€ԖÂàÝ–ÂàÝ–Â`Ñ–Â@Ζ ˖ÂÀÁ–ÂÈ–ÂÀÁ– ²–Â@µ–€»– ¾– ¾–Â`¸–Â`¸–€»–€»– ²–€»–¯– ¥– ¥–€¢–Âà«–Â૖–– ™– ™– Œ–€‰– Œ–Â`†–€‰–Â`†–Â@ƒ–Âày–Â@ƒ–Â@ƒ– €–Â@ƒ– Œ–Â`†–Â}–Âày–Â}–Â}–Âày–Â@ƒ–Â@ƒ–€‰–Â}– s–€p–Â@j–€p–Â@j–€p–Â`m–Âà`– Z–€W–Â`T– N–ÂàG– N–Âà`– Z– N–€W–Â@Q–ÂK–ÂàG–Â`;–Â`;–ÂÀD– N–ÂK– A–Â@8–Â`;–ÂàG–ÂàG–ÂK–ÂK–€>–€>–Â`;– 5–€>–Âà.– (– –Âà– – –Â@–Â@–Âàü• ö• ö•Âàü• ö•Âàü•Â`ð•Â`ð• ݕÂ@Ô•Â`וÂ@Ô•ÂΕÂàʕ€Á• ¸•Âౕµ•Â`¥•Â`¥•Â@¢• Ÿ•Â@¢•Â`¥•Â`¥•œ•Âà˜•Â`Œ•ÂÀ|•€v•€v•€v•€v•Â`s•€v•Âàf• m•Âj• m•Â@p•€v•€v•Â@p•Â`s•Â`s•Âj•€]•Â`Z• `• T•€]•€]•Â`Z•€]•Â@W•ÂQ•ÂQ• ;•Â`A• G•ÂÀJ•ÂàM• G•ÂÀJ• G•ÂàM•ÂQ• G• G•ÂÀJ•ÂàM• G•Â@>• G•€D•ÂàM•€D•€D• ;• G•Â8• ;•Â`A•Â8•Âà4•Â@>•Â`A•Â`A• ;•Â8• ;•Âà4•Âà4• ;•Â`A•€D•Â`A•Â@>•Âà4•Â`(•€+•Âà4•Â`A•€D•Â`A• ;•Â8•Âà4•Â`A• G• G•€D•Â8•ÂÀ1•Â8•Âà4• ;•Â8• ;• ;•Â8• ;•Â`A•€D• ;•Âà4•ÂÀ1•€+•ÂÀ1•Â8•ÂÀ1•€+•Â@%• .•ÂÀ1•ÂÀ1•€+•Â`(•Â@%• "•Â@%• "• .•€+•Âà4•Âà4•Â8•ÂÀ1• .•€+•ÂÀ1•Â`(•Â`(•€+•Âà4• .• .• .•Â`(• .•€+•ÂÀ1• ;• ;•Â@>•Â`(• "• •• • •€•€+•Âà4•Â8•€+•Â`(•ÂÀ1•Â8• G•Â@>•Â8• ;•Â8•ÂÀ1•Âà4•€D•€D• ;•€D•Â8•Âà4• .•Âà4• ;•€D•€D•€D• G•€D•€D•€D•€D• ;•Â`A•€D• G•ÂQ•ÂàM• G•€D•€D•ÂÀJ• T•ÂàM•ÂÀJ•ÂàM•ÂQ• G•Â`A• G•€D•ÂàM• G• T•Â`Z• T•ÂQ•Â@W•ÂàM•Â`Z•ÂÀc• `•Â`Z•Â`Z• T•ÂQ•ÂàM• T•Â`Z• T• T• T• G• G•ÂQ•€]• T•Â`Z•ÂQ•Â`Z• T•Â@W•ÂQ•ÂàM•ÂàM•ÂQ•€D• ;•Âà4•Â@>•€D•Â@>• G• G• G• G•€D• G• ;• ;•Â`A•Â@>• ;•Â8•Â8• ;• ;•€D•Â`A• G•ÂàM•ÂàM•ÂàM• T•ÂÀJ•€D•Â@>• ;•Â`A•Â`A• G• G•€D•ÂàM• T•ÂÀJ•Â`A•ÂàM•Â`A•Â`A•Â8• G•ÂàM• G•ÂàM• G• T•ÂQ•ÂàM•ÂàM•ÂQ•ÂQ•Â@>• G•ÂàM•ÂàM•ÂQ•€]•€]•€]•Â@W•€]•€]•€]• `• m•Âàf•ÂÀc•Â@W•Â`Z•ÂQ• T•ÂàM• G• G•ÂàM•Â`Z• `•Â`Z•Â`Z•Â@W•Â@W•Â`Z• `•Âàf•Âj•Â@p•Â@p• m•Âj• y•Âà• †•Â@‰•Âà•ƒ•ƒ•€v•€v•Â@p•ÂÀ|• y•ÂÀ|• y•ÂÀ|•Âà•ƒ• †• y•Â@p•Â`s•Âà•ÂÀ|• y•Â`Œ•Â@‰• †• y•ÂÀ|• †•ƒ•€•Âà˜•Â`¥•Â@¢•Âà˜•Â ’•Â`Œ•Â@‰•Â@‰•Â@‰• †• †• ’•Â`Œ• †• †•Âà•ÂÀ|•€v•Â`s•Â`s• y• y•ƒ• †•Â`Œ•Â`Œ•Â@‰• ’•Âà˜•Â Ÿ•Âà˜•Âà˜•Â€•€• ’•ÂÀ••ÂÀ••€•€•Â`Œ• ’• ’•Â@¢•€¨•€¨•ÂÀ••€•œ•Âà˜•Âœ•œ•Âà˜•Âà˜•Â ’•œ•Â@¢•Â`¥•Âౕµ•ÂౕÂÀ®•Â@¢•Â`¥•œ•€¨•€¨•Âౕ ¸•Âౕµ•Âౕ «• Ÿ•Âà˜•Â€¨•€¨•€¨•€¨•ÂౕÂÀ®• «• «•Âౕ ¸•Â`¾•€Á• ¸•µ•Â@»•Â`¾•ÂàÊ•ÂΕÂ@Ô•Âàʕ ĕ ĕµ•€Á•€Á•Âàʕ ѕ ѕ ѕÂ@Ô•Â@Ô•ÂΕ ѕÂ`ו ê• ê• ݕ€ڕ ѕÂ@Ô•Âàã•Â`ו€ڕ€ڕÂÀà• ݕ ê•Âàã•€ڕÂàã• ê• ݕ ѕ€ڕÂàã• ê• ݕ ݕÂç•Â@í•Â@í• ö•Â`ð• ê•Âàã•Âàã•Âàã• ê•Âç•Âàã• ö•Â` –Â` –Â` – –ÂÀù•€ó•€ó•Â`ð•Â`ð•€ó•ÂÀù• ö• ö•Âç• ê•Â`ð•Âàã• ݕ€ڕÂ@ԕ€ڕÂç• ê•Âàã• ݕÂ@ԕ ݕ ĕÂ`¾•€Á• ¸• ¸• ¸• ¸•Â@»• ĕÂàʕ€Á•ÂΕ€Á• ĕÂ`¾•Â`¾• ¸•Â@»• ¸•€Á• ¸•µ•ÂౕÂÀ®•Â@»•ÂౕÂౕ ¸•µ•µ•Âౕµ•Âౕ ¸•Âౕ ¸•ÂÀ®• ¸• ¸• ¸• «• Ÿ• Ÿ•Â`¥•Âà˜•Â Ÿ• ’• ’• Ÿ• «•µ•ÂౕÂ`¥•€¨• «•Âౕ ¸•Âౕ «• ¸•µ•ÂౕÂÀ®• Ÿ•€¨•ÂౕÂౕÂÀ®•ÂÀ®•ÂÀ®•ÂౕÂౕÂౕ ¸•€Á•ÂÀÇ•ÂàÊ•Â`¾•€Á•Â`¾•ÂÀǕ ѕÂàÊ•ÂΕ ĕÂΕ ĕÂàʕ ĕÂΕÂΕÂàʕ€Á• ĕÂÀǕ ѕÂΕÂàÊ•ÂàÊ•ÂÀǕ ĕÂàÊ•Â`¾•Â`¾• ĕÂΕÂ@ԕ ѕ€ڕ ѕ ѕ ѕÂàÊ•ÂΕ€Á•ÂàÊ•Â@ԕ€ڕ ѕ ѕ ѕ ѕÂ@Ô•Â Ñ•ÂΕ ݕ ѕ ѕ ѕ ݕ ݕÂàã•Â`וÂ@Ô•ÂΕÂ@ԕ€ڕ€ڕÂàã•Â`ð•Â`ð•Â@í• ê•Âàã•Â`ð•Â`ð•Âç• ݕ ݕÂàã•Â`ð•€ó•Âàü•ÂÀù•–Â@–––Âàü•Âàü•Âàü• –Âàü• ö• ö•Âàü•Âàü• ê•Â`ð• ö• ö•Â`ð•Â@í•Â`ð•Â`ð•Â@í•Â`ð• ö• ö• ê•ÂÀù• –Â@–Âàü• –ÂÀù• ö•€ó•Âàü•– ö• –€ –Â` – –Â` –€ –ÂÀ– –Â@–Â`"–Â2– (– – –Âà–Âà–Âà– –Âà–Âà–Â`"– ––Â`"– (– – –€%– –Â`"–€%–ÂÀ+–Âà.– 5–€>–ÂàG–Â@8–Â@8–Â2– 5–Âà.– (–Â`;–ÂàG–ÂÀD–ÂàG–ÂÀD– N–ÂÀD–ÂÀD–ÂÀD–Â`;–€>– A–ÂàG–ÂÀD–ÂÀD– A–ÂàG– A–ÂÀD–ÂàG–Â`T–€W–Â`T–Â@Q– Z–ÂÀ]– Z–Âd–Â`T– N–Â`T– N–Â@Q–Â`T– Z– Z– Z–ÂK–€W–ÂÀ]– Z– g– g–Âà`– Z– Z–€W– Z–€W–Âà`–Âà`– g– g– g–Â@j–ÂÀ]– Z– Z–ÂÀ]– Z–Âd– s– s– s–Â@j–ÂÀ]–Âà`– g– g–Âd–ÂÀ]–Âd–Â`T–Â`T–Â`T–Â`T–Âà`– g–ÂÀv–ÂÀv– g– g– s– €– s–€p–Âày– s–Â`m–Â`m– s– s–Â`†–Âày–Âày–ÂÀv–ÂÀv–ÂÀv–€p–Âày– €– €–Âày–Âày–Â@ƒ–Â`†–Âà’–Â ™–Â`Ÿ– ™–––€‰–Âà’–Â Œ– Œ– Œ–€‰–Â}–Âày–Âày–Â@ƒ–Â`†–Â`†–Âà’–Â Œ–Â`†–Âà’–Âà’–Âà’–Â ™–Â`Ÿ–€¢–Â`Ÿ–––Âà’–Â––Âà’–Â ™–Â`†– Œ– ™–Â@œ–Â`Ÿ– ¥–ÂÀ– ™–€¢–ÂÀ¨– ¥–ÂÀ¨–Â૖ ¥–Â`Ÿ–Â@œ–––ÂÀ––––– ™– ¥–¯– ²– ¾–ÂàĖ ¾–ÂȖ ¾–Â`¸– ²–Â@µ–Âà«–Â ²– ¾–€»– ¾– ²–€»–ÂÀÁ–ÂàĖ ¾– ¥–ÂÀ¨– ²–¯– ²– ¥–Âà«–Â ²–Â@µ–Â@µ–Â૖ ¥–€¢– ¥–ÂÀ¨–ÂÀ¨–ÂÀ¨–Â`Ÿ–Â@œ–Â`Ÿ––– ™–€¢–Â@œ–Âà’–Â Œ–Â`†–Â`†–Â`†–Â`†–€‰– €–Â@ƒ–Â`†–Âày– €–Â@ƒ–Âà’–Â`†– €–Âày–Âày–Âày– Œ–ÂÀ– Œ–Âà’–Â€‰– Œ– €–Â`†–Â@ƒ–Â`†–€‰–€‰–Âà’–Â ™– Œ–€‰– €– s–Âày–Âày–Â}–Â`†– €–Â@ƒ–Â@ƒ– Œ– €–Â}–Âày–Âày–Âày– s– €–Â`†–Â`†–Â`†–€‰– €–Âày–€p–Âày–Âày–ÂÀv–ÂÀv–Â}–Â`†–Â}– €–Â@ƒ–Â}–€‰–Â`†–Âà’–Â–– Œ–ÂÀ–Â`†–€‰–ÂÀ–Âà’–Â–– Œ–Âày–ÂÀv– €–Â`†–Âày–Â`†– Œ–Âà’–Â Œ– Œ–€‰– €–Â`†–€‰– Œ– Œ–ÂÀ–Â`Ÿ–Â@œ– ™– Œ–Âà’–Â@œ–€¢– ¥– ¥–ÂÀ¨–€¢–€¢– ¥–€¢– ™––– ¥–€¢–€¢– ™–Â`†–€‰– Œ– Œ–Âà’–Â`Ÿ–––Â`Ÿ–Â`Ÿ– ™– ™– ™–Â@œ– ™– Œ– ™– ™– Œ– ™–Âà’–Â––––ÂÀ¨–ÂÀ¨–ÂÀ¨–Âà«–Â ²–Â૖ ¥– ¥–Â@µ–€»–Â@µ–ÂàÄ–ÂàĖ ¾–€»–€»–Â`¸– ¾–Â`¸–€»–ÂÀÁ–Â@Ζ ˖ÂÈ–Â`Ñ–ÂÀږ ז זÂ`Ñ–Â Ë–ÂàÄ–ÂàÄ–ÂàĖ ˖ ¾–€ԖÂÀÚ–Â ä– זÂ@Ζ ˖ÂÀÁ– ¾– ˖ זÂÀÚ–ÂÀÚ–ÂÀÚ–Â ä– זÂ@ΖÂ@Ζ ˖ÂÈ–Â`Ñ–ÂàÄ–Â`Ñ–Â`і ז ä–Âá–ÂàÝ–Âá–ÂàÝ–ÂàÝ–ÂÀÚ–ÂÀÚ–Â ä–Âá– ð–€í– ð–Âàö–€í– ä– ä–Âá–Âàݖ 䖀햠ý–Âú–Âú–Âú– ð– ð–Âú–€í–Âàö–Âàö–  —Â@—Âà—ÂÀ —Âàö–Âú–Â@—€í– ð– ð–Âàݖ ð–ÂÀó– ý–€— ý–€—Â`—Â@—Â@— —Â@—Â@—ÂÀ —Â@— "—Âà(— /—ÂÀ%—ÂÀ%—ÂÀ%—Âà(—ÂÀ%—ÂÀ%—ÂÀ%— "—€—Âà(— "— "—Â`— "—Âà(—Â`5— /— /—Â@2— /—ÂÀ%— /—€8— ;— H—ÂE—ÂÀ>— ;—ÂàA— H— H—ÂÀ>— ;—ÂàA—€8—ÂàA— H— ;—ÂàA—ÂàA— ;— ;— ;—ÂE—Â`N—€Q— H— H—ÂÀW—ÂàZ—Â^—Â^— a— T— a—Â^—Â`g—ÂàZ—ÂÀW—ÂÀW—Â`g—Â`g—Â`g— m— m—€j— a—€Q—€Q—ÂÀW—ÂÀW—ÂàZ— T—€Q—ÂàZ—ÂÀW—ÂÀW— T—ÂÀW— a—ÂÀW—Â@d—Â`g—Âàs—Â`€—Â@}—Âàs—Â@d— a—Â`g— a—Â`g— a—€j— m—Â`g—€j—€j— z— m—Â`g—Â@d—Âàs—Â`€— †—Â`€— z—Â@}— z— z—€ƒ—Â`€— z—Âàs—Âàs— †—Â`€—Âw— m—Âàs—Âàs—ÂÀp— m—Âàs—Âw—Â`€—Âàs— z— †— †—€ƒ— †—Â@}—Âàs—Âàs—Âw—Âàs— z—€ƒ——Â@–—Â`™—Â`™—ÂÀ¢—Â`™— Ÿ—ÂÀ¢— ¬—ÂॗÂ@–—— †—ÂÀ‰— †—ÂÀ‰—ÂàŒ—Â “— “— “—Â`™—— “—Â`™— “— “— “— Ÿ— Ÿ—ÂॗÂ@¯— Ÿ—Â@–—ÂàŒ—Â “— Ÿ— ¬—€µ— ¬—€µ— ¬—Â@¯—ÂÀ»—€µ—ÂÀ»—€µ—Â`²—©— ¬—ÂॗÂ@¯—Â@¯—Âॗ©—ÂÀ¢—€œ— Ÿ—Âॗ ¬— ¬—Â`²—Â@¯—Â@¯— ¬— ¸—©—©—ÂÀ¢— Ÿ— ¬— ¬— Ÿ— Ÿ—©— ¬— ¸— ¬—Â`²— ¬—ÂॗÂ`²— ¸—ÂÀ»— ŗ ї ŗ ŗÂ`Ë—Â@ȗ—ÂÀ»—Âྗ ¸—Â`²—€µ— ¸—Â@¯—Â`²—Â`²— ¬— ¸—€µ—€µ—€µ— ¸— ¸—€µ——Âྗ ŗÂ`˗ їÂ`Ë—Â@È—Â Å—Â Å—Â@ȗ— ¸—ÂྗÂ@È—Â`Ë—Â@È—Â Å—Â`Ë—Â`Ë—Âà×—ÂÀÔ—Â`Ë—Â@È—Â`Ë—Â`˗ ї€ΗÂ`˗ ї їÂÀÔ—ÂÀԗ ї€Η€Η— ŗ€ΗÂÀÔ—Â Þ—Â Þ—ÂÛ—ÂÀÔ—Â`Ë—Â@á— ޗÂÛ—Â@á—€ç—Âô— ÷—Â@ú—ÂÀí—Âô—Â@ú—Âàð— ê—€ç—Âàð— ÷—€˜Âà ˜Â`ý— ˜Â ˜Â ÷—€˜Â`ý— ˜Â ÷—Â`ý— ˜Â ˜Â ˜Â ˜Â ˜Â@˜Â`˜Â@˜Â ˜ÂÀ˜Â ˜Â@ú—Â@ú—Â`ý— ˜Â ˜ÂÀ˜Âà ˜Â€˜Â ˜Â ˜Â ˜Â`˜Â ˜Â`˜Âà ˜Â ˜Â ˜Â ˜Âà ˜Â ˜Â ˜Â ˜Â@˜Â&˜Â&˜Â`/˜Â )˜Â`/˜Âà"˜Â )˜Â&˜Â`/˜Â`/˜Âà"˜Âà"˜Âà"˜Â )˜Â )˜Â€2˜Â 5˜Â`/˜Â )˜Â )˜Â@,˜ÂÀ8˜Â€2˜ÂÀ8˜Â`/˜Â`/˜Â@,˜Â )˜Â@,˜Â€2˜Â€2˜Â@,˜Â )˜Â 5˜Â 5˜Â 5˜Â )˜Â@,˜Â@,˜Â 5˜Â 5˜Â 5˜Âà;˜Â€2˜Â`/˜Â@,˜Â`/˜Â€2˜Â 5˜ÂÀ8˜ÂÀ8˜Âà;˜Â B˜Âà;˜Â 5˜Â@,˜Â&˜Â )˜Â€2˜Â?˜Â@E˜ÂÀ8˜Â 5˜Âà;˜Â 5˜ÂÀ8˜Â?˜Â B˜Â B˜ÂÀ8˜ÂÀ8˜Â`/˜Â 5˜Â€K˜Â`H˜Â B˜Âà;˜Â@E˜Â B˜Âà;˜Â 5˜Â B˜Â@E˜Â N˜Â`H˜Â€K˜Â@E˜Â B˜Â@E˜Â`H˜Â`H˜Â€K˜Â@E˜Â`H˜Â`H˜Â@E˜Â?˜Âà;˜Âà;˜Âà;˜Â?˜Â 5˜ÂÀ8˜Â 5˜Â?˜Â 5˜Âà;˜Â?˜ÂÀ8˜Â B˜Â@E˜ÂàT˜ÂÀQ˜ÂÀQ˜Â`H˜Âà;˜Â@E˜Â€K˜Â N˜Â`H˜ÂÀQ˜Â€K˜Â€K˜Â N˜Â N˜Â`H˜ÂÀQ˜Â [˜Â [˜ÂX˜Â€d˜Â€d˜Â€d˜Â€d˜Â [˜ÂàT˜Â€K˜Â`H˜Â N˜Â N˜Â€K˜Â`H˜Â€K˜ÂàT˜ÂàT˜Â`H˜Â€K˜ÂX˜ÂàT˜Â N˜Â N˜Â N˜ÂX˜ÂàT˜Â [˜ÂÀQ˜Â€K˜ÂÀQ˜ÂX˜ÂX˜ÂX˜ÂX˜ÂÀQ˜ÂàT˜ÂÀQ˜Â€K˜Âà;˜Â B˜Â`H˜Â€K˜Â N˜Â€K˜Â N˜ÂàT˜ÂX˜Â`H˜Â`H˜Â€K˜Â N˜ÂàT˜ÂÀQ˜Â€K˜Â@E˜Â B˜Â@E˜Â?˜Â?˜Âà;˜Â`/˜Â 5˜Âà;˜ÂÀ8˜Â€2˜Â@,˜Â&˜Â )˜ÂÀ8˜Â?˜Âà;˜Â€2˜Â`/˜Â@,˜Â`/˜Â 5˜Â 5˜Âà;˜Â 5˜ÂÀ8˜Â 5˜Â`/˜Â 5˜Â`/˜Â )˜Â&˜Âà"˜Â@,˜Â&˜Â€2˜Â )˜Âà"˜Âà"˜Â )˜Â&˜Â`˜Â@˜Â ˜Â`˜Â`˜Â ˜ÂÀ˜Âà ˜Â`˜Â ˜Â ˜Â`ý—Âà ˜Âà ˜Â@˜Â ˜Â ˜Â ˜Âà ˜Âà ˜Â`ý—Â`ý—Â@ú— ˜Â`ý—Â@ú—Â@ú—Â`ý—Â`ý—ÂÀ˜Âà ˜Â ˜Â ˜Â ˜Â€˜Â ˜Âà ˜Âà ˜Âà ˜ÂÀ˜Â ˜Â ˜Â ˜Â&˜Â ˜Â&˜Â )˜Â&˜Â&˜Â€˜Â ˜Â )˜Â€˜Âà ˜Â ˜Âà ˜Âà ˜Â ˜Â@˜Â ˜Â ˜Â ˜Âà ˜Â@˜Â@˜Â ˜Â`˜Â ˜Â ˜ÂÀ˜ÂÀ˜Âà ˜Â ˜Âà ˜Âà ˜Â@ú—Âàð—Â`ý— ˜Â ˜Âà ˜Â ˜Âà ˜Â ˜Â`ý— ˜Â ˜Â ˜Â ˜Âà ˜Â@˜Â ˜Â`˜Âà ˜Â ˜Â`˜Â@˜Â€˜Âà ˜Â ˜Âà ˜Â ˜Â ˜Â ˜Âà ˜Âà ˜Â@˜Â`˜Â@˜Â ˜Â`ý—€˜Â ˜Âà ˜Â ˜Â ˜Â ˜Â ˜Â@˜Â€˜ÂÀ˜Â&˜Â@˜Âà ˜Â ˜ÂÀ˜Â€˜ÂÀ˜Â ˜Â ˜Â`˜Â€˜Â ˜Â ˜ÂÀ˜Â ˜Âà ˜Âà ˜ÂÀ˜Â€˜Âà ˜Â ˜Âà ˜Âà ˜Â ˜Â`˜Â ˜Â ˜ÂÀ˜Âà ˜Âà ˜Â ˜Â ˜ÂÀ˜Â`ý— ˜Â@˜Â ˜Â€˜Â@˜Â€˜Â€˜Â@˜Â ˜Â ˜Â ˜Âà ˜Âà ˜Â ˜Â€˜Âà ˜Â ˜Â ˜Â ˜Â€˜Â ÷— ˜ÂÀ˜Â ˜Â€˜Â ÷—Â@ú—ÂÀ˜ÂÀ˜Â€˜Â`ý—Âô—ÂÀí—Âàð—Âô—Âàð— ê—€ç—Âàח—Âྗ— ŗÂ`˗ ї ޗ ޗÂàח їÂ`Ë—Â`˗—Â@È—Â`˗ їÂ@ȗ ŗ€µ———Â@ȗ ї ŗÂྗ ¬—Â`²— ¬— ¬— ¸—€µ—€µ— ¸— ¸—Â`²— ¸—Â`²—€µ— ¸— ¸— ¸— ¸— ¸— ŗ ¸—ÂÀ»—Âྗ ŗÂྗ ¸—Âྗ—ÂÀ»— ¸—€µ—€µ—Â`²—Â`²—ÂÀ»— ¸—Â@ȗ ї€Η———Â@È—Â Å—Â@ȗ ї€ΗÂ`Ë—Â@È—Â@ȗ€Η€ΗÂ`˗— ¸— ŗÂ—Â@È—Â Å—Â Å—Âྗ ŗÂÀ»——Âྗ— ¸—ÂྗÂÀ»——Âྗ ¸—€µ— ¸—ÂÀ»——— ŗ€µ—Âྗ ŗÂྗÂྗÂ`Ë—Â@ȗ— ¸—Âྗ—€Η їÂ`Ë—Â`Ë—Âྗ ¸— ¸— ¸—Â`²—Â`²—ÂॗÂ`²—Â`²—ÂÀ»—©—Â`²—Â`²—Â@¯— ¬— ¬—ÂÀ»—€ΗÂ`˗— ¸—©—©—€œ— Ÿ— Ÿ— ¬—Â`²— ¸— ¸— ¸— ¸—€µ— ¬—€µ—— ¸— ŗ ¸—Âྗ€µ—Â@¯— ¸—ÂÀ»— ¬—Â@¯—ÂॗÂॗ Ÿ—Â`™—Â@–—Â`™—Âॗ Ÿ—ÂÀ¢—ÂॗÂ`²—€µ—€µ—€µ— ¸—Â@¯— ¬—Âॗ©—Â@¯—Â@¯— ¸—Âྗ ŗ ¸—€µ— ¸—Âྗ ¸—Â@¯—Â@¯—Â@¯—Âॗ©—Â@¯— ¬— ¬— ¬—©—Â`²—Â@¯—Â@¯—Â`²—ÂÀ»—ÂÀ»—€µ—Â`²—€µ— ¸—Â@¯—ÂÀ¢—€œ—Â@–— “—ÂÀ¢— Ÿ— Ÿ—Â`²—Â`²—Âॗ€œ—€œ— Ÿ—Â`™— Ÿ—ÂÀ¢— Ÿ—Âॗ Ÿ—©—Â@¯——Âྗ ¸— ¬—Âॗ€œ—ÂÀ¢— Ÿ—ÂÀ¢—©—©—ÂÀ¢— ¬—€œ— Ÿ— ¬—Â@¯—ÂॗÂॗÂÀ¢—©—ÂÀ¢— “——€œ— Ÿ— Ÿ—ÂÀ¢—Âॗ ¬—Â`²—Â@¯— ¸—€µ— Ÿ—ÂॗÂÀ¢—€œ—Â`™—ÂÀ¢—©— ¬—Â`²—€µ— ¬—©—©— ¬—Â`™—Â@–——ÂàŒ—Â`™—Â@–—Âॗ ¬—ÂॗÂॗÂÀ¢—ÂॗÂ@¯—Â@¯—€µ—Â@¯—©—©—€µ—ÂÀ»—ÂྗÂྗÂ@¯— ¸— ¸— ¸—ÂÀ»— ŗÂ`²—€µ—€µ—€µ— ¸—ÂÀ»—€µ———€µ— ¬— ¬—€µ— ¸— ¸— ŗÂ@È—Â@ȗ€Η ї їÂà×—Âۗ їÂ`˗€ΗÂÛ—ÂÛ—Â Þ—Â@È—ÂྗÂ`Ë—Âàח€ç— ê—€ç—Âàð— ê—Âà×—ÂÀԗ їÂà×—Â Þ—Âۗ€ΗÂ`Ë—Â@ȗ ŗ їÂÀԗ€Η ŗÂÀÔ—Â Þ—ÂÀԗ€Η ŗÂྗ ŗÂÀ»—ÂÀ»—€µ—€µ—ÂॗÂÀ¢—ÂÀ¢—€œ—€ƒ— z—Â`g— a— T— H—ÂE— ;— /— "—Â`——ÂÀ —Â@—Â@— ý– ý–€í–Â`ê–ÂÀږ€ԖÂàÝ–ÂàÝ–ÂàÝ–Â@ΖÂ@ΖÂ`Ñ–Â`Ñ–ÂȖ ¾– ¥– ¥–Â`Ÿ– ™–Âà’–ÂÀ–Â`Ÿ– ™– ™–Âà’–Â€‰–Â@ƒ– Œ–Âà’–Â Œ– Œ–Â@ƒ–Â}–Â}–Âày–Â`m–Â`m–Â@j– g–Âd–€W–€W– Z– Z–ÂÀ]– Z–Â@Q–Â@Q–Â@Q–Â`T–Âà`–Â@Q–Â`T–ÂàG–ÂàG– A–ÂàG–ÂK– A– A–Â@8–Âà.–Â2– 5– A–ÂàG–€>–€>–Â`;–Â`;–Â`;–Â`;–Âà.–€%–Â@– (– 5–Âà.– (–€%––ÂÀ–Â`"–Â@–Âà–ÂÀ–Âà– – –ÂÀ–Âàü•€ó•Â@í•€ó• ê• ö• ö• ö• – ö•Âàü•ÂÀù• ö• ö• ê•€ó•Â`ð•Â`ð•Â`ð•Â@í•ÂÀà•Âàã•Â`ð• ê• ö•Â@í•Â@í•Âç•Âàã•Â`ð•Â`ð• ê•Â`ð•Âç•Âç• ݕÂÀà•€ڕÂΕÂΕÂ`וÂ@Ô•Â`ו ѕ ĕ ĕÂ`¾• ĕÂ@Ô•ÂàÊ•Â`¾•€Á• ĕ€Á• ĕ ĕÂ`¾•Â@»•Â`¾• ¸•€Á•€Á•Â`¾• ĕ ¸•€Á• ¸•Â`¥•œ•Â@¢• Ÿ•Â`¥• Ÿ•ÂÀ®• ¸•Âౕµ•µ•Âౕ ¸• «• «•ÂౕÂÀ®• «• «• ¸•Âౕ Ÿ• Ÿ•€¨•€¨•€¨• «•Â@¢• «•Â@»•Â`¥•Â@¢•€¨• Ÿ• Ÿ•œ•€¨• «•Âౕ «•µ• «•€¨• «• «•œ•Â`¥•Â`¥•Â`Œ•€• ’• ’• ’• ’•€•Âà˜•Â Ÿ• Ÿ•Â@¢•Âà˜•Â€¨• «•ÂÀ®• «•€¨•Â`¥•Â`¥•Â@¢• ’• ’•œ•Âà˜•Âœ•Âà˜•Â@‰•Âà•Âà• †• †• †•€• †•ƒ•Âà•Âà•Âà• ’•œ•Â@¢•Â@¢•€¨•Âà˜•ÂÀ•• ’•ÂÀ••Âà˜•Âà˜•Â@¢•Â@¢• ’•ÂÀ••œ•Âà˜•Âà˜•Â€•Â@‰• y• y•Âà•ƒ•Â`Œ• †• †•Â`Œ•Â@‰•Â`Œ•€•€•€• ’•Âà˜•Âœ•œ•Â@¢•Â`¥• Ÿ•Â@¢•Âà˜•Âà˜•Â@¢•Â`¥• Ÿ•Âà˜•Âà˜•Âœ•œ•ÂÀ••€•ÂÀ••Âà˜•Â€¨• «• «• «•Â`¥•€¨• Ÿ•œ•Âà˜•ÂÀ•• ’• ’• ’•Â`Œ• ’•œ•Â@¢•Â@¢•ÂÀ••ÂÀ••ÂÀ••Âà˜•Â`Œ• ’•Âà˜•Âà˜•Âà˜•Â Ÿ•Â@¢•Â@¢•Â`¥•Â`¥• Ÿ•ÂÀ®•µ• «•Â`¥•Â@¢•€¨• ¸• ¸•ÂౕÂౕ ¸• ¸•Âౕ «•€¨• ¸•Â@»• ¸•Âౕ ¸•µ•Â`¾• ¸•Â@»•Â`¾•€Á•€Á• ĕµ•µ• ¸• ĕ€Á•Â`¾• ĕÂàÊ•Â`¾•ÂౕÂÀ®•ÂÀ®• «• ¸•ÂౕÂ@»•Â`¾•Â@»•ÂÀǕ€Á• ĕÂ@Ô•Â Ñ•ÂΕ ĕÂÀÇ•Âàʕ ĕÂ@»•ÂÀÇ•ÂàÊ•ÂÀǕ ĕ ѕÂ@ԕ ĕ ¸•€Á•ÂÀÇ•ÂΕÂàÊ•ÂàÊ•Â`¾•€Á• ĕ€Á• ĕÂÀǕ€Á•€Á•€Á•Â`¾•€Á•Â`¾•Â`¾• ĕÂΕÂ@Ô•ÂΕ ѕÂàʕ ĕ ѕÂ@ԕ ѕ ѕÂàʕ ĕÂàʕ ĕ ĕ ѕÂ`וÂΕÂ`וÂ@ԕ€ڕÂ@Ô•Â Ñ•Â`ו ݕÂ`ו€ڕ€ڕÂ`ו ݕ ݕ ݕÂÀà•Âàã•Âç•Âàã•Âàã•Âàã•Â@Ô•ÂàÊ•ÂΕ€ڕ€ڕ ѕ ݕÂ`וÂàÊ•Âàʕ ѕÂ`וÂ`ו ݕ ݕÂ@Ô•ÂàÊ•Â@Ô•Â Ñ•Âàʕ ѕÂàÊ•ÂΕÂÀǕ ѕ ݕÂΕ ѕ€ڕ ݕÂàã•ÂÀà•Âàã• ݕ ݕÂàã•Âàã•Âç• ê•ÂÀù•€ó•Â@í•Â`ð•ÂÀà• ݕ ݕ ݕÂÀà•€ڕ ݕÂÀà•ÂÀà•Â`וÂ`ו€ڕ ݕÂç•Âç•€ڕÂ`ו€ڕÂÀà•Âàã•Âàã•€ó• ê•ÂÀà• ݕ€ڕ ݕÂÀà•Â@í•Â@í• ê•€ó•Âàü• ö•ÂÀù•€ó•Âç• ݕ ê• ê•Âç•Â@í• ê•Âàã•Âàã• ê•ÂÀà• ݕÂàã•€ڕ ݕ ݕÂ@í•Âç•Âç•Âç•€ó•Â`ð•Â`ð•Â@í•ÂÀà• ݕÂàã•Âàã•Âàã• ê• ݕÂç•Âàã•Âàã•Â@í• ö• ö•Â@í• ê•Âàã• ê•Â`ð•Â@í• ö•€ó•Â@í• ê•Â`ð•Âàü•ÂÀù•Â`ð•€ó• –– – –€ – –Â` – –– –Âàü•Â` –ÂÀ–Â` –Â` –€ –Â` – –Âàü•Âàü•Âàü•ÂÀ–– –Âà–€ –Â` –€ –Âà–€%–€%– –Âà–ÂÀ–€ –€ –– – – –ÂÀ–Âà– –Âà– – –Â` – –€ –€ – –Â@–€%– (– –– – –Â`"–Â`"– (–Âà– ––Âà–ÂÀ–€ – – –Âà– –Âà–Âà–Âà–Âà––ÂÀ–Âà– –ÂÀ+– 5–Â@8– 5– (– (–€%– – –€ –Âà– –Â@–Â@– –Â`"– (–Â`"––Âà– ––Â@–Â`"–Â`"–Âà.–Âà.–ÂÀ+–€%–€%–Â`"–Â`"–€%– (– (–Âà.– (– (– 5– 5–Âà.–ÂÀ+–Â2– 5–Â2–Â@8– 5–Âà.–Â2–ÂÀ+–Â2–Â2– 5–Â`;– A–Âà.– (–Â@8–ÂÀD–ÂàG–ÂÀD–ÂàG–€>–Â@8–€>–ÂàG–ÂK–Âà`–Âd–Âd–Âd–Â@j–Â@j– g–Â`m– Z– Z– Z– Z–Â`T– N– N–ÂàG–Â@Q–ÂàG–Â`T– N–Â`T–Â`T– N–€W– Z– Z–ÂÀ]–Â`T– Z–€W–ÂÀ]– g–Âà`–Âà`–€W– Z–€W–ÂÀ]–ÂÀ]–Â`T–€W–Â`T–Â@Q– Z–Âà`–€W–Âà`–Âd– g– s–ÂÀv–€p– g–ÂÀ]–ÂÀ]– g– g–Â@j–Â@j–€p– s–Âày–Â}–€p– s–€p–€p–Â@j–Âd–Â`m– s– g–Â@j– g– s–Âd–Âd–Âd– g– s–Âày–Â}–Â}–€‰–Âà’–Â Œ–€‰–Â`†– €– s–Âày–€‰– Œ–Â`†– Œ–ÂÀ–€‰– €– €–Â`†–€‰–€‰–Â`†–€p–ÂÀv– €– €–Â}–Âày–€p–ÂÀv–Â@ƒ––– Œ–Âà’–Â––––ÂÀ–€¢–––Â@œ– ™––– Œ–€‰–ÂÀ– Œ–€‰– €– Œ–€‰–Âà’–ÂÀ–ÂÀ–€‰–Â`†–Âà’–Â Œ–ÂÀ–Âà’–Â–– Œ– Œ–€‰–€‰–€‰–Âà’–Â––Â`Ÿ–ÂÀ–ÂÀ–Âà’–Â–– ™– ¥– ¥– ²– ²–ÂÀ¨–Â`Ÿ–€¢–Â૖¯–Â૖ ¥–Â`Ÿ– ¥– ¥–€¢–Â`Ÿ–€¢–€¢–Âà«–Â`Ÿ–Âà«–ÂÀ¨–€¢– ¥– ¥–ÂÀ¨– ¥–ÂÀ¨–Â`Ÿ–ÂÀ¨– ²–¯– ¥– ™–€¢– ¥– ¥–ÂÀ¨– ¥–¯–Â@µ–Â`¸–Â@µ– ¾–ÂàĖ ¾–Â`¸– ¾–€»–€»–ÂàĖ ¾–Â`¸– ²–ÂÀ¨–Â૖¯–Âà«–Â૖€¢–ÂÀ¨–ÂÀ¨– ¥–Âà«–Â@µ–¯–¯– ¾–ÂÀÁ– ˖ÂàĖ ¾–ÂÀÁ– ²–¯– ²–Â`¸–ÂàÄ–ÂàÄ–ÂÈ–ÂÀÁ– ¾–ÂàÄ–ÂàĖ€»– ¾–ÂÀÁ– ¾–¯–€»–ÂàÄ–Â Ë–Â@ΖÂ`Ñ–Â@Ζ ¾–ÂÀÁ– ¾– ¾–Â@ΖÂ`Ñ–Â Ë–ÂàÄ–Â`Ñ–Â`Ñ–Â@ΖÂ`Ñ–ÂàÄ–Â Ë–Â Ë–ÂÀږ ˖ ˖€Ԗ זÂàÝ–ÂàÝ–Â ä–Âá– זÂ`і€ԖÂàݖ זÂàݖ€Ԗ€Ԗ זÂá– זÂàÝ–Âá– ä–ÂàÝ–Â ä– ð–€í–Â@ç–Âá–Âàݖ ð–Â@—Â`—Â`—Âú– ý–Â`—Â@— ý–Âàö–Âàö–Âú– ý–Â`—Âú–Âàö–Âú– ý–ÂÀó–Âú–Âàö–Â@—Â`— ý–€í– ð–Â@—Â`—ÂÀ —€—Â`— ý–Âú– ý– ý– ý–Âà—€—  —ÂÀ — — — — —Â@—ÂÀ —€—ÂÀ —  —Â@—Âàö–ÂÀó–Âàö–Âú–€—Â`—  — —Â`—Â`—€— — —ÂÀ —Â`—ÂÀ —ÂÀ —Âà—Â@—ÂÀ%— "—€—Â`—ÂÀ%—€—Â`—Â`—Âà— —Â`—ÂÀ%— /—Â`5— /—Â`5—Â,— /—Âà(—Â,—ÂÀ%— "—ÂÀ%—Âà(—Âà(—ÂÀ%—Â,—Â@2—Â@2—Â`5—Â,—Â,—Âà(—Â,— /— /— ;—€8—€8—€8—Â@2—Â,—Âà(—Âà(—Â@2— /—Â,—Â@2— /—€8—Â@2— /—Â`5—Â`5—ÂE—ÂÀ>—ÂàA— ;— ;—€8—€8—Â`5— /—Â@2—ÂàA— H—Â@K— H— H— H—€Q—€Q—Â`N— H—ÂàA—ÂE—€8— ;—ÂàA— H—Â`N—Â`N— H—Â`N— H—Â`N—Â@K—€Q—€Q— T— H— T—ÂÀW—Â^—Â@d— a—Â@d—€j— a—ÂÀp—Â@d— a— a— a—Â^— a—€j—Â^— a— a— a— a—€j—€j—ÂÀp—Â@d—Â`g—ÂÀp—Âàs—Âàs— m—Âàs— z— z—€j—Â@d—€j— m—Âw—Â`€—Âàs— m—€j— m—ÂÀp—Âw—Â@}—€ƒ—ÂÀ‰—Â`€—Â`€—Âàs—ÂÀp— z—Âàs— z—ÂÀ‰—ÂàŒ—Â †— †— †—€ƒ—Â`€—€ƒ—€ƒ—Â`€—Â`€—€ƒ—ÂÀ‰—€ƒ——Â@–—ÂÀ‰—€ƒ—€ƒ—Â`€— †—ÂàŒ—Â@–—€œ—Â`™—ÂÀ¢—Â`™—Â`™—€œ— Ÿ—ÂÀ¢— “— “—— “— “— “—€œ— ¬—ÂྗÂÀ»—Â@¯— Ÿ—€œ— Ÿ— Ÿ—ÂÀ¢—©— ¬—Âॗ©— ¸— ¬—Â`²—Âॗ ¬— Ÿ— ¬—Â@¯—Â`²— ¸—€µ—Â`²— ¬—Â`²—Â`²— ¸—ÂÀ»— ¸—Â`²—€µ—Â@¯— ¬— ¸— ¸— ¬—€µ—ÂÀ¢—Âॗ ¬—©—ÂÀ¢—Âॗ ¬— ¸—Âྗ ¸—Â`²—€µ—Â`²—Âॗ©—Âॗ©— ¬—€µ— ¬—Â`²— ¬—Â@¯—Â`²— ¸— ¸— ŗ ¸— ¬— Ÿ—ÂॗÂ`²— ¸—Âྗ ŗÂ— ¸—€µ—€µ— ¸— ŗ ŗÂ`²— ¬—€µ—Â@¯—Â@¯—€œ— Ÿ—ÂÀ¢—ÂॗÂॗÂÀ¢—©—©—Âॗ©—ÂॗÂÀ¢— ¬— ¬—Â@¯—Â`²— ¬— ¸— ¸—Â`²— ¸— ¸—ÂÀ»—ÂྗÂ@È—Âྗ€µ—€µ—©—ÂÀ¢—©—€µ—€µ— ¬— ¸——€µ—Â`²—€µ— ¸—€µ— ¸—Â`²—€µ— ¬—Â`™—Â@–—ÂॗÂÀ¢—©—€µ—Â`²—— ŗ ŗÂྗ— ¸—Â@¯—Â@¯—ÂÀ¢— Ÿ—Â@¯—Â@¯— ¬—€µ—Â@¯—Â@¯—ÂÀ»— ŗ€µ— ¸—Â`²— ¬— ¬—Â@¯—Â`²——€µ—Â`²—€µ—Â`²—ÂྗÂÀ»—€µ——Â@È—Â Å—Â@ȗ ї€ΗÂ`Ë—Â`Ë—Â`˗ ŗ—ÂྗÂྗÂ`²— ŗÂྗ€ΗÂྗ ŗÂྗ€Η€Η€Η ŗ ¸—Â@È—Â@È—ÂÀ»—— ¸— ¸—ÂÀ»— ŗÂ—Â@È—ÂྗÂྗ ŗÂྗ— ŗ ŗ ŗ ŗÂ`²—Â@¯— ¸——Â@È—Â Å—Â`Ë—ÂÀÔ—Â`˗ їÂÀÔ—Âà×—Âàח€Η ޗÂÛ—Âà×—ÂÀÔ—Âàח ї їÂ`˗€Η їÂ`Ë—Â`˗€ΗÂÀԗ ŗ€Η їÂÀÔ—Âà×—Â@á— ޗ ї€ΗÂÀÔ—Âà×—Â`ä— ê—Â@á—ÂÀÔ—Â`Ë—Â`˗ ї ޗÂà×—Â`ä—Â`䗀痠їÂÛ—Â`ä—Â@á— ޗ ޗ€ç—Â@á— їÂà×—Â Þ—Âà×—Â Þ—Âàð— ê—€ç— ޗÂ@á—Âà×—Â Þ—Âàð—€ç—Â`ä—Â`ä—Â@á—Â`ä—ÂÛ—Â`ä—Â`ä—Â`ä—Âô— ê—ÂÀí— ê— ê—Â`ä— ê—Âàð— ê—Âàð—Âàð—Â`ý—Âô—Âàð—Âàð— ÷—€˜Â ÷— ˜Â ˜Â ˜Â€˜Â ˜Â@ú—Â`ý—Âô—Â@ú—Â@ú—Âô— ê—Âàð— ê—ÂÀí—Âàð—Âàð— ÷—Âô—Â`ý— ˜Â@ú—Â@ú—€˜Â ˜Âà ˜Â@˜Â ˜Â ˜Â ˜Â`˜Â@˜Â ˜Â€˜Â@˜Âà ˜ÂÀ˜Âà ˜Â ˜Â ˜Â ˜Â ˜Â ˜ÂÀ˜Âà ˜Â ˜Â ˜ÂÀ˜Â`ý—Â`ý—Âà ˜Â ˜Â ˜Âà ˜ÂÀ˜ÂÀ˜Â`ý— ˜Â ˜Âà ˜Â ˜Â€˜ÂÀ˜ÂÀ˜Â ˜Âà ˜Â@˜Â@˜Â ˜Â ˜Â`˜Â ˜ÂÀ˜ÂÀ˜Â ˜Â )˜Â )˜Â )˜Â`/˜ÂÀ˜Â )˜Â€2˜Â@,˜Â&˜Â )˜Â )˜Â )˜Â@,˜Â€2˜Â€2˜Â@,˜Â`/˜Â )˜Âà"˜Âà"˜Â ˜Â )˜Â@,˜Âà;˜Â B˜Â B˜ÂÀ8˜Â&˜Âà"˜Â&˜Â 5˜Â`/˜Â )˜Â€2˜Âà;˜Âà;˜Â 5˜Â 5˜Â@,˜Â )˜Â@,˜Â ˜Â€˜Âà"˜Â@,˜Â@,˜Â@,˜Â&˜Â&˜Âà"˜Â )˜Âà"˜Â ˜Â€˜Â ˜Â ˜Â ˜Â ˜Â ˜Â€˜Â€˜Âà ˜Â ˜Â`˜Â ˜Â@˜Â ˜Â@˜Â@˜Â ˜Â ˜Â ˜Â ˜Â@˜Â€˜Â€˜Â ˜Â ˜Â`ý— ˜Â ˜Â ˜Â`˜ÂÀ˜Â ˜Â&˜ÂÀ˜Â€˜Â&˜Â ˜Â ˜Âà ˜Â ˜Â ˜Â€˜Â`ý— ˜Â ˜Â ˜Â ˜Â@˜Âà ˜Â`˜Â ˜ÂÀ˜Â@˜Â`˜Â`˜Â ˜Âà"˜Â`˜Â ˜Â ˜Â ˜Â ˜Â ˜Â ÷—€˜Âà ˜Â@˜Âà ˜Â ˜Âà ˜Â ˜Â`˜Âà ˜Â`ý—€˜Â@ú—Âàð—Âô—Â`ý— ˜Â ÷— ÷—Â@ú—Â`ý—Â@ú—€˜Â@ú—Âàð— ÷—Âô—Â@ú—Â`ý—Â@ú—ÂÀí—€˜Â ˜Â ÷—ÂÀ˜Â`ý— ˜Â ˜Â`ý—Â`ý—€˜ÂÀ˜Â@˜Âà ˜Â ˜Âà ˜Â@˜Â@˜Â ˜Â ˜Âà ˜Âà ˜Â ˜Â ˜Â€˜Â ˜Â ˜Â€˜Â€˜Â`˜Â`˜Â`˜Â ˜Â€˜Â ˜Â ˜Â`˜ÂÀ˜Â ˜Â ˜Âà"˜Â@,˜Âà"˜Â@˜Â ˜Â€˜Â`˜Â ˜Â`˜Âà"˜Â ˜Â ˜Â€˜Â ˜Â€˜Â ˜Â ˜Â ˜Â ˜ÂÀ˜Â ˜Â ˜Â€˜Âà ˜Â@˜Â ˜Â€˜Â@˜Âà"˜Â`˜Â`˜Â ˜Â ˜Â ˜Â ˜Â ˜Â ˜Âà ˜ÂÀ˜Â ˜ÂÀ˜Â`˜ÂÀ˜Â ˜Â ˜ÂÀ˜Â ˜Â@˜Â@˜Â`˜ÂÀ˜Â ˜Â&˜Â€˜Â ˜Â ˜Â )˜Âà"˜Â`˜Â ˜Â€˜Â ˜Â ˜Â€˜ÂÀ˜Â@˜Â@˜Â ˜Â ˜Â ˜Â`˜Â`˜Â ˜Â`˜Â&˜Â@,˜Â&˜Â ˜Â ˜Âà"˜Â ˜Â€2˜ÂÀ8˜ÂÀ8˜Â`/˜Â@,˜Â€2˜Â@,˜Â )˜Âà"˜Â&˜Â`/˜Â`/˜ÂÀ˜Âà"˜Â ˜Â ˜ÂÀ˜Âà"˜Âà"˜Â )˜Â )˜Â`/˜Â€2˜Â 5˜Â@E˜Âà;˜ÂÀ8˜Â?˜Â B˜ÂÀ8˜Â B˜Â`H˜Â`H˜Â@E˜Â B˜Âà;˜Â€2˜Â )˜Â`/˜ÂÀ8˜Â B˜Â@E˜Â B˜Â`/˜Â B˜Â`H˜Â N˜Â N˜Â [˜Â N˜Â`H˜Â N˜Â [˜Â@^˜ÂàT˜ÂàT˜Â N˜Â`H˜ÂàT˜Â@^˜Â [˜Â [˜Â [˜Â [˜Â [˜Â [˜Â`a˜Â@^˜Â@^˜ÂàT˜ÂàT˜ÂÀQ˜ÂàT˜ÂàT˜Â [˜ÂX˜ÂàT˜Â€K˜Â`H˜ÂÀQ˜Â N˜Â [˜Âàm˜Â€d˜Â g˜Âàm˜Âàm˜Â g˜Â€d˜Â@^˜Â [˜ÂÀQ˜Â [˜Â N˜Â N˜Â N˜Â N˜ÂÀQ˜Â [˜ÂÀQ˜Â`a˜Â€d˜ÂÀj˜ÂÀj˜Âàm˜Â@w˜Âq˜Â t˜Â t˜Â t˜Â€}˜Â €˜ÂÀƒ˜Â t˜Â t˜ÂÀj˜Â€}˜Â`z˜Âà†˜Âà†˜ÂÀƒ˜Âà†˜ÂŠ˜Â €˜Â`z˜Â€}˜Â €˜Â €˜ÂÀƒ˜Â €˜Â ˜Â@˜ÂŠ˜ÂŠ˜Â`z˜Â`z˜Âq˜Âq˜Â@w˜Â@w˜Â t˜Â€}˜Â €˜Â€}˜Âà†˜Â €˜Â €˜Â ˜Â ˜Âà†˜Â`“˜ÂÀœ˜ÂàŸ˜Â`“˜Â@˜Â€–˜Â ™˜ÂÀƒ˜ÂÀƒ˜Â €˜Â€}˜ÂŠ˜Â €˜ÂÀƒ˜ÂŠ˜Â`“˜Â`“˜Â`“˜Â€–˜ÂÀœ˜Â`“˜Â ™˜Â ™˜Â ™˜Â ™˜ÂàŸ˜Â ™˜ÂÀœ˜Â`“˜Â`“˜Â ˜Â`“˜Âà†˜Âà†˜ÂŠ˜ÂŠ˜Â €˜Â€}˜Â €˜Â ˜Â€–˜Â@˜Â ˜Âà†˜ÂŠ˜Â`“˜Â ™˜Â€–˜Â ˜Âà†˜Â ˜Â@˜ÂŠ˜Âà†˜Â ˜Â`“˜Â@˜Â@˜Â ™˜Â ™˜Â ™˜Â€–˜Â€–˜Â ™˜ÂÀœ˜Â@˜Â ˜Â@˜Â€–˜ÂŠ˜Â@˜Â@˜Â ˜Â ˜Â ˜Â`“˜Â`“˜Â ˜Â`“˜Â`“˜Â ˜Âà†˜Â €˜Â €˜ÂÀƒ˜Âà†˜Â €˜Â€}˜Â€}˜Âà†˜Â@˜Â`“˜Â ˜Â ˜Â ˜ÂŠ˜Â ˜Â ˜Â€–˜ÂàŸ˜Â€–˜Â`“˜Â€–˜Â€–˜ÂÀœ˜Â€–˜Â ™˜ÂÀœ˜Â`“˜Â ˜Â`“˜Â ˜ÂŠ˜Â`“˜Â@˜Â@˜Âà†˜Â €˜Â`z˜Â€}˜Â €˜Âà†˜ÂÀƒ˜Âà†˜ÂŠ˜Âà†˜Â€}˜Â`z˜Â`z˜Âà†˜Â`“˜ÂŠ˜Âà†˜Â`“˜ÂŠ˜Â@˜Â ˜Â@˜Â ™˜Â ˜ÂŠ˜Â€–˜Â ™˜Â€–˜Â`“˜Â ˜Âà†˜ÂŠ˜Âà†˜ÂŠ˜ÂŠ˜ÂŠ˜Âà†˜ÂŠ˜Â@˜Â ˜Â`z˜Â €˜ÂÀƒ˜ÂŠ˜Â ˜Âà†˜ÂÀƒ˜Â €˜Â€}˜Â`z˜Â@w˜Âq˜Â@w˜Â t˜Â@w˜Â`z˜Â t˜Â €˜Âà†˜Âà†˜Âà†˜ÂÀƒ˜Â€}˜Â €˜Â`z˜Â€}˜Â €˜Â@w˜Â€}˜Â€}˜Â€}˜Âà†˜Â €˜Â €˜ÂÀƒ˜Â €˜Â €˜Â €˜Âà†˜Â@˜ÂŠ˜Â €˜Â`z˜Â€}˜Â €˜Â ˜Âà†˜Â €˜Â`z˜Â@w˜ÂÀj˜Â`a˜Â`a˜Â g˜Â€d˜Âq˜Â€}˜Â t˜Âà†˜ÂŠ˜Âà†˜Â ˜Âà†˜ÂŠ˜Â €˜ÂŠ˜ÂŠ˜Â`z˜Â`z˜Â€}˜ÂÀƒ˜Â€–˜Â ˜Âà†˜Â €˜Â`z˜Â`z˜ÂŠ˜Âà†˜Â@˜Â €˜Âà†˜Âà†˜ÂŠ˜ÂŠ˜Â €˜Â@w˜Â`z˜Â t˜Â t˜Â@w˜Â@w˜Â@w˜Â t˜Âàm˜Âq˜Â€}˜Âàm˜Âq˜Â€}˜ÂÀƒ˜Âà†˜Â €˜ÂŠ˜Âà†˜ÂŠ˜Â€–˜Âà†˜Âà†˜Â`z˜Â t˜Â`z˜Âq˜Â €˜ÂŠ˜Â €˜Â`z˜Â €˜Â €˜Â €˜Â €˜Â`“˜Â €˜Â €˜Â@w˜Â`z˜Âq˜Â@w˜Â €˜Â@w˜Â@w˜Â €˜Â €˜Â€}˜Â €˜Â t˜Âq˜Âàm˜Âq˜Â t˜Âà†˜Â ˜Â@˜Â€}˜Â €˜Â €˜Â`z˜Â t˜Â €˜Â€}˜ÂŠ˜Âà†˜Â €˜ÂŠ˜Â€}˜Â@w˜Â€}˜ÂÀƒ˜ÂŠ˜Â ˜Âà†˜Â €˜Â`z˜ÂŠ˜Â ˜ÂŠ˜ÂŠ˜ÂŠ˜Â €˜ÂÀƒ˜Âà†˜ÂŠ˜Â €˜ÂŠ˜Â ˜Âà†˜ÂÀƒ˜Â`z˜Â`z˜Â€}˜Â €˜Â€}˜Â`z˜Â €˜Â`z˜Â@˜Â ˜Âà†˜ÂŠ˜ÂŠ˜Âà†˜Â ˜Â ˜ÂŠ˜Â€–˜Â€–˜Â`“˜Â ˜Âà†˜Â €˜Â@w˜Â`z˜Â`z˜Â@w˜Â t˜Â t˜Â@w˜Â t˜Â€}˜Âà†˜Âà†˜Â €˜Â €˜ÂŠ˜Â`z˜Â`z˜Â@w˜Â g˜Â`a˜Â g˜Âq˜Âàm˜Â t˜Â t˜Â`z˜Âà†˜Â ˜Â ˜Â ˜Â`“˜Â ˜Âà†˜Â`z˜Â t˜Â t˜Â@w˜Â €˜Â€}˜Â €˜Â`z˜Â`z˜Â`z˜Â t˜Â@w˜Â@w˜Âà†˜Â€}˜Â t˜Âàm˜Â€d˜Â t˜Â@w˜Â t˜Â@w˜Â t˜Âàm˜Â@w˜Â@w˜Âàm˜Â€}˜Â t˜Â`z˜Â€}˜Â €˜Âà†˜Âà†˜Â €˜Âà†˜Â €˜Â€}˜Â€}˜Â €˜Â t˜Â@w˜Â t˜Â€}˜Â t˜Âàm˜Âàm˜Â@w˜Â €˜Â€}˜Â€}˜ÂŠ˜Âà†˜Â`“˜ÂŠ˜ÂŠ˜ÂŠ˜Âà†˜Âq˜Âq˜Âàm˜Â€}˜Â`z˜Â€}˜Â €˜Â€}˜Â€}˜ÂÀƒ˜ÂÀƒ˜Â €˜ÂŠ˜Âà†˜Â@˜Â@˜Âà†˜Â@w˜Âq˜Â t˜Âàm˜ÂÀj˜ÂÀj˜Â g˜ÂÀj˜Â t˜Â@w˜ÂÀj˜Â [˜Â`a˜Â€d˜Â`a˜Â@^˜Â [˜Âàm˜Â`z˜Â€}˜Â€}˜Â`“˜Â€–˜Â ˜Â€}˜Â@w˜ÂÀƒ˜Â €˜ÂÀƒ˜Âà†˜Â`z˜Â €˜ÂÀƒ˜Âq˜Âàm˜Â t˜ÂÀj˜Â`a˜Â [˜Â€d˜Âàm˜Â t˜Âàm˜Â g˜Â g˜Â g˜ÂÀj˜ÂÀj˜Â`a˜Â@^˜Â [˜Â`a˜Â€d˜Âàm˜Â g˜Â€d˜Âàm˜Â t˜Âq˜ÂÀj˜ÂÀj˜Âàm˜Âàm˜Âàm˜Âq˜Â@w˜Âq˜Â@w˜Â t˜Â`z˜Â@w˜Â t˜Â t˜Â g˜Â g˜Â€d˜Â€d˜Â€d˜ÂÀj˜Â€}˜Â€}˜Â €˜Â €˜Â`z˜Â€}˜Â`z˜Â`z˜Â t˜Â€}˜Â€}˜Â t˜Â@w˜Â €˜Â@w˜Â`z˜Â`z˜Âq˜Â t˜Â`z˜Â €˜Â`z˜Âàm˜Â g˜Â@^˜Â`a˜Â t˜Â`z˜Â€}˜Â€}˜Â ˜Â ˜Â ˜Âà†˜Â €˜Â €˜Â`z˜Â t˜Â`z˜Â t˜Â`z˜Â t˜Â`z˜Â€}˜Â t˜Â g˜Âàm˜ÂÀj˜Â g˜Âq˜Âàm˜Â@w˜Â t˜Â@w˜Â t˜Â`z˜Â`z˜Â@w˜Â`z˜Â€}˜Â€}˜Â t˜Â@w˜Â`z˜Âq˜Â€d˜Â@^˜Â`a˜ÂÀj˜Âàm˜Âàm˜Âq˜Â t˜Â€}˜Âàm˜Âàm˜Â`z˜Âq˜Â t˜Â€}˜Â`z˜Â€}˜Â €˜ÂÀƒ˜Â`z˜Â€}˜Â €˜Âàm˜ÂÀj˜ÂÀj˜Â t˜Â€}˜Â€}˜Â@w˜Â`z˜Â`z˜ÂŠ˜Â €˜Â€}˜ÂÀƒ˜Â ˜ÂŠ˜Â €˜Â €˜Â@w˜Â t˜Â`z˜Â ˜Â €˜ÂÀƒ˜Â`z˜Â`z˜Â t˜Â€}˜Â€}˜Â€}˜Â ˜Â`“˜Â ˜Â ˜Â ˜ÂŠ˜Â €˜ÂÀƒ˜Â`z˜Â`z˜Âà†˜Â ˜Â ˜Â ˜Â ˜ÂŠ˜Â €˜Âà†˜Â@w˜Â€}˜ÂÀƒ˜ÂŠ˜ÂŠ˜Â€}˜Â@w˜Â t˜Â t˜Â`z˜Â t˜Â@w˜ÂŠ˜ÂŠ˜Â@˜Â ˜Â ˜ÂÀƒ˜Â €˜Â@w˜Âq˜Â t˜Âà†˜ÂŠ˜Â@˜Â@˜Â€–˜ÂÀœ˜Â ™˜Â ™˜Â`“˜Â ˜Â@˜Â€–˜Â ™˜Â€–˜Â ™˜ÂàŸ˜Â`“˜Âà†˜Â €˜Â ˜Â ˜ÂŠ˜Â ˜Â`“˜Â`“˜Â ˜ÂŠ˜Â ˜Â ˜Â ˜Â@˜Â`“˜Â@˜Â@˜Â ™˜ÂàŸ˜ÂàŸ˜ÂàŸ˜Â ™˜Â`“˜Â@˜Â ˜Â`“˜Â€–˜ÂŠ˜Â`“˜Âà†˜Â €˜Âà†˜Â`“˜Â€–˜Â ™˜Â€–˜Â€–˜Â`“˜ÂàŸ˜Â ™˜ÂÀœ˜Â ™˜Â ™˜Â@˜Â ™˜Â£˜ÂàŸ˜ÂàŸ˜ÂàŸ˜ÂàŸ˜Â ¦˜Â@©˜Â£˜ÂàŸ˜ÂàŸ˜Â€¯˜Â`¬˜Â ¦˜ÂàŸ˜Â@©˜Â`¬˜Â ¦˜Â ™˜ÂàŸ˜ÂÀœ˜Â ¦˜Â ¦˜Â@©˜Â ¦˜Â ¦˜Â ¦˜Â@©˜Â ²˜Â`¬˜Â ¦˜Â€¯˜Â`¬˜Â@©˜Â@©˜Â ¦˜Â ¦˜Â`¬˜Â£˜Â ¦˜ÂàŸ˜Â€¯˜Â ²˜Â ¿˜Â¼˜Â ²˜Â ²˜Â ²˜Â€¯˜Â¼˜Â€¯˜ÂÀœ˜ÂÀœ˜Â ™˜ÂàŸ˜ÂàŸ˜Â ¦˜Â ¦˜Â€¯˜Â`¬˜Â@©˜Â ²˜ÂธÂÀµ˜ÂÀµ˜Â¼˜Â¼˜ÂÀµ˜ÂÀµ˜Â€¯˜Â ²˜Â¼˜ÂÀµ˜Âธ¼˜Â ¦˜Â`¬˜ÂÀµ˜ÂÀµ˜ÂธÂ@˜Â`ŘÂ@˜ ¿˜ÂธÂธÂÀµ˜Â¼˜Â ¿˜Â ²˜Â ¦˜ÂàŸ˜Â ¦˜Â€¯˜ÂธÂธÂธÂธÂ`¬˜Âธ ²˜Â@©˜Â`¬˜Â£˜Â ¦˜Â¼˜ÂÀµ˜Â ²˜Â£˜Â€¯˜Â`¬˜Â ²˜Âธ ¿˜Â@˜ ²˜Âธ ²˜ÂÀµ˜Â€¯˜Â ²˜ÂธÂ@˜ ²˜ÂธÂ@˜Â@˜ ¿˜Â¼˜Â ²˜Â@©˜Â`¬˜ÂàŸ˜Â`“˜Â€–˜ÂàŸ˜Â€¯˜ÂÀµ˜ÂÀµ˜Â`¬˜Â£˜Â@©˜Â€¯˜Â@©˜Â@©˜Â€¯˜Â€¯˜Â@©˜Â ¦˜Â€¯˜Â`¬˜Â ²˜Â ²˜ÂธÂ`¬˜Â ¦˜ÂÀœ˜Â ¦˜Â€¯˜Â`¬˜Â`¬˜Â ¦˜Â ¦˜Â ¦˜Â£˜ÂàŸ˜ÂÀœ˜Â`¬˜Â`¬˜Â ²˜ÂÀµ˜Â€¯˜Â¼˜Â ²˜Â ²˜Â ¿˜Â ¿˜Â¼˜Â ²˜ÂÀµ˜ÂÀµ˜Â ¿˜ÂธÂ`ŘÂ@˜ ¿˜Â¼˜Âธ ²˜Â`¬˜Â`¬˜ÂÀµ˜Â ²˜Âธ ¿˜Â`ŘÂ`Ř ˘Â`ŘÂ`ŘÂ`Ř ¿˜Â¼˜ÂธÂ`¬˜Â€¯˜Â€¯˜Â ²˜Â`¬˜Â¼˜Â`ŘÂ`ŘÂ@˜Âธ ¿˜Â`ŘÂ`ŘÂ`؀Ș ¿˜Â€¯˜Â ²˜Âธ€¯˜Â ²˜Â¼˜Â ¿˜ÂàјÂ`ŘÂÀΘ ˘ ˘€ȘÂ@˜ ˘Â@˜ ¿˜Â¼˜Âธ ²˜Â¼˜Â€È˜Â Ë˜Â€È˜Â`Ř ˘ ¿˜ÂธÂธÂ`¬˜Â ¦˜Â ¦˜Â`¬˜Â ²˜Â ²˜ÂÀµ˜Â€È˜Â€È˜ÂÀΘÂÕ˜ÂÀΘÂàј ؘ ؘÂ@Û˜Â՘ ؘÂ`Þ˜ÂàјÂ՘€ȘÂàј ˘Âàј ˘ ˘ ˘Â@˜Âàј ˘ÂàјÂ@ۘ ؘ€á˜ÂÀΘ ˘ ˘Âàј ˘ÂÀΘ ؘÂ՘ ؘ ؘÂ`Þ˜Â`ޘ€á˜Â ä˜Â`ޘ ؘÂ`Þ˜Â՘ ؘÂÕ˜ÂàјÂàјÂÀΘ€ȘÂÀΘ ؘ ؘ€á˜Â`Þ˜Â`ޘ ä˜Â ä˜Â€á˜Â ä˜Â€á˜ÂÀç˜Âàê˜Â`Þ˜Â`ޘ ä˜Âî˜Â ä˜ÂÀç˜Â@ô˜Â ý˜Â€ú˜Â@ô˜Â ä˜Âàê˜Â@ô˜Â@ô˜ÂÀç˜Â€á˜Â ä˜Âî˜ÂÀç˜Â ñ˜Â ñ˜Âî˜Â`÷˜Â`÷˜Â€ú˜Â ý˜Â€ú˜Â@ô˜Â€ú˜Â€ú˜Â€ú˜Âî˜Â ñ˜Â ñ˜Â@ô˜Â ñ˜Â@ô˜ÂÀ™Â™ÂÀ™Â`÷˜Â`÷˜Â ý˜Â ý˜Â@ô˜Â`÷˜Âà™Â ý˜Âàê˜Â ñ˜ÂÀç˜Â ñ˜Â`÷˜ÂÀ™Â ý˜Â`÷˜Â€ú˜Â`÷˜Â ñ˜Âî˜Â@ô˜Â ñ˜ÂÀ™Â ý˜Â™ÂÀ™Â€ú˜Â@ô˜Â€ú˜Â@ ™Â ™Â@ ™ÂÀ™Â`÷˜ÂÀ™Âà™Â™Â ™Â ™Â ™Â@ ™Â ™Â ™Â`™Â€™ÂÀ™Â ™Â€™Â ™Â`™Â`™Âà™ÂÀ™Â`™Â ™Â ™Â@ ™Â™Â™Â@ ™Â€™Â ™Â`)™ÂÀ™Â`™Â@ ™ÂÀ™Â€™Â`™Â ™Â ™Â`™Â@ ™Â@ ™Â ™Â@ ™Â€™Â ™Â ™Â€™Â`™Â`™Âà™Â@ ™Â ™Âà™ÂÀ™Â ™Â ™Âà™Â€™Â ™ÂÀ™Â ™Â ™Â`)™Â@&™Â #™ÂÀ™Â`™ÂÀ™Â #™Â ™Â ™Â@ ™Â ™Â ™Â€™Â ™Âà™Â€™Â ™Â@ ™Â ™Â`™Â`™ÂÀ™Â€™Â ™ÂÀ™Â #™Â ™Â€™Â€™Â€™Â`™Âà™ÂÀ™Â ™Â ™Â€™Â`™Â ™ÂÀ™Â€™Â@ ™Â ý˜Â ™Âà™Â ™Â€ú˜Â`÷˜Â`÷˜Â ñ˜Â@ô˜Â`÷˜Â€ú˜Âà™Â ý˜Â@ô˜Âî˜Âàê˜Â ä˜Â՘€ȘÂÕ˜Â՘ ؘÂ@Û˜Â`Þ˜Â@ۘ ؘÂÕ˜ÂàјÂ@ۘ ؘÂÀΘÂÀΘ ˘Â`Ř ˘ ؘÂ@Û˜Â@Û˜Âàј ˘ ¿˜Â ²˜Âธ¼˜ÂธÂÀµ˜Â€È˜Â Ë˜Â Ë˜Â ¿˜Â ¿˜Â¼˜Â ²˜Â¼˜Â@˜ ¿˜Â ¿˜Â ¿˜ÂÀµ˜ÂÀµ˜Â`¬˜ÂàŸ˜Â ¦˜Â£˜ÂÀœ˜ÂàŸ˜Â£˜Â@©˜Â@©˜Â€¯˜Â€¯˜Â ²˜Â€¯˜Â ²˜Â ²˜Â`¬˜Â`¬˜ÂàŸ˜ÂàŸ˜ÂÀœ˜ÂàŸ˜ÂÀœ˜Â ™˜ÂàŸ˜Â ™˜Â£˜Â ²˜Â@©˜ÂàŸ˜Â£˜Â£˜Â ¦˜ÂàŸ˜Â`“˜ÂŠ˜Âà†˜Â`“˜Â@˜Â`“˜Â`“˜ÂàŸ˜ÂàŸ˜ÂàŸ˜ÂÀœ˜Â ˜Â`“˜Â ™˜Âà†˜Âà†˜Â€}˜Âà†˜Â ˜Â@˜Â ˜Âà†˜ÂŠ˜Â ™˜Â`“˜Â`“˜Â€–˜Â ˜ÂŠ˜Â €˜Â€}˜Â`z˜Â t˜ÂÀƒ˜Âà†˜ÂÀƒ˜Â€}˜Â €˜Âà†˜Âà†˜Âà†˜Â €˜Â t˜Â €˜Â €˜Â€}˜Â€}˜Â€}˜Â@w˜Â@w˜Âàm˜Â g˜Â g˜Â`a˜Â [˜Â [˜Â [˜Â@^˜Â [˜Â [˜Â€d˜Âàm˜Âàm˜Âàm˜Âq˜Â t˜Âq˜Â t˜ÂÀj˜Â€d˜Â [˜Â€d˜Âq˜Âq˜Â [˜Â [˜ÂàT˜Â [˜ÂàT˜Â [˜Â`H˜Â B˜Â N˜Â g˜Âàm˜Âq˜Â`a˜Â@^˜Âàm˜Âàm˜Â t˜Â g˜Â€d˜Âàm˜Â g˜ÂÀj˜Âàm˜Â t˜ÂÀj˜Âq˜Â t˜Â t˜Â g˜Âq˜Â t˜Âàm˜Â g˜Â g˜Â€d˜Â@^˜ÂX˜Â@^˜ÂÀj˜Â t˜Â`z˜Â`z˜Â g˜Âàm˜Â@^˜ÂX˜Â€d˜Â@^˜Â@^˜Â€d˜Â g˜Â€d˜Âàm˜Â@w˜Âàm˜Â`a˜Â [˜Â`a˜Â g˜Â€}˜Âàm˜Â`a˜Â g˜Â@w˜Â€}˜Â€}˜Â@w˜Â t˜Â`z˜Â €˜Â@w˜Â t˜Â t˜Âàm˜Â g˜Âàm˜Âàm˜Â@w˜Â€}˜Â`z˜Â`z˜Â@w˜Â €˜Â €˜Â €˜Â ˜ÂŠ˜Â €˜Â €˜ÂÀƒ˜Â €˜Â€}˜Â€}˜Â t˜Â t˜Â`z˜ÂŠ˜Â €˜Â€}˜Â`z˜Â€}˜Â€}˜Âq˜Â@w˜Â€}˜ÂŠ˜Â ˜Â ˜Â@w˜ÂÀj˜Âàm˜Â g˜Â€d˜Â g˜Â t˜Â@w˜Â€d˜Â [˜Â@^˜Â [˜Â`a˜Â [˜Â@^˜Â€d˜Â€}˜Â t˜Â`z˜Â€}˜ÂÀƒ˜Â`z˜Â@w˜Â t˜Â t˜Â t˜Âà†˜Â`z˜Â t˜Â`z˜Â€}˜Â €˜ÂŠ˜Âà†˜ÂŠ˜Â €˜ÂŠ˜Â ˜Â ˜Â`“˜Â ˜Âà†˜Â €˜Âà†˜Â`z˜Â@w˜Â €˜Âà†˜Â €˜Â €˜Â`z˜Â€}˜Â@w˜Â@w˜Â€}˜Âà†˜Â ˜ÂŠ˜ÂŠ˜Â ˜ÂŠ˜Âà†˜Â€}˜Âq˜Â t˜Â g˜Âq˜Â t˜Âàm˜ÂÀj˜Â`a˜Â g˜Â€d˜Â€d˜Â`a˜Â€d˜Â [˜Â@^˜Â€d˜Â g˜Â@^˜Â`a˜Â [˜Â`a˜Â€d˜Â g˜Âàm˜ÂÀj˜Â g˜Â [˜ÂÀQ˜Â N˜ÂàT˜ÂÀQ˜Â`H˜Â N˜Â N˜ÂÀQ˜ÂÀQ˜Â [˜ÂàT˜ÂX˜Â N˜Â€K˜ÂÀQ˜Â N˜Â€K˜Â N˜Â [˜Â`a˜Â€K˜Â N˜Â N˜ÂàT˜ÂàT˜ÂÀQ˜Âà;˜Âà;˜Âà;˜Â N˜Â N˜Â N˜Â N˜Â@E˜Âà;˜Â B˜Âà;˜Â?˜Â B˜Â`H˜Âà;˜Â 5˜Â€2˜Â 5˜ÂÀ8˜Â@,˜Â€2˜Âà;˜Âà;˜Â`H˜Â@E˜Â B˜ÂÀ8˜Â 5˜Â?˜Â B˜Â`H˜Âà;˜Â@E˜Â B˜Â`H˜Â B˜Â`H˜Â 5˜Â€2˜Â )˜Â`/˜Â`/˜Â`/˜Â@,˜Â&˜Â€2˜Â€2˜Âà;˜Â@E˜Â 5˜Â?˜Â N˜Â?˜Âà;˜Â@E˜Â B˜ÂÀ8˜Â€2˜Â )˜Â@,˜Â )˜Â`/˜Â€2˜Âà;˜Â 5˜Â@,˜Â )˜Â&˜Â&˜Â€˜Â ˜Âà"˜Â )˜Â@,˜Â@,˜Â 5˜Â?˜Â?˜Â€K˜Â B˜Â`H˜Â@E˜Â?˜Âà;˜Âà;˜Â 5˜Â`/˜Â )˜Âà"˜Â`˜ÂÀ˜Â )˜Â )˜Âà"˜Â )˜Â@,˜Â€2˜Â 5˜Âà;˜Â 5˜Â€2˜Â 5˜Âà"˜Âà"˜Âà"˜Âà"˜Â )˜Â@,˜Â@,˜Â€2˜Â€2˜Â`/˜Â&˜Â ˜Â€˜ÂÀ˜Â ˜Â )˜Â€2˜Â`/˜Â )˜Â€2˜Â 5˜Â )˜Â`/˜Â )˜Â )˜Â )˜Â`/˜Â@,˜Â )˜Â@,˜Â@,˜Â ˜Â )˜Â 5˜ÂÀ8˜Â€2˜Â 5˜Â@,˜Â€2˜Â 5˜Â?˜Â`/˜Â 5˜Â 5˜Â 5˜Âà"˜Â ˜Â ˜Â€2˜Â@,˜Â`/˜Â )˜Â ˜Â`/˜ÂÀ8˜Â`/˜Â`/˜Â ˜Â`˜Â ˜Â€˜Â@˜Â€˜Â€˜ÂÀ˜Â`/˜Â`/˜Â )˜Â@,˜Â )˜Â`/˜Â€2˜Â`/˜Â`/˜Â`/˜Â )˜Â )˜Â@,˜Â 5˜Â`/˜Â@,˜Â )˜Â ˜Â )˜Â )˜ÂÀ˜Â )˜Â )˜Â`/˜ÂÀ8˜ÂÀ8˜Â`/˜Â€2˜Â 5˜Â?˜Âà;˜ÂÀ8˜Â€2˜Âà;˜Â B˜Â`H˜Âà;˜ÂÀ8˜Â€2˜Â ¨(dt ?@4 4ÿxunitsyunitsà»h°³ (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:$ (ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec2 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitsä ·—NM€¾ ÀTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(Â8HEAPXHÀÀdescriptionsection_0section_1section_2 Hn_sections ÿÿÿÿÿÿÿÿpà ·—NM (CLASSTABLE Ë¸SNODÁXÌ((M 8Ô TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(Ê%  (VERSION3.0 @TITLEDescription of channel 1 8 FIELD_0_NAME n_sections€Ì ÎTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(ÐHEAPX ÀÎdatadescription8  @œpÑq·—NM€SNODÏpB pøÃóÃÉÃpÚÃÀÃ0¯Ã0\ÃPÈà ¸Ãp]Ã`*ÃPÙ#ÃÐAà Ã`¹Ãà¶ÃðÝÃ`NÃÐÜÃ`HÃP!ÃÀ¯ÃÀ—Ã@èÃÐÖÃ0ÇÃÀµÃ08ÃÐ_àäÃÀ Ã4ÃÀ2Ã@úÃÐSðjÃ@ÀÃð6ÃP˜Ãð*À–ÃPÃp]àgÃP¶Ãð¹ÃP-ÃÀ>Ã`<ÃpoÃðà  Ã"ÃpìÃð¹ÃÃÀÍÃ`ZÃà€ÃÉÃðÃpøÃ@úÃpÚà Ãà’Ãð¹ÃdÃð•ÃP†ÃPžÃ`BÃ0ÙÃpòÃ@ÃÛÃà†Ãp{Ã`ËÃàzÃà†Ã0PÃ@‰Ãð¹Ã@qÃ`ÑàüÃ0ÙÃ0ñÀÃÕÃð¿ÃpøÃáÃ0ÙðŽàðà )àêÃ@à ²Ã£ÃðËÃ@}à 5Ãð¡àÌÃ0ÙÃpìÃ@èÃàÙÃPÃP’ÃÀ&ÃP'À„ßÃÐeÃ@Ã`HðvÃ`Bà #ðˆÃ`NÃpæÃð*ÃÐkÃ0ÓÃ0»Ãàhà à à #ÃðNÃóÃ``ÃP°ÃÐeÃPÂÃàŒÃ02à ”Ã@îÃRÃyÃ0DàÌÃPtÃÃÐúÃàŒà Ã@ÃjÃPÃmÃXÃP9ÃÀPà #Ã0ÇðóÃ02ð‚ÃäðX!ßñÃRÃ@èÃà ¦ðÃPÃpæÃÀ»à /ÃsÃ`0ÃÞàmÃ0ÓËð¾ÃÐwÃÐYÃð*ÃpæÃ@ÃP3ÃÐGÃà÷Ã0hÃàÃàzÃÃP÷ÃÐSà ¸Àà ŽÃ@ÃÀÁÃPŒÃ@_ÃÐYÃsÃð$à /ÃP¤ÃFà ÃÐYÃà˜ÃsÃ0©à ç"Ã"Ã@âàðÃÐYÃðÃÀ Ã0Pà /ÃÃÃÃÃ@kñÃÀ‘Ã`• Ãð‰Ãð¡Ã0bÀðùðÏ"ðdÃ`¹ÃÐÖÃ0ÇÃ0¯Ãp]ÃyÀÃöðˆÀÃäý÷à à Ã`*ÃоÃàÃð­ÃÃP˜ÃPn Àf ÃÐAÃÐMÃà€Ãð¡ðùÃpQàÌÃÐÐÃ02Ã4ðíÃ`!Ã`• ÃPñÃà\Ã0$ÃdÃÉÃàŒÃð*÷ðˆÀ+Ã@}Ã`³ÃÀ‹ÃPžÃp‡Ãð¡Ã0»À ðÃÐeðvÃ.Ã`NÃÀ¯ÃFà !à d#Ã` "Ã0DÃPñÃÐ$Ã`!ÃÐSÃÞÀxÃàñÃðà 5ðŽÃàÙÃ`0ÃÀµÃöà[ÃÐîÃ"Ã`³ÃpcÃð$ÃpQÃI!ÃàëÃ`*ðùÃPŒÃà÷ÃðÃpiÃpWÃ0Íà ¬ÃðÃð›ÃPŒÃ`ðíÃÐÐÃgÃ0!ÃØÃÀ ÃðÃðÃPzÃ:ÀÀrÃð$Ã.Ãð•àºÀrÃð$À ÃàbÃÀ©àØÃpàÃ@ÜÃ@ÖÃ0 ÃØÃÀ!ÃÀy"Ã0‘"À×"ÃÐ#"Ãp’'ÃÈ+Ã`_)Ã0%ÃЈ&Ã@í.à /à Ã(Ãðî"Ã,ÃÔ-ð‡.ÃÐj+ð+ÃÐá,ÃE,ÃK+Ãà£(À•-àf-ð/ÃÀ´-Ãð/-ÃÀÆ*ÃE0À0ð™+À•-ü-ÃÎ.ð .à ½)ÃÐ|(Ã&Ãà'Ã*Ã0m(ÃÀÌ)Ãà£(ð‡.àf-Ã@‚+Ãà.Ã-ÃQ.Ã'1Ã0=0Ã`¾.àõ*ð/ÃÀ%0Ãàö/Ã`50ÃÐj+Ã0À/Ø3à ¥-Ã0[+Ã0[+Ão)ÃÀº,À0)Ã@Õ2à o6Ã9.àl,ÃÐá,Ãð#/Ã~-ÃÐ@2ÃPð4À‰/Ãï/Ã9.ÃÚ,Ãpt,À,Ã0U,ÃðÄ)ÃP,+à ½)Ãð/-ÃK+ð‡.Ã3/Ãð#/À‰/ÃÀ–2ðæ3àB3ÃP…1Ãàö/À**ÃP0Ã3/Ãà.Ã0I.Ã`;/àT0à ¥-Ãæ*ÃÐp*ð“,ÃpÓ1ÃÐÛ-àÝ.Ãr/Ã`¸/ÃÀ1.ÃÐR/Ãx.ÃP£,ÃÀ´-Ãi*àã-à /À›,Ãõ.Ã0O-Ã`S+Ãðš0Ãph.à .,À›,Ãph.Ã'1Ã'1Ã@^1Ã`â(Ã`ƒ#Ãæ*Ãð²,Ãi*ð-Ãà…-Ã0Ø+Ãà-Ãð¸+ÃÐj+Ã`G-Ãð;+ÃÐí*ÃK/à ".Ã0[+ÃÂ,Ãû-àÑ0Ãx.Ã`Ü)ð()à @)Ãà*Ãp÷+Ã0ä)Ãà£(Ã`M,ÃP-ÃÐX.à ·*ð"*àl,Ãà,'ÃÐj+Ãi*à Ÿ.Ã0Þ*Ãpý*Ã0[+ÃðA*ÃðM(Ã@j/Ã@Õ2àr+ÃÚ(ÃPÙ#ÀT#Ã`k'Ã@¦%ð@%Ãà'ð@%ÃÐù(Ãà©'Ã`Ä-ÃÀ7-ÃÎ*àŠ'Ãà2&Ã0ê(Ã`_)Ã0ä)Ã*Ã)Ãp÷+Ã@ *Ã)Ü(Ã@|,ÃÀ1.à :*Ã%'à Ï&Ã7$Ö)ÃP,+À6(ÃÐù(Ã+&ðŸ*Ãû-Ãà©'ÃðÄ)à ·*à F(à É'Ãi*à :*Ãà—*ÃP8)àx*à~)ÃP»(ÃÐ &Ã~-À›,Ã@)Ã&àœ$Ã0U,Ã@”(ÃÀs#Ãð} Ã`e(ð()ÃðY&ÃQ*ÃÐù(Ã@)%ðL#Ãà2&ÃÀä%à ·*Ü(Ãph.Ê+Ã@ˆ*à&à–%ÃðM(ÃK+ð:&ÃPJ&Ó#à–%Ã*àû)Ãp’'Ãì%Ãà£(àr+ÃðÖ&Ãàœ$Ãà*ÃPV$ðÃ$Ã`ô%ÃÐ#"ÃàÁ#à Û$ÃðG)Ã{#ÃÀü!Ãp? î%Ã`}$è&Ã0y&Ãp'ÃPÓ$ðL#Ãp°"Ã`ô%Ãp°"Ç%ÃP2*Ã+&ÃPñÃàµ%ð()à„(Ã`Ð+À¹'Ã0‹#ðL#Ù"ÀÑ#ÃÐ#à +à–%à É'ÃÐ$ÃPJ&à&à&ÃPJ&Ã0%ðR"Ã@¸"ÃÐ &Ã@Ž)Ã@ &ÃÐv)ÃðÖ&Ã`$ÃPÁ'Ã(Ã0$ð«(Ã@5#Ç%À6(ÃÐ|(Ã@A!ÃÀ!Ã`k'Ã(Ãp!%Ã@/$ÀÝ!ÃÀð#à Ï&ÃÐ$Ã@ *à R&ÃPß"ÃÐÿ'Ã`k'Ã@;"ÀÅ%Ãà'Ãþ&ÀH%ÃPß"Ãðè#Ã@;"ÃðY&Ãðe$Ãæ&ÃÐŽ%Ãp-#ÃÀg%Ã`î&ÃÐ &ÃÀ!à p!ÃàP!à j"ÃP\#Ãð} Ã` "Ãp¶!Ã`è'ÃðÊ(ÃÀy"ÃÀü!ÃÆ!î%ÀÑ#Ã@;"Ãðô!Ã7$Ãà»$ú#ðÕ!Ã0!Ão%Ãi&ÃÀð#Ãp'$à1!Ãðî"Ã0y&ÃÀö"ÃÆ!Ãþ"ÃPP%ÀÝ!Ãàµ%ÃÐ$ðÕ!Ã0%Ão%Ãp9!ð@%Ã`q&Ã`ú$ÃPP%ðÏ"ÀZ"Ã@A!Ãp-#ÃÀü!à j"Ã"!ß!Ã@/$Ã` "Ãp¼ ÃÐŽ%Ã{'à j"Ã`î&Ãp&Ãu$à%#ðÏ"à Û$Ã0y&Ãò$à ˆÃ0Çà !Ã`ƒ#Ã0$ÃPtÃ0 ÃÐ5ÃД$à ùÃPë Ãà8%à~)Ã*ð·&Ã@ÖÃ`ƒ#Ã@ù,Ã@¦%à7 Ã08Ã@eßÃ7$ÃК#ð^ ÃÀ‘Ã[ÃР"Ã`›ÃÀü!Àã Ã` "Ã@5#ÃÀÃ@5#Ã@Ä ÃpÈÃ`• ÃPV$ðR"Ã0‹#Ã@;"Ã@ÃÀÃиà ó ÃC"ÃðÜ%ÃÀ!ðáÃÀÃÐ/ Ã"!ÃÌ Ã ‚ÃàP!ÃÐ#ÀH%ÃàÙÃ`0Àf Ãp°"ÃàJ"ÃÀ… à®!Ãp? ÃPb"Ã` "ÃàP!àÀà ‚ÃðàOÃ`­ÃðÃPÙ#àÌÃPñÃ`#à%#ÃÐSÃð‰Ã0!Ã0µÃ@Sà ˆÃÀÃðú à¢#Ã0$Ã@G ÃO à ÃpQà ç"ÃPb"Ãðú à |ÃÀ"ðÏ"ÃPÙ#Ç!Ã"ÃÀ—À~Ã0,Ã0»Ã0JàIÃ0¯ÃPÃðè#ÃÐ)!ÃàåÃ`¡Ã@SÀÝ!ÃÀÃ0,ðjÃ@MÃp°"ÓÃàßðçà7 ÃPzÃàñÃÃ@G à+"Ã@ÊÃÀm$Ã@5#àÆÃ@YÃЬ ðóÃ`!ÃÐ#"ÃÃPtÃÃàÙà´ Ã@¦%Ãp? ÃpÔÃ@âÃ0£Ãp3"àÀÃÀ… ÃPë ÃÃÀÃ[ÃpEÃð•Ã`$àºÃÀÃêÃð‰ÃÞÃÐeÃPªðóÃÀÃêÃÐAÃ@Ã@YÃ`¹à Ã:à Ã0!÷ÃpcÃÐGà ç"ÃPÃpWÃÀ&Ã0>àUÃPŒÃÐMàgÃäÃ@Ä Ã°Ãð6Ã:ÃоÓÃ#Ãp9!àÌÃÀ ÃÐSÃð‰Ãð àOÃð‰Ãðƒà7 Ã@ÜÃPÃ0ÇàOÃ`0ÃàýàOÃpÚÃpÎÃðÃ0&àIÃ`*ÃP†à ”Ã@âÃ@èÃÐMà šÃPÃ@qÃØðÏ"ÃÀ Ã[ÀràÆÃÐÜÃpÈÃ@âðdÃað ÃðÃ`• ÃÀ—ÃØÃð›Ã`*ðvàÆàºÃàtàÆÃ08Ã.ÃÀ—ÀïÃ0©ÀlÃPh!ÃÐGà[Ã@SÃ@¾!ÃàV Ã"ñÃ0µÃÀÃÐ;ÃP àIÃÀÃpÚÃ@Mà ŽÃ`HÃ0¯ÃpÂà®!Ã`‰"Ã[Ã( Ã0$ÃPtÃ…Ã4à Ã@kÃpWÃ0&Ã{#Ãð} à !Ç!ÃàbÃpÎÃmÃ`$ÃPŒÃ`$àØÃðÀ~ÀÃð›ÃÐÄÃpÎð@%ÃàV ÃàtßàºÃðƒÃàåð‚Ã`0Ã0"ÃöÀŠÃPtÃäð|Ãð•à Ã"ðdÃðàÆððà ÃpÚÃÀ,à Ã0µÃmÃP˜Ã@âÃ08Ã0µÃ`*ÃPh!ÃPÃà†Ãð›Ã` à Ã0¯ÃpÈÃ`0Ã@Üà v àOÃ0PÃð‰Ã"À`!Ã`$ÃÐ/ ÃàzÃð Ç%Ã¥ Ãp]Ãð•Ã0DÃÐGÃ@ÐÃPh!ÃÌ Ãp¼ ÃànëÃÐMÃPÀõÃ4Ã@YÃ08ð ðpÀéÃÐ#"ÃÐ#"à[à ŽðjÃð¡Ãà€ÃpæÃ@ÖÀ`!Ã7$ÃÐ)!Ã@ôÃ@à |ð|ÃÃÐ_Ãð¡ÃðÃàP!à d#ÃÐMÃð‰à®!ÃPë Ãà€ÃÐAÃpÎÃиÀÃÐÊÃðà Žà p!à=ðóÃÀ2ÃðÃ0>Ãàñà p!Ãðú ÃpQÃaÃ0 ÃàßÃðw!ÃP÷à ˆÀûà Ãà÷ÃвÃp3"ð:&Ã°Û Ã Iðáà1!Ãà€Ã0ÍÃLÀ ÃàëÃоÃ@kÃÃð ÃÀ2ÃPtÃ@Ä ÃÀ©Ã@ÜÃ@èÃàñÃàåÀûÃ0,ÃßÃ@Öð^ ÃPë ÀlÃpWÃ0ÍÃÉÃPÃàhÃpuÃð*ÃÐAÃàëßÃÀ‹Ã0¯ÃÉÃ0\Ã`§ÃàÍ!àIà Ãð*ÃpoÃÉÀõÃ`$ÃP†ÃÀ©Ã`¹àÌðpÃáÃà˜Ã0µàØÃÐÐÀ ÃsÀÃgàÀÃÀ£àaÃp{Ãð¹ëÃ`¹à[àOàIÃêÃÀÃO ñÃ0µÃð•ÃÐÐÃÃÀ ÃÀ‘Ã( Ã@YÃ0ÓÃp‡Ãà€ÃÀ¯À„ð‚ÃÐMÃ`*ÃpÎÃÃpWÃ@îÃÐÖÃÐ_Ã`¿ÃpæÀÃpiÃ@SÃàëÃPžÃà ;Àã ÃÐAÃpòÃÃ0ßÃàzÃ`BÃ0ÙÃð³ÀÃ[ÃP ÃÐGð‚Ã0JñÃÒÃÀ÷ÃÀ,ÃpòÃ`¿ðpà šÀ Ãpàà ÃP’àêÃàŒßÃÕð‚Ãà€Ã`ËÃP˜àaà[ÃàýðÃðˆà ¦Ã`×ÃpþÃÐMÃà÷Ãð­ßÃÒÃ@ÜÃÀÃÏðŽÃ0DðÃpÎÃðq"ÃÀÃ`ËÃP!ðÃ`³ÃÀ ÃÃüÃÀ,Ãð‰ÃÀ!Ã0JÃàà[ëà Ã0PÃÀ©àºðvÃpæðàÒÀà ÃÃÃÃÐÐÃà÷ÃPýÃäÃð ÃPÃð$ÃP à ÃÀÃpòðóÃmÃÀ&ßÃP à ŽÃÐMà #ÃpàÃÐSÃÐÊÃÐ;ðóÃ`*Ã@Öà ˆÃÀðÏ"ÃP ÃàÃ0PÃ0DÃP÷ÃÐ#"ÃàñÃð›àOÃоà |ßà ëÃànð‚à Ã¥Ã:Ãsà Àû÷Ã`›Ã`!Ã`$ÀûÃð›ÃÐ;ÃpÎà Ã@Ã`0Ãgà à ŽÃ#Ã0&ÃÃgÃðÃ@ÐÃmÃ0>Ã0ÇÃPŒÃà\ëÃPŒàäÃpEÃÃàgà ²Ãð$à ÃPýÃ`¡ÃpcÃ`­àêÃÀÃ0"Ã"ÃLÃÀ ÃЬ Ã@_Ãà€Ã@kÃ@àC÷À ðÃ02ÓÃp3"Ã@²#à Ã0µðùÇ!ÃðàÞÃð•Ã`§Ãpcà ˆÃP†Ã@ôÃ`*Ã@èÃð•Ãðà /à[Ã:àØÃÀ&Ã@SÀ×"à ó Ç!Ã@ÐëÃàåÃ(ÃÀµÃ`Bà Ã0‹#Ãðe$Ãà÷ÃÃ@èÃPë Ã Ã°Û Ã€`!ÃÃ0ÁÃ02àÞàUÃ`*àgÃp]ÃàÓ Ã ØÃPýÃðÀïÃÀÃÐÊÃ@îÙð|Ã0ÍýÃоÓÃÐYà #ðóÃPž÷ÀïÃ{#Ã@A!ÃÕà  Ã#Ã@/$Ã@ÖÀÃÐ_ÃpøðáÃÐAÃÀ,ÃÀ£ÃpÈÃ`­ÃðÃFÃÒÃ`Ã`*ÀïÇ!ÃÀü!Ã0‹#Ã{#ÃÐ%ÀB&à L'Ãà£(Ã`ô%Ó#Ã(Ãà )Ãà,'ÃÐX.Ã`Ä-àã-Ã0ä)Ã@ *ð"*Ã-Ã`Ð+Ãpý*àã-ð .ð .à “0Ãð).Ã@í.Ã@d0Ãàa3ðþ/ÃÈ/Ã@j/Þ2ð3Ã0º0À}1ÃÐÏ/ÃpÓ1À‰/ÃP0Ãð”1Ä,ÃÀ7-à ™/ÃÀœ1Ã0C/ÃÀC+ÃÈ/Ãàa3ÃÐÛ-À.Ã`50Ã@p.Ã`¸/Ã@^1ÃP0Ãx.ð{0Ã0Æ.Ã0À/Ã@X2àÑ0Ã`2ÃPê5Ãð”1ðì2Ã`Ð+Ãà*ÃðŽ2Ã’4ÃE0Ãàs0Ã0C/Ãï/Ãàä2ÃÐÃ1À‰/ÃÐÃ1ð]5Ã'1Ãà,Ã`A.À¡+Ãà‹,Ø3Ã@R3ä1ÃÀ=,Ãà.ÃT4Ãðš0Ã9.àZ/ÃÐ@2Ã0C/Ã@j/Ã~-àÝ.Ã0=0à 2ÃÀ–2à /Ãà…-ÃÐ^-Ãc'ÃÀÀ+Ãà.Ã@‚+ÃÀ1.À¡+Ãà…-Ã`²0Ãð /Ö)Ã@í.Ã'1Ãé0à„(Ã@Ž)Ã`_)ÃP,+Ã`S+Ã`_)À§*Ã`Ð+Ã@p.ði3ÃÚ,Ãpý*ÃÀm$ð±'Ãà+ÃP©+ü-ÃP—.à +àr+ÃÀÆ*Ãpz+Ãà&(ÃÀO)ÃP/Ãð5,Ã@(ÃP>(ÃP -Ãpz+Ãà—*Ã0ê(Ãà©'Ã@Ž)Ãà‹,Ãà+Ãà©'Ã0ð'Ãp&à %à +ÃÚ(ÀÅ%ÃÂ,ÃÀC+ð-Ã`A.ÃÐp*Ã0Þ*Ã)ÃpŒ(Ü(à Û$à d#ÃÐp*Ã@ÿ+ÃÀº,Ãð¾*ÃðÊ(Ãæ&ÃðA*à ^$à p!Ãø#ÃðÊ(ÃÎ.Ã0a*À,ÃPÍ%ÃPV$Ãà)Ã`â(ÃÐŽ%ÃÐ%ÃpŒ(Ãð;+à Ã(ÃðY&Ã`$à$Ãp!%Ã@(Ã`S+Ãà¯&ÃÀ['ÃPD'ð±'ÃÀ['ðX!Ãp9!ð:&Ãp˜&Ã0ü%Ãp&ð@%Ã`î&Ãp&ðF$ÃÀs#ÃàP!ÃÀ"Ã"Ã@G ÃPn ÃÆ!Ã`ú$ÀË$Ã"Ã`}$ÃPD'À¿&Ã`ô%ÃÐ'ÃÒÃ"Ã@Ä ÃЬ ÃPn à®!Ãp'$ÀÅ%ð½%à d#ÀÝ!ÃC"ÃPå!ÃÐ &à Ãðô!Ãì%Ãp¤$ÃP&,à¢#ÃÀ—à Ã`0àIÃp9!Ã=#ÃaÃиÃðÃвÃp¤$à–%î%à=Ã@¸"à%#Ãp¶!ÃÐÊÀïÃPb"Ã0©Ã@ÐÃ`¡ÃðƒÃÆ!ÃàÍ!à¢#Ã`§ð ÃÞÃ4ðpàºÃ$Ã0%ÃI!ÃÀÃ@MÃðÀã ÃÐ$ÃPh!ÀÑ#à¢#Ãðe$ÃÐ#"à7 ÀïÃÐÊÃ@ÖÃð›ÃÀÃ@YÀrðdÃPn ÃO Àrà=Ãp°"Ã0 ÃàåÃÀ‘ÃðÃ@_Ãð‰àÌÃpÂà ˆÃÀ ÀrðáÃ0PÃ0ÓÃàåÃp¶!Ãðú Ã`§ÃàëðçàIÃPtðR"ÃÐ;ÃàzÀÃ0£ÃP÷ÃðÃðÃ08Ã`­Ã@úÃ0»Ã`ñÃ`ÃpQÃÀ‘Ã[Ãð¡Àf Ã4Ã`0ÃàýàÌÃàP!ÃànÃàåÀxà ÃÐ5Ã`à7 ÃPn ðçÃ@kñÃ¥àmà ˆÃ0»ðÃÀ£Ãð¡ÃpÔÃpÎÃÀÃêðpÃÐAÃðƒðáÃÀÃ0,Ã`¡ÃÀ£Ã`*àØÃFÃP’Ãðú Ã°Û ÃÀ—ÃPÃàtÃÐÊà #Ãð$ÃðÃà Ãð›Ã@YàÒÃàtà=ÃC"Ã"Ã@}Ã…ðÿÃÀÃ0£ÃиàaÃ`TÃÃÃиÃвàºðóÃÐÐàÒÃP†Ãà†ÃÃäÃpKàIÃ`ËÃyÃðà ÃÀy"ÃpÂðdàÒÃÐ5ÃaàIàÒà ˆÃàÍ!ß!à Ãp¼ Ã.àºÃðw!ñÀÝ!ÃÆ!ÃàÍ!à$à¨"à+"Ã.à7 ÃÐ#"Ã0!ÃaÓà |Ã0%Ã7$Ãð ÃÐYÃàßÃðq"à%#ÀlÃ"!à Ã`³Ã"Ã`›ÃUÃЦ!Ã@¾!Ã0!à7 ÃpKà–%ÃÐ#"ÙÀïÃ( Ã"ÃPë Ãðk#Ãp3"Àã ðÉ#à¨"Ã@/$Ã0—!àIÃÀ,à´ Ã&ÃÀg%Ãðe$ÃÐ#"ÃpWÃ0,à á#ÀéÃpKà ùÃ"Ã.Ã@eÃPzÃÀ—Ãp€*Ãp€*ðjðŽÃð­ÃsàºÃðÃO ÃÌ ÃPë Ã1%Ã"Ã0µÃP÷à1!Ão%à®!àºÃà>$Ã{#ÀH%ð4'Ã@¦%ô$Ã"!ÃC"î%ÃÆ!ÃÐÄà v ÀZ"ÀÅ%Ã@;"à1!à à %Ã1%Ã@/$ÃÐ%Ãp°"ÃPV$ÃðÖ&ÃC"Ã$à d#à ç"Ã0#ÃàbÃàP!ÃPå!Ã0"Ã0ü%Ã&ÀH%ÀÅ%ÀZ"Ãp¼ ÃP€Ã@ÐÃI!à %Ãà>$ÃàÇ"ÃðÃàÇ"Ã$Ãp3"à !ÃР"ÃвðdÃÀ… ÃI!ðR"ÃÐ#"Ã@¬$à R&Ã@²#à7 Ç!ÃÀ‹ÃàV ÃÒà Ãðô!ÃÀ… Ã`}$Ã0‹#ÃЦ!à í!Ã`›Ãð à%#ÃPß"ÃPë Ãp&ÀÑ#ÃI!ÃàÓ Ãðô!Ãðk#Ãp'$Ã@#&Ãò$ú#ÃàÓ ÃPë Ù"ðX!Ã`ƒ#ß!Ã0"àœ$ÀH%Ãðâ$à¨"ðR"Àf ÃÆ!Ã`#ÃI!à ùÃC"ð@%Ãð_%à ^$Ãð Ã[ðÏ"ÃPD'à%Ã"à´ ÃàÙÃ@²#Àïà´ Ã` Ãðk#Ã`#Ã0#Ã0‘"Ãðú ÃPn Ãð à šÃ0 Ã0$Ãp¶!ðdÃ`›ðL#à X%ÃPV$Ã` Ãaðdà j"Ã=#à Ãðô!ÃpEÃðw!ÓÃPzðjÃ@MÃ@²#Ãðî"ÃÀ… Ã4Ã@G ðáÃÆ!ÃÆ!Ã#ÃР"ðçÃвà Ã`§ÃÀ‘Ã`‰"ÃЬ à ^$ÃàÁ#ÃÀ—à ”ÃðÃ`ÃÐ5ÃÐ;ÃÞÃÀ… Ã0 Ã@ÜÃÐ5à X%Ã.Ã0µÃÉÃðÃÌ ÃP€ÃP†Ã@¾!ÀïàOÃðÀlÃ`ð^ Ã@ÖÀéÃ0%Ãpª#ÃÌ Ã`• Ã0"à=Ã@SÃÐ5ÃpÎÃ°Û Ã( Ã¥ ðÕ!Ã0,ÃàëÃ0"à á#ÃPë à ðçÃpÂÃàýÃaÇ!ÃPë ðçÃpÂÃpÎÃPýÃ0PÃPñàIà /Ã`ÅÃ:Ãð‰ÃàÙÃ08ÃÛÃ08ÃðƒÀZ"Ãðk#ÃPzÃ0ÁÃsëÃ`³ÃÀÃ`‰"Ãpž%Ã@Yà Û$Ã`*Ã@Ãð<Ãð*ÃpÚÓà Ãà ÃP†ðçÃàP!Ã0»Ã0µñÃ`6àÒÙÃÐ/ ßÃI!ÀlÃ`­à[ðvàÌÃP’à[Ãð¡ÃðÃPŒÃð›ÃÃÃPÃð•Ãð} àIÃ`­ÃpEÃpÂÃàbð|Ã@_Ã0DÃ0DðóÃØà !à ùÃ@ÖÀ`!ðF$ÃPzÃÀ¯ÃÀ—à ˆðùÃ4ÃÐÄÃpÈÃÀÃàñÃgÃ`³Ã`§Ãàå÷Ãð0Ã@îÃàtÃð$àOÃоÃà÷àØÃÀ!ÃÀ‹ÃÐÖÃð•Ã0"ÃÐ'ÃÀ‘ÃpiÃ@ôÃP ÃpÎÃ`!ðíÃð0Ã08Àûà ”ÀŠÃÐ5Ã`BàØÀÃÐGÃиÃ`­ÃóÃ@kÃÞÃäÃ`­Ã08ðíÃPzÃ`­àIÀrÙÃÐAÃÐ)!Ã`¹Ãð0ÃÏÃÀµÃPn ÃÃPªÃð³à /Ã0ÇÃöÃP!Ãð$ðvÃPÃP˜ÃpiÃÀ,Ã"ÃÀ&àUÃÐÖðvÃP†ÃÐSÃpcÃpÚÃpEðíÃRÃ0ÓÃP Ãð¡àmÃ0ÇÃàtÃ@YÃÀ—ÀïÃÃ@úÃÀ8ÃàëÃÀÃànÃð$ÃÉÃpìÃpàÃÐ5ÃàñÃð à ”ÃÃàØñÃ°Û Ãðà7 àÆÃ4Ã`• ðùÀÃ`§à |Ã@âÃ`ÅÃàýÃ`¹ð|ÃpàÃà€Ãsà ˆà |Ã0 Ã`6ÃÃÐqÀðŽÃÐ_À~ÃP Ã@qà šà[àÆÃð›Ã0¯Ã`³ðÿÃp]ðóÀlÃÀ©Ãà’ðÃFÃ4ÀÃ4Ã0ÍðÿÃÀÃPzÃ@YÃ`¿Ã:Ã`*ÃüÃð­ÃÐôðÀûà ”Ã`Hð”ÃáÃäÃàåÃðÀ~Ãàë÷ÀÃ@âÃ@_Ã`*ðóÃðÀà  ÃüðùðíÃÉÃÀ,ÃP!àäÃpà ðX!Ã0&ÃRÃàzÃànÃ`³ÃÀ>ÃàÃÀÃPÓ$à á#Ãà€Ã`ÑÃð•ÃÃÐÖà ŽÃ0,ðpðù÷ÃÃÉà ‚ðpÃ"Ã`0Ã.ÃÀ ÀÃðÃð³ÃÃpàð‚àOÀÃ.Ã@A!Ã`¡ÃpÚÃÀÃpÚðóÃÐMÃÐ/ Àõà ˆÃäàUÃpÚÃpQàÞÀ ñÃ"ÃðÃàåðçÃ0ÍàaÃàzÀûÃmÃоÃàßà[ð”ÃmÃpcÃàëÃ4ÃRëÓÃäÃð*ýÃ0»à à ÃLÃP!Ã@ÊÃÐGà ŽÃà÷Ã0ëÃÃÀ¯Ã@wÃ@_ÃàtÃ`ZÃÏÃð Ã@Üà ŽàÆÃ:ÃpàÃpàÃäÃ@eëÃÉÃÀ©Ãðà  Ãà ˆÃpìà ÃÐAð‚ÃÐÐÃà÷ÃÞÃÐÜÃàýÃ"Ã0PÃÐÜÃÀ©ÃÐÜÃ0ÓÃ.à ”ÃÃdà ¬Ã:ÃàëÃ@èÃ@ôÃpòÃpæÃÀàÌÃFÃpøÃP'Ãà÷ÃP ÃpðšÃÐÖàØÃвñÃ@ÜÃ@_ÃоÃð Ãð­ÃFÃÐYÃÀð#ÃpþÃð6ÃP!ëÃ`*Ã.Ãà’Ã`TÃ@MÃUÃPÃ`<ÃpiñÃÐAÀ„àOÃ.ÃðÃ@kà ”ÃÐâÀð|ÃÐAÃüÃÕÃ@ÖÃ@îÃüÃð<À–ÃðBðpÃ:ðvÀõÓÃ`<ð Ã:ÃÉÃàhÃpÔÃð ÃPàØÃ`ÅàUÃPÀÃPªà #ÃPÃÀÇÃà€ÀÃ`¿Ã.ÃÐÐÃP!ÃP¤À=Ã0åàØÃÀ,Ã08Ã@ÃÐâÃPÃ"!ÃpÎð|àÞÃÀµÃð$ÃÐèÃdÃjÃÀ2ÃpWà Ã4à šà /Ã`³ÀÃpiÃ0ÓËÀëÃà€ÃÉÀÃpøÃ`<Ã@âÃP!ÃP'Ãð6ð#Ã@Ã:Ãp]Ã@úÃð6ñÃàýÃ4ðÃÃÃÃ@Ã0JÃpøÃpÔÀT#Ã…ÃÀbÃÃP¶ÃÃðBÃð6Ã@wÀ–Ã0ÓÃ0ÍÃpWÃ`³Ã"Ãà’à…Ã0Ó÷ÃêÃ"Ã`<ÃàtÃ02ðŽð#ÃçÃàñÃоÃàzÀñÃÀ‘Ã@ÃëÃpÚÃð*ÃjñÃ0Çà Ã`³à ¬ÃsÃ@ÃàzàÒÃ0>ÃPÃp]Ã`ÅÃð*ÀÃÀ¯Ã@_Ã`¡ððÿÃвÃðà à  ÃÐÜà ”Ã0&Ãð§ð”Ã`HÀ„àOÃmÃÐ_À%ÃðHÃÐÄà |Ã@àÃP¶ðÃP¤Ã`NÃP àØÃ@úÃöÃÐÄÃðÃà Ã`HÃ0ÓàIñÃÀ!ÃpÔÃPŒÃpQÀ–ÃÉÃáÃÐkÃÐÜÃ0&ð|ÀÃFÃð§ÃÐÖÃð³Ã@à šÃ@Ã@ƒÃLðàaÃÀ>Ã0\ðŽÃ@ÜÃÐMà ÃRÀÃÐÖÃà€ÃsàÞÃÐ_ðˆÃLÃüÃ`$Ã`BÃà÷Ãð§ÃÐÐÃ`ÅÃð­Ãð³Ã0VàØÃð6àäÃàtÃ[ÃÀÃà€Ã0ÓÃÉÀàüÃÕ÷Ãð¡Àà  ÀlÃðÃpoÃ08ÃðÃ`0ÃP¤Ã`6ÃÐ_ÃP˜ÃàëÃLÃp{Ã0ÍÃÀµð‚Ã@èÃÀ&Ã0ÁÃ`¹ÃaÀxÃPÃpàðùà¨"Ç!ÃÆ!ÃöÃpiÃäÃpÔÃpàÃFà ”ÃÃÃоà[Ãð§ÃP†ÃànÃÀ ÃUÃÐ;Ãà÷ÃÃðÃ0ÁÃð­ÃpòÃðà ðíÃÐÖà #à ”ëÃ@_ð^ ðdà[ðÃpÎÃð›ÃàÃÃ`³à àOÃ`• ðvÃØÃ( ðpÃP¤Ã02Ãð‰Ã0ÍÃpiðíÃ0,ÃÀ—Ãp¶!Ã¥ÃàzÃð$ÃÀ‘ÃpÂÃ`¹ÃyÃPð‚àØÃÐGýÃPðˆÃpcÃPžÃÃðÃàtÃàŒÃ`6Ã@YÃð6à À ðçÃPñÃÀPÃ`NÀ¨ÃáÃ`³ÃÐÜð‚Ã@îà Ã@ÊñÃpoÃ(ÃPýÃ02ð ÃXÃð§Ãð­à À„ÃmðvÃ@YÃð¡ÃPžÃ0ÁÃ(ÃP ÙÃ0£ÃÀ£ÃP˜Ã@Ãà À%ÃÐ_ÃÀ£ÀðùÃP-Ã`$ÀŠÃpoà #ÑÃPÀœÃRÃLÃáÃ`*Ãð­Ã`¿ÃÉÃànÃ`¹ÃüÀŠÃÕÃÐSà Ã0VÃð*Ã08Ãð§ðÃàzÃ0>ÃFà ˆÃà÷ÃÃ@ÃÃFÃ0DÃP’Ãð‰ÃsÃÐGà #ÃÃüÃ.ÃàzÃpWÃmÃP†ÃàhÃàà ˆÃð›Ãà˜À¨Ã0ÓÃÀµÃÐ_Ãð¹Ãð³Ã0PÃð<ÃÃ@ƒÃ0\àöÃð³ÃÐeÃpìÃà’ÃÀ¯Ãð¿ÃPÈÀ+Ãà à šÃ`<ÃààöÃÐÃÐâÃ@eÃsÃ`ÃPÃ0Và  àäð Ã0ÓÃpÃàŒàÃÐâÃ0ÍÃ`BÃ0ÓÃXÃP¤ÃÀµÃ0\Ãà ÃÀ àÞÃ@eÀ%Ã@àäÃ0bðŽàÀ1Ãð³Ãà€ÙÃ0DÃ`BàsÃÐYÃÛÃP˜ÃLÃpWÃ0>ÃXÃÀœÃàzàØàØÃÉÃXÃP¤Ã@qÃöÃànÃÐAÃðÃÐèÀ%Ãð§Ã08ÃÃÃÀ8à ¸ÃðËÃFÃÐÊÃFÃ0ñà‹ÃàÃ@eÃP-ÃÃpàðóà šÃFÀ¨ÀŠÀÃÐAÃs÷Ã0ÁÃÀ Ã0VÃ@ôÃPªÃ0ÙàsÃdÃ0åÃðTÃ0\Ãð•ÀÃPÃÐSÃ@wÃLÃÀð”ðÃðÃð¡à ‚ÃÀ!à ÃêàäÃð*ÃððùÃàýÃоà à  ÃPÀ„ÃPÃpæðjÃð‰àUÃàýàüÃÃ`NðpÃäÃP˜Ã@ÐÃpÎÃÀ¯ððÃ0µÃðÃÐkÃÀ¯à ŽÃ`<ðóÃ7$àIÃpiÀÃðHð à )ÃÀ>Ãð$Ã`0Ãð•ÃÀÃ`HÃRÀñÃ(Ã@MÃPzÃP¤àêàäÃàÃP€ÃO ðíÃPžÃ`6Ã@_ÃÐAÃÐYÃÏà ÃÞÃ…ðˆÃð¿ÃÏÀŠÃ@îÃPªÃà’ËÃmÀûÃP÷ÃðÃ@âÃp? à àsà  ÃÐÖÃÐwÃ0ÓÃPÃðÃpoÀÃ`<Ãð­à  ÃðÀÃ@ÃmÃ.ÃpÎÃÏÃPÃÀ—Ã@ÜÃ(Ã`­ÃP ÃPÃÀ—À ÃmÃ`BÃdÃpQÃ@ÜÃ@úÃàzà /à ;ÃðÃÉÃ`NÃàŒëà ÃöÃàð ëÃP Ãð0ÃüÃàÃ0ÁÃð*ÃP!àÃð§Ãð‰ÃP€ÃÀ¯Ãp{ýÃ@à ¦Ãð0ñÃP ÃsÃ`<Ã(ÃÃÛð à ¦Ãð$Ã0µÃPŒÃP ÃàÍ!Ã:Ã:ÃêÃP€Ãð*À¢ÃÃð<Ã0ÙÃ`ËÃÐÊÃüÃ@kÃ`*ÃP À„ÃRÃÕÃP€À`!Ã0>à ¬ÀœàØÃÐSà ÃçÃ@wà ÃpWÃ`³ÃpàÃöÀÃpæÃà÷ÃFÃLÃÀ>ÃPŒÃêà  ÃÕÃà†à  ÃêÃpcËÃð<àgÃð•ÃäàaÃáÃ@YýÃP†Ãà†Ã`<ÃÉÃÀDÃÀDÀ+ðšÃÐÐÃ4Ãpìðˆðð àmàgÃ0bÃ0ÇÃð­ÃÐÖÃÀ©ÃFà Aàgà ÃpàÃ0Dð ÃRÃÐÊÃP'Ã0ÍÃÀ&À~àöÃàðšàÒÃððËãÃàŒÃ02ÃÀÃÀ,Ã^ÃÐôàaÃ@èÃ0µÃRÃüÃðÃÀÃ`›Ãð•ðÿÃp? ÃÃоðvÃ0»ÃÀ&àêÃÀ‹ÃàV ÃÀ Ã@ÐÃиÃ0µÃ@SÃ.à ÿÃðÃ@eßÃPzà7 Ã@kÃ@ÃÀÃ[à ÃðÃ`ÅÃÀÃàÃàñÃ0ÁÃP˜àäÃ@èÃP’ÃàýÃ@Ä ÃPë Ãð ðÃ.ÃPÃàñÃ@MÃ0&ðç÷ÃUÃpKÃÐ)!Ãв÷Ãð¡Ãð›ÀlÃÀà ùÃÀ… ÃpÔà ”ÃpÚÃàtÃ`¡Ã0 Ã@eÃð›ð ÃpìÃÐ;à´ ðÿÃðÃUà ˆÃàßÃPýÃàzÃP†ÃPë Ãp3"ð|ÃÉÃ4ðçðáà7 ÃвÃ@ÜÃÐ/ ÃpcÃ0>à ÃÐYÃ`0Ã@Öðvà[Ã@kÀéÀrÃà\Ã0>Ã0DÃðƒÃp? ÃpàÀûÃP˜ÃÏÃ@àÞà  Àõà1!ÃÀ‹Ãà’ÀÃÀÃàñÃÃöàÆÃLÃ`ÅÃÐÊÃpÚÃàëÃðƒðpÃPýà ŽÃÏÃð<ðÃàzÃððóàºÃpÂÃ@¸"à Ã`ÅÃð³ÃàIÃPñÃ0DÃ@kð|Ãà Ãð‰Ã0 ÃàßÃ( ÃsÃPðàÆÃ` "Ã@G àCÃp¶!ñð|Ãpuà  ÃêÃÀ!ÃpÂÃÀ Ã` Ãp¼ ÃÀ!ÃД$ÃЈ&À×"à ^$ðÕ!ÃPß"à ½)ÃP£,ÃPµ)ÃPµ)ÀT#ð½%Ã`Ö*Ã?-Ã0O-ÃpÓ1Ã3/Ãày/ÃÎ*Ã`Y*Ãc'Ã@ˆ*ÃP—.Ãpn-Ãp€*Ã@(ÃÐj+à (-ÃP˜ÃÀ¨/Ã'1à “0Ã4ðo2Ã`¬1Ãp÷+Ãð;+ÃÀº,ÃÀ¢0ÃP.à “0Ãx.ÃpÙ0Ã0O-Ã012ðo2ÃÈ/Ãð/-ð{0ü-ÃP2Ãз3Ã05Ã0%4Ãàs0Ã0a*ÃÀÀ+ÃK/Ã92Ã@Ã5Ãàs0Ã×3ÃZ3Ã`/1à 0Ãà…-ÃP-ÃÐ@2ðì2Ãàs0ÃÀ–2à×/ðþ/Ã-0Ãàð0Àw2ÃÐÏ/ÃQ.Ã0Ì-Ãï/àH2Ã@Û1Ãé0à /ÃZ3Ãð2Ã-0Ã`¸/Ãph.Ãð0Àƒ0Ã9.ÃÐp*ÃÐÏ/ðo2Ã0À/à /ð-Ãpå.ä1àl,Ãð¾*À•-Ãð¬-Ã`Y*Ãà.Ãðš0Ãð5,Ãà…-ÃP/à ".À‰/Ãà£(Ãp )Ã-0Ã@Û1ðø0À}1Ã],Ä,Ãà…-à F(Ãc'àï+Ãð#/Ã@p.à ±+Ã0Þ*À0Ãàü.Ãp÷+Ãà,ÃÐj+Ã@‚+ÃP.Ã0=0à ".àõ*Ãàµ%Ãp†)ÃE,Ãã1ÃÐÃ1À<'Ãð¾*àl,ÃÐá,Ã`Ð+à 'ð:&Ãà+Ã@ó-à 3ÃP&,Ãð¾*ÃÀ®.ð .ÃÐp*Ãð).ÃP-à Ã(à +ÃÀ´-ÃP2*Ã`S+À•-Ãà-Ã@ÿ+À$+Ã{'À**ÃÀO)ÃÐá,Ãàü.ÃÚ,À§*Ãð¸+Ãpn-Ã~-ÃP.Ãð²,Ã`Y*ÃP>(Ã0Ì-à ¥-Ãð²,ÃP£,ÃÀU(ÃQ*À,Ã0Þ*à L'Ãà,'Ãà'Ö)ÃÐí*Ã@'À¿&ÃÐ'ÃÀa&à Ã(Ãì)Ã0ü%ÃP8)ÃÀÌ)ÃÐç+à ½)Ê+ÃPJ&ð:&Ã`â(Ãàm1ÃÔ)ÃðM(à ½)ðŸ*ÃK+ÃðG)ÃP»(Ãð_%Ü(Ãpå.ÃÀ=,àõ*Ãpz+ô$ÃðÊ(ÃÐó)À¹'Ãà£(ÃðÐ'Ãà,Ãð¸+à)Ã0…$ÀN$Ãu(à 'Ã@”(ÃÀU(Ã`!Ão%ÃÐv)ÃðÊ(ÃpŒ(ÃðÐ'Ã@(Ã0ê(ÃÀI*Ãð¾*ð()Ãp¼ ÃÀê$Ãpž%ð()Ãpž%Ã{#Ã0y&Ãph.ÃÐá,Ã`q&à L'à á#Ãà¯&ÃÀy"ðR"Ãà\ÃPn à 'Ã0y&à„(Ão%ÃðY&ÀH%Ü(Ã$Ã0—!Ãà»$Ãàµ%à Û$ÃÐ &Ãpž%à Û$Ãp¤$Ã@ &ÃР"Ã`î&ÀH%ÃÀm$àï+Ãà,Ãp(ÀZ"À×"àœ$ÃPÍ%ÃÐ$Ã$ú#Ã7$Ãø'ÃP8)à Û$ÃPÍ%À<'Ã`î&Ãà&(Ãà¯&ÃÀ['Ã0y&à$ÃPÙ#ÃPb"à%ÃÀÃвÃà£(Ã](ÃК#Ã0#ðL#ÃPP%Ãðk#à–%Ã"ÃÀê$À×"àºÃàJ"Ã0y&Ã@'Ãðî"Ã@ÊàºÃP\#Ãàµ%Ã%'Ã$Ãu(Ã`è'Ã"à=ðùÃàÍ!ÃЂ'Ã`î&ÃД$Ã@¦%Ãðè#ðÕ!Ã@¬$Ã0$ÃЦ!à á#à R&Ãpª#à ÿÃ0>ÃàÁ#Ã+&ÃàD#ÃàÁ#à¨"Ã0£ÃpÎðáÃðk#à¨"Ã`!à+"Ã`• Ã`‰"ÃÀy"Ã+&Ãðq"ÃР"à¢#à p!Ã( à !ÀrÃpª#Ãðk#Ãp&ð+à ^$ÃàbÃð$Ã0ÙÃPÃ@ÖÃÀð#Ã`î&Ãðw!ÃÀ‘ÃpÔÃpÈÃ@Yà !à ‚ÃPtÃ@A!Ã`ƒ#ÃPV$Ã°Û Ã€lÃ` Ã@;"ÃÀ Àã à ó À×"Ãp'$ÃÀö"Ã°Û ÃPß"ú#ðáÃÆ!Ã`!Ã@G Ã@A!ÃР"ðÕ!ÃÐ)!ðF$à&ÃPÍ%Ão%Ü(ðÏ"Ãà¯&Ãà&(ÃÐ)!ÃpEÃ0µÃ( ÃàV Ã@ÜÃÐ)!Ã`›Ã0&ÃЬ Ã`$ÃàJ"Ã=#ÀïÃ@²#ÀH%à ÿÃaÃ`§Ãàßà´ Ã` Àf Ãp¼ ß!àÀÃàÙÃÀy"Ã@ÊðÕ!Ã"À`!ÃÀö"ÃÀg%Ãþ"ÃPb"Ã@5#ß!Ã`§ð‚à ŽÃК#ÃÀÞ&à í!ÃØÃ@ÊÃ@5#Ã0‹#Ã0%Ãð‰Ãðú ðÕ!ëðÃÐ_Ã`›Ãð_%Ãp-#ÃØà Ãð ÃÐ/ à ó ÃÀÃ@;"Ã0 Ã@YýÃ`*ðÿÃPýÃ`¡ÃÀ!àIÃð•à ˆÃðú Ó#Ã@Ä ÃоÃpQÃà\ÃPzÃ@Üà ˆÃðÃäðdÃpìÃ@ÐÃ°Û Ã=#ÃÀs#à ùÃÌ Ã 7 ÃànàIÃpàÃP†ÃÐ;ÃPtàÒà ÃpÎÃ"Ã0JàÀà ðçÃP’Ã4Ã`0à[ÃÀ>Ã`àºÃ ÃàhÃ0ÍÃàñÃLÃp¼ Ã¥Ã0DÀ„Ã0&Ã0"Ã0,àIÃpÈßà7 Ã0!àÆÃ.ÃÀ£ÃÀ ÃUàºÃÀÃÐMàÞÃàýÃPÃ`*Ãàåð|ÃPÃð›Ã0>ðóàÆÀ Ãpcà àÀÃ0£ÀïÃ@SÃ`6ÃÀ&Ãp]Ã`!ÃР"ÃÀÃàÙÀxÃÀ»ÃÀ¯ÃàñÃ0»àºà%#Ãðƒð‚ÃêÃÃð•Ã@YÃmÀ~Ã(Ã@Üñà ùÃÐ5ðóÃp¶!Ã0#à ˆÃ02ÃgÃP†ÃоÃpÔÃPžà )Ã"Ã@kÃððÃ`ËðˆÃ`0Ã0!ÃðÀð^ ÃК#Ã0©àIÃÐGÃPýÃÀÃ@ÊÃ"ÃЦ!ÀT#ÃÀ—à ÿÀ ÃðÅÃÃÃÐÐÀ ýÃЦ!ÃPzÃO Ã0!à |Ã(ÃÀ Ã@ÖÃ0"Ã@¾!Ãð•àØÃ0JÃØÃÀ‘Ã(À~ÃpEýðjà ðùà ŽÃPn à¢#Ãp¼ Ã02Ã0&ÃðÃÀü!Ã0 ÃÀÃP Ã`$ÃP÷ÃpWÃÐÖÃP†ÀïÃ@G ÃиÃð à+"ÃÒÃоÃÐÄðíðX!Ãð Ãð à ŽÃÀ>Ãðà´ Ã@¾!ÃÀ,ÃpiÃ0»ðjÃ`›ÃP÷Ã@îÃ:Ã0—!à$Ã@²#ðáÃð‰Ã ÃÐÄÃÐÜÃP˜Àf Ã`‰"ÃðvàIÀûÃàhÃpÚÃL÷Ãà€Ã`$ÃànÃÐSÃ02ÃPh!ÀlðçÃàhÃ`¹ÃÏÃ`*ðÿÃ`BÃ@qÃÀ»ð‚ÀõÃ@Yà Ã`!ÃÀðdëÃðÃðà šÃ@îÃ0µÃð$ÃàÃpàÃpWÃ@eÃLÃXÃpìà #ÃP°Ã0VÃmÃðÃpÚÃ[ÃàëÃpÚàOà ¦ðjðjÃÐAðùÃàtÃðÃ¥ÃêÃäÃÀ»ÃPÃpQà ó Ã@âÃÒÃÀ‹Ã0»ÃpÔÃ0—!ÃàV ÃöÃ`*Ãð} Ãà\ÃÐMÃÀ8à á#ÃàÇ"Ã0©Ã@eÃÞðpÃ(Ã`$ñÃð›Ã@YÃÏÃ0&Ã0ÁÀïð|ÃàÙÃ@Mðçà1!ÃðÃàzÃ@âÃpÂÃpÎðóÃpÎÃ4ÃpWÃ(Ã( Ã0DÃÉÃP€Ã@ÖÃÃÃ`$ñÃPñÃ@ÖÃ@eÃð›ÃЬ ÃpKÃà†ñà ŽÃÐÄÃÉà v à ó Ã`¡Ã`• Ã4ð|ð|Ãp]Ã0¯àIÃ@Ãð­Ã@ôÃð•à v ÃÀ!ð^ Ãàåà šÃ`HÃgÃ@kÃ@ðíÃ@;"Ã@ÐÃ`ËÃÀ2ÃFÃpKÃÐÊÃðÃàÃвÃÀÃ@ÜÃ`›ÃðÃÐÊÃpÔÃ0,Ã@ÃLÃP÷àÆÃÀ©ÃÀ©à1!ÃpWÃpòÃð$Ã`¡Ã$ÃðÃð0Ã`ÝÃà AÃ0DàØÃàñÃpààgÃpòÃà ”Ã`¿ÃaÃà\ÃpEÃp? Ã0µÃp]ÃpÎÃ0ÇàäÀ„Ã`¿ÃP˜À„ÃÐÐÃP˜ÃÛÃ0JÃð³ÀœÃ@îÃPÃ0>Ã0ÓÃ…ð àäÃp{à à  Ã0JÃd÷Ã0ÍýÃ0ÁÃÐ;àIÃ0JÃ@eàÒÃØÃ02ÃsÃÐ#Ã.Ã`¿ð Ã0\à ŽÃÃüÃàžÀ%ÃÐSÃ0JßÃpEàÆÃ.Ãáà )ÃPÃpøÃð›Ãð¡ÃPÃ0PÃpKÃÀÃ:ÃÐkÃpiðˆà ÃÃÃ@ÃÀPÃ`Ýà /ÃÐeÃðÃ0JÃ`BÃPªàaëëÃ@âÃ`<à ÃÀýÃÀ¯à[Ã0ÇÃÐAàÞÃ0åÃð³Ã0ÓÃÀ ðvÃÐSÃÀ©Ã[Ã08ÃÃÐGÃpcÃÐÜÃPŒÃPÈàüÃðÑÃàà ÃP Ã@qàà ²Ã0ÍÃ`TÃÐSÃ.à šÃ:Ã`HÃÐîÃP˜ÃÐÊÃ`*ÃàtÃÿÃçÃà AÃ0\ÃÃ@_àIàUðˆðÃ`NÃÀ8Ã4àäÃà÷Ãð­ÃP'Ã0ÓÃPÃ0µðŽÀ¢Ã@wàðð)ÃùÃ@Ã0ÍÃ^à 5Ã0\à ¦ÃÀ,Ã@_Ãðà ;à 5ÃÀ Ãyð‚Ã`HÃP¤àêÃð›Ã.À ÃÀÇÃð³ÃÉÀ„÷ÀÃ`6Ã`¿ÃÀ»Ã`ãà ²ÃmÃàbÃPÃÐôýÀÃÃÃàtàöÃð§ÀÃP'ÃpìÃ`¹Ã0ÍÃ@îÃpÚÃÐAÃÐYÃð­ÃÀDÃP'Ã@âËÃ0ÇÃÀ¯À–Ã@qÃpcÃP!à ¸ñÃÀ2à ¦ÃÐeÃÃÀ ÃpKÃ@YÃ@wÃ0>Ãà€ÃÐÖÃàŒÃPàUÃpòÃpìÃÀ£Ã`6ÃÀÇÃ`<Ã0 ðdÃ@qÃÀ¯ÃÀ&àCÃ`6ÃоÃ@qÃÐGýÃð$ÃàzÃÃÃLà ¬ÃðBÃÉà7 Ã0JÃÏÃÛÃð§ðóð‚ÃÛÃ@èà ‚ÃpÈÃêÃüà Ã4ÃÀ©÷ÃànÃÃÃpÈÃP†ÃLëÃ0ÇÃ@qÃsÃÐeßà=àÒÃP¤ÃÐâÃ08Ã0»Ã`Hà )Ã^ÃÐÐÃPñàÀÃ02Ã@ÜÃð³àmÃPýà ”ÃöÃP’ÃÀPÃÐYÃpÚÃàtÃpoÃànà ŽÃàtÀŠÃ@wÃ0bà ÀÃ0»à #ÃPŒÀïÃ`$à[Ã0DÃÐAÃ@ÖÃ0ÇÃêÃÀÃÏÃÀ,ÃÐ_Ã`­Ã@YÃgÃ`<ÃPžð‚Ã@ðíÃ`¹Ãð¡ÃàtàØÃFð‚Ãð›àUÃð§Ãà€Ãð*ÃÐÄÃpEà Ã@àÒàØÃðÃ0¯Ã`ÅÃXÃàÃ`›à ÿðÿÃà†ÃpæÃ.Ãð•ÃÐMÀ„ÃÀ©à[àÒÃð6ÃÐâÃ@ÐÃàbÃÐAÃÐâÃÉÃàhÃÀð Ã0JÃ0µÃ`0ÃÐÄÃÏÃÀ©ñÃàà ÀûÃ@ôÃ`BÃðÃ`­ÃpWÃÀ+à ¦àØðŽÃÀµÃ`0Ã0,ÃànÃpæÃPÃpþÃP'À%ÃüÃP'ÃÉÃð¡ÃPýÃ`0ððÿà ¸ðÿÃÐÜàüÃà†Àã À~Ã.Ã@ Ã0ßÃpÃsÃàýÃÀ2ÀÃ@à ¬àØÃ@qËÃÀ>ÃàzÃÀ!Ã@Ä Ã@MÃÀ2ÃpÃàñÃÀð÷ÃàÃà  ÃPÃÐÊà ¬ÃRÃÐÜÃÀÁÃÃÐâðóÃ0ÍÃ0ÍÃpiÃRÃöðÃÃðÅÃ`fàöýÃ:ÃpÚÃð¹ÃÏÃ@eÃ`6ÃXðÃð¹ÃÐÜð À1ÃpÃ02ýÃP'ËÃ^ÃÐÐÃ¥ÃpòÃ`NÃàŒÃÐ_à ²ÃgÃP˜Ãð<ÃPÂÃ@wàÞÀœÃ0ÍÃð6ÃpiýÃmðšÃP’à àðÃpiÃ0åÃ@›À+ÃFà ¬Ã``àÃð0ÃÐeÃ@eÃð6ÃÀÍÃRÃpþà ¸Ã@}ÃPÃÀ»Ã@eÀ~Ãp{ãÃ2àüÃ@ÃÐYà ¦Ãð6ÃÕÃÃÃP¤ÃdÃ^ÃpuÃpøÃ@ÃpþÃ`BÃP-à ¸Ã@ƒÃÃàÞÃp ÃpÃpuÃp{Ã0PÃÀ£Ã@èÃÐèÀ1ÃÃ@èñÃ0Çð à 5ÃÏÃpàÃð6Ãàtàêð àÞÃÐÜÃÐîÃ@ÃXÃðÃàà ¬ÃðTÃ^ÃPÃàzÃ0JÑÃ@Ã@}Ã@ÖÃà€ð ÃÀ£ÃÀ,ð‚ÃXà ¦ÃÐwÃ@úÃ@ÃÐ_Àð àÌÃ@âÃpìÃÃp{Ã`ÅÃP’Ãà ÃÐ_Ã0PÃ`ÅÃPýÃ:Ã@ôÃ@qÃ0>ðÿÃ.ÃÐSÃÃÀ2Ãð¹Ã`BàÞÃÐSÃÐ_ÃÐÖÃÐSÃ@èÃð¡Ã`³ÃÃsÃ@ Ãà†Ãð*Ã`ÅÃPýÃ`§ÃaýÃpÚÃ@îÃÐÐÃ`ËÃpìÃÐÖÃÞÀ ÃÐ_ÃFÃÐkð¬à 5Ã@qÃÛàêÃð§ÃäÃà÷ðíà Ãð§Ã`ÅÃÀÃRÃ`³ÃØðóàÆÃÐÖÃà ÃLÃðÀŠÃðÃ@úÃ@Ãà-à ŽðjÃÛÃ@ôÃP€Ã.Ã@âÃ@úÀ%ÃÏÀÃP˜Ã`<À„ÃÀ àUÃ@èÃ0>Ã@úÃ…ÃRà ”àÞÃÃðËÀxÃàåÃÀµÃ@ ÃRÀÃ@MÃÐÊÀà Ã@eÃð§ÃLÃPªÃP Ã0>ÃdÃÀ»Ã.à  ÃÃÃPÃð•Ã0ÇÃÀ8àyÃÀ8Ãpæð‚àðÃ@qÃÐSÃyàöÀ+Ã0JÃPð|Ã:Ã@ÃÀ©ÃpQÃð›àOÃP÷ÃPtÃP’ÃÀ©ÃPžà ÃÐèÃð*àIÃð§ÃðÅÃ08ÃP ÃsÃXÀŠÃÐYÃPÃ@ôÃFÃpòÃ08ÃÀ… ð ÀœÃ0VÃ0bà #ÃPŒðÃPžÀÃ`NÃÃà ÃpàÃyÃ0ÍÃP˜Ã02ÃöÃpìÃÐSÃÐÊðŽðˆÀÃP˜ðà ÀïÃ@ÃpøÃ`§À ÃÐYÃÀ¯ÃFð|ÃØÃÀ ñðùÃ@qÃð¡ÃpøÃÐSÀZ"Ãð Ã.ÃP†Ã0,ÃPýÀxà šÃ`BÃð¿ÃpiÃPýÃÀ‹ÃànëÃÀÃ:ÃÐ;ÃP˜ðóÃpWÃP’ÃäÃÐÜàÞÀÃPzÃPàgÃà†Ã`³Ãp]Ã`¡ÃÐAÃpÚÃÐÊÀ–àØñÃ0Óà ”ÃpÚÃð*ÃRÃPÃàtÃyà  Ã@qÃ`0à ŽÃ@âÃP€ðíÃÀÃÃXÃ0ÁÃ0¯ÃàbÃä÷ð‚Ã`¡Àà )ÀœÃPÃpàÃêÃ`×Ãà ÃðÃ@SÃ@Ã@ôýÃÐúÃà’ÃðÃpÚÃ:Ã`fÃ`HàêÃRÃ0\ÃFÃPŒëÃpuÃP˜ÀœðÃðÃ0bÃLÃP'ÃÀ,ÃÃÃp Ãð¹ÃXð#Ã`×ÃpàÃàtÃP’ëÃpÂÃÀÃ`¿÷Ãà÷Ã`³ÃPžà  Ã0>à ²ð#Ãp‡À+ÃàzàÒà #ð|ÃàÓ ÃPýÃ0ÓÃÀ,Ãð›Ã@ÊÃÃÃÀ¯ÃÐÜÃÀ,Ãp{Ã0nÃpÃpoÃ@à Ãð³Ã@ôÀéÃsÃyàgÃð0Ãð›ÃÃÃÃà ¬à  ÃÀ,Ãà€Ã@ƒÃÐâÃ0ÍÃPðŽÃà˜ÃðHàOÃÐ;à ”Ãð§ðˆàðà Žà |ÃÀµðÃ@eÃ`­ÃmÃÀ¯ÃàtÃ`¿ÃpKÃüðŽðŽðóÃ"ÃPÃÀðdÃ@YÃÐ5àØÃÏÃðÅÃÐkÃ@ÃyÃÃÃpÔÃÃÀÃpàÃÀµðŽÃðÃ@ƒàü÷ÃÐ/ Ã¥ ÃðÃ@wàÀà à  ÃÐSðçðóàÞÃÐÄÃà÷Ãþ"Ã¥ÃÃÐ Ã0 Ãà-ÃàzðÃàðÃpæÃ08ÃÐÊàÌÃ:ÃðÃÀ©Ãð$ÃêÃ0DÃP’÷ÀÀ+Ã@ôÃÐ5Ã:ÀlÃpKàyÃùÃ@eÃPýÃüÃdÃ0ÓÃpàÃ0DÃàt÷ëÃàëð|ÃÕÃÐÖðÿà ¸ðÃpiÃð6ÃÐkÃÀ£à ¦Ã0ÓÃà†ÃÐYàÀÃð‰Ã0>ÃÉÃ`ÅÃ`ÅÃP-ÃP’ÃÃÀ£ÃPÃPtÃðÃüÃPžÀ–Ã0PÀœàêÃð¡ÃÀ ñÃð­ÀºÃpøÃ@Mà Žà ˆÃ0DÃPŒà ÃP àÞð#ÃPÃ0ÁÃ:ÃP-ÃÐSÃð•à[Ã0ÓÃð•Ãà˜ÃPžÃ0>ÃpiÃpcð‚Ã0µð‚Ã"Ã@}Ãà’Ãçð”À„à ÃÐkÃpøÃP'ÃààOÃpàÃp]ÀÃ`6Ã"ÃàñÃð­ÃÀÃ@ôÃ@âÃ@}Ã.à ŽðpÃðÃÀ&à Ãð$Ãà†Ãp]ÃpÚðà ÃÃ0åÃPÃàÃsàsÃpoðŽÃ:Ã0JÀÃRÃÀÇðˆÃpÔÃpþÃpÀÃ`BÃÀ£Ã0VàÞÃ`ÑÃð<ÃjÃPªÃ`ÅðŽÃ0ÓÃÐ_ÃànÃà Ã@ ÃpòÃ`ÑÀÃ0JÃÐÖÃ¥ÃàÃP!Ã@îÃpæàUðˆÃ``Ãð*ÃPÃpÃP˜À¢ÀÃðÃPŒÃð$ÃFÃ`ÑÃpàÀàÞÃÀ»Ãpià ¦ÃüÃsÃyÃpòÃÐqð ÃÃàðŽÃ0ÙàÞÃ@ÖðˆÃP˜ÃP-Ã`ÝÃ0ÙÃ`ËÃmÃ@èàyÃ0ëÃÀ»ÃàmÃðBÃÐqÃ`ÑÃ0ÁÃÐÖÃüÃ^Ãð*ÃÐÐÃàýÃ0ÓÃÀ8Ã`¿Ã@eÀ àÃPÎÃRÃ@ƒÃ…ðà‹ÃÃÕàOàêÃPÃ…ÃpòÃPžÃÐ_àsÃpòÃвÃ`¡Ãyàyð¸Ã0zÃà'Ã0bÃÐ}Ã.ÃäÃsÃÏÃÐ_Ã@}ÃðÃàtßà šÃpuà ¾à  ÃÀ&ðÃÀ2Ã…ÃPŒðpÃ@kÃð›ÃÐîÃP'Ãp? ÀrÃ@ÃÉËàIÃ¥Ã`NÃ`ÝðˆðÀ¨àðÃð§À„àIÃ@èÃ`ÅÃÀµÃÀŠÃpÃ0bðÿÃ(Ã@kÃÐkÃà ÃàÃÏÃànàÀÀÃ`³ÃÀÃ0 ÃÐAÃ@Sà šÃÛàOðóðšÃÐkÃpKà Žà ”ÃÀ,à 5ÃÉÃ(ðùÃ0>Ã4÷ÀÃàbÃà\ÃàýðÿÃRà  Ã4Ã0ÙÃð¹Ãà’ÃàhÃ@SÃàÃpøÃÐSÃ@ÜÃ0JÃ`­ÃðÃ`0Ã4Ã@_Ã0»ÃpEÃàßðjÃ`NÃàýÃ@ôðˆÃÐÐÃ`6ðÃ`NÃPªÃpuÃàëà Ãð§÷à šÃyÃðÃàäÃ@à ²ÃÀ Ã0ÇÃ@qÃyà ¦ëÃ@âÃ`ËÃ@îÃPýÃ@_àsÃÏÃgÃ@YÀÃÐAÃLðó÷ðvÃàzÀÃ`6ðçÃP’ÃÐ_ÃÀ,ð|ÃоÃmÃÀ,à ”Ã@ôÃ@èÃpuðÿÀÃRÃÀDÃÐSÀ+àsðÃðú à à ŽÃ`*à[ÃàÃð­Ã@wÃààsÃdÃà†ÃÀ£à šýà Àà ¦Ãð6ÃÀ8Ã`×Ãð³Ã0ÇÃÀ»ÃpòÃpÚÃÐâÃàýÃpìÀ+Ã0\ÃÀÃPýàaÃPªÃà ÃÐÄÃð›ÃÐÄàÃÏÃð­ÃÐYà  ÃP-ðÃpoà /ÃpiÃ@èÃ`³ÃLÃ@ÖàaÀÃ@eÃ@SÀÃ08Ãð$Ã^Ã@ðóàIÃ.ÃÐeÃ@à ÃàëÃàððˆÃ(Ãðà Ã0»Ã@qÃàtÃÀ—ÃP€ýðà ¬Ã"ÃðÃRÃÀÇÃpìà Õ%ÃPtÃ`ËðÿÃà’àmÃpìÃð¡ð ÀœÃÉÃmÃ0Dà #Ã`TÃð¹Ã@ÃàÃ@ÃàÃêà ÃÐ_Ãà˜ÃÃpÎÃÐ;Ã`Tàsð Ã(Ã0ÓÃÃà¤ÃpæÃpÚÃÐeÃÐèÃp ÃÀ,ÃÃ`³ÃÀÀÃÀÇÃRÃpðšÃÕÃ0ÙÃLÃ0\Ãð­ÃPÃ0,Ãà€ÃÐeÃ@ƒà ¸ÀðÃ0ÓÃ0ÙÀ´Ã0hÃÃÀPÃ|ÃpøÃpæÃ@}ÃÐ}ÃÐâÃÐÊÃàzÀà ÃP-à /Ã@_ÃpoÃÕðvÃÐ_ÃóÃpÃpuÃP¤Ã0DÃ0ÇÃPžÃÀ8ÃðÅÑÃp{Ã0ßÃ@ƒÃÉàmÃpøÃÐ}Ã@ àöÃà˜ýàyÃdÃ`<ÃÐSÃð¡Ã0VÃP¼ÃLð ÃðËÃÐwÃp™ÃP3ÃP˜àà /Ãà÷àmÃpuà ²Ã0PÃÀÁÃP¼ÃÀ»Ã@ÃàzÀ%ÃPàÌðÃðÅÃðHÃð¿Ãð*Ã@qÃÀ»àðÃ`BÃ4ÀÃÐÐÃmÃpòÀ+Ã`fýÃ0bà ¦Ã.àØÃ0\ÃðBÃàŒÃ`BÃ0¯Ãð$ÃÀÁÃ^ÃPªÀ+Ã0ÙÃíàü÷àØÃäÀÃð*àUÃ0µÃ0JÃ`¿ÃðÃÃ0bÃ0ÙÃRàsÃpìÃÐÄÀŠÃàðÃyÃp]ÃPÃÃð6ÃÃ@úÃ`ÅÃ@wÃð$ÃFÃöÃpòÃÃà’ÃÐúÃÐqÃäðÃP¶Ã`TÃ`<ÃP’ÃÐSÃpÀCÃsð‚Ã0DÃÐGÃ0JÃ…Ãð¡à[ÃÀ2Ãð›ÃÐèð|Ã@eÃ@ƒÃЃÃ@}Ã`³ÃPÃpÚÃpWÃpìðŽÃP’Ã@wÃà€ð ÃPÀÃðNÃ@eÃ02ÃðÃpæÃaà ð|ÃsÃFÃ`ÑÃÐkÀÃgÃ`¿Ã@•ÃÐÜð|ÃÐMðÃ@âÃ0PÃð­Ãð›ÙÃ"ÃÐúÃP¼Ã0÷ð¦àäÀð¦Ãp ÑÃPžÃÐâðšÃÐSÃpÈÃêÀðšÃFÃ@ƒÃÐeÃ@wÃÐSÀÃÃà ¬ÃÛÃLÀÃ`ÑÃpòßÃ…ýÃ@ôÃà†ðjÃpìÃP˜àaÃpÚÃP˜Ã^Ã(ÃÐ;ÃÐ;àäà  Ãð ýÃÀ2àUÃàhÃ"ÃÀ—ÀïÃÐÄÃÐ;Ã08Ã`*ýÃàåàÒÀ„Ã`0ÃÐÄÀéÀrð ðùÃ`!ð½%ÃÀ… Ãð$Ãà€ðùÃ@qÃÐÊÃ@ÖÃPžÃÀ‘ðR"ÃPñÃ¥ÃÀ à ŽÃð•Ãàzà à  ðóÀ`!à=àIÃgÃðà ‚ÃàJ"ëÃð•ÃÐ)!ÃÐGÀ~Ã`¹ðùÃ`*ð|ÃðÃ@YßÃ0PÃÀ&ÃоÃ@YÃ0ÇÃððáÃÃ`Hà[Ã@kÃà÷ðvÃP à ð|ÃàbÃÀ!Ã`¡Ã@_ÀŠÃð*Ã`›Ã.Ã`$à |Ã`¡Ãðú ÃPtÃP€Ã4Ã@èà ‚Ã`§Ã@Öà ÿàºÃ#Ã°Û Ãðà ˆàºÃÀÃpEÃPýÃ@_Ã@ÐÃÐAÃàÍ!ÃÐAÃ@YÃàP!ÃàåÃàtÃ@;"ÃàV à ˆÃÐ#"ÃоÃ0!Ã@SÃà àºà v ÃpWðáàaÃÐÐÃaðÿÃ( Ãðà ”Ãðô!à ÃsÃàñÃÀÃÃÃÐÊÃà€Ã@îÃððjà ÿðX!àÌÃp]ÃЦ!ÃÐ)!ÃÀÃ@ÖÃ"ÃäÀðÿÃpKàºÃàÓ Ã0µÃànÃÐYÃÞÃÐÄýÃ@_ÃpøÃÀåÃàÃÐÊÃ0,ÃaÃðÃLÃàÃP’Ã@SÃ`­à[ÃPýÃÀ—ÃÐÐðjÃ`TÃ`<Ãp]ÃPzÃààØÃLÀ„Ã#Ã0©Ã`­àØðÃðÃðÃ`³ÃPŒÃÀÃÐSÃÏÃLÃ@îÃ(Ã`¹ÃÐMðˆÃ0DÃêÃ@SÃÐYÃÀ£Ãðw!Ã0¯ÃÀ!Ã0¯ÃRàäÃÐîÃ`ZÀxà1!Ã@âÃðÃÀ&ÃPžðŽà ²à ”à #À¨ÃðàÆÃàñÃ02Ã0ÍÃàñÃиÀõÀ¢Ãà˜ÃáðÃ4àÞÃð•Ãð‰à ùÃpàÀŠÀlÃ0µÃàhÃyà ˆÃ.Ãð$ÃÀDÃ@kÃ`Bð|Ã`0Ã(ÃRÃP’Ã@_ÃpÂýÃ…ðçÃ.ðpÃÐAðšÃÐÖÃÀ&ÃÀ»Ã¥ÃpiÀõÃÉðšàêÃXðÿÀûÃðƒÃ@îÃ`¹Ãð­ÃpcÃ0Dà  Ã0DÃвÃ02ÃðÃ(Ã@Sð|àÞÀ`!Ã0©à ”ÃàhÃPÃÐÄÃ`*ÃàÙÃp? Ã@Ä Ã =ÃÐÐÃðÃÐ)!Ã@ÜëÃ0,Ã@wÃð›Ã"ÃÀ&à Ãàðjà1!à=ðpàað‚ðÃPÃà÷ðdðvÃÀDà ¦à ÃÐ5Ã0PÃ`BÃP’ÃàhÃ4Ã`¿ÃÃÃ:ÃànÃð›àØÃð­ÃÀ,Ã0ÙÃ@úÃ@úÀ„Ã@ÐÃpÎÃ`¡ÃÐ_à ”ÃÐ5ÃmÃð§ÃàhÃêÃÃ`­à Ã@eÃð ðpÃp? ÃPzà ŽÃÀ ðÿñÃ0µà ‚àÒÃð$Ã0»ð ÃpÃPÂÃÐAÃÐ)!ÃPh!ÃàtÃ`<ÃànÃ02Ã`­Ãäà ÀxÃ0ÁÃÐÜðÃÀµÃàŒÃðÃ0,Ã0¯àöÃPªðùÃàP!ðíÃà€ðp÷Ã`BÃ@ÃäÃ@ÜÃàåÃàëÃ02Ã@kÃ@ÃàñÃ4ÃRðpÃÀ—ÀûÃ02Ã`}$Ãp¼ ÃÃÃànÃиÀrÃÐMÃиÃ`BÃÐÐÃ@SÃ@G ÃÕÃ4Ã0PÃp¶!Ã@ÃÐÐÃ08ÃÀÃЬ à v ÃÐMÀ¨Ã@eÃÀ£ÃàtÃpcà ÃPzà !Ã0—!ÃÀ8Ã`¿ÃêÃ@G ÃÀ‘ÃPŒÃ0ÇÃP¤ÃànÃàÃÀ»ÃP˜ÃðÃðàÞÃÀ2Ã:ÀÃ0ÙÃð•àœ$Ãà€Ãð¹ÃðÀõÃ0>Ã`Bà àUÃPÃ0VÃàÃÀ,ÃpÈà ˆÃP¶Ã0bÀ+ÃFÃÐÐÃ0µÃÐ_Ãð*ÃP Ã`6ÃpìÃàtðpÃpàÃÐÜÃàbÃàßÃ[Ã@ÜÃPÃð0Ãð0ð|ÃÐÜÃ0ÓÀðˆÃÐGðóÃðÃ^Ãð0ÃpQÃ:ðùÃÐMÃð§Ã@}ÃðÃpWÃ`0à ÿÃ0,ÃpÚÃÏÃpÔÃ`NÃ@àðð ÃÐSà ‚ÃðÃÐSÃpÔÃÀ,Ãà€Ã02Ã@qÃ0DÃ@èÃð›ÃÐ_ÃànàäÃLà ¦ÃpWÃáÃÐSÃyÃsÃ0VÃ@âðóÃð§ÃPÈð/ÃÀÍÃÃÃLÙÃÉÃ0ÍÃFÃ:ÀœÃöÃöà Ã`§ÃàåÃ@_ÃÀ»àêÃð›ÃPŒÃð¹à  ÃmÃPýÃp]àmàäÃ`$ÃàßðŽÃöÀûÃ`6ðçÃЬ ð‚ÃpÃpoÃÀ,ÃÕÃXà AÃP!Ã08Ã` ðóàêð ðpÃ@èÃð•Ã[ÃÐÊð‚Ãð$Ã`Bð|ðˆÃ`§ðàgðóðíÃêà ŽÃmÃäÃð§Ã0ÙÃà÷ÃpWÃ:ÀÃP’ÃmÃ@èÃpàÃP¤ëàaÃàÃÀ8À%Ã0VÃ`0ð|ýÃÐqÃ0»Ã0 Ã`!ÃÀ¯ÃÀ»ÃÐYà[Ãsà[ÃP˜Ã`0àgÃPñÃ0 ðíÃà€Ãð¡Ã@Ã"Ã`BÃàÃÀ2Ã0&Ã`­Ã@qÃPÃpQÃÐSÀ„Ãà†ñÃÐ_à Ã@}Ãð­ÙÀ–àmÃðÃ0 ÃpWÀà ð”ÃpuðŽÃpcÃÀÀûàOÃ`0ÃÐ)!à ÃPn ðíÃ0Çà  ÃÀ ÃP€ÃFÃpiàÀÀéà ÃpÈÃÐ/ ðÕ!Ã@âÃànÃàëÃð­ÃP3ÃPðvÃaÃà†Ãð*Ãð­àäÃpÚÃÐMÃP€Ã@eÃLÃ`$ð:&ÃpQÃð¹ÃLðÃÐ}ÃÃpQð|Ãpoýð|Ãð$Ã@ôÃ`›ÃиÃà Ã`TÃàýàØà ¸Ã0nÃÉÃgÃ0»Ã@à ˆÃäÃð§Ã0Í÷Ã@èÃ@qÃ0Pà ”Ã`­ÃpÔÃànÃpÚÃÀ ÃàhàIÃÐÜàmÃð‰Ã@_Ã@_ÃöÃÐSÃð6ðÃðÃð6ÃpòàðÃàhÀ`!ðÿÃ0JÃð$ÃàñÃà€À~à ÃÀDÃçð‚à #à ²ÃpìÃÐ;ÃPýð|àêÃ:ÃÐ_Ã@ƒÃ@}Ã¥÷à  ÷ð|ÃÛÃàñÃpæÃàŒÃ—ÃXÃ`×Ãð­ðÃð*ëà #ÃXÃÀÁÃ@îÃpiÃÐÜÃPÃöÃÐ;Ã(Ã`BàCÀrÃpÈÃÀ©ÃpcÃ@àÒÃêÃð6ÃÐèÃð­à šÃ0ÍàÃ0hð ÃpÔÃÐMàÆÃ.Ã0µÃÐÖðjÃð•Ã0JÃÏÃ0ÁÃðÃ¥ÃpcÃöÀxÃÐAÃÐÄÀ+ÃpÃ`³ÃaÃpòà )ÃÐqÃ0Áð À%ðÃêÃyÃÀ,ÃÀ—à ¸ÀÃ`<Ã( Ã0—!ÃÀ‘Ã@ÃÐwà ;Ã0>Ãð­ð Ã0Ùð/Ã0\ÃpøÃ@•Ã`ËàðÀ7ÃpÃÀ,ð‚à Ãð*À„ÃöðŽÀÃ.ÃÀµÃÀDÃ^Ã.ð‚Ã`³÷àöð Àà  Ãàà ¾ÃP!ÃÕÃÃPªÃP°ÃàñÃð§à #Ã@wÃ…ÃLÃ@•ÃP¶Ã`ÑÃðÃÐAÃà€Ã`<àgÃjÃ0ëÃ`ãÃjÃPžà šÃàñðÿÃÉÃjÃ@*Ã@îÃÀ©ÃÕÃÕÃP!Ãp]Ãð¹à ¬ð#ÃP3Ã0\ÃLðdÃpÈà ”ÃpÔÃÉÃíÃjÃÐúÃP-Ã0åÃáÃPŒÃpòà ¸ÃP9à ¸ÃÏà ;Ãð6Ã^À%ÃÀµ÷ÃpìÃ`H×ÃvÃêà À®ÃðÑÃà˜Ãà!Ã`ÝÃPEÃðÑÃð§ñÃP˜Ãp ÃP°ÃÐkÀ¢À–ÃsðšÃ‘ÑÃP'ÃàÃ…ÃÀ8À Ã@îð¬ÃP¤ÃÀÇÃùÃ`BÃöÃÐôÃ`ïÃÀÓÃ0ÍÃp Ãð0ÃP ÃÐYðšÃÃ@ÃàgÃð0à ¸ÃdÀŠÃp]Ã@kÃàÃÀPÀÆÃ@qëà ¬Ã@¡ÃpÑð)Ã@à ²ÃpæÃpcðŽÃpþÃ0tÀCÃð<Ãànà #ÃÀÇðÿà ˆÃð Ã@ÜàðÃ@_ÃÐAÃ@Yà šÃ4ðçÃÐ;ÃÐGðÿÃ@eÃÕÃ@qÃ(ÃÀ¯Ã…À`!ÃЦ!Ã@à j"ðÕ!Ã@èÙâ'ÃPh!ðvÃð Ã"ÃÆ!à´ ÃÐ#Ã`ú$Ã#Ãð} Ãp°"à p!ÃР"ÃàbÃPë ÀZ"à à ùÃ#ß!Ã`ô%Ã(Ã+&Àã à%#ÀÅ%ÃÒà7 ÃÃmÀã ÃÐŽ%Ã0‹#ÃÀê$à+"ÃàP!ÃÐŽ%ÃO ÃÐ5ðçÃÀ… à !Ãø#ÃPb"ÃUÃ"ÃàV À×"Ã`*ÃÃ@¬$ÃЈ&À×"ÃàÓ Ã´$ÃÐ$ðL#Ã*è&àºðX!Ãðè#ÃР"ÃPå!Ãðdà%àœ$ÀË$Ã( à&Ã@'Ãò$Ã`!Ã0#Ã0‹#ÃPÓ$ÃàÁ#ÃÐ/ ÃPë Ãu$à F(Ãð_%à+"ëÃ0"Ãðô!Ã`!ÃàÁ#ÃàD#ÃÀü!Ã@;"Ãø#à%#ÃàÇ"ÃÐ)!Ã0£Ão%à !Ã¥ ÃР"ðL#ÃððdÀã àœ$À×"ÃàV Ã0£Ã0&ÀÝ!ðÕ!Ãðú ÃÐ$ÃÀê$Ã0!à |Àã ÃÀê$ÃÐ#À`!à á#ÃК#Ã`$Ãp¼ à ^$à |ÃPß"ÃÀü!Ã¥ ÃÒÃ0!à ó Ãp°"ÃÐ/ Ã"ÀõÃPë ÃðY&ÃàP!Ã`$Ãðú ðÕ!ÀË$ÃI!ÀH%ÃÐ)!à+"ô$Ã@MÃ.ÃÐAÃàV Ãp(Ã`k'Ã.à1!Ã°Û ÃÀü!Ù"ÃÒà ˆÃ0 Àã Ãð Ãà¯&ÃPzà ŽÃоÃ`HÃàžÀÃÀ‘à ó Ã`Ãp? ÃUð^ Ãð Ã`• Ã`• ÀÃàbÃPå!à í!Ã`• ÃLÃp? ÃPD'ÀN$ÃPÙ#ÀÝ!ðùàCàÀàCàÆÃÐAà šÃàtÃàßÃàÍ!ÃÌ Ã`§ÃÃ0,à ‚Ã@ÖÃÀÃgðÿàÞÃyÃðÃÐ5Ã¥ÃÀ‘Ã`0ÃPŒÃPzÃPŒÃÐÄàÌÀlÃÆ!à ùÃÀÃ[Ã`*Ã0,Ã`‰"ÃðÃ`›ÃpÈÃ08ÃÏÃ@èÃêÃÉÀ„ÃpWÃ0 à ÃÀÃpWÃиÃ02Ã@âÃðÃ@À„ÃÞÀlÃÐAÃ4ÃÐ;ÃàbÃ`ÝÀÀlà[ÃоëðùÃ0&ýÃð›Ã@YÃ@âÃ@âÀŠÃmÃàÙð‚ÃpcÃÃà ÃàV Ã.Ãð­ÃÀ2à ŽÃ@âÀÃÏÃÀ©Ã0,ÃPë Ã`!à ÃðÃpìÃð•ðjÃÞÃpQÃI!Ã0»ñÃÐAÃàtð‚ÃÃPªÃð›ÃpQÃPŒÃPh!ÀlÃ`­ÃPàaÀà à ¬Ãð³À„Ã(ÃÒÃPzÃÀ©à[àÌÃ0ÓÃÕðÿÃpÎÀ„ÃpoàOÃPŒðßÃ`6Ã@Ã4ðÿÃ0ÁÃÏÃÀ£ÃðÃ0ÍÃÀ à ”ÃàýÃ`ÅÀ~Ã`¹ÃPžÃð<ÀŠÃ¥Ãà Ãð¡ÃFÃàŒÃPýÃ@ÐÃPÃÏà šÃà€ðçÃðw!ÃmÃ…ÃÀ2Ã0¯ÃÐ)!Ãð›à ð^ ÃLÀŠÃpæàÌÃ@ÖÃ0¯Ãànà ²ÃP-Ã`6Ã`*ÃP ÃÀ£ÃÕÃð¿À®Ã02Ãð›ÀœÃð*ÃÀ©ÃP Ãð¡Ã[Ãð•ÃðÃ[à Ãð*àä÷Àf ÀïÃðÃ0ÍÃ@eÃÐÄÀëÃP÷à  ÃðÀ~ÃüàsÃÐ_Ã@Öà Ã@wÃ0ÓñÃpæÃÀ£Ã`ÃPñÀ ÃÐÐÃð‰ðçÃð•ðR"à ”ÃÐGÃ0JÃ0Ã`éÃ@ôÃ`³ÃPÃàýÃ@wÃð*ÃP†ÀxÃÀ&ÃaÃ0JÃàtà |Àéð àgÃÐ_ÃÀ,ÙÃÀ‹ÃpÎÀÃ@îÃàÃÀµÃ`¿ÃàßÃ0¯ÃànÃиÃ¥Ã0ÁàÆàÞÃäÃà÷ÃÃRÀf à=ÃpÔÃ0ÁÃP3Ã`BÃO ÃpÚðùÃPÃP Ãð•Ã0ÁÙÃpQÃaÃ0¯ÃLÃ@ÃpEÃ@_Ã02ÃàýàgÃPŒÃÀ!ÃðƒÃöÃÀµÃàhÃpÂÃPtàÆàCÃêÃÃð|ðáÃÐ/ Ã:ÃRÃPŒÃðÃà€Ã0ÓÃ¥Ã0µÃÃÃ@Ã@ÐÃC"ÃðàIàÆÃ0»ÃðÀ~Ãð‰ÀÃð­ÃàtÃ4àØàØÃ`³Ã`BÃP˜ÃÏÃ@ÊÃÀy"ðáÃð‰ÃðÃ@âÃÞà ÃäÃP€ÀûÃðÃêÃPn ÃàëÃð6ÃäÃànÀéÃÀ… ÃоÃêÃ`Bà ŽÃ`!à Ã`6ÃP€ÃØÃ@G ÃPtÃP’ÃÀ8Ã`$ðíÃ02Ã0hÃÀÇÃ`0Ãaà ÃpæÃXÃÐÖÃ@Ã`6ÃsðdÃPñà šð|ÃàëÃððÃиÃÀÃðà )ÃÀÇÃ@âðvÃ@ÖÃ0»à ÃPŒÃäàØÃ`­Ã@à ¦Ã`­ÃàÃÐeÃgÃànÃÀ£à /ÃpÃÀµÃðÃÐ5à7 ñÀÃàzÃpEÃÀ£ðÃ0Áà ÃàßÃpìÃà†ÀŠÃÞëÃðÃ@kÃànÃ`6Ãð§àCÃyÃ`TÃ@èàÒÃ`HÃ@èà À„À àIÃð$Ã@à /à[ÃpiÀ~Ã0£Ã0VÃàŒàmÃpàÃÐ_ÃÀðÿÃàbÃàÙÃ0©ÃÉÃPžàIÃ@ôÃ:Ã@_ðíÃPýÃоÃ4Ã0µÃàåÃ.ÃàýÃP-ð”Ã`6ðóÃàzÃ@Ã`BÃàtÃpWÃ@qÃÒÃ0©Ã0ÙÃÐ_ÃàéÃÐÜÃà€ÃànÃpoð#ÃsÃð ÃpiÃpÃ``Ãð³Ã@eð‚Ã`<Ãð*Ã0ÇÃÐÖÃ`­Ãà÷À¢À¢Ãð­Ã@ÊÃP÷ðùÃXðÃ@•ÃÀµÃ`0ÃPÃPžýÃÀ… Ãð ÃRÃ`×ÃP’ÃÉÃP¤àsÃ0ÍÃÃÃ`¹ñàðÃ@qÃ`N÷à  Ã0JÃÐeÃð³ÃÀ»ÃPªÃP’ÃPŒÃðà  ÃP!ÃP'Ã@îà  àÒÃLàaÃ0VÃàÃð*à šÃp]À~ÃÐÊÃð¡ÃÉÃÐâÃ`HÃÃÃàÃ0µÃðßà®!àOÃðÃ@kÃÀµðŽÃÀ©ëÃ`Åð Ã0PàÒÃÀ8à ¬Ã0ÓÃÀ&à Ãð Ã`<Ãð¡ÃðÃ`HÀ Ã@wÃPÃ¥Ã(Ã0»ÀÃàëÃp{Ãð­ÃpiÃP!Ãð*Ãà÷Ãð} ÃPn à ç"à=ÃÐYàêàÌÃöÃÐSàÌà šÃ@ÖÃ0µÀÃyñÃðÃ@âÃ`¹ÃÀDÃ02à=ÃÐAð ðpÃ`<Ã`ËÃàñÃ0¯àCÃðÃ`³ÃàÃ0ÙÃ0¯ÃPÙ#Ã` "ÃànÃ¥à ðùÃ@ÖÃ@îÃ@ÜÃÉÃ@ ÃPªÃPªÃ(ÃÕÃð$à ÃpcÃð6ýàäÃð›ÃpÚÃÞÃð$ÃÃàýð ÃÀ>Ã0µÃÐ;Ã@SÀxà ÃÀ&ÃpìÃ0JÃ@SÃ`$ÃpiÃpWà |ÃaÃäÃ@SÃÐAÃ¥ÀÃàåÃðw!ÙÃð*ÃPÃ@qðvÃÉÃÀ»ðÃPýÃPzàÌðÃXÃÐÖÃð§Ã@eÃÐMÃàðÃ`<Ãð›ÃÀ©Ã0¯Ã0ÁÃpQðóÃPñÃ`NÃÕÃPàØÃpWÃ`­Ã@kÃð6ÃðÃ02àÀÃð ÃðÃàñÃP†ÃpiÃð*Ã0»ðpÃàhÃððóà Ã@ÖÃpKÃð¡Ã@SðpÃ`*ÀÃÏàœ$ÃÏð¦àüà…Ãà Ã@îÃp]Ãð•ÃpàÃÐ_ÃXà ŽÃðÀ–ÀÃ.ÃÐ5Ãàñàäà šÃððíð|Ã4ÃàbðíÃp-#Ãp? Ã`³ÃÐÜðíÃàtÃ`ÑÃð*À ÃÀ£ÃPtà[ÃÀ»ÃáÃ@îàêÃàhÃ`$ÃPŒÀÃ0Áð‚ÃðÃpQÀ„÷Ã@îÃÀÃàtÃsÃýð‚Ã@èÃÐ5Ã[àÆÃ@wà ¬ðšàêÃpìÃØÃPŒÃðÃ:ÃÐÜÃ`<ÃÃÃàŒÃÀÇàÞÀ–ÃPŒàUÃPÀ„Ã0ÍÃÃÐYÃà'Ã@‰Ã0ÇÃÀ>ÃP°Ã—ÃÐâÃ0ÇÃP'Ãüà  Ãp{Ã.ÃððˆÃmÃÀDà ”ÃsÃà ÀÃ0Íà ”ðÃ^Ãà˜ÃpþàÌÃ.à 'ÃÀÁÃpæà ”ÃjÃP¼ÃÃÃÃ^Ãà˜ÃÐ_ÃÐÖÃ@wÃÐÜÃ`Hð”ðšÃpÈÃ0©ÃpoÃàªÃRÃ0bÃPðÃÃà #ÃÐkÃ0ÇÃÀ8ÃyÃðÃàÃ0\ÃàñÃÀµÃP!Ã`HÃàýÃ0bÃP¶Ã`NÃ`0à Ã@Ã``à‘éÃçÃà€ÃP°ÃÀÇÃÃÃ¥ÃPÃPÃRýà 5à ÄÃdàäÃPÃðÃ@ ÃÐkÃ@ƒÃÀ>àöÃà†ÃÀ2àmÃP'àÞðóà ÃÞðvÃÉÃÐGà…Ã``ð¬à #ÃÏÃ^Ã@à ;ðˆÃ@qÃ0>Ã`ËÃpoÃP˜Ã@ôà[ÃpàyÃpoÃÃÀµàgà #ÃÐGÃÕÃÃÀÍÃ^Ã@kÃyÃ`TÃçà ¾àsÃÀ»ÃP÷÷à ;ÃÏÃaðùÃ@•ÃÀ»Ã`0Ãð ÃPÃÉðíÃÐÄà ˆÃpiÃ@ÃÃÃPÃpÃ0hÃ0VÃXÃpcÃÏÃ@ÖÃðëÃ0Pà šÃÐÖà šà ”àÀÃPñÃà†ð ÃÀVÃPªÃ^Ã@}Ãð0Ã@qÃP’Ãð›à šÃ0Óð‚Ãð6Ãð<ÃP°ÃpQà )Ã`Zà )ÃpÎ̴̯Ã@_ÃPÀÃð§Ã`ãàmÃpàð Ã0ÁÃ0»Ã0ÍàØàÌÃðÃPýà à ¦Ã`<ð#à #à šàØðpÃÐÄÃ`¡Ã0ÁàØÃÀ>à ”ÃPÃÃPªÃÐSÃpWÃpÔÃ0¯Ã:Ã.à[Ã`!ñÃöÃ0ÇðvÃmà Ã@qà Ãð•Ãà€ð‚Ãà†ÃÀJÃàžÃ"ÃpìÃ0ÓÃpÚàØÃÀ,ÃÀÃ¥Ã`*Ãà÷ÀŠÃÛÃÐÐÃpWà  Ã0µà Ã0JÃ(Ã¥Ãmà  àÒÃ`BÃÀ¯Ãð³Ãmà ÃÀ©Ãð*à=Ã`$Ã@èÃÀµÃÕÃð¡à ÃðÃpiÃ0ÁÃàßÃ0 à ÃLÃàÃð¡ÃpøÃ`¿Ãð§ÃÀµÃÀÃ@ÜÓÃ@èÃ0\ÃàÃ`¿à v à ÃÐGàÀàCàCÀ„ÃÐ_ÃÐMÃànÃPžðŽÃPàIÀÃÐÜÃà€ÃðÃð0Ã@qÃ`<Ã@ÃLÃð$Ã`6ÃÀ©ÃÀðÃP˜ðpÃÏÃÀ©Ãð³àaÃà[Ã0,ÃàbÃÀðˆÃÃÀ>ÃÏÃÉðŽÃgÃÃpà ¦ÃP’Ã0ÓÃöÃPŒÃð§ÃpÈÃmàØÃàÃ@ðˆðˆÃ4àØÃPªàyð Ã@ÃÐMÃ`0ÃP Ã@úÃÃ0ÁÃð<ãÃðHÃäÃÐSð¸ÃðËÃÃÀ&ðÃP’à ²ÃpuÃà†ÃÐYÃÉÃÀÇà…ÃÐSÃ0Pà…ÃÏà ¬ÃpÃ0Óà[ÃÐGÃð*ðÀ¢àÃà'ð”ðˆÃÐÜÃ`ÅÃ0ÓÃsÃàtÃàtÃàzÃPªð/ÃP3àÞýÃXýÃ:ÃÀ2Ã@àsà ²Ã@âÃ0»Ã0»à šÃpÚÃàbÀŠÃpæÃ`éÃ0! à ÖÃöÃð*àaÃÏÃpòÃp]Ã`­ñÃP Ã0ÁàgÃÉðÃð­ÀŠÃ:Ã@ÜÃUðÿÃ`HàaÃp]ÃÉÃpàÃÀ»ÃÃÏËÃpàÃáÃÃ@îëð Ãpuð‚ð|Ã:Ã:ðùÃPÃpQÃð*ðvÃàhÃ@eÃyÃÐMàÒà /Ã0JàmÃÐ_À%ßÃpQÃpæÃpcÃLÃ0¯àOÃð*Ã`*Ã`­ÃðÃP ëÃðÃðÀÃ`• ÃpÔð#Ãð0Àà ÃÀ2Ãð$Ã`0ÃP’à Ãð_%Ãp¤$àÆà šÃ…ÃpQÃaðóÃ0JÃððÃ`$Ã@eÃP˜Ã0»ÃpoÃÀ»àäð ÃFÃ0¯ÃÀÃ`6ÀûàØÃ@ÖÃ0»ðóðçÃð§ð Ã`³àaÃÐMÃPñÃ0¯à ˆàUà ŽýÃÐMÃPýÃ@MÃpKÀûÃÞÃðÃð ÃÀÃ@MÃÐSÃ@kÀÃöÃ`¡Ã0&ÃpWàUÃ@wÃPÃÐÐàmà ŽÃÐSÃPÃ0ÓÃP˜À Ã0»ÃyÃ0 ÃàV àIÃÀ£Ãð­ÃðƒÃ@kÃFà Ã0Jð à à |ðóÃÐ;ÃÀ©ÃÀÙðjðçÃ@ÐÃpÚÃP’à[ðÃð›Ãð*ÃØÃpWÃ0ÇÃ@ÃüÃöðÿÃÀ ÃÐÜÀ¢ð Ã`*Ãð Ã`0Ãð›ÃиÃÌ Ã@èÃÐÄÃà\àIÃPzà7 Ã0‘"ÃÀÃPtÃоÃÐ5Ã@kÃàåÃÀ‹à à7 ÃÐGÀ„ÃàzÃÀÃ:Ã0ÁÃð Ã`• ÃPß"ÃÀÃÐMÃ( à ùÃÐ/ Ãð Ã:Ã0Çðˆà |Ã@Ðð^ ÀÃÛÃ@qÃpæà[ÃÀ&à  ÃêÃð À ÃÀ£à ÃPÃ`0ÃpiÃÐAÃpoà Ã`§ÃP÷Ã`§ÃP Ã@SÀûÃ`¹Ã0ÁÃPzÃð ÃpWÃdÃÐkÃà†à ²à ”ÃmàØÃ0¯Ã@qÃÉÃ:ðùÃÏàäÃPzàUà ”Ãð§ÃPŒÃððdÃPÃð*ÃðÃC"ÃàJ"ÃÌ ÃPýÃ`×ÃüÀÃ@kÃ@MÃиÃ0,ðíà )ðÃUÃ@G ÃÐÊÃ`HàêÃ0ÙÃP Ã`­Ãð$ðùÀ ÃöÃ`$ÃPÃ0Óð ÃÐÜÀrÃ0©ÃpÔÃð•à ÿÃpcà  ÃpÎÃpìðŽÃÐMÃ@YÃ0>ÃÀ,Ã`¿ÀŠÃP†àOÃðÃ@îÃÐîÃ0\ñËÃÀÁÃP†ÀrÃðƒÀéÃ"ÃpÎÃ`¿àCÃ`*ÃPÃpoàaàÌàOÃÐÜÃ@ƒàêÃÃ`NÃPÃàßßÃ`­Ã02ÃÀ&ÃÀ—Ã:Ãð§ðˆÃ`HÃ@èÃÃ08Ùà àgà ŽÃàzÀxÓÃàzÃ4Ã0,àÀÃ02ÃÐGÃÐÖÃ4ðùÃÀ©ÀÃÐÖÀûà ŽÃ(Ãð³ÃPàIà ÃÆ!Ã`6ÀõÃ@ÖÀïÃP˜ÃÀ,Ãà˜ÃÃpQÃ¥ÃàzÃPÃ0,Ã@ÜÃ@ÖÃ0µàUÃà ˆÃpÔðdðçÃaÃpÂà |ÃÀ‘À Ãà÷àºÃ@ÖÃ@wÃ0PÃ`6ÃиÃиÃ0&Ãð*Ã@ÜÃØÃPë Ã@Ä ÃðÃ0DÃ0ÍÃPÃÀ©Ã`<à à ÃÐGÃp¼ ÃpQÀ+Ã@eÃPžÃ`*à /à 5Ã0»ÀéÃ:àÀÃpWÃÀÃ`ƒ#à+"Ã+&ÃPb"Ã@SÃ0—!ð½%Ãp°"à ó à í!à Ï&Ã`k'à%#Ã$Ãðw!ÃP\#Ãðe$Ã`}$àºÃ0"Ã0#ÃðY&ÃàP!ðX!à%Ãðw!ÃÀ['Ã"Ã`§ÃpÂàIÃPV$ðÏ"Àã ðX!à ÃоÃÐ/ Àã à v ÀÝ!Ãðî"Ãà2&ÃÀØ'À­)Ã0…$à%À¿&ðÕ!à+"Ã`}$ÃÀä%Ãi&Ãì)ÃðÄ)Ã1%Ã@¸"Ãp!%Ãp3"è&ÃP>(à ™/Ãp&Ãp3"ÃÀ!ðpÃÐGÃpž%ÃÀ['Ã=#Ãp9!Ãðè#Ã`î&Ã#ÀÝ!à%Ã@(ÃPP%ÃÀI*Ã`Y*ÃÀê$à 'à&ÀÝ!Àf à !ð·&ðÕ!ð:&Ãì)à&ÀH%à Û$Ã0%à%ÃPh!ÀZ"Ã@)%Ãp-#ð@%à1!ÃÀ‹Ãðk#Ãp&à 'ÃðY&àÀÀT#ÃPÇ&À0)ÀË$Ã0!àœ$Ão%ÃÀü!ÀlÃ@A!Ã@#&ÃÀÞ&ÀH%Ãðú Ãðw!ÃPÓ$Ãø'Ã{'Ã0ð'Ãðè#ÃÀö"è&ô$à F(ÃÐ#Ã@¸"ðÃ$Ã=#Ão%ÃPå!ÃÌ ÃÀg%ÃPÇ&Ãà,'Ã( ÃÌ Ã@#&ÀN$Ã` Ã¥ ðL#à ùÃð Ãðô!ÃPë Ã`}$Ã0"ÃÐ'ÃÀö"ÀÝ!ÃÀ‘ÃÀü!Ã` "Ã@¦%àœ$Ã4Ó#Ãðâ$à„(Ã`ô%Ã0 Ã$ÃP\#ÃPÙ#Ã`#Ã0#Ãp¤$ÃÀ"Ã"Ã0…$à®!Ã@YÃÃ`¡ÃpÈÃÒÃ`­Ã@Ä Ã`ú$ÃPn ÀõÀlÃ`ú$Ãp? Ã@ÊÃäÃpEÃиà ç"Ã0,Ã`§ÃàßÃ` "à á#Ã"ÀïÃÒÃð ÃЬ ÃPn Ã#Ã0&ÃP÷ÀZ"ÃÀ ðX!ÃPñÃ@¾!à í!Ãð›Ãð•ÀlàÀÃ0,ÃðÃð} ÃоÃp]ÃPŒÃPh!ÃÀ!Ã0µÃ`³Ã0ÁÃð•ÃÀ‹ÀÃP’Ãð à ‚Ã0PÃ`¿ÃàåÃð à |Ã`Ã0,ÃÞðíÃ@ÜðÿÃÀ àCÃÐ;ñÃsàCÃ0µÃÉÃ@¾!ÃðƒÃÐÄÃpKÃ0»Ã@èÃ` Ã°Û Ã€~ÃÐ;ÃpÎÃ0 Ã0…$Ãp°"ëÃ@ÐÃÀð#Ãp9!ÃPh!ÃaÃpWÃ.ÃPŒÃà÷Ã@ÃpÈÃÃð‰ðpà ÃÐYÃÐÄÃàÍ!Ãðw!Ã[Ã`0À~à v Ã`• ÃUÃðÃàbà ÃÀ!ÃàV Ã.Ç!Ã@A!ÃPå!Ã4ëÃоÃäÃð‰Ãðà ó ÃPýà í!ÃÆ!ÃaÃðÃP€à+"Ã@¾!Ã"Ã`³à p!ÀïÃ@ÜÀ„ÃðÃ%'ÃðS'Ã0¯à šàØÃàtàºÃÀÃ`­Ã ÃàD#ÃPë ÀÝ!Ã`!Ó#à |à Ã0&ÃðƒÃ0>Ã@âÙÃ@MÃ0—!Ãð} ÃиÃ0¯ÀéÃðk#ÃPë ÃàÙÓ#ÃàÓ Ã0&à=ÃÀ… Ã`!ÃÆ!ÃC"ÃàåÃ`›Ãà$Ãðw!ÃàÓ Ã@_ð ÃðÃp'$ÃPå!ÀûÃàtà®!Ã@¾!ÃPP%Ãp? Ãp3"ÀÑ#Ã@A!ÃàëÃ`$à ÿðdà ÿÃ@ÐÃÀ Ã.ðíÃ`¡Ã"ÃЦ!ÀlÃ0,ÃäÃpàÃ0Và ‚Ã°Û Ãp-#ÃàIÃ`³ñÃp¼ ÃmÃ`›Ã`$Ãðú ÃК#ÃЦ!Ãð Ã`$ÃÀÁð|Ã0$Ãð Ã0µàÌÀõàÆÃp]Ã@_àÌÃpÂÃÐ#"ÃÀ ÃpKÃÐÊÃÐ5Ã@ÐÃÉÃЬ ðÉ#Ã@;"ðX!ÃÀ—ÃpWÃÀÃpKÀxÃpÂÃpÂà ˆÃp¼ à®!Ãð} ÃPŒÃ0©ÃðÃÐGÃÐMÃ0hÃ0ÁÃàßà´ ÃÐÄÃPÃÐGÃ0¯à¨"Àïà  Ãð›Ãp9!ÃЦ!Ã0£Ã`¿ÃÐYÃPàOÃÐAà7 ð½%ÃàÇ"ÃPå!ÃàV Ãð Ã=#Ãpž%À<'à%Ãp°"ÃP\#à X%àõ*ð™+à&Ã?-Ã0Þ*ÃW)ð«(à×/Ã0Ò,ÃP£,ÃPµ)Ãð#/Ã0´1ÃÀº,ÃÐd,ð“,à¿3Àƒ0Ãpt,Ã0[+À‰/àã-ÃW-ÃðG)ð™+Ãp’'Ã3/Ã`š4ði3ÃÐR/ð-Ã`50Ã`A.ÃpV1Ã-0Ãð /ÃÐR/ÃP2Ãà.ð/Ãpt,Ã`50Ã`²0ðø0Ã0O-Ã`G-àÝ.ð/Ã@R3Ã0O-àï+Ãð¦.Ã@L4Ãã1Ã@R3àÑ0ÃÐç+ÃN5Ãð#/Ã],Ã@ù,à×/ÃÐç+àr+à ".Ã0U,Ãpë-ê0à 3ÃÐÛ-Ãp€*à 4+ÃÐ^-Ãl0ð-Ã`Ð+ÃP>(ÃÀ%0à 1Ãû-Ãð²,Ãàö/Ãû-àT0À1ÃÀ1.ð/Ã3ÃÐR/Ã0[+Ãà.ÃP -ÃÐL0ÃÈ/Ã`¬1Ã0U,Ã0a*ÃÂ,ðæ3ÃÀ®.ÃÐç+àã-Ã?1Ãðç8ÃÂ,à @)ÃÀ+/ÃE,ÃÐd,Ãû-ð,Ãðe$ÃE,à (-Ã071Ãð/-àï+à (-Ã9.ÃPµ)Ãà+Ã?-ÃÀ=,ÃÐp*Ãpë-Ã`/1ð()À**Ãàê1à ½)ÃP8)Ã*À¡+Ã0Þ*Ã@v-Ãàü.Ã0Ø+ð"*Ãp!%ÃPµ)ð"*àé,à «,À‰/ÃpÍ2Ãð;+Ãi*Ãp€*ð"*ð"*ÃÈ+Ãà‹,Ãp’'ÃÐp*à ¥-Ãð/-ü-ÃÐR/ÃP£,Ãû-àr+ÃÚ(Ã0[+à @)ÃðÄ)ÃðM(à ½)Ã0ö&Ã`‰"Ã@)à ±+ÃÔ)Ãà£(ÃPP%ÃP>(ÃP -àé,À¡+Ãp )Ã@'ÃÐù(ô$Ãi&Ãð#/ð"*ÃÐó)ð+ð-Ãà,ÃðÜ%ÃðÄ)Ãà‹,ÃPÍ%à L'Ã7$À¹'ð4'ð.(Ã@¦%ÃÐ%ðÃ$ð±'Ã@'ÃðÊ(Ã$ÃPµ)à «,ÃP,+ÃÀU(Ãp€*ÃÐí*Ão)ÃPÁ'à :*Ã*Ã0ð'Ã`ú$ÀÑ#à®!Ãþ"ÃÀ['Ã`è'Ã`ô%Ãà8%ðF$Ãð_%ÃД$Ã`e(Ãðô!Ãp-#ÃPÓ$Ã`q&ÃP2*Ãp*Ã0%Ã0s'Ã@”(ÃðS'ÃðS'Ãðâ$Ãì%ô$ÃÀm$ð:&ð+Ã0y&Ã@¾!ÃP2*ÃÀð#Àf ÃР"ÃàÙÃ@/$ÃðÜ%Ã&Ãà&(ð½%Ãø#Ó#à Õ%Ã@¦%ÃàÁ#Ãðú ÃÀg%Ã`e(ÃÀ['Ãà8%ô$Ã0…$Ã@(Ã@MÃu$ÃÀê$ÃàJ"à 'Ã0$ÃÀ Ã@;"Ãðw!ðÕ!ÃР"à¢#ÃÀg%ÃÀØ'Ã$ß!Ãðâ$Ãðè#ÀZ"ÃàÇ"Ã0ü%à Û$Ã0!ÃÀs#à ‚ÃàåÃpàÃð•Ã0$Ã`$ÃP÷ÃÐ;ÃÀ"Ãø#Ãà2&ÃPå!ÃЦ!Ãp-#à¨"ú#à+"Ã@A!ÃUÃà'ÃàÁ#ÃP\#ÃÐAÃðƒÃà>$Ã@;"ÃÒà´ ÃPÓ$Ã$ÃÐ%Ãu$Ãpž%Ã@¸"Ã`§Ã¥ Ã7$ÃÐ5Ã0 Ã`#Ãp˜&Ã`#ÃPñÃ@;"Ã`ƒ#Ã7$Ãðe$Ã`ƒ#Ãð‰Ã"!à |À~Ã¥Ã0&ÃÀ‹ð^ à+"à ó ÃÀØ'ÃÐ$ÃÐ%ÃК#Ã0£Ã[à1!Ãø'Ã`‰"ÃÒÃ@SÃ` ÃPå!Ãp!%Ãðâ$Ã0©Ã1%Ãø'ÃÀÞ&ðX!ðdÃð¡ÀÃUÃðà®!Ãp'$Ã` "ÃÐ)!Ã`• à=Ã0 Ã`!ÀN$Ã.à´ Ãp¶!à$Ãþ"Ã0y&ÃPß"ÃàP!Ãðk#ÃК#Ã`#ÃPtðX!ðjÀZ"Ãp¶!Ã°Û Ã ^$Ã`w%Ã`w%Ã0‹#ðjà v ÃPÍ%Ãp&ÃÀy"à j"à v Ã0©ÃPb"Ã{#àºÃÞÃ`!Ãþ"Ãu$ÃðS'Ãðw!ÃÀ‹à Ã@;"à |Ã°Û Ã@âÃP÷ÃI!Ã`!Ã@A!àºà®!Ã@¸"ÃÐ#"à Ã0#ðÕ!à Õ%Ãø#Ãp¶!ÃàP!ÃC"Ã`›ÃÐ$ÃÀs#Ã"ÃÆ!Ã`‰"ÃЦ!ÃÀ"Ã0$Ãpž%Ãþ"ÃPë Ã:ÃPh!Ã` ÃÀð#à¢#Ãp? Ã@YÃ0©Ã@¸"à¢#à%#Ó#ëÃ0—!Ãø#Ãà8%à p!Ã0"à ‚Ã.ÃàßÇ!à=Ã`!à&Ã0$À`!ÀûÃ"!Ãø#ðÏ"ÃÀ"ÃP€Ã7$Ã`q&à+"ÃPzÃ` "Ã0s'à ^$Ãðq"ðíÃð•ÃàbðíÃàhÃàÙÃpÂÃð} ð^ ÃäßðáÃàÓ Ã  'î%Ã0‘"ÃÀü!ðçÃ@MÃ@ÐÃP÷ÃÐ/ à v Ã0‘"ÃðÃÐ/ Ã02Ã@âÃðÃ@Ä Ã`• Ã0¯Ãp¼ ðíÃäÃP˜ðçÃ@ÖÀxÃàåÃÐÄÃиà p!à=à ^$à ½)ÃÀ‹Ã`³ÃàåðáÃ¥ ú#Ãðô!à®!Ãðú Ã`!à´ Ã0&ÃÐ#"ÃPñÃsÃàtÃ@eÃàhðùÃ`Ã`$ÃÀà ÃpEð^ Ã@A!ÃaÃpiÃ0>àIÃð¡Ã08Ã`›àÆÃÐMÃ(Ãð$ÃàýÃàðR"ðL#Ã` ðàÞðŽÃP†Ã@ôÙÃÀ‘ÃP÷ðóÃР"àÆÃÐÜÃàÃäÃpÂà ‚Ã`¡ÃÀ—Ã`BÃÕÃ`ËÓà à ùÃPýÀÃPtÃÐSÃP÷ðáàÞÃÉàØÃ@¸"ÃPë àÆÃ@ÊðÉ#Ãðw!ÃðÃØÀxÃ0>Ã.ðpÃÐGÃàëÃ0&Ã¥ à„(Ã¥ ÃÀ¯à  ÀœÃ`³Ã0µÃÃ@kðjÃ¥ëÃ0JÀà ˆÃpKÃ`­ÃðƒÃUà Ã`$ÃUñÃP ÃÀÃàtÃÀ©ÃÒÃgÃmÃ`0ßÃÀ—ÃO ÃàhÃP˜Ã08à  ÃPžÃÐÖàÀà1!ÃÐ5Ã`³à Ã`à  ðŽàðÃp]ßÃà Ãð¡Ã`¡ÃàV ÃêÃàtÃ@âÃÀ—ÀõÃpWÃ0,Ã@ÖÃ0DÃð›ÃP ÃpÈð^ Ã:ÃP¤Ã`§à ó Ã@ÜÃÀ¯Ã`6ÃÀÃ@âÃ`!ÃÐÄÃÐÐÃÐ)!à p!Ã0&Ãp°"àÌÃ"ÃØÃÐ5Ãð ñÃPë Ãp¼ Ã0DÃ0©ðÕ!ÀûÃÆ!ðR"ßÃð Ã[Ã@ÐÃP˜ÃPŒÃÀ,À~ÃP÷ðdÃ.Ã`*ð|ÃÐ;ÃЬ ÃPë Ã0—!àCÃ¥ Ãð Ã¥Ã@eà Ã`³ÃP÷ÀïàIðX!Ã@ÊÃ0 Ã`ÃÐ;ÃP€ÀrÃÀÃðî"à ÀéÀûÀõÃPb"ðóÃpÈÃ`0ÃЦ!Ã°Û ÃÒÃ:ÃpÚÃgÃ0 ÃÐ5ÃöÃ@¾!Ã@A!ð‚ßÃP’ÃPýàÆÃ@YÃp¶!ÀZ"Ãp9!Ã¥Ã@MÃp]ÃÀ8Ã(ðçà p!à |Ã@ÖÃàbÃÃPb"ÃÐ'Ã@ÖÃ@YÃðà ÃpQðpÃàbÃÐAÃp¼ ÃpÎÃmÃpÚà Žßð^ ÃÐ#"ÃäÃ`¡ð‚ÃàñÃ0—!ÃðÃ@qÃPŒëÃp°"ÃàëÃÀ&ÃÃà ç"ô$ÃPÙ#ÃÀ!Ã0&Ãp¼ Ãð ÷Ã@âÃ@wà Ùà à ÿÃÐ;àÒðÿÃÀ‹ÃðÃÀÁðÃ`$Ã`Ãð›Ã`<ÃpàÃ0DÃàåÃ@_ÃÏÃ4à+"à ÃÀÃpWÃÐGÃðà ÿÃÀ!à #à ÃC"ÃpWÃp]Ã@_Ç!Ã@ÖÃ0µÃLÀxÃàßÃР"Ã0,ÃÀµÃÐÖÃ`6Ã.ÃpWÃàýÃàÃ4ð|à í!àœ$ÃÀ©ðÃPà ¬ðà #Ã08Ãp]Ã(ðùðíÃ0,ÃÌ ÃpÎÃP ÀéÃиÃàbÃ`ÅÃP Ã:Ãà†Ã@kÃpQÃÐ/ ÃÞëàUÃPýà ÃàñÃ¥ÃP€àOÃP†ÃðÃðÃà€Ã:à Ã0ÙÃ@ ÃáÃðÃgð|à ˆðùð ð Ã`*Ã@âà #Ãð³Ã0‹#à í!Ã0»ÃPýÃ.ÃðÃpàÃ0DÃÐÐÃpÔÃpÔà[à ;ÃFÃ08Ã`¡ÃÀ—Ãðî"ÃÀ£ÃÐÖÃ0JÃð¡ÃÀ¯Ã0&à=àÆÃ`NÃ0>àIÃàzÃ4ðjÃÃ`<Ãà€ÃPÃ4Ã@ÃÀà ˆÃÕÃP€ÃðÃÐ;ÃàhÃÃÃà÷ÃÀÃP ÃpoÃp¼ ÃÐ/ ÃÐâÃFðùðŽñÃ0>à ßÃð§ÃÐYÃpÚÃP-ÃÐÜÃ`$Ãp¼ ÃànÃPÃ`TàaÃÐèÃvÃ0ÓàÒÃðÃÀ ÃÐÊÃpàà ¬àØÃpàÃÉÃpQÃàtÃÀ&Ãð­Ã@ÃÀ&ÃpcÀõÃðÃÀ¯àÃ@úÃàÃÀ&à #Ãà÷à àÞà /ñÃ@MÃÐÐÃöÃÀ&ÃàÃ0\Ãð¡Ã:ÃÉÃ@Ã`³ÃàbÃ@YÃànÃ0Jð|à ¦ÀœÃ"ÃgðvÃÕÃ`HÃ.Ãð Ã0JÃFÃÐâðÿÃÐYÃÕÃ@wàgÃðÃsÃ4ÃÐ/ Ã0DãÃÐSÃ@Ã`¿ðÃ@‰ÃÀ2Ãð*ðùÃpiàØÀ¢ÃàzÃ`<ÃpÚÃànðÿÃ`¹Ã`<Ã4Ã@èÃàÃÏßÃ0ÇÃP¤ÃPžÃ4Ã`ÑÃ`×à /Ã`³ÃöÃÀ»Ã0»ÃpoÃP’àêà ”ÃðÃÐ;ÃPÃP†ÃÐÐà àCÃpKÃàV ÃLÃP€ÃàbÀéÃPÃ0¯Ãð­Ãð*Ã.Ã@Öà Ã@ÖàUÃP’ÃÀÀàIÃP†ðpðçàÌÃ02Ãà¯&Ã`›Ã@úÃð0ÃáÃÐMÃàV Ã`§ÃPýÃàD#Ã@²#à p!ÃpKÃ@ÜÃ`­ÃàßÀÝ!ÃÀ—Ãàbà ‚Ãà˜ÃpcÀïÃ0£ðçðdÃ` "ÃðƒÃà%#ÃÀ!ÃPb"ÃàÓ Ã°Û ÃÐ$ð@%à p!ðáðÿÃàåðÕ!Ã$Ãðq"ÃÐAÃ4Ãð} ÃÀö"Ã@Ä ÃР"ð@%ÃÐ$àCÃÐ/ Ã@Ä Ãp? ÃPß"ÃÀy"ÃÌ Ã ÀÃØà á#Ã`ƒ#ÃàhÃ0ÁÃð‰ÃpÂà í!ô$ÃÀ!Ã=#Ã"ðÏ"ÃÐ#Ã[ÃÀ Ã@;"ÃP>(ß!àCà Ã`• Ã`}$à¨"ÃÀy"à !ÃàÙÃ`w%ð.(Ã0"Ã:à j"à á#Ã@A!ÀéÙÃ0©Ãp? Ã`}$Ã=#ÃPýÃ`¡Ã0£à ÃÀ… ðÉ#ÃÀy"Ã"!ÃÀü!à Û$àœ$ÃÌ Ã[ÀrÀéÃ:Ã@ÜÀf Ã0$Ã0‹#Ã0"Ã@¸"Ãp&Ã](à1!à ðáðÏ"ðÉ#ÀïÃ.ÃÀ—ÃЦ!ÃÀ"ÃI!ÃÐMÃ`§Ã0"ÃÀ"Ã@MÃò$ñÃPýÃЬ ÃPß"àOÃàÓ Ã !Ã0$ÃàÍ!ÃÀ ð”Ã`0ñðjÃàñÃ0µÃpàÃð§ñÃàD#Ã0‘"àOÃ`¹ÃPýÃÐ;àºÃpÔÓÃ08ÃÐGÃ`!ÃàëÀÃ0,Ã`Ãà€ÃP-ÃLÀ¢à )ÃäÃðÃ0¯ÃÐ)!à ˆÀïÃpÔÃðÃgðíÃàbð‚ÃðÃÀ‹ð|Ã:ÃüÃpìÃÀ©ÃpKÃ08ÃäÃÀ¯àÒÃ0¯Ã4ðpÃPÃPtðjÃ0,àOÃ`*Ã`BÃpæÃ0ÍÃ^à[Ã0ÁÀ ÃP†Ã@eà Žà=Ãp9!ÀlÃð¡ÃànÃ.Ã0ÍàgÃÐMðÏ"Ã0 Ã0>Ã`BðˆÃÃÀµÃmÃàÒÃpÎÃÐMÃpàÃð Ã@YÃpàÃÃÃàÃ0»ÃÀ Ã0ÁÃØÃP÷Ã0¯ðíÃð•ÃÀ&À~ðíÃðÃÐâÃpæÃóÃ0JÃ0µëàsÃð§Ã—à Mà‘ÃÐkððdÃðƒÃP!Ã@wÃ0DÃàzðˆÃüà ¦Ã@wÀ–Ãà÷Ã`6ÃP†Ã[ÃàhÃÀ Ã4Ã0ÙÃÐâÃà†àUÃPÃP†ÃP˜ÃP-ÃpæÃàýÃ@qð‚à šÃÉà ˆÃêÃÀ–Ã0>ÃgÃà ÃÃÐMàIÓÃàV Ã@ÜÃ0µÃÐMÀÃFÃÃ0µà ÃP!Ã0ÇÃ@kà #ÃðvÃ0¯ðÃÐÜÃÀñðˆà )Ã0>ÃP€à Ã`NÃFÃÀ2Ã`³Ã0µàOÃ@îàºÃ@ÜðpÃà ÃànÃÀ£ÃpÈÃ`ðÃð¹ðÿÃ4ßÀÃpiÃÃÃPÃ0ÁðˆÃ`<ÃpcÃ@èÃpcÃ`0Ãà÷àÃäÃ"Ãà ÃP ðjðÃÀ>Ã@YðóÃÞÃànÀ~Ã`›ÃÐÄð|ÃÀ&ÃP€ÃÀÃÀ Ã:ÃàŒÃ02ÃPÃPÃ@eÃððÃ"à j"ÃЬ ÃP à ‚Ã@Ä Ã€ÃðëÃ@}ÃpòÃ0»Ãð¡ÃÏÃP÷à7 Ãð¡ÃpuàIÓàÆÃFÃLà šàÒÓÃ`$À„ßàäÃpÚÃ`$ÃÀ&ðÿð ÃPzÓàÌÃÀÀ ÃRÃ@úÃàÃÃÀµÃÀ£Ã02ÃðÃà ðÃðÃÐMÃ0ÁÃà’ÃÃÃ¥ÀïðpÃP˜Ã0PÃð§ðdÃàñÃÐîÃ@}Ãðà í!Ã[àaà ²Ãà÷Ãð‰Ãp]Ã@âÃððvÙ"ðóàÌÃ4àÒÃàåÃ@ÐÃÐAÃð•ÃÕÃ…à šÃ`BÃ@_à ˆÃ`¹Ã@ÜÃP†ÃØÃpÚÃ0»àÞðíÃäÀ–àmÃP˜Ãà€Ã@ÊàCÃЬ ÃðÀàÀÃðÃ02Ã0 ÃPÃð¿Ã0>Ç!ÃÐAÃÉà #ð ÃÐÐÙÃиÃpoÃàÃpìÃÐ)!ðáÃÐ/ à ‚ÃÀð‚ÃóÃÐÃÐkà à ”ñ÷ÀŠà ¸ÃsßÃð›ÃÐÖÃp‡Ã[ÃÀö"Ãp¶!Ã(ÃpQÃÀ‘ÃpÚÃ`• ÃÀ£ÃP!Ã0>ÃàýÃÐMÃà†ÃpiÃ`³ÃÐÊÃ@SÃ`NÃÃ@ôÃÀ¯àÒÃpæÃP†ÃgàÌÃ0©ÃÕÃ0JÃ0©ÃÀ!Ã@G à ÃêÃpÚÃð ðçÃ`BÃÐ_ðçÃ` ðóÃp]Ã0ÓÃÉÃ0DÃ`¿ÃànÀ Ãð›Ã0JÀŠÃpcÃð*àOÃð¿Ã`ËÀÃ.ÃÀÃPŒà )ÃdÃð$ÃPžÃpþà #Ã0Ùà /ÃÐ_Ã`HàØÃð$Ãp{Ã@•Ã`BÃà†à  àäÃÃ@ÃP-ÃÀ©ÃÐ_ÃÐèÃ`ÑÃ:Ãð Ãp]ÃÃÃ`ÑàsÃÛÃð§ÃpoÃpòÀàÌÀ à Ãð6Ã0\ÃFÃ@kàOÃ…ð ÃàtÃànÃ0PÃ`<à ŽÃ0ÁÃsÃð*Ã0,à ÃÐYÃð•ðÃÉÃpæÃÀÃ0ÙÃÃÃP˜ÃpWÃpQÃ"ÃLÃpòÃ0\ÃÀJÃP'Ã@ðšÃP¤Ãàzà ˆÃ`BÃð$ÃüëÃÐèÃðBÃÀ>Àf ÃÀ2ÃÃ0ßÃÏÃpÃ0JÃ@eÃð§ýÃöÃàŒÃFà 5Ãð­Ã0ÇÃÐeÃyÃ0Dà ²Ã0Và ÃÌ ÃaÃà÷Ã`ËÃ@ÃðÃÐGÃÀ ðÃaÃ0ÁÃ`Ã0,Ã0ÇÃð¹ÃÐèÃ@qÃP Ãð›ðóà ÿÃ@ÜÃÀÃ@îÃPžÃànÃpÎÃ@kÃüðŽÃоðçÃ@SÃиÃÐÐÃØÃÀÃpÔÃ0VÃ`fÃ@îÀ„Ã@MðçÃÃÃ@ôÃÉÃð*ðŽÃ`BðíÃÃ0Dð|ÃÀÇÃàýÃ.ÃPÃ`$Ãð•ð Ã@Ã0\ðÃÀµÃaÃ0JÃP-Ã@ÃÃÐSÃØÃ¥àÒÃpiÃðÃRÃð¡à ¦Ã0ÇÃP\#Ã@MàØàOÃpøÃÏÃáÃÀµÃ`§ßð|Ã0ÓÃ`×ÀxÃÐ/ ÃÀ… Ã`ÅÃXàÞÃ0ÇÀÃ0Dà ¬àmÃðÃàñðÃpWëÃÀà )Ãp{ÃàIÃ@YÀ„ÃànÃP÷à |ÃàñÃpcà ²Ã@ÜÃàåÃ@èÀ Ã0bÃ…àÌÃ0ÍðÃàð¬À1ÃÐ_Ã@YÃ`³ÃpøÃà†ÃgÃ@ÐÃP¤Ã`xÃ…÷Ã`ËÃà ”Ã`BÃðÃ"Ã`TÃÐÜ÷ðjàOÃ.ÃàzÃÐMÃ0£Ãð•ÃànÃpWÃmðóÃ@âà ¾àmàÃRð#ÃÐqÃpÚÃ0Áð#à ¬ÃÐÊÃÀ&À–Ãà˜ÃÀ8ÃànÃPýÃêÃÀ,À¢ÃÃ0PðÃPŒà ‚ÃsÃpìÃ`³Ãð0Ã4Àð|ÃpæÃpøÃÀ©Ã(ÃÐâÃð¹ýÀÃÐÜÃÃ@‰Ã0ÓÃpoÃpuÀÃàzÃ4Ã0DÃÀ8Ã@àsà ÃP’Ã`BÃ0ÓÃà ²àöðšñÃà ÃÃÀ,Ã4ð‚Ã`BÃp‡Ãð§ÀrÃànÃàåÃàßÃ@ÃpiàCÃвÃð¡ÃÐqà  ÃP’Ã0ÙÃP˜ÃüÃà€Ã0ÓàyÃ0ÓãÃÐeÃÐâÃÉÃ`BÃ@wÃð¹àyàOÃ[à ŽÃP-ÃFÃðBÃ0ñÃpòÃpæðvÃpÈÃP'Ã0Dà ¬àäÃPÀ–Ãð6ÃàÃóÃÐÖýÃpoÃ0DðÃ0VÃÀ¯ÃP˜Ã`ËÃ`6Ã0ßÃà!ÃdÃÐSÃÀ8ÃPžÀ¢ðÃàÃÐúÃP!Ãð§ÃpþÃà'ÃÀÁÃ0ÇÀð”ÃpøÃðBÀàØàðÃP-Ã@îÃXÃFÃRÃÐâÃ0JÃÐÜÃ`lÃð¿ÃPÂÃà'Ã`TÑÃàÃP¶Ã`ãð”ðˆà  ÃÀÁÃðBÃàÃ@ÃÐôà‹ÃÛð ×ÃíÃðú ÃgÃð6Ã0÷Ã0†à ¾àðÃ@Ãð§Ã:ÃàŒÀà Äð”àÒÃÐôÃðHÃð¹ÃPžÃÐMÃPªÃXðŽÃððóðpÃpuÃ@‰ÃðHÃ@}ðŽÃóÃPžÃ‹Ãð¿Ã0ëÃ@¡Ã`Hà Ã0Óà  Ã0ßÃÐkÃðËà ;ÃPžÃ@}Ãð¡ðˆð¦ð”ÃPªÃP!Ã0\ÃpÃpøÃáÃÐôð Ã`Bà ÃÀµÃÐqÃàýýÃpQÃLÃðÃjÃð0à ;ÃÀ>Ãà˜À7à à ‚Ã02àaà ÄÃÐeÃPžÃRÃà€ÃðÀàgÃ0bà ¾ÃÕð#Ã`NÃ0ßÀ=ðˆÃpcÃð*ÃXÃ`BÃpòà  ÃØðjÃÐeÃ@qÃ@ÊýÃðNÃÀÁÃÀ,Ã@ À¨Ã@eà #Ãpìà ýÃÐÜÃpiÃÐâà )ÃÐâàgÃð6àäÃÕàmÃðÃLÃ`<ÃLÃöÃ`¿Ãð6ÃPªÃ0PÃ0\Ã|Ã@ÃÃð¿ð¬Ã@kÃäÃ@èàaÃ`Zà…àêÃÐGÃ`×Ã@îÃpÚàäÃàÃpoÃàtÃÐôÃüÃàbÃPÃ`ÅÃð³ÃðÑËÃð$Ã0ÇÃP¤ÃpþÃLÃÀÃyÃp]Ã0ÓÃFÃ0DÃ^ÀÃvÃpþÃ`NÃ0ÍÃPzà #ÃáÃÀJÃ4ÃÉÃPÃÀÇð5Ãsà šÃ0Và )ðÃgÃ4À+Ãð*ÃpìÃpQÃ`¡Ã`0ÃÐ_ÃöÃà÷ÃpcÃ02Ã`NÃpìÃ0¯ÃÐSÃ.Ãà÷Ãð§Ãà÷ËÅàUÃPªðÿÃ:ðÃ`HÃÃpuÃ@Ãà€àÒÃ`­ÃÀ&ÀŠÃвÃÀÃð›Ã0JÀœÃàýÃpuÃjà ¾ðÃp{ÃÉÃÛÃPÃÐâÃ`ÅÃ0ÁÃpoÃ0>ÃgÃüàöÃðÅÀÃpæÃpWÃÐkð)Ã`TÃ`Bà šð‚Ã@ÃÐÄÃPÃ08ÃP¤ÃðÑð#Ãð0àmßÃàýÃ`¿Ãð6Ã@ÃÃ@kÃÛÃðà šà #ÃàtÃFÃð$ÃP¶Ãàà Žà Ã`×ÃàzÃðÃ`<ðÃð$Ãà÷À ÃÀJà AÃÃàUÃ0ÓÃà!ÃPÃàbÃà /ÃÐqà ”ÃaÃpcÃP¤ýà[ÃÀ ðÃpøÃÏÃ^ÃP-ÀrÃ(ðíÃÉÃ@•Ãà ðšÃ@ôÃ`H÷ðvÃðÃð”ÃÐÜà ÃÃ0ëÃðHÃÃ@Ã@úà ¸ÃpþÀ´ÃðBÃÀ»ÃáÃ@ƒÃêðvÃÐ_Ã0Và‹À+ÃàŒÃð­àêÃRÃpÃ@Ã08ðŽÃàŒÃ`ËÃÐ_ÃÏÃÀÁÃÃP°ðàyÃ`TàIÃð*ÃÐúðpñÃààöÃ0Pð Ãð*Ã`HÃ0tð#Ã`<ÃÀ£Ãsà /Ãà÷ÃPªÃà Ã`0ÃP ÃpWÃ@_ÃÐÖÃsÃ@úÃpKÃ@Ãð¹Ã@ÃÃ^Ã`¿Ã0bÃŽÃð×Ã`BÃà÷Ã`<ÃPÃÀ£àðÃà’ðšÃ0åÃÃàÞÃÀÃ0Çà ¬ÃÐâÃ0Í÷Ã`*ðÃO ß!ÃPV$Ã`¡ÃÀÃÐSÃI!Ãðq"ÃgÃ¥ Ãðe$à7 Ã@YÃðÃ0ÇÃÐ#Ã&ÀÑ#Àf Ã1%à+"ðÉ#ÃÀö"Ã@/$Ãp(ÃPÍ%à Õ%à&Ãà'Ã0%Ãp°"ÃÀU(À§*ð½%ÃД$Ãp3"ÃPß"Ã`‰"Ã`Ü)àr+ÃÐù(ÃðÖ&Ãi&Ã)Ãðe$à–%Ã7$ÃP>(Ã`è'Ãà+Ãà&(Ãp )Ã@)Ã`î&ÃÐó)ÃÀØ'ÃÀU(ð"*ÃàD#Ãðè#Ã0g)Ãð5,ð·&Ãðk#à L'ÃÐÿ'ÃÐŽ%Ãà©'Ã`S+ð¥)ÃÐ|(à ½)àx*àã-àï+Ã0ê(à +Ã0Þ*à ±+Ã`Ö*ÀË$ÃPJ&ÃP>(Ãþ&à Ï&Ã*à (-ÃÎ*Ã`;/à +Ã@š'à&ÃÐ/ À¿&ÃÚ(ÃÐŽ%ÃÂ,à Ÿ.à ·*Ã@²#Ãp'$ðX!ÃàÇ"Ã+&ÃР"Ã@¦%Ãò$ÃÐ &à$Ã0ð'ÃÐ'ô$ÀN$Ã`‰"Ãò$ðL#ÃðY&Ão%Ãà»$àx*Ão%Ã`k'Ãà—*ÃP»(à Õ%Ã`q&ÃP&,À**À6(ÃPÍ%Ãà2&Ã0ü%ÃК#Ãp )Ã](Ãp&à L'à á#Ãð_%Ã0s'Ãp&Ã`â(ÃP\#Ãðî"ÃÐŽ%Ã0ê(Ã@”(ÀÑ#Ãðú Ãðâ$Ã@(Ã@”(ÃPP%à´ Ã0%Ãpz+à ±+Ã`q&Ã(ÃðS'àr+Ãæ&Ã0#Àã Ã@¸"ð·&ÀË$ÃPß"Ã@/$à%Ãø'ðÉ#Ã0"ÃД$à Û$ðF$Ã0ä)À6(ÃðG)Ã&Ã0‹#ÃàÇ"ÃðM(ð@%Ãp9!Ãð_%ÃÀØ'Ã@;"Ó#À¿&ð±'ðÉ#à¢#Ã@#&ÃðM(ÃðG)ð¥)à)ÃPJ&Ãu$ÃI!Ã0ü%Ãà£(Ã` "Ãp¶!à %ÃÀg%ÃðÖ&Ã@¸"Ã`0Ã=#ÃPP%Ã@š'ô$ÃØàIðR"ÃÀü!àœ$Ã` "Ã0—!ÃÐ'Ã1%ÃPV$À¿&àŠ'Ãðâ$Ã`ú$Ã@)%à R&ÃPn Ã`!ÃðƒÃ#Ãpž%ÀÅ%ðL#ÃPP%ÃЬ ÃÆ!Ã=#ÃЂ'ÃÀ"Àã Ãp'$ÃðS'ÀN$ÃвÃàÙà v ÃðÃ@Öà j"ðÏ"ðóÃp-#ÃÐ)!ÃÐ)!ðL#ÀT#Ã0‘"ÃPtðL#ÃðÇ!Ãþ"ÃЦ!ÃÀà v àºÃ à$ðF$Ãðe$Ãpª#ð^ Ã:ÃиñÃ"Ã0!ÃPÍ%ÃÀ!à7 Ãp¼ Ã@MÃÀg%Ã`ƒ#ñÃPå!à1!ÃР"ÃàåÃPýÃ0¯ðvÃð Ãð} ÃÀs#Ãì%Ãðô!ÃÃPñÃ` "à p!Ãp9!Ã`ƒ#à ^$Ã{#Ã`!à ó Ã`HàIðR"ÃÃ"ðdÃpÎÃ`*ÃàIð‚ÀÃЬ ÃÐ)!ßÃpÂà Ã`0ÃPÃÃ0DÃ@kÃ`Hà ÃànÃÀ©ÃÐYÃàßÃ0!ÃpÂÃ@MÀÃP ÃðÃ0»ÃðÃ@âÃ@¾!Ã0&ÃÌ ÃpÔÃð•ÃÀÀÙðÕ!ÃPñÃÀÃð›Ã0DÃLÃàåÃÀü!Ãвà ùÃÐGàÃíÀŠà ˆÃpWÃpWÃÀ£ÃP†Àã ÃpÂÃð0à  ÃàßÃ`• ÷ÃÀïÀlðóÃÐ5Ã`$ÃÀ—ÃÀ,Ã"Ãð‰ÃàP!à ÃÀ»ÃðÃRÃ$ÃØÃ@îÃêÃpcÃÀ!ðpÃpÚÃð­Ã@ÃpÚÃaÃÞÃpKÃàV Ã:à[à |Ã@MÃðÃ@âÃ`¹àmÃ:Àûà ÷à Žà ŽÃàëÃÀ©Ãçð”à´ ÃaÃиÃ`­Ã@ôÃPžÃðàÒÃFÃàðÃÌ Ã°Û Ã`³Ã0PÃ`¡Ã@Öà ÃðÃ`*ÀûÃà÷Ã`­àØÃÐèÃà ÃÐMÀûÃ0Áà ˆÃиà  ðÃ@âÃ@kÃPÃP÷Ã`!ÃPŒðíÃÀ‹ñÃÀ àÌÃPŒÃÐÖÃ02àÌÃð Ã0!Ã`§Ã`HðˆÃð} Ã`¡à ‚ð|ÃиÃPÃmà ÿÃÃÃ`HÃÀ©ÀœÃ`¿ÃÞßÃð*À~ÃÀ£ÃPŒà´ ÃÒÀïÃp]ÃXÃàëÃÀ‹àgÃ`­ÃPàÞÃ(Ãð›ÃÐAÃ.ÃpWÃ@âÃðÃàtÃPÃ`¿ðvÃ`³Ãàýð‚ÃÞÃPÃ0DÃ0ÇÃàzÃPtÃ`¡ÃÃð”Ãà+"ðóàÒà |àÌñÃ@S÷Ã0ÁÃ`ËÃÃàCÃU÷Ã`¹Ãà†Ã`„ÃÒÃ02Ãð•Ã(ÃpÈÃðÃ@ÐàÆÃêÃäà ÃвÃpÂÀf ÃÀÃ@èÃP€ÃиÃàÓ Ã€„Ãàtà ùÃÀ‘à ‚Ã`¡ðjÃp¼ ÃÛÃàýÃ0»ðvÃ08ëÃ02Ã@_ÃP¤ðšñÃØÃ0>à àÒÃ°Û ÃÀà Ã0©ÃpKÃÐAÃp3"ÃpKßÃ`*ÃPtÃÀ ÃÀà  Ã@eÃÞÃ@ÃpÎÃ4ÃpWÃ`­Ã0>Ã0»Ã¥Ã0>Ã@qÃpàÃàåÃ(Ã`<ÃàëÃà€Ã0%Ãi&ÃmðíÃÐÖÃðdÃ0,àÞÃXÃ0ÇÃ0,ÀûàCà )Ã:ÃöÃÀ à ‚àCÃP’Ãà†ÃpæÃð­àaÃ0 ÀlÃ4ð|àCÃ0ßÃp{ÃÀ!à p!Ã@ÐÃ0µðvÃpàð ÃXÃ0¯Ã@MÃàÓ Ã ÆÃ0bÃP’ÃàzÃ0µÃànÃð›àUÃÒÃ@5#Ã0©ðÃÀ ÃaÃp]ÃÏÃÀ¯ÃpòÃpæÃgÃ@kÃp]Ã08Ã`<Ã`ÝÃ@ôÃðàOÃ@ÜÃP!ÃpòðíÃ0&ÃaðvÃàzà ŽÀÃàmÃ@úÃ(Ã`¿Ã`HÃPÃ@Mà ÿÃ`§ÃÀÃ@_ÃLÃêëÃ@îÃR÷ðùÃà\Ã0ÇÃ0»àIÃ[ðpÃpiÃÐÖà[ÃpKàÆÃpàÃÐGàØÃpàà ŽÃÕÃÉÀÃ@A!ÓÃp]ÃPÃÀ>ÃpæÃPžðÃP€ð|ÃÀ—ÃÀÀ~ÙÃP˜Ã@kÀlÀZ"Ãp3"ÃЬ À„Ã`TÃ¥Ã0>ÃPýà šÃиÃpÈÃ0µÃ`NÃpøàUÃaÃàÓ Ã p!à ‚ÃPå!Ã0 ðóÃ4ÃÀ&Ã0»ÃðÃð‰ÃàßÃ`¹Ãmà šÃàßàCÃPÃP ðÿÃ`ÅÃpìÃ@wð”ÃÐGÃLÃ0JÃÐSñÀéÃð Ã`¹ÃPŒÃ@SðùÃ`0Ãð•ÃO àCÃ0!Ã@ÖÃ^ÃàŒÃÐÖÃàåÀrÃPÃ:ðáà v ÀrÃp? Ã@ÜÃÃ0 ÃaàÞñëÃàÓ ÃÐGÃ@eÃà†ÃpiëÃ[à ‚÷àÒà=Ã4ÃpÂÃPÃÃà šÃÐMÀxÃðÃ0DÃà€ÃÀ©Ã@Üà ÿÃЬ à |ðÃ$ÃPß"à´ ð^ à ˆÃ.Ã[ÃpÚÃ.ÃàhÃ[ÃðƒÃàD#ÃpÎÃà\ÃPß"Ã@ÜÃ08À~ÃàhÃÀðóðíÃÀÃ`›ÃàåÃC"ðvÃÀÃðÃ7$Ã`*à šÃÞÃ0ßà Ã¥à ùÃPzÀ ÃÐMÃø#Ã02Ã@ÃÐSÀûà ÃaÃðƒÃÐ5ÃÀ‹Ã ÃPzÃÃpÚñÃp°"Ã@ÜÀà ˆà ¸ÀÃÀ£ÃàbÀrÃp? ÃÀ‘ÃÐ#"ÃÞÃ0VÃpiÃÐMÃ0»Ã`*Ã"Ã08ÃpàÃàëÀéÃð•Ãð³Ãð¿ðÃànÃ@Öà+"ÃÐ/ Ã@YÃI!Ã0,Ãð›ÃO Ã`›Àf ð^ ñÃÀ¯Ã`­Ã(ÃFÃPà šà=Ãp? ÃÀ—ÃpæÃ`$Ã0&À„ÃêÃpÎÃÐ)!Ãðô!ÃPzÃ`³ðíÃànðÃÐqÃÐGàÒÃ"Ã`ËððvðíÃð•ÃPŒÃ[Ã@_ÃP†Ã`<ÃàtàÒÃUÃÐ)!Ãð›Ã@îÀrÀã Ãð•ÃÐeÃ@ÜÃPå!ÃЬ ÃÐÄà #ÃÀJÃ¥Àf Ã(ÃàñÃànÀ`!ÃO ÃàhÃpoà /à ÃÀ,ñÃäÃ@kÙÃð} à v Ã@ÃpìÃpKàCÃ`• ÃpcÃÐwÃÀ¯àCÃP÷à šÃmðÃÐÜÃP†à ²ÃpøÀŠÃmÃP÷Ã0ÁÃð•ÓÃFÃ0,ð|ÃðÃ¥à ¦ÃÀ ðùÀœÃpìÃpìÃÀ¯Ã`HÃ@Ã0Áà #Ã0¯à Ãð*ÃÐôÃÀñÃÐÖà )ÃÏà ŽÃ¥À–ÃðÃP€ÀûàOÃ`¡Ãð*Ã@_Ã`0ðpÃØà7 Ã@âÃRà ùÃÀÃPŒÃp9!Ã@ÐÃÀ»Ã@eÃPtÃðƒÃð¡à ”ÀÃP÷Ã`¡à Ã`$ÃÐ$ÀlÃ@ÃÐ/ ÃpÂÃPñà ˆÃPn ðÕ!ÃêÃ`³Ã@SÃÀàÌÃ0 ÃÀlÃàP!ÃP†Ãð§à ÃUÃð•ßÃоÃðà |ÃÀ—àºÃð à ‚ÃÀÃÞÃ@ÊÃÀÃ@G Ã@/$ÃÐŽ%ÀrñÃ02Ãà\ðáÃÀ à ˆÃÐÊÃ@SÃ@A!à v ÃÀ©Ã@¬$ÃðÄ)ÃÀ… ÃPtÃ0\àØðL#Ã` "ÃÐ5Ã@A!Ã@âÃ@ÖÀõÃà÷Ã4ÃP÷Ã08ðÃÀ£ÃÀ&ÃÀ©ÃÀlÃ( ÃPzÃðÃêÃPtÃÀà à v Ã¥ÃðÙÃЦ!ÃÐGÃ0JÃPÃ`• Ã¥ à¨"ýà ŽÃÀßÀéà ó ÃàßÃPñÃоÃ@ÐðáÃàP!àÀà[ÃÉÃÌ Ã°Ï"Ãp¤$Ãð} Ãà€Ã`<ÃäÃÐ)!Ã0—!ÓÃð›ÃðÀõÀéÃàÃ^ßÃЬ à Àrðùà í!ëÃäÃ"!ÃP€ÃUÃð à í!Ãp-#ÃÀ!à !ÃPh!à%#ÀõÃðî"ÀxÃÐ;Ã@G Ãð Ã02À×"à1!Ã°Û ÃÃàñà Ãð ðÕ!ÃÒÀéÃÐAÃ(Ã`­ÃaÃ¥ Ã@ÐÃPzßà´ Ã02ÃÀ—Ó#ÓÃ`!Ã@âÃpÎÃ:Ã0 ÃÀê$à ÃpÔÇ!ÃÌ ÃÀ!ÃgÃ@ÖÃ`• ÃPb"Ã@Ä ÃØà ŽÃÃÀ‹à´ à í!àÀÃ`³ðpà ˆÃ( ÃpWÃà÷Ã@¾!Ã@kÃP€ÃàÙÀõÃüÀÃP€Ãð›ÀxÃP\#à ”Ã@ƒÃàñà¢#Ãp¼ Ã0 à7 ÃP€ÃànÃÏÃPzÀZ"Ã0—!ÃÀ‘ÃиÃäÃÐSÃP’ÀûÀ Ã`!Ã0 Ã`Ãð›ÃpÔÃI!Ã0!Ã0>ÃÀ8à Ã@YÃ0ÍðÃ@ÜÃpàÃàP!ÃÌ ÃÀ—ÀÃ08ÃÃÃ08Ã@ÖÀÃ@qÃ¥ÃÀÃsàUà ÃPžÃP€ÃðjÃð›ÃÀ—à$ðÕ!ÃÐMÃÀÃP€Ã0,ÃàÙÃð$ÃP’à Žà |ÃиÃÐ5Ã0©ÃàåÃÐÊÃPÃвÃ0‘"Ã¥ÃPýÃ0µÃ@âà šÀã ÃðÃð$Ã`<Ãð­Ã@ÜÃ`0ÃÐMÃ0JÃðà ó ÓÃÃÀ¯ýÃØðíÃÀÃ`§ÃððóÀûÃ°Û ÃP÷ÃPŒÃ`!Ã0#Ã4ÃpoÃöÃ0PÃðÃpÎÃ`$ÃP˜ÃPŒÃðÃ`¡ÀÃÀ&ÃÐÐÃ`§àÌðvÃpþÃ`ÝÃ0,Ã0µÃ0µÃpQðÿàÆÃFðˆÃðÃàbÃиðóÃPžà šðÃ@_Ãp]Ã0µÃ`³ÀûÃÉà ŽÃÞÃàñÃððÀ Ã`BàöàäßñÃànÃ`BÃ@èÃð•ð|àäÃð¹ÃÃ0DÃ0\ÃP!ðˆÃ¥Ã`*Ãpæà šÃ0ÇÑÃ`ÑÃ`<ÃÀ&àêàÃ@}àðð‚ÃPðÃP-ÃÐÖÃÀ—Ã`*Ãð ÃànÃ@ôÃðÃð‰Ã¥ÃP†ð‚Ãð›Ãà€Ã@îÃÀ,Ã`¹Àð‚ÃÐÄÃ@YÀÃpQà ŽÃ:Ãð$Ã@wÃðÃà\Ãв÷Ãp“à Aà  ðóÃ0»à šÃ`6ÃàhÃÐ5ÃànÀ–àaÃ0ÙÃ4Ã@eÃÐÖà1!Ãðî"ÃÀ… ÃÐÐÃ@à šÃ0&à=à[ÃP'ÃÃðíÃðÃÛÀ=àsÃàåÃ@âÃÀDÃàŒÃpcÃ¥Ã`ÅÃPÃLÃÀ>ÃÐÄðpÀlà7 à ÃÀµÃ:Ã0ÙÃð§ÃPzÃ@_ÃPýÃ`¹ÃpÔÃPžÃð0À~ÃðÃ0>ÃÐÐÃPýÃ@SÃÀ&Ãànà ‚àIÃpæÃà†Ãpì÷Ã…Ãð¡ëÃpQÃðÃ.Ã0,Ã0 à Ã`¿ÃàžÃ0>Ã4Ã0£ÃÃÃ@_ÃàtðóÃ`6ýðÃ02ÃàëÃ`0Ã@èÃLÃàñÃ4Ãà\ÃÐÜÃ@ÃàýÀÀÃP!Ãð$ÃP†Ã0£ÃpWÃP˜Ã@Ãð•ÃpiÃ`*Ã°Û Ã°óÃöÃäÃp'$ÃÆ!Àf Ã"ÃP ÀûÃоÃ`*ÃÀ,Ãð¡Ãöà ¬ÃPžÃ.ðíÃüÀàOÃð•ÃpQðíà šÃ.Ãà’àmÃ.à ÿÃpWðÃ0»Ã@ÐÃ4ÃpÚÃ`<ÃÐÄÃК#ÃPD'ðóÃP’ðóÃpQÃÐâàmÃ@âÃ`0ÃÀÃ`$Ã@ÊàÌÃÀµÃ`ÅÃàhà |ÃÐMÃàzðáà ÀrÃp¶!à+"ÃÐÐÃ`³ÃpEÃ0 ðdÃÀ—Ã`¿ÃpKðX!Ã( ÃÐMÃàbÃÀ‹ÃÒðçÃ0&ÃÐAÃðÀõÃàbÃ@ôñÃоðŽÃpìÃðÃP€ðvÃ@¾!ÃÀ—ÃðÃP'ÃP’ÃðÃÐ;Ã@_Ã0µ÷ÃPÃP÷ÃàbÃÐ;ÃP’ÃиÃ`­Ã`0àÞÃöÃоÃÀ‘ßÃ¥Ã(ÃàhÃp? ÃоÃÀ!ÃÆ!Ã`0ÃÀÃð•ëÃpòðŽÃ`¿ÃFÃ0µÃ4ÀÃÐGàÀÀûÃðà ç"ðvÃpÎÃðÃÐ_ðvÃð} ÃÀàaÃ`6ÃPn Ã$Ãà\ñÃðÃP˜ÃØÃàP!ÃànðˆñÃàbðùðóñÃÀDÃÃpÚýÃÞÃà€ÃpàÃPÃ0¯ðjÃÐÄÃ0¯Ã.ÃsÃP÷ÃPýñà à1!ßà Ãp? Ã` "àÀàOÃäÃO à #Ã`ËÃðÀûÃPÀŠàI÷Ã0©ÃÐ%Ãðw!ÃPðÃÏÃÀ‹Ã@A!Ã@eÃð ÃêýÃ`¹Ãð*Ã`ËÃgÃð›ëÃàbÃPýÃÀ‘ðvÃ@kàØÀÀ ÃðÃànÃ0µÃÐSðÿÃ`¹Ã0Çà /ÃðÀÃðà=ÀûÃÀ8ÃÐSÃð*Ã`­Ã0µÃ@kÃð•Ã`BÃ4ÃÃ(Ã02Ã0»à Ã`HÃpuà ÃÐAÃPÃ0ÇÃàñà ÃоÃØðpÃp]ÃðÃRÃð*ÃÛÀ~à ÿðóÃPÃÒÃpÂÃ.Ã@âà  ÃáÃ`BÃUÃðÃÀDÃ0PÃÀ‘Ãðƒà ‚Ãà÷ðvðÿðˆëðóÃàV à p!Ãðà ¬Ã4àCà=ÃÐÐÃÃð¦àsÃP˜Ã`BÃ0VÃ:ÃÃàJ"ÃpQÃXÃ`ZÃ@à 5Ã@ôÃPÃ0VÃsÃ`³ÃP˜ÃíÃ:ÃàÃÀ Ãàýà ÃüÀ„ÃÐGÃ0»ÃðÃÀ»ð ÃÀ àÞÀõÃ"!ÃÀ©à ÃÀ»Ã‹Ãð³ÃP’àOÃÀ… ÃÐÊÃP’ÃÀ8Ã@}ÃðÃ08ÃÃð ÙÀðˆÀÃàñà ÀõàÆÙÃànÀ„à Ã@kÃpìÃ`ÑÃPŒà ˆÃpàÃP ðÿÃpìÃP÷ÃàëÃP'Ãð¿ðÃàzÃà†Ã@YÃ@ÖÃàåÃð*ÃpQà |ÃÐÜÀàäà šÃpWÃP†àyÃpñÀã Ã`¡Ã@¾!Ã@YÀ ÃÐÐÃ`6ÃðÃÃPå!ÃÀ‹ÃgÃaÙ"ÀrÃ@ÖÃpÈñÃ`6Ã`0ÃÐÄÀ„à ÃÐÐÃP†Ã@YÃà>$à |Ã.ÃjÃÞÃ( Ã0DÃ08ÃÐÊðáÃÀ… ÃpÔÃÐÜÃ0»ÃpQÃ`0àOÃàtàÌÃ08ÃðÃ0>ÀÃÐAÃpÈÃP€ÃиÃÐÄðŽÃ`*Ã`›Ã0 À~Ã08ÃàñÃàOÓ#Ã0‘"ÃC"ÃÐAàÀÀûÃð•Ã0Óà ¬ÃêÃpÚñàmëÃ:Ã( ðjÃ@wðÃ@MÃ@YÃàåðóÃЬ ÃO ÃÀ&Ãàzð|ÃaÃPë ÃÐ5ÃÐAÃpàÃsàÒÃÐÊÃÃÃÀ&Àã Ã`}$Ã[à å Ãp3"à ÿÃ4÷Ã`­Ã0 ß!ðjð Ã@eÃоÃ@èÃ(à=Ãð›ÃàßðáÃàÓ Ã`0Ãà Ã`6ÃðƒÃ"!Ãðà ÃÐÜÃpWàºÃP’ÃgÃð‰ÃÀ‹Ã`!Ã` ðóÃp? ðpÃàP!ÃðÃ@MÃ`­Ã@èÃpæÃàßÙ"ÃиÃð¡ÃðÙÃðà ðçÃ`§ÃäÃÐÖÃà\à ˆÃ"ÃàtÃ0VÃP˜Ã@ÐÃp9!à ÃP ÃpWÃO ÃàD#Ã@¸"Ã0©Ã[ÃP€ðÕ!à%#ÃÉÃÐeð|ðš÷ÃPñÃPzñÃ@ÐÃÀ—ðˆñàUðóñÃÐÊÃðíÃp? ÃPn Ã@_Ã08ÃÃ.Ã`*Ã`³à ˆÃp3"ÃàÁ#ÃðÃ@èÃðw!ÃоÃÀ©ÃÞÃ`³ÃЦ!ÃàëÃðÃpÂÃ02Ã`³ÃànÃpÎà ðpÃÀ—ÃsÃ@Üà=Ã"ð|ÃpcÃÃPŒÃpæÃÐMÃpÂÀõÃ@âÃà†ÃàßÃðÃ(ÃPzðíÀxÃpàÃI!Ã`§Ã0,à v Ã`³Ã@qÃPŒÃÐMÃð•Ã@qÃÀÃÐÜà #ÃÐAÀÃ``Ã`ËñÃÐ5Ã(ÃÐYÃüà šÀÃÉà ÃpòÃ`6ÃsÃP€ÃàßÃð‰ð|ÃоÃpàÃP¤Ã@ÃPëÀïÃ02à ùÃ@MÃ0ÇðÃÐYÃPýÃFÃüÃÀ8Ãp]Ã`0ð|à ”Ã:ÃP€Ã`¹Ã0µÃ@ÜÃpìÃ`TÃÀµÃÀà´ ÃÀÃÕà ÃÀ… ÃP÷Ã.ÃpiÃ`Ýà Ã@SÃ@_ÃÐ_ÃpoÃÐGÃ`HÃÐÐÃÀÃðà ¸ÃXà |Ã0 ÃÃÀ2ÃÐGÃ@eÀ àÒÃàåÃ`6ððíÀàêÃиÙÃ0VÃP!Ã0åÃ0nëðÀûÃ@YÃsÃPžÀ ýà 5ÃgÃP¤Ã^ÃÀµÃ0ÍÃPÃðÀrÃ(ÃàzÃÐSÃ0»ÀxÃFÀ–àaÃÐMÃÐâÃ@úðóÃ0 ñÀÃÀ¯Ãð­ÃPàaÃ@YÃ@wÃàŒÃð›Ã@îÃRÀÃð$Ã@G à´ ÃàýÃÀÃ@ÐÃP à Ã@Ã0>ÃP'Ã@àaà=àÆÃð›àaÃP†ÃÐèÃÀ8ÃоÃ@kàêÃàzÃ`NàmÀÃPÀrÃоÃpÔÃpiÃÃÃ[ÃpàÃ02ÀõÃFÃgÃPà Ã08ÃpøàUÃäðÀõà ˆÃоú#ðÕ!ÀïÃPŒà ÃP†ÃànÃ02Ãðàðà[Ãð•Ã0µÃPŒð‚ÃpQÀrÃà†Ã@YÃPýÀûÃP°Ãð¹ÃPÃ`<ÃÐSÃÃpÂÃPå!Ã`0ÃÀ2ÃÀ&ÀÃÀ¯ÀrÃ`³ÀÃ"ÃÞàÞÃ@ÜÃÀÃоðvÃ`6ðóÀÃpcÃàzÃ@ƒðùÃ@SÀ„à[à ¸ðÿÃ`§Ãà÷ÃP€Ãð$ðvÀrÃ`*Ã0>ÃÐYÃpÚÃàtÃ[ð^ ð|ßàÆÃ`$ÃPýÀr÷àIÃÐÄÃpààÒàÒÃð àÀÃ0 àCÃpÂÃ¥Àà ¦Ãð6ÃÐôàUÃ0ÍÃ@èÃ4Ã:ÃPªÃPÃ0©ÃÐ;àÞÃ`<Ã`¿Ã0JÀÃ`BÃÐAÃ@YÃÀ©ÃRýÃðÃðÀÃ`§ÃFÃÀ‹Ã[ÃÐÐÃ`6ÃPž÷Ã0ÇÃÐSÃPÃ@YàaÃ0"ÃàJ"ÓÃð•Ã`§àÀÃP†à  ÃÀ2ÀàÀÃ@A!À×"ðçÃ0&ÃPn ÃI!ÃÀ‘à Ã@îÃÀ£Ãàëà ÃP'Ãð0ÃðÙðóÃFÃpøÃ@‰Ã`0ÃpWÃ`×àÃð›ÀxÃðÃ`¿ÃÐ_Ãð§Ã@wÀõÃpÚàUÙÃ`*àÀÃÕÃ`BðpÃ.Ã4Ã`ËÃÃðÿÃ`*Ãð›àmÃààöÃÃ`¿ÃÀ¯ÀÃ¥Ãð ÃàbÃ@_ÃÀ2Ã@ Ã@YÃ@G à ÃüÃ0JÃÉÃÐâÃàÃàÃÐeÃ4Ãðà ‚À~Ã@wÀÃpòýÃP˜Ã@ôàUÃð§àÒÃ0DÀÃð­àaÃàÃð6Ãüà[ðÿÀ ÃÀ2ðà )ÃÐÐÃ4Ã0ÍËÃP’À Ã"ðjÃ0©ÃÀÃpàÀõà ‚ÃÐSÃàØÃð Ã`§Ã:à ÃÀ2Ã@qÀðˆÃP'ð ÃFÃÐÜÃànÃPÃaÃ`$Ã0ÁðáÃàà‹ÃP!ÃP¶Ã`éð¦àmÃÐSÃàV ÃоÃyÃmà Ã`Ã@kÃpiÀœÃöÃpÚÃÐúÃdÑÃÐMÃyÃÀÃà€Ã@ÃàhÃ`6Àõà ó Ã`0Ã`­Ãà†ÃpøÃ@ ÃðàIÃ`­ÃàñÃ`¹à ;Ã0ÙÀÃLÃ@›Ã0åÃÃÃ`<Àf Ã`6Ã@}ÃÐÐà ‚ð|àäÃ0ÙÃpÃ`ÝÃ0ÇÃÐYÀÃð0Ã(Ã`³ÃàzÃà÷Ã@îÃð$Ã0>Ã`Åð‚à šÃpcÃpàÃð0Ãð­ÃÐMÃ`§àIÃ0µÃ`³à #Ãà’ðÃFÃ"àgÃFÃÏÃÕÀÃPžàäÃÏð ÃðÃ`<Ãpìà ‚à šðà…ðÃ0>Ã`ËÃp‡Ã`0à ŽÃ`BÀ ð àêÀŠà[ð|Ã@ÜÃäÃP Ã02à ðˆÃpøÃÀ8ÃÛÃðàUÀ¢àgÃ@_à ²Ã…Ãð0àöÃðÃÃÃpiÃ@ÃÐÜð|÷ýÃ@ÃFÃsÃÀ2ÃðÃpòÃ0Và ¸à ¦Ã0JÃÐSÃð$Ã@Ãð<ÃðÀÃÀPà[Ã@ÃP'ÃÉÃÃÀVÃÀ2ÃmÃ`¿Ã0\ëÃð•ÃàzÃRÃ`ÝÃP'ÃdÃÀ£Ãð­ðˆÃRÃpøÃ0\Ã£ÃЃà ¾Ã`ÑÃÐeÀÃ@}ÃÃÃð<Ã0hÃÐ}ÃP¶ÃàÃÀ2ÑÃLÃÀµÃà˜ÃÐSÃpàÃ@îà àsÃÃÐSÃ¥ÃÉàmÃ`ÑÃ@ËÀ¢ÃÕÃð¹ÃàÃÃÃpoÃÃà˜À%ÃÀñàaÃÃÀJÃ@qàÒÃ@ÜÃpæÃð$Ãð¹À ð”ÃÐ_ÃàhÃànà ²ÃÐwÃ@ÀÃ`à šÃöÃLÃ@èàÌÃ:Ã@kÃàtÃ`³ÃP ÃðÃ`¹à #Ã@îÃpÂð^ Ãð‰àÌÃàð‚ÀÝ!Ã@/$à Ãà )Ã0JÀÃpiÃð*ÃàzÃÐÐÃ@ƒÃpþÃÐGÃÀ—à ÃÐÖÃðÃ0 ÀõàÆÃO ÃÀ!ßÃ@_Ã0‘"Ã`e(ÃðG)Ã( Ãà¨"Ã@¸"ÃC"ÃàßàÀà+"à+"ÃàD#Ç!à1!Ã@G Ãà>$Ãø#ÃÀê$ÃÀð#à p!ÃPë Ã"ÃÀê$ÀH%Ã`ú$Ã@Ž)ð"*ÃÀü!Ã`‰"àŠ'à ½)ú#à |ÃЈ&ÃÀa&à&à Õ%ÃÐ &à Û$Ã`w%Ãà£(Ã0ü%ÃÐ'ÃPÁ'àœ$Ã@¬$ð()à 'ÃPÇ&ÃPV$Ãà>$Ã0ö&ÃÐÿ'à 'ÃÀ['Ãðâ$Ã@'à 'àŠ'Ãø#Ã` "à=à ^$à+"Ù"ÃÀg%Ã0ü%ÃÀö"ðdÃЬ Ãðw!Àrú#ÃpŒ(Ãà»$Ã=#à1!Ãðk#Ã$Ã`‰"ÃЦ!Ã@)%àCÃÀÃ0!à%#Ãp¶!à j"Ã`q&Ã`$Ãðâ$ÃÀO)à Õ%ÃД$ðÕ!Ã0—!Ã`k'Ãà©'Ã@A!ÃàbÓà1!ÃP\#ÃpEÃUà Ï&Ão%Ãp3"ðjðpà ^$ÃÀØ'Ã@/$à X%ÃÀö"Ãp3"ÃPÍ%Ã#Ã`#Ã`!Ã0!ÃÞÃàD#Ã$Ã`›ðpÃ0—!ÃPÙ#ÃP÷Ã` ßÃðà 'Ãà2&à |Ã`à v Ã0$ÃÌ Ã`!ÃI!ÃàV ÀxÃ`ƒ#Ã`$à–%ÃPb"ÃPb"à Ãp¶!Ã`§ÃpcÃ0»ÃRÃPn ÃpÈÃÐÄÃp? à |ÃP’ÃðÃàåðÕ!ÃP\#Ã@5#ÃPýÃ`$ðáÃ( Ã[Ãð‰ðçÃðíÃpÂÃ@_ÃÐ#"Ã0&Ã4Ã7$Àf ÀlÃI!ÃPn Ã08ÃÀðóÃÀ—ÃÀ à ‚ðÿà #Ã@ÜÃ` Ã@ÐàÀðdÃ@Ä ÃÐ/ ÃaàÞÃ`$Ãp? ëà ÃpÚÃÃÃpWÃ`*Ã0&Ã0 Ã"ÃðƒÃÐ)!Ã0!Àã ÃpÈÃp]ð|ÃР"ÃÀ"ÃÀ&Ãð} Ç!Ã@Ä Ãò$Ãà€ÃP˜Ã02Ã0µÃ4ðÃàëßÃpEà à #ÀûÃ0!Ãðú Ã"Ãàhà¨"à–%ÃÀÃ@ƒÃ0ëÃXÃÀÃÐÐÃpÎàºÃÀ… Ãð} ÃP†ÃØÃ"ÃàÙà šà Ã+&Ã`!Ã@Ä Ã@èÃ¥Ã0µÃ[Ãpª#à ç"÷ÃÐÊà7 ÃàÙÃðÃðƒÓÀÙÃ`!ÃÐGýÀràIÃ`BÃpÔÃ`›Ã@MÃànÃÀ£ÃÀ—à ÀZ"Ãð à ‚à  ÷ðR"à=àÀðóÃÐÜÃ¥Ã0—!Ã(ÃÐÄà ÃaÃO ÃPtßÃ¥ÀŠÃà÷ÃpÎð”ÃpÚÃ¥ àIÃÐ5ðjð”ÃPŒÃpÈðdÃ0µÃPÃ0»Ã0,ÃÐÐàOÃP÷ÃÏÃÀµÃÀ ÃàñÃÐYàÒàCÃ0©ñà šÃ`¹Ã.ÃÐÐÃà†Ã@îÃP˜ÃÀ—ÃÀ¯Ã"Ã08ÃànÃgÃäÃàtÃð‚ÃmÃÀÃ[Ãð à=Ã@YððóÃ0Çð à Ã.ÃðÃàhà ‚Ã0 ÃðÃpàÃyà )ÃpÈÃ0 ÃÐ#"Ãðð‚ÃpÚÀûà  ÃpìÃÀ©àÌÃPå!ÃðëàäÀðˆÃÐÖà[ÀŠÃ@Ã¥ÃäÃ@âÃ…ÃíÃ4ÃpÔàaÃ`0Ã`0Ã`¹Ã02ÃPÃà€àaÃaëÃP†ÙÃp]Ã@ôÃð³ÃÐeÑÃÀ&ÃØÃÉÃp]÷ð àOÃ0ÁðÿÃPýÀÃpoÀœÃ@qÃ`­ÀõÃðÃsðvÃsÀð‚Ã@kÃ0DëÃ0ÙÃ4Ã`§Ã0Dà ”ÃÀ©àgÃpàÃ0¯ð‚ÃÐÜÃP Ã@ÜÀlÃÐÄÃFÃ0£Ã[Ãð›ÃànÃ`HÃÐYÃpWÃ02Ã0&àIà ŽÃàŒÃÐYÃÐÐÃàåÃ@Ãà’ÃÐÄÃpÎÃ@kÃðBàyÃÐeÀ~Ãð§ÃP¤ÃpQÃÌ ÃàtÃP°Ã@âßÃ`0ÃPŒÃ`§Ã:ÃpQàÀÀïÀéÃ08Ã0PÃÐMÃ`*ðíÃÒÃ0 Ã0ÁÃÐGàUàêÀ Ã@qÃ"Ãð} ßÃÀ à j"Ã°Û Ã ÒÃ` ÃPÃÀÃð} ÃЦ!ÃI!Ãp¶!Ó#À`!Ã0‘"ÀH%Ã0µÃ`³à ˆà=Ã4ÃÆ!ÃàP!ÃpÈÃЈ&ú#Ã` ÃP†Ã@Ã@A!ÃPå!Ã`!Ã@;"Ãðâ$Ãp’'Ãu$ÃpEà1!Ã$Ã@ÊÃЬ Àlà&Ã7$ÃàÇ"ÃàÁ#Ã@²#ÀÝ!Àã ÃP÷Ã.ðáðjÃ@Êðçà%#ÀÑ#à ç"ÃÐ/ Ã0y&Ãp!%ÃP÷ÓÃ` "à d#à X%à j"Ã"ÃPÇ&ÃÚ(Ãðe$Ã`›Ãðú Ã`ú$Ãp(Ã`ú$Ãðè#Ã0—!àºÃà8%â'Ã@;"àÆðR"Ã@'à&Ã`$Ãp&Ã@G Ãð_%Ã@¬$ÃÐ%À×"Ãà>$àœ$à=àCÃpEÃpÈÃðî"Ãà,'Ã0s'ÃðÜ%Ã`#Ã`ú$Ã@/$ÃØÃÐ)!ÃðÜ%ÃÀs#Àã ÃÀà7 Ã=#Ãðq"ÃàÍ!Ç!ÃI!Ã"ú#ÃPÓ$à Û$Ãp°"Ã`• Ã` Ã0#ð:&à |Ã"!àœ$ÃPå!Ãð ô$Ãà>$ðÏ"Ã`#ÃP\#Ã"Ã@Ä ÃPß"ÃàÁ#Ã0&Ã"!à í!Ã`ƒ#ÃÀ… ÷Ã02à !Ó#Ã0µà |Ã"Ã`ƒ#ðÕ!à%Ãà&(ÃPJ&à Õ%ÃÀ ÃO Ã`#ÃP\#à´ à1!ÃàJ"ÃPP%ÃÐ#ÃðÖ&ð@%ðÃ$ðÕ!à ó ÃPÓ$ðX!Ã02Ã"ðjÃÀü!Ãðú Àã ÃPzÃÐ;ðX!Ã0%ÃÒÃ@SÃUà j"à%Ãp9!àºÃp3"Ã0!Ãðw!ÃÒÃPh!Ã`#Ãà»$ÃÀg%Ãà8%Ó#Ãð} ÃàJ"Ã`!Ã{#Ãø#à ó à%#à%Ãðô!ÃЬ à$Ã@ &Ãp!%ðáÃPë Ãð} Ã`¡Ã°Û à j"ÃPå!àIÃ( Ã`ƒ#ðáÃðƒÃ"ÃÐ#Ãðe$Ç!ÃÀ… ÃPÃ@ÐÃиÃpÈÃ`­ÃgÃ`0Ã( ðÏ"à p!à X%Ãp3"ÀË$ÃPh!àCÃ{#À×"ÃÐ)!ÃðÜ%ÃP÷ÃÀ Ãðq"À<'ÃP»(à%#À¿&ÃaÃ`¿Ã@âÃ.ÃpWÃÀ—ß!Ã0%ÃðS'ÃPë ÃÀÃØÃþ"Ã@ÊÃpÔÀéÃÀ‹Ã@MÃ`›Ã@YðíÀ×"ÃÀy"à Ã0 Ã=#Ã`!Ãp9!÷ÃpQà ÃÀ£Ãp? Ã0 Ã`§ÃÃÃàßð:&Ç!ÃêÃà÷Ã@MÙÃp¼ ÃaÃиÃÀü!ðÏ"Ãðk#Ã@ÖÃ[ÃÀ£à Ãp? ÓÃ:ÃÐAÃÞÃ°Û Ã |ÀrÃp¼ Ã@ÊÃäÃàñà )ñÃ`$Ã@Öà7 Ã@SàCÀlÃÀ!ÃPÓ$ÃÀ… ÃpEÃ`!ÃÒà Ãu$ÃPn ÃPP%Àã ÃmÃØÃÐ#ÃPzÃ:Ãð§ÃÐÄÃÉÃàßÇ!Ã`$ÃànÀÃ0>ÙÃ@5#Ã0 ÀŠñÃpEðdÃ4Ãp? Ã0"àCÃÐAà=ñÃ(à®!ÃÀy"ðÉ#Ã"Ã@SÃPå!Ã`$ÃP\#Ã0&Ã@/$ÃPtÀlÃP÷àÆÃpcÃpÚÃ0"Ãp]ÃÀDÃÐÐà[à ÃðÓÃ¥Ã0DÃ¥ðçÃÐÄÃLÃÃðî"ÃÀ!ðáÃüÃpoÃ( Ãp9!À~àêÃðà Ã(ÃÀ©ÃÀ,ÑÃ0ÇÃ08ÃÀàÀðùÃàJ"à ŽÃpæÃ@à  Ãðî"àCÃP’ÃPžýÃ@èÃpÂÃànð Ãð¡à ˆàÌÃ@kÃ0VÀÃsðùà !Ãð$ÃàñðdàCÃÀ2ÃÃðóÃ0—!ÃPzÃð§ÃÐeà ¦ÃPà ùÃð ðjÃP-ÃsàOÃPàÒÃÀ‹Ã¥ Ã@MÃðÃ(Ã@Ã0»ÀrÃ`ÃPzÃðÃànÃàtà à ‚ÃêÃàzðÿÃ0JÃ@àIÃÀ©Ã`ÑÃ@}ÃàåÃ0ÍÃmÃ@eÃÀ… ðùÃÞÃð›Ãð›Ã@kÃÐÖÃ0¯Ã`• ÃÞðçñÃàŒÃð$ÃpÚÃ…ÃÐ_àÞÃÀÃ0Íð”Ã@eÃàtà  ÀxðóàÒÃàzÃ@A!ÃpQÃàÃsÃP¤ÃÃ`HÃÐÄÃsÃоÃ0ÇÃÐeÃ0Áð|Ã`­àÞÃ0PÃP˜÷Ã`HÀÃP˜ÃðñÃ`³Ã@_Ã`§ÃpEðšÃ0PàäÃ…ð|ÃàýðíÀœà ÃP†Ãp9!à Ã@ÐÃàýÀ–Ã@à ÃÃð ÃÀ£ÃðÃÐYÃ@ÃÐÊÃ02ÙàØÃ0ÇàÞÃððŽÃàn÷Ãà÷ÃàŒÃÐÊÀïÀ~ÀrÃaÃP€ÃÀ£Ã4ÃÐYÃpàÀÃpÎÃp°"ðà à ”ÃàßÃðƒÃ@ÜÃð‰ÓðùÃ¥ Ã`*Ã:ðŽñÃpÈðùÀà šÃpcÃ@à Ãð‰ÃоÃp¶!Ãð•À~Ã.ÃðàaÃðÃÐÄÃ`­ÃÞà ÙÃÀÃð Ã4ÃÒÃà\Ãоà1!ðáÃÐÐÃиÃ"!Ãð$Ãð§Ãð§Ã`BÃà÷ÃP˜ÃÃ`¡ÃPn ð^ à ÿÃpcÃLÃàñà ”ÃpÚÃpKÃPzÃp]ÀÃ0>àÆÃ4ÃàñÃð›ðÿÃÀ&àäà ˆà |Ã0¯ðùàÒÃàzÃ@âÃPŒð¦Ã"ðóÃpàÃgÃàëÃàŒà[ÃÃ`§ÃpcÃÐÐà ëÀ~ÃpÚÃð$ÃÐÊÃ@ÊÃ@A!ÃPŒÀÃð0ðÿÃ0µð|À„Ã[ÃàhÃ@èà Ãð} ÃPŒÃP€ÃиÙÀ~à ó ÃðƒÀxÃàJ"à ”à=Àf Ã@ÐÃЬ Ã{#Ã@MÃPn Ã@ÖÃ@_Ã`*ÃÐSà Ã0µÃ0>Ãðƒà  ÀÃPñÃ°Û Ã«Ã°Û Ã ØÃpàÀ„ÃÀ… ðjÃÐ;Ã0µÃоÃàëÃßÃàbÀ`!Ãp9!ÃÀ‹ÃÀ©à ÃÌ Ã"!à d#ÃÐ5Ãp? ÃиÃÀ‘Ã0>Ã`BÃ@YÃð‰ÃØÃPýñÃ[ÃPtÃ4ÃÀ—ÃÀÃ0,ÃÏÃ`BÃ`6Ã@ÊÃÐAÃà ŽàÌÃиÃðM(ÃÃ@qàIðŽÃààÆÃðú Ãàåà ÃpÎà7 àÀÃ@ÊàIðvÃXàgÃоðóÃð$ðpÃ@YÃø#Ã0 ÃàëÃÉýÀf ÃÒðÃ0ÓÃüàÀÙà=ÃÀö"à ó ÃFÃвÃ@SÃpÔðíÃ`›Ã`›ðŽÃpÚÃ"ÃÐ;ÃpWÃàbÃ@G Ã`›Ã` Ã`³ÃP ÃP Ã@Êà ÿÃ0»ÃÐGÃPŒÃP€Ã`• ÃPë ÃÌ ÃpEÃÀ©ÀxÃ(Ã`¹ÃÀ&Ã`BÃð•Ç!ÀïÃðÃàV Ã@5#ÓÃäÃP€ð|à ó ðÿÃ08ÀrÃäÃ`›ðjà1!àCÃpòà ŽÃ"!ÃPŒÃð§à ÿÃÌ ÃmÃpEÃ`ÃPzàºÃàåÃÐÄÃàñÃ.Ã0µÃðàÒÃPžÃðƒà ˆÃÀÃð ÃàåÃmÃPÃ08Àf Ãp]Ã@ÊÃ`#ÃàD#ÃàÇ"ðˆðÿÃð Ãð•à ŽÃÐÄÃP˜ðùñÃÀ‹à1!àOÃ`*ÃÐ)!à ó ÃPë Ãð} ÃàÙðÿÃ.Ã"Ã4Ã0µÃ0!Ã`§ðÃÐMÃðÃðƒÃànñ÷ÃàßÃà8%Ã#Ã.ÀïàÒÃð•ðóÃð$ÃÐÄÀÃÐGÃp°"Ãðô!ðáà ”ÃвðvÃ0DÃðÃPÃàýÃPb"ÃÀ!ÃÐ5Ã0Dà šÃ@_ÃO Ã0 Ã0&Ãð­ÃÐAÃÀÃP÷ð|ðÃRÃØÃÀ‹Ãp¶!ÃPzÓà ˆàðÀïÃàP!ÃpÔÃ:Ãð¡Ãð›ÃàtÃpæÃð•ð^ Ã`¡Ã`0ÃÐMà ˆÃ@G ÃpQÃàýÃ@Ã08à ¦ÃÀ—Ã`›ÃPn ðÕ!Ãà\ÃððÃàzÃÀð^ Ã0‘"àUÃàà[à¢#ÃpÂÃÐÄÙÃ@ÖÃàñÃ@ÊÀã àÌÃaÃPë ÃÀÀÃpæÀlÃ`¡ðçÃÞÙÃP€ÀûÃLÃàtÃ`6ÃmÃÃ0PÃpoàUÃØÃp-#ÃàhÃ`0Ã`NÃ@ ÀûÃ0©÷Ã:ÃÉÃ0,Ã@ÖÃP’ðˆÃP’àUÃ0>÷Ã0ÇÃ`HÃ`*ðÕ!Ã` "ÃP÷ÙÃpÈÃpÎÃÐÐÃP'Ã0¯Ã0ÁÃð§ÃêÃp]À~Ã@îÃ@_ðŽÃðÃPn Ãð‰Ã`­ðdÃ`*à ¦Ãð$ÀŠÃpòÃp]ëÃðÃ:À„Ã`<Ã@Ã`ËÃÕÃpiÃð¡ÃàëÃà÷À¨ÃÀ2àOððßÃaÃP'ÃmÃ0>à[ðóà ŽÃ@âàaðŽÃ@eÃpWÃüÃLà AÃð¡ÃÉÃðÃ0Ùð”Ã"ÃÀ Ã0Áð|ÃP¤àsÃpcÃ0JÃ(ÃpiàöÃð›Ã`›ðÿÃà\ÃÀÃðÃ0»à ”ÃÐkÃð³ÃP ÃRÃ@úÃíàÒÃ`<ÃàŒÃÉàaÃÐÐÃ@èÃpàÃÐÖà àêÃ`¹Ã02ëÃ^ÃàÃpÚñÃÀ£à ÀZ"ÃPzðÃöÃÀ8Ãpà ¦àÞÃ0\ÃP-ÃÐYàgÃàñÃЦ!Ã@Êà #ÃÃðBÀàmÃÉÃpQÃÏÃ`Zà ²ð|àCÃ@wÃÃÐÊÃÐÖÃð³ÃÞÃ@ÃÀDðŽðvÃð$Ãð§Ãð‰ÃPŒÃ0ÙÃpòÃð*Ã`BÃpoÃà ÃpÚÃP ðÿÃà ÀÃÃ`HÃFÃpìÃ`BÃLðíðÿÃPÃ@_ÃàtÃPn àÌÃ`×ð¬à 5ÃmÃànÃÃÐèÃ:ÃÀ>ð²ÃXÃ@îÃ…à #ÃyÃpÃP-Ã`ãÃpoÃFÃ4Ãð0ÃLÀÀ~Ã@âÃàtÃpuÃ`ïÀÃpWÃðÅÃÐîà ÃÐÐÀÃ`¹ÃÃà’ÃÀµðÃP¤ÃdÃÐkÃ@kÃmÃsð|ÃÐ;à ÃÛÃdÃ`³ðvðˆÃpòÃ@ÐÃ0»ÃÏà #Ã`¿Ãð0ÃÛàaÃÀ—ÃP˜ÃàÃà’À%Ã0&à ˆÃ0PÃpuÃ0ñÃpÃÐYÀðÀ–àØÃp{ÃXÃ^ÃÉÀà šÃÀðóÃÐÊÃàŒÃÀ>ÃXÃ`Åà GÃgðíÃ0D÷ÃàzÃPžÃ`BÃð|ÃpKÃàýÃ0»ÃäÃ08ÃÀ£ÃPýÃÀ!ÃÐ)!Ã0©ÃÐÐÃpìëÃ@ÖàOÃ08Àð”ÃàñÃÐ;Ã¥ÃpEà |ÃðÀéßÃð›ðÃ`0à šÃ0µÃÃð”÷ÃвÃPýÃêÃð àCÃpWÃ0Pðà 5àÌÃPÃ`¡ÓÃpÚÃð ÃððpÃ0 ðvÀÃ:àÌÃ:ßÃ08Ã0 à |Ã`ËÃð³ÃàëàIÃ"ÃêðÃÐAÃ@MÃÐ;ÃðÃ@ÐÃÃÃ¥ÃpQÃäÃ0JÃUÇ!Ã0£Ãð$ÃP€ÃÀ£ðˆÃ@YÃ:ÃPÃð­÷Ã0ÍÃàÃpWðX!à ó àØÀf ÃPýÃ:Ã0"Ã:ÃPtÃ[Ã@âÃàñÃpÈÓÃ@èð”à ˆÃÀÃð¡à[ÃXÃ@YÀõðˆà #ÀœýàÒàaÃP†Ã.Ã@kÃXÃFà ÃpWÃpÚÃàåÃÀ!ÃвÃоÃÀ‘ÃÐÊÃð Ã0µð‚À Ãð$Àûðð”ÃàýÃ0åÃ`H÷ßÃðÃÐ_Ã`BÃà€ÃüÃ:àOðvÃàzëÀ¢ÃÀbÃ^Ãà€à[Ã0Ùà ”ÀïðvÃpàÃ0DÃpøðùÃ{#à ÃàñÃp]ÃPÃpuÃàñàIðÃÏÃ4ÃÐÄàÆÃàaà ùÃ@eÃð§ÃÀÃàà…àsÃð³ÃÀDÃ4Ãà\ÃP€Ã@ÃFÀðˆà ¦ÀŠàÌñÃêÃpÚÃpìðŽÃ`ZÃP¤Ã@îðÃÃÐkÃpÃP9Ã`ÅÃ`ZÀ+ÃÐèÃ@ôÃÉÃ0ÇÃÐSÃ@_ÃÀ2à Ã.àÞÃðÃ`$à ”ÃÀ8à ÄÃðï ÃÀ8ÃgÃðÃÀ>ÃÉðvàäÃpŸÃp‡Ãp{àüð¦àöÃ0ÓÃ`NÃ0>Ã08ðùÃ`HÃ0\ÃpìàäÃð­ÃàÃdÃ@qÃÐÐÃPžÃ`Bà šÃp]ÃðÃÐSÃÕýýÃÃ0PÃ@Ã@ÀÃ0VÃ@Ãð§Ã‹ÃðÅÃð­ëà´ Ãð*ÃÀ2Ã4Ã,Ãp{Ã`lÃÀÍÃP°àüÃ@ÃíÃÞÃpEÃP†ÃÀ2Ã:Ã`lÃpìÃÐÜÃP-ÃÐqÃ0nÃð­ÃpæÃpàÃÐYÃ0VÃpýÃÐMðàäÃPà )ÃÏà ¾ÃÀ8ð Ã0VÃ0DÃ0£Ã0&ÃðÃÀ2ÃsÃÐMÃ0¯ðÃ@}àaÃP'ÃÐâÃ0ÁÃ0,À„ÃjÃ@ðŽàÌÃÐèà‹ÃP¶Ãà÷ÃPÃyðŽÃ@ÜÃ`HÃ@Ã`ÝÀœÃ0ßÃdÃ0ÍÃpàà ŽÃ@Ã@ÃçßÃ.ÃàhÃððÿàUÃ0ÁÀÃ`BÃð$ÃçÃðÃ`³Ã@èðvÃà€ÃáýÃüÃsÃð$ÃdàÒÃàÃ`ÝÃ0DÃ`HÃLÃ@ÃàŒÃÏÃ:ÃFÃÐÜÃàÃÛÃðHÃÐîÃ,ÃpuÃÐGÃðÃRàgÃð¿Ã0ÍÃpcÃ`ËÃpìÃmÃ@àOðÿÀÃàÃLÃÐÖÃ@YÃÃ0ÙÃÀDÃ@ÃPŒÃÀ©ÃÃð*Ã@ôÀœÃPÃÐÐÃð*à ²àgÃ`Åà ”àOÀÃ0Và ¬ÃÐÜÃЃÃ‘ÃPÃäÃ0µÃÛÃàýÀ„à ÃP!Ã0ÙÃPžÃÀ£ÃоÀœÃð¡Ã@wà šÃpcÃ0ÍÃ@ôÃ`×àsÃ`BðÃ0ÙÃÃðÅÃPÃp]ððÃÀ2ðˆÃ`<à ¦Ã0åÃpòðÃÐÐÃP!Ã0DÃPŒðÃ`BÃP¶àÞÃ0ÓÃpþ÷ÃÐSÃPÂðÄÃ`¡ÃsÃ@àÃ`õÃXà ÄÃÀ\Ãp{ÃÐwÃÐôÃPÃð0àÃ`ÑÃà€ÃÉýÃð6Ã`ÑÃà†Ãpuð Ã@ƒÃ0ÓÃàñÃ`HËÃ:ðÃàÀàmÃ0åÃóÃà˜Ãð³ýÃRÃÐôÃÀJÃÕÃ0JðÃàäà ¸ÃáàÃàÃ@wÃ0>ÃyÃÐÜÃÀÇÀ–ð/Ã0bÀ+àsÃðËÃ`ÑÃgýÃ@ôÃ0»ðŽÃpÃÀµÃPÃ`<ÃÀJÃÐeÃ@èÃáÃPªà ²ÃdÃðNÃ`éÃP-ËÃpÃRÃpÃP'ÃðàÀÃÀÃ0ÍÃ0PÃ0ÓÃ0zà…À¢ÃÀPÃpuÃPÂà /À´à ;ÃÛÃÐYÃÐqÃÀÇÃPÃÉÃ@ƒÃÃpøÃpæÃpÃ@qÃpÚðÃ@ Ã`lÃP˜àIýÃ@ôÃpuÑÃÐÜÃ@ÃÀÍð²à šðÃð$Ã`ZÃP¶Ã`ÑÃ0µà ;ÃpþÃ0ÓÃ@èÃÐÐÃ``Ãà-ÃXà )Ãà˜ÃpþÃÐîÃPžÃà†Ã0åÃÛÃðHð”ð‚ÃðÃоÃÃ@}Ã`ZÃÃ`ÑÃ0ÍÃð0ËÃFýñð ÃpuÃàÃËÃàªÃàÃÐkÃÀ8à ²Ãð<ÀCÃ0ßàäð¦Ã À¨à ²ÃàÃÉðˆÃLÃP¤Ãð6Ãp{ÃP3ÃÐèÃààðÃpiÃáÃàÃàŒðšÃà˜ÃPªÃ…ÃÕÃçÃ`³àaà )ÀŠÃmÃpàÃjÃpÃvÃðÝÃ`ãÃp{Ã`HÃð6ð‚Ãð­ÃP-À¨Ãp ÃÀJÃÐwðšÃÐôÃàzÃXÃ^Ãð$ÃÃ`6ÃüÃÀ2ÃàtàäÃ@wÃÕÃÃÀVÃÀÙÃà’À à ˆÃ0DÃpìÃÃ0hÃð³ÃP-ÃRÃ0ÙÃ0ëÃP¤Ã@qÃ0ÍÃàtÃÐÜÃ@ôàmÀŠÃüÃPÃ`›Ã0 à  ÃÃЉÃóÀàÒÃpøàyÃP¤Ãð¹ÃíÃ0ÍÃÐGàaÃð­ÃàÃ@ôÃpòÃà÷ÃÀ£àðÃÐÖÃà€ÃsÃgÀlÃÀ»ð‚ÃP’ÃpcàÌÃð$ÃíÃðÅÃp“ÃÀ»Ã08Ãð6Ã@›ð¦ýà šÃP¶ÃçÃpòÃð§ÃpWÃpìà ²àmàsÃ`ËÃð<Ã0ÙàyÃà ÃüÃÐèÃÛÃFÃ`³ÃÐGày÷à ÃÐYÃÀ£Ã`BÃÃ`lÃð<Ã`NÃ`³ðÿÃpoÀÃPÃð6Ã`lÃPªÃ@ðÃP!ÀûàOÃÀ»à ÃðÃà Ãð×Ã@Ã0PÃP¤ÃpæÃð*ÃÐYÃgÃ4À–à ²ÃpÃ0ÓÀÃðàØàÌÃÀ&Ãà†à /Ã`TÃÐ_àÒÃLàð)Ã0ñ÷ÀrÃð*ÃPªÃpðŽÃsà 5ÃP¤ÃyÃÀ,ÃpìÃÃàöÃÀµÃÉÃFÀ–ðÃÀÇÃ0ÓÃÀÃàÃ`×ÃðÅÃP-ðÿàOðÃð³ÃP'ÃPžðÃÀßà àgÃàzÃÐMÃÐîÃp‡ÃüñÀŠÃÃÀ»ÃÐ_Ã0åÀœÃ0>ÃÉÃ@ÃÕÃà˜ÃàžÃàŒàsÃP3ÃpþÃð³àÞßÃpKÃà Ã0ÃÀPÃà€Ã@G ÃиÃP-ÃÀDàsÃðð ÃP¤ÃÐÖÃ…ðšÃPÃÃ@ÃçÃðÃð0Ã0VÀœÃpÃ^ÃðHà ;ÃÃÛÀœÃààsÃpiÃXà ;ÃPªðÃ0>Ñà AÃp‡Ã``ÃFÃÀDÃ`ÑÃð•ñÃÐúéÃPªÃÉÃöÃP’ðÃÐqÃ@ƒÃ@ ÃÀ8ËÃÀ\Ã0zÃpòÃpìÃP'Ã0PÑÃ0åÃ`TÃáÃùÀÀÀ¨àüÃpòÃà'ÃðˆÃ@•Ã`éËÃÀÁÃ`×ð Ã0Jà ²ÃÕàÃ`­Ã0JÃà¤ÀÒÃŽÃÀb×ÃyÃð§ÃàýÃP¤ÃÐôÃpÃáð¸ÃðHðàaÃðËÃdàgÃ@‰ÃÃàsÀ=ÃðÅàäÃpøÃ0bÃÐ ÃðÑÃP-Ã@eÃ@wà šÃÃÃ``àÀ®ÃÀÓðÃð­àÌÃP3ÃÀDÃÀÍÃÐkÃ`lÃRÑÃpìÃçÃÐ_Ã0nÃà°ÃðÅà ¦À–ÃÃð6ÃÃÃ@eÃ0PðÃà’Ã`fÃpæàØÃÐúÃà¤Ã—Ã`BÃ``ÃùÃÃÐúÀ1ÃP¤Ã@ôà ;à‘ÃÀÓÃàÃíÃÐ}Ã0ñÃp{Ãp{ÀÃpæÃð0Ãà’ÃÃÐúÃ`Nà Ãð0ÃpøÃÀÃÀÓð”ÃP¼ÃpÃ0ÓÃ0bÃÐkà )àüÃ0åÃÃ`¹ÃP˜ÃÃÃLÃP°ÃÕà ÃP9Ã0ÇÃ`HÃçàmÃXÃáÃpàðÀ7Ãà'ÃpÀ–ÃÀ2ÃP!ÃP!ÃÐAÃÀÃÀ\Ã:ÃáÃ`ãÃÀPÃÃ`NÃÐYÃ@wÃÀDÃÐÊðvÀ„Ã(ÃÀ,à ÊðÀ¨àðÃFÃÀÁÃÀÙÃ0ÓÃpiÃÉÃ0÷ÃP3ÃXÃð$Ã0DÃ`ÑÃpìÃyÃ@ôÃàzÃÐkÃðÃRÃ`<ëðŽÃ@îÃÀÓÀ–Ãà€ÃÃÐîëÀ„ÃáàsÃ0\àð à ¦à /ÃÀPÀÃPžÃP-ààÃ0ëÃà’Ã`fÃÀ»Ãð¡àêÃ:ðˆÃ…ÃÀ>Ã`BÃyÃÏÃjàÃpuÃ@ÃÐqÃÀ»àOÃ@àêÃÐÐÀÃàüÀÃà†ÀÀ àÌàðÀ%ÃÏÃ0VÃ@}ÃpÃ0bÃð<ÃÐîàÃ@‰ÃàëÃÀ©Ã^Ã0ÓÃêÃÐSÃ^ÃP9à ¦àaÃÕÃ0ýÃà˜ð‚ÃÐÊð‚Ã0bà…ÃÐeÃáÃÛÃÃà÷ÃÐÄÃÐ5ÃPß"Ã`HÃÐqÃà Ã0hÃdàðÃàŒÀÃ`×Ãð*ÃàëÃà÷à[ð|ÀËà ;ÃP!Ã`Ýà ¦ÃP9Ã@ÃÏÃÀ&à ÃPŒÃÀÁÃ`×à ÃpàÃÀÃPŒàOÀõÃàtÃÃà #Ã@Ã@qÃÀµÃpøÃÐúÃ@ýÃ0ÙÃ`ZÀÃÐYðùÃÐèà ²à #ÀÃÉÃ0PÃð*ýÃ0ÙÀðà /Ã0ßÃà€Ã@ðÃpþÃáÃÀÍà ¬ÃjÃLÃPªÃÐÃÐúÃàÃà ÃP-ÃÕÃsÃ`ÅÃ@úÃð¿Ãà€ÃðAÃ`×ÃpÔÃÀ&Ã0>Ã@ÜÀà ÄÃÀJÃóÃáÃàÃ@ôÃàžÃÀDÃùàÃ0PÃP¤ÃÐîÃP3ÃpþÃ0ÍÃàÃ£à ¾Ã`NÃP’Ãàzà )ÃðHÃðBÃð6ðÀàÒÃð›ÀÃÐGñÃÃÃp{Ãð¿ð#ð#À Ãð0Ã`³ÃÐÄÃÕ÷Ã@ƒÃ`³ÃÃ0ßð#à ¬ÃÀ8ÃÃ`¿Ã‘ÃÐÜÃÐwÃjÀ–àüãÃð›ÃüÃ:Ã@ÜÃÐGà àØÃ0Jàaà ÖÃÀÁÃÕÃà÷ÃðBÃðËÃà ÃÐúà Ã`ãÃPÈÃÕÃ0ÓÃðBÃ0bÃÃÃPŒÃp{ð)ÀÀ+ÃpÃ@îÃÀ8Ã^ÃÐâÃÏðšÃÐkÃÀ>Ãð³Ã(ÃÐ_ÃPÃÀ2÷à šÃ@ÃP°Ã`lÃ@‰Ã0ÁÃ@SÀ ÃÀ¯ÃPÃ`³à ²Ãð¹ÃP¤Ã@À àÌÃ:Ãð•Ãà’ÃàªàaÃÀDÃð<Ã0PÃP ÃdÃÐúÃÕÃ…ðÃäÃàÃpÃÀµÃPŒà #ÃpæÃüà ;ðŽÃ0PÃp{ð ÃàÃÃ0JàäÃ`ËàgàäÃ@YÃ0>Ã0ëÃÃ@ôÀ ÃpÚÃÀ2Ã…Ã…ÃPŒÃÐâÃàÃ@}ÃÏÃpcÃ[Ã`§Ãà†ÃpþÃÀbÃPÂÃð0ÀÃ@ôÃ"Ã(ÀŠà  à /ðšà /àäÃ0Và ÃÐÄàIÃ`ËàÃÃàzð”Ã`<ÃP†ÃpEàÞàaàÌà ÃÀ>ÃpþÃ@qÃð‰Ã0»ÃP¤Ãð­ðÃðÃà÷Ã0VàsÃà ŽàUÃÐSà  ÃP’À ÃÀ2ÃP’Ã0ÙÃ@èÃð¹Ã0ÙàðÀà AÀŠàOÀ–À àÌÃäÃ02ÃÐkàØÃäÃPÃð$Ãð*Ã…ÃP¤ÃêÃ0 Ã0 ÃÐ;àaÃFÃ0Íð‚Ã@îÃÀÁàaÃÐâÃ@ÃÐeÃpÃÃÃ`­à[Ã4ÃÉÃØÃ0ÍÃ`­ÃÐÜÃÀÁÃ@èÃp]Ã@îÃà†àmÃàÃüÃÐÖÃ@_ÃðÃPÃsàÌÃp]ÃÀ>à Ãð•ÃÀ—Ã@âÃXÃÀ8ÃÐÊàmÃð0Ãð¹àyÃà’ÃpòÃ`­ðšÃÀJÃÀ2Àlð|ÃjàðÃpKÃ@à 5ÃüÃ`NÃÃààmà ¾Ãð³ð|ÃðÃ`$ÃpàðÿÃ@eÃ(ÃàŒÃÃp‡ÃÀ>ÃPýÃp¼ Ãð<ÃpÃpòÃ@YÃ@îà  ÃàtÃpuÃÃÃP'Ã0bà /ÃÀ©Ãà÷Ãð³ÃpìÃðýðà[ÃÀàgÃ0hà[Ã@èÃpæà )Ã`TÃ0DÃ:ð#à…Ãà°ÃÐÜÃ0JÃð*Ãp‡ÃüðÿÀÃaÃ0µÃP'ÃÉÃðÃP†ð”ÃÃ`³ÃyÃ:Ã0bÃëÃÐYÃ@}Ã:Ãð6ÃÛÃÃÃ`¹ð àüÃpìÃÐeÃÃÃPÃà Ãà€àaÃÃPÃRÑà ýÃ`ÑÃ@îÃÐÜÃPýÃ@YÃpìðà ¸Ã@ÃÐ_Ã@îð ÃpuÃð³ÃÀÁÃÃÀÃ`Åðà[Ã`¿ÃÕïÃ``Ã`ÅÃàÃ@Ãàà )Ã`¿Ãp°"ÃÏÃ0ßÃPÂÃp‡à 5à )ÃP¶àyÃyàOðvÃðBðÃáÃpþÃP-Ã0åÃP°ÃоÃÞÃÐ_ÃàýÃ@ôÃ`BÃLÃÀJðˆà=Ã`ÑÃ0ñÃðNÀÃ`0Ã0bÃ@ƒàðÃð6Ãà¤Ã0€Ã@ËÃP'ÃÐâéÃÀÁÀ%Ã`TÃ@ƒðÿÃð•Ã``àÃÐwÃð*ðÃÐâðÃÃÀ2à 5Ã@kÃäÃFð”à ëàgÃðÅÃ@úÀûÃðà šÃ@}Ã@à GÃÕà šÃ@}Ã@ƒÃ4ÃÐSÃà Ã@ôÃÐÜÃàzÃ@‰Ã`ZÃ0ÍÃð³Àýà ¸ÃÃ0VðšÃàŒÃÐÊà ¬à 5ÃFÃ`6ÃÃ@}Ã0Íð ð”ðˆÃpòÃð›ÃÐ_ÃÀ¯ÃpÈàIÃÐèÃFÃÃpcÃLàêÃàà #ÃÀ,ÃpþÀÃðÃÀÃäÃ0µÃp]ÃpòðóÃ.ÃÐMÃXà )Ã0JÃ0ÙÃÀµð|ÃpWÃÐÜÀ¨àaÃ0ÇÃð¿Ãà’Ã0ÍÃÐAÃð§Ã`ËÃP!Ã`¹ÃÐÊÃpÃ0ëÃFÃ0ÍñàyÃàëÃàŒÃ`NÃpuÀÃ0ÇðÃpcà  Ã`¿ÃÀÃ0VÃPàäÃÛÃàÀÃð*Ã0JëÃð­ÃP€ðíÃ`6ÀûÀÃp]Ã:ÃÛÃ0ÙÃÃpcÃàýÃàñÃ0ÁÃÉÃmÀÃ`!Ã`­Ã0»à ¬ýÃðÃðÃ0»ð¦Ãð§ðÿà  Ãð›ÃÀÁÃ.Ã02ëÃäßÀõÃPÃ0DÃP˜ÃpiàmÃpiÃà÷ÃÀ—àºÃÀ àCà |ÃPë à ”Ãànà !Ã@ÜÃP€à |ÃàhÃÀlÃpæÃ`­ÃP†ÃÀÃÐ;ýÃ:Ã@wðóÃPzÃ`*ðjÀ~ÃÐGà ÿÃP÷ýÃÐÄÃäÃP†Ãð ðjÀ~Ã@ÃÀ—Ãð ÃàÙÀxÃÀÍàÃ`Zð”Ã`lÀ„Ã`§ÃÐÄÃà÷à ŽÃÀ©ÃÐYÃLÃP’ÃðƒÃÐÐÃ@eÀàaÃP!ÃüÃ.Ãð­ÃUð‚ÃçÃ`HÃð ÃmÃÐkÃÐîÃÀ—ð|ÃðpÃ@ÃààmÃð›Ã@âÃиÃ0Çð^ àÀðÃàŒÃÐqÃ0ÁÃPn ÓÃRÀÃð•Ã0©ÃÀ,ð Ã¥Ã`0ÃPÃ@èÃàßÀ~ÃPðùÀ~ÃÀ&ðÃ`BÃÐAÃ0£ñÃ@qÃüÃÀ2ÃÀ£À„ÃÐâÃPžðŽÃÀ2à ¦Ã`BÃ@ôðdÃð ÑÃÛÙÃ[ÃP'Ãà€ÃjàÃ0ÙðýÃ`¿ÃðÃ@wÃÀµÃyÃ`6ÃP¤Ãðvà ˆÃPŒÃà†Ãà÷ðˆÃp]ÃpQÃð¡Ã:ðŽ÷ÃP†ÃpWàÒÃpcàÞÃ0Çð ÀàØàUà ÃÀDÃ`ËÃ@wÃpòÃÀÃð•àÞÃ@îÃPzÃP†ëÀlÃàtÃÐÄÃðÃ@ÖÃð ÃàtÃ`HÃÃ02Ãð§Ã`HÃàtÃ0µà Ãð•Ã.ÃPzà Ã0DÃ`¹Ãàëà ÃP†ÓÃ@_Ã.ÃÐâà ;ÃàzÃÐÊÃðÃäÃp]ÃP€ÃÀ—Ãà\Àf Ã`*ÀûÃpÚÃP!ÃðÃ@MÃ0 Ã¥ÃÀ—Ã0JÃ@èÃàbÃpQÀ„Ã0>Ã`§ðÿÃjÃÏÃUÃ0£ÃÐÄÃpÚÃyÀÃpÔÃ@úÃ.Ãð0à šÃ0&ÃЬ ÃÀ£ÃÀ—ÃP€ðùàCÀÃàÃàtà=ÃP’à´ à=ÃmÃPýàOÃðÀ~ÃàhÃÀ£ÃPÃêðpð|Ã@îðíÃ`0Ãð¹à ¬Ã`³Ãð¡àmàÞÃÐYÃPýÃÀÀ„ÀÃpààIÃ0>ÃÀ2Ãð0Ã`HÃ.ÀÝ!ðvÃðÀð”à Ã4àÀÃ@âÃðÀlñÃ0&À×"Ã`Ëðð|ÃÀ8ðÀ à šÀxÃð$ÃÐÄÀõÀÃàåà ‚ëÃðÃ^à[Ãp]à ÃPžà #ÃsÃð§ÀõÃFà ‚ÃÌ Ã ÿ÷ÃÃÃÀ,ÃpWðçÃÀ&Ã@eÀÃmÃ@èÃà ÃàŒàUÃ0¯Ãàbà šðvÃPtÃPtÃàÙÃÏÃÉÃàñÃà÷ÃÃÃ0 ÃðÃÐÊÃpÚÃ`³ÃÐSÃÐÐà )àsÃðÀlÃðà #Ã0ÓÃð6ÃÐMÃÕÃpQÃÀ—ðáÃ@A!à ùÃàhÃêàUÃà\à Ã( ðíÃ`<à ÀxÀ Ã`HÃyÃ0ßÃ:ÃpWÃ@ôÃðBýà ó ÃpæðÿÃà÷Ã:à ÿÃÀ£ÃÀ¯Ãpìð”ð‚Ã`6Ã0ÙÃÏÃ0\ÃüÃÐÄÃÀ àUÃànÃP!ðÃpiÃ``ÃðÀÃà÷à  Ã0JÃ0©ÀZ"Ãðà šÃP ÃÃÃàåëÃ0»Ãð¡à ²Ã0&ÃÀ£Ã`<ÃFÃ`*Ã0¯ÃàßÃÀ¯Ãà˜ÃÀDà ”ÃÐSàUÃð¡ÃÐMà ‚Ãð àÌÃ0DÃÃð¡Ãð§ðíÃ@G ÃÀ‘Ãð à šÃ`¡ÃÀ ÀœÃÐâÃ@îà AÃÛà Ã0>Ã"ðÿÀxÃpÚÃÀ Ã02ñÀÃ`ZÃsÃðw!ÃÀ‹Ã0ÇÃ`³Ã[ÃPñÃÐGÃ0ÇÃàà ¸ÃÐÜðvÃÐÖÃ0µàUÃ:Ã.ÃÐ5ÃàzÃsÃð­÷à Ãð6À¨Ã0\ÃÐÜÃÀ£àÞÃpcÃ@èÃð6ÃFÃà'ÃpcÃð$Ã@wÃ`³àºÃàzÃ0JÃäà )ðÃðHðˆÃÐâÃÐÐÀÃðÃ`NÃöÃоÃ`$Ãð§Ã0JàOÃpÔà ŽÃpàÃð­à ¦ÃÐÄÃpÎÃ0PÃÃP'Ãàžà‹à  ÃÐÊÃFÀÃ0,ÃÐ_ÃRÃpìÃÀÃ0,Ã0ÓÃ@qÃð0Ãð$ÃgÃ@¾!à Ã@ÃP-ÃpÃ`õÃÕÃPžàØÃ0ÍÃ0ÓÃÐîÃ`ãà ¬Ãð$Ãð0ÃðÃÃàýÃP’À à Žà šðpÃ`¹ÃdÃÐSÃÀ… Ãð} à ‚ðùÃ`<ð”ÃÐÄÃ`›ÃpÈàUà ˆÃ`<ÃÀ2à[Ãð*Ã0ÁÃpWÀà ÃðÃðÃ…ÀÃÐÖÃFÃ`¹ÃpcÃ`$Ã0ÁðšÃp‡Ã0DÃpÈÃ`<ÃàýÃÃàåßÃðÃàýð”Ã`0ÃÃpÚÃ0¯Ã(à 5ÃàýÃð Ã@ÐÃÀ—Ã0©ÃðÃÀÃÀ8Ã0PÃ`<À„Ãоà ‚Ã0£ÃÃPzÃpKÃöÃpuà ¦ÃpWÃð ÃP†à ”ÃP’à ŽÃàßà !ÃÀ ÃÀàÆÃ08Ã`³Ã@èÃ0ÍÃ@ÖÃpoÃ0JðóÃ08ÃоÀéÃÐ;ÃÐÄÃ0DÃ`§à  ÃöÃ08Ã`6Ã@_ðíÃÀà Ã@ÖðŽÃ@âÃ0©Ã0Dà[ÃÀ»Ã@ÃÐÜÃêà šà #Ãð•àäÃ08Ã`¹Ã0ÇÃðÃ`§ð|Ã`<Ã0ÍÃðÃÀ&ðjÃ0ÙððvÃpÔÃÐGÃPÃpÈÃ08Ã0>Ãð•ÃоÃ0©à àØÃÀ—ð|àaÃÉÃÐYÃðÃpæÀœÃpÃÀ,ÃFñÃP€ÃPýÃðú Ã`ÅÃÐâàsÀÃÐ_Ãð•ÃI!ÃPýÃ@wÀÃpÔàgÃP'ÃP˜Ãp]Ãð$ÀràÀð ÃpoÃ@Üà ÃÐÜÃpÚÃÃÃÀàÀÃPn ÃàñëÃ`• Ã0¯Ã0JÃàhðùÃàzÃ@kÃ`BÃÀÃ0»Ã:Ã"ÃöÃ@wÃ02ÃðÃpàÃÐGÃ:ÃpKÃð¡Ã0µÃÃRÃPàÒÃÐÊÃðÃpoÃPªÃ@ôàäÃ0¯ÃÉÃ0ÍÃð$ÃÀ Ãð›àaà ÐÃpÃ`<àÒÃpìà Ã`³ÃоÃ0&à šÃ…ÃÃÃànà ”ÃmÃð Ã@úÃ@YÃÀ‘à Aàà ¸Ã@âðvÃ`<Ãà’ÃP'ÀðÃäÀÃ0DÀ ÃÐAÃà÷ÃàñÃ0ÓÃ`Hà ŽÃÐÄÃàbà Ãð›ÃÀ,Ã0 ÃÀ,Ã0ÓÃð¹Ã@ôÃ`0Ààêàöà ;Ã0PÃ@ôÃ0åÃpÃ…Ãp‡Ã0\à ²Ãð¡Ãà÷ÃàýÃP’ÃàñÃð¹Ãà†ÃàÃÉÃpþÃðˆÃÐÜÃP'à ¦ðÃÐkàöàäÃXÃ¥ÃÀ¯à  ÃàñÀ¨Ãíàmð Ã`<Ã@ ÃÐqÃ0\ðÃ@ôÃÐôÃ@kÃð›ð#Ãöà )ýà #ÃÉàêàgÃðHð Ã@úÀ%Ã`Nð ÃpòÃ@àäÃ@âÃ`§ÃàÃRà AÃ@}Ã0ÍÃ@úÃ`HÃÀµÃP!Ã0JÃÀÁÃÐYÃ:Ã@ÖÃðÅÃ0DÃ0ÇÃP9ÃàzÃÀ»àÞÃ0ÇÃ@_ÃàhÃÀÃÀ¯ÃÉÃ0>Ã0DÃRÃjÃÀ8÷à ²à ¦Ã`³àmðšÃ—à #Ã`6ÃàÃP?àaðçðà ¸Ã`éÃRÃpÃÀ»ð‚Ãà€ÃpæÃ@ÜÃ:ÃàëÃ0»ÃÐMÃ`Nð#ÃpòÃÐÜÃÐ_Ã4ÃpàÃ0»Ã.Ãp]à[ÃFÃpuÃPŒÃPÃÀ»àgÃP!ÃÐÐÃÀ‹ÃÀÃÃ0ÓÙà |ÃÐÊÃpiÃÏÃ@àÒÃ0&Ã08Ã0ÍÃpÎÃànÃÀ,ÃÀ,ñÃà\Ã0 ÃÐÄÀðˆýÃÞð ÃÐqÃð³ÃÐ_ðùÃð} ëàØÃðÃÀ—ÃRÃ(àÀÃàëýÃpiÃaÃÐÐÃPýÃpEÃPzÀÃànÃPÃmÃðƒÃÏÃàýðšÃÐÖÃUà ÃÀ&ÀÃpKÃPb"Ã¥Ã@kÃ@èÃ@îÃÀ2Ã0ÇÃäÃ[ÃP-Ã`§Ãðw!à ˆÃðÃÃÃ0ÍÃð›ÃànÃ@Ã`TÀÃ@SÃÃÐAà j"ÃðÃP'ðšð¬ÃÀÇÃÀ,ÃÀÃð ÃðÃöÃ0ÇÃÀÍÃÀ,ÃÐGÃPÃÀ8ÃpÎÃÐGÃpÈà  à #Ã@ÜÃ@ÊÀ~ðjÃ`0à Ã`• ÃÀÃàŒÃà’ÃFÃ"ÃÀÀÃÐSÃ¥ÃÀ Ã`!Ã@ÜÃÐÄÃ`¿Ã0Áð|àaÃÐâÃpìÃ0¯ðX!ÃÒÃ0DÃð›ÃüÃØÃêðùÃðÃ"à v Ã`³ÃmÃàtÃÀß!ÃàbÃ0DÃð›ÃPzÃ0ÓÃÛÃ@YÃ.ÃLÃ0>ÃaÃpWÀÀ„à ÿÀïÃ@ÃàbÃàßÃàåðíÃP!ÑÃð­ÃàtÃðÃàhÃØÃ.ÃÀÃÀ‘ÃÀÃÕÃÐ/ ÃàÓ ÃàÙÃ0,Ã`$àÒÃ@âÃRð|Ãê÷ÃPtÃ0,ÃgÃ@_ÃÀ2ðà #Ã`6ÃÐÜðÃP€ðvÃ02ÃàzÃÃpcÃÐÐÃÀ,ÃÀ£à ŽÃPÃÀ‘ÃP€Ã0Áà ¦à ¬Ã0,Ã`¡ÃpÚÀÃpàÃO ßÃLÃP Ã@_ðÃànÃÐ;ÃRÃP€ÀéÃÀµÃ@SÃÀðŽÃ@kÃÐ_àyÃànÓà šÃpcÃP'ÃÀ»ÃÃðÃ`­ÃàÃpÚÃÐMÃ4Ã¥ÃоÃP÷ÃpÔÃ@Öà /ÃÀÁðˆÀûÃ@ÐÃp¼ Ã`¹ÃPÃ`NÃPtÃ@ÖÃ0DðˆÃpøÃ"ðÕ!Ã08ÃÐYà Ã4ÃpÈÃ0—!à ÃÐÄÃÐAÃÐÄÃÐGÃ0DÃÐôðˆÃäÃвÃ@ÐÃ08ÃÐYÃPŒà[ÃPÃÃà’ÃPýà  ÃÞÃà÷ÃPŒðˆÃÐSñàaÃpÃÀVÃyÀûðÃ0»Ã0Çà )Ãð­ÃÀ¯Ã0,Ã`ÅÃ0JÃð›ÃÃ`¿Ã@eÃPýÃ`¡Ã:Ãð¡à ÃLð‚Ã4ÃpæÃà’ÃÉÃð¡ÃP†ÃsÃ@‰À„ÃÐGÀÃÐÖð Ãp]Ãà\Ã@Mà  Ãðú Ãðà ÃÃà¤Ã0ñÃÐÐðóÃ@YÃ0ÙÃdÃàtÃPzÃÐAÃð‰Ã:Ãp‡ÃÃ0>ÃpÎÃÐA÷ðvÃ@ÐÃÀ ðàÞÃÐÐÃPýÃÐÄÃPÃöÃpÚýÃððàüÀ¨Ã`ÑÃP'ÃpàðùÃ0µÀf Ã`›ÃàzÃ`<ÃáÃàÃÐMÀÃÐÄð|ÃPà ÿà ”Ãà†Ãð›Ãð} Ã0!ÃàtÃÉÃÐÀÃP ÃðÃ@eàOÃ`0ÃðƒÃ@MÃÀðvÃоÃ`¹ÃÐÐÃ@à )ÃyÃðÃ0PÃPËÃ08Ãð”ð”ÃÀ©Ã:ÃàñÃÀ‘À~Ã`BÃÉÃàtÃð­ÃXàäÃ02ÀrÃ(à[Ã@wÃÉÃÐYàIÀ à  ÀŠàmÃP˜ÃpàÃ0ÓÃíÃà÷Ã@ÜÀûÃÐYÃmÃ`0Ã@_Ã@YàOÃ@ÃöðóðÿÃXÀïÃ`ÃØÃ`¿ÃPÃ`HÃ`lÃð­Ã`¿àÞÀ–Ã`Ñà ÿÃ`!Ã0>ÃÞÃð ÃàzÃmÃP€Ã@îÃ@ÃÀDÃyëà Ã@îÃðà ÃÃÃpÔàÀÃXÃdÃàÒÃP†Ã@ÊÃ@qÃðÃàñÃ@îÃ@MÃ`ƒ#ðR"ÃpÎà ßÃÀ!àœ$ÀïðÃpæÃàåÃ0!Ã¥ÃàhàIà ŽðçÃ4Ãð¹ÃLÃLÀ~à ‚ÃàýÃð*ÃpÚÃpcÃÀ©Ã:ÃP˜ÃÃÀÃ0©Ã0µàÌÃ(ÃmÃ`$ÃðÃð0Ã08Ã0Dà à À–ÃpæÃð›Ã0ÁÃðà šð‚ÃàzðíÃ@MÀûÃ@ÊÃÞÃÀ Ã:Ãp]àÀÃ` "à¨"Ã@âÃPÃLÃÐ_Ã4ÃÐÊÃ`¡ÃPÃ"ÃpKÃêÃ@Ã0Jà #à ˆÃð¡ÃÐAÃð‰ÃÐAÃðè#ÃàJ"ÃК#ÃPÙ#Ãà )Ã`S+Ã0y&Ãp-#Ã@”(ÃP -Ã0[+ð,Ãæ*Ãpn-ð/Ãc'Ãà£(ÃÀa&Ãi&Ã0Þ*Ê+Àq3Ãph.ÃÐó)Ãð/-ü-ÃÐ^-ÃÈ/àï+Ãp†)ÃÀÀ+ÃÀ´-Ãp÷+ð-Ãàð0Ãï/Ã@+ð+Ã?-ðì2Ãð”1à 1ÃÚ,ÃÐó)ÃÐÿ'Ãpë-àT0Ã`¾.ÃÀI*ÃÐ|(ê0à¿3ÃÐR/ÃÀÀ+Ã@ó-à ".à 1ÃÀ´-Àô2Ãã1ð‡.Ãpý*Ã`è'ÃP¯*à +àZ/Ã'1àf-à Ÿ.à 1Ã071Ãõ.àÝ.à (-àl,à ±+Ã@š'Ãæ*Ãpë-Ãph.ÃE,àZ/Ãx.ÃÐL0Ãà…-À›,Ã`¾.ÃK+ÃÐ^-ðþ/Ã`Ö*à .,Ã0ê(à É'àŠ'ÃÐÿ'ð±'Ãpë-Ã@í.Ãph.Ãpñ,ÃP,+Ãð¾*À$+Ã0=0ÃP&,Ãpz+ÃÐá,Ãày/ÃÐù(À×"à +Ãð¸+ÃÂ,ÃðÐ'Ãð¾*à +Ã)à 4+ð/ÃÀº,Ã0a*À¡+ÃÀ=,ÃP£,ÃЈ&Ã0m(ÃÀ¨/à “0à~)Ãà,'ð4'à ½)ÃP-Ã`50Ãà*à (-Ã@í.ÃÐd,à ".Ãð).Ãpë-À­)ÃЂ'Ã0y&ÃÀÌ)Ã`k'Ãà*Ãpz+ÃÐv)ð,Ãp÷+àã-ÃÀ®.ÃÐj+Ão)Ê+àZ/ÃÐÛ-ÃK+Ãi&Ã`w%ÃÐ &à 'À**àû)ÃW)ÃP¯*Ãp(ÃðA*Ãà*Ãð).ð.(Ã`M,ÃÀÀ+ÃÀÞ&ÀË$ÃPÙ#à„(ÃÀ´-À /Ã,ÃК#Ã0…$Ã0ð'à ½)à 'Ãp'$Ãpz+À-Ã@”(Ãþ&â'à .,Ã@‚+àû)À¹'ÃÀs#Ã](Ãà+ÃÀº,ÃQ*Ãà&(À6(à L'ÃÐó)ÀÅ%ÃÀð#ÀT#ÃàÇ"ð¥)Ã@”(ÃÀê$Ã@ˆ*Ä,Ã{'à R&ÃðÊ(Ãðe$ÃÚ(ÃPÁ'Ã)ÃpŒ(Ãp? Ãp˜&ðŸ*Ãp!%ÃPb"Ã` "Ãp°"ÀÑ#Ã$Ãp9!Ã0…$ð±'ÃP>(Ãà8%Ã`• Ã`#ÀH%Ã0ö&ÃðG)À$+ÃC"Ã0…$à :*Ã0a*ð@%Ö)ÃPÙ#à+"ÃÐ;Ãðk#Ã+&à%Ã`e(Ã`ô%ðL#ÃP÷Ã@MÃР"ú#ÃÐ'Ã0%Ã0‹#Ã@;"ÃÀ… Ãà»$Ã`!Ãðe$à$Ãp-#ÃPñÃ0 ÃÆ!ÀT#à ^$À×"ß!Ã`_)Ãû-Ãò$àºÃ`‰"Ã.ÃP†ÃàßÀÝ!Ãðk#à+"ÃPñðdð4'Ãà¯&ÃÀg%Ãp'$Ã@5#ÃÀð#ÃÀ ÃÀ!Ãp3"Ã`‰"Ã{#Ã0$ÃPå!ÃPå!à%#ÃðÖ&Ã`ô%À<'Ãà¯&Ãþ"Ãø#Ã`ô%ÀN$à®!ÃÀ!ÃÐ/ ô$à%#Ã@G à í!ÃàÓ Ã %#Ãp¼ Ã"!ÃÐ#Ãp*Ã@(Ã4Ãð‰ÃÀy"Ãp!%ÃÀ… ðóÀûà%#à j"Ã°Û Ãp¶!Ã@;"à ÿÃðk#à–%Ã0m(Ãø#Ãþ"Ã`‰"Ã0%ÃàD#ÃÀm$Ã"Ã°Û Ã°X!à Û$ÃPb"Ãþ"à ç"Ã@¾!Ãð_%ÃP\#ú#ÃК#Ã@/$ÃÐ)!ÃàßÃP€Ãp? Ãðe$ÀÑ#Ãà\ÃðÃPñÃðð:&ÃÐ#à í!Ã@A!ÃPñÃØÃÐ5ðçà ùÃðà !ÃР"Ã@¾!àœ$Ãp9!Ãðî"Ãà2&ÃàP!à !Ã`}$à ÃPn Ã0!ðÏ"ÃPñÃàP!Ã`ƒ#Ã0,Ãà÷à ˆÃÐ/ Ã`!à[ÃáÃpÔà í!ÙðóÃ(Ã"Ãàµ%Ã`‰"Ã@A!àUÃàtÃ@ÖÃ`!à1!ÃÐ;Ãð‰à šà ð‚ÃÀ—ÃàÁ#à d#à í!ÃàÙðçÃвÃ0£Ãðq"Ã`›Ã`*ÃÐ;ÃPÓ$Ã[ÃÀ,Ã0 ÃàV à ‚à ‚ÃðñÃ@ÖÃÃI!ÃPß"ÃàëðpÃ¥ ÃÒÃиÃ@wÃäÃ@¸"Ã0©Ãà€ÀûÓÃÀ… ÃPë ñÀÃ`HÃÀ‘÷ÃÐ5Ãð•ÃPÃàbÃpKÃðíÃðÃLÃàåëà ÃÀ ÃUÃ0 ÃðƒðpÃиÃPn À„Ã0 Ã`#ÃpÎÃÐ#"Ã¥ ÃàÙÃPb"Ãðw!ðpÃð*ÃвÃàJ"ÃвÃ0¯ÃLÀ à[ÀõÃàåßÃÐÊàOÃàÙÃPÃ(Ãð‰Ãð Ãà÷à ˆÃ@YÃÞÃ`Ã@Ä Ã j"Ãð‰Ã`$àIÃ08à Ãpcà ÿÀûÀŠÃPÃ0DÃоÃ`§ÃP’ðÃÕÃ`§ÃоÃ0ÍÃÀà[à Ã&Ã`!Ãà\ÃpiÃð¿ðvÃ0,à à Ã08ðjðíÃðÃÀ,à7 ÃÉÀŠàÞÃaÃ0»ÃÐâÃÐÐÃ:Ãà÷ÃÐMÃ@âÃöÃ`6Ãð•ÃPýÃmÃaÃàtÃàëÃ@kÃð*ÃP'Ã@îÃ0>Ã0ÍÃÀ©ÃвÃp9!ÃPŒÃ`ËàÒÃ`¹ÃàÃFÃÐÖÃP’Ãà€Ã4Ãð­ÃÀÃÀÃÐ;Ã@A!ÃÀ ÃàÃRÃ`<ÃPýÃðÃ0»Ã`*ÃàëÃ@ÃÐYÃð›À~ÃpWðùÃpÈÃsÃ`BÃpÚÃPzÀõÃPtÃàbÃð›Ã@Ä Ã°Õ!Ã@âà )ÃyÃðw!ßÃ4ÃÀð|à #ÃÃàtÃ@kÃ:ÃиÃ"ÃpQðvÃÀ£ÃpQÃ`­ÃÐôÃÕÃÀ©ÃàtÃ02Ã0>ÃÉÃ0»Ã0¯Ã@Sà ”ÃpiÀ~ÃÀ,ð à Ã@eÃÀ,ÃÀ2ÃÀÃP À Ã…ÃðÃÐÄà  ÃPtÃÐMÃRÃÀ ðçÃàëà Ãð‰Ã`$À„ðóÃPñÃ4ÃsÃÐÊÃ0©Ãà\Ãp]ð‚Ã@_ÃÏÃàÃàëàIÃÀ©ÃÀ>Ã@‰ýÃpÈÃpÂÃÐ;ÃðÃP’Ã`<Ã`BÃ0ÁÃ`0Ãàà šðóÃвÃ@_ÀŠà Žð Ã@ÜÃÀ!àÀÀf ÃgÃÃиÃöÃpæÃ`$ðíÃÐ5Ãêà ÃàÓ Ã`›à !Ã¥Ã0DÃð$Ãðw!Ã0 àOÃ@Ã0>àIà šÃ`­ëÃ`§àäÃ0©À„Ã`<Ã`³ÃÐÊÃàåÃ02à Ã4ÃððpÃÐAà ÃÐÜÃ0DàÀÃÃð Ã@YàmÃðƒÃàhÃPýÃ0¯à®!à ÃÀñÀ àIÃ` Ã0©ÃвÃàP!ß!ÀÝ!ÃЦ!Ã0DÃPÃ0ÓàCÃØÃиÃP†Ã`ëÙÃÐMÃàëðX!Ã0£ñÃ@kÃ@qÃpKÃUÃ¥ ÀõðùÃà2&Ã@ÐÃÐÊÃ`ËÃÀDÃpcàÌÃ`­Ã0ÇÃ@Ã0,Ã:ÃpàÃ`ËÃÀ‹àºÃðÃð§Ã0ÓÃP ðóà ŽÃpÈÃÐ#"ÃР"Ãp¶!ß!ÃØàÒÃ`àIðvÃвÃðÀÃðî"ÀïÃP÷ÃÀ,ÃÞÃ@ÐÃ`­Ã0 ÃиðpÃàýÃðÃÀ… ÃàbÃ@Sð^ ÓÃPÙ#à=à |Ã0¯ÃàzÀÃP÷Ãp9!ßÃàV Ã`›ÃÀ‹Ã`!Ã"àUÃø#ðX!Ã( Ã`*ÃàÃÌ Ã0‹#Ã@kàÀÃð Ã(à ˆÃàßðóÃ0,à ÃsÃ0"ÃÐŽ%Ã`• Ã#Ão%Ãðú ÃÒÃPV$Ã0‘"ÃPë Ãðw!ÃÒÃàåÃð‰Àã Ã0"Ã@MÃpWÃ0©ÀûÃðàgÃð¡Àf ÃÐ)!ÃÐ;Ã@YÃ@ÜÇ!ÀõÃÃÐ#ÃЦ!Ã`¡Óà ‚ÃÐÄÀZ"Ã`›ÃЬ Ã+&ÃР"Ãðà[Ãp¼ ðR"Ã@ÊÃP÷Ãðî"Ãðî"Ã`k'À×"ÃPn à Ã@ÖÃ0©ÃPë Ã@Ä ÃPn ÃÐ#"Ãðú ß!ðÏ"ñÃ"ÃÀ,àIÃðq"ÃP€àÀÃàÓ Ã@;"à |Ã`à ÃÀ‘ÃpÚÃàÙÃ0"ðÕ!Ãà\Ã°Û ÃÀö"Ãðú Ã0»ñÃ@A!à ÿÃàJ"ÃÀ"Ãðw!à ÃPñÃpÂÃÀ©ÃPÃPtÃ@Ä Ã`$ðvÃðƒÃðÜ%ÃC"ÃPtÃ@ÜÃI!ÃÒÃPñà ‚ÃиðpÃP÷ÃPb"à ÃðÃpÔÃоÃ0,ðíÃàñÃàåÃ0 Ã"ðL#Ã`§ðÕ!Ç%ÃÐ5ÃPÃÃÃ`Ã@¾!ÃÐ/ Ã0&ëÃ4à ÿàÀàUàØÃ@ÜÃÀÃÀ&Ãp3"Ã@A!Ãp!%ðL#ÃPŒÃ0DÀ~ÃиðóÃP÷ÃPtÃPh!ÃÐ#ÃàbÃÀ!Ã0 ÃêðpÃ`!ÃÀ… ÃpÂÓÃð Ã(ÀõÃ.à ÀxÃÐÊà ˆÃÆ!Ã0&Ã`›ðL#à v ÃðÃоà ˆÃàP!Ã0…$Ã0a*à=Ã`³ÃpcàsÃàßÃиÃÀ‘ëÃðƒÃ{#ÃI!Ç!ÃÀm$ÃPzà í!Ã` "ðX!à v ÃÌ ÃÀ!Ã( ðíÀ„Ã"ÃP÷à j"Ã(Ã@YÃà j"Ã@¾!ÃàV à ÃP àÌà ðF$àÀÃpÈà ó Ãp9!ÃI!ÃpÚð”à ”Ãp? àCÃ0©à ÿÃ`!Ãp9!Ã:Ã`0ÃиÀõà=à p!Ã`!ðíÃ02Ã:ÃàñÃ`ƒ#Ã`• ÃиÃàV ÃðÃÐAÀxðpàÌÃÐÊÃ`¹ð÷ÃI!ÀZ"Ã0!à !ÀxÃà€ÃLÃüÃ`³à /à ŽÃ`§ÀrÃ`­ÃÐ;ÃàñÃ"ÃÐ5à ŽÃàëÃð•àIÃPÃÃàÒàÒÃ@ÃЦ!ÃÀm$ÃðÃÀÃÐAà v ð^ Ã(àaÃaÃ@kàÀÃànÃ0#ÃÀö"ÃpÂðpýÃFÃ@ÖÃàV ÃÐSàØÃPÃðÃàßÃUÃðÃ°Û Ã CÃÀ‘ðjàØÃPÃ`À`!ÃpÔÃP ÃLÃöÃоÃ[à ÃÃà ÃвàÒÃPžÃÐMà /Ãð§ð|ÃP˜Ãà†Ã0ÁÃ0…$à%#à ÃàÃ@ÃàñÃ0DÃ0>ýàÞÃÀ,Ã@îÃ@èÃ@îÃàñðvÃÀ Ã@eÃð›Ãð§ÃpQð|Ãsà ¦ßÃÀ—Ã`¹Ã0>Ã`BÃà˜ð à[ÃêÃÀ—Ã4Ãà ÀÃ0ÓÃçÃà€ÃP’à[ðÃ0ÍÃ`ËÃ0ÇðÃ@q÷Ã0ÍÃð*ÃÃÃ`ÑÃ@Ã@}Ã(ðçÃ0ÓÃ`BÃÃ@âÃPŒÃà€ÃäÃð§ÃLàOðŽàðÃ0ÓÀÃðBÃpòà ñÃàñð ÃüÀrÃÐÊÃRÃð|àOÀ„Ã@ÃÃaÃÐGÃð•ÃÀ£à ˆÃ`¹Ãð§ÃàhßÃ0DÃüÃÐ_ð‚ËëÃð¡ÃpàÃp]Àûà[ðÿÃ@/$ÃÀs#ÃÀ—ÃÏÃpÃð¿ðvàCÃÐâàaÃ`6à Ãà Ã@ÃyÃ@SÃ@ÃÏà Ã`¿ÃpWÃP†ÃöÃpKÃ(ÃàýÃüÃ(ÃÀ‘ñÃÐÜÃ@îðóÃÀýÃðÃànÃ@ÜàaÃðÃ@wÃðÃöÑÃ@eÃpæÃmÃ4ðÿðˆÃð¹Ã.Ãð•ÃP˜à àOà ˆÃÐ)!Ã4àØÃðÃÃÃЃÃ`éÃ0ÓÃpiÃP€Ã=#Ã( Ã¥àØÃ@ÜÃ@MÃPh!Ã`$Ã`6Ãà÷ÃêÃC"Ã@MÃ`BÃmÃàP!Ã@ÖÃ@ÖÃpEÃàÓ Ã°ùÃPñÃÀ!ÃÀ¯Ã0»ÃpWÃÐÄÃ@G ÃÞÃÀÀÝ!Ã`$ÃPzÀõÃÀÀrÃ@ÖÃÀ—ÃFýÃÀ8àäàgÃ^ÃP†Àã ÃÀ… ÃðÃðð|Ã0µðóÀŠÃpìð ÃgÃ@SÃÐÊàäÃÀÃàhýÃpÚð|ÃPÃ@îÃàbÃÐÊÀ~ÃàëÃ`¹àºÃpEÃà÷ÃðHàüÃÐÖÃ@eÃàßÃ[Ã0µÃXÃÀÃpWÃ@âÃP˜Ã@îÃpcÃÐâÃ@eÃÀ¯ÃLÃÀ,à šÃðƒÃ` ðóÃpoÃPªÃsÃð•ÃàåÃäÀ+Ã0¶Ãð Ã`Ã¥ ÷ðàgÃÀ‘àgàÞÃàzÀÃ@YÃàåà ÃÐYÃp{à ¦Ã`­ÃÃP’Ã`¿à ùÃP\#ÀÃFÃ`6ÃàÍ!ÃðÃ0DÃ@âÃ`­ÃÀ ðÿðdà ÃLðçëÃ`• Ãð$Ã@âÃpÚÃpòÃðƒÃ`6ÃPýÃPb"Ã@ÜÃpÎÃðÃàëðvÃP÷ÃÀðáÃÐÄÀ Ã`³ÃÐYà šÃ`ÅýÀûÃ08Ã0µàCà šàÒà )Ã@âëÃP'à[ÃиÃ@ÐÃPÃÀ&Ã`§÷ÃÉÃÏÃPÂÃpòÃð÷à ŽÀïðˆßÃ0©ÃpàÃÏðvÃÀ Ãø#÷à )ÃÐAÀÃàëÃ0PÃð¹Ã@qÃ@ÃÀ8Ãp]Ãà’ÃàýÃÀÃp3"ÃÀÃLÃ@ À+ÃàsÃ.ëÃ0PÃêÃ`0Ãà à ÃÕð‚Ã@eÃPÀŠð Ãà¤À¢à ŽàÀÃÕÃ0ÓÃ`NÃ`¿ð|ðˆÃð¿ð Ãyà ˆà ÃàåëàÞÃ`ËÃpæýÃ@ÃdÃpuÃ@îÃÐîÃP¼ÃÏÃ`0à Ã@kðˆÃ0ÁÃP!Ã…ÃpæÃ@kÑÃ0÷à ;ðÃpòð)ðšÃPªÃpìÃpiÃÐÄÃÀ»ÃðÃ4ÃðÃðHÃàÀ%Ã@ôÃ@ÃÃ¥ÃÃðÃ0ÁÃFÃpiÃ@§Ã‹Ã@qÃð0Ãð6ÃÀ¯Ã0ÙÃ`<Ãð›Ã@}ð²À¨Ã`$àÞÃÐâàà ²Ãp{Ã@èÃPÃsÃPŒà à Ã4ÃÀÁÃ0ëÃà˜Ãð¡ÀÀ%àmÃ`¿Ã4ÃÐYàUÃüÃ`<ÃÀ Ãð­à‹àüÃÐeÃÐèÃ`Ëà GÃÀßÃÛÃ0JÃP9ÃÃP˜Àà Ãà #Ã`¹à ¦Ãð¡Ãð*ÃÐwÃð0À à #Ã0JÃà˜ÃÐâÃÃ`HÃ`Ñà Üà GÃpoÃààÞÃP Ã0PÃ0ÓÃ@úÃ`0Ã0åÃP¼Ã0ÍàCÃ@ôÃàzÃ@ÃÀÁ÷ÃÃ@ƒà ²Ã`×ÃÐkÃ`TðšÃààgàÞàsÃÀ¯Ã‹Ã|Ãp{Ã`<ðÿÃpàÃpoÃP˜àUÃÀ©Ã0†à ¦ÃP3ðùÃà’ÃpoÃð•ÃpWÃpÚÃ@wà ¦Ã…ÃLàsÃÐ}à Að‚à #ÃÐqÃP°Ã@ àðàÃÐÜÃ0PàyÃ@âÃäàaÃpuà à 5Ãà€ðpà Ãð§ÃÐYà ÃP!Ã0ÓðùÃ0ÁÃáàmÃÐÜÃàåÃ(à ”Ã`0Ã@ÜÃ@ôàUÑÃPÃÀ‘ð½%Ã@ÜÃ@}Ã@úÃ0ßà /ÀÃÕÃyÃ`¹Ã4ÃP Ãp]Àà à Ã`­ÃàÃ0ÁÃàŒÃ0»À à à Ãð Ãp¶!Ã@Êà ÿÃ0»ëÃPÃÀÃ`$Ãð Ã0,ÃP˜ÃpÔÃð àÒÃ0ÇÃÀßÃðÀ„ðdÃÐ5Ã0ÇÃêÃÃà ÃPÃ`§ÃêÃpìÀà à ÀûÃ¥ÃоÃàñÃ@èÃP€ÃpuÃ`ÝÀÃ0&Ã`­ð‚ÃÀ2à[ÃpWÃà€ÃÐÐà ˆëÃ`*ÃÀ©Ã@}Ã@ƒà #ÃäÃÀ à í!Ã08Ãà†ÃÀ,ÃLÃP†à=à )Ãà€àCà[Ãð*Ã4ÃÐMÃPzÃÀÃpQðdà ˆÃUÃp]ÃÐÖÃ…ÃÐqÃàñÃpÎà ÃP ÀÃð§Ã:Ãà\ÀŠÃð0ÃêÃ0ÇÃ`­àUÃÐ_Ã@÷ÃpoÃXðvÃàßÃ0Í÷àaÃ@}Ãð0Ã`¿Ã@îàöÃpòÃPŒÃð Ã@eÃà Ã`HÃ@qÃmÃÀÁÃ08ÃÀ©ÃÃàÌÃ0ÇàÒÃ`ÝÀ–ÃÀ&à d#Ã@ÜÃÀÀŠÃàåÃÀ!ÃFÃà†Ãà ðóÃÏÃ`6ÃàåÃ`6Ãà†Ã@úà Ã@wÃ@qðùÃÀ!ÃðÃÕÃP°ÃpàÃÀ‹ÃgÃ`6ýÀõÃ`›ÃÐYÃ`¹ÃÏÃ0ÁÃ:ÃP9ðÃÐÊà šÃ¥ÃÃÀ¯à #Ã(ðùÃðÃêÃpcÃÐÄÃ`ÃÀ,Ã"Ã@ÜÀÃaðpÃP˜Ãð›ðíÃ0µÃÐÐÃðÃÐGÀÃÐYÃP!à ˆðÿÃP°ÃÐÖÃ@ÊÃ[ÃpòÃÀ»à /Ã.Ã`Bà )ÃÀ8ÃäÃ`Ã0£À–ÃÐYÃ@âÃ0JÃð›à[Ãð6ÃFÓðÿÃ0ÍÃpòðÃÀÇÃpÔÃð§ÀœàÞÃ.ðÀ–À%àÃÀ»ÃÀ&ÃüÃÐÐÃpÃð¿Ã@Ãðq"ð‚Ã`ÝÃð­Ãð¡Ã`ÅÃ@‰Ãà ÃÐÊà ÃpòÃð6ð‚ðŽÃÉÃP'ÃP’À–ÃÐÜÃÀ8Ã@wÃð³à ÄÃÐÜÃPÃÐYÃsÃà˜ðàØÃð*Ã`6ÃÃpìÃêÃP!ÃàëÃÃdÃÃ4Ãð§Ã0DÃP°ÃàŒÃpuÃP'Ãà¤ð ÀŠÃàà  àØÃÉÃdà 5Ãð6ÃäÃ0¯Ã0VÃà ðóà À¨ÃàŒàUÃàzÃ^ÃàÃÐGÃêÃPÃð6ÃP?Ã`ãÃpìÃÀ—ÃPtÃÀ‹Ãð6ÃP!ÃÐMàØÃà÷ÃÀ¯ÃP˜ÃsÃp]Ã0ÇÃpiÃÀ8ðÀÃÀJÃyñÃÏÃ0VÃ`BÃàÃÕÃàÃpàÃ@wÃ@Ã4Ã0ÍÃ@ðˆÃð<Ã`ZÃÐqÃýÃÐMÃÛÃàÃ`³Ãð<ÃÀÁÃð§ÃPŒÃ`<Ã@è÷ÃFÃüÃI!ÃpKðÃ`BðóÃ0&Ãð›Ãð*Ã0DÃð*ÃÀ2àUËÀÃ4ðÿðÿÃð*àgÃÐÖÃÐÄÃpcÃ0DÃÕð ÃÀ ÃÀ2ÃdÃ0VÀà ÀÃÞÃ0&ÃP¤ÃpþÃpòÃpæÃà ð Ã@qÃÀÃÐÖÃð³à )Ãð›à ŽÃ@Öà ðŽÃ`¿ÃsÃ0,ÃÐÊÃÀ©ÃÀ—ÃÀÃ`¹ÃêÃ`BðšÃpoÃ`<Ã(à ŽÃà÷ÃÐÐÃÛÃ0JÃÐèÃðÅÃÐèÃ`¡ðíàmÃ0ÍÃ0ÁÃà šÃÃ`ËÃpòà[Ã@ Ã@wÃsðˆÀÃ@ƒÃððçà ¸ÃP3Ãð¡ðÃ@qàØðùÃàýëýÃÐYÃ`¿ÃÐ;ÃP’à ÃÀ¯Ã¥Ã@èð|ÃàÃ``ð ÀÃÐSÃàÃð¿ÃÐÊÃgÃ0ÍÃÐÜÃíð‚ÃüÃ@ƒÃÃpoÃ0,ðùÃÀ£ÃÀ,à ¬ÃÀ,Ã:Ã@ÃÕÃp{À%ÃÐâÃà\Ã`0ÃÀÓÃð6ÃPžÃà  ÃLÃàV Ã`!ÃÐMÃÀ©ÃÀ©ÃÀÃpEÃP˜ÃÕÃ@ÃÛÃÀÃ`­ÃsÃÃÐèÃ`ËÀŠÀïàÞÀ¢ÃÐèÃ0Óà )àäÃðHàsÃà ÃÐâÃpuð5Ãp ÃFÃ`¹ÃpKà ¦ÃðÃp]à 5à ¾àUàIÃàëÃÐÖÃð›ÃðÃÐÐÃàëà )ÃànÃðÃ0VÃ^Ã@ƒÃàÃ`ÅÃpÎÃPŒà šÃ@ôÃpøÃÀ¯ÃpÎÃpÚÀŠà Ãð*Ãð­ÃpÃð*Ã0PÃÀÁÃ`¿Ãmð|ÃàÀÃ`³Ãð Ã@wÃÏ÷ÃP˜ðóÃÐGà Äð À–Ã`BÃ@úÑà Ãð­Ãð³à šÃ`§ð Ãð$ÃÀÃð ÀÃÐ_ÃXÃÃÃàýÃðÃ¥Ã@ôÀ–ð|Ã4Ã@ôà ¦ÃÀÃð*àUÃ`*ÃÐMÃ`Ëà ÄÃÃÀ—ÃÀ£ÃÐeÃÃ`³ð|à ÃpoÃ0VÃ@eÃöÃÐÐÃà†ÃÀµÃpæÃ`¹Ãð­ÃðÃð•ð‚ÃyÃàÃÐ_ÃÐÊÃð‰Ã08ÃÀ£ÃÐMÃFÃPÃ`ÑÃ`<à Ã0>ÃàtÃFÃpìÃÃ`ÅÃ0¯ðíà ÃðÃ0JÃÐâÀ–ëÃXÃà à ð‚ÃоÃpÔàÒÃsà šÃp{ð Ã0Çð|ÃPàaÃà÷ðŽàäÀœÃà’ÃÀ8ÃÃÃ`NÃ`<Ã@âÃpoÃ…Ã0JÃ0ÍÃà÷ÃàñÃ0»Ãð§ÃpWÃððùÃà Ã0bÃÃ0ÓýÃÐYÃà àÆÃ@ÜÃ`ÅàðÃð§ÃÐAÃð6Ã@›àÞðóÃPŒð ÃðÑÃÐÜÃ0DÃðÿÃÀ ÃÐMÃ0ÁÃpÚÃ`0Ã…Ã0åÃ@à  ÃpÚÃ@âÃÃpÎÃà÷À„Ã`BÀ®ÃpÔàUÃ0ÙÃ`§ÃÀ2ÃÉðˆÃ`ÅàUÃð­Ãð­ÃP!ÃàŒÃÐîðçÃÐÜàäÃ@eÃ`rÃÀåÃ@‰ÃP'ÃpiðŽÃpì÷ÃFÃ@ÐÃ0>Ã@úÃ0JÃÐîÃ@kÀ„ðùÃpìÃÐèàØÃPžÃðÃÀ&ÃLÃ4ÃÐÊÃPžÃpìñÃ0JÃ`*Ã°Û Ã°vÃ08ÃpÚÃ`­Ã0ÇÃÐúÃÐ_ÃÀ©ðóà àgÃÀ,ÀÃ02Ã08À ÃðHð5ðÃ@YÃ`BÃp{à ¸Ãð‰à Žà |Ãð§Ã0åÃpÚÃÀ©ÃP€À–ÃÀÍð À%Ãöà ÃP¶ð‚Ã@YÃ0PÃà÷ÃðÀÃ^àUÃÀ ÃpEÃÐSà ÃpÔÃ(ÃànÃ@YðˆÃ0ÁÃO ÃвÃ¥À÷Ã7$à Ã@èðÃ` Ã0µÀûÃà÷ÃвÃÀ"à7 Ã0&Ã@_à !ÃpÔÃ0Íà  àÌÃ0 à j"Ãðî"à !ÃÀÀxÃðq"ÃÐ#ÃоÃ02ÃÃPÇ&Ã0ê(Ã"!Ã` ðÉ#ÃÀ['Ã+&Ãðô!Ã¥ à v à¢#ð¥)À×"Ã0‘"ðX!Ãðq"Ãp&Ù"Ãp3"ÃàÁ#ÃÀØ'ð·&Ã#ÃÀs#Ãþ"Ã"!Ã0 ÃP\#ÃÀö"Ã` "Ãp'$Ãðw!Ã`ô%Ã&Ã0$À¹'ðÕ!ð½%Ã0%Ãà8%à&ÃpÂà d#ÃÐ|(ÃW)Ãp¤$ðL#à v ëÃЬ ÃÐAðF$ÃÀm$ÃP\#Ãðî"ú#ÃàÁ#ÃÀ"Ã"Ã` "ðÏ"Ãðk#àºÃ0 à Ã`• Ãðè#Ãp°"ÃÐ$ÃàP!Ã@G ÃÀð#Ãp3"Ãà´ ðáÃ@;"Ã0ü%ÃàJ"Ã`ÃàP!ÃÒÃ0>Ã=#Ã0!ÃàåðáÃàÍ!ÃÐ#"Ã0—!À×"ÃÐ5à ó ðÉ#Ãi&Ã#Ãp? ÃàßÃPh!à |Ãð•ÃpÈÃPV$ÃÆ!à v à v Ãð_%ÃPb"à ŽÀ„Ã0µÃÀÃpQÀf Ãðâ$ÃPë Ã0&Ãðô!Ã` "Àã ÃоÀõÃÀö"Óà=Ãp-#Ã#à |Ã` à7 Ã`›ÃpWÃÐ#Ãpª#ß!à7 Ãp!%Ã0$Ã#Ãà\ÃP\#Ç!Ã:Ã@ÐÃàýÃàŒðŽÃÀ2àCðáÃ0©ðÃÃÃP€ÃÀê$ÃЦ!ÃÐ_ð‚ñÃàÓ Ã`ƒ#Ã#ÃàJ"ÃpÔÃP€ðíÃÐÜÃ0DÃÐAÃàÓ ÃðÃ(Ãà\Ã:Ãð¡ÃÌ ÃÐGÃ08à ÿà ˆÃ@;"Ù"ðùÃð¹ëÃÀÃpWÃpÂÀxà ÿÃÐ#"Ã:Ã(à  Ãð•ÃàåÃиÃp? àÆðíÃðÃ@¾!Ã@ÃÐMà ŽÃð ÀûÃÀ Ã[ÃàÙÃàV ðvÃðÃöÃÐÄÀÝ!ÃÐ)!ÃFÃpiÃÐÜÃÀÃ`Åà ÃÞÃPÃUÃàP!Ã02ÃPñÃàÓ Ãà>$à¨"àÌðˆÃ`¹Ã0µðÿà ÃpÔðpÃ@SÃÞÇ!Ã@Ðà=Ãp¶!à  ÃÐMÃ`6ÃpøÃ@qÃÀ&àOðdÃ`• Ã`§ÃÐÊÃFÃð÷Ãànð|ÃиÃð} ðˆÃ`6ÃððÃ`BÃyÃÏÃPtÀ à šÃ@eÃp{à #ÃàgÃ0ÇÃ`­ýÃpÚÃànà[à šÃPðíÃPÃ`*ÃÀ¯ÃàÃsà à !Ãð Ãð ÃP†àÒÃ0&Ã0 ÃÀ©ÃPÇ!ÃPàaÃPžÃ Ã`­à[ðùÃÃÃpæëà ‚ÃÀÀ~Ã`ÅÃð›ÃpÎÃp]ëà šÃ0,ðÃÐeÃ`0Àõà ˆÇ!Ã@eÃpcÃðàIÃðÃpÔÃ@_ÃP!ÃðàOÃÐÐÃ0JÃ4ÃÌ Ã ®!àCÃ`§à šðíðÿÃ0»ÃÐMÃ0»ÃpKðçÃð‰à ˆÃÀ©à ¾ðšÃ`BðÀŠðùÀÃÀ¯àÌàCÃPÃ0\Ã:ÃàhÃäÃmð|ÃpcàIÃÀ,Ãð} Ã0&ÃàëñÃpoÃà’Ã`§ÃPb"À~ÃððpÃÐGÃpÈÀlÃ@èÃöÃ02ÃÀ£ÃÐÄÃðàIÃpcà v à à ¦ÃÐîÃ02ÃàåÃ0ÁÀZ"ÃpàÃpoÃÀ£Ã`ãà YÃ@Ã@Ãð¡ð ÀŠÃð6Ã0DÃ`¹ÃÌ Ã0£Ã`­À–ÃPà Ãð6à ÊàäÃ0ÇÃpÃÐeÃÃpìÃ4ðÿà  Ã@èÃ…À¢ðÃ0Íà ÃaàØà /Àõà[ÃÀ>à #Ã@kÃÐ_Ã`×ÃpìÃð§Ã`³ÃP˜ÃP ÃÃð*Ãà ÃöÃP¤ÃÀÃP€À–Ãp‡À¢Ãð6ÃðÃ@kÃÀ,ÀÃ0PÃàŒÃÀ¯Ã[Ã@ÜÃàtÃÐYÃð›Ã@kÃçÃ.Ã`ËÃÀJÃP’Ãð0Ãpì÷Ãà÷ÃðÃÐâÃpð‚Ãðà  ÃP°ð ÃFÃ(ÃðÃ`NÃÐÜÃÉÃàÃpÃ^àmÃÀÁð¦ÃÀ»ÃÀ©ÃpWà )Ãðà[ÃÀ‘ðùÃ@ÃÀ»ÃÐYÃð*À¢Ã(à À–ÃRÃÐôÃÉðŽððùÃÑÃÐwÃÐeÃÐÊÃ:ýÃð$Ã@ƒÃð­Ã ÀCÃP¤ðóÃÀ ÃP˜ÃÐYðÿÃ.ëÃ`6ÃÃÐMÃ(Ã0ÇÃpQà ÃXÃ:ðùÃÐÐÀ®Ã@¡Ã.àÞÃÀ,ÃpþÃÐ}ÃÐÐàäÃpÎÃ0ÍÃà†à[ÃÀ£ÀÃàÃ0PÃð*Ã@_ýÃ:ÃpQÃ@qÃÕàäÃsÃ@ÀÃpìÃPÃÏÃpæÀ–ÃÀ,ÃÕÃpuÃ`ËÃpæàOÃyÃpWÃ`³ÃÐeÃðëÃêàUÃð•Ã`$ÀûÀàgÃáÃPÃ@Ã@kÃpìÃP!ÃÀ¯ð à ÃÀ£ÃRÃ0Dà ”ÃpQÃ`¿ÃpþñÃPªÃpþÃp{ðŽàOÃ4Ã`$Ã`<À–Ã0DÃ@YÃÐÖÀ®ÃÕÃP’Ãð¡Ã( Ãà÷àØÃÀ Ãà€à šÃ@kàØÃPŒÃ`­ÃànÃpWÃPýà  ðÃ:÷ÃPŒÃP†Ã0»ÃÀDðŽà v ÃàÁ#ÃÕà  Ãà€à 5Ã@kÃÀ2ð‚Ã@Yà Ã(Ã@Sà ¬ðÃÐÖÃÐÖðÃ`<Ã`­ÃÐÐÃLÃsÃÀ ÃRÃÀµÃвÃ0 Ã`³ÃðÃ0»àØà ùÃPŒÃpQà=ÃÐSÃ`NÀ~Ã@Üà ðáÃ@ôÃÀÁÃPÃÐÐÀxÃöÃÐMàIàÆÃPtÃ:Ãà€ÃpQÃàýÃ0>Ã.Ãp¼ à+"ÃвÃÐ;ÃàÙÃUÀlÀ~Ã`¿Ãð›ÃpKÃàV ÃÒÃpÔÃpæÃ0ÁÃð‰Ã0»à[àgÃð¿Ã`0à1!ÃÃ@èÃÀÃоàÆÃðÃÐGÃР"Ã`!ÃpÎÃð‰Ã0,Ã`• à®!ÃÃà #ÃàV ÃД$ÃÒÃ`$Ãð$ÃÐÐðŽÃÃ@eÀõÃ@_ÃpQÃPÃànÃðÃÐÊÃÀ¯Ã0\ÃàëÃO Ãp¶!Ã@ÖÃàtÃÀ!ÙÀœÃÃÀÃÐ;Ã0&Ã@SàÌÀŠÃgÃÃÀÃ@èÃLð”ð‚ÃPñÃÀëÃÐÐÃÀ‘ÃÀ2ÀŠà )Ãð$ðóÃ`*à #Ã@ÐÀ`!Ã¥ð ÃpoÃpæÃ0,Ã@_ÃP’ðóÃÀy"ÃgÃиÃßÀ ÃP’ÃPŒÃ"ÃpàÃpKð|ÀõÃ0¯ÃP€ÙÃ@îàÒÃP†Ã4À%Ã@ƒÃÐÐÃà€Ã`$ÃmÃáÃ0DðùÀïÃоÃ4à šðÿà ‚ëÃçÃÐeÃ`<ÃÐSà À–ÃÐkÃàhÃpcÃ`*Ã`¹Ãð‰ÃÉÃÐÖÃØÃÀ2Ãàýà ðˆÃpÃÛÃ0»Ã`§Ã`6ÃÐYÃànÃ@SÃ`³àäÃà ÃÐ_à ”ÃðÀÃÀ¯ÃàtÃà€Ã`¿Ãp]àaÃ0JÃäÃP à ˆÃ0Óà #Ãànà ‚ÃPÃÀDÃ0ë÷ÃpàÀ ÃÐGÃ0>à[Ãp]ðÃÀ&ÃP†ÃpiÃð*ÃàtÃàñÃpøÃð›Ãà Ã0åàððÃ@¸"Ãà÷ÃpuÃà-ÃPà ËÃ@ÃP!÷ÃPžÃLàäðvÃpÔà Ã@}Ãð¿Ãà Ã`¿Ã@}ÃÀDÃ0\Ã@‰ÃÐâà ÀÃÛÃ@âÀõÃ0>ÃÀ&ÃÀ©Ã@ÜÃ0DÃÏÃFÃ@eÃP¤ÃàzÃ`*Ã08ÃÐMÃ0¯ðÿà[Ã@ÃÀ8ÃÐSà  ÃÞÃP!àüÃP?ÃP¶Ãð•ÃÀ2ÃÃÃ`ZÃÀÁÃP'À„àêÃÀ&ÀûÃÀ&àaà 5à ²ðàIÃFà ÄÃ@îÃð*ÃðƒÃð§àöà ¦Ã0µÃPÃðËÃ…Ãð³ÃÐÖÃÕÃRÃpþÃÃÐSÃpiÃð•Ãà÷ÃÀåà ÐÃ@kÃÐGÃP!ÃÕÃPªÃ@}Àà ˆÃð÷Ãmà Žà ”ÃpæàaÃð­ÃÐYÃÀ£ÃP˜ÃP†Ã.÷ÃàŒÀ–Ãà àêÃ0ÁÃ0,Ã¥ÃànÃàzÃP€ÃFð‚Ã@qððÿÃÐ}à ÃÐGÃ0ÍàÞÃàýÃÀ—ýÃà˜ÃüÃ0¯à ¦ðÃ`ÑÃpÈÃЬ ÃpÚÀŠàÌÃaÃÐ5ÃpàÃ02ðÃP¤ÃÐÜÃà€ÃpþÃ@ÖÃ@kÃÏÃP’àÌÃ0µÃ@}Ãð§ÃÀ‘Ãmà ¸Ã@ƒÃð³Ã`³Ã0JÃ0DÃ@èÃÐMðÃRÃpiÃ@wÃ`BÃ`Bð‚ð|Ã.Ã`<Ã`<ÃP†ÃF÷ðjÃÀ Ã`HÃüÃ@ôÃÐGÃPzÃgÃàýÃ`ÑÃPýÃàtà ”ð|ÃpoÃäÃ4ÃPà[à ÿÃ@ÖÃð›Ã`›ÃpÚÃ`<àÞàÌÃP÷ÃgÃ0ÍÃXÃ.Ã@qÃÃà )ðÿÃÐGÃP˜Ãð0ÃPžÃÃp? ÃpWà šÃpÚÃð•ÀõÃÐMà ÿýÃP'ÃLÃðw!Ãp¼ ÃàýÃpcÃàŒÃànðˆà®!Ã@ÐÃêÃÐGÃ`BÃpòà 5Ã`¹Ãð§Ãà†Ã0ÇÃÃPýÃ0»Ã¥Ã0>Ã`¡Ãðî"Ãà†ÃPžÃRÃð ÃpìàÞÃ4ðÃÐeÃ0»ÃðÃPÃð<ð‚ÃPàðÀ+ð Ã‹àUÃFÃaÃÐî÷ëýÃ0ÁÃÀ©à ¬ÃpþàgÃÃ÷àOñÃà€ÃP˜ÃàtýÃÐAÀrÃ`¹ÃÃ@Ã:Ã@ôÃð6Ã`Åà ¬ÃÀÇÃ08ÃÐÊÃð<ðÃà’Ã0ÙÃ0DÃð$Ã@ÃÐúÃð<Ã0ÇÃð§Ã@qÃP¶ÃÛÃ0ÓÃð$ÃÐSÃàžàÃð*ÃÐÜÃ0VðÃ@àðÃ@wðšÀÃ0ëÃ@èÃ@ÜàÌàððšÃÃÉÃð§ÃÃÀÇàÒÃð›ÃpÃÐkàÞÃÀ»Ãð$ÃðÃP ÃÐÖÃ0ÇÃÐÖÃ@qà[ÃÀ8ÃPÃLà à ¸Ã‹Ãð$Ã@úÃ@wðšÃðNÃFÃàžà ;ÃàŒÃ‘à ¬ýÃ`ÅÃ@}À%ÃP ÙñÃð¹Ã`ËÃüðŽàöàöÀ+ÃÐèð ÃýÀ¢àmÃPÃpþÀ®ÃP¼ÃÃP’Ã`$Ã0DËÃ@ ÃðÃÀÃPÀð ÃÐÊÃÐAÃÀ8Ã@‰ÃÀÓðÃpWÃP!ð¦ÃPªÃ…ÃÉÃ@Ã:Ã`Bð‚Ã`$ÃÃÃpæÃsÃP!ÀÃà˜ÃÐúÃàŒÃPÃÃÃpàÃ`6ÃP÷ÃpWÃðƒÃàëÃÐÐàIÃPŒÀ„ÃÀ©Ã@úàÞÀû÷Ãð‰Ã`6àmÃáÃÐYÀÃ@ôÃÕÃ¥Ã`*ÃpiÃ@ÃÐqÃÐèÃpoÃ`6ÃàëÃ`ËàÞÃÐMà ÃFÃð6Ã`ËàÒÃ0ÇÃ@îÃPýÃÀ&Ãpcà Ãð›ÓëÃpÔà Ã.ÃP˜ëÃð•Ã`­Ã@èÃ4à ÃÀ‘Ãð•ÃÀ£àÞÃàñÃPðóÃÉÃÃÀ‹ÃÃP€Ãà÷ÃgÃpàÃ( Ãð‰àÀÀÃÀ‹Ã`6ð ðpÃP¤ÃöÃpKÃRÃpàÃPÀÃsÃÐAðóÃ@ÜÃà\ÃðÃ0\Ã`ËÃPŒÃRà )ÃàtÃàV ÃPýÃÐAÃðÃ`¿Ã`<Ã0µÃ`<ÃpàÃ:àäÃÃ…ÃÃðíÃPñÀïÃ0ÍÃ`ÑÃà€Ãð*Ãð­Ã@YàÌàØÃÞðçÃpcÃÀ8Ã@_ðX!ÃÐAÀrÃð›Ã@ÃÐÄÃöà Ã0»ÀõÃ@ÃÀ—Ã@_ÃÀ£ÃÕÃpÔÃÀ Ã@SÃP†ÃÀ£Ã0>àUð‚ÃðÃÀ‘ÃàñÃÞà |ÃgÃàhàÆÃÀýÀÃ@úàðÃ[àÆÃ02ÃäÃðàÀÃà†ÃàtÃ[Ã`¿àOàºÃ0 à ”Ãð§ðçÃ0"Ã` ÃPŒÃPžÃ0#ÃPë ÃðÃÛàUàCà ó ÀõÃP€Ã`­ÃÉÃPŒ÷Ã4Ã`<ÓÃ@Àà Ã0»Ãð‰àOðùÃàÃÉÃP†Ãà÷ËÃP!Ãà÷àIàØÃð*Ã…Ã@úàUÃ@_ÃyÃð­ÃPà=ÃÐ &àÆÃ…ÃP'ÃÀ©àÞðÃsýÃÐÖÃPå!ÃÀ&ÃpòÃpÔÃ`¿Ãà÷ÃP¤ÃpàÃ`³Ã0ÇÃLÃgÃ08Ã@ƒÃðÃ`ÃpQÀõà ‚Ãð•ÀûÃÃÀÃÀ,ÀðŽà ˆà Ã`Ã0µÃ0ßÃðÃaÃP!à )Ã0JÃP’ÃpþÃaÃäÃÞÃpÔÃpæÃpÚÃPýÃÃð Ã08ðvÃpÈàIÃ@èÃP'Ã0\ð|Ã`BÃÐ_Ãð§Ã0ÁÃöðÃ0»Ã@ÃÀ,Ãð¡ÃÉà  À–ÃP€ÃàÓ Ã ÞÀ ÃÐ;À~ð‚Ãà Ã@wÃð§Ãð³Ã.Ã@SÃàtÃFÃðÃ@eÃ0ÍÃÃà†Ãà’ÃàÃÐeÃÐÊàºÃ0,ðdàCÀrÃÀ£Ã@Ãð0Ã`ÑàmÃpæÃP¶Ã@Ã@îÃ@à ùëÃ@kà )à£àäÃP€Ã`­Ãð¹ÃÐâÃÉà /à[ð àgÃð§Ã`¹Ã`­ÃPŒÃÛÃÀµà šÃÛðÃ@âÀ¨ÃÐkÃp ÃðÅÃFÃÀ£Ãðð)ð”ÃpòÃð¡Ã`<Ã@ôàsÃ0ÇÃÐèÃà’ÃÀµÃ0JàÞÃÐÜÃPýÃp]ÃÀµàgà #àêÃ0\ýàOÃpÈÃüÃÐÊÃ@SÃð<ð/à /àäÀœÃÐeÃdÃ0JÃüÃàÑÃ0V÷ÃpoÃçð#ÃàüÃàåÃ@MÃRÃ`BÃ@àUÃ0¯ÃàtÃÃÃð¿Ã`NÃüà /Ãð¡ðùàÃ0hÃànÃXÀ%ÃsÃ@}Ã`NÃP°Ã`*ÃàbÃpøÃÀÇÃàªÃðBÃXÃÞð‚ð#Ã`BÃ"ðÿÃ0ÇÃPžÃpøÃÀ»ÀŠàÞð|Ã@eà[ÃÃÃFÃgÃpàÀ ÷Ã:ÃÐÄÃ0ßðˆÃP€À„Ã0ÍÃÐÊÃ(ÃLÃ@Yà ÃXðÀ à #Ãà÷ÀÃpuðùÃp]Ã@ôÃðÃàtÀœÃpÚàIÃpàÃüÃ@kÃ@èÃp]ÃÐkÃ0åÃyàäÃÀ ÃP¤ýÀëÃ`¹ÃÀ,ÃÐwÃÀÁÃ`­ÃÀ,À¢à ÃPÃPžÃ`§À ÃàŒà ÀlÀ`!Ã`¿ÃpøÃPžÃgðpÃaà ÃàzÃ@qÃpcÃ0JÃ0Jð”Ã`¿ÃðÃpìÃFàÃRÃPÃ0bÃÐîÃ`NÃ0ÇëÃÐÜÃ0ñÃÐwÃ0>ñÃ"ÃÐSàðÃà˜ÀÃÀPÃ`ËÃÀ Ã0©Ã@ÜÃð•ÃPÃ0>ÃpcÃ`<ÃRàÞà  ÃpuÀ ðŽÃ`ËÃ0ÁÀÃÐYàaÃÐÖÀœÃ:ÃÐèÃàÃpøÃ`ËÃð*ÃàhÃÐ/ àÌÃÃpcðàÌÃð*ÃP°Ãà¤ÃRÃPªðùðÿÃpæÃàV à ÃðBÃP'Ã@§à 5Ãð³ÃPÃ@ÜÀ%Ãà˜ÃÐÐÃ@G Ã`BÃà÷ðˆÀœÃÀ2à ;à ;Ã0DÃà†ÃpiÃð¡Ã—ðÃ@ÜÃpiÃP3Ã0JÃðÀûðùàÆà ð”Ã`0àÌðóàÌÀÃð§Ã0¯Ã:Ã@ÜÃ`BÃàzÃàtÃ@Ã@MÃÀ¯ðÿÃàßÃ0—!Ã¥À®à ¾à  Ãöð ðŽà ÀŠÃ0ÓÃXà )À¨àmÃXÃàýÃÐwÃð­ðÿð ÃàÃ`ÑÃ`¿Ã0»ðÿÃð*Ã0ßÀ¢ÃpþÃ0ÙÃ@eýÃð­Ã`ËðóÃ`¹ÃöÃÐAðpÃÀDÃÕàÒÃpoýÃð›Ã:ÃоÃàÃP¶ÃÀÁÃpæÃP°ÃáÃÃÑÀ Ã0ÙÃpiÀÃð6Ã`BÃpìÃ4ÃP’ÃðÃP˜Ãp]ÃÐÖÃÀ ÃLÃ08Ã@Üà ¬ÃÐwàÒÃ¥ÃÏÃÉÃð*ÃÐ_ÃpQÃÃpuÃЃÃðHÃð<Ãð›Ã@àÒðdÃmðÃ@ÃP?ÃÀ¯ð‚ÃP ÃpòÃÀÁÃpiÃP˜à šÃ`ÑÃpààaÃÀ¯ÃpcÀà  à ²Ã`¹Ã@ÖÃaðà #Ãà÷Ãyà Ãðà /Ëà #ÃÀµÃð6Ãà÷ÃÉàÞÃp]Ã@úÃpòÃÐ_à  ÃÐÄàmÃÃLÃÏà /ÃöÃpiÀrÃ`6ÃàzÃÀ8ÑàöÃànÀ–Ã0ÙÃ@ôð”ÃàžðŽÃÐYÀ ðpÃÐMÃàÃ08ÀŠÃ0ÇÃpoÃPzÃÀ ÃàŒðˆÃ:ÃÐGÃ@èÃàÃÏÃð0ÀÃ`<ÀÃÃÃpàÃà’ÃðÀàyà 5×ÃPŒÃÀ Ã`ÅàmÃÀÇàðÃáÃÀ2Ãð0ðÃ4Ãà’ÃÃàÃÃPªÃÀ»à  ÃLÃPžÃÐYà[ÃpìÃ0>ÃÉðÿÃ@âÃð$ÃPÃ:Ãð} ÃsÃ@Ã0ßÃà'À+Ã`ÝÃpoðšÃP¼ð)ÃXÃ0ÇàsÃÃ@eÃ@ÃöÃÀ,ÃÐYÃÞà=à šà /ÃpcÃÀ£Ã02ÃPàsÃà†ÃPÀÃÉÃ`ÅÃð¡Ã‹À„ÃPðšÃíàäÀŠÃð¹ÃpÃ…àäÃ¥Ã.Ã0\à ¬Ã@wà /Ãà€ðùÃÕËÃ@}À–à ¦ÃP¶ÃjÃüÃð6Ãð$ðšàöÃ@‰ÃsÃaÃÐèÃÐqà /ÃàåàÒÃ0ÍÀÃÀÁà[ÃpìÃP-Ã@Ã`ÅÃð•Ã`6ÃyÀ¨ÃÐôÃpþàÞÃÉÃP¶À¨Ã`<à Ãp{ÃÀÓÃP°Ãð*àäÃP˜ÃjÃð§ÃpKÃêà )À¢ÃðBà ;Ã0PÃ@qÃÐkÃÐkÃ@ôðŽÃ0VÃ@ Ã@àmÃÐÐÃÐYÃ@ÃjÃÀÓÑÃ@ôàsÃÀµÃ0ÓÃyà ²Ã^ÃmÃ`NÃð<ðóàÒÃ@ƒÃPÈàgÃàŒÃ…Ãð•Ã@wÃ`Ëð‚Ãð¿ðàmÃLÃ0ÇÃFÃÐ_Ã`¿Ã@}à AðÃð0ÃyÃð$ÃpuÃÀ»Ã`HÃpøÃ@ƒÃàžÃpÃ0ÓÃ0nÃÀ¯ÀÃpWàIÃpuÀÀàÃP-ÃP¼ÃÃ0DÃà€Ã@À%ÃÀ8Ã`­ðÿà ”ÃPà AÀ1ÃÿÃ0ñÃàÃ0PÃ4Ãð­ÃàýÃRÃÐSÃ0JÃàýÃÐkÃjà ¸ÃàÃÃÀÃpàêñÃ@YÃÐSÀ%ÃàÃPžÃRÃ@wà ;ÃP-Ã0nàyÃ0µÃ(ÃPð ÃÀßËÃpiÃüÃàÃÛÃà’Ã@ôðvÃðàÞÃÀPÃð6ÃmÃ`ËÃ`HÃÐÜÃP˜ÃP!Ã:ÃÀDð Ã@qÃpæÃÐèÃáÃ`¿Ã@qÃpÔÃPzÃÃ`NÃÀ—Ãð*ÃÐYÃÉ÷ÃÃÐYÃíÀÃÀm$ÀïðÃ^ðAÃPEÃð§Ã`HðÃÃpæÃ`³Ã0Áà #ÃpøÃp‡ÃçÃ0\Ãð|àOÃ`³ÃÐSÃpcàÒÃ@wÃ0bÃà!Ã@ Ãð§ÃÀµÃùàðÃ`ÑÀ1ÃpÃXÃð*àöÃÀ»Ã4ÀÃäàÌËÃà˜ÃÃÃPžÀ¢Ã`BÃÃð¹ÃÀDÃdðÃà ÃðÃÐGÀ%ÃÀÍà ¦ÃsÃð¡ÃàðÀœÃÕÃ@}ÀðÃàÃPŒðdÃp]Ãà!ÃÀPÃàŒÃð¡ÃÐÄÃpoÃ`fÃ`ËÃ@qÃð›ÃPŒÃÀ&Ã0>ðÿÃàzà ÊÃÀÇÃ0åÃP¶àmÃP’Ã`§Ã0DÃàðÃ0DÃàŒÃ0Dð|ÃP'ÀÃ[ßð‚Ã0Çà ²ÃÐôÃð§Ã`6ðÿðÃàýÃP¶Ãð¿À„àØÃ‹Ã.ÃmÃ@ÃðËÃ@ƒÃyðà ”Ãð*ÃRÃP¶ÃPžÃgÃÀ£Ã.Ã4ÃpÃ.ÃäÃPžÃ—Ã0hÃÀ»ðpðŽÃàÃ@wÃÐSÃ0ëÃÀÁÃp{ðšÃÀµðÀÃð­ÃÀ¯ÃàÃ@ÃÐ5ÃиÃ0µÃ`ËÃ0\àsÃàÃpàÀûÃ"Ã@à ¦ÃP°àðÃð§ÃüÃ0PÃóÃpoÃ@eàaàäÃ.Ã`³ÃÐÜÃ"ÃLÃÐúÃpiÃgÃàŒÃ`¹Ã`§Ãð§Ã@qÃð*Ãüà #ÃpæÃ@à ²àäÃð§ÃsÃð*ÃsÃ0JÃÛÃð0Ã0JÃÀ—Ã@ÃöÃ@qÃðð|ÃÐÐÃðàðÃLÃ`TÃÉÃ`$Ãà†ÃÃÀ8ÃFÃ`TÃÐeðÃàÃ@eÃÀ©ÃÀ2Ãà Ã@ôÃð¡ÃÐèÃpWÃ0PÃpþÃàzà /ÃP ðíðíÃÐAàØÃÀ»à ²à ¸ÀŠÃð¡Ãð§Ã@úÃð¹à ¬ÃpÃðBàØð|ÀÃpuÃ0nÃ@•ÃÀ»Ã`6ñÃpìéÃ0zÃ0åÃ.ð ÃÃ``ÃPKÃ`ZÃ0ßÃ0ÓÃÐôÃpòÀÃÐkÃÃЃÃP’Ãð‰Ã`<Ã0\ÃpÃÀÇðˆÃ^ð¸ð5ÃP!ÃÐâÃ&ð5Ãð<ÃPªÃ…ÃðÃ`NÃ@wÃð6ÃP!ÑÃFà ¦Ãð0ÃÐYàsÃP Ãð³àsÃyà ;Ã0nÃP-ÃÕðšÃÛÃ`Ëà /ÃpÃ`TÃÀµÃÐÜÃ…ÃPªÃàtÃàýÃðýÀ¢Ã@ ÃÃ^ÃðÑÃ0nÃð¿ÀœÃÐ_Ãê÷ÃÃ0€Ã0JÃP˜ÃP3Ã0åÃÀ—÷ÃàÃdÀ%Ã`BÃjÃàÃLÃÀ>ÃLÃÐkÃpøÃ0 ÃP°àÃP-Ãð*ÀÃÀ>ÃpuðÃpiÃÀÁÃÐ_ÃäÀ¨Ã—ðÃ0ÍÃÃP¤ÃðHÃ0hàðÃ0DÀ¨ÃXð ÃÐîàüÃà¤ðÃ0nÃàžÀŠÃFÃÀ>à ¬ÃðBÃP-Ã0ÓÃpà /Ã``Ã&ÃÃ`ÝÃÃ@Ã0bÃP¼Ãð­Ã…Ã@}ÃÐîÃ^ÃÐSÃàñÃ`<Ã0»Ãà†ÃPªÃP-ÀœÃ0Vð ÃPÃP¤Ãà÷Ãð0Ã^Ã`0àgÃ.àÒÃàëàIÀxÃðÀà ÃgÃ`0ÃPÃÀ&ÃmÃоÃyÀ–ÃÀûÃPtÃÐÐðàaÃðÃ4ÃàV ð|ÃpÎÃ0>àUÃ0,ÃÐ)!ÃоÃäÃðßÃFÀ„à1!Ã0!Ã0!Ã@SÃÀ,Ã0»ÃððóÃð•ÀxÃPÃÐ;à Ãp¶!ÃÌ Ã IÃ.ðvà ”ÃpQÃpÂàÒÃ0©Ãp9!ÃàëÃPŒÀlÃP ÃpÚÃ`0ÃÐ#"ÃPtñÃÀ&Ã0,À`!Ã`• ðpÃàßÃÀ… ÃÉÃ$ÃàJ"ÃàV Ã`*à ÃPýà !ÃPÙ#ÃØÃ@MÃp¶!Ã#Ãp? à¢#ÃàÙÃÀ—Ãð} Ã@(ÀÑ#à  ÃÐÄÃ02ÃÐÖÃP’÷ÃI!ðùð|à Žà !Ã.Ã`$Ã"!ÃàÙàÒÃUà ÿÃðÃPå!Ã@MÃpQÃÀö"Ãà>$Ã@¦%à p!ÃpÔÃ7$ÃðÖ&ÃÐÊà Ã"Ã`›à®!à ŽÃPÙ#Ã0 ÃàÙÃ@MÃÀ!ð^ ÀrÃð‰Ã`ƒ#à Û$Ã0s'ÃPß"ÃC"à j"Ã.Ãðú Ã`›ÃÒÀf ðÕ!ðX!Àã àÆÃ0DÃàëÃ0"Ã0%Ã0‘"Ã02Ã0µÃ`§Ã"!Ã02ÀûÃ`!Ã@¬$ðáà ÃÀ!ÃÀÃ(Ã`*ÓðjÃpÔà Ã@²#ðL#Ã0‘"Ãð‰Ãp? ß!ð@%ÃP\#ðáÃ"Ã@5#ÃÐ)!ÃPýÃyÃ°Û Ã`• ÃЬ Ã:Ã(ðdà¨"ÃÆ!à ˆÃpWÃàhÃ0,ÃP€Ã@èÃUàºÃÃ"Ã0£ÃpcÃÐAà p!ÃàV Ã4ÃP Ã0"ÃÃàåà ‚Ãð­ÀlÃ0"Ã@A!ÃÀÃÐAÃp¼ ÃUÃàÍ!Ãp? àÆÃÀÃ@ÜÃðô!ÃLÃÀ ÃP˜ðçÃpWðíàÌð|Ã0»Ãàbð|ÃäÃ`6àUÃ`• à ÃðÃÐ;Ãð•Ã`¡àCÃäÃ`HÃPÃà€ÃÐÄýÃPtà ˆÃÐ;à ÿÃÀ Ãð ÀlÃöÃð­ðvÃ`BÃÐ5àÆÃðÃðƒÃPzÃÒÃ0—!Ã0 ÃðÀŠÀÃðàgÃÛÃpWà®!Ãp¼ Ã°Û Ã`6Ãüýà v ÃÀ‹ÃðÃà†Ãà’àIÃpQÃÐMàaÃÃ0JÀŠðvÃ@ÖàgÃPžÃоÃ@YÃ0"ÃpKÃ0µëðÏ"Àã ÃààØÃð­Ãð6ÀÃ@ÜÃgÃÃ`BÃ`­ÃðÃpìÃÐkÃpWðùÃÀVÃ0Íà v à ð|ÀxÃP€Ãð­Ã@eàÒÃpàÃöÀxðˆà[Ã0ÇÃð¡ÃÀÍÃÀ»Ã`HÀÃàñð|À Ã`¿ð|ÃÃÃ4ðùð:&ÃÀ!ÃP!À%À+à ¬à  Ã@ÜÃPÃ@eÃÐÖÃÐGÃ@àaÃÃÃ`ÝàgÃ`¹Ãð$ðˆÃ(Ã@wà Ã02À~ÃÀ¯ÃRÃð­à šÃ0DÃàñÃÏÃgÃ¥ÃÐÊð^ Ã4ÃÀÃ0DÃàhÀrÃêàØÃ08àÒÀ–ÃpÔÃðÃ`ÅÃð6Ã08ÃPb"Ã@kÃÀ‘À ÃÐAÃ¥Ã0µÀéëÃp]Ãð›Ã0ÁÀ¢ÃÐâÃÐÄàÒÃÐÖð Ã(Ã02Ã`*Ã`0ÃpìÃð$ÃÀ©ðíÃ0 Ã(ÃÀ2ð‚ÃðÃ`¡ßà |Ã=#à ‚ÃäÃÀ!ÃmðÿëàUÃpcÃ.ÃàtÃ@kÃÐGÃ`<ÃsÃÐMÃ4ÃÆ!Ãð•ÃЦ!ÃÌ ÃàzÃÐYÃð›àOàgÃà€à  Ã0\Ã4Ã@âÃØÃÐÄàCÃ¥Ã(ÃàtÃ`ÃÃðÃÞÃð*ÃàtÃàëÃ@SÃ`• ÃP÷ÃP÷ýÃUÃÀðÕ!Ç!Ãð•Ã0µÀõÃaÀïÃðÃÐÖÃðƒÃð$Ã@èÃ`0ÃpÎà ‚ÃP'Ãð›ÃÉÃPÃÐ_Ã`ËÃ`6Ã°Û ÃpEÀ Ã@YÃ4ÃÀ—Ã0,ÃðÃÐÖÃöÃàbÃPñÃÒÃ0#Ã`­ÃÀÃàñà ˆÃ.ÃÃpÈÃ¥Ãà÷ÃÀDÀ Ã.àÞÃÀ©àsÃ0åÃP÷À„ðóàºÀxÃÐ;ðpà ŽÃàb÷ÃpÎÃpWÃ.ÃàÀ–Ã`6ÃpÂÃ@Ã@kÃ@eà  Ã0»ÃPýà Žð|ÃaÃ`*Ã0,ðà´ Ã@kÃàzðáñÃ0PÃ@qÃ@}ÃÐÊÓàäÃ@ôÃpÚàÒÃÀ—ðùÃð•àUÃÐâÃ4Ã`§ÃÀ ÃðÃP¤à ¸ÃÀ àgÃà ÃÀ8ðvÃ0 Ã0ÓÀà )ðˆà  ÃÀDÃ`BÃ:ÃðÃsÃFÃÛÃàåÃÐAÃP°Ãð0ÃÀµÃ`ËÃpQÃ@ÃÐèàüÑÃP3ÃP¤ÃRàêÃüÃP˜À Ã@Ã0€Ã@ ÃP’ÃüÃP'Ãà€ð ÃpìÃð$Ã@ôÃÃ@}ÃÀ¯à à šÃP!Ã0»ÃFÃ0\Ãà˜ñÃàŒÃPÃêÃ@qàmÃ`ZàÒÃ0µà )à ¾ÃpòÃpàmÃÐeÃ@ÀœëÃ0JÃà ˆÃ02ßà ”ÃÐSÃPÃ`ZÃùÃÃ`×ÃàÃp{Ã0V×ÃÀPÃ@‰Ã0ÙÃ@wðŽÃðÃLÃ0ÓÃ@ÃÀµÃàžð àðà ”ÃðÃÕ÷ÀŠÃ@Ãð*à ÃÀÃpðÃðà ¸Ã`ïÃð¹Ãà ÃÐwÃP˜Ã`¿ÃÃ@ÃpøÃ0ÙÀ+ÃðÃÃÀ&ð Ã@ÃÕÃÀÁÃàÃàtÃ@âÃÀ&ð Ãà÷ÃäÃÀ!ÃàðˆÃ0Và ÃpWÃP˜ÃÐYÃÀ8ÃÐSàUà ÃP’à šÃð›Ã@Ãð¹ÃP-ÃPŒÃ0DÃgÃÀÃÀ,Ãð›ÃÀ Ã:Ãp à Ä÷Ã`­Ã08ðšàsÃyÃÀ&ÃpcÃ@ÃP’ÃpKÃÐÊÃÐÐÃ@ôðšÃáÃ0ÁÃ@èÃÛà )Ã0Và  ÃpàÃ@_Ãð<Ãà˜Ã0bÃÀ»Ã`6ÃÐÜàêà )Ã`*ÃðÃÀÍÃpòàIÃ"à )ÃÀDÃPÃP˜ÃÐÐÃ4ÃÀ,ÃÃ@}ÃÐkÃäÃàzà ¸à #ÃÞà ÃÀ,à ÃäÀà ¬ÃÃÃ0ÇÃàëÃ0ÇÃàzÃÕÃÀ\àÃ0ÓÃÀµà ¸Ãð6Ã@qðà ²Ã@ð¦ÃP'Ã`³ðpÃP'ÃP'Ã0ÁÃpoÃÃpøÃÐÖðÀàÆÃÀ ÃPÃFÃP’Ã0¯Ãð§Ã0ÙÃRÃ0¯ÃPàgÃð6Ã@îÃ(àÞÃ0ÙÃàýà ¬ÀÃ0ÍÃ^ÀÃÐYàgÃÐâÃÐÖÃð¡Ã Ãð<Ãð•Ã`*ÃД$Ã08Ã0ñÃ0PÃpà‹À%Ãà˜Ã4ÃP÷Ã0>ðÃð0àOÃ0&ëà[ñÃÛÃpcÃPðŽà  Ã4ÃPŒà ‚ðpÃÃÃ`­ðdÃpÂÃ`BðùàÒÃÉÃPð”ÃP¤ÃÀ2ÃpÚà ŽÃ0>Ã@èÃ@e÷ÃgÃÀ2à #Ã08Ã@SÃ@_ÃP€ëÃP€Ã`0ÃLÀûÃàåðˆÃÀÃ@eÃ0ÇÃð­ÃÀ8ÃêÃPàØÃð$ÃàÃ`<ÃÐAÃÐ_ÃPà šàêÃPn Ã°Û ÃàV ÃÐÜÃ@ôÀ¢Ã:ÃpQÃ0ßÃ0åÃÏÃ@ðóÃpiÃð³ÃP9à ¬ÃÐSÃ@}÷àäÃ@îÃp]ð‚ðˆÃÏÃàŒÃð¿ÃRÃÃÐÊÃ`Åà Žà šðÿÃоÃàßÃsàaÃvÃààÌÃ"ÃP˜ÃÐÜÃ`¹ÃÐeÃð¡ÃpààmÃP†ÃÉÃÐYÃð­Ã0DÃ@îÃ@ÃÉÃ`NÃP'à  Ã&ÃÀµÃÐSà #Ã@}à GÃ`ÑÃjÃüÀ„ÀõÃ0&Ã`³ÃpæÃpòÃ0ÓÃðÀŠàsÃáÃpoÃp]ÃвðóÀñàÀÃàýÀÃÉÃ0ÍÃP˜Ãàà ;ÃÐSðpÃÃÃÃÀÃ0JÃÀÃð} ÃÉÀÃÆ!Ã0—!Ã`ÑÃP°Ã@qÃPŒà ŽÃð•ÃáÃ0nÃ@•ÃÐ_Ã`<ÃpKÃÐÖÃpQÀ~Ãð•ÃàzÀŠÃàŒÃp{ÃÀ»Ãà÷Ã`$ÃÐ;ðˆÃ`NÃpuð‚Ã`×àðÃRÃ4À–Ãð*ðóÃàzÀŠàØÃ@îà  ÃpÔà À–à ÄÀ¨ÃÀ—ÃàtðŽÃùÃüÃð­Ãð¿Ã0bÃðÑðÃ0ÍÃ0Ç÷ÃÏÃ0ÍÃ0ÙÃÐ;Ã@Yà  ðÿÃð*Ã:ÃÃÏÃÀVÃP°ÃðàÒÀð ð¦ÃÃpiÃ`*Ãà÷Ãð0àsð¦ÃÀÃð›Ãà¼ð¸ÃP3Ã`ãÃ0Ùà #ÀÀàaÃ@ôÃ@}Ãpæà )Ã`HÃP'ÃPÃ0åàÞ÷Ã`ÅÃÐÐàäÀÃÃpàäÃ0hÀ÷ÀûÃ:Ã`ÝÃÀ©ðšÃLÀ ÀÃð§Ã@ôÃPªÀ+ÃvÃà'ÃÏà‘Ã`ãÃð6Ã.ÃÃÃpuÃàŒÃPðÿñÀÃ0DÃpoÃÐMÃð*ÀŠÃ`BÃLÃ`BÃоÃPå!ÀõðÿÃ0>Ã@eÃà†àØÃÃÐÃêÃð¡ÃÃàñÃà÷àÌÃ0VÃÃÃP˜ÃÀ2ÃàŒÀàmàgÃÀ,àaÃÐÖÃðÅà #ÃmÃ0»ðàsà ¦ÃÀ,ðÃFà ²Ã@ƒÀÃÕÀÃ@wÀœð ×ÃÕÀ„ÃÀëÃÏðùÃð0àöÃ`ËÃP à Ã`ZÃRÃà ÃÐ;ÃÀ&ÃPžÃpcÃ0,ÃÐÐÃàýÃPÃ`<ÃððùÃð•Ãð­À+Ã@Ã0ÍÀÃpøÃp“ãÃ`6ðÃFÀ„ÀœÀ Ã`ËÃ@qÃàŒÃp‡ÃÀÍëð‚ð|Ã`Ëð”ÃðÃàà ;ðàaÃ`ÅàsÃ@ôÃ`HÑÃLÃð$Ã0ëÃ@ ðšÃüÀ ÃààêÃ0ÇÃÐÐÃ0ÁÃÃ`HÃLÃ4ÃàÃ0ÇÃ@îÃP’ÃÀDÃÃÐqÃ`ÑÃLÃ@îÃ@à ÃÃà’Ã0nÃð<ÃP’Ãà÷à ¾ÃjÃP!Ã`lÃðHÃð0ÃÀJÃ`ÑÃ:ÃyÃRÃ@ƒàsÃà€Ãà’Ãð¿Ã0hÃÐeÃÉÃ`<Ã0ÇÃÏÃÀµàsÃP9ÃPÂÀ®à )ÃðÃpoÃ0ñÃÕð¦ÃÀ»Ã^Ãð0ÃðàIàUÃÐÐÃÀ¯ÃöëàgÃÀ»Ã@ƒÃ`*àÞÑÃ@ÃðHÃà À–ÃpðšÃ@âÀïÃÀ—Ã@eÃÀ‹ÀÃÐqÃàÃ``Ã^Ã@ ÃÀµàÌàÌÃð³Ãð<Ã@}ÃFÃ`6à ð‚àgÃÀ>ð”ÃðBÃÐâÃÃ…ÀðÀÃðÃÛÃÐÖÃ0ÍÃP!à Ã@eàäÃ0ÓÃpøÃÀ8ÃäÃP!àmÃÐÖÃÏÃPÃpòÃÀ£Ã0Jà šÃ0PÀxàÒÃP9ÃP!ÃÃÃ@qà ÃêÃ@kàØÃpcÀŠÃð*ÃáÃ0ÙÃP!Ãp]Ã@qÃyËÃ@âÃ0©à ”ÃyàêÃÐèÀ+ÃààÞÃ@ƒÃàÃpøÀ´ÃÐÜÃP-ÃàËà[Ãà\ÃP’ÃÐÖÃ.Ã`HÃp ÃÐúÃÃ`<À ñÃ@îÃ@Ãà ëàmð/à  ÃÀ©Ã.Ã(Ã02Ã@kà ÃpoÃP°ð”Ãà ÃPžÃð³ð”Ã@îÃPÃÀÃ`³Ã0hÃPÃÉðÃpæÃpÃjà ¦àÞà ¦ÃpòÃ@Ã`NðÀõÃPŒÃ0µà Ãà #à šàmÃ0ßà  ÃàŒðÃ0åÃÏÃà†à  ÃüÃð¿ÃpøÃà˜ÃàëÃàzðÀ´ÃXÃ@ÃÃÐkÃÐeÃsà šÀÃð¹À®à ²ðÃànÀ~Ã0ÍÃÃà€à ðšÃP'ÃpòàÞÃàåÃÀÃ0bÃFñÃêÃP†ð‚ñð‚Ãäà Ã`HÃpøÃðÃ0JÃ@ôÃ^ÀûÀ`!à í!Ã`¹Ãà€Ãð­ÃPŒñÃPÃ@âð Ãð ÃÀ Ã@kÃöà ÙÃÐÄà ”ÃpÚÃ`§Ãð•ýÃ@²#ÃàV ÃpQð|Ã@ÜÃ@ÖàCÃÐèÃ`ËÃÀ»ýÃÐYÃpÚà ”Àf ÃP€Ã`<Ãð*ÃÐeÃ0µðà ÄðÿÃ0 Ãð•ÃÐÊÃ0VÃ…à #ÃÐGà1!Ãàbà  Ã@ÐàIÃpÂÃgÃ`BÃÐÄÃ`³Ã( ÙÃ`›ÃPë Ãpo÷Ã`Nà‹Ãð$ÃêÃ0©Ã`0Ãà’Ã:ÃpWÃØÃPžàäñÃðÃ0ÁÃ@ÜÃ@Ðà7 Ãð$ÃP÷à |à |ÃmàÒÃÀ©ÃÀDÃÀ©ÃÀ£ÃØÃ`§Ãð›Ã0Dà šÃà€Ãð*ÃpKÃ`$ðÿÃ.àÒÃ`6àÞÃÀ¯ÃðÃ`Åà´ Ã@¸"ÃI!ÃP˜ÃpiàÆÃsÃà€Ã0DÃyÃ0Dðùà Žà ²Ãð0ðíÃð Ã`ÃÃÀðvÃÐGÀŠà šÃ``àØÃRÃàtà Ã`BðˆÀlà ˆðvÃàßðvðóà |ÃàJ"Ã@eÃ`¿ýððÿàäðóÃð¡Ã@qÃÐGÃ`$Àðà šÃ@eÃ`ÑÃð¿ÃÐÖÃ@Üà ¦ÃaÃ`HÃ4ðùÃ0ÁÃ0ÇðóÃвÃÐ)!ÃÀÃ0»ÃpoÃÐâÃ0µÃÐ;ÃyðjÃPn ÃÞÃpQñÃpÔÃ:ÃàÙßðíÃàåÃP ÃmÃLÃ0VÃ0ÇÃPýðóÃÃÃ`BÃpìÃÀ&ÃPýÃ0£ÀÃ0ÇÃ@Àà ”àUàäÃ`ãÃöðíÃ@úðdÃК#ÓÃPÃð$à ”Ãà÷Ãpuà )Ã0ÁÃ"Ã0¯ÃXÃ`­Ã0ÍÃÀ8ÀðÿÃÐGÃpQÀ ðšð à  ÃäÃÀ¯ÃÐYÃ:ðjÃgÃ02ðÃ0PÃÐâðŽÀÃðÃðà ;àaÃÐÊðùÃðƒÃàñðùÃöñÃ0DÃ@eÃð›Ã(à ðÃÃ0ÇÃ`0àÒÃÃÃÀ—Ã@ÜÃð¿ðŽÃ¥ÙÃ`­ÃaÙÃð*à /ÃùÃ…ÃÀ©Ã0ÁÃÐYÃ@ÃàñàêÃ@úÃ@}ÃpæÃ`³Ã`BÃP3ððŽà ”ÃÐMàaà ‚Ãàñ÷Ãp]à ”à ŽÀà ÃLÃpcÃÐAÃоÃ`6ÃàñàgÃ`§ÀœÃPð‚ÃpÃPŒÃÀ8ÃÀµÃ@×ð¬À%àaÃ0>à ˆÃP˜ÃÃÀ2à ÿàºÀxÃ0ÓÃP3Ã0åÃ0VÃsÃFÃmÃÐ;ÓÃðàIÃÀ£Ã@ƒÃ@úÃð*ÃpiàÞÃmÃÀ—ðŽð¸ÃPžÃ@eÃðÃpÔÀÃð•ÃÀ&ÃàåÃÀ&ÃXÃpÀ¨ÃPtàÒà ÀýÃPñÃà÷à à  ÃÃÀ2Ãà€ýÃ@ÃpæÃ:ÃPà ”ÃäÃP†Ã02Ã@_à ÃmÃð¡ñÃàV Ã:ÃðÃÐ5ÃÀÃð•ÃÕÃÀ¯ÃPÀ Ãp9!Ã0,Ã(Ãyà v ÃàbÃðÃp{ÃÃ`¹ñÃÀ8ðóÃà†ÀÃP€ÃÃÃ`BÃà ÃpcÃÏà /ÃíÃPžÃpÎÃsÃ@âð”ÃÐîÃàzà ‚ÀûÃ@úÃ0PÃÐÖÃÀ©Ã¥ÃÐÐÃÀ‘ÃàåÃÀ¯Ã0PÃ0VÃÐMÃðà ˆðóÃ@âÃP’Ãp]ÃP˜ÃpoÃêÃàÃPÃ@ÖÃ`0ÃÃRðšÃð­ÃðÃàýÀÃ0DÃÀ,ÃüÃP˜Ã@ôðÃÐMàØÃà\Ã`<Ãpoà šÃPðvÃàëà ¬Ã0JÃXÃ`Zð‚Ãð÷ÃUÃ@èÃPžàÒÃ.Ã@G Ãð$ÃPÃP Ã`¿ÃpàÃgÃànÃP†ÃpWÃÐÊÃÀ&Ã0»Ã0PñÃÐÄÃ`*ÃpWýÃ0µÃ"Ã`¹ð|ÃÀ&ÃÐYÃyÃàbÃP†ð‚à ÃàßÀõÃð‰àaÃ@îÃpÚÃP’À„ÃPÃpEÃÀÃPÃÃÃ`×Ã`¹ÃÀðL#ÀlÃ0»à[ÃüÃpòÃ0»ðpàOà )Ãð‰ÃÐÄÃÀÃ@ÖÃ@ƒÃÏÃÀ8ðùðvÃ0DÃ`›À×"ß!ÃðÃ0µÃyÀ ð ÃäÃÀ!Ã@G Ãà÷Ã.ÃÀÃðÃð ÃвÃð¡Ã@ÊÓÃPÃàÓ Ã CÃ0 ÃàÓ Ãðú à ÿÃ@ÐÃÐÄÃÀ8ðÿð ÃÀÑ#Ãð Ãð‰ÃPtàmÀàØÃðÃ¥ Ã0 Ãàà )Ã0ÁÃ@A!ÃÃð›ðdÃЬ ÃØÃ`$Ã@eÃpWÀ Ã@îðvÃð•Ã`¡Ãà€ÃPà Ãð0Ã`¿ÃPÃÀðvÃ4ÃP!à  ÃànÃ0>Ã@ôàUðpÃPzàÞÀ÷Ãð¡ÃÃÃà€ÃPð ð àÒÃàßÃ`*Ã0µÃ`¿À à ¦Ã4Ã`›ÀûÃpøÃ`×Ãð³ýÃP˜Ã@úÃð³ÃðÃ0åÃ`ÅÃ0»ÀõÃêÃ‘à ²ÃpæÃpKÃ@Ã`ÑÃÀ2Ãp{ðÃgÃ`¡ÃÃÉÃ`*ÃÀ¯ÃpàÃàÃ0ÓÃPÃÀµÃà€ÃÀÁÃPÃ@ð‚Ã0\ÃðšÃð³ÃàÃ`0Ã0bÃÀ»ÃÃÐYà )ÃÀ&ÀŠÃ0ÓÃÐÖà )Ãð$ðÃÐôà )ÃFÃsÃð*ð‚Ã0ÁÃ@_ÃàtÃpoà ;ÃÀDÃ`NàaÃ@ƒÃpøÃFà[Ã0ÍÃ`BðšÃð›ÃÐGà Ã4Ã`BÃP˜Ã:Ãpoðà 5Ã`ÅÃ@îÃð0ðÃüÃP-Ã`ÅÃÐ_ÃsÃð¡÷ÀÃLð‚ÃpoÀ®Ã‘Ã@èÃànñà ÄÃð¹÷ÃsÃP¤ÃpìÃLÃpÎàCÃð¡Ã`<àmÃRÃ`<Ã`BàgÃ`BÃ@ÀÃP’ÃÃLÃ`ÅÃ@îÃàÀ–ÀŠÃàÃðÃ@ÜÃÐÖÃÃðàCðÃÀÍÃpÃ`­ÃmÃpàÃÕÃàØÃ0Dà ‚Ã0ÇÃÀÙÃÀJËð Ã`ÅÃçÃ^ÃðÃ@ôÃàà /ýÃð§àØÀÃp]à ˆÀ ðçëðˆà[ÃpÔÃàåÃPÃpàÃÐYÃüÃàhñÃRÃ`§ÃpÔÃð•à  ðšÃpQà ñÃ@YÃÃ%'Ã0£ðjà ùÃ0ÓÃRàüÃ^ÃàÀ¢ÃmÃ08ÃÐSÃÐÄÃ0µÃðÃð¡ÃXðdÀlÃ0,à  Ã0µÃиÃàýÃpuÀ„ÃÞÃ0JÃmÃÀðóÀlÃà÷À~àOÃÀ8Ã`*ÙÃP ÃyÃ@ÊàÌÃ`*ÃpÈÃ@kÃÀ&÷Ãàßà ÿÀÃÀ Ã`§ÃÀ‘ð‚ÃpÔÃÐ_Ã0ÇÃpÈÀf ð|ÃPÃ@ÜÃÐ5ÃàbÃP€ÃÐMÃàzÃFÃÐAÃà÷ñÃ`ÅÃ@úÃ@Ã`³à[Ãð$ÃÀ&à ŽÃ`³ÃÃÀÃÐMÃpWÃÀ‘Ãð›ÃÐÐÃ`¹Ã@kÃÃöÃÀµÃ` ñÃ@âàÆÃð•Ã0µÃ` ÃÐÊÃ0ÍÃð¡à #ÃàŒð|ÃÀ©Ã08Ã0VÃpà÷Ã`ÅàyÃ0bÃà ÃðÃ0ÍÃÀ»à ¬ðçà ÿà ùÃÐÜà ”ÃPÃð‰Ã0>ðÿÃðÃ0ÁÃPÃ@ôÃ@ôÃ0ÇÀlàÌðíÀŠà ”ÃUÃ@SÃPà ”Ã0ÇÃ[Ã` "Ãð‰ÃðóÃöÃ0ÁÃ@ÃPŒÃà à )Ãð*ÃêÃ.ÀxÃÐ5ÃPýÃaÃàà šÃ`¿àêÃ`ÅÃpàÃ…ÃPÃP†Ã@ÃÐÜÀœÃ`Hñ÷Ãð¹ÃXÃP¶ÃPžàaÃP’Ã`³àäÃð ÃðÃÀ,ÃP ÷ÃÀ… ÃÌ ÃyÃàÃàtÃð*Ã`­ýÃ`ÑÃÐ_Ã0VÃ@âÃàåÃÐAÃ0ÁÃ0ÍÃpoÃFÃ0JÃÐâÃàýÀŠÃÀ2Ã0PÃàtÃÐAÃà Ã`6ÃÃÀ&Ã@ÜÀ~Ã.ÃÐ_ÀûÃÐGÃ.ÃàzÃ0µÃPñðùÃ0»ÃpÔÃð³ÃÐÐÃjðà ÃäàmÃ0ÓÃà’Ã0ÍÃ4ÃRÃÐ_ÃÀ8Ã0ßÀñÃ¥àÞÀ Ã0åÃ0Óð‚Ãà #Ãð<Ãà˜ÃP˜Ã@ƒÃ0ÓÃà Ã4Ãð¡Ãp? Ãð÷Ã@ƒÃpÃÀÓÃ@îÃð§Ã@Ãpcà ¦ÃPžÃÐÄÃÏà ²Ã0Óà 5ðÀÃð§Ã0ñÀ¨àsÃ0ÁðpëÃöÃpæÀûÀxàÒÃ0DÃpiÃ@ôÃÀ&ÃÞàOðvÃpìÃpæÃ0DÃ`Bà ¦ÃЬ À¢Àð‚Ã`¿÷Ãð›Ãð*Ãà ÃPßÃ0ÇàÃ0ÓÃÕà[À+Ã0ÁÀà=àOÃ@ÃÃð¦ðˆÃÃà Ãà ÃXÃÀ£ÃвÃàhÃpøÃàÃÏÃ@kÃ`à ÿÃÀ>Ã08Ã@YÃÐGÃ0ÓÃàŒÃð§Ãà à ”Ã@wÃÐâÃ`HÃpòÃ`Ã`³à šÃð§àIÃPÃ0£ð ðà šàÌÃ^Ãð*Ã0ÍÀÃÀ à ˆà  ÃÀ8à ÀŠÃà÷ÃÐMÃ¥ð”Ã@îÃÐwÀ+Ãà€ÀÃ0ÁÃpàÃçÃ@ôà ŽàäÀœÀûÃPÃÐÜðùÃPýàÞàgÃ0\ÃpoÃFÀÃðÃ08Ã@Y÷Ãà÷Ãð‰ÃÐ;ÃÀÃp]Ã`BÃpcðÿÃ.Ãð<Ãð¿ÃÀÇÃà€àÌà  ð Ã@ôÃðà  Ã0DÃàŒà /÷à Ãð›ÃðÀ–Ã`<àÞÃð‰ÃgÀÃ0»à  Ã`ÅÃÃÀ©ðdÃ@_Ã`6ÃPðvÃ`HàðÃ(à šÃ@qà 5à ¬ÃðÃÀ©à Žð à[Ã`³ÃðÃ0¯Ã`*Ã0>à Ã0»Ãp]Ã@kÃ@ôÃ[Ã`§Ã`¡à Ã`NÃÐÄÃ@ÃPŒÃ…ÃsÃRÃ0»ðáÃ@âÀŠÃ@k÷Ãà÷ÃàtÃsÀÃFàOà ¬ÃP ÃÐGÃ@wÀ%Ã`¹ÃP!ðšÃàðóÃàßÃpQÃÀ©Ã`<Ã0ÁÃmÃÀ©ÃÀ Ã@Ã`$ÃàŒÃà Ã0ÁÃöðŽÃüÃà’Ãð³ðùàÒÃ`HÃ4à /à !Ã0&Ã…ÃPàöÀIÃ@wÃpìÃÀ>Ãð0àCÃàëÃpiÃ0DÃÃpìÃ0»ÃÀ©Ãà÷Ã0»Ãð0ÃÐÖà ”Ã`NÃPÃ`6à ÿÃÐ/ ÃÀ‹Ãð§ÃàtÃÐ_àOÃÀ… ýÃÐeÃgÃÀðÿÃ(÷ÃPýÃðƒÃØà  àÀÃPh!Ã:Ã0>ÃP'ÃpcÃ0>À Ã.ÃëÃ`ËÃ0ÍëÃÀ‘à[ÃmÃàP!ÃPzÃ"Ã`³ðˆàÞÃÐÊÃ4ÃàÓ Ã°çðð‚ÃðàêÃFàÒÃsÃð‰Ã0£Ã0DÃ@kÃÃÃ0 ß!Ã@¸"ÃÀ‘ÃàV ð^ Ãð À~à 5ÃÀ&ðóÃ@;"à v Ã@Ãmà ÃPÃЦ!ÙÃÀ¯ÃÛÃpÂÃð ÃðÃPÃPýÃ0#ÃPß"Ã@ÖÃpÔðvÃÀÃsÃàëÃp¶!Ãpª#ÃÐ)!ÙÃaÃ"ÃÀ&Ãð‰Ã`­Ã`$ðdÃàP!Ã@MÃ`$ÃàbÃPtÃÐ)!Ã0"Ã@G ÃÐ/ ÃÐSýÃÀ‘ÃP†ÃsÃ(ÃgÃPtÃàåÃ`Ãð*Ã0PÃð³Ãð§ÃÀÃ0¯Ã@YÃPñÃPÃ`³ÃàV ÃPn À~ð|ÃàñÃÐÊÃpcÃÀÃpÈÃàzÃ@à šÃÐ5àCà=ÃÀ2à ‚Ã.à Ž÷ÃÃÃ0¯Ã°Û ñÃ@ÜÃP˜Ã`›Ã0&Ã°Û Ã ÃÀ»ÃLÃI!ÃàhàOÃ( ëà ÃP€àIÃ`¿Ã@ÖÃððíÃ°Û ÃàP!ÃÃ0&ÃÆ!à ‚ýàÆÃÐSÃàhÃ¥Ã@îÃPŒÃ.ÃÀ À×"à ðÃàŒÃÐGÓàäÀõÃð à ŽÃÃðÃÐÊÃàV ÃPë ð|Ãð*Ã@qÃpÔÃ[Ã02Ã0»Ã@SÙÀïÃ`­ÃÀ©à ”ÃÀ ÷ÃP’Ã@âðX!ÃP÷ÃðƒÃðÃgÃ0¯ÃÐÐÃPžð|ÃpÚÃà Ã@úà  ÃÐ;ÃàÙÃ0¯Ãð›ÃpQÃðe$ðpÃ0>ÃðÃÛÃXàäÀÃÐÄÃPÃð¡àIÃpÂðvÀûÃ02à+"Ã08ÃPžñàÒðÿÃ.Àûà ÃUà%#à á#À`!ÃpWÃðÃPÃÀ ÃàIðáÃ`• Ã`­Ãpàð ÃÃÀÃ¥ÃÀ—Ãà÷à ”Ã02ð ÃpÔÃ@ÐÃ0£ÃØÃäÃÐGðóÃpcÃ`§Ã@ÜÃ02ÃÐGÃÃ@ÖÃЦ!ðáà Ã@ðçÃðÃpKÃàëÃÃÃð ÓÃPn ÃPŒÃP€à p!ÃPtð”ÃÐkÃð0ÃðƒÃÐ/ ÃLÃ[Ã08Ãð­ÃpààaÃÐÄÃà÷Ã4Ã`*Ã@èà ùÃ@A!Ã@YÃ@_à ÃP†Ã@kÃPÃàP!ÃÐ;ÀûÃ:Ã@}Ã0ÍÃð¹Ã@kàÌÃð­Ã4ÃàåÃ`<Ã0¯ÀÃ`BÃpìÃàäà #ðùÃÉÃÀµÃPÃp Ãdà #À„ÀÃ`<ðÀõÃ@_ÃPàêÃà ÃàýÃpKà ÿÃpQÃPðçÃ@YñÃÐSÃPŒÃ(ÃÕÃ@ôÃpààÞÃÀ8Ã@ÃLÃ@ôÃpàýÃPë ÀŠÃÐÖÃPÃ`0ÃPëÃpÎÃðÃpcÃP€ÃyÃ`BÃpcÃð›ÃpQÃàbÃpuÃÃà ˆÃpÚÃ`0ÃÀDÃ@qà ŽÃPtÃÃð¡ÀÃà’÷ÃpàÃPžÃ@ƒàÒÃ"ÀŠÃÐMÃàà ÃêÃp]Ãð•ÃpiÃ`§ÃðóÃP÷Ã0,ÃPŒð‚à ÃÀÃÐÖÃÀ2àgðˆÃ`$ÃöðŽÃÀ‘ÃP÷ÃP†ÃàbÀŠÃð•Ã`0Ã`HÃRßÃÒàOÃàV Ã`*Ãà÷ÀŠð|àðÃ@úÃ`¹ðX!à ŽÃÐÐÃÀ©Ã^Àà šàUÃ@wÃÀµàUÃàÃÐSàÒàäÃ0>à àäÃpìÃÀ8à ð|àºÃÐYÃp“Ã`TÃPß"ÃЦ!ÃÃÃÃ`fÃ@ Ã`ËÃ`³ÃpcÃà÷ÃpcÃð•àÌÃÕÃ@úà[à ”ð|Ã`¿Ãð0àðÃpøÃ0ÙÃ…ðçÃ4ÃÌ Ã0,ÃàÃð§Ãà÷à )àäÀÃð›ÃyÃÐÄÃÒÃmÃð§ÃP’ÙÃð•Ã@âÃÐÐÃ0PÃöÃpÔÃ@kÃRÃ`BÃPŒÃànÃ`§àÒÃP¤Ã0ßÃ08ÃàñÃüÃpàÃ@èà ˆÃ`!Àã ÃÀ¯Ã`Åðpà ÃRÃ@_ðàsÃð•Ã0>ÃàÃ0DÃÏÃsÃ@ÃpòÃXÃÐôÃ`Bà ŽÃ4Ã0JÃÀ£ÃsÃ`<ÃÃð›ÃðÃyÃpÈðùÃ`ËÃÃ@ôÃàtÃà˜ÃRÃàtñðˆÃpiÃP†Ãð*Ã@}Ã@ ÃpàÃÐÊÃ`³Ã@èÃàÃRÃpiÃ@âÃÀ&Ãð³ýÃð­à #Ãà˜ÀÃ0ÇÃð¡ëÃÀÃ@eÃ0»ÃaÀÀÀà ¦à )Ã`BÃÀPÃÐâà ”Ãmà ŽÃðÃð Ã"ÃÐAÃPÃ0ÇÃð$ÃÐ_Ãð›Ã@SÃpÎÃPžÀÀlÃàtà ‚àÆÃà\ÃPzÃ0>ÃàŒÃÀ£àÆàÒÀõà Û$ÃpKÃðq"ÃÀy"ÃÀ‹Ã`!à d#Ã@¬$Ã¥Ã@ÜÀïÃP€ÃÐ5ðjÃ@Ðà p!à j"Ã`}$ÃàÓ Ã[Ãð‰À~ÃЬ ð‚÷ð‚Ã[à¨"ðdðjÃоð^ Ãð} ÃÐ5ÃÀð‚ÃsÃØÓÃ0&Ã@âÃ0>Ã`• ÃÐ;Ã` "ÃàhÙ"ÃPb"ÃpÎÃ`¡àÀÃpæðùÃÃFÃð¡ÃÀÃàÓ Ã@MëÀéÃ02àIà®!ÃÐAÃ@SÃÐ)!Ã`§ðvÃp9!Ã0ÇÃÃÆ!ÃàÙÃp? Ãànà ²ÀŠÃÐAÃàhÃàßÃêÃ"ÃàÓ Ã€`!Ãð‰Ã`§ÃpKÃ@G ÃPtÃ0»Ã@Ãà€Ã0£à ÃpKÃàëÀÝ!Ãàµ%ÃÐ5ðpÃPžÃ‹ÃÐÐÃPÀlýÃ(ÃàÙÃþ"àUÃÃ0 À`!à ˆà ùÀÝ!ÃÀ£ÃpEðjà  àaÃàýÃðÙ"ÃÌ ÃÀ… ÃÐ/ Ãäà[ÃÀÃ`›ßÀŠÃaßÃ0£ð|ðdÃÐ5ÃØÃ`¹ÃPÃð¡ÃpæàØÃðÀ ÷ÃpKÃÀ‹ðjÃaëÃÐÊÃP€ÃFð‚Ã@èÃÀÃàtÃ…Ãð6ÃÐÖÃÀ£ÃÐÄÃmÃpìÃ4àØÃ`Ã`¡ÃpÎÃÃð¹Ã@âÃðÃð­Ã@G ÃP÷Ã@èÃP€à®!ÃpÔÃ@âÃpcà ÀŠÃPzÀïÃpið Ãð6Àðë÷Ãàzà[ÀÃ4ÃàÙÃ`¹Ã`ËÃÀ2ÃÐÊðçÃÉÃ`TÃ`ËÃ0 ßÃ0¯ÃÃ0ÁÃ0JÀÃÀ… Ã0µàgðŽÃвÃ@ÊÃðÃÐeÃXÃ`¹ÃÒÃÀ&ÃÀ»à ÀŠÃpàà ÃÀ¯Ã0VÃpWÃ@Yà šÃRÃà†Ãð¹ÃÃ`¹ÃsÃP!ÃàzÃØÃ@eðùÃðÃàýàÀÃp? ÃÀÃ0,à p!ÃpÈýÃ:Ãð} à=ÀûÃÞà$ðR"ÃÒÃUÃ0#Ã`›ÃFÃ` Ãðe$ÃI!ÃÐ5Ãðw!ÃÀs#Ã$Ãà,'ð«(ÃÀU(Ãp'$ÃàÁ#Ãp'$à L'Ã0#ÃÀm$Ã#ÃPb"ÃÐ$î%ÃÐ'Ãðâ$ð@%ÃPÇ&àœ$Ç%ÃÀð#Ãðè#Ã0%Ãpž%ð«(à F(ÃÐ|(Ã0%à&ÃÐ &Ã+&ÃPÍ%Ã1%ð@%à%Ã`q&ÃÔ)ÃPV$ðX!Ãp'$Ã@ *ÃÚ(ÃÀÆ*Ã&Ã@¬$à„(Ãæ*ÃPÁ'ÃÀê$Ã*à @)Ãð;+ÃÐó)Ã@¬$à¢#ÃÀä%Ã`$ÃР"Ã`q&à %ÃPÓ$ÃÀê$ÀÑ#ÃðÜ%Ãp'Ã0%à Õ%Ãpz+Ã*Ã0ð'ÃК#Ã`q&Ãp’'ÃÐ'à Û$Ãp(Ãà)ÃPµ)à F(ÃÀU(à @)Ã+&ðÃ$Ãò$à$ÃðÖ&à j"Ãì)ð-à F(è&ÃЦ!Ã0#ÀT#Ã0ü%Ãpž%Ç%à ç"ÃPD'Ãpt,ÃP -Ãp&ðÏ"Ã@#&Ã0ö&À¹'Ãu(Ã`e(â'ÃÐù(Ã0y&Ãpª#ÃÀÞ&ÃÐù(àï+ÃðÖ&Ã&Ãì%Ão%Ã0$Ã( ð¥)Ãð¾*àé,ð±'ÃÐ$ð@%Ãðè#Ã7$Ã&Ã`è'Ã`ú$Ãà'Ö)Ãò$ÃPß"Ã&ÃP>(À6(ÃÐ|(Ç%à Ã(Ã(Ãà'Ãæ&Ã`$Ã0ö&à á#ÃðY&Ãp(ÃP&,à„(Ã@”(à .,à +Ãà,'ð.(ÃÀ['ÃЈ&Ã0ð'Ã0y&ÀÅ%ÃÀs#Ãø'Ã`w%àû)ÃQ*À6(ÃQ*ÃÐó)Ã@ù,à ¥-ÃðS'ÃÀÞ&à„(ÃÔ)à «,Ã0Þ*ÃPV$Ãà»$ÃðÄ)Ãæ*Ã+&Ãþ"ÃÐ &ÃÐŽ%à 'ÃÐó)Ã0ü%ð.(Ãð¾*Ãà¯&ÃÐ'ÃК#ÃðY&Ã%'à d#Ã@;"Ã=#Ãàµ%Ã`q&ÀH%À×"ðÉ#ÃpŒ(Ã+&ÃД$Ã$ðF$ÃpÂÃÀ‹Ã0"ÃД$Ãpý*Ã0Þ*ÃÐó)Ç%Ã@5#Ãàµ%à)Ã](ÃPh!ÃPß"Ã0%ð½%ÃÐ &Ãæ*ð·&ÃÀ!Ãà2&ÃðY&Ãp˜&ÃÐ#ÃЬ Ã0 Ãpª#à á#ÃÐ#"Ã`›Ãì%Ã@+àŠ'Ã@ &à¨"Ã0—!à Û$Ã0$Ã0ä)à(à ó ÃPb"Ã`#à É'Ã@(Ãð_%Ã$ÃpQàCà´ ÃPb"ðR"Ã0ö&ÃàD#ÀË$ÃÐ &Ã@Ä Ãþ"ÃÀy"Ã"à%#Ãp9!à É'Ã@(Ã7$Ã@'ð½%î%à 'Ã°Û ÃàåÃp°"à&Ã0ê(Ãp¼ ÃР"Ãp-#Ã0s'Ãp'Ã`â(Ã`ƒ#Ã0!ÃÐŽ%Ã`‰"à Õ%Ã`ú$ÃÀa&ÃP\#Ãþ"Ã&ðL#Ã#à–%Ãp(Ã@'Ã`w%Ã`w%Ã`#à7 ÙÃà¯&ÃðY&Ã`!Ãð} Ãp°"ÃР"Ãðâ$ú#ÃК#ÃÀ['à ^$Ç%Ãà£(ÃÀm$Ù"ß!ðpÃPn Ã`ú$à ç"î%ÃPß"ÀB&Ã&ÃÀg%ðL#Ã@G ÃÐ$ÃÆ!ÃPß"ÃÒà ÿð^ ÃÀ… Ã`!ÃÐ#"Ãðô!ÃI!ÃFÃ0&Ãðè#Ãì%à$Ã"à¨"â'Àã ÀûÀûÃÀDÃPh!ÃвÃÐÖÀõÃÀö"Àõà à´ ðÉ#Ãu$Ã0,Ã0—!à(Ã`}$ÃàßÃ0&à á#à ÃР"Ù"Ã{#ÃÒÃð ÃÐ/ ðÕ!ÃC"à ó Ã0…$Ã4àØÃð ÃÆ!àCàºðF$ÀõÃ0 Ã0 Ã08Ãà÷à ÃÀð#ÃÀ!ÃÀ"ÃÒÃàÙÃ0&ÃàbÃäÃðÃ@Sà ‚Ã`$ÃÐMÃÐâÃ` ÃЦ!Ã`¡ðÕ!ðóÃàbÃàÙàºð^ ÃP€ÃÀ‹à¨"ÃÀs#Ã"ÃPÃà÷ÃÐÊà Ã` ÃPh!Ã0©ÃÐ;à |ßÃÆ!à !ÃÐ/ Ãðú Ãpª#ÃP÷ÀïÃPn Ã@;"Ãð‰ÃðÃp-#ÃPå!Ã`§Ã` "ÃàJ"à ÀÃPtÃÀ… ÃÀ—ÀõÃÀm$Ã@;"ÃÒà Ãpž%Ã¥ Ãð›Ãð ðvÀ`!ÃØÃиà ç"ðF$Ã[Ã02Ãð‰à !ðÏ"à1!ÃànÃð à Ã0"À`!à7 ÃpWÃÀÃàëðvÃà»$Ãp°"ÃêÃUàºàOÃ0µðíÃÐ%ÃÀs#Ã°Û Ã°çÃð•Ã`*ÃP÷ðùðdÃàÍ!à Ã0&ÃpàÃP†Ãвà í!ÃÌ ÃÐ5Ã@_ðpÃ@ÜÃ#Ã@/$ÃК#Ã@A!Ãp¶!Ã`• ÃO ÃàñÀf Ã0©à7 ëà Ù"ÃC"ÃO àºÃÀ Ã0‹#Ãà>$Ãþ"Ã"!Ã0 ÃPå!Ãp¶!à %Ã@A!à ˆÃð Ã0»ëàºÃð àºÃÀð#ÃР"Ã4ÃàÓ Ã€f Ã[Ã0#ÃÐ)!Ãð‰ÃÀðR"Ã@¾!Ã`›ÓÃ[Ã0—!à%ÃÌ Ã€éÃp°"à ó ÃPýÃð} ð^ Ã0&Ã0,ÃÐ/ Ã`‰"àÀÃ0©ÃÐ5ÃÐ#Ã@š'Ã"ÃÀ!ðçÀÝ!ÃI!Ã( à ÿÃ°Û Ã€ïÃ0&à !ÃвÃ°Û ÃPß"ÃpÂÃPh!Ãpž%Ã0&ÃpÈÃàÍ!ðpÃ@à7 Ã@ðóÃàtÃ.à ó Ã"ÃàÙëð^ ÃàßÃÐGÃ0‹#ð½%Àf à Ã0¯ÃðÃð Ãp? ÃàJ"à à j"Ç!Ã`$Ã@G Ã`• Ã0"ÃàÍ!ÃиÃP†ÃàV à®!à1!ÃàhÃà\Ãp9!ðÕ!à¨"Ã"!Ã`0ÃиÃ0!ÃÞÃ"!Óðáà ‚ÃÐMà ŽÃ0 ÀõÃpQÃ`§ðpÀã ÃàV ðùÃànÃ4ÃÐÊÃp3"ÃÀ‹Ã0 ÃPë ÃÐÊÃ"!Ã0—!à+"Ãà\Ãð*Ãà÷ÃÀÃ0"ÃÀü!ÃðÃàV Àïà ÃÐ;ÃpÔÃ0"àOÃP˜Ã`­Ã.ÃÀ‹ÀûÃÉÃ0DÃð§ÃPë Ã` "ÃØÃ@G ÃðƒÃ@¾!Ã¥ ÃÐ;Ã@Ä Ãð ÃàñÃ`6Ã`¿àÌñÃðÀ~Ã0ÍÃRÃ0ÍÃpÚÃ`§ÃPýàÀÃðw!à ÃpÎÃ`• ÃPb"ÃÀ ÃÀm$Ã$Ã0!Ã°Û Ã@²#à j"Ã@)%ÃðY&â'Ã`î&Ã`}$Ãàµ%à :*Ãà+Ãàµ%ÃPÙ#ð@%ÃÀØ'ÃÀI*ÃP£,ÃP,+Ãà‘+ÃP,+ð()Ãæ*ÃPµ)Ã*Ã)ÃÐù(ÃP¯*Ã`ô%ÃÐ|(Ãà'à F(ÃÀC+Ã`Ä-Ã0Ø+ÃÐÿ'àé,Ãð0ÃÂ,à(ÃðA*Ã@ *ÃÀÀ+Ã3/À /Ãð¾*ÃÐí*ü-Ãã1Ã@|,Ã@Ž)Ã*ÃP2*Ã0Æ.Ãpt,Ãàü.ÃÐ|(Ãà-Ã@ó-àf-Ãð²,Ã0C/àõ*à ±+Ãð5,Ã@)ÃÀg%à„(Ãð¬-ð+À$+ðŸ*À¡+ÃÐç+ÃÀ´-Ã0O-Ãð).ÃP&,Ã@ç/ÃÀÆ*Ã`_)à~)Ãi*ð/ð/ÃÐX.Ã@ÿ+Ã)ÃÐç+Ãð¦.Ãp€*Ã0Ø+Ã@ÿ+ü1ÃÀ 4à .,ÃÐd,ÃÐd,Ã-à ½)À**Ãp(Ãð/-Ã0Ì-Ã@|,à ½)ÃÀa&ð½%Ã`Ö*ð/Ã@+Ãp\0Ãð¬-Ãpt,ð .ÃQ*Ãà+Ã0I.Ãð¦.àï+Ã-Ãàê1ÃÂ,ð+àõ*ð()ÃÚ(ÃÔ-Ã@á0Ãõ.Ãàê1Ãpz+Ãpz+Ãpn-ÃÔ)À¡+à É'Ã*ð,ÃÀÌ)Ã`A.Ã`Ä-ÃÐv)à Ï&ÃPÇ&Ãp÷+ÃÐp*ÃðG)ÃÀº,Ã0Æ.àl,Ãp*ÃÐd,Ã~-Ã0a*Ã@ÿ+ÃpÇ3À$+ÃÔ)Ã@ &ÃàÁ#Ãp'ÃÀÒ(Ã0ä)àã-Ãà+Ã0ê(Ãð¾*ÃÐ'Ão)Ãð¸+ð-à`.ð+Ã`Ö*Ã0I.ð«(Ãà£(ÃЂ'Ã(Ã@ *ÃP>(À¡+Ã*Ãàµ%À³(À›,àé,Ã@/$Ã0ð'ð,Ã`M,ÃÀ['à R&à„(Ã`¾.ð-Ã0Ì-ÃÐÿ'àx*Ãpz+Ãi*Ã@+ÃÀC+à„(Ã0[+Ãpn-Ãp*Ã`ô%ÃÀ=,Ã@‚+à .,à +Ã@'Ã0g)Ãp )Ã`_)à (-ÃK+ÃP,+Ãu(Ã0%ÃÀI*Ãð¸+Ã0s'Ã0ê(ð«(ÃÀ+/Ãà*Ã{'ÃðG)ÃðÄ)Ã*Ãx.ÃP8)ÃP8)À6(À§*ÃK+Ü(Ãà*Ã@v-Ã@Ž)Ã&Ãð_%à F(Ãì)Ãò(Ã`Y*ÃÀÒ(à ½)ÃÐ'à R&Ãþ&Ãp¤$Ão%Ãp€*Ãò(ÃÐç+ÃÀ=,ÃP,+Ã0%ÃðM(ÃÐ'Ãpž%Ã"ÃPJ&ð"*ð+àr+Ãà,Ã0Æ.À,Ãp&Ã0g)ð¥)Ã0%ÃPÁ'ÃÐù(à Õ%Ãðk#ÃÀê$à Õ%Ã`#ÀB&Ãp¤$Ãàµ%Ã0ö&ÃÀä%Ãæ&ÃÐ &à&à X%Ãi*ÃЂ'ÃðÜ%Ão%Ã@ &Ã@Ž)Ãp!%Ã`q&ÀÅ%Ã`q&à ç"Ã0‹#Ãp3"ÀÅ%Ã$ð:&à(Ã@;"ÃÀ‘ðR"Ãà)Ã0‘"Ãp’'à :*à F(Ç%Ã0ö&Ãò$Ã0‹#ðÏ"Ã`ƒ#à Õ%ÃÀs#Ã{'Ã0#à ^$Ãà£(à„(Ã`w%à¨"à É'ÃðA*Ã@¦%à ^$ÃàD#ÃPÁ'â'Ã0…$ÃÐ%à ^$Ãpª#Ã`$Ãðî"ÃÐ &Ãà2&Ã"Ã@²#Ãp¤$àŠ'ÃàÇ"Ã@/$Ã`_)Ãu$ÃЦ!ÃÀs#Ã0…$ÃÐ &Ãu$À`!ÃЦ!Ã$ÃÐ)!Ã"Ã`ƒ#ÃÐ#"ÃàÓ ÃÐ)!ÀrÀ×"Ã0&ÃPÓ$Ãp˜&Ão)Ã{'ð½%Ãp°"ÃPh!ÃÀð#Ã@¾!Ã(Ãà€ÃàåÃðk#ÃÐ%ÙÃÀ‘Ã0,Ã0‘"Ãi&Ã`î&Ãà©'Ã°Û Ã@¦%Ã`â(Ãà8%Àïà ˆÃð Ãu$ÃÆ!ÃÀ‹ðpðL#Ãðe$Ãp3"ÃPh!ÃÀ"à 'Ã0‹#à ÿÃ¥ Ã`ú$Ã@ &Ã7$Ã` "ÃàÓ Ã v à¢#ðF$Ã`}$Ãpž%Ã.ðpÃPn ÃÀ‘ðL#ÃPß"à´ ÃàÇ"Ã02Ãðú à7 à ÿà p!ðL#ðR"ÃaÃð¡à+"ÃÐ)!Ãðú à%#Ãp°"Ãðè#Ãp'ÃÀÞ&ÀlÀrÃ`• à ç"ÃàÇ"Ã`!ÃÐ#"Ã@²#ðF$ÃpÈÃÀ!Ãpª#Ãðq"à+"ÃP\#Ãðe$Ã"!Ã`ƒ#ÃÐ%ðÏ"ÃàbÃPb"Ã0ö&à á#à !ðpÃPtà ùÃàÁ#Ã@'ÃÌ Ã`• Ãþ"ÃЬ ÓÃ:ÃÀü!Ã@¸"Ç%ÃÐ#"ÃPzñÃàbÃ0%ÃàÙðçà ðR"à$Ã`#ÙÃUà ”Ã4ÃÀ‹ÀxÃO ÃÀs#ÃàV Ãp]à´ ÃÐ#"Ãð} Ç!Ã@G Ãðô!ÀïðdÃàÇ"Ã0%ÃPýÃPðíÃоà ÃÃp9!ðÏ"à®!ðÕ!Ã`ÃàÙà=Ã( ÃàJ"Àf ÃÀ!ÃàJ"àÌðpÃPh!ÃÞÃpÂÃàzÃ`$Ã0—!Ã+&Ãð_%Ãðú ÃäÃÐ;Ã0"ÃpEÃp? Ã0¯ÃÐÄÃÌ Ãà»$Ã`à ˆÃ@ÊÀ`!ÃÀÃ`!ÃÐ/ Ã`*Ãëà ‚ÃP Ã@ÊðX!ÃÀ ÃÐ#à Ãp9!à åÃàßÃ0©ÃàJ"ÃUÃp¼ À×"Ã0 Ãð à¨"Ãð Ã0&Ãð›Ã`!Ãð Ã"àºÃ`¿à ˆà !àºÃPýÃsÃð•Ã0£ÃpÈÃ02Ã0,ðíÃ0 Ã@ÊÀ~Ã@âÃàzÃÀ—Ã=#Ã`• Ã`Ã`›Ã"Ãà>$ÃÀ!ÃÐGÃ`³ÃÐMÃÞÃ02Ãð³ð^ Ãþ"ÃÀy"ÃpÚÃ(Ã@MÃàÍ!ðR"Ãðƒà7 ÃÀy"ÀéÃÀ—Ã@A!Ãð‰ÃÀ!à$à¨"Ã0 à ÿÃÒÃpQÀàØÃPÃàhÃ`ú$ÃÀ"ñÃàP!Ãø#Ã"ÃÐÊÃðô!ÃP÷Ã@MÃÀü!ñðR"ß!Ã¥ÃêÃpàÃ@YðÕ!Ã0"Ã`0ÃðÃð à |ðpÃ@Êà¨"À`!Ç!Ãðî"ð‚Ã0ÁÃÀà=ÃmÃP¼ÃÕñàCðÕ!ýÃ`<Ã`<ÃP'Ã@ƒÃ@}ÃðÃàtÃàßÃ` ñðjÃ@èà=Ãð} ÃÀ—Ã@Êàœ$Ã@5#Ãp¶!Ãвà |Ã0»à àÀð^ ÃêÃÀ¯ÃðÃ0©ðùßÃð›ÃÐMÃÀÃÌ Ã ó Ã`6Ã:ÃÐÄðùðÿÃ@G à ”ÃLÃ`Ãp¼ ÃpEÃpcÃ`³ÃmÃÐÐÃP†Ãð‰Ã@_Ã@SÃàñßð|Ãð0ÃàhÃp? Ã@YÃI!ÃàÙà ÃpÎÃPàÆà ÃðƒÃÐÐàaÀŠàÆðdÃpÚÃðàÞÀxàºÃð‰ðáà |àêÃ@qÃÃP€ÃpEÃ`Ã@âÃ`*ÀŠÃ0Çà Ã0µà ÿðR"Ã`• ðóðùýðóÃÀ2àOÃäÃ@YÃP€ÃRÃð¡ñÃÀÃpÔÃ0©Ã¥à ‚à v ðçÃ¥Ã`<àÌà7 Ãð$Ã0DÃоð|À–ÃPýÃàhà ÿÃ0‘"Ãp? ÃÀðóà ˆÃpÔÃXÃpiÃÐÊÃÐAÃp9!Ã@²#ð^ À~ÃpÔà ‚ÃàëÃàåÃð à  ÃÀà ÃÐ#Ã0Íà ¬ëÃÀà ÿÃ`• ÃØÃ@ÖÃRÃÐGÀõÃÌ Ã`• ÃO àÀðjÃð‰ðdÃpQÃ08Ãð0ÃPÀ„ÀxÃ0‘"ÃðÃ@ÖÃ0ÁÃ08ÃÀÃ02ÃUÃPzÀã à |Ã0 Ã0©Ã`Bà à v ñÀ~Ãð¡ÃЦ!ÃUÃÀ©Ãäà šÇ!ðjà |àIÃÐSðà ÀõÃ¥ ÃÀ‹÷ðíÃP˜àgÃàÃð à1!ð^ à ÃO ÃàåÃöÀÀ~Ã`Ñð|Ã0©ÃFñÃÃ@ôÃgÃ`$Ã¥ÃÐÄÓÃPÃð} àgÃÐ_ÃPÃ( ÃàßÃ¥àÀÃ#Ã`›ÃPžÃ.ÃàëàØà ÃP ÃÐÄÃpÎÃ0>Ã`6ð àÆðóÃÀJÃðBÃpcÃÀÃpKÃ@¬$ÀðùðíÃpÃpoàäÃÐ_ÃP˜ÀÃð$ÃàŒÃ4ÃÐÊðóðˆà[ðÿðáÃ:ÃàÃÐkÃgÃÐGÃðƒÃpÈÃpÎàIÃPzÃÀÃ`*àCÃ`NÀ À Ã@èÃÕàöÃ`6Ã`¡Ã`$ÃÃÃÀJÃ0DÃоÃÉÃ`³Ã`BàÞÃÀ&Ãà÷ýà Ã@eÃðàÆðjðdðÃàtàÆÃaà[Ã4ÃpòÃ@kàÒÃàýÃPÃ0\àÒÃ@_ÃÐ_ÃêÃðƒÃI!ðíÃP-Ã@ð^ ÃàhÃPÃ0»ÃÀ ÃàbÃ0>ÃP˜ÃpiÃpuðà[àOÃà\ÃÀ‘Ã`ÅÀ¢Ãð6ÃmÃÐ_ðùàäÃàzÃÀµÃ0>Ã0 Ãà>$ÃêÃÛÃð0ÃÉÃÐ_ÃðÀrÃ`­Ã(Ã0¯ÃP€Ã`$Ã0 Ãaà´ ÃоÙÃ0»Ã0,ÃPÃ@qÀàÞàmÃоÓàÌÃàzÀÃÀ ÃÀ‹ð|ÀŠÃÀµÃððjÃànÃ0ÇÃÉÃÌ Ã |À`!ÃÀÃPñÃpÔÃÀ‘Ã0—!à1!ÃPÙ#ð@%ÃPß"à%#ð@%à X%ÃPb"ÀZ"Ã+&Ãþ"ÃpÂÃðú è&ÀÅ%à á#à7 Ãp¶!Ã( Ã`§Ã`Ã"À­)à$ÃР"ÃÐŽ%ÃÐ$à¨"Ã"Ã`ú$Ãþ"ÃÀs#Ã@”(ÃPÇ&À×"ÃPD'Ã`è'à%à%#Ãà,'î%à 'Ó#Ã`}$Ã+&Ã0ö&ÃpŒ(ÃÀü!À×"ÀN$Ã`w%Ã`$ðÃ$à L'ÃPP%Ü(à %ÀN$Ãþ&Ãà2&Ã%'Ã`ƒ#ú#ÃP>(Ã@ &à„(Ã@/$Ãðè#Ãà)ÃðÄ)Ãc'ÃÐ#"ÀÅ%Ãì%Ãp )À**Ãà)Ãc'Ã`#ð½%à F(Ã` "ÃÆ!ÃP\#Ã@/$ÃP©+ÃÐj+ÃÀC+Ã7$ÃPV$Ã0%à ç"Ão%à ½)Ãpž%Ã`#Ãp°"Ãà»$Ã0%Ãðk#Ã`e(ÃðÜ%Ã7$ÃÐ/ Ãà'ÃP»(ð±'î%Ã@5#Ã0%Ãà©'À0)à ·*Ãà'Ã&ÃPµ)Ãð Ã0 Ã0…$ÃÀØ'Ãà£(ÃÐ &ÃÀð#ð½%Ãðâ$Ãp˜&ÃP8)ÃÀÞ&Ãðk#à´ Ã@²#à~)à Ï&ÃðM(ÃÀÒ(Ã`_)ÃÀC+Ãà—*ÃÐv)ÃÐ#"Ãp˜&À­)ÃÐ|(ÃP»(Ã0%ðL#Ã0s'Ãà>$ÃPJ&ÃÐù(à Ã(à)Ã`ô%Ãi&ðÉ#ÃPÓ$Ãp'è&ð«(Ã],Ã`e(ÃÐÕ.ÃÂ,ÃÀa&ð±'Ã@(ÃÐ|(à L'Ã0%à Ï&Ãð¸+ð·&ÃÐ%à&Ãi&ÃÀa&Ãà )Ãà,'Ãp(ÃÐù(Ãu(À¹'ÃÀa&ÃPÍ%ÃðÖ&À­)Ã%'Ó#ÃÐŽ%Ã`k'Ãu(ÃÀÞ&Ã,Ã`Ê,Ãpž%Ãð_%Ãà¯&Ãì)Ã0%Ã"Ãp˜&ÃÀ['ÃÀÆ*ÃÀC+Ãp'$à ùÃÀö"à~)ÃÐÿ'ÃP>(Ãp )Ãp(Ãðk#ðL#Ãp!%Ão%ÃÀö"Ão)ðÉ#ÃÆ!Ã`ú$à Û$ð¥)Ãà2&Ã@¬$ÃPß"Ãò$Ãc'ÃÔ)Ã](Ã1%Ã@²#à–%Ã@Ž)â'Ã7$ÃC"ð·&ÃЂ'ÃÐ|(Ãà2&À0)Ãu(à Ã(À¿&Ãp˜&ÃPÇ&ÃPD'à(Ü(Ãi&Ã`‰"Ã@SÃPÓ$ÃP¯*Ã0ö&ÃPD'ð@%Ã0"à´ ðvÃ`â(à +Ã@²#àœ$Ö)Ã@ &ÃàD#ÃР"Ã0y&Ã@¬$ÃPJ&ÃàD#ÃÐ#"Ã0%ÃÀê$Ãp-#à ðÏ"Ã0s'ÃÐ$Ã@¸"ÃPå!à R&Ã0Ò,ÃÔ)ÃÀm$à É'ÃД$Ã"Ãðî"ÃPë Ã@¬$Ã@A!ðÕ!ÃÆ!Ã@¬$ÃК#ÀT#ÃЂ'Ã@¬$ÃàÍ!ÃàÓ Ãà2&Ã0%ÃÐ#"à !ÃPÓ$ÃÀð#ð@%Ã0ü%Ã0$Ã0%ÃÀ!ÃPÓ$Ã@¸"ðF$ÃÀö"Ã`!Ã"ß!à=Ã@Ä Ã`}$ÃÌ Ã`#Ã`!à ÃÀy"ÃI!ÃÀ!ÃðM(Ãð_%Ã`‰"Ãðî"è&ÃД$à´ Ã@¬$Ã`w%ÃðƒÃà Ã(ÃPP%Ã"!à í!ÃPD'Ãc'ú#Ãð ÃðÃ`›ÃиÀ×"à á#ÃàÍ!ÀrÃP€à´ Ãвà–%ÃðÜ%Ã+&Ã0#ð:&Ã=#ÃÀ['ÃP>(ÃÆ!Ã:ÃPn Ãp )ð±'ÃÀm$ÃàD#Ù"à ÃÀ… àœ$ð±'ÃÀ ÃàÙÃ0,Ãpòà  ÃPÙ#Ãà8%Ã@#&ÃPÓ$Ãþ"Ã"!ÃUÃÀ Ãð} à ^$à p!Ãðè#Ã`ƒ#ëÃðw!ÃàD#à+"ÃàJ"Ãpª#à ùÃPß"Ã0%ðÉ#Ã#Ã$ÃÌ ÃЬ ÃÐ;Ã0&Ã0µÃC"ÃPJ&ÃÐ/ ÃO Ã"Ãð_%à á#ðÉ#Ãp-#ÃPÙ#Ã`ÃaÃ"!Ã`#ÃÀs#ÃC"ðR"Ãà>$ÀlÃÐ)!Ã@¸"Ã"!Ã`ÃÞÃ@A!Ãp¼ ðdà ÃPh!Ã0#ÃÐ/ ÃÃЬ ÀrÃÃð ðjÃ( ÃPn ÃI!ÃÀy"ÃÀÃPn ÃÐÄÃàÓ ÃUà ðáÃUÃÐAðóÀrÀT#Ã"â'Ãu$àÆÃ`¡ÃÐ#Ã4Ã0©ÃÐ/ Ã0‹#à$Ãàµ%ðÏ"à7 Ãðw!Ã@_ÃÐAÃ`<ÃÀÃ0ÁÃØÃ`#Ã0£ÃàñÃð›ÃÀs#ÃðÃàýÀà ÿÃàÍ!ÃÐ#"ÃpÂÀõÃPzÃ0©Ã¥ ÃÀy"ÃI!ÃÀ&ÃÞÃ.Ã0—!ÃÀ… ÃUÃ"!ëÃ"ÃÃp]ÃPÃpÔàCàOÃ0!ÃÐÄÃêÀûÃ`0ÃI!Ã0!Ã@âà Ãp'$À`!Ã( À`!ÃpÂÃ=#Ç!Àã Ã(ÃвÙÃpcà[Ãð•à à !ÃpKÃ¥ÃLÃÐÄàºÃÐGÃ08ÃÀ!ÀéÃp3"à7 ÃÀ… à7 ÓÃðô!ðpÃÐÐÃ02ÃàßÃ0©Ã4Ãð Ã0©Óà ‚ýÃ@Ãp¼ ÃàÍ!ÃPñà v Ã0,Ã`!ÃÀü!ðáÃàñÃsÃpEÃêÃ`6Ã` ðdýàÀÃPtàÆÃÀ¯ÃÀðdÃPë à ‚Ã` "ðjÃ02ð^ Ãðw!Ãpª#ðR"ÃgÀ„àÀÃ` "à1!à®!ðL#à d#à7 àaÃPà %Ã0 ÃÀ,Ã@èðpÃàëßÃp? ð ÃgÃ@MÃ@ÊÃC"ÃÀ… Ã@Êà ÃpÔÃ`<ÃÀ Ã[à Ã@A!Ã@ëÃð›ðð^ ÃPn Ã0 Ãp(Ã@5#Ã@qÃÐÐÃàn÷ÀÃÀ… ÃÀ… à=ðíÃ`<Ã0»ÃPß"ÃÀ‹ðçÃ0,Ã@Ä Ã0©Ãp3"à ç"Ã@ÐÃ` ÃPn Ãà\à ˆÃ`Ã0—!Ã¥ Ãð‰ÃðÃÃ`§Ã0,ÃЦ!Ã{#ÃC"Àf Ã( ÃPzÀ~Ã@ÐÃÆ!Ã"ÃÀ!ÃUÃ:Ã@ÐÃp¶!Ã@¾!Àlà®!Ãà1!ÃÐ;Ã0,ÃÀÃ°Û Ã =à´ Ã"ÃÀ ÃpæÃ(Ãðô!Ã@¸"Ã`$Ãp{à ðíðpðpÀlà Ã@MÃ0,ÃÐAÃ`• à ‚ðdÃàD#ðÉ#Ã`• Ã`ƒ#Ã`$à´ ÃР"Ãp'$Ã{#à¢#Ãà8%Ã@5#ðóÃ0 Ã@¦%à d#Ã@MÃpÈÃp? Ãp9!Ãpª#à®!Ã`ƒ#ÃЦ!Ãð Ã°Û Ã`¡Ã"ÃðÃpiÃ0¯ðóÀrÃànðçÃðƒÃÐ#ÃиàÌÃÐ#Ã0…$à !à7 ÃÐ)!Ã@¸"ðáÃàJ"à´ ÃpÂÀrÀïô$Ã0y&ÃêÃ:ÃPn Ãp&ÃàÙÃ@eÃðÃ`¹Ã@Ððjà=Ã08ðpÃð§Ã08ÀÃP€ÃÀ‹ÃÐÄðíÀïà Ã°Û Ã°dÃÐGÃ@âÃвÃPë àUÃ0JÃà\ÃÀö"ÃÀ‹Ã@èÃàP!Ã@¸"ÃÀü!à #Ã(Ã`§Ã`³ÃFÀÃ°Û Ã á#àÀÃP†ÃPÃÐ;ÃpÚðŽð|Ã[Ã`¡ëÃLÃÐMÃÕÃÌ ÃÀü!ðjÀõà ŽÃвÃ0 à7 Ã`6ÃðÃØàCÃÃ0åÃ0JÀð”Ãð›ÃðÃPŒÃð ÃÞÃàV Àf ÃyÃà ÃpÈÀT#ÃPñÃPÃ08Ãà\ÃpàÃÐÖÃàD#Ãà\ÃàëÀxÃÉÃ@Ã@SÃ"!àÀÃÃpQÃ` "Ã@ÜÀÃиÃðà  ÃðÃp3"À`!àÞÃà÷ÃàëÃðÃI!ð^ ÃØÃ`¿ÃØÃÐ/ à%#Ã`!Ãp¼ à+"àCÃ`§Ãð0ÃP†ÃиÃp9!Ã( ÃPh!ÃК#Ãвà Ã0»ÃÃàýÃ02Ã0>Ã0,Ãð§Ãà÷ÀïÃ`• ßÃànðvðvðùðÀxÃPÃÐ)!à ÃUÃÞÃð$ÃêÃðàOÃð$À„ÃÀ©ÃgÃ4ÀÃP Ã@_ÃUÃð Ç!ÃUÃÀ Ã@G ÀxÃ`À`!ÃðÃ`• ÃPzÃ0&ÃвÃ[ðdÃ`!ÃPå!ðvÃ`<àÌÃððvÃPŒÃÀ—ÃР"ÃÀ à ÃpÈÀ~Ã0>ÃPýà1!Ã¥ àIÀrÃ:Ãð›ÃàýßÃðq"ÃД$ÃÌ Ã°|à[ÃÃðpÃ@Ä ÃàñÀŠÃ0©Ã@âÃ@ÖÃ@ÜÃàåÃ0ÍÃ0ÇÃPn ÃàP!Ã0&Ã0¯ÃO Ãð Ã(Ã¥ÀŠÀïÙÃ¥Ãð›ÃÐÄÃ.Ã`­ÃpÔà ˆÃÉÃC"ÀT#Ã0µÃÐÐðÿà #Ã`¿ðùÃÐ)!Ã0ÁÃÐ_À~ÃP˜ÃäÃð›ÃRÃpÔÃpEÃ0ÍÃàñÃ`0àÀàØÃp]ÃP€ÃÀ—ëÃÃ0 ÃиÃÞÃ@eÃ0ÙÃÃðùÃp? Ã"!ÀÃpoÃÃà÷ÃàýÃPŒàÞÃ@_Ç!à |ÃPë àUÃPßÃàÓ Ã.à ˆÃÀ2Ã0»Ã@_ÀéÃpQÃ@ôÃÐqÀ+ÃÉÃpÈÃðÃsÀ Ã:ÃgðÏ"ÃPtà àÌëÃÞà ÃpæÃ`0ÃpEÃ@ÐÃàßÃð} Ã0¯ÃðÃ(ÃP ðùÃpàÃÀ ÃÒÃ`›ÃäÃàåÃp-#ÃðÃpQðíÃÀ Ã0£Ãðè#àÌÃP ÃP€àIÃ`§ÃÀ‹àIÃöðçà |ðçÀÃ`HÃÞàIà ‚ðÿÃmà ˆÃð à p!Ã( Ãð} ÃP†ÀïÃPzÃÀÃ0 ÃÕÃàýÃÃ0‘"ÃàÃÐ5ÃPn ÃÆ!ÃÐGÃ@âàÒðçÃÐ5ÃgÃ`§Ã`§Ã`• ÃЬ Ã0>Ã…ÃmÃàV ÃÐ;ðdÃðq"Ã1%Ã0…$Ã`6Ã0PÃ0ÓÃ`6ðóðdÀf Ã`à ”Ã@A!ÃPŒÃàzÃ@âÃààÒÃ0&ÃàñàIÃÀàCÃ0>àêñðjÀéÃP÷Ãð$Ã`<Ã@wðÿëÃÀ!Ã`ÃÀ&ðùÃвÃàßÃ08Ãp]ÃpiÃyÃÀ,à  ðùÃ0µà Ã0ÓàØðpÃÀ£ð|à ˆÃ@ðpà à[Ã(Ã0ÓÃ@èÃÐ_Ãp]ÃpÎÃð¡ÃpoÃ0JÃàŒÃs÷àÌÃÀ!à ÃpKÃÉÃmà #à ŽÃ0ÁÃP'à )Ã0JÃÀµñà ŽÃðÃÐÖÃÀ£ÀrÃpÚÃ`<ÃÃpìÃpæÃyðˆÃÐÖÃ@èëÃàåÃàññð|ÃЬ ÃPn Ã`­ðvÃÐGÃ:à+"Ã`›ÃP’ÃÀ2Ã@îÃà\àaÃ4Ãð$ÃÐÖÃ`<Ãà’ÃàñÃÐeÃð0ÃpàÃð§ÃáàöÃ@Ãp]Ã0ÓÃ``Ãð¹Ã@úà  ÃP-Ã0JÃ4ÃöàÌàUà=À%Ã0hÃÀ&Ã¥ ð|ÃÐSÃ`6ÃàtÃ¥Ã`ÅÃ(ÃÃ@úÃ@qÃ0£ÃиÃ@ÖÃÐSÃÃ0ÇÃànÀ~Ã@qðÿÃ0©ð|ÃÐèÃÉÃpQÃÐÜÃ@ÃP!àäà )ÃÀ2Ãð³à ¬ÃÐâà #ÀÃPŒÃð6Ã0ÇýÃÐâÃ`TÃÀVÃÃàýÃ.ÃP’Ãð$Ã@èÃÀ2Ã08ÃоÃðÃÐSÃ0Dà |Ã0 ñÃ4Ã@‰à Àà 5ÃöÃàýÃð­Ã`0àÞÃàñÃ`Bà )Ã`HÃÃÃ0bÃ0Jà šÃpcÃð§Ãpòð”Ãà†Ã0\ÀœÃ@kÃÃÃÐîà ¬ÃêÃ`TÃð³ÃàÃ0ÍÃà ÃÀ2Ã`6Ã0PðÿÃP÷ÃàŒÃ0¯Ã08Ã0>ÃÐÊà ”ÃàñðÃP’Ã4Ã.ÃÉÃpæðjÃRÃdÃ`fÃð*Ã@kÃpæÃ‘ÃÞÃÐŽ%ð‚Ã@‰Ã@ÃpþÃàÃ`6Ã@wÃ0ÙàOð‚Ãp]ÃÃÐkÃ`*ÓÃØÃ0JÃpæÃP!Ãð›ÃöÃ`ËÃðÃ`<Ãð§ÃàÃsÃÐkÃ¥ÃðÃP€ÃÀ,Ã@wÃð6Ã0»ÃmÃÀÃàbëÃàÃP’ÃÀµÃpÎÃäÃÉÃð6àÆÃ0£ÃððÀÃ0ÁÃ0>Ã@îÀ„ÃàtýÃ`BÃpòÃ@kðŽÃ@wÃ0»ÃиÃàåà  Ã@kÃPÃ@wðÃ0µÃ@qÃðà ßÃÃ`0ÃêÃ¥Ã0ÇÃÐÖÃLà Ã0µà #à  ð”Ã0JÃÉÃ@qà ²ÃÐwËàaÃ@îÃð*ÃPŒÃð*ðùÃPýðùÃÀ2ÃиÃðÃ@îÃ`×ÃðËÃðÃpQÃàŒÃ`Bðˆà ‚àÆðçÃ`­Ã.àUÃpÔÃÐAÃpiðà ¦Ãð Ãà€Ãpìà Ã0¯Ã0ÇÃðÃ`³ÃÐôÃ0ÍÃ@‰àÞÀÃÐèÃÀ»Ãà÷ÃÉÀŠÃP'ðÃpàÀÀ–ÃÐeÃ@èðçð|ÃdÃ@wÃpoÃ`³ð‚àaà  ÃÐMà ó Ã@èÃà˜ÃPªÃÀÁÃP!Ã:ëÀÃ0PÃ¥àUÃ0ÓÃàzÃÀ©ÃLÃ@}Ã0bð#ÃÐÖà ˆÃÀ©à ¦ÃdÃÐôàêðíÃ@ÐÃ¥ÃP’Ãà ÃоÃpÚÃ`HÃÐeðÃÃÀÍÃ@ÃP¤Ã0,àÞÃ…ð”ÃP˜à à ŽÃ0ÇÃÀPð Ã`ÅÃyÃpàÀ–ÃÀÇÃ@}ÃLÀïÃ0Çà ¬À àIÃðÙÃ@qà ¬Ã0PÃÀ»ÃÀ&À–ðÃÕà ²ð à ÊÃÐÖÃÀÃsÃÃXÃÃ@kÃàhÃ0&ÃàëðÃ0PÀÃÐÐà  ÀÃÉÃ|ðšð”ÃpiÃPà ŽÃP’Ã^Ã0ÍÃöÃÐâàgÃP¤Ãð6àºÃ`ÃÃà YÃðãÃÐwÃ.ð|Ã0PÃRàyÃÀÁÃà Ã@eÃààäÃ`BÃ@wÃ@Ãð§àaÃ`­ÃäÃÐYÃP'ÃÐ_ÃP!ÃÀ»àyÃ@‰ð”ÃP¶ÃàmàUàUÃÀ©Ã"ÃpøÃàŒÃÐÐÃÀ©à Ãà’ÃóÃáàà Ã@}ÃÐqÃ0Íðà ¬Ã@‰ÃP˜ÃPÃgÃ@ÐÃpæÀOðñà šà  à 5ÃP-ÃÐeàêÃ0ÇÃàŒÀ´À+ÃXÃùÃ0„9Ã8,‚ð_‹Ã¸·ŠÃ=‡Ãà„Ã(€Ã ¹€ÃP·|Ãð[yÃ0vÀßtÃ0 wÃwwÃ0‡wÃðsÃÐÀpÃ@[pÃ@änÃð nàÎoàclÃÅjðjÊcÃ0aÃPÜaà ÒdÃ`ÀÔaÀÂdà±_ÀÚ`ðU`Ö]à äaÃ0#^Ü`ÃУ`ÃPè_à …\à —YÃp`YÃÐJZÃ`ÈVÃ`KVÃÐÍYÀVÃÐVXÃ@\[â[Ã0AYÃÀ¸VÃ`æQÃ0ÄXÃPô]ÃÀ/XàvTÃðÂSð»OÃTàQÃ0qQà JQþLðÇMÀ½PÃ5NÃð]OÃP³SÃ`WTà ©VÃ#QÃêOÃðÚOÃðÚOÃÀúKÃЪJà MÃðRÃ`KÃ0*HÃÀôLÃPNOÃàBMÃp¢Nà ÷IÉ@à tJÃ`MÃLàGGïDà DÀíHÀÿEà HÃÐIð†Cà_CÃ&FÃ&FÃPCÃÀB@ÃÐQDð÷EÃðFõGÃpmBÃÁAà ¶?Ã&FðzEà È<à K<ÃP´>ÃP7>ÃÀT=ðBÃÐÚBà EÉ@ÃðÃ>à ¼>ÃÐì?à !CÃðF>É@Ãß<Ã$<ðBÃp>Ã@{AÃÐ{=À;Ã`ç<àkAÃp…>Ã@<Ãà>ÃpðAÃÐæ@ÃÐò>ÃÀT=ÃðÕ;ÃðL=ÃÐþ<ÃðF>ð!?ÃÐ:à;Ã`Û>Ãý7ÃPU9à•:ÃðX;Ãß@Ã@uBÀÊ9Ãp»5Ã0–6ÃЙ8Ã0–6Ã@F5Ãà7:Ãñ9ÃT4Ãp&9ÀM9ÃЇ;Ãp¯7Ã8Ãðù5Ã`ÿ8Ãñ9ÃàO6ÃÀõ7ðQ7Ãpµ6Ãðç8ð3ä5ÃÐ:Ãðv6ðW6à$8Àî3ÃàÆ7ÀÖ7ÀÖ7ÃàO6à ò5Ãz<À7Ã@L4Ã05à (-Ã0=0à65ÃÀ3à65ÃàÒ5ÃàØ4Ãà=9ÃÐ8Ãp>5à³5ÃÐ9ÃPÒ9Ã`ÿ8ÃB7Ã7Ã05Ã`6Ã@R3à Ÿ.Ã?-ÃðŽ2ÃàÌ6à­6ó9ÃÐ44ðì2ÃЫ5À_6Ãàa3Ãð2Ãð¬-Àî3àB3à 3Ãн2ÃP…1à×/Ã@X2Ã0I.Ã-0Ã-0àÑ0Ã`50ÃPü2ÃÀ¢0Ãð /à 1ÃÐ44Ã` 3ÃP/ÃP&,Ã0º0ðo2ÃP/ÃP0ÃPm5à “0Ãð”1Ãð0Ãx.ÃpÍ2ö.Ãð;+ÃÀ´-ð/Àƒ0ÃÐ^-ÃÀ%0ð-Ã`/1Ãû-ÃÐá,ÃÐÕ.ÃÐF1ÃP—.àû)ð .Ãph.ð“,ð/Ã@Õ2Ãï/Ã`Ä-Ã012ÃP1ð-ÃP&,Ãx.Ãpñ,ÃðÖ&Ã@š'ÃÀI*ö.Ãpß/Ã`M,ÃÐL0Ãà.Ã`#3ÃÈ/Ã`S+À³(Ãc+ÃÐj+ð,ð/Ãã1Ã0a*Ã`â(ÃÐá,Ãà‘+Ãì)Ã0ð'ÃÐ'ð()Ã@+Ãpý*ÃÐù(à «,Ãð¦.ÃÐÛ-Ãà )À•-Ã0ä)Ãà-à +ÃE,Ãi*à)ÃÔ-Ãpt,Ãc'ð()Ã@ÿ+À›,ÃÀO)ð()Ãð¾*Ã`Ð+Ãà-ÃP©+Ã0a*ÃÐç+ÃP2*Ã*à Ã(ÃÀa&Ãì%àõ*Ãæ*Ãpn-ð“,Ãà‹,à Ã(Ãà+ð¥)ÃPÍ%Ã`w%ÃÀØ'Ãð#/Ã0Þ*Ãp )Ãð;+à~)À¡+ÃÐ^-Ã`M,Ã0g)ÃÀg%Ãð_%ð,ÃP -Ã],ð+à :*Ã@ &ÃÐv)ÃQ*Ã(ð™+Ãð;+ÃÀØ'ÃðM(ÃÐÿ'àx*à ·*Ãp*Ã*Ãà£(ÃðÖ&Ãà+ÃÎ*ÃÈ+ÃðA*à ½)ÃÀU(ÃÀU(Ãð¾*Ü(Ã0…$ÃðG)ÃðA*ÃÈ+Ãð/-Ão)ð()Ãà£(Ã`w%Ã%'ÃÀØ'Ãð;+ÃÚ,ÃÀØ'Ã`Ð+àï+è&Ã0g)Ãà£(Ãò(ÃÀI*Ãà‘+À§*Ã`k'À0)Ãc'à F(Ãp!%â'ÃÀº,ÃW-ÃÐj+À,Ã`¸/Ãp†)ÃP£,À•-ÃÀO)ÃP>(Ã@)à ½)Ã`Ü)ÃÀC+àr+ÃP/Ã@p.ü-Ã@í.Ãp€*ÃÐv)Ãð¾*Ã0m(ð()À•-Ãà+Ã@ÿ+Ã0Ì-à)ð.(Ã@ù,Ã@ *ÃÀC+Ãà—*ÃÐÏ/àÝ.ÃÀU(à @)Ã0ö&Ê+Ãpt,Ãp†)Ãà©'Ã](Ã`G-ÃK/ð‡.ÃÐd,Ã](à„(ð¥)Ãà.ÃÐv)Ãpñ,Ä,ð"*Ã@¬$Ã`ô%Ãõ.à ±+Ãõ.ÃÀ®.Ãà*à 4+Ãày/ÃP.À$+à)ÃÚ(À­)Ã`ô%Ã@'Ãpå.Ã,Ãp’'Ä,Ãð5,ÃPD'ô$Ã`k'ÃðS'Ã0g)Ã~-Ãà+À**Ãà.à×/ÃÐ|(ÃÀÒ(Ã@š'ð-ÃÀ1.à (-Ãà&(Ãà‘+À1Ãà…-ÃK+ÃÐp*Ã0ê(Ãì)Ãð;+ÃP/À¡+à F(Ã@š'Ãð;+àé,Ãæ*ÃðM(Ãà£(ÃÈ/ÃÎ.à(ÃP -à @)Ã0Þ*Ã@p.ÃPü2Ã0C/àŠ'Ãà,ÃÐá,ÃÈ+Ã`Y*Ãp€*ÃÐù(Ã@Ž)Ã@p.ÃÐX.À›,À-Ãc+ÃP£,Ã@‚+À›,Ã`¾.ð/Ãà.À6(Ãc+Ã0U,ð/À,à ±+Ã](Ã0m(Ã`Ð+ÃÀÒ(ð™+ÃP8)ÃÔ)ðŸ*À­)ÃPß"Ão%ÃÀC+Ãð²,àû)à F(ÃðY&Ãþ&Ã`S+Ãà‹,ÃÀØ'à %Ã(ÃÐù(Ã@ˆ*Ãì%ÃPÍ%à%Ãi*Ãp )Ã],Ãò(àû)Ã0Þ*À0)Ã@ˆ*ÃP2*à&Ãþ&à :*Ã,ð:&î%ÃÀ!ÀB&ÃPP%Ãp’'Ãp˜&Ã{'ÀÅ%à`.ÃP2*à&à F(ÃÐí*Ãðk#à R&À¹'Ãpý*ÃÀÀ+ð@%ÃðG)ÃÔ)à Ã(àŠ'Ãp!%Ãpž%à @)ÃP—.À›,ÃðÄ)Ãi&Ã0#Ãc'Ã0m(ÃÀm$Ã0a*Ãp&à Õ%à 'à :*ÃðA*Ã@#&ÃÐù(Ãp€*À­)Ã@'Ãc'Ã`q&Ã0—!Ã`e(ÃðÄ)Ãp(À0)Ã`e(Ã+&ð.(Ã0s'Ãà )àŠ'ð"*è&ÀÅ%Ãæ&ðÉ#Ã1%ÃÀg%àŠ'à @)è&Ã`M,Ãì%Ã&Ã@#&ÃpŒ(ÃÀØ'À0)à¢#Ã0#ÃÐó)ÃÚ(à ½)Ãc'Ãp(ÃÀa&Ãà2&ÃPÍ%Ãp€*Ãò(Ãp*Ã`k'ðŸ*Ãà¯&à Ã(Ãà‘+Ã(ÃPJ&Ãà&(ÃP2*ÃÀê$ÃЦ!À<'Ã0m(Ã`è'ÃP2*Ã`_)Ãðâ$Ã1%Ã0%Ãp¶!ðíÃÐ%À¹'Ãpž%à 'Ã0%Ã+&Ã?-à L'ÃÐ$ÃÀ Ã` Ã`w%Ãàµ%Ãu$ÃàJ"à p!Ãò$ÃPD'à&Ãàµ%Ã7$Ã0ü%Ã0ö&Ã0‹#Ã0ü%à 'à&ð«(Ã0#Ù"ÃÀØ'Ãà,Ã`M,ÃàÁ#ÃàÇ"ÃÆ!Ã0ê(Ãð²,à X%ÃPh!à ó Ã$ÃP»(Ãà,'Ãi&Ã0…$î%ÀÅ%ÃðÖ&ð½%ÃàD#ÃPb"ÃÐ$À0)ÃÀg%ÃÀö"Ãò$ÃPÓ$à¢#Ãà©'ð+Ã@²#à 'ÀÅ%Ã`ô%à Õ%ÃðY&ÃÀO)Ão)ÃðG)à Ï&ÃÚ(Ãi&À­)ÃpŒ(Ã`w%Ã7$à ó Ãðq"Ãðk#ÃÀä%Ã&Ã0ê(ð()Ã0y&ÃPJ&ÀÑ#Ã0%Ã0ü%Ãà8%Ã°Û Ã`‰"À6(à «,Ã0y&Ãu(è&Ão)ÃPP%ÃPb"à$ÃÀU(ÃPJ&ÃÐ$À³(À6(Ãðú Ãø#ðÉ#ÃЬ ÀÅ%à„(Ãp˜&ð()Ö)Ãò(Ã`e(ð«(Ãì)ÃðG)ÃÀm$Ãp3"Ãð Ã#ðÕ!Ã+&Ã0ö&ÃðÜ%Ão%ÃÐp*ÃÀI*Ãà»$Ãà©'ÃðM(Ãà+ÃðÄ)Ãàµ%Ãà&(Ü(Ã@Ž)à)ÃÀm$ÀT#Ã`â(à X%â'À**ÃÚ(Ã0%Ã@Ž)Ãæ*Ã@ˆ*à %ð½%ð()ÃP>(Ã*ÃàD#Ãp )à :*Ã`e(Ãi&Ãàµ%à(Ã@ &ÃPÇ&Ã`e(â'Ãà)Ãc+Ãp†)ÃÐŽ%ð@%Ù"À³(Ã0ê(ÃPP%à%#à+"ð()Ãì%Ã@¬$à X%ÃÐ#ÃÆ!ÃPß"Ã`â(à É'ð@%Ù"ÃàÁ#ÃÀO)Ã0%ÃÀö"ÃÀ"Ãp°"â'à Õ%ðR"à ç"àû)à„(à%#ÃðÖ&ÃPÍ%ÀÅ%Ãi*ð«(ÃÀö"î%Ã"ÃÐ#"Ãðw!Ã0$ÃðÜ%ÃP\#Ã@¦%ðÉ#ÃPD'è&Ã@¦%ÃP8)ÃÀØ'ÃPÁ'Ãu$à Ãð ÀT#ÃPÍ%ÀN$à !Ãðú ÃP>(ÃPµ)Ã"Ã`!Ãp¤$ð:&ðL#ÃЈ&à&Ã+&Ã@ &à %ÃÐ%à R&Ã(ÃðY&Ã@;"ÃÐ$Ã0ü%ÃЈ&ÃД$à1!Ãðk#ÃÐŽ%À6(à&Ã&ÃÌ Ã€lÃà>$à%ÃÀä%à–%ÃPtà á#ÃP2*ð«(Ã$Ã`‰"Ã0!ÃðÄ)Ãà-ð4'ÃÐ#Ãðî"à í!Ãp!%Ãðô!Ãaà *ÃÀFiÂÀö"€.ÂÀ IÂ@2b€£~Â@IsÂ@|Âw “Âà!”Â@T‰Â îŒÂ@•“Â`¹šÂ€™Â ó Âà©ÂÀ[§Â€`¡ÂàD£Â`_©Â@ó­Â€°Â °ÂÀ ´Â@ϳÂ`A®Â ³µÂ@R³Â`ÿ¸ÂàÆ·Â ]¹Âà+¼Â€5½Â@ ¿Â@¥ºÂ ú¾Â MÆÂ€óÇ ¸ÉÂàéÆÂàÑÊÂ@ªÎ ÇÂ@¶ÌÂaÕÂsÒÂàÝÈÂ`·Ä€áÊ Π ÑÂÀÜÐÂ`ÊÂà6ÏÂ`iÑÂà¡ÒÂÀqÍÂäÔ óÔÂÞÕÂU×ÂàGá çÖ —ÙÂ`˜Þ äá€ÔáÂ@\ÛÂàâÜÂ`âÂ@»àÂÀšÛ®ÝÂ@¯â ÉÛ€ÚàÂ ÆæÂ ´é øèÂÀ.íÂ`÷ =è FÜÂ@éÂÀ@ê€oÝÂ`Ùè€tñÂÀôÂ@ÒñÂ`£ñ ùÂ`µîÂ`,ðÂ`>íÂ@Þï¡ô øÂlèÂ~åÂ`‘ô ïôÂ@1÷Â@Uñ òÂÀÎü€DùÂ@~ÿ 3ôÂ@Àô °ôÂ÷ ùÂà4ù fö ¿üÂÀÚú€ÁùÂàXóÂ@ÆóÂ÷ÂÀÂþ °ôÂàŸü€&Ãð®ànÿ 6þ zà÷à NúÂÐïð•ÃPŸÃ0QÃàþÂ@ÃÀ¼Ã@ûÂàÿÂÀÂþÂÜÿÂð1ÃPŸÃpÿðàzÃâÃ0ÚÃpÿÃÜÃð¨à *ÀÃðÃPŸà §Ãð1Ã;ànÃzþÃbÃPø ÃPÃ0Eà àJÃñÃMÃðºÃ`7ÃëÃP ÃÇ ÃŽ à ÃpíìÃÐBà ÀìÃÀ† ÃpL Àüà» à q Ã`Ã`¨à ÃPà Ã0ž ÃÀ'ÃP ÃÐ< ÃpÏÃ@ZÃÐ* Ã`% ÃpF Ãð×ÃàÎ ÃJ à ô ÃðéÃà?Ã0 à ÃPì ð_ Ãp: ÃàªÃС Ãp@ ൠðÊÃPæ ÃÀ ÃÀ† ÃÀñÃ,ÃàªÃÀ ÃÀ Ã>à k ð;ÃðéÃÀåÃ@¹ ÃÐÃÀÍÃPWÃp«Ã`„ÈÃà¼ÃÀtÃÇ Ã`„Ã@B Ã`Ã`ûÃ@§Ã@³Ãp(Ãà°ð;Ã…ÃÐ ÃùÃ,ÃðNÃLÃ0tÃà°Ã@§ÃàW Ãà3ÀºÃÐwÃÐèðšð¬ÃçÃÀÙïÃjÃp™ÀCàyÃÐ Ã@Ãð³ð¦Ã@< àÃpÃàžÃüÃÃàÃ@ôÑÃÀ´À=ÃíÃ0€Ã`ïÃà'ÃðHðÃð³Ã0bÃp“ÃÀbÃ@à 5ÃÕÃà!à ÄàÃçðð Ã@›Ã@§ð¸Ãà!Ã&ÃjÃ@wÃ0VÃ…Ãpoð¬àöÃ`ÅàgàöÃÀÙÃÃLÀœÃP°Ã@îÃ@‰ÀCà[àUÃðBÃÐÖÀûÃðÃFàÞÃ`<ÃjÃÐàöÃ`ÝàöÃpþÃ0VÃPÀÃXÃà!ÃpoÃ4Ã@èÃð6ËÃð ÃиÃmÃð6ÃÃàñÃpiàäÃP3Ã`NÀÑÃð¹Ã0tÃÀÇÃFÀÃ0\Ã0hàðÃð6Ã@ƒÃP?Ã`ãÃ@Ã@ƒà šÃÀ àêÀÃÀDðˆàðàØÃÉÀÃàüð#ÃpiÃ`¡ÃÀ,ð¦ÃpÃð6ÃpøÃ@îÃàtÃð<Ã@ à #Ãð­Ã0PÃÃöÃ@ð‚ÃànÃ@ÜÃÐYðŽÃ@ÃÃÃðà ¦Ã0ÓàÞÃà€ÀŠÃ@kÃ0»ÃÞÃPÃFÃpcÃànÙÃ@èÃ.Ãà†à šàU÷Ãà€ÃP†À ÃP’Ã@YÃ0¯Ãð$ÃÃÐ_à  À„À~ÃàzÃpÎÃð$ÃàåÃ@èàÞà /ÃmÃLÃàÃ0Áà ÃPÃÀ Ã0µÃgÀŠÃ@YÃ`Åð Ã0ßÃ@‰ÃP’Ãð¡ð|ÃPžÃpoàºÃК#à Ãð0Ãà÷Ã4àOÃàëàðÃð¹Ã0ÁÃð*ÃÀµàUàmàUÃ0£ÃPñðà  Ã`ÅÃpiÀœÀ Ã0!Ã0ÁÃ@_à |Ã`BÃüÃ`HÃ0JÃ0>ßÃ`§Ã4à šðjÃP’ÃPÃ0VÃPžÃЦ!ÃI!Ãð­àÃpÃ…ÃÐSÃÐîÃ`ËÃP’Ãp]Ã`§ÀÃPÃÀ©Ã"àÞÃpòðùÃð­Ã@YÃpÔðóÃð$Ã@kà[ÃyÃdÃ`¿àÞÃàzßÃ@ÜÃÐSÃðÃ@ÐÃ` "Ã0!ÃиÃ`¹à ðóÃpWÃpcÃÀàÒÃàÙÃÃÃmÃP¤ÃàtàCÃàßÃ0µÃgÃàýÃ`6àÞÃð*Ã.àCðvà šÃäð‚ÃððvàCÃ`§ÃÀ~Ãp9!ÃÀ… Ã(ÃàtÃð•Ã`$Ã"À„Ã( Ã` "Ãø#Ã0‘"Ãàð|ÃÀ‹Ã0‘"àºà´ Ã@G ÃðƒÙÃ@G ðíÃpÔÃpÈÃ@Ä ÃðjÃ(à Ãðw!Ã`$Ãðú Ãp¼ ðÏ"à ÃàhÃaà Ã`0ÃÞÃgÃàëðvÃPñðÏ"à Õ%Ã0&ÃÞÃàD#ÃÀð^ ÀÃÀ Ã[ÃpEÃÀü!ÃÐ;ðùàºÃðô!à %ÃàD#à®!Ãu$ß!Ãðô!ÃC"ÃÀs#ðF$ÃÀ‹ÃàbÀéÃ0g)à Ï&Ã@;"Ãò$Ã` "ÃPP%ÃðÊ(ÃÀ!ÃàåÃ@A!Ãà©'Ã#ÃPë Ã"ÃÀü!Àf à ùÃðú ÃÀÃ@;"Ã@ÊÃFÃ@Üà=à Ãðî"ðdàCðvÃðƒÃðk#Ã"à j"ð|ÃÒÃ#Ã@)%ëÃ@¸"ÃPÇ&à ÃpÂÃЬ ÃPzÃpKà v ÃÆ!Àã Ãp-#ÃÀa&Ã`#ÃðY&Ã`ú$ÃPÇ&ÃД$à=ÃàP!ÃàÍ!à ^$Ã@¬$Ãp°"àœ$Ão%Ãðî"à j"à v À×"Ãà>$Ã0!Ã0‹#Ãì%ðR"Ã`Ã#ÀË$Ã`‰"ÃÐ#ÃÐ$Ãp!%ðÕ!ðçÃäÃàV à j"à®!Ã0‹#ÃPh!Ãp¶!Ã0»Ã0 ð½%à X%Ã`#ðjÃ0!ÃЦ!ðpÃàÙÃ"!ÀrÃðk#à R&à1!ÓÃðÀZ"à ÿà Û$ÃC"Ã` Ãø#ú#Ã0!Ã4àÆÃ@G ÃàD#ÃàÁ#à p!Ã0,ÃPë Ã$ÃÀg%Ãì%ÃÌ Ã ºà+"ðóÃP à ÿà1!Ã0%à+"Ãð‰Ã`›Ã`• Ãp9!ÃÀ Ù"ÙÃ@Öà¢#à&ÃÀs#à¨"Ãðq"à+"Ãi&Ã@¦%ÃÐŽ%Ã0g)à¢#Ãþ"àœ$à ðF$ÃÐ$Ã`‰"À„ÃÀ‹Ão%Ãð_%à j"ÃPn ÀZ"ÃЦ!à d#ÃÐŽ%Ã0‹#Ã`!ðdÃ0 ÃØàCÃ` à ÿÃ( Ãðw!ÃPÓ$Ã{#Ã°Û ÃÐ$ðdÀÝ!ÃðƒÃÀ‘Ã1%Ã0y&ô$ÃP\#à ßÃ"Ã0 ÃÀ… ÀÝ!Ã0%ÃPÙ#ðR"ÃÆ!ÃвÃàP!ÃÐ)!ÃÌ Ãp'$ÃPV$à ç"Ãpª#Ã`!ÃPå!àºðL#ðL#ÃÃPÍ%ð@%Ã`›ñÃÀØ'Ã0!Ã@YðáÃø#ÃÀü!Ãðô!à ùÃиÃäÃpiÃ`›ÃàJ"Ã"Ãà>$ÃÀy"Ã`}$Ãp3"ÃàÇ"ÃÀ!Ã@èÃÌ Ã ÃÐSÃ`$à+"à1!ÃPñà à ÿÃ:à1!Ã@ÐÃ"ÃД$Ã`¡ÃÀy"ÀË$Ã@G ÃàbÃUßÃ02Àã Ã$Ãðî"ÃO ÃÐAÃ{#Ã"Ã[à ÃÀÃ` Ã@¸"ÃÌ Ã ÀÃÀÃÀ!à´ ßÃ0,à ÃPë ÃPñÃpcÃÀ,ðçÃ`$ðÕ!ÀéàºÃaÃpWÃð Ã@ÖÃàåÀ`!Àf ð^ Ãðô!Ã0 ÃÀ‘Ã0»àCÃPtÃp]ÃÀÃp¼ Ã( Ã$ð^ àÀÀf ðÉ#ðX!Ã.ÃÐ;Àf à®!ÃPÃÀð^ ÃUÃÃЦ!à ÃpKÃpÈàgÃ`NÃp9!Ã0£ÃÀ‹Ã`}$ðáÃ`0Ã@ÖÃ@ÜÃPå!ÃÐ)!Ã@G Ã°Û Ã°Ï"Ãp9!à Ã`›ÃpÈàÀÃð Ã"àa÷à®!ÃPh!ÃЦ!Ã0µÃÐ;Àã Ã`›ÃЦ!ÃÆ!ðÃ$Ãp˜&à´ Ãðî"Ã:ÃPýÃиÃàD#ÀÑ#ÃÀ… Ã@¸"à1!ÃPñÃp¶!ÃЦ!ÃpEðçÃPýÃ"!ÃÞà Ã`!ß!Ã0 Ãà ùà ÃàV ÃpEÀéÃp-#ÃвÃpEÃ@ÐÃP’ÃÐSÃà÷À×"ÃÀü!Ã0$ÃÐ)!ðáÃ` ÀÝ!ÀÑ#àÀÀË$ÃPV$à ó Ã@_Ã`$Ã0&Ãð Ã0 Ã0"Ã`*Ã@Êà1!Ã` "Ãþ"ÃpÂÃPn ÀõÃðÃ0‹#ðdÃ@YðÿÃPÓ$ÃPß"Ã°Û ÃðÃðî"ÃO Ãþ"Ãp3"ÃpÂÃÐÖÃpQðL#ÃÀü!ÃÀ… ðùðà Ãðú Ã"ÃиÃàtÃPÀ÷Ãp? ÃÐ#"Ã`ƒ#Ã0ö&ðçð|ÃÀ£ÀrÃ4Ãp¶!ÃPzÃ`­Ã@Öà Ã02ÃPýÃððÕ!ÃК#à à ùÃPP%ÃÀö"ÃÃÀ!Ã0—!Ã@YÃ"ÃpEÃ`ËÃ0Dà v Ã` "Ãp9!ÓàÒÃpÎÃ@G ÃÃPñÃ`ÃÀ‘ÃÀ Ãвà´ Ãò$ÃpÎÃÐ5Ãp? ðR"ÃàñÃ`§ÃpKÙ"Ã`!ÃpÎÃ`¡ÃÀ‘ÃðƒÃ`›ÓÃpKÃ`¹ÃðÃ:Ã°Û Ã0 Ã@eà à7 Ãвà |ÃÐÄàÀà !ÃД$Ã@ÖÃ@YÃp3"è&ÃàÍ!ÃÐ;ÃØà Ãp3"Ã[ðpà ó ÃÐAð|Ãðú Ãp? Ã0¯ÃÀ‹Ã`*à®!Ã"Ã7$Ãð ÃÌ Ã ÿÃÀm$Ù"ÀõÃaÃPñÃàåÃÞÃàßðjÃÐAÃÒà ÃØÃ0‘"ÃЬ Ã"Ã`HÀxÃ@Öà Ã@S÷ÀûàØÃð} ú#ÃpÂÃ`­ÃÞÃ`*ÃpÎÃÞÃ0©ÃàhÃÀð#Àûðdà ùÃUà Ã0ÁÃ`¡ÃgÃpKÃÐ)!ÃÃð ÃÀàCÃØÃ`§ÃàÙÃ`¡ÃÐMà ‚à¨"Ã@A!ðÿÃpàÃpÎÃ`›ÃàbÃp]ÃäÃ0µÃ0&àIÃ@_ÃPÃ:ÃðpÃÀÃàßÃP ÃàtàÒÃðÀã à®!ÃàhÙÃð ÀrÃ02ð|Ã`0Ã(à ˆÃPtÃÐ5Ã`§Ã°Û à ÃP ðùýÃP÷à ¦ÃêàUÃàbÃpÚÃðè#Ão%ÃàñÃàzÃ`ZÃPžÃI!ðjÃpWÃpoÃàzÃ(àÌÃêðáÃPð‚à šà[ðóÃ`¹Ãyà ÃPtàºÃàhÃàtÃÀÃ(Ã02Ã@YÃP€Ã0»à ²àCÃÞÀÃP ÀûÃ0£Ãäà à ð‚Ã`<ÃpQëðvÃÀàÒÃpÔÃÀÃ`6ÃÀà v Ãðw!Ã( ÃÀ ÃP†ÃPŒà[Ã@èðùÃÃðçÃÀ… Ã0µÃPžÃpcàÌÃPà ÿðL#à ÃÀ ÃpÂÃÀü!ÃÀÃð$Àã Ã@ÖÃpKà ˆÃ…ÃsÃ`§ðáÃàtÀ~ÃàbÃ@A!ð^ Ã`­ÃRðvÃ.Ãðq"Ã0!ÃÀðpà Ã@MÃàzàÆÃ@A!ðíÃð‰ÃPëÃàñßà ¦ÀÃ`0Ã@ÖÃPzÃ@¾!ÃPh!à7 ÃÏÃPà¢#à1!Ãð§ÀÀûÀrÃPŒÃàŒÃ@ôðˆÃ`NÃð›ÃmÃpÎÃ@Ðà ùÇ!à ‚ÃÀÃðÃ@âÀàOÃ0 ðáÃ`›à ÀõÃðÀ`!ÓÀxÀxÃðÃÀ,à ‚Ã0"ÃêÃà ÃÐYàÀÃFðŽÃÏÃÃàhÃÀ©Ãð} Ã`§À~Ãp¶!Ã@¾!ÃPzðpÃP!Ãð­Ã@ÐðvÃÀõÃÐ/ Ãðô!ÃàÍ!à ŽÃPžà  ÃÀ—Ã`0à[ÃpÎÃFÃðÃÐÄÃ@G ÃÞÃÐYÃP!Ã^À–ÃÐÖÃ0ÍÃ@qÃP÷ÃUàUÃP˜ÃÀ£ÃpKðjðóà®!ÃàÙÃpàÃð›Ãpcà7 ðÏ"Ã` Ã` à7 ÃPýÃ`$À àØÃÀÃ[ÃöðˆÃàtÃP÷Ã02ÃpWÃ@SÃðÃÀ2ÃЃÀ~Ã( Ã@âÃÕÀ„Ã(Ã`$Ã"Ãà÷àÒÃ@kÃÀà=ÃpÚà šÃÃÃ0&Ã`Àf Ãà€Ã`ËÃ0µÃàhÃ@ÐÀx÷ÃRÃ0ÙÃÐ;Ãðú Ã@¦%ðáÃP†ñ×ÃÛà ðíÃ0ÁÃ02Ã:ÃàzÃÀ©à ”ÃàbÃÃÌ Ã¥ à |ÃpÂÃ`¡ÃÐAÃpÎðdðvÃÐÐÃ@ÐÃð} ðóÃð$ÃЦ!ðùÃÀµÀ¢ÃÐ_ÃиÃЬ Ã@ÖÃ@YÃpKÃ`³ÃÀ&Ã`›àÒÃP à ˆÃ08ÃP ÃÉÃ0©ÃLÃFÃ¥Ãà\Ã0ÇÃÀÍÃÀµÃàëÀrÃ`¹ÃÐSÃ@Ä Ã d#à ŽÃPÃàbÃвàÒÃÀ£Ã`¡Ã@èÃà€ÃPzÃpEÃ02÷ÃÐMà[à ÃоÃÀ©ÃPßÃ0 ÃPñÃÐAÃ@eÃ`6Ã0ÓÃ0>ÃpÔÃÀÃðÃêÃÐÐÃÐYÃPÃ`­ÙÃÀÃ¥Ã` àOÃÀµÃÏÀ Ã`§Ã:Ãà€ÀŠðíàÒà Ãp¶!ÃðÃ@Ä ÃpEÃP˜÷ÃÀ‹Ã@ÖÃàëÃÀ=,ÃÀµÃàÃpiÃ`*ÃgÃPzÃàëàCÃ(ÃüÃ@eÀïÃPh!ÃÏÃ¥ÃÀ©ÃàUÀõÃPýÃð$Ã@ôÃ@kÃð‰àºà´ Ãp]ÃÐèÃÐÊÃ` ÃÐAÃð›Ã@ÜÃaÃиÃ`*ÃÐ_ÃàýÃ@SÃ`*ÃàëÀéÃp? ÃàëÃÀÃÏñÃàŒÃP†Ã4ÃàýÃ`­ÃÐ_Ã`¡Ã@ÖÃpÚÀ~ÃP!Ã0ÙÃpÚÑÃÃà ¦ÀûÃàåÃpÎÃð0àöÃ0ÍÃàtÃpþà Ã( ÃP†ÃÀ¯ÃÐYà |Ãgð À Àð Ã`BÃPÃÏÀxÃÐ5Ãð•ÀrÃO ÃÀ… ÃÐÊÃ¥àUÃÀ ÃPtÃPÃmÃyÃÀ‹Ãp¼ ÃRÃ0µÃàtÃà÷ðçÃ0DÃð0àðÃðð|ñà ÃÀ£ÃpcðŽà ŽðÿÃàýàÞÃÐGÃÀ‘à1!à ÿÃpcÃ@SÃ08Ãð­ðÃÀ¯ÀÃàtàmÃFßÃðÃàÃð›ÃÀ&Ã`ãÃ@èà |ÃäÃð_%ß!Ã0¯Àûà ;Ãà˜ÀÃð³Ã`¹à ˆÃPÃ`BÃ@;"Ãp9!Ã@Ã:à ŽÃ`• à Ã0ÇàIÙÃðÀ~ÃÀ‘Ã`<àÒýÃàzÃÀÇÃ`ÅÃà\Ã@G ëÀrÃpÂÃPÃ02Ã0 àOÃ`¿à ÃmðíÃ`#ÃPý÷Ã@kÃÀ£À~ÃÀÃ0©ÀûðÿÃPýÃ`ÃpiÃàà Ãð›Ã0DàyÃ`<ÃÀÃЬ à À–ðÿÃäàÀà=Ã`ƒ#Àf Ã0,à ÿà Ã`­ÃêÃÐ5Ã0µÃ0¯Ã`ÑÃRðvÃàUÃP ÃÐÊðÿà ÷ÃP†ÃP†ÃàåÃp¼ ÃðÃÐâÃPýýÀ ÃpÎàØÃRðùà ýÃäà ùÃÐÄÃP†ÃÀÃàñÃð•Ãð¡Ãp]ÃðÃð ÃÐGÃà˜ÃÀ2Ã`­à1!à àCÃØÃØÃ¥ÀûÃ.ÀéÃ@Ä ÃPÃ0JÃPŒðŽÃ08àØÃÃÃP'à šàºðÕ!ð ÃðÃaßÀ„Ã( ÃÃÃ0»Ã`0à #Ã02À–ð Ã`×à[Ã`­Ãàzà ¬ðùÃ`0ÃdÃpòÃ@}Ã`$Ã0»Ã@YÃ`BÃêÀÃ:ÃÀ Ã…ÃUÃ.Ã`¿Ã0µÃÀà ˆÃPýà  àØëàUÃÐ;Ã@_Ã`­Ã0©Ã0¯ÃÀ,ðÃFÃpcÀrÃ@âàOà ð”Ã4Ã0>ÃpiÃàëÃÀ£Ã0ÁàUÃüÀrà ŽÃð§Ã0\àØÃÐ;Ã.ðýÀ Ã"ÃP ÃàtÃ@âÃpQÃP˜ÃmÃðà Ã0»ÃÀÍÃ`<ÃPÃÀµÃpòÃÐ_Ã0JÃ08ÃP†ÃðÅð#à  Ã0DÃPªàØð à àOÃpÈàÌÃpìð‚ÃðÃ`6ñÃ`¡ÃÞÃÀ&à  ÃP˜à  ð‚ÙÃ"ÃÀÃÐèÃ`BÃ02ðvÀÃP†àöà ¬à /ÃÐîÃÐeÃÀ,ÃPŒÃ`ÅðÃLÃ@qàÌÃÀÃ¥ÃÐSÃpWÃPÀïà ŽÃmÃðdÃp? àÀàäÃ"ÃØÃ02Ã`0Ã0ÍÃmÃp]à šÃàñÀxÃð§Ã`HÃ`§Ãð•ñÃpÎÃÀ‘à ŽÃpÂÃ0µÃ0£à ˆÃPŒÃÀÃ`Ã.ÃØÃÐ;Ã`à #Ã0PÃPÃàßÃððjÃÒàÀÃPtÃPß"ÃðÃÀ&ñÃÀ!Ã4à ”Ã`¹Ã0!ÃÐ5àÀÃÌ Ã`§à j"à ŽÃ"ÃpWÃp]Ã@qñÃ0,Ã0©ÃÐ/ Ù"Ãà ó Ã"!Ã`§Ã0µà šÃPzÃÀs#ÃÀÃ.àÒÃpWßÃð³ðvÀéÃp? à®!ÃPë ÃPýÃäÃ0&ÃÀÃÀµñÃpiÃPh!ÃPñÃäÃPÃÐÄÃ4ÃÀy"ÃÐ/ ðjÃ¥ ÃàtÃp¶!à í!ÃpEÃ0¯ÃpQëÃÐ)!ú#à p!à á#Ã"!ÃpÈàÒÃ@ÜÃàV ÃÐ5Ã0—!Ãp¶!ÃàD#ÃPb"ÃPå!à ç"à´ à ŽÃÀ2ÃPzÃ`• Ã@G ðÃÀ2Ã@eÃpcÃàhÃàhÃÀÃ@A!ÃàñÃÐ5ÃmðÃÀ‘ðdÃàëÃPzÃ@ÖÃÀü!ðÉ#ÀÑ#ÃàÓ Ã€Z"ÀõÃ0&Ã0¯Ãp? Ãðú ÀrÀlÃÐ)!ÃPn ÃPë ÃPë ÃÀü!Ã°Û Ã€f ÓÃ@ÖÃÀÃO ÃaÃÃ`!Ã@A!ÃÐGÃ08ðáðóÃUÃ02ÃÀ… àºÀxÃàbÃ@YðpÃð} ÃÐ)!ÃоÃ@SàºÃpÚÃ`$Ã0&ÀïÃÐAÃàýðvÃ`0Ã@¸"Ã( ÃpìÀ„àCÃÀü!À×"ÃpÈÃðÀÃUÃ`¡ßÃÀ à$à&ðÉ#Ã`• Ã:àCÃðÜ%Ã0!ÀrÃp¶!Ãð›à ˆà p!Ã0,à ùÃÃÐAà ”à à ÿÃ`0Ã0,Ã0 ÃpÈÃPýÃ0»Ã0ÇÃð³Ã0©Ã0µÃðú ÃðY&Ã0£ÃÀ©Ã:ÃÃ`§àÒÃPýÃgÃÐMÃÀ—Ã0&ÃÐ5Ã0DÃàzÃP€ÃP÷ÃðÃ0>ÃP˜ÃäÙÃ@G Àrð|Ã02À×"Ãðq"àgà[ÃsðvÃ@kÃØÃÐMà àÀà ÿÃ@G ÃÀÃäÀûÃàë÷Ã0>ÃP˜ÃðÃpQÃð$ÃÐÐÃ`NÃÐYÃÐSÃ(Ã@âÃpQðà |ÃêÃFÃð•ÃPëÀÀ ððˆÃð•ÃàÙÙÃÀ©Ã0ÁàCÃ@Ä ÃÌ Ã0PÃð­ð À–Ã@¾!ÃpQÃêÃRÃð*ÃðÃð¡ÃànÃp]ÃàåÃPn ýÃànÃ@ÊàÀÀ ÀÃàtà |ÃpÔà ŽÃä÷àäðÃpcÃðËÃðÅàaßÀàêÃ@ÃP†Ã0 ÃFÃ0ÁÃðà ¦ÃmÃ÷ýÃÃÀÃàñÃ0µÃð*ÃPÃðÃ:àUÃPzÃàÃFÃÐAÃÞðÃ0ÇÃüÃ@èÀ–Ã0ÍÃà€ÃàßÃàP!Ã`§ðŽÃàžà ¦à #ðÃðà ÿÃЦ!Ãð‰ðŽÃ`ÅÃÀÃ`0àmÀ+ÃððÃ0Çà ‚ÃðÃsÃÀ¯ÃÐÖÃÐÊÃàh÷Ã@SÃÐ/ Ã@âÃ`Hà[Ãà’À–ÃðàÀÃиàäàäðˆÃpÔÃ`Ã4ÃP†Ãð$ÃPb"Ã0…$Ã4Ã@kÃP’ÃðíÃ(ðˆÃð¡ðóÃp¼ Ãø#ðÕ!ýÃÐYÃà÷ÃðÃ¥Ã` ëàIÃÀ£Ãð¡ÃPŒÃ@SÃàÙÃðƒÃpÔÃêÀõðjÃà\àÒÃ0µÃ0&Ãð6ÃÐâÃ02Ã08àÌÃðà v ÃPŒÃÐSÀœàOÃÐAÃ`BðvÃLÃP†Ã`Hà 5ÃP’Ã`×Ã@eàÆÃmàIÃÀ à[ÃP'Ã0µÃÐYàäÃà’Ã@ ÃÐYÃ`­ÃàbÀûÀÃ:ÃêðÿÃp¶!ÃÀ¯ÃÀ©ð à GÀ–Ã"ÃpKÃ0>à ÃÐAàÒÃÐSÃÕðŽÃüà7 ÃÀ&Ã0ÙÀ à ÃPŒÃÀÃ`§ÃðàmÃàÙðX!ÃaÃ`³ÃäÃ`³ÀïðíßÃ0µà ó ÃÀy"ðjà ÃÀ Ãþ"ÃðY&ÃàbÃð*Ã@qÃÀ&Ã0,Ã`6ÃÞÃpWÃà÷ð‚ðçà7 ÃêÃÉÃÐGÃàåÃ`*Ãàtð‚àºðpÃp]àºÃ`$Ã0>ÃpÂÀf Ã@_ÃÐÄðùÃ0£ðíÃpEà=Ã.ðvàØÃÀ£ÃüÃð¡à ˆÃPå!Ã08ëÃ@SðvàCÃ`!Ã@SÃ`¹Ã4ÃàÇ"ÃÐÊÃyÃ0 ðdÃ`0ÃP€Ã:ÃP’ÃÀ©ðŽßÃPžÃàŒà[Ãpcà=ðR"ÃP€ÃgÃÀ©àgÃgÃÀÃpuÃäëÃàÙÃpòÃð0ÃäÙÃàtÃ0,à=Ã(Ãð$ÃÀ¯ÃP÷Ã@G àCÃPtà ùÃ0ÇÃà ÃðàIÃPŒÃ@_ÃsÃ08ÃpààØÃàŒÃðÅÃpìýÃöðàIð|ðˆÃP†ÃP’à  ÃÀëÃPÃpQÃ@MÃP’ÃÕñÓÃUÃ`• ÃpcÃàzÃFÃFÃðÃà÷àÒñÃàñÃàtëàØÃP˜ÃüÃàzà ÿÀéÃäÀÃð¡ÃP'Ã@ ÃpìÃ@àäÃ@_à Ãðà ²Ã`NÃPÃÏÃÀ>ÃÐqÃpàÃP!ðÃàÃÃÃ…ðÿÃвÃÐ;à àÒýÃð­Ã`³à ˆÃÀµÃð§Ã0ÍÃà€ÃRÃðÃð Ã@îÀÃ`§Ãp? ðÿÃÐ_Ã@ôÃP¤Ã`¿Ãð¹à )Ã0¯Ãð§à ¬ÃðÃ0¯ðvðˆÃäÃP˜Ã@eëÃÀ,ÃXàÒÃð›Ã0µÃ0¯ÃP’Ã`¹ð Ã`<à ùðíÃ@kÃÀ&ÃÉÃÐeð‚ñÃÀ‹ÃàP!ÃàhÃÀ´Ã`×Ã0ÇÃÀ»ÃÀ>ÃpoÃÏÀÃÀÃÀ©ÃdÃÀÁÃÀ,àÞÀ ð#Ãð0ÃÐAÃP€Ã@ÃPÃÐÊà ÃÃðÃÀµÃÐÖàðà ;ÃÀ8Ã0ÙÃÀ2à ¬ÃjÃPzÃð ÃÀÃ0ÍÃÐYÃàð”àöÃ@ƒÃð¹à ¸ÃÀJÃà†Ã0ÓÃ@wÃÀ—ÃÏÃÀÍÃPžÃ(ÃpÔÃ`¹Ã@îÃÐAÃØÃRÃP-Ã0ÙÃ@âÃ`<Ãð*Ãdà ¬ð”ÀõÃ`ËÃð<àgÃP’Ã08ÃÀ‹À¢ð ÃöàUÃ@âÀÃÃàÀà |Ãp9!ðpÃXà šÃ`§Ãð­Ã@úÃÃmÃpiÃ^Ã0»Ãà€ÃP’À¨ÃàÃàhÃðú Ã@YàOÃLÀ ÷ëÃðÃÐ_Ã`BÃ(Ã@}Ãvà ¦ëàaàðÃ`×ÃàhàCÃÞÃÀ2ÃÀµÃyÃ0ÙÀÃÐÊÃÐkÃPÃ`Bà ÃgÃØà Û$ÃpÈÃð‰ÃaðÿÃÕÃÐÖà ÃpìÀ Ã`³ÃÀ&ÃÏÃp{ÃêÀ~ÃêÃÃÃ`×àmÃ0ÁÃ[Ã0»ÃÀ&Ã0,Ãð0ÃÀ ÃP†Ãð*ð ð|à šÃPtÃàhÃP À–Ã0>ÃPtÃ@eÃ`³Ãà€Ã¥ÃÀ2ÃÀ©ÃÀ,Ã.Ã4ÙÃ@ÜÃ@îÃÀ©Ã`¡ÃPàöÃðÅÃ@ƒÃ0JÃÀµðˆÃ`ãÃÉÃP’Ãàà  ÃÀ»ÃÐâÃ0PÃÀ¯ÃpÚàgà Ãà¤à #Ã`³ÀõðŽÃð$Ã"Ã`³ðÃ`ÅÃð$Ã`<ÃsÃà€ÃÀµÃ0µàOÃäÃ`›ÃpÎà Ã0ÍÃ0JÃÐGÃ@SÃ0»ëÃ`§à ÃÃ0\Ã@ôð‚à šÃÃÃÐîðùàÒÃ@qÃÞÃð›Ãð¡à šàOðÿÃ0ÇÃêà ÃÐMÃðÃyÃ@ôðÿà ˆÀxÀ„ðóÃ@#&ÀûÃð¿Ã`éàÃÐâÃgÃàÃmÃpcÃÏÃ`0ðçÃp]ÃðÃØðçÃÐYÃàzÃ@ôàØðdÃPýýàðÃ0bð”Ã`›à ŽÃÃ:Ã0VÃ0åÃÀ>àêàaÃðÃ08ÃÃð0ÃÀµÃð*ÃXà ¬ÀlÃ0»à ¬ÃpøÃð*Ã@ÜÃ0»àÞÃàtÃp? ÃÀÃ@èÃ0ÇÃ0ÁÃÉÃöÀ Ãð0àäÃÐSÃ@ôÃ.ÃLàaÃ0\à /àØÃð*ÃàbÃðÃXÃpòÃàŒÃpcÃàtÃ@À„ÃÀÃ4ðÃð¡Ã@ƒàyÃ0VÃ:ðíÃ`­à ²Ã@qÃÐSÃÃà /ÀÃPŒÃ`ÃpQÃàÃàýÀÃð0ðˆÃÀDÃ0ÙÃÐ;Ãðî"ÃPtÃàëýÃ0ÓÃ@‰àmÃàÀ%ð¬Ã4ÃðÀàaÃ`NÃðÃÃÃÀ£à Að”Ã08ýà ¦ÃÀ8ÃPÃ`­Ãð ÃaÃðÃÐMÃ0>Ã`*Ã@_Ã@ÐÃÐÊà Ã0JÃpÃàÃpìÃð*ÃpÚÃà’ýÃFÃP!ÃÏÃ`TÃ0ÍÃ`NÀ+àöÃ^à #ÃpÔà ŽÃàëÃðÃà€Ãð<Ãöà ð ÃP†Ã@ÃàŒÃð§ðpÃÐèÃ0\ÃÐâÃpiÀà ŽÃ@eà ”Ã`ÅÃ¥ÃÐMÀðÃXÃÀ8Ã@ÃÐGÃpEÃPŒÃP˜Ãð$ð|ÃP€ßÃp? Ã0!Ã`$àäàgà ²ÃÀ¯Ã0Óð#ÃyðÃÐ_ÃpuðŽÃà†ÃpæÃð›Ãð<Ãà’ÃÐeÃÀÁÃð­Ã0ÍÃÕÃ0ßÃ@ÜÃÛÃ0\ÃüÃ¥Ã0PÃÀ£ðÃöÀ ÃP ð ÃpiÃ0>àÀÃàëÃàhÃÛð#ð¦ÃðBÃà÷ÃüÃ4ÃP ÃÀÃpòÃpiÃ0\Ã@úÃP˜ÃFÃ0>ð”ÃÐ_ÃàzÃ(ÃpæðÿÃ`Nðÿà ÀéÃ0Dà ÃÀJàÃP¼ÃÐqÃP°ÃXÃð­à Ã0DÃPÃ.à ÃpàÃàhÃ`³ÃLÃ0PÃðƒÀÃ@}ÃP¶ÃXÃpuÃ`ÃðÃ0\Ãp‡ÃpoÃÐôÃPªà  ÃÀ>à #ÃÐYÃ0bÃPªà ¬Ãð§ÃÀ©ÀŠÃ@úÃà’ÃÐ;Ãàýð|ÃàŒÃ`ÅÃ@kÃÀ©ÃÀ,ÀÃyÃðÃànÃÀ2ÑàüÃð¿ð ÃpæÃ`0ÃpÔÃPðÃpìàêÃàzÃpìÃ@èÃð§ÃdÃÐèÀœÃà ÃÐ_ÃÃ``À%à  ÃPÃ0µðpà ”Ã@wÃàÀœð”ÃÐkÃ0\ÃLÃÀÃP!ÃÐîàÆà ÃðpðvÃð¹ÀÃpæà Ãð¹ÃdÃð›à ”ÃÃÀ2ÃXÃ0Dð‚ÃçÃÃÃpÈÃ¥Ã@wÀÃpøÃà†Ã`TÃ…ÃàyÃÀÓà /ÃyàmÃ@Ã0åàêÃ@qð àÃ`ÝÃ`BÀÃÐèà #ÃàzýÃà†ÃP¤Ã‘Ã`Ñð¬ÃPªÃ`×ÃÀÙÃð§Ã`6ÃP-ÀÃpòÃpÑÑÃ@ÃÐ;ðdð ÃpòÃÀ£ÃÐMÃÀ,ÃPŒÃO ÃpÚÃ`ÑÃð¹ÃÐYÃpàà[ÃÀ‘ÃÀ„ðçÃÀ8àsÃ`<ÃpiÃ(ÃÀ8ÃÃÀ ÃpìÀÀŠÀ%ÃðBÃÀ>Ã…ÃÀµà ”Ã0DÃ`<ÃFÃà÷Ãð<ÃàÃ:Ãð¹Ã0¯àÞÃÐèÃ^ÃP°ÃÉÃpcÃð­ÃPÃð­ðšÃÀ¯àIðÃÐúÃð0ÃàzÃ`¹Ã`<ÀÃÀàêÃàŒà ²ÃPÃ:Àð#Ãà˜ÃPžÃÃÀµÃÀÃÐSÃFÃpþÃÃð¹ÃXÃpiÃ`¹ýÃ`¹Ã0ÇÃpþÃÐ}Ã`0ÀÃð<ðˆÃ`<ÃêÃÐÊÃð$Ãà Ã@ƒÃüðÿÃÃÛà ;Ãð¿ÃÆ!Ã@ÊÀÃ@ ÃpÃjÃð6ÃÐ_ð#Ãð6ÃpÔÃàV ÃpÎÃ0Óà ²ðvÃÉÃ0ÁÃðÃ@úÃpÃÃÐMÃPŒà  Ã`³ÃÐSÃð*ÃÀ¯ñÃð0ð ÃXÀõÃÀ£Ã0JÃPªÃÐâÃ0ÍÃp{ÃÐYÃ"ÃÐAÃ@Yà ¦ÃÕð|ÃPë ÃÀÀÃpÚÃ0µÃð‰ðÂÃð*ÀõÃÀ¯ÃpìÃ…Ã0>àOÃ`¿ÃPžÃà÷ÃÀñÃ¥ÃPzÃÛÃ4Ã@âð‚ÃàÃçÃpøÃêÃÀ&Ãð$Ãðà ²ðšÃà€Ãð­àêà ˆÃ0—!ÃÀ©à )À Ãpæðjà=ëÃÐâÙÃÐMÃ`ÅÃàzÃpæÃpcÃðÃÃÃ`0Ã0ÍÃ@kÀ àÆðvÃàzÃ0ÇðˆÃÐSÃ@îà šÀÃàtÃêàUÃüÃÀÍÃpòÃð•Ã`BÃð§Ãð¡Ãà\à ”ðˆÃà Ãà Ã@YÃ`§ÃöàØàgÃÉÃáÃ`¹ð|ÃÀµÃsÃà Ãp ÃÐ_Ã:÷ÃFÃpcàgàaÃð¹Ã`6ÃàñÃÀ,Ãà’Ã0hÀ¢ÃÐSÃÃ…ÃpìÃ0ÓÃÀ Ã@}àyÃ0ëÃð§ÃUëÃ0JÃPªà šÃ`NÃ@qàsÃöÃà†ÃP-ÃpQðçÃà÷à /ÃPžÃÐÜðÿÃRÃð¹Ã@Ã`¿ÃàtßðÃ`×ÃP!ÃsÃÀà ¸ÃüÃ0»ÃàýÃÀ>Ã0ÓÃpæÃà’Ãà÷ÃPýÃ`Hàgàgà šÃÞÀ„Ãð<Ã…ÃÕÃP†ÃÀÃpìÃÏÃðà´ ðùÃ0ÁÀ„ÃÀðÀ`!ÃÀÃиðˆð|àaðùà /ÃÐeÀ„ÃpKàÆÃ0Óà šñà ùÃÀÃpià àCÃPŒà )ðÃpÔÃÃ.ÃðÀ~ÙÃð¡ÃLÃFÃÀàUÃànÃ0>ÃmÃ@YÃоà$ÃI!Ã0ÙÃÕÀ–ÃÐÜÃ@YÃPÃXà ¨(dt ?@4 4ÿxunitsyunitsÀK hC (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò% (ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec0 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitsPM pO TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøP HEAPX O datadescription8  @œ@R q·—NM€SNODèO @à À8Ãöà ÿÃäÃöÃ0»ðvÀÃp]à Ã0Íà ŽÃ"ÃðÃpòÃêÃð•Ã`HðùÃÉðÿÃ`<ÃðÃàtÃÐMÃ@ôÃ@}Ã(ÃpKðˆÃpìÀ„àÆà |àØÃpàÃðÃP’Ã08ÃÀÁÃ@qÃpQÃpQÃàbÃÐÐÃ0&ÃpæñÃ`HÀ–Ãð$À´Ã@wÃ@_à[ÃpÚÀÃÀ,ÃÀ¯ÃP†ÃàåÃ:ÃÀÃpÚà ŽÃð§Ã@_àUÃp]Ã:Ã0>ÃÐeÃÀ8Ã0µðvÃ@qÃÃ×Ã0tÃ`ÅÃ@èëÃP˜ðjÃðÃàýÃÀ2ÃàtÃ¥Ã.Ã@îàÞÃàtÃpiÃ`ÑÃð¹Ãð*àÃ@qÃàñÃP€ÃÐ;àÆÀ–ÃÐÊßÃÐMÃ`HÃÐâÀ ÃpÔàØÀà ÃÐMÃ@úà 5ÃÐMà #ÃpoÃpæÃPÃÐ_ÃÃÃ08Ã@YÃÃÃP3Ã`¹Ã4À„ÃP¤ÃðÃpcÃpøÃàñÃ( Ã`6Ã0DÃÐâÃÀ8ñÃàëÃp]ÃÐâÃàñÃ0»à  à ¸ÃPŒÃ`$àOÀ–Ã0ÇÃäÃpìÃð0ÃmÃ08ðvÃÐMÃPzðàÞÃ`§ÃðÃP÷ð|ÃÀ¯à ÿÃ@Êà[Ã0ÙðÃÛÀrÃ¥ Ã( Ã@ÃоÃ.Ã0ÁÃP˜Ã@ƒÃð6Ã@kÃPÃ`<Ã0»ÃÐâÃ`HÃPÃðÃmà ÷ÃpÚÃиÃÐÊÀ~Ãð‰à ‚Ã@kÃPðÙÃ@Ã4À à šÃà€Ã@ÃêÃ.ðàOÃÀ&ð|Ãðð#à[ð|ÃP ÃaÀŠÃÀ»ðŽÃÀ¯ÃàbÃmðÃPŒÃàëÃЬ ÃpiÃà ÃpÔÃÀ£ÃÐ_àØÃðÃ`0à ”ñÃpþÃð0ÃpKÃàëÃÀ&ÃàtÃàëÃÀ,Ã0Pà ¬Ã0»à )ÃpÃ@SÃPÇ&Ã`¡ðÃP˜ÃLÑàðÃÀ2ÃàÃ@wÃàzÀ„ÃàßÃ(ÃÐÖÃ`¿Ã`BÃÀÃð§ð‚ÃоñÃàÀÃÐSÀÃpÈÃ@ÃpWÃ@_ÃPÃP!ÃöÃp¼ ÃaÀœÃpÃpìÀ„À–Ã@qÃàžðÃðHÃàÀ¢àäñÃà÷Ã"Ã( àOÃ@ÃàëÃÀ&À¢Ãð$à ÃP°ÃXÃ`¿ÃðÀõÃÀ¯ÀÃpæÃêÃP ÃÐAÃ`ÅÃÀ8Ã`›Ã°Û Ã`$ÃPžÃà†Ã0JÃ4ÃpÚÃÐÄÃ@èÃ@à ˆÃÀ‹àÌÃ@âà àÒÃ@}ÃÀ>ÃÐeýÃ@_Ã@úÃÀÇà àðÃ@}Ã:Ã0µÃ@kÃànàäÃ`ÝÃPÀÃ0>ÃPÃàñÃÀÃàÃP'à #ÃÐMÃP!ÃиÃà\ÃàëÃP˜à ²à ¦Ã@SÃ0©ÀrÃP†ÃÐSÃÀ©Ãð›ÃànÃÐèÃpuà ²à Ã@îÃÀ,ÃÀÃ@ÐÃpuÃ0ÁÃà€ð‚ÃP3à ²ÃvÃÃðŽÃFÃð›ÀõÃ0¯Ãð‰ÃÐèÃÕÃð­ÃPŒà /ÃFðˆÃ`ÅÃð<ðvñÃÀ¯à ÃÏÃ…ÃdàüÃpìÃàýÃ@âÃpìÃð§Ã@qà ðŽÃ@èÀ%ÃpàÃ@ôÃÐîÃ`BÃà ÃPðà  à ¬ÃpòÃ0PàOÀœÃÐÖÃð ÃÐèÃpòÃàÃÐÖÃðÃ`ÑÃLÃ`¹Ã`³ÃmÃ@âÃËÃP!ÃPžÃðÃànðùÃÃð¿ÃÃ4Ã@qÃànÃ08ÃPÀÃáÃÐÊàgÃpoÀŠÃ0ÁÀ1àyÀÃàýðˆÃüÃ0ÁÃÀ—Ã4ÃÀ2Ãpìà ¬ðŽÃðBýÃÃ@àaðáà šÃ0\Ã@}Ã@wÃÀ&Ã`ÅÀ¢ÀŠÃðÅà ¸ðšÃPðvÀ%Ã@ƒÀÀÃÐâÃ`HÃ0åÃsÃàëÃ0ßÀIÃpà‹à MÃpÃð×àöàØÀÃ`NðÙÃÀ»à )Ã`ÝÃÀ>ÃÃà˜àgÃ`BàØÃ@âÃ0&à ŽÃÃÀ8ÃàÞÃàýÃ0ÙÀœÃ`ZÃð0ÃsÃÃüà ;À7À1ÃÕÃ`ÝÃ@ôÃ0DÃ@eÃpÔÃ02ðšÃ@úÃð0Àð ÃàÃÐèÃdàaà À–à /ÃÛýÃàýÃà ÃðÃÀµÃRÃð³ÃÀ,Ã.ÃÃÃ@‰ÃLÃÀµÃÀ ÃÀ&Ã@ÃÐÜÃ@kÃ02ðÃÀÍÃ`TÀ+àUÃÀ—ÃP ÃPÃà ²ÀÃÏÃà!ÃP¼ÃÀÃ`­Ãð­Ã^Ã@úÃPðŽÃ‘ÃpÃ@ÃöÃ0bàüÃð¡ÃÀ>àaðçðóÀ„ÃP’Ã@eÃð¡Ãð§ÃpiÃðBÃ0bÃ@eÃÃÀÃÃÃÐèÃ0ÁÃ4Ã`ÅÃyÃð0ÃpcÃÐAÃ`§Ã0ÁÃ`ÅÃàñÃÃà’Ã0ßÃÀÁÃÉà ŽÃ¥ÃàªÀ´ÃÐ_ýÃpiÃpòÃ@ÃPýÃXàðÃð¦ð)Ãp“ÀÃ08àÀÃdÃÀ\ðšÃàð¦ÃÀ©Ã0JÃð­ÃpÚÃ@eàsÃÀ>Ãð¿ÃsÃ`0Ãàà )à ²ÃpøÃà!Ãð¹Ãð<ð¦à /ðÃpoÃ0JÃ0PÃ0¯ÃànÃ0>Ãà ÃÐkÃð$Ãp{ÃÀ©ÃáÃ^ðÀ¢Ã@}àmÃð³ð|Ãð ÃmÃ0ÍÀ–ÃPžÃÐeà )ð à Ã0&àIÃàÀ®Ãà÷ðÿà šÃð¹àÃà Ã0ñàððÃàzÑÃPÃ@}ËÃöÃ0ÓÃÃ`ÑÃðTÃÐúÑÃÀµÀÃàÙðÃ`ÑÃ0ÓÃöÃp{ÃüÃÀÁÃ^à ÃöÃ@ÃÀ,ÃP˜ÃÐÐàÃ…à ¬ÃÀ»Ã0ÁÃLðšà AÃÀ>Ã`NÀã ÙÃFÃLÃ0nÃ@_à  à AÀŠàIÀÃpæÃ@úà ¬Ã0ÍàOÀÃ0PÃàÃàÃP’àÌðŽÃð­ÃyÀà  Ãð›Ã@wàgÃP'Ã0¯ÃàñÃáÃp]Ãà÷ËÃjÃ:ÃàðˆÃàñàUÃ¥Ã0DÃÀ¯à ;ÃpÃ0åÃpìà )ðÃÀÁÃpìýÃ0>Ã`HÀÃ`HÃpÃÐ_ÃàŒðÃpæà ¬Ãà†Ã@‰ÃP÷ÃP¶ð ÃÕÃpþÃÀPÃÀ8ñÃ`Ýð”ÃÀ¯à /ÃÐÜà )ÃÀÍÃà¤àaÃ@ÃpÃ0åÃðHÃdÀœÃà˜ðÃ`HÃð6ðšÀ–ËÃdÃ`Åð à ¸Ã@ƒÃdÃÐèÃ0ßÀà ùÃ@îÃ@‰àÃ4ÃÀ»ÃP?Ãð6ÃPàmÃÐkðŽÃP°à ¬à #ÃÀ1Ã@›Ã`TÃPžÃ0ÓÃÐôÃÃÀÇÃà€à ¦À%ÃàŒÃð³ÃP°àêÃ…ÃP°ÃÐîÃÀßà ;ÀðÃRÃ`lÃÐîÃà€ÃP3ÃpÃà’ÃÃð0Ã@qÃà ÃPªÃð³Ã@úýÃ`TðŽÃsà ¬ÃÀÍÀ¢Ãà!Ã&Ã0ßÃ@îÑÀ7×Ã0JÀûð‚Ã@úÃpuÃÐeÃÀJà ¾ÃÀ8ÃPªÀ¨à ¦ÃÐôÃ:ÃpÚÀ%Ã@Ã@ðùàOÃÀÃÀÃðBÃÀÇÀ¢ÃíÃ@•Ãà˜ÃÀÍÃÐYðÿÃ`¹ÃÐÖÃ@_ð Ã@ðùÃÃpòÃÃØà !Ã@Üà[ßÃpcÃð6Ã^Ã@ÃÀ,Ã@âÃP†Ã`§Ã0ÁÀÃ0PÃ0DÃàßßàIÀÃð³àÞð”ÃÀµÃð$À ð‚ÃpæðÃÀDÃð*Ã0ÁÃ0ÁÃ¥À„ÃÐGÃL÷Ãð*Ã@wÃÀÇÃ(Ã`§ÃàtÃyÃ@kÃ@_Ã` "à ŽÃêàÌàOÃP€Ã0"Ã0ÓðÃ0¯ðÃÀ2Ãpìð”ÃÀ&ÃPýÃÃà\ÃÐAàØÃ.Ã@Ãð*ÃÀ»ÃöÃÀ©ÃP€Ãðà /ð²ÀÃàtÃpÎÃÌ Ã0µàäÃ@kÃà÷Ã`6ÃPýðáÃànÃÐAÃ@kÃÐ;ÀŠàÒÃðÀlà ‚ÃsÀ¢ýÀŠàØÀÃð$Ã@¸"Ã0‹#ÃpàðvÀñÃ0£Ã@ÐÃpQÃàzà Ãð$Ã[ÃÀ… À„ÃÐGÃÐMÃsÃðÃ[Ã0ÁÃ0»ÃÀ‘ÃàßÃpÈàCà ¦Ãà†Ã0ÍÃð à ÃðÀûà àUð|Ã`*ðÿÃÐSÃ@}Ã`NÃ`HÃpøÃÐkÃðÃ4ÃÉÃsÃäÃÀÃÀ8ÃÐYÃP!Ñà ;ÃFÃà˜à 5ÃÛÃP'ÃêÃà÷÷à /Ã@}Ã`HÃ@ÃÐÜÃÐeðÃ:Ã:÷Ã0ÁÃ08ÃÌ ÃÞàêÃààmà  ÃXÃóÃð³Ã:À ðÃÐâÃððÃðÃP¤ÃÐkÃð*Ãð*ÃÀÃÃ` ýÃFÃpìÀŠÃÞÙðóÃоÃÐGÙ"ÃÆ!Ã` ÃÀ‹ÃÀs#à%ÃPå!à1!ÃЈ&Ã`ô%à¨"Ã$Ó#Ã)ð«(Ão)Ã$à–%ð .Ãà.àï+Ãð#/Ãð²,À0)À³(ÃP0Ã@|,Ãà‘+àZ/À-ÃP£,àl,Ãð;+Ã@ó-ÃÀ¨/Ãp\0Ãàg2Ã33Ãðš0Ã33ðò1ê0ð/Ãð#/ÃÐÃ1Ãð4Ã0=0Ã`¦2Ã@L4Àô2À}1Ãð0Ã0®2ÃP2ÃPö3ÃÀ„5à :Ã5à Ÿ.ÃPs4à­6ê4à 1Ã06Ã`”5Ã`2ÃÑ4Ãðó6Ãб4Ã071Ãàm1ðì2ÃÀŠ4ÃPð4Ãð2Àq3Ãðÿ4Ãðÿ4ð]5ÃP2Ã0+3Ã07Ã0¨3Ã5ÃÀ1ÃÐ(6à­6ÀS8à06à 3ÃÐÃ1ÃÀ 4Ãðv6ÃÐÉ0Ã0%4ð3Ã07ÃB7Ãðˆ3Ãàê1Þ2ÃpÍ2ÃpÁ4ÃP2ð/Ãð /Ãð0ÃpÁ4à È<Ã0 8Ãð4Ãб4ð-Ä,Ã@F5Ã33ÃП7à ì6Ãà[4à06Ãàa3ð3ê4Ã`A.Ã@á0ÃP/Ã`Ä-ÃPy3Ã0¨3ÃÀŠ4Ã@R3À.ÃðŽ2Ãt9à {4Ã0=0Ãðš0ÃÐÃ1Ã@É4Ã5Ãð#/ð3ðà4Ã@L4ÃpV1àN1ð{0àB3Ã33Ãï/ÃP -ö.Ãð#/Ã05ÃàØ4ÃP0ÃpÓ1Ã`)2Ãàg2Ã@í.Ãàü.ÃðŽ2ÃÐ.5ðu1ÃÐR/Ãpß/Ãð /Ã?-Ã0À/ÃÐÛ-Ã0À/Ã012ðò1Ã0%4Ã0œ5Ã0Þ*à 4+Ã071à¿3Ã'1Ã0I.Ã0À/ÃP-Ã`A.ð .ÃÀ+/ðø0Ã?1ÃpV1ÃpV1Ã-0ðŸ*ÃP&,ð .Ãð¦.ö.ð,ÃÐÛ-ÃÔ-à 0Ã0¨3ÃÐF1ÃÀœ1Ãï/Àw2À›,À¡+À}1à 1Ã3/à×/ÃÝ2ð/ö2ð{0ö2Ã0I.Ã0Ò,ÃP£,Ãð¬-Ä,ÃÐv)ÃÐó)ÃQ*Ã@‚+ÃÐÕ.À,ð-Ã-ÃÐR/Ã*ÃЂ'Ã@‚+À³(Ãp*Ã](Ãp&Ã0ü%Ã`Ö*Ã*ÃЂ'Ã@ù,ÃðÊ(Ã(ÃÐá,àx*À›,Ãð/-Ã0Ì-ÃPµ)àx*à :*ÃÀÌ)ÃP>(Ã0a*ÃÈ+Ãph.à ·*Ãà )Ãà)Ãà£(Ã`_)à 'àŠ'Ãp&Ã?-Ã@”(Ãà)ð+Ã@ÿ+ÃÐv)à)Ã@+Ã@ˆ*ÃP»(Ãà*ÃÀI*Ã@ÿ+Ã0ö&ÃÐv)ð«(Ãà'ÃÀÌ)À$+ÃðÐ'à Ã(ÃÐv)ÃP»(Ã0%ÃÐó)ÃÈ+ð¥)ÃðS'Ãu$Ã`à R&ÃðÖ&Ãà'Ã@²#Ãp’'ÃÐá,à)À**ÃД$Ã@¾!Ãò$ÃК#Ãð_%Ãðè#ÀZ"ÃðÖ&ÃðÄ)ÃÐù(àl,àœ$Ãðe$à Õ%à X%Ãp'$Ãà¯&Ó#ð±'Ã0=0à R&ÃÀü!Ã"Ã)ÃÐŽ%à 'Ãà£(ÃÐ'Ã0%ÃÐ$Ã1%à1!ÃPÇ&Ãc'ÃÐ%à®!ÃÀÒ(Ã`â(ð.(ÀZ"Ãðe$ð:&Ã@5#Ã@”(Ãà—*Ã0ð'ÃPV$Ãðú ÃC"ÃPP%Ù"à Ã0 Ãpª#ÃðG)Ãp&Ã@#&Ãpª#ðÃ$ÃÀa&Ãà¯&ÃðÖ&Ã@#&Ã@;"Ãp!%ð.(ðÉ#ÃÀ"Àf à+"ÃÀy"Ã`k'ðŸ*ÃpQÃ@ÐÃÀg%àºÃPå!Ãp¶!ðçú#à 'ÃÀö"ÃàÁ#ÃPÙ#Ã@²#ÃЈ&Ã@Ä Ã€ã ÃÀ… ÃР"Ãðâ$Ãà©'ÃÀö"Ã` "ðÕ!ÃàÓ Ã#ÃPÇ&ÃðM(ÃÐ%ðL#ÃP\#Ã@MÃPn Ù"ÃÀØ'àœ$è&Ã`#ÙÃp°"ÃàÇ"ÃPn ÀÝ!ÃðçÃÀ!Ãðè#à´ ÃàëÃÀà p!Ã`q&à d#Ãpª#Ã0#à%#ÃК#ðpÃÌ Ã d#ÃðƒÃ0 à ùà v Ãà\à ‚Ã0—!ÃÀs#Ã@5#Ã`}$Ã@¬$Ç!ðX!à ‚ÃÀ!ÃÐŽ%ÃPn ÃàhÃàbà í!à v ÃÆ!ÃÐ%ÃPh!À×"ÃàÍ!Ã+&Ã0"Ã0 ðÏ"Ãø#ÃPÓ$Ã@SÃpÂÃ"ðÏ"àÀÃ`• ÀT#Ãðè#ÀûÃ@G à¢#Ã0#À„ßÃð ÃàÇ"Àf Ã`ÃÐ%ÃpŒ(ÃPå!À×"ÃpWà¨"à Ã@Mà=ÃUÃ`0Ã`*à¨"à ^$À×"Ã`‰"ðL#ÃÆ!ÃÐ#"Ãþ"Ã`›Ãðè#Ãu$à%#Ã@ÊÃ`#ÃÐ#"à ùÀûÃÐ/ Ã`w%Ã@²#ÃàÇ"Ã` "ÃPå!Ãвà v à v ðÕ!Ã@ÊÃ0&ÀxßÃÀg%Ã`è'À6(è&Ãæ&Ã0…$Ã`$Ãp¶!ÃàD#Ãu$Ãà¯&Ã`• Ã@¸"ÃÀy"Ãà2&à 'Ãp'$Ã0#Ãð_%ðR"ÃàÁ#ÃPñÃI!Ã$Ã`ƒ#Ã0#Ãà8%Ã"!ÃàP!Ãà>$Ãðú Ã°Û ÃPñÃ"!ðçÃpàÃ[à à ç"ðÏ"Ãp'$Ã0!ðÏ"Ç%Ã0$Ãp-#Ã0#à%ÃÐ%Ã#ðÃ$Ã@¾!Ã"Ã0%à¨"ÃàÇ"ÃÐ5ÃЬ Ã@ÐÀ`!à&à%#ÃоÃ$ðÃ$ÀÑ#Àf Ãðà ‚ÃÀä%à(Ã@Ä ÃÀf ÃàD#à&Ãà2&Ãðe$à¢#ÀéðÕ!Ã`!à ÿðóÃPh!Ã@¦%ð½%Ãø#à+"ÀïÃp&ÃW)Ãp†)ÃàJ"ÃpÂÃpÂÀ×"ðÃ$Ãð Ãð‰Ã`¡ÃиàCÃàåÃЬ ÃÐAà®!Ã`‰"ÃàP!àºðR"Ã@;"ÃPD'À6(ú#ÃP†à ‚ÃP€ÃÃÃ"!Ã@¦%ÃàÁ#ÃÆ!ÃÀÃ08Ãp¶!à F(Ãþ&Ã`}$à7 ÃÀ!ÃÐ#à L'Ã`q&Ã&Ã0,Ãðw!Ã`$ÃÐ5ðáÃ0$Ã&Ã@;"Ã@Yà´ Ã0 ÃÐŽ%ÃÀð#à !ÃÀä%à+"Ãð_%à d#ÃÀg%ÃК#Ã"!ÃÀ!Ã`#ÃÐ%ÃPß"Ã"!Ã` Ãðw!ÃPÓ$à Û$ÃpKÃ@SÓÃ0y&Ã0…$ÃÐ#ÃUÃК#î%ÃÀ‘ðáÃp°"ÃЈ&Ö)Ã`}$Ãp¼ ðX!Ã&à Õ%Ãø#ÃÀs#ðX!ðÏ"à%#ÃÀ"ÃÌ ÃÀÃ` "À`!Ã"Ão%Ã{#ÃÀs#ÃPß"ÃC"Ã`§Ã08àÀÃ"Ãþ"Ãð_%à¨"ðÏ"ÀïÃp? Ã@¸"ÃàD#ÃàÓ Ã°^ ÃР"à Û$ÃÀ!ÃàÙÃPtÃpKÃaÃ`ÃÀ!Ã0…$à®!à ^$ÃÀ ÃPß"ÃÐ$ÃàD#ÃàJ"ÃðÃp9!ÃO ÃÀ‹à v ðÕ!Ã`• ÃàbÃÀÃäÃÐGÀrÃp9!à ç"Ã`¡Ã0»ÃðÃPb"Ã0"Ãðq"à=Ã@YÃP€ÃÆ!Àã ÃpEÃиÃaÃ.ÃÀ—ðíÃ0µðÕ!ÃpEÃÐ5Ãвà v Ã02ÃðÃÀ!Ã@;"ÃPë Ã@/$Ãu$ÃÐ#"Ã[ÀàÌÃ` "ÃäÃ@wÃ`BÃ@Ä Ãp¤$Ãð ÃpKð^ Ã`*ÃÀm$ðÕ!ÃÞÃ0ÇÃpÃP†ÃÐ5à ùà ‚àÀà ŽÃоÃPh!Ã`#À×"Ã0—!ÃоÃP÷ÃaÃàñÃüÃPë ÃÀ ðdÃØàIÃ°Û Ã`$ÃðÃð‰Ã4ÃàJ"ÃðƒÃ` Ã@MÃ`¡Ã@MÃ@ÜýÀÃUÃðƒà v àCÃÀ©Ã0ÁÃàåÃÐ/ ÃÀy"à Ã@YÃ0PÀ„Ã@ÊÃ`0Ã`0ÃÐÐà à í!ÃÐ%ðL#à=ÃàßÃ08ÃÀ ÃÀ£Ã`§ñà¢#à ‚Ã@SÀlÃaà ÃpÚÃÀ‘Ã@âÃÀ ðX!Ã"ÃÐ;Ãp3"Ãð•ÃÀ&ÃÐ5ðpÃRÃ0,ÃÀ!à |Ãp¼ Ã`ú$à ”ÃLÃð*ÃpÃ0ÇÃÀ… Ãäàºà[ÃÏÃÏÃP€Ã¥ÃäàÌðíÃð$à ŽÃ0!ÃÞÀûÃ@îà ˆÃ0¯Ã@A!à ÿàOÃÐÄÃmÃPzñÃà†Ã0PÃpKÃ@ÐÃÞÃ.ÃÀÃUÃFÃàÀŠðóÇ!ÃPñà ŽÃ`§ÃàÍ!ÃàñÃpWÃð­À Ã@;"Ç!ÃàÃ0\à Ã0,Ã0,àØÃ@Yà¢#ÃàÍ!àÞÃRÃ0,÷ÃPÃPà ¦÷ÃÃPh!Ã"ÃP†ÃP’ýÃPtÃðÃÀ£ÃÐÄÃÀ£ÀéÃp¼ ÃÀÃpàÃð} Ã` "ðpàÒÀrà ùÃ0¯Ã°Û ÃÀÃÀÀã à |à Ã@kÃP àgÃpEðR"ÃpQÃ"!Ã4Ã`HÃànàÀÃà÷ÃPÃpEÃPå!ÃððˆÃ0\ÃðÃàV ÃÆ!à ‚ÃÐÊÃ`›à+"Ã@ÐßÀ–ÃpàÃ@eÃÐYÃpæàºÃðÃ0—!ÃðY&ÃÒÃ0¯ÃpEÃ°Û ÃàåàIÃPtÀõÃÀ‹à ŽÃ@Öð|ÃpÈÃÐŽ%Ãðk#ðL#ÃØÃÐ_Ã0>Ãànà ¦Ã@Üà®!à á#Ã`$ðçàÀà ŽÃO ÃðÃ0¯à ”Ã`›Ã"Ã`!ÀràUÃð*ÃÐ5ÃàbÃàhÃpÎàÀÃPÃgÃPðvÃaà šÃPŒàÒÃ`¿Ãà†àCà+"Ãðw!ÃêàØÃ`*à ˆÃ0&Ãð•àÌð”ñÃ0,ÃðÃÐÐÃÐAÀïÃpÈÃÒàIÃàýÃäðÃ$à ÃP€à´ ðL#ÃUÃpEÃ0ÇÃêëàÆð^ ðóÀðpÀïÃÀÃPŒÃàtÃ@ÜðjÃp? ÃPýÀÃ`ÅÃ.Ãð ÃÃ@_Ã@ôÃpÎÃÀÃPñÓàIÃ`0ñÃà\ÃÐGðóà7 Ã0¯ð‚ðóÃ@Ä Ã@ÖÃÀ—ÃgÃÃÃÐYà ðpà j"Ãp3"Ãðô!ÀõÃyð|Ã`¹ÃüÃÐ;ð·&ÃÀ"ÃFýÀïÃÐ/ Ã08ÃpæÃÀÃP€ÃÐAðpÃ:Ã0ÁÃpoÃ@âÃpWÃà€ÃÀ,À„Ãð ÃÐA÷ñÃPýÃвÃоÃäÃpàÃsÃðw!ÃвÃ0ÁÀûýÃоÃÞðóÃ08à šàÞà ŽÃpÈÃp9!à šðùÓÃP÷Ã0ÓÃ0>ÃàëÃ`à®!ÃÀ Ã¥ÃöÃðÃàÙÃÐSà  ÃÀðpÃÛÃáÃ0DÃð¡ÃÃsÃàhÃ`$Ã0>ßÃÐAÃðÃPàÒÃjÃð Ã@MÃàà /ÃpìÃ@_àÀÃP˜Ã0>Ãð$ÃP°ÃjÃàŒÃpòðÃÀ ÃpiÃPàUÃ0»ÃàŒÃ@èÃ0ÍÑÃ0Pðÿà ÿÃ0&Ãð#Ã`xÃÐèÃp]ÀŠðáÃ`0ýÃð*ÃÀ»ÃpQÃPzÃÀà ¦àgÃpÚÃÀ¯à ”Ãà÷ÃÀ£Ã@SÀðóÃÐÊÀŠÃàžÃ`ÅÃÀÇÃRÃ0ßÃpæñÃÀµÃ02à[ÃðÃðƒÃ0,Ã:À+ð¦àÞÃÐÄñÃÐSÃ:ðvÀ+Ã`N÷Ã@Ãð³ÃP’À¢ÃmðdÃsÃPÃ0VÃÐYÃà Ã0VÃP˜ðçÃÃP¤Ã`³àIÃ@ÜÃÀÃÀ,ÃpiÃpþÃÀ,÷ÃÐ}Ãð³àð÷Ã08àIÃPŒ÷ÃÀ£à ”ÃÐÜýÃ¥ÃðÃPÃÀ&Ã0ÇÃpàÃäàUÃ@âÃpcÃ@èÃð‰ÃÀ Ãð$Ã@wÃ@wÃÀÀ~Ã0bÃ`¿Ã@wÃÀà ‚Ã0ÇÃPzÀÃ0ÓÃÀ»ÃÀ£Ã@eÃÀµÃpøÃðàaÃÃ`­Ã@ÐðùÃêÃð›ÃàzÃÐSÀ ÃêÃ`ÅÃ0&ÃÐÄð|Ã0Áð|Ã@à ¬àÒÃFÃ0DÃ@}àÌàIÃ0\Ã@Ãð} ÃÐÊÃÕÃpQÃpQÃ(ðL#ðjÃ`0ÃyÃðBà ÃP9ÃàñÃðƒÃð Ã.ñà ”à !ÃÞÃpuà ¦Ã0ÇÃÐkÃÃÀëÃðÃð*Ã0\Ã0ÓÃà ŽÃð‰ÃðÃðàÌàOÃpiÃÐYÃð•Ã0»Ã@Ã08àÞà )Ãp]ÃpcÀÃ@0ÃÐSÃ0ÍðvÃ@Öà ùÃFàêÃP’ÃðÃ`0ð ðà /ÃPàCÃð§ÃpìÃð¡ÃàñÃð§ÃÀDÃ4ÃêÀ¢ÃÐSÃð*Ãð§ÃÀ©ÃðÃ:ÃÀ>Ã@îÃð*Ã0DàÆÃðÀ à ”Ã4Ã0Jàêð#Ã@ÃÐâÃ¥Ã0,Ã0ÓÃàöÃ@wàØÃüÃpiÃðÃ02àgÃp]Ã@âÃ^ÃÀ8ÃÀ8ÃÉà  Ã.àäÃpiÃ0VÃ`ËÃ0ÍÃ`³ÃpÎÃð§ÃFÃÐÐÃÕÃÐÜÃ`¹ÃmàÒÃ`<Ã0ÁÃpìÃ…Ãà ÃоÃêÙÃ`¹Ã(Ã.Ã@kàØÃÀ,ýÃвðpÃà÷Ã0VÃð<àUÃ0»Ãsà Ã…Ã`<Ã@èÃðÀð À7ÃíÃPÀ~Àïà ˆÃ0"ÃpKàaÃð³Ãð¡Ã`6à[ÃÐÜÃFÃ08Ã@_ßÃ0Áð”Ã0Áà ‚à à ”àÒÃpÂÃ`¡àäÃàÃÉÃPžÃÀ à Ã@èÃ@eýðÃpiÃp]ÃànÃ`<Ã`ÃÐ;ýà ŽÀxÃÀ¯ÃÐÖÃgÃÐYÃPÃÐÊÃpÚÃ"ÃpÔÃ0,ÃpøàaÃÐÜÃÃàUÃPªÃgÃPzÀõÃÃÐkàêÃ@YÀxÃ`­ÃPzà ”ÃPÃ÷À+ñÃðÃðƒÃÀ ÃÛÃpæð|àØÃ`0ðvàÒÃmà[Ãð­ðÀ%À„ðdÃ`0àÞÃ`<ÃÐSÃ0>ÀŠÃ@qÃÃÐÄÃÀ©Ãà÷Ã0»ð|Ãà ðpÃI!ÃàñÃ`§ÃиÃpøÃð­ÃÀ»ÀÀààgÃ.à Ã@ôà #ðvÀéðpÃ0ÓÃPÃ0ÇÃ`BÃ@îÃ`0Ã[ÃgÃðÃXÃÃð Ã0&à Ãsà Ãà€Ã`BÃ`ZÃpøÃ4ðÃÀ‘ðùÀÃpiÃ…ÃáÃÀÁÃÃ0»ÃpWÃÐâÃ@ôà ÃPÃ@úÃLÃ`­÷ÃÀDàÃPŒ÷ÃÀ2Ã(ÃÐSÃðÃpàÃð$à ð|Ã0ÇÃàñÀÃsÃð•ëÃ4Ã`¹ÃáàêÃÐâàIÃLÃ`TÃPŒÀŠÃð¹ÃÀ2Ã`NÃP°àüÃÀ¯à ð Ã0ÇÃ`§ÃP’Ãà˜Ã@îÃð•ÃÀ©Ãà Ãà†Ã(Ã…ÃÀµÃ@îÃ02ÃÐÄÃÐÖÃpøÃÃpàÀÃÀ Ã08ÃP!ñÀ~Ã`*ðÿÃFÃÃÃÐÜÃÐîÑÀ+Ã@wÃ:Ãð$ÃÞÃ`ËÃ"Ã¥à ŽÃÀÃð­ÀûÃpàÃÀ à ŽðÿÃÀ,Ã`$Ã`¡ÀÃð6Ãà†ÃàÙÃP÷ÃPŒà ŽÃ0JÃ@kÀ„Ã@ÃÃÐSÃðÃ0DÃ0ÍÃ4ÃPàCÃÐ)!ÃpQÃð›ÃpìÃP Ã:ÃÐYà à ”Ã"ñÃ0¯Ã0µÃ0Íà #Ç!ðóÃÐÄÃð•Ãð0ÃðÃ:ÃêÃð•ÃðÀrÃÀÃ`¿Ã‹Ã¥à Ã¥Ã`­ÃànÃ`ËÃ@îÃ@MÃÐÊàäÃ@ƒÃ.ÃêÃÐGàÌÃ@à šÃ@âà Ã@G Ã` ÃðÃ@Yà  Ã@ôÃ0ÙÃP Ãð ÃÞÃàñÀ¢Ã^Ã`ÅðÃ0ÁÀïÃ"ÃpÎÃ`0Ãð­à ¦ÃàaÃÀ&ÃÉà šÃöðÃPÃ0VÃ0bÃÐâÃàëÃöÃ@wð ÃÕÃáÃÀµÃ@eÃÐÐÃPà šýðÃ0\Ã0ÍÃ0Íà[Ã0\Ã0JÃPð|Ãp¼ ð‚Ã@ôð ÃÀ… à àðÃÏÃ@›ÃLÃ`<Ã0ÁÃ0ÍÃðBÀÃà÷àðÃpÔàêÃpþÃ0&ÃÃð<Ã`ËÀàmÃöÃ`<àÆðÿð”ÃоÃ`¿Ã‹ÀÃPªàOÀ„ÃÀµÃÐÖÃÀ£ÃànÃÐîÃÏÃP’àÒÃpoÃgÃpKàaðGàÃðN÷ðŽà #Ã`HÃXà ;à 5ÃÃà ;ÃÃðšàÃpoÀÃ0PÃ@kÃ08ÃÀ2Ã@ À®ÀÀÃ`éÃàÃ`¿Ã0PÃÐYÃÐMÃàà ²Ã0ÁÃ¥Ã0ÇÃ@À1Ã@ À–ÃÀ£ÃP ÃÀ‘à ¬Ã`ÅðÄÃÀJÃpiÃ@ð²ÃÀÁÃ…àÞðÃ`ËÃÃñÃ0VÃ&ÃÐÃà!Ãð×ÃLÃ@qÃaÃàñÃàñàgÃð¿Ã`Ýà 5ÃPÃØðÿÃà’Ãð$ÃÀ&Ãpòà #ÃpÚð Ãp™ð)ÃÐÊÃðÃpà ;àñÃÀ©Ã0»ð ÃàÃXÃüÃ@Ä Ã€ûÃÃÀPàäÃFÃàÃP3ÃÀDÃ@èÃÉÃ@úÃP°ÃÕð#Ã4ð Ãð¿Ã`Ñà ¸ðšÃ:ðÀ7ÃRÃpòÃð6ð)Ã``ð²ÃÀÍÃPÃ@úà ÊÃàžÃ0ÇÃP!Ã@wà 5ÃÐâÃÐÄÃ`¹ÃöÃ`0ÃÀ2Ãà÷à ”Ã0JÃ@}à ¦Ãð³ÃP!ÃÀPà ¾Ãð$Ã0,àaÃyÀÃ`HÀ–ÃÐSà /ÃÉÃ^ÃÐîÃÐkÃÐâÃÃ`TÀ–ÃpÃðBà šÀ–ðŽÃÀÍðÃ0hÀðÃ(ÃP'Ãð¹ÃpÃP¤Ã0VÃà€Ãð³Ã`Åà  Ã@îýÃ0åÃ:Ã0ÇÀ Ãð*ÃLàCÃÀDÃÀÙÃFà 5ÃÀVÃP’ÃÃðšýÃP°ÃÐèÃàŒÃ@Ãà˜ÃpÃpòÃð§ÃÀ2ÃàÃ^à /Ã@•ÃÐð¦ÃdÃ@ÊÃp9!ÃÐÜÃ0ÃP]Ã>Ã0ëð#Ãà˜àÃðBÀÃRÃà ÃdÃ0PÃ0ÁÃð¿Ãð#ÃÀ»ÃPªÃP'ÃÀÍÃ@ƒÃÃÃÃ@âÃPÃàÃÀ>ð”àäÃPÃÀÇÀà ¬Ã`ËÃsà šÃ^ÃÀµà ÃÀ¯Ã``Ã`¹Ã@Ã@}ÃpìÃà3à MÃáÃRÃP!ÃÏÃ@wÃ0÷Ãp™Ã0ÙÃ@kÃ0JÃàÃà†ðÃ`ÑÃ`ÅàmÃÐYÃÐAÃÐSÃÐqÃÐeÃ`§Ã0ÁÃ0\ÃP-Ã:À¢ÃÐ_À–ÃÐÜÃsàäÃ0ëàmÑÃÕÃÐèÃpuÃ0åðà ;Ã`TÃ0PÃ`ËàUÃ`ZÃFÃP°Ãð­ÃpàÃ:ÃÕàöÃàŒß÷à ÊÃ@ÃÐ_ÃÀ2Ã4à Ã`×Ãð6àäÃ@wËÃpiÃà€ÃjÃ0hÃùÀ+Ã0PÀœà MÃpÃÀ¯ÃyÃð›àgÃ`ÑÃp À¢ð#ÃP¶Ã@ôð ð Ã@àêÃRÃP-ÃvÃP°ÃÏÃÀDÃÏÃÐÜÃ@ à Ã^Ã``ÃPªÀ¢Ã@ àäÀÃÐèÃ@}ÃÐÊÃÐèÃáðÃÐèÃpuÃ@à ÖÃ0ëÃ``ÃÃðËÃÐà Äà[Àà #ÃP°Ã@}à  ÃÕÃP¤ÃÀ¯ÃP¤ÃP¼ÃP˜ÃÐYÃ`ÝÃ&ÃÐÃ0\ÃðTÃŽÃ…ÃðÃÐÜàmÀœð Ãà†ÃÐqÃÀ>Ã0tðAàaÃàð¬ÃÀDÃÐ}à‹Ã@Ã4ÃàñÃð6Ãð0Ãpìà )ÀÃð³ÃàÀ1Ã`HÀŠààÃ0tÀ%Ãð¿ÃP3ÃÐîÃÐ_ÃÀßÃÐkÃàžÃð³Ãð*Ãà†ðÃà ÃÐâÃð³ÃààaÃà†Ãà Ã0ëÀ%ÃÀDÃ0hÃ…ÃàËÃXÃP!ÃðÑÃà¤ÃRÃ0\ÃÃÃRÃçÃÐèÃÃÀPÃ0ëÃ`HÃØÃüÃ0÷Ãíà ÀÆÃ@Ã@Ã…àðÃà€ÃpWÃ@à ÐÃP9Ã`TÃð¿ÃP¼ðAÃÐà YÃÐwÃ@úÃP¼ÃàÃ0VÃÃÀJð¾Ãjð5ÃÀÇÃóÃÐúà /ÃP9ÃðˆðÃ0zàà ÃàýÃ0Vàöà ²À¨ÃpìÃ0bÃpÃà†ÃjÃ0ëÃpòÃ`éÃЃà…Ãp À%ÃàÃP¶ÃÀÇð¦Ã@ ÃÃ0nÃ`ÝÃÀßàöÃ0VÃÐeÃÛà ¦ÃP-Ã0DàmÃöÃ0>ÃPÃÕà AÃÀÇà ¬ðÃ0ÙÑÃ0ëÃ`<ÀÃ0JÃàžÃP?à[ð‚Ã0zÃ``ÃFÃ0ßÃpìÃPžÃ‹ÃÐôÃ0hà ¸ÃÏà ¾à[ÃÀDð#Ãð¹ÃÀVàgÃ@wÃ@àsÃvà ;àðÃÃpàðà à ²Ã‘ÃjÃ@ÀËÃpuÃ`BÃÀÁÃp{Ãp{Ã`• À~Ã0Dà[ÃàÃpæÃ@•Ã0bÃÀDÃ@ ÃÐîà šÃPÃÐSÃdð”Ã`Ëàmà 5Ãð*à )Ã`TÃÏà Äà ¾Ã…ÃàžÃà†Ã^À–ÃpcÃP'àsÃXÃyÃP3ÃÃð<ÃÐèð ÃP9àÃ0åÃPWð¸ÃpÃÐîÃ@ ÃÐYÃpþÃ`éÃð6ÃàÃRÃXÃÐeÃ`¿ðùÃàŒàöÀ¨Ã@ÃÃàŒÃÃàðŽàÞÃ@ ð ÃðHÃpÃÃÃÐèàÃÀÙÃàÀð¬Ãà3Ã`ÝÃP9àà‹Ãð$àyðÃ@ ÃP¶ð à ¾à ¾ðÃð³ÃÃÐîà GÃ@Ã@kÃÛÃ£à ²Ãð<Ã0hÃÐâÃÐwàÃðNÃÐîàöà ¾ðšàðÃp À%Ã@›ÃÀÙà ¾ÃPEÃ0nðÄÃP¼ÃÀ2ÃðHÃÏÃÃÃ0ÁÃÀ¢ÃðÅÃp ÃÐqÃ0ÓÃà÷ÃÐeÃpÃЕÃ0 ÃЉÃàÃ0hà ²Ãà†ÀÃ`f×ÃÕÃpøÃpuÃð¿ðà 5Ãà’Ãà˜àÃ`fÃpÃpòÃP3ÃàÃÀ¯ÃpÃðÑÃ@‰ÃÃÀDÃ@‰Ã…Ã0JàÃЉà ÄÀ1ãÃéÃ0bà ÃpuàöÃð³ÃÐkÃÐîà ¸Ã`HÃ0tÃ@•Ã`Ýà ²Ã—ÃÃ@›Ãíà ²à ¬ÃjÀÃÃ0tÃà-ÃÏÃP?Ã£ÃЃÃÀJà ²Ã@à Mð à ¾ÃP'à ¾Ã`TÃjÃpþàÃp"à ð À¨ÃðHÃà†ÃÐâÃ0nÃÀVÃP3ÃvÃÐð/Ã``à‹Ãð­à )àðÀÃàÃÃ0÷Ã`6ÃFÀœðÃ0ÁÀðà‹Ã@Ãpìð#×ÃðÃ`<Ãð6À¢Ãpàà[Àà )Ã…À´Ã0PÃàÃP'ÃðHÃPÃ@îÃð¿àäÃ@Ãà’Ã0ÍÃàbÃ@_ÃÛÃ0Óà ”ÃP!Ãà'Ã`×à #àÞÃÀÇÃ@Èð²Ã`HÃPªÃ0ÍÃðÃ.ðjÃ`­ÃÐâÃÃ`HÃ@kñà /ÃÑÃÐÜÃ@}ÃpoÀ®ÃÐ}ÃPžÃP'Ãð<ÀÃÃÃÃpoÃð§à /ÃPžÃàÃÀ¯Ã`<ÃÐúÃà Ã`³ÃÐ_ÃÀ>ÃpøÃà’ÃFÃÐwÀ7ÃðÅàðÃÃ@}ÃÀVÃ0\ÃpàÀ–À®ÃpøÃpuÃÏÃpøðàêÃà€À%Ãp ÃÏàÞÃÛÃÃ`0ÃÉÃP-ÃÃ…ÃsÃð›ðšÃЉÃàÃ0ÇÃð*Ã0JÃ`6Ã`BÃsñÃ@èÃð­ÃàüÃàÃÀ8ÃFÃÐkÃÐâÃ0ÇÃpÔàÒÃàëñÃ`¹Ãð$ÃÉðšÃÀ8ÀÃyÃ`¿ÃP¤Ã[Ãàhà Ã.Ã@îÃ0PÃÐÊÃC"ÃÐSððˆÃFÃ@ ð|ÃPÃP˜ÃÃRÃpìð Ã@qÃÃpìÃpÔÃFÃ@à 5ÃpcÃ@kð”Ãð”ÃyÃyðùÃmÃðÃ0ÁÃ0DÃ0ßÃð$ð|Ã0ÇàÞðùÀ„àmÃÃÃPžÃàŒÃ`<àÌÀlÃPýÃðÃ0ßàêÃaàÆÃ‹Ã0÷Ãð­ÃyÃÃp]ÃPžÃ0DÀÃ@ÐàUÃêÃ`*à ”ð”àsÀ%ÃXÃÐÊÃÐSÃÏàÞÃ@âÃÏÃ0DÃ`NÃpiÃÐSÃðàÆÃÀÃÐGÃð0Ãð*Ã`­Ãà€Ã@wÃÐYðjÃ4ÃÀ£Ãð­ÃÀ‘Ã"!ÃÃP¼Ã08ÃpÚðùàCÃðÃðÃÐYàgÃð$Ã0>Ã0µÃ@Ä ÃpWÃ@Ã`¿ÃpiÃ@èñÃÃ0¯Ãà\à Ãð*à 5ÃÀ2ÃpàÃ(Ãð<éÃð$àÆÃ0ÍÃð§ÃоÃàhÃàåÃðÃð$à Ãàzà Ã`›Ã`HðˆÃð•àIÃÀ,À–ÃÐYÃÀ¯Ã`<ðvÃð$Ãð6ÃÀ©ðçÃ`$Ã`<ÃàÃXàêÃ…ÃpKÃðÃÐÜÃöëÀÃÏàÆÃ@ÐÀŠ÷ÃpoðÃàëðvÃð¡ÃÐÖÃ@eÃàåðíÃ@_ÃÐÜà /àUÃPÃp{à AÃà÷Ã@eàmÃPýÃ`ÅÃÐwÃpÃ@eÃpÎÃàÙàÒÃð¡Ãà à ÄÃpoÃPžÃ0ÙÃPÃ`¹Ã0»ÃpWÀ+ÃP’ðŽÃmÃÃÃÐ_ÃÀ Ã@Ãüà ¾Ã@}à )ðÿð‚ÃRÃðÃ@eÃP˜Ã:Ã0ÍÃÀœÃ`fð ð#àmÀÃà’ÃÃpðŽÃð¹Ã¥ßÃ08ðùÃ`*à šÃð*Ã`ïÃ`ZÃyÃÃàýÃ…ÃÐYÃàÃ^ðˆðŽÃð0à Ã@wÃpæýðšÃpøÃÃÐAà1!ÀÃP'À¨à2 à‘ÃmÃ0VÃÀ»Ã0>ÃàñÃÃÀDÃP°Ã4Ã`³Ã‘ÃpìÃP-ÃPÃêÃÃÃyÃ0DÀûÃ0DÃpiÃ0ÙÃ`ÅÃ`HðˆÃpàð”Ãyà 5Ã@ÃmÃÃ^Ã`×Ã…Ã`¹ðˆÃLÃàýÃüÃ@YñÃpÃ0Jà ÃÏÃð§à šÃÕðŽÀà 5Ã@wÃð0Ã@îÃÀ£ÃÐ;ÃöÃànÃ`ÃPb"Ã0>ÃÀ>Ãð³Ãð0ÃàýÃP’ðˆð ÃP!ðùÃ`6ðˆÃÀPÃmÃàßð|Ã@à ÿÃp]Ã`³Ãиàaà #ÃpQÀxÃ@kÀ ÃP'ÃP ÃpàÃÃÃpÔÃ0ÁÃyÃ@ôÃöÃ@èÃ@ÐÃÐ5ðjÃpQÃàåð|à à ¬÷ÃÀ‹Ã`0Ã0»Ã@kÃpæÃÐÐÃð6Ã`×ÃÀ»Ã@_ÀÃÀ8ÃP-Ã(à ùÃpÚÃ0ÍÃ`×Ã:ÀÃ0ÍÃ0JàaÃ0VÃ0ÍÃpÚÃFàUÃ…ÃçÃpìÃð¡ðŽð‚à ÷Ã0»ðíÃ^Ã"ÃðÃ@SÃ0»ÃpàÃ`*Ã@qð|ÀrÃàzÃ`¿Ã@ÜÃ@ÜÃÀ>Ãàtà ÃpWÃ0>Ã(ÃðÀÃ0JÃÕÃÀÇÃÛðóà ¬ðˆàêðvÃÐÐà /ÃP€Ã`*à ŽÃ@wðÿÃ0»Ã(ÃàñÃÀÁÃ`$ÃaÃPžÃ08ÃÐSÀ„à ”ÃðÃP¤Ãà ÃpæÃ@eðpÃpEðdà ¦àöÃ@wÃàÃðÃÐAÃÕÃÀ ð|ÃÀ©Ã@‰Ã0DàOÃÐâà ¬àðÃ:ÃP˜ÃÀ2ÃsÃÀ,ð¦ÃàÃðÃPÃ.Ã`ÑÃ0PÃ…Ã`×ðÃÐ5à ÿÃpKÃpÎÃpoÃà†Ã4Ã(ðˆÃàÀ–ÃÀ»à Ã`ÅÃPÃ@wÃÐ_Ã.à /Ã0ëÃ`0à ŽÃÀ»ÃÀ2Ã0ÁÃÐâÃ`¹Ãp¼ Ãp]ÃÀDÃÀÇÃà’ÃpðÀðdÃgðùñÙÃ`$ÃP’Ã@èà ”Ãð*ÃPªÃ0DÃ`BÃÀµÀÃÕÃ`BÃP°Ã0hÃ@àaÃðÃPžÃÀ2ðóÃÐÊÃиÃpiÃÐôà GÃüÃPzÃÃßÃàhÃ@}ÃÀJÃ@ôÃÃpìÃ`ÑðÃöÃоÃpÈàÒàêÃ0ÇñÃ`<ÃÐYÃP’à ˆÃP†ÃpiÀÃFÃPŒÃP’ðpÃ0JÃ:Ã0ÁÃpcÃ@ÜÃÐkÃFÃpQÃ@ÐÃP€àÞÃLà ¦ÃPà ²ÃÀ>ÃÀ>Ãð Ãà€Ãà ÃÐúÃ@ƒÀŠÃÀ&ðçÃP¤Ãà!ÃLÃ@_Ã¥Ã`ÑÃà à ¾À%Ã`6Ã@ÜÃöÃPžÃ:ÃgÃÀÀ Ã0\Ãàñà ÃöÃÀ2Ã`ZàüÃð³ðvÃÀ2Ã4Ã@îÃð§ÃpæÃ`¹Ãð­Ã@kÃ0Dà ÃP À–ÃP°ÃÃÃXàöð)àöÃÛÃpìð¬ÃP¤ÃRÃ4àUàäÃÐÜÃPýÃRýÀxÃÏÃ^ÀàaÃð*Ã^ðŽÃÐâ÷ð|à /Ã0ÓÃ0\Ã02ÃÐÖàÞÃpoÃüÃÐÖÃÐGð Ã0ÁÀàØÃ@eÃÐÖÃà\ðÃpWÃ0µÃäàØðÃyÃð›Ãà÷à ²ÃXà  Ã@eðvÃ`³Ã0¯Ã`• Ã0‘"ÃÞÃ@Ãð ÃàÃ0ÇÃàýÃ0DÃ0PðÿÃðÀxÀÃP¶Ã0JÃàëÃ0¯à )ðŽÃð$Ãð›à ‚Ã0JÃà†ÃP’ÃàëÃ@A!à ðšÃÀµÃ02àºðpÃÐ_ÃÀ»ðáÃðú ÃÐGÃäÃpcÃÀàºÃ Ã@Ä Ã0ÁÃgðíÃP Ã0ÍàÞà àÆÀ„ðùÃP ÷Ãp3"Ã@ÊÃÀ ÃÉÃ@èÃsÃðÃÐ/ ÃPë À~ÀrÃPñÃFÃ0 ÃpÔÃ`*ÃÀ Ã0y&à Ãàñà´ ÃÀÃP’ëÃLð|Ã0&Ãð‰ÃyÃ0JÃPÃ`¹ëÃpQà Ã0DÃp¼ ðdÃð ðáÃO ÙðóÀxÃ`0Ã`¹ÃànÃPë ð‚Ã0JðíÃpKà à%#ÃЦ!à ùÃP ÃyÃPÃpÎÃ`0ÃðÃ@MÃpWÃ`Ãð­Ã0Và  Ã0 Ã¥ Ã`³ÃÀà ÿÀéÃð} ÙÃÐÄÃ`$Ã0µÃ0©ÃØÃвà p!Ã0"ðóÃÞà |Ã0 àÌÃP÷ÃpEÃ0µÃàV à j"ÃPn ÃàtÃ`³àÒÃÀ… ÃàP!à=Ã`§ÃðÀÝ!Ã7$Ãp? à7 à ”ÃàzÀ~ÃgÃÐAà1!Ã08àÞÃàbðçÃ`­ð Ãð6àÞÃpWÀrÃàÓ ÃpÂàºà=Ã0©Ã@¸"Ã`$ÃpÈÃø#Ãu$ÃPzà ÿÃ0&Ã°Û ÃPýð‚Ãp9!Ã0&àOÃ¥à d#ÃÀ‹ÃÐGÀðÿÃmÃ"ÃðÃ`Tà )ÃðàÞÃàñÃÀÃ¥ÃFÃ0VÃð$ÃFÀŠÙà7 à ”Ã0JÃ@èÃð­Ã0JÃÐÐÃP ÃaÃÐMÃP€ÃàbÃgÃ`$ÃpÔÃÀ&Ãð§ÃàðÃÀ ðvÃÉÃÀ—Ã[À Ã:ÃàŒÃPÃyÃFÃ`Ãp? ðvÃð$Ã0µÃÀ&ÃÃÃP˜ÃÐÊÃÞÃ@ôÃ`6ÃðÃP€ÃPŒÃÀ©ÃPªÃ`³Ã.ÃÀÃð³Ã0>ÃÀDÃà€à ÃÀ£à ²Ã@Ãð6Àf Ãò$àºÃà Ã(ÃàzÃÐÊðóÃ0PàÒÃP À„ÃÉÃmÃáÃP¤ÃPŒÃÐMàäÃFÃ…Ãàà ¬ÃpÔÃ@ôà ÃPå!ðÿð|ÃäÃð*ð#àaÃpÚð”à ²ýÃ0,ðáðÃÀ©Ã@ýà àIÃüÃà†ÃP'Ãð§Ãð6ðŽÃyÃPÃpWÃÀ,ÃP'à[Ã0>ÃpæàOà ÃÀ>à  Ã`ÑÃáÃÀ8ÃÐ_Ãð§ÃÀ—Ã0ÇÃàÃ`NÃÀ¯ÃÏÀŠÃ.Ã0Çà 5ÃpcÃÀü!Ã` ÃPÃàŒÃ`ÑàCÃÐGÃÐMÃÐSÃÀ¯ÃFÃð$Ã@Ãàhà šÃ`ÅÃð$ÃànðˆÃpÚÃÆ!ÃÒÃà€Ã`ÅÃàÃð*À+Ã`Tðóàaà ¾ëÃàzÃàÃà†Ã`Ãð$ÃÐeà ¦à ÃmÃðÃÀ,ÃíÃRÃ[ÃÀs#ÀrÃÀ,ÀÃÀ£à )ÃÐÖÃ…ÃXÃÀ—ÀÀ%à Ã`<ÃÐÐÃPÃ@SÀÃ@âÃÐAÃgÀ„Ã`ÅÀ„Ã`*Ã(ÀïÃáà ÜÃFÃÀ©ÃàÃpÔà ÃpKÃ02ÃÀ£Ã(Ã0ÍÃÐSÃ4ÃàtÃüÃpìà ÃLÃ0JÃpìÃ`BÃÐ;àUÃFÃ0ÁÃÐâÃà\ÃÀ‘ÃÀÃ`HÀÃ`ÑÃyà Àrà ÃpWÃàýÃüà[ëà ÷ÃàëÃà÷Ã@_ÃàßÃ@âÃ0Óà ¦Ã02ÃÃ4ÃÀ2Ã@kðà Ã.ÃöÃ.àgðvÃ0DÀ„ÃÀ¯ÃPÃð0ÃàýÃà†ÃPŒÃ(ÃÐSÃð6ÃÃ°Û ÃÀð#à ùàIÃ0Jà šÃpÎÃ0ÍÃ`Ñà[ÃðÃà€Ãp]ðóÃPýðÿÃRÃÃ@qÃÕÀ%àUýà ÃöÃaðjÃ@kÃðBð ÃP÷ÃàV ÃÃàhÃÀ—ÃàhÃ`³Ã`HÃêÃp{ÃÀÁÃ0JÃ0ÁýÃ…ÃRÃ`›à ŽÃÀ&Ãà€ÃàÃ02ÃàhÃàñÃðÃgÀÃ0Çà ¬à[ÃàV Ã0DÃ`ÅÃ`<ÃüÃ0ÁÃÀ£ÃpQÃ0&ÃàÙà Žà p!ð ÃðÃÕÃÐ_Ãà÷ÃP¤Ã`ËàØà ¦ÃPžÃmÃ@ÃÀÙÃÐÄÃöÃÀ8ÃÀ8à )Ã`ËÃ@qðÃð•ðçÃànýà ”ÃÀü!ÃÀ8Ãpì÷ÃüÃgÃ@èÃmà ¦Ãà†ÃÐwÃÐqÃýÃÐ)!ÃÃÐâÃà†ÃpiÃ`­Ã`§ÃÀ¯Ã`ÅÃ`ÝÃÐèÃÐYÃ@úÃp]Ãð¡ÀàgÀ Ã…Ãà Ã0PÃÀÓÃ0VÃðÃPÃ@úÃ:à ¦ÃÀ8ÃÉÃÀ Ãà¤Ã0ÓÃ02àäàêðÃ0Çàüð ÃüÃÀ,àUÃ@eàØÃ0DÃ0ßà ¸ÃpÀÀÀ¢ÃàÃÐâÃðBð¬ÃÉàØÃÀ©àðÀ¢ÃàžÃàÃüð¬ÃXÃ@úÃpòÃpoÃ0åÃÀ,ÃpcÃPªàüÃÐîÀÃà€Ã`6ÃpþÃ`6Ã@ÃXÃP¤ÃpÃðHÃ0Pà ¬ð ÃÀµÃsÀ ÃÀ&ÃüÃà ÃPÃð$Ã@eðÃà’Ãà†à #ÃàýÃ0VÃ@eÃ@qÃP°Ã@Ãð6à )ÃXÃÐâÃÀÍÃÀ&ýÃRÃ``ÃÐâÃ@îÃP-Ãp{Ã`ÑàaÃàýÃP˜ÃàzÃð6ÃP˜ÃððvðùÃðÃðà Ã`0ÃàzÃÀ,Ã0ÙÃà€ÃpEÀxÃpEðpÃPñð^ ÃP†ÃÐÐÃpæàäßÃ@ÖÃиÃ0 Ã7$Ã`›ÃpÈà Ãà šÃððÕ!à ^$ÃPV$à=ÃðÃp¼ ÃàV ÃðýÃpÚÃØÃàåÃP€ÃðƒÃàëÃ`• Ã@YÃð‰ÃàP!à ó ÃвÃÀü!Ã0,ÃÐ;Ã@5#Ã`!ÃЬ Ãp¼ à¨"ÃpEÃPë Ã#ÃÐ)!Ã` "Ç!Ã0"Ã0‘"ÃpÈÃP†ÃàhÃ"ÃpÈÃPÃP ÃP÷ÃÀ… ÃÀ"ÃPzàÆÃp9!à j"Ãp-#à7 Ãð à ˆðX!à á#à j"Ã4Ãp!%Ã@²#Ã0£ðáð^ ÃÐ/ Ãðî"ÀË$ÃàÇ"ÃPzÃPÃPn Ãà´ à !à d#à ç"ÃÆ!Ãðú ÀxñÃI!Ãð_%Ã0"à1!ÃC"ÃÀ!À`!ÃàP!Ã0!ß!ÃPh!ÃÀð#Ã0ä)ÃÀ7-Ã0m(Ãð ÃI!àºÃ`¿ÃäÃ0©à+"à X%ÃÐ%Ã+&Ãðq"Ã0!ÀZ"à p!Ó#Ã@¬$ô$à ‚ÃÀ Ã0£Ã( ÃÀ!Ã`ƒ#Ã@A!ÃÀÃð} ÃÐ &Ãþ"Ã@Ä Ãp¼ Ã0£ÃpÎÃ0©à R&Ã@/$Ã`$Ã`#ðR"Ãðú ÃÀ… Ãðô!ðçÃ`$à !à v à á#Ãp'$ÃàÁ#Ã0‹#Ãp!%Ãø#Ãð à1!ÃPß"ÃàD#Ãðw!Ãp9!Ãà\Ã`›Ã`#Ã@”(Ã0ü%Ãø#Ã0…$ÃÀ!à Ãüà ç"ÃÀm$ÃpKÃðÃ0µÃ`!Ãæ&ÃPJ&ÃÀ‘à ‚ÃЬ Ãp!%ÀZ"ÃPë à %ÃÐ &Ãò$Ãðî"ÃàÓ ÃÐAÃ[ÃиÃðƒÃð} ÀûÃpKÃÆ!Ã@¬$Ã`ƒ#à=Ã`›ÃàåÃI!à=Ãp!%ÃpÂÃÐÄÃÀ ÃàbÃÀ—Ã`$ðÕ!à !ÃÐÊà ‚ß!ÃPb"Ãp-#ëÃ.ÃðƒÃP†Ãоà j"Ã"àCÀûÃÀ"Ãp¼ ðçÃ[ÃàV Ã@¬$ÀË$ÃànÃPŒÃÀ—ðçÃÀs#Ã@ÐÃ@ÐÃC"Àã ÃàD#ðL#à¨"ÃðƒÃàÙÃpQàIÃÒÃp°"Ã`• ÃÀ!Ãp¼ ðóÃ`¡Ã0 Ã@G ÃàJ"ÃP\#ÃЬ ÃPh!à%ÃPýÃsà !ÃÀy"Ã°Û Ã`#Ãp°"ÃиÃÀ‹Ç!ÃÀü!ðF$ÃÐ)!à®!Ã@A!ð^ ÃÀ… ÃpQÀïÃà\Àf Ã¥ ÃàhÃÀà¨"Ãu$Ãðô!Ã`#ÓÃðÃpEÃàJ"àºðdðçÃ@ÃàÙÃÃPÃPýÃ@ÖÃp3"ÃЬ Ã0£Ã0£ÃsÀrÃ`6Ãð ð^ Ã02ÃPå!ÃPñÃðÃÞÀZ"ÃàÁ#ÃpWÃðú Ã`$ÃàÓ Ã°X!ÃÀ‘Ã0!ðíà )Ã`Ëà=ÃÒÃ02ÃUÃÐ#"ÃÀ‘ðvà  à Ã( ÃPß"ÃànÃÙ"Ã@¦%ÃÀg%ð^ À„ÃðñðÏ"ÃÀü!ÃPtà p!À¿&à á#ÃànÃ0µÀÝ!Ã@¾!Ã08Ã@ÖßÃ`$à |À¿&ð±'Ãæ*àÆÃð•Ã@kÃ@}à ÃPë ÓÃPë ÀõÃpÔÃÐ5Ãà !ÃР"à ùÃC"ðR"ÃÀ"ÃàÍ!Ãp9!ÃPzßÃ@Ä Ã`›Ãp¶!Ãàåà ÃðÀéÀõÃàåÃ@SÃpÚÃp]ÃàbÃPžÃPzÃPzÃЦ!à !Ãð¡ÃpæÀ ÃÐÄÃоÀûàIàÌÃ0 ÃàñÃ`¡à p!Ãàbà v à p!Ãðà v à ÃÀ‹Ã`¡àØÃ0¯ÃÀ ðÉ#à¨"à=ÃØÃð ÃàhÃàtàIÃ0£Ã à´ Ã Ã@âÃð¡Ã4ÃÀ!àºÃ@ÊÀxÃàzÃ°Û Ã@MÓÃðô!à ÿÃ( Ã=#ÀïÃÀÃÐAÀ„ÃàÓ Ã`§Ã.ÃP€Ã@ÖÃpààÌàÀðçÃUÃÒÃØÃ0¯àOÃð›ÀÃPå!ÃÐ5Ã0>Ã"à´ àIàUÃÏÃÐAÃÀÃäÃÀà Ãðú ÃÒÃàß÷ÃÀ—à ˆà´ À×"ÃàbÃÀ‹ÃÀ… Ã0&à=à7 Ã` ÃÀ‹Ãð›Ãð¡Ãð$ÃüÃäÃ`0àUÃ0©Ã0µÃàzÃ4Ã@SàÞàIñÃ4à ùà7 Ã`BÃÀ Ãp3"Ãp¶!àIÃànÃ`$à´ ÀÃ0DÃp? ðdÃð¡Ã0Dà ‚ÃPë àIÃ`­Ãоà ùÃ`*àgà ‚Ã0‘"ÃI!ÃÌ Ã v ÃêàIÃPh!Ã@èÃyÃÀ,ÃÀ¯ÃP˜ÃÐÊÃêàÞÃpàÃ"Ãþ"ÃO ÃðÃÞÃÃðÃpÂðíßà ”ÀýÃ0ÍÃÀà í!Ã02ÃÀÃpEÃàëÃPýÃpQÇ!Ã`­àUñÃ`›ÀŠÃ@›à ¸Ã`HÃðÃpiÃàzÃð§ÃÐ_ÃÀ©à ŽÃÐMÀÃÏÃaÃ0>à ŽÃðÃðÃðƒÃ`$Ã@ÃÀÃð‰à à ÃRà ¾ÃàñÃðàØÃ`¹ð|Ã@ÖÃà÷Ã0ÍÃC"Ã0‹#ÀÝ!ÃpWà ÿÃpQÃ"!à !àaÃÛà ;ÃÐ_ÃÉÃð¡ÃÀ‹ðpÃPžÃðÓÃ@YÃиÃ@Yà Ã0©à |Ãð¡Ãð*ÀrÃ0©Ã"à ŽÃP ÃàÃ[ðáÃ@Yà[ßÃÀ—à à ÃpKÃ0DÃÕëðùÃ@ÖÃðñÃÀ!à¢#ÓÃÐMÙÃÀÃsÃ:Ãð¡à  à=Ãð‰Ãð›ÃpoÃàÃ(à ùÃPð”àØÃpÈÃO ÃPë ÃàåÃPýÃÃÃPÃ`­Ã4ÃFÃ`­ÃPn Ãàbð‚Ã0©Ã( ÃmÃðÃ@ôð àÒÃ@Sà7 ÃpQÃð­ÃÀµà )ÃÐMÃà ÃFàØÃpàÃsÃðÃPà 5ÃÉà ŽÃÀÃ@èÃà ÀÃÀ©ÃêÃ…Ã@wëðjëÃ"Ã.Ã0¯àØÃÀ£ðšÃÐeÃÀ¯ðóÃ`›Ã@ôýà ÃÐAÃÀ&ÃÐÜÃ@ôðvÃpWàÌÃÀÀÃ^Ã0ÇàÀÀÃÐYÃ0ÍÃ"Ã@èÃ02Ã`¡ðˆð ð|ÃàýÃLÃ@âÃàÃ@wÃÃPÃ0JÃ@q÷ÀrßÃ(àIà )Ã`­ÃÐAÃP€Ã@_Ã:ÃàhðóÀŠÃP ýÃÐSÃÀÃ4Ãð6Ã0Óàsà ÃÀ©ÃP’Ãиð^ ÃÀàOÃ@à ”Ã"Ãànà ”Ã(ðvÃ`6Ã"Ã@èàUÃð$ÃÃð$Ã`¿à ÃPtÃ0&ÓÃPŒÃà÷Ã0\À„Ãð‰Ã0ÇÃð Ãp? Ã@ôÃêÃüÃáÃÀ©ñàäÃPÃ@kÃpÚÀûðçà=ÃàzðvÃÐÖÃÃpÔÃpÈÃÐÐà  Ãð Ãà\ÃоÃ`0ÃPÃÀ‹ÃP÷ÀrÃ`­Ã0¯Ãð} ÀûÃPŒÃÐÖÃÀ8ÃÐÄÃÐGÃàzÃ@ÜÃ(ÃPýÃÀ¯ð ÃÀ&àOÃð‰àÌñÃ4àIÃ0&Ãp? àUÃ@eÃÀö"Ã@Ä Ã°jÃPñÃP¤ÃÐâÀðvÃ08ÃgàØñÃ@eÃÐYà ¬ÀÃ`­Ã`*ÃpÔÃ0 Ã@¸"ÃpKÃ`›ÃÀÃÀ>ÃêÃànÃ7$ÃÐAÃð<ÃÏÃàhÃ@YëÃÀÃ0»à |ðÏ"Ã0¯Ã0¯Ã`ËÃPžàÒà ÃpiÃ0»Ã@à7 ðX!Ã0ÁÃ:ÃpæÃØÃp¶!Ã0©ðpàØà #ÃàåÃ@Ä Ã ÀÃ:ëà ùÃàP!ÙÃLÃð‰Ã`­ðjÃ@Sà |ÃàÙÀf Ã0$ÃP ÃàŒà àIÃpÎÃоÃÃÃð*ÃàåðáÃànÃ0Áð‚Ã@kÃpÔÀïÃP€ÃàhÃ( à |ÃP€Ã[Ã@Ã(ÃЬ Ã@¾!ÃÀàOÃÃÃÐ;Ã`­Ãð¡ÃpÔÃ0—!Ãp? à ÿÃðÃÐÜÃ`Ãð Ãà÷à ”ðçà ÃPtÃ0ÁÃLÀÃ0ÁÃ`§Ãp¶!ÃÀ—ÃàðÃ@Ãð•Ã` ÃðÃ0¯ðóÃ@èÃÐÖÃð‰ÃpEÃ`­ÃÒÃpÔÃpÈÃÉÃà÷ÃðÃO ÃÐâÃÐYÃPÃ$Ã0—!ÃmÃÐ_ÃðÃ`Ëà ¦ð ÃÐâÃ°Û Ã™ÃÃÃpWÃÀ£ÃÀ2ÃP Ã`<ÃàhÃPÃpWÃàtðpÃ`*ÃðÃöÀ ÃpàÃÀÃ@_ÃÐÖà ŽðçÃPë ÃÀ8ÃÃÃPªÃð6àÒàmÃpuÃ`Åà ÿÃ0,ÃPŒàÞÃ@ÃÐMÃmÃÐÖÃ@qðÃêÃ`¿ÃáÃð*àÌÃàÙÃ0»Ã ÃàtÃð$Ã0DÃÀ àUÃ0µà ˆÃ@ÜÃLÃpÈàÌð‚ÃpìÃ@}ÃP’ÀÃÀ,ÃÐGà #à šÃ:ÀœÃàŒÃÀ©Ã¥ÃànÃ@wà ¾Ã0Áà[ËÑÃÐ_Ã4Ã@à šà #Ãð§ÃPà Ãð›Ãp]ÃÐqÃpÚà ŽÃP’ÃpæÃpÎÃ0¯à à )ÃPžÃÀ2àÀÃàßÃ`›ÃÐeÃð§ÃP’ÃpoÃÀ&ðˆÀ¨ð#ÃÛðÿÃð6àÌÃànÃ@kÀrÃÀÃànÃöàmÃ@ôà /ðÃ@îðÿÃÐYÃpÚðíÀÀÃP!ÃÀµÀÃP Ãpc÷Ã0,Ã08ÃÀ2ÃÃÐMÃÀ,ÃàtðÃð0ÃÃÃð­À~ÃàëÃиàÀÙðùàØÃPzÃÀü!ÃpÔð ÃÐGÃÃpæÃPýÃð$ÃpòÀÃÃàåÃPñàäÀ¢ÃÀ—Ã`6ÃðÃ(ÃPÃÀ,Ã`¿À„ÀŠÃ0ÁÃ(Ã@îÃÐ_Ã@úÃÀ8ðóßÃÌ Ã@âÃÃÀxÀ~ÃpÈðùÃ@kÃRà Ã0ÁàØÃÐÜÃÐGÃàÓ Ã0!Ãêà=ÃðƒÃð‰ÃP÷ÃpÎÃÀ Ã:Ã0>ðíÀrÃ@âÃgÃÀ Ã0©ðjà àÌðjÃgÃPñÃ0©Ã0ÇàÌàÆÃÞÃð•Ã02Ã`$Ãànà v ÃP’ÃpìÃоÃ`0à ÿÀ„ÓÃ`*ñÃиÃÃ`*Ãð•Ã`6Ã`$à ÃaðóÃÀÃpÈàØðÿÃÐMÃP˜ð|ÀÃà†ÃàÓ Ãp°"ÃðàÞÃØÓÃ@YÃÏÃpÚÃpÔÃpàÃ`§ÃpÚÃðÃP€ÃpQðdÃ0µÃÐÐà Ã0>ýÃÐÐÃ@_ÃàzÃpiÃ@âÃ@ÐðpÃP’ËÀ à ÓÃÐÊÃPžðjÃ`• Ã0©ÃÀ&ÃpàÃpcÃ0¯ÃÐÄÃPýÃXñðjÃÃ@âà ‚ÃÀ!Ã{#Ãp-#ÃÀ‹à7 ÃÀ£àÌÀïàºÃP€Ã0ÇÃP˜÷ÀxÃ0£ðˆÃ0PÃ@YÃ0£ÃFÃÃÃ`³ÃÐâàOÃÐSÃð­Ã.Ãð¿ð”À–Ã@kÃ`NÃp]Ãàßð^ ÃÞàäÃоÃÐ)!àUàgÃ@YÙÃ0¯ÃØÃÐSÀxÃÀ ðÃPÃ0ÁÃüðëßÃð¡ÃpWÃc'Ã[ÃpÎÃpcÃà¤àöðˆðvÃð§ÃàŒÃð$Ã0¯ÃàÙÃÀ£ðíÃ0—!Ã@ÃyÃ0µÃðÃð0ÃÃ@A!ÀràaÃÉÃ0©ÃpWÃ`<Ã0PÃP†Ã@ÐÀã ÃàßÃоà=ÃpEÃpKÃàñàäÀÃð$ÃÀ Ã`­ÃsÃÀ£ÃpàÃÀ©Ãð<ÃÀðˆÀËÃÏÃP’À„ðÿàÞÃÃýÃ`ÅÃà†Ã0ÓÃà€Àf ÃRÃà†ÃP ñà šÃP˜Ã`¿ÃÀ&ðŽÃ:Ã0DÃêÃpWÃÃpKà šÃÀÁÃð³ÃpøÃ@}ÃmÃàýàäÃPà ‚ëÃð­ÃðÃ0Çà[à ”ÀŠÃ`6Ã@àIÃÉàsà Ã`×ÃP!Ãp{àÞð”ÃpæÃP’Ãð0Ã0DÃLÃð³ÃpÚÃàtà  ÃÐèàmðÿÃÃØÃ:ÃÐÖÃÐSð”ÃPÈà ÃRÀà ”ÃêÃPŒÃÃêÃ`HÃ`TÀ¨ÃÐkÃ0DÃ`§ÃÐâÃ@Ãpøð‚À¢Ãà†Ã&ÃÀÁàaÃ`¹Ãð$ð¦ÃÕÃp9!àºÀœÃðHÀ7à[à ²Ãð­à  ð#ÃÀ>à ÃPŒàmà À+Ã`éÃð•ÃÃp{ÃP3Ã08Ã@kÃ0Ùà…à ;Ã0PÃdàmÃ@îÃ08ÃpcÃ@qÃð*Ãà Ã`ÑÃàåàÀÃ@_ð”à ¬ÃðÃÀÃäÃðÅÃP?Ãð<àöÃ0VÃÀµÃ0VÃ`<ÃsÃ@wð‚Ã@ÃpøÃPžàUð”À–à ðŽÃÀ¯à[ÃðÃP€Ã@Ã0¯Ã.Ã`¿ÃpàÃ@YÀÃð0à )Ã`0Ã@ÜÃ0JÃð0ýÃð¡Ã0VÃ`HÃPžÃàýðvÃð Ã0ÇÃÀ2Ãð<ÃÐÖÃðÃ`0Ã@èÃ0ÍÃPà à  ÃÀ%ÃÃÀœðˆÃpÚÃöÃ`³Ãð*ÃÀÁÃð³Ã0>Ã.ÃàåÃ`‰"Ã4à )Ã`éÃ0zÃPÃàëàöÃÃÃ[ðŽÃ`ãàmëËÃ@ÃàžÃÉÃ0åð|À„ÃpiÃyÀÃ`BÃÀ>à[Ã0,ÃP’ÃàëÃÀÃ¥ÃPÃ4ÃP¼Ã@èÃÀ&ðˆÀÃpoÃÐâÃ`BÃRÃà÷ñà Ã`0ÃP†àOÃànÃ@_ßÃP’ð ÃP'ÃüÃ0,ðˆÃà†ÀŠÃàtàmð#Ãp]ÃPžðšÃpoÃ.àÆà[ÃÀÁÃPªÃpcÃpÈÃ0JÃð¡ÃÀ£Ãà€Ãðà[Ãpià Ã@úÃÒÃ(à ¦àäÃà÷ÃÐ/ ÃÐÄÃÀ à[à ˆà7 ÃàP!Ã`$ßÃà\ðjÀÃÀ¯ÃFÃÞÃPñÃpÔÃsðàêÃ`0ÃÀ©Ã:ÃàtðvÃPŒÃ`­Ã@âÃÐeÃànÃpKÃð›ÃÕÀð Ã@SÃp? Ã`ÃÐGà šÃ@ÃöÃà÷ÃÉÃ08ÃðÃàýÃ4ðÿÃàñðóÃÀÃ0Çà  Ã`6ÃP€Ã@ÃPà /Ã0DÃÞÃPÃÀµÃyàgÃðÃLà[Ã0ÁÃpæÃÐÄà Ã"ÃðÃ0JÃÀ2ðÃ`¿ðjÃ`§Ãð¹ÃpoÃêÃ0ÍÃêÃ@wÃ`¿à ”àÀðX!à Ã@îàðàIÃÐÄà #Ã¥Ãð$Ã08à šÃp]Àã ðpÃàýÀ~ÃPðÿÃànÃpàÃàŒàÃÐèà ŽÃÀ©Ã@ôÃÀ»ÃöÃ(Ã02ÃPÃpæÃÀ Ã08Ã`ÅÀ àüÃ@úÃäÃ0µÃàŒÀÃ@ÃÞÃ0¯ÃðÃ0JÃÐMÀŠà ¾Ãà!ðˆÃ.Ãp? Ãðà Ã@úÃð$ÃP˜ÃLëÃàñÃ08Ãð­Ã0©ÙàIëýà p!ÃÐÊÃ`ÑÃ0Dð|Ã@ƒÃð$Ã.ÃpQÃ`6ÃP€à !Ã4àäÃPÃpìÃsà[Ã(ÃaÃpª#ðÕ!Ãgà ¬à ¾à ðùÃpÎÃðÃð*ÃàÃ`¿Ãð*ðÿÃXÃÐÐÃвÃÀ©Ãpòà  àÞÃàÃ`BÀ Ã`ËÃ…Ã`$Ã@Ä Ã ØàêÃànÃöàUÀrÃpÚÃð›ÃÀ,Ã@eð‚ÃpÎà #À¢Ã08Ã0>ÃöÃP°Ã0Óðÿà ”ÃRÃð$Ã@_Ã0»àØÃà€Ã(ÃÀ©Ã0JÀŠÃÐGÃÀ£Ã0ÁðçÃP÷Ã…ÀÃ@_Ã0¯ÃPÃ¥Ãð³ÃÃp]Ã0»ÃpÈÃð$ðpÃ@ÃpiÃàtÃ@qðÃ0»Ã08à  ðóÃðÃ0»ÃpÔàÒÀÃðÃÀàUÃPàØÃðÃ@_ýà à ÃmÃÐMðíàgÃ0>Ã0hÃ@ôÃ0ÁÃUßà ÃðÃPÃð0ÃÀ,ðóÀŠÃFÃpuÃP?ÃdÃÀ à ŽÃsÃÐÐÃð¹ÃÐ_ÃÀÃöààmÀŠÃP˜Ãàà à šÃRÃpàÃ`6Ãàà /ðçÃ@Êà Ã¥ÃPÃ`ÅÃ`¹Ãðà ”ðvàgÃð§ÃÀ—Ã0>ÃÐúÃÐîðŽÃmà7 Ã0£ÃÐ5ÃP ÃàýÃ…Ã0µÃ`³ëÙÃðàØà ¦Ã`³Ãð*Ã[ÃêÃ4ÃÐÜàgÃRð|à ÃP¤Ã`ËÃð›Ã@ÃÐ_÷Ã@‰Ã^Ã`§ÃyÃà†ÃÐâÃð*ÃÀ8Ã0JÃ@kÃà’Ã@Ãð§ÃÀ,ÃÏÃÀ,ÃÐÊðùà /ÃsÃPÃоÃвÃ`*à  Ã@âñÃaÃ`$Ó#à p!Ã"ÃÀ¯Ãð<ÃP!Ãà˜ÃsÃ@âÃP Ã0»ÀrÃàÓ ÃðÃPzÃ`§àOÃP’ÃaÃàëÃÐAàÌÃöÃÐÊÃFÃ@SÃ`*ÃpÎðvÃ0&ðpÀ~Ãð›Ãà\ÃàbÃ`ÀrÃp]ÃÆ!à ó Ã0>ÃpìÃЬ Ãðú ÀõðíÃP€ð‚à d#Ã`ô%à7 ðjÀÃ0ßÃPÃPå!ÃÀ ÃpcÃÀ àCÃ( Ã`³Ã0,Ã0‹#ÃàV ðÕ!Ã¥ ÃÀ©ðpÙÃ0,ÃÀ Ã4ÃpcàÞà Ã$ðÃ$à ˆÃ0©à ÃÀ¯ðóÃ0‘"Ã$àÀÃ÷ÃÐÊÃ`‰"ú#Ã`*Ã@ÜÃPýàÆÃ¥ÃpWÃ`!ðáÀéÃàÙÃPh!ÃÐ)!ð^ Ã`¡Ã08Ãp]ÃPÃpàÃ0©Ã`0ÀûÃ:ÃPë à p!Ã@¾!ðjà7 Ãþ"Ã0!ÃàßÃÀÃ0©à ó Ãðú ðvàÒÃ`§à ó ÃP Ã` Ã4ÃÃ`Ã0&Ã( Ãpª#Ãðô!Àf ÃðƒÀÃ¥ÃÐÄÃÐÄÃ( Ã=#Ã"!Ã0£ÃpÂÃPß"Ã@G ÃиÃð‰ÃàëÃÀ,àUÃ`à ÃðƒÃ0 ÃðÀ~Ã0£Ã@ÃàëÃÀ‹Ã¥ ÃpÚÃ`§Ã@ÖÃ@ñà ÿÃ4ÃpÈÃоÙÃð Ãðô!ðóÃ"ÃêÃðú ÃP\#Ã4ÃÀ£ÃXÃp9!Ã@G à ˆÃðÃàÙÃðƒÃ.Ãð•ËðvÃ@kàÆà #Ã`¿Ã`ËÃà’ÃÀrÃp¼ ÃàhÃ0 ð½%Ã@/$Ã(ÃP Ã4ÀûðÃÀ2à ˆÃ`0ÃpÂÃÐ5Ã08ÃÀ¯ð ÃüÃP ÃP’Ã@YÃÐÐÃpàÃ@úÃ08ðíÃÐ5Ã08ßÀ–à  Ã`³ÃàðjÃ"ÃöÀð^ ÃPýÃP¤Ãð0À–Ã0©ÃÒÃð‰àOÃÀ8ÃpcÃêÃÕÃð*àäÃ@eà í!ÃpÂÃðÃ0>ÃêÃPtà´ Ã0µà !Ã@²#ÃàÙÃ4ÃàåÃPtÃ[Ã`!ëÃ@âÃPzÃ@Ä ÃÐ5ÃànÃ0µÃÃ`6Ã`!Ã0&Ã@îÃ0PÃ`NÃàëÀõÃÀàOÃð‰ÃÐ)!ÃÐ#"ð^ à ó ÃÀÃPŒà ”ÃàëÃ[ÃàÙàOßÃ`¡ðjÃp°"ÃàÍ!ÃÀÃ0,ÃàñÓàÒÃà»$à1!ð|Ã`0Ã`BÃàtÀõÃð$ÀÃ@eÃpÎÃ`$Ã4Ãðw!ÃàåÃ@MÃ0¯ÃÃà ó ÃÐ#"ÃоàºÇ!ÓÃ`§Ã`<Ã`ÅÃPà |ÃpEÃ`0ðíÃð§÷Ãgà |à ”Ãð‰ÃÀ ÃüÀ„Ã0Áà ˆÃ@èÃиÃðú Ã0"ðdÃвà ÃP’ÃUÃðô!ÀZ"ÀéÃ`$Ãà÷à®!ÃPŒÃÀ8àÒàÀÀàÞÃànÃÀ‘ÃоÃpÔÃaÃð›ÃgÃöà ”ÃÕà ‚Ã0¯ÃpQÃ@ÀxÃ`­Ãà÷ÃÐ5ÃñÃàP!ÃÐ/ ÀÃêÃÃ@5#Ãð} ÃðÃÃðÃöÃPýÀÃ0JÃØÃÐ;ÃðÃðÃÐ5À~ÃÐÄÀ„ÃÐÐÃP†Ã0µÃ`¡ÃpWÃ0Pà à à Ãà\Ã0Ùà Ã°Û ÃŸÃRà=ÃÀ‹ÃÀ&ÃÃÃÐâÃ@âÓÃ[ÀrÃ.Ã@kà ÿÃ`§Ã@ÜàäÃ"Ã`• à |àÒÃоà Ã@ÐÃÀ‘ÃêðÃ@ÜàÒÀŠÃÐ#"ÃàßÃ`‰"àÌÀÃPtÃàåÃÐÐÃ08Ãp¶!à ‚ÃÀ!ðjÀàäÃüÃ`¹à ”ðdÃ0"Ã0&Ã…ÃpìàIÃÐ#"Ã°Û ÃpQÃpÂÃPÃÉÃpcÃ@èÃà’ðˆÃPà v à ‚Ã@Ã`!Ã@MàÀÃ@Sà v ÃUÃÀ—ÃÀ¯Ã`¿à |Ã0,ÃÀ!ÃàÓ Ã@eñà ŽÃ0¯àºà |Ã@Ã@âÃ`‰"ðáÃp9!ÃP€Ã@SÃPÃÌ ÃO ÃÐYÃ0µÃð$à Žà7 ÃpEÃ0"ÃðÃ02ÃÀ‹ÃЬ à |ÃpÔàIÃиÃP÷ÃP÷Ãpààaà ”ÃsàÆÃÃ.ðíÃÀ‘Ãðà+"Ã`0Ã`$à ÃÌ ÃðÃP Ã`<Ã0&Ã@MàÆàIßÃÐMÃ@âÃÀ©ÃpÈÃàbÃÀÃðú à |Ã`¡Ãð} à j"ÃP÷ÃpiÀà šÀÃ0ÓÃXàgÃ@îÃRÃ[Ã`›ÃÀ—ÃÀÃ08Ã( Ã@YððÃð•Ã0>ÃP†Ã( ÃЬ ÃØð‚Ã@kÃà†Ã0Íð”ÀïÃ0&Ã@qà ¦àIðÉ#ß!Ã@Üà ÃPÓ$à ÿÃO Ã@qÃ`¿ðvÀ`!Ã08Ã@wàðàäÃиÃpÂÃÀ—ÃÐÐÃÐÊÃöà ÃP€Ã@qÃÀÃ@YÃ¥ÃÒÃðè#àIÃ0ÁÃ@ÃpÂÃpÚýÃmÃ0‘"Ãð‰ð‚Ã@ôÃð§ÃPà ”Ã08Ã@ÐÃиÃØÃPŒÃ0ÙÃ0VëÃpQÃàhðà )ÃP˜Ã"ð|Ã0ÓÃ0VÃððpÃÐSÃоÃð Ã08ÃpÚÃ0¯à à ÃÐâÀÃÐÄÃðà Ã@èÃ@Ü÷Ãp]ÃüÃP’Ã`¡ÃÐÄÃpÚÃÐÜÃð›Ã`­ÃàzÃ0>ÃÀ‹ÃÒàÌà ÃRÃðÃ`*ÃPÃ#ÃP\#÷Ã.ÃðÃ0µÃÐGÃPà ”Ã`§à[ÃP'Ã@qà ;ÃpiÃàhÃpàÃpæÃð*ÃpàÃ¥Ã0—!à+"Ã`¡à ”ÃPb"Ã0&Ãà˜ÃÐYÃyð|ÃP ÃpÎÀf ðÕ!ÃÐ;Ã@ÜÀïð‚Ã02Ã`›ðçÃð¡Ã0¯ÃàtÃ0µÃØÃpÈñÃ@îÃÐÄÃðÃÀ,ÃÒÃ@YÃ0DÃPŒà ˆÃÞÃànÃäÃ(ðóÃ@kÃP¤ÃpæÀÃð à®!ÃððóÃÀ‹Ã0»ðˆÃpæÃöÃgÃð¡ÙÃ` "ðX!ÃÀÀàÌàUðùÃàhÃP€àÆðíÃ(ñÃ`§Ãm÷ÃÀ,àºÃp3"ÃÃð*ðjÃÀ—Ã`¹Ã0>ÃñÃð§Ãp]ÀlßÃà\ÙÃPŒÃ[ÃàåÃpWÃPÃ08ÃÀ,ÃÐÖÃà€ñÃÀ‘à àÆÃðÀûÃÞÃÐ)!ÃÐGÃP¼Ãð­àUÃ0PÀf ÃàÓ Ãð0ÃÃ@•àêÃÀ¯Ãð*Ãð$À ÃFÃÏÃPžð”Ãð›Ãp]ÃÐÊàÒÃÐÖÃ`$Ù"Ã0µÀÃ@_ÃP’àÌÃÐMÃpÔÃ`0ÀàaÃ`0Ã@îÃ0ßÀœð‚ÃÐ_Ã@wðáà v Ã4ÃP€Ã@YÃ@ÜÃÀ ÃÃÐÊÃ4ÃàßÃÐ;ÃpWÃ0ÇÃ`HàÞÀÃ08Ãð¡Ã0ßÃÐÜÃ0JðˆÃ@ÃpÎÃ@Ã`6ÃPŒÃàýà ÃP’Ã…Ãà ðˆÃpKðÃ08ßàÞÃ@}ÃÃÃàÃ`HÃ`Åà )À ð‚Ã@àØÃ`BÃà÷ÀÃ@qÃ@_Ã"ÃÐâÃ0JÃ0Çà ˆÃÃà ¬à ¬ÃÕÃpcÃ@eÃP°ÃÃà ÃäÃàtà ¦ýÃÀ2Ãpcà šÃðÃ0JÃÀ&ÃàñàÒÃyÃ`×Ã@à  àºÃ`*ðˆÃP†Ã@ôðÿÃ0ÇÃ0ÁÃmÃ@ôÃ4Ã.ÃàtàêÃpìàÌÃð‰ðˆÃ0>Ã0Çà ŽÃà÷Ãà†à ¬ÃpWÃð­ÃLÃP˜àmÃP’Ãà’ÃÏÃFÃ0VÃ@ Ãð0ÃðÃðÃ0ÓÃ0ÍÃ`¿Ã0>ÃàŒÃðð¦ÃÐúÃP!ÃP’ðÃÀ>Ã"à )àØÃ@_ðàyÃÃpQà |ÃyÃpðˆÃ:à ¦ÃÐeÃP°ÃðÃðÃÀÃ@_à[Ã0ÍÃàtàÆÃðÃ0ÁàöÃ0åÃÀ»ÃùÃ:ðÿÃÐAÃð à #ÃüÃàtÃ`­ÃÀ¯àäÃP’ÃpÔÀŠÃÛÃXÃ`ÑàaàgÃ@îÃ@wÃÀDÃàªÃáÃpoÃð¿À¢à šÃ0>Ã.à ÃpþÃ`HÃ`6ÃàñÃÐÄÃ@kÃ`*àÒÃàbÃÀ ðšÃ@âÃ0&Ã0#àÌà[ÃpìÃÐAÃÀ»Ã`fÃ0hðpÃ`›ÃàßÃpWÃpàÃÀ2àðÃÀµÃpc÷ÃÀ»ð”ÃÐkÃàbÃ0PàyÃ0\Ã`fÃà’Ãà’à[ÃðŽÃP°ÃàýÃÐMð‚ÀÃ@úàðà ”ÃÐÊÃÐ_Ãð­ÀÃàŒÃð­ÃÐqÃP'À–Ãð•ÃàIÃp-#ÃðÃà†ÃÐMÃÐîðÿÃP'à ÃàýÃ@À ÃRÃð0ÑÃÕÃP˜ÃP’ÃPŒÃmÃ0ÍÃ@Ã`ÅàyÃÏÃÐG÷Ãð›Ãð6ÃpìÀ–à[ÃàýàgÃ@Ãà€ÀÃ0ÁàyÃÉÃð›ÃÀ!à ”Ãð§Ã@qÃÐèà ¦ýëÃ@ú÷à ÃÐGà ¬ðÃ`ÝÃÃëÃ`HðÃ@wÀ¨ÃÃ`*ÃÞðvÃpÚÃ0ÇÃP˜ðáÃàý×ÃÕà àØÃ`¿÷Ã@úÃ@Ã`<àÌà ˆÃ`6ÃÐâÃ0µÃPžÀ ÀÃÀ… ÃðÃ0JðšÃÕð”àÌðˆýÃ`ËÃ0ÇÃÐSÃÃpuÀxÃP€Ã`¹ÃÏÃÐÐÃàhÃ@ÃPžÃ0ÁÃ@ÃÐôÃ@ƒÃð6ÀûÃ0ÍÃ@qÃ0»ÃP-ÃÐôÃàŒÃ`ËÃ0>ÃàëÃ@ÃÀ8ÃÐkÃà˜Ãð$ÃPžÃà†ÃÀÃ`0à Ã`ZÃ0ýÃP¶ðíà[ÃpòÃàýÀÃpæÀà šÃ@ð ÃXÃ@ÃpcÀœÃÀÁÃà°Ã—Ãð6ÃP’ðšÃ0bÃàÃÀÃ0ÁÃPÃÀ»Ã@ ÃàýÃ`<ð”ðÃÀ8Ã@úÃàžÃðBÃà’àmà[ÃüÃð$ÃP Ã`ÑàöÃÀà šÃ0ÍÃRÃ@wÃð0ÃPýà ÃsÃð$àaÃÐ_àaÃ0PðÿÃ@ÃÃ@_À„ÃÃÕÃXÃÉÃ`<ÃÀ&ÃLà )ÃsÃ(Ãð¹Ã@$ÃPªà ÃàýÃÐkà Ã@èà  Ã@ÃÀÁ÷ÃpòÃáÃàŒðdà ÃÛàyÃP-ÃyÃ`BÀŠÃpàÃÐÊÃ@A!ÃàhÃàÃàŒÃ^Àºà‘ÃÀÙÃÛÃFÀŠÃ@wýÃ0ñÃÕÃjàmÃ.ÃðÅð¬ÃÐkÃð$ÃÐMð Ã0VÃÐÄÃØÃ@îÃP!Ã0ÍÃ08ÃÐÜÃÐâà ²ð¬Ãpþð ÃÐàêðÿËÃð­à ¸ððˆÃð*àÌÃð³ÃPªÃ`*ÃÀ‘ÃðÃ`ËÃp{à ÃpcÀ ÃíÃàäðÿÀ+Ãð¿Ã`¿Ã:ðŽà Ã0DÃàÃ`Hà  ðÃà˜ÃÀÁÃP†ÃpQÃðÃà ÃP’àUÃ@qÃÀ¯Ãà†ÀŠÃ@úàüÃ:ÃP¤à ¦Ãp]ÃsÃ`6Ãð ÃP˜Ãp™Ã0zýÃ0¯ÃÀ ÃÛÃP¤Ã@wÃÀµÃ|àäð‚ÀxÃpQÃ`6Ãà€ÃPà AÃÐÜÃaÃÐMÃÐâÃð<àUà ”ÃÕð Ãð6ÃÏÃð0ÃpÀ–Ã.à  ÃÏÃ`fÃ0ÓÃÃ4à[Ã0ÍÃ0Và ¬Ã@àaÃPžÃ@âÃà€ÃÐYÃ`¿ÃÛÃpìÃ0¯Ã"Ãà ÿÃÃ@kÃÀ2ÃÀ£Ãð0Ãà˜Ã@•Ã`×ÃyÃPÃ0ÙÃ@kðùÃ`¹àOÃ@qÃð*àsÃ@ƒàêÃ`<àÀºÃP'àäàsÃàÃ@ÃàŒÃ0ÓÃ0ÓÃyðÀ~à |à ÃsÀ+Ã`NýÃ`$ÃÉÃ`HÃ"Ã@ÃpÃP¼ðÃÀ©Ã`›ÃmÃPÃð›ÃÀ£Ã0©ÃpQ÷ÀœÃÃÃÀ©Ã@}ÃP'÷ÃpæÃpWÃ¥Ã0»ÃðÃÐÜÃ`fÃÏÃ0>Ã`HÃpiýà…Ã0åðšÃð<Ãà ¦Ã"Ã@ôÃ…ÃÐÊÃP’ÃPžÃ:ÃÐ_ÀŠÃÕÃÏàÒÃPð‚Ã`­Ã`ËÃÐwÃpuÃð³ÃàtðpÀðšàêÀœà ;ÃÐÐÃPžÃ@ Ã0hÃÛÃàŒàgð”ðùà ùÃÀÍð)Ã0nÃ`õà‹à ¸ÃÐAÃäàaÃÐôà‘ÃÀPÃ0\Ãð*Ã0VÃ0ñàmð”Ã0\ÃÀbÃÀVÃÀ>ÀÃÀ,ð‚ÃÃçàgà ¾Ãpoà /ÃàÃ`¹ðˆàêàäÃÐÐÃ`HàmÃP-ÃRà ðóÃÐSÃà†Ã0ÍàÃÐ}ÃáÃ@úÃPžÃàtÃ0DàêÃÐÃÐÜÃÐSÃð¡ÃÀ,Ãpæð”ÃÏÃÐGÃÃÐYÀðÀ+Ã`ZàöÃáÃÀ©ÃpoÀŠÃpuÃjÃ0ÙÃ``Ãð¿Ãð§ð Ã:ð¬Ã—ÃÐYÃöÃ@ ÃXÃðÅÃð$Ã`¹à ;à )ÃpøÃP-ÑÃ@úÀ¢Ã0ÙàêÃ``ÃáÃ2Ã`TÃÏÀ´ÃPÂÃð<àgÃð§ÃàýÃpcÃÀ>ÃÃÐÜÃÐGÃ@îðÃ0tÃð6ÃP˜ÃP˜ÃàÃÉÃ`ÅÃà’ÀÃpìÃpÃà€À–Ãð*à /ÃpþÃà’Ã¥ÃpcÃð$ýÃ¥ðˆàÒà àsàyðÃ@úàäÃÀ,ÃÐ_ÃáÃ@ÀÃpþÃ@úà šÃÐSÃ02ÃsÀ7ÃЃÃàŒÃ@wÃ0ÇÃÕÃdàsÃPÃP¶ÃP'ÃPŒÃPÃà€Ã`ËðŽðÀ+ÃRÃ0PÃÐèÃð6àmÃp{ÃРËðšÃ…ÃÐMÃð¡Ãð$Ã`¿ðšÃÐSÃà #ÃpÃPKà /Ã`ËÃÏà ¦ÃÐkÃ`BÃP!ÃðBÃà¤Ãà¤Ã0ÍÃ@ôÃ@Ü÷àaÃpuðŽÃ@úÃÀÇÃRÃð0ÃäÃà¤ð¬à ¦Ã@âà /à ¸Ã@wÃðBððpðŽÃÀÇÃÛÃpà ¾ÃðÅðšÃPžðÃ0ÙÃüÃð0Ã@qÃPžÃ0bÃàÃð0àÒÃÉÃ@Mà7 ðíÃ0JÃP˜Ã@ÃàÃ0VÃÀ¯À Ã0ÇÃFà )àað Àà )ÃÐ#ÃPýÃ`HÃàýÃ0bÃpÃP¼Ã`TàüÃð­ÃmÃ0»ÃðÅàgÃðÃP ÃÀ¯ÃÐÖÃPŒÃ4Ã@À„ÃÐÜÃà†ÃÐkÃ0DÃöð ð|Ã"Ã@ôðíÀÃyÃ`<÷Ãà€ÂÃÐúÃð$ÃFÃ0Ó÷Ãð$Ã@‰Ã`*ÃpcÃ@ÃÀ,ÃÀ‘Ã0ÁÃPžÃÐYðÃÀ¯àÒÃ`6Ãíà ¬ðÃÀ¯à ÃP-Ã`ËÃyÃÃÃðÃ@ƒÃÀÁÃÏÃP÷Ã`*Ã`¿ÃàðˆÃ0PàØÃp]ÃÀ,Ãà÷ëÃPŒð”à /àÞÃdÃð­àmðýÃ`ÑýÃXÃíà ð|Ã@kýÃà†Ãð¡Ãð³Ã@Ãà’ÃàzàCÃpòÃÕÃPŒÃpÚÃRàOðÿÃàýà ¦à /Ãð­Ãà’Ãð*ÃÐÄÃÃÃàzÃ@Ã@_ÃpKðŽÃà€ðáÃpÈÃPÃÀ»Ã0µÃpòÀÃÀÃÃÃ`­àäÙà ÃP ÃàbÃ`<à ¦ÃaÃ¥ÃP’Ã`³ÃàÃ`ÅÃpcÀ„Ã`›ÀŠÃÃÃ@ÃÐeÃ…ð ßÃÐ#"ÃÃÀ—à ùÀïÃpWÃ0©ÃàV ÃÀà )ÃP°ÃPÃÐGÃPzÃP˜Ã0,ÃÀy"ðçðvÃÐÖÃÃà€ÃP Ã`*ÃÞÃ4à ”Ã4Ãð$ÃÐÖÃànÃ@YÃP ÃP˜Ã0DÀrÃ0£Ã0µÃ`ÃàbÃ4Ã@âàÌÃàåÃðú ð^ ÃàåÃÃÀ—ðóÃоðáÃÀ—ÃÀ‹ÃÐ;à=Ã@YÃ`!ÃpKà ÿÃÀ‘àäÃÀ à ÃðÃ0 Ã@îÃPtðŽÃ@îÃЬ Ãp9!ÃÐ5ÃpÔÃðè#Ã0ÍÃàbÃ0 ÃpKÀûà ÃÀð#ÃÐMÃÐMÙÃÐ5ðçÃ`$ÃpÚðíà ‚ÃÃÃànÃÀÃàP!Ãðw!Ã[ÃÐÖÃ0Çà /Ã0ÇÃÉÃÀ—ðdÃ¥ÃPë à ÃP†Ã@A!ðçñÃÀ—Ãð¹ÃüÀ+Ãð¡ÃPÃÐâÀ„Ãà÷ÃÀ&Ã` Ã0&Ã`!ÃðƒÃ°Û Ã0>ÃpiÃaÃpEðóÃà€ÃÞÇ!ÃðÃÐÄÃÀÃ`¡ÃP’Ã@èÃàðÿÃÐÄÃàtÃPýÃðú Ã¥ ÷À„ÃÀ£ÃàýÃÐAÃð‰Ã0£Ã0©ÃÀ ÃÐÐàÞÃFÃð ÃPn ðçÃÐŽ%ëÃð*Ã°Û ÃЦ!Ã@ÐðùÃgðóàÌÃ@G Ã"Ã"ÃÃðà¢#à=ÃP€àØÃ`§Ãðî"à´ Ãð•ÃðÃPzÃ`<ÃàbÃPÃ@à ÃàÙÃ¥Ã`<ÃÀ8Ãà€Ã`¡ÃÀö"ÃðÃÀÃÐSàØÃPzÃàÇ"Ã`ô%ð:&Ãp9!ÃÀÃànÃàbÃðw!ÃO ÃР"Ã`• Ã02Ã0&Ã`­àÌÃP’ÃànÃ`$Ãp°"Ã"Ã` "Ã@A!Ãð} ÃPß"ÃÀê$ÃàßÃÃ`!ÃЦ!Ã"!Ãp9!ÀxÃP àOÃ0»ðˆÃ0!ÃàÇ"à j"ÃÀ‘Ã(Ãp¼ ÃÀ‹÷ÃPë Ã` ÃP÷ÃÐ;Ã0!ÃPß"Ãø#ÃàÍ!ð^ à p!ðÉ#à F(à F(à L'ÃÚ,àã-àé,ÃÎ*Ã`Y*Ã0O-À1Ã012ÃÐç+à ·*ð{0ÃpV1Ã5Ã-4ÃP…1Àq3Ãðˆ3Ã5ð]5ÃàÞ3Ãpb/ðo2ÃÐ:3à “0ÃpV1ÃpP2àB3à i7Ãð0Ã012ü1ÃP£,Ã`/1Ãðÿ4àË1ði3à 3ÃàØ4ðø0Ã-0Þ2ÃpP2Ãàê1ÃÝ2ÃN5ö.à ".Ãð5,Àƒ0Ã`/1àé,Ã0O-Ã@ó-Ãð1Ã@@6ÃP‘/Ãà-ð-Ã`Ö*Àú1Ãз3Ãàð0ÃW)à .,ÃÀ%0à`.Ã@+Àú1Ãàm1Ãà.ÃÈ+Ãpë-ÃÐX.Ãð”1Ã`¸/à /Ãð4àZ/ÃP‘/Ãà…-Ã?-Ã`;/ÃÐá,ÃÀ+/Ã0Æ.Ã0Æ.ÃÈ+ð()Ãpt,Ã0À/Ãð/-ð«(ÃÀI*ð+ÃÀÀ+ÃÀ=,ÃÐÛ-à×/ÃK/Ãp\0ÃÀ¢0à ¥-ð“,À›,ð™+À.Ã@+ð()ð.(ÃðA*ü-Ãpn-Ã92ÃP0ÃÚ,Ãx.ÃðÐ'Ã`â(Ã@ç/À.àû)Ã@Ž)ÃQ*ð™+Ã@v-À0ÃÔ-ÃÀI*ÃÀI*Ã@p.Ã`Ê,ÃP£,à (-Ã@‚+Ã%'ÃÀO)ÃðA*Ã`_)à(ð“,Àw2ÃÀ3ÃP/Ãpý*Ãæ*Ê+ð.(Ãà&(Ã@ &À¿&à Õ%àx*ð+ÃP8)Ã@)à Ã(Ãì)à ½)Ãð²,ÃÀ1.Ã0[+ÃðS'Ãø'à ·*Ãà )Ãà¯&à :*Ã`A.Ã@ˆ*ÃP,+ÃЈ&ÃðÖ&à&è&Ãpý*Ã@ù,ÃPD'ÃðÜ%ú#ÃPV$Ã0%ÃðÐ'À­)ÃðÖ&Ã@‚+Ã0ö&Ü(ÃpŒ(ð"*Ãp÷+ÃÀO)ÃPV$Ãø'Ã`â(Ãp€*ð:&Ã`w%ÃÈ+Ã0Æ.Ãp’'Ã`ƒ#ÃðÖ&àõ*ÃP,+ÃðA*ÃàÁ#ÃP\#Ãà¯&Ã@|,ð™+ÃЂ'Ãæ&Ãc'Ã(Ã`_)ð½%Ãðî"Ã%'Ã`è'Ãp¤$Ãpª#ÀB&ÃP8)ÃðM(Ã@5#Ã1%à ^$à É'Ã7$ÃàÍ!Ãðe$à Ï&Ã0Þ*à Ï&à R&à %Ãp'à Ï&ÃPÍ%ÃðÜ%Ã` "Ã@5#Ã`q&Ãðe$Ãp¤$Ç!ô$Ã$Ãì%Ãæ&Ãðè#à ^$Ã`• ÃPå!Ãc'ÃÐ#"Ãðw!Ã@5#Ã@#&ÃÐ)!ðL#ÃPÙ#Ãi&Ã`w%ð½%ÃðY&ú#à%ÃPÍ%ÃàD#à¢#Ã0#Ãà»$ÃPV$Ã`ƒ#Ãðe$ðF$ÓÃ¥ ÃÀm$à j"ÃÀm$ÃàÁ#à ÃÐ#ÃPÓ$ÃÀy"ñÃоÃp3"Ãà'ÀÝ!à |Ãþ"Ó#ÃÆ!Ã@'ÀÝ!ÃÐ5ÃÐ)!ÃÒà+"Ã@A!Ãp3"Ã@²#ÃPå!à+"Ã{#ðL#Ã0%à¢#à ÃЬ Ão%à Û$ÃðÜ%à&ÀZ"ÃК#ð4'ÃÀg%ë̯̼#à–%à%Ãò$à à í!ÃÀ!Ã0‹#Ã&Ã@5#Ã0 Ãðâ$Ãp&ÃÐ|(Ãpž%Ã0%ðF$à1!ÃPJ&à$à ó Ç%À<'à F(Ãp!%Ã{'Ã@(Ã`w%à Ï&ÃК#Ã`‰"Ã{'ÃЂ'Ã`ô%ÀÅ%Ãà¯&à–%ÀH%Ãà2&ÃK+ÃPÙ#à í!Ãà¯&à É'à¢#Ã{'ð.(Ã0y&Ã*à L'ÃÐÿ'Ãà—*Ã`â(Ãðe$Ã0%Ãpn-À.à @)à&à @)Ãpž%à j"à á#ÃÀä%Ã0Þ*Ã0Þ*ð()ÃÀO)Ã`_)à Ï&Ãàµ%ÃÀÌ)à ½)ÃÀØ'ÃЬ à%ÃPÁ'Ãø'à ·*ÃÐÿ'ÃàÁ#Ã@(Ãò(Ãæ&ÃÐ%Ã0%Ã0m(Ã+&Ãð¾*ÃÐ|(Ã7$Ã@)%Ãi&Ãø'Ã`è'à 4+Ãà*Ãi&Ãð_%Ãà,'ÃÀC+Ãc+ÃðÐ'Ãp!%Ãà8%ÃÐp*Ü(Ãp€*Ãà)à ½)Ã@)àŠ'Ãì%Ãà>$Ãp˜&Ãà)Ã*ÃðÜ%ÀH%Ãà©'ÃðÜ%Ãp'Ãp*ð+à(ÃPÓ$ÃPÍ%À¹'Ãð¾*ÃÐ$Ã`$ÃPÇ&Ãì)ÀÑ#Ãàµ%Ãp&ÃðS'Ã`î&Ãðk#ÃÀO)Ã@ˆ*ÃðA*ÃÐ%Ã`k'Ãp(à X%Ãp )ÃÀm$à1!ÃÀö"Ãp†)Ã`k'ÃðÜ%Ãà2&ÃÀ"à R&ð«(Ã@ *Ã0Þ*ÃP»(ÃЂ'Ã`k'Ã`k'ð:&ÃЈ&Ã@ &ÃPÍ%Ã@”(ÃÀä%Ã`k'Ã)à Ã(Ãp'$Ã](Ã@ÿ+Ãû-ÃPÁ'Ã@#&Ã@¦%à Õ%Ãà©'Ãp€*Ãà+ð±'Ãp'è&Ãð_%ÃЂ'Ü(Ã0ä)Ãà£(ÃðY&ÃК#Ãì%Ã#à X%ÃÀy"Ãò$Ã`w%Ãà8%à É'à&ÃÀê$Ãðq"Ãpž%Ãpž%Ãu(ÃPP%à @)ÃðÐ'Ã`ô%Ãu$Ã0 Ãðe$Ã`î&Ãà¯&ÃðÊ(ð4'Ã@;"Ã`ƒ#ÃPJ&Ãàµ%ô$Ã0…$Ó#Ãpž%Ã@¬$Ãðî"ð:&Ãà2&Ã$ð½%Ãà2&Ã`î&à&Ã(ÃÀê$à ó Ã@5#ðÉ#Ãàµ%ð@%ÃÀm$Ãðq"ðR"Ãà,'à Õ%ð4'Ã`ô%Ã@²#Ã0!Ã{#à&ÃP\#à v Ã`$Ãðâ$Ãp’'ÃÀ àÆÃ`!ÃPh!ÃPë ÃPß"à ç"ÃК#ÃÀ!Ãðk#Ã` "ÃðG)Ã`$ÃàJ"Ãp9!ðX!Ã#Ã0%Ãì%à d#ÃÐ%ÀrðçÃPb"Ó#ÃPë ÃPú#Ãðú à ùÃÒÃþ"Ãò$À`!à+"ÃК#àœ$ÃÌ Ã`$Ã0‘"Ãð} Ã@A!à´ ðpÃ0!Ã0‹#à ÃÞÃpWÃ@ÊÃ@¾!ÃaÃPtÃPV$ÃÀÃ0 à ç"à$ÃàÇ"Ó#Ã`$Ãðú ÃК#ÃÐ/ ÃÐ &ðÃ$à ÿðÏ"ðpÃÕÃÐAÇ!ÃЦ!ÃPV$Ã0‹#ÀrÃ@Ä ÃP†ÃäÃ@MÃ@¸"ÀÑ#ðdà Ã`î&ëÃsà í!ÃÀy"Àlð½%Ã@5#ÃÀ… Ã0&Ã`!ÃÐ/ ß!Ãþ"ÃP\#Ãò$Ó#Ã` "ÃàÙÃÀ!ÃàßÃðƒÃ0 ÃÀ… ÃPP%Ã0 ÃÀ—Ã0¯ÃPh!ÃPÇ&ÃàÓ Ã`‰"ÃÐ5Ã0,ÃÐ/ ÃàåÃÐ5à ç"à®!à®!Ã0—!Ã`!ÃPñà ˆÃðô!ðR"Ã@âà[à ÿÃgÃêà àÌÃPn ÃÀÃà»$ð@%àºàºÃ`$Ãð ÃÒÃPtàOÃ¥ÃÐ$Ã@ÊÃàÓ Ã =à¨"ÀõÃð•ÃðƒÃÐ#"Ã:ðdà Ã[Ãp3"ÀN$ÃàP!ÃÀ‘ÃaÃPë Ãðî"Ãp? à7 Ã@G À`!ÃÀ‘à ”ÃÐMà Ã0Ç÷Ãà\ÃàP!ñðL#à p!Ã`§àÀÃ0,Ã0©ÃpEÃP€ÃpÈÃ°Û Ã"à+"ÃpÎÃÀÃpWÃ@ÖÃ4à´ ðÏ"ÃÀü!à d#à ‚àÒÃP Ã@âÀ„ÃPn ÃPn Ãð‰àOÃ@;"ÃÀÃ0¯ÃO ëëÃ`§Ã@G ÃpKÃÐGÀŠÃ4Ã@SÃPb"ÃPzðÀà ÿÃC"ÙàÀðáÃ@#&Ù"Ãp'$Ã`#ëÃÉÀÝ!ÃUÃ0ÁÃÐÐð|ÃPå!ÃÀ‹ÃP÷ÃÒÃO Ã@¾!Ã0 Ãð›Ã0»ÃðñÃàJ"ÃPV$à´ à ˆà=àºÀÝ!à+"ÃÀy"ÃÀü!à®!ÃК#ÃÆ!Ã0©ÙÀlÃÃ(àÌÀ~Ã@Ðà ”Ãp]ÃÀ&Ã"Ã0 Ãp3"ÃØÃàtÃàÓ Ã`$ð|Ã`³Ã@qà /ÃPýÃ` ÃP÷Ã0©Ã0,ÃpQàOÃÒÃ°Û Ãà÷ÃÃpEÃÀ Ã@G Ã0>ÃàV Ã0—!ÀéÃ`›ÃpiÃÀ… Ãðô!Ã`ÃÀ‘Ãp? Ãà\à p!Ã@MÃ@YÃðÃÀ Ã0!ÓÃÐ;ÃÀ—Ã"Ã`ð‚Ã@ÃàhÃò$Ã°Û Ã Ãð ÃêÃðÃ02ÃоÃaà ˆÃðÃÐ/ ÃÀö"ÃPñÃPñÃðî"Ã@¾!ß!ÃÀ£Ã0VÃ`6Ã"Ã0,Ãð¡Ã`¹ÃÐGÃaðáà ÷Ã`§Ãàtà ˆÃPÀõÃ@ÖÃ@eÃ"ÃиÃpÎà ÀõàOÃ`³ÃP'ÃP!ÃP¤ÃyÃàhÃ`¡Ã`6ÃÐ5ÃPb"ÃPtÀðóÃP€Ãð•ÃÀ©ÃÀ Ã0µàÆÃÐMÃPÃgÙÃ¥ÃpààaÃÀÃðÃpæñÃ`³à$Ã$Ãà\ÃPzÀrÃ0©ÃàåÃUÀõðçÃ`¹ÃPzÃaÃ0ÇÃêßÃÀ©ÃÀÃàV à ÃLÃ`ÅÃ`*ÃPðÃÐGÃ@ÜÃиÃ@îÃ@úÃð‰ÃPtÃsà ‚Ã`¡ÃðƒÃÀö"Ãp? à á#ÃÐ#à v Ã`³ÃÐÖÃpWÃPÃànÃ0&Ãð Ã0¯Ã@YÃÀ—ÃÐÊÃØÃ0£ÃpEÃ@Ö÷ýÃÐÐÀrð|ÃàñÃ`HÃLÃ@úÀ–Ãp¶!ÃÀÃÀ£à ðÿÃ0»Ã`³ÃànÃüëÃÐeÃÀ»À÷ÃpààÆÀxÃ@âðÿñÃÐAÃÀ©ÃyÃ`Tð)Ã0ÍðóÃ@_ÃвÃÐAñÃР"à$ÃàÍ!ÃðÃÀ‹Ã`#Ã`!ÃиÃ{#Ãp’'ÃðS'Ãþ"Ã@ÊÃÐ#"Ãàbî%ÃðY&à Û$à Ã4Ã=#Ã@¬$ÃД$ÃÐ'Ã`ô%Ã{'ÃÀØ'ÃPë ÃàJ"à Ï&Ã`q&À6(ÃPV$Ãðî"à7 à+"ÃÐ#"Ã@ÃÐ;ÃÐ#ðÏ"â'î%Ãpª#ðÃ$ÃЂ'ðF$ÃpàÃÀ‘Ã` Ã` "Ã$Ãðq"ÃàJ"àœ$ÃPÇ&Ãi&ÃÀy"ðL#à d#à Ï&à Õ%à–%Ã0y&à$ÃP\#à !à%#Ãð_%Ãp&ÃðÖ&Ãp&ÃÀð#ÃI!Ãp¶!àŠ'Ã`q&ð±'Ã0g)Ã&ÀÑ#ÃÀ"Ã0‹#Ã0%Ã=#ÃÀg%ÃðM(ÃÀä%Ã@'à d#ÃPb"ðÕ!ÃÆ!ÀB&Ãpž%Ã](ÃP»(Ãþ"ÃЈ&Ã`$Ã`!Ã@;"à¨"Ã0s'ÃPÇ&ÀH%ÃPJ&Ã@'ðÃ$ÃUÃð ú#ÃðÖ&Ãà£(ðF$Ã`w%ÃðM(Ã@(Ãàµ%ÃÒÃК#ÃPÍ%ÃЂ'ÃÀm$Ãp(Ã@/$ðÃ$Ãþ"ÃÀä%Ãàµ%Ã¥ Ã0‹#ÃðA*àû)Ãu(à X%Ãp-#ÃPh!ÃPå!ÃÆ!ðÃ$ÃPå!ÃÐ/ à ÃР"Ãp-#Ã=#à¢#Ãà)À6(À`!ÃÐ/ Ãp-#Ã`#ÃàJ"à Û$Ãþ"Ã@5#àœ$À×"ÃPzÃ°Û Ãpª#Ã0‘"ÃPÓ$Ãø'Ãà8%à d#Ã`â(Ã`k'Ã@)%Ã`ƒ#Ãðw!Ãðk#ÃàÁ#Ã$Ã0#ÃPJ&ÃÀ"ÃÐ)!Ã0ê(Ãp!%ÃPñà=ÃÀy"ÃPÙ#ÃàßÃPÁ'ÃР"Ç!ÃÐÿ'Ã$ÀlÃàÇ"à¢#ÃÀa&Ãðk#ÀÝ!Ã@;"Ã`ú$ÃPÓ$ÃPb"Ãp3"Ãà»$à p!Ãp3"Ãp-#ÃÀä%Ã0y&ÃÀm$ÃÀa&Ã0%ÃÀs#ÃÀs#ÃÀð#ÃI!ÃÐ/ Ã"!Óß!Àã ðáÃ@¾!Ã"ú#ðF$à í!Ã0,ÃвÀf ðR"à+"ÃàÇ"ÃàÁ#Ã0#Ãðk#ðÏ"à ‚Ãð Ã0£ÃÀö"Ãð Ãðî"à1!ÃC"Ã`#ðX!ÃpWßÃ"Ã`$ÃÐ#ÃP÷ÃPå!ß!à šÃpEýÃÏÃðÃ`›ÀlÃ¥ à%#ÃàÓ ÃàÍ!Ã@Ãp3"Ãðk#à´ Ãà©'Ã`ú$ÃÐ &ÃвÓÃàÍ!Ãþ"ðáðvðáÃPë Ãp&à%#Ãpª#Ãð ÃÀ‘ÀÅ%ÃÀa&ÃPP%Ã0&Ã0#à ç"ÃÀ‹ÃàJ"Ã0£àIÃ0&Ãþ"ðÕ!Ã.ú#Àã ÃpÈà à=Ãð‰à Ã[ÃPÃÒà ÃàJ"à d#Ãðô!Ãð} Ã0¯ÃÃmÃðÃO à$ÃUÃÐ5à šðvÃàåÃ@YÃpÂðjÃO ÃàÍ!ñÃð Ã08ÃàÃ"!ÃÌ ÃPë ÃPb"Ã` ÃP÷ÃÌ Ã¥ÃЬ ÃO à=Ãð›ÃÐGÃÐAàIÃpàÃÐMÃ4ÃC"à7 ðjÃ@YÃЬ Ã@MÃ(ñà Ã@'Ã@ÊàÒÃðÃ@úàIÃÃpEà ˆÃð¡ÃÛÃÐ;Ã@_Ã`<ÃpÔÃpÔÃÌ Ã°^ Ã@G ÃP†ÃàV Ã"!Ã°Û ÃÃ`›Ã`!à¢#Ãð›Ã@ƒÃFÃpÈÃ[ÃPzà ÃàP!Àà ”ÃpKÃÀ à |ÃÀ£ðÿ÷ÀŠÃÐMýÃð›ÃPÃÀ&ÃÃоÃÐÊÀÃЦ!Ãðq"ÃPtÃ0µÃ0¯ÃðàÌÃÀ Ã[àCðX!Ã`§ÀxÃsñÃ`$ÃsñÃ@¸"ÃðÃÐÄÃоÃðàCÃ{'à–%ÃÒÃàßÃ¥Ã0,à |ÃÀ‘ÃÀðáà !àÀÃpÎÃðú Ã`• ðjÃ0£À`!à ÃàýÃàhà  Ó#Ã0£ÃäÃ@_Ã`³ÃpKà ”ÃsÃpàÙàCÃð•ÃÐÐà ‚ÃàÙÃÌ Ãp°"Ã@;"ÃðÃðÃLÃ`§ð|Ãðw!Ã0!Ã@Ä Ã@¾!ÃànÃ0JÃðÃC"ÃpÂÃðú ÃPn ÀrÃ4Ã@_à Žà ‚Ã0,ÃÐGÃàëÃð¡÷ÃO ÃÀ‘Ã@à ÃpÎÃ`*Ã4à Ã0 Ã@SÃÐGÃàåÃ[ÀõÃPn ÃÃP àÌÙ"ÃP àÞÃànÃÐAÃ`§Ãð ÃP àºÃàhÃ@YÃÀ… Ãà€ÃP˜ÃFàºÃ0ÇÃиÃI!ÃàtÃ`$ðdÃpEÃP Ãð à=ÃÐ5Ã@G Ã4ÙÃÀ‹Ãð›Ã0¯àCÃÐ)!ÃÆ!ÃP†Ãp9!ÃÀ—Ã@ÊÃpÚÃêàºà1!À¿&Ã=#Ãðô!à v ÀÃÀÃ@Ä ÃðÃÐGÓ#ýÃð¡Ã@âÃ@G ÃÀ ýà®!à´ à v ÃP÷à ÃpÎÃ`ÅÃÃÃpÚÃÀà ùÃþ"ÃPÓ$à v ð‚à ”Ã`$ÀZ"ðùÃÀ ÃPàCÃ@_àOÃÐSÀràCÃ0£Ã@ÜÃàzð^ Ãðe$Ãð à ŽÃPŒÃÐ5Ã`• ÃиÃ@YàCÃðú ÃpÎÃð›ÃиÃ08Ã{#ðÏ"Ã0©ÃàhÃpoð¦ÃðÃ`$Ãp]ÃÐ;ÃàbÃ@ÐÀf Ã0ÇÃyðpñÃ`0À`!Ãêà ÀàºÃ0©÷Ã@ôà  ÃàzÃÞÃÐÊð ÃaÃÐÊÃÀûÀ~Ãð ÃUÃ`$ÃüÃ:Ãð*àÆßÃ0 à ó ðÿÃP ÃpWÃpcÃöà ÃI!ÃÀ!à ðùÃgà v ÃàbÃð³Àà #àÒðíðóà ‚ÀõðvÃà Ã`Hà #ÃðÃ@qÃà†à[àäÃàÃÐÖÀÃpæÃàzÃ0 Àrà7 Ã@ÜàÌ÷ÃmÃðçÃ0!Ã`­ÃÐSàIÃÐSÀ–ÃpÎÀrÃ`6Ãð›à Ã08ÃðÃðÃ0µðùÃüñà ˆÃ¥Ã`ÅÃà€ÃÐ5ÃàhÃPŒÃ0Pà ÀûÃpÔÃàñðpÃP!Ã.ðùðvÃ0>Ã`<ÃPÀûÃàbÃ@ÃP Ã@kÀÃ0»Ãyà  ÃÀ2ÃP ÃPzàäÃ`ËÃ0,Ãð¡Ã@ëàOÃ@èðÿÃоÃÐÄà šÃP†Ã@MÃÞà ŽÃ0 ÃÃÞÀf ð|ëÃ02ÃP à ÃÐYÃ0µÃpQÃ¥ à ÿÃðà ÃÀ ÃðÃð•à ‚Ã`¹ÀÃLÃp]Àûà #ðùÃäÃ0DÃ02ÃàzÃ`0Ã0Dà à[Ã@èà ùàOÃäÃÀ£Ã"à ˆÃ@_Ã¥Ã`$Ã:Ãð§ÃüÃpòÃ@ÖàÞà šÃPh!ÃÐAðóÃÀ>Ã:Ã@wÃpòÃ@_Ã0µÃ"ÀïÃpÈÃÀ,àIÃgÃpæÃðÃPzÃàåÃÐMà ŽÀf ÃpcÃpEà ÃpcðvÃàhÃ`›ÃÞÃ@kàaà ˆÃPýÃàP!ÃpÔÃðú Ã08ÃðÃpÔÃ`0ÃÀÃ``àÞÃ0 ðvà À„ÃÐAÃ`ÃÃPžÀf à j"à #àüÃ@wÃðÃ@/$Ã0!ðdÃP˜Ãà ÃP°ÀÃàýÃ0JÃÃÃ4Ã@ÃÀDðóðÿÃÐSà ˆÃ Ãp? Ãð³ëÃÀ Ã@ÊÃÐGÃP’ÃÀ&Ã@ÖÃ`§ÃÐ/ Ã0&ÃÏà ÀxÃÀ‹ðÃ$ÃàV Ã`$ÃÐ/ Ã0!ÃàzÃàýÃ.Ã`ƒ#ÀlÃ08Ã0DÃÀ2Ã`­Ã( ÃÀ‹ÃpÂÃ`¡Ã08Ã0µà à ùÃÌ ÃÐ#"Ãpª#ÃÐ#"ÃÀÃ°Û Ã€Z"à ÃÀ‘ÃР"ÃК#Ù"ÀT#ÃUÃ°Û Ã v Ãðk#ÃP÷Ã@G ÃÀ!ÃPŒÀ~Ã@¾!Ã@_àUÃðÃP€ÃÐÄðáà à í!Ã0%ðÏ"ðíÃàåÃðÀ ÀlÃì%à !Ç!ÃÀ"ÃðƒÃÀ‹ÃðƒàIð^ ÃÐ'Ãp'$ÃÀ‹ÃÀ£ðpàUÃ`$ÃÃÀ‘ÃàÙÃ@Êà ^$à7 àIà+"Ã`‰"Ãðq"Ãp3"ÃàV ÃÀm$à¨"Ãp-#ðR"àÀÃpÎÃ`$ÃÐ)!ÃP÷ÃpÎÃ`!Ã°Û Ãø#Ãðk#Ã`*ÃpÔàÆÃÀ… ðÉ#Àf Ã@ÜÃ`¿ÃÀàÀÃ`§Óà¢#ÀÅ%Ó#Ã`›ÃÀÃþ&ÃPD'à ßÃ`0Ã"Ã.ÃàP!Ã"à ÃÀ… ÃØðdÃPzÃPýÇ!ÃÐ#à+"ÃÐ5Ã`³ÃÞÃ`›ÀZ"ÃД$Ç!àÌÃÀ!ÃäÃÌ Ã°Ï"ô$ÃPñðóà à´ Ã@;"Ãðq"à¨"à í!Ã0‘"Ã$ÃÐ#ðF$ÀZ"ÃÐ#àºÃÀ‹à ç"Ãp'$ÃPb"Ã@G Ãp!%Ã0ð'ð±'Ãà'Ã@/$Ãà,'ÀB&Ã@)%ÃÀa&Ãp3"à$Ã7$Ã0%Ãp˜&ÃÐp*à L'Ã@;"Ãà'Ã0%Ã7$Ã0…$Ã@#&à ^$Ùà=ÃPÇ&Ê+À¡+Ão%ÃP\#Ã&Ã`›Ã` Ã` ÃÀm$Ãp†)Ã`î&Ãp9!à %Ãþ"î%Ãp3"Ãðè#à ç"àœ$ÃðŽ2Ã$ÃàP!ÃÐÿ'à v ðdÃÐ;Ãà©'ÃPÁ'Ãðâ$Ã$ÃO Ãp°"ÃЦ!ÃPß"Ãp&ÃÀ"àŠ'Ã*ÃÀö"ÃUÃ0&ÃÀ Ãp¶!ðL#ÃÀ['ÃàJ"ÃÀ!ÃÀê$Ãu$Ã@;"Ã0#Ã`$ÃPÍ%à j"à1!ÃÀö"Ãp&Ãà'ÃðÖ&Ã`‰"à p!ÃД$Ãp¶!Ãp-#ÃP÷à7 ÃÐ)!ÃpÈÃp9!ÃPV$ÃÐ#Ãà\ÃPñÃp¤$ðÏ"ðÃ$ÃPÓ$Ãðw!ô$ÀÝ!à ó ÃÐ#"à7 Ã0—!Ã@;"Ã.Ã@5#Ã@ *Ão%ÃC"à Ãðú à !à í!ÃЈ&Ãø'ÃPÙ#ÃðÃØà ç"ð:&Ãðô!Ã`›ÃÌ ÃðÖ&ÃàÓ Ã€Ý!ÀZ"à–%Ãp'à=Ãpª#Ão%Ã0"ÃàP!Ã( Ã=#Ãà2&Ãà>$à ó ÃpÚÃ:ÃðÃð Ãðú àUà ÃК#Ãp¤$ÃЈ&ÃР"ÃpÂÃPß"à)à$à+"ÃPÙ#ÃpKÃ`‰"Ãàßà ó ÃànÃðÃPn ðÉ#Ã1%à$ÀN$Ã@ &à+"ÃPh!ÃÃ@¦%ÃPh!ÃÀà d#Ã0‹#ðjðóÃ"Ã`¡Ãðq"Ãpª#ß!ÃР"Ã@Sà d#Ã@¬$Ã`ÀT#ðX!ÃàÓ Ã0¯ÃàëÃК#àœ$à d#ÃÐ#"ÃPýð^ Ã0 ÃC"ÃÌ Ã¥ Ã(ß!î%Ã@)%ÀÝ!Ó#ÃPß"ð·&ÀB&Ã`ƒ#Ã{#ÃPb"Ã¥ ÃÐ$à ó ëðáÃPtðíÃpÎßÃ0!à7 Ã0!Ãðú Ã°Û Ã€×"ÀrÃÐ;ÃÐ5ÃUÃÀ"Ãi&Ão%à ùÃàzÃðÃÀ Ã"ÃàÙà j"ÃàP!Ã@_ÃÐÖÃð} Ã0#ÃЬ ÃÀ… ÃÐ#ÃР"Ã` Ã0,ÃÐ#"Ãp°"ÃÀü!à Ã0ü%Ã@A!Ã`‰"Ã`‰"Ã@G à®!À×"ÃÀ‹Ã à ÿÃàÙÃ@²#Ãðq"Ã"!Ã@Ä Ã ^$ÃPÙ#ÃPñð.(ÃPP%ÃÀs#Ã@Ä ÃвÃI!Ãp¼ Ã`³Ã:ÃÀÃ( ÃàJ"Ãp3"Ãðq"Ã$Ã`}$ðÕ!Ã` ðjÃ0"Ãðq"Ã` "Ã"ÃÀ ÃØÃI!à d#Ãà>$Ã`#Ã( ÃàßÃÀ!ÃàÙÃPtÃðú Ã0 ÃÀ"ÀÝ!ÃàbÃÀs#ÀT#ÀïðjÃÀü!à ^$Ã`â(à%ÃÞÃPàöÃP’ÃØÃàåÃÀ©ÃÓ#à®!Ã`• à Ã`Ã@;"Ã` "ÀÝ!Ã°Û Ã IÃgÃÌ ÃpKà Ã0,Ã"!ÃðƒÃ`}$Ãu$ÃP÷àØÃÐÐà àÒßÃÐ5ÃЬ Ãp? ÃÀ!ÃД$àœ$ÃàV ðçÃðÃÒÃ=#Ãþ"Ã"ÃÀ ÃäÀxÃàßÃ`›Ã0#ÃÞÃÌ Ãà\ÃÀ—Ã0µÃàbÃUÃð•ÃànÃ(ÃP†Ãð›à ˆÃÐGÃpàà ÃÐ/ à v à à àÞðçà í!ÃpKÀrÃ"Ã`!àCÃpÚÃÀ&ÃüÃ@YÃ`• àaà |Ã` Ãà\ÓÃ@YðóÃPŒÃÏÃ@ÖÃÐÊÀ%Ã`6ÀÃ`<Ã0»ñÃ0©Ã@Ã0,Ã@ÐÃÐ5ÃÐSÃÐÖÃð›à ¦Ã‹ÃÐSÃ0&à ‚ÀûÃgÃyÃXÃ0JàÆà ”ÃpKÃð›Ã`0ÃmÃpÔÃP†ÃðÃ0PàüÃ`0Ãð Ãà÷Ãð¹Ãà†ÃÐÄÃÐÄÃàhÃ¥ àÀ÷àaÃÐYÃÀÁÃÃÃ.ÃyÃÀ,Ã@àgà  ðùÃððóÃàñÃP€àÆÃpÔðÃP¤ðˆÃyðùÃØÃ@Öð|ÃPÃ@Yà ˆÃð¡Ã@îàÆÃpàÃÀ¯ÀñÃð³ÃÀ8Ãð§Ã`¿Ã`Åà ˆëÃ…Ã@_ÃüÃÐÐÃ0»Ã08Ãð³ÃmÀ–ÃÀ»Ã`ËÃà÷Ã`ÅðŽÃÐMà ŽÃpÚÃà!Ã@wÃsÃ`<Ã0>ÃÐÐÃÐGÃ@îÃÐÖÃ@îàOÃpQÃàhÃÐâÃÐMàÌÃàbÃàñÀÃ0JÀñÃpQÃ(Ã@ôàÒÃP†Ã`³Ã@eÃÀ£à ŽÃÛÃÀŠÃ08ÃÀ¯Ãð$÷ÃI!Ã`*ýÃÀ,àÌÃpÚÃ`­Ã0µÃ`¹ÃLÀ~ÃP€ÃàzÃÀÃÀ&ÃÀ‘Ãð•àÌàÒëÃpEÃиÃÐÖÃ0>À„Ãð•Ã@ &Ã:Ã`ÑàsÃPªÃð›ÃÌ Ã°íëÃоàaÙÃÐ/ ÃÀ£Ã@úñðpÃ(ÃðÃ"Ã0ÁÃ@MÃ.ð)ýÃ`Åð#Ãð¡Ã0©ÃÐAðˆÃP¤Ãð0ÃpæÃpÎà !Ã@;"ÃP Ã`³àÒð‚Ã`<ðà ¬ÃPÃðÃÃyÃ08ëÃ0,ðÕ!À~Ã`­ðùÃà÷Ã`¿ÃÐÊà ÃPÃ[ÃиÃÐ5à ˆÃ`¹Ã@ÜÃ`ƒ#ðíÃ`<ÃÃÃðÃðÃ0µÃÀÃÐÄÃðà ùà ç"ÃÞÃpÚà ðX!ÃàhÃpcÃ@qÃ`­Ã0#Ã` Ã.ÃðÃ0,ÃPtÃ02Ã(ÃpEðÕ!ÃP†Ã`*ÃоÀõÃ@âÃPžÃpWÃ¥ ÃpEÃàzÃpoà ðjðíÃ@qÃPÃaÃ@A!ÃàåÃÐ5Ãêà ‚ð ÃüÃ@kÃÀ—àaÃ@îà |ÃaÃöÃ@èÀõÃ`§ÃÀ‹Ã@ðóÃÐÐÃ@ÜÃPñÀÃ@_ÃÐ5ÃÀ&ÃÏÃp{Ãð­ýÃ4ðÿÃÉÃpàðŽÃà÷à šð‚ÃpàÃàŒÃÕÃP!Ã0>Ã@wÃPÃÀDÃpoÃ0»ÃpQà[àOà ÃP’ÃgÃð<ÃPžÃ0DàØñÃ@YÃpiÃ4Ã0>ÃÃÃ4Ã@àO÷Ã^ÑÃð*Ã4Ã`³ÃpÎÃ"ÃàýÃP’Ãp{ÃFÃànÃFÃð•ÃÐÐÃðÃð‚ÃpÚÃÐSÃ0PÃP˜àOÃ.ÃLÃð›À ÀÃ0©ÃÀ©ÃàÃÀ>ÃÐÖÃP˜ÃpðÃ@ÜÃðÃ0PÃPž÷ÃàtÃ`ËÃ`¿ðÀ%ÃFà šÃ‘Ã@À¨ÃÃÃÕÃpàÃàhÃP¤Ã‘Ã0JÃ@qà ¦Ãð¿Ãð*ÃÐ_ëÃ0ÇÃð¡ÃÐMÃàzÃ0ÁÃ0åàüÃ0\à  ðŽÃ@Ã@úÃÃ`­ÃöÃÀ ÀëÃPÃ0 à=ÃRÃàÃíÃ0tÃP9À ÃPÃ0ÇÃ`¹ÃÐAÃÀ¯Ãp{ÃÐ_Ãàzà ÃPŒàêÃ&Ã`ZÃ¥ðóÃyÃ.ÃpQÃ"àUÃpoÃjÃÀ&Ã0PÑËÃàžÃ@wÃyÃ@ƒÀœÃÐèÃÐÊÃ`›ÃÀ ÃpøðšÀ%ÃÏÃ@ôÃÀ»ÃÀ,ÃXÃÀ¢ÃÃÃÀ8ÃÛÃP!à[ÃáÃÐYÃPh!ÃàbÃÐYýÃà’ÃP!ÃpìÃöÃÉà )ðóà ŽðˆÃP'ÃÀJÃpiðÀ%ÃPà 5À%ÃÃ÷Ã@ ÃàÃ@‰ÃêÀ~ð”àäà #àäà Ãð•Ã0bà AÃà ÃpÚðÃÀ8ÀœÃÉÃÐÊÃàñÃÃ`$Ã`§Ãð§ÃÉÃ`¹ÃüÃsàüÃ@wðÿßÃ02Ã02Ã0»ðŽÃ0ÁÃpuÃPÃ0©ÃsÃP†Ã4àUÃpuÃÐYÃ`*Ãð•ß!ÃgÃ0ÍÃ0>Ã@úÃgÃ@ÃÐMÃ`6Ã0&ÃàëðvÃ@àðÃ@úÀxÃLð ÃFÃ`*ÃÐAëÃðÃ[Ã¥ÃÐÜÃ0¯ÃÀ&ÃÐÜýðíÃàßà ÃPEÃRÃàhÃ08ÃêÃàåÃ0¯ýÃÛÃpÃpþðvÃð§Ã"ÃàzÃÀÁÃP¶Ãà’àaÃàhÃ0&À%ÃPEÃð<ÀŠÃ@ÃàÃðÃ0PÃànÀŠÃ‘ÃFÃPtÃðÃ0£ÃPžÃÀÃpÂÃÌ Ã ÆÃ`*Ã@îëÃ`§Ãð¡ÃFÃP!ÀÃFàÀÃ`!Ãð‰ÀûëÃ0ÁëÃaÃÀ—ÃLà #ð)ÃÀ2ÃÒÃ@_ÀxÃàt÷Ã0VÃPŒÃP!ðÃ@qðˆÃpòÃ@ÜÃð‰Ã`$ÃPÃpcñðíÃ0¯ÃÀàOÃ0PÃ`ÅÃà÷Ãm÷ÃaÃpÔÃRÃPÃðÃ4À–ÃàëÀÃpàÃpìàÀÃPb"Ãà€ýàðÃà˜ÃÐwÃpÃÀ£ÃоÃÐ/ ÃÀ2Ãð¹ÃXÃ08Ã[Ã0Çðà ð|ëÃ0DÃàýðÿÃ`ÀÃÀ ÃðàIÀÃ:Ã@ÖðóÃ`¿Ã@îà ÃàýÃ:à  àØÀÃ`<ÀÃÃüðÿÃ0DÃÃÃpàÃ(àÀÃ@îÃ`ËÃ¥Ã0ÇÃ`$Ã0>à )Ã0ÇÃyðÃ0µà®!Ã`<ÃàÀûÃÀÃ¥ÃÐGÃpWÃ@îÃàýÃÐAÃÐMÃðÃ`*Ã0VÃ`BÃÐ_ÃP†ÃÏÃ@Ã0VÃÛÃàhð#ÃÀ£àCÃpcÃ@eàØÀÃÀàÞà à ;Ã02àÌÃ0åÃP-Ãà˜ÃàtÃÐÜà[Ã`*àUÃàzÃPªÃÏÃP¶ð¦ÃP¤ÃÀ¯ÃÐMÃàýÃ@kÃÃÃð•à ²ÃP'ÃdÃp‡à šÃP˜Ãð0ÃP˜ÃpòÃ4àsÃ0ÍÃP!ÀÃpWÃÐ_Àñà ²Ã`0à[Ã0>ÃÀ‘ÃÐÜÃüàÌÀxÃpÃð¹ÃpuÃ0>ÃöÃLÃXÃp{ÃPžÃ@úÃð­ÃPžÃàhÃà÷Ã@ÜÃ`<à /ÃP3Ãà[ÃäÃ@âÃ`TÃPŒÃ0DÃp]ÃP'Ã0ëÃsÀxÃÐYÀ–Ã0DÃÏÃÀµÃà˜ðÃð¹Ãð¡ðÿÃð0ÃàÃp? Ãp3"ëÃð§ÃpoÃð*à[ð”ðÃ0JÃÃàØÃ0»ðjÃ`6À~ÃÐ;ðvßðùÃàtà |ÀrÃÀ2ÃpiÃÐèàØàIÃ0µÃÕÃÐ_Ã0PÃÐAÃàbà ÃpiÃÐÐÃÀ‘Ã0µÃ`NÃêÃmÃð›ÀõÃÀÃðÃð•ÀxÃ[ðùÃ[àÌð‚ÃÃÃ@úÃLÀûÃP’Ãðà ¬à /ðšÃÐeà 5ÀõÃ`!Ã`¹ÃÉÃ.Ã`³Ã08ÃP˜ÃpæÃPýÃ@ÖÙà à /Ã0ÁÃpÚà´ Ã`³ð|à /àüÃ@}ÃÐâà ŽÃ@_ÃPŒÃPë Ã@eÃàÃPzÃp]ÃÐSÃÀ Ã0µà ÿÃÀ,ÀÃüÃêÃLÃ@ÃPÃPÃà€ð”ÃÐMÃ`¿Ã0Óà #ÃpWðáÃÀà  ÃP¤Àœýà šÃP˜Ã:Ã`BÃ02ÃPtÀûÃÐAÃ:ÃÐAàäÃ¥ÃaÃPŒðˆÃ`6ðùÃà ÃPªà #ýÃ0,ðŽðÃÀ2ÃÃà ˆðíðÃ`NÃ@ÜÃàßÃÀÃÀÃ0DðdÃ@eÃð­Ã@àmÀxÃàëÃ@eð|Ã.ÃO Ã@G ð ÃàÃÃ0&Ã@MÃ@ÃÐ_ÃP’ÃPÃ@ð¦ÃÐkÃp]ðíÃ`§ÃLÃð$ÀÃ(ÃÀ©Ã¥àÞÃð$Ã0»Ãàñà Ã@_ÃäÃ`¹ÃgÃ0µÃ`$ÃP!ÃyÃð›ÃÐÄÃÐMÃàÒÃ@eÃmÃ0&Ã`*ÀÃyÃÀ‘ÃÒÃpæëÃÐÐÀûÃ4ÃP Ãà€Ãð›ðáÃPb"ÃP ×ÃàÃpÔàaàäÃP’ðíÃ0>Ãðà=Ã0‹#Ãp-#Ã`$à ‚ÃàëÃð§Ãp9!ÃÀ!ÃpcÃÀ£Ã`§à ðvÃ"àCÃÀ‘Ã@ƒÃpøÃÐôÃàŒÀ~ÃÃp? ðóà ”ðÿÃ`<àäÃpæÃpìÃÀ©À¨ÃÐÜÃÏÃ0ÍÃ(Ãð³Ã@wÃÀ,ðjÃÐÊÃð¡ÀõÃÀ2Ãð6ðŽÃüÃÀ,ÃpÔÃÐÖÃP˜ÃFÃàzÃðÃ02Ã`$ÃÀ©ÃàÃà†à /ýðíÃ`$ÃÐSàIðíà7 Ã0DÃÐÐÃP€ð”ÀœÃpàðdÃð‰ÃвÃçÃ`TÃüðŽÙà[Ã0bÃ0hÃà ”À ÃPŒÃð•à ùÃäÃ0»ÃÐ;Àrð|Ã@èÃð*à #Ã0»ÃоÃàbðÿÃÐ_ÃP!Ãp]Ã@_Ã`$ÃÐSÃ0»Ã0»Ãð} Ç!Ãà»$ÃÕàäðíÃ`NÀð ÃPÃð›Ã`­Ã`³àOñÃPð^ ðáÃ¥Ãð§ÃP÷Ã@MÃ0¯ÃðÃ`­Ã`$àO÷àIÃÀ—Ã`§ÃÐÄÃð$ÃÀ£Ã@ÜýÃ@Ã`§Ã`§Ã@MÃ@ÐÃвÃpàà )Ã0,Ã@eÃØà[ÃÀDàmÃÉÀœÃPðŽÃÐSÃsÃð ÃpÎð^ ÃpKÃà†ÃêÃ( ÃP†àyàöàCÃÀ!ÃиÃ0JÃ@YðçÃð*ÃÀ©Ã`*ÃpÚÃ0&à ˆÃ@èÀÃØÃgÃ`6Ã`§ÃäÀà[Ã0ÇÃsÃpìÃLÃÐYÃð‰ÃðƒÃpQÃ0µà #ÃPÃ:àÞÃ@}ÃpÎÃP À ÃPà ”àäÃànÃÀ‘Ã0DÃp]Ã`­à #Ã02÷àÞÃ0µÃ.ÃàßÃgÃ0ÁÃàåÃàzðpÃ`­Ã0JÃ0PÃ"à´ Ã0&ÃPÃ`HÃsÃÐYÃ0µÃÀÃÐMÃ:ÃÀ—ÃpÔàÆÀàÞÃ@ôÃ`0Ã`­ÃÐÊÃànÃðÃðÃP’ÃêÃÐSÃàtÓÃ@ÜÃ`­ÃÐ/ à ÿÃð6Ã4Ã@eÃP!Ã@ÜÃà ‚Ã0¯Ã`6ÃüÃÃð‚à šÃ0Çà ˆðáÃ"àUàÌÃaà ŽÃ0ÁÃ@ÃÐSÃ`§Ã0£Ã@ÐàsðÃÐîÃÃÃêà ¦Ãð0Ãð*ÃÐîÃÐÖÃÐ5à ÃàtÃêà ÃÀ ÃÀ Ã`<ÃðÃÐâàäÃRÃpòÃpÈÃ"ðÕ!Ã@âÃpÔÀ`!Àf à Ã0>ÃpiÃàzÃpÚÃ0"ëà ŽÃpÔÃÐGÃmÃÐÜÃáÃ0ÍðjàÒÃ@MÃ@ôÃÀ£ð ýÃÐÄà Ã0,ÃоÃànÃyÃpàÃÃàñßÃÐÄÃÐÊÃ0JÃpià ¦ÃÐÊÃÀÃ`§À„Ã@ÖÃpÎðÃÀÁÃ`BÃ08Ãð§Ã@âÃ¥Ã0>à ”ÃÀ ÀZ"Ã°Û ÃŸÃpuÃÀ\Ã@ÃsÃÐÜÃöÃÐÄÃð6ýÃ¥Ã0 à ŽÃ0PÃÀ&ÃPh!ÃPŒà Ã`6÷À~ÃPà Ãp? ÃÐ5ÃÐAÙ"à ùÃàëÀûÃðà[à 5ÃöÃ0ÇÃ0DðçÃ0¯ÃP÷ÃÃpÔÃ¥Ã0JÃÀ Ãpààaà #ðçÃÀ ÀõÙàaÃPŒÃ0¯Ãð§ÃÃp{Ã`Åà ÃmÃÃÃàÇ"Ãð Ãð§Ã`³ÃPªð¦Ã@îÃÀµð ÃpòÃ@ÖÃÐÊÃPýÃ@ÖÃàëÃàÃànßÃPzÃ0£Ã@ÃÕÃàñÃPýÃÀ8ÃðÃàñÃÀ—ÀÃÀÇÃ@eÃð›ÃÀ¯Ã0ÓÃÃðHÃðÅÃPŒÃ@îÃ0>àÒÃ0&ÃPñÃ0,ÃÐÜÃð›Ã¥ÃP†ÃЬ ÃÐMÃÐâÃLÀ+Ã0»ÃPtÃ@ôð”à  ÃÐAÃ08Ã`³ëÃyðùÃàñÃÐGÃêÃFÃ`­à |À„Ãð•ÃPÀrÃàÍ!ÃÀ,Ã…ð|ÀðdÃ`0Ã`§Ãð³ÃLÃ02Ã@âñð”Ã@ÖÃÐÐÃ`NÃpKÃpæÃ0ÓÃ@ÜÃÃÃ4ÃÐGÃ0»ð‚Ã`³àÆðvàUðŽÀõÃ0£ÃpÎà v ÃP÷ÃaÃgÃ0µà ¦Ã0PðŽÃðà šÀ„ÃðÃ4ÃÐAÃPñÃp9!Ãðú ÃpKÃ¥ÃÐÐÃÀ‘ÃpÚÃPñðçÃ0¯ÃpÈð^ Ã@/$Ã¥ à šÃ"!Ã.àÆÃð‰ÃÃÀ!ÃI!ÃÐ#Ã`!ÃÀ‹ðçÃÐ;ÃÀÃðq"ðdÃpQÃàÙà¨"ÃðÜ%Ãðô!Ãðô!ÃÀü!Ãà>$Ãà>$ÃÌ ÃÐ;ÃоÀf à+"ÃpÂÃ@SÃ@²#Ù"À×"ÃÀ['Ã"Ã0£ÀõÃ¥ Ã0$Ãc'Ã`$Ãàåðçà à šð^ ÃÀ"Ã7$à1!à !ÀÝ!ÃÀ!à+"ÃиÃpàÃðÕ!Ã$ðÉ#ÀT#ÃpKà ‚Ãp¼ ÃÀy"Ã@¾!ÃP»(ÃO Ãð à !à ÃÐÄÃ0©Ã( à j"ðjÃ@/$Ã=#à ó à¨"ÃвÃpÎÃàëÃÐ;à=ÃÀ ÃàD#Ã°Û ÃPtÃ@ÊÃPÃÀ ú#Ãp¤$ÃÐ%Ãø#Ãð ÓàÀà ŽðÉ#Ãp¶!ÃÀ‹Ã@Mà Ã0$ÃàÁ#à+"ÃPë ÀÝ!ÃÞÃ@ÐÃêÃp? à¨"ÃÀ‘àUà ÃànÃ°Û Ã`• ÃðƒÃàV ÃPn ÃÀ!Ãð‰ÃоÃ`• Ãð‰ÃPh!ÃÀ"Ã@G ÃР"Ã02Ã@_ðÏ"à í!À„Ãp3"ÃpKÃðàÆÃI!ÃÀ!Ã`!à%#ÃЬ Ã"ÃPß"Ãðú ðÏ"ÃР"Ãpª#ÃPzÃ0µÃ@ôàUðvÃÀÃ^ÃÃàaÃàtÃðÃÃð‰ÃPë ÃЬ Ã02ÃàåÃàÓ ÃÐÄà ŽÃPýÃð¡Ãвà ÿÃP†À÷Ãp-#ðÕ!Àf ÃÀ… ÃPÃÀÃ4ÃpEÃàbÃpEÃàÓ Ã$ÃP€Ã`¹ð‚Ã@eÃÃ`!ÃêÃðÃàP!Ãp¶!ÃpEà àÆà ÃÕÃÐGðçÃP€à Ã@ÊÃàV ÀrÃ@_Ã@ÖÃ@¸"ÃÐ%ÃàÇ"ýÃ`¿ðùÃ08ÃàJ"ú#Ã`¡ÃpÎÃ0 à ˆÃÕÃPzà1!ðóÃÀ Ã`¹ÀÃàñà v Ã4ÃÐGÃÐAÃ`• à ó ÃPn ÃpÈÃàtÀ–ÃpæÃÀ,ðˆÃöÃ`³ÃÐÄÃ`• ðÿÃÐGà ‚Ã` ÀxÃÀÃp? àgÃàV Ã0»Ã0DÃоðíà7 ÃðjÀÃ`ËÃÐ_à ‚àIÃàÃ0ßÃÐeÃP˜Ã@_ÃàýÃ"Ã`• ðçÃPñÃЦ!ÃLÃ`BÃð$à ŽÃPŒÃ@âÃP†Ã0ÓÀ–Ã:ðÿÃP’ÃðÃ02à1!ÃÀ… Ã4ÃàÃgÃyÃ@úÃ:ÃÐS÷ÃàP!ÃUÀf à Ã@ÜÃð*ðÿÃ0>Ãð­à ‚à !ÃÐÊÃàhÃ@SÃ@MÃpÎà ”Ã(Ã`¹Ãð›ÃÀàOÃ`§à !Ãð‰à ÃsàaËÃðñÃ"Ã@îÃpcÃÐYÃp]ÃpÈÃвÃÀÃP÷Ã`¡ÃPžÃ`ÅÃÀ»ÃRÃP†ÃànÃ`Tà /àgÃöð‚àÞðùà ”ÃäÃ` à ”Ã0>ðíÃànÃÐYàUÃð­ÃÀÍÃçÃÀ©ÃáÃ0Í÷ÃðÃ( Ã@qðÿÃð¡ÃP˜Ã`¹ÃüÃp‡ÃàŒÃàzÃÃð­ÃLÃÐÜÃÐÐÃà÷à #ÃÐÄÃ`HÃàÃP’Ãð0ÃP°ÃàºÃÀ©Ãð$Ã`­à ²Ã^Ãð$ÀÃ@ðŽÃ0ÓàaÃ4ÃàýÃà’Ã(Ãð} ÙÃàÍ!ÃpìÃ`<Ã0»ÃÐÖÃÐÜÃPÃ@Öð Ã0JÃÐGÃ4Ã@_Ã`¿ÃP Ãð ÃmÃÀ©ÃpàÃP ÃPŒÃ4Ã:ÃàV ÃÃÃÃÃ0»À„ÃÀ£ÃÀ»Ã@ÃиÃp¼ Ã.Ã4ÃÀ,Ãð0ÃÀ8Ãà’Ã( ÃиÃàëÃÐÖÃ08ÃоÃP’ÃÀ©ýÃ@kÃP†ÃиÃ@qÃP€ðùàUÃpæÃðÃ.Ã0¯Ã( à ÀïÃpQðóà |Ã0,àUÃàñÃ4àÌÃànÃàÙÃð‰à àÞÃpuàgàI÷Ãpcà ÃPŒðáÃpÔàØÃ0µÃêÃàÃðàØÃÀ—Ã0ÓàUÃÀÃpàÃRÃpøðÃÀ ÃaÃ0ÍÀà´ Ãð} à ŽÃð§ÃàýÀ~Ãиà ÃP9Ã0»Ã.ÃиÃ08ÃpoÃ^÷Ã08ÃÉñÃÀ‘Ã0&Ã@Yà7 ÃЬ Ã`§à ùÃðð‚ÃÐMÃ"à ”ÃP Ãð¹ÃÛë÷ÃaÃàÃð¡ÃК#À`!à Ã@îà ŽÃ@ÖÃÀ©ÃPtÃð ð‚Ã.ðÿà ùÃ4ÃÐÜñÃPÃ@G à ‚÷Ã`ËÃð$Ãð§Ã0ÇÃàñÃàñÃàÓ Ãð•ÃðÃÐ_ÃÞÃ`$ðjÃðÃpiÃ0&ÃÐGÃÕÀÃð$ÃXÃpøà ðçðvÃ@ÖÃC"ÃÀ!ðpÃ^Ãð­ÃmÃ`§Ãð ÃðÃP-àaÃRà à #ÃàÀ„Ã`­ðóÃ.ðÃ0¯ÃànÃÞÃÐÐà ²Ã@MðíÃp{Ã@úÃàŒÃPÃÐAàØðÿÃÀ&Ã`BÃð³Ã.Ã0>Ãäà #Ã@ƒÃоÃÃð›ÃðšÃ`BÃ:ÃP’ÃÐÜÃöÃàëÃðà ¦Ã…ÃÃpìàÒà ÷ÀŠðÃàÃ0ÇÃàzÃÐSÃ`¹Ã:ÃpcÃP†Ãp{Ã`TÃÀ—Ã0 ÃðÃ0\÷Ã ÃØÃàëÃ`¿àaÃàtÃP ÃpKÃpKÃ0DÃsðíàÞÀõÃ0ÓÃÐYðˆÃ`NÃð­àCÃиÃ@wÃÀ2ÃÐ_àðÃÐ_ÃÐMÃ`$ñÀŠÃÐYÃÉð|ÃyðÃ@wÃRÃð­ÃpàÃpoÃð­ÃÏÃXÃð­Ã@îÃ0ÙÃ0JÃ0DýÃ@‰ÃÐôà šÃÃ``ÃðÅÀ®À+ÃàªÃÃ0ÁÃÃð‚àêàUÃÀ>Ã@ôðÿà /ÃÐSÃàzÃpìÃàžÃÐeÃpcÃ0¯Ã0\ÃÛð¦Ã0PÃ@îÃàýÃ`¿ðŽÃ`6Ã`ËÃÀDÃP-ÀÃpoÃð­ÃpÚÃà÷ÃÃÃÀßÃÀÍÃpuÃÐÖÃ`<àäð Ã0ÇÃðÃpàÃàÃ@ àaÀ–àyàäàað Ãð¿ýÃpKÃð¡à ²Ãð0Àf ÃpÔÃÐîÀ¢ÃÉÃ`TÃÀ»ÃÀµÃXÃP!ÃÐkÃÀ2ÃÀ&Ã08ÃÀ… Ã08à ”÷ÃpÔÃpcðàyðà ”ðŽÃÀ£ÃàÙÃpWàöðÃ0ÍÃPªà à #à ÃpEà[ÀºðˆÃ`6ÃXÃàŒÃðÃàÓ Ã«ðˆÃð¹ÃÐ_ÀÃaÃ0&Ã:ñÃpàð‚Ã@kÃà€ÃPàCÃ°Û Ã |Ã0VÃP-ÃÕÃ@­à 5Ã0JðçÃ`¹Ãà†ýÃPÃ0>ÃÐèð‚ÃàýðÿÃàýÃàŒÃàýÃ`³Ã0,ÃÐAÃð*ÃÐÐÃpuÃpæÃp]ÃpiÃð0ÀÃÐYÃ@ôÃFÃ0V÷Ãà€ÃpoÃ@èà  ÃpòÃ`6ÃÀÃÐSÃð*Ã`¿àgñÃ0DÃüÃöà ŽÃÀÃ`§ÃðÃäÃð*Ã08ÃÆ!Àéà ‚ÃpiÃpÚÃ`³ÃPÃàÃÛÃêÃàŒÃ`<ÃÐâÃ.àÞÃÀÃ@ÖÃ@èÃPÃðÃ02Ãà÷ÃpiÃàzýÃ0DÃÀ,à[ÃÀJðà ¦ÃpìÃP†àØà /ðŽðÃpQýÃà’ÃpòÃÐÄÃöÃÀ,ÃðÃðÃ@ÖÃ@âÃÀÀrÃÀü!àÆÃpÎÃ"ðjàUÃ`¿Ã0µÃðà[÷ðpð à Ãà˜Ã`<Ã"ÃP†Ã`³ÃÕÃ@eðóÀŠÃÐÜÀxàUÃÀ Ã`§Ãà÷ÃÛÃ0ÙÃð§ðÿÃP-ÃP¤ðÃÀ,Ãð‰ÃÐÜàÒÀ~ÃPzÃ"Ã`³à ²ÃÃ4ðí÷ðëðjÃ"!ÃÀ—ÀœÃ@kðpÃ`0Ã:ÃðÃànÃÐGÃÃð‰ðvàCÃ`¿àUýÃpQðpÃ02Ã0&ÃsÃpWÃ0Và /Ãð§ÃP˜ÃP’ñÃÐSÃÐÊÃRð Ãð­ëÃð<Ãð0ÃÞÃP ÃLÃRÃÀ8ÃàÃpæÃÃ`HÃÐÖÃmÀÃÐkÃXÃ`<Ã`6ÃоÃpcÃ`BÃ0PÃ@‰Ã@èÃ0»Ãð•à  ÃÐèÃ0PÃ0µÃ`¡à[À¨Ãp ÃÐqÃàñÃÐâÃ@Ã@}ðÿÃðÃ@èÃ4ÃÀµàmÃP°Ã^ÀÃ@à ¬ÃLÃÐYÃàÃ`ËàaÃðàÒð ÃÀ©ÃÐèÃPtÀrÃðÃ@èÃÐÖÃ`³Ãð*ððšÃÀµà ˆÃ(ÃàñÃà'À¢ÃÉÃà˜Ã@ôÃÉ÷ÃÐwÃpÃXÃàñÃ0PýðÃöëÃP˜Ãð0Ã@ƒÃ`ÝÃ0\ÃðÃàtÃ@‰ÃRÀÃ02Ã@qðÃàßðùÃ0µÃpÎÃð6ð)ÃpuÃ0VÀûàÌÃÀ©ÃàgÃ`NÃ0åÃ@à )ÃàëðÃ`ÅÃ0Çà )Ã0JÃÐâðšÃÐèÃÀðíÃpàÃêÃð*ÃP†ÃÐSÃ`<÷ÃP!Ã0åÃ0PÀœÃÐqÃRÃP!ÃÐYÃà€Ã`6Ã4ß!ÃP†ýÃà\ÃP†ðjÃPÃ@èÃÐ;à šÃRÃPà ˆà  Ã:ÃP†ÓÃ@}à 5à ˆðjÃ0»ÃXÃmà ÃPÃ`0ðvàÃ0Íð|Ã0»à )Ãð0ÀxðˆÃÐÄÃÉÃ`ÅÃP!ÃÐAÃ4Ã@YÃ¥Ã@Üð àsÃÀDÃÀÀÃàtÃ@qÃ4àUÀÃð Ã(Ã`HðŽÃ`ÑÃÀ©Ã`*ÃàzÃ@ôëà !ðˆÃà’à[ÀrÃPŒÃLÃ0ÇÃ`6Ãð$Ã0PÃ0hðdð^ ðÃÃÃÐMÃP ÃPŒÃPñÃ@_ÃÀµÃ0DÃàtàäð|ÃÐGÃÀ&ÃêÃäÃàßÃyÃüÃðà ”ÃÞðpÃÐÖÃÉÃÃàêÀ Ã`¹Ã`*ÃPÙÃ(Ã`<ðŽÃÀ¯àÌÃpoÃ@îÃÀ ÃÐÖÃ(à[ÃÐèÃÀ2ðˆÀ„Ãð‰ÃmàÞðvÃgÃ0ÍÃàñà ˆÃ:Ã:à[ýÃpKÃÐÄà ÃÐGÃà\ÃðÀÃÀ—Ã.Àà 5Ã@îÃÐÐÃð Ã"!Ã`Bà AÃpoÃÀ—ÃðÃÀ©Ãàßà ÿÃPÃ@ÖÃ@_ÃPŒÃüàOÃàÙðvÃÃ@âÃàÍ!ÃØÃÐAÃPŒÃ@Sðjð|Ã`§Ãð¡ÃöÃÐÐÃp]ÃÐ_ÃpÔÃ0>ÃàëÃÀ—Ã0,ÓÃÀg%ÃpQà Ã0DÃP¼ÃFÃPŒÃÀÃÀ&ÃàðŽÃà€ÃÐ;ÃP’ÃP˜Ã`$Ã[ÃÀ£ÃÃà†Ã0 ÃиàÀ÷ÃyÃàbÃÐMÃ0£ðíàmÃmÃPÃäÃÐÊÀÃ@âÃ@eÃ@úÃ0ÙÃà÷ÃÀ©ÃpKÃ`Ã`0Ã:ÑÃpÔÃð$ðˆðÀ–à Ã0PÃÐÄÃиÃð*Ã0,Ãð§Ãð§ÃP Ã`6ÃêðáÃ0¯ð‚ÀÃXÃ`ÅÃàñà ÃðÑÃ…ÃP Ã…ÃàÃ`TÃFàØÃp]ÃáÃð¿÷ÃðÃÐÄÃ@Ã"Ã@qà ðùñÃ@îÃsÃàÃð6ÃP!à ¬Ãð*ðÃÀ©ÃàåÃð‚à ²ÃÐSÃ0ÁÃ`Zð Ãð<ÃÐGÃ@ðÃàUà ÃpWÃ@ÃP÷ÃÃÃP’à ¬Ãð<Ã`éÀ%à )ÃàzÃP ÃÐâÃ0ÍÃ@wÃ"Ã0µÃ`HÃÃpuÃà ÃpøÃÃÃð¹ÃÀ>ÃÃ@wÃ`BÀ%ÀðÃÐMÀÃàzÃÉÃ@Ã`TÀœÃð›ðšÃð¿ÃÐGÃ@âÃðÀõÃð*ÃÐâÀ ÃÃðÃpìàIÀõðùÃ08Ã`$Ã@ÃÏÃÀDÃ.Ã"ÃsÃ0JÃP ÃÐkÃRðóÃ`*ÃÀ£ÀÃp{ÃÕð‚Ã@âÃ@ƒÀ®ð÷ÃLÀûÃ0ÓÃ0ÙÃ0ÓÑÀ„ÃpÔà ÃÐYðÃàŒ÷ÃP!ñÀÃàzÀûÃàtàgÃð­Ãà÷Ã^Ãàtðpà Ã`0Ã`<Ã0ÁÃ(ÃêÃ@âÃðÃÉÃ` ÃPŒÃP!ÃÃÃ0‘"Ã`$ÃÀ&ýÃðjÃêÃPn ðpÃ"Ã@îÃ…Ã0ßÃRÀëÃyÃ:ÃÐMñà  ðjÃð•ðpÃ`BÃ@qð|àÒÃ@e÷Ã@èÃ`¡à ŽÃ0>ÃP’ÃÐÄðX!ÃPzÃà€Ã`0ÃÐYÃyðˆÃð›Ã`0Ã`¡à=Ã0¯ÃPzÃð­ÃÀJÃ`ÑÃ@wÃ`³Ãpàð”À„Ã`§Ãp? Ãð Ã`¹ÃÀ!Ã`$à ŽàºÃÐMà ²ÃÃðÃÐ#"Ã@Ä ÃLÃÐÖð‚ÃÀÃÃ`0ÀŠà[Ã0JÃÀ¯ÃÉÃÀ ÷ÃPÃO ÃpKÀéÃ@#&Ã0—!à Ã`6àCÃàhÃð•ëÃðßÙ"ÃPñÃÀ©ÃàßÃàzÃ¥Ã0"Ã`³À„Ãð$ÃöÃàåàÆÀïýÃpÔÃ0>ÃÐYÃpàÃÀ£ÃÉàÌÃ`*Ã`ÃÀ ÃP¤Ã@SÃð} Ã@âÃP€Ãðw!ßÃð›ÃàßÃðú àØÃàzÃ"Ã0"ñ÷ÃØÀxðáðjÃ`¹Ã`›Ã"ÃÀ‘ðvÃPÃP€À–àØðÃàbÃpÈÃàëðíÀ Ã@eÃ0,ðvÃÐGÃ@èÃÐYÃ@eñà ÃP Ã0ÁÃsÃàP!ÃðÃð*ÃÀÃPh!Ã0 ÃðÃÕÃP'Ãð•ÃpiÃpÚÃp]àØðjÀÃàëðÃ.àUÃaÃpÎÃpàÃáàUðvÃ0ÁÃPß"Ã0»Ã`<Ã@A!Ãp? Ã0 Ã0>à  ðÿÃà Ãà†Ã0ÁÃÀ Ã0¯ÃÀ—ÃPýÃpÎÃ0ÁÃ(ÃÐ/ Ã"Ã0ÁÃ@ÃP!ÃÕÃ0>ÀûÃPžÃÐÖÃP’ÃÐÄÃððÃ`BÃpÚÃ`NÃpoðˆÃÐ_ÃÏðÃP’ÃpWÃ@wÃ:àäàäÃmÃ@èàäÃð•à 5ÀœÃ@kÃÀ©ÃÐYÃà ÃÕÃP˜ÃPÃðÃÀ ÀÃð0ÃRÃpæðà ²Ã0ÍÃ0ÇÃÀ»Ã`<àÞÃ@kÃgßÃànÃPÃ¥Ãð¡ÃÐÜàÒÃð³À ÃÐ_ÃsÃpæÃàÃðÀŠÃpìÃ`¹ÀÃ08ÀÃpcÃpòÃáÀ„ÃLÃpàÃ^ðÃPÀ+àäÃ@ÊÃP'Ã`ÝÃ@À1Ã0ÙÃð¡ÃRðà ;àgÃöÀ à Ãsà  Ã0\à ¸Ãð6Ãð¹ÃpiÃ@SÃÀ8Ã0Íð‚Ã`¿à šà[ÃÀ©ðÃàÃ`<ÃP-ÃðËÃ@qðóðpÃ`ÑÃyÃ0>ÃüÃ`BÃÀ,Ã…ÃÃàÃÀ¨ÃÀßð à Ã@îÃ`HÃÐwàöÃ0JÃRÃ0ÇÃ0ÇÃ@kÃÐAÀûÃðÅÃÀ»ÀŠÃÃà÷Ã0>ÃÐ_Ã^ÃÐMàIÃàßÃÐÜÃ`ÝÃÀ2Ã`0ÀÃÀ¯ðÿð”ÃàÒÃ`ËðšßÃàßÃ.ÃÐÊÃ0ÇÃÐÐà ¦ÃÀDÃ0nÃPÂÃÐèÃ0ÓàUðùÃöÀ¢à ¬ñÃ¥ÃPÃÀ8Ãð›àðÃP!Ã@à ;ð”ÃäÃ.Ã4Ã@èà šÃgÃ@kÃ@Ãð§ÃÉàØÃpÎàØÃ.à )ÀÃÀ,ÃÐÊÀ–Ã0JÃÐÐÃ0ÁÃpKÃLÃ@_à j"Ã@¾!Ãp]ÃPÃp¶!Ãðú ÃÐ#"ÃЬ À`!ÃЦ!ÃPP%ðÉ#Ãp(À¡+Ã`e(à ^$ÀÅ%à Ã(à)Ãì%ÃPë Ã0a*À6(Ã9.à 1Ãð¬-ÃÔ-ð‡.àï+ÃE,Ã](Ã`Ö*Ã0Æ.àã-Ãì)à×/ÃP‹0Ã@ó-Ã0=0ð«(Ã@š'Ãà,Ã`S+Ã@ç/Ãð;+ð/Ã~-à 1Ã@^1Ãð /àT0Ãû-Ãpë-ðø0ÃÐX.ÃÀ7-ÃÀ%0Ã@X2Ã`¬1Ãð0À•-Ã0ð'Ãà*Ã@í.Àk4Ã@X2Ã@d0Ã`50Ãpå.Ã@j/ÃÐÕ.Ã0Ò,ÃÝ2Ãã1ÃÀ1Ã@p.Ã0O-Ã`¦2à 0Ãû-Ã3/àË1ÃpÙ0àÝ.ÃÈ/Ãðˆ3àT0ÃpP2ÃpÙ0à Ÿ.ÃpV1ÃZ3Ã`²0Ã,ê0ÃÅ6ü1Ãï/ÃÀœ1Ã`A.À.ÃÐR/Ãpn-À,à×/à 1Ã`G-Ã9.àZ/Ã@d0ÃÂ,Ãà…-ÃÂ0ð{0ÃÐL0À}1àl,Ãp†)ð-àã-ÃÐ^-ÃÐó)Ã@ÿ+ÃÀC+ð“,ÃpÓ1Ã@v-ÃP2*Ãà*Ã0%4ÃÐ¥6à`.Ãà )à Ã(à~)Ã0U,À­)Ã&Ãp€*à +Ã@ *Ö)Ãà)Ãà…-ð/Ã@‚+ðŸ*Ã0Ò,ÃÐÕ.Ãà—*Ã@ó-Àƒ0à~)ð™+ð/à ±+à ™/Ã`/1Ã0ð'Ãà'ÃÐí*Ã`;/ð.(Ã@(à Ã(ÃQ.ÃK+ð .Ãð/-Ã`Ö*ÃP2*Ãu(Ãà,ÃE,ÃÐó)ÃP -àr+Ã@ó-ÃðA*ÃP£,Ãð²,Ãpý*ÃÐj+Ã`A.ð“,Ã@+ð-Ã0U,Ãð²,ð,Ãàm1Ã?-Ãà+ÃÈ+ÃÀ=,ÃðÐ'ð()Ãï/ð+ÃPµ)Ã~-ÃÔ)Ãð¸+Ã`Ä-à~)Ã@”(Ã,Ã`S+ÃQ*Ö)ÃÐÿ'Ãð¾*àõ*Ã)À0)ÃÀ%0ÃÚ(Ã`e(Ãp€*À›,Ãàm1Ãð¸+Ãì)ÃÐp*ÃÀa&À6(Ãà‘+Ão)Ã0ð'Ã0O-ÃP,+ÃP&,Ãp\0Ã`50Ã@Ž)à(Ã@ *ð+ÃP2*à 4+ÃÎ*àû)Ãð²,ÃÐd,Ã@'ÃÀº,Ã@ó-àf-ÃÂ,à Ÿ.ÃÀU(ÃÀØ'à Ã(ÃK+Ãpz+ÃÀI*ÃÐ|(Ã0y&Ãð/-ð‡.Ã*àr+ðŸ*àx*Ãi*ÃÀU(Ãà‹,Ã-Ã%'Ãp'$ÃPÙ#Ãà8%à&Ãpz+Ã,ð,Ã9.ð“,àû)Ã0Æ.Ã`Ü)ÃPß"à 'À0)à~)ÃÔ-Ãð¬-À,Ãph.ÃðG)à Ï&Ã@'Ã`M,À.ð±'ÃÀÞ&Ã@(àï+Ã`è'Ã*Ãà&(Ãð;+Ãð¸+À§*ÃÐd,à 4+ÃÐó)Ãi*à F(ðŸ*Ã-Ã`Y*ÃÐÛ-àx*Ã0ä)Ãp'ÃÐ%Ãà>$Ãì)ÃÂ,Ãà‹,Ãð¾*Ã)Ãð5,À‰/À,à ¥-ÃÐv)ÃðÄ)ÃÀI*à É'Ãp€*Ö)ð.(Ãð;+ÃÀ['à í!Ã@'Ã0[+Ãì)Ãì)à ½)à ±+ÃP,+Ã@+Ã0g)Ãp’'Ã`}$ÃД$Ã0a*Ãð¾*ÃPD'Ãà&(Ãð¾*Ã@ˆ*ÃQ*À<'ÃC"ÃÀÞ&Ãæ*Ãà&(ðŸ*ÃQ*à «,ÃP¯*Ãp˜&à L'Ç%Ã*Ãàü.Ãð¾*Ã@ÿ+Ãà)Ã&ÃÐÿ'ÃP»(Ãà2&à :*Ãà+ð:&Ã0y&ÃP»(À6(ÃðÊ(Ã`â(ÃPP%ÃД$à 'Ã0y&À<'ðþ/àÑ0Ã`Ü)ÃÐí*àé,Ã`Ê,Ã`2ÃPµ)Ão%Ã@¦%Ã0"Ãp˜&â'àŠ'Ãp€*ÃW)Ã`e(Ãì%ÃÀê$Ãp¤$Ãì%Ãà©'À§*Ãà )À¿&ÃÐÿ'ÃàÇ"à&Ã@ &ð()Ö)Ãp˜&Ã`Y*ð+ÃPµ)Ã`w%ÀÑ#à%ÃÀØ'à„(Ã@)à ½)Ãu(Ê+Ã`k'ÃÀä%Ãþ&Ã{'ÃP»(Ãà)à @)Ä,Ã`k'Ã0m(ÃpŒ(ÃPÇ&ð+ÃÐ'ÃðS'Ãpž%Ãp¤$ÃÀÞ&À¿&ÃÀÌ)Ã`î&Ãp€*ÃPÁ'Ãc'ÃÚ(Ã`î&à X%à ½)Ã0U,ÃЈ&Ãà,'ðÃ$Ã0ü%ðÃ$ÃPÁ'ÃÔ)ÃÚ(Ã@ &à(ð«(Ã0‹#Ã`ƒ#Ã`â(Ã{'ÃÀO)ð.(ÃPÇ&Ã@/$Ã0s'ÃP>(Ã0%ÃÐù(À6(ú#ÀT#Ã@)%ÃðÐ'ÃðÜ%Ã@¾!ð½%Ã@(ÃÐp*ð·&ú#à(à 'Ã0%à¨"ÃàD#Ã`!à Û$Ã0%Ã"ÃÐ$ÃÐ$Ãàµ%Ãþ"ÃЈ&ÃðÖ&ÃÐ%Ãðw!à–%Ã@ &ÃPÍ%Ã0y&ð«(ð«(Ã0%Ù"Ãðè#ðÃ$à¢#Ãp'$Ã{#à 'Ãà&(à(à á#à ç"Ç%Ãp¤$Ã`w%à$Ã0‘"Ã0‘"à7 ÃиÃЬ ðR"à X%ÃÐŽ%à É'ÃðÜ%Ù"Ãp°"ÃàÍ!Ã0"Àã Ãð Ãàµ%ÃðM(ÃðÖ&à !ÃðY&Ãà©'Ãpª#Ã@”(ð½%ÃPë ðÉ#à à ó Ã0‹#Ã0#Ã0…$ÃPÓ$ÃЬ ÃвÃàÍ!ðR"ÃÐŽ%Ã`‰"ÃànÃвÃPh!ÃàÁ#Ã`â(à R&Ã`!à 'Ãð¾*Ãþ&Ã@²#ÃÀ‹Ã"Ã0y&Ã0$Ã`ú$à á#Ã@/$Ã&Ãp-#ÃðS'Ã{'Ã0—!à ÃUà+"ÃPå!ÃàÙÃp3"ÃPh!Ãp'$à F(ÀZ"Ã$à L'ÃPJ&ÃÐ#"ÃàJ"Ã1%Ã&ðR"ÃÐ/ Ã@/$ÃÀg%Ãà¯&Ã`ô%à„(àr+Ãpª#àœ$à ç"Ã@ÐÀûÃpÎÃ0"ÃPb"ÀÑ#ÃÐ$ÃpEÃpÔÃÀy"ÃPtðíÃÃ` ÃàD#Ã@)%à ùÃàßÃÐ#"ÃðÜ%Ã"÷ÃÀ‘Ã@A!Ã@¸"À`!ÀT#Ã$ÃÀ… Ã.Ã0£ÃpKÃpÔÃ4à j"à R&ÃPJ&Ã0©àÆÃ`$Ãð§ÃPŒðáÃД$Ã@¸"ÃàV ÃÐ5Ã`Ã0&ÃUðíà ÃÀ‹ÃPÃpcÃàJ"à !ÃàÓ Ãð} ðvÃÃàD#ÃÀð#ÃO Ãp? Ã0 Ã@Ðà Ã02à ÃÀ… à d#ÀT#Ã`$ÃÐAÃ{#ðpà&ÃÀö"ÃpEÃ`!à ç"à !ÃP÷ÃPn à v Ãà8%Ãà8%ÃÀ!Ãp9!Ãp¼ à j"ÃàV ð|Ã` Ã@Ðà !Ã0 Ãà\ðçÃÐGÃ"Ã@A!ëÃÌ ÃpÈÃ4à ùÃвÃðe$ÃPß"Ã"Ã"Ã@²#ðL#Ã@MÃÀ2ÀûÃPýà ùÃ0&ðX!ÃÀä%à7 ÃØÃÐ/ ÃàJ"ÃÐ5Ãp9!Ã0»Ã`<ÃÐ5ðÏ"Ãðú Ã( à7 à ó Ó#à v àÆÃàJ"Ã0ö&à á#Àéà ˆÃ0 ðX!ÃÀ… Ã°Û ÃI!à=ÃàP!Ã0—!Ã@5#Ã`$àºÃÐ)!ÃÀä%ÃÐ#"Ã@Ä Ã™"Ãp¼ ÃÀÃÀ… Ãðî"ðL#Ã`!à¢#Ãðƒà ŽÃÃ0£Ã@ÊÃ@ÊÃÐ5Ãðú ÃpÈÃpQà=ÃàÓ Ã d#ÃÀü!ÃвÃÐ)!à®!ÃÐ5à Ç!ÀlÃ`#à ó ß!ÃêÃð} à ç"ÃP˜ÃÐÄÃÃðˆÃàñÃ@²#Ãðî"à à !ÃpÂÃp°"ÀÝ!ÀéÃ( Ãðƒà šÃÐMà ÃP÷ÃÞÀrÃðw!ÃЬ Ù"Ã"à v ÃêÀ~Ã``ÃP˜Ã%'ÀïÃð§ÃÀ—ÀrÃÐ;ÃàßÃвÃ0#ÃPë Ã`§ÀÃÀy"ð^ à ÀÝ!ðdýÃàbÙÃÒðdÃpÎà1!Ã¥ à ç"ðÏ"ÀÝ!ÃPb"ÃàÁ#Ã@¬$ÃÀê$ÃPb"à ”ÃànðÿÃÞÃ( à ùÃà÷ÃPÀûÃ0#ÃPtÃ0£ÀlÃÀy"Ã"!ÃÀ,ÃàÙà ‚Ãð¡Ãàhà ‚ÃP Ãð•Ãðè#ÃÐ5Ã¥ÃPýÃPn Ã°Û Ã0&àUÃ`³àCÃpÂðX!à ÿðpÃ@ÖÃPñÃ@ÖÃpæÃ`­ÃÐ;Ã0©Ã0%Ã`­ÃÕÃpÚÃ`ÑÃ`ËÃ4ÃànÃÀà v ÃðƒÃð•ÃÀà ˆÃ08Ã`*Ù"ÃàhÀf ÀÃ08ÃPÃpÎðdÃ0JÓÀlß!Ã4ÃÐâð|ÃðdÃ(ÃÐÄÃ0!Ã`• àÆàÆà Ãà\Ãð•àÆÃвÃðô!ÃÀü!ßÃ@YÃ0Óà ŽÃpKàØÃ@qðpà ÿÃÀ Ã0µÃàåðùýÙÃ"ÃàëÃàzÃànÃÐ5Ã( ÃÀ‘Ãð•Ã0¯ðùÃ`0ßà |ÃÐÄÃÀ àÌà àÒÃð¡ÃPÃÞÃÀÃ0JÃàzÃpÔÃgàaÃ@YÃÐMàºÀ„Ã`¹ÃUÃànà ðáÃpÚÃ0DÃPŒÃ@ÃàßÃRàêÃÀ2ÃÀ£ÃÐÄÃPë Ã@G ÃLðáÃÀ—ðíÃÐÊðùÃFà ¦ÃgÃànÃÐAÃ0ÍÃ4à ŽÃÃÃà†ð‚ÃPñÃPzÃPb"Ãà\ÃиÃÞÃ@_Ã@G Ã:ÃðÀlÃP÷ÃPå!à !ÃpKÃð•ýà j"ÃÀ£Ã0Jë÷Ã@ÖÃðÃð ðàêÃ@Mà ÃP†ÃоÃ`$ÃØß!ÃàhÃð¿ÃÕÃ`6ÃðÃ@ôßÃÐAðpÃÀµÃp]àºÃ"ÃðÃàD#Ã0©àÆà7 Ãà\ÃÀ‹Ã0>Ã4ÃàåÃ0ÁñÃRÃ@ÜÀf ÃÀŠÃàÃLÃØÃ[ÃàhðvÃÐÜà ÃpÂÃàV ðçÃ`¿à[ÃÀÃ02ÃàñàÒÃFà ˆÃ0©ÃоÃ`§ÃàhÃ`¡ÃPýÃàÃð¡Ãðà à |à ‚ÃpòÃaÃP€à=Ã.Ã0¯Ã`³àOÃ@SÃÀ!ëÃ`Ã`$ÃUÃpEÃàëÃðÃ"ÃàbÃ02ÃPžÃpÔðÿÀŠÃÃ( Ã` "ÃÐ#"à ŽÃÐ#"à v Ã`*à šÃmÃØÃÐ#"Ãðô!Ã@A!ÃàëÃpKÃ@ÐÃàëÃ0—!ÃÀà !à~)à R&Ã0,ÃpÎÃÐSà[àÞÃÀ à ˆÃЬ Ã`!à1!Ã.ÃÐGÃPñÃ`*ÃÐ;ÃUà+"Ã0 ðjà |Ãp¼ ÃÐ/ Ã@ÊÃð‰Ã0,à !Ã°Û Ãà»$à ùÃUÃ0¯Ã°Û à ÃàbÃÐ)!ÃPzÃÀÀlð^ Ãp? ðçÃÀÃиÃPýÃPÃP€ÃÃ"!ðR"ðX!Ãpª#Ã0#Ã@SÃðÃpKÃÀÃ@ÜÃ:Ãà\ÃàÇ"Ã( Ã0 ÓÃ0£Ã@Ä Ã°ùÃyÃ0µÃð‰ÃPh!ð±'ÃàV à šÃsÃ` Ã"ÀràCàÀÃ`‰"Ã`#àÌÃ0ÁÃPýà ùÃø#à=Ã0!à7 Ã@;"ðíÀÃ`¡Ã`›ÃÐ;ÃP’ÃmÃÃðpÃPh!Ã`‰"à ÿðjëÃ@A!Ãð ÃðÃ`0ÃpÎð^ à v Ã0 à Ãð§ÃÀ!à |ÃиÃ`‰"Ã0&÷ÃpcÃÆ!à ç"Ã0©Ãp'$à Õ%Ã0ð'ðF$Ãð ðpÃ"Ã"Ã`ƒ#ÃЬ ÃàÁ#Ã`}$Ãp!%ÃC"Ãðî"Ãà8%Ãp!%à+"ÃвÃàbÃ`¡Ã{#Ãðî"à ÃàëÃ@Êà À×"à$Ã@¾!Ã@ÐÃ"Ãðî"ÃÐ$ðíÃ@/$ÀË$Ãþ"àœ$Ãpž%ÃÀy"Ãþ"Ã@)%Ç%Ã`$Ã¥ à7 ÃPë ÃÀ ðR"ðdÃC"ÃPV$ðX!ÃÀ&À„ðL#Ã0#Ã#à+"ÃÐ;Ã@¬$Ã1%ðÃ$Ã4ÃÐÖñà |Ã¥ à¢#à à ùà+"à Ãðk#Ã"ÃàD#ðR"ÃÀü!à Žð^ ÃÀÃК#à ˆàCÃ`!Ã@A!ÃðƒÃ@;"Ãø#ÃP\#ðjÃðà |Ãp-#à ùÃ0—!ÃPñÀÑ#Ã@²#Ã0¯Ã@SÃP\#Ãp3"ÃвÃ@Sà1!Ã0¯ÃÐ;Ãpž%ÀÑ#Ãà\ÃÀ&Ã@_ÃÀàÞÃ`<Ãà\Ã¥ ÃPñÃÀ ÀÃ`­ÃÐ)!Ã0£ÃPå!Ã@ÊÃUÀã ÃPh!à=ÀûÃPÃвÃ@;"ÃUÃ@ÖÃÀ‘Ã¥à Ã@Ä Ã`ú$à ÃpÂÃÐ)!ÃP Ã@à  ÃÀ—àÌÃÀü!Ã`Ã@Öð|ðáÃðú Ã`¡Ã@_ÃÀ©àIàØÃÐÄÃpKÃ02Ã(ÃÒÃ@¾!ÃÀ‘ÃpEÃPÃàåÃ@YÃ`Ã`w%ÃPzÃ`­Ãð‰Ã@Mà ˆðvÃpÈÃpQÃÐÊÃ4ÃððÿÃÀÃÃÃÀ©ÃðàºÃð$Ã`*Ã4ÃÃPñÃp¼ ðÿð|àIÃ0,Ã0!ÃàëÃànÃð•Ã`­ð^ Ã`• ñÃLÃðî"ÀÝ!ÃðÀrÃPÃ0,ðçÃ02ÃP€ðˆÃpWÀûÃ`*ÃðÃЬ à¨"àIà ÿÃ`HÃpæÃÀ£ÃоÀõÃPtà+"àIñÃp¼ ÃPå!ÃàÙÃð‰ÃàÍ!ÃPn ëÀã Ãà\ÃàÙÃPŒÃ`§Ã0,ÃpKÃPtÃ@Ä Ã:ÃP àœ$à$ÃpÎÃP†ÃP†Ã.ÃPñÃðú ÃÀ… à  ð^ ÃÐ$Ã"Ã@ÖÃ`³Ã@Ã.ÃàbàÀÀ~à7 ÀZ"à¢#ÃàÍ!à |Ã`$Ãp9!Ã0 Ãp¼ Ãø#ÃP€Ãð} à !ß!à í!ÃÐ)!Ã@ÐÃ`›Ã`$ÃÀ!ÃÀ!ÀN$ðdÃO Ã¥ÃPñÃPzÃР"à ðŽà=ÃPtÃPzÃ(ðX!ÃPÓ$Ãàµ%Ã@;"ÃàëÃÐ$ÃO ÃPŒÃÀÃ0%À<'ú#Ã@G Ãðq"Ãðô!Ã@Ä Ã™à ÀxÃàåÃàÁ#Ã"ñÃöÃpÚàCà ÃPtÇ!ÃpÎðpÃ` "Ã`$Ã`6Ã[Ç!Ã@YÃp? Ã(Ã( Ã#Ã@ &ú#ÀN$ÃР"ÃÐÄà´ ðáÃиàÀÃàÓ Ã v Ã0—!ÃÀÃP†Ã` Ã@_ÃÀ©Ãð›Ãð‰ðíÃоÃ08àUÀÃà\ÃÌ Ã@MÃàhÃ@èÃ@YÃÃвÀÃð•ÃPð”ðvÃ`³Ãà÷ðçÃC"à v ÃÀ‘Ãðú Ãp¼ Ã@Ä ÃàåÃÐAÃp]Ã4ðdÃ"ÃàÍ!àÀÃÞà ‚ÃpÎÃÐ/ ÃàÍ!Ã`§Ã@âàØÃð¡ðŽÃ@îÃД$Ãp!%à1!ðùÃ( ÀÑ#ÃÐ5à=Ãð} ðR"à í!à ÿÃPë ÃPtÃ0…$Ãà8%ÃиÀrÃ`³ðjÃø#Ã"ÃPýßÃÌ Ã€xÃFÀûÃ"!ÃоÃPtÃ`‰"ÃPñÃ@¾!Ã0,Àf ÃÀ"ÃàJ"Ã[ÃPýðjÀxÃ@ÜÃpÈàUÃLðR"Ã+&Ã`ýÃÀÃUà=ÃðÃPŒÃàßà í!Ã`›ÃäÃ"ÃànÃ@âÃpàÃàñàØÃ`!Ãðk#ÀéÃÀü!ðdðáÃ0£Ã@Ð÷Ã@îà ÃPýÃвà ç"ßà´ Àl÷ÃÀ ÃàÙÃÀü!ÃÀ… ÃàñÃ@ôðpÃUÀõëÀ~ÃÐ/ Ã@ÐÃ0&Ã@ÐÃÀ!à=ÃP€ÃÀ!Ãðú à7 Ã@¸"à+"Ã#À**ÃðÜ%Ãp'$ÃЈ&â'Ãà )À0)ÃP¯*Ãp(è&Ã@¸"Ã`!Ão)Ãðâ$ÃÀê$ÃЈ&Ü(à~)À¿&ÃÀÞ&àœ$Ã`ô%ðÃ$ÃðY&ÃÀ['à%ÃðG)ÃÐp*Ãà&(ÃÐ'à&Ü(Ãà,Ãp€*Ãì%Ã0y&ÃÀÌ)Ã0ö&Ãc'Ã@ÿ+à&Ã0s'Ã@#&Ã0ü%Ã`è'à L'ð·&ð:&à Õ%ð±'ðL#Ãðe$ðR"Ã0%ô$Ã{#Ã@¦%ÃÐù(Ã@š'Ãp’'Ão%Ãp’'Ãc'ÃðÖ&Ã0%à¨"Ã0s'Ã0ä)Ã*Ãæ&à !Ã@#&Ã0‹#Ãà‘+Ã0m(Ãò$Ã],Ã)ÃW)ÃPµ)ÃÐv)Ãp'à(Ã0[+ÃÔ)à +ÃðY&Ãp )Ã@ó-àx*ÀN$à Û$ÃðA*Ã`Ê,ÃPD'Ã0#À§*Ã-Ã`Ö*à É'Ã+&Ãò$ð½%Ã](Ãp(à L'Ã`Ð+Ã0s'à–%Ãð²,Ã%'ÃÀØ'ÃðÊ(Ã`#ú#Ã@+Ã0m(Ã$Ã`î&Ã`M,Ã`â(ÃÀÞ&Ã`_)à ·*ÃðÄ)à L'Ã{'Ã0ê(à Õ%Ã#Ã@š'ÃÀÌ)ÃÀÞ&ð.(Ãpz+à~)À6(Ãà©'à «,ÃðM(à ç"ÃðÖ&àŠ'à Ï&ÃÀm$ÃW)Ãp'àr+Ã@Ž)ÃPÙ#Ãp'$Ãp'Ãr/ÃÀÞ&ÃðY&Ãà©'à à¨"ÃPÁ'Ãi*à(Ãæ&Ãp!%à~)Ãi&à ^$ÃÀð#Ã`w%Ãp'Ã0g)Ãpý*ÃÐÿ'ð:&à%#ÀB&à R&Ã@¦%ÃÆ!ÃÐ &À¹'Ã@'Ç%ÃPV$àf-à~)ÃÀä%ÃPD'ÃÀÞ&ÃðÄ)àr+Ã`è'à Ã(Ã0a*à :*Ãp˜&ÃÀð#Ã@¸"ð^ Ã@5#Ãþ&ÃÐ^-À§*ÃðY&ÃC"Ã"Ãp(Ã0g)Ãc'Ãp¤$Ã@”(Ã`â(Ã`q&Ã0ä)Ã`è'Ã@/$ÃðY&Ã0‹#à$À¿&ÃÀs#Ão)Ãp÷+Ä,À<'Ã0%Ù"ÃPP%Ãp'à Õ%Ãðk#ÃÐ5ÃPD'Ãp(ð:&Ãp˜&ð·&ÃÀs#Ãà¯&ðŸ*à%â'Ã`ô%ÃPV$ÃðÜ%ÃðÖ&ÃðÜ%Ã$ÃÀa&Ã@‚+ðL#Ã°Û Ã „(Ã](ð±'ÃpŒ(Ão)Ã0#ÃPJ&Ãp’'ÃW)ÃÐù(ðÃ$à(à +À³(ÃàÇ"ð¥)Ã`Ö*ÃP»(à¢#Ã0…$ÃðS'Ã@š'Ã@ &ÃQ*Ãø#Ã"!Ã0g)ÃP2*Ão%Ã"Ã@Ä Ãðk#ÃK+Ã@‚+ð:&Ã$ÃÀm$àû)Ã*Ã0ö&ÃЂ'Ãæ*Ã0O-ÃÐó)ð@%Ã`ô%ÃPÁ'À³(Ã0ð'à Õ%Ó#ÃÀO)ÃÐ|(ð±'ÃðÖ&Ãp(ð±'à%Ã(Ã@¬$à$Ãà»$à É'ÃP»(ÃPÓ$À6(Ã0s'ð±'àœ$ÃP>(Ãð¾*à Õ%Ã`Ä-ÃÐ$Ã`q&à %ðÏ"ðÉ#ÃPµ)Ãæ&Ã0‘"à$Ãðq"ÃP8)ÃÚ(ð·&Ã@A!ÃPÍ%ÃÚ(ÃE,Ãà,'Ã@#&ÃP\#ÃÀü!ÃÐ'Ã`ú$Ã0%Ã`$Ã0‹#Ãà)ð()ÃP¯*ÀB&Ãà©'Ã`w%ÃÀm$Ãæ&Ãà©'Ão%Ã@/$ÃP&,ð+Ã@Ž)Ãð²,Ãi&Ãà£(ô$Ã`ƒ#à Ã(ÃÐó)ð¥)Ã@+ðÉ#Ãø#ð+Ã)Ã(ð4'Ã`Ü)Ãp!%Ã0…$Ü(Ãà'ð@%Ü(Ãp'$Ã%'Ã`‰"ÃðY&ÃÀÌ)ÃðG)Ãp¼ ÃàÁ#è&Ãu(ÃðÖ&Ã0y&Ç%Ãpª#ÃÐ%Ã0ü%à à R&ÃPP%ÃÀm$ð+Ã&Ã@ &ÃðÖ&Ã*Ãà'Ã`ô%ÃPÇ&Ã`w%À¿&Ã0ê(ÃÚ(ÃÐó)Ãð).ð"*Ã0Þ*ÃðG)Ã0—!Ãpª#ÃÐÿ'ÃÐ &Ã0y&Ã0m(ð@%ÃPÇ&Ãà)Ã`ô%ÃàÁ#Ãc'ð.(ÃP8)Ã@ &ðF$Ã`}$Ã`w%î%Ã`#ÃÀØ'Ã0ö&ÃÀö"Ãu$Ã@²#à&ÃÐp*ÃQ*ÃP>(Ã+&Ã@)À<'Ãæ&ÃÀ"Ãp!%ÃP8)Ãì%à á#ÃÀÞ&â'Ã`ô%Ãà8%ÀB&Ã@#&ÃÐó)Ã@(à ½)Ãp(ÃðÖ&Ãp&ÃÐÿ'à L'Ã`ƒ#Ç!Ó#ÃÐŽ%ÃPÍ%Ãp3"Ã0%ð·&À³(ÃÀä%ÃÒðR"ÃðM(ÃðÊ(Ù"Ã1%ÃðY&ÃPÓ$ÃÀ!ÃÐ%Ã`#Ãò$Ãò(à&Ãø#ÃÐ)!ÃðƒÃ`ƒ#Ã&à ·*Ã@”(Ã0‹#ð½%ÃðÖ&ÃPÇ&à 'ÃÀg%Ã0ö&ÃPh!à j"à R&Ãpž%à d#ô$à É'Ü(Ã0ü%à @)Ã` "à+"Ã`ƒ#Ãðô!Ãp'$Ã`ƒ#à&Ã` "à%#Ãðâ$ÃPh!Ãà2&Ãà*Ão%ÃÐŽ%Ã0%Ã0m(Ãð_%Ãà2&Ãp˜&Ãà¯&à ^$à&Ã"à ó Ã`}$ðF$Ã`è'Ã`è'ÀB&Ãà,'ÃÀÆ*Ã$Ãàµ%ÃÐ|(Ãà2&Ã`ô%Ãò$Ã@¦%ð±'Ã1%ÃÀü!Ãðè#Ãðè#à Û$ÃPÙ#Ãu$Ã0!à ÃÀ… ÃÀs#ÃЦ!Ã`!à j"ÃÀ‘àCÃ0!À**ÃÎ*ÃÀm$Ãðe$ÃÀð#ÃPV$ÃUÃ@MÃ°Û Ãà8%à Ï&Ã@/$ðÉ#à¨"ðF$à%#Ã@'Ã`k'à1!àÆÃP÷à ç"Ãð ÃÐ#à ^$ÃPÙ#î%ÃÀy"Ã08ÃàÁ#Ãp-#à Õ%àœ$à+"ð½%ðÕ!Ã0,Ão%Ãðw!ÃPb"à&ÃPÙ#Ãp-#Ç!ÙÃ`• Ç!ÃðÜ%Ã@¬$ÃÐ/ à ŽÃ`¡Ãà2&Ãp-#ÃÀà ^$Ãu$à ^$Ã@¦%ÃPß"Ãðè#ÃÐ#à !Ãà÷Ã@ÖÃPn Ã0…$Ã@5#ÃÀê$ÃК#ðX!Ã@MÃÀü!Ãp¶!ÃÀ!ÃI!Ã`#ÃO Ã°Û ÃŸ!ðR"Ã@/$ðÉ#Ãà8%Ã`#Ã0#à&ÀÝ!ÃÐ#"Ãà\à ÿÃàÁ#Ã`ú$Ã0ö&Ã`w%Ã`!Ãp3"ÃЦ!Ã0%Ã`ÃpæÃÐ#"ÃЬ ÃиÃàbÃ`Ü)Ã$ÃÀ—ÃÀ‘ÀéÀlà¨"ÃÐ#"à ùÃàÓ Ã ÀÃÀy"Ãp&ðáÃ°Û ÃЦ!ÃPÙ#ÃÀy"ÃC"ÃЬ ÃÀ… Ã$à¢#Ã¥ Ã02ÃÀ!ÃP÷Ã0 Ã@5#Ã`!Ã`• ÓÃ[Ã`­Ãp? Ã` ëÀã Ã`$Ã@A!ÃÀ!Ã.Ã`#Ã@A!ÃàhÃ08ÃUÃ`#Ã` "à7 à®!ÃÆ!à ç"Ã=#ß!ÃàÓ Ã p!ÃC"ðÃ$ÃP\#ÃÀ"ÃÀÃ( Ã@²#ÃÃ0 ÃàJ"Ù"Ã@¸"Ã@A!ÃàÙÃ`¡ÃÀü!ÃÀØ'à1!Ãàëà ùÃ` Ã0#Ãðî"ÀZ"à¨"ðÕ!à ^$Ãðè#Ã0!à L'Ã0ö&Ãðq"ÃÀs#ÃPP%Ãà'ÃÐ)!Ãp°"Ã@¾!ÃÀ‘à |Ã"Ã.à R&à$à |ÃPb"Ã@ÐÃÀ÷Ãà+"Ã$à+"ÃPb"ÃPtÀN$Ãp? Ãð›ÃP’Ãðî"à ÿÃð‰Ã` ÃPÓ$Ã0m(ÃàJ"Ã`ƒ#ðÕ!Ã0µÃ0µÃÃ`›ðjÃ` ÃPå!Ã0£Ã@ÐÃ°Û Ã€Ý!Ãp-#Ãà»$ÃÀg%ñÃðq"ÃðY&Ãà )Ão%ÃÀ!ðL#ðdÃàbÃ`*ÀlÃðq"Ã0#ßÃp3"Ãp3"ÀÝ!ÀrÀrðÕ!ÓÃPå!ÃÐ#"ðÕ!Ã`›ÃÐ#àÀÃ`• ÃPn ÃÐ)!Ã@Ä ÃÃàP!Ãì%ÃPh!ÃÃð ÃÀü!Ãà8%Ã@A!Ã0!Ã Ã°Û ÃÐ &Ã0%ÃP\#Ã@¾!ÃÀØ'ÃðÖ&ðÃ$Ã0#à+"Ãp’'ú#ðÉ#Ã0$ÃðÐ'Ã`k'ÃPÇ&Ã@ &ðX!Ã@ÖÀ`!Ãø#Ã0£ÃPýðáÃÀä%Ã@ &ÃðY&ÃàÁ#Ãø#Ù"Ã"Ã`î&Ã1%ÃД$Ãc'Ãc'Ã"!Ã0‹#ÃЂ'Ã`Ö*Ã`Ü)ð()Ã{'ÀÅ%Ãp'$ÃÀa&Ã0y&Ã(à L'Ã0%Ã0…$ÃÔ)Ã`q&ÃàJ"ð:&ÃÐó)ÃPÁ'à$Ãðâ$ÃÐ|(Ã0ê(ðŸ*Ã@)%Ã`è'à L'à R&ð«(Ãpz+ÃÀÌ)à–%Ãc'ÃàÁ#à p!Ã0…$ÃðÜ%Ã@#&à¢#Ã0ü%ð:&à R&ÃPß"Ã@)%Ãà>$ÃÚ(Ãpñ,ÃPD'ÀT#ÀÝ!Ã7$Ã0…$ô$Ãà¯&Ãðk#à$ÃàÁ#Ãð_%Ãpž%ð4'ÃPÇ&ð:&Ãc'Ãpž%ÃPß"Ão%Ã0y&ÃÐÿ'àœ$ð@%Ã=#Ãì%Ãi&Ã@)%Ã$Ã@(Ãà,'ÃÆ!ÃÀü!Ãp°"ð^ ÃàV ðÕ!ÃQ*ÃðÖ&ðF$Ãi&ÃÀy"ÃÀ… Ãðî"ÃPJ&Ã0m(ÀN$à–%ÃÐŽ%ÃàJ"Ã( Ãp? ÃК#ÃPD'ÃÀa&Ão%Ã`ƒ#ðáÃàÁ#Ã`ú$Ã`k'Ã`w%àœ$Ã0%Ã`w%à¨"ÃC"Ãp? ÃPýÃ$Ãà'ÃÐ'Ãà2&Ã0‘"Ãp&ÃÚ(ÃÀU(Ã+&ÃðA*Ã`ú$à´ ÃÀ… ÃPb"ÃÐ#Ã#à L'à Ï&ðF$ÃÐ#"Ã`}$ÃÀØ'ÃPÓ$Ã0…$Ã0¯ðçÃPn ðÏ"ÃPÍ%Ãp-#à ÿà v ÃÌ Ã@¬$Ãp!%Ã@²#ÃÐ$Ãp&ÀË$ÃÀy"Ãpª#ÃÐÿ'ÃÐ'Ãp¤$à´ Àã Ãð_%Ãp°"à v ÃÀö"ÃàD#Ã@5#à j"Ãà»$ÃðG)ÃðG)à ÃÐ)!à´ Ã0!ÃÀ"Ãu$à+"Ã$Ù"Ã¥ ÃàÓ Ã( Ã{#Àã ðR"Ã@²#ðL#ÃàÁ#Ãp¶!Ã0!à7 ÃPP%ß!ÃàbÃ`!Ã&Ãæ&ÃÐŽ%Ãpª#ÃPJ&ðÉ#ðF$ðL#à Ã0©Ãp¼ Ãàåà à ç"ÃÀy"à%#Ã0—!Ãp3"Ãp°"Ãp? ÃpÈÃ=#Ãp3"Ãð_%Ã@Êð^ Ã%'ðL#Àlà¨"ß!ÃÀ‹ðÏ"Ãðà šÃPë ÃЂ'àŠ'à ç"Ã`!à Ã`!Ã"ÃÌ ÃÀ£à í!Ã`}$ÃÀm$Ãi&ÀZ"Ã@Ä Ã¥ Ãp-#Ã0%Ç!ÃÃpÈß!ðL#ÃÀÃ@MÙ"ÃPb"ÃÀö"Ã0£ÃÀ"ÃðM(Ç%Àf ÃO Ã@¬$Ã`‰"Ã` ÓÃI!ÃàÍ!ÃÀ‹Ã0©àÀÃpÂà¢#Ã¥ ÃÀ‹ÃàP!ÃPë Ã@A!ÃÀÃðw!ÃÆ!ÃЬ ÃÐ#"ÀZ"à®!àœ$à |ÃвÃ@MÃ@Mà ÷ÃêÃ`• Ãp!%Ã#à¨"Ãðî"àºà ^$ÃÀ… ÃàJ"ÃÐ;ÃÐ5À`!ß!ÃàÍ!ÓÃЬ à X%à%#Ãðô!à+"Ã4ÃPÃÃ` ÃÞðpÃPýÃ$Ã@¬$ÃàÇ"ðF$ô$ÃàbÃÐ#"Ãðô!Ã@YÃÛÀ Ã`!ÃÐ)!ÃÀä%Ãðú ÃàÙÃ`#Ã"ÃàÙÃØÃ0ÓÃÐMÃ@Ðà ùÃ@eÃPÃØÀ~ÃPýÃÆ!ÃиÃP€ÃPë ÃиÃpQÃ( ÃPÃР"ÃpÂß!àCÃ0!ÃÀy"ÃàåÃpÚ÷àÒÃP€Ã.Ã0—!à p!ÃÐÄðÃ0>ÃÀÃpÂÃ`#Ã$ÃPñÃàåàUÃP†ÃÒÃàÍ!à ‚Ã`*ð^ Ãp¼ Ã¥ ÃÀ‘ÃPýÃP†ÃиÃ0µÃPzÀÝ!à Ã0—!ÃPë Ã`³Ã02Ã0 Ã@G Ã@ÖÃP¤Ã0»ðáÃ0‹#ÃPb"Ã.à1!Ã@Ä ÃPñà ó ÃðÃpWÃ`0Ã0,ÃÐ;ÃÐ5à ùÃиÃP€ÃÃÃP÷ðÿÃP÷ðjÃ@A!ÃI!ÃÀ‘à ùÃðw!ÃP€Ã`¿Ãp? ÷ÃPë Ã0#ðçÃà ÃäàOÃPýÃÃÃPŒÃàhÃ"ÃÞÃ0µÃàßðáñÃÐÊðÿðùÃÐÐÀïÃÀ Ãðî"ÃpøÃàtÃ`!Ã0,àÌÃ(à[Ã0©Ã@¾!ÃÐ)!Ã`$ÃöÃ:àÆÃäÃsð‚Ãð•Ãðk#ÃÀÃpÚÃPn ÃpÈÃ0PàØàºà Ãð§Ã0,Ã` "Ã( à ŽÃ@qà p!ðpÃ@âÃÀ&Ã`HËÃp? Àf à7 ÃàtÃP÷Ãðú ÃоÃðƒÀõàIÃ0&à ÃpEÀõÃÐSÃpcàºà Ã`­Ã@Mà=ÃPýÃðÃ`³ÃÀ&ÃpoÃÀ—Ã@G ÃÃ@ÖÃÐ/ ÙðùðvÀýÀlÃðô!Ã@;"Ã@ÜàØÃ@¾!Ã`$ÃÀÃ@wàIÃвÃÒÃÐÄÃ0,Ã@/$ÓÃ:Ã`‰"Ó#ÀË$Ã`!Ã`³ÃP'Ãà€ÃpKà ”ÃÒÃPë Ã`$ñÃP’ÀT#ÃÐ/ Ã`HàIðR"ÃÀÀ ÓÃp? Ão%Ã0©àÌÃpÈàgÃmÃ`6Ã`HàÒÃ@èÃ:Ã0¯ÃpÎÃ:ÃàßÃPýÃPzàIÃpÚðÿÃÐGÀ~Ã@MàºÀlÃÒà ùÃÀÀrà ÃPýÃ@;"ðçÃÀ,Ãð0Ã:ÃànàØÃ0&Ã0¯àÀÃ"!ÃàV ðÕ!Ã0 Ã0 ÃàÓ Ãð‰ÃçÃP†Ã4ÀÃ0>ÃÀ2ÃðBðÃÐSÃ`¡Ã@Ä Ã@5#Ãð ÃàzÃ@wÃÀ,Ãð³Ã(Ã0,ÃÀ£Ã`¹ÃpÎÃðÃÀ2ëÃÐGÀ~Ã`³àmÃpàÃ`ÀûÃàåÃpWÃð§ÃàÃ[Ã0»ÃÐÐÃ:ÃÐ_à )Ã0µÃð›ÃRÃ`<À„Ã0ÍÃ`6ÀûÃpÈÃöÃðÃÀ&ÃÀ¯àØÃmÃÐMÃ0DÃ0ÁðßÃÌ ÃPÃànð‚ÃÃð¹ÃyÃÐÜÃPÃà÷Ã0ÁÃ@èÃP€Ã@âÃÃ0&ýÃÛÃÀ8ÃÀÃpEÃpQàÀÀ„ÀÃÐ_Ã4à ¦Ãð­ÃP ðvÃPýÀlÃp¼ à |Ã4ÃÃÃÃ@ôÃàÙÃÐAÃPžÃ0ÇÃLÃÐ_à ¸Ãð­ÃÐSÃ@úðjà ˆÃÐYðà ¦ëÃP’ÃàñÃÀ»à #ÃpþÃ`Bà šÃð$ÃàtÃ`<Ã0JÃpWÃÀµÃ0JÃP ÃÀ!ÃP à ð‚ð Ã`§ÃpWÃ`TÃ0>ðçàÒÃöÃ0>Ã`³ÃÀµÃà Ã0µÃp]Ã0ÇÃ@ƒÃ`³Ã@_Ã4ÃÃöÃà÷ÃPŒÃà ÃpÈÃ`¡Ã@_ýÃP°ÃÐ_ÀŠðíÃP÷ÃÀ2ÃpQÃ@SÃÐÖà ŽÃàÁ#Ã"à Ãà\Ãà€Ã`NÃ`NÃÞÃPÃpKàÞÃÐ_ÃLÃp]ÃsýÃÀµÃàñÃ@ôàðÃð›à ”ÃFÃPŒàÒÃ0 ÙÃ`›ÃàV ÃP ðÃ@ÃP˜àOà ÃÐSÃÃÀ8ÃÕÃ4Ã0ÓÃP'ÃyÃ`‰"à¨"ÃÞÃ`Ëð)ÃÃÏðóÃàßñÃmÃPë ÃPýÃpìÃRÃÀ»à )ÃÀ,Ã@kÃpKÙðùÃ.Ã0ÍÃð¡ÃpàÃpÎÃpøð‚Ã@kÃ0bÀ ÃоÀéÀ„ÃpÔÃgÃÀÃÀ2ÃÛÃpWÃPh!Ã@eÃà÷ÃÐâà ¦àÞÃsà ðùÃpWàÀÃÐÊÃ`<ÃPÃ`TÃpiÃð•ÃsÃpQÃ@²#à ÿÃ0ÍÃÀà=Ã@ðŽÃp? Ãðe$Ã:à ¸à #ðÿÀÃÐÜÃ0ÍÃöÀûð‚ÃÉÃp¼ ÃÀà ‚à[Ã0»à ‚Ã0»ÃðÃPàÀÃ` ÀlðáÃÃ@qßÃиà ŽÃgÀ„ÀÃPªà[Ã@_ðvàºÃ`6à  Ã0¯ÃP ÃÀ2ëà ”ÃÃpàà šÃÀµÃàzÀÃpcÃÀ… Ã0»ÃPÀŠàmÃ`Tà ˆÃsÃ0DÃàßÃ`6ÃmÃPzÃpÈÃ"ÃÐ5ÃÀ‹ÃÀ,Àà ‚ÃØÃðÃP÷ÃØÃPtÃpÔÃ`BÃÀ©ðçð^ ëÃÉËÃpÎà1!Ãðô!Ã`$Ãgà ”ÃFÃàÃ(ÃÐ/ ÃÐYð Ã@ÜÃ`‰"ÃPtÃ0>Ã0»Ã`³ÃàëÃÐÐà ‚Ã08Ã.Ã`³ÃоðùÃaÃ(ñðÿàÆÃÐYÃÀ>ÃÞÀ~ÃpiÃ:à ðvÃðÃ`¹ÃPÃðÃyà à ŽÃ(Ã@qÃ¥Ã08Ã@âÃð­ÃÐÊÃP’ÃmÃðÃ0>Ã@èÃP’ð|ÀœÃðÃ0ÁÃüàØÃÉÃð­Ãpi÷ÃÐÄÃàŒð¦à ”Ã`›÷ÃÀ©À ÃÀ ÃðBÃà˜ÃÐÜÃ@eÃpQÃÀ—Ã0VÃpþÃð*à Ã`HÃP-Ã`BÃàÃLð#Ãð¡à šÃÐâÃPÃPŒÃàÃàzÃpæÃÐèÃ@à  ð Ãpo÷Ãð•À–ÃíÃáÃÃ.ÀÑ#ÃÐÊÃÒàØÃÐ_Ãà÷àgÃ0ÇÃPªðÃdð÷ÃÀ8Ãð0ÀÃpWÃpæÃöÃLÃLðùßÃà€à ÃÀ¯ÃÃÃ`Bà ¬àaà ¦à /à ²À´Ã@îÃ`³Àà #ÃàÃXð”ÃPŒà ¦ÃpÃÐôÃp‡ðÃyÃà’Ãà’ÃЉÃÃ02à ¬Ãp{ÃÛà /à šÃóÃ`éÃàŒÃÐÐàOÃ0>ÃÀ&ÃsÃ`BÃyÃpiÃÐeÃð¹ð ÃFÃÐkÃà Ãð­Ãð<ÃÐeÃ@Ã0ÇÃ0VÃmÃ4à ÃÐqà ;ðÃpøÃP¤àðÃ`<ñÃ0ÁÃpoÃpÑÃÀÁÀ¢Ã4Ãð¡Ã@èÃüàüÃÐSàêÃ@ôà ÄÃÐeÀÀÃ`NÃöàaÃpòÃP’À Ã`HÃÕÃÐYÃÐÊàÞÃ@•Ã0ëà ¬ÃÃÃ:Ãð¹Ã@ôà šÃÀ»ÃpÃÉÃpøÃÀµÃ:ÃÀ,Ãà†Ã0ÙÃ`×ÃÛÃ0DÃ0D÷Ã4Ãð<ÀÃpQà ¦Ã`TÃ`ÝÃð‚Ãð*Ã`×Ã`HÃ`³ÃP'Ã@úÃ@‰ÃöÃð•àäÃ0DÃPŒÃpKÙðùÀ„Ã0JÃ0\Ã0ÇÃpWÃÀ2ÃÐkàØÃ`6ÃpuÃpiÃÐkà ;ÃgÃPðÃ`ZÃP!ÃP€Ã`­ÃÐÊÃÀ¯ÃpþÀ¨ÃFÃsÃð³ÃöÃ4ÃpÔà Ã`TÃÀÁÃÀDà ¬ÃàtÃÐYÃPªÃpààsÃ`×à ”Ã0ÇÀûÃðƒÃÃÃ`ZÃ`fðàºÃ@YÃPŒÃàÃ`Åà ”À–ÃÀ2Ã0¯Ãðà  ÀŠÃ`¹Ã@_ÃsÃP'ÃdðˆÃÀ£Ãà†ÃÐÜÃPÃpÎÃpòÃÀDÃ@qÃÐÐÃ@èÃP°Ãð¹ÃÀ Ã0JðùÃÐSÀ à 5Ã0ÓÃ`³ÃðÃ0DÃRÃpEàIÃÀ,Ãp{ÃpoÃpWÃà Ã0ßÀ%ÃÀ,ÃàJ"à1!ËÃ@ ÃP¼ÃÀÇÃ0ßÃyð ðÃpæà #ðˆÃpcÃ4ÃÐúÃÐMÃÀÃP¤Ãð<ÃÀµÃ‘ÃP¤Ã:ÃpæÃpWà ”ÀŠðvÃ`¿àäÃÃÀ£ÃÐkÃÕÃP'Ã0JÃ@îÃÀ2Ã0>Ã.Ã`<à Ãà÷à ÃpiàÞÃàŒÃÃ0hÃàÃ:ÃO Ã` Ã@ôàaÃð*ÃPÃ@Ãp“à /Ã:ñÃ0JÃàÀàaÃàŒÀÃ0ÇÃÀÍÃð¹Ã@}Ãð³Ã0\Ã@ÜÀõà ßÃ:Ã`fàêÃ`³ÃsÃdðÃ@èÃàÃLÃ0ÍÃFÃpÔàUÃ4ÃÃÃàÃpÃ@qà ¦Ã`¿à #ðÃ`­Ã@âðÃPªÃ0P×Ãð0ÃP€Ã0Áà  ÃÐMðpàÌÃpæÃ:Ãà†Ã0Jà ¦Ã@Ãà€Ãyà[à ”ÃàtÃP'Ã0bÃ`HÃ(ÃXñà ¬Ã0D÷Ãð*ÃÃP ð|Ãp{ÃpÃÕðÃÀ ÃÀÃ`¡ÃÀ©ð‚Ãð§Ã0ÍÃðÅÃÛÃÃp]ÃpÈàÆÃpQÃ@_Ã@kÃ0»ÀéÃ`<ÃÀÁÃÀ»Ãð§Ã0»ÃÐMàüÃ`NÃpuÃð0Ã0DÃpÔÃsÀ„ÃÀðvà ‚ÀûÃ0©ðáàmÃÀDÃP˜Ã@Sà ÃÐÄÃÃàzÃà÷ÃPýÃ°Û ÃÃöà ‚Àrà à ̴̯ÃÐÊðíÃPtÃ` Ã0£Ãð•ÃpÔÃÐÖÃPýÃ$ÃPå!ÃP€ÃÐÄà ŽàÒÃ.àCÃÐAÃÀÃðw!Ãp9!ðçàIÃpKÙÃð•à Ã`‰"Ã"Ã0#Ã4ÃàP!Ãàßà ”ðjà Ã@YÃPÃоÃ@MÃPñÃð} Ã`›Ã0µà ŽÃàñÃ`¡à |Ã`• Ã"ÃPÃàßÃà\ñÃ0>ÃàtÃ0 ÀxÃpÈà šÃPzÃ@A!ÃP÷Ã0ÓàÌÃ[à p!Ãø'Ã0‘"ÃÀ£Àà )ÃpKÃ@ÐðpÃð•ÃÒÃÀü!ÃànÃüàÒÃàëÃÀÃ`Ãð•ðjà |Ãð‰ÃP÷Ã( ÃÐÊÃà à ÿÃ02Ã@qÃðk#ÃO ÃÞÀlÃ(Ã`!Ã4ÃØà ùÃp]Ã08à |ÃÀ… ÃP€ÃPžÃ0»Ã0ÇÃàtÃÐ5ÀrÀÃ(Ã@ÐÃÀ£Ã0—!à ”Ãð•Ãà÷ÃÀÃP÷ÃÀÃ`6ÃpKÃЦ!ÃР"ÃPýÀœÃ0PÃPýÃ`!ðR"Ãp°"ðáàCÃиÃÐMÃ`§ÃPzà |ÃPÙ#ÃàßÃpÚÓÃpÈà ÃàñÃFà=à á#à j"ðáÓàÆÃ@èÃ@qÃ"ÃвÃ0&ÀrÃàß÷Ã0!Ãàbà ”ÃÐÊÃPn ÃоðR"Ã@¬$ÃàÍ!À„Ãàëðà )ÃðÃ@/$ÃàV Ã`*Ãà\Ãð} Ã@SëÃ`§Ã0 à+"Ã@Ä Ã@ÖÃ0»Ã0»ÃPÃÀÃ`*Ã@âÃ0ÁÃ.ÃpÈÃpEÃ0,Ãð•ÃÀy"ÃЦ!àOà ÃsàÆÃÀ‘ðóÃPà ”à ùÃ"!à®!ßÃÀÃÐ5Ã@A!ÃÀ‹ÃÐÄÃð³ÃÀ£Ã`­ÃpÎàÆà ˆÃ02ÃUà ÃÐÐà ¦ÃP†à ‚Ãðw!ÃöÃ0VÃØÃоÃÀÃ`¿ÃpoÃð¡ðçÃÐ;Ã(ÃÀ»à šðˆÀ„ÃÐAÃÀÃpiÃÀ„àUÃà€ÃpÔðçÃ`§Ã0»Ã0£Ã@Mðçà¨"Ãð‰ÃÀ… Ã`›à ðà šÃ`0ÃpàÃÀ&ðpÃànÃðÃð$ÃÉÃ:à d#ðdÃ@MÃà÷ÃÀ… ðjðáà ÃpiðóÃ@èà à7 ÃÐÜÃ0µÃ"ÃÐ;à ó ÃÀ—ÃàëÃà€Ã0>ßÃ¥ÃÕÃðÃðƒÃpWðÃpÎÃp]Ã0¯ÃàñÃpÎÓÓàCÃ0,ÃÐAÀ„ÃÞßÃP'ÃsÃP˜Ã@îÃðw!ÃpQÃ:à Ã`0à+"Ãà>$Ãð$ÃP˜ÃÀÀÃàýÃsÃFßÃ0,Ã`³ðŽÃ0ÁÃPŒÃàñðX!à ‚ð|ÃgÃ"Ã@ÊÃÐ)!Ã` Ã02Ã0©ÃpKÃÀ‘ÙÃp'$ÃI!Ã`$ÃÐ5ÃPŒÃP'ðÃ0>Ã"Ã@Ã…ÃpÂÃ"!Ã0,Ã@ÖÃðÃ`§à ÃàzÃÐÖð”ÃñÃÀ,ÃàÃÃàÌÃàŒÃ`<Ã.Ãð›ðà ÃP˜ÃpæÃäÃ08àIðÿÃpþÃP€ñÃ@kÃ@âÃ`¿ÃÐôà )Ã08ÃàÙÃàëàOßÃÐ5àUÃÐèÃ0µÃà\ÃÀü!Ã[ÃÐGÃÐ;ÃàtÃÐÄÃ"!Ã°Û Ã@èÃ@à à í!ëÃ0ÇÃ@èÃ@kÃ4ýÀÀ%ÃðHýÃpiàÒÃà€ÀðíÃ`³Ãð‰Ã@ÖÃ`§Ã0ÁÃ@eÃà÷ÃÐGÃ@èÃÀà ”à ÃPÃÀ8ÃàåÃ@ÊëÃpòÃgÃÃàtÃpÚÃàýÃÀ8ÃÀ8Ãàåà šÃÀ—Ã`6ÃP÷Ãðà ùÃ"Ãð•ð|ÃL÷Ã.Ã`­Ã.ÃØÃ` ëÃ@îàmÃPªÃ0ÁÃÀ£ÃêàºëÃð‰àCÃ0µÃP†Ãððÿ÷ðùÃ0»ÃÉÃàbðjÃPýÃð¡ñÃpKÃàbÃ@_ÃdÃ[Àf àUÃ@Ã0ÓÀxðvÙ"ÃÀ&à ”Ãp]àCÃ@âÃÐYÃð¡ÀÃÐ;ÃÐ/ à j"ÀxÃÃð•ÀûÃðÃ@Ã@ÜÃ4ÃÀÃÀÃPýÃ`¿Ã0\ÃPŒÃPh!à  ÃpcÃ4Ã¥ÃöÃàÃ@eýà ÀïÃàëÃ0ÇÃÛÃÕðùÃ`§ÃàzÃàÙà ŽÃpæÃ0»Ã0Pð|ÃÉÃP˜ÃÐMÃ0µÃÐÄÃpQà ÃPÃmÃ`$ÃÒðíÃ0VÃPŒà á#ÃPýÃðÃÐÄÃà ÃÐGÃð›ÃP†ÃÃÐÄðvà í!ÃFÃð³ÃpþÃÃ`×à à ”ÃpÈÃÞÃ@âÃÀPÃ@wÃ@ÃÐGÃ"Ãmà ÃоðóÃpÔÃsÃÐ_Ãpuà Aà ¬ðÃÐYÃ(ÃàzÃð§àäàUÃ`¿ÃÀ2ð‚ÃPžðÃ:ÃP'Ãð¡Ã@_Ãà àäÃpÎð|Ã@eà[Ã@qÃ^à à /ÃêÃÏÃÐYà Ã0VÃüÃÀ»ñðÿÃdà ¦ÃRÃà†àÞÃÐÖÃð6ÃÐ_ÃpìðˆÃÛàäÃ`6Ã@eðÀà šÃpoà #Ãð¡Ãð*ÀÃð*Ã`³ÃpÎÃÀ ÃPÃ``ÃP3ÃP¼Ã@úÃÃ0hÃÃà!Ã0JÃ@Ã@_ñÃÀ£ÃPñÃàÙ×ÃP?Ã@qÃsð ðÃÃP-Ãà†ðùÃP Ã08àCÃðÃàñàUà ¬ÃÀ»Ã@èÃ:Ã@kÃ@}ÃpøÃsÃ`6À~ðŽðšàgÃPàOÃÐSÃXðùÃyÃ@âÃ@wÃ0»ÃðÃgÃÐSÀÃ`6ÃÀµà ¦ð‚ÃpðàÞÃÐâÃÐÐÃÀ,ÃðTÃðÅÃð•ÃÐÖàUÃpWÃ`BÃàÃðÃ…ÃXð ÃpoÃÛÃpþÃ0DÃàýÃÀ ÃFÃPñÃpEÃÀ¯à ¦ÀÃ0PàsÃÀÃêÃ@ôÃpÚÃöÃ@îÃÐMÀïÃ@ Ã`ÑÃÃÃØÃð›ÃÐÜÃ`­à ÃP ÃðÃð³Ã`HÃP’Ã0,Ã`›ÃPàÌÀ~ÃÒÃÀÃPžÃð­à Ã0»Ã0µÃp]ÙÃ0¯ÃÀ£ÃÀ‘ÃP†Ã`ÅëÃиÃðô!ÃÉÃàhÃ0ÓÃÀÁÃÀ»Ãð§à ðáÃðÀ–à šÃ@Ã@èÃðÃ@wÃÀÁÃÕÃ0ÁÃààUÃ08àgÃ0ÁÃÃÃðÃðà[ÃàzÃFð ÀŠÃ@ÊÃ(Ãðà ‚ÃP÷ÃpÚÃàtðdà ÃÐÐÃp¼ ð^ Ã0PÃ0ÓÃà'ÃÐúÃ@wÃð³ÃpæÃêýÃÀ£àCÃÀ©Ã@SÃð ÷ÀÃpÎÃà\ÃÐÖÃÐSÃ¥ðóÃ(ÃÏðíÃPýÀ`!àÀà à ˆÃ@Ã0ÓðˆàÞÃPà ÿÃÀ©Ã0»ÃЬ ÃPzÃP†ÃPŒà ˆÃpÎà ‚Ã`­Ã(ÃLÃ0ÁðpÃ`$ÃpEÃð›Ã0ÁÃàýàUÃ@îÃàýÃàýÃàñÃ`6ÃpÚÃð‰ÃLÃpÚÃPzÃpKÃ@kÀ~ÃP’Ãð‰ÃàzÀÃ@Öà7 Ãöà ŽÃpàà )ÀlÃ@ÊÃUÃðÃ.à ˆÃиÃ0»À®ÃpuÃPŒà ùÃ"ÃPªÃÀ2ÃÐAÃ02Ã02ÃmàÒÃ` ð|Ã08ÃðÃÀ2Ã@ÃÃàåÃgÃÐYÃ@qÃPñÃ4Ã@âÃÀ,Ãàtà ç"Ã`Ã`Ãð§ÃsÃàbðdÃоÃÃ0ÍÃpÎàÀÃàtà ¸ÃÀ©àºÀ`!àUÃPÃ0£Ã@ÜÃ"ÀŠÀ¨Ãð­Ã`0ÃpàÃp]ÃPàÒàCÃ¥ÃànÃ@ÜàOÃà†ÃðàØð‚ÃÐÖÃ@qà šÃ`¹ÃPÃðÓ#Ã:Ãpìà ÃÐSÃàhÃ08ðÃàýÃPÃÐkÃÐîÃàÃð<Ãáà à ùÃànðŽÃÃ@ô÷ÃêÃÐ_ð¦à…àOÃ02ÃÐSÃà Ãð$ÃàhàU÷ñÃ`§àÞÃêÃàýÃpàÃ0PÃàÃüÃ`¿Àà[Ã@àIàÆð”ÃÐâðˆÃÀ2Ãð6À ÃÛÃàÃðHÃ0µÃPÀÃÐMÃÀ‹ÃUÃ¥ÃÐÖÃЃÃpÃäà  Ãp{ÃÀ2ð|Ã@îÃð¡Ãà€ÃPÃ0»ð à #Ã"ÃpKÃÀ©ÃÐeÃÀµÀûà ŽàÒÃ@ÃÀ»ýÃ@eÃÐâÃÐÖàCÃPÃàŒÃð¡ÃRðvÃð›Ã0JÃÀ8ÃàhÃpQÃ`!Ã(Ã4ÃP-Ã@Ãp{ÃRÃ02ÃPýðíÃÐèÃpæÃ@Ã0tÃ0ÇÃð¹Ãð¿ÃàtÀðšÃ…Ã02Ã@ÊÃ@ÜàäÃðÃàhàØÃ`×ÃÃà ˆà ‚Ãpàà ¦ðÃð§ðíà à Ã0ÁðvÃ`ÅÃàýÃàtÃäÃpàÃêÃÐÐÃàñÃÀ ÃRÃÀ©Ã0>Ãð§ÃpÃPÃ`6àØÃ4À ÃÐAÃpÚÃ08ÃàzÃP ÃäÃðÃFðùÃðàUÃpcÃð6ÃÛÃyàÒðÃ@ôÃPýÃÃà÷Ã:ÃPžÃÉÃ`­ÃоÃ@èàÌßà ”àÒÃðÃ(ÀrÃð­ÃXÃÐ;à |ÃPà ÃÀ,à ÃÀÃЬ Ãðw!ÃpEÃÐAÃÐeÃàÃÐYÃPzÃànÃPŒà Ãð‰ÃÀÀŠÃöàØÃð Ã0©ÃðƒÃÀ,àgÃ0ÁðáÃp9!Ã4ð ÃÐGÃpÈÃ`§ÃÀ‘Ãð$ÃÉÃð¡ÀZ"Ã`!ÃðÃLÃÐAðíÃàñÃP€àºÃ0,ÃPtÃ0DÃÃRðˆÃ`­àIÃÀ©ÃàñÃyÃ0©ÃpWÃPýÃpÎÃPñÃà ‚Ã`¡ÃоÃ0µðíÃð§à[Ã@kÃàbÃpWÃÀÇ!ÃpQÃFÃäÃÒÃÐMÃàëðóÃàbÃÀÃPzÃ`• ëÃÐ_ÀxÃUÀ~àäÃPðpðíÃpàÃ0ÁÃàbÃÐÄðùàÒà ˆÃ0©Ã@âÃиÃà÷ðÃ@èÃäÀlà àÀÃànÃ[Ã`§à ÿÃ@G ÃÀ—ÃÃÃàñÃ@¾!ÀûÃÐAÃÐÐÃ0>Ã`• Ãð} ðáÃgÃpàÃàhÃàtÃ`ÃÀ—Ã@SÃÀÃ`Ãðú ðçðùÃ`¹ÃÐÊÀõÃÀÃäëÃ0‹#Ã@ÐÃsÃPÃ[Ã@ÐÃàbÃÐGÃàhÃвÃp]ÃÐ;ÃвðvàØÃPðjà ˆÃàzÃ`ÅÃÀÃðè#ÃPÁ'ÃÀ£Ã0Çà ÃPÃêÃàñÃЬ Ãðî"ÃР"Ã@_ÃÀ©Ã@MÃÞÃUðÿÃ0ÙÃÐeñÃp]Ã0ÁÃpcÃP˜ÃÐÖÃPzÃpKÃpcàaà ÿà Ã`*ÃÀÃÀ2ðvÃð›à ŽÃp]ðŽÀ%À¢àäàÞÃÀÃ( ðÿÃpcà ŽÃÀÃ@YÀûÃànÀŠà Ã` Àrà ”ÃP Ã"Ã@âÃmÀ„à Ãp? Ãp¼ ÃðÃ`­ðvÃpcÀ´Ã(Ãðð ÃÀ»Ãð*ÃÐÐðíðvÃÐYÃÏÃ@èÃÀ£Ã@Sà ˆà ÃRÃ4à |Ã`¹Ã"Ã@âà  ðÿÃ`¡À„ÃÐâàÌÃPzÃpìÃàhÃÐÄðdÃäÃ:à Ã0JÃpQßÃð¹Ã@wÃP Ã0g)ðÕ!ËÃÐ_ÃaÃpcà ¬ÃPÃLÃPë à Ã0"ÃFÃ@èÃÀÃÀ8Ã`ËàêðÃ`NÃ`§Ãp¶!ÃpKÃ@ƒÃ`NÃÀ8ÃðÃÐGà ˆÃmÃÐÄÃpæÃÐÐÃ:ÃgÃÀ,Ãð›ÃÐÄÃP’Ã4à ¬Ã^Ã0©Ãðk#ÃàbÃÃ@qÃÉÃ0,ÃÉðóÃвÃÀ»Ã@}ÃçÃ0ÙÃP†àÞà ¸Ã`ËÃ0ÍÃ.ÃàtðdÃÃàØÃàåÃ0µÃÀ&ÃüàgëÃpÎÃðƒÃÐÐÃÃÃÃpòÃ0PÃFÃð*Ã`0Ãà÷ÃaÃàßðvÃPzÙÃð­à )Ãp{Ã0\à #ÃÃPðˆÃðÀ~ððÃà÷Ã@SÃàëÀûýÃÀ‹ÃÀ2ÃpòÃà˜Ã4Ã0DÃðÃÐ5Àã Ã(ÃàýÃFÃÕÃà\Ã`›ÓÃðƒà ˆÀ~À–ÃàëÃ@_ÃÀ&ðÿÃmÃ`<ÃÀ,Ã0JÃ…Ã@‰ÃÀÃpÈÃpàÃЬ à ‚ÃÐSÃ@eÃ@ÜàOÃÐÐÃ0>Ãpàà í!ÀûÀÃLÃPÃ@Ã`¿Ã`¡à$Ãð*ÃÀ,Ã`*Ã`BÃà€ÃÀ>Ãð•Ã`³Ã`›÷ÃpKÃ`­ÃÐ)!ÃÌ Ã°vÃ`­ÃmÃ@âÃ( ÃàtÃÀàÀÃyðvÃÀ—àÞÃ@kà ŽÃÐ5ÃêÃp]ÃÀàÒÃÀÃàÓ Ãð‰Ã`›ð|ÃððáÃðÃ`BÃàtÃð$Ã`¡Ç!ÃPh!ÃðÃÀ,ÃC"ðùÃð*Ã@eÃØÃ0¯À„ÃàhÃÀ—ðóÃðàÌÃ(à šÃ0Jà ó Ã@A!÷ÃpWÃàñà ÃpàñÃöÃaÃàßðvÃmÃÀ©ÃFÃPÃäðvÃ°Û ÃŸÀ„Ãð‰àÒÃLÃ`­ÃÐAàØÃ@eÃPà šðjÃ@ÖÃ`¡à ÿàÀà ˆÃ@YÃ4àÌÃ0¯ÃàbÃÀà ÿÃàbðjà á#Ã@¾!ð½%Ãðk#Ã4Ã0 ÃÀ‹Ã=#ÃàJ"à ÀïðáÃÀ‹Ã02à Ã@¾!ÃpEÀrÃ@_Ã0&ÃÀÃ.àØÃ.ÃÐSðvÃÀ Ãà€ÃàtýÃðÃpKðpÃpKà=ÃÀ©Ã0>ÃP†Ãð ÙÃpEÃÀ!à p!Ã0ÇÃmÃ0,ðóÃFÃànðóÃ0µÃ` "Ã`›Ã(ÃàñÃÀ!Ãð ðóàÀÃ"ÃFÃÀ&à ‚à À„Ã`³Àf Ã` "ÃpÈÃ`³ÃÏÃP˜Àf à |ÃRðjÃ0©ÃÞà ‚ÃLÃÀÃ@G Ã0»ÃÀ>ÃP†ÃàIàUÃ0Áà ŽÃPtÃÀÃ`¡ÃðÃPŒÃ0»Ãð¡ÃÐAÀ–Ã:ÃÉàÞÃÀ&ÃðÀõÃà÷Ã.ÃpÚÃð§À~Ã`³Ã`ÑàÞÃÀ,ÃÀ¯Ãð›ÃÀ©àÒÃ0\Ã0ÁÃ@Ã`­ÃP Ãðà ÿÃðàØÃànÃð*Ãsð ÀÃ0ÙÃànÃàýÃP ÃpKÃð¡ÃàÃÐYðŽà šñÃ`›ÃÀÃyÃ.Ãð¹ÃÀDÃ4ÃðÃaÃ0,Ã@ÜðL#Ãàhà ‚ÃðÃ@ð‚Ã.ÃpcÀ ÃÐâÃàýÃPh!ÃØÃÀ8àÞÃ@YÃ0,ÃgÃaÃà†àÞÃ`BÃà€À–ðpÃÐ;Ã4ÃàhÃp? Ãðú À~ÃFÃpÈÃp9!ÃgÀÃàtÀõÃpàÃà Ãð¹ð Ã` à ó Ã0©Ã"ÃpEÃPÃ0¯ÃðàUÃPŒÃðÃð‰ðáÃ4ðóÃÐ5ÃàÁ#à=Ã@ðvÃ@;"ÃPÃ(ÃPzÃÌ ÃÐGðùÃð§Ãà€àOÃ@YÃ@MÃàåÃð$ÃÀ»Ã@eÃmÃÛð‚ÃÀ‹Ã(Ã@eÃ`§à®!ðíÃ@MàÒÃpæÃ0©Ã0!ÃO à Ã0µÃ`§ÃÀö"Ã`¡ÃÀ&ð|Ã02ÃPzàÆÃ@¾!Ã`›Ãð} à¢#Ã@ÊÃàtÃÃI!Ãp3"Ã@Ä ÃÀ!ÃpEÃÀ"à´ ÃàåÃ`!Ãp¶!À~Ãð‰Ã0©ÃpÈÃp¼ ÃðÃP’Ã`$ÃðÃÐÖÃ`­ÃÐAÃÒÃ`• ÃÒÃp¼ ðÕ!ÃÃ`­ÃàÓ ÃàÍ!ðÏ"Ã@ÐÃà\Ãà\àÌÀ~ÃP÷àUÃÐGà ŽÃ`<Ã@eà ”ð‚Ã@Ãð­ðçÃÀ‹ßà à àºÃ`¹Ã:Ãp? À~ÃPÃaðíÃàåÃ@_Ãp]ÃpÎÃÐMÃàhÀÝ!ðùÃpWðdÃ`›ÃÐSÃÐâàØà Ãð•Ã@YÃ0DÃ`ËÃÕÃà ”Ã0>ÃPÀÃð ÃP€ÃÉÃmÃpÈÃÞà ÃÀÃÐSÃ0ÁÃFÃð•à ”ÃpÚÀïà1!ðvÃPñÃàOÃð ÃÀÀ„ÃàzÃsÃ"Ã@_Ã"!ðdÃð¡ÃÀ£ÃððùàÆÃüÀ àUÃPŒÃ08ÃüÃð6ÃöÀ„Ã0ÁÃÉÃÐÄÃÐMÃð•ÃÐÄÃ0JÃ`BÃ(ÃpÎÃðÃÏðóÃ`ÃÐ5Ãà\à Ãðà ”ÃðÃÀÃàhðùðˆñ÷ÃÀ8àgÃ02ÃðÃÕÃPå!ÃиÃ0ÓàØÃÐYàOÃÐSÃ`BÃàbÃÀ£Ã"Ã0 ÃaÃð$àsÃà÷ÃÐMà šÃmÃð¡ÃÃÃÀ&Ãð›ÙÃpiÀ Ãð‰Ã(ÃgÃ°Û Ã·Ãp{ÃÐÜÃàtÃpàðùð|ðùÃ^Ãð<àêÃpàÃaÃpÚýÃÀ ÃÉÀ Ãà\ÃÀ&ÃPžÃ0µðíÃ0ÁÃP!ÃàŒÃyÃêÃà†ÃXÃ0ÙÃ@Ã`HÀ–ÃðÃ`§Ãð¡Ã0ÇÃPÃð$ÃÀ÷ðÃöÃêÃsÃ0VÃ0ÓàÞÃÐMàmÃðÃjÃP¶ÃðÅð”ÃPŒÃð¡Ãà†Ãð6ÃpKÃÃpcà ”Ã`ËàÃàžÃ0åÃ@èÃðÿÃ0»ÃÀÀà…ÃàŒð‚ÀœÃ@}Ã@Ãêà šÃðBà GÃFÃàtà Ãð›ÃpiðšÃ@eÃ`ÃÐSÃêÃPÃÐMÃ0ÇÃÐâàðÃÃP'ÃPð”ÀàÒÃÐÖÃÐAÃð³Ã@èðpðÃàÃ@ƒÃÀÇÃÉÃàåÃ0,ÃöÃpoÃPžÃÐâÃ0bÃpÃÀ2à àØÃðÀ ð ÃÐeÃgÃ0µÃpÚÃÐÖðùÃ`0ÀÃ`HÃ@ÀÃP’Ãð¹Ã0VÃp{ÃÕÃóÃÐYÃàzÃÐ_àsÃíàgÃFÃ.ÃÐú÷Ã@úðˆàØÃpÔÃ@Yà )Ãð¡Ã@wÀ–ÃpWðùÃsÃð³ÃçÃpøÀ%ð‚ÃüÃÀ&ÃÃXÃ`0ÃPŒÃpcÀÃPÃ0»à Ãð¡ÃLÃ`0ÃÀ£ÃÃðÅÃÐ_ðŽÃP’ÀxÃàbÃàåÃàåàÌÃ@ƒÃÀVëÃÐÖÃÐâÃÐÜÃjÃÀbÃÀÁÃ`÷ÃÐYÀ à  Ã@kÃðÃð­ÃP9ÃàzÃàV ÃоÃ`BÃð­Ã@Üà ˆÃÐAÃàÃàýÃ@}ÃFàØÃÐ/ Ã@eÃð6ÃLÃð<ýðÿÃ(Ãðú àOÃðÃP˜ÃÀÓÀ7Ãp‡ÃP†Ã¥Ã4ÃÀ&÷à ²ðÃð•Ã@úÃ0ÍÃyÃ0PÃð­à ¬ÃÀ2à ˆÃàëÃpìÃÀ©àaÃXÃ0ÁÃÀ£ÃððÃÀÁÃÀ8÷ÀðÃ`¿Ã`¹Ã0µàÞÃ@úÃpøÃÐkÃвÃäÃиÃpQàÒ÷ÃpQÃ@Ã.ÃPñÃÀ,Ã0¯Ãêà ÃpàÃêÃ02ÃÐYÃÀµÃöà ¸Ã‘Ã`NÃð›ÃP÷ÃP˜Ã0ÇÃêÃ0ÁÃ4ÃpEÃ`BðˆÃ4ÃÃÀ‘ÃpQà Ã`BýÃ@îÃÐ5ÃÀ,ÃÐÐÃLÃPŒÀ~ÃçÃ,À¨ðjÃöÃÀDÃ`ZÃPžÃÐÜÀÃÀ2ÃÀ©ð‚àêÀ„à ‚Ã`­ð|ÃpoÃÀ à ŽÃ`<ÃüÃÐâÃð¡ëÃpÚÃLÃ`NÃ@îð ÀûÃÉð ÃÛÃà!à Aà )Ãð$àÞÃÉÃLÀ„Ã0©à ”ÃÃÐeÃXÃpøðð¦Ãð­Ã…ÃpþÀ%Ã0\Ã@îÃÀ£ÃÐÊÃPÃàŒà ¾Ã@ð‚ÃÀ,ÃðBÑÃ@Ãð0ÃÐMÃÃÃÐ_ÃоÃ0ÇÃp×ÃÀ»Ã0ÁÃêÃÐÐÃ^à  Ã`HÃÐYÃüÀœÀœÃpþÃð0ÃÃ^ÃÐÖÃ`ÅÃ@ÃsÃð6à ¸ÃÀVÃ0Và )ð Ã`ËÃ@kÃÐÜÃ@Ã0bÃjÃpìÃà€àØðùÃ0DàsÃíðŽÃöÃÐYÃ`TÀœÃà˜ÃÐâÃ0ßÃÀ,ÀŠÃ`Ëà ¦ðÃàëð|ÃÐqÃ0n×Ã:à ”ðŽÃÐkà Ãà /Ã.Ãgà ¦ÃpøÃà’ð¬ð#ÃÕÃpìÃÀÇÃ``ð ÃÀÇÃ@ÃáÃÃð<Ã@}Ã`Ñð¬Ã`ãÃ0JÃLÃ^ÃPÎÃP°ÃÀ2Ã` ÃÕÃüÃ`ÑÃ`lÃÐwÃ@ÃpìÃЬ ÀŠÃ@•Ã`­Ã^ÃpþÀ¢ÃÐâðvÃ0JÃð*À–Ã`ËÃPªÃÀµÃ@ÀÃ`BÃàtÃàžÃdÃàÃÀ©ð‚ÃpÔÃÐMÀrÃ0»Ãà†À„Ã`§ÃPb"ÀZ"à=ÃðÃ`0Ã`6ÃЬ Ãðw!à1!ÃPzÃð§ÃÀÃ°Û ÃðƒÃ0>ÃêÃ08Ã@Ä Ãðƒð^ Ã0 ÃPzÃ@kÃ`!ÃÀ ÀõÃaÀlàUÃÀÃ@G à1!à í!ÃPÃPÃàßÃ0 à ”Ã( ÃÐÐÃàñÃð›Ã@SÃp9!Ãp¼ ÷Ã08à ùÃ`§Ã0&à ç"Ãðè#Ù"ð^ ð|ÃÃÀßÓà ˆÃÀ ÃpEÃu$à(ÃðÃà€ÃðÀZ"ÃÌ Ã°X!ÃPÓ$à ÃðÃвÀõÃpÔÃÏÃpÂÃ=#à¢#ÓÀrÃ0&ð^ Ã`!Ãu$Ã0 ÃpKà  Ã@G Ãp'$Ã"!Ã` ðX!Ã¥ à ‚ðÕ!ÀïÃ` ÃPn ÀÝ!à ŽÃPzÃ@¾!ÃC"Ã` ÃÐÐÃð•ÃPn ÀlÃÐ#"ÃP÷ÃPå!ÃÀ‹Ç!Ã`!ÃÀÃàÆÃpÂÃ¥ ðíàêÃÐAà%Ã`!Ãð} Àf ÃÀ Ãð ÃPn Ãp°"Ãp9!Ãðú à¨"ëÃÐGÃp°"ÃàJ"Ãðô!àºÃPb"ÀT#ÃиÃPzÃоÃð à ó ðÏ"à¨"Ãðô!ÀT#ÀlÃðëÃPñÃþ"Ã` "ÀïÃàÓ Ãp¶!ÃàÙÃO Ãpª#Ãðè#ÃÀy"À`!à v ÃðƒÃPñÃ0&Ã0…$Ã0‘"à |Ãð›Ãø#à$Ãp9!ÃPn Ãðú ðóÃ4à v à ÃÀ Ã`ÃÀ!ÃpÈÃ"ÃÐ$Ã@Ðà ÃàÙÃ` ðóÃà÷Ã[Ã0£ðR"à ÃÀ ÃÀ ÃÌ ÃpÂÃ0©ÃÀ!ÀÝ!ÃpKÃð Ãð ßÃUÃð‰ÃÐ;Ã¥ÃaðÕ!Ã@MÃ@èÃÐYðvÃpEàºðíÃð›ÃFÃpÈÃ@¾!Ãðî"à |ÃpÈà ó Ã0µÃP†Ãð<ÃpÈÃð_%ÃsàaÃàzÃÐeÃððX!ÃpKàCÃÀÃpàÃÃà ŽÃpKðóÃ@Êð@%à á#ð^ Ã`*ÃÀð#Ãp-#Ã0ÁÃàtÃ0 ÃÀ… àºÃÀ‹Ã`}$Ã`w%ÃpÂÃ`Ã`›ÃPn ÃP†àºÃð ðçÃÐ;ÃÀàÌÃð•Ã`!ðpÃànà[ÃpÎÃp? àCà ŽÃÃ(Ã0»ÃöÃ@_Ã@ÐÃ4ÃP÷ÃðÃ@MÃ0µðpÃpÔÃðÃpÈÃ`¹ýÃð ðóÃPzÃð$ÀÃPÀ`!ÃÀ Àã àÌÃäÃиàÆÃÐÄà ŽÃÐÊÃPýÇ!ðvÃàÙðpÃÀ&ñàmÃpcÃP'ÃÐSÃ@ƒð/Ã:ÃðƒÃ`§Ã@ÃpÔÃO Ã0!ÃÀà ÿÃÀà=à1!Ã`#ÃPñÃàV Ã08Ãp]ÃðÃ@îàêà ð‚ÃêÃ4àÌÃÐMÃðÃÃÀïÃðƒàØÃ`BÃð¡à ˆàCÃ`6ð|ðùÃ@SÃpÚðíÃRÃaÃ`0Ã@kÃ:Ãà÷À–ÃðÃ`0Ã`¹ÃÀ¯ÃpKÀ~Ãð§ÃmÃÐkÃ0VÃÏðjðpÃpæðvðóÃP\#Ã@;"ðjÃÐSÃà€ÃPýà ÃÐ/ Ã0&ÃÀÃ@eÃ`*àÞÃÀÃ0,Ãð} à®!Ã@ÃÐGÃà€ÃpìÃ0£Ã@ÜÃüÀÃ`ÑðùàaÃäÃÀ—Ã`­ÃÐAÃgðíà ŽÃ¥ñÃ0µà p!Ã`‰"ÃPtÃ"ÃÃpàÃmÃÐ/ ÃàñÃð*ÀÃpQÃÀ‘Ã0#ÃðÃ°Û Ã™ÃàßÃÀ… Ã¥Ã`BÃà€ÀõÓÃpÚÃà Ã@èÃ`³à v ÃPŒÃ`¹àÀÃ@qÃà€ÃpcÃPn àIà ÿðáÃà÷ÃPÃ0>à ŽÃ@îÃpWÃ"ÃpWàOÃ0 ÃÐÄýÃ(ÃP€Ãp]ÓÃpKðˆÃÐÄÃ¥à !àCÃPÃÃð›ÃÀ… àCðpà=Ã4ÃÐ_ÃP˜Ãð¿ÃÐèÃ`ÅðÃð›Ã@àUÃ`§ÃвýÃ¥ ÃÀðçÃÀÃ`¿ÃàýÃ0ÁÃ`Ãð•Ãàëà  à[Ã`HÃÉÃànÃ.Ã:Ã4ÃÀ£Ã@_ÃÐúÃRàºÃоßëàOÃÀ¯ÃÀÃ( Ã@ÊàÞÃððÿÃ0ÁÃpKàÌà ÿÃð‰ÃвÃàhÃ@ÃpþÃ@wÃ@ÜÃàåÃpàÃP¤À~ÃpÈÃð ÃàñÃPð‚Ãð›Ãp]ßÃ¥ñÃ02Ãð›ðÿÃÃÃp]ÃиÃ0!ÃðÃð ðvÃpÎÃ0&Ãð§ÃäÃ…ÃÀ,à Ã@_ÃyÃRÃPð”ðÃÐMÃàØÃpQÃàëÃêàöÃpÃÉðÃ(Ã¥ÃÕÃpæÃàýðóÃ@qÃ0JÃÐÖÃÀ ÃP€Ã@YÃÐMÃpQÃàñÃ@ÜÃÀ£à ÃpÎÃP’Ãð­Ã0ÍÃ`³Ãyà ÃP÷ÃPŒÃ@úàIÃp? ÃLÃÐqàsÃÀÃÀ2Ã@qÃmÃðÃðà |ÃàßðóßÃð¡ÃÐMÃоñÃð0ÃÐSÃPýÃÐÄÃÐâð àºÃPzÃ@ÜÃ.ÀÃà ÃÐâà ÃàñÃ"÷Ã0µà #Ã0»ÀŠðà àÒÃpcÃÃ0»Ã@kðÃýÃà Ã"Ã0>Ã@ÃP˜ð‚÷Ã0&ÃäÃÐÖ×ÃÐGÃPÃ0ÁÃP Ã0VÃà÷ßÃ@kà 5ÃP'Ã@ôÃÛà[Ã@ßÃ`¹ÃÀ Ã`*ÃÐÐÃÐMÃpÂÃàßðÿÃpiÃp]Ã`¡ýÃÀ£ÃÀÃ(ÃyàmÃð›ÃLÀ–ÃP¤à  ðÿÃPýÃ08Ãð¹à Ã@ÖÃ(ÃàŒÃ@wÃÃð$Ã@ôÃPÃÀ Ã0>ÃpÂÃ0µÃ@è÷Ãà†ÃpøÃpþÃyðÀÀŠÃpKÃÀDÃP°ÃpòñÃà #ðÃ@_ÃÀ"ÃpÈÀxà ÄàÃð<àaÃÃÃààöËÃàÃ`Nð àÞÃP¶ÃRÃP˜ÃðÃÉàmÃpoÃ:ðŽà šÃÐ;ÃÀÃpWàØÃXÃ0µÃðô!Ã0»ÃðÃ4Ã`³ÀÃpEàÒÃpìÃPŒÃpÚÃ@âÃ`ËÃ0ÍÃÏÃRð‚ÃÀµÃÀ»à )Ãà†ÃÀ‘ð^ Ãð0Ã@YÃð‰ÀûÃpæÃð³à ¦ÃðÃ`¡ÃÐÖàÒÃð•àaÃàhýàäàaÃP-ÃyÃà€ðÿÃÐAÃ@MÀxÃO ðX!Ãà÷Ã@ÃdÃÀ Ã08ÃgÃð¡ÃÐGà AÀ–ÃüÃàñÃ¥à7 à Ã@qÃ02ÃI!ðóÃ@_Ã@úà À~ÃðÀ`!ÃÐ;ÃðƒÃð à ðÿÃànÃ0DÃ"àOÃàñÃðÃ02ÃÀ—Ãð‰àêÃÕÃ:Ãpcà ÃFÃPŒðíÃÐGÃànÃð›à v ÃàåÃà Ã`0À~ð‚ðóÃÀ,Ãð›Ãp9!ÃÐ#Ã0£à )ÃPžÃÞÃÀÃðÃ@Ã@_à à ÃàñÃàbÃàýÃÐ5ÃP˜ÃðÃð›ÃÏÃLÃÐÊ÷ÃàåÃànÃ`¡ÃàP!Ã@ÐÃÃ@}Ã`¹ÃaÃÐSÃ@âÃàëð Ã@kÃPzÃp9!Ã@ÜÃÃ@îÃÐYÃ0ÓÃÐâà ÃР"ÃðÃÀ©ÃÀ‘Ãp]Ã`BàÒÃpÈÃpQÃPŒÃÀ‘ÓÃÀ ÃànÃàÃà Ãöà Ã0ÁÃØÃPýÃpEÃ+&à®!ÃÏÃÃÀ‹ÃÀ2Ã`BÃàñÃpWÃêÃð•ÃÉÃpÈß!ÀlÃиÀrÃO Ã`• à |ÃðÃ@ÐÃmÃp]ÃàßÃ@Ä Ã ´ ðvÃ.ÃÀ Ãðô!àÀÃÀðpÃpQÃp9!Ã`¡ÃpÎÃàßÃ[ÃÐMðvÃ@ÖàCÀrß!Ãp? ÃÌ ÃàbÃ@MÃ"ÃÀ‹ÃÀÃÐGÀf Ã0#ÃÀ‹ÃÀ—ÃpÚÃ0…$Ã0%Ãp9!ÃàÍ!À–ÃöÃ0‘"Ãðq"à Ãð$Ã@úÃpQÃ@ÜÃ@ÃðÃ@kÃpÔÃÃ02Ã[ÃPë Ã`ƒ#Ã0!ÃP†à ó ÃÀ‹ðçðvàIÃðÖ&ÃР"ÃpKÃàV Ãð Ã¥ÃêÃðÃaÃ0£ßÃ@Sà7 ÃàV Ãpcà ”ÃØÀ`!à ÃPñðpÀõÃpQÀ~àºÃàßÃPýÀÀÃP†Ã`›Ãà\Ã0¯Ãð›Ã`$ÃPë ÃUà%#ÃPh!à=Ã`<ÃpWÃÐ;ÃàßÃp? à ˆÃ@MÃ0 ÃØÃ"Ã@ÜÃÞà !Ã@èÃP÷ÃàbýÀÃàtÀÃ0©Ã`›Ã@ÊÃpWÃ` Ã$Ã`Åà ¬ÃP Ã0,Ã`!à ùÃ7$ÃàD#ðjà à´ Ã`³ÃÐ)!à+"Ã08Ã`×Ã@ÖÃpª#ÀõÃ0—!Ã0©ÀûÃ`$ðáÃÃÐ/ à v à Ã`!Ã@YÃÀÃpKðùÃÐÄÃC"àØàÌà j"ÃÃðàºà j"ðÕ!àÀÃØÃð} àgÃÐÊÃà ÿÃmÃpQÃàßÃu$ÃP\#Ã:ÃÀ—Ãðî"Ã0 ÃpEà X%Ã@¾!Ãð ÀéÃp3"Ã@_ÃFÃ`*à v ß!Ã@;"ÃÐ;ÃPzÀûÃ@5#Ã0"ðL#Ãðè#Ã0©Ã@ÊÃÐ;ßÃØÃð‰Ã#Ã`#ÃàÍ!Ã{#à%#Ãðô!Ãp¶!Ãp9!ÀÃp¼ à ÿÃÀ… ÃÀs#Ã@²#Ãðè#à=Ã0¯ÃÃÃpÎÃ¥ Ã@¾!Ã`#ÃÐ;Ã4à1!à á#à®!à í!à šÃp3"à ç"Ã0…$Ãðî"ÀÝ!Ãp¼ ÃPtÃ@¸"à ^$ÃÐ;ÀrÃò$à í!à ÃPtÃp¼ Ãð àºëÃ@Êà ‚ÃÐAÃ0 Ãp¤$Ã`‰"à[ð^ àŠ'ÃÀð#Ãp'$Ã`ÃI!ÃÐ5ÃÐ5à ˆÃpÔß!Ã@;"ÃÀs#Ãðâ$Ã"ÃàÇ"Ãì%ÀÅ%à Ãà\Ãð‰Ã@YÃ`¡ÃР"ÃPn ÃðƒÃÀö"ðdÃð$ÃP ÃP÷ÃÀö"ÃÀÒ(ÃЬ Ãðô!ÃànÃLÃp]ÃI!Ã.ÃpÈðdÃàJ"Ãðw!ÃpÔà šÃ`ÃPÙ#ÃPýÃpQÃ0 Ã0 Ã02Ãðô!Ãà2&Ã0!ÙÃpKÃpQÃ@}Ã0¯Ã0‹#Ã@¾!ßÃP€ÃÐ;ÃàÙÃp9!Ã0 ðáÃиà®!ÓÃàÍ!Ã4àCÃaðÕ!ÃpQÃ4ÃÞÃ`!ÃÐ#Ã"Ã¥ Ã`!ÃÐ#Ã@ÊÃÐ;ÃpÂà v ÃpÂàÌÀïÃðq"ÀlÃàßà Ãp°"ÃàD#ÃÀs#à í!àÆàIÃàÇ"Ãà»$à¨"Ãp¼ Ã0"ÃÀ!à v ÃàV Ã0 ÃpEÃÀ‘ÃPn à1!ÃðÃ0,Ã"Ã@A!à®!ÃàÍ!Ã`!ÃðƒÃ02ÃpQà+"à+"Ã¥ Ã@ÜÃàßÃ02àOÃ@Üà7 à=ÃI!ÃðÃðƒÃP\#ðÕ!à7 Ã@ÜÃàbÃ@;"àºÃðƒðóà ðáÀrÃPzÃ.Ã0,Ã`$Ç!Ã@Yà à ëà j"Ã0&Ã02ÀN$Ãðî"ÃàßÃàhÃ:ßðjÃ@Ä Ã !ÃO ÃÀ—ÃàßÃ0»ÃàhÃÐÐÃð›Ãp¼ Ã`ú$à p!ð^ ÃàßàÆÃ`ƒ#Ã`• ÃàP!ÃpÂà=ÃpÎÃsÃ0"à%Ãp9!ÃðÃ0¯Ã`§Ãà Àà ùÃ`¡Ã`­ÀéÃ¥ÃÀÃиÃpEà ”ÃÐ5à ùðíà ŽÃ0"à Ã` Ã(ÃgÃ@ÐÃÀy"ðdÃ08à Ã0>ÃPŒÃÐÊÃ¥ÃàhÃÐ;ð‚ÀÃÕÃmÃ0»ÃÐGÃðÃPtÃÐ;Ã@eð|Ãð$ÀÃP˜ÃRÃP°ÃÐMÃàP!ÃðÃà Ã@}à àIÃоÃPýÃ0 ÀÃ`<ÃÐ;Ãp]ð|À¢Ã`0Ã0>ðŽðùÀlà[ÃÐAÃð›ÃÐ#ßà Ã:ÃÞà Ã@èÀ~ÃPÃPÃ@Ã:à ÃRÃ¥ÃÐîÃÐèÃ@ÜðdÃÃÃPýÀÃ@ÃÀ,ÃpÚÃÏà ²àÀÃ#Ãðƒà )ÃüàmÃÐeÃPÃ0>Ã@ÜÃÀ ëÀÃpÔÃ02Ãð ÃP˜Ã0DÃPðùÃ`­ÃyÃØà ”÷ÃàtÃ@_ÃоÃPn Ãp¶!Ã08ÃêÃ`<ÃêÃàhýÃð6ÃÐ_à ÃyÃ0DðÃàßÃð‰ðdà ÃP à1!ðÕ!Ã:ÃÀµðvÃð6ÃÐÊÃð•à ”Ã`6ÃFÃpWÃ0»ÃPýÃ0£ÃÀ‘Ã`ÅðÿÃÐ;Ã0»Ã¥Ãиà ”ðˆàÞÃ.ÃàÓ ÃÐÊÃP ÃPtÃ@MÃðÃ`¿àOÃPàÞÃàñÃ0ÇÃPÃð›ýðˆà Ãð³ðŽÃàñÃ0—!Ãðw!ÃÐ)!Ã0©ð|ÃP’ÃÀ… ðjÃ"ÃÐGÃÀÁà 5Ã@qÃLðjÃØÃÀ ÃÉÃà€Ãðƒà1!Ã`ðùÃð$ÃÐYÀûàÌÃmÃànÃÐMÃÐÖÃ0Jýà ùÃð•Ã@qÃÞÃÀ‘ÃÀÃðƒðíàäÃð¡Ã0>ÃFÀÃp]Ãàb÷Ã0JÃàë÷ÃpÎÃ02Ã0ÇÃ@_àCðùà Ãà€ÃÐMÃðƒÃÕðÿÃpÎÃÏà ¬ÃP à  Ã‘ÃÐeÃðƒÀrÃ"ÃpÚÃðð‚Ãð0ÃpàÃpQÃÃÃP˜à=Ãðô!Ã0#Ã4ÃÀ©ÃÐÜÃð­Ãð$Ã0µÃ02à ùàÒà Ã@_ð Ã4à ÃÀ2ÃÐâÃ0>ÃpcÃ0¯àÒÃ(ÃÀ&à ŽÃp¶!à  Ã`TÃà€ðdÃPtÃð¡ðùà /ÃàëÃpQðóðíÃäà ÃàzÃäðùÃÐ;ÃàßÙÃ0¯Ã0\Ãà†÷ÃоàCàgÃÀ2à šÃÐÖÃð Ã0»Ã`6ÃP†Ãpìð‚Ã02Ã@SàÆÃ`6à ¬ÃP3ÃÀ£ÃP’ÃðÃÃPà ”à ÃÃ@ÃàñÀ„ÃP¤ÃÃpcÃàýÃP’ÃP!ÃÃ@kÀÃPtà Ã@wÀœÀã ðóÃÀ Ã0PàÃð<ÃmÃ0Áà ˆÃÐÜÃ@kÃÃP-Ã0DÃÐÊÃ`*ÃÃÀµÃpiðpÃ0&ÃÌ ÃmÃüÃ`­ÃÀ—ÃLÃÀ,Ã0DÃpWÀð)ÃP¶ÃÀJÃ@eðpÃ@èÃÐ_ÃÛÃ0ßÃ0ÁÃ:àaÃLÃàhà ‚Ã@ÖàÌÃ`HÃÀ&ÃÉÃ`*Ã0åÃP°ÃÐGà ŽÃÐèÃ`<à ¬ðšÃÀ,ÃÐSßÃpÚàOÃÐGÃÕÃÀ©ÃàtÃ0ÙÃjÃ`Bàäà ²ÃÐâÃÐ;ÃÀ ÀÃpÃÀÁÃÀ¯Ã`ÑÃÐÊÃ:ÃÀµÃð<àyð”ÃpÈÃðÃ@_ðpà[Ã0ÇÃPžÀðšÃ…ÃÀ£ÃÏÀ¨ÃàŒà´ ÃÐAÃÐSÃpuÃÐqÃ`BÃ"ðçÃàåÃP˜ÃPÃð­Ã0VÃ@ÃÃÐkÃêÃÐkÃpæÃÀ2ð|à ÿÃÐâÃÀ©Ãð à ‚ßà #ÃÃð¹Ã`TÃ`TÃðà àäà )À%Ã0ÙÃ…ÃÐÜÃ`Nà |ÃpWÃ@qÃ0ÍÃàëàsÃ`TÃpcàÒÃÐâÃÃmà[Ãà )Ã@ôÃáÃpiÃÐèÃ…ÃÐYÃ`ZÃàð”Ãð0à ¦Ã`NÀÀ¢àäÃ`¡ÃànÃpÎÃpàðÃð ÃP†Ã—Ã0ëÃð*ÃÐÜÃPžàaÃÐèÃdÃ0JÃ0PÃðà Ã@eÃÀ2Ãp àöÃpìà ²ðÃP!ÃÃLÃP!àmÃÀ ËÃÃ`HÃÀ2Ã@îÃsÃà€Ãð§ÃÐGÃàëÃÐeÃÀ¯Ã@wÃ`ËÃÐÊÃ4Ãà†ÃPªðà  ÃàýÃàÃ@}Ã``ðšÃpWÃ4ÃgÃ0ÓÃ…ÃsÃP†ÃÐeÃÃàÞÃÀ ÃðÃÃÃÃ0JÃÐÜÃàýÃP÷ÃpÚÃ`BÃöÃpìÃð•àÞÀœðÿÃP˜À1Ãà˜ÃÐGÃp? ÃÀ©à ”ðóÃàŒðíà ÃÐYËÃ`ZÃÐ}Ã0JðpÃðÃRà Ã.ðvÃpìÃ0ÍÃàÃÏÃóÃLÃ[ÃàðÃÀ2Ãð§ÃÀ2ÃÐèÃ0»àgàÃP€Ã.Ã@qÀ–ËÃÐSÃ0©Ã@ÐÃÐAÃÐ5ðpÃØà ÿÃPÃð‰ÃRÃàà ¦àgà À ÃöÃP¤ðˆàÌÀÃêÀÃ4÷àaÃð ÃÃP\#ðóÃ0PÃmÃpEÃð} àÌÃ0»Ã@úð|ÃÐAð^ ðjÃP†à[Ã(Ã@_ÃPtÀ„ÃäÃ:Ãðð ÃðÃêÃÀÃÀÃ0ÇàÞÃPýÃ0 ÃÐ;à ”Ã@kà®!ðçðçÃPýÃLÃP¤ÃÐSðùÃ`<ÃàÃpQÃPzÃà\ÃÐMÃpÚÃ"!ÓÃÀ‹ÃØà Ã`¿Ã0»à ŽÃpæÃ0VÃÏÃÐSÃ`TÀÃÀ£Ã`¡ÃpKà ˆÃ0&ÃÐâàgÃðÃ0»Ã0»ÃðÃà ÃäðdÃоÃ0ÍÃàýÃÀÃp? ëÃ:àðÃÐâÃÀµÃP!Ã@wà  Ã0¯ÃpÔà ÿÃêÃ`ËÃà’ËÃP˜ðŽÃP°àOÃÀ‘à šÃPð‚à šÃÀÃpWà à ˆÃÐAà ”ÃàñÃ`<ÃàýÃpcÃ@kÃ@MÃÞÃÐÐÃÐÖÀŠÃ`¿ÃÀ»ÃÛÃ0J÷ðùÃ`*Ã`<Ãpcà Ãð•ÃØÀÃðÃmð ÃÐqÃpÚÃ0ÁÀÃ.ÃðÃPÃPžÃÐSàØà ðóÃàÃÐÐà ”ëÃÀ—ÃÐÖÃ@îð‚Àïññà ²ÃÀ,Ã@îÃ`›ÃpÂÃÀÃàŒÃpÃ@Üà ÿÃàzðÿÃàßÃyÃ`HÃP Ã@MÃP÷Ã`0ÃpÎÃ"Ã.ÃöÃðÃàðùÃàzàOÃpÈÃPýÃànðçÀf à ŽÙÃðñðjÃsÃpÚÃÐ_À¨ýëÃPÍ%ÃP†Ãð0ðùÃpøÀÃð›ÃP!àöÃоÙà Ãà÷à ÃàýÃyÀ„ÃÀÃmÀ+ðÃ`ÅÃ`<ÃÀ—Ã` "Ã02Ã@_ðR"Ã0&ÃÐÄÃðÃ`<ÃÐAÃ`§Ã0JÃÀÃ¥À~Ãð¡Ã@_à ÃàV ÃPžàyÃ.ÃPn Ãp9!ÃpQÃÐSÃÐGà šÃ0ÁÀ ðÃRÃàÃÀ—ÃUà$Ãðk#ÃÀü!ÃÒÃP˜ÃÐÜÃð$ÃP˜ÃÐAÃðÃàzà #àÆÃpQÃà Ã0>à À~Ã`BÃöÃð­Àà ‚Ã@ÐÃ`¡ÃÐGÃRÃ@ôÃ0ÍÃ0©ÃÞðíÃ0»Ã@_Ã( Ãà÷Ã`ËÃÀ,à )ËÃ@qÃÃÕÃànÃgÃÀ… Ã` ðvÃоÃÐMÃ02àêéÃFÃð‰ÃüÃpÔÃPn àÀÀ„Ã@úÀÃPýàIÃ@ÖÃÀà à !ÃpKÃ( à ðùÃ`³àØà ÃàzÃ0ÁÃ"à Ãð ÃàÙÃ`<àäÃÐ_ÃPÀéÃ@Ä Ã@ÊÃp]Ã`¿Ãà†ÃyÃðÃØÃFÃ`NÃ"ÀÃðñðÃ@èÃðà ¬Ã`<ÃàŒðˆÃpæÃÐMÃ02ÃØÃ(ÃPžÃ@ÖÃ(Ã`6Ã.Ãà€Àûà´ ÃP€ÃÐMÃsÃ0©ßÃà\Ã`¡ÃÀµÃPÃp]ÃpÚðáÃà†àºà[Ã0ÓÃ@ÃRÃ.Ã¥à ‚Ãàð à ”Ã[ÃànÃsÃpiÃÐMÃ`¹ðpÀûÃp3"ÃP÷àCàOÃÀÃ0,ÃÀµÃÀ&Ãêß!ÃÀ à ðˆÃÐÊÃð‰Ãð‰ÃÐÖÃ:ÃÐAàOà ”ÃP Ã@_Ãð$ÃöÃÃà[ßàÒÃð$ðjÃÐAÀ–Ãð³À%ÃsÃÀµÃàÃÃÃPà Ãàýàêà  Ãà€ÃðÃð$Ã`§ÀlÃà\ÃPh!Ã`›ýÃpìÃ`ÅÃPzðáÃ`<à ¸ÃÀ\Ã`ãð5Ãdà ”Ã@eðjÃ@ÖÃPÃÐGàüÃFÃpì÷ÃÐ;Ã0©ÃÐAñÃ@qÃÀÃàëÃðƒÃ`6ÃàŒÃP'Ã`³àOÃp]à )ÀÃÕÃPÃÐÊëð‚Ã@ôÃð›ÃÐÐÃP-Ã`ÅÃÐYÃÃPÃPžÃP!ÃÀ»Ãð³ÃÏà ¸Ãð0ðˆÀ~ÀœÃÐÜÀà #à  Ã:ðÃ`HàyÃpià #ÃçÃ@ôÃ@îÃFÃð³ÃyÃ@ôÃ@kÃ@Ã@âà /ÃÐqÃP!àyÃ0ÓÃ`ÑÃÐâà 5ÃÏà )ÃsÃÏÃLÃ`HÃÐMÃÃð<ñÃ:ÃààmÃÀÍÃà¤ÃàÃPÃ0DÃ`<Ã0JÀ¢Ãð­ÀœÃp{àÃpøÃ0VÃÀ8ÃP’ÃÕÃÉÀÃLÃdÃÀ>Ã`BÀûÃÐMÃð¡ÃÐÄÃÛÃ0bÃÐSð‚àañÃà˜Ã@q÷ÃÐGðŽÃ^À„Ãà€ÃÐSÃ@à[Ã¥Ãà€Ã0>ÃP?Ã0ëÀ¨à  àgÃjÃÀ¯ÃLÃ0ÙÃÀ Ã0ÁÃ`TÃ:à[Àà #à  ÃàÃà ÃpàÃ0ßð)à 5ð”à ¬à ¬ÃÐeà  Ãà ÃÃ`6Ã@ôÃ`NÃpuÃà€ÃðÃð6ÃP˜Ã@wÃËÃàŒÀ¢ÃÐÖà  Ã`ÑÃàtßÃmÃ`Nð#Ã0ÓÃð§Ã@îÃð$ÃÀ8ÃüÃÐYÃüÃÃpìÀàØÃÐÖà ¦à ²ÃàýÃüð|ÃXà[ÀÀŠÃð¡ßÃàÃðÃðƒðdðÃ`HÃ0PÀÃ`×ÃPŒÀã ðvÃÐèÃð*Ã0»Ã@wÃÀ>ÃàýÃ0»ðÿÃXÃpìàaëÃ@G Ã0PàüÃpòÃоÃsðÃP!ÃpiÃðà ÿÃpuÃ@ƒÃÐÜÃÀ¯Ã`*ÃPn ÃPñÃÏÀ¨ÃLÃÀ£ÀT#Ã0µÃpþà ²ÃÐúÃP¼ÃÀDÃ&ÃÐÜÃàŒà ;ÃÀ>ÃðÃÃðˆðdÃ^ÃÐâÃàëÀ„Ãàà  ÃßÃ@eà šÃÀÃ0ÇÃP¤Ã08Ãð$ÃáÃÐYÃ@qÃðBÃ@ôÀõàOÃ@úÃÀ>ÃÀ>Ã0åàsÃPÃÐ5ÃàýÃP!ÃðÃsà[Ã@îÃàýÃ0Pà ¬ÃpEÃÐGÃÀ©ÃpoÀ ÃоÃ@ÐðvÃPýÃànÃ0µÃäÃ@èÃÀ¢ðˆàIÃ`­à Ãð$ÃpÔÃ02Ã08Ã0µàÞÃÐÊÃ@ÐÃdÃPýðÿÃgà Ãð•ðùÃ`­Ã.Ã0,Ã@Ã@ÜÃ`• ÃP÷Ã@à ‚ÃÐÊÃÀ©ÃPÃ@;"Ã#Ã"à ÀûÃиðvÃàýÃPÃð•ÃÐMÃpWÃ0 ÃI!ÃÀ‘ÀõÃ0©àºÃ0$à d#Ãp¶!Ã¥ ÃððáÀïÃpKÃpEÃ02à ùÃÐ#"ðáà ç"Àrà ÿÃÀÃÐ5ÃÐ/ ÃO ÃÐ#"ÃК#ðÏ"Ã0!Ãà»$Ãp9!ÃO Ã=#Ã0!Ã=#Ã@MÃÐ5ÃpQÃ0,ÃÐ/ Ã@¸"Ãà\Ã@ÖÃàëÃ`³ðçÃÀ!Ã0ü%à ç"à1!ÀéÀT#ðpÀã ÃÀ‹Ã0©Ã`§ÃPë ÃðƒÃЬ Ãp¼ ÃàÓ ÃÐ)!ÃðíÃ`‰"Ãp°"Ãø#Ã0 Àf ÃPå!ÃÀy"Ã`‰"Ã`!àCÃÃÃpÔÃpEÃPñðX!à á#ÃÐ%ÃP\#Àf ÓÃÀ‘ÃpÎà¢#Ã0‘"ÃðÃÀ—Ãð‰ðjÃ@SÃ@G Ã@Ä ÃðÃpEà |ÃpÎÙÃвÃ`³ÃÀÃpEÀT#ðF$à=Ã0>Ã@ÖÃàbÃðÀlÀõÃp]ÃÀ ÃàßÃà\ÃPå!Ã0 à ¦Ãp¼ à v ÀïÃ0,ÃÞÃyà ÃI!ÃÐ;Ã@MÃPn Ã0&ÃàV ÃÀÃàhÃÐSÃðÃÐ)!ÃàP!Ã@MÃPÃð•Ã0µÃЬ à í!ÃÀ Ã0µÃpQÃpEÓ#ð@%À¹'Ã@;"Ã( Ã` ÃÐÄÃ@àäÃÐÖÃ(ÃpWÃ`¡Ãð Ãð•à j"ÃI!Ã0ÁëÃð Ã0,ÃÀÃpWÃ`• Ãðô!ÃPß"ÃÞÃàåÃ`³ÃÒÃ0>Ã:Ã0µÃðô!ÃPë ÃÀ‹à Ãà÷ýÀÃàýà à=ÃàÁ#ÃàhÃÏÃÐAÃ@ÃÒðíÃ( ðáÀŠðpÃÀö"Ã`Ã`Ãð•Ãð›à[Ã.Ã@îÃ¥à[Ã`¿Ã@eÃ0©Ã0»Ã@âÀT#Ã`#à í!Ã0‹#ÃPñÃ`³ÃpìÃð§ÀlàÀÃ0©ÃÀÃð¡àÞÃ@Êà ‚ÓÃ( Ã0&ëÃÐÜðpà v Ãð Ãàëà ÃPh!à j"Ã0©ÃpKÃ0£Ã`›ÃÀ À~ÀéÃ`<àºÃ0»Ãp]à[ÃP÷à ùà¨"ÃP€ÃÐAÃ.ÀïÃðÃäÃàÇ"Ãð ÃpÎÓÀxÃÐAÃ`¡Ã Ãp-#ÃÃиÃ`­Ãð›Ã:à ˆÃ`<ÀÃ0 àCÃpÂÃÀ£ÃÀ‘ÃPn àOàOÃÐ5ÃÐ;ÃP ÃpKÃðk#Ã`Ã:Ãð Ã.Ã0,Ã@Ä Ã`• ÃÐSÃÐÊÃÀ‹ÃpQÃpÚðÿÃànÃpQàÒÃ°Û ÃmðˆðíÃ@eÃÀ©ÃP!ÃpàÃUÃÐÐÃ0&ÃÀÃ[Ã0,àÒÀõà ÃPÃÒÃp3"Ãà>$à¢#à ó ÃpWÃÀÃaÃÀ‘ðR"ÃÀ Ã¥ ÃÀ‘Ã02À„ÃÀ£ÃPzÃÌ ÃPë ÃÐ;Ã0#ÃPtÃ`³Ã0¯ÃÐGà Ã@ÊÃÐSÃ@àIÃÐÜÃÐSÃ0»Ã@ÃPýÃpQÃP¤à )ÃÐ;ðL#ÃðÃ0JÃÉàêðX!Ãà\ÃàhÃpàÃP’ÃàhÃД$Ã@ðvÃPß"Ã0"ÃPñàÌÃpKÀõÃpÂÃPÃ`HÃ@qÃð‰ÃpcÃp]à ÃÀÃ02ÃÀàÌÃpìÃ0PÃ`ÃàV ÃP†àCÃp9!ÀïÃ"ðL#àCÃPñÃ08ÃÐÖÃ`¿ÃД$ÃO Ã`­Ã:ÀŠÃ@ÃàñÃ`àÆà !ÃpEà à7 ÃÀ!Ãðw!ÃàÙëÃ0DÃð‰àCÃ@_ÃÃÃàëÃ:à ÃÀ2ÃPÙÃ`6ÃðÃ`• Ã0µÃ`¡ÃÀ!Ã0¯ÓðX!ÙÃ¥ ðjÃànðóÃÀ>ÃðÃðÃP†àÀÃàtÃÐkÃ0¯ÃsÀ ÃUà p!ÀéÃÀ—ÃÐ)!ÃpÈà p!Ã¥ à´ ðóÃàÙÃ@_Ã`¡ÃР"ÃPë ÃÃà ÃÀÃÀÃpEÃðq"àCðÿÃpÎÃ.ÃÐ)!à ð|Ã¥Ã@eÃ`0à=ÃPýÃsÃиÃÀ¯Ã.ÃPÃàbÃÐ/ ÀûàÀà´ ÀïÃP ÃpÎÃ¥ÃPh!ÃÀðùÀÝ!ÃÐ)!ðÿà ùÃÀ"÷ÃpÈÃÐGÃàÃpKÃ@Ä Ã°óÃàýà ˆàÆà v ÃP Ã`*ÓÃ`#ÃÀ£Ã"ÃÐ;ÃÀ‹Ã:Ã` ÃPzÃ`­ÃpQÃà€ÃðÃ`0ÃÃðóÃÃÐGÃÀ&ÃàåÀxÃÐ5Ãà†Ãð*Ã¥ÀéÃp? àØÃ`ËàÌÃpKÃàÙñÃ0ÇàÞÃðÃ(ÀÃpÚÃÐeà Ã0>Ã(ÃØÃÐ;ÃÐGÃ@Ãð$à ”Ã08Ã`*ÃP’ëð|ð ÃpòàUÃàP!Ã0&ÃäÃ0>ÃÕÃ@èÃP¤Ã@wÃÐMÃ)à v ÃÀÁÃóÃÐèÃð­Ã`­ÃànÃ@eÃ`6Ã08ÃLà ”ñà ÃÃ0ÇÃðÃ08Ã0&ÃmÃpoÃP ÃP÷Ã.ßÃàhÃp]ÃpæàØÃÐÊÃÐÐÃ`6ýÃàÃ02àºÃÀ ðÃÀ¯Ã@ÐÃð¡à šÃð0Ã@âà à #Ãð›Ã0DÃ@ÐÃàýÃ0»ÃÐ;ëÃ`<ÀýÃ@à )ÃPÃpÚÃÀ—ÃÃðvÃÃð0ÃêÃFÃÐYÃà€Ã0¯ÀrÃ02Ã÷Ã`*Ã@Sà[ÃäÃpÈÃpEðjÃð§Ã‹ÃÐîÃXà )À~à |ðŽÃP-Ãà€ÃüÃÀµÃ0JÃð Ãà 5Ã`³ÃÀ‘Ã0>ÃP ÃÀñÃgàUÃð*Ã`¹ÃØÃpÂàCÃÀ>ÃðÃ:Ã"ÃP˜Ã`³à Ãð•ÃðÃ@eÃFÃàëÃÀ,Ã`6ÃÐAß!ÃgÃà Ã0ÓÃðÃÀ£àÞ÷Ã@îÃ0©àØÃàŒÃ@îÃ`Åà ŽÃ0DÃð§àÒÃ"ÃвÃ4ÃpÔÃðÃðƒÃð•À–Ã@}ÃgÃÐÄÃ@kÃsÃmÃ0ÇÃð à ÿÃ0¯ÃpÚÃÀÃsÃäÀlÃð‰ÃðÃÀ©ÃpÔÃÐÄÃÀ¯Ã@ôð‚à´ àÀÃP€Ã.Ãà÷Ã02à ¬ÃÐÜÃÐSÃð$ÃàtëÃP†Ã`§ðóÃ0,ñÃPzÃÕÃÐYÃP÷Ãð} Ã"!Ãàbà ˆÃ`‰"÷÷à ÃpQÃð•ÃPÃ@wÃÐGÃ@qÃ@îÃP Ãð›ÃP†ÃÐMÃ[Ã`­ÃàV ÃÐYàðùÃð} ÃP†Ãp]ÃÉÃÃÃ0ÇÃüÃоÀ~à ”ÃP€Ãà\Ã`0Ã`6Ã`¡àÌÃàbÃÀ2ÃÀ©ÃpKÀÃÀ2ÃàëÃPÃð6ÀàÀÃêÃà€ÃdÃPÃ(Ã0DÃàýÃsÃP†à Ã4ÃpààðÃÃàýàðÃð0ÃpÚÃÐâËÃ`6ÃàtýÀ%àaÃsÃ@èýÃà!ÃP’ÃðÃÐÖÃÀPð/ÃÃÃà€ÀÃ`NÃPÃðÅÃà ÀÃöÃP¤ÀÃð›ÃXÃ@úÃÐeÃÐ_Ã@ Ã`6ÃP˜Ã@ÀÃpàÀÃsÃPñÃpWÃоàOà  ÃüÃpþÃÕÃ0JðpÃÀ—ÃÀ¯ð#Ã@wÃÀ>à )Ã0hÃ@}Ã`HÃ0VÃÃÃÐYÃð¹ÃP˜ññÃ@}Ã0PýÃÀµà à #ÃÐ_ÃÀ>Ã^ÃÃÃX÷ÃPÃ@Ä ÃÀ¯ÃÉÃð$Ã0Ùà ;ÃP'ÃÐ_ÃÀ Ã"ýÃ`BÃPÃàŒÃ@ƒÃyà šÃ¥ÃmàäÃ`ËÃÀ2ð Ãð6Ã@kÃ`§Ã`§Ãð³ÃpìÃð¹ÃÏÃð0Ã`³Ã`6ÃpÚÃ…ÃÀ2à 5ÃP¤ÃÐ_ÃpQÃ`<ÃÃà÷ð Ã…Ã0»ÀÃ@èÃиÃ`³Ã"àUà !Ãp°"ÃðÃ0ÍðŽðóÃÀ&àäàêÃyàgÃ0ÇÃ0PÃð§ÃpWÃpæÃÐÄÃpàÃ@ƒàaÃðÃ@ôÃðHÃÐÖà Ã@îÃÀ ÃÀ,Ãð‰Ã¥ÃP’à ŽÃðÃ@eðùà Ã0¯Ã@YÃÐ5Àrà ó ðR"Ãp? Ãð›ñÃ0PÃP€ÃPýàÀÃaÃ`!à´ àCñÃP ÃpÚÀõððÃð$Ã0&Ã`³ÃpQÃPýÃðàOÃÀ&ÃÀ&à ùÀ Ã:àäàÀÃ0 ÃànÃ"ýÃ@SÃиÃànÃ@ÜÃÏðùÀÃàÃð Ã0¯Ã`³Ã(Ã4ðÕ!ÃPtÙÃÀÃÐâðvðˆÃÀ¯à àºÃоÀf Ã:ÃÐ_ÃÐèÃP°ÃPªÃ`³ÃPÃ4Ã( ÃÞðóÃ@Ä ÃÀÃ@eÃFà7 Ã@G ðpÃs÷ÃpWÃÐGÀõÃPzÃPð‚à ÀÃ0>Ãð àIÃaàUÃð•ÃÐGàOà ”ÃäÃð•ñÃsÃ02Ã¥Àûð|ÃPÃàåÃp]ÃaÃ`­ÃLà šÃ0£Ã`›ðpÃÐÐÃ"Ãð‰Ã0&Ã0µÃÀÃp? ðùÃÐSÃpKà ó ðçÃp? ÀïÃpEðvÃöÑÃÀ8ÃpiÃÀ&ðjÃ@SÃðÃ`!ÃàÙÃà÷ðpÀf Ãð Ã@ÜñÃPÀ Ã@YñÃüÃØÃmÃ@úàÆðíÃäÃ`<Ãð‰ÀõÃsëà ÃàUÃ0ÍÃO Ã@Ä ÃÀà á#ÃÒÃp¼ ðàðÃ`ÑÃÐÃÀ,Ã0£Ã@eð|ÃPÃиÃ@'Ãp? à |ÃÐâÃRÃàzÃ0 à ðÿÃà†Ã`HÃð0ÃP˜Ã0»Ã(Ã0ÍÃÐÐà |Ã`• ÃP†ÃàñÃð‰ÃàzÃÕÃÐÊðjÃð ÃpcÃ0\ÃÏÃ0µà ŽðíÀlÀÃPÃà÷ÃÀ,ËðÿÃÀ2ðˆÃP˜À Ã4À~ÃaÃgÀœÃ0DÃ@_Ã`¹ÃðÅÃÉÃPŒÃäÃÀ‘ÃðƒÃÐ)!Ã08Ãð} Ã°Û ÃàØÃÐÖÃüÃ@âÃÀ,ÃÐAÃ0PÃð³àÌÃ@Ã¥ðÃ`<à #ÃÐÜÃ@SÃP÷Ã"Ã`¡ÃàñÀlÃð•ÃFÃà€ÃÐAÃ0ÓÃP†ÃP¤Ã0>ÃÀ©ÃðÃ0ßÃÃ`Ã`6Ã0¯Ã0&ð^ ßÀÃð ÃàÙà7 Ã02Ã@Üà ¦à[Ã@ÊÃàÇ"ðdÃ`›à v À„Ã.àêÃ0ÇÃêÃ0 Ã¥Ãð¹ñÃP†à Ã0ßÃÀ ÃÐGÃ@âÃ(Ã08ÀðvÃÐÄàsÃ@ÐÃ@âÃÀ&àÞÃ¥ÃpæÃÃà #ÃRÃ0¯Ã`›ÃÞà Àf ðpÃ`³Ã.ÃêÃp]Ã08ÃàßàÒÃ02ÃPŒÃðÃ@ÜÃÃÃ` Ã[Ã0DÀÃpiàêÃÉÃ[Ã"àÒÃà Ã`$ÃÐÖÃ@qÃPÃÀ—ÃØÃ:ðjà ‚ð^ à Ã0ÇÃÀ,Ã08Ã@YÃÀà ŽÃpÎÃÉàÒÃ@èðpÃÃðú ÃàhÃ[ðÕ!àIà ¦ÃXÃ@Öà[ÃàýÃ@Ãð*Ã.Ã"ÃÐ;ÀðóàIÃ02Ãà ÃÃÐYàUà àUÃÒÀxÃ02Ã`BÃüÃpòÀ¢ÃàhÃPzà ÃÀ8Ãð*ÃÀà[Ã@}ÃàßÃ0 Ã0¯ÃpiÃð<ÀÃ@ÃÐSðšÃ.ÃÀÃàÙÃPÃFà ÃÀ—Ã`ËÃUÃð‰ÃpiÃ0ÙÀœÃ`éàêÃÉàØÃ`<Ã@âÃ@ÜÃ@G ÀõÃsÃðàCÃðÃð•Ãð à Ã`­ðjÃÐAÃ0DÀÃðÃ@ÊÃÀÃðÃ`­ÃpWàUÃð›Ã^Ãð¹ÃpiÃêÃI!ÃO Ã@A!ÃÕÃpÔÃÀ—Ã:Ã`BÃ`ÑÃÀ>ÃêÃpÔÃ0>ÃÀ,ÃÐGÃ`ËÀÀÃ0ÁÃFÃüÃpàÒÃmÃÞÃ`­ÃàbÃpQÃÀàÌÃÉÃÕàsÃüÀÃð§ÃÀ‹Ã`Ã0ßÃPÃgÃàýÃ`¹Ã0ÇÃÐÜÃвÃþ"Àã Ã@qÃ@àÒÃLÃpWÃð•àaÃð6ðŽÃÐÄÃð ÀÃà÷ÃRÃLÃÐ;Ã`<ÃpiÃFÃànà ŽÃP’ÃànÃ`*ÃpKÃpÎÃàhðdßÃÐSÃØÃàŒÀœÃð³àsÃÀ ÃêÃÀÃ( Ãp¼ ÃpcýÃ`NÃ`³ÃRÃP’ÀlÃÌ Ã0»Ã` ÃÀ©ÃP°Ãdà àÆà ÃÕÃP˜ÃÞÃàV ÃàëÃ4ÃP ðùÀõÃвÃ:Ãpøà ñÃÀ—ÃyÃ:ÃP÷Ã0—!àIÀûÃðw!ÃàP!ÃPh!à ó ÃÀ ðóÃÀ ÃðÃÐÊÃ¥ÃÀÃ0»Ãp]ÃÀ£ÃàñÀZ"Ã@ÊÃpÔàOà ð|ÃpcÃ0 Ã`¡à à v ÃàåÃ0£ÃpÎÃàñÃÀ‘ÃÐ;Ã@SÃ`›Ã7$à Û$Ãu$ÃàÙÃ4ÃÀy"Ã( ÃР"à p!ð Ã@YàÌÃÀö"Ãpž%à ç"ÃðƒàIà v ðjÃÐ)!à%#à ó ÃàbÃàhÃàñÃàëàIÃpÎÃ` Ã`§Ã`ÃÀ2Ãð³Ã¥ÃFÃððùÃP€Ã`BñÃäð^ ßÃ`6Ã`ÀlÃP€ÃÃÐ5ðR"Ãpª#ÃpÂÃ@SðÏ"ÃÐ)!ÀûÃLðpà ˆà ˆÃàbÃ0 ÃðÃðÃ`³ÃÐÜÃPÃàýÃÀ—Ã`Ü)àÀÃp]Ã@YÃÐ ÃP°ÃpàÃÀðR"ðçÃ`­Ã"ÃÐÄÃ.ÃÀ‘Ã4ð|à p!ÃðÃpæÃP!Ã`¿ÃàtÃ0¯ÃÐ;ÃØÃÀ—ð^ ÃpÚÃ0>à ÿÀïÃÃPÀ–ÃÀ¯ÃÃàÙÃÐ/ Ã@Öà ùÃpìÃØÙÃmÃоÀïð^ à ŽÃÉðóÃ`­ÃÐÄÃ@eÃöÃàåÃð Ã0 àÌÃpKÃ4ÃpÂÃ0µÃàåÀ~à ŽÀÃêýÃÌ Ã@MÃÀ‘ÃPë Ã@ÐëÃÐ$Ã0 àIÃ¥àÆÃÐ)!à ŽÀlÃpKÃвÃðÃLàÆÃ02Ãà\Ã`0Ã@ÊÃ@ÜÃPn Ç!Ã¥Ãðà1!Ã"!Ã@ÐàCÃ0,À„ÃÀ… Ã@G Ã@ÜÃ`*àIÃp¼ ÃpÂð|ÃPŒÃÀ ð|ÃaÃÐ;ÃÐ)!à à ÿÃ( Ã4ÃÐYÃ0ÁÃ`• Ã0$ß!Àã Ãþ"Ã&Ãðè#Ãðq"Ã0 à d#ÓÃêÃp¼ à7 Ã@Êà ÃàÍ!À`!Ãð Ã@A!ÀÝ!ÃÀü!Ãà>$ðR"ðáÃ@¾!ÃPß"Ã0‘"Ã0!à¨"Ã`¡Ã0 Ãp'$à®!àÆàÆðÏ"Ã0 ÃØà á#Ãà2&Ãu$ÃðÃà¯&Ã0y&à(Ãà'À¹'Ãc'Ã"ÃPýàCÀ×"ÃÀ!Ã@Ðà í!à v ÃÀs#ß!ÃàÇ"ÃPb"À6(Ã0%ÃÀs#ÃàD#Ãu$ÃPb"ÃÐ#Ãà>$ðÕ!ðÕ!ÃÀO)ÃÐ#Ã`• Ã0£Ãðî"ÃàÓ ÃÀö"Ã=#ÃPß"ÃPå!Ãp3"Ãð Ã@¦%Ãi&ÃPh!Ù"Ãþ&Ãpª#Ãò$ÃP\#ÀÅ%ÃÀ"Ão%Ãà8%Ã`Ü)À0)Ã0ê(à„(à X%à¨"Ãðq"à´ Ã@/$ÃЂ'Ã0ð'ÃÀs#Ã$Ãþ"Ã@5#ÃÀü!ðL#Ãðô!ðX!Ãp3"Ãp'$Ã`¡Ã0£à+"ÀÝ!ÃPÍ%ÀH%à1!Ã"ðL#ðL#ÃàÍ!Ã"à R&Ãp¤$Ã`‰"à j"Ã0&Ã@²#ÀÝ!à ç"Ãà»$ÃP\#ÓÃp¶!Ãpž%Ãþ&Ãæ&à F(ÃÀð#à+"ðÉ#Ã`0Ã@kÃC"à+"ÃPÙ#ð½%Ã0"ÀZ"ÃàßÃ` ÃàtÃ0‘"Ãp¤$ÃpÂÃÀs#ÃàP!ðR"Ãp*ÃC"Ã0¯Ç!ÃàÙÃÐ/ Ã@;"Ãðq"ÃД$ÃpÂÃð‰à$Ã0ü%Ãà8%Ã@5#Ã0"Ãðk#Ã0!ÃàP!Ã@A!Ã0&à í!ðF$à j"Ã`‰"ÃÐ#"Ã0…$ÃÀ!Ã0£ÀN$ÃÀð#Ó#ÃÀàÆÃ0&À×"à%ÃÀð#ÃðY&ÃàD#Ãð} ÃЬ ÀÝ!ÃàÍ!ÃðY&ðF$ðvà v Ã"ÃÐ#"ÃÀ‘à ëÃàÇ"ÀT#ÃÞÃp9!Ã@ÊÃpEÃ`#Ã0‹#Ãðî"ÃÀ"ÃÐŽ%ðÉ#Ã`*à ùÀràIÃÉÃ0£ðX!À`!ðÕ!Ã0—!ðdà Û$Ã"!ÃÌ Ã°çÃP\#Ã"Ã@¬$à í!ÃpÈÃàßÃàh÷ÃÀð#Ã`$àÆÀ~ÃÀ£ÃоÃðÃpàÃ`#à ^$Ã`• Ã`¡Ã@Ðà ùÃ$ðÉ#ß!ÃØÃ`›ÃàÍ!à´ à ùÃК#ÃÃÀðR"ÃàåÃ` "Ã"ÃPÃPn Ã"!Ãp? ðvÃ0&Ã( Ã@Ðà=Ã@SÀ~à7 Ã#ÃЦ!ðÕ!ÃpàÃðÃpÎß!ÃàßÃ`$ÃÀü!Ã+&ô$Àf ÃP€ÃÌ ÃC"Ã0 Ã0&ÃиÃ` ÃPtÃðƒÃpÂÃðÜ%ô$À`!Ãàµ%à1!ÃàÙÃ@G ÃÀy"Ã`¡Ã`­À~Ãð ÃиÃUÃ@G ÃÃÐ/ Ã°Û Ãpª#Ãðw!Ã( Ù"Ãp-#ÃÀ!Ã@¸"Ã0&ÃÐ;Ã0#ÃpÂÃ@SÃöÀf Ãà\Ã`$ÃвÃ"!ÃP†Ã@5#À`!ÃÀü!Ã`w%ÀÝ!Ãðú ÀéÃ` ÃpæðóÃиÃ.Ã0"ÃPå!à®!ÃÃPß"Ã`â(ð@%à ŽÃàhëÃPJ&Ã@²#à$Ã@G ÃÀy"Ã@G ÃÐ)!à í!ÃÀ©ÀÃ@A!à ˆàØÃàåÀã Ãð Ãp-#Ã@;"Ã"Ã0%Ã@/$ÃЦ!ÃР"Ã@;"ÃÐÄÃ0£Ã0&Ãp¶!Ã@ÐÃp¼ ð@%ðdÃPß"à v ÃPP%Ã@‚+ÃàÇ"ÀÝ!ÀõÃÀ£ÃÐ/ ÃðÃð‰Ã"ÃЬ ÃI!Ã7$ÃЦ!Ãà\Ã#Ãðô!Ã`§Ã0 Ãp¶!à¢#Ã` Ãðâ$Ù"ðÉ#Ã@âàIÃðú ëÃð›ëÃðè#ÀûÃðú ð^ Ã`à ùà®!ÃÆ!ÃÆ!à=Ã=#Ã` Ã` "à=ÃðÃ0—!ñÃ@eÃPb"ÃД$à–%ô$Ã@š'Ã$Ã.ÃЦ!Ãp¶!Ãàåà à ^$Ã`!ðÏ"ð^ ÃPå!Ù"Ã` "Ãð} ÃpKÃ`!Ã@/$ÃÞÃO ÃÐ#"ÃðS'Ã@²#Ù"ÃЦ!Ã` "ÃÀðjÃP˜ÃðÃ0©Ã`­àÀðˆÃÀÃðƒ÷ÃPŒÃðÃ+&Ã@'Ã`Ãð•ÀûÃp3"Ãð›ÀõÃðk#Ãu$ÃÐ$Ãpª#ÃÀ!ÃêÃ@G Ãð à à1!ðÕ!Ã¥ à Ã0 Ç!Ã"Ãp]ÃP€Ãp¼ à ùÃ@¾!ÃPýðpÃÀ!Ã$ÃC"ÀxÃPÃ(ÃPýÀûÃPzÃðÃP÷ÃàD#ÃÀÃ`›ÃÀÃÐMÃ`0ÃÐÊÃÀ!Ãиýðˆà ŽÃÐÄÃP à®!à=àIÃ"ðvÃÐ/ Ã°Û Ãиà šà ÿÃÀÃàtÃÃÃÃÃ( Ã"Àã ÃÀ!Àà  ÃðÃPtà®!ÃpÂÃоÃ0©ÃPzÃPÃRðóÃPn ÃðƒðçñÃaÀ`!ÀH%ß!ÃðàºÃp°"ÃÐ%Ã%'ÃàÍ!Ã#ÃÐ$ÃàÁ#Ã@¦%à Õ%à %à–%Ãþ&Ãð_%Ã`‰"Ãp&ÃÐ|(Ã@²#Ã@Ä Ãðw!Ã1%Ã0g)Ãà>$Ãp&ÃðÄ)Ãp )Ã&ÃP»(Ãà,Ãc+Ã@+ÃÐí*à~)ÃðA*Ã0m(Ã@š'à É'Ã%'Ãpý*à(Ãà*À³(Ãà©'Ã0"ÃР"Ã+&Ö)ÃÐ &Ã0ð'ÃÐR/ÃÀº,ÃðG)Ã0Ø+Ãp†)àŠ'Ã`â(Ã*ÃÔ)à L'à @)ÃP>(Ã`M,Ã@”(ð"*À¿&à ^$Ãà—*Ã](ÃЂ'Ã0ä)ÃP>(Ã0Ì-À$+À**Ãp†)ð"*àû)ÃP2*àx*Ã@ù,Ãðš0Ã~-Ã0g)À<'Ãp°"Ãc'Ã`S+Ã0ä)ð.(Ã`Ð+Ã@+Ãà©'Ã](à F(à %ÃP\#Ãp!%ÃÂ,ð+Ã{'à&ÃÀI*Ã@ù,Ãi*Ãàµ%ÃÀ['ð™+Ã0Ø+ÃðÊ(àõ*Ã0g)àï+Ãà)Ãà+ÃP8)Ã+&ÃÐ|(ÃðS'Ãpž%Ã@)Ãp*Ã`Ü)àŠ'Ã0%ÃðY&Ã{'à&ÃÐí*Ã`â(à R&Ã*ð™+Ãpë-Ãð¾*àû)à :*Ãp*ÃÐd,Ã@)%à&Ãpž%Ã0g)ÃðA*Ãp€*ÃÔ)Ã0ð'ÃP,+ÃP¯*Ä,Ãà—*ð()Ãì%ÃÎ*ÃÀC+ÃpŒ(Ãò$à R&ÃÀä%à É'Ãò(Ç%à L'ÃW)ð"*Ã`Ä-Ã0[+Ãp¤$Ã@ó-À6(ð.(Ã(ÀÅ%Ãp'$ð:&ÃPÓ$ÀÅ%à+"Ã`q&à (-Ã@+Ã*Ão)ÃP8)Ã*Ã0g)Ã{'â'à&è&Ãþ&Ã@Ž)Ãà&(â'À§*Ã`w%ð@%Ã0ö&ð"*ÃÀØ'ÃÐv)Ã0g)Ç%Ãð_%Ãà,'ÃÚ(Ãðâ$ÃЂ'ð+Ãp’'Ã@ &ÃЈ&Ãø'ð"*ð()Ã0ü%Ã@'ð½%Ã"ÀN$ð¥)ÃðÐ'Ãðè#Ãà>$ÀH%ÃÐ|(Ã`ú$ð½%à F(Ã0ä)Ãà&(Ã+&Ãà>$Ãà,'Ãà )Ã@”(à %Ãì%Ç%ÃÀê$Ãp(Ã0%ðR"ÃÀä%ÃÐç+Ã0Þ*ðÉ#Ã$ÃPb"à–%à X%Ãp'$Ã0…$Ó#ÃÀs#À<'è&à Ã(ÃPJ&ÃI!à j"ÃP»(ð«(Ã0%Ã@G Ã=#ÃPÇ&ú#à F(à Õ%à%Ã`è'à&ÃК#Ã=#ÃÀ"Ã0$Ã0ü%à j"à j"ÀN$Ãðe$ÃÐ$ðÃ$ð½%Ãæ&ÃÀØ'À<'Ã0s'Ã`e(ÃÀU(ð.(Ã@ˆ*Ã0ö&à É'ÃPh!ÃPÍ%à L'Ã$Ãðâ$à í!ð±'à%#ðR"ðjÃ@SÃp9!Ãðq"ÃPñà j"ÃPÇ&Ã@)%ð4'Ã`î&ð4'Ã"!ÃЬ ÃÆ!Ãðw!Ãðú Ãðâ$à¨"ÃÒÃ@5#à d#ÃÀs#Ã`ÃUðÉ#Ãàµ%Ã`#Ã`!Ã02à Ãp3"ÃàÓ Ã@¸"Ã0 Ã7$ÃÎ*ÃР"Ã`#Ãðe$Ã0‹#à¨"ÃðÃ` Ã`!Ãà‘+Ã@¬$ÀlÃ@MÃÐYÃàßÃ4Ã.ô$ÃPV$ÃÀü!à d#ÀT#ÃpKÃ@Ãp? ÀË$ÃвÃ0 à7 àUÃÒÀlÃ@èÀrÃp9!à´ ÃÀ&Ã0&ÃÀa&Ãðâ$ðjÃ0£Ãø#À<'Ã"ÃÀü!Ã0‹#ÃÐ)!ÀrÇ!Ã0‘"à v ÃPb"ÃàbÃ"ÃÀö"Ã@Ä Ã"Ã°Û Ã0"ÃÀ"ÃPÓ$Ãðâ$ÃÆ!ÃÀ!àºÃÒÃð Ã¥ÃÀà ˆàUÃ@_Ãp°"Ã0 à ÃÀÃÀ ÀÝ!Ã0»Ã@ÃоÀÃpQðçÃp'à®!ÃäÃPÃC"ÃЬ ÃUÃaÃpKÃÆ!Ãà»$ÃÐAÃðà Ã$Ã0 ÃàV ÃäÃ0£Ãp9!Ã`#à ó ñðçÃÀö"Ãðw!ÃððvÃ@_ÃðÃ0©Ã`$Ã08Ã¥ÃÞÃ0¯Ã`0Ãð­ÃsÃðß!àÆÃ0»Ãpæà ”Ã0&Ã0—!ÃÀ… Ã0 ÃÐ_àØÃÀÃaÀf ÃpKÃPtÃI!Ã( ÃÐ5ÃàV ÃàÙÃpÎà=Ã"!Ã0ÁÃð§Ã0,Ãaà ÿà |Ã`³Ã.à1!ÃЬ Ã`¹Ã`ÑÃ0JàÆÃ`*à !Ã@àIÃ0‘"Ã0$Ã`!ÃоÃð$ÃàÓ Ã ‚Ã`*ÃÐ;àØÃàñÃà\Ã@ÖÃ0¯ÃpÎÃÀ&ÃàåÃÐÊðóà í!ÃЬ ÃpWÃð*ÃвàÆÃPzÀõðóÃð•ß!à¨"Ã08ÃÀ£ÀûÃ@eñÀÀŠÃà÷Ãà€ÃàñðvÃ0&Ã0,ÃÀ Ãð ÃÐ)!ÃÐÄÃPñÃàÓ Ã"!Ãp°"Ã02÷à p!ÃÀ&Ãà˜ÃPðùÃ@SÃðú Ã@YÃà\÷à+"Ãвà ùÃpÚÃàñÃÒÃp¼ Ã@qÃð•Ã0 à ‚Ã"ðX!à àaÃ¥Ã@úð ÃP÷Ã=#Ãðî"ÃPtÙàUÃðÀ`!à¢#à j"à ó Ã`§àCÃð àØÃÐÖð|Ãð‰Ã@;"ÃàÓ Ã€ã ðdÃ0µÃÐAÃàbÃp¶!Ãp¤$àÞÃà˜à‹Ãð§Ã@eàOÃP˜ÃpàÃ`§Ã` ÃpÎÃ`³ÃP÷Ã0>Ã.Ã@âÃ4ÃØÃ@èÃPžÃð­ÃP’ðÿÃPÃpÚÃÀ¯Ã@à ÃÃP’ÃP’ÃÀ,ÃPÃðÃ0>Ã@_ÃPn ÃPàIÃPÃ:ÃÀ‘ÃPŒÃLÃP¤ÃsÃP¤Ã0ÙÃÐGÃànÃàñÃP’Ã0JÃ4ð Ã@kðvÃpiÃ@èÃð6ÃP’Ã0¯Ãà\ÃpEÃÞðÿÃàýÃÃÃà÷ÃðÀÑ#Ç!ÃP’ÃÕÃaÃ@ÊÃPzðpàCðÿÃÀ2ÃpÚÃ`<ÃäÃÐ;Ãð ÃвÃpàà à Ãð¡àUÃ(ÃaÃ¥Ã0!ÀéÃÀ‘ÃPn àOÃàÆÃÐ5Ã.ðvàaÃêÃ@Ã@SðÃp9!ÃPå!ÃsÃ`BÃàhÃPzÃ`• ÃÒÃàtÃ0Vð|ÃÀ ÃÀ£Ã.ÃpÎà´ Ã[ÃÃðóÀõÃÀ‹ñÃðƒà ”Ãð›ÃäÃÞÃ0JÃ`BÃ0£Ã`!à Ã`ðvà Ã@kà ÿÃà€Ãð$Ãpàà ó à ÃÒÃðw!ðvðáð|ÃÐMÃ0,ÀÃÐôà ŽÃpÔà ŽÃ@_Ã(ñÃ@kÃÃàbÀœðvÃðÃ@îÃ"ÃPÃвÃÀ Ã`6àÌðÿÃàýðð”ðˆÃð§Ã4Ã0ÍàØÃðà ¦Ã@îÃpÚÃPŒÃ`¿ÃÐSà ¬ÀÃÐîÃÀµÃ@úÃpiàmÃ0åÃ`<ÃÉÃàðùÃ0¯à ÃêÃÉÃpÚñÃÀ—ÃàýÃÐSÃ0ÓÃFÃÃÃàýð”à ¬Ã.Ã08ÃÐYÀ~ÃÃpÃÐèÃàÃÀµÃð§Ã0>ðóÃP°Ãàà ¾Ã`NÃð*ÃöÃ`6ÃyÃP3ÃpìÃà†ÃFÃXÃ0ÙÃ@}Ã0Ùð ðÿÃÀ‹ÃPÃ`ÅÃÐ_Ã÷ÃÀµÃàŒÃpøÃÐâÃP9ÃÐqÃ`àÆÃðŽÃ@ƒýÃÀ2ÃLÃöÃÐSÃðÃpoÃÐÜðŽÃÐÖà AÃP°ÃÀÍÃ0åÃ@Ã0ÍÃÀà à  Ã`ÅÀ–ÃÀ8àÀÃ` À–Ã`BÃ.ÃPÃ`<ðvÃàŒÃP¤ÃpøÃpþÃ@qÃP˜ÀŠÃ0ÁàØÃ@ÊÃÀÃ08ÃPà šÃ0ÇÃ`0ÃRÃpøÃÀ>ÃpcÃPàyÀàaÃ`¡ÃPà ÃXÀ–Ãà€ÀïÃÐÊÃíÃÀÍÃÃ`ËÃÀ©ð ÃpòÃp]ÃpàÀ ÃpÃjÀ„ðÿÃXÃ0ÇÃÉÃpàÃPžà  Ãð¡Ã@eà #ð‚ÃÐYà ˆÃPýÃp]ÃÀ&àØàsð”ÃÐYðŽÃÀDÃÃÐSÃ`6ÃÐSÃöÃÀÃpQÃð¿ÃÃàßÃ0DÃP?ÃðÅà  ÃpcÃÀ>Ã@qðÿÃpuÃPÃÐSÃPÃðÃ0VÃRÃpcÃÐMðíÃÐÄðóÃ08ÃàbÃÀ2Ã@eÃ@îÃ`0àaÃðÃ`BÃpìÀÃ@îÃÀÃ0µÃàñà ÃàñÃpàÃmðŽÃð¹À ÃÐâÃÐYÃPÃFÃÐÖÃ`<ðšð#ÃpuÃð›ÃÀ,ÃP!Ã4ÃÀ ÃjÃP¶ÃàŒÃÀµà ”àUà àUÃÀ£ÃpàðŽÃàzÃ¥ÃPžÃÐYàäÃÃÃÐÃ0VÃ"ÃÐÖÃpøÃpuÃP¶Ã©ððíðÿà  àØÃ¥ÃpÃ`ÅÃàýÃ`BÃà†Ã@âðíÃÐÖÃPžÃÐÄðˆðˆÀŠð|ÃP†ÃÀ Ã0»ÃP’Ã.Ãð›ÃÃ$ÃaÃð$Ã0ÇÃpæð”ÃÐÖÃðŽàØàÀÃPÃð<ðÃ@èÃ@ÐàÆà šÃÉÀ„Ã@kÃ4ÃÐÜÃÐeðÃ`<Ãà€ÃÀ©ÃP°à‹àÌÃP Ã0Dà ”Ãð­Ã0>àCÃ@âÃ@ÃöÃ0>Ãð­à[ÃpòÃPzÃÐÊÃðƒÃp-#Ã@eÃÀµàgÃP-Ã0Pà ¦ðvàØà àØÃ`BðÿÃàñÃÐÄÃ0 àUÃ`0Ãð•ÃàýÃsÃÐMÃðÃP¤ÃÀ,ÀûÃ`<à ¬à |Ã0 À ÃPÃànÃp]ÃÕà AÃ`6Ã`§ÃðÃ@èÃgà ÃàtÃÐGÃ`¿Ãà†Ã@ÖÃ0&àaà #Ã@qëðˆÃ@_Ã`<Ãêà ŽÃPÃоÃ0£ëÀœÃð6ÃÐÄÃÀàÞÃÀ¯Ãpøð”Ãà ÃÐSÃÒà Ã4Ãp{ðˆð ð”Ã0ÇÃpcÃ@Üà ŽÃ.ÃÐîà Žð ÃÐÜÀ ÃànÃ@ðˆÃ@qðˆÃ@}Ã@Ä Ã ‚Ãð<à ¬ÃÀ>ÃpòÃÀÁÃ`ËÀŠÀœÃà¼ÃpøÀŠÃ@kà  ÃXðÃðÃð Ã`¿ÃÐúÃàÃ`*ÃPýÃáÃv÷ÃàñÃPà Žà ²ÃðBà #àÌÃ`¿ÃÐÖÃð­ÀŠÃÐÄÀrðóÃ(ÃàñÃP!ÃÐ}ËÃP¤àUÃ`¹ÃÐèÃ.ÃàåÃÐ;Ã4ÀÃÐÜÃàà ¬àêÃÐèÃ0VÃ0ÍÃð*à à ¬Ãpæà ÿÃÀ©Ãð0ÃÀ,Ã0>ÃÃðpÃpìÃp‡ÃàÃ.ÃÀððšÃà÷ÃRÃÐîÃð*à ŽàUÃð³ÀÃð›ÃÀÃ@wÃÀ»ÃàýÃà ÃPÃP'Ã@ÜÃð$Ã0ëà[àÒÃÀ&ÃpÔÀ–ÃpìÃÐÐÃPàÞÃà’ÃÃ"ÃÐGÃpìÃÐÜà #ÃðÃ.Ã(Ã`³Ã`*Ãð•ðð¦Àðà ¦ÃÀ2ÃÐÐàÒÃð§ðÃð­àUðáÃ@îÃP¤Ã0JÃð§ÃÃàbÃ@Yð ÃmÃ(À–à #Ã4ÃÐGÃÐîÃ``ÃðÃ`BÃ0>ÃFÃ`<ÀŠÃÐkàgà ¬Ã`<ÃPžÃð­ð ÃpiÃPÃ`¿Ã@ÜÃ0ÇÃÀ©ÀœÃP¤ÃÐeÃPb"à #ÃíÃp“Ã0ëÃP-ÃLàÒÃ.Ã`0Ã@eðŽÃpþÃPžàêÃáÃ^ÃÀ,ÃÐAÃðàmàðÃmð‚àÒÃоàÒÃ@_ÃpKÃÀ… àOÃÐSÃðÃànÃÀ,ÀàUÃà Ã`0ÃàýÃPªðÿàÒÃ¥ÀûßÃ0ÇÃÉÃ`HÃp]ÃÀ ÃÃpiÃÀ¯Ã@G à ”Ã`BÃ…ð”ÃоÃàëÃ0ÁÃ@ÜÃÃÃ4Ã`¿ðšÀ ðùÀ–Ã0>ÃðÃLà[ÃÐÖÃànÃ4ÃpWÃð­à ¦ÃÐ)!à ÃÐYÃð¿à ”ð^ ÃÒÃðÃ`Hà ¦ÃÀàCÃÐMÃÀDàÞÃ0»Ã@YÃÐ;ÃÐÐÃàbðjÃpÈÃÐÊðˆÃP˜ÃpÃPñà šÃÏÃ`ÅÃÐÄÃ"Ã@kÃ@YÃØÃUÃàhÃ0&ÃàJ"Ã0!ðíÃÐ;ÃÐÖÀ Ã@_ÃðÃ0ÇÃÀ»Ãð$Ã"ÃànÃÐÄÃO ÃPŒÀ à ²Ãàtð‚ÃRÃÐMÃÐ/ ÃðÃàŒð|ÃÐ/ ÃÀÃ`HÃÐâÃFÃÐ;ÃиÃÀÃ`• ÃPýÃ@_à à à /àäÀðóà´ Ã àIÃð›Ã`$à=ÃЦ!ÃÀÃP!Ã0µÃ@;"ÃЦ!ÃиÃPÃ4Ã¥ðíÃ0µÃpWÀrÃÀÀûðóÃð•Ã4ÃP€à ‚Ãð‰Ãð•ÀŠÃ( ÃðÃ:ÃPŒðùÃ`*ÃP€ÃPë ÃÐÖÃà÷÷ÃXÃ@ôÃ0!Ã`!Ãp? ÀlðvÃ0>ñÃp9!ðÕ!ÃÀ—ÃêÃpÂÃPñÃÀÃP÷Ã02Ãà€à Ã0£ðpÃÃÃpÈÃàÓ ÃP Ã.Ã02ÃàñÃàåÃ`¡ÀlÃðî"Ãp9!Ã@âà Ãà†ÀûÃиÃ"!ÃÀ&Ãð§ÃpWàÀÃ@MÃ( Ã0¯à ðíÃÀ‘à ”ÃÀ¯ÃàñÃàÇ"ÃPß"ÃÀ… Ã0‘"àºÃà\ÃàßÃC"Ã0%Ã`k'ðL#àØà ¦Ã`¹ÃP˜Ãð$ÃÀà ÿà ŽÃиðR"ðùÃ0>ÃàëàÀÃ0!ÃaÃð$Ã` ÃÃPß"Ãðú Ã0,ÃÀ… Ãð} Ã0 ÃЬ ð@%ÃàÍ!àIð|ÀxÃPŒ÷ÃàÍ!ÃàJ"à´ ðóÓÃÀ!ÃàzðÿÃЬ ÃðÃÌ ÃÐÐÃÀ&ÃðÃ(Ã4Ã0 Ã"à ŽÃÐÄÃ@MÃ°Û ÃÐ)!ðdÃ`• Ã0‘"Ã` à !Ãðú à ‚ñÙ"Ã0‘"À~Ãà÷Ãp°"Ãà8%Ã"!ÃÀ—ð‚Ã"ðL#ÃpÈÃànÃ@qÃ@YðX!ÃäÃpKðáàÀðL#Ã`• à ùÃ0 ÃP÷Ã`!ÃI!Ãð Ãàhà´ Ãðú Ã.ÃPn ÃÀy"ÃPå!Ãðú ðjÃ`$Ãp? ß!Ã`!Ãþ"Ã`Ã`• Ãðè#Ãðô!Ãþ&à®!Ã@/$Ã°Û ÃÀ Ù"Ã°Û Ã°íÃ` "ðF$Ã@Ä ÃàJ"ÃÐ#Ãì%Ã¥ÃÀ… ðL#Ã"ÃÐ/ Ã0—!ÀB&Ã@¦%ÃК#à Û$Ãà2&Ã` "Ãðâ$ÃPÍ%ÀT#ðÉ#ð½%Ã@¦%Ã@A!ÃÀU(Ãàµ%Ã0 Ã0 Ãðô!ÃPzÃÀ!Ã0s'Ãø#ðÕ!ðL#ÃÀg%à Õ%Ã` "Ã"Ã1%Ã$ÃÐ)!Ã0m(Ãà©'ÃPÙ#ÃÀö"ð·&Ãðk#Ãðô!ÃÀa&ð½%Ãàµ%à&ÃPD'Ã@š'ðF$Ã+&Ã@²#à ç"Ão%Ãò$à´ ÃÀä%Ã`ô%à É'î%Ã`ƒ#Ã`}$ÀÅ%Ã@G Ã@ÊÃД$ð()Ã0%ÃÐ#"Ã@)%ÃÐ &ÀN$ÃPÙ#Ã¥ ÃÀs#ÃPÓ$ÃP»(À6(Ã$à%À×"Ã@Ä Ã –%à R&Ã"à+"ÃвÃàÇ"Ãu$Ãì%Ã0‹#Ãò$ÃðÊ(À¿&Ã`}$à 'Ãðè#à !Ãp˜&ÃÐ|(ÃД$àOÃàP!Ãðw!Ãp? Ã`$Ã`â(ÃÀ"Ã@)%à á#àCÃÀ"Ãð Ã"!Ãðè#ÃÃЦ!ÃI!Ãp¤$Ãp˜&à Û$ÃàÁ#ÃPh!à Ãp!%Ãðk#Ãpª#Ã`#Ãp? Ã0"Ãðq"ÃPë Ã`!Ã`!Ãp? Ã0©ÃÀ‹ÃàÇ"à p!ÃÀàl,ÃPÓ$ÃaÃþ"ÃоÃÐÊÃPýÃÀö"à á#ÃI!Ãð à v ÓÃ°Û Ã{#à Ã4ÃpiÃpÔßÃÐ#ÃpKÃÀÃPÙ#ÃPë ÓÀf ÃC"Ã0$ÃР"ÃàÙÃàV ÃàV ÃÀÃ0 Ãð‰ÀN$à ó ÃàV Ã(Ãp¶!à á#Ãàbà ˆÃ@;"Ãð ÃàåÃð›ÃöÀ`!Ã0!Ã@ÊÃ`§ÃàbÃpª#ÃP€ÃÐÊÃðÃpÔÃpÚÃ@k÷ÃàñÃ0»ÃpÚÃÀ… à´ Ã`NÃ0PÃ0!Ã"ÃpEÃàtðóÃPtÀxÃPýÃPh!ÃÞÃ@MÃ@Ä Ã@_ÃäÃÀ‘ÃPë ÃÀ8ÃpøÃp9!ñðùÃ0Dà%#Ã@kÃð6ÃP€à ÃðvÃpÔÃ0¯ÃÒÃÐ;Ã`6ÃÀÃpàÃð•ÃpEÀûÃ@îÃ@ÃÀ‹ÃР"à ùÃ@SÃ@ÐÃàhÃ0µÃ`³ÃðÃÀ!à¢#Ãð} Ã@ÐÃP Ã`¹ÃPÃ` ÃÐAðvÃ0,ð|ÃàëÀf ÃÀð#ÃpÈà%à ç"ÃоÃðú Ã.ÃpiÃP Ã`Ãð‰ÓÃ[à ”Ã`¹Ã0ÓàÞÃðàOÃàßÃÀ8ÃÐÖÀÃPðóÃ0>ÃÀðáÃ0ÁÃðÃð ÃPÃðÙà ð^ Ã`›àaÃ@}Ã4ÃðÃ( ÃaÃð›ÃÀ£ÃðÃUÃð›÷ÃpàÃmÃÐÖÃ:Ã`§ÃàÓ ÃðÃ"ðÿÃ@âÃP÷ÃPå!àCÀõà ùÃЦ!ÃpÈÃÞÃ0&Ãäà ”à ÃÀÃ@âÃà÷ÃÀ Ã0"ÃpÔñÃP’Ãð§ÃÞÃ@ôÃ`¹Ã0ÇÃÐÊÃàbÃP€Ã@eÃàÓ ÃÀÃÐAÃ0Áà ‚Ã0 ÃðÀŠàäàäðÿÃ0ÁðŽÃpEÃðà ˆàÀÃвÃàëàUà Ãà˜ÃP’ÃLÃÃ:ÃÀ Ã@èÃêÃpWÀ~Ã0©Ã"ÃP’ÃP¤À„ÀrÃà÷ÃÐMÃоðjÃPn àÀÀ×"Ãð ÃÀ ÃàJ"Ã@ôÃP˜Ãpoà ¸à ¦ÀlÃ@kÃÐÖÃpþÃ`HÃÀ—Ã`0ÃðÃðÃpQà À Ã0,Ã0,ÃÐYÃ@îàÞÃ`­ÃÏÀÃgÃ@èÃоÀlÀlÃ@èÃFÃÀà®!ÀxÃ0,ÃPn ÃðÃ0VÃPÃ@Yà ²Ã`BÃ`¹à Ã0>Ã@YÃð$Ã‘à ”ðáÃpÎà Žà ¦ÃÃ0»à #ÃðàØÀð|àÌàgÃð³ÃÐAÃ@kÃ0VÃð¿ðóàUÃpcÃüÀ–ÃP†à ÃpcÃP’Ã@eÃðÃ0ÇÃ0Pðóà ”ÃPýà ”Ãà j"àOÃ02ÃäÃÐâÃpæÃ`!ÃpÈßÃÀÃpcð|ÃÀàÞÃÐÖÃÐÊð‚ÃàñðdÀ`!Ã"ÃP!ÃpÚÃÐÖÃXÃ0åÃð­ðáÃpEÃpìÙ÷ÃmÃmÃð¡Ãp]ÃÀà´ ÃpÚÃäÃsàsÃ`¿ÃÞÃÀ&Ãð$Ãð§Ã.Ãð$à ÃÀ,À„ÃPñà7 ÀlÃPtÃ4Ã`§ðpÃPÃp]ÃpQÃÀÃPtÃ0µÃÐ5ÃÀ©Ã`<ÃÀ©ÃPà ŽÃ0ÁÃP’Ã…Ã`ãà #ÃðÃP!ÀÃ`­ðL#Ã@ÊÃ`HÃÐÄà ”ÃpÚÃpcÃ@kÃ@eðíÃpòÃÀ>Ã0¯ÙýãÃpàÃ`*Ãà ÃÐÖÃÐÜÃðƒà¢#àÆÃàýàêÀ ðpÃððÿÃP’À–Ã@À¨ðˆÃ…ÃÀ¯Ã`¹Ã@ƒÃÀÃÐAÃÀ¯Ãð³ÃP¤àÌÃÐÖðvÃ"ÃPŒÃ@îÃÀÁÃ`BÃð­Ã0ÁÃFÃPŒÃàëÃÃ`­àÒðÿÃPÃ0Ù×Ã`0ÃäÃ0»àUÀŠÃ4Ãà÷Ã`6ýà[ÃP˜ÃpWÃвÃ@âÃà€Ãà÷Ã@SÃðÃÞà Ãà\Ã@kÃàåà v ÃPýÃàëÃðÃpÂà !ÃsÃÕÃànÃ0©ÃðÃ:ðdÃðÃ.à šÃð­Ã@ÃÀ8ñÃP!Ã@èÃpìà[ÃP Ã0Íà Žð|ÃpÚÃàåÃÀÃ0PÃð0ÃÀ2à ¦ÃàzàUðáÃ@âÃð$ÃgÃð›Ãð0ÃpuÃоà |ÃàëàUÃÉÃÀ£ÃÐ_ðŽÃðÃ0DÃàýÃ@ÖÀxÃRðÃ@ôÃ`¹ÃðƒÃ@âà #à[Ã`Åð àyÃàÃPà àaÃ0ÁàsÃÃð¿ÃÕÃðÀ„Ã`6Ã[àÀÃpæÃ@ÃàtÃöà ¦ðÃÀ2ÃÀ¯à ÀxÃðÀxÀf ÃÀ£àÞÃpÔÃ0ÙÃP’Ã@}ÃÃà´ ð|ÃP’Ã@îÀŠÃàñÃÉÃÀÍÃÀ ÃÐG÷à àØÃp]ÃÀ2Ã0DÃPžÃ`Åà  àðÃÃýÃÐSð‚ÃaÃàñÀxÃ0,ÃÐÊëÃð*ðŽÃ@ÜÃ@SÃ02ëÃ@âÃàýÃÀ‘ÃaÃÕÃÐYÃÀ2à ”Ã`¿àØÃ@MÃPÃ0DÃ@qÃ@kÃ`BÃP’Ã0»Ãð*ÃpÔÃÀ—Ã`6Ã0»Ã`›àÀðóÃêÃP à ¦Ãð›Ãð àÀÀà ”Ã@qÃÐÖÃ02àÀÃpÔÀðáÃð‰ÃPŒÃàtà ”ÃÀ‘Ã@Ê÷àÒÃäÃàñÃÐGÀÃ(ýÃ0DÃPÃиÃàñàäàÒÃàåÃÞÃ:Ã4Ã@ÖàÒÃPÃpiÃ:ÃÀ,ÃÃÃpcàIÃÏÃ@‰ÃÐYÃÐÄÃÐÄÀxÃàýà ÃÐAÃPŒÃÀ,ÃP÷àÀÃðçÃPzÃpWÃFÃÀà ˆÃ0!ÃÐSÃÐYÃPÃЬ ÃpQÀ Ã…ð)ÃðTÃÉÃà÷Ã0,Ã@ÖÃànÃð¡ÃPÀ ÃÐMÃPtÃ@eÃ`³ÃÐAÃàåÃ¥àØÃ@kÃÐÊà ÃpcÃ08à à ŽÃàbÀõà ˆÃöÃð0Ã@îàOà[àÒÃ4ðpÃÐMÃÀ&àÞðáÃ0ßÀ+Ã@Ã`rÀ¢ðÿÃ4ÃÐÜÃðBÃ@kÃ0,Ã@ÜÃ0¯ÃÐÖÃÐ_ÑÃÀÁÃÐSÃÐSÃÀ¯Ã^àêÃð*Ãsà  Ã0ÍÃÏÃüÀÃðËÃð¿Ã@qÃmÃpQðÿÃP¤àØà ÃyÃ.ÃàzÃàhàOÃÐeÃð›ÃÐ_ÃLðšÃPžÃöÃ0Ùà #ÃLÃ08Ã`*Ã`§ÃàýÃоÃêÃPÃPÃà÷ÃPýðvÃP ÃÀÃоÃÃÐ)!à ˆÃüà ÃP’ÃPÃ0PÃ0!Ãp]ÃÐÖÃð³Ã(ÃPŒÃà÷ÃpuÃpþÃmÃ0,àsÃ`NÃðBÃÀ8ÃÀÃÀðóÃÐÄàmÃð0ÃFÃ0VðÃ0ÇÃÀ2Ãà€ÃöÃpàà 5Ãð0Ã4Ãð­à #ðvÃP’ÃöÃ`­ÃÐÐà 5ÃÀ»ðÿÃààÒÃp]ÃÐSÃÀ8ÃÐÊÃpÔÃà  ð ÃP’ÃP˜ÃÐÊÃÒÃP¤Ã@âà ”ÃàzàêÃ@Ã`›Ã@YýÃ`NÃÃPžÃÀ¯ÀõÃÐAÃð­àgÃànÃ:ðàöÃpøÃFÃ^à ¾ÃÀµÃðÃpW÷ÃÀ©ðÃ@ƒÃà ÃP˜ÃÀ&ãÃ0ßÃÀµÃ@Ã`TÃ`¿ÃÐÐÃÀÁÃ@qÃÐÐÃ`TàäÃPàIÃ`$ÃFÃáÃÐ5à ˆÀ¢Ã0ÓÃpÂÃÐGÃ4ð Ãð<ÃyÀÃ@eÃÀµÃàëÃ`<Ãð³ÃÐMðóÃðÃÀ8à ;ÃÀ»ÃÐSÃÃ`ÝÃ@Ã@àØÃÐGÃð6ÃÐkðàmÃLÃPà ¦Ã`¡Ãð$ÃÏÃpæÃXàØÃÐGÃàÃ`TÃÀJÃ.ÃàhÃpÚÃÃdà ¬À¢à  ÃRÃÃÃð¡ð Ãà÷ÃÏÃpæÀ–ÀŠàêàÌÃ0DÃà€à[à[ÃÀ8Ãð¿ÀÃðà ¦Ã0>ðvÃÐAÃàð÷à šÃÀa&ðX!àUÃà€àsÃðZÃ`õÃ0ßÃÉà ²ÃÐkÃpiÃ¥Ã08À%ÃÀµðŽÃÉÃ`ÝÃð­àäÃ:ðvÃÐÐðˆÃÏÃð0ÃÃ0VÃ0ßÃà€À~ÃЛÃLÃ¥ÀðÃ@èÃP÷ÃRÃpìÃpuÃ`Åð‚ÃpWÃÐÊÃLËÀ´Ãà à #ðˆÃäÃ0ÁÃ@îÃ@îðÃÏÃ`§ÃÞà šÃÃ0VÃÀ>ÃÐÜÃ0,ÃÐÖÀÃ0»ÃüÃÛÃÀµÃÃ`¹Ã`¹ÃpcàaÃð³à šàUÀð À¢ÃÀ2ñÃÒðvÃÀ£ÃPžÃ@Ãàn÷à ²ÃXÃ0ÓÃ@_ÃP Ã0ÇÃð6ÀàaÀÀŠÃ`BÃPð”ÃÀÇÃà˜Ã`BÃÐ_Ãà÷àÆÃ0,Ãðà /ýÃÃ4ð|ðùÀlÀ~Ã…Ãà†Ãð§à #Ã`ËÃpuðšðŽÀ~Ã0ÍÃ@wÃPžÃÀ»à šÃaà /àðÃpòÃP˜Ã0ÁÃaà à ˆÃ@Ã`BÃêÃpìÃp{ÃÐÊÃüÃpuð|Ã@ÖÀÃÀ‹ÃðÃÐôÃ0ßÃÐSÃ0ÇÃðÃ0hÃFÃðàÒÃÐÊðÃàŒÃ0,ÀxÃðà ”ðŽà[ð|ñðŽÃð¹ÃàzÃp]ÃðÃgÃ0>à ŽÃàåÃÐMÃð*ÃíÃð¹Ã`ËÃà ²ð”ÃÐ}ÃpæÃPýàðÃÐSÃÐÊà à ÃÐâà ¦àaàgÃÉÃpÃð0ÀŠÃ`¹à #ÃðàØà Ã@wÃ`ËÃyÃ`ÑÀ¨ÃÃpòÃÀ&ÃÀ£Ã¥ÃÛà ¬ÃÀµÃP]Ãà ÃÐâÃP°ÃðNÃð*Ã`ÑðˆàaÃpàÃÀDÃÉÃ`ÑÃðÑÃpoÃÐYÃRàäÃ0µÃÀ—Ã:ÃÀ2Ãð<ÃmÃ0\Ãà’Ãàà ŽÃ@ôÃð Ãð ÃÀDÃà¤ÃÀ,ÃpÃÐ#"ÃpWÃPªÃà-à ÃP¼ðšàØÀŠð Ãàà ²Ã@‰ÃÐeÃÐAÃÀDÃ0ÇÃÀ8àsÃà†Ã@ÃÀ8ðÃð¿ÃÐîÃ`ÑÃÀ2ÃàýÃð$àaÃÕÃÐèÀð ÃÐSÃ@ÃPžÃÀ ÃP ÃÐâÃ0åÀ%ÃÐèÃ`Hð ÃPªàäÃPªÃðÃPªÃ—éÃ@àäÃð6ÃpþÃÛð Ãð} ÀxÃpÔà ‚ÃÐGÃ`ZÃ0JÃRÃð*ÃpiÀlÃpÎÃ@}à ðÃLàÞàäÃÀ»ÃP˜Ãüà[ÃÀ8ÃpÃpþÃP˜Ã"ð”ÃÐèÃÐMÃð0Ã@ ÃLàêÃð¡ðùÃ0»ÃFÃàŒÃ@èðšÃP!Ãð§àIÃà ÃÕÃðBÃð³ÃÀÁÃ0Çà ŽÃà÷ÃyÃÀ2ÃÐeÃÐúÃ`ÑÃ@Ãð*À¢Ã0ßÃP¤àOÃ…ÃàýÃànÃpcÃpàÃP€ÃpQÃ4ÃÉÃ@kÃÐSÃÐÐà  Ãð6ÃÀ&ð Ãð¿Ãð<Ãà˜ÃP-Ã@ôÃàtà šÃ@ƒÃð›À–à /ÃÀ8Ã0bà àäÃ@âÃ(à ¦Ã¥Ãp]ÃpWðšà /ÃP!ÃÏýÃ@kÃ@ôÃð¹ÃÐ_ÀÃ@èðpÃÃÃ¥ÃÐÐÃÐÄÃоÃÀÃpcýÃ0DÃÐÊÃ0DÃüÀÃ`<÷ÃðàÀÃpEÃ0µÃpuÃÏÃÐúÃP¶à ÀÃàýÃ`¹àUÃpòÃðÃpÂÀûÃ@ÜÃgÀÃðÃP˜Ã`¿ÃP†à  ÃLÃÐèðŽÃÀ2Ã"ÃÀÃÐ/ ÃpKÃÀ©Ãà\à v àÌà šÃàñÃÐMðùÃÀ£À–À ÃÛÃà˜Ã0DÃàbýÃ0£Ã.ÃðÃàÓ Ã°íÃÀ,àüÃ`­ÃðÃLÃ@âÃpàÃÌ ÃpKÃàëÃPýÃpààOñëÃ@_ÃàzÃØðjÃ@_Ãà€ÃÀ&ÃÃsà Ã`0Ãð$Ã0&Ã0 à ¦Ãà˜Ãà†Ãð<ÃP˜àêÃUÃàåÃð*ÃPžÃÏÃ0ÍÃð¡ÃXàOÃPÃànÃ`¹ÃàñÃpìÃð³ð Ã0VÃÐYÃm÷Óà ŽÃÀ&ÀlÃ`ÃÃÃPÃp]ÃLÃÃð‚ÃöÃà÷àUÃ`§Ã0»ÃàzàÒÃÐMÃyÃ@ôÃð³Ãà Ãàtðà )àÆðáà=ýÃRÃÐÖÃÐÊð‚ð”Ã0PÃÀÇÃpuÃànÃÐeÃP˜Ã:ÃÀ&ÃÀ»ÃpòÃ`¹ÃðÃ`6ÃÕÃÐÖà šÃààêÃ0JÃ@kÀœÃ`BÃyÃÏÃÐÐàaÃP°àà ¬Ã0ÇÀ~àÃÐGà ÿÃà€ÃÀ£ÀrÃÀ£ÃÀÃPÃ@}Ãð§ñÃð0Ã@kÃ@îÃà ÀÃ0Áà ¦ÃÐÖÃðƒð|ÃÀ&ÃÃð‚ÃàýàäÀÃÐYÃ¥à ÿÃÃÃPýà ”àöàÃP’ÃpæÃÀ¯ÃÛÃ`¹ÀrÃ`ÅÃ`0ÃÒÃaÃ@kðùð‚ÃsÃP€à ÃaÃÐÜÃð­ëÃð¿À à àUðÿà ¦Ã0»Ã@èÀ–Ã@îÃpKÃ@Ä Ã€lÃ@YÃ(ÃàßÃÐÄÃ@Ã`<Ã4àÆÃ@kÃ0ÇÀÃÀ8à #Ãêà ¦ÃgàCà #ÃðˆðŽàÒÃ`<à[ÃàV ÃÀÃð¡à  ÃàhÃðÃàzÃàŒðÃ[Ãиð|Ã0¯ëÃàßÃÀÃ0ÇÃÀ»Ãà÷ÃmàÞÀÃÀ8ÃÀ&Ã@A!ÃиÃÀ,ÃÐMÃ`¿ÃànàIÃpQÃ`$ÀÃ@âÃÀÃð§ÃFÃ4ýÃàåÃÀÃÕÃÀÓà Ã0,à ÃÐèà ”ÃÀ!ÀxÃp]ÃpòÃXÃ`6àOÃÃ`6Ã@eÃ@eÃ:ßð|Ã@ÜÃ@âÃ0µÃÀ¯Ã`NðÃ`¹ÓÃÀàØàÌÃÃÃpòÃ@eÃÀ,ÃpÚÃUÃp'ÃpQà´ ÃÀÃP'ðÃPÃpWÃÐÐÃð§ÃÐÄÃÞÃ"ÃPªÃXÃÐâÃ0PÃp]ÃàÀÃÀÃ`­ÃÀ—ðpÃPžÃ"ðvà )Ã`ZÃ@qðÕ!ÃÐ5ÃоÀœðÃàñÃ0ÁëÃ0!ÃÏÃànÃ"Ã@_ÃàëÃÐÄÃPýÃÀ‘Ã`ðÿÃ0DÃ` Ã[ñÃÐ;ðdÃpàðŽÃðàOÃpÚÃXÀlÃ=#Ãðe$ÃЬ Ã02Ã0ÇÃÐGÃÐAÃpEÃ@YÃ0£ÃPñÃÐÄÃPŒÃÀ£à ¬ÃànÃЬ Ã0¯ÀlÃPå!ÃÀ Ã`!ÃÀ Ã@ÀßÃàV ÙÃàtà ¦Ãð¡Ã`*Ã`›Ã@SÃ0µÃðw!ÀõÃ(ÃðÃPë ÃpÈÀf ð|Ãp? ÃЦ!ÃàåÃ0 ÃàßÃ0 Ã"!à ÿÃÀ‘Ãð À„ð‚Ãð Ç!Ã:ð|Ãð‰ÃI!à í!ÃÀ‹Àlà7 ÃP÷ÃÐMÃð ÃàÙÃaÃ@kÃ`0ÃàÍ!à ÃP÷ÃÀ ÃÀÃPtÃÐ;à ”ÃP†ÃpÎÃиÃ`0ÃÐMà j"ÀïÃ0,ÃÀÃð•ÃP†Ã0 Ãàåà ‚ÃÐÊðíðçÃ` Ã4ÃàñÃPðdÃO ÃàJ"ÃàÇ"ÃàßÀÃ0»ÃUð|Ã@ÖÃ0£ÃpEðvÃPàêðíÃ0 à=Ãp]ÀûÃ0ÁÃ.à ÃÐSÃà÷Ã`6ðdÀf Ã@eßÃ"à ÿÃð¡ÃðÃÐMÃpWÀã à !ÃànÀ~àäÃLðóÃÐ;Ã@Ãs÷Ã"ÃÀ… Ã`0ÀÃð›ÃpKÀrðÕ!Ãð} ÃPŒÃàÃð­Ã@kàCÃàÇ"ÃpÎÃPðÿÃpKà ²ÃÀÁÃàëÃ@ÖÃ@îà À~ÃPŒà ÙÃC"Ã`0ÀœÃpæÃÐúÃà ÃÐGÃ`<àäÃêÃPÃ.ÃpÔà ÃàýÃ^ððÃà÷ÀéÃàßÃ@qð ÃÞà ”àÞ÷ÃpÂÃPb"Ã@YÃ@èÀ%ÃÃPžÃð0ÃFÃÃÃÕàêÃÐSÃpWàØÃP€ÃðÃäÀïÃ@îÃÐSÃÀ,àÃÐYÃPÃPŒÃÐGÃ`Ãp¼ ð‚Ãà˜ýÀxÃpiÃ@qÃð$à ÃÐMÃÐÊÃð6àØÃÀµÃàbðóÃ`6ÃpàÃð6ÃðÃà€÷Ã`§ÃÀ‘ÃÀ‹Ã`¡Ã"ßà ÃPn ðpðÃ@qÃðƒÃP€ÃàñÃ0ÍÃ0Vàaà ‚ÀlðíÃ`fàsà Ã`HÃàßÃ0DàððÙÃ@_ðíëÃ¥Ãð‰ýà[ÀÃ0©ß!Ãà\ÃÐÄÃ.àÒÃöÃàbÃ à ”À–à ÃàbàOÃàñÃ`<Ã¥ÃpÚÃ`³ð ð‚ÃðÃÀ—Ãà€ÃüÃpQÀûÃÐYÃÐèÃ`¹ÃÀ Ã0µÀÃ0ÁÃäà Ã0£ÀràÀÃpWÃpÚëÃ@îÃÕàÒÃ@îàÒÃ0ÇÃ@èÃànÃ@èÃðñÃ@eÃ`­Ã08À„ð”ÃsàØÃ"Ã`­à j"Ã`*ÃmÃÀ—Ã0ÍÃüÃÐÜÃ0VÃÐSÃ`›ÃÃÃð*À–ÃáÃ`0Ãàñà ŽÃpuàsÃÀµÃ@Sñ÷ð|ÃêàØÃP˜ÃP÷ÃЦ!ÃÐMð|ÃpiÀ–à ÃÐ_ÃÃà )ÃÐÐÃÐÐðˆÃ0JÃpiÃÉÃLÃð³ÃFÃÀ2Ã`³Ã@ÊðÿÃ`›Ã[Ã02àgÃÀ£ðçÃàzà ŽÃFÃPtà ÃÐGÃÀ,Ãð­Ã—à )Ã`¹àCÃpWðŽÃêÃ`›ÃUÃ@ÊðpÃ`Ñà ¦ÃpàÃ0,Ã`³ÃÀ2ÃÀ&Ãð Ãà÷Ã`NÃp]Ã@Sà ùÃ.ð Ã@wÃÀ,ÃðÃpKà )Ãð‚ÃÀÃ`$ÃÀÃÀ©À„ÃвðvÃP€ÃàýÃ`<ÃÃÃðÅÃ0ÁàaÃànÃ`$ÃpQÃ@èÃàzÃ`6Ãиà&Ã:à‹Ã@ÃÀ>Ã@eÃP÷ðÃÀ8ÃÀ,ÃÐSÃÀ,Ã0ÇÃ@eÃð*ÃXÀ ðpÃÐâÃÐÜà%#Ã`$ÃçÃà€Ã0Áà ˆð@%ÃÌ Ã ÒÃPÃäÃpàÃ0nÃP’ÃP˜ÃP Ãð*à /àaà ÿÃàÙÃàßÃ`§ÃðÀÃÐÊÃ@ÜÃð¿ÃÀÍÃà€à ŽÃpÈÃÉÃð ÃÀÃà÷ÃÀÃà÷ÃPÃ`6ÀxÃpcÃ@à[Ãàtà à šÃP’ÃÕýÃ0¯ð ÃàºÃÏÃÐeÃ0ÓÃ0ÍÃP3ÃP3à ¬Ã@}Ã0åÃPÃðÃP'Ãð¿Ã[ÃpoÃÐÄÃðÃÐ_ð Ã0ÇÃ0,ðŽðšÃPðÿÃ`*Ãð¡ÃÀµÃÐÊÃÐMÃÕÃP!à #àsð)Ã`<à Ã:Ã` Ã@ÃáÃÀ8ÃàtÃÐMÀœÃ02ÃpòàðÃð­ÃPà  àäàgðóÃÐ/ Ã0bÑàüÃð0ÀxÃpuÃðBÃà˜Àà Ã@qÃð§Ã0ÁàÒÃà÷ÃàåÃ0ÓÃLÃÏà  ÃÐSÀÃ`Hà ¬ðšàsÃpoàaàäÃ.ðÃ@kÃànàðàðÃÐÄÃð•Ã`¿ÃÀ©ÃÐôÃpÃð¿Ã0ÇÀ´Ã…ÃPŒÃàzðà ²Ã0>ðÃÕÃÐAÃgððÃÃ0>ÃàtÃ@qÃLÃððóÀûðùÃÀ©à AÃPÃpoÃàzÃ0ÇàUÃp]ÃäÀËàÞÃ@Ãð­ÀÃ(ëÃ@}ÑÃÃ0\Ã`×Ã0DÃÀ£ÃpcÃðÃ@kÃ0PÃpæ÷ð|àIÃð§Ã…àÞÃ0JÃ@àOà ÃXËÃ08ÃP€ðˆà ²Ã@ñÀ~àØÃ@èÃPà #Ã`¡à Ã0ÁÃà€Ã`Hà ðóÃmÃàëÃÀÃÐÐÃP'Ã0>ÃÀÃÏÃpEÃ`*Ã@ÃàzÃ0‘"à+"Ã@ôðÃÀÁð”ÃP’ÃpÚÃpÎà ÃP ÃPŒÀïðíÃ@kÃ@èÃÐGàOðpÃ`­ÃaÃànÃà\ÃpEÃ0µÃð•Ã0©Ã:Ã@ðˆÃÐGÃ0&Ã08ÃP Ã0¯ÀûÃ`¿àÌÃÐ)!ÃàñÃ@âÃ0µÃP†àÌÃÐÐÃ`ÅÃÐSÀûÃàÃ0\ÃÃÃ0ßÃÛÃ:Ã0©ÃäÃFÃ0JÃÐAÃÕÀœÃ`<àIÀõÃÕÃPÃÃÃ@ÃêÃ0»ÃpcÃÀÃÀ—ÃpWÃðÃÐeÃ4ÃÀ&ÃàzÃpòÃðÃmÃð§Ãð$Ã@kÃ`ÑÃ@wàÞÃð ÃÀ,Ãð$Ã`­Ãð•ÃmÃÀ>ÃÉÃP ÃaÃ0Và  ÃP†ÃÞÃÀ"ÃàÒÃ0DÃ0DÀ–ÃXÃÐÖàgàäÃàñà ‚ÃäÃà€àU÷ðùÃÐYÃð¹àÌÀûÃsÃÐÖÃðÃ0£àOÃFàUÃêÃð$À„Ã`$ÃpWÀ„Ã@âÃ`BÃ^àØÃ`ËÃ@îÃàŒà AÃÛÃmà ²ÃXÃÐÐà Ã@ÃÀ©ÃpiàOÃ0ÇÀŠÃÀ&ðçÃ@MÃÐYÀÃ`ËÃ4Ã`BÃÀ2ÃÐÜÃLÃðÃà ÃpÚÃð$Ã…ÃÃ@ôÃ0Vð ÃóÃÉÃ@ÃðÃÀ2ÃÐÜÃÀ2ÃÃ@}Ãð*Ã08ÃPýðùëàØà Ãð›Ãð$Ã0»Ãð Ã@îÃð§ÀðÃPÃÀ ÃÐSÃP ðvÃ`<ÃyËÃ@ ÃÐMðpÃ@èÃPŒÃpþÃP!Ã@ÜÃpàÃ¥àUÃ0>Ã@âÃPžÃÏÀ ÃpQÃð*Ãà÷ÃpEÃ`<ÃÀJÃÐYÃÀÃÐÐÃpÃÃöðùÃsÃLÃpuÀœÃpÃ@}ÃPð|ÃPtÃàåÃPzÃ@eðùÃðÃ0ÍÃPžÃ`ÅÃÕÃLÃðÃð•à ŽÃPÃÀ Ã`¹Ã0PàmÃp]àaÃàD#ÃO ÃÏÃð*ÃÀPÃÀ£ÃÀ‘Ã4ÃP†à ”Àf ÃÐ)!ÃPŒÃaÃpÂÃ0%ÃØýÃÀ Ã4ÃàëÃàÙÃ0&ÃÃP€ÃàëÃ"ÃÀê$Ã` "ÃÃÀ!ÃPß"à j"ÃPn Àõð^ ðçÃp¶!à ÃP÷ÃÀÃPŒÃàåÀûÃO ÃC"Ã@_Ã4ÃpÂÃ7$à ^$ðjÃÀÃÒÃ°Û Ã0,ÃиÃ`›Ã@Mà´ ÃðƒÃPñÃÀ!Ã` "à=Ã@_ÃÐ;Ãиà ”ÃàåÃÀö"à ðçÃЬ Ù"ðpÃð‰ÃðÃp9!Ã4ÃüÃØÃÐ#ÃðÃ`ÅàIÃ0‘"ÃÀ"Ã@MÃÀ£Ã"Àïà p!ÃC"à v ÙÃà÷ÃÐAÃàßÃð•ÃÀy"ÀlÃP†ÃPzÃðÀÝ!Ãð Ã@ÐÃÀàÀÃàåÃaÃ0£Ã@YÃpæÃÀ!ÃàP!Ã@Ä Ã ´ ÃàßÃ0£Ãð‰ÃO ýÃàëÃp¼ ðR"ð@%à d#Ãp3"ÃÌ Ã@Ðà ‚à ÿà¨"Ã0!Ã@YÃð¡àIÀéðáÃ`­ÃUà=à ÃO ð^ ÃÀ!ðóàÆð^ Ã@âÃ( Ãp!%ð‚Ã@âÙÃ@ÐðçÃиÃ.ðÃyÃ@YÃàÓ Ã€õÀ¿&à ^$Ã0µÃÀ‘ÃP€Ã{#Ã@ÊÃÐAÃp? ÃPñà í!ÃpWÃðÃ`$ÃpEÃ`$ÃsÃÆ!ÃÐ/ ßÃ"Ãð_%Ù"Ãp9!ÃmÃPÀûÃàÓ ÃðƒÃÀy"ÃÀ àºÃ°Û Ãàëà ”ÃLà Ã`$ÃpWà ‚ÃЬ Ãp'$Ã0!Ã@ÐÃpEðçÃ`ÑÃÀ!Ã@¬$Ã"ÃpÈÃ4Ã0 Ã`!Ã0!Ã0£à ùÃP†à ÓÃÐÄÃ` ð|ëÃ0Áà ˆðáÃЬ ðçÃð ÀïÃÀÃ0µÃ@YÃ.Ãêà p!Ã( Ãð›ÃÐ;à |ÃÀ‘ÃFÃ"ÃÐ/ ÙÃÀ!ÃÀ‹ëÃ`$ðáÃ@¾!ÙÃÀ… Ã@ÃP†ÃpÔÃÐMÃöÃÐSÃ"Ã0‘"Ã@eÃ`§Ã@wðÃ@ÃP Ç!à7 Ãp? Ã@MÃpÔÀÃ0åÃÐGÀà[Ã`HðáðÕ!Ã@¸"Ã.Ãð0àØÃ`0Ã`$ÃÀ©Ãð6ÃÀ&ÃPýÀ ÃpoðŽÀxÃpKÃ¥Ã0>Ã@qà[à  Ãð³àgÃÐMÃÀ—ÃpÂÃ0!Ãð ÙÃpæÃàtàØÃÐMà ²ÃÐYÃð›Ãð|Ã`Å÷Ã0ÇÃð³ÃaÃàëÃÀÃÀ>ÃpòÃgÃ@_Ã`NÃÀ&ÃðÃ`³Ã@qëÃàëÃð•ÃÀ‹àºÃP˜ÃpìàÒÃðÃP˜ÃÀ¯Ã@eàäÃ^Ã(ÃÃÃ@kÃLÃ0ÓÃÀ,ÃpQÃоðpÃ`ãÀà šÃP’Ã0åÃ^ÃÐYðŽÃ0©ÃÀÃ@_ÃðàÞÃ.Ã@èà v ÃðÃàýÃðÃÐÊà ÃpæÃðHÃðÃ0Çà ”ÃPÃÀ\ðÃð¡Ã`0ÑÃ`ãËàIÃpWà #ðóËÃÐÖÃPÃðHÃ@úðÃà ÃÐÊÃöÃðÃàÃð³ÃÀ©ÃpÔÀœÃXà ²ÀÃpiÃ@ƒÃ`<ÃàåÃð0ÃRÃ@}àÒÃÀ2ÃàtÃà†à ÃàÃàtàaÃ0Çð ÃÕÀŠà AÀÃ`¿Ã@kÀŠÃ`¿ÃP¤Ãð0ðŽÃ`­Ã(Ã@_à=ÃÕðvÃüÃ`ÅÃÀ8Ã`Bà ÀÃ@_Ã@_à ¬ð#àÃð¹ÃÀÃ@wÃð*Ã@‰ÃFÃ08ÃpòðÃsÃðÃP†Ã@ôÃ(Ã@kÃàÀœðÃ`BÃàzÃ@ÀÃFà #Ãð¿ÃpòðÃÐkÃ…ÃPzà |ÃPÃÃð#ÃÀ8Ã@âÃêÀ ÃÐâÃ`TÃà†ðdÃÀ‘Ã@ÜÃFÃ`*Ã@}Ã^ÃP¤Ã@}Ã0PÃàzà ‚Ãð›à[Ã0\ÃP Ã0!Ã@îàaÃ`<à ”ÃPzÃ0JÃ@ƒà ;Ã:ÃP!Ãð ÃÐAÃÐîÃFÃP-Ãp‡ðð¦ÃÐkàÞÃ`HÃàÃÕÀ%ÀÃÐÖÃP’Ãð§ÃPŒÃaÃ[Ã@îÃÐÐÃðÃ0,ÃPžÃ`NñÃ4ðvÃPß"Ã`6ÃP!Ã0bÃpøÃ@kÀÃ0Ó÷ÃPÃöÃàåÃöÃð¹Ãà÷ð Ã0ÍÃpoÃÐÄÃ0>ñÃpæÃÐÐàUàOÃðƒÃàÙÃ4ÃÀ»Ã0ÇÃ0,ÀûÃÐYÃ@eÃPÃPýÃO ÃPýðÃpàÃöÃ¥ýÃP¤Ã`<ÀÃàýÃ`ÅàÌÃàëÃFÃ0&àÀðçà ÃÐÖÃÃàUÃP†Ã08ÃÐ_Ã@eÃð‰ðóÃð6Ã0PÀ„Ã(ÃÐMÃÀÃÀ2Ã:à ð ÀÃöÃиÃLÃÐÜÃð$ÃÐÖÃ@Üà Ãð§ÃÀ2à ¬ðÿÃáÃÀ>ÃðÃpWàaÃÐ_Ã`ËÀÃ@îÀ~à /ÃàzÃÐîà Ã@à #Ã^ðÃà†ÃÐGÃð‰Ã^Ã@ÃÏÃÀ>ð Ã0VÃ0JÃ0ÍÃáÃÐeÃpþÃ`×ðÃÐ_Ã08ð|Ãp]àØÃ@ÃpæÃP°ÃÐkÃpcÃdÃàÃðàüÃ0JÃ0ÁÃð ÃànÃð6À Ã`³Ã@_à ÿÃ0µÃ02ÃpàÀð|Ã@eÃÐSÃ0VÃÀµðˆÃ@}àaÃ`­à  Ãð§ÃLëÀ+ÃÐwÃ`¹ÃsÃp{ÃpþÃpoÃÀ à ÃPð¦Ã@úÃàhÃÀ£Ãà†Ã`ZÃ0PÃ0ÁÃpiÃÐeÃ0ÍÀœÃPEÃ`¹ýà /ÃàÃÃð*ÃÐèÃ0åãÑÃPÃçÃLÃàªÀŠÃ@kà MÃàaÃðNÃóÃ`HÃð¡Ãpà ¾ÃÐqÃ`HÃ0VðÃÉÃ@ÃPžÃÕÃà’ÃÐwÃ^Ãð$Ã0ÁÃÏëÃàŒð)Ãà÷ÃP'ÃÏÃp‡ÃÐ_Ã`NÃ@qÃð³Ãà†Ã0JÀûÃðÃP¶ÃpÃ0ñÃ`ÝÃ:ÃPÃP à[ÃвÃð§à ;Ãpu÷ðàðÃXÃRÃð­Ãð³ÃÃP!Ã0ßÃÕÃð*ÃÀÁÃáÃ0Íà ¦ðÃ@à #Ãp{Ã0bÃ0bÃ`¹Ãð0ð#ðÃRà ÃÐSÃP¶Ã0ëðŽÃà’Ã@ÃP˜ÀœÃ0VÃpuÃàð²à—ð)ÃáÃÏÃpuÃ0DÀ%À1ÃÐqðšÃ@Ã@ƒÀÃ0ÓÃ0ëÃÐôÃP°ÃÀÁðšÃpWà šÃÐSÃÐAÃðÃàÃÐkÃÐôàðÃ@}Ã:à /ÃÐYÃÃÃð¹Ã0Jàäð¦ÃÐqÃPÃ`*Ã`BÃàº9Ãx¶…ÃøÊŒÃ°è‰ÃðŠ‰Ã ¡„ÃÈ‹ƒÃ¸pÃ@Š€Ã(€Ã`ä{ÃЄzÀÁyÃEuÃæoÃPÿpÃ@ÞoÃ`ÇkÃP#kÃ@üjÃ@ðlÀ°gÃ{lÃ@‘gÃ@eà ´iÃÐaÃldàdÃdÃdÃ@8aÃp$cà abÃ0#^ÃçZðê\ða^ÖaÃ0 ^à …\À{[À‡YÖ]Ãð-WÃð˜ZÃ%[Ãð\ÃP ZÃð¶UÃà•TÃpéWÃ0MWÃàSÀ·Qà ÇQÃà$RÃaQÃðæMÃ)PÃÀqMÃÀèNÃüPÃØRÃ0kRÃPÅPÃð]Oà VOÃCVàRà)LÃФKà nKÃÀHà tJÃ@¶LÃp+MÃ0}OÃPéJÃPËOÃÐ!LàMFÀùFÃ,IÃ`ŸHà nKÃGKÃðòKÃÀHÃPïIÃÊJà²JÃÖHÃÊJÃаIà ŒFÃPBÃP EïDÃPGÃ&Fà Hà¾HÃ2HÃ0$Ià †GÃJDÃ@òBÃ@àEÃ0ÑAàw?ÃP®?àî@Ã`ÃBÃ@@ÃwCÃAàô?ð°<Ãà¢=à ¶?Ãà¢=À;<Ã?ÃPCÃÐì?ÃBÃÀ6BÃÐæ@À)?ÃðL=Ãà1;Ã`R@Ã@¥:ÀG:Ã0TAÃàœ>À¸<Ãý;À¾;Ã`d=Ã>ó9à›9À;<ðž?Ã0ÑAÃ@.9à•:ÃÀÝ;ÃðX;Ã`8Ã@@6ðW6Ãðí7Ã0¢4ÃN5ù8Ã<8ðQ7ÃPÒ9ÃÀõ7ÿ7Ãp,8à Ú9Ãh;à9ÃB7Ãp :ðÎ7Ã8Ã-4Ãà=9ÿ7à 2Ãð 3àH2Ã@Ã5ðì2Ã0¢4Ã@Ï3Ã@Ï3Ãë:ð]5ÃpJ3ÃPÞ7Ãp¯7Àq3Ãà.Ã’4Àw2ð3ÃàÌ6Ã@L4ÃÀû6ÃàÒ5ðà4Ã` 3Ã7ÃpD4ÃpÓ1à<4Àè4ÃPö3ÃP&,ÃE0Ã0œ5ÃÀœ1Ãàg2Ã`/1ö.ÃÀ3à 3à 3Ã@@6ÃÀ„5Ãàð0Ãph.Ã071ð/Ã`M,ÃÐX.à 2à¿3ÃP‹0ÃP0ÃÐÉ0À}1ðo2Ã`A.Ãpñ,à 1à¿3Ãà.Ã@j/ÃP2Ãð‚4ÃÐ:3Ã0O-Ãpb/ÃÐX.À$+Ã0Ø+ÃP0À‰/Ãàs0ÃË5Ãð0àf-Ã`²0Ãð/-À.àÝ.à “0Ã071Ã`G-Ã`G-Ã~-ÃPµ)Ê+Ã071ÃÀ¨/Ã@ó-ÃP.à /Ã,Ã@v-Ã0C/Ã@ù,ÃÀ+/Ãà+Ãi*Ã`S+àl,Ã0ä)Ã@í.ÃÐL0Ãc+Ã`_)ÃP-àõ*Ã@d0ÃÚ,àr+Ãpë-ÃQ.àõ*Ã?1Ã?1Ãð;+Ã0g)Ãp€*Ã],àé,ÃÔ-Ö)Ãà*ÃÐX.ð/Ãû-à ±+à ½)ÃÐ^-Ãû-Ãc+ÃP0Ã`â(ÃÐp*ÃÐç+ÃP&,Ãpz+Ã0g)Ãð/-Ãð5,Ãð²,Ãpt,ÃPD'ÃД$Ãà&(ð™+Ã(à @)Ã(Ã0C/ÃÐL0ÃÚ,ð¥)à L'â'Ã9.À¡+àã-ÃÐR/À›,À•-Ã0Æ.Ö)ð±'à Ã(Ãi*Ã0Ì-ÃP©+Ã)À$+ð·&Ã`è'Ã?-à F(ÃP&,ð«(Ö)ÃPÇ&à X%Ã0ö&Ã0ö&Ãà+ÃÐd,Ãø'ÃÀê$ÃÐÿ'Ã~-Ãu(à)â'Ê+Ã0ê(Ãà—*â'à 'Ã0ö&Ão)ÃðG)Ä,à @)Ãì)Ãà-àé,Ã0ð'ÃÐd,Ã0C/àï+ÃÂ,Ãà‘+ÃÀm$ÃÀÀ+ÃÀ=,ÃðY&Ãc'ð“,ð-ÃðA*Ãp†)Ã@)ÃðÄ)ÃP¯*Ã@ &Ã`$Ãp˜&ÃP>(ð™+Ã0s'À¿&Ãì%ÃÀI*ÃPÇ&Ãð_%Ã`k'Ã)ÃÀa&ÃPÙ#Ã@'Ãpý*ÃPµ)ÃPÍ%Ãþ&ÃQ*Ã0[+Ãp )Ã0Þ*Ã0Þ*Ãð;+Ã0Þ*ÃPµ)ð()ÃÀC+Ã0a*ÃÐ|(àr+Ã`q&Ã@)àõ*ðŸ*àr+ÃÀa&Ãp&à$Ã{#àf-ÃÐX.Ã@ç/ÃP¯*À¿&ÃÀê$ÃpÂÃp3"Ã`â(Ã0y&à&Ãà*Ãæ*Ãø'ÃPÇ&ÃP¯*Ãp )à Ã(ÀÑ#ÃÀö"Ãp'Ãà+à)Ã`î&Ã`q&à ½)Ãæ*ÃÐ|(Ã$Ão%à 'À6(Ã`S+Ã@'ÃÀð#Ãà£(Ãæ*à ½)Ã`ô%àr+ð .ÃðÄ)Ã0m(ÃÐ &à Ï&Ç%ÃÀ['î%Ã0ü%Ã(ÃðÖ&ÃP»(ð@%Ãp3"ðÏ"Ãàµ%Ãà&(Ã+&ÀÅ%ð±'Ã0a*Ã`S+ÃÀÀ+ÃÀÞ&Ãp!%î%Ã@)%à :*À0)Ã`Ü)Ã"ð½%à Õ%ÃÐŽ%Ã0ö&Ãp3"à 'à L'â'Ã0ð'ÃðÄ)Ã@)ð@%ðdÃðw!Ãðk#Ã`w%ÃÐ'Ã$ð·&ÃÐó)Ãp¤$ñÃ@¾!Ã0…$ÃðÐ'Ã@A!Ãp&Ã`w%ð·&ð¥)à%#Ã@¬$ð4'ÃPP%ÀÑ#ÃÐ'Ã`e(ÃЂ'à%à Û$Ã@¬$ÃðÜ%à X%ÃÐ$Ã0‹#Ãp'$Ãpª#Ã@¸"Ãu$Ãi&ÃÀI*ÃPÁ'Ã`ú$Ãp¤$ÃÀ"à R&Ã&Ãc'ÃP©+à L'Ã@ &à X%ÃPß"Ã0…$àr+Ãp&Ãðk#à Ã(Ã$ÃàÇ"ðÃ$ÃQ*ÃPV$à Ï&Ãu(Ç%àŠ'Ã0m(Ã`q&à%à´ Ã@¸"ÃàJ"à ÃÌ ÃPß"Ã`}$Ã0"Ã0$ð@%Àã ÃðÖ&Ã0y&Ã0%Ã0y&ÀÑ#ÃðÃД$Ã`ƒ#Ã`$à j"Ã0…$ÃК#ÃÐ &ðF$ÃÐ$Ãðq"â'à ^$à%Ã{#ÃÐŽ%à É'à–%à¢#ÃÀð#Ãò$ðÉ#ðÃ$Ã`w%Ãp(à„(Ã`!Ãp9!à%#Ãðô!ðáà ç"ÃÀ"Ãpž%Ã`k'Ãð} Ãp¶!Ã`}$î%Ã`î&à Û$ð½%Ã`ô%ÃÀä%ÀN$Ã(Ã@)%Ãàµ%à F(ÀH%Ã"!Ã=#Ãpª#ÃPÇ&ÃÀü!à1!Ãp¤$À6(ÃÀ['ÃÐ#ÃиÃPå!à Û$Ãi&Ã`!Ã°Û Ã0y&Ãp )Ã`ô%ÃPV$Ã`$Ãpž%ð@%Ã`$Ã@ &ÀB&Ãð ÃÐ/ Ãà»$àŠ'ð«(Ã"ðÏ"Ã0‘"ÀH%ÃÐù(ð½%ðR"Ã@/$ÃðA*Ãp'Ã+&ÃÚ(ÃàD#à®!ÃÌ Ã0—!Ã` à¢#à%à j"ÃÀÌ)àŠ'Ã@MÃ`*ÃÐAÃÐ;ÃÀ‹Ã`›Ã°Û Ãðè#ðÕ!ÃÐŽ%ÃpEÃД$Ãp˜&Ã0!ÃàP!Ã"!ðÕ!ÃÀü!ÃðƒÃÐ;ß!ÀÑ#ÃàP!ðX!ÃPÓ$ÀB&Ã`â(ÃÀa&Ã`}$ð^ ÀZ"Ã0m(ÃÐŽ%ÃPn ÃPP%Ã0%Ã`ú$ÃД$Ù"ÀN$ÃР"Ãì%Ã&à á#Ã@/$à á#Ã0‹#ÃÀü!ÀË$ÃPß"ÃÒÃðú ÃÐ#à !à |ÃÐ &Ã`ú$î%Ã@/$Ãp¶!à p!ÃЬ ÓÃ@YÃ0—!Ã@/$à–%ÃÀü!Ù"ÃPP%ðL#ÃPÍ%Ãp(Ã`‰"Ã0‘"ðL#ÃÐ#"Ã`• Ã0ð'ÃÌ ÃPÙ#ÃÀ"Ã@Ä Ã€Z"Ã{#À¿&Ã0—!è&Ã7$à í!Ã"Ã=#ÃÀm$ÀÝ!Ãð Ã0#Ã0#Ãu(â'Ã0m(Ãðî"ÃК#Ç!ÃÆ!Ão%ÃP÷Ãðî"Ãpž%ÃPå!ÃPß"Ó#à%ÃЈ&Ãà,'à¢#ÃàÇ"Ã`!ÃÀ Ãðô!ÃPÓ$Ãp3"à ‚Ù"à%ÃPV$Ã0£ÃÀð#Ãp )Ã`q&ÃÐ)!ÓÃà»$ðÏ"ÃÐ/ ÃÀ!Ã0©ÃÀð#Ã@)%Ãi&ÃPÇ&ÃÀü!Ã@ &ð@%À×"Ãp9!Ãp'$à$à¨"Ã` "ÃPÓ$ÃД$Ã@#&Ãæ&à&Ão)Ãðî"Ã0ü%à !à L'ÃÐ%Ãp¶!ú#Ã0$Ãp¤$ÃÐ &ÃÐí*Ù"Ã`• ÃÐ$Ãðe$ÃÐ%Ãp'$ÃД$à X%Ã@”(ÃÐŽ%ÃPß"à®!ÃpQà+"ð¥)Ã`_)ÃPÇ&Ãà>$à Ï&Ã`e(Ö)Ãà )Ã{'Ã0s'Àã Ã`ô%Ã"è&Ã0ð'Ãð5,ÃP&,ÃÔ)ð«(à¨"À¹'Ã&Ãðô!ÃÀs#Ã`ƒ#Ã0%ÃÀa&Ãà»$ð·&Ã0ü%ÃPV$Ãu$Ã0%Ãвà$à Ï&ÃPÁ'Ãà&(â'Ö)ÃàÍ!ÃÐ'ÃÐŽ%Ãðe$Ã`#ÃPP%Ã`w%ÃàP!ÃÐ &Ãð¾*à R&Ãp&ÃÐ'Ã@”(ÃðM(Ã0s'Ã7$Ãà,'ð±'Ü(ÃPV$Ãì%Ãp†)Ãø'Ã{'ÃC"Ã&ÃPD'ÃðƒÃðô!à Ã(Ãð).ÃðÖ&Ãþ&ð½%à+"ð·&ÃÐ|(Ã`#à®!ÃPÇ&à d#ÃPÙ#ÃðY&è&Ãì)ÀT#Ç%à v Ã`›Ãð›à%#Ã0…$Ãp(ÃP»(ô$ÃК#ÀË$Ãpª#ð@%Ãþ&Ãp’'àœ$Ã$Ãðú ÃPP%ÃQ*Ã@ &Ã0ü%àœ$ÃðÃ0&ÃðƒÃpvÃÀddÂâþÁš €$+€XLÂ@µaÂ@8aÂ@gn $„ ¯ŒÂà?ÂàiˆÂ@“Â`õÂd–Âϙ =ŸÂ@Ž©Âà2¦Â`Ü©ÂÀö¢Â p¡Â@5£Â]¬Âà®Â`ЫÂ@ɴ€°Â€±Âà̶Â`RÀ ¹Â T°Â`´Â  ¼Â€#ÀÂÀ¡ÅÂ@«¹ÂàÀ¸ÂÀH¿ÂàÀÂàÂÂ@¾Â€ÿÅÂÀN¾Â,ÉÂÀH¿ÂÀ ÉÂàTÊ _ÃÂ`ËÂ`uÏÂÀGÔ€íÈÂàNËÂ`.ÆÂ >Ó€ÉÎÂÀGÔÂ@!РùÓ jÖ ÿÒÂ`uÏÂ@ÕÂ`¶ÙÂäÔ \ÎÂÀMÓÂ@ÓÜÂ@ÓÜÂÀùàÂ@ê€cßÂÀ ÚÂ@ßÚÂàÜÝÂ@>à€Kã„ä€9æÂà5ä çÂà/å sßÂ@µáÂàè€3çÂ@¯âÂà¾âÂà¦æÂ`8îÂ`ßç€Âä 7éÂàÿìÂHîÂ`DìÂÀÃé ¨ëÂàìÂ@ç ªõ€tñ ï Èð ?òÂà4ùÂ@œúÂàjð ÈðÂ@ûÂ÷ ¼òÂàçðÂ@ðì õó€©ý•öÂ@Æó ž÷ÂàŸü ¿üÂ€ÇøÂ ªõÂÀuö üÂÀuöÂ@ûÂèÃ÷€ ÿÂ0EÃpànÿ°‰Ã0QÃ0àÃ ×øÂàþÂpùÃ`ÆÃppÃàÃ@rà ³Ã`UþÂð®ðÃð1à\àåÀ—Ãà ¡Ãð1Ã`ÒþÂÐéÃ`ÀÃàà $Ã@éà ÀàÍÃÀÃ;Ã)Ã÷ððÃPþÃGàÀÃàÃ@`Àà Ã`ÀìÃPÃпÃbÃð–Ã` Ã0 Ã@H Ãð¨à $Ã5ÃÐTÃGÃP Ã#ÃPþÃÀ!ÃPæ Ãðx ÃP]ò ðâ à ƒ ÃàiÃpL Ã0 àÁ Ã@`æ Ãà] Ô Ãp± ÃpÉ Ã w Ã@Å Ã eÃ# Ã`ÃÐ* à8 Ã`Š Ãàc ÃÀåÃЉÃPì ÃàK ÃÀ Ãp@ ÃP{ ðS ÃЧ ÀUÀUÃíÃÀ Ã0’ Ã`éÃ@ ÃD à } Ã0¤ Ãp@ à } ÃÀ€ ûÃà¶ÃPì Ãp: ÃЉÃ@›Ã@*Ã0Œà© à£Ã°Ö ð²ÀÌÃÀtÃ) ðGÃÁ Ãp™ÃЉà ÖÃ0Ãpà© Ã0€ÃÐÃðlðÊÃÀÙÃPÂà ô ÃŽ ÃPKÃðÑÃà9ÃÀñÃ` ÃV ÔÃÀtÀ…Ãp: à YÃ`éð)Ã0ýÃ0÷ÀÌà ÄÃàžÃ`lÃðÝÃÃpþÃPÚÃ0 Ã`fðAÃÀñð;ÃÐ À´ÃPKà Yà Að5ÃP¶Ãà’Ã0ßÃà¶ÃÀëÃ``Ã8ÀOÀºÃpòÃðÅÃà!ÃÀ8ÃÐîà‹Ã@¡ÃÀÍÃð³Ã@ƒÃÐkÃP°Ã0ÙÃÀÓÃÐÃÃÃàÃÐ}ÃÀJÀ¢àüÃÀhÃ0tÃ0ëà GàÃàÃàà MÃvÃÐèÃðËàêÃ0\ÃP'ÃÀVÀÀÃpàmÃÀ»ð/àÃ`fÃdÃÐúÃ`ÅÃÐwÃ`õÃpàðÃÛÃ`fà ”Ã0>Ãð³Ã@}àüÃ@ÃÃíÃÀJÃ@ôàØÃà÷Ã`Hð¬à‹ÃàŒÃ0PÃ0ßÃðÅÃ0PÃ`ËÃÃÐèÃ0ÍÃ@îÃÀÃð³ÃÐúà ¸ÃÀ8ÃÐeàêÃÐ_ðšÃÀÍÃ÷Ã@Ã0µÃ`Bð Ãð$ÃjÃíÃvÃð*à ˆàmÃÃð<à ¦ÃpÚàmÃXÃà˜ÃPÃ08ÀÃà¤Ã0ßÃ0JÃÀ®Ã0\ÃpcÃÀÁÃáÃPªÃà˜àüàà ¾Ã`ZÃÐÜÃ@Ã…àäÃ`Zð”ðÿÃà†Ãp{àsð5àäÃ@ƒÃpÔðÃ0Íðð ÃÉÃ0Çàöð À+Ã0ÍÃPýàaËÃð0Ã@_ÃÐ;Ã0Jà ²Ã0ëÃ0bÃÀJÃ@kÃ0ßÃð§Ã0ÇÃpøÃ`ÑÃ@ ÃpàÃ0ÙËÃ0ÙÃ@îÃ`TàsÃ0,ÃP°ðŽàIÃ@úÃÐèà )ÃFÃpàÃÀ£Ã0"à ¬ÃÐ_ÃpþÃÀhÃp“ÃÏÃÀ,àÒðÃÀµÃÃFÃmÀ¢ÃðHàöÃð6Ã`¿ÃFÃÐúÃ0Ùà[ÃÕÃLÑÃ`¹À„Ã0»Ãà’Ã0ÙýÃÀ¯Ã@Ã@ƒÃPžààÞÃ@kð¦Ã0VÃà€ÃÕÃÛÃpÃpæð Ã0nÃð)ðÀ7Ã0ßð|ÃðÃÀ»à ¦ÃàÞÃÐwðÃ0&ÃaÃP¤Ã@eÃP’ýàmàmÃÐôéÃ`éÃ0ÙÃÐkÃpìÃPŒàØàöÃ…à Ãð‰àØÃ0>Ã0>ðóÃ0ßÃð¹ÃpøðvÃP’ÃÐMÃ@eÃpQÃ`6Ã0©à ”ðýàØÃ0>÷ÃpcÃ@}ãÃÃ`¡ÃàhÃ`×à #Ã0ÇÃP˜Ã@Ãð6ÃàýÃpiàIÃêÃÐSÃ@èà ”ÀÃ0ÍÃ0»Ã`$ÃmÃmà ¦ÀÃ0ÁÃ`­Ã`TÃð0Ã@úÃPðÃðÃ@âðÃà€Ã`³ÃpÔÃðà |Ã( ýÃgÃÛð#Ã0DÃ@ÖàºÃð ðvÃÐSÃpòýÃÀ—Ã0¯ÃÐSÃÀ&Ã@îÃÀÍÃP˜ÃÏÃ@ÐÃpcÃÐÜÃ`ÑÃà†Ã@_ÀÃpÚÃànÃ`ÅÃðÃ@_à Žà ÃöÃà†ýÃsÃpKÃgÃÀ—ÃàzÃÀ ðpÃñÃÀðÃÀµÃÐúÃPÃ@YÃ@_Ã`*à ”ÃFÃÀ©ÃÐÄàÌÃPžÃ@qÃ`0àÌÃð$Ã0¯Ã`*ÃàßÃpÚðÃP à ”ððpÃÐÄÃØÀÃ0&ÃpÎÃð›ð‚À¢ÃP€ÃàýÃ0ÇÃpWÃà\ðÕ!ÃÃÐYà #ÃÀ,Ãð*ÃÐ#"ÃиÃaàÀÃðÃð0Ãà€Ãp? ðdÃ0ÍÃÃpþÃ`HÃp]àÃP¶Ã@kÃÐYÃpWÃð•ÃÀµà /Ã`ÅÃð6Ã`ÑÃÃÃgÃ0,Ã0\à ¦ÃàÙÃÀ—à ÄÃÐeÃ&ààäÃÐ;ÀrÃÐMÀÃð¿Ã@âà ¦ÃP!ðð|Ã`¹àÌÃоÃp{Ãð0ÃP Ã0ÁÃ@}Ã‘à ¦ÃPŒÃÀ2ðÃ`§ðdÃ0JÃð§àÞà #ÃsÃð‰ñÃ`<ÃpiÃ@èÃð­Ã@ÊÃð ÃpÔÃð§à[Ãà€ÃÀÃÐèÃÀµðpÃPh!Ã@ÜÃ0\ÃÞðjà ‚Ã`<Ã0ÍÃ08ÃPÃð<ÃÐÖÃsÃðñÃðÃ@ðjÃð¡ÃFÃ@ÃÀ>ð ñÃPÃFà  Ãð³À®ÀðùðˆÃyÃÀ8Ãð­ð ÃPÃpÔðšÃ0JÃà ÀÃ`Nð/ÃÐèÃÀ!ÀÃð<Ãð¹ÃÀ¯ÃàëÃàåÃ0Dà ðˆÃð§Ã`*ÃP ÃÉð|Ãð§Ã`ÅÃFÃÀDÃÀ¯à ¦ÃÐMðˆð|Ã@âÃ@ Ãð­ÃP˜Ã(ÃÏÃÐeÃ@Ãð•à |ÃàD#Ãp9!Ã¥ Ã@ÖÃpÈÃð à ŽÃFàaÃàÃpuÃà†ÃpìÃðÃ`$ÃPŒÃ0JÃP3àêÃ@ôàOÃ@îÀ¨Ã0ßðàØÀ~ÃÀ©ëÃ@ðÃpàmÃÐÖÃàñÃÏð ÀŠÃpQÃêÃÀ,ÃÕðÃÈ+ÃÕÃÐwÃ`ZÃ0DÃêÃöÃ0JÃð6ÃpÃÐÜð|Ã`<Ã@ÃÀ,à Ãà†Ã@àêÀÃ0VÃ@qà ÃÃÃ@ôÃÀ ÃpìÃðÃ0ÍàÒÃ`<Ã.ÃÐAÃPÃ02ÃP ÃPŒà à  ÃÐYÃ0VÀ„ÃÐYàäÃ0ßÃðëà ÃÞÃ@àÆÃàßÃpÈàÞÃRÃpþà #Ãð$à[Ã@èÃpKÃ:Ã`NÃÃðÃðÃ0DÃ.Ã`6ðŽÃ`NÃà ÃÀ ÃàzÃ`6ÃðÃÀ»à Ã`<àäà àÒÃÐÊÃð§ÃpàÃ[ÃÐÐà ¦Ãð¡ÃRÃð<Ã0£Àã à ÃÀ,ð‚Ãð0ðà ²Ã0ÍñÃ@ôÀÃLÃà†ÃP!ÃÏÃ@âÃpÂÃ0JÃà†ÃP€ÃpàÃàñÃLÃð›àOðùð|Ã@ÃêÃàåÃÀÃààOðpÃÐèÃpàÃsÃpÔÃsÃà à Ã0>ðùÃFÃ(ð”ÃÐÖÃÀð”Ãð¡Ã0»ÃP!ÃmÃàtÃ:Ãp]ÃàñÃÐSð Ãà€ÃÀ£Ã@YÙÃÐ5Ãð¡ÃÐÊÃðÃÐGÃÐÐà šÃöà #à  à v ÃÞðóÃànÃ@îà #Ã`ÅÃpuÃpoÃðÅÃ`ÑÀŠÃ0 ÃpÎÃàÀÃÐGÃð­ð)ÃàÃ0DÃÕÃ.ÀÃÐAÃð*Ã0PðvÃÀ8ÃPªÃpcÃÕÃàà 5ÃP¤ßÃFÃ0ÇÃÐÖàÒÃPžàöýÃpcàØÃ@qà /àðÀrÃ0>Ãð§ÃÉÃXàäÃÀ¯ÃÐîÃ`ZðšÃ@ƒÃÉÃyÃP’Ãð¿àaÃpÔÃàhÃpæÃà ÃÐâÃàëÃÀ!ÃàñÃà Ã`ËÃÀÇÃ0Pà ¬Ã@úð‚àÆÃÀÇÃð<ÃÀ©à ²Ãð$ÃpÚàêÀà šÀ¢à ²ÃPÃP¶ðˆà ÃsËÃàÃð0ÃÀµÃpÔàÒÃ…ÃRð|Ã0ÇÃàŒÃÉðŽÃÀÇÃÛÀœðŽÃ0PÃP€ÃÀ»ÃP-ýÃ@wÃpìà šÃ@wð Ã:àmÃð<Ãð­Ã[Ãà ÃðNÃ0ßà ÃpWÃ`ËÃÕÀ¢Ã@qÃ`×ÃP!Ãà’à Ã0JðŽÃ…ÃÐeÃ:Ã@qàsàðÃPÃð0ÃðÃÉà À%à AÃÀ2àÞÃÐÜà ¦Ãð6ðŽÃP!ÃÀPÃPÃÐ;ÃÀÃàtÃ0VÃÐîÃÀµð ÃÕÃ0PàêÃPÃpuÃðHÑàmÃÕÀ%Ã0Vð|ÃpÔÃÐÄÃà ÃÀ2ÃÐMÃÀDÃÐYÃàëÃp? ÃÏÃíðÃçÃðËà ;ÃðËÃ4Ãð¹Ã0\ÃÏÃàŒÃð<àUðÿðŽÃ0ÇÃÀ£Ãð³ÃÐÃ`Hà )ÃXÃÐYÃð¿ð ÃÀŠÃà†àyÃÐ}Ãð6Ã`³Ã4ðšÃPŒÃÐYðŽÃ@èÃðÃ@îÃpàÃ0ÍàäÃ`HðùëÀ%ÃÐîÃ@ôÃáÃÐÃðÑÃP!ÃÀ»ÃÐÖÃÏÃpoÀ–ÃÀ2Ãð<ÃàžÃà÷ÃpìÃÏÃFÃ…Ãð¹Ã0ÓÃÃpþÃP-Ãpæàgð#à ¾Ãà'Ã`éÃpoÃ@‰ÃXÃÀ©Ã@_ÃpøÃP˜Ãð³ÃP3ÃÀÇàÞÃ:ÃíÃçÃÐqÃdÃÐÃP?Ã0ÙÃP'ÃpiÃLÃRÃ`­ÃyÃ0DðŽà /Ãà’Ã@qýÃð¡Ã4à ¦à ¦ÃöÃÐÊÃÐÐÃmÀàðÃpþÃÃ@ÃàÃRÃ0ßà Ã¥ ÃpEÃð*ðÃàzðÃ0DÃ0Íà…ÃÉÃð•à #ÃPžð ÃÐÊÃ0ÇÃpcð‚ëÀÃ0PÃ@wàaÃÀ,àaÀÃpÚÃ`<À„ßÃÛÃð­ð|ÃRà ²à Ã@Ü÷ÃçÀ–ÃÀ¯ÃP’Ã@îÃäÃ.ÃdÃÉÀ àIÃP÷ÃPÃpcýàÞÃ`ÑÃP-àÞà |ëÃð¡ÃmÃÐAÃÐèÀÃPŒÃ0ÇÃÃà à ”àêÃ0¯Ã`ÅàÃP-ÃP3àmÃXÃ0ÓÃà¤ÀàØÀÃ0DÀxà Ã@ÃÐMàaÃÀ‹ÃÐ;Ãà\Ã0µàÆÃ`6Ãpiñðóýà ÃðÃpiÃð•Ã`HÃ0,ÀûÃ0µÃLßÀ„ÃPÃÀ!Ã:ÃPÃ@ÜÃ02à ŽÃpcÃàåÃp¼ Àf Ã@èÃyÃàzÃÀ‘ÃðÃ`*Ãðk#Ãðq"Ãà\à ÿÃ`àÀÃPŒÃÀÃ`!ÃàV à |ÃPýÃpÈÀ6(Ãðq"ÃP à #ÃðËÃÀ&à®!Ã¥ ÃÞÃ` Ãp-#Ã@MÃ0‹#Ã"ÃàÙÃÀ… Ã`à7 Ã.Ãðà$Ã0#ú#ÃPë Ã(ÃÐAÃp¼ à ç"à ˆÃÀÃЦ!ðR"à p!ÃUÀûÃð} Ãp˜&ÃPß"Ã` ÃÀÃиÃpÚà ùðdÃ@ÐÀ~ðáàœ$ÃO ÃPà #ñÃp]ÃàtÃpÂà ÿÀf ÃpàÃ@_Ãð} à |à ÿÃO ÃÀ!ÃàhÃ@qÃ0¯Ã0 ÃàV ÃpÂÃàåðáÃP÷ÃÀ‹ðùÃ`­ðùÃpÔÃ@ÐÃÐ/ Ã`§Ã¥Ãð•ÀÝ!à |ÃÀ‹ÃÀ"Ç!ßÃ.ÃÀÃð‰ð^ ÃPtà ÿÃÃð­Ãð¹Ã`!Ã°Û ÃpæÃ`¡ðvÀ~ð^ Ã°Û ÃоÃ@YÃÀ‹ÃÀà j"ÃÀy"à šÃð ÃI!Ã0¯ÃÀ&Ã0>ÃÀÃÐÊÃpæðíÃpKÃ"ÃðÃpKà àÆÃ.ðjà j"Ã0,ÃàhðX!ÃPë ÀxÃ[à Ã`§àUÃÐÄÃyÃ.ÃPÃàtÃиÃ0¯ð^ Àã ÃàtÃ`­Ã`*àIÃpþÃpoà ¦Ã0ÍÃÀÁàaÃ0»ÃPtÃðÃ@YÃÀ&Ã@ÐÃЬ Ãð} à Ã0»ÃÒÃpÔà ‚Ãð‰Ãp]Ãà\à[ÃPžð|ÃàëÃPÃоÃððùÃpWÀ~ÃP€ÀÃsÃÀ2Ãp]ÃàÒÃ`ËðùÃ.ÃànÃ.à ”ÃpàÃFÃäÃmÃ02Ãиðpà+"ð^ ÷ÃàŒÃpuÃ@ƒÃиÃ08Ãð<ð‚Ãà\ÃsðóàOÃÐôÃ0DÃýÀ Ã@eÃ`¡Ã`#ÃÀ ÃàëðÿÃPÃpìàÞÃ¥ÃàßÃвÃ`6÷ÃP÷ÃÀðíÙÃ@ÜÃЬ à´ ÃÀ©Ãð$Ã0&Ã`<Ã…ÃÀ>ÀÃ`­ÃðÃÐÖÃpÎà ”ðpà |ÃO ÃÆ!ðÿÃ@YÃ`¹Ã@ÐÃ`­ðÿÃ@¾!Ãð‰Ã0 ÃPªÃP°ðíÃ`¡ðÿÃ0»àØÃüÃ0>ðjëÃêÃàåÀïÀõðóàºàÒÃ4Ã@qÃÐÄÃð Ãöà ðpÃÀßÃàV ÙýÃð$Ã@ÃàßÃ"Ã@ÜÃð$ÃðÃP†ÃpÚýàÒÃàýÃ@ôÃð›Ã`­ÃÀ&àØÃ0ÍÃÃÃàåÃüÃ@_À~Ã`›ÓÃàñÃ0¯ÃPtàIÃ`$ÃÀµÃÀ8Ã@_ÃpàÃ`*Ã0>ÃØÀxÃ`6à àÒÃ(ðÿÃÀÍÃgÃPÃ0>ÃÀ,ÃP-à Ã02ÃðÃPŒÃsñÃÀÃyÃ@Ã0»àÒÃ@qÃÃpWà !ñÃð$àÌÀxà ÃàÃð•ÃÐYÃ(ÃÐÐÃØðíðíÃ`6ðÿÃ@wÀà Ãð§Ã`¹Ã`*ÃÃàñàUÃ@wÃð§àØÃFÃÃÃpWÃÐÊÃðÃäÃà÷Ã¥À„ÃðàÌÃðq"ÙÃÉÃ@úàsÃððÿÃ`BÃ0VÃ`³Ã`0ÃÐÊÃÃpÂà ÿÃÀ©ÃPàÌëÃ@ÖÃ@ÜÃ4ÃÐÜÃpÎð‚à ÿÃ`!ÃpWÃPžÃ@Ã`­à ”à )à šÃоÃpKÃ¥Ã0PÃðÃgÃÀ¯ÃðÃ@kÃÐÄÃ@kÃÐÜÃ@}ÃpiÃ`NÃÀÁà )ÃðÃоÃ`6Ã@ÃÐMÃÀ Ãðq"à ÃÐÜà[Ãð›À–à Ã0 ÃÐGÃp? ðçÃ0µÃðð|ÃPÃpiÃüÃÉÃЃàgÃ@_ÃàåßÃÏÃpà÷ÃPªÃpÔÃPÃP!àgÃÃÃP€ðvÃP!Ã0DÃàÃà÷Ã`*ÃpQÃ0VÃàzÃp]Ã0ÓÃ:ÃP€Ãо÷ÃðÃpàÃ4ðpÃy÷ÃÀÃ`*Ã@À ÃmÀÃ0hÃÐÖðŽÃPžÃàÃàzÃ`¹ÃÐÐÃðˆÃ08ÃÐÐÃ`*Ã`w%ÃðÃ@Ãð<à…ÃdÃàÃpàÃÐeÃànÃPŒÃpiðÀœÃ4Ã`¿ÃP Ã0ÇÃ`0ÃP˜àsÃpÚÃØÃ`*À ÃpÔÃðÃ@ÐÃ0 Ã@ÜÃ¥ð‚Ã¥à #Ã@îðÿðíÃÃð­àOà šÃ0>ÃðÃP÷à  ÷àaÃüÃP€ÃPàäÃäÃðÃmÃÞàsðÃ`<ÃP-ÃÐÜàgÃÀð|ÃüðvÃÃðjÃpÚÃpÔÃ0ÁÃpoÃðàØÃÐGðóðùÃPÃÀ Ãà\àÆÃÐÊÃ@kÃyÃpcÃ0ÍÃÀµð|à ÃÃàtÃ0JÃaÃÐÄÃÀ8Ãð*ÃÐAðjÃÐÐÃ=#à´ ÃÃðà ÿàÒÃð6à 5Ã@Öà1!ÀŠðÃ@eÃ@MÃ`­Ã@îÃÀ,ÃÐÐÃðÀïÃPn ÙÃð0ÃFÃP¤Ã0JÃp? àÌÃ@eÃP€ÃpKÃàåðÿýÃP†ÃÀ… ÃöÙà ÀxÃ` Ã`6Ã°Û ÃØÀrÓ÷÷ÃàÙÃpÚÃ¥ÃÀ‘ÃO àÌÃ@ÖÃ0—!ÃP†ÀàÞàCÃÀ Ã`6àÀÃR÷Ç%Ãp3"àUÃðÃÀÃRðùÃpÔÃиÃ"à´ ÃÀü!ÃpÎÃ`ÃaÃPå!à v ÃPV$Ãð‰ÃàhÃP€àCÃÀ… Ãà2&ðáÃ`¹ÃÐMÀrÃÃÐÄÃàV ÃÆ!Ã`Ù"ÃðÃ@âÃ0£ÃЦ!Àã ÃP Ãànà ÃÀëÃÉà ùÃ@MÃÀ ÃðÃ0¯ÃÐ5ÃPýðíÃ¥ à v àºà á#ÀõàºÃÐÄÃ`§ÃиÃpQÙðdÀrÃ0,ÃÀ‘Ã@A!ÃPýÃ[Àã Ã@²#ÃÒÃ( Ã`!ÃвÃp]ÀlÃpEÃðk#Ã@ÖÃpÎÃ@ÃgÃЬ ÃpÂÃðî"ðR"ÃР"ÃÞà p!Ã"Àã Ã(ÃÀ©ÃÀ©ÃØÃp9!à šÃà†Ã@ÖÃ@¸"Ã$Ãp&Ã0,Ã:ÃÐ5ÃpWÃð ÃPñðçÃ`§Ã0—!Ã0µÃ0£ÃUÃàÓ ÃàV ÃÀ Àã ÃÀ!Ã@YÀÑ#Ã`!Ã@ÐðvÀ`!ÃpKÀŠà Ãp°"ÃàÓ ÃÀð#ÃÃÀ ÃÀ2ÃPå!ëÃPñðíÃÐ;Ù"à®!Ãà\Ã`!Àã Ã`‰"àºÃ@¾!à=ÃàÍ!à p!Ãp3"ÃPb"à |ÃàbðçÃð0Ã`$ðvÃ0‹#Ã0ü%ÃàÍ!Ã`!ß!ÃàÁ#à Õ%ÃP\#Ã#ðáÃ0¯ÃsÃp9!à=ÀïÃp¤$ÃPå!ÃЦ!ÃвÃ@ÊÃÀ!Ã@Ä Ã¥ Ã@A!à p!ßðjÃpÈÃ{#ðáÃp!%ÃPñÃàÙÃ0 ÃÀy"à+"ðR"à d#ÃàD#Ã@Ä Ã[ÀéÃO ÃÒÃø#Ã`ƒ#ÃPb"Ãðô!ðçÃÀ!Ã`*Ã@MÃ"ÃPn ÃpEÃp-#Ã1%ÃC"Ã@¸"Ã@;"Ãàµ%ðL#à+"Ã@A!ÃP÷ÃàÓ Ã`ÃÐAÃðî"ÙÃàP!ÃÐ)!ÃPß"ÃC"Ã0"à p!Ã.Ã0»Ã.ÃPn Ã°Û Ã°Ï"ÀïÃPtÃàJ"à®!ÃÐ#"Ã"ðR"ÀïðvÃ`¿à ÃpKðíà ÃàÙÃÀ¯ÃÀ©ÃиÃÀ!Ãp3"àIÃØÃК#Ãp¤$ÃUà ‚ÃàhÃÀ… ÃÀ Ã`›ýàÌà ŽÃð•Ã1%Ãp¤$Ãp¼ Ãp¶!à d#ÃÐÊÃPtà¢#Ã0£÷à ÿÃ@ÜÃ@Ã4ÃpKÃК#ÃÀê$Ã@ÊÙ"Ãðú Ãð•à´ àÆÃÐÐÃ0!Ã`q&ðL#Ã0—!ÃÀ!ÃÒà d#Ãp¼ Ã@ÜÃ` Ã@Sà Ã`¡Ã`¡Ã@YÃ`0Ù"à p!à |ÃP÷ÃàåÀÝ!ÃàV ÃPzÃPŒÙÃ`$÷ÃðÃÀð#ÃÐ)!Ã0#Ãp¼ ÃÃиÃð‰ÓðdÃ@SÃPb"à p!à7 ëÃ"Ãðô!ÃÀ ÃpKà=ÃPñÃÒà !ÃP†ß!Ã`‰"Ãðú àCÃ@ÖÃÀm$Ã` "Ã"ÃÐGà=ÃÀÇ!ÃPß"ÃÀ"Ãð$ÃÐ/ à j"Ãàµ%Ã@ÊßÃÀ&ÀÃðÅà ÃpQÃ0 à®!ýÃ@Sô$ô$ÃÀÃðú Ã@G à+"ÃÐ5ðíÃp? àUÃð‰ñÃàP!à v Ã`$ÃÀ ðáÃàÍ!Ãðè#Ã@5#ÃиÃ02ÀÀxàºÃ@ÖÃØÃàhÃP†Ã¥ÃpQà |Ã0…$ÃpQÃÀÃ(àCÃ`*àCÃÞà ùÃÀ,ÃÌ Ã€Z"À Ãpæà 5Ã0Óà7 ÃàßÃ¥ÃÀ£ÃPñÀxàÆÃÀs#Ã@ÃÐSÃàëÃà÷ÃpÎÃ:ÃÐÊÓÃð›à ðpÃP†ßÃ0&ÃPb"ÃPn Ã0&ÃÃÃàtðL#Ã`#ÃpÎÃFÃ.Ãð$ëÃÃPtÀxÃàP!à ÃàbÃ08ýÃ08Ã`¡Ã0%àCàØÃÀÃànÃP÷Ã`­ÀÝ!ÃÀ à7 ÃPå!ðdÃpÂà ”Ã`0Ã`!à ÿðóðdÃðß!Ã`³ÃÐÊÃðô!ÃðƒÀÃà÷ÃLÃ0VÀûÃàÓ Ã°ùÃ@MÃÃиÃà÷à ÿÃ0&à1!Ã0JÃ`­Ã`*ÃàbÃÀ‘à í!Ã@à ¬Ã@_Ã`¡ÃÀ!Ãà\Ã0JÃpÚðçÃpKÃØÃ0—!à ”à šÃÃ` À~ÃFð^ Ã`§ÃÞÃÀ!à ùàÌÃ`­Ã@eÃ0»ÃaÃðƒÃÀÃ4àºÃPh!à Žà=Ã.ÃRÃÐÜÃÞÃþ"Ã"ÀõÃp]ÙðdÃвÃ0ÓÃÐÜÃ:àÌÃ0©ÃÐÄÃоÃØÃÀ… À~ÃLÃðßÃÀxÃ4ÃÆ!ÃÀ!ÃPñÃ`!Ãð Ãиßà ùÃ"ÃÀö"Ãpª#Ãp9!Ã@¾!Ã`#ÃЂ'ÃPV$ÃÀü!À**Ó#Ã4à |ÃPµ)à~)Ã$Ãðk#Ã0s'ÃК#ÀH%à %Ã%'ÃàD#Ão%Ã@'à j"Ãðè#Ã@ &Ã0ä)Ãà2&ÃÐ#"ð«(à¢#Ã0%ÀË$Ã`e(ð«(Ãà2&Ãæ&Ã@ÿ+ÃPÍ%à–%Ãp!%ÃÀm$Ã(ÃÀØ'Ãðâ$ð.(Ãpb/ÃPJ&ÃÀ['Ãò$ÃUÀË$à 'ÃðS'Ã`î&àx*Ãp’'àœ$ÃàÇ"à Ï&Ã`ú$ÃÀ!à1!ð±'ð.(à X%Ã+&Ã0ê(ÀÅ%ÃPÁ'ÃÀg%à„(Ã+&ÃPß"Ã`_)ð()ð()ÃðÄ)Ã(ÃÐ'ÃÐù(à Û$à¨"à%#ð«(À<'ÃÐ'à%#ð()Ã@”(Ãu$ÃÐ &à d#ÃÀð#ð.(Ã`ô%À¡+à ^$Ã0%Ãàµ%Ãà¯&ÃÐ$Ãðk#ÃЈ&À¿&ÃPÍ%à Ï&ÃÀg%ÃÀ"ÃÐ#"ÀÅ%Ãì)à)Ãà»$Ãp? àŠ'à„(àŠ'à X%ÃPÓ$à Ï&ÃÐ'ÀB&Ãì)ÃÀ['Ãp'$Ã0ü%à R&Ã`w%à X%Ã%'ÀÅ%Ã`w%Ã`à 'Ã@/$Ãð_%Ã(Ã0ö&Ã`è'Ã0ö&Ãà-ÃД$Ã0"ÃÐ'ÃW)à)Ã`è'ÃÀØ'à %ðF$ÃЂ'Ã0y&Ãp'à X%ÃPë ÃC"Ãàµ%î%à j"Ã`ƒ#ÃÀö"Ã(ðŸ*Ãp'$Ãp¤$ðÃ$ÃÌ ÃÀ"Ã@Ä ÃÐ%À6(À³(ÃPD'ðÉ#Ã`$ÃðÜ%Ã@¦%à¢#Ãðâ$ÃÀØ'ð·&Ã0—!Ãà8%Ã0m(Ã$Ã0%Ã$î%à L'Ãðâ$à+"Ãpª#Ãðk#Ãò$Ã`q&Ã`q&ÃÔ)Ã](Ãp )Ãàµ%ðR"à7 à$Ã0!Ãp'$è&Ã`ƒ#Ã@š'à ½)Ãð_%ÃÐ;ðpÃÐ'Ãp€*Ö)ÀÑ#Ãæ&ÃÀU(ÃðÖ&Ãp’'à(î%Ã@š'ÃÐù(ÃW)ÃC"ÃàP!ÀÅ%À6(ÃÀI*ÃÀU(ÃÐ'à(Ãà&(Ãò$Ão%Ãp'$à L'ÃЂ'Ãðè#Ç%ú#ÀT#Ã@¾!ÃPÓ$à$à Ï&ÃÐ'Ãu$ÃPÇ&ÃÀg%Ãà>$Ã`• ú#Ã$ÃPD'Ã@¬$Ãò$ÃPJ&Ã0m(ÃPP%Ãðâ$Ã0‹#Ã](ÃÀä%ð4'Ã@¦%ÃPÍ%Ã0ð'Ãà¯&ÃÀO)Ã@'Ãà&(ÃPÇ&à 4+Ã`k'ÃPP%Ã0ö&ÃÀê$Ü(Ã@ &Ã@¦%ÃPÙ#ðçÃ"Ã0%ÃPJ&À<'ÃPÙ#Ã7$à ½)ðŸ*à F(Ã{'ÃÔ)Ã`ú$Ão%à %ÃÐv)Ãø'Ã"!ÃÒÃà>$à j"Ã0ö&Ã0ê(ðL#ÃÐ)!ÃÐ#à&Ãc'Ã0ê(À×"Ù"ÃÀê$à ÿðÃðF$à Û$À¿&ÃàP!ÃPb"ðÃ$Ã@¸"Ã0%Ã` Ãþ"ÃPh!è&ÃðÖ&ðÃ$à d#à–%Ãà»$ÀÅ%ÃPë Ãð ÃPh!ÃК#Ã@¾!ÃЦ!ÃÀê$Ã`#Ç!ÙÃ`• Ã"ÃÀ"ÃÌ ÃPn Ãðú ÃÀy"ÃК#à&Ã`è'à ç"Ã@¾!ÃI!Ãp? àœ$à í!Ç!ÃPn à í!Ãp3"Ãðâ$ÃPJ&ÃЦ!Ã{#Ã0‘"Ãp? à Ã` Ã`Ãà\Ãð‰Ã0…$ÃÐ#"ÃÀ—ÃÐÄÃ"Ãþ"Ãðâ$Ã#ÃÐ/ Ã` "ÃàV ÃP†ðÏ"Ã0‘"ÃÀ!ÃàÇ"Ãà>$Ãp3"Ã à ”Ã0!ÃpÔà ^$ÃPÍ%Ã0"ÃÐ/ Ãpª#Ã@;"ÀT#ðÕ!ÃPë Ãð} Ã@Öð^ Ã[ÃÐ#Ã@¾!ðX!Ã0$Ã"ðíÃ7$ÃpEÃ`­ÃÀ‹Ã7$ÃÀy"Ã0#ú#ÃÀ Ã0!Ã` "Ã0&ÃaàIÃ` "à+"ÃPtÃÀÃðÀéÃ@Ä ÃÐ5Ã@Ä Ãpcà Ã`!À×"Ãðî"à |ÃpKÃÀü!ÀÝ!ÃÐ)!ÃPb"ÃÀê$ÃÀa&ú#ÃI!ÃpÈÃðÓÃÀÃàßÃpEà ˆÃPß"Ã7$ÃÀÃ`!ÃðƒÃðÃ0"ß!ÃLÃÕÃ¥àUÃÌ Ã±Ã0 Ã0—!ÃànÃpÎÃ0£Ãð‰àUà ‚ÃÒÃиÃÀÃpÔÃ@²#ðíÃ$Ã0&Ãð*à ŽÀã ÃÀ¯ÃÐÊàCÃÒÃð} Ã0—!Ã@Ä Ã Ãð¡ÃànðjÃ"ÃànÃ0 ÀÃ@ÜÃÐÄÃð¡À ÃpÈÃ` "Ã{#ÃpKÃ`³Ã@ÐÃð} àmÃàñÃ`ƒ#ÃàÍ!Ã`­ÃpøßÃÐÄÃÃ@_À`!ÃPñÃ`Ã`§ÃÏÃ"ð‚ÀûÃ"!ÃðÃ0ÙÃäÃðƒÃð ÙßðáÃÀü!ðdÃðÃFÃ0&ÃPÃÃà Ãà\ÃÐ;ÃÀÃØÃðú Àã ÃðƒÃ$àºÃðàUÃP˜ÃàßÃ$Ãðú Ãðô!Ãð} ðÿÃð6ÃÐ)!Ã$Ã`!Ã`³à àIàUÃpQÃpWÃÒÃ`#Ã"!Ã@Mà ùÃðƒà ó ÀõÃ`*à à Ã` ÀlÃ`$ÃäÃ"ÙÃäÃüÃð›à®!ÃÀ ðóÃÆ!Ã@MàCÃÀ‹ÃàbÃ0ÇÃÐÄÃP†Ã:Ãø#ÃÀm$ßÃÉñëÃP÷ÃP÷ëà[Ã"!Ã@¾!ÃàÙÃðÃ0 à Ãð ÃPñÃP Ãð§ÀxÃ`!Ã[Ã@âÃÀ‹à L'ÃÀg%Ã0…$Ã.àÆÃ[Ã`6ðŽàÆÃÀÃàÍ!ðvÃ0»ÃPtÃ0&Ã@âÃоðdÃÀÃ@ÐÃ[Ã`0ßÃ@ÐàØÃÐMÃÀ‹ÃÐ;ÃàßÃÀ… Ãþ"ÙÃàñÃ08Ã0>àCÃÐ5ÀïÃUýÃ`Ãp? Ãp9!Ã0#Ãðw!ÃPýÀxÃ@ÖÀlÃÀ‘ÃðàÒÃÐAà ùÃðÃàåÃ` "Ã( ÃÐ/ ÃàzÃ@ÐÃàÇ"Ã@A!à ˆÃ@MðóÃ0Và ùÃÐAÃàhðjÃ@_ÃàëÃ` ëñÃð ðÏ"à®!ðíÀÀxÃоÃp]ÃpàÃÞÃöàºÃ` "Ã@ÐÃ@ÃÃÃðÃêÃ¥àUÃ`BðˆÃP€à®!àCÃ@_À„ÃpQÃ4ÀõÃRÃÞÃ`¡Ã( ÃÃ:Ã@âÃpÎðpÃð•Ã0 Ãиà šÃ@_Ã`<à ÀûàÌÃÐMÃO àUà ÃÐGàCÃÃ@eÃPýà´ Ã( Ãmà à=Ãð­Ã`¿àIà ‚ÃànÃàñÀéÃmÃ@ôà ŽÀõàÒÃ0ÇÃðÃÀ… Ãp]ÃLÃp{ëÃÐ/ ÃPn Ã$ÃI!ð|ÃöÃÐMÃêÃ`³ðÿàØðíÃð¡ÃàñÃPn ÃàßÃ@eÀ„àÆÃ0µÃêÃÐ/ ÃI!ÃðÃà÷Ã`6àIÀéÃC"ÀT#Ã` Ã`HÃöÃ@âÃmÃêÃ08Ã@SðíÃð‰Ã0>ÃPýà ŽÃÐÖÃðÅÃðÃÀ"ÃÀ ÃÀ¯Ã0PÃà’ÃÐ_ÃðÃðà ÃpæÃÏà ¦ÃÀ&Ã0>Ã0ÇÃ¥Ã@ôÃ`§Ã:ÃàßÃP’ÃÀ—ÃàñÃàtÃÐ;Ã0"ðáÃÐ#"àºÃ0»Ãð¡ÃP Ã0»ÃðàÞÃ`NÃpÚðçÃÀÃ`ÀûÃ@qÃð•à ŽàäàÞÃ0µÃUÃ(à ÃàtàÞÀéÃ@MÃpQÃ`6ÃáÃà˜Ã@Ãà  àUðÃðÃÐAÃ@_à[ÀÃÐYÃäÃ0&Ãäà ÃpÂÃðq"àºÙàCàCñÃðÃP’Ã.ÃиàÌÃP!Ã…÷ÀÃÐÊÃpæÃ0,ÓßÀxÃàhÃÉð|ÃPžÃÃ02Ã(Ã`*ÃpÂÃ` Ã`›ÃànÃÃ0£ÃpìÃçÃÀµàUÃP€Ã`­à[Ã08ÃÀµÃÐÄàCàUÃàÃ@Ã@YÃRÀxÃÃP Ãð6ÃÀÇÃÐèàCÃaÀÀÃ@_Ã`­Ã0ÇÃÀàCÃànÃ0µÃ@îÃð0Ãp{Ã.Ãð Ã@eÃÃÃÐYðíÃÃÃÀ©À„à ”ÃàñÀàaÃÃÀ2à šÃÐSÃÐ5Ã[ÃpcÃpøÃ0ëà ¬ÃFÃàtÃ`¿ÃyÃ@ÃÐGÃ0¯Ã0&ñÃpoÃpiÃP˜ÃàhÃ"ÃÀ—Ã4Ãð­ÃPÃ@îÃ`HÃ0¯ÀÃ`ÅÃLÃð•ÃànÃÐSðjÃ`6ÃàñÃ`<ÃàýÃmñÃð¡Àà AðšÃ`ËÃ@îà |ÃðÃ(ÃÐÄà ‚ÃÐ;ÃÃ.Ã@ôÃð0ÀÃP¤àäÃêÀ~ÀûñýÃÐÖÃ08Ã( ÀxÃðÃÐGÃöÃ`$ÃPýÃÐ5Ã@ÊÃàÓ Ãp3"Ã`0Ã`BÃP’ÀlÃð¡à=ÃÐ;ÃÐkÃ0>ÃpÚà ˆÃ@ÖÃàV ÃÀ‘Ãð ÃPß!ÃÀÃ@âÃPŒÃ@_ÃÉà ”ÃÐÐÃàëÀõÃ`à%#ðR"à ”Ã0&Ã@úÃ0ÙðÃвÙÃÐÄÃ0»Ã4ÃPtÃàtýÃÀ—Ã@;"Ã@5#Ã0—!à p!À„ðˆÃ`$À×"Ãà\Ã`­Ã@Ãàtà ¨(dt ?@4 4ÿxunitsyunits‚'h`Ä (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌ (š™™™™™©?msô¯=8é‡ pA¿F:”‰6 š™™™™™©?msô¯=8é‡ pA¿F:”‰6 š™™™™™©?msô¯=8é‡ pA¿F:”‰6 š™™™™™©?msô¯=8é‡ pA¿F:”‰6 š™™™™™©?msô¯=8é‡ pA¿F:”‰6 ˆ¨¸Ô ØÖ TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`Ø HEAPX øÖ datadescription8  @œÜ q·—NM€SNODP× ¨Ù  X¨(dt ?@4 4ÿxunitsyunitsÿÿÿÿÿÿÿÿM (·—NM (CLASSTABLE (VERSION3.0 8TITLEDescription of sec2 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitsÐVðX (VERSION3.0ð‰ÃpÂÃÐ)!ðíÃð$à=ÃPn Ã@SÃÐ/ à ó ÃðÃP†à Ã0¯ÃP÷ÃpEÃ`¡Ã`*ÃЬ Ã4Ã`¹ÃàýÃÐGÃÐGÃànÃÐeÃ`¿Ã( ÃЬ ÃÆ!Ãp9!à ùðÉ#À~ÃpQÀéÃp¼ ÃPýÃØà´ ÃànÃÐÐÃpøÃPÃ[à #Ã@èÃððçÃ`• ÃÐGÃpiÃ@wÃà ÃÐkÃ`³ÃP÷ÃиýÃPŒÃ`0ðíÃàV ëðX!Ã` Ã4ÃyÃðÃpuÃPŒÃÀÀŠÃàÃFÃsÃ@Sà ‚ðpÃ@âÃpìà ðÿÃ`HÃиàÌÃpÎÃàP!à1!ÃPn à ÃÐÄñÃ:ÃPðpð|ÃÒÃ0,ÃÌ Ãðà |ÃPðŽÃÏÃpæÃ( ðdÃÀ&àÀÃàÙÃ@ÀõÃpKÃ@_àÞÃPtà7 Ã`§Ã`6ÃpWðçÃFÃ0ÇÃÀ»à àÆÃ0,ÃP÷Ã"ÃÀ&ÃÀ Ã0DÃöÀÝ!ñÃ`¹Ãð›Ã`0ÃöàØàOÃ08Ã0¯Ã0,ÃðÃ@èà ÃpÔÃÃÀÃàtÃÐGÃÀ—à ùëÃpW÷÷Ã0>Ãà÷ÃÀÃð•Ãà Ãàåà[à Ã`<Ã@qÃð•à Ã@wÃ0ÇÃÐYÃPŒÃðàUÃFÃðÃðÃÏÃ0>ÃÀ£ÃànÃ@_Ã0ÁÃ`¹ñÃ0ÁÃgÀ´Ãð6ÃÃàºÃäÃ0©Ãðî"ÃÐ)!ðíà Ã@_Ã0\Ãà’ÃpÂÃC"à1!ÃàëÃ4ÃàÓ Ã02à ÃpàÃ0ÁÃ¥ð|Ã@MÃà€ÃÃ`$ÃвÃðÃPh!Ãp3"Ã`• Ãð ÃЦ!Ã`!ÃвÃ`­Ã0µÃÐMÃ@MÃ`$ÃÐ/ ÀûÃÐ;Ã°Û Ãp˜&Ãp3"Ã[ÃëÃ^Ã`HÃ`³ðùÃP’Ã0&ðóÃ¥ÓÃÐÄÃ@âÃ0—!ÃàD#ðL#Ãp¼ à p!ÃÀ‘à ŽÃ.ÃÐ;à7 Ã0¯Ã@YÃðÃЬ Ã@¸"ëÃP˜ÀÃÀ£ð^ Ãðƒà !ÃЬ ÃðƒÃÀÃðà à v Ãðî"ÃЬ Ã`6ÃP€à ÃPýÃ`!Ãð‰Ã0¯à v Ãp3"ÃPn Ã@YÃÆ!Ã{#ÃД$ÃP÷ÃÐ5ÃP÷ÀxÀrÃà\ÃàÙÃà\Ãð Àã ÃÀ… à ‚ðàØÀõÃ"ÃÀÃ@ÐÃÀü!ðF$ðdÃÀ!Ã@Yðdðíà7 ÃI!À`!ÃÐ)!ÃÀ‹ðdà ˆÃ` Ã@¬$ÃI!Ç!Ã0©Ã`³à |ÃàÓ ÃÃp9!Ã@MÃ`!Ãp!%ÃÐ)!ðpÃpÎðX!à®!Ãp'$à ó à Ã`*Ãð›à ‚ÃUÃàÓ ÃPðpÃPtÃà v ÃоðX!Ã`§Ãà\Ã(ÃpÚÃ[Ã¥ Ã`!ÃP\#Ãð} ëà=ÃàåÃàtÃÀ£Ã@ÐÃ@²#ÃPb"à Ã@SÀïÙ"ÃÀm$ÃоàUÀŠÃPÀõÃpÎàºÃ`*÷à Ãðw!ÃàßÃвÃÐ#àÌÃÀ ÀÑ#ÃÀê$ÃÀ‘ÃànÃ`$ÃÀ!à%ß!ÃPß"Ãоà |Ã@¾!Ãðq"Ã0#Ã`›ÃÀ£Ã`›Ã0‹#ÃðƒÀõÃ0»ðjÃÐ/ à ŽÃàÍ!Ã0ö&à%Ù"ÃÀ ÃÐÄðçÃ[à Ã¥ Ãðè#Ãð_%Ã¥ Ãðq"Ã@¾!ÃЬ Ã`¡ÃPà ”à ðíÃP€ðçÃ"!ÃpEðáà ùÃ0 ÀrÃp¼ ÃàV ÃàÙÃК#ÃPh!ðX!à ç"à¢#Ã0 ÃPh!à í!Ã"!ÃÀ"ÃÀÀxðvà Ãðè#Ã{#Ã( à ‚Ç!à j"ÃÀ©ÃÐÊðX!ðÿÃðƒÃ1%ÃPb"ÃPb"Ù"Ù"ÃÐ)!ðçÃ02à¨"Ãðî"à d#Ãp? ÃàD#ëÃ`î&Ãæ&Ã0‹#ÃàbÃàßà ÿÃÀÃ0,Ãðw!Ãð;+Ãp9!à !ÃÐ5ýÃÀ ÃPb"Ã`• ÀÀxÃÀ—à !ÃPÃ`Bà ÿàOà ‚Ãp!%à$Ãðw!ÃÀÃP÷àÆÃÀ ÃPýÀZ"Ã`ô%Ãp¶!Ãp? ÃI!ÀlÃP€Ã@;"Ãp9!à šÀ„ÃPÃpEÃðî"Ãu$ÃàßÀrà ‚à ùÃàÓ Ã p!ÃÐ5Ã"Ã7$à Ã0>ÃÀ>ÃÐ5Ãðè#ÃÐ$ÀûÃPzÃÀ‹ÃÀ Ã@A!ðóàOðçÃ0‹#à%#Ã@²#Ã`‰"Ã` ÃàÁ#ÃÐ)!ÃPn Ã¥ Ã0—!ðX!Ã( ÃÐ#"ðvÃ0&ÃÐ%Ã°Û ÃØÃPýÃðú Ã@G ÀxÃ( Ã( à p!ÀZ"Ã`!ÀxÃpæÃàßÃ`$Ã` ÃÀä%Ã0"÷Ã`³Ã.Ãp¼ ÃàbÃÀÃ` "Ãà»$Ãðe$Ã0!Ãð¡Ã@/$Ã`}$ÃàÓ Ã ùà |à®!Ã@ÐÃÐ;Ãp'$ÃpÂÃPzÃPýÃÀà´ ÃвÃ`ðdÃÀü!ÃÀ"Ã0#Ãp°"Ãðe$ÃÐ#"Ã` ÃðƒÃ0µÃP€Ãp3"Ã@A!ÃÀÃPžÙÀ<'ÃÆ!à í!Ãþ"ÀlÃÐAÃÐÐà7 Ãàhà àÌÃðÃ"ÃÐÄÃÐÄÃPÃp¼ Àã ÃàV ÃyÃO à¨"Ã@Ä Ã0 ÃðƒÃà÷ÃðƒÃÃ0Dà ÿà Ãиà ‚ðùà Ã0©Ã@/$Ãðú Ã[ÃàP!ÃP€ÃàP!ÃÀm$Ã0£Ã0£à ÃàßÃðè#Ã0‹#Ã`!ÃPn Ã0#ú#Ã@MÃPÃPß"ÃÀm$Ã@ÐÃàhÃðú ÃÒÃÐ#Ã0—!ÃðÃà\Ãp? Ã0 à í!ð^ Ãðq"ÃÀ ÃÀðX!ÃäÃP†ÃÀ©à j"Ù"ðF$ÃØÀlÃ( ÃàåðáÃàÙàØÃàëÃ0JÃPýÃÐÄÃ@eà ÿÃ{#ÃPh!Ãð›ÃàbÃÀÃ0!à´ ÃÀ… ÃI!ðjà ˆàCà ŽÃÀÃð Ã`¡ÃPh!Ã"ÃFÃ`¹ðvÃвðçà !ÃànÃPzÃ`!àºÃ`$Ùà´ ÀrÃ@_Ã0©Ã`ô%Ã@5#Ã4ÃPÀ–ÃRÃÀÃð¡Ãð6àÌÃp¶!Ã@ÖÃàhÃUÃ@ÜÃ`³ÃÐÜà ŽÃÒÃàÇ"Ã@ÖÃðÃÒÃ"ð|ÃPžÃPtÃ"Àã à )Ã`*ÃÐ/ ÃÀÃàëÃàåÃ0‹#àÆÃ@ÖÃ0,ÃÀ©à ”Ã08ÃÐÊÙÃ0&ÃàV ßñðÿà ÿßÃÀ©ÃPÃ@SÃàÓ Ã |à ÿÃÀ ðçÃ@MÃ0!ÃP€Ãð³ÃpòÃð‰ðóÀ„Ãà÷Ãð‰Ã0>ÃäÀ~Ãà ÿÃ0¯Ã@¸"ÃPh!Ã@ÐÃàV Ã`*à |ÃàßÃO Ã@ÖÃ@kðÃànÃ4Àã ÃPë ÃFÃ0JÃÀ‘ÃPñÃaÃÃPë à àÞà ùÀûÃðÃ`¹ÃÐÖÃPžà #ÃàhÃP¤à Ã@_à šàÞÃàñÃpKÃðÀ~Ã0ÇÃ`§Ãp9!ÃPh!Àõà[Ã08Ãð›Ã0¯Ãð ÃÀðpÃÐ;À`!Ã@A!à !Ã@²#Ã4ÃàëÃà í!ÃÀÃPýÃð ÃpÂà ˆÃ0J÷ÃRÃð Ç!Ù"À`!ÃðÃвà ŽÃ"ÃÀ ÃÀ‹ÃÀÃоÃ`• Ã0!à d#à¢#ÃÐ)!Ã"Ã@¸"Ã`ƒ#ÃоÃ0¯à ˆÃ ÃP\#ÃàJ"Ãðw!ÃÐ/ Ã0 ÃЬ ÃpKÃоÃ"ÃP€Ã@MÃ0£ýÃÒà ó ÀN$ÃЦ!àÆàÆÀ`!Ã0…$Ã@#&Ü(à®!ÃàýÃànÃðƒÃ0&ÃÀü!ðÕ!Ã@ÜàÀÃPÓ$Ã0…$Ãþ"Ã@ÐÃ"Ãp-#ÃÀð#ðÏ"Ã"ÃàÍ!Ã(ñÃPh!Ã¥ Ãàµ%ðX!Ã`$àÆÃ`¡ð^ ÃpEðÏ"à¨"àCÃðÃ.ÃC"à X%Ãp&ðçÃàP!ÃД$Ãø#Ãànà ŽÃPÙ#Ãp!%Ã@G Ãp¼ ÙÃp9!ÃàÙà á#Ã+&Ãðw!ðáÃð ðjÃPh!À`!à p!ðÏ"Ãà2&Ã0m(Ã@¬$ÃÀ!Ã02ÃÀÃвðÏ"ÃàP!ÃÀs#à Û$Ã@A!Àf ÃÐ#Ãì)Ã0‘"ÃàëÃàßÃÀ—ÀlÃàP!Ã0…$Ã@²#à&Ã@¸"ÃÀs#Ãðw!ëÃÌ Ã°L#Ãþ"Ã@Ä ÃÐ$Ó#ÀÝ!ÃоÃÀ‹Ãðq"ÃР"ÃP÷Ã@A!Ã0#Ã02Ã@YÃÀm$Ãp9!Ã`0ÃP\#Ã0‹#Ã"ÃPV$à¢#ÀN$Ã#à=ÃÐ5ÃP†Ã0,ÃÀä%à ^$ß!ÃÀ!Ãpª#à á#ÃЦ!ÃÆ!à Ãà\Ãð Ã0‘"Ã{#Ãàßà Ãp3"Ãðô!ÃÐAðíÀÝ!Ãp9!ÃP’Ãð Ã0‘"Ã@ÖÀ~Ã"!Ã$à ˆÃ0£Ãp? Ã@;"à ^$ÃpEÃ`#Ãðî"Ãp¼ ÃPýÃÀ‹à¨"ðdÃ0>À~ðÏ"ÀË$ÃàÁ#ÃÀð#Ã"!ÃPn ðF$à p!Ã0»ÃPýÃÀð#ÃPå!Ã@/$Ã`!Ã0£Ã0¯Ã"ñÃ@ÊÃpÂÃp-#ÃÌ Ã %Ãðô!ð^ Ã@¸"Ãp!%ÃÐ'ÃPP%Ã4À„Ã$Ù"Ã0‘"à+"ÃpÂà ‚ÃÃ0 ðR"à ÿÃÐ)!Ã0 Ã`­ÃàÙÃÒÃЦ!ðóÀÝ!ÃPb"Àf ÃàV ÃpKÃð ÃPn Ã`0àaÙÃÀÃ"!àUÃpEÃäð^ Ã02Ã0µÃ[ÃÐ5Ã°Û ÃÞÃÉàUÃgÀÃpiÃð ð@%Ã@²#ÃàñÀ„Ã0µà v ÃPÃ¥ ÃÀÃ`$ðdÃ`¡ÃàV à®!àIÃÀ‘Ã` ÀZ"ÃpÎÃÐYÃPÃà÷ÃêÃ.Ã°Û Ãº#ÃàßÃиÃ0µÃðÃäÃð•Ã@âÃ¥Ãð•à1!à=ÃPtÃ[à ðÿÃ@ÜÃPÃgÃð›Ã"ÃÐ_ÃÀ2ÃpEÃÕÃpÈà ˆà ÿÃР"Ãàñðóà ÿÀûÃ`!à7 ÃpWÃ`0ÃP÷Ã` ÃÀ‹Ã[Ã`6ÃÐÄà7 ÃêÃÀÃÐÊÃ0&ÃF÷Ã"à ó Ãà\Ã`¿ÃP†àIÃðÃöÃàëðdÃÃðpàaÀ¢Ã@èÃàßÃpÚÃ02àÆÃPzÃp? ðjÃÀ&Ãàñà ÃÀDÃà€ÃÐÜÀlðóÃ`<ÃðÃàýÃðBÃÉàÌÃàzÃÐÄÃоÃ08ÃÐÖÃ0>ÃP!ÃÐ_ðÃ0JÃpWßÃà€Ã0ÓÃPÃ@qà ¸ÃànÃmÃàÃ`TÀûÃyàgðáÃpEà ”Ã@úÃdÃ`Ëàaà ¬ÃÛÃ`*ÃÐ)!ÃàV ÷ÃÀ8Ãà ÃàzÃ0>Ãpoà )à ²À¨ÃLÃP àOÃ`NÃÐYÃaÃðýÃPÃ0 Ã`*ð àsÃ`HÃ`­Ãàzà ˆÃ0©ðÿÃLà ŽÃp]ÀðpÃðÃ`$ÀZ"ðíÃ@YÃðÃ@YÃÐMàÒÃ`6Ã`³ÀûÃÐÊÃFÃ0DÃ@kÃвÃ@MÃêÃ`§ÃP’ÀxÃ¥ ÃaÀõÃàëÃð ÃÒÃðÃ@eÃÀðùÃÀü!ÃðÃðÃÐÐÃÀ Ã@YðvÃð0ÃÀ8Ã`¡ÃÀ‘à ”ðóÃàëàCà  ÃP!ÃðÃ@SàÞÃ0µÃð} Ã` Ã0µÀ„ÀrÃàÙÃp? Ã`¡Ãðà ŽÃ¥ðáÃpiÃвÃPß"Ãà\ÃsÃ0DÃÀ—Ã`6à[ðÃàñÃоÃÀ&ÃÀ À„ÃsÃð›ÀÃ@_Ãp]à ÃäÃ0ü%ÃàÍ!Ãp¶!Ã@âÃpQÃð­ÃÐAÀïÃpìÃð ÃàßÃpÎÃêÃð§ÃyÃpÎà=Ã`• Ã@ÖÃ` Ã@A!Ãðƒà ùÃ0µÃànÃиÃpÂàºÃÀ ÃÐ#"Ãðw!ÃàÍ!Ãðq"ÃÀy"Àf Ã0"Àã ÀéÃÀlñÃP€Ã`$Ã@SÃpÔÃàÍ!àCÃ` ÃÀ!ÃØÃpEÃpÔðvÃ@ÐÃ`ƒ#Ã@¦%à7 Ã@¾!ÃP\#à !Ã0¯àº÷Ã@YÃpcÃ¥Ã0»Ã"ÃÀð#ÃÀÃpÔàUÃÐGÃЬ Ã`$ÃpÂÃpÎÃ`›ÃP†ÀõÃÐ;ÃÀÃÐÖÀf àÀÃàßÃ`$Ãð àCðíÃ@âñÃPà ùÃÐAÃPzÀrà á#ÃI!ÓÀïÃØÃð} Ãi&ÃC"ÃÃðÿÃÐqÃ`6Ãðî"à ùàIÃ0&Ã0&Ã@SÃp? ÃÐ/ ÃÀü!ÃÀ"ÃPýÃЬ ÃPýÃ(Ã0,ðR"ÙÃÀ‘ÃÀ‘Ã@ÊÀf à v ÃÀÃà ÃPà$Ã@YÀ~àÆÃpKÃ@SÃ"!ÃP÷ð‚ÃP Ã0,ÃpÂÃpcÃàýÃgÃàñÃðÃPtÃÐ/ ÃP€ÃÀà ÃpcÃpWàÌÃÃpÎÃ0©ÃÞÃ0,ÃpQÃPýð^ àCÃpQÀïÃ`• ÃpKÃàP!à Ã@ÐÃ@;"ÃÀëÃ@ÐÃÒÃpKà7 Ã0—!Ã0¯Ã@eÃ@âÃàhÃÐGÃоÃ@G à Žà Ã@eÃðƒÃðÃpEÃp¶!ðÕ!Ã`• ÃàD#ÃÀÃÐÄà ŽÃàÙÃP÷Ã0©àÆÃÐ;Ãð‰ðvÃÀÃp]ÃP˜Ãð*ÃðÃ0¯Ãð Àf Ã@ÊÀ~ÃP†Ãà\Ãðà í!Ã@MÃÀÀõÃ0»Ã@ÜÃ`àCÃ@ÜÃ@YÀxÃÀ&ÃÐÜÃPÃðÃsÃLÃ@SÃвà ÀÃà÷Ã"ÃP÷ðóÃ0ÁÃ02Ã`6ÀûÃ`*Ãðw!Ã@ÊÃоÃPà ”àUÃоÃÀ ÃààUÃ`*Ã`¡Ã0£ÃP†àêÃ0»ëÃ0µðóÀ~ÃP÷Ãp¼ àØÙÃ`$Ã@_Ã`0Ã@SÃÀ¯Ã`ÅÃ02ÃpWÃ0 Ã[ðvÃвÃpQÃPÃð§ÃPžÃ@eÃ`¡ÃÀ ÃÀ‹ÃpKðˆÃ`­ðçÃð} Ã`!Ãð ðjÃÀ!àCÃpÚÃ`0Ã@ÖÃÐGÃð§àÆÃmëÃÐSÃ02ýÃð ÃØÀûÃÐÄÃP†ÃоÃÀ‘ÃÀ ÃpcÃÀÃ0£ÃÀ‘Ã@ÜÃPýà ‚ÃP’Ã`ÀïÀà Ã02Ã@ÖÃÌ Ã[ÃàP!ÃP÷ÃàhÃðÃÀÃ0 ÃÐ;Ã0µÃà÷Ã@Ðà p!ðvÃPë à ùðˆÃàñÃ@SàUÃ0»ÀŠÃð¡ÃàëàÀðdÃÀÃ`§ðˆÃàÍ!Ãp&ÃðÃPn ÃPýàÀÃFàIà=ÃÀà Ãpið ÃäÀÝ!ÃÐÄÃP’ðùÃÐGÃÐèÃ.Ãà€Ãð*ÃÀ¯ÃÐ;àOðùÃ@eÃ`NÃð•à !Ã0¯ÃàzÃÀ—À~Ãð›Ã@kÃÀ©ÃðÃðƒÃ°Û ðáÃðÃ`• Ã02à© Ã`ûðçÃpÎðˆÃpiÃ@ÊàºÃð•ÃÕÃÐkð‚Ã@âÃðÃÐÐÃüÀðóÃànÃ@âÃPŒÃPÃÐAðÕ!à ç"ÃÀ à[Ã@kÃdñà |ÃaÀûàäàêðùÃÃð¡à Ã`¿ÃÐÄÃP€ÃFÃ`ÅÃpÂÃPtàIàaÃPÃðÃ0©ðóÃ4Ã@wðšðˆà Ã`¹ðjàÌà ‚ÃpìÃÀÇÃà€à ŽÃ:ÃÀÃPŒÃ@MÃàhÃÀ»Ã0÷ÀÃÐÊÃ08ÃÐ_Ã`BÃàzÃÐÊÃ@ÖÃÀ£ÃO ðà Ã( Ã0»ÃgÀ„À%ÃpcÃp]ÃÀ£Ãð ÃpQÃØÃ@YÃ`ÅÃy÷Ã@wà 5Ãð¹ÃpoðÃÀ©ÀxÃyÃpoÃ0»Ãð0Ãð*ÃPÃêÃ:Ã`HÃ0ßÃÐÖðŽÃà\Ã4Ãð<Ãà ¬ÃÃP˜Ã@ÖÃàÀÃ`BÃð6àðÃ`¹ÃàýÀ~àÀð|ÃÀDÃ0ÙÃpoÃà€ÃÐÐÃ0>Ã0Áà Ãà\Ãð›Ã0ÓÃð­Ã@ÀðùÃ0JÃpÈÃ@âÃÀ8àaÃàÃ0ÙÃP!Ã@}ÃpàÃð­Ã@wÃà÷ÃöÃpæÃpòà 5Ãð*à /ÀœÃ@ à ;ÃÀµÃÀ£ñÃÐÖàÃÀPÃ`ËÃPªÃ@îÃ4Ãpuà 5à ;àÞÃ0DÃ0DÃP'Ãà˜ðŽÃÐÊà…ÃÕÃp“ÃsÃ^ðÃÏà 5àmÃðÃ0µà )ÃpìÃð­Ã@ ð)ËÃÉÃp? ÃÞÃð¹Ãà˜ÃðÅÃ@ÜÃ(à šð ÃàŒÃàÓ Ãp]Ãp‡ð/ÃíàaàÒÃÕÃPÃÐSÃ`6ÃðËàsÃð§Ã`ÝàyÃöÃð*ÃÐGðùÃFÃ0bÃùàØÃÐÜÃÐYÃð6ÃPÃÐÜàUàÞÃÛÃpiÃpcðšÃ0ÙÃüÃsð|ÃÐSÃ0ÇÃ0VÃð³ÃàÃð³ÃpòÃÉÃ@ÃÕÃRÀœÃÃÀÓà ÊðÀÃpuð À¢à  Ãð0Ã@ÜàÒÃð•ÀÃpuà šÃàÀÃ`¹ÃðBÃðHÃàýÃP†Ã`ËÃÐîÃÀÍÃpòÃ`BÃÀ¯Ã@}ÃPžÃÀÃÃàzÃPÃ4Ã@àOÃpÎÃÉÃð*ëÃP€À–ÃÐÖÃP’Ã@ôÃÀ,ÃàÃPžýÃð*ÃÏÃ``Ãð­Ã0ÍÃàzÃàýàmÃð<ÃpæÃpiÀÃP9ðˆÃPŒÃÐMàmðýÃ@ôÃP!Ã:ÃÐâÃpàÃ@kÃpÃ@îÃöÃð›ðšà ;ÃÃ:ðÿà  Ã@ÜÃÐeÃÐÜÃRÃÃÃFÃðàðÃÐÖð ÃàýðÀœàgð”ÃÃð§ÃpìÃð6à  à Ã`³ÃPýð”×ÃàýÃ`*ÀõÀà šÃð6ð/Ã0JÃaÃpÔÓÃ:ÃÀàÌÃààêà ÃsÃ0ÁÃð6ÃPžÃðÃ@àgÃÐMÃ0Dà Ã@ÃpQÃànÃP!À%àöÃ0ÇÀõÃ:ÃàzÃP9ð À~ÃÐAÃÀ—ÀŠðˆÃàÃðÃPÃÐYÃð³Ãð0Ã@qÃÐSÃÀµàðÃðÃPÃð­ÃÃÃð­àaÀÃpoÃð¹à  ÃÐÐÃÀ ÃPàêÃÉÃ[ÃÐAÃ`›÷ýÃPÃpæàaÃPªÃð³Ãð­ÃÐMýÃ0Çà Ã4Ãà€Àà ÃöÃáàüðÃð³ÃÐYÃÀµà ”À ÃP!ÃpÃP€ð|ÃpòÃð§àÒÃ`<ÃP€Ãà†Ã`ËÃpòÃ`Ñà #Ã02Ã`ÅýÃpcñÃÐÜÃÉÃ0\ÃÏÀÃà†ÃP?à 5Ã`BÃÀ Ãð¹ðšÃÀÃàbÃÃÃÐ_ÃÃÀÃ0Pà #Ã@‰Ã@›ÃpìÃ`ÅÃ:Ãðà ÃàŒÃоÃpÚÃPžÃÃÃ0ÓÃÿÃ0ÍÃÃ@qÃ@kÃ0ÍÃ(ÃpòÃÐAÃ@îÃð÷ð‚Ã@kÃpcÃpæÃ@eà ðÀœÃ`ZÃÏÃyÃP’ÃPªÃpþÃÀDðð àgËàyÃ^Ãð¿ÃRÃÛÃÀ»ÃPÃ0ÇàsÃRðˆàêÃÐSÃ:Ã`TÃ@Ãpø÷Ãà÷À–ÃÃ@‰ÃðBÃpæÃ0ÓÃÃ0PÃ0JðùàmÀÃ`*ðÀà ¸à AðˆÃ@Ãà ÃP'àsÃ`NÃÀ&Ã`HÃpcÃð*ÃXÃ`<ÃàtÃ0>ÃànÃP ÃÐkÃ@àsàaÃ`Ñð Ã0ÓÃpoÃ`Åð|ÃP!ÃLÃ@ÜÃàtÀ+ÀÃ0ÓÃ`<ðà  ÀûÃPð|àgÃ`ÑÃ0\ÃÀµÃàžÃàà #ÃP àØàUÃÀà ˆÃ`BÃP°Ã0ßÃ`<Ãð¿Ãð¡Ã08Ãð$Ãð§ÃàñðˆÃP'àððpÃ0>Ã0PÃà÷Ãà÷ÃP'Ã0VÃ.Ã0ÇàÃà˜ÃPžðð ÃÐÜÃ@Ã0ÙÃPEÃPÃ@A!Ãð‰ÃpìÃóÃüÃ0>ÃUÃPÃÀ2Ãð0ÃàÃP9ÃÃÃP3ð Ã0¯Ã0ÓàmÃÀ‘Ãsà[Ã0PÃÐÖÃ…Ã0ÓÃP†ðšÃ@îÃP-ËñÃÐMÃ@eÃpàÃÐÊÃðÀ¢ÃÐeÃpWà ÷Ãð0à[ÃàtàÒÃPà[Ã`³Ã¥ ðpÃðÃLÃp‡ÃpøÃPÃPžÀrÃPtÃ0©ÃàzÃpiñÃêÃÛÃ@úà ˆÃÀ‹à Ãð¡ÃpWà ÿÃPn Ãðî"à |ÃPÃ`<ÃÐeÃPªÃÏÃêÃpcÃðÃ@kà ÃÐYÃ`¿ÀÃоÃpWÃ`›Ã[À„àUÃð•ðÀÃyÃ`*Ã@îÀûÀÃð­Ã@¾!Ãð ÃRÃÀ©Ã:ÃÃðÿÃÐ;ÃàÃ:Ãð­àÆÃÐ)!Ã°Û Ã`§ýÃàV ÃPzÃPÃÀ,Ã@SÀlà šÃà÷ÃÐMÃÉÃPŒÃPå!à ùÃ.Ã[àCàÌðíð^ ÃÀ&Ãð à ÿÃàñàUÃð§Ã:Ã`§ÃäÃ0PÃÐÊÃÀÃвÃðÃPn Ã@ÜÃ@eÃðƒÃ`ƒ#ÃPýÀf ÃÀðdÃ@Ä Ã:ÃÃÀ‘ðáÃPë Ãð•Ãà\ñÃÀ Ã¥ ÃàbÃоÃ"ÃðÃ` ðjÃPà7 ÃØà´ ðíÃ`³ðóÃ`BÃ0VÃpWðjÀxÃàñÃðƒÃPzÃàtÃ0»Ã"ÃÐYÃ0PÃðÃ^ÃÏÃ`*Ãà÷ÃP€ÃÐ#Ã08÷ÃsÃöðùÃÀÃPñðpÃоÃ`• Àà ŽÃàÃàtÀûÃàP!ÃpÈÀûà ¦ÃPÃð•Ã`§ðpÃàëÃ0»ÃPzÃ0£ÃÐ;ÃÐYÀ–ÃdÃ0&Ã0!Ãà÷Ã0>ÃP˜ÃRàÒðíÃÀÃÀÁÃ4Ã4ÃÀ Ã@SÃ0£à ”ÃðÃðú Àf Ãð¡Ã0µÀ Ã`6à[ÃpÎÃàhÃð•Ãs÷Ã`¹ðdÃ@ÖÃ0&ÃP÷ÀûÃ0µðvÃð‰ÃиÃÐkÃÀ Ã@ÖÀÃpQà Ãð­ÃÀ—à¨"Ã0µÃP ÃPýÃàñÀûà ˆÀ~ðóÀÝ!à Ã( à7 Ã@Àðÿà àUÃÀÃpQÃà÷ÃpþÃpoÃð¡ðñÃpìÃ`¿Ã0ÍÃ0ÁÃp? ðdðóÃP’ÃàñÃI!àÆÃ0ÇÃÀ&Ã4ëÃà÷ñÃ.Ã@_ÃÐMÃÀ—ÃÐÄÃð$à #à #Ã`¡ðˆÃð¹Ã@ôÃ0ÍÃ0 Ãpž%ÃP÷ÃðÃÀ8ÃÃÃ08À ÃàëðáÃð›Ã…ÃÀ8ÃÀ¯àOÃàñÃàðóÃgÃ0JÃp¶!ÃÐ5ëÃÀ àOÃPÃpàÃ@G à ÃÌ Ã[àØÀœÃpòÃоÃp? Ã°Û ÃоÃÏÃ¥ À~à ÿÃÐAÃPzÃð} Ã`6ÃLÃPŒÃàåÀÃðÙðóÃ`³Ã@G ÃyÃ@eÃ(ÀxÃÐÜÃÉÃ@âÃ@Öð|àÒÃÐSÃPÃ@_Ã0>Ã0»ÃpÚðùÀxÃ0¯Ã.ÃðÃ0©ÃоÃp°"Ã4Ãp]ÃpEÃÐYÃP-ÃÐÜðóÃð*ÃÀµÃ¥Ã@èÃpKÃðƒÃP€Ã`§ðáßÃpÂàOÃÕÃÐîÃpWÃ@eÃÐÖÃð¡ÃaÃ`³ÃðÃRÃ`¿Ã¥ÃÃ`<À~ÃÒÃðà àÆÃäÃ@èÃÀ¯ðvÃàåÃp]ÃÀ8à ¦ÃÐMÃÐÄÃ:ÃÀ©Ãð§Ã0ÇÃ@MÃиÃ0,Ã@àaÃÐÊÃÉÃðÃÏÃð Ã08ÃpQÃ0µÃÃPŒÃP'ÃÐqÃpøÃ0µÃ@MëÃàåà ÃÀÃÞÃ`$ÀŠÃPÃ`0ÃÀ£ðÿÃ0>Ãð} ýÃàßÃÀ‘ÃàhÃÐ5ÃÀ ÃPÃÐGÃð*ÃÐÜÃÞÃàëÃàtÀ„ÃÃÃ"ñÃP Ã`ÑÀ–Ã@ÜÃànÃpàðóÃ…Ãð*àmÃÐâàØÃðÃaÃPŒÃ08Ã0>ÃFÃ`³Ã0Çà[Ãð¡Ã@îÃ`0Ã@SÃPýàað‚Ã@âðíýÃ@úÃFÃÀ»ÃP Ã0µÃ0>Ã@eÃ0¯Ãð­Ã0ÓÃFðˆðÿÃ@ÜÃ0»Ã`*ÃàJ"ÃaÀ%ð”ÃðÃpøÃðNàaÃ`¡ÃmàÞÃ`HÃPQÃðËÃÀ2ÃpòÃÀÁÃP˜ÃpÚÃpÈÃXÃpæàUÃ0DÃ^àäÃÐÜð”ÃÐYÃ`ÅàØÃ0>Ã@SÃÐúÃà¶ÃùÃÐSÃ@kÃPn Ã@)%àÌàðÃ@Ãà˜ÃÀ>Ãð¹àØÃ…ÃÀÍððˆàOÀ1Ãà-Ã:à )ÃPžÃ`<Ã0»Ã@ÃÀ&ÃP'Ã@kÃÐMÃàhÃ@kÃpiÃÀ8àsÃÐÄà1!àÆÃ0ÓÃÐSàgÃð³ÃÙÃ@kà ÃàzÃ@àyÃ0¯àØÃ0VÀÀÃÞÃð•ÃmÃ@eÃà€àÞÃðÃ08ÃPÃ…ÃÛÃüÃиÃPñÃ0VÃð­ÀÃ0>ÃáÃÛà ÿÃ08ÃÀ©ÃàtÃÀDÃÐÐÀ Ã0ÍÃ`Tà Ã`$à ŽÃÒÃFÃmÃðÃàýÃpÚÃÀÃ@SÃÐÐÀÃÀÃPV$à´ Ã@ÜÃgÃвÃP†Ã@wàaÃ@Ðà ðR"Ã( Ã@eÃÀ—ÀÝ!ðáÃPžÃ0DÃànÃ`­ðdðR"Ãu$àºÃÐ;Ã[à d#Ã°Û Ã°jÀõÃO Ã0,ÃÀ‘ÃÀ‹à+"Ã@;"Ã@_ÃyÃàåÃÐÄÃ@èðçÃ@Ä Ã ÒßÀxÃgÀxà ÿÃ`›ÃpÎàðÃLà ÃPñÃ@ÐÀ ÃÐGÃÏÃPëÃ@kÃ`à |ÃиÃpÂÃ0 ÃÐGÃ`0ðpà j"Ã=#ÃÆ!Ã@_ÃÐ)!Ãp? À ÃÀÃ@qÃð à ÿðíÃÀ ÃPðáà%#à ÿÃ`BÙÃ@A!ÀéÃ`}$à í!ÃÀÃÀ ÃÐÊÃàñÃ`6ÃPÀõÃP€Ãð ÃÀ Ã:ÀïÀÃÐÐÃвÃ7$ÃàÁ#ÃЦ!ÃÒÃ`‰"Ãðî"ðÕ!àÒýÃÉðpÃaÃ`­À~ÃpEÃI!ÃÃÐ;à[ÃðÃp-#à ÃàbðÕ!ÃPß"Ãðô!àÀÃ(ðvà=ÃP’ð ÃpWà ÿà Ãà\Ã{#ÃÐ5Ã@YÃàJ"ÃвÃàP!Ã0&ðŽÃ@eÃðƒðíÀxÃpKÃp? ÃPðvÃP’Ã`›ðjÃPýÃà7 à ÃвëàÀýÃöÃ08ÃpÔÃ@âÃ"!ðvà ˆàOÃàtÃÀàUÃð} Ã`§ÃÐ5Ã@SÃàzÃ@ÀxàOÃÀ£ðçÃàV Ã0£Ã(ÃàßÃ0>ÃpÚà Ãànà7 ÃpEÃP€Ã`6Ã@ÊÃPtÃ0,ÃÞÃêÃð‰Ãp¼ Ã@Ãð Ãàñà ÿÃ@MÃ0¯Ã` "ÙÃ@ÊÃëÃP€ÃP€ÃP’ÃpoÃ.ÃmÃ@¾!ÃвÃP€Ãà\Ã@MÓÃàhÃ`0Ãp9!ÃÃÃàzÃ0¯ÃêÃðÇ!Ã`• ÃÐÐÃÐÊðˆÀxÃàßÃ0µà Ã`¡Ã0&ÃP†Ãð§Ã`$Ã4ÃàhÃÐAðX!Ã`¡ÃиÃиÃÀ À~àºÃÆ!Ã`*ðçÃ0»ÃÀ¯ðçÃ`ô%à ÃPŒÃàåÃð¡àÞà[Ã@A!Ãp? ÃI!ÃиàUÃ`6ÃàhÃàP!ÃC"Àã ÃàëÃ0 ÃàÙÀïÃ`$ðjðR"ÀN$Ã0—!ÃðÃÐGÃPÀ~ÃáðÿÃÀÃÀÃ0©Ãp9!Ã0 ÃpÔÃ`$Ó#ÃÀ!ß!ÃPb"Ã`‰"ð:&Ãpª#à p!à ç"Ãð} Ã` "Ã0£Ã`$à ”à ÿÀ`!Ã`!à !Ã{#Ãðè#ðX!Ã@5#Ãð‰à1!Ão%Ãp'$Ão%à :*Ãæ&ÃÐ)!ÃÀê$à X%Ç%Ã0…$à ^$Ã@¾!ÃPV$à X%Ã`ô%Ã0y&ÃðÖ&Ãà©'ð()à +ÃÚ(ÃPP%Ãpž%Ã=#Ã$Ãp-#Ã$Ã`î&ð,Ã`e(à á#Ãpª#è&ÃÐÿ'ÃàÁ#Ù"Ãì%à ·*Ãð¾*Ã`_)ÃPÇ&Ã0ü%ÃðÖ&ÃðS'Ã`è'Ão)ÃðÐ'Ãi&Ãø'Ã0ð'ð«(Ãà+À<'ð"*Ã0m(à Õ%ÃàÁ#Ã0s'Ã*ÃÐ &Ãp&Ãà*À¿&Ãà )Ã@ &ð+ÃÐj+à F(ÃÐ|(Ã`î&Ã%'Ãò$Ã{#À¿&À¹'Ãð¾*ÀB&à F(ÃðÊ(à Ï&ÃPÓ$àœ$à @)à 'àï+ÃðG)à 'Ãà&(À¹'ð±'Ãà»$ÃÀÒ(Ãp†)Ã@š'ÃÐ|(ÃðÊ(Ãð¾*à–%à ^$à%Ã@¾!À**Ã0s'ð±'ð()Ãp*Ãð¬-Ãø'ÃЈ&ðÃ$ÃàÓ Ã Ã@¬$î%ÃP>(ÃÀO)Ãp )Ã0y&ÃPÍ%ÃàÙÀÅ%ÃÐÿ'à Õ%Ãp!%Ã`k'à 'Ãà'Ã%'à$À6(Ã`â(ÃÔ)ÃPÓ$ÃÐ#à(Ãp€*Ã0g)Ã`ô%ðF$À×"Ã0ö&ÃÚ(Ã+&Ã)Ã`q&Ã0ö&ÃÀÒ(Ãðî"ÃP\#ÃðM(Ã0$à=ÃPë Ã0%ð:&Ã&Ã](ÃÀð#Ãp'ÃP2*Ãà&(Ãà )Ãø'Ã`‰"Ã@5#Ã(ÃpŒ(ÃðÐ'Ã`è'ÃPÍ%ÃЈ&Ã`ú$Ãà»$ÃP>(Ã0%Ã(ÃÐ|(Ãp!%ÃÀ"Ãp3"Ãðè#Ã`è'à @)Ã`$ÃÐ#"Ã"Ãø#ÃP\#à%#ðF$ð·&Ã0ð'Ã`k'À×"Ã`}$Ã`w%Ã@)Ã@)%Ãþ&à F(ÃÀ!Ãðq"ÃðS'ðR"à v Ã$à %Ã&à%#Ã`ú$Ãpª#ÃàD#à F(à L'À`!à Û$Ã0‹#Ãð Ãà>$ð4'Ãðq"Ã0‹#ÃPJ&Ã{#Ã`$Ã@ &Ã@)Ã0ü%Ã&ÃàÇ"Ãà,'Ã`â(ÃPÁ'àû)ÃP2*Ã`e(Ã`è'Ã,Ãõ.Ãp )è&Ãð_%ÃÐp*Ü(ÃÐŽ%ÃðM(Ã@ù,Ãð;+à X%ðÃ$Ã`k'Ã&Ãà'Ã@v-À•-Ãð²,Ã~-À$+Ãðâ$Ã0m(ÃÚ,ÃP¯*Ã&ðÉ#à~)â'Ã0ð'Ã0y&ÃW)ð.(Ã0U,Ã@)Ã`k'ÃP.ÃQ*ÃÀÌ)Ãp€*ÃÀØ'Ã0ü%ð,ÃPµ)ÃÐç+à ¥-ÃðM(Ãp!%ÃP¯*Ã`G-Ãò(â'ÃÀÆ*ÃÐv)Ã0ö&Ã@/$à ½)Ã@ÿ+ð()Ãpý*àŠ'à Ï&Ã](ð¥)Ãæ*àû)À­)Ã0Ø+Ãà+ÃÀs#Ãu$ÃД$ÃÐ'ðŸ*ô$Àf ÃÐŽ%Ã0m(à„(Ã@(Ãi*Ão)ÃW)à„(ÃP2*è&Ã@#&ÃÐ|(à~)Ã0m(Ã`e(ð()à Ï&Ã0y&ÃÀØ'ÀB&ð«(à d#ð4'Ã0ê(ÃÀº,ÃPÇ&ÃР"ÃК#Ãpª#Ã@;"Ã0$À¿&ÃК#ÃР"ÃÐ/ ðÉ#ÃPÇ&Ãà£(Ãðe$Ã@5#Ã0$Ã`}$Ã(Ã](Ãàµ%Ã&Ãp’'à F(à%Ãp˜&Ã` "Ã+&ÃЈ&À¿&à X%ÀÑ#ÃàÇ"à¨"à ^$Ã$ÃÐp*Ã0…$ðjÃ@ÊàOÀrÃÀö"ÃÀÃÒÀéÃ0µÃàJ"Ã`#ð@%ÃPb"à à á#Ã@²#à&Ã@¬$Ã$Ãà>$Ãðô!ÃÀü!Ã@¦%Ã0&ÃР"ÃÀà ˆÃÐ#ÃPÍ%ÀT#Ã@¸"ÃP\#à$ÃÀ!Ãp? Ó#ú#à d#ÃPýÃ@²#Ã`ƒ#Ã+&Ãp-#ÃPn ð^ ÃÀ['ú#ÀZ"Ãp-#Ã` "ÃPn Ãðw!ÃР"à j"à¢#Ãð‰ÃÀ… ÃÀ‘ÀrÃP€ÀÀœÃоÃ0‘"Ãà\Ã`• ÃàÍ!Ã`!àÆÃpÂÃàbÃÀ ÃÀs#ð.(ÀÅ%ÃÀ!à¨"Ç!ú#Ã`#ÃàP!Ã`â(Ãæ&ÃàD#À`!ÃPÓ$Ã`q&ÃP÷ÃÞÃðƒÃàbÃ`Ã@²#Ã0…$Ãu(à ùÃ`0ÀõÃðÀõàÀðíÃ@MýÃ0!ÃPV$Ã.Ãð Ã$ÃÀ!ÃàhÃÀ©ÃÀü!Ã0—!àIÃpEÃp9!à=ðáàäÃ`¿ÃPŒÃàJ"ÃPñà¨"Ãвà ˆÃpEÃð›ÃpÂÃPn Ã@SÀÃÐMàOÃØà7 Ã@eðáÃpª#Ãp-#à ÀÃÐYàIðùÃàzÀÃÀ—Ã.ÃUÃàßÃÀ ÃP ÃÞÃ@ÐÃP à ÿÃÀÃÀ©ðóÀxÃð‰Ó#ÃàÓ ÃP†ÃmàÆÃ@èÃÆ!Ã0 Ãðô!ÃÐ/ Ãp3"Ãp? Ã0&Ã@Ãð*Ã(Ãð} ÃpWÀõÀ~ÃðÃ0©ÃÀÀûÃpQÃÀ‘Ã02ÃpiÃ@îÃ@eÃpÚÃ@èÃëÃpWÃêÃ02Ã`¡ðvÃ0&Ã@Yðóà |Ãð} Ã0£ÃÀ£Ãà Ãà÷ÃpWÃ`6Ã@ôÃ.ÃpøÃ0»ÃÀÀ~Ã¥Ã@ÐÃI!ÃPtÃ@îðpà Ã` Ã@YÃPzÃäÃ` ÃÐAÃ"Ã0µÃÀð ÀÃ(Ã`¡Ã0&ÃоÃ@ÐÃPÙ#à ÿðíàOÃð›ÃpÚÃ02ÃàhÀéÃ`¡ÃðÃÃpÚÃFðÃ@ÜÀûßÃP÷ÓÀõÃ@SÃ@YÃÀÃ@kÃ0ÁÃ…ÃàÃÃÐÊÃp9!ÃànÃP€ðÃ@èÃpÎÃ`6ÃpKÃÏÃPÃ"Ãð­ëÃ@_ÀÃà€ÃP’ÃÐÜÃ@kÃpÚÃð ðX!à´ Ã@G Ã`0ÃÐÖà ùÃàV ñÃpòÃRÃ`³à Ã0JÃÐAÃpQð Ã@èà ÃpÔÃ(à[ÃpìÃÀ,Ã@kÃÀ»ÃÐYÃðÃ"ÃànÃàëÃÀÁÃàzÃpKÀ ÃpiÃ`¹àÌÃ0DÃð0àÌÃÀ‹Ã@_ÃpKÃÉàOà #Ã@eÃP†ÃpæÃ0VÃÀ,ÃðÃ0µÃ@_ÃP àIÃЬ à Ã(ÃàhÃP€ÃÕÃP˜ÃüÃP€ÃàýÃ.Ã@ÜÃsÃÉàÆÃ@kà àÞÃÐAÃð³ÃüÀ„Ã:à ˆÃÐÊÃ`<ÃXÃpÂÃÐ;ßàäðˆÃpÚà[ÃpÚð ÃàåÃPzÀŠÃ0VÃàŒÃÀ£à ÃpÔÀ À~à ÿÃ`¡Ã@eðÿÃ0DÀ„Ã.ÃgÀ„ÃmÃð•ÃðÃàýÃÐîð‚àØÃ4Ãp]Ã@îÃ`<Ã0\ÃP!ÃpàÃ0VÃÀàÌÃÃ^ÃP3Ãð0Ã…ÃÐâð|ÃÐÊÃð÷ÃÐÜÃð0Ã`ÑÃ@Ã"ÃpÈà[Ã(ÃpcÃFàCÃPýÃÕðàüÃÐúÃÀJàUÃ`• Ã0D÷ÃÐ5à[ÃàÃ`­Ã0>Ã@_Ã@èÃàñÃpàÃ@Ãð­ÃÞÀ Ã`ÝÃ`làyÃÀ©÷Ã.Ãð­ÃðàUð#Ã0nÃð­à ²Ã‹Ã@âÃàýÃpoÃÐqÃà’ÃLÃ0ÇÃð¹ÃÐÜÃPÃpWÃÀ£ÃàbÃsÃÀ2Ã`¹Ãð<Ã`Åðˆà ;ðÃ`¹ÃLÃÛÃRÃÐèðÃÃÏÃà ëÃÐkÃÀ&ÃP ÃÐGÃÐMÀ%ÃÃð¿ÃÀÃ@YÃyÃ@ôÃ:ÃÀ,ÃÃ…àäÀÃp‡Ã@‰Ãð0Ãpª#ÃPÃ@ƒàüÃ@ ÃpÃÐâñÃÐèà ¾Ãp{ðÃ@ÃðBÃP¶ÃP!ÃÕÃÐ_ÃP-àmÃXÃP˜ð#à  ÃÀ©ðíà ˆð‚ÃP ÃÐÊÃXðšÃ`¿ðùÃ0ÍÃÃpìÃð•à[àä×ýÃàÃðÅðŽà ¬ðàmðÃ@qÃêÃ0ÁàmÃ4ÃÐ5ÃP ÑÃÃpìÃPžà àØÃPÀÃP’ÃP-Ã@}Ã@wÃpÔÃ`­ëÃà÷ÃPà šÃÀ&ëÃÐSÃÐeÃ4à ¦à[ðˆÃ@qÃPÀÃ`¿à  àðÃÀ¯ðùÃàhÃ@qÃÕð”Ã@èàÆà ”à 5ÑàÞÃ@}ÃàŒÃP’Ã@wÃð­à šÃP!À ÃPn ÃRÃXÃp{ÃÐwÃ@ÃØÃð¹ÃüÃ`BðÃ@èÃPÃPðÃÀ>ÃÐÊàÌÃÐÜÃоÃÐÜà ²À„ÃÀ>àyÃÃÏÃ(Ãð0Ã`NÃà /Ã`ÅÀ„ÃP°Ã`BÃ¥à[ÃpiÃ0PÃàÃP à[Ãð$ÃpWÃ@ôð”à #ÃmÃàzÃð6à Ãð”Ã@}Ã0ÁÀÃ`ËðŽÃÏÃÐeÃð­ÃjÀ–ÃsÃÏÃ.À~Ãð‚ÀÃÐèÀà ŽÃðÃÞÃ0DÃPŒàØÃÀà  ÀÃFÃ`<àÞÃpuÃP'ñðpÃ0PàöÃLÃÃÃð§Ãð0Ã@ôÃÐYßÃÃð¹à šÃ@ôÀ+ÃpøÀÃ0ÙÃ@ÃÀ—Ã@wðÀÃÀ¯ëÃ0ÁÃ0DÃ`HñÀûÃ(ÃÐSÀ Ã(Ã@eÃ0µàÞÃ0bð#Ã@}ÃÀ&ÃÐMðÃàŒÃð*Ã@îÃ@ƒÃPÃÃ`<Ã@îÃÀ—à ”à #ÃvÃÐqÃFÃ@ÜÃÐ5Ã0ÁÃ:Ãà ÃÐîðpÃÀÃð­ÃðBÑÃPýÃðÃaÃPÃÀPÃÐeÃLÃðHÃ`³ÃÀ Ã0åÃÐâÃðËÀ´Ãð0à ;Ãð0à ÃpìÃ@_ÃÐSÃpæÃ0>Ã0>Ã4ÃÃÀ»ÃÀ2ðšÃ`³ß!ÃоÃ0Và /ðˆÃÀ‘ÃP¤à #Ã@èÃð›àÌÃÐÊÃÐÖÀÃP˜ÃÀÃ`­à ÃÐYàUÃàbÃÀ8ÀÃÐeðÃpÚÃüÃ0ÇðÿÃLÃP€Ãð$Ã`0ÃP÷ÃÃÃÀ&ÃPÃÐ5Ã`*ÃpÎÃÃp¼ à šàÌ÷Ã`¿Ã¥ÀàOÃØÃ`¡ÃÐMà  ðjñàOÃP†à[ðÿÀ„ÃPb"ÃÀ!ÃpWÃàýÃ`TÃPŒÃ`›à ùÃP†Ã0ÓÃà÷ÃPn à®!ÃØÃpcÃ0µðóÃpWÃ@úÃ`ËÃ0,Ãð›Ã(àCÃ@YÃ@èÃð$Ã0©Ãð•ÃÐeÃP¤ÃÀ&Àrà ”àOà ˆÃ`Ãð•ÃpæÃð$ÃàŒÃ`§ðR"ðáÃ@_ÃpWÃÀ£ÀxÃÀ©ÃÀ&Ã@ÜÃp¶!ÃÐMÃðÃÐÜÃ0DÃP’Ãð0Ã@wÃð¡ÃgÃÐÖÃpÔÃÀ£ÃÃÃÃà ¦ÃpoÃ@MÃ`›ðˆà ˆÃPh!ÀxÃð‰ÙÃ@kàUÀ~ÃàbÀïÃPtÃÀÃPÃÀ©ÃÐÖðÿÃÃàzÃPÃPýð|ÃÀ&à  ÃpøÃp{Ã0ÍÃpWðùà ”ÃpiÃ0,à ‚ÃÀÃ`¹Ã0ÇÃàbà Ãp¼ ÃÐ;À„ÃPà  àUÃð›Ãð0ÃÀ à ŽÃ@kÃ0»àUÃpìÃ`³Ã0©ÃàzÃPŒÃ@Ãð­Ã`HÃðÃÐMÃð•ÃRÃ0ÁÃ0¯Ã0»ÃðÃànÃàÙàOÃÉÃ:ÃÐ_ð#Ã@îÃиÃ02Ã¥Ã`¿Ãð6à ó Ã"Ãð¡Ã@âÃ0¯ÃоÃPýëÃêÃ`¿ÃO ÃP€Ã`6Ã@ÜÃиÃ`à j"Ã` "ðíÃÐMëàIÃà€ÃÐSÃÐYÃ@ÐÃ0#Ã°Û Ã +"à ^$ÃÐÄÃPÀ„Ã@âÃPÃ@à ”ÀïÃàåÃPýð^ Ã0£ÃðÃ0>Ã@;"ÃÀÃÀ ÃRÃ08Ã@¸"ÃàÙÃ0JÃ0ÍÃÃðñÃ0¯Ã0µÃ"ÃUÃÐ)!ÃaÃàbÃp]ÃàýðvÃàåðjà !ÃðÃPÃpÔÃÀy"ÃàÙÃð$àØÃð•ÃäÃàåÃÐÄÃÐÄÃÐMÀÃ`³ÃgÃ`ÃP€ßÃÀÃ`¿à ÃöÀÃÀÃð­Ã02àÀà ŽÃð$Ã`!à7 ÃPë ðX!Ã¥àäÃpoð|ÃpQÃpìðíÃÃp]ðdÃÀÞ&Ã@MÃ`¹ÃäÀZ"Ã"!àOÃÐÖÃÕàUÃaÃð$Ã0PÃàhðÃð›Ã@YÃàñÃÉÃÀÃ[ÃÐGÃP€Ã@èÃÐÜÃÐÊÀÃÀÃÌ Ã@_ÃÀ,ðˆà ”Ã@Ãà÷ÃgÃ@MÃP ÃRÃð­ÃÐAà v Ã`§Ã@qÃÀ©ðvÀõÃÐÐà ÃàhÃÐ;à ð^ Ãð•Ã0©ÃÀ‹Ãp-#ÃàßÃPëÃpàð Ãð•Ã08Ã(ÃyÃðÃ0DÃð­à #ÃÀ&Ã0µÀÃ0ÙÃ0ÓÃ0ÇÃðƒÃ`!Ã0©ÃpKÃ`›Ã`›ÃÀ,ÃöÓÃüðóà ”àCðóÃ.àÌÀxÀõÃPzÃðƒÀŠÃàåÃPÃ` ÃpEÃÐÐÃàýÃ0>ÃÐÊÃ@èÃÀÃ@Ä ÃÀ¯ÃpiÀÃLðvÃàëÃ`›Ã02à ÃPb"Ãð•ëÃð} à ‚ÃàtÃ`TÃ@Ãð§ÃpWÃ.ÃPžÃ0>Ãð¡Ã0¯Ã`¹ÃÀ»Ãð¡Ã^ÃpWÃÀy"ÃÐGÃ0Pà ¦à šð|Ã0ÇÃÐÊÃÃëÃpcëÃpÂÃàýÃàýÃàzÃpQÃ[Ãpàà ¦ÀŠÃÀ‹ÃPb"Ã@_ÃP†àäÃ@A!Àã ÃÐSëð|Ãpcà ÃpÈð ÃànÀlÃàtÃиÃ4Ãàzà7 Ã°Û Ã€xà[ÃиÃàbÃð$ÃP ÃLÃpoÃð à ùÃPß"ðùà[ÃÃÃ`6ÃyàÒÀðÿÃÐAÃиà ÙÃ`Bà ¬Ã`$ÃÀÃÀ—Ã`0ðùÃpÔÃPñÃÒàÌðdÃ@ÐÃpàÃpÚÃ0µÃð‰ÃÃàëÃÀµÃ`0Ã`³ÃPà ”Ã`HÃÀ,àÒÃpÂÃÃ`BÃPªÃÀ£ÀûÃЦ!ÃPh!Ã`$à ÃP€ÃÀ~Ã`*Ã`Ã0,Ã@SÃ°Û Ã UÃLÃàñðíÃÀ8ÃÀ ÀõÃÀ&ÃpÔÃ`¡àUÃ@ÜÀf Àlà  ÃÀÃàtÃÀÃ`­Ã4ÃÀ,Ã.Ã0"Ãà\Ã(Ãànà ˆÃ@SðáÃ=#Ã@Ä Ã [àêÃ0©Ãþ"ÃpKÃ@_ÃPtÃànÃgÃðq"Ã0£ÃP˜Ã`¡ÃàßÃ@eÃpcÃFÃ@ÜÃ@_à=Ã0£à ùÃ`0ÃÃ@5#Ã.ÃðÃsÃ@_ÃpiÃð Ã0©ÃàD#Ã@YÃ0µÃÐ;Ã0 Ãð‰Ã`­Ã`¹Ãäà #àÞÃ¥ÃðÃPå!Ã0&Ã4Ã`ÅßÃÉà ŽýÃÐÐÃ°Û ÃвÃp¼ ð^ ÀlÃоÃ@Ä Ã IàgàOàUà Ã@_ÃPë Ã`!ÃðÃÉðpàÌÃð§àgðùÃP€Ã02Ã.à |Ã` ÃÃýÃð ÃððáÃ` ÃÃÀ ÀxÃP÷ÃÐYÃ0»ðpà à À¢Ã@qÃðÀrÃ`Ã`6àðÃPžÃðè#Ã0!Ã:ÃàzÃЬ Ã#Ã`!ð^ Ã0©ßÃüß!àÀàÀðíÃð‰Ã0 Ã0,ÃPýà !ÃPë ÃI!Ãðà ˆÃðú Ã4ÀrÃ4ðÃpÔðíÃp9!à=ÃpàÃäýà ÃÀ!à¢#Ãp-#ÃÞÃ`³Ã"!ßÃ@ÐÃÀÃ@Ä Ã[ÃàßÃàåðùÃ4ÃàhàÒð‚Ãà\Ã@YÃÀ!Ã0‘"ÃÀ!À„àgÃ@qÃ`ÃO Ãðè#Ã0ÁÃpuÃÃÃÀ>àUÃð$Ã@ÐÃÀü!ÃO à ŽÃ"Ã0µàÒÃ@èÃð6Ãp]Ã( Ã`• ÃàåÃÀÃpÔÃPÃÀÃgÃиàÆÃÀ‹ÃP†Ã0JÃÀ‘ÃPtàÀÃð¡Ã@eÃöà |Ã`¡ÃðÃäÃð§àÞÃöÃÀ&à |Ã`­Ã[ÃðƒÃpWÃ`¹ÙÀf ÃäÃÀ—Ãp]ÃPtÃ0¯àCÃð•Ã0µÃ0ÍÃpÎÃ` Ãððˆà ²Ãð Ã`• Ã"ÃpÈðpðùÃÀ2Ã0ÍÃ[ÃðÃÀàÀà Ã@ÐÃmÃðÃðÀõà ùÃðÃPÃ4ÃPÃpÔÃ@eà  Ã°Û Ã ÀÃÀ‹ÃðÙÃ`§Ã08ÀŠÃÐYà´ Àf ÃðÃðÀxÃFà ÃpEÃ08Ã`!Ã@/$Ã`#ÃÀ… Ãðƒð‚ÃÀ Ã0&ÃÀ£Ã` "ÃÀ‹Ãðåå Ãp¼ ÃÐYÃ@qÃmÃ0>Ã0©Ã"Ã`Ã02ÃÀ£Ãð•ÃðñðÃð$Ã08à ùð‚à )Ã@ôÃ@MÃ`!ÃP€ÃPŒÃðÃÀ Ã"ÃÀÃð*ñÃ08à ˆðÿÃð ÃPÃpQÃ0 Ã08ÃÐ5Ã@;"Ãp? Ãp-#ÃàÁ#ð|ðˆÃPñàÌÃÐ5Ã`<ÃpQÃ@SÃp¼ ðíÃ`³ÃáÃØÃ`ÃpEÃ`¡ÀéÃðÃ@;"Ã`Ã@ÐðóÃØÃÐÊÃÐ_ÃüÃÐÐà ß!ÃgÃàbÃðàÆÃ`›ÃPb"ðdà ÃànàUëÃÀðpÀ×"Ã0!ÀlÃp? ÃàhÃ:ÃànÃЦ!Ã0£ÃP€Ã:Ã0>ÃÐÄÃÐÐÃpÔÀ~ðvà ‚ÃàÙÃðú ÃsÃð*Ã0£ÃÐ5Ã4Ã`!ÃðƒàCÃ@ÜßÃ(ÃC"Ã`• Ãmà àÞà šàIÃPýÃpQàäÃpÎÃ0¯ÀûÃÀ ÃpÚÃPn ÃÀà ÃP€ÃÀ£ðjà í!Ãðà Ãð‰Ã0y&à&Ã0>ÃÐYàØÃP˜Ã0>ÃP’Ã`$ÀxÃàJ"à v ÃpKÃðq"ÃàÓ Ãð Ã4ÃÐM÷Ã¥ ÃPýÃ@Sð|ðdÃ4Ãäëà |ÃЬ Ã` "Ãp? ÃpKÃ@ÐÃ`<ÃPtà ‚ÃÐAÃ@YÃpEÃPÃ`Bà ”ÀõÃÀ‘ÃðÃ¥Ã`³ÃPýëÃmÃÀÃ`*Ãø#Ã@S÷ðvðçÃUÃàV ÃUÃÀ£ð^ Ã:Ã@YÀxàØýÃÀ ÃÐ;à |ÃÐ/ ÃÐ)!ðÕ!Ãð‰ÃÐÄÃ"Ã0µÃ@kÃ"ÃÞÃPë Ãð Ã¥ÃpÎÃäëÃ"ÃpàÃp3"À`!àCÃð­ÃÐÄÃàÓ Ãð ëÃPàÌÀéÃÞÃ@kÃàtÃàhÃðw!Ã@_ÃpKÃðÃ@èÃpcÃÐAÃPzÃàtÃ`¿ÃðßÃ@ÖÀ ÃÐÐÃð›ÃÌ Ã ùÃÃÃ0»Ã`$Ã@ÐÃ`• Ã`›Ã0£ÃÀ©ÃpWð|ÃÀÃ:ÀxÃ0&ÃÐÊÃÏÃPÙÃÐÊÃÐÖÃ08ÃàhÃöÃÀ©Ã0—!ÃàV àºÃ@¾!àCÃPŒàOà ŽàÌÃ0&Ãp¼ à ÃêÃp]Ã0»ÃaÃð•ÃpÔÃ.Ãàzà ðÃáÃ`ÅÃàzÃpÔÃð¡Ã0Áð|ÃPzÃpcÃðÃp]ÃpÎÃêÃ:Ã@_ÀïÃÀàsÃ`¹à=ÃdÃPŒÃÐ$Ç!ÃÀ ÃàëÃPªàäÃ:ÃpQà ¦ÃàÃÐGÃP†ðíÃÐÄà ”Ã@ÊðˆÃ4ÃÀ À~ÃÐÖÀœÃÀ©Ã@èàÌÃàzÃÛÃ0JÃð0ÃüàaðÿÃ@ÀïÃp]ÃÀ—ÃpÔÃ0‘"ÃO ñÃàýÃÛà 5Ã@Ã0ÍÃð§ÃP€à ˆÃ(Ã@âÃÀDÃP!Ã@âÃPÃðà ²Ãð¡ÃàÙÃ0!ÃÀàaÀÃàëÃÀÃàzÃ:ÃÏÃÀDà )ÃÀÃP Ã0JÃÀ8ÃÐYÃÀ—ð‚Ãà€ÃÀ‹ÃÐ5à ¦Ãð*ð5À®ÃÃÃPÃÐÐÃ`¹ÃÃÃ:ðjà #ÃLÃPÃ@ôðÃð6ÃððíðŽÃÀ©Ã` Ãàn÷ÃP!à ¬Ã4ÃpÔàÌÃÕÃ`Bð‚Ã4ÃsðvÃÐâàüÃ:Ãð•Ã@eÃ`¿Ã@ÃêÃð¡Ãð à ŽÃöÃP¤àÞÃÐMÃð ÃÀ2àöÃ0>ÃÐÄÃ08Ã"Ãð$ÃÐSà ˆÃàßÃÀ&Ã0JÃ0JÃpuàÒðÿÃðÃðÃÀ&ÃPÃÃÐeÃÐÜà Ãüà 5ÃpìÃPŒÃÀ&àØà  À~ÃÃpQÀõÃ`§ÃP’À%ðÃð Ã@qÃÀ—ÃÐMÃÃÃàÞÃPÃ0!ÃÐ5ðóÃàëàÒà ÀŠÃàtðÿÃmÃ0>ÃpÈÀõÃP†Ã.ÃÐSÃgÃP€Ã0P÷à )Ã`BÃÀ,ÃpoÃRÃ4ÃpcÃàà #à[ÃpWÃ`ÅÃÐAÀxÃpoÃð¡Ãð0À%Ãà˜ÃÛÃÐSÃ…àüÃÀ2à[ÃÀ2Ã@eÃ0ÇÃP˜Ãp]ð”Ã`Åð À®àÞÃ08Ãð•Ã`¿Ã0DÃðà )Ã`¹àOÃpÔßÃàëð ÃpÚÃpcà ²Ãð Ã7$ðóÃXðð”ÃÐÊÃP€àÒÃ0Jà Ã08ÃÐYÃ4Ã`¹ÃO ÃðƒÃðàÞà ”ÃÃ(à šÃÃ``Ã0µð|Ã0JÃÕàUÃ(ÃÃà ÀÃ0ÁÃpKÃp3"Ã`­Ãð›Ã`HÃP Ã@ÃpÔÃ4ÃP˜ÃPtÃðÿÃàzÃêÃp¶!Ãp3"ÃP’àÒÃ"ð^ ÃÐ5Ã02Ã`*àOÃà ðvÃ`­ÃÀ¯ÃPtÙ"Ãðú ÃPë àCÃöÃpÚÃPŒÃàtÃ`¹ÃpìÙÃpEÃÀÃ`$Ãäà à[à ¦ÃRðÃ@èÃ@Üð^ Ã@Üà ÓÃà€à  Ã0©Ã`BÀà ÿÃ"Ã`¿ÃP?À=Ãð¿÷Ã`­Ã"àÆÃÃÐYÃ(Ã(Ã@ÜÀ„Ã0>àUÃp]ÃÀ£ÃpàÃðñÃP ÃpÈÃÀ,ÃÐMÃpæÃÐYÃÐSÃÐÊÃPzÃÐ/ à p!Ã@îÃ`³ÃsÃgÃ0»à à ˆÃàtÃà à ¸ÃàzÃP÷Ã`¹ÃgÃP€ÀõÃÐÐÃð‰ðjÃàëÃ@èàÒÙ"Ã0,àÆÃàýðšðà ‚ðáÃÐYÃÐMÃÐÄà Ãp{ýÃ`³ðdÀã ÃÀ Ãð›ñÃ@eÃ@YÃàëð|Ãð§ÃFÃà†÷Ã0!ÀxÃоðpÃ0ÍÃÀ¯Ã0VÃüÃðÃ`›à¨"ÃP÷ÃPÃð*ð|àUÃêà #Ã@èÃ0©ÃÀ¯à ‚ÃPñÃ@ÐÃRÃ0VÃð*Ãà€Ãð›ëÀ~ðÿÙÃ`*ÃPtÃsàOÃàÀ¢ÃÉÀrÃÐYÃÀ£Ã`<Ã:ÃàhÃ0 Ã0ÁÃð$Ãð§ÃÀ—ÃFÃÀ»àaÃpæÃÀ£ÃÐGÃ0ÁÃPýÃ`­ëðÃðÃð•ÃÀa&Ãà’Ã0¯Ã:ÃpÚÃÃà÷À ðÃÐôà #ÃðÀxÃ`¹Ã`NÃÃÃ4ÃP÷ÃÀ£ÃоÃàñÃðÃ@wà ¬ÀŠÃàÃP†ÃpÔÃPýÃððŽÃ@ÃàñàÒð|ð ÃàýÃðÀŠñÃÀ—ðÃÀ,ð|àêÃ`ËÃÐèÃ`BÃÐÜÃ0ÁÃ.ÃÃLÃ`6ÀûÃðÃð¡Ã`HÃ:Ã@èÃpÔÃ@èÃðÃ02ðpÃÐYÃÀ£ÃÀ‘÷àIÃð§ÃyÃÀ Ã@èÃ`¿ëÃÐ/ Ãð ÃüàIÃ(Ã4Ãà ÃLà /àÒÃàbÃ0,Ãà€ÃFÃÐYÃÐMà  à ”ÃÀ»à šÃPªàðÃ@}ÃpòÃ0»ÃÐMðÃpàðÿÃsÃÕàäà  À+Ãà’ÃðÃ02Ã.ÃpÈÃ`§ÃpÔàUÃpòÃð_%Ãðú Ã@eÃÀÇÃÀÇÃyÃð$ÃÀ‘ÃànðšÃ@îÃÉÃ0bÃpòàäð^ ÀxñÃ#à ëà p!ÃpÈÃ¥Ã@kÃÐ;ÃÀ,ð|ÃÀ Ã`­ÃmÃÀ2ÃüÀÃgÃP†À„Ãà ŽÃ0»ÃFÃànÃ`0ÃàåÃpQÃpÈÃ( ÃP˜ÃdÀÃðÃmð|ÃÀ¯ÃÀ£Ãà\à ùÃиÃyÃ@kÃ°Û ÃPå!ÃЬ ðóÃÐÄÃ"!Àûà1!Ãð ÃÐGÃ`³Ãà÷ÃвÃ@ÜÃÃÃ0ÁàÒÃÀ2ÃàñÀã ÃÀ‘ÃÐÊÃp¼ Ã0&ÃpÔÃp¼ ÃpKÃ@ÐÃ°Û Ã4ðóÀõðÿÃ@MÃ`6ÃðÃ0»Ã[ðjÃÀ‹àäðÃ` ÃPñÃ0>à ˆÃð‰ýÃ@ÖàCÃÐ/ àCÃ`$ÃÀ… ÃP ÃÏÃÀÁÃ0VÃð¡Ã02Ã`¿à 5Ã0»ðdÃ`<ÀÃ`›ÀxÃPŒà šÃäÃ0DÃ@âÃ0‹#ÃвàØÃäÃaÃ0µàaÃð*ëð ÃÐGÃ@âÃÐâàêÃ0>Ã(Ãà ‚ÃàðóÃ4ÃàåËÀàÀÃ0µÃüëÃ.Ãð<Ã(Ã¥Ã@ÊÃ0DÀÀŠà à v àÀÃ:ÃàtÃ4ðdÃPÃ`$ÃpÔà Ã0Áà ”ð|ëÃ@âÃöðvÃðÅÃÐèÃÐ)!ÃÀ¯Ã0PÃÃÀ¯Ãð•Ã0ÁÃgÃ02ÃàåÃmÃÉÃPÀÃpìÃpÈÃ0µÃÐÜÃð*àÀÀ~Ãð³ÃÀ¯ÃPàmðpÃ`¹ÃPÃPÀÃüÃÀ©Ã0£Ã@ÊÃ^ÃP¶Ã@}ÀxÃÉÃëÀéëÃRÃð¡ÃÐkÃ0PÃð0ÀûÃà÷ÃÀ8àÒÀ¢Ã`¹ðvÃp]ÃöÃ@ƒÃPÃ`0ÃÉÀ~Ã0¯Ãpìà ¦ÃÌ Ã@èÃ@àÆÃàŒÃ0VÃÀ Ã08ÃÞÀxÃÐSÃ@}Ãà\Ã"Ã0VÃP°Ãà†Ã`TÃð0ÑàêÃàbÃà\ÃÀà ˆÃÃPzÃ@âÃÐÄàUÃÐ;ðjÃ@SÃÀ»àüà ¦ÀŠÀà ¦Ã`<ÃàëÃmÃ4ÃÀÁÃÐâÃÉàIÃLÃFÃð•ÃgÃPÃLÃFÃ@ÃÐGÃÀ,ðàOà=ÃÞÃÐGÃÐkÃyÃ`BðÃÀ%ðÿà ÃLÃP'Ãà†ÃÀ£Ãàë÷Ãð§Ãð•Ãð•ÃP’ÃÕÃpìàäÃ(ÃÀÃ0¯àêÃÏÀ´ÃÀPà ð ÃÕÃíÃÉÃ`¹Àûà ŽÃÃ08ÃP¤À–Ã0µÃêÃàÙÃð$ÀÃÐ_ðùÃp]àêð#Ã0»ðùðíÀàgÃ`BàäÃ`HðŽÃÕðÃP’Ã0DÃêÃ"ÃPÃ0ÓðíÃàh÷Ã"Ã@ðˆÃÃP†ÃêÃ`§Ã`*àUÃPÃÀð|à ŽÀ~ñÃÀ&ÃpÈÃÀ£ÃÐGÃpÔà šÃmÃàzÃðÃ@ÜÃÀ—àäÃà€ßÃ0 Ã4ýÃpÈðpÃçðùÃðÃàP!ÃP’àUÃàñÀÀŠÃpKÃÀÃpÂð|Ã`­ÃàýÃ@ÜÃàtÃоÃLÃðÃP†ÃpòÃðƒÃP€ÃðÃPzÃÀ©ÃÉÃ0bà )ÃÐYàÌÃpQÃpoÃà€Ãpæð Ã0ÇËÀŠðÿÀàÀðçÃP’Ã@}ÃP ÃPýàÌÃÀ‘Ã@îÃÀ‘Ã`$Àrà ÃÀ2Ã@e÷àäÃêðdÃÐ;Ã(Ã`³ðvÃpþÃ08Ã0©ÃP ðÃÐ;Ã`$ÃpìÃð›Ã`$Ãà÷Ã@ôÃP€ÃÀÃaÃàëÃäÃ:Ãà÷Ã:àsðÃð Ãð Ãð¹Ã@qÃ0>Ãð$Ã`›Ã.Ãð›Ã0ÇÃêàIðà ¸Ã0Óð à ŽÃ0>ÃÉÃðÃÀ&ÃàÃdà ²Ã`ÑÃÉÃÐ)!ðÕ!ÃP˜ÃÀ¯Ã0PÀÃ0ÇÃ@úà )ÃPžÀ„ÃpÎÃðÃÀ©ððÃð$Ã@ÖÃÀ©à[ðóÃPtÃ`Åà ¸ÃðÃÕÃpòÃpiÃÃsÃ0ÇÃÛðÀŠðpÃÕ÷ÃpàÃ@ÃÐ_à )Ã`NÃð} ÃÀ‹à 5àêÀ–Ãyà Ãð³ÃpøÃÀÃàåËÃÐSÃ@MÃ@YñÃÀÃPŒÃ@îÃ`HÀŠÃ@îÃð§ÃPÃ`¡ÃÀÃPžÃpìà šÃLÃð§ýñà ŽÃÐÊÃPzÃpiÃÐÐÃÀ&Ãàbà šÃ`$Ãð$à 5ÃÉÃ:Ã0>ÃÐSà ¦ÃÉëà ‚Ã@èðÃ:Ã0DÃ`6Ã`¹à ¦ÃÀ>Ã¥Ãð$ÃÀÇðŽÃpÚ÷à ¾Ã0DÃàñÃÀÁÃÀ2ÃpàÃÐîÃ0ÇÀõÃP€ÃðÃðÃFÃFÃPžÃ`BÃmÃÉÃÀ2Ã4Ã`0ÃàýÃð³ÃsÃP†Ã`6àÒÃ@âàgÃ0VÃÀ¯àÒÃÀ àIðÿÃÐÊÃ0>ÃÐâÃP'ýÃ`ËÃÀ©ÃÀ&ÃPªà )Ã`BÃàÃÕÃpoÃpÚÀÃÀ©ëÃpuàgÃÀ Ã@}Ã@ ÃÀÃ@eÃÀ©ÃpuÃÃÐYÃP!ÃÀ8ÃàÃRÃðÃPªÃp{Ã`ÅÃà÷ðÃP’ÃpÔðáÃðÃÃÃpæÃüÃ0ÇàðŽÃà†Ãð6ÃÕÃêëÃ`TËàêÃð¿ÃàŒÃp{ÃÀÁÃàÃ`<Ã`ÅÃ`ÑÃÐîà #ÃpæÃ@à  ÃÀ ðdÃÐYÃ@ôàmÀ1ÀŠàÞà #ÃÀµÀ¢àØÀŠÃ`NÃ…ÃPžÃ0\ÃP’ÃàÃP-Ã0µðpðÿñÃ@Ã`ËÃàŒà šÃ0ÍÃÐSÃp]ÃÐèÃÐâÀÃð0ÃÀ—ÃP÷à Ã@•Ã0JÃ0ÁÃ@ÐÃð­àüà 5ÃP-Ã@ÃÀµýàØÃ:à  Ãçð Ã@ÐÃP¤Ã…Ã0ÇÃpøÃà ð/Ãð‚à ŽÃPñÃ0&à ˆÃ:àOàÒÀÃÃÃ@èÃ0!ÃÐÐðÃàŒÃ@îàOðˆÃ`ÅÃPà ¬ðÃ@ƒÀ~ÃÐGà ¦ÃàåÃàñÃFàäÃ@èÃ`³Ãð›À%ÃpìÃ0»Ã@Üð|ÃÐÊÃÐÐÃ0ÓÃð§Ã`<ÃàtÃÉÃpÚðˆÃäà  À–Ã0ÍðŽðçðpÃàÙÃàhÃÐÖÃ@ÜßÀÃP÷à Ã.ÃÀ,ð‚ÃÀ¯Ãð³ÃðÃ.ÃPzÃUÃ02ÃP€Ã@ÖÃ@ÃÛÃÐMÃà\ÃÃ0µÃð›Ã@âÃàëÃmÃ`¹÷ðjÃpøÃÃ08ÃàV ÀrÃP†ÃÐSÃÐ;à šà ÿÃpKÃÐâÃ@qÃðà ¸ÃÀ¯Ã@âÃ4ÀxÀ„ÃðÃ@YÃ@_ÃÞÃpKÃ0©ÃPÃ@úÃðÃ@èÃ0PÃ`¡ÃÀ¯ÃRÃÐèÃÀà |Ã@ÐÃð›Ãàà #à ˆÃêÃ0ÁÃ@wàÒÃ`*Ã@âÃ(ÃØÃpÚÃð¡Ã@îÃ`<àÆÃ0,Ã0»Ãp¶!ÃpWÃ0,Ã@eÃÃíÃ@qÃÀÓÃÐqÃpÔÃgðÿÃ@Yð|ÃàV ÃP€ÃÀ ÃmÃÃÃð àOðùà šà /ÃpæÃ`³ÃÉ÷Àrð Ã`¹ÙÃÐÄðvà1!ÃÀ‹ÃÀ,ÀàOÃ0¯ÃÀÃ¥ ðùà šÃpàÃ`6ÃиÃð§ÃÐâÃêÀ~ÃpÔÃоà ÃPðóà ŽÃ`6à ð‚ÃàëÀûÃÀ ÃP˜ÃRÃmÃ`6÷à ‚ÃÐYð|ÃðÃàëÃPÃ`<ÃpÂÃÞÃÕÃp Ãà†ÃaÃð›ðà ÃÐ5ÃpÈÃ@eÃÀ£Ã0»Ã`­Ã.Ã@ƒÃàÃP†Ãðô!ÀÃpòÃyÃ0ÁÃÃPžÃ`BÃð­à šÃÐÐÃöàIÃ0ÇÃà€ÃÀ&àÌÃO à šÃPÃ0#Ãðq"à à ¬à MÃ`ZàmÃÐSÃpÎÃÐYÀÀ¨÷ÃÐÜÃöÃà÷Ã@ñÃ@eÃÀ,ÃÀPÃ`fÃ@}ÀÃ:ÃÀÃpÚà[Ãð›ÃàtÃð¡à ÃPÃÐÜÃUðjÃ`Ã@_ÃPå!Ã4À„ÃàëÃ.Ãpæð‚ÃäÃÒÃ@_à ÃsÃÀ&Ã08ÃÀDÃÐâÃ@ÃpQÃ0!ÀlÃÀ£ÃàÃmð|Àð‚Ã4Ã0»ÀûÃpcÀÀxÃÐMà ÃÏÃàýÀ„ÀŠÃÀü!àOð)Ãð<÷Ãà†Ã@îÃP¤Ã@kÃÐMÃÐ;Ã0 ÃЦ!ÃpÎÃÐ)!Ãðè#Ãp¼ ÃàtÃpEðL#ÀN$ÀéàIà´ Ãp9!Ã@A!àIÃ"ÀË$Ãp-#Ç%ÃPn Ãpàà ç"ðF$ÃpÔÃÀð^ Ã0"àºÃ`k'ÀÝ!ÃpÂÃðƒÃðú ÃPë ÀB&Ãu$à ñÀrÃàÓ ÃÀü!Ã0 ðR"Ã`• àIÃ`³ÃPýÃPn ÀlÃ"!Ã@ÖÃðq"ÃÐ)!Ãp¼ ÃÀ‘ÃÀ!Ã"ðR"à®!Ãp? Ã#à®!Ãð} Ã#Ã@¸"ÃàP!ÃàJ"à v ð^ ÃPJ&à%Ãðw!ÃPýÃ@Ðà Ã(ÃÌ Ã@/$Ã@A!Ã0 ÃÐ#ðvàÌÃÐÊÃвÃ`ô%ÃÐ)!ÃÀÃp'$à&Ã"ÀÅ%Ã0&ÃPñÃp? Ã0&ÃвÃ"!ÃàJ"à p!Ã@¾!ð^ Ù"ÀB&à |Ã@Mà ÃðƒÃ0—!ÃÐ/ ðX!Ãì%àºýà ÃP÷ß!Ãðe$Ãðô!ÓÃ`!Ã@MÃ@ÖÃàbÀf Ù"Ãpª#ðÕ!ÃPn ÃÌ Ã0ü%Ã`#ÀrðáÃðú ÃÀð#Ã`¡Ã0¯Ã0ÇÃÀÃ.ÃàtÃ@_Ã`#àÀÃð¡Ã°Û Ã`³àOÃ4ðdÀlßÃ0&à®!ñà ùÃàP!ÃàåÃð à á#ÀÝ!ÃäÃUÀÝ!Ã@SÃ[ÃÀ‹ðdÃÀ Ã0¯ð Ã0 ÃðƒÃð‰ÃÀ‘Ã@MÃP÷ÃPë ÃÀa&÷à àÌÃpcÃ0>ÃPŒÃ0©ÃÃàgÃÐGðÕ!ÃUÃà÷Ã`BÃà†àgýÃÀ… Ã0—!ÃÀ—ÃpøÃyÃð‰ëð|Ã08ÃpæÃ`­ÃÀ©Ãиëàsà 5ÃPªÃð*ÃpWðíÃàëÃ4Ã`0ÃÕÃ0DÃ(Ãà\ÃPzÃ.ð^ ðçÃC"Ãð‰Ãð¡Ãð›àÒÃRÃpæÃ0£Ãðe$àÀÃð$Ã¥Ã`<ÃPzà ùÃÃÐÊÃüÃà÷ÃÀ‘ÃPýðùÃðw!ðÿÃð­Ã@eðÿàðÃÀÃÒÃ`<ÃÀ£ÃPýà ÿÃàhÃpÔÀxðpàÌàºÃ@èÃ:Ã0VÃ@}ÃàëÃð‰Ã0&Ã"Ãà!à ÃðÃ`à ŽÃðÃ@âÃ` ð^ Ã`0à ¦Ãà€Ã@MÃÐâÃ@qÃ@kÃP€à à ²ÃP˜ÃpoÃ@îÃPð‚ÃàåÃ@èÃð0Ã`ÅÃ`³ðdàØÃ@èÃpìà ÃP†à ”À„àÞÃðÃà÷Ã(àØÃ@ôÃ`³Ãð*ëÃ`¡à ˆÃP ÃpÎÃ`<Ãp‡Ã:ÃÕÃàŒÃà€ð ÃPÃðà[Ã0µÃ@àIÀ„ÃðÃØÃpKà ˆÃÛàgÃ4Ã0Dà ¦ÃÐÜÃðùÃ.Ã0ÇÃðÃðÃ0JÃ0\Ãð§ð ÃÐèÃP˜Ã:Ã@èÃÀ»ÃðBÃ:ñÃÐSÃàhÃÀµà v à%#ÃÐÖÃ@}ÃÃànÙÃPÃ0PàÞÃPÃÐÐÃàtÃ02Ãð*ýÃPh!ð|ÃÉÃÃàÞÃXÃÀ2àÞÃPžÃÀDÃàŒÀ ÃP’ÃpÃàðíÃp? àÒýÃ0>ñÃÐAÃðà ¾ðÃFÃÀ,ÃàzÃ`BÃÀ àðýÃÀ¯àÞÀÃ`Tà ²Ã…Ã0ÍÃ@úÃP Ã`$Ã`³Ã0,à ÃàtÃ@ÖÀûÃ`ÑÃP!ÃöÃPzÃÀ£Ã@ÐÃ@SðÃ.ð‚ÀT#ÀõÃÐÐà #Ã0bÃðËà ¦ÀÃðÃöà #ÃPžÃððpÃgÀŠÃpøÃ@ÃÀ—ÃÐÐðˆÃÐGÃPÃð­Ãð­àÒÃàhÃÉÃàñÃPÃðÀZ"à Ã.ÃpcÃ0ÁÃ(Ãð0Ãð*ÃpÚÃPÀŠàöÃÐÄÃðÃÃàýÃPªÃ@àÒ÷Ã@ƒÃ‹ÀŠà1!ÃðÃØàIÃ`ÑÃàÃ@wðpÃÀ,à=Ãð•ÃÐÄÃ"Ã4ÃÐÜÃP¤ÀÃ02ÃÐ;ðjÃpKà ŽÃPÃ:àI÷ÀxÃ0£ÃFÃP˜Ã0VÃaÀÝ!ÃÐGÃÃ"Ã@ðX!Ã`§ðùÃÕà ¦ÃPà ”Ã@G Ãp¼ à ˆà šÃ`§Ã@G Ã`³ÃpQðdðjðçÃÀ£ðvÃàŒÃ` ÃÐ5ÃPñÃ@¾!Ã@ÐÃÐ#Ãp°"Ãà\ÃÀ"ÃÀê$ÃР"Ã@A!Ã`!Ã@¸"Ãp'Ãà)ÃðA*à ½)À.Ã*Ãà&(Ãp€*ÃÀO)ÃÔ)àï+ÀB&Ãì)ÃÈ+Ã0[+ÃÐR/Ã`²0ÃP£,Ãc'Ö)ðŸ*Ã'1àÝ.ÃÎ*Ã`M,ðŸ*à ±+Ãà,ÃP£,Ã@j/Ãl0Ãðš0ðò1Àè4ÃpÓ1ÃÂ,À /Ã'1Ãð0Ãàm1à “0ð/Ãà—*Ã0O-À /ÃàU5ä1ÃP£,ÃÐF1ðì2Ãð0Ãï/ÃpP2Ã`¬1Ãé0ÃPü2Ãð0ÃP‹0ê4Ãà[4À.Ã@ˆ*Ãpb/ÃÀ®.ÃÐv)Ãà+ö2Ã`50À‰/Ãï/Ã-0À.Ãï/àT0à ¥-Ãpb/Ãr/ÃÈ/Ã`/1ÃpV1à 0ü-ð .Ã`¾.à 0Ã×3Ãб4ðo2àl,àx*ÃÂ,ÃÔ-à 1ÃÀº,Ã3/ÃðÄ)ÃÐí*Ø3Ãày/Ãà+Ü(ÃÐj+ÃÐ^-ÃÀ7-Ãpß/Ãðˆ3àÝ.ð.(Ãà*Ã-ÃÀ+/ÃÐ^-Ã~-À.Ã0C/Ãð0Ã`A.Ãà+À.ÃÀº,ÃÀ¢0Ãð0Ã0U,Ã`G-Ãp’'ÃPÍ%àû)ÃðM(à @)â'Ãà£(Ãpb/Ã0C/ÃÐL0àé,Ã0g)Ã?-ÃÐ^-ÃÐp*Ê+Ã0I.Ãðÿ4ÃÐX.Ç%ð+Ãp€*Ãà)Ã*Ã0º0àÝ.à Ï&ÃÀI*ð()Ãà8%Ã`_)à 4+Ã`Ð+Ã0s'Ã)ÃÀÆ*ÃÚ(Ã`$ÃPV$Ã0#Ãà&(Ã~-àï+Ã0ö&Ã0"Ãðô!à F(Ãà‹,Ã`â(ÃЂ'Ã0ð'Ü(â'Ã@š'à&ÃP8)ðŸ*Ãø'ÃPÇ&Ãðâ$Ã0g)Ã0O-Ã@Ž)ÃPÍ%ÃЂ'Ã0a*ÃÚ(ð:&ÃÀØ'ð±'ÃPJ&Ãì)Ã`Ü)Ã`â(ð·&Ã0ü%ÃÐÿ'ÃЂ'ÃÀg%Ãà£(ÃðÖ&Ãpž%Ãò(ð½%Ã@Ž)ö.À /Ãp )à%#Ã[Ã`ô%Ã0y&Ã`î&Ãi&À¹'ÃÐŽ%Ã`Ü)Ãpý*Ã0ð'Ãà )ÃPå!Ãpž%Ãþ&Ãp!%Ã0$ðÉ#à F(à Ã(Ã0a*ÃPÍ%ÃÐó)ÃP2*Ç!Ãp°"Ã"Ã0%ÃÀO)à(ÃÐ%Ã"Ã0ü%Ã0s'ÃðÜ%ÃPÇ&Ã=#ÃPß"Ãì%Ãp'$ÃP>(ÃPÙ#à%Ã0#Ó#Ã0$Ã@)%Ã@¦%ÀH%ÀÑ#Ã@¾!ÃI!Ãp9!Ã0‹#ÃPV$ðÏ"ÃàÁ#ÃO à¨"Ãð_%Ã`q&ú#à j"ðL#À6(Ã@¦%Ã0‘"Ã@š'Ãæ&Ã@#&ÃPb"ÃàÁ#ÃàÍ!Ãø#Ã0—!à–%Ãðô!à¢#Ãp-#Ãæ&ÃPÇ&Ü(Ã0%ÃД$ÃLÀ`!ðF$Ãì%Ão)ÃÀm$ÃÀü!Ã`0ÃàP!Ã@#&àx*Ãpª#à í!Ã1%Ã@#&Ã#à j"ÀB&Ã"ÃÀ!Ã`#ð@%Ãø#Ãp&ÃàÁ#àœ$Ã@;"àŠ'Ã0%à7 Ãp9!à¨"à Õ%Ã@Êà$Ã0y&Ã0"ÃPV$ÃÐ)!àºÃ1%Ãp°"à%#ÀÝ!à®!Ç%Ãæ&à Õ%à %ÀT#Ãðw!Ã`›ß!Ã7$Ã0$Ã=#ÃÀ‹ÃC"ðX!Ã0&Ã@ÐÓà®!À×"Ãi&ÃÐÿ'à Û$Ãðq"à$ÃPh!Ã°Û Ã#Ã0%ðX!Ãø#Ãp’'Ãà8%Ã0 ÃвÃðe$ÀË$ÃðÄ)Ãðe$ÃÒà%#Ã@¾!ÃØà í!Ã@/$Ã`#à !Ã@²#Ãðô!Ç!Ã`‰"À×"Ãp9!Ãëà Ã0 ÃЦ!ÃàzÃвÃÐAÃÀ‘Ã[ÃpQÃ`*Ã@;"à v à%ÃÀÀ+Ã0 ÃàëðçÃ02àaÃ@SÃàÇ"ÃàÍ!ÃÀ`!ñðÕ!Ã.ÃÀ‘ðX!÷ÃÀö"à ÃðÃà\Ã@A!à=ðpÃ@SÃàßÃÐ)!ÃÐ/ ÃÀ!ÃвÃð‰à7 Ã@_Ã@ðˆÃÀñàCÃP÷ÃPh!ðdÃ0—!ÃвÃðw!Ãð} ÃЦ!À×"ÃO ÃPñà ó ÃPñÃÀ—à1!Ãð} ýÃp¶!Ãpª#ú#ÃP÷Ã"Ã4Ã`§Ã@G à7 Ãð•à ç"Ãð} ÃЦ!÷ÃÕÃðÃÞÃp? Ã0£àOÀZ"Ã0—!àÌÃð ÃÐ;ÃPýàÀÃ=#ÃàbðjÃ¥ ÃàýÃ(ÃàÍ!Ã`¡ÃÀ£ÃPŒÃ02Ã@²#ÃÐ#"ÃpKÃÐYÃ@ÃðÃ@ÐÃ@_ÃÏÃÀµÃ`0ÃàýÃ0Áà v ÃpÂÃ`§Ã`§Ãðú Ãðq"Ã0µÃÐMÃðÃ0"ÃðÃÀ2Ã`¹à p!ÃP÷ÃêÃpÎàºÃpÂÃÐÊÃàåÃð•ÃðÃ[ß!à |ÃÀ—ÃÀ‹ÃÃ`³Ã[ñÃвÃPë Ã@SÃàëÃ@eà ÃÀ‘Ãpª#Ã7$à ÃpìÃàñà ð^ ßÃ@SÃgÃPà  Ãà÷Ã0¯Ã`*Ã@G ÃPë ÃÐ)!Ãêà šðóÀõÃ`!ÃðƒÃ`*Ã`*ÃÐMàÌÃêÃÐGÃPÃpòßðÃáÃ@úÃpÂÃ0—!ÃàÃÐîÃ"Ã@¾!Ãðe$ÃÀ&ÃpþÃ@}Ã`!ÃPå!ÃðÃöÃÀ©Ãp¼ ÃêÃð0Ãð³ÃÀ,ÃÀ2Ã`NÃ`¹ÃP˜à ŽÃÐ/ ÃÐAÀxÀ~ÃP Ãêà àCÃ(ÀÃP˜Ã(Ã@îÃ`TÀŠÃð*ÃàñÃF×À%ÀœÃ@ÃðÃð¡ÃpŸÃp{à ˆÃ0 Ã0&ÃÃFÃP˜ÃàëÃðà[ÃPŒÃоÃðÃaÙÃp]Ã`BÃpæÃ@ÐÃÀµÃàbÃPÃÃÀ¯ÃÐYðpà !÷ÀÃÐÜÃÐÄÃ0¯ÃPzÃPŒÀéÃÐ'ÀZ"À–Ã^à…ð#Ã`HÃPýÃPÃP ÃðÃ@ÃàýàÒÃÀ à šàaÃðÃpcà ÃÀ2ÃpÔÃ@Ãpàð‚ÃÐSÃ@}ÃP˜ðvÃ0ßðÃpìÃ@SÃÀ2à ”ÃäÃ`³Ã( ð Ã@èÃà€Ã0\à ¾àgÃPŒÃP!à šÃÐÖÃ@kÃà†ÃP à ÿÃpàðÕ!ÃÀàÆÃÀ&Ã@îÃÀ£ÃàhÃÐMÃÀ¯ÃÀÁÃ@ðùÃàÙà ˆàÌÃðñðÿÃàzàUÃànàØÃ`NÃ@qÃ@ÃgÀf Ã0&À„ÀÃpþàäÃpÚà Ã0>ÃPëÃpæð À–Ã`¹ðvàCÃpEÀûÃgÃð0ÃÃÏÃðÀõÃpàÃàÃ`¹Ã4ÀŠðÃÐâÃð¡ÀïàÌà ÃàÙÃ`Ã`6Ã`ÅÃP'Ã`³Ãà ;Ãð0ÃàñÃÐÄÃÐ;à=ÃÞðjÃ`<à Ã4ÃàëÃP’Ã¥ÃÀ Ã@wÃ:àÌÀràUÃÐÐÃçÃàñðáÃðÃÐeÃÐAÃPýàOà à #Ãöð|ÃÃÃ@_àäÃà Ã4ð Ã`$ÃÃÐ5Ã0,ÃP€ÃpcÃ@qÃ@úÀ–ÃÏÃpÃ0Óà šÃ`ËÃ`¿Ã(Ã`§Ãð‰Ãð6ÃPžÃ@ôà ¦ÃpoÃ`³àØà ¦Ã@ÃÏà ð‚ÃÐMÃPð ÃLàÞÃð•ÃpìðùÀÃÐ;ÃÐGÃ0&ðóÃ@ÃP˜Ã0Jðà ŽÃÐGÃ@eÃ.Ã08Ã"Ã4àØÃpuàgÀ–Ã`ÅÃ@kÃÀDÃ`6ÃPžðÃ@ÃÃÃÀö"à ˆÃPžà‘ÃÀßð Ã0ÇÀÃàÃÉðvÃÒÃðð|ëÃpæÃ(Ã0©ÃpcÃ@ÃÐÜà ˆÃ4Ãà€ÃLÃà'Ãà Ã`HÃáÃÃ:Ã0>Ã0»ðˆÃÀµÃàŒÃ…Ã`ËÃÀ&Ã0©Ã@¾!Ã@wÀÃÐôÃPEÃ`ÑÃÃÐwÃ0nÃP'Ãð¹ÃRÃÃÐèÃÐGÃüÃÐÊñÃ@ƒÃàÃÐ_Ã0»Ã@îÃ0PÃ`³ÃàzÃP¤ÀÃàýßðíÀ ÃP'Ãð$ÃLàÃ`×ÃPªÃFÃ`<Ãà Ã^ðÃ`ÝÃðÅÃpøÃ0»ÃàëÃàzÃXÃð”Ã0hÃÀÇÃüÃ0!ÃÐ;Ã`³àOÃÀÃÀ2à #ÀÃLÃsÃpoÃÃ0ßÃ@à=ÃäÃÐMÃàÃÉýð Ã0ÁÃáÃà÷ÃmÃ:ÃÃ0ÓðvÃ@ôÃ`HÃRÃpàÃüÃ:ðàÒàÌÃ@eÃ`ÅÃà šÃP'À%ðÃP¤À–ÃpþÀ%ÃpÎý÷Ã@SÃFàUÃð•ÃÐÖà ¾ÃÉÃ`*Ãà÷ÃðŽÀÃ@qÃ0VÃ`ÅÃÀ,ÃÃpæÃFÃàÀ+ÀÃÀJÃ`fÃð­Ã`À~Ã"Ã0JàaÃ@èÃà÷ð|ÃpæÃLÃ@ð ÃàëàIÃpKÃpÚÃ@YÃ0ÁÀÀÃÐÐÃPŒÃ0©Ã0ÁÃ0JÀ%Ã0ÓÃ``Ãð¹à ¬ÃRÃ`¿ÀÃàŒýÃàýÃÐAÃ0>ð ÃÃÀÃÀDÃpòÃ^ð‚ÃPñà ÃÐèÃ@àäÃÃÐÖÃð›ÃðàOðvÃêÃànÃàýÃàýÃRÀ1À~Ã0&ÃðÃ@úÃ0Pà[ÃÐMÀûÃàsÃ`HàÀ„ÃàhÃÀ©ðŽÃÐÐÃ@_ÃðÃ@úÃÐèÃ`¿Ãð‰ßÃÃðˆÃÀ»Ã@_Ãð$à àÒÃ`¿Ãp‡ðˆÃPÃ^ÃLÃànÀûÙÃ0,ÃRà šÃÐYÃäÃpÔà )àgÃ0DÃP¤à ;ðˆÃpQÃgà )ÃàñàUÃ0JÃ0¯Ã@ÜÃÀ2Ã@ôÃ.ÃÐSÃ@ÜÓÃànÃ`¿ðÃ0bÃÐÖÃà†ÃàÓ ÃpÎàgÃpoÃPªÃàýÃP†àUÃP-Ãà ÃÐÊÃ0ÙÃPžà ŽÃpÃ0ÇÃp{ÀÃ@èðùÀÃÀ¯Ã`ÃоÃpoð ÃPªÃpòÃàýÃP'Ã0ßÃð*ýÃà÷àOà7 ðùÃ@ÃÃÃðHÃ`ÅÃàzÃ0>À ñÃðÃ0¯ÃpcÃ02Ãà ýÃöÃÐeÃð­Ãöà ¦ÃÉÀ ð‚Ã@ðÃgÃðÃÐÜÃÉÃ`<ÃPÃpòàüàyðÿÃÐâÃ02Ã`¹ÃRÀŠÃFðùÀðÃ@úÃÃP÷À ÃÐèÃp ÃÏÃ@ÃpæÃpøÃpòà ŽÃàÙÀïÃXà‹ÃÐwÃPÀðóð Ã0>àÒÃÀ8Ã0DÃð¡ÃÀ&ÃÀ&Ã`<ÃÐÊÃ.ÃÀ,ÀÃàhðˆÃ@ôÃÀDÃXÃ@}Ã0ÍÃ@èÀà ÄÃ0PÃpòÃÐSðùÃÉàaÃð§ÃÕÃÀ ðšàäðšà ¾ðÃÃÃð0ÃpiÃ@ÃP€ÃÃ@SÃ(ÃÏÃà†ÃÐAÃÐMà ”à7 Ã@âÃÛÃ0JÀ´ÃP'à ÄÃ@úÃ@úÃð§À–àÌÀ„Ãà’Ãð$ßÃà€Ãð§Ãsà7 à=Ãð•Ã`BÃÀDÃ0>Ã`¡ÃpÈÃsÃpcÃ`¹Ã0JÃP!ÃpWÃ@Yà #ð Ã0PàsÃ0JÃàzà=Ãð¡àIÃÒëðŽÃ02Ã@SÃÀ£ðvÃFÃÀ£Ã`0Ã@eàOà ðÿÃð­Ã`ÑÃpàÃpìðŽÃpøÃð0ÃRðÿÃÐÜÃÐÊÃð³Ã`Hà Ã0JÃÀ—Ã`³ÃðÃàhÃ( ÃàýÃ@ÃÏñßÃp9!ðÏ"à¨"ÃÀ—àÆÃÐGÃ@kÃ.ÃÀ»ðjÃÐ)!ÃÐAÃàåàIÃpìà ˆàØÃ0JðšÃöÃðËÃP¶Ãànà[Ã.ÃpàÃà’àÞÃÐGÃpcÃ`§Ã0»ÃÐâÃÀ©ÃpÎà ýÀÃP'Ãð0à[ÃÃà ÃP’ÃÐAÃpàÃ@Ã0ÁÃ`HÃFÃð•ÃP†Ã0ÍÃP’ÃpÎÃðÃP¤ÀŠÃð$Ã0JÃP˜Ã@ƒà Ãà€ð|À×"Ã`³àØÃpÚÃÐSÃ0ßÃÀÁÃànñà ‚ÃÀàUÃÀà ßÃð›ð”Ã@SÃÐÖÃð*ÃpÂÃ`*Ã0>Ã`BÃpcÃ0>À~ÃÀ‘Ã.ÃP†ÃP!ÃÃÃð6ÃÐ_ÃyÃð§àÒÃðÃP'Ã`NÃÃ:Ã`³ð)à #ÃÐÜÃ@_ðíðÿàOÃÐÄÃ4ÃPŒÃà÷ÃàåÃPÃàtÃиÃüà v Ãð Ã@SÃ`*Ã02À ðùÃ`6ÀÃpEÃ@eÃ@kÃöÃÐÄÃp? ÃpcÃÐMÃðàÌÃ.ÃÐAà ‚ÃÀÃàbÃ0»ÃPÃÏð|Ãyð)àgÃ08ÀÃиÃÛðˆÃÃàhñà ˆÃPŒÃLÃà˜à[ÃäàÒÃ@kÃÃðà ”Ã0DÃ@ ÃPªÃð›Ã`³ÃÀÃànÃ`³ðˆÃpòÃ0JÃ`ÅÃ¥ Ã0&Ã:ÃðÃà†ÃÐÐÃsÃ0ÙÃpþÃÏÃ`ÑàÒÃ0£Ãð§Ãð*ÃöàØÃP’ÃP˜Ã"àÒÃÉÃpWÃоÃÐÊÃ`HÙÃ`$Ãð§ÃpÎñÀÀ„ÃÃ.ÃÏÃ@ôÃÐ_Ã@ÃÐYÃÀ‹ÃÐAÃ08ÀûÃÀ©Ãð³ÃÐYÃànà ùÃÐGàCÃÏÃÀ8ÃÀ Ã0DÃ`0ÃÐÜÀœÃÀ,àmà[ðÃPýÃÐÖà ¬ÃPÃÐ;ÃPzÃ.à ßÃÐèÃÿÃÃPÃоÃ¥Ã`<ÃàÃáÃð ÃpKÃgÃP€ÃP ÀŠÃÃàÃpWÃpÚà Ãð•ÃP!ÃÕÃà’ÃÀ2Ã@ Ãpð|Ã@îÃpiÃ(ÃFÀ`!ÃpWÃ0>ÃPžÃð*Ã`¹ÃPÀŠÃð$Ã@úÃ`Ã@âýðˆàÃ0ÃÀ,ÃàhñÃP?Ã@ÃgÀ×"Ã(Ã@îÃ0>Ã`NÀÃ0bð#Ãáð|Ã@_ÃÐÄÃFÃÐ_Ã:Ãð*àäÀ„Ãð§ÃP˜ÃpÔðvÃÉÃð•ÃÀ,À´Ãà àÒÃ0DÃsà®!ÃðƒÃP’Ã0PÃà’Ã`BëÃpÚÃÐAÃð›Ã`NàaÃÃÃP’ÃÐîÃð­Ã0©à ðÃ@‰ÃpæðŽàüÃ0Và[Ãð$ÃpuÃ@îÃàÃ0ñð)ÃÀ©à[à #à ²Ã`ÅÃÐîÃ@ƒÃíÃ`×ÃLÀ¢Ã:Ãpà #Ã0ÍÃÀ©Ã`BÃPÃà†Ãð<Ãð§Ãàð”Ã@îÃ@Ã0VÃpòÃp]Ã`*Ã¥Ã0ÓðùÃPýÃ0>à[ÃsÃàŒÃÐÖÃpÔÃRÃ@‰ÃíÃÐSÃÐ/ àºÃpìÃsÃpiÃyÃPðÿÃð$ñÀ%à ²Ã`6ëÃpÈÃäàÌÃÐYÃPªÃ0bÃmÃàbÃpKÃðw!Ã`$ÃËÃ@ à Ã0µÃàzÃ@ôÃÐâÃÐSÀ~ÃpiÃ`HÃ`ÅÃðàCÃ`*ÃÀÃ@_Ãð§ÃäÃànÃaÃ`6ÀrÃpÈÃàtÃ`BÃ`NàÌàIñÀ–ýàUÃðƒàÞÃàëÃ@ÖÃÐ;ÃÐÄÃð0ÃPŒñÃ:ÃÀ>Ã.Ãðà+"Ã0©à |ÀàäðíÃüÃ`¡ÃÀ—ñÃpWÃàýÃ`<ÃвàºÃÐÄÃÐÄÃ@îÃ02Ã0"ÃÐÄð ÃàtÃ( ÀZ"ÃmÃ`³Ã0VàÌÃ0Áà  ÃP!À~Ã4Ãð Ã`¡àäÃÃÃÀPÃÀµÃäÃÀ2Ã^Ã@YÃ0,Ãð•ÃðßÀÃÀ—ÃànÀ–Ã0Pà ÃUÃð³ÃXÃ0ÇðùÃ`<ÃyÃPtÃ0"Ã@YëýÀ~ÃÐMÃ@eÃÐÊÃðÃ`¹Ã0»ýÃиÃàhÃ(Ãð‰à´ Ã"Ã`ËÃÐqËÃð<Ã0>À~Ã@eÃàëÃà€ÃPžÃð*ÃÃÃÀ8ÃöÃðÃ¥ÃÐÊÃpæàØÃ0JÃP’ÃÐAÃÒÃ08à |ÃÐAÃàåÃвÃ`• à%#Ã0 ÀxÃ`0ÃÀðjÃàV ðÕ!ÃpEÃðÃ@ÖÃðÃ0#Ã=#Ã@SðR"Ãpž%Ã"!Ã@_Ã0&Ã"ÃàÇ"ÃÀ£Ã@èÃ@èÃÒðíÃ0µÀõÀïÃà\Ã`ÃÀ"ðpÃP÷ðÏ"à7 À`!ÃÐ/ ÀrÃÐAà ó Ãð Ã@ÖßÃàV ÃàßÃ0!ÀlÃ0£ÃpKñà®!Ã@Ä Ãð Ãàhà¨"à ÃpWÃpÂÃР"à ó Ã"à Õ%ÃÀÃÐ;Ã0ÁÃ@ÖÃÐMÃpWÃ@_àUðdÓÃ`!Ãð ÃÀ‘ÃàV Ã`#Ã` ÃP ÃÀ ÃO ÃàhÃP’ÃðÃò$àCÃð} ÃpEðáÃðw!ÃàñÃ0µÃ`›ÃäÃ0 ÀxÃÀ—ÃpWÃàJ"ÃàV à à ÃÀ‘à  ÃpæÃ@ÜÃиÃÃàÙÃð‰à ˆÃðô!ÃpWÃ0£à ˆÃ`ÅÃFÃ`$Ãp9!à |ð à šÃÀ©Ã`*ÃànÃàñÃÐ;ÃPß"ÃиðŽðvÃ@Ã@èÃ¥ÃÃÐÖðvÃ@îÃð} ðvÃàëà àØÃàåÃ0©Ã` "ÃP÷Ãà\ðpÃpæÃànÀÃ@kÃÐÄÀÃð ðáÃÐ#"à®!à d#À~ÃÃð›Ãð§ÃpÚÃLàOÃ"!÷Ã0&Ã@ÜÃðƒÃÌ ÃÐMÃpcÃpìÃ@kÀÃ.Ã@MÃиñÃ`¹Ã@SÃPŒÃ@âÃ0ÁÃpWà Ã@èà ÃààUÃÀÃmðùàÒÃP˜ÃpæÃ0ÇÃ`¹ÃpÎÀéÃàëÃ`§ð|ÃàëÃ`!Ãðw!Ã@5#Ã0¯Ã@ÜÃàëÃPÃPn ðùÃ(à7 ÃPë Ãð‰ÃmÃ02Ã¥à[à[ð#ÃÐèÃ(ÃàbðjàÒàÒÃ:ðçÃ`#Ã0µÃàÞÃ0Ç×àÒàºÃ.ÃP†ðpÃоÃpWð‚àOàÀÃ4Ã`­ßÃPtàºÃÐAÃpWðóÃðú Ãp¼ ÃP€Ã`§Ã0!Ãp3"ÃЬ ÃPn Ã0 ÃÀ… ÃÐAÃ@âÃO Ã`§àUÃÐÐýÃÐÖÃ0>Ã@ÐÃÀ"Ãø#Ãp¼ ÀŠàOÃÐMÃÀ2ÃðÃàßÃоÃðÃàhÃ@SÃ08à à´ ÃO ÃpàÃ`­Ã`¡Ã@ÖàCÃ[ÃÆ!Ã@A!ÃÀ‹Ã@âÃ0&Ã`$Ã@Ðà ŽÃ`³à ÿÃ`­Ã@ÐÃpÔàaðŽÃ¥ÃÀ ÃpÎÃP†Ã0»Ã[Ã@¦%Ç!Ã@YÃPÃàßÃÐÊÃð ýàUÃpÈÃÐ%à=Ã@àêàÀÃðÓÃÀ—ðvà=Ãø#ÃÀü!ÃвÃ`¡ÃP†à ÃðY&Ã0 ÃÐGðçÃO Ã@ÜÃ@G Ã@_ÃàåÃ¥ÃàtÃ0Çà ÃPžÃà÷Ã`³Ã@ÃP†Ãð à ˆÃð Ã0Óàaà ŽÃðà ÃðÃðÃPh!ÀrÃ0 Ã"ÃàñÃ"Ãðw!ÃÐŽ%ÃPb"ðà ŽÃ08Ãüà7 Ã`!Ã0»ÃðÃ@ÊÃðƒÃÐÄÃÐÐàUÃpÂÃð_%àIÃàÃ@_Ã`§Ãà à #ÃоÃ`¿ÃP!ÃàåÃpæÃ`BÃÐÐÃ02ðˆà 5ÃÕÃà÷ðÿÃ0DÃð³Ãð¡ðpÃpÈÃðÃðÃð›ÃÀµÃLÃsÃÀµÃ`NÃðÃ`¡Ã.À–àðàÒÃ"àCà ”ÃpKÃ0Áà ÃÉðšÃÀ»Ã`0ðÃp{Ã0JÃPÃà’ÃP˜Ã@ÖÃÕÃð‰Ã0JÃð6àÞÃ@úÀÃpìÃ@qà )Ã@ýÃÀJÃpìÃÀ2ÃÃÀ2À ÃpìÃàžðÃàžÃÃyÃð§ÃP ÃÀÁÃ0ÙÃÀ2Ã@_àÆÃðÃÐÜÃêÃÐeÃüÃÀ¯À–Ãð6ÃðÓÃ@‰Ã@‰ÃÐ_ÃpcÃоÃC"ÃPýÃàŒà ¾Ãp‡ÃPªÃð0ÃÕàöÃpìÃ@}à ¦Ãð­Ã0»ÃP˜À ÃaÃðÃàÀ¨Ãàà ¾ÃÐkÃpÚÃPÃP†÷ÃP¤ÃààäÃÐeÀ–ÃÛà šàgÃp]à[ÃPÃ`ÅÃÀµÃ@ÃjÃÀ»Ãà÷Ã`HÃmÀÃàzà ¦ÀÃÐMÃàzÃyÃ`<ÃÐ5Ã:ÃP-Ãð§ÃyÃà€à 5ÃpæÃÀ»ÃÀ8ÃpÃ`<Ã@Ãà€ÃÀ>ÃàzÃçÀÃ@ÜÃ``À%ðˆÃ@ÐðùÀ¢ÃáÃÐèÃð ÃÉÃ.Ãà Ãà¤Ãð­à #ÃÃÃ0ÁÀ–àØÃ`¡Ã@ÊÃÀ,ýÃ@ÖÃð*ÃPžð ðÃð•ðóÃ¥ÃàßÃÀ‘ÃPýÃÀ‘Ã`›Ãp9!Ã`#Ã0!Ã"!ÀlÃ@A!ð½%ÃÐ'à®!ÃÀ"À³(ÃÀU(Ã$ÃP>(ÃÐ|(ÃÚ(Ã@¦%à)Ãà)Ã?-ð¥)ÃÔ)ÃÀ=,ð"*Ã`S+ÃpŒ(ÃPÓ$À0)Ã@ *Ã0a*Ãp’'Ã`ô%Ã`Y*ÃP\#à&Ã@(ÃðG)Ãð¸+Ã`Ü)Ãp€*à~)Ãp )ÃÀØ'Ê+Ã`Ö*ÃÎ*àï+Ã`â(ÃÀa&ÃP£,Ãp )Ãà+Ãi*Ãp€*Ê+ð“,àï+ÃÀÌ)ÃP -Ã@p.Ã@ù,Ã`Ê,à&Ã](Ãpý*ð,Ã`Ä-ÃðÐ'Ãi*ð"*Ãà )ÃPÁ'ÃÀ"Ã0m(ð()Ãð5,Ãà‘+ÃW)ÃÀº,ÃÀÌ)àû)Ã0Þ*Ö)ÃP>(Ã@ˆ*ÃE,Ã`_)ð¥)ÃPÁ'à @)Ãpñ,À­)ÃðY&à ±+Ãà)Ã)ð“,Ãc+Ã@ˆ*ÃP2*Ãà )Ã@”(ÃÀ… ÃP»(Ãp†)Ã`A.Ãp€*àõ*Ã@ÿ+ÃQ*è&Ã0s'ÃÐv)Ãø'ÃàÍ!ÃPÇ&ÃÐŽ%à :*ÃÀO)ÃP2*Ãì%ÃP>(à Ï&ÃÀÌ)ÃÀ7-à„(Ãp(ÃðÖ&ÃP2*À**ÃðA*Ã](ÃPD'Ã@ˆ*Ã@+ÃP8)Ã`$àû)à„(À0)Ãà»$à&ÃÐí*à„(Ãà£(Ã0y&Ãàµ%Ãð_%Ãp’'Ã&à F(Ã0ä)à„(Ãp€*Ãp'ô$Ã@Ž)àÑ0Ã0O-Ãæ&ÃÐ#"ÃР"à %ÃÐù(ÃÐŽ%ÀÅ%ð.(Ãðq"ÃC"Ãðw!Ão%Ã@‚+Ãp(Ãu(Ã0[+Ãæ&ÃÐ%Ãà+ð,ð4'ÀN$Ãp˜&Ç%Ãàµ%Ã&Ã$ÃÀa&à Ã(Ã@ÿ+Ã{'ô$Ã`q&ÃÀÆ*ÃðÜ%à&ÃPß"à F(Ã@(Ã0‹#ÃÀ"ÃÀÞ&Ã0ö&à ±+Ãà)Ãì%ÃÚ(ÃÀØ'Ãæ*ð.(Ãì)ÃÀÆ*àœ$ÃЦ!Ó#à Õ%Ã`q&Ãà,'à–%Ãi&ÃÐÿ'Ã*Ã@)%ÃЦ!à¢#ÃÀð#ÃPÍ%Ã`ú$ÀË$ÃÀä%à®!Ãà2&Ã0$Ã7$ÃÐ$ÃЦ!à á#ÃàJ"Ãðô!Ã@¾!à ç"ÃÀÞ&Ã0‹#ÃàÇ"ÀH%ÃP2*ÃC"Ç%ÃÀÞ&Ã0ö&Ãu(Ã`ƒ#à1!Ãp'$Ã+&Ã`î&ðÕ!ÃpÂÀÅ%ð½%à¢#ÃЬ ÃðÜ%à Ï&à p!Ãвô$ð"*ð4'ÃðS'Ã`k'Ã7$Ãò$Ãà»$ðÉ#ÃàP!àÀà¨"Ãpž%Ã0!ÀÅ%à$Ãi&Ãðe$ÃðÊ(î%Ã0—!Ã0 Ãà\ÃPzà ÿÃPJ&ÃР"Ã=#Ãp¤$Ã0y&ÃÒÃø#ÃPë ÃÐAÃ=#à%ÃàÇ"àCÃà %Ãà¯&Ãp¶!Ãðk#à%#Ã@Êàºà j"ÃàÍ!ÃpEÃP÷ðçÃР"ÃЂ'Ù"Ã0Áà ÃàÁ#Ãðw!ÃЬ Ãà»$À<'Ãð_%Ã0#Ã0$Ã@;"Ã0,ÃPn à%#Ã#Ã7$à v ð^ Ã0&ÃàÓ Ãþ"Ã0"ÀÝ!Ã`$à ÃpÎÃÀ‹ð|Ã`$ÃЦ!ÀÑ#Ãðî"à„(ÀT#ÃÀö"Ã"ÃPP%ÀÅ%à1!Ãà\Ã` "Ãpª#Ã@/$ÀT#ÃЬ à=ÃÀÃ@SÃàbÃI!ÃÀÃ@¾!ÃвÃPå!Ãà¯&ÃÀ"Ã¥Ã`›Ã` Ãp'$ðR"ÓÃ`!ÓðjÃÀ Ãðq"Ã°Û Ã€éÃÀÃ@;"ÃЦ!àœ$Ãp3"ÃÐ#"Ã`!ß!ÃЂ'à7 Ã`#Ãp9!à á#Ã`ô%ÀlÃ@5#Ã( ÃP€Ãð Ã0#Ãðe$à7 Ã0‘"Ãðô!ðóÃ4Àf ÃàÙÃðô!Ã0 Ã"Ãðk#Ã"!à Û$Ã@;"Ã0s'à ".Ç%ÃàÙÃpÎÃ¥ÃÀ£Ã:Ãc'à+"Ã`• ÃC"Ã`›ÃвÃÀy"ÃàÍ!ÃÀy"ÃI!ÃК#Ã0"Ã( à à %Ù"ÃЦ!Ãðà ÿÃ0 àÒÃЬ Ù"à Ã0"Ã@A!ðdÃp¶!Ãp¶!à X%Ã@Ä Ã`<Ã0DÃPÍ%ðÏ"ÃÐ)!ÃàP!ÃPñÃ0—!ÃР"ðÉ#Ãp¼ Ã@¸"ðçà ó Ã`ðdÃ@ÖÀ ÃàÙÃpEà ÃÀ‹ÃðÃ0¯ðR"Ãð‰ÙÇ!ÃPÃÀ&Ã.Ãp? Ã`!ÃàßÀéÃàåÃ@ÊÃP€Ãp¶!à ç"ÃÀ… ÃPn Ãþ"ÃÐ#"ÃPñà ‚ÀxÃðw!ÃÐ5Ã$à%Ãp˜&à$Ãà ÿàIÃ0 Ù"à v Ã`¹ðùÃðƒðÿÃ`6Ã:Ãðw!Ã`$ÃP\#ÃàÓ Ã0&Ã@SÃp]ÓÃÀðóÃðw!ÃÐAÃàÙÃPå!à¢#ÃPÇ&Ã`6ÃÞÃЬ Ã"à ÿàÒÃàñÃ`BðvÃà’Ã4ÙÃ0 à ŽðvÃÃÃàÃpQÃ#Ã°Û ÃŸÃ`$ÃоÃÀ‘ÃðÃàÍ!à®!Ã`§Ã[ÃàV ÃpàÃpÂÃ0µÀÃUëÃÀÃ0¯ÃÐSà šÃàzÃÉà ÿÃÐ;Ã.àÌÃP€Ã°Û ÃÀàÀßÃÐÊÃàhÃmÀ„ð‚Ã`³ÃäÀ~Ã@à  Ã`BÃ( ÃàÙàÒà ‚àIÀûÃð•à šÃàtàIà=Ãðw!ÃO ÃØÃÐÄðÃÃÃðÃp]Ãð¹ÃpÎÃðÃ@_à ‚Ãð¡À ÃyÃÃð›ÃÐYð|ÃpìÃ@YÃà\ÃàëÃÞÃàßÃàzÃàåÃPŒÀûÃ:ÃmÃ@Ã0»ÃðÃ@îà=ÃgÃ`<ðíðçÃÀ©ÃFÀõÃÀ‘÷ëÃ(Ã0¯Ã0µàÌà ùðçÃÐ;ÃPžÃ`ÅÃÐÊÃÀÃÀ&×Ã02Ã@ÐÃ0,ÃpÔÃÀ>ÃðÃP!ÃöÃàhðˆÃÀàÞÃðß!Àf à #ÃðÃàªÃÛÃÐMÃ0 ÃPn ÃÐGÃð§Ã`ÅÀŠÃвÃ°Û ÃàññÃ@A!à X%ÀéÃ02ÃPÃ@úÃp¼ ÃpWÃ0&ÃÀ&ÃpàÃиÃpÔÃ`­ÃàëÃÞÃ(Ã`$Ãð0ðíÀ~ÃÀ£ÃÃ@eÃàÃ0ÓÃ@ ÃP Ã:ðŽÃp]ÀrÃäÃPð|ðíàaÃöÃ0>ýÃð<ÃàÃ@_Ã@èÃpøÃÀÁà Ã0ÁÃ`*Ã`¹ÃmÃÃÃPŒÃàhÃ0µÃpòÃóÃà ÃÏÃPÃÐMÃððjÃ@¾!Ã°Û Ã€ûà ”ÃpiÃPà  ñÃêÀÀ ÃpÚÃàåàUðíÃPzÃ@îÃöÃðÀûÃ`0ÃàñðÃ`ÅÃàŒÃ¥ÃpÎÃÀ,ÃÀÃà÷àaÃpòÃÐkÃP’ÃaàCÃPzð|Ã`ÃÀü!ÃЦ!ðùÃPÃ0ÁÃð ðáàØÃ:ÀàUÃ0©à šÃ¥ÃÉÃÀ2ÃpÎàCÃàýÃüÃ@ôÃpòÃð<ÃиÃ@âðÃ4ÃðÃpàà  à #àÆÃ`!à ó Ãà\ÀÃÐYà à ˆàÀàÆÃÉÃÀ ðvà ŽÃ@îÃ`¹à ùÃÀàUÃ0ÙÃ0JÃð›ÃÐÐÃÐ_ÃÐMÙÃ02ßÃÀ£ðÃ08ÃêÃÃ0¯ÀlàÌÃ0!ÃPà ÿðçÃоðóÃPà ¬ÃÐSÃÀ Ã08ÃàÃpÔÃ`<Ã`­ÃpcàÒÃàbàOÃaÃÀÃPzÃЦ!ÃðÃFðÃð•àÌÃðÃ0ÁÃ0µÀÃàhÃ@Ã¥ð|àUÃPÃgÃP†ÃUÃ:Ã@ôÃÀ ÃÃ:ÃP’ÃÉßÃÀà ”Ãð›ßÃ08ÃpàÃ0ÁÃ0¯Ãð*Ãð*ÃP÷Ã.Ã@ÊÃððšÃÀ2Ãð›À~ÃyÃÀ£Ã@âàUð)ÃÐkà /Ã`¿ðvðùñðùÃÀa&Ã`*àÞÃPýÃÛÃðÃàñÃð à ùÃPtÃÐ_Ãp]ÃàbàUÃpWðçÃpcÃ@_Ã08Ã0 ÃpKÀÃ(ÃÃpÚÃ@ÃpcÃ0bàmÃÐÄÃÀ2Ã@Ðà ÿÀlÃÀÃðÃ(ÃÐGÀÃ`• Ã^ÃÃpÈÃpcÃ4ÃsàÆÃÞÃFÃ` ÀŠÃjàmÃ0\ÃÐÜÃð§Ãp? à ”Ãð*ÃpæÃàýà ¦Ã@ÜÃØàUÃð*ð Ã`ÅÃP à #Ã@ÃðÃ(ÃpìÃÐâÃð¡ÃPŒÃÐ;àCÃ0»ðjðÃP’ÃÐSÃàñÃÒÃÀàêÃ`ËÃÒðÿÃàzÃð¡ðÃàýðÃàýËÃRÃ^ðŽÃ0Áà ¬Ã`BÃyÃð³ÃÀ8Ã0PÃÀ»ÃÐÖÃyÃÀ,àaà Ãð¬ÃàtðÿàÃpìÃ`³ÃáÃ`ÝÃð§àØÃÀÃðÃRÃÀVÃÃÃ4ÃàhÃ`³Ã@wÀðùÃ4ÃPðpÃPtÃðw!ÀûÃÀ!Ã` à ó Ã@ÊÃ0!ÃP€ÃpÈÃ"Ãð ú#ÀÝ!Ã@)%ðÏ"ÃðÀÀÝ!Ù"Ã$Ã°Û Ã°Õ!ðL#ÃÀØ'ÃÐ|(Ã@/$ðóÃ@;"Ãp'Ãà2&ÃÀ!à á#ÃÀÞ&Ã%'Ã0a*Ã@‚+à É'ÃðG)Ãà)ð@%ÃÀê$Ã`}$â'ðÉ#Ãà&(à @)ÃÐ &ÃÐ%Ãà)Ãp'À6(à ·*à(à–%Ãðâ$Ã0y&Ã@”(ÃàÇ"ÀB&ÃÀO)ÃÐÿ'Ã@ˆ*Ão%ÀË$ð™+Ãp˜&ÃðÖ&ÃPÁ'Ã`_)ÃPÙ#Ã0#à F(Ã0ê(ÃPµ)à(à–%ÃPÍ%à :*Ã`ô%Ãà&(àl,Ã-à ".ÃÐÛ-ð¥)Ãæ&Ã&Ãþ&ÃÀU(Ãõ.Ã*à R&À³(à 'Ã0g)ÃÀU(à á#Ã0%ð()Ä,àõ*ÀÅ%ÃÀU(ÃÐ%ð±'à .,À§*ð"*Ã`Y*à .,Ã0m(ð·&ð+Ãp€*ÃÐ$ÃÐ#Ã`è'Ãàµ%à j"Ã0—!Ãà+ð-Ão%à%ÃpŒ(ÃK+ð“,ÃÐX.ÃÐù(Ão%à7 ÀÝ!î%ÃPÇ&Ã*Ãð¾*à %ÃÐ$Ã0…$ÃP>(Ã@ *Ãàµ%Ã`ô%ÃQ*ð()ð½%ÃPÇ&Ã?-Ãp€*Ãp˜&Ãpz+À­)Ãi&ÃÀs#Ãi&Ãp )À$+Ãð¾*Ãpå.ÃK+Ãp’'Ãà )Ã`Y*ÃÐv)Ãp*Ã?-Ã*Ãp*Ã+&Ã0ê(Ãp†)â'Ã0%Ãì)Ã0ê(Ãà…-Ã`;/Ãp€*Ãp˜&ð+Ãp'ÃP¯*ÃPµ)Ã`è'ð±'ÃðÄ)Ã~-ÃP>(Ãpž%ÃW)ÃW)àû)Ã0ð'ÃðM(à É'ð.(Ãp!%à F(ÃÚ(î%Ã`q&ÃÚ(Ã](ÃÀg%à R&ÃPµ)à)à É'ÃK+à~)Ãp )Ü(Ã0ö&ð½%Ã@)%ÃPÇ&à Û$Ãu(Ãà)àŠ'ÃÀê$Ã`ô%À0)Ã0ö&Ão%ð«(À­)ÃÐj+Ã*ÃÐ#"à d#Ã=#Ã`#Ãðe$Ã=#ð4'Ãðâ$Ãi*ÃPP%ÃÐ%ÃÀö"ÃÀs#Ãðk#à&ÃðÖ&ÃP>(ÃP»(Ü(ÃP£,Ã0%ÃPÙ#à F(â'ÀT#à !ÃÀy"ÃàbÓÃàÍ!Ãþ&Ã@²#Ã0‘"ÃàÍ!Ã0$ðL#Àf ðÉ#Ã0%Ãþ&ÃpŒ(Ã@¸"Ã0!ÃPß"Ã0%Ã0‹#ÃC"ðL#ðX!ÃÀü!ÀÑ#ÃpÂÃ=#ÀË$Ã0$à®!Ã$Ãp¤$ÀÅ%à®!ÃÆ!à L'ÃÀI*à Ã(à=Ã@Ä Ã0…$Ãp'$à á#ÃÀö"ÃPÇ&À¹'ÃÐ#ÃЬ ëà ÃP€à+"Ã{'à&ÃÀ‹Ã"à Ãðw!Ã@(Ã0ð'ð^ Ãð à j"ÃPJ&ÃÀ"à á#Ã@;"Ãø#ÃPÙ#Ã@¬$Ãðq"ÃÀ… à |ÃÐ%Ã@ &Ã@/$Ã`#Ã@ÖÃ0#Ã0#ÃäÃ@Ä Ãp¶!ô$ÃPå!Ã0¯Ã@G Ã"ÃàßÃPë ÃÀ‹Ã¥ ÃàV ÃpÂÃàhÃP†Ã[àÆýà ó Ãðî"Ãà*ÃÀÃ"à d#Ãðî"ß!ÃÀ ÃàbÃ`$à ùÃàÇ"à7 Ã@Üà ðíÃÀ‘ÃвÃ0 Ã`!Ãðw!Ã°Û ÃŸÓàO÷ÙÃ0!ÃO Àà ÃàÇ"ÃÃÃP†Ã0£Ã0JÃ`*ÃÀ Ã0ä)Ãp3"à #ÃpÚÃ`HÃÐYÃ02ðóÃ@Sà |Ã.ðÉ#ÃàhÃ`¹Ã`›ÃC"àÀÀ~ÃоÀéÀÃp¶!ÃàÇ"ÃðÃànýÃÀ‘Ãð ÃвÃ0…$ÃР"à7 ÃÀ—ÃàV à7 ÀïÃPh!ÃàÙÃðÃàåÃ08ÃPÃ@ÖÃPë ÀË$Ãðî"ÀïÃðÃÐ5ÃÒÃØð|Ã@MàºÃP†ÃÀ—Ãð ÃðÃyÃp9!ÃÀÃ`HÃ@îÃ@eà ÿÃO à7 ÃaÃðÃ¥Ã(Ã¥ÃÀ ÃyðdÃàbà ˆÃ0¯Ã@ÜÃðÃ0µÀ×"à®!Ã@Ä ÃpÂÃaðjàºÃиÃð•ëÃÃ02ÃpÈÃ`!à Ã[ÃànÃÐÐàUÃ`<ÃÐAðjÙÃàñÃP€ÃO À„Ã08ÃàÁ#ðÕ!Ã0&à1!ÓÃвÃPß"Ã0"ÃpÔÃPtÃUÃ@Ä Ãðô!ÀéÃpWàÀÃðw!à j"ÃUÃÐGÃ08Ãðô!ðíÃÐÊÃLÃð¡Ã`$ÃUÃ@ÊÃ`#Àf Ã0ÁÃ@SÃÐGÃgÃðð‚ÃðÃ`¹Ã0»ÃP˜ÃÀ À„ÃÐAà p!ÃI!ð^ ýÃ0—!Ã`ÃÀ‘Ã0»à=Ã`!Ã@YàÞÃpEÃ4ÃàtÃPñà ”Ã7$Ã7$Ãp? ÃPë ÃpæÃ`¹à šÀrÃ0©ðdà ÃðÃ@ÐÃ@èÃànÃpÔÃÀ ÀéÃðÃ@îÃÐSÃÐkÃàñðçà ŽÃ`$ÃpÎÃÐÊÃpÚÃ0µÀëðçà Ãð$ÃÐMÃð‰ß!ÃàÓ ÃêÃ` ÃPýÃиà |ÃàJ"ÃC"à àUÃ@à=ÃÐ;ðëà Ã0!Ã`ÅÑÃpuÃp{Ãð*Ã@Ã:ÃÐ_Ã.Ãð¡Ã@âÃð§÷ÃêÃð ðçÃà€Ã0bÃÀÃÀÃà€à 5À„Ãð} ÃÀà ‚Ã0©à ”ÃиÃpàÃðÃ[Ã0DÃ@qÃp]ÃpWÃð¡Ã@èÃðw!Ã`­ÃàñÃ[Ã#ÃpÚÃÐGÃððˆÃð0ðÃð0ÃÕÃÿÃpàÀÃ0µà ŽÃàŒàgà ŽÀõëÃðÃÐ;ÃÀÃPðíÃaÀŠÃFÃðÃ0¯ëð^ à v ÃÀ‘Ã0&ÃиÃaÃ0£ÃØÃ"àºÃЦ!ÃàÀÃ`HÃоðùÃgà ”Ãð‰ÃpWÃðÃÐeÃ`<ð|ÃððˆÃ`$Ã¥ Ã0,à ðÿÃ@ÃððvàOà ÃÐÊÃ0ÍÃäÃ@ÐÃ`*Ã`¡Ã0 à p!ÃÀÃð•ÀŠÃÐÄÃpWÃ@Yà ÿðvÀõÃP€àUÃàbÃ`§Ã08ÃpÚÃöàÒàOÃð¡Ã`HÃðÃ`!ÃàV Ã4à ¬Ã`ËÃÐÜÃP Ã@YÃêÃÀÃ`­ÃgÀ~àÆà ‚ÃpÂà ŽðšÃÐ_àUÀÃ@YàIÃöÃ4Ã4ÃàzÃPŒÃиÃÀÃÃðq"Ã02Ãð0ÃpcÃ`¹Ãð¡Ã`ÅàUÃÀ‘ÃðÃpoðŽÃ`0ÃPzÃà\ÃÐ5ÃÐSðX!ÃÐÊÃàñàÞÀÃPÃÐSÃÃýÃ@Ðà7 ÃP'Ã0ÓàOÃÀ£Ã@ôÀ~à ˆëÃ¥ ÃàtÀûÃ@ƒÃ0PÃàÍ!Àã ÃÃUÃÐAðÕ!ÃðÃ0DÃ0»ßÃ"ÃÀµà ÃÞà v Ã`<ÃöÃàtÃ`HÃÀÃ:àCÃ0µÃÐÊàOÓðdÃpQÃð¡Ã@ÐÃmÃÀÃ@ÖÀõÃðÃ[Ã@G ÃðùÃP˜à  ÃðÃ0,ñÃPzð|ÃÀ à  ÃàýÃÀ—ÃpWÃàtÃ`<Ã0ÓÃ`BÃð} à à7 ÃPh!Ã0 Ã02ðÿÃpÈàÒÃP˜àºðÿà[ÃpÔÃ`¡ÃиÃ@ÊÃ0¯ÃPÃоÃ( ðÕ!Ã@èÃPàÆà Ãð Ãpcà ‚ßÃÀ‹ÀûÃà ÃÀ£ÃÐAÃ`BÀûÃpž%Ã@¸"ðvÃÀ—à®!à à&ÃÀÃÃ0»ÃÀ»ÃðjÀlÃð•Ãp? ÃðÃ0©ÃððáÃàhàÆÃÀÃ0#Ãð_%Ã{#Ã0£ÃиÃð•ÃpKÃÆ!à=ÃК#Ã@¾!ÃвÃpàÃðÃPñÃК#Ã0£ÃUÃ@ÜÃ`0ÃÐYàÌÃ@Sà ùÃ0£Ãðw!à j"Ã`ýÀûÃÀ,Ã`¡ÃÐ;ÃÃÃÀ‹à í!ÃP÷Ãyð|ÃäÃàÓ Ãð‰ÃàñÃ.ðóÃàÍ!à j"àÀÃ#ÃÀy"ÃpKÃ:ð|Ã` "Ãð} Ã0©àêÃÀ—àÆà ç"ÃpÈÃ0©Ãð ÃàV ðjÃ@ÐÃÀü!Ãp¶!Ãðk#Ã0£ÃPë À à àºÃ@SÃÀ£ÃÀ ÃäàºÃðƒðóà Ã`#ÃI!Ã0©ðpðvÃPzÃ@Ä Ã0 ÃPýà j"Ãð} à ÿÃPÃ`‰"Ã#à´ Ãð} Ãp9!ðR"ÃÐ5à %ÃÀI*Ãpë-À0)Ãð²,ÃЂ'ÃÀê$Ã`Ö*à ·*Ã@)Ã`Ü)ÃÐd,Ãpë-ðŸ*à 4+ÃðÐ'ð4'Ãi*ÃðÄ)ÃÀ´-Ã`Ð+ÃðÄ)ÃðÄ)Ã`Y*Ãpb/Ã`A.À-à “0ÃP…1Ãð5,ð“,Ãð5,Ãà.Ã?-àl,Ãð;+Ãõ.ÃðÄ)à ½)Ã@#&Ãà‹,ðø0Ãàs0Ã@Û1ÃP©+ÃÐÉ0ÃÐá,ÃÀÌ)Ã0C/àf-ÃPJ&Ãp(Ãph.àû)Ã0Þ*ð+ÃP&,Ã@ˆ*ÃP,+Ã@ó-Ãp†)Ãp†)Ãð²,À§*à ".ÃP¯*ÃÀÌ)àr+Ãpn-À1Ãàð0Ãph.ÃÀº,Ãpñ,Ã`S+Ãàü.Ãð²,Ãð;+À-ð,Ãpb/à×/Ãð /ð“,ÃE,Ãà)ö.àõ*Ãà.à «,ÃðS'À**Ü(Ãà,Ã@ÿ+Ãò(Ã,Ãã1ÃÀ=,ÃK+à(à R&ð½%Ã,Ãã1Ãé0àõ*ÃP,+ÃP -ÃÈ+ÃpŒ(ÃðÐ'ÃðM(ÃÀÒ(Ã`Ð+ÃÀ´-ð™+ÃÈ+ÃP-àr+À1à Ã(àõ*ÃE,ð±'Ã`q&ÃÀU(ð½%À**ÃÐÛ-Ãpñ,ÃÐd,Ãæ*À¿&Ãp†)À­)Ã`e(Ã@)À0)à +ÃÔ)ÃÐp*ÃÐj+àŠ'ð4'Ã@'Ãp†)ÃðÄ)Ã-0ÃPJ&Ã`q&à :*Ã@š'à X%ÃÀa&Ão%ÃÀg%ÃÀs#à X%ð.(à L'Ö)Ãpž%ð±'ÀÅ%Ãì%Ã0…$ÃК#Ãp9!Ãi&Ãà>$ÃpŒ(àx*à Ï&Ãp*Ãp )ÃÐ &àû)ÃðÖ&Ã0%Ã(Ãø'ð4'Ã`q&à Õ%Ã0Ø+ÃÐç+ÃàD#à É'Ã](Ã0%ð¥)ÃP©+ÃðÖ&ÃàÁ#Ã0s'Ã@”(Ã`k'Ã0ê(ÃðY&Ãp˜&à F(Ãp†)Ã1%ÃPÙ#ÃðM(ÃðÜ%Ãp&Ãðe$ÃÀ"à %Ã`ô%À**À¹'à–%ÃðM(Ãà8%Ãð_%ð@%Ã`!ÃðÃÀs#Ã](À³(Ã$Ãp3"ÃPV$Ãì%ÃðM(à F(Ã`#À¿&À,ÃÀI*à„(Ãæ&ÀH%Ã0ê(ð@%ÃàÇ"Ã`ú$ÃÐ$Ãpž%à Ã(Ãpb/î%ú#ÃÀð#à Û$Ãø'à Ï&ÃP¯*Ãà )àr+À**À³(Ãp!%ðÃ$Ãc+Ã(Ãà‘+Ã0$Ã`ÃPÙ#ÀÅ%Ãà2&à–%Ã`ô%Ãp*Ã0a*Ã`w%ÃPJ&Ãp˜&ð:&à%#à)à :*à L'Ãp¤$ÀN$Ãp¤$ðdÃ0&Ã`k'Ãc+à ç"ÃÀð#î%Ãp’'à Õ%ÃPß"ÃðÊ(Ã1%ð()Ã0%Ã`q&Ã`è'ÃÐ &ÃpŒ(Ãp'$Ã0…$Ã,àû)à |Ãp°"Ã(Ã`â(ÃPV$Ã0ð'Ã@5#Ã0©à j"Ã@)Ãà )à&ÃPb"ÃàñÃ"ÀT#Ã`î&Ãà—*Ã](Ãp&ÃPß"Ãp'$à Õ%à R&Ãà8%ÃÀÞ&Ãðî"ÃP»(ð±'à$Ã@¦%Ãp'$à&ÀN$ÃÐÿ'à%ÃÀg%Ãp˜&à ^$Ãà»$Ã@)%ÃÐj+Ã`Ö*à¢#Ã0‹#Ã`}$ÃÀä%à Ï&Ã#ÃвÃÒðR"Ãð ÃgÀ×"Ãðq"ð¥)ð±'ÃÀ!Ã( Ãð_%Ã1%ÃÀØ'Ã0y&Ã0#ÀË$Ãàµ%â'ÃÀ['Ãp(Ã#Ãp¼ ðáÀZ"ÃÐ;ðvî%ÃÚ(à j"Ã0 Ã@¸"à F(Ãpª#ÃI!ÃPë ðdÃ@Ä Ã0%Ã`$Ã@G ðÉ#Ãp-#Ãðe$Ãp°"ÃàP!Ù"à%#ÃÀ!ð«(ð.(ÃP»(à Û$ÃPñÃ`³Ã@Ä Ã0—!ÃÀö"ÃpEà ùÃàV à Ã(à$à |ÃPz÷ÃPÀrÃ@A!Ãp-#Ã0‘"Ã0—!ðjà$à á#ÃÞÃðƒÃàP!î%Ã@²#ÃÀy"ÃPn à ‚Ãà\Ãðq"ÃÐ#"ÃÐ/ à p!ðÕ!ðL#ðR"à=ðÕ!Ãàµ%Ã+&Ã0&ëÙÃÀ Ã(ÃÀ ÃpÎà í!Ã0…$Ãp°"Ãð ÃЬ Ã@G ÀlàºÃp¶!ÃàëÃpÚÃ@Ä Ã |ÀéÃ0 ÃC"ÀûÃpÚÃÐ5ÃðS'ÃÀð#ÃpÎàÆÃ(ÃÃ`}$ðdÀûÃÀ,ëÃðw!àIÃ0¯Àã Ãðô!Ãäßà ó ÃI!Ãp3"Ã0—!ÃUÃpcÃP€à Ã0£ÀrÃêÃоàOñÀrÃ@ÊÃðÃàbÃpÈÃÐ/ ÃоÃðƒÃ@ÃàßÃЬ ÃpEðçÃpÎÃÆ!ÃÃP ÃP÷ÃàÍ!ÃвÃaÃgà |ÃPÃ@_ÃPzÃÐMÃ0£à à¢#Ã0‘"ÃP€Ã` ÃàßÃÃP€Ã`• ÃØÃÐ)!à7 Ã`³ÃðÃ@SÃðk#ÃÀ ÃàßÃP€Ãð‰ÃÐ5Ã@A!ÃðÀÃ¥ Ãpª#à ^$ÃgÃàÓ Ã€éÃ`$à !ÃÀÃàP!Ã`*ÃиàØÃ`§Ã@Ðß!à ùÃP\#Ã7$Ã@ÖÃànÃäð|ÃànðdÃ02ÃÐÐÀ×"ÃðÀ„ðùÃC"À×"ÃÐGÃêà |ÃàåÃÀ2ÃÀ2ÃðÀxÃðà Ã0!à Ãp]Ã@ÃàÓ Ã€Z"Ãà\Ã@ÖÃ@ôÃ¥ÃЬ ÙÀ Ã@âÃ@A!Ã@ÜÃ0!Ã`­Ã0»Ã@èÃ`›ßÃ(ÃÀ‹à=Ã0!ÃЬ ðíÃàßÃP’ÃPzÃÀ—Ã@kÃ@âÃ`³ÃÀÃÀ‘à ÿà à à$ÃàÓ Ã@_à+"ÃÌ Ã0»Ã0»Ã@_ÃÞÃÀÃÐGÃPýðùÃ@âð|÷ÃÀ©Ãà†ÀrÃÀ&ÃÃ`­Ã02ð|Ã.À~ð^ ÃPtÃpcÃÀ&à ÀŠÃ0ÙÃð¡ÃP€ÃP€Ã@ÜÃÐ/ ÃP€ÃÃø#ÃöÃà÷ÃpæÃP-ÃÀ&ÃàP!Ã"ÃäÃÐAÃPýðóÃ@SÃàëÃ@à´ ÃÀ!ÓðF$ÃP€ÃpEÃ$ÀõÃ0 ðÏ"ÃÌ Ã ÌÃPn ÃÀs#ÙÃ#Ã+&ÃÀê$Ã@ÊÃðè#Ã{#ÃÒÃàbÃ¥ à p!Ã@G ÃÀ—ÃÀ!Ã0%à$ÃPn à7 Ã`à$Ã@MÃPtÃÀ ÀÝ!ÃÞÃPŒà=Ã`‰"Ãp°"ÃвàÀÃÀ&Ã0DÃ`‰"ð^ Ãp3"ÀÑ#Ãðw!Ã=#ÀûÃÀÃðÃàåÃ4ÃpÂÃ` ëà í!Ãðk#ÃÀy"Ãi&Ã0!ÀlÃ@;"Ã`#ÃP÷à Û$Ã+&Ãðq"Ãà&(ÃàÍ!ðR"Ã@YÃàbÃ.ÃÒà ÀéÃ4ÀÑ#Ã0"ÃPtÃÀ¯ðáÃ@š'Ãà8%ÀéàÌÃàtÃð•Ã`­ÃÐ#à j"ÃЬ Ãðô!ÃPV$Ãð} Ã0¯à ‚ÃÀÀõÃàåÃ0 Ã0&ðçÃð•ÃpKÀéà á#ÀË$Ã@#&Ãðâ$Ãðî"Ã0©ßÃàbàÒÃPn ÃД$Ãp-#Ã( Ã0 Ãp¼ à à%#ß!ÃO Ã0¯ÃPŒà´ ÃÀ ÃàåÃ0&ßÃÀÃÀ Ã[Ãиà á#Ã@Ä Ã€Ã0,Ã0 ð^ ÀéàºÃ4àCÃàÙÃ`!Ã`›ÃpÔÃ¥ÃPñÃð} Ã` Ã@MÃpæÃÀ—à ÀïÃØÃ"Ã@è÷ðíÃgÃ` "ÃÀÀÃpWÃ0£Ã°Û à®!à7 ÃàßÃð<ÃÃàßÃ0 Ã`<Ã4ð|ÃÃPÃ0ÓÃ@wà šÃÀ£Ã`0ÃPn Ãð‰ÃsÃPzÃp]ÃàtÃ`<ðˆà[ÃpÈÃPÃÃ"ÃPë Ã.ðŽÃp]ÃÞÃÐAàÌÃP’ðÃpQÃвÃЦ!à ˆÃ@_Ã0—!Ã@_Ãð•Ã@îðjÃpQÃ` Ãp? ñÃÀ2Ãð$àÆàUÃ@ôÃÉÃpÔÃÀ¯Àrð^ Ãgà[ðÿà ŽÃànÃÀÃàýà  Ã02ÃP÷Ã0©ÃI!ðÕ!ÃÀýÃÐYÃpøÃPn ñÀ àÌÃà€À~Ãp9!àIàÆÃð‰Ã@ÖÃðÃ0>à ó ÃÐ)!ÃPh!àÆÃÐAÃÀ&Ã08à®!à |à ‚Ã@¸"Ó#ÃpÂÃ`›ÃP€Ã4à1!à !Ã@MÃ` "Ã0£à=ðçÃànÃ"!ðíÃ@_àCÃ`§Ã0"Ãð‰Ã¥ÃðÃ{#ÀéÃÐ)!Ã7$ðdÃðw!ÃК#Ãðe$ÃÀ ýÃÀÃ0 À`!à´ à=ÃÃ[Ã`§ÃØÃ°Û ÀlÃÀÃ0!Ãì%à v Ãêð^ Ão%ÃPb"Ãp9!ÃàåÃàÙÃàÍ!ÀÃÐÄà ‚ÃÀ‘Ã`­Ã@Ã02ÃàÓ Ã0#Ã`³Ã02ÃpKÃ@ÐÃyÃ@wÃPb"ÃÀm$Ã0£Ã0µÃðÃ`³Ã0&Ç!ëñÃUÃàJ"ÃàÙàºÃàV à1!Ã(ÃвÃ`*Ã`¡Ã`›ÃЬ Ã@¾!Ã`¡à ó Ã0©Ã0 ÃPë Ã`$à Ãp]ÃЦ!Ã` "Ã@A!Ç!à p!ú#Ãp? ÃàÓ Ãðô!ÃÒÃÐ;àOà ”ÃÐÄÃpÂÃàhÃ@MÃðÃ0,ÃpQÃ@YÃPß"ÃÀ… à p!Ç!ÃÐÊÃÀ Ã0%Ã0s'À`!ÃpÎÃàëð‚ÃàÍ!ÃвÃI!Ã( ÃPñÃ¥ ÃÐ#"ðF$ÃpKÃpWÃPtÃØÃ`­Ã08Ãð ÃP’Ã@ÜðjÃ0,ÃÃÃ@kÃPtÃ@A!àœ$ÃÀàÒÃ@âÃ0,ÃÀ… Ã0 Ã"ÃPzÙà ˆÃ@ÜÃÀÃP†Ã@âð^ ðpÀf Ã@;"à ÃÃ@MÃ0DðáßÃ@ÖÃ@SÃÀÃÞÃðw!Ãð} Ãàbà ÃpÂà ùà¢#Ã0%Ã`¡Ã0©ÃÐ;ÃpKÃàÍ!Ãp-#ÃP€ßÃ08Ã4à ÿÃ0 ÃPh!Ã0£Ãà\Ã"!à ÃÀ Ã0µÃÀ!àCÃ02Ãp¼ Ã@)%ÃÌ Ã€éàÆÃ`• àÌÃÞÃ0Ó÷ýÃ0 à d#Ãð ÃðÃmðáÃð‰ÃpìÃ`BàÌÃ$Ã`§à à àðÃ`¿ðÿÃöÃ0©Ç!à v ÃP˜Ã.ÃÏÃ`Ëà[ðíÃ@MÃðÃP’ÃвÃ.ÃÐMðÃêðÕ!Ã¥Ã(Ã`›ÃPýàOÃ@ÐÃ@ÐàÆÃ@Ã0£ÃP’ÃÀ—à ÿàÆà à v ðçÃàhÃÐSÃ0>Ã02Ãð$Ã¥àÒÃäÃpàÃÃ0JÃLàUÃPzàØðšÃPžÃ@qÃP†ÃðÃ0>Ãp¼ ðÕ!Ã@G ÃpQÃà÷ÃÃÃ`<ñÃðú Ã`• Ã4ÃÃPŒÃpÔÃоàIÃàŒðÃ0ÁÃððvÃ0©à ‚Ã`*Ã:ÃðÃRÃLÃàëÃàñÃ`*ÃPÃ.Ãð§à )ðÿà ŽÃð›ÃÐ;ÃÐ;ÃÐÐÃ@wÃÀ©ÀõÃaÃÏàÒàÆà ÃmÃ0!ÃÐ5ÃpÈðÃðÃàtÃPžÃÀµÃàŒÃÀ—Ã0µà=à ŽÃðÃðÃÉÃàtÃð›ñÃÐ;ÃpEÃðƒÃÞÃðÃðÃO ÃpÎÃàñÃÐSÃð•ÃpQà ‚ÃäÃ.Ãð$ÃpÈÃ@YÃO Ã¥ð‚ÃÃ`ËðpÃ0,Ã0‘"àØðóÃÐÊÃ`• ÃðƒÃpÔàØÃP’à[ÃÐÖàÞÀÀ„ÃêÃÞÃÀ¯Ãð‰ÃPzàÆÃP€Ã0ÇàÌÃP’ðpà ˆÃàzÃ4ÃpÈàÆÃP'Ã0PÃàhÃÃàyÃà†ÃP ÃÌ Ãð ÃðÃððÃ.ðÃ@qÃ`<ÃÃðùÃØÃ0>ð Ãð§ÃP†ÃP Ã`NÃ`BÃÐkà  ðÿÀœÃmÃP ðáÃ@èàmÃ`<Ãð§ÃàëÃÀÃ0ÁÃgÃиÃ0>Ã0PÃÀ,ÃÀÃPñÃ0>Ã@îÃÀÇÃÐeÀ ÃpuÃ0ÇÃð¹ÃàëÃ#Ã0>ÃàÃPà ÷ÃÏÀŠÃÀ!ÃäÃð›Ã0\ÃLàÆÃЦ!Ãð›Ãð‰Ã0µÃ@èÃ`$Ã¥ÃÀÃp-#ÃàD#ÃàzÃÀ&ÀÃÀ,ÃÐSÃðÃpàÃP˜ÃÀ–Ãð×ÃÐkÃÐAðíÃ`$ÃðÃ@SÀàOßÃ`!Ã"Ã0ÁðpàÆÃðÃLÃ…ÃyÃÞÃðú Ãð Ãp? à Ã(ÃÉð ÃàýÃ0!ÃPtðjÃPn Ã`³Ãà\ÃÀü!ÃàbÀ~Ã@G ÀéÃ0>Ã`§Ã0&ÃÀ‘ÃPŒÃFÃpÚÃgÃ"à7 Ã` à Ã@_ÃàtÃÀ ÃPžÃPzÃ0—!ÃÒÃO ÃðÃ@Ä Ã@ÊÃI!Ã0&ÀïÃðÃÀ‹ÃàtÃðÃ0 ÃpÂÃÐ)!Ã@MÃpEðùÃð•ÃpcëðL#ÃUÃØÃðú ÃÀÃPn Ã`BÃ0>Ã`ƒ#ÀlÃÆ!ÃaÃ`*Ã`›à¨"Ã`#ÃPë Ã( àºÀ×"ðÏ"Ã@¾!Ãðú Ã.Ã@kÃ¥ÃpàðÏ"Ã@;"Ã0!ÃaàUà #ÃP!à  ÃàëðÏ"ÃpEÃÀÃPb"Ù"Ãò$ÃК#Ã0%Ã"ß!ÃðƒÃp? ÃpKÃ:ÃðÃP†Ãð›Ã` ÃÀy"ÃPtÃ0,Ã0—!ÓÃP Ãð*Ã@ÐÃÃÆ!ÃÐ$ÃàÙÃð ßÃÀ&ÃpQà à+"à á#ÀõñÃ¥ à v Ã0,ÃpààºÃ.Ãðô!ÃÀ!à ÃpÈÃPzÃоÃðÃ02ÃàßÃ0µà ˆÃ`6Ã0ÁÃPÃÐGÃPtàÀÃàV ÃPtðpà Ãp? ðùÃpæÃ@eÃ`¹Ã0,ÃpÎÃàbà ‚àØÃàñÃàzÃð›ÃÃ0£ÃÞÃ0¯Ã` "Ãp? ÃÐSÃÐ/ ÃÐÄÃànÃP†ÃàtÃP†ðvÃðÃðÃÐÄÃP àÒÃÀ,ÃpÎÀûàÞð‚Ã`0à àUÃ0VàêÃ0&ðjÃ`!ÃØÃP÷Ã0&ÀÃPýÃ@ÖÃ0PàðÃP˜à ˆÃ`!ÃЦ!ñÃÀ,Ã0ÇÃP’ÀÃð›ÃÐ;à |Ã`›ÃÃPðX!ÃðýÃðÃpÂÃ@ÖÃp!%Ã0Ø+ÀõÃpìÃPzÃà-Ãíà ðL#Ãp9!à  ÃàhÃ0!ÃPýÃð•Ã0Ùà ð|ÀxÃ0&Ã08ëÃs÷Ã`BÃà Ã`¿ÃPžà ²ÀŠÃ"À~ÃÀ&Ãpìà  ÃpàðˆÃðw!ÀZ"à v ÃàV Ãð•ÃP’Ã0µÃ0£Ã"ð|÷ÃÀ©ð‚ðpà Ã0 Ã@Yà Žà Žðpà šÃÀ2Ã@ÜÃØÃaÃðàaÃ@eà )ÃPÃ0£ÃP˜ÃLà=Ãð‰Ã[Ã@âÃ(ÃêÃÀðpÃиàÌÃP˜ÃpÎÃpÔÃ0»Ãðw!ÃpÎÃÀÃÐÖð|ÃÀZ"Ãð} ÀrðjðˆÃàÙÃÀÃ@ÐÃPŒÃ`›ÃÀ… Ã4àÆÀõà ¦Ã`*Ãp9!Àã Ãà÷Ã:Ã4ßÃ`¹ðR"ÃÐÊÀïÃ`­ÃpÎà Ã@SÃ@¾!ÃPë Ã"Ãp3"Ãð‰àØÃÀ"ÃðÃPë à7 ð^ Ã`ƒ#ÃðÃmÃPŒÃpWà à v ÃPzÃ0!àOÃ"ÃO Ãþ"Ã` ÃÀrÃp? Ãp9!Ãp'$ðçÃàÙÃàßÃ[ÙÃmÃðà[Ã`• Ã`ƒ#Ãp'$à v ðX!ÃI!Ã0©Ãp3"ÃЦ!Ãp°"ðÃ$à j"ÃÀÃÀ… Ãðk#à ðdëÃðƒÃàÁ#ÃàÇ"ÃÀ"ÃÀö"Ã`ƒ#Ãì%à7 Ãð Ãp¼ ÀÑ#Ã0s'Ã0…$ð^ ðáÃ0©ÃàP!Ã( Ã0 Ãð Ã`‰"ÃPn Ãðô!ÀË$ÃÀÃÀ!ÃàJ"ðÕ!Ã0…$ÃÃÐ;à ”ÃpàÃàßÃ0‘"ÃI!ÓÃPh!Ãà8%ÃàJ"Ã`*ÃàV ÃР"ÃàÍ!ÃÀ… ÃР"à v Ã`¹À~ÃÐ;à$ÃpKÃÀ—ÃP÷Ã`­à+"ÃÀ"ðçÃ@SàÌÃ0©ÃPñÃà\ÃPn Ã@²#Ã@MÃ`Àã à ”ÃàV Ù"ÃPb"ÃØÃ0&ÃPb"ÃÌ Ã°áÃвÃpEðpÃÀê$ÃàJ"ð^ ðíÃPÃP Ã@ÐÃÀö"Ã0$ÃÐ#"Ã0%ÃðS'à ó Ã0£ÃàÃöÃÃÃpEÃÐMÃpÔÃpKÃ"ÃÃ@YÀ~ÃðÃpàÃpòÃpàÃ0>Ã@SÃ@A!àOÃÀ¯Ãоà v ÃC"Ãp9!ÃpKÃàëÃP’ð|ÀlÃpÈÃÐeÃP˜ÀŠÀ ÃsÃÀà ÿà Ã0ÇàOÃ@YàäðùÓÃð‰ß!Ãàßà !à ŽÃð•ÃpÈÃ`0ÃÀ£ÃÀ¯À„à !Ã`­ÃLñÃ`ÅÃÐîÃ@èà ÿÃà€ÃàåÀûÃð Ã`³ÀïÃÀ—Ã0ÙÃP¤à šðáÃpWÃUÃÀÃ@kÃÐÊÃÐ/ ÃPå!ÃÞÃ@eÃ0ÁÃÐÊ÷ÃP’Ãgð|ÃöðÿÃ@YàUÃpÎÃ`¿ÃÃÃ`*ÃàëÃÉÃ0>Ã`!ÃàV ÃÒà àÆÃ.ÃPzÃP!à #Ã0 à ‚ÃpKÃÐGÀ„ÃpàÃÐÐÃRÃð0ÃXÃ`­Ã@kÀÃàtÃ0&àÀÃÀ&ÃP’Ã0>à )à ÃpÃ@wðŽÃ@}Ã0bÃ`<Ã`³Ã0&ÃpQÃ4Ã0Pð¬Ãà Ã@ðíà ¦Ã0Và ¦Ã@ÃÀµÃàtÃàýÃÐÊà #Ã@kÃÀ¯Ã"Ãð•àÀðçÃ0—!Ã0©Ãà Ã`TÃÐÐÀÀ%ðšÃðBÃÀ2ÃÐSÃÐGà Ã`*à ˆà À¢à ”àÀÃàÃÐâÃ@Ä Ã ÒñÃ`*ÃÀê$ÃàbàyÀ Ãð§ðà )ÃPÃÃ`Hà Ã02à Ãp]ÃpÚÃPªÃðÃàýÃöÃPðX!ÃàßàOÃÀ>àüðÃÐGÃP¤ÃpQÃ`§Ãð›Ã`ÃPà Ã`ÑÃ0ÍÃÐYÃpWðùÃàzÃ@SÃ@¸"ëÃÀ2ÃpWÃpcðvÃP˜Ãà÷Ã@Ã`ÃÐ)!ÃÀ ÃP˜Ã`ÅÃ0¯ðçà ˆÀ–àmÃð*ýÃàhÙÃÀ2à Ã`§Ãà÷Ã`¿ÃàýÃÀ—à´ Ã:Ã^ÃöÃ(Ãà€ÃàÓ ÃÀm$ÃÐMÃÀ&à ŽÃðNÃ0÷ðÃPÃÐÊÃpQÀ~Ãà\ÃÐAÃüÃÐMÃð­ÃP¤ÃyÃвÃÀÃ`Hà ðçÃàbÃpWðÃàñà ŽÃÐÊÃPŒðpÃÃÐGàOÃÐÜà šÃàÀœÃàñÃPýÃÃ.÷à ŽÃ@ÊÃà\ñÃðÓàÆÃpàÃ@èÃÐÖà ŽÃPÀûÃÀ Ãp°"ÀŠÃÀµÃ@ÖÃPžÀÃ`6ð|ÃsÃÐÖÃ`¹ñÃ08àÆà1!ß!Ã0ÇÃ`ËÃpcÃÀ¯Ã`¹Ãp]ÃaÃð•Ã4ÃàhÃpiÃRÃP-Ãà Ãdà Ã`0ÃàñÃ@eÃÃ02ÃàzÃ`³àmßà |ðíð^ ÃðÃ@kÃ@ÜÃ0 Ã0¯Ã08ñÃÀÃP†ÃÀµÀ Ã…Ã`*Ã@kÃ^àÒÃ02ðÿÃÀÃP Ã`$àÒà  ÃððùÃÀ©Ã:à šÃ4Ã0¯ÃpÎÀ~ÀÃ``ÃpuÃ@èÃð§Ã0VÃÀ»ýÃÀ»Ã0ñÃPÃÀÃð À¢ð‚Ã@ÖÃPð|ðóà /À„Ã0ÁÃêÃ.Ã@eà[ÃÀÃÃÃ0ÇÃÐÜÃàëÃ@ÖàäÃPÃÀ¯Ãp]ÃÀ àØÃ`¡à ð|Ã0»àaÃÀ2ÃÀ©ÃFÃpòàmÃpàÃLÃÀ,Ã`Bð)Ã@îÃmÃpcðjðóàÀÃPÃpæÀŠÃ0ÁÃð¿À–Ã`<ÃÐeÃÐkà ¦Ãð¹Ã0PÃð*ÃPžÃ0>ÃÃpoà )Ã(ð^ Ã`ËÃ`TÀ®ÃÀ£ÃÀ,ÃÕÃ`6ýÃàÃsÃpàÃP'À+ÃP¤ÃàýÃÀ£Ã`ÅÃyÃ`ÑÃÃà ÃÐÊÃàzÃà’ÃÐkÃmÃàýÀœÃ0ÁÃÃ@úÃPÃP!Ã0DÃð•Ãðð ÃpoÃ02Ã0JÃpiÃáÃPžÃ0Jà ¦ÃÀÁÃðà !à #ÃànÃÀJàsÃà÷ÃpQÃÆ!Ãð­à ÊÃP3ÃíÀ¢ÃP!ÃÀ©Ã4ÃðÃ4ÃPÃ@ôàgÃÐÜÃ`¹ÃFÃàžàêÃÃ`ÑÃ0åàðà /Ã0ßÀÃÛÃjàüÃ(ÀûðÃÃÃÀJÃàýÃ[àäÃpìÃ`ËÃÃÃà˜Ãà˜ÃÐÐà ŽÃ@âÃpæÃÀ&ð‚ÀÃð0ÃÐkÃÛÃð¿ÃÐÊà ÿÃPÃÐ_ÀœÃPªÃ0ÓÃààÞÃPÃXÃ@wÃ0ÍÃàzð”Ã0ÙÃPÀ ÃgÃpæÃRÀ%ðˆ÷ÃüÃ@ÃÐeÃ`­ÃÃÉÃ0ÙÃ`*à p!à ‚ÀÃÐSÃÐÖÃÐGÃ`0ÃPýÃÀ ÃP ÀõÃð¡ÃÕÃpàÃÐAÃP'ÃP’Ã0\ÀëÃpWÃÐÜÃ@èÃ@ÐàIÃäÃ0¯àaÃà÷Ã@wÃ0PÃà÷ÃpæÃ0DýÃ0DÃFàOÃà€Ã0\à ŽàÞðÿÃàëÃ4ðpÃà Ã^ÃpoÃLÀà #ÃÐÐÃ@YÃ( ÃÐGÃyÃ0¯ÃÀÁÃ@wÃàñÃ°Û ÃpiÃà ÃpòÃüÃÀÃÀ… Ã0©ÃðÃà€ÃÐeàÌÃpÔÃÐÊÀ„Ã:à  ÃÐÜà ÃçÀÃ`³ÃÀðŽÀÃpoÃ0Íðà ¸ÃpøÃ0ÍðˆÃ@îÃð6Ã`¿ÃÃÐâÃð•ÃÐÐÃÆ!ÃÞÃ`¡ÃàÓ ÃÀÃ0»ÃÐYÃÀ—à |Ã@îàaàÒÃÀÃ0»ÃÀ8àCÃð‰àÀÃÀ‹Ãð‰ÃpcÃÀ8Ã@ à ¬Ã"Ã@ÜÃPzÃ"Ã0ÍÃP àÞÃÀ ÃÐMÃÐÖÃàzÀxÙÃàëÃ0DÃ0µÃP!àêÃP!Ãð*ÃðÃpWÃÐÊÃ`¹ÃÃ@èÃ@YàÆÃðÃà˜ÃÀ—Ãð›ÃÏÀ„ÃP’Ãð•ÀïÃÃÃð¿ÃP˜Àà ¸ÃFÃüÃÐèÃàÃ08Ãð§ÃpuÃÃÐÖÃ0ÙÃêÃàÃà ÀŠÃp'$Ãà÷àÒÃàýÃpà ¬Ã`HÃ0ñÃÐwÃà˜àIñÀœà #ÃÐ/ ÃÐ/ Ãð›Ã`NÃpòÃ0ÁàOÃLÃ0ÁÃ@èÃÀ&ÃÐÊÃ¥àÆÃÐeÃÀ8Ã4à ðvÃ`*ÃgÃð$ÃØðáÃpÈà ÃmÃ¥ÃpÈÃÀ… à ÃÌ Ã@YÃO ÃЬ Ã0y&Ã0ö&Ã@)%à %ðíÃI!Ãp3"à®!à$Ãðè#àœ$Ãp¤$Ã@¾!à®!Ãp!%ÀÑ#À×"ÃÀ‹Ã°Û Ã0‹#ÃðƒÃ0 ÀH%Ãà*ð@%à+"àÀÃgðX!Ãð} ÀlÃÀy"ÃàD#Ã$Ã0 ÃPå!Ã`ƒ#Ã1%Ãp(Ã¥ ÀûÃ`• à p!ÃàbÃ@Ðà á#Ã@5#ÃàÇ"Ã@¾!ðX!ÃЬ ÃÀö"ß!ÃвÃðq"ÃÐ5Ã@âà Õ%Ãp¤$Ãp-#ÃÐ)!Ã"ÃPÙ#Ã@/$à+"ßÃð‰à j"ðÃ$ÃàÓ Ã`$Ã°Û Ã°Û ÃàzÃPzà p!Ãà8%ÃPÙ#Ã"ð·&Ã`Ãðú ÃÐ#"ÃÀ!Ã@Êà7 à ðR"ÃиàCÀÃ`§ÃÀ ÃЬ Ã`• Ãp]ÃÃyÃànÃÐ/ Ã`¡ÃЦ!ÃÀÃ@¸"Ã$ÃÐ/ Ã4ÃвÙÃÀ àUÀõÃÀ!Ã`#ð½%Ã( ÙÃ(à7 ÃPýÃÐÊÃÐAÀ~ÃpQÃàP!Ãà\ÃPÙ#ÃØÃPýðÕ!Ãðq"ÃÀÃÀy"ÃÀü!Ãp¼ ÃPë ÃÃà\Ç!Àã ëÃ0¯ÃÐAÃÀÃP÷ÃpÔðR"Ã$Ã0‘"à7 ÃàßÙ"Ã`• Ã@Üà¨"ÀÝ!ðçÀ`!à àIÃð} Ã( Ã@âà ÿÃоÃàýÃp3"Ã0£Ã`¡Ã@ÊÃðÃð Ã@¸"àºß!ÃÀ—ÃPÃàhÃ0#ÃÌ Ã %ð:&Ãp¶!ÃÀÃ0"Ãà\ÀõÃ@MÃàtàÌð^ Ãð ÃÃàbÃ$à%#ÃÒàÌà #Ã`­ÃàJ"Ã"!ßà=à àÀÃð ÃÀÀlÃÀ‹ÃàëÃ@wÃ"ÀÃÐÄÃpÎÃ0‘"à á#ÃÀ!àOÃà†Ã@wÀÃÐSÃ0»ðvÃ0µëÃ0"ÃÐ$ÃàbÃ`¡ÃpÎÃÀÃPýÃð›ÃP÷ÃpÔÃpQð|Ã@îÀ„ÃÀÃpÂß!Ã"ÃÀÃð0Ã`<à ÿÃp9!ð|ÃÀ£ÃàhÃàëà ”ð”ÃsÃ@YÃ08Ã@kÃ`ËÃ@eÃp? ÃÀ‹ÃÐGÃ.Ã`­ÀõÃ@à Ã`¡ÃUðçÃp9!à ÿà ðùðvà[Ã@MÃPb"Ã@YÀŠÃpÚÃ`§Ãð} ÃPtÃPÃ@Ã`BàäÃPŒÃäÃ"à j"Ã@ÊÃ`›ÃÀ!ÃpEÀûÃÐÖÃpoà ðpÀœÀõÃЦ!Ã0©Ã@âÃPë ÃðÃÐèàÞÃPÃ@qÃÀ ÃPÃPÃÀrÃànÃð¡Ã0,ÃUÃ`*àÒÃððóÃêÃÃÃüàmÃ`‰"ÃP\#ÃØÃð§ÃPžÃ@G À`!ÃPÃ`­ÃÐ5Ã02ÀÃÃÀ»ðà  Ã@èÃ08Ã@úÃmÃÐÊÃÀõà  à šÃsÃ@ÖÃðÃ`TÃpWÃ0¯Ã:ÃÐAÃÀ ÃsÃPÃ`Ã¥ÃàzÀ~Ã0ÇÃÀÃðÃ¥ÃO ðóÃpKÃàtÃP°ñÃ(à[ð|ÃÐMÃ@îÃàñà Ã0ÍÃоÃpÚÃsÃ:ÃàzÃP€Ã`$Ã0£Àà[Ã`<ÃP!Ãð6À¢à[Ãàñàðà Ã0 ÃàëÃ@èÃPzðÿÃ0DÃP!ÃððpÃpcðdà ‚Ã@YßÃà÷ÃmßÃÀ!à !ÃÀÃ0¯Ã08ÓÃ`6ÀÃpWÃð¡àÞÃànðóÃðÃðÃLà À´Ã@ÖÀlÃðàmÃÐGÃ@îÃ@‰Ã0JàsÃ@ Ã`×Ãà šðÃ`³ÃÐÊð Ã0Pà šÀïÃ@YÃàÃÀÃ0>ÃÀ àÒÃà Ã`!à„(ÃÐîÃ4Ã@ÊÃP˜Ã@âÃP€ÃÐÐÃà ¬ð|Ã@;"Ã@ÖðÃ`¹Ã:Ã^ÃsÃPŒÀÃ@ÐÃàåÃðÃÀ¯Ãð$àäÃ@}ðÃ`Hà 5Ãà ÃððÿÃÃÃàýÃ@}ÃÐwàgÃsà Ã[ÃðÃÐAà #ÃÀ>Ã`¹ÃÀ,Ãð$ÃpìÃÐôÃpðšÃ@ÃÐÜÃ@}ÃPÃ0»ÃpoÃöÃÀµÃpàÃ0»ÀœÃÐèðàUÃоà Žà ¦Ã0ßà ÃÐMðvà ÿÃð¡ÃmÃ0ÍÃLÃ0>Ãð³ÃÃàtÃÐSðŽÃ‹à ”ÃðàðÃàð)Ãàzð”Ãp¼ ÃUÃð*Ãð›ÃàåÃð|Ã`×àêÃ0VÃpìÃð›ÃÏà=à ˆÃaÃUÃpiÃpòÃaà ˆÃ@eÀõÃ"à p!Ã0¯Ã@A!ÃàÍ!àÆÃ@ÖÃð‰ð‚ÃàåàIÃ@MÃ0—!à ùÃÐ5Ãp¶!ðX!Ãà»$Ã0 ÃÀ‹Ãð¡Ã0µÃ`*ÃàbÃÀÃPë Ã@MÀÑ#ðL#à ‚ÃàßÃ0»Ã`§Ãðî"Ã0,Ã0©Ã°Û ÃÀð#ÃÀ—Ãðô!Ù"ÃànÀÝ!Ã`$Ó#ÃàJ"ÃÀs#Ã@¾!à ùÃ0—!Ã&Ç%Ãð} ÃàåÃÀm$ú#à ó ÀŠàIÃp¶!ÃC"ÃPh!ÃàÇ"Ã0&ÃàßÃ0©à í!Ãðâ$Àã Ã0¯ÃpÂÃ@;"ÃÞà=ÃÀ Ã@ÖÃÐÊÃð Ã0#à ùÃЬ ñß!ÃÐ &Ã0!Ãpª#ÃÀÃÀ—Ãà\ÃÞÀxÃ`!Ã1%Ãp3"Àf Ã{#Ç!Ã@ÊÃ0¯ÃpEÃpÎÃàhà ó à ÿà ÿð^ ÃÀ‹ÃPtð^ ÃpEÃ[ÀïÃaÃ`!ÃàbÃ¥Ã@;"ÀT#àºÃp°"ÃàD#Ãp-#ß!Ã[À~àÆÃUà ÃÃàJ"à j"Ã"Ãðè#ÃÐ/ ÃaÃP€ðáÃmÃðÃ0‘"ÃàÍ!Ãоà=Ã`6Ã0µÃð‰ÃP\#Ã`¡ÃÐGÃàåàCÃP Ã0ÇÃàtà+"ÃÀê$ðçà ‚Ãmð‚ðpÃàßÃ#ÃÀs#ÃðÃÃßÃüÃöÃP÷ßÃÞÃ`›ÃÀ¯ÃPÃÃÀÃвà ˆÃ08ÃØà1!Ã`• ÃÀàIÃÀ&ÃpQÃPV$Àrà ÿðíÃðÃ0,ÃðçÃÐÐÃÀà à )àaÃÀÃК#ÃÀ… ÃPë ÃиÃð àOÃàñÃp]Ã@¾!Ã"À„àºà ç"àÀÀÃPÃÀ—Ã0 ÙÃðƒÀlÃ@ÐÃ@ÜÃð›ÃpKà í!Ãðw!Àf Ã@SÃÀ£ÃàtëÃP€ÃàåÃÀ‹ëÃ:ÃÌ Ãp¶!Ãð ðˆÀõÃàñÃ@âÃÀ—ÃP†ÃànàIÀûÃÐÄëÇ!Ã0JÃàzÃÐÖÃ.ÀÃpÂÃ0©ðÃ@âÃPñÃ08ÃÀÀßÃpÈÃ0©Ãaà Ãð‰ÃÒÃ`§À À„Ãp? Ã"ðˆÃ(Ã@SÃÐGÃÀ… ðX!ÃÐÄð÷ÃÐÜà ÃØÃPn ÃPÃ`³ÃPñÃðà[ÃüÃp]ÙÃÀ!Ã`¡ÃP˜àyÃpÂÃ`§àÀÃÐAÃ02à à ÃÐ/ Ãð à1!ÙÃ`$Ãðî"ÃÀ—ÃP÷ÙàºÃð›ÃpÎÃÃ0©Ã#à í!ÃðƒÀà šÃ@îà=à1!ÙÃaÃ` ÃO ÃPtàÀðçÃPß"Ã0£ÃÌ Ã`• Ã0,Ã@à v à7 Ã@5#ÃP÷ÀrÃ`!ÀlÃÀ‘Ãà\à ó ÃðÃ0,à=à ÿÃ`¡÷ÃÌ Ã [Ã`ÃÀÃвÃÀ&Ã@Ä ÃÒÃpWÃ( ÃÀä%ÃPb"ÃÀ‘ÃpÎÃpEÃ`$ÀrÃàëßðçÃ0&Ãðw!Ã@A!ÃÀü!ÃàÇ"à´ Ãðî"à p!Ã`$Ã0&ÃЬ à$ÃÀü!ðjÃ02Ã0—!ÃÐ5ÃÀÃÐSà ”Ãp¶!Ã`›Ã0¯Ã`§ÃàbÃ@/$Ã` "Ã.ÃP†ðjÃÀ ÃLÃ0µÃÀ"Ã@5#ÃPn Ã¥à ÃÒà d#ÃpEÃ¥ Ãð_%ÃàÁ#ÃØÃ0…$ÃPß"à´ Ãà©'à+"Àéð^ Ã`$Ã@_ÃÀ—ÃPýÃàÙÃÆ!Ãð‰ðdÃ0£À~Ãðô!ðjàÆà j"ÃÃÐAÃÃPb"Ãð} à+"à ç"à¢#à ÃÀÃPë Ãðè#ðÕ!ÃpEÃP\#ëÃÀÃÆ!ÃÃàÓ Ã ç"à p!Ãðè#Ã¥ ÃÀÃaÃоÃ@A!à !Ã{#Ã`­Ãà\ÃàÍ!Ã`0ÃmñÃиÃÀ"ß!Ãðú Ã@Mð^ ÃÐ5ÃоÃàëÃÀ‹ÃÃ"ÃоÀÝ!ß!ÃÀ‹Ã0,ÃÐÄÃþ"àºÃ@Üà ÃI!ÃД$Ã` "ÃàP!ÃÐAàÒÃЬ Ãò$ÃàÓ Ã %à´ à |ðdÃ¥ Ã` Ã@MÃðpÃÃP÷ÃÐÄàÆÃð ÃPë ÃPtÃ@SÃ` ÃpÂÃ(ÃI!Ãà\àCÃ¥à Ã(Ãð­Ãð¡Ã0¯ÃðÃàëÃоÀ„À à šðíÃÀÃ"ÃÃÃ.à ÿÃиÃ02ÃàåÃ@MÃðƒÃÕÃðÀõÃðÃàßÀÃpÔà Ã0¯ÃàbÃÐ;à7 ÃÐAÀrñðáà àCÃ`• à¨"ð^ ÃÐ5à ˆÃðƒÃaßÃ08ÃPÃð0÷Ãà\Ãð ÃÃpìÃPë Ãp-#àÞÃÐYÃ0 Ã@YÃ0£Ãðw!Ã0 à ÿÃ0PÃ@ƒÃоÃPÃPŒÃð¡ÀŠà ÃÃÐ5Ã02ÃØÃ0©ðçàOÃÉÃ`*Ã.àmàgÃ@_Ã`0Ã@âÀÀÃ@âÃÉðpÃ4Ã4ÃpæÃàzÃðÃ@_Ãà÷ÃPÃ.Ã@ÜÃPzÃFÃÀ¯àêÃÐGÃ@_ÃsÃÐMÃP€ÃиÃ.Ã.à ñÃpÈÃp3"ÃàÇ"Ã@SàUÃsà 5Ã0DñÃÀü!à ÿàOÃ`­Ã`­à ÃÀðçÃð Ãp¶!à Ãàbà ÃàëÃpEÃðÃ^Ã@àÞÃpWðíÃpWÃPtÃÀ!ÃPñÃàhÃsÃÀàÌÃànÃPýÃ@²#ÃÐÄàÌà1!ðšÃÀ&Ã@èÃÙÃÐÊÃàŒÃ`0ðÏ"Ã@G ÃвÃÐ5à=Ãð} Ã4àCÃ0DÃÀàÌÃ@ÖÃ0&à Ã@G Ã@âÃÐÊà Ã`›Ãàßà |Ã`0ÃÀÃPýÃЬ ÷ÀõÀ ÃÀ&ÃpiÃ0ÁÃÐÐðdÃI!Ã@ÐÃPýÃ°Û Ã ó ðvà ¬ÃÀ2ÃPÃÒÃØÃð›ÃpæÃ:Ã`¿ÃÐèÃð0ÃPëÃðÃð<Ã@ÃànÃ`¹ðáÃÀÃUÃP÷à1!ÃÀ‹Ã`¡à ŽÃFÃpÚÃ"Ã@Ðà ”à ÃÀð#Ãðú Ã`­Ã0—!ÀrÃaÃÀÙÃð§Ãp]àÒÃ`§à ÀïÃðÃöÃÐÊÃp? ÃÐGÃànÃ0»À Ã0 ÃЬ Ãð§ðX!ÃÐ#"Ã@;"ÃPn Ã0&ÃpÎÃPn Ãø#ÃÀm$Ã`‰"ÃpKÃI!Ã`$Ã"ÃàD#Ã@¬$ÃPn à ÃàëÃÐ5Ã0—!à á#ÃÀ"Àïà ŽÃ@ÊÃð•Ã@SÃPñÃðô!àÀÀõÃ` "ÃЦ!à ùà ÃC"ÃÀ"Ù"à¨"ÃpÈÃP÷ÃЬ Ã"!Ã`¡ÀÑ#ÃpKÃàV Ã0,Ã0!ÃPzÀf ÃàÓ ÃÀ ÃÐ)!Ã0 ô$ÃÚ(Ã0%ÃàhÃO Ã:ÃðÃÐGðáÃðk#Ã@/$Ã"ÃØÃàP!Ã` "à í!Ãð Ã`!Ãp'$ðóÃ@YÃ@ÜðF$à Ï&à p!ÃP÷Ã@ÜðjðóÃÐ;ÃPb"Ã"Ãþ"Ã@_ÃÌ Ã`#à=Ã[ÃPñÃpÈßÃàbÃÃpÈÃÐMÃЬ à !ÃоÃð ÃÃPh!ÃàJ"Ã"à á#ÃÀ"ÃPå!ÃUà ó Ã0 Ù"à ÿà ðçß!ÃàV àÀàÆÃÛÃP€Ã@¾!ÃðÕ!à v Ã[ÀÃð•ÃäÃ`§ÃPñÃ"Ã`‰"Ã°Û ÃUðíÃÀ‘à7 ñÀlðdÃ$Ãp-#ðÕ!à ÃÃÀ ÃÃà ÀïÃÀ—ðÿÃ¥ Ãð à R&Ãà\ÃÐ;÷Ã@ÃðÅÃÐqà ŽàÀà p!Ã`§ÃÐGÃpKÃ( À ÃÐÖÃ.à ˆàOÃ`0Ã@ƒÃP’ð‚ÃäÀõà ˆÃpÂÃÀ—ÃÐÄðvÃáÃ0,à¨"Ã[Ãp]ÃÐSÃP†àÀÃÀ,ÃÐÊÃPzÃ0 àÆÃpæÃ0ÍÀÃðô!ÃоÃðóÃ@ÃàÃоÃðÃpàðÃÃÐ;Ã@Ä Ã@¾!ÃöÃð³ÃÃà ”ÃPžÃàbÃpÚÃàñÃP àÆÃ"!ÃÃmÃpòðjÃpKÃ@ÖÃ`0Ãð‰ÃPÃ@Sà ð Ã:ÀõÀxà Ã`›ÃàåÃàåÃp¼ Ãð‰ÃÐSà ¦ÃàÓ ÃànÃðÃmÃÀ,ð ÃÀ¯Ã0µÃ02ÃPÃвð^ Ã` ÃÀ—Ã(ÃÐ/ Ãà÷ÃàtÀõÀÀïÃðú ðL#Ã`<Ã0¯ðjÃPýÃPýÃPðX!Ã02Ã@qÃ@qð ñà ”ÃиÃ`$Ãð³ÃÀ©Ã@ÖÃÃ@G Ãð} ÃÀ!ðŽÃ0VÃ@MýýÃ:Ãêðóà ‚à ÃðÃ0&ÃpÚðpÃÀàÒ÷ðÃÐ;Ã0,ÙÃ"!ßÃ4Ã[ÃÐSÃ@úÃàhÃP÷Ãà€Ãp]ÃÏÃ0PàaÃ@eÃð$ÃÐÄÃ"!Ãà\ÃиÃp¶!ÃäÃ:Ãð¡ÃàhàCÃ0ÍÃð§ÃpcÃ`ÀÃ4à&ÀN$à+"ðdÃðÃFÃàhÃ0µÃ[à Ãp'ÃðY&Ã1%ÃÐ#"ÃÐAÃÇ!Ã`$Ã"!ÃêðX!ÃPå!ÃàÙÃÀÃиñàCÃp3"ÃÀ… ÃиÃðè#ÃÐ#"ÃÀ… ÃàÓ ÃO ÃpÈÃPtà%#Ãi&Ã=#ÃàÓ Ã ÆÃàÓ Ãp°"Ã@A!à ÃÀ… ÃàbÃPå!ÀÑ#Ã@¬$ÃI!ÓÃàÓ Ã`ƒ#Ã7$ÃpÎÃÐ/ ÃPÓ$à¨"ÃPtÃ0‘"ÃàÁ#Ã@ &ð½%ú#ÃвÃp9!Ã( Ã@MÃÀÃO Ãp°"ÃÒÃp¶!ÃÐ#"ÃP2*Ãðú Ãð‰ÃÐÐÃÐ_àØà d#Ãðú Ã`¡À~Ã0©ÀÑ#à ^$À6(ðR"Ã0 Ç!Ã@Yà ùàIÃ02ÃÀÃÀ‘ÃpÔÃоÃp-#ÃC"ÃÐ)!àCÃÀü!ðÕ!Ã0‹#ÀÅ%ÃР"ÃàbÃ@YðvÃPß"ÃÀg%Ãðô!ÃðƒÃð‰àºÃ.Ã` ÃPë ÃgÀT#ÃÃPtðÉ#Ã0 Ãð‰Ãðî"Àã Ã`‰"Ãp¶!Ãð Ã02ÃsÃ^à ‚ÃÀ!à¨"à àUÃ@âëÃ`!ßÃyÃÀ&Ã0 Ãp3"Ã°Û Ã0¯Ã@MÃàP!Ã0 ÀlÃàýà |à šÃpuÃð Ã@ÐÃÀ÷Ã:Ãp°"ÃÐ#Ã`Ãp]ðÿÃ@ÖðvðˆÃLÀrÃpÈÃ@ÖÃaÃPÃð•Ã0 Ãþ"à=ÀûÃ@SÃp¼ ÃpKÃ@ÖÃäÃàýàIÃð•ÓÃàÙÃ02Ã0»ÀT#ÃÀ©à[à ŽÃ0‹#ÃðÜ%ÃÐ5à Ãpàð|ÃÀ‹Ãp? Ã@Mà šà ÃàÓ Ã0&àÀÃоÃ0»À~Ã4Ã@èÃ`NÃ`­àÀàÆÃ@G ðíàCÃO Ãðà ‚Ã4ÃPzðjÃоÃàñÃRÃÐâÃð›Ã0ÁÃÀ£àyà[Ã`$Ãð à[ÃàýàgýÃ"ÀéÃàbÃ`³ÃÐSÃàðÃð³àÒÀ`!Ãp¶!ÃÐ#"ÃPŒÃ`6Ã4Ã(Ãð³Ãà ÃÐAÃ0>Ãà\À„ðóðjàa÷ÃpÔà ”ÃàßÃP€ðçà ÃP’ÃÀ»Ã@ÜÃànÃ0DÃP’ÃàÙÀ„à[Ã@ðˆÃÀ>ÃÀlÃ`¿à[ÃLÃ0ÁÃÃÃÀ àÒÀ–Ã4ÃmÃÐÖÃpÎÃÀ©ÃP€Ã¥ÃÃ0Óà ;Ã@úÃpÚÃP’ÃPÃ.ÃðZÃP'ÃP ÀÃpKÃgÃpiðpÃ`ÃàtÃLÃ0ÍÃÀ‘ÃP†ÃyÃpìð#ÃPŒÃRÃÐ_ÃÀ¯àÒÃäÃpoàØÃpàÃð ÃêÃð­ðÃpÃ`ûÃÐèàgÃÀ£ÃÀ©Ãp ÃjÃöÃÉàäÃð•ÃPn ÃP˜ÃÐèÃðÃ`0ÃàzÃðHÃpÃÀÍÃP¤ÃPýÃ.ÀœÃ`BÀ¨ðàäÃP¤Ã`¿ð‚ÃFÃP'Ã4ÃP’à ”ÃÏÃ:ÃsÃ`³ÃÀ&Ã@ôÃðBÃ0bÃ.Ãà†àmÃmÃ`*Ã0»Ã@SÃð§ÃÐqÃÐYÃ0ÍÃ0ÓÃÐSðÿÃöÃÀJÃsÃpæð‚ÃLÃð¡Ã4ÃÀÃpÚà ÿ÷ÃÐâÃ0JÃêÃÀ¯ÀÃàtðˆÃPÀxÃ0 Ã@SÃ`³ÃP€Ãð$Ã:ÃÐÐÃоð‚Ã"Ã0Dà[ÃàßÃð‰ÃÐGÃÀ©ÃðÃàåÃgÃðÃðÃ@îÃPÃ`¿ÃàtÃð³ÃpøÃ`6àÀðóÃpæÃÉÃàåÀxÃ0©Ãð‰Ãð ÃPñÃÌ Ã@ÜàÌÃÀ£Ãð•ÃÀÃоÃpÚÃLÀrÃðÓðpÃðÃ`*Ãà€àUÃpÚðdÃp? ÃpÔÃ@Ä ÃÀ ÃPzÃàÙÃpEÀŠàIÃÌ ÃÐ/ ðóÀõÃ0DÃP˜Ã`¿àaÃÀ!ÃP€ðóÃ@A!àOàÒÃ@ÖÙÃpÂà  Ã@èà ”ðjÃUàÆÃgÃÀ… Ã{#Ã"ðíà !Ã`#Ã`›Ãp? Ã`6ÃLÃ0!Ã0‹#Ãþ"ðáÀÃP€Ã0 à ‚ÃpWÃ@Öà !Ã4Ãð ÃO à ÃàhÃðçÀxàÆÃ`³ÃÞÃPtÃ0DÃ0>÷Ã0Dðáà à ‚ÃàÙÃ0ÇÃP’ÃÀ£ÃLÃgÃоÃPà à Ã0%àIÃpàÃêàCÃP Àà ú#Ãð à |ÃàP!à ˆÃÐ5ÃÀs#Ã`³ÃPÃ@ÖÃоÃ4ð ÀÃð§Ã`<ÃÐSÃÐÐÃÀ©ðÿÃFÃð§ÃР"ÃC"ÃPh!Ãp3"Ãp°"ÃPýÃ0&Ã0»àÌÃðƒÃ@5#à v ÃFÃðî"ðÿÃÐYÃ`¿ÃàÃLÃRÃ02Ãp? ðÕ!ÃÐGÀ–Ã0,ÃPðvÃÐ/ ÃоÃ`BÃÀµÃÀ©ÃP†ðÕ!Ãàtð ÃÀ—ÃàñÃÐYÃÐ_ÃRÃ@ôÃð³ðóðíà ”ÃPŒÃðÃÀ‘ÀõÃÀ ÃpæÃ0>Ã02ÃиÃðÃð•Ãp]ðáÃàßÃðÃàëÃðÃpcÃ@ÃdÃ¥Ãð ÃÀ¯ÃÐ;ÃÒÃ@MÃpÚÃÀ,Ãð›ÃUÃ@èÃÀ¯ÃÐ/ Ãð à ‚Ã0©Ã0"ÃÀ‹ÃÞà #ÃÀ¯ÃàzàØÃêÃð§ÃpÔà #àÒÀ`!à šðvÃLÃоÃàåÃFÃsÃÕÃ@YÀŠàUàÆÃ0ÁÃ0JÃpþð”Ãð§ÃÐ)!ÃðÃ@îÃêÃgÃ`³Ã`­ÃpÃàtÃ@kÃÃpàÀlÃð$à )À„ðÿÃà Ã0ßÃP-ÃpààyàðÃpiÃ0JÃêÀ„à ”Ã@ÜÃð*Ã@ð|ÃÐMÃ0VÃ@Ã02×à )Ã`6Àð|ÃÐÜÃ^àÞÃÞÃPzàIÃÐÖÃà÷ðvàgÃð¿Ã``ÀÃðƒà ÃàŒÃ@ƒÃ`BÃÀ&Ã02Ã0ÁÃÀÃ"Ã@ÊÃð•à ;àÌÃÀ£Ãð0Ãð¡Ã`<ÃÐÜÃXÃà†Ã0ÍÃðƒÃÀ‹ÃàëÃð$ÃP’Ã0DÃÐA×Ã0\Ãð} ÃðÃpWÃÃÐSÃðÃÃà ð”ð#ÃXÃP ÃÐÐÃÀ»ÃànÃ0‘"Ã`<Ã0\Ã`ÑÃ"Ã@èÃðÃ0>Ã0»ð‚ÃpWÃgàaÃLÃ@wÃðÃI!ðvÃpÈÃP€Ãð§ÃàtÃ`<ÃêÃÀ… ÃиÃø#ëà àUÃ@Yàyà 5Ã:à7 ÃmÃ¥Ãð›ÃÀµÃÐÊÃ@YÃPàäà ‚Ãð ÃÐMÃàðÀÃÀõÃðÃ`BÃÃÃ`¡ÃÞÃpÎÃ`0Ã@ÜýàØÃàëÃPå!Ã.Ã^ÃÀ Ãp°"ðçÃpòàðÃÀ»ÃdÃ^ÃÀ—ÃÀàÒÃ0»ÃPzÃ@SàOÃgÃ0>Ã`6ÃÐSÃ08à  Ã@èàÌÃ@_ÃÀ,ÃÃð•ÃpWðÃàëÃÃPtÃp]ðà ÃÀ… ÃP†àIÃØÃ0,Ã.Ã`6ÃpKÃð$ÃÃÃ.Ãa÷Ã`<ýÃ`BÃÀ»ÃpoÃäà )ÃÏÃ0ÁÃÐ;ÃÆ!ÃðÃ0ÇÃPÃ.ñÃ@ôÃP˜Ã:Ãà†àaÀÃaÀrÃÐSÃ@îÀÃUÃ`$Ãà€ðð|ÃðÃ`6Ã`›ÃÉà Ãp{ÃànÃànÃpQÃÀÃP’ÃP¤ÃpàÃP!ÃpàÙÃFÃ`¹à ¾Ãð6ÃÃÐAÃð*ÃsÃÀ&À„ÃÏÃ`¿À Ã0»ÃÀÃ`¿Ã`¿ÃÏÃÀÀÃ`$ÃÀ»àmðdà p!Ã`!ÃpEðpÃÃÃÐMàÀÃP Ã0ÍÃPžÃpàðÃÐ_ÀÃPžà #à ˆÃÐÖÃàà  Ãð¡àaàaÃRð‚ßàØÃ`NÃRðùÃ`6àºÃpKÃð*Ã4Ãðw!ÃàJ"Ã0ÇàaëÃÀàØÃð§àäÃp]Ã^àÞ÷ýÃ0€Ã‹ðŽÃ@eÃPŒÃð•àUðùÃàÙÃmÃ@qÃÀ2Ã`*Ãоà Ã0ÁÃpWÃÐÖÃð§Ã0JÃð ðvÃðÃpKÃ@ÐÃpcÃpuÃXÃ@Ã`<à ¬à GÑÃP!àÒÃ@ðšÃ`×ÃÀµÃ@SÀÃÐMÃP˜ÃRÀõÃLÃ0»Ã@_ÃPýÃà÷Ã`Åà  ÃpKÃmà…àäÃð•ð|Ãð‰Ã08À„ëÃPtà Ã@kà šÃ`!ñàäÃ0ÓÃÉÃà†àäÃÃàäÃð›Ãð§ÃmÃð³Ãð§ðdÃÀ,Ãð$Ã(ðpÃFà ”À~Ã`<à šÃÐÄÃ@ÜëÃpÈÃ`¹Ã0,àgð ÃpcÃ`• ÃÃÐèð)à Yàä÷ÃÀ»ÃpòÃÀÁÃ0ñÃÐèÃöÃ`<Ã0\Ãð­àgÃ@qÃÐYðíÃàýÃÐÖÀ–ÃRÃ@èÃвÃÐÐÃpìÃÐkàêÃ@ÃPžÃ`¿Ã`HÃÀ£àUÃÐÖðóÃPÃð³ÃP’ð|ÃÐ$ÃpÔÃêÃ@âÃpcàêÃ^Ãð¡ÀŠÃêÃиÃ`<ÀœÃð*ðÿÃÀÃÀ‘ëÃP!Ã@kÃpÚÃÐÄÃ0µÃð§ÃÐÄÃÀÃ02Ã@_ÃðÃÆ!à ‚ðˆÃpìÃ@úÃÀ£Ã4ÃpQÓàºÃÀ‘à v ÃPn ÃP†ðùÃ02ðóÃÐèÃÏà Ã@ÊÃ0Dà ˆÃPzÃÐAÃÀ—ðíà ‚ÃpÚÃÀ©À„ÙÃP†ÃPÃpÈÃÃ0»ÃÐ)!Ã@_ÃÐ;ðjà¨"à Ãоà ÃPë ÃP†ÃàýßÃÐÄÃ0»Ã@îàÆÀÃ(Ã¥ÃÀü!ÃaÀf Ã`$Ã0‘"ÃPë Ã(÷ÃP\#Ã`›ýÃ02ÃÐ/ ðpÃÀÃÀ Ã`• ÃàñÃP€àÌÃÀà šÃð¡Ãp]àaÃÐGÃgÃgà j"ÃpÈÃÀÃ0 Ã@ÊÀ~à Ãà€Ãp]Ã.ÃPzÃ0£ÀéÃÀ ÃÐÄÃðÃ¥ÃaÃpWÃðÃð•ÃÀ—Ãð à Ç!à šà[ÃÙÃà\ðÕ!ÃÀ©ðpÃ0 ÃpEà ŽÃàëÃàzÃRÃÀ,Ãð*àIÙÃpQÃ0»Ã@ÊÃð} ÃÐ5ÃЬ ÃpWÃ@_Ã@SÃ`0ÃðÃиÃàÓ ÃàV Ã`6Ã0VÃpiÃ0 ÃPÀïÃиÃ{#Ã@e÷Ãp°"ÃàÓ Ã`¡ÃÉÃPðdðvÃpiÃ`¹à |ÃÐ$Ã0£ÃàñÃpÈÃ`$Ã0 ÀûÃpKÃÐ/ ÃaÃpàÃ@àÒÃaÃÐÄÃpÈÃ`$ÃÀ—ÀÃP’Ãêð|ÃpWÃÀ©ÃàßÃÐ5ëÃPðdðóÃÀÃmàOÃ`*Ã@/$ÃÐ%ðjàUÃ08ÃÐ_Ã0Çà ”Ã(Ã@kÃ0>ÃpÔð‚ÃðÃà€ÃànÃpQÃ02ÃpiÃ@èðáÃÒÃ@ÐÀrÃàëÃÞÃ`§Ã0ÁÃÐÊÃpÎàÒà[ÃðÃð ýÃP\#ÃàßÃ0£ÃðÃÐÜÀàOÃpàÃpÚÃð ÃàhÃPŒÃÀ—ÃPýÃ4ÃÀ—à Ã@ÖÃpÔÃ0µÃÃÃ02ð|ÃpcÃ"ÃpÚÃàñÃðÃð›ÃP ÃÐGÃÀ¯ÃÐAÀ„Ã0ÇýÃððùà ÿÃLàØðÃ`BÃ4ÃPÃ0 ðX!à ðùÃÀ—Ãp3"à ð|Ã0\Ã`<Ãà\ÃÒÃÌ ÃgàgÀ àaÃPð‚ÃÃpcÃ@G à ÃP†ÃÒÃ@MÃ0>Ã`›àÒÀf ðóÃÏÃ@âÃ.Ãànà=à j"Ã0DÃ0JÃ.À„À¢Ã@}à ÃpcÃ@âÃÀ£à ÃоÃ0ÍÃð¡Ãð‰àOÃàëÃÀ&ÃÐÊÃÀ&ÃPÃ`ÅÃ0ÍðíðÃðBÀ–À–ð ÃgÃ(ÃPñÃðóÃÃÃpÎà ”ÃÃpcÃóÃ.Ã(Ã.Ã@ÐÃ¥ëÃ0DÃ@ÃÀ,àgà ðíÃ@YÃöÃÐèÃP˜ÃÕÃàñÃàtÃÐâÃà÷ÃsÃÀ©ÃÀ¯ÃÀ,àêÃàÃP€Ã@èÃð•Ã(à àCàêÃàëàØð”ÃàŒÃ^Ã@ÃÐÐÃ@ÖÃð$ÃpÔðjÃ`¿Ãð§ÃоÃð$ÃpÚÃ`¿ÃÀ»Ã`¿Ãð§Ã@qÃÀÇÃÐÊÃpEÃ`­ÃиàÞà #ÀàØà šÃÀ£Ãð¿àaÃ@Üðùà ˆëà #Ãà†Ãð¹ÃðËÃÐeÃ@Ã¥ ÃÀ&à à ‚Ã`à Ã@ôÃ0ÇÃð§Ã08ÃÀ8Ãà à /ÃP ÃP€Ãð§àOÃðÃàbðjÃpQÃ`­àgà[Ãà=Ã` ÃÀÃPà Ã0ÇÀïà Û$ÃpEàäðùÃpøÃ—ÃðÅÃÃà÷ýàOÃ`0àIÃI!ÃоÃÐGÃ0,Ã@G Ã0#à ¦ÃànàÌðvÃ[Ãp]Ã`§ÀõÀéà ŽÃ@úðX!ÃÐ)!ÃÀ!à´ à ÿÀf Ã0 ÃPýÃgÃÀ>Ã0µÃиÃàÙÃPðçÃЦ!ÃpÚÃÉÃÀ©Ã0µÃàëÃ0£Ã@G ñÃÞÀxðçÃ@¸"ÃÀÃ0,Ã@âÃ@²#ÃÐ5ëðíà ˆÃaàOÃð§ÃpìÃ`HðpÃPñà šÃ08ÃÞÃ0&ëÃ0ÇÃÀÃP’Ã0&Ãð àÒÃð­Ã`­ÃÐMÃ`§ÀõÃð›Ã:Ã`<ðçÀÃÐGÃPÃ¥Ã0µÃðƒðÕ!Ãp]Ãêà v ð^ Ã[à à[ðjÃpìàyÃ0¯ÃPÃXÃÉàOÃ0¯Ãð‰Ã:ÃЦ!à v Ã0>ÃÀÃÀ£ÃÐMÃÀ&àÒñàºÃàÓ ÃиÀÃÀ2à ˆÃ:ÃÀ£Ã@SÃ@SÃ0 ÃpÔà[ðvÃLñÃPÃÀ&à ùÀÃpcÃиÃPýÀÃÐeð ðáàÆÃàëÃPªÃ0»Ãà€Ãêà ŽÃP'Ã0DÃÐSÃÀ&Ã@SÃànÀlÃyÃàýÃàbÃäðÀ~àÆÀ àUÃÌ ÃàëÃpÔÃ@ÜÃ@ÜÃÐAðáÃ0£ýÃ`BÃ`­ÃÌ ÃFàØÃðÃpQÃ`§à Ãð›àOÀÃà÷ÀrÃP ÃpEÃ@ÃPtÃpàÃ@qÀðjÃpÔÃð$ÃÀÃÃ4ÃpQÃRÃ[ÃPh!ÃO Ç!Ã@eÃðÃ0ßÃpKÙðíÃàÓ Ã€xÃpÂÃ0,Ã0ÁÃpKÃð§Ã0>ÀrÃP’ÃyÃиÃÀ‹Ãp¶!ÃÐ#"ÀÃ@ÐÃÐAÃàßÃ`• Ã@_ðùÃÞàCÃð ÃðƒÃ`à ˆàaÃð} Ãþ"à´ ÃPzÃÀ—ÃàhÃàßÀõÃàñÃp¼ Ãþ"Ã`ƒ#ÃPß"ÃP’Ã`*ñÃ`­Ã@YÃ`0ÃÐ5Ã¥àÞà Ã0DÃäà ðvÃÐÊÃÃÀ Ã@kÃà Ã`¿ÃPýÃ0ÁÃ@qð Ãð›ÃÐMà ÿðóÃPýÃ`!ëÃиÃPë ÃðÙÃÞÃàhÃà€À„Ã@Ä Ãêà7 ðáÃðô!Ã` À`!ÃÀ—ÀõÃ`³Àrà šÃ@Ã@G Ãu$ÃPP%ÓÃÐAÃ:Ã0£ÃÀ‹à ùà |ð^ Ã`*Ã0 ÃO ðÕ!ÃÐAà |ðÕ!ÃЦ!ÃÀö"ÃpKà ùÃ` Ã@kðjÃðà ˆÃþ&à R&ÃPtÃ`›ÃÀÃðÃ`¡ÃðÃ`¹à=ÀlÀrðíÃ"Ã"Ã@_Ã02ÃpKÃRÃàÙÀf ðÏ"Ã02àCÃÀ ÃàV ÃðÃ`$Ã0—!ÃÀs#Ãðú ÀË$Ã@/$Ã0%ÃàP!à´ Ã"Ã[ð^ Ã0%Ã0%ÃàÇ"Ãðú Ãð ðáÃp9!ðR"ÃPb"ÀN$ÃÐ$à !ðÕ!Ãp&Ã"ÃÃð Ã`§ÃPP%ÃPÓ$Ãðq"ÀH%Ãðw!à ç"ÃÀ‘ÃàD#Ãpž%ÃàD#ÃÀg%à v Ã@ÐÃиÃ0>à´ Ã@5#Àf ÃàP!Ã@MÃ0…$ÃÀs#Ãpž%ÃàÍ!Ã@5#ÃÌ Ã±ÃÐAÃ@MÃ0$À`!à¢#Ãà2&ÃÀy"Ãp¶!ÃÃPn Ã0‘"ÃÌ Ãðk#Ãðú ÃÀ!à ^$Ãðk#Ã`k'ÃC"ÃP à ç"Ãp°"ÃPñÃÒàÆÃ`}$ð4'Ã0‘"Ã( Ãàåà ÿÃ@G ÷Ã¥ÃÀü!ÃÀs#ÃàP!à®!ÃO Ã0 ÃиÃpÔÃ`§Ã@SÃÐAÃàbÃ`à j"Ãþ"ÃÐ)!ðF$Ãþ&à¨"ÃPV$è&ÃO ÃàbÃ:ÃàÓ Ãp9!ÃÐ$ðR"ÃàD#Ã`­àØÃðà[ÃPtÃ@G ÃÆ!ÃpKà7 ð^ Ã@SÃÐÐÃ0$ÃàÁ#ëà Ã@_ÃÃð ðR"ÃД$Ãðî"Ãò$ÃàP!ÃðƒÃð Ã"!ðÕ!Ã@G ÃÀ!ÃÃ0 à á#ß!à ùÃ@ÜÃÐGÃð ÃК#Ãp'Ã@G À„ÃàÙàgÃÐAÃÐ)!Ãðî"Ã0!à ^$ÀT#Ã{#ÃO ÃàëÃ@kðùÃ`w%à Û$Ãp? ÃвÃ`*Ãp¼ ÃàD#ÃÀ!Ã°Û Ãp°"ÃвÃàñà |ðR"ÃàV ÃPß"Ã`ô%Ã0ü%Ã"À`!ÃàJ"Ãð} Ãàhà šà ˆÃàÙÃpàà=ÃP†ð‚Ãà\ÃPß"ðÉ#ÃðƒÃàÙÃÌ Ã0%àœ$à ùÃ( ÓÃ`‰"Ã@MÃP÷à !ÃpWÃà÷ÃÉÃ@;"ðÕ!ÃàzÃ"Ãðw!Ã`ƒ#ðáñÃ0&Ã@G ÀlÃPn Ãþ"Ãp˜&ÙÃà\ÃO ÃpEà®!ÃÀö"Ãp3"ÃPzÃPzÃPë à ùýÃpÔÃ@kÃPžÃÀ2Ã"à ÿà Ã@ÐÃàV ÃpÔëÃp-#Ã@âÃ@ÐÃ{#Ã$ÃC"ðà ÃÃñÃиÃвÃPÃÐÖÃöÃàzÃpiëÃðÃÀàÀÃ`­Ã@âÃÀ—Ã0!ÃpKÃø#ÀZ"ÃÐYðvà ÃpÎÃ0&ÓÃC"Ãp¼ ÀxàÒà Ã#Ã@ÜÃ`$ÃÀÃàV ÃÀ… Ã@MÃðw!ÃÞÃà\à ”àÞÃP ÷Ã4ÃÆ!ÃP àOà ÃpÚÃð‰à1!Ã"Ã@A!ÃPÙ#Ã0¯ÃpÔÃpÈÃPn À×"ÃànÃUà1!à j"ÃÐ5Ãð à í!Ã@²#Ã`›ÃðÃððçÃ(àºÃC"àgÓÀïÃ` "Ã`‰"ÃÀ—ÃÀà7 ÃÀ… ÷à´ Ã.Ã0,ÙÀ×"Ã@A!ÃàñÃ`¡Ã¥ÃpEÃPë Ã0…$à+"à í!ÃàÓ ÃÀ ÃPh!ÃÀÃоÃàÍ!ÃàP!ÃPn ÃàÍ!Ã=#Ã0µÃÐMðáÃàP!Ãà»$ÃÀÌ)Ãp¤$Ã@Ä Ãò$Ã+&Ã@ÐðÕ!à´ Ã0—!à ‚à à ùÃ@SÃ0%à%#Ãu$à ÃPn Ã@¾!ÃÀg%Ãp!%Ù"Ãà>$ÃàP!Ãðú Ã`‰"Ãð_%Ã{#Ã1%à¨"à í!Ãà2&Ãà&(à–%Ãp9!Ã@à ùà Ãà\Ã0#ÃÐ#"Ã`q&ÃPÇ&Ãp&à&ÃÐ#"ÃÌ Ã€ÃP’Ã`6ÃÒàŠ'à&Ã0ö&ðR"ÃК#ÃðÜ%à&ÀlÃàÓ Ã %#ÃÀê$Ó#ÃÐ$ÃÀ"à v ðÉ#ÃPV$ÃÀs#Ãàµ%Ãþ"à |Ã"à Ã@Ä ÃÐ%Ãà»$Ã°Û ÃðàºÀ×"Ãàbà Àrú#ÃP÷ÀûÀZ"Ãðî"à=ÃÀö"ÃO ÃÀ‘ÃPh!Àf ÀïÃØÃo%ÃЬ à´ à%#Ã`à àÆà ÿÃ0&à j"Ãp¶!ÃPD'Ã0m(Ãp'$à+"ÃàD#ð·&Ã`}$ÃPtÃPb"ÃÐ#à p!à j"ÃР"ÃPß"Ãp†)Ã0"ÃðÜ%Ãì%à ÿÃàV Ã0…$Ãþ"àºà ùÃI!ÃÌ ÃÆ!Àf Ãðq"Ã7$Ã0 ÃPñÃ0 ÃðS'Ç!Ãà\àCÃ°Û ÃPP%Ãà8%Ã0‹#ÀÑ#Ã`ƒ#Ãp9!Ã0&ÃÐÄà p!Ãp¼ Ã0—!Àf Ãp? Ã"ÃàÍ!ðX!ÃÐŽ%ÃP\#ÃÐ#à ç"à ó Ãp¶!ÃÐ;Ã@Ä ÃÐ$ÃÐ$ð4'à ÿÃðÃp&ÃàÁ#ðÏ"à1!à í!À×"Ãðú ÃpKà p!Ãðè#Ã`#ÃPÙ#ÃPh!à+"ð·&Ãò$ÀË$Ã[Ã@ÜÃ`*ÃÐ)!ÃPå!Ãp-#Ãþ"ÃI!Ãp¼ ÃÐ%Ã0 ÃPýÙ"ÃpÔÃP’à |ÃÀê$ÀÅ%ÃàÍ!Ãp3"ÃÐ;ÃР"ðíÃð} Ã0‘"ÃÐÄðdÃäÃp¶!Ã( Ã@ÊÃàhÃPh!ÃpEÃàbÃ@;"Ãðq"à ùÃàßÃ@A!ÃÀ!Ã0#à v Ã0#ÃЦ!ðdðjÃàÓ Ã°X!Ãp3"Ãp!%Ãðk#à í!à ÿÃÐ#"Ãp¼ Ãð‰à ùÃð­ÃàýÃÒà ó Ã@5#À`!Ãp'$ÃÌ ÃpEÃð•Ã0µà7 ÃàhÃÐÐÀlÃðô!Ã"÷à7 ÃÀ Ã@SÃÀ‹Ã0,ÀÝ!ÃðÃ`<ÃàJ"à ó ÃØÃÏð^ Ãðú ÃpÂÃÐÄÃ"àÌà Ãp9!ÀÑ#ÃPñÃ`!ð^ àÒÃÐ$ÃÌ ÃÐ#"à ùÃ0,àØà )àØÀïÃ{#ÃÀö"Ã08à v à1!à |àêÃÐ)!ÀÝ!ÃàßÃ@YÃdà #Ãð§ðpÃ`§Ã0£ýÃ`Ãaà=ÃÐÊÀõÃðî"ÃÀ‘Ã.ÃpWÀ~àºÃ.Ã@eÃ0JÃgÀûÃà\àCà !ÃPP%Ãþ"Ã0£ÀZ"ÃðÃð‰ÃàÙàäÃ`*ÃPå!ÃPh!Ã:à ðáÃp-#Ã0µÃÐÜÃP†ð|À Ã@ÖÃàÓ Ãp]ÃÐÄà ÃànÃ02Ã0©ÃÒÃ0 Ã4Ãg÷Ã0&Ã`!Ã@âÃ"!Ãð‰Àf ÀïàºÃð‰Ã`• Ã@SðpÃÀÀûÃ`›Ã@MÃÀÃ¥ÃsÀõÃàßÃPë Ãöà[ÃðÃ0JÃpQà=à  ÃÃÃaÃàtÃàßñÃÀÀf Ã¥à ÃpÎÃpWðˆÃÐYÇ!ÃÀ Ãð0àUà ÃàÇ"Ã"ÃÀðíÃ08ÃÐGÃð­ðpÃPtà=ð Ã"Ã@;"ðpÃ08ÃÐYÃÐYÃPŒðùðÃ`Nà Ã@Ä Ãðú ÀéÃàhÃÃÃ08Ã0£ÃÉÃоà=ÃàV ÃpKÃpKà Ã`}$Ãp9!à ðjÃ`<Ã`ðpÃÀ,Ã`ÅÀïÃØÃиÃ0©ýÃ0 Ùà Ãp9!ð|ÀàÀà7 Ãð•Ã0>ÃÀ&Ã@ôðŽÃà€Ã`*ßÃðÃ08Ã` Ãðî"ÃÐ5Ã`ƒ#ÃP€Ã.÷ÃÞà ”ÃвÃPzÃÃp¼ ðçÃÀÃоÃ@ÜÃÀ‘ðÏ"à |Ã0£Ã"ÃàýÀ„ÀÃÀ2ÀïÃmÃð6ðÃ[Ã0&Ã@ÐÃ@ÖÃ@âÃ`!ÃPë Ã`³ÃàëÃ@A!Ã` Ãp¶!àÆÃиÃà÷Ã¥ Ã0 ð|ÃàhÃ0—!Ã`*ÃÐèÃ`ÅÙÃp9!ÃÀy"Ãðú ÃàbÃðÃ@eÓà ÃàOÃÐ;Ã`!ðçÃ@eÃàÇ"Ãà\Ã0—!Ã0%ÃàV à |Ãp¶!Ãp'$Ã0 ÃðƒÃàëÃ`$Ã@Ðà ”Ã`›Ã{#ÃàV à ùÃ"!Ã@5#Ã&à d#àÌÃ0»Ãà÷Ã`ËÃöÃðÃpž%Ã`›ÃàzÃÉÃäÃ0—!ÃÀ‹ÃÐGÃ08ðùÃàåÃ.Ã`‰"à ç"Ã@ÊÃpÎÃêÃpWÃ@îÃà\Ãð•Ã@èÃ0»àÞÃàåðÕ!ÃàñÃ.ÃàÙÃPñÃ:ÃpÈà ùÃaðùð@%Ãp9!ðóÃgðR"ðÉ#ðL#à ˆÃpEÃ0£ÃÀ—ÃððáÃиÃ0&ÃUÃ0,ÃPñÃàëÃÀ—ÃÆ!ðíÃ`!Ã[ÃP ÀÃÞà%#àÌÃÀ£ÃÀÃÀ&à Ãp¶!Ãp3"ÀïÀûëà Ã@ÃÐÄÃ`0ÃÀ!ÀïÃ( Ã`¡Ã`$ÃPb"ÃpÎðpÀŠà àÆà v Ã0 Ãp]Ã@âÃàtÃðÃÌ Ã ÌÃðƒÃð›Ã`¹ÃÐÐÃ0©Ã0»À Ã`0ÃàtÃð*ðŽÃàzÃØÃÛÃPýÃpEÃ`¿ÃFÃÃðÃÃð¿ýà Ã@ÐÃ0,ÃpWÃäÃ`³à ˆÃðƒÃ@SÃ@ÐÃÐ;ÃànÃ0>ÃÃÃÀÃ`!à |Àœð5ðÃð›ÃÀÃÐÜàaÃ0»Ãð} Ã@A!Ã`§ðˆÃP˜àÌÃÐÜàsÃ`Bà ðdÃàtÃpcÃ(ÃO ÀõÃ(ÃpÚÃPÃpcðvÃ@YÃÃpÚÃ( à !à |ð^ àUÃ@à  Ã`³Ãà÷ÃPÃP†ÃÀÃFÃ@_÷ÃÐÊÃð*ÃXà à #Ãà ”ÃÐMÃ0ÇÃXÃ`6÷à[ÃÀÃð ÃpKÃÐAÃpÈÃÐÄðçÃ0ÍÃpoÃ0>ÃaÃðÃPà šÃPzàÒÀxðvÃsÃðÃ`³ÀÃpàðˆÃ:ÃÀü!àºÃPà ²Ãà˜ÃÀÃ@ÖàUàÞÃà÷ýÃPÙðdÃ@ôÃ0JÃÀ©Ã0¯Ãðq"Ã`!Ã@eðÃðÃ0»ÃÃpÔÃpÎÃpÎÃ@MÃð›àaà v Ã0 ÃÐÐÃÐSÃ0¯÷Ã@ÜÃo%Ã`$Ã0ÇÃ0JÀœÃP-ÃÀÃÐeÃíÃà ÃP˜Ã`¡ÃðÃÀÀã ÃÃ@ÃÃ0 ÃÀ!Ã`ÅÃP’ÃpWÃ`§ðçÃ.ÃàëàOÃ@ÖÃ@Sðçà šÃвÃà\ÃÉÃÐAÃ@YÃ°Û Ã@ÜÃPŒÃðú Ã0¯Ã"à ÃpÔÃð ÃàÃ0JÃpàÃÃÃð$ÃP†÷à  ÃÀ&ÃÀ2ÃàëÃððvÃPÃpòÃð¡ÃFÃÐèð‚Ãà€Ã`$à ˆÃ@èð|àOÃáÃ@ôÃ08Ã@eÀàÒÃ@wàUÃ08à ”à Ã`¹Ã@wÃÐGÃ0µÃ0©Ã@îÃÐYÓÃpWÃ@eÃàbÃpÚàaÃàÃàžÃáÃ@À1Ã"À`!Ã0"ÃFÃð*ÃàÃÐMÃ0>ÃÐMÃà Ã@ÃpàÃàåÃàÙðvÃàñÃð$ÃÉÃàV ÃÐMÃàÀûà%#ÀïÃ4ÃpÈÃpcÃ4ÃÀ2àgà šÃ@ÖÃÀü!à ”ÀrÃ°Û ÃÃ`*Ãð¡Ã@èëàUÃ@MàÌðjÃÐÊàÒðˆÃyðŽÃàzÃð¡à ðvÃàßà !à1!Ãà÷ÃÐÖÃpcÃàÃ`¹ÀõÃ0&àOà |Ã`!Ã`6ÃÐÖà Ã`BÃÀÃоÃP˜Ã`ËÃÀàCÃ"Ã(ÃàëàØÃÉÃàzÃ02ð‚÷ðÃð*ñÃPžÃPzÃPzÃ@ÜÃPÃàzÃà’Ã0ßÃÐÊÃöÃ0ÁÃÐeÃð§ÃpÚÃ"Ã@_Ã@èðùà ÃPýà à #ðÿÃöÃpuÃàbÃ[ðáÃsÃ0ÇÃ0 Ã0 àØðùÃ@YÃÐAÃÀ—ÃÀÃоÃ@âÃpWàÌÃ@_Ã0>àØÃ:ÃÐÄÃÃFÃÀ¯À ýÃÃÃLÃ0ÍÃpWÃÃ`­ÃpQÃ`­Ã`¹Ã`¿àmÃÐÜÃð<Ã0DÃ`§àÆÃ¥ Ã.ÀÃsÃPÃ`• à ÿÃð$ÃpoÃ@¾!Ãu$ÃÐÜÃpÚÃàëÃ0ÇÃÀ2ÀÃð$Àà´ ÃP’ðëÀrñÀœÃÐSëÃ0ÁÃðHÃðÅÀÃÐMÃFÃà÷Ã0JëÃàbÓÃP†ÃÀ8Ã@àüàØÃ:ÃpÈÃP€ÃÀ&Ã0\ñÀÃànÃp{ÃÐSÃPÃð›ÀõëÃ@kÃPÃLàIÃyÃÀ8Ã@ÀÃüÃpiÃÐYðàÞÃ08ÃÀ¯Ã0ßÃ@îÃð›ÃÀ£ÃàßÃ0ÙðÃFÃP’ÃðÃöÃàÃÀµÃ"ÃpÈÃðw!ðáÃÐSÃà÷ÃP'ÃÐÜÃPÃÐGà Ãäýñà ÃP’ÃP†ÃP†Ãà€ÃàýÃð§Ã@âÃðð ÃöÃÀ£Ã`BÃ0ÍÃ@âÃÐGÃ@eÃ.Ãàßà ŽÃêÃ`• ÃÐ/ à  Ã@âðùÃÃ0>Ãð§Ã0 Ã0µÃÀ>ÃÀ&Ãànà ÃÐ#Ãà2&À~àmð|à ÿÃpÚÃpàÃ0¯Ã"ÃP ÃàÙÃ`0Ã0>ÃäÃÒà ŽÃ`0Ã`³àºÃðƒà ”ðà !ðíÓÃ"ÃÀµÃÀ,à |ÃPñÃÀðíÃÃÀ… àÆÃÀÃ¥À~Ã:ßÃpÎàÌàÆÃpEÃиÃð›àIÃPñÃpÎÃgÃP€ÃÀÃPŒÃ@kàg÷ÃàÇ"ÃàÙÃ@Ã0,Ã"Ã[à ‚Ã@­Ã`BÃ( à ÀË$Ãð›àÞÃàhðóà ‚ÃðÃÒÃ0µÃpcÃ0ÓÃ0Çß!ÃЬ ßÃð•ÃmÃ02Ã`§Ãð*ýðóÃàñÃÐîÃÃÐMÃ`TÃ`6ÃP ÃÀ‘à ÀÃ`HÃP’ÃÀ2ðùÃ0DÃ0>Ãàýà7 àÞÃ@wÃPÃPñÃP€àÆÃàhÃ0»ÃFÃÃð§ÃpQÃÃÃð‰Ã@âÃÀ»ÃêÃàßÃàëÃвÃ0µÃð6ÃÐÐðùÃÀ¯à #Ã@è÷Ã@eà ÃP†Ã¥À ÃÀs#Ã0ÁÃÀ,àIðvÃÀ>Ã`HÃàýÃ@Ã0Dà ¦Ã`*ÃPýÃÐÊð‚àØÃPÃÞÀûÃ0£Ãð¡à /ÃmÃÐSðˆÃ@}Ã@îÃ`¡ÃððÃmÃ@YÃÀ… Ãð$ÃÐÖÃP†Ã@eÃ`HÃÐeÃ…÷Ã0>àCÃоÃÃÃ"ðùÃ0»Ã`­à7 Ã0…$ÃÐAÃð0Ã0\ÃÀJÃpæÃ@èÃ@eÃànÃP ÃÀµÃ0ÍÃÐGàIðX!àIÃ`§Ã@eÃ`¹ðjÃ@qÃÐwÃÀ»ÃÐÖÃð¡Ã0VÃÀPÃ`6Ãp]Ãà€ÃpcÃLÃð›àÆÃðú Ã`*Ã0ÇÃ0ÇÃàñÃ`¹Ã0Áà ŽÃpæàsÃÃÃ@Ãð} ÀrÃ`­Ã.ÃpøÃð¡Ã4ÃpWÃÏÃP ÀÝ!ÃÐ/ Ã0,Ã0DÃPñÃ¥Ãð§Ã¥à ‚Ãðà Ã4ÃÀ©ÃöÃ0ÍÃàtÃðÃÀ»à ²à à[ÃpÔÃðƒÃsÃLÃÀ£Ã`×Ã0hÃmÃðÃäÃð•Ãð•ð|à  ÃàhÃ0£ÃÒÃPzðjÃÏÃÐÖÃ0£ÃPtÀŠàUÀ„ÃpWÃpÎÃàýÃÀ&Ãàhà Ã0©ðÕ!ÃpQÙÃñðˆÃ@YðjÃð•à  Ãð*ÃàŒÃgÙðáÃÀ2Ãð•Ãð§ÃP÷Ã@ÖÃP÷Ã0 Ã0£ÃÀ‘ÃpàÃð§ÀÃëÃpÎÃàëÃPà ÃsÃöÃpið|ÃÀ&ðà à ˆà |à=ÃPn à p!ÃÐSÃ¥ÀéÃð ÃÀ£Ãº#ÓÃ@YÃ`¹ÃàzàÆÃÀ!à´ ÃÐ#ÃЬ Ã0£ÃpÔÃÀÃÀ&ÃÏðpÀ¿&ÃC"ÃI!à Ãànà v ÃÐÐÃÐÄÃp? ÃÐ#"Ãðw!àºà v Ãðq"ÃÀÃð Ã@MÃÌ Ã°ÿÃà€Ã@¾!ðX!ÃвÃÀö"ÃP÷à®!à ÿÀéÃPb"ÃC"Ãðq"ÃpÎàÒàÒßÃPn Ã`­ÃÐ)!ÃðƒÃPÃpEÃpª#ÃØÃÀ2ÀÃ0JÃêÃ.Ãp? ÃÀü!Ãðk#Ã0—!ÃàÍ!à¢#ÃвÃ0µÃàD#Ã`à ðóÃ.Ãpª#ÃðÃ0©ÃÀü!ÃgÃpKÃØÃpQðçÃ0&ÃÃ`$ÃÀö"Ã¥ à1!ÃC"Ã0µëÃØÃЬ ÃP÷ð^ ÃÆ!ÀéÃ`›à7 ÀlÃ`­ÃÐ)!Ã°Û Ã ÀÃàÇ"Ã0 Ã@ÖÃÀÃ@Ä Ãðq"Ã0!ÃP\#ÃÀ ÃàßÃ`¡Ã¥Ã0 à àØÃgÃà\à í!Ã.Ãð›ðáÃ0»Ã@G ÃPb"ÃÌ ÃÀÃ@A!ÃвÃ@;"ÃpKÃÐ5ÃàÇ"Ãðô!ÃÀÃ0µÃð‰Ã0 À×"Ã` Ã@Ã`¡Ãà\ÃÉàÀ÷ÃàÓ Ã`‰"Ã0!Ãp¶!Ãp? ðçàaÃPtà%#Ãpž%Ãà2&Ãðú ýÃ¥Ã0©ð^ ðpÃÀ÷ðÕ!ÃÀm$à=ÃpEÀã ÃPå!ÃðÃÐGÃàtÃÒÀõÃвÃÐ$Ã@eÃ`BÃpàÃPýÃPýÃÃßÀxñÃàñàÌÃÃÃ[ðjÃ:ÃðÃ[ÃäÃÆ!à Ã0©Ã=#ÃpÎÀà à¢#àÒÃLà7 Ãà ÿÃÐ_ðˆÃpQýÃpìðšÃ08Ã( Ã@YÃPŒÃFÃO ÃàhÃPzÃ0£ÃàbÃàÙÃüÀxà Ãp? Ãà>$Ã@;"ÃàÍ!ÃpÂÀxÃàñà=ÃP÷ÃpQàÞðçàÆàÆÃàýÃäÃ@ÐñÃÐGÃP˜Ãðú Ãp? Ã@MÃÐYÃÀ&ÃànÃðw!Ã[Ã`NðvÃp¶!Ãp? Ã@ÐÃвÃð ÃgÃ@ÃäÃ`0Óà7 ÃpÚðóÃ[ÃPë ÃpÎÃðw!Ã`›Ã@Ä Ã Ã@èÃÃÒÃÀ¯Ãð÷àOÃà÷ÃpÎÃвÃÀ—Ã(ðpÃØÃÐGÃ4à )Ãàtß!ýÃ`¿Ã0ÇàÒÃO ÃmÃ:Ãà†ÃÿÃPðÿðÿÃ0&Ãðà ùÃ(ÃP†Ã@úð|ÃpKðšÃÃÃ@ÃÀÙàOÀã ÃÆ!ÃFÃÀ8ÃÀ,ÀõÃ`$àØðóÃà\Ã"ÃðÃÀ¯Ã`­÷Ã0ÍÃÀ8ÀûÃÐGÃð›Ã@YÃÐ5Ã@MÃ@ÜðóÃÐÊÃà€ÃPð”ÃP¶ÃPÃ0©ÀÃpQðÃàëà ‚ÃÀ2ÃpQÃ`0ÃÀ Ãð} Ãà ŽàaÃ@ÃðçàÀà  ÃP€ÃÃpÎÃЬ ðX!ÃpÈÃðÃÀ‹Ãp9!Ã` "Ã@A!Ãànà ˆÃÒà p!ÃpWÃ`›Ãàµ%ÃP\#ð^ à j"ÃÀä%Ã`ƒ#ÃPÙ#ÃàV Ã[à Ã0#Ã°Û Ã4Ç!ÃàJ"à%#Ã0£Ã.ÀïÃ`§ðpÓ#Ã`ú$à ÿà®!Ãp? à j"à ^$à%Ãðk#Àã ÀZ"Ã@G ðÕ!Ãà\Ã0&ÃÒà %ðR"à%#ÀË$ðÃ$à í!ÃàÓ ÃÐGÃàåà ç"ÃPÇ&Ã0 ÃpÈà=ÃàV Ã`¡ÙðpÃÃ` "ÃÐ#Ã@SÃвÃ0!ðjÃPžÀ„ÀÝ!à¢#Ãp!%Ãp¤$Ãæ&ÃÀU(Ù"à$à Ã@;"Ã0 ÃàhÓÃPtðdðÃ$Ãðe$ÃC"ÃÀØ'ÃàÇ"Ãðq"Ã0 ð½%À`!Ã0 À`!ÃÒÃ0$à$Ã°Û ÃÀ!ðX!ÃPñà p!Ãp-#Ã@ÊÀB&Ã` "Ã@G à ÿÀlÃР"Ã@;"Ãð_%à %ëÃ.À„à´ à á#Ãàßà=ÃÞà ‚Ã@MÃ@âÃ0£ðíÃ0£àºÃPë à !ðL#Ã@)%Ã`‰"ÀéÃp? Ã( ðáÃ0µÃ0!ÃððjÃÐ)!Ã"!Ã0,ÃØÃиÃ@Üà ÃÞÃÀÃ` Ã0‹#Ã{#à ùà ÃPñðóðvÃðô!ðíëÃðÃPn ðdÀlðdà ÿà Û$ÃÐ#ÃÐ;Ã@ÊÃðÃÐ;ÃÃPtÃиÃP†à ç"Ã0#àIðçðçýÃsÃàtÃð‰ðÃÐ;ÃЦ!ëñðX!ðL#ÃPV$àºà ÀïÃàD#à /ðàmÃÃgÃP÷ðjÃ4ÃsÃð¡ÃgÃpÔÃðÃ0!ÃÐ5ÃI!Ãð} ÃÃÀÃ0»Ã`§ÃÀÃpEÃð¡ÀõÀûÃpÎà ÿÃð ÀÃpiÃ02Ã.ÃÞÃpWÃ`§ÃðÀûÃ`§Ãàbà Žà ÿßðvà ŽÃà€ÀŠÃpKÃ"Ã¥ÃÐSÀlÃP€ëÀÃP˜À~ÃÀÃpQñÃ@_ÀõÃ0>Ãàtð|ÃPÍ%ÃÀê$ÀÃ@kÙÃ0!ÃPtÃð$ÃPÃ0µÃЬ ýÃàtÃÀ ÀÃà€Ã@ÐÙÃyð‚ÃØÃÀ Ã0PÃäñÃ.Ã.à ˆÃð¡Ã@ÐÃ0£Ã@MÃ0ÇÀõÃØàOàÌÃð àOðˆÃÐYÃÀÃ[ÃPzÃpàÃÐ5ÃÒÀõÃ0¯Ãð ÃPýà ðŽÃPýÃàzÀ`!Ãø#Ãð‰Ã@ÐÃ@ÊÃÐAÃ:Ã@_Ã0 ÀrÃ( Ã08ÃpàÃð•ÀÝ!ÃиðçÃÐÊ÷ÃàbÀrÃЬ ÃP€à šÃà†ÃPÃpÚÃÀÃ@ÊÃ0&ð‚Ã`BÃð‰ÃÀ©ðÿÀ–ßà ‚À„À„Ã`HÃ`Åà šÃ`ÅÃ`ÅÃLÃ4Ãà\ÃÀ¯ð¬àUÃ`¿Ãsà ¸à ¬ÃÐ;à Ãðq"Ã`­ÃÐÐàÆÃ(Ãð¡ÃÀ2ÃêÃð<ÃpiÃ0bÃÛÃ4ðÿÃ0DÃ0ÓÀ„àÀð|Ã0ÇÃðw!à v ÃFÃP ÃÐGÃPàÌýÃ^à ¦ÃÏÀxÃ[Ãpià 5Ãà€ÃоÃ"à ùÃP Ã@ÜÃðÃ0ÍÃÀµðÃà ¦ÃpWÃ"Ã@îà ÃpÔÃàtÀ¢Ãð³ÃsÀûÀŠÀ„Ã@_Ãð¡àOÃPýàêÃFà ÷àêà[À ÀÀÃÀà ÃpQÃpàÃ@úÃÀ¯ÃaÃÀJÃÀÁÃàtÃð0ÃÐÄÃà[Ã0ÍÃ0"Ã0#ÃÀ¯ÃÃ@‰ÃíÃà’Ã0ÁÃ0V÷ÃPÃ`›ÃàP!Ã@kÃP’ÃPŒÃÀÃ`¹à À~ÃpÚÃpÈÃØÃоÃP†ÀxÃÀ—à[Ã`³ÃðÃÞÃÐÄÃÐAÃpÚÃÀ,àUÃmÃàëÃ0»ÀÃ0JÃêð|ð‚àÒÃ`*Ã`6ÃÀ—Ã:Ã`ÅÃ@ÖÃÀ‘ðóÃ4ÃP†ÃÐAÃÀÃÀy"Ãð à ”ÃPýÃ@ôÃàtÃ`‰"ðX!ÃÀÃPtñÃpoÃàßëÃÀ»ð à ‚ÃPÃ0,Ãð‰ÃI!ÃÀÃàÙðvÃÐ#ÃpKðpÃ@ëÃÐ;Ã08ÃP÷Ã0 Ã@A!Ã0ÁÃ@ÊÃ@G ÃP Ã@âÃ0>Ãàà ²ëÃpÎÃÀÃP À`!Ãðw!ÃàÇ"Ó#ÃäàÌÃ0µÃ[ðíÃ`<ÃÀ,ÃÞÃÀÃàzÓÃ0&ÀïÃp¼ Ã@G ÃиÃ[ÃP€Ã@kàUÃÐÄÃà€ñÃÐÄÃÉÃÀ&Ãgà ˆÃÀ,Ãð¡ÃPÃÐÄÃP˜ÃpøÃ0ÁÀÃÐSÃÛÃPñÀŠÃöÃðÃðÃ02ëÃLð”Ã0©Ã4Ã0»Ã0¯ÃànÀrðùðX!ÃÐGÃP¶ÃÀÁÃpÚÃPzÃÐâÃàzÃPÃð‰Ã@ðvÃ4ðÃÀ£ÃðÃ@èÃÀ©ýÀrà ‚ÃPzàIÃÀ ÃÃàýÃ^À„ÃÐSÃpQÀrÃоÃ`BàÞÃPÃpìÃ@ÃàÃPÀŠÃ0µÃpæà ¦Ã`NÀà ²ÀÃÀÁÃ`ÅÃ@eÃÀ£àmà /à[ÃÀ¯ÙÀ~Ã0JÃð¹Ã0ßÀÃ`fðˆàÞÃP°ÃíÀ¢ÃÀ&Ã0JÃ@eÃ`6ðÃ0JÃ`ãÃPÃ4ÀÀÃÉÃPÃP˜ÃÐqà ²Ã0Pà 5ÃàÃÀð ÃàØðÃÐâÃ`*ÃpòÃÕÃÀÇÃpìðˆð”Ã08ÃpuðàyÃ`TÃÐkÃÐîà ”ÃÐeÃÐÐÃÃà 5ð¦Ãð0ðjÃà’Ã`ËÃð÷ÃpoÃ0VÃð­ðÿÃpìà[ðÿÃÐÄÃÐÄð|À ÃpøÃÀ>ÃP¤Ã`ÅÃÐqà ¦Ãà€Ã@âÃ`¿À%ÃÐ_ÃdÃÐÐÃÀ&ð^ àÆÀûÃ`NðÃð§Ãð0ÃÀ2Ã@îÃpcÃ0>ðíÃÀ,ÃFÃ( à ÿÃaÃÐSÃ`*ÃàtàIàØÃ@âÃ`<àÆÃØà d#Ã`#ÃÐÄÃ`<ëÃÀ… ÃЬ ðíÃàÓ Ã°pÀ Ã`§Ã`­À`!ÃК#ÃÀy"ÃI!ÀŠÃ@èÃpÈÀã à$ð4'à ç"ÃC"ÃäÃÀ"ÀË$ÙÃàÓ ÃÀ‹Ã0$Ãp¶!Ã@_à Ãàµ%À`!ÃPzÃPtÃàÇ"Ãð•ÃвÃ0©ÃÕÃà\Ã`!Ã0—!ÃpEÃ@SÃàhðpà ”ÃÐÊà ‚Ã` ÃPñÃpÂÃàÍ!À~ÃÐÜðvÃ0µÃp9!ÓÃ.ÃÀ©Ã.ÃÀ—ÃÀ‘Ã0 ÃØÃàP!Ãp3"ðR"àÀàIÃÀÃ`• ÃÃà ˆÃ@kÃÕÃÀ… Ã@)%ô$Ã`›ÀÝ!Ã0£÷Ã02ÃP€Ã"Ã`›Ã02ÃØÃ@ÃàñÃ0¯ÃÐSÃmÃ@YàºÃ Ã°Û Ã“Ãð­Ã`*ðóÃ[Ãà€ÃpKðdÃ"Ã.Ã@_à d#ÃPb"ÃPŒÃpKÃ(Ã`›Ã0,Ã@G ÷ÃPŒðíÃ`!ÃêÃpcÃpÚÃ@_ÃÐÐÃ4ðóÀŠàÆÃàð‚ÃpÈÃÀ Ãð ÃÀ,ðvÃÐSà šÃÀ&ÃP€ÃÐ)!ðçÃ`§Ã` "Ã@èÃêðçÃpÈÃÃpÎÃàÍ!ÃPŒÀûðvÃpuñÃPÃÀ¯àaÃàtÃà€ÃðÃ"!Ã`›Ãp]àOÃàëÃ@ÃpÎà ÿÃàëñÃð‰ÃÀ©ÃpÔÃ:ÃP¤À„Ã02ÃPzÀrÃ`<ÃÀ&ÃÐAÃàñÃmÃ0>ÀÃäàÌÃÐ;ÃÐMñÃ`*Ã:à ÃР"Ã%'ÃPÃð¿à )à 5ÀïÃ02ÃyÃÀ>à ùà ÃàzÃmÃP†ÀÃ0 àgÃPñàºðpðùÃ:À Ãð<Ãð¹Ã…Ã0ÍÃÐÊÀéÃ0ÁÃ:ÃÀ©ð|Ãp]Ã@Ã0ÍÃàýÃà!ðÃÃÃsàÆà ç"ÃPÃ0ÓÃÉÃÐkÃð‰Ã`6à ŽàÒÃ0VñÃànÃ0DÀ„ðpà à šÀ¢ÃPÃpKÃgÃp¼ ÃFÃÀ,àäÃÐeÃÀ¯ð”À„ÃÀ Ã`0ÃÃÃà÷Ã`¹ÀûÃÃpòÃðÃ0µÃ`<Ãðð^ ÃP†à ”ÃÞÃÐÜßÀÃ0ÓÃ0ÓÃ`NÀœÃPÃ@èÃ02Ã@ôÃpòÃ0ëÃ@Ã`<ÃÐèÃà ÃpuÃöÀŠÃPžÃÀ8ÃöÃPÃð6ÃpÃpàÃP€Ã`³ÃP¶ÃÀJÃRÃÃÀŠÃ`0à ˆÃ0Íà ²ÃànÃpìÃÐâÃÏÃ`*Ãð•ÃLà Ã@Ãð$ÀœÀûÃpKÃð6Ãp? Ãð*Ã0ÍÃpàäÃ`¿ð”ÃpæÃð*ÃÐGàÌÃpìÃ0ÍðËàØÃäÃ4Ã@úÃP¤ÃpòÓàUÃàýðÃP€Ã@ôÃ0ÍÃP-ÃÐèà Ã:ÃÀ Ã@ƒÃÉÀ Ã0ÓÃÐYÃ0ÍÃÐ;ÃàP!Ã08ÃpuÃð§à ÃàýÃ@âÃpcÃÀ»ð#Ãpcà ÃÀÍðÃXÃÃ@ƒÃÀµÃ0ÍÃP'à  Ãð*Ã@qÃÐSÃP ÃÀ&ÃÐSÃçàêÃÀ&ðÃÐkÃàËýÃ`HÃÀ»ÃpæÃ@èÃ`¿ÃÐMÃpiÃÐYà #Ã`TÀàØÃ0VÃÐôÃÃð$Ã@‰Ã0bÃpÃð§ÃÐ5Ã`¡ðÃÐÖà ÃpøÃ`ZàØÃÐYÃyÃÀ£Ã@ôÀÃÐèÃÀµÃ‹àmÃêÃÀ¯Ãà ÃÐSÃ`­ÃÃÃÃÀ,Ã@_ÃàÃÐ}ðšà ÃpÂÃ@qà´ ÃPŒÃÐîð/ÃÀbÃP¼ÃjÃ`ZÃðÅ×à )Ã"ð‚Ã0>Ã`ËàðÃLÃ0ÙÃpæÃànÃpKÃ:ÃPªðˆà ÃÀÃÉÃð<à AÃP¤Ãð ÃÐèÃÏÃðÃðÃÐeÃàÃP'À1ÃÃPÃ`0Ã0ÍÀÃPžÃüÃPÀ ÑÃÐÖà ÓÃ@èÃÀ©Ãpæð ÀÃ@eà ¦ÃÀ©Ã@ƒÃÃÀÃ`<ÃÀÓðÃð•à ²Ã0ÙÃ0VÃ`³ÃP€ÃÐAÙðÃÃ`ÅÃàýÃ0ÇÃàzÃ0>à Žà ”ÃàýÃ@à šÃ@eÃÀµðvÃ[ðùÃÐîÃÀ>Ãà†À®ÃÐúð Ã4ÃêÃ@qÃpþÃ@èÃPžàðÃ.ÃÀ£Ã@eàØÃ.Ã@ôàêÃÐ_ÃP†ÃFð|Ãð§Ã08Ã`¡Ã0¯Ãð§Ã0ÙÃÀ,àÌÃpÔÃ0\Ã0bÃÀ ÃaÃ.ñÃpWÀœÃXÃàýð‚Ã…ÃàŒà #À–Ã`BÃÐîÃÃànÃ0»ÃÐÊÃ`ÅÃðHð¦Ã@úÃ`ÝÃð<Ã@Ã:ðdÃ@wÃÀ>ÃP¤Ã`¹àÒÃ@qÃÏÃÀ©ÃFÃ`BÃáÃ@§ÃPÃðÃÐÐÃð¦ÀÃÐÖÃyÃð0Ãð­ÃàbÃà÷ÃpÃÛÃüÃFÃPžÃP†ÃàñÃ@ÖÃðàêÃð*ÃüÃáÃ`ÅÃÐÊÃàÃ^à ²ð”Ã0ÁÃ0ÙÃjÃpøÃÐ_Ã^Ãð$Ã`NÃð*Ãð0àêÃ`*À ÀlÀÃpuÃP'Ã`×Ãð$ÃðÃ`TðŽÃP'àÞÃÉÃpÃLà Ãð¹ÃyÃpìàÀÃ@ÃpÚÃÐ_à 5ÃàŒà ¦à ¦ÃLÃ`ËÃ@ôÃpoàÃðHà Ã0PÃÀ8ÃXÃÐÖÃÀ£Ã0>ÀÃ@ƒÃàÃ`ÅÃðBÃÐeÃP-Ã`ZÃà€Ã…Ã:ÃÀ£ÃÐSÃüðÃàzàsÃàåðáð#À´ÃðBÃÐ Ã`ãÃà àgÃ`ZÃ@À Ã0Dà ÃàýýÃÀ2Ã@ÃÀµÃð­Ã(àØÃÐÖÃmð‚À„ÃÐÊÃpcÃpÚÃ@ÜÃ`6ÃPŒÀïÃP†Ã08ÃüðˆÃyÃð$Ãà ÃÉÃ`ãÀÀà )ÃÐúÃÀ©Ã0ÙÃ@}Ãà Ãð¹ÃÀDð”Ã0VÃpøÃpuÃ@Ãð¹à  Ãà˜à ÊÃÃ0ÍðÿÃÐ}Ãp‡Ãà’Ã0\ðŽÃÛÃÐwÃ(ÃÐAÃpàÃyÃpòÃàtÃÐMÃÐâà=ÃàýÀÃÀ¯ÃyÃpcÃÀàCÃpKÃ@úÃ@}Ã|Ã0ýð)ÃpuÃÐèÃÃ`×à AÃÀ\Ãdð;à ÊÃð¡Ãsà ñÃð<àmÀ%Ãð³Ã@ÃÀ>ÀÃðÃpÔàaÃ¥ÃàzÃ@qÃ@îÃ0»ðÃÐâðŽÃàÃÀ£ñÃ0VÀÃØÃÀ2Ãp{Ãp{Ã0ñÃàÃ@èàaÃ@ƒÃ0ëÃ0>ÃP'Ãð³ÃpìàöÃ…ð¦ÃÃÃ0>Ã`¿ÃP à[à šÃ@èÃ0ÙÃÐîÃPªÃð•ÃäÃ0,Ã08ðÃ4ÃðÃÀ»ÃÐGà #ÃÀµðÃpiÃ`¿ÃPÃ0\Ã`ÝÃpoÃàzÃ`¹Ã@ð ÑÃ`ÑðˆÃÀ ÃÏàðÃàÃP¤ÃÃ`NÃÃÃ`×ÃÀµÃ0ßàÒÃêÃÀÃÀµÃ0ÇÃÀÃÉÃPžÃ`<ÃÀ÷ÀŠÃ0ÇÃP!ÃàÃP’ÃpcÃ[Ã08ÃP†à ÃPŒÙÃpKð|ðŽÃsÀÃ0µð”ÃêÃ`ÅðpÃоàÒàaÃðÃðˆÃÀ2Ã0ÇýÃP’Ã`6Ã0µÃàbÃÀ!Ã"ðˆÃ0ÁÃ`­ÃÀà ˆÃpQÃðú ÃàëÃ@ÜÃиÃ0»ÃP˜ÃPýÀÃPŒÃPn À„ÃöÃ0>ÀõÙÃàzÃPÃ`0àØÃàÃ`³Ã`w%Ã`³Ã`Ëà[ÃÃ0ÍÃ@Sðvàmà ÃÐGÃ@èñÃàhÃÀ‹Ãmà Ã@wÀÃ`<ÃPÃP†Ã0ÙýÃ(Ã02ÃÐAðíà[ÃFÃÃðÃÐÄÃPýÃêð ÃààaÃàñÃ`­ÃÐÊÃàÃÀ©ÃPÃ`NÃpàÃðð|Ãð$Ãà÷ÀïÃpWÃPÃàëÃàtÃ(à[ÃàÃÐ5ÃÃð÷ÃFÃyÃ@eÀÃðÃ`$Ã@ÃpÈÃÐÄÃ@SÃpÎà ˆÃpÔÃ0£ÃP ÃäÃ0ÇÃP˜Ãp°"à1!Ã.ÃÐ_Ã0ÇÃÕàOÃPÃP¤Ã`ËÃÃpÈàØÃð¡à ˆÃàëàÒàÆÃиà Ã4Ã@eÃ.ÃÐMÃÐMÃPŒÃàtÃÐÜßÃP†ÃP Ãà\à Ã@ÐÃàßàOÃÐÄÃàbÃP Ã@ÐÃà÷ÃàŒÃàŒÃ@ÃP€ÃPn Ã@âÃàÓ ÃPà ŽÃðÀxÃP†Ãäà ŽÃÀ‘ÃöÃ`¿Ã`6Ã0»Ã`HÃ0DðçÃ02ÃàëÃpWà ŽÃ@k÷ðíÃpìÀÃð•ÃLÃÐÖÀ Ã@ÜÃàÃ…ÃÀ&ÃÀ Ãð›ðjÃPÃиÃÃÐYÃP Ãp]ÃÀÃpEðùÃÀ>Ã@ÖÃÀ‘À ðÿà[Ãð ÃàñàÀÀïðÿÃöÃÐMÃоÃðÀÃ`ËÃÀ ÃÀ Ã08Ã0ÇÃ@Ä ÃUÃ`›ðçÃÀ,ÃÀÃЬ ÓÀxÃ`*Ã0DÀ~Ã`³ÃP à ŽÃÀÃоÃPtÃp9!ÃÀ—ßðíÃðâ$ÃPtÃÀ©ÃÐAÃPë ÃPë ÃàP!Ã@ÖÃÐÊÇ!Ã`• àÆÃ.Ã` "ÃÃÐ5Ã@G Ã@Ã`HÃ(Ã"Ãp¼ ÃP÷ÃpÎÃ`§à ÃðƒÃPñÃÀ!à |ÃpWðjÃÀ‹ÃÀÃ0"ÃàP!ð|À~ÃÀ‹ÃðÃÀ‹ÃÒÃ@ÐÃànÃ0DÃàÃ@eÃð à1!Ãp¶!ÀûÃ@eß!Ã0 ÃиÃ@qÃÀ»à ðáÃàÙàÒÃðÃ@ÜÃ`¿ðçÀlà%#Ãà>$Ãð àOÃ@MÃp9!Ãp¼ àCÃà÷Ãp]Ã@MÃ"Ãp3"Ãpž%ÃðÃÀ,Ãð} Ã.ÃPV$ÃI!Ã`¡ÃpÔðíà !ÀéàºÃÆ!Àã àIÃ@ÖÃPtÃöÃÐMÃaà Ã@G ëÃpc÷Ãp? ÃPë ßÃ0!ðjÃ@ÐÃÀ Ã.ÃÀ‹ÃàtÃüÃPtðáÃ0,Ãgà à1!ÃвðdÃ08ð^ Ã¥ðvÃ¥Ã"!Ã@YÃÐSÀÃP€ÃPýÃà÷ÃÀ… à´ Ãp¼ ðX!Ã$Ã"Ãð à=Ã@ÐÃÀ ÃP à ÃP ÃgÃpQÃ`NÃ`¿Ã08ðÿÃиÃp¶!Ã@G ðíÃ0µÃÐÄðóÃ0£Ã`­Ã:Ã0»Ã0!Ãð Ã0&à ÀïÃ@ÊðpÃàbÃp9!ÃàëÃàñÃððÿÃêÃp]Ãð›Ã0£ÃpWÃÀÃànÃð§Ã`§ðíÃpÚÃ@úÃ`NÃüÃP†ÃpWÃ` ÃÀ‘Ã°Û ÃоÃ`§ÃöÃ@_ÃüÃ@qà |Ã0!à ùÃp]à #à ”Ãð›Ã`<ÃpÚà #Ãpòà ¬ÃðÅÃ@ðˆÃ`BÃ@SÃ( ÃpQà À~ÀlÃÀà=ð‚ÃpiÀÃ0>ÃP Ãà†ÃÐMÃpiÃ08Ã@ÖÃÕÃÏÃ`³ÃÐSÃ0»ÃPžÃ`ÑÃÀ2ÃÀ8Ã`fÃpòÃpWàIÃpÔÃàtÃðÃpiÃð<ÃüËÃRÃÀðóÃ@÷Ã@èÃð6ñÃðÃÐYÃpuÃð§ÃÀœÃð0Ã^Ã@wÀ àØÃpÚÃP¤ÃP°ÃÀ2àäÃ`³ÃpuÃP°Ã`Hàêð‚ÃÐkÃ`TÃ@ƒÃÐÊÃ0>ÃÐkÃpìÃ`HÃà GÃÛðÃÀÁÃ@qà ”ðÃà†Ãà¤Ã0JÃ0DÃÀ8Ãð$Ãð6Ãà÷ÃsðÃpøÃPªðŽÃàýÃàÁ#ÃPžà 5ðˆÃP°àÃðËÃ0ÍÃ`ËÃà†ÃÐÜÃ0>ÃÐ_ëÃÐÄàIÀ à #ÃðÃPÃÀ¯ÃüÃdÃÐeÃP¤ÃöÃÀ,ÃçÃPÃpìð‚ÃpÚà ðàäÃpoÃÀÃpÚÃàÃÀ>àgà )ÃsÃ0µÃÀ ðóÃÀ©Ã@èà ðšð”Ãð$Ã`ÝÃjÃöñÃ0ÙÃíÃ@qÃÐÖÀÃ`ÑÃð§ÃpWÃ0ÇÃÀ„ÃÕÃÀ©à /ÃLÃP!à  ÃpoÃP¼ÃÐYàØÃàñÃsÃFÃÐYÃ`¿à  Ã@ôÃÐeÃpæÃ`­ÃÀ2ÀœÃ0\àaÃàð à  ðÃÐÖðšÃð0ÃÀ>ÃàÃÐYÃÏÃÐkÃpøÃpà ;Ã@qÃ@à /ÃpæÃ0VÃÃpÔÃà†Ã`¹ð ÃÐúÃðZÃÏàgðÿðÃàëÃ0ÇÃÀ2Ãð¹Ãð6ðÃàŒÀÃÉÀœÃÀ‘ÃÐÖÃ0hÃ@eÃÐÄÀ~÷Ã0¯Ãp¶!À„À~à /ÃÃàýÃðà /ðà #ÃàýÃFÃp]àÌÃÀÃ.Ãp{ÃðÃ`$à  à ùÃüÃÛðjÃöðˆÃ@ƒÃ4àÆÃ`$Ã0JÃð$ñÃP!ÃpÎÃ`• ÃäÃðÃpEÃÀ‹ÃÀ©ÃðÃÀ,ÀÃðÃP÷ÃpWÃð›ÃÀ‘à ”Ã0ÇÃp]Ã@kÃÀ©ÀûÃ@YÃÐAÃLÃÐGÃð•÷ÃöÃ`¹Ã0>Ã0»ÃÐ;ÃÃðÃPžà šßà àä÷ÃàñàUÃ0µÃ ÃPŒÃð‰ðL#Ã.ðÃFÃP ðíÃ`³Ãà†ÃànÃ0µÃPÃPŒðpÃ¥Àõà ŽÃpKÃà\ÃpEÃÐÄÃ`6ÃоÃðÃÀÃðÀlà v ÀïÃàzÃ0©Ãð} Ã`›Ã0 ÃвÀéÃPzà ÃP÷ÃÞð‚ÃÕÃP†ÃpÚàØà #÷ÃUà p!À„Ã0PÃçÃÀ»ÃPžðÃÀ2Ã@âàÀÃÐ)!Ã02Ãöà  ðdÃØß!ÀxÃPñÙ"à ˆñÃ`¹÷àØÃPªÃ0\Ã`ËÃp]Ã@Ä Ã à ¬ðÃ0JÃ@ÜÃ`<à ˆÃÐMÃPŒÃ08ÃpÚà 5ýÃPÃиÃÀÃpìÃPÃP!À„Ã`³Ã`BÃ`ËÃ(ÃpcðÃà ðÃ@eÃ0¯ÃÐSÃà€à /Ãð6ÃÐSÃ@Ã08Ã@ÜÃP€ÃP†Àã ðíÃp{àgÃÉÀ+Ã@ÜÃ0ÁÃ`›àUÃÐYð Ã`HÃÀ,Ãpð Ã08ÃP3ÃÕÃpìÃà€Ã`TÃÉÃ`ËÃðÃPzÃ@SÃFàÀœÃ0\ÃpiÃ0bÃðNÃFÃвà ÿðùÃP!Ã0Ùà  ÃLÃÐkÀ%ñÃð$Ã`<ÃÀ ÃðÀrÃ`¹ÃàzÃgÃ@qÃ0DÃjÃpòÃ0ÇÃð0ÃpÃ`ËÃP’ÃPÃÞÃÀ,Ãð›Ã0©ÃO àCÃPÃpQðáÃÀ£à #Ã…ÃàŒÃ@úàØðÃà’Ãð¹à ¦Ã`ËÃðÃpòà ŽÃÐAÃÀ ÃÕà ¸ÃÐSàUÃð*à ÃpòðÃÏÃ0ÁðÿÃÀ>Ãð¹ÃpÃÉà ˆÃàŒÃ@kÃpæÃÛàgÃöÃsðdÃ`¿Ã@wÃð³Ã@wà ÃPŒÃpoÃP’À ÃÉÃ@ôÀ%Ãð¿ÃÕÃÐÊÃ@qÃ(ÃðÃ`ZÃÃÃÏÃpòÃ0ßÀ¢àaÃ`³ÃÀà ²ÃLÃpcÃÐÐÀrÃpÎÃÐ_ñÃPÃÀ¯Ã@ ÃPªàmÃànÃ4ÃÃ`6ÃÆ!ðíÃànÀûÃ`¹Ãpìð ÃpìÀà ¦Ã`<ÃàÃÏÃ0>ðÿÃÀ8ÃÀ ðÃà€ÃÀ&Ã0ÁÃð¹Ãà˜Ã.ÃP Ã@YÃð•ðíÃpcÃð¡ÃÀ2ÃP’àÒñÃàtÃ`¹Ã08ÃÃÃ"ÃÐGÀÃ@qÃÀVÃXÃðàyÃêàOÃà Ãð6Ã0ÍÃ`¡ýÃ¥À–ÃÃ@wÃpoÀðŽð‚Ã@ÖÃÃÃmÃ:ÃÃÐMÃ@kÃÀ—ÃP3ÃðÀ~ÃÀÃ@ÊÃpEÃgàÞÃ0ÓÃpÚÃ0ÍÃànÃàñÃRÃ@ôà 5à ¾àÒÃ@ÐÃð$ÃÐÄÃ@kÃÀ8à šÃ@ôÃPŒððÿÃmÀ Ã@Ã`$ÃÃàñÃð*Ãð•ÃpQðùÃpiÃÉÃÀ»Ã0ßÃP¤ÀÃ@_Ã(Ã@ôÃÉðÃÀ ÃPýÃÀ¯ÃàhÃêÃpcð”àØÃ0bÃ@Ã:ð|Ã0ÇÃðÃpìÃÐÐÃ@îÃàðÃpìÃÀ©ÃXÃ0ÓÃð¹ÃFà Ã0JÃ08Ãaà Ã@‰ÃRÃà€ðÿÃpàÃÀÃ@îÃ`TÃXÃ`<ÃàßÀ„ÃÀ8ð ñÃ@ÖÃð­à #Ã¥ÃàV Ã`*Ã@ÃP!Ã`0Ã@èÃð0àOÃpWÃÉÀŠà šÃaÃ@_Ãpþà ¬ÃðƒÃàV ÃêÃpuÃ`fàÃ^ÃÃÃÐAÃPÃàëÃÀ£ðŽÀŠÃÃÃp]Ã¥ÃðÃÕÃàÃÐ_ÃpàðàäÃ`HÃ:ÃàhàOÃÛÃÀ>Ã4àÌÃRÃÛÃÃP¤Ãð¹Ã0ÍÃ0DÃÐÊÃð6Ã…Ã@úÃpàÃöÃð¹ÃÀ ÃÀÃP-ÃÃ@wÃ0JÃð6ÃÃÐâÃð§Ã‹ÀÃpìÃ@}Ã``Ã…ððÃ`Bà ;àgÀ–ÃPÃ`³ÀàaÃàÃð§Ãà ÃÕðÃÐkýðùàOÃPÃRÃ@qÃÀ¯Ãàýà )àÞÀ¢à ÄðÃRÃðBðÃRÃP3à ¸ÃÃ`HÃ0VýÃËÃsÃXàgÃpøÃp{÷ÀÃpæà 5à ¦ðÃPÃ@qðùðíÃðÃüð¾àmà7 Ã0ÓÃp]ðÃ0ýÃPžÃ0VÃPªÃÃÐkÃÐÜÃüÃPÃ@wÃÐÖÃöàÆÃ4Ã`$Ã`<àmÃÃÉÃÀ>ÃÏÃðð²Ãð<Ã`$Ã02ÀxÀïðˆÃà 5Ãð•ÃàV ÃÀ8Ãð­ÃPÃÐôà ¦Ã0ÍÃðÃpcÃêÃоëÃÐMÃ`×Ã@úÃ@îÃ@eÃðÃp? ÃPŒà  à Ã`BÃànà=ð ðŽÃP’ÃàýÃð$ÃÐ_à[ÃPŒà ðóÃ@_ÃÕÃLÃP˜àIà ˆÃêÃPÃ`HÃ`NÀ„ÃpÔÃäÃP ðÃ0JÃ0£Ãpuà ¦Ã4à ýÃ0µÃðàÌÃÐGÃÃ@ÖðÃLÃPŒÃ08ÃÐ;Ã08ÃêÃ@kÃÀ&à |Ã`*ÃàzÃàñÃ"ÃàÙÃ@eÃ0PÃ:Ãà€Ã0ÁÃP÷à7 à ˆÃàŒàöÃÀÃ`¡à !àÆÃànàºÃ0¯ÃÞà ‚Ã[ÃPë à í!ÃFÃð³Ã@Ãð¹ð‚Ã(ÃpQÃÀ©ëëÃànÀõðùÃ`³Ã08Ã@ÖÃUÃ`ÑÃ`ÑýÃpÚÀŠÃáÃpKÃÐGð‚ÃöÃÞÃ`¡ÀÃÀ£ýÙÃ`$ÃP àäÃ0ßÃLÃPzÃpcÃðÃ"ÃpEà )Ã@ðdà ”ÃP÷à ‚ðpÃ0 ëÀéñà ŽÃðð|Ã0>ðˆÃ0µðˆÃ02Ãðú ÃgÃÀ‹ÃÀ‹Ã@G ñÃ`BÃ@îÃÐÐÃð•à ˆÃ`0ÃpiÃÀ¯ëÃ`<ð‚ððpðáàÆÀ–ÃP†ßÀ`!Ã°Û Ã°íÃÌ Ã°áÃ08Ã@Ã`*ÃÃÃàëÃ0,Ã:ð^ Ã` ÃðÃðÃPýÃ4à ”ÃpàÃFðùÃ0¯ÃpæÃ`Bà 5ÀßÃà\ÃFÃ0»Ãð‚ÃpæÃ`HÃÐSÃÀ ÃpÔÃ@âÃÞÃ0>Ãð¡ÃÐYÃ`­ðR"ÙÃðÃ@Ãàžà—ð à1!ÃÀ… àÀÃ0©à ¦ÃPà ¦àaÃ@Ãð­ÀÃÀ,ÃpcÃ`H÷ýà$Ã`$Ãà÷Ãà÷ÃFÃÀ—ÀÃ0DÃÀ»Ãà€ÃPh!àÆÃÃ0åàgÃ@ÜÃäÃ0ÓÃ`HÃgÃaÃPÃpÚÃànÃPžÃÀà À~ÃpWÃð$ÀrÃpÈÃ0©àIÃà†Ã@Ã@SÃ@ôÃð*Ã0DÃ`0ÃоÃ(àØÃ0 Ã0µÃàýÃð›Ã0»ÃäÃ0ÇàäÃÀ»ÃàbÃÐSÃÐÐð ÃÀDÃð¹à  ÃpàÃð} Ã`Ã( Ã`0Ã@_ëÃ0»à ŽàÆÃ0Á÷ÃyÃðÃÐèðÿÃPÃàØÃ`­ÃÀ&ÃpøÃ`¹Ã`0ÃÐSÃÀÃðà ðàaðÃð0Ã@îà šßÃpæÃÐÊÃpÔÃPÃÀ‘ðçàÒÃPýÃÀ8ÃP˜ÃPžð Ã`*Ã`BÃÐYð|ÃP†ÃÀ ÃànÃpKÃ4ëÀ~ÃвÃ0¯Ã@îÃÀÁÃ`³Ã0µðÃPžÃ@ôÃpKà ÃsÃPÃÐÐ÷ÃðÃpÃ`HÀ+Ãð¹À~ÃÀ©ÃÀ2ð‚ÃP ÃÐÖÃð0Ãð§÷÷à Ã0JÃ@ÃyÃ`¿ÃpiñÃ`<àÒÃsÃàzÃP Ã`­ÃÀ£ÃÀÃäÃð§Ã`ÅÀàäÀ¢ÃÐYà  à ¦ÃÐeÀÃ`³ÓÃà€ÃðNÃÀÇÃðÃ`¹ÃÀÁÃ08ÃðÃ@kÃàŒÃð0ÃP!ð‚à #ð ÃP˜ëÃ0ÙÃð0Ã`6ÃPàgÀ¨à /Ã0ÓÃ0DÃ@ÃÃ0DÃÞÃàßÃÏÃ`¹Ãð•ÃPÔÃjàÌÃðÃ`NÃ0VÃÐâÃð¹ÃpiÃpøðÃ`¿Ã0Áà #Ã`ÅÃPÃÀÃLðvÃØÃ:ýÃÕÃÀ¯Ã.ÃgÃð*Ã0PÃ`ÅÃpÚÃpàÃFÃsÃ@YÀZ"ÃànÃ0ÁÃÐqÃðfàsÃÀ—ÃÀ—Ã"ÃÃ`Ýðð”Ã0,ÃÀ ðÿàmÃP˜Ã0\Ãp{ñÃàñÃÀ&Ãpþðð|Ã0ÓÃ`Åð‚Ã`ÅÃ@ÜÃP˜ÃpÚðóÃ:Ãð§ÀÃPÃÀà=ÃP†ÃÀ ÃÞÃàhàUÃ`ÑðŽÃ`¹à Ã`¹ÃÀ¯ÃP†ÀlÃ0 Ã0 Ã@kà ÿÃиðáÃ(Ãð›ðˆÃ@úÃP ðjÃ`­Ã@G ÃpæàaÃð6àmÃ0,÷ÃpÈà1!ÃpÔ÷Ã`• Ãp¶!Ã0 Ã`!ßÃànÃÀ2ÃÐ_ÃÀ¯ßÃ08Ã(àIÃàÍ!Ã4Ã0µÃ¥ÃO Ã( ðùÃÐ_ÃpòÃ@kÃÉÃÐGÃð›ÃÐkàaÃðëÃÏÃäÃÀ‘ÃØÀxÃÐèÃðÀõÃ`­ÃÃgÃ0,ÀrÃPÀÃ@ÃpcÃÞà ŽÓÃP€Ã0,Ã`*ÃPß"ÃàÍ!ðX!Ã`¡À~Ã@ÖàÆÃàñÃpEà+"ÃÀ à ó Ã@îàgÃ@èÃ4ÃÐMÃ@kàIÃ@ÖÃðàØÃmÃ(ÃÐGÃÐGÃpÚÃ0>Ã`³Ã0µÃàtÃ`­ðvðÃ…ÃÀ£ÃÀÀõà àØÃsÃ@ÃàýÃXÃÐeÀ Ã0»Ã@eà )ÀŠÃ0&Ã@ÜÃ`*ÃFÃÀÃÌ ÃÐÄÃÐ/ ÀÃ0Íà Ãà\Ãð ÃpÎÃ0VÃ`6Ãà÷ÃjÃ@îàÒà ÃàhÃmðàØàÆÓÃpWÃ`<ðšÃ`<Ã@ÖÃðÃð•à ÃØÙÃP’ÃPŒà ó à àØÃð*à ÿÃp? Ã@YÃpuÃ0&à ÃpcÃ0 Ã`›À ÃðÅýÃðÃð*Ã@ÖðíÃ@ÜÃ@Sà ˆà ‚Ã0,ÃðàÀÃ@eà ŽÃ@ÜÃÀ,Ã08Ã`¹ÃP Ã` ÃЬ ÃвÃ@_ÃÐÄÃ` ÀrÃ` ÃpKÃÃPÃPÃ4ðÃ$Ã`›ÃàëÃ`ZÃP3ÃàßÃ0 ÃPtÃÀ‘Ã@âÃpEÃ`¡ÃðÃàP!à Ãð›Ã`BÃP†àÒÃ0ÍÃ`­àÀÀïà  ðpÃ`­Ã0Çà ŽÀÝ!Ãp9!Ã0£ÃðàäÃÀ»À–ÃP†Ã@ðóÀŠÃÒÃð Ã`›à !àOÃsÃ`¹ÃÛÃàtÃ08ÃÀàºÃÐ;ÃpKÃðÃ`ÅÃð›Ã°Û à ˆÀ„ðpÃÐGÃP€ÃÐAÃ0ÇÃpÚÃàñÃmÃàëÃÀÃ@YÃÐÕ.ÃPÃ`TÀrÃpQà ùÃÀÃPýÃàåÃ`­ÃÀÃ0µÃpÔÃðÿÃêàäÃð•à à šð‚Ãð§Ã`Ã.ÀÃ0»ÃÐÜÃöà àUÃ`ÅÃàññÃ0ÍÃà’Ã02Àf ÀûÃàýÃ0»Ãð*Ã0ÇÃ`­ÃàñÃpiÃ@ÃPà+"ÃÀ!ÃpiÃpWÃÀ£Ãà÷À„Ã@ôÃðÀÃànÃP’ÃàÃpcßÃ`­À~àOÃêÃP-ðvÃàñÃpìðÿÃð¡ÃçÃ@•ÃÃÃpÔÃàýÃÐ5ÃPÃÐYÃ@wàÞÃÀ—àCÃànÃÀ Ã0ÇÃÐèàÞÃ@âÃÐ5Ã`›à ÿÃÐAÃÀö"à1!ÃPh!ÃàD#àÀÃвà á#Ãp¼ ÃàÍ!Ã@A!Ã0&ÃàÓ Ã@Ä Ã p!ÃÀÞ&ÃPD'ÀN$ÙÃPn Ü(ÃÀØ'à&Ãà&(Ãàµ%Ãð;+ð@%Ã@š'à 4+Ãò$Ã(Ã&Ãpž%Ã0‹#ðÉ#ðF$ÃP8)Ãò(ÃP»(ÃP8)ÃP£,ÃÈ+à @)ð()Ã0s'ÃðÄ)à +ÃÀØ'Ãþ&ð«(Ã0‹#ÃÐŽ%Ãi&à X%Ãð¸+Ã@v-Ãà©'Ã@)%à~)ÃðÖ&Ãð;+Ãà&(Ã1%à%Ãðw!Ã0%Ãà¯&Ã=#ÃàÇ"ÃPÙ#Ã0g)ÃPµ)Ü(Ãò$è&À³(Ã?-Ã0%ÃI!Ã`_)Ã*À³(à–%Ã`ƒ#Ã`q&ð½%ÃðÖ&Ç%ÃÐ &ÃÀØ'ÃÐ|(ð4'Ãpt,Ãð¾*ÃK+Ã"Ã@ &Ã`q&Ãp†)Ãà)ÃðÊ(Ãà£(ÃQ*Ã&ÃP&,ð@%Ã`• Ã( Ã@ÊÃI!Ãà'ÃÂ,Ãà£(ô$ÃPÓ$à&ÃÐ'Ãì%Ã0"Ã`ú$Ã@ &ÃÐ'ÃÐj+Ãð;+Ãà'Ã0g)Ãà©'Ã`ô%àû)à ½)â'Ü(ð±'Ãðè#à R&Ã%'ÃÐj+Ãpt,Ãi&Ãi&ÃPÍ%ÃÐù(Ã@)ÃðÊ(ÃÐí*Ã0a*Ãø'Ãì)Ãp*à Ã(ÃÀC+àõ*ÃðÊ(ÃW)ðF$ÃðS'ÃÀÌ)ÃÀU(Ã@Ž)Ã@ˆ*î%Ã`S+à)ÃPD'ô$Ã`k'ÃÐÿ'Ãð;+ÃP0ÃÔ)Ãðú Ã@²#à Õ%àŠ'Ã0y&À›,ÃÐ'Ãà¯&Ãàµ%à Û$ÃÐ|(Ã`ú$ÃÀC+à ±+Ã`k'À¿&à„(Ã0g)ð+Ãp†)ÃÈ+Ãðe$Ã@)%Ã`ú$Ã0ü%ÃPV$ÃÀö"ÃP»(ð.(Ãi*Ö)ÃPJ&ÃPV$Ãpª#Ã`#ÃÀÞ&ð±'ÃÐù(ÃpŒ(ð4'Ãà8%Ãp(à Õ%à¢#ÃPD'ÃðS'Ã0s'ÃÀ"ÃÀm$À<'ð™+Ã](ÃÀð#ÃPÓ$ÀH%Ã0#Ãæ&Ãà8%ÃÀO)Ãð5,à É'ÃðY&ð·&Ão%ÃÀä%Ãà'Ã@ &Ã@)%À­)ÃðS'à Õ%à–%Ã&Ã{'Ãpª#ÃP2*Ü(ÃÀä%Ãø#Ã@)%ÃðÜ%ÃðY&à%#ÃÐ#À×"Ãp¤$Ã@”(Ã@(Ã`}$Ãp'ðF$ÃÆ!Ã0‹#ÃÐ%ÃðÜ%ÃÐ%à Ï&ÃðÐ'Ãðâ$Ã`q&à É'Ã%'Ãæ&ÃP>(ðÃ$ÃÀ"Ãиà%#Ã@5#Ãà£(à L'À6(Ã@#&à á#Ã0‘"Ãðô!ðX!à¨"ÃPÙ#Ãp!%Ã0m(Ãø'Ã@ˆ*ÃðY&Ã{'à®!à d#ð@%Ã0$Ã@²#ÃÀg%Ã%'Ã$ð^ Ãðw!ÓÃðô!ÃÐ#"ÃÐù(Ã0ð'Ã0ê(î%à ç"ëÃ`!ÃðS'à Õ%Ã+&Ã`ƒ#Ç%ÃÌ Ã0 Ã"!Ã`ƒ#ÃÌ Ãà2&ô$ÃÀs#ÃÐ)!ðçà á#ÃPb"à X%Ãp!%À×"ÃPÙ#ÀË$Ãð ÃÌ Ãà2&Ãà»$Ã@/$ß!ÃàÍ!Ãðô!ÀÑ#Ãp-#Ã0—!Ã0!Ãp¤$ÃÐ &ÃP\#Ã`#ðÏ"à á#ð½%Ãp'$ÃР"ÀT#ÃÀy"Ã`ƒ#ÃÀ"ÃàbÃà\ëÃO Ãà>$ÃÐ#"ÀZ"ÃPå!Ã0ê(Ã`ú$ÃàßÃ"!Ãäà Ã0£ðóÃÃpÂÃ`!ÀÅ%Ãà»$Ù"Ãð‰Ó#Ãà»$ÀT#À`!ÓÃ0&Ãð Ã`w%Àf ÃÐ#ÃPh!Ã[ÃÒÀÝ!ÃpÎÃ@MÃ.À×"à$ð±'ðL#ðpÃI!ÃUàÒà šÃO Ãp'$à v Ãðô!ÃÃpÈÃ1%ÃPß"Ã"Ã0—!Ã@/$ÃÐ|(ÀT#Ã¥ ÃpÂð^ ÃÀ… Ãàbà1!ÃpKÃO ÃÐAÃ"!ÃàÍ!ÃpQÃ`*ÃÀÃ0£Ãp¼ ÃàV ÃàhÃÌ Ã0!Ã0 à ^$ÃàÍ!Ã` à ÃÐ/ Ãðw!ðÃ$Ã¥ ÃÐÐÃ02Ã1%à j"ÃÐ#"ÃpQÃ@ÖÃC"ðÃ$Ãp-#Ãðî"ÀlÃðú Ã°Û Ãu$à j"Ã0µà ÿÀÑ#Ã`• ÃÐ)!ðX!Ãì%ðçñÃàÇ"àºÃвÃp°"ÃÀÃP†ÃÀ£àÀÃЦ!Ãà ùà Ã@G ÃPtÃÐ)!Ã`¡ÃàÇ"àCÃpàÃàn÷Àã à¢#àºÃ`$Ã0!Ãð Ãðô!ÃP ýÃð‰ÃÀy"Ãвà+"Ç!÷ÃÀ—Ã@SÃþ"Ã`­Ã@ÊÀïÃð›à ”Ã0µà ÃäÃЬ Ã`#à ŽÃsÃ@ÜÃ0&ÃÞàØÃиðX!ÃÀÃPå!Ã@A!ÃÐ)!àÌÃP÷ÃÐÿ'ÃÐŽ%Ã@ÐÃànÃ`¡Ã=#ÃUÃÒÃЦ!ðÏ"Ã0 ðçÃ@MÃ¥à ùÃaðíÃ@G Ã`6ðvÃÒà=Ã`$Ã[Ã0&ÃØÃêÃÀàCà À`!ÃÌ Ã !ÃÒÃàtÃÐ_ÃÀÃp3"ÀðàêÃ`¹à®!ÀïàOÃÌ ÃÒÃpEà®!à¨"à šðˆÃð•Ã@ÊÃ08à ðíÃ`§Ã@èÃ`• à=ÃàV Ãð} ð ÃàtÃÃиÃaÃ`¹ÃðÃÐÄÃÀ—Ã.Ã.ÃÀÃиÃÐÊÃÐwÃ:ÃÐÖÃ02ßÃ0ÇÃ4Ã08Ã4Ãð$ð^ Ã0£à Ãð›ÃðÃàtÃ@ÐÃpÔÀŠàœ$À~Ãà†ÃFÃyÃ@kÃ@âÃ0>Ã`³ÃиÃ@Ã`­ÃÆ!Ã`$ÃàÃpæÃ0¯Ã.Ã`• Ãð$Ãp]à šÃÀàÆàÆÃ0JÀ~àÆÃ"ÃàtðpÃðô!ÃðÃ0»ÃpiÃ.ÃgàêÃ`¿Ã@SÃPtÀ~ÃÀ£ÃPžà[ÃmÃpQðdÃàV ÃsÃêÃ@âÃ0¯àOÃ@eÃPtÀrÃpWÃpàÃPžÃ`ËÃ0µÃpÎÃð Ã4Ã`¿àIÃpEÃpÂðvÃdÃP-ðà ùÃÐYÃ0ÁÃ`• ÃÀ… Ã`0Ã0»ÀÃÐAÃиÃPŒÃ08Ãð Ã:ÃÀÃÀ£Ãp]ÃÐÄÃÀ£ÃÐÄýýÃÀÃ`$àÌÃ4ÀÃ0\ÃP˜Ãð•ÃpÎÃÐGÃ¥ÃP˜àêàCðvÃpcà Ãð Ã`³ÃP€ðpÃànÃpÔÃиÃàbÃð0Ã0ÁÃðóðdÃ`›ðùÃpÚÃ@ÜÀ~ÃÐ;àOýÃpìðÀŠÃ`¿Ã@ÐðpÃPŒÃPÃ0VÃsà[ÃàtÀxà Ãà’à šÃ(à ÃPÃP€ÃÃ@ÜÃàzÃmÃ0ÍÃð§ÃpìÃPzÃêÃàñÃpÚÃPýÃ0»Ãð‰Ã¥ à ”ÃpKÃ@ÜÃàñÃ0,ÃPzÃ0µà ÃpQà ÃàëÃðÃð*Ã`¹ÀûÃ`Ãð} ýÃ@èÃðÃöÃP†ÃàýÃ@eÃàtÃpcÃ`³ÃàhÃÀ‘Ãð$ÃàåÃ@wÃ`TÃpæÃðÃaÃP ÃЬ Ãp3"Ã0,ÃFÃð*ÃpæÃàzÃð¡ÃÀà ¦ÃðßÃ@ÜÃÀ—ÃüÃàbðÿÃÀ&À~ÃÐÄÃ@YÃPzÃPÃ`$Ã0»àÒÀÃPÀŠÃpEÃ@kÃpæà ùÃ@_ðíÃ`6ÃðÃpEÃоÀrÃ4ÃàÇ"Ã4ÃÀà ÃÀÃàëÃ4Ã`§Ã0"Ãð} ÃäÃPžÃÀÀxàCÃð›Ã`¿ÃÀà ÿÃpÂÃò$ÃPV$ÃÐÄÃÐÊñàaÃ08Ã0 ÃpÔÃ`BÃpcÃвÃð‰ðvÃð ðóÃP†ðáðvÃÐ/ ðX!ÃPýð^ ÃÀ‹Ã@âÃÐÐàIÃ`›ÃPtÃÞàÌÃ`0ÃÃÐ)!àÀÃÐÄðpÃpoÃP Ã@Ã@Mà$Ãð Ãðú Ã`§Ã0 Ã`!ÃPñÃP÷ÀïðíÃÀÃêÃ@SÃ@SÃànÃð•Ãð›Ã@ÊàCÃêÃ0&ÃpÈÀõà ˆÃüð”Ã(ÃmÃиÃP÷Ã( ÃPñÃPŒÃ`§ÃàñÃpÔÃÀ©Ãpæà ÃàýÃPýÃ4Ã`³ÃàëÃ`­Àã à ÀÃ0µÃÐSðíà ”ðà ¦ÃPñÃÌ Ã`0à ÃÀ‘Ãð§ÀœÃ‘ÃPÃüÀïà ‚ÃðƒÃPÃ0>Ã`6ÃpiÃPŒÃpKÃð} ðÏ"Ã0 ÃÀ‘àO÷ÃI!àOÃð•ÃpiðÿÃpÚÃ:Ã"Ã@SðjÃÀ—Ãêð^ ýÃpÎÃPÃÀ>ßðpÃÀÃÀ©Ã@ôÃð Ã0—!Ã@_ÃÀ&Ã@ÜÃ@YÃ`6ÀõðŽÃÀ,Ãð•àÌÃ@YÃÐÄÃmÃÐÄà Ãàåð|ð‚Ã08ÃpÎÃp9!À„ÃÃàOÃpÔÃÃàzÃÀñÃgÃÀÃ`$Ã`¿ÃPžÀÃÀÃgÃÐAÃ`<ÃPÃLÃÀ,Ãð ÀÃLÃàÃFÃоÃP ÃpWÃð0Ã`¹ÃðëÃвÃÐâÃ0>Ã0»ÃÃà )Ã`NÃyÃ0>ÃÐ_Ã`¿ÃpcÃpÚÃêÃpÈàØÃyÃsÃ0Áð|ÃpcÃÀÃÃÀ,à ÃpiÃàýßÃüÃÐÐà àÞÀœÃ@eÃÀÃíÃ0åÃàÃÒÃà\Ã@ÜÃ`­Ã0JðˆàOàðÀœÃà’Ã@wÃP9ÃpìÃ@qÃÐGÃ(À~Ã`*ÃðÃÀ©ÀÃÐ;à[ÃPëÃsÃð*Ãà ÃàÃ`*Ã0ÍÃÀ‹à ¦ÃÀµÀ¢Ã&ýÃÐeÃÐÜÃmÃ0ÙÃ0DÃÐAÃð¡Ã`6ÀÃàbÃð•ÃоÃÐÄÃàð”ÃàÃÀ©à šà /àØÃðà´ ÃÐÐÃpàÃ@_ÃÐAÃ` Ã0£Ã`§Ã@àCà´ Ã@kÃÉÃ@ÃÀÓðvÃpKÃpÚÃ[à p!ÃÀð|÷Ãð‚Ã@eà ÃÐ5ÃÀ‹ÃðàÆàIÃ0£Àf ÃP÷Ã`§Ã0µÃðw!À„ÃP!à[ÃmðáÃЬ ÃР"ÃàÓ Ã°vÃpWÃpEÀrÃ@ÃÏÃà Ã`$ÃÀÀT#ÃЦ!Ã0&Ã$ÃÀ!ðóÃÀÃ@ÐÃð§Ã0,ÃÐ)!Ã@ÊÃP†ßà åàIðvÃ@ÃpWÃàV à7 ÃpÂÃð÷àºÃp¼ ÃPtëÃ0VÃPžÃÐMÃÒÃÃÃyðpßà ‚Ãð‰ÃðƒÃ`›Ã`• Ãð‰ÃÀ¯Ãð0Ã0ÇÀéÃP ßÃpìÃ0ÁýÃ(Ã0>Ã4ÃвÃ`Ã`­ÃÌ Ã`³ÃðÃyÃà†ÃÀ‹ÃÐGÃ@ÜÃ@YÃàbÃP¤Ã…àCà Ã@G ð|ÃLÃ@Êà ùÃP€ðÃÐ_ÃPàaÃ0»ÃвÃ0©ðíÃ08à ÃsÃ0DÃà\ÃÃÀ à À„ÃÉÃ@eàÞÃäÃÐÐð‚à ”ÃP!ÃÀ£ÀràUà ðáÃð} Ã@îÃÃÃ@qÃpæÀõÃðÃðÃpcÃÐYÃP'àUàÞÃmÃàëÃ@_à Ã0ÁÃ@èðÃð$ëÃàzÃ@ôÃüÀ„àØÀ„à #à #ÃÀ2à /Ãà’Ãà’ÃÐúÃÐèÃpøà )Ã`³Ã@SÃêñàØÃÀ&ÃpìÃ@Öð‚Ã@_ÃäÃà Ã:ÃPàUÃà÷Ãð§Ã4Ã`<à7 Ã`¡ÃÐGÃ0>ÃpiÃà€Ãð<ÃàÃÀDÃçàaÃ@ôÃð›ýÃÀ>ÃpiÃð‰Ãp¤$Ã@¬$ÃP’Ã0ñà…Ã@ÃÐeÃFÀõÃÐÊà ÃÏÃÐYÃ0ÁÀà ÿÃ02Ã@îÀð Ã¥ÃöÃÀÃpoýÃÉÃêÃ`à v Ãêð‚Ã0»Ã@_À„Ã@}àsÃpÚÃ@Üð|ÃðÃ0JÃPÃêÃäà ¬àOÃpKðvñÃ02ÃXÃpæÃ`¿à  ðíÃÐÐÃP’ð|Ã@îÃÀ‹ÃÐSð|Ã0»Ãð•Ãàbà ”ÃàŒÃFÃÃÃÃpìëÃ0ÓÃêàäÃ@wÃêÃ0,ÃäÃ0JàOÃ@_àIÃÀ ÃPŒàUàäÃP àºÃpKÃ0ñðˆÃÀü!ð^ ÃÀ‘Ã0£Ã:Ã0PÃ0©ÃP\#Ã¥Ã`¹ÃÐÊÃð¡ÃÀ¯Ã`0ÙÃpcÃêðíÃpWÃð‰àÌÀõÀ~Ã`¿Ã(Ã"ÃàhÃ@wñÃPŒÃêÃÃ@ÊÃàëàØÃà ÃÐGÃàhÃàhÃ4Ã4Ã0#ðáÃÃÕÀÃPÃpWÃÃàßñÃÃàëðjÃð ÃP†ÃêÃðÃpcÃ`­Ã@ÜÃоÃ`‰"ÃÀ!ÃpÔÀûÃÐÖÃÀ,Ã@à ‚ÀéàäÃ0DÃ0©Ã0>ÃÐ)!ÃpQñÃàñðÿÃ`³à[àaÀ×"ÃPb"ÃàëÃðàaÃ`ÅÃÞÃàzÃð¡ÃÀ‘ð|Ã`­ÃüÃUÃüÃÐSÃI!ÃàhÃоÃ`ÅàÀÃ@MÃÐÄðùÃð‰àUÃ0»ÃP’Ã`­ð|ðÿÃànÀ~à ŽÃ`¹À~Àà #Ãð*Ã:ÃðÃ@èÃêÃà ÃyÀ Ã`ÅÃpWÃPë ÃPÙ#ÀràÒÃ`¹Ãà†ÃÀ2ÃÐMÃðÃðÃLÃÐÐÃànà #ÃyÃ@ÜÃpWÃÀ©Ã‹ýÃp{ÃÀ¯ÃÀ,ð ÃÐÖÃÀÃ`$Ã`­ëÃUÃ:ð‚ÃÀ©ÃpQàUÃ0»Ãà |Ã0 ÃpKÃ0DÃ@à[Ã0¯Ãì%ÃPh!Ãp{ÃÀJÃpÀÃ0ÇðÃ`ÑÃÐ_ÃÐÄÃpEÃÏÃP˜Ã0ÇÃ0ÓÃ(Ãð•ÃPž÷ÀÃsÃÐSà ”Ã`*ÃäÃ.Ã0»ÃàðˆÃ@èÃPð¬ÃPÃÐÊÃpÎÃÞÃ4ÃgÃ@ÐÃ0&ÃÞÃPtà  Ã02ÃÒëÃðÃÀ—ÃàtÃ[ÃÐAÃàzÃàëÃÐÄÃpÎÃ(ÃpcÃà÷Ã0¯ÃàåÃ@_àØà 5ÃöÃ@à ÃÀ£Ã@ÐÀ~ÃÀ8ÃÀ¯ÃÀÀlÃÀÃÐSÃàzÀ%ÃaÃð0ÃXð|À„Ã`­ÃLàmàgÃ`¿Ãp]ÃP ÃÐÊÃP†àgÀ–ÃpQÃ@ÊÃð Ãyðjà #Ã@ƒÃ0Áà ”ðvÃ0»ð”ðÃ@eÃÀ©ÃÉÃP÷ðvÃà†ÃÀÍÃÀÁÃÀ£ÃêÃ@SÃsà AÃ`HÃð³ÃpøàÃÐîÃjðšÃÃÃØÃàhÃÕÃ0\Ã@_àaÃÀ!à ŽÃð§ÃaÃàzÃyÃð§ÃO Ã@_Ãð›ÃÀ&ðÃð0ÙÃÒà ‚Ãð§ÃRÃÀÃÃ`§ÀÃLÃ@ÙÃÀ ÃpKÃsÀŠðíÃÞÃ` à v Ã@A!Ã0ÍÃ@ôðˆÃ0DÃÐÄà ßàêÃpø÷ÃðƒÃ@ÜÃáÃÉÃàtàaÃpæÃaÃÐAÃÒà ó Ã4Ã` Ã0JÃÐÜÃðÃ`6ÃpKÃ4Ã0£ÃÐSÃpoÃ0&ÃpEÃÒÃàÓ ÃàÓ Ã´$à d#ÃðÖ&à%Àã à®!ÃPÍ%ÃÐ &Ã`î&Ã0a*Ã0s'ÃÀa&ÃÐù(à :*ÃPD'ÃЬ Ã`e(à F(à F(Ã%'À**ð()Ö)à–%Ã`î&Ã*Ãà‹,ð«(Ãðè#Ãð_%ÃÀÀ+Ãp÷+ð-Ã`S+Ã@+ÃP©+À•-Ê+ÃÚ,ÃP-Ãà.ð“,ð+Ãp÷+ÃÐç+À.àÝ.Ãé0Ã0=0ÃP&,Ãpt,Ãp÷+Àú1ð/à ·*Ãõ.Ãð|5ð/Ã`Ü)ÃðA*Ã`Ð+ÃЫ5ÃÐ44À$+ÃÐd,Ã@'ÃÀÌ)Ã9.ÃÀÀ+à 0Ã`50àT0ð/Ãl0àÑ0Ã0À/Ã@|,Ãà-Ã0Ì-ÃÐÃ1Ãð2àN1Àú1ÃŒ5Ãà.àé,Ã@v-ÃÀ´-Ã0´1Ã@j/ÃP.ÃÈ/Ã*Ã@ù,àT0Ãð1Ã@Õ2Ãð¦.Ãàö/Ã`¾.Ãï/Ã'1ÃÀ´-Ã071ÃÐ^-ÃÀÌ)Àƒ0Ãà.ÃÈ+Ã@j/Àk4Ãà.Ãà+ÃP,+ð.(Ã0U,Ã9.ÃÝ2ð .ÃÔ-Ãàü.à ·*À.Ãph.à “0ÃÎ.ÃÐù(ÃÐd,ê0ÃP-ÃÐR/Ã`50ÃP/à 2ÃÐÏ/À›,Ãû-Ãðš0Ãr/Ã!2Ãð1à +Ãð²,ÃP—.ÃÂ0Ãpb/à ¥-àõ*Ãð¸+À›,àl,Ã@|,Ã3/àl,Ãr/à ™/à :*Ãð#/ÃÀ¢0Ãà*Ã0ä)ð+Ä,Ã@ *Ã0g)Ãð;+àÝ.Ãð¦.Ã,À-À,à ™/Ãð0Ã0C/àû)à :*Ã0O-ÃÐÕ.Ãàs0Ãõ.Ãpn-ðŸ*ð+ÃP…1Ãã1Ãû-À0)Ã)ðþ/à 1À /À-Ã@|,ÃÔ-Ãð¬-ÃÀO)ÃÐ'Ãà+Ã9.Ã@ù,Ãð¦.Ã@ó-Ã9.ÃQ*Ãì%Ã)à„(Ãpz+ÃP‘/Ãpë-ÃÐj+à @)ÃK+ÃÈ+àõ*Ãà©'ÃðÊ(Ãph.Ã`G-Ã?-àï+ÃP»(Ãi&Ã0ö&ÃÐó)Ãà*à~)Ãðâ$ÃðÄ)ÃÚ,Ü(Ã`_)à +Ãc'Ãþ&Ãc'Ãð;+Ã0Ò,Ã@ÿ+Ã0a*Ã0Ò,À§*Ã@í.ð,Ãï/Ã`¸/Ãàê1Ã,à×/à “0Ã012Ã05Ã@Ï3àB3Ã`4Ãð2Ãð‚4ÃÀ3Ãé0Ãð /Ãã1ð3ÃàÞ3Ã3ÃÀŠ4Ã`¬1À0À}1Ã@Û1ÃÐ:3à³5Ã`;/ÃPm5ÃË5Ã06ÃÐ44Ãб4Ã@É4Ãàa3ÃË5Ã` 7Ãн2Ãðp7Ã`š4ÃT4Ã0®2à ø4ði3ÃÀ1.ÃpD4ÃH6à¹4Ã@F5à­6ÀÜ6Ã@d0Ãp\0Ã-0ÃÀ¢0Ã`/1Ã012Ã`²0Ãàê1ü1Ãõ.ÃP -Ã@ù,ÃK/à 2À‰/Ãð /à 2ê0Ãé0Ãpb/ÃÀ%0Ã`2ÃÐÕ.ÃÂ,ÃÂ,ü1ÃÀ1.ÃpÙ0Ã0¨3Ã`)2Àƒ0Ã`S+ÃÀÆ*Ã` 7Ã0=0ÃPµ)ð,ÃÀI*Ãpz+Ã@ÿ+ð{0àé,à ".ÃÐÏ/Ã@X2Àô2Ã0C/Ãr/àT0Ãð¦.ÃÀ%0Ã`50Ãà.ÃÐÏ/ð/Ã071à ±+Ü(à Ÿ.Ã0I.à 1Ã`A.ð“,Ãpß/Ãpb/ÃÈ+ÃP8)àr+Ã@ç/à ™/Ã`Ö*Ã0[+ÃÐá,Ã0U,Ã@Ž)Ãà+Ã`Ä-ÃÀº,Ã@ˆ*î%Ã$Ãp(ð“,à (-Àƒ0Ã@í.Ãpn-Ã,ÃÐó)Ã@Ž)Ã@(ð¥)ÃE,ÃE,Ã0O-ÃÐd,ð"*Ã(à ·*àx*ÃðM(À¹'ÃPV$ÃÂ,ÃÀ®.ð"*Ã@(À**Ã0º0Ãà£(Ã@)ÃðG)ðŸ*À**ÃP©+ÃÔ)ÃPµ)Ãà‹,ð¥)ÃÐç+ÃP,+Ã0[+Ã`Ð+Ã@ù,Ãð5,ÃÐ'Ö)àŠ'ÃðS'Ã0[+àr+ð“,àé,àx*Ã`S+ÃÐó)ð™+à .,Ã`Ð+Ã`¾.ÃÀO)à ^$Ãà&(Ã*à~)Ã@¬$ðL#Ã@š'Ãà8%à Õ%à Û$ÃÐ%Ãc'À6(Ã)Ão)Ã0ê(ÃÀg%Ãì%ð¥)ÃP&,Ã@'ðÕ!ÀT#ÀÅ%à Õ%Ã0ö&Ãp÷+Ãp÷+Ã`w%ÃÀÞ&À­)ð:&Ã`Ö*Ãø'Ãp(Ãp3"ÃàÇ"ÀH%ÃÀy"Ã$Ã0y&ÃÀU(Ã0m(Ãà*Ã@š'ð«(à É'Ãðe$ÃðY&ÃP -ÃP>(Ã*ÃP»(ÃÐù(à Ã(ÃðÐ'Ã`Y*ÃÀÞ&ÃÀØ'Ã0a*Ã*Ão)à 0Ö)Ãà2&ÃðÐ'à «,Ã`Ê,Ãð;+Ã`Ü)Ã*À¡+Ãp€*Ãðâ$Ã0%Ão)Ãà&(Ã@+ÃÐÕ.ð“,ÃÀO)ÃðM(ÃÀÌ)Ã`î&ÃÀa&Ão%Ãà£(Ã@í.Ã0U,Ãà2&ÃðÐ'ÃP2*Ã@|,ÃðÜ%ÃP\#Ã`â(Ãp(Ä,ÃPÁ'Ã`è'ÃÐv)ÃÀ7-Ãà*Ão)Ãæ&À­)Ã`â(à Û$ÃÀU(Ã0…$à¢#ÃÐç+Ã9.Ã?-àf-ÃðG)àx*À0)Ã0Þ*ÃÐp*ÃÀê$Ã+&ðF$ÃàJ"ÃàV Ãp†)Ã`Ð+À.Ãæ&Ã0g)ô$ÃÚ(Ã@|,ÃPÇ&ÃÐ &Ã`â(Ãø'ÃðS'ð@%ÃÐv)ÃÀa&Ã0%Ã0ö&À³(ÃÐ &ÃPÍ%ÃP>(Ã0Ø+à~)Ã@²#Ã@'à Ï&à$ðÃ$ðL#ÃÀê$Ãþ"ÃÐŽ%Ã*À-Ãi&Ã¥ ÀlÃ0 à=Àã ÃPJ&Ã`w%ð·&Ãp&Ãp'$ð4'Ã@Ä Ã@G Ù"Ãpž%Ãðq"à ç"Ãp¼ Ã0‘"à&Ü(ÃðA*Ã`ô%ÃÐó)ÃÀm$Ãp'$Ã`}$ÃÀä%Ã`$Ãp¤$Ãp¶!Ãp&Ã](ðF$Ãà8%ð.(â'ÀË$ÀÑ#ðÃ$ÃÐ%Ãðk#Ãðú ÃÀs#ÃЂ'Ãò$ÃÐ'Ãp'$Ã%'Ãu(Ã{#Ã7$ô$Ç!Ã0&ÃàJ"Ãðe$Ãà2&Ãp&Ã0$ÃÀö"Ã0‘"ÀZ"Ã@/$Àã Ã0&Ãp¶!ÃPV$ðÏ"ÀlÙ"ðÃ$Ãp¼ ÃP÷ÃPÙ#Ã"ÃàåÙà í!Ã"Ãðw!Ã0!Ã`$Ãðw!ÃðÃÀü!Ã@5#ÃPñà v ÃàÓ Ã ÃÀð#à®!À¿&Ó#ð½%ð:&Ãþ"Ã`w%Ãþ"ÃÐ%ðÏ"ÀÝ!Ã"Ã@;"Ãðe$Ãp3"Àã Ã"Ã@Öà ÿÇ!Ãà>$Ãp3"ðjàºÃPb"Ãà»$Ãà2&ÃÀê$ÃиÃP€à=Ãp? à®!ÃPtà ó ÃÆ!ÃÐÄÀT#à í!ÃÀÃð Ãp? Ã0#Ã@ÐÃð•ÃððR"ÃàJ"à |Ã`ÃÀy"Ã@/$Ã0‘"Ã0µÃÀ!Ãø#Ã0!ÃO à ÃPtÃÀ‘Ã0,ðdðÃpòà À~ÃÀy"à í!à=à®!Ãà\ÃððíÃ@ÊÃP÷Ã`‰"ÃPÓ$ÃиÃêÃ0£Ã02Ã:àºÃpÂÃ0!ðL#ðÉ#Ã0‘"ÃPñÃ"à®!ðX!À×"ÃÐ;Ã@ÊÃÀö"Ã0&Ã"Óà+"à+"Ã0&Ã@š'ÀH%àCÃPŒÃàP!Ã0µàIÃ@ÊÃ¥Ãàåà í!Ã`!À`!ÃÀÃиÃÐ#"Ãp!%ÃàP!Ã"ð^ ÃÀ"Ãp¶!Ã à ŽÃÀ"ÃPå!Ã0"Ãð¡à v à í!à%#ÃÀ!Ã08ÃÃP\#ÃpEÃàßÃ`$Ã$ÀÝ!ÓÃÆ!Ã0$à ÃàV à !ÃàåÃPn Ãà ˆÃðÃÀö"Ã@SÃ@_ðçÃðàCÃpÂÃpÂà !Ã@SÃàbÃPV$Ãàëà !ÃàJ"Ó#ð½%ÃPtÃÀÌ)Ãp9!ÃðÃð‰Ã0DÃêÃP'àºð^ ÃàV ÃPß"ÀxàºÃu$Ã7$ÃP\#ÃÀ‘Ãp? Ã0"ÃÐ)!ÃàÙÙÃpKÃpÈÃàÓ Ã +"Ã0 Ù"Ã0%Ãð_%Ãp'$Ã@;"Ó#Ã%'Ã7$à ùÃðô!Ã0ü%ÃàD#Ãp°"Ãp'ÃÀy"Ã@¾!Ã`}$à Û$Ãò$ÃPÓ$Ãðè#Ãðâ$Ã+&Ãp9!ð:&Ã](Ãp˜&ÃPÙ#Ã1%ÃÀO)ÃÐ#"Ãp'$à–%ÃPÇ&ÃÐ &Ãðk#à j"Ãp°"Ãc'Ã(Ã@¸"à ç"ÃPýÃ"Ãp’'Ã`e(ÃðS'ÃоÃ@G ÃÀy"ÃÀ"ÃI!ðÃ$Ã$Ã`k'ÃP»(Ã`ƒ#Ã0&Ã1%à Ï&Ã"Ã0s'ðF$Ã%'À0)Ãp'Ãàµ%ÃÐ$ÃÀ"Ã],ÃÀº,ÃPÍ%à$à d#Ãþ"Ãð_%Ãp†)Ã@#&Ãp(ÃÀØ'Ã@'ô$Ã`è'ðR"Ã0!ÃàÁ#à%#Ã0$Ã`k'à 'ðÏ"ð^ ðÉ#ÃðG)ÃÀð#Ãø#ð.(Ã@)Ãp’'Ãpž%Ã`ô%à+"à¨"ÃÀü!ÃÐ#Ã@¦%Ã(Ãu(à p!Ã@#&Ã0m(Ã0g)à Õ%Ãà>$Ãp'$Ã`$Ãà¯&Ãp’'Ã7$Ã"à ó à%#Ã`ô%ÃÀö"ÃÀÌ)À­)ÃðÜ%ÃàJ"ÀÝ!Ã@”(À¿&Ãà>$Ãp¤$À<'ÃðÜ%Ã@š'Ãà'ÃÀ!Ã¥ Ãu$À¹'Ã@)ÃÐ#ÃК#ÀT#à ç"Ãp˜&ÃЈ&Ãpž%Ö)Ãà )à„(Ãà£(à¨"î%Ã@¬$à–%ÃPD'Ã0ü%à L'Ã0%ÃД$Ã@A!Ã`‰"ÀÅ%ÃPD'Ã&ð±'ð:&Ã@š'Ã0%ÃК#ÃÀ['Ã(Ã0y&Ã0‹#ðjÀf Ã@²#Ã0$Ã`‰"ÃÐŽ%Ã0—!ÃPÓ$Ãðâ$ÃPtÃ@š'À¿&ÃpŒ(Ù"à ˆà ç"Ão%Ãp3"ÃÀ‘ÃàÍ!Ãpª#Ãì%ÃЈ&ÃàÇ"ÃPÍ%ÃPÇ&Ãp˜&Ã`ô%ÃÐ$ÃÎ*Ãø'à ^$ÃàJ"Ã0$ÃPÓ$à¢#Ãp!%ð4'ÀH%ÃPV$ÀÝ!Ã@Ä Ã@;"Ãì%ÃPÓ$Ãðw!ÀË$Ã@#&Ã`w%ðÉ#ÃÆ!Ã@/$ÃPë Ã`*Ã¥ ÀûÃð Ãò(ðŸ*ÃÐ#Ã1%Ãðâ$ð@%Ã1%ð½%ú#ÀÝ!Ã( Ã`$ðvÃ0!Ã@5#Ã"Ãðk#Ãðw!Àã ÃÐ5à ó ÃÀ!ÃвÇ!Ù"Ç!Ãp¤$ÃÀö"ðX!ÃàV ÃàÓ Ã` ÃI!ÃÀy"Ãp3"à Ï&ð@%Ã@;"ðF$ÀlÃPzëÙÃpQÃàbÃPn Ç!ÃЦ!Ã0"Ã=#Ãðq"ÀT#ðL#ÃP\#Ç!ÀéÃ.Ãðè#ÓÃàzÃpÔà ÃЦ!Ã°Û Ãp-#ðÃ$Ç!ñÃ0,ÃÀ—Ãð ÃÀ… ÃÐ)!à ˆðáÃК#Ã°Û Ã@MÃð Ã`Ã@_à v Ãðâ$Ã@¬$ÃpÈà Ãþ&à X%Ã`ú$ÃàÙÃàbÃp? à¨"ÃàP!Ã(ÃÉÃ0…$à®!à1!Ã0 Ã@A!Ãp¶!à !ÃÆ!Ã`¡Ã`!Ç!ÃpcÀûÃpÂÃ0‹#Ã&Ãà2&Ã0#Ãp¶!à ‚ÃàÓ ÃðÃPV$Ãò$à ˆÃ`‰"ÃC"ÃàÙÃà\ÃðÃÀ!Ã0 ÃO ÃpàÃO ÃÐ)!à |ÃP€Ãp¼ ÙÃ0—!Ãðw!Àf àÀà=ÃàV À×"Ãà¯&ÃPñÀéÃÀg%À`!Ã`‰"ÃC"ðÕ!Ã0‘"Ãà¢#ñà=à®!Ãþ"Ã@²#ÃPñÃ`ƒ#ðÕ!Ã0"ð@%Ã0£ÃÐ5à®!Ã0"ÃPtÃpàÃ0 ðíÃmÃPn ÃÃÀ"Ãðú ÃÀ©ÃиÃ`• ÃC"à v Ã` Ã`ÃÀ Ãð} Ç!ÃÀ‘ÃpÈðÕ!ðóÃðú ÃPtÃÀ£ÃPn ÃÀa&Ã.Ã0,ÃðÃðô!à ”Ã0ÁÃÀðX!Ãà2&Ã.ÃÀ‹Ã0©ÃÐ5ÃàV ÃÀ… ðÏ"ÃÀs#à ^$àºÃI!ÃÀ‘ÃàÍ!Ãp¼ ÃPP%ðX!ðX!ÃPV$Ã0"Ã°Û Ã 7 ÃÐ5Ã@Êà ÃPtÃp¶!Ã0,ÃÀy"ÃÀs#ú#à´ ÃÐSÃ0>ÀõÃÐ5Ãðú ß!Ã"Ã@ÐÃpÂÃ=#ÃPb"ÃPh!ÀxÃ02ðdðáÃð§Ã@âÃ0>ÃÐ)!à ùÃð ÃÀ Ã.Ã"Ãp°"ÃÀð#Ã08àUà ùÃPýà v ÃÒÃP÷ÃPß"ÃÀ Ã=#à F(Ã@/$ÃàV Ã¥Ã`§ÃðÃÃÃ@ÖðX!ÃÀ"àUÃ¥Ã@;"ÃÐMÃLÃÀà ŽÃð} àÆÃ@Ä Ã`#ÃPn Ã0¯ðçà Ãðú#ÃP÷Ã0©ÃÐAÃPÃ`6ÃP÷Ãø#ÀË$ÃðÃÀ‹Ã.Ã0 ÃÀ ðóÃpQÃÐAÃàP!ÃÌ Ã ÌÃà÷Ç!ÃÆ!ÃP€Ã@SÙÃÒßÃp°"ÃPß"ÃÐ%ÃÀ!Ã0©Ã Ã`$ÃК#à ^$Ã`è'ÃÐ &Ã@/$ÃPë ÃPn Ã0!Ç%ÃC"Ã{'Ãðq"ÃàJ"ÃàÁ#ÃÐ)!Ãðq"Ç!Ã@)%Ã@š'ÃP\#ÃÆ!ÃPb"Ãðe$Ã"ÃàP!Ã#Ã0ü%ÀÝ!ÃpÈÃ{#Ù"ÃPV$ð4'ð^ ðÏ"Ã7$ÃÀs#Ã`!Ãi&À<'Ã.ÃЬ Ã0#ÃÌ Ã ^$Ãà,'Ã{'Ã*Ã+&ÃÀð#ÃàbÃp-#Ãu(Ã0‘"Àã Ã`ú$ð½%Ã`ú$ðÏ"àÀÃ`ú$Ã@‚+ÃÀ['ÃÀ… à í!Ãø#À­)ÃÀg%Ã@A!ÃД$Ã@)Ãþ&ðL#ÃàV ÃO Ã4ÃPÍ%Ã@;"à7 ÃPë Ã7$Ã+&Ã`‰"ÃP€à+"Ã0‘"Ãì%Àã Ãp¶!ÃPb"Ãp˜&Ã*Ã@/$Ãp°"àœ$à´ Ãp°"ÀT#Ã"à1!Ã"ú#ÃàÁ#ÃÐ%Ã`w%Ãà>$ÃpÎà ÿÃиß!ÃÐ$Ã$ðÃ$ÀZ"Ãð‰ÃUà%Ç!Ã{#Ãþ"Ãðî"à d#ÃÐ%Ãðú à1!Ã`!Ã@#&Ã0ö&Ã@¾!à !Ãðw!Ã0 Ã0 Ãà>$ÀÝ!ÀlÃ`›Ã0$ÃPb"Àã ÃÀs#ÃPV$à Û$ÃàÇ"à |Ã"!Ãþ"ÃpQÃиÀéÃpÈà+"Ó#à j"ÃК#Ã"!Ù"ÃÐ)!à %ÃÃ0,à v ÃàP!Ã@A!ÀÑ#ÃÀ‘ðóÃ`• Ãp!%Àf ðÿÃ@ÜÃðÃ`!Ã°Û ÃPñð^ ÃÆ!à+"Ã0 Ãðî"Ã`k'Ãì%Ãp'$Ã`è'à%#Ã0£à1!ÃЦ!Ã@¾!À`!ð@%ÃP\#Ãðú Ã02Ãðú à ^$à7 Ãðw!ÃPß"Ã`ÃàÓ Ã á#ÀÑ#Ã"à Õ%Ãì)à j"Ã0µÃ@kÃ`6ðjÃàÇ"ÃД$àÀÃÞÃ0¯Ã`¡ðR"ð½%à ç"ÃPýÃðÃ0!ÃàëÃиÃp-#à j"Ãpª#ðR"ÃànàUÃàÙà Û$à %ÃPb"ÃàÓ Ã |ÃpÈà ÃpÈÃÀÃР"Ã"Ç!Ãðw!ðáÃ`³Ã`*àIÃàÓ Ã ÀûÃÐ#"Ã"ÃÀ‹Ã@YÃ¥ Ã0£Ãð} Ã`• ÃpKëÃ@MÃÀy"ÃÐ/ ÃЬ ÀT#Ã°Û Ãà»$ÃÀ!Ã$À×"ðX!à+"ÃØð·&ÃPV$Ãp¼ ðÕ!à%#à(Ã°Û Ã Ã0…$Ã1%Ã#ðpÃ@Ä ÃPå!Ã`ú$ÃðÄ)Ã`ú$ÃÀØ'Ã0%À¿&à–%à Õ%Ão%Ã0&Ã@MÃ0ö&ð±'Ãàµ%ÃÐ &à–%ÃPÙ#ÃД$Ã0a*Ã`_)Ã`e(Ãp&Ãp'$à í!à+"Ã0‘"Ã`q&ÃðS'ðÏ"Ã0 ÃðY&Ã{#ÃÀÌ)Ã%'Ã+&À**àû)ú#Ã"Ã=#Ã@#&Ãà8%Ãæ&Ãà,'à Û$ð()Ã$Ã{'ÃðÖ&Ã.ÃUÃPh!ô$Ã0%Ã`ú$à ^$Ã@#&Ãp!%ÃК#ÃPD'ÃPß"Ãì%Ã0s'ÃÐv)Ãà¯&Ù"ÃÀ['î%Ãò$Ã&Ã1%à X%Ã0%ÀË$à%#Ãðq"à ^$ÃÀm$Ã`#ÃÐŽ%à p!à p!Ã0ä)Ãø'ÃÀö"ô$à%#Ãþ"à7 Ãp¤$Ãðâ$ÃÆ!Ù"Ã0!Ãðè#Àf à Ã@5#Ãp-#Ã0>Ã0—!Ã`ô%Ãðè#Ã@ÐðáðáÃp¶!ÃÀ!Ã` "Ãp˜&Ãp˜&Ã@²#ðR"Ã.à Ï&à j"Ã@/$Ã0#ÃPÙ#Ãp˜&ÀõðR"Ã1%Ã`ú$Ã0y&Ã`ƒ#à !ÃÌ Ã` "à p!à ó Ã`›ÃP÷Ãà,'ÃPb"ÃpÈÃ"ÃPP%à®!ðÕ!ÃàP!ÃpKÃÀÃ@MÃaÃðƒÃp¶!ÀZ"ÃPh!ß!Àã ÃàÍ!Ã"ÃÒÃàbÃ@¸"Ã`$à !Ã`­à ÿà ÃP÷ðÕ!à$ÀË$à Ï&ÃðM(ÃÀ['Ã0%Ãðw!ÃpÂÃÀ!À×"ÃP÷à=à à ðíàCÃp? Ãp°"Ã`›à%#Ã@;"à v Ã`$ÀïÃàßÃ0 Ãðè#Ã`‰"ð^ Ã.Ã@ÖÃPn Ãò$ÀZ"Ã"!ÃÐAÃ0&Ã@G ðáÃPñÃ` Ã¥ ÀÃ0 Ã@A!ÃÐ)!ÃpÈÃ"ÃPb"ÃÀg%ÃàÍ!ÃàÍ!Ãðw!ÃÐÐàÌÃP÷ÃàåÃ@ÐÃðëÃu$àºÃàhÃaÃðq"Ã0»ÃÀ à$ÃÐ#Ã` "ÃUÃð ÃÐÄÃ`6ÃäÃ02ÃЦ!Ãà !ÃÐ#"ÃpKÀT#à+"à v ÃвÃ0‘"ÃÀÅ%à %Ã"ðÏ"ÃÀ à ó Ãðe$ðÃ$Ã"Ãp¼ Ã`$ÃPýà |ÃPýð^ ðvÃ"Ã@ÊÃ°Û Ã ÌÃpÂÃ@/$Ã.ÃÀ©ÃðÃК#Ã&à Ã( Ç%ÃЬ à d#Ãðq"Ãp¼ Ã"ÀN$Ã¥ ÃPzàäÃpKð^ Ã"Ã$ÃЦ!ÃЬ Ãp¶!Ã@Öà¢#ëÀïÃPh!ÃPë ÃÐ5ÃàCÃ`!ÃpÈÀrðóÃ0©ÃP÷Ã[ÃàP!à v ÃPtÃànà´ À¿&ÀÝ!Ã`• àIÃ0DÃ@G ÃsÃP ÃЦ!ÃC"Ãðíà1!Ã0&ÀN$Ã0!ÃPÃÀßÃÆ!ÃPýÃ`¹ÃàëÃÀf ÃÆ!ÀõÃ:Ã0>Ã@SÃ`!à1!Ã0#ÃpKÃàÙà=ÃPn ÃиÃàÇ"Ã@èÃ`­Ã@MÃ°Û Ã“ÃÀÃP€Ã@ÜÃpÚÃ¥ À„Ã4Ã0,ðùÃÒýÃêÃ`¡Ã0—!ÃpÈÃðƒÃ0 àÀÃ`§Ãð} Ã"!Ã0 ÃÀ‹ÃaÃÐ;àCßðùÃÀs#ÀÝ!à šÃàtÃ`¡Ã0 Ãðô!ÃI!ÃðÃиà ŽÃ`­ÃÞÃ"Ã@G Ã`$ßÃÐAÓÀ`!Ã¥ ÃÀü!ÀxÃpEÃàñà ‚à ðvÃC"ÃàÍ!ÃЬ À Ã` Ã`‰"Ã"!ÃÐAÃØÃ0©Ã`<Ã@îÃàÍ!Ã@ÐàOàÆÃ02Ã08ÃÐ;Ã0&ð‚ÃPðÃðÃà»$ÃÀs#Ã`¡ëÃ0©ÃP’ÃP˜ÃäÃ7$ÀõÃp]ÃðÃànà d#ÃÀ‹ÃÏÃ02à ‚ÃÐ;à ÿà&ÃC"ÃO Ã"Ã`}$à ÃàÙÃð‰ÃÀÃððùÃàzÃÐMÃ0&Ã`$ðdÃ`• Ã@ÖÃ`¿ÃPŒÃ`¹Ã0&à í!Ã@âÃð<ÃP€ðÃ$ðáÃ`¹à šÃ@këà Ã0PÃpæÃ@ÊÃàßÃàÙÃÀ—Ã@G Ã@MÀà[ÃÀy"Ã0…$Ãp9!ÃàV ÃPë Ãp3"Ã0£Ã@MÃàßÃÐÜÃ0VÃð›ðÿÃ"ÃPŒÃà÷ÃP†ñÃaàÞà ¦Ã0JàgÃPtÀÃ0ÁÃ@_ÃP’ëÃÀðáÃpÚÃsÀûÃpKÃÀ—Ãp9!Ã[Ã0—!ÃÐ;à ŽÃ`BÃ0,à ÃÐÄÀrÃÀ»à ÿà Ãð¡à ˆÃ"Ã@¾!ÃànÃ0ÓÃpEÃ0JÃPÃð‰Ãð›ÃÐMÃÛÀœÃ0JÃ( à ‚Ã`§ÃP÷ÃðÃPŒÃ`6àUÃ`¡à Ãp? ÃP†Ã@YÃ¥ÃaÃоà šÃÉÃÐ;ÃàëðˆÃpòÃ@Ã`¿Ã.ÃÐYÃPà Ã@èÃ0DÃpøà ”ÃànÃ@ôÃRÃ`¹ðÃð•ÃLÃ@îÃPýÃ@ÐëÃðÃ.Ã@À~à[àÌà ˆ÷ÃÐÐÃpìÃðÃyÃðÃpæÃÉÃPÃ`ÅÃpìÃð›ÃpÎÃPýÃP€ÃàëÃÀ£àöÃ¥Ã0µÃPàUàCÃ@ÃaÃ`0ÃPÃ0DÀ Ã@ôÃPÃ(ÃÀÃð ÃPtÃ0!ÃÀ2ÃàñÃÐÄÃPzÃpÈÃ`³àðÃÛÃ0»ÃÀ£ÃÐYÀ~ð ÃàtÃàßðvÃ0Óà ÃPžÃÀ&Ã`­ÃÀ£ÃàñÃPýà Ù"Ó#ÃÀ‹ÃÀµÃà ÃPÃ@ƒÃPŒà àgÀ~àÌÃ:Ã¥ðçÃpÔÃÀ&ÃðÃÛÃPà  ÃýÃðÃPzðíÃÐÖÀÃ@wÃÐèÃà†ÃÐ5ÀõÃ02Ã@ÖÃÀ"ÀïÃÐ_ÃðÃpcÃ0VÃÀ&ÀlÃ0µÃоðjà ÃaÃ@¾!ÃðƒÃFÃLÃ0ÁÃp°"ÃPb"ýÃÏÃ0©Ã0µÃ@âÃFà ²Ãp]ÃÀ£Ã0»Ã`NÃ`HÀûàÒÃUÃÃUÃЦ!à ÿÃðÃ`§ÃgÃ:Ãð¡Ãð¡ÃyÃÏëëÃ°Û ÃÀðpÃ@YðdÃÉÃ.Ãð$ÀÃÀÃ0¯ÃpKÃÀ‘Ã@MÃPÃÐèÃpcÃ@ÊÃàåà |Ãà\Ã@YÃO Ã`$ÃpæßÃP÷Ã@YÃ(ÃðƒÃиÃà÷Ãð›ÀÃ"ÃpÎÃ0!À~ðùÃêàIÃ@A!ÃpæÀÃàýÃpÈÃЬ à ˆà[ÃpÚÃ¥Ã`$ÃpÎÀõðvàOÀxÃO ÃàÙÃ0JÃP à ‚ÃäÃànÃ@_ñÃ0&ÃÀ Ã0—!ÃP Ã@ÜÃ`¡ðóÃ`¹ÃàhÃðÃPÀûÓà ÃO ÃðÃÀ£ÃÃP˜ÃÀ—ÃÌ Ã0‹#Ãp? àIÃ@ÜÃÀ‘Ã`• ÃpWÃ.Àïà ÿÓÃð‰ÃP÷ÃðÃ`0ðvÃ@YÀÝ!à Ã(ÀïÃP÷ÃP’ÃpæÃpKÃPh!Ã0#Ã0!ðç÷ÃàhÙ"Ã`§ÃPÃPzðçÃàV ðÏ"Ãp-#à p!ÃàÓ Ã@¸"ßðjßÃàßð^ Ãàëà ŽÃ`§ÃÒÃ`#ð‚ðÿðíÃàëÃp? ÃЬ ð^ Ãp? ÃÐGÃFÃð$Ã"ðpÃ@ÜÀÃÐAÃpÚÃpÂÃgðvà ÃI!ÃÐ/ ÃÐ)!Ã0¯Ã`³ðíÃÌ Ã 1!àCÃ`• ëÃ@A!ÃPë ðdàÌÃÀÃ0 ÃÀß!ÃÀ—Ã4ÃPñÃ`!Ã0!Ã`0ÃàŒÃP€Ã`¡ÃPzÃpÔà à®!Ã`!ðçÃànÃÐAÀ„ÃðÃêÃ4Ã` Ã"Ãðq"Ã°Û Ã€Ñ#ÃР"ÃàbÃpKà ˆÃÀü!ÀN$ëÃ7$ÃPë ÃÐ#"Ãp? ÃPžëÃÀs#Ãp°"ÃPñÃ0Íà šðÃ@SÀrÃð$Ã02Ã0 Ã0—!ðvÃ@ÖÃpEÙëÃ` Ã0¯ÃÐÄÃ0DÃànÀéÃpWÃàbÃ°Û Ãð} Ãðú ÃÐGÃPŒÃsð|ÃPñÃ`¡ÀÃàbÃPë Ã`¹ÃðÃp]àØÃ@ÐàUÃàzÃà†Ã.ÃpÂÃ0!ðÿà ”ðùÃÃp? Ã`#ÃðƒðX!Ã0DÃð Ã"ëÃ@_ÀõÃ`›Ãp? Ã°Û ÃðƒÃÀ—Ã`!à ”Ã@YÃ@eÃP†ÃÐ)!ÃPå!ÃpÈÃPå!ÃàV ÃpKÃ0»àIà !ÃI!à Ã"à šÃàÙÃðÃPë Ãp-#ðóÃàåÃ¥ ÃàÇ"ÃàD#ÃàbÃp? ÃC"Ã0¯ÃЬ ÃðƒÃð ÃpEÃp3"à ùà ‚àÆð‚Ã`¡à j"Ãð} à=Ã0>Ãp]à !ÃЬ ÃÀ!Ã`!ÃpEà®!ðáÃвÀf Ã` à ÿà ùÃP€à ŽðçÃÐ5ÃÀ‘ÓÃmÃêÃ`§Ã1%à ÃàýÃpoÃ@âÃÀ‹À~Ã0©ÃäÃ0µà p!Ã`• ÀxÀÃpìÃ`*Ã0 ÃÌ Ãðw!Ã0Pð‚Ã0 ÃO Ã`¡Ãà÷ÃðÃ0¯Ã( à®!ëÃð àÆÃp3"ðdÃPh!Ã4ÓÃÀà šà ùÀZ"ÃÆ!Ãðk#ÀZ"Ãp«ÃpàÃ"Ã@MÃ`§Ã`§Ã`¡Ã0»ðáÀã à+"à1!ÃO ÃPñÃÉÃÃÀ©à ˆÃpQÃÐ5Ã@YÃI!ÀlÃaà Ãð‰à ÿÃ.ðdà=Ãðw!ÃоÃ@eàºÃàV ÃpQÃpÈÃ`‰"à ó ÀN$Ãp°"Ãà»$ÃÀ!Ã:Ã@ÜÃàëÃØà ÃðÀf ÃÐMÃÐMà Ã0©Ãð} Ã@MàºÃ@MÃ`³Ã@èÃð$Ã`¹Ã@kÃ0!Ã¥Ã"ÃÃ0¯à í!Ã`¡ÀxÃ@ÖÃFÃðà1!Ã0#àOÃ:À~ÃPýÀûÃ`ÅÃÐèßÃ0¯ÃPå!à=÷Ã@;"ÃÀs#Ã`³Ãpoà ÄÃÛÃ:Ó#ðçÃÐ)!Ã@îÃP€Ãp]ÃP†ÃðÃpiÃиÃ0¯ÃÀ ÃFÃ@ð ÃÐMÃð›ð|ÃðÃÀ£ÃpcÃ:Ã`¡ÃÉÃLÃP’Ã`§ÃPñÃp? ÃpÚðáðçÃpÂÃ02ÃÐeÃpøÃàÃP˜Ãð0ÃmÃ`§ÃgÃ0>Ã4Ã0»ÃÞ÷ÃêÃàbÃðÃaÃà€ÃÐ;ÃPÃ@âÃðÃàŒÃ0Jà ÃÐÖÃÐeÃ"!ÃÀ Ã@}Ã0ÓÃð$Ã@ÃðƒÃ`³Ã`$ÃP†ÃÀÃÀÃpWðÃÐ_ÀœÃFÃaÃàJ"Ã@ÜÃpWÃÀÃ0ÙðvÃÞÃðÃ@Ã`HÃÀµÃLÃÀÃð§Ã@âßÃðÃpÚÃ``ÃàtÃÐÊëÃ` Ãð àCÃPðdÃpÔÃàzÃð à Ã0»Ã( À~ÃpÈÃÐYÀŠÃÐGðóÃÀ,ÃÀ¯ðùÃ@Ãð‰ðˆÃàð|Ã:à ”à ¬ÃÐâÃðÃÐÐÃ`¹àmÃ`ÅÃиÃ0ÁÃÐÄÃ0 Ã:ð ÃÉÃPýÃsÃà Ã`HÃpæðíÃpKÃÀ,ÃÃÃpÚÃðÃ@ÜÀlÃ4ÃLà ùàÒÃàßÃðÃ`<ÃpWà ŽñÃ08ÃRàsÃÐSÃöÃ@Mà Ã@Öà í!Ãp°"ðvðX!ÃÀ!ÃPñÃ0—!àäÃ`¿Ãpcà  ðóÃ@âÃÀÃð›àIÃÃP-Ã@âðX!àCÀ`!ÃpÎÃàëÃ@_ÃFÃÐÄÃO Ãp¼ ÀrÃ@_ÙÃ`­ÃоÃÀ‘Ãàëà®!Ã0 Ã@ÐÃð Ãð<à šÃðÃàýÀlÃàåð|Ã0»ÃÀ Ãà\àÆðjÃðƒÃ`6ÃÀ8Ã0>ÃÃ@SÃPh!ÀïÃ@YÃpÚÃpÔÃp¼ Ã`‰"ÃPå!ÙÃöý÷ÃÀÃ(Ãð ÃÀ!Ãpª#Ãðe$ÃPtÃ4ÃêÃð‰àØÃð$ÃP÷ÃðàÀà |Ã`$À<'ÃðÃÀ£Ã`<Ãð§ÃàýÃ"ÃpKÃ02ÃP†Ã0&à Žà ùÃàñà ŽÃ@_à ”àÒÃRÃðà ÀÃÐÄÃ`6ÃÃÃÀÃ0¯Ã@ÖÃÀÃpæÃиÃ@âÃ`BÃ0µðjÃ@SÃÀ‘ÃpuÃ@wàÀÃPtÃP÷ÃmÃ`¹ÃвÃð¡àÒÃ`*ÃànÃ02Ã`­ÃÀ~Ã@SÃ@YÃÉÃß!ÃÀ‘Ãà ÃpÈà ÃPtÃàëÃO Ã0—!Ã`!àIàÒð^ ÃÀö"Ã@#&ÃPÙ#Ã0,ÃäÃgÃÐAÃpQÃÀÀã ðáÃÀü!ÃÀy"Ãp&àÆÃðÃàßÃÐ/ ÀlÃ0 ëÃP÷ô$ðÏ"Ã`ƒ#à šÃaÃ0‹#à 'Ã@;"ÃÀÃ@âÃp3"Ãp9!ÃPå!ÃPÓ$Àf ÃÀ… ÃpÈÃp¶!Ã@¾!Ã°Û Ãu$Ù"ÃP÷Ã`§ÃP˜Ãð•Ãðk#Ã°Û Ã`¡à ÃpKÃÀ‹ÃPh!àºÃ¥à®!Ã`›ÃÐ5Ãð‰ÃÌ ÃÀ‹ÃàP!Ã@eÃ:ÃPå!àÆÀÃp&ÃPn ðáÃð ðÉ#ð«(ÃÀü!Ã@ÓÀÝ!à=Ã@Ä Ã°jÃàtÀïÃð_%Ãò$Ã@¾!ÀT#à á#ÃàD#ÃÐ/ ðÏ"Ã( Ã[Ãðà ÃР"ÃðñÃPñÃP†ÃàåÀlÃ0 ÃÀ ÃP†ÃP ÃàzÃ:Ãð§ÃPh!ÃÀ"Ãðô!ÃÀ"Ãð‰à¢#ðF$ð@%Ãðk#ÓÃÐAÙÃÐ#"Ã@ÐÃàhÃÞÃЬ Ãp9!ÃànÃ@ÜÃ:Ã`$à ˆÃêÀÝ!ÃÀ ÃÀ‘Ã@SÃ0>àÌðpÃÐMÃpcÃ`­ðçÃÞÃ4ÃaÃÀà=Ã`$à ÿÃ:Ã`‰"ÃPh!Ã@qÃ0¯Ã"ÃÐ)!ÃÀy"À`!ðjñÃsÃêÀûÃPn Ã`<ÃP’ÃÃäÃp]ðÃÀ‹Ã.Ãà÷àØÃàhÃ`0ÃP†à ‚ðÃÀ¯ÃÐGÃpÂÃÀÃ@ÜÃÀðùÃÀÃP÷ÃР"ÀxÃÐMðÃàV Ãp¤$ÃðÃ`<ðÃð¹ðùÃÃP€Ã0©Ã0»Ãmà ÃPýÃà÷ðpÃ0ÍÃÐMÃPtÃ`$Ã`$ÃÐGÃP†ÃUÃ4ÃRÃ0»Ã¥ÃÐ)!÷ÃgÃ"à j"ÃðÃ@Üðù÷Ã.Ã0©ÃÒÃ`§ð‚Ãà÷Ã"ÃÀÃÀÃPÃÀ‘ÃàßÃp]Ã`6Ã4Ã@îÃðÀà Ã(ÃиÃðÃpWÃ@îÃà÷Ã0 Ã.ÃP Ãà\ÃPh!Ã`‰"Ã`<ÃàÙÃàJ"ÃaÃ@qà ”ÃðÃP†Ãp? Ãàåà ó ÃðÃpcð^ à |ÃêÃPýÃàðš÷ÃÀü!à v ëÃÐÖÙÃ@ÊàÆÃ@SÃP€Ã@Ä ÃPzÃÀÃmÃ¥ÃðÃàßðóÃ`§ÃÀ£ÓÃÐ#"ÃÀ—à  ÃP÷àIÃ0ÇÃàåÃ@eÃ@}Ã`ÑýÃäÃÐMÃð‰Ã`*ÃÐ#"ñÃ`HÃÀ©ÃÐGÃðà ”ÃÐGÃ`¡Ã"Ã0&ÃÐ)!ÃðÃÐGà à Ã@YýÃàßÃàÍ!ðçðáÃðñÀxÃÐÐÃàtÃ`$à¨"Ã` "Ã0DÃÀ ÃpWÃÀ2÷àUÃÀ‹ÃpEÀË$Ãà€ÃgÃÐ;ÃðÃpEÓÃ02Ã@eÃànÇ!Ã"ÃÐSÃRÃÉÃànÃðÃàýÃÌ Ã](ðR"Ã"À ÃàŒÃPÃÐÐÃÐâÃ@qÃgà Ã0!Ã`!ÃàëÃ0JßÃpÈÃPë Ã0&Ã0ÁðdÃp9!ÃÀ!ÃpÔÃ@¸"ÃÀ ðpðóÃàÓ Ã0&ÃÀ ÃðÃ.ÃðÃ.àÒýÃ0>ÃÀ£Ã`¡Ãð à1!ÃоÃpàà ÃàÍ!ðÕ!ÃPë Ã¥Ã.Ã`0ÃgðˆÃPðvðˆÀ„ÃPýÃ`0ÃPñÃ0¯ÃpÔÃp]ðÃ@ÜÃP ÀŠÃÀà Žà ÃXðˆà |Ã@ÐÃpKÃàëÀlÃÀ—ÃPÃ`BÃ0DÃP€Ã`<àUÃ@ÜÃpcà ÃД$ÃpÈÃÃdð5ðˆÃÐMÃpìÃÀ,Ãð•Ã0&ÃàÙð|ßðóÃ:ÃàÇ"ðdÃàåÃ0»Ã(ÃðƒðjÃÀ—ÙÃ0,ÀxÃ0£ÃPb"Ã`• à ˆÃpÂÃðÃ`§à ^$ÀõÃÐÄà í!ÃðÃaÃðÃpÎÃ@SÃêÃ°Û ÃàD#à´ ðíÙà¨"ÀlÃ`!ÃPÙ#Ã( Ãð à ÃpÚÃaÃ0#Ã@/$Ã@/$ÃÐ$ÃP\#ÀË$à ÃÐ#ÃP€ÃPtÀÝ!ðjÃpKà1!ÃPýÃÀg%Ãæ&Ã`ƒ#Ãà8%ÃÀa&Ã@”(Ã0"ÃàJ"Ã@¾!ÃàåðÿðX!ÃPÓ$ðÿÃ0&ÃUÃàÙà7 À¿&à í!Ã0$Ã"à ^$Ã=#Ãpª#ÃЬ Ãp°"Ã@ &ðÕ!Ãðe$à¨"Ã`!Ãðe$Ãp°"Ã@/$Ã0ü%Ã0!ÙÃàåÙÃPå!ÃÀ‹ÃaÃàßÃPb"Ã@²#ÃÐŽ%ðíßÃ0©Ã@G à&à ç"Ã@Ä Ã0 à X%Ãì%à ÿÃÀ‹Ã`ƒ#Ã0%ÃК#À×"ð±'ÃðY&Ãà»$Ãþ&Ç!ÀH%Ã` "ÃÀü!ÃÌ Ã$ÃÐ &ðÉ#à p!ÃP€Ã@G ô$ÀÑ#ÀÅ%Ãðw!à p!ÃÐ5Ã"Ã{#ÃPå!ÃðY&ð^ ðóÃ0‘"ÃÀy"à j"Ãp˜&Ã@¸"Ã@_àÀÀã ÃÀ"à á#ðjÃð ÃÀê$Ãà»$à ÿð^ Ã@5#ÃÀ['Ã"!ÃàV Ãþ"Ã"à ÿÃÀ—ÃЦ!ÃÀ—Àrà ç"ðáÃ@¬$ÃÀê$ÃÐ5ÃÀ Ã0&Ã`›ÃpÔÃÀð#Ãp'$Ã@¬$Ã#ðÕ!ÃР"ÃPV$Ãà»$à j"ÀlÃPb"Ãðâ$Ãp’'ÃàP!à´ Ãà8%Ã` "Ã0£Ã`!Ó#ú#à´ Ãðî"Ã0$ÃÐ)!ÀlÃ"Ã`ô%Ãpª#ÃЈ&Ãp'$ð^ à¨"ÃÐ$ÃиÃUÃ0!Ã"Ã"ÀZ"Ãðâ$ÃÀs#Ã@A!ðÕ!Ã0 Ã:ÃàÙÃ` àCÃÀ!ðX!ÃК#ðdÃ¥ Ãp°"à Õ%ÃÀy"Ãð Ã`¡à ŽÓ#Ã`ƒ#Ãðw!ÃÀs#ÀN$Ãð ÃÀy"Ãð_%Ãl0Ã0…$Ã`!Ãànà´ ÃÀü!Ã.ÃPå!Ã°Û Ãþ"ÃàÙà ‚Ãp3"ÃÀü!Ù"ÃÀs#ÃàD#Ã0&ÃÀ!Ãi&ÃP\#ð@%Ãà8%ÃPb"ÃO Ã`›ÃÀü!Ã"!Ã0#ÃÀ"Ã0—!Ã0"÷Ã"Ã`‰"Ãð§Ã`$Ãp¼ à ‚à®!Ãð} Ãp°"Ã@;"ÃÐ/ Ã0&Ã"!Ã@5#ÃpEÃØÀf ÀT#ðÏ"Ã"!Ã0‘"à+"à ^$Ã@/$ß!Ã¥Ã[Ã"!Ã"Ãðq"Ãþ"à ^$ÃàÇ"Ãp'$à+"ÃÒÃ`!ÃД$ÃÐ#"ð½%à ÿÀf ÃPë à !Ãp3"ÃÐ'Ãp¶!ÃPß"ÃPß"ÃÐ%ô$ÃàP!à1!ÃÐ &ÃPÍ%ÃpÂÃðî"ÃàÁ#à1!ÃàhÃК#Ã@²#ÃÀê$ÃPë ÃPë ð^ ÃÀ‹Ã7$ÃpÂÃ@¸"ÃÀa&ÀÑ#Ã@)%Ã0‹#Ã@#&à Ã(Ãðè#ÃàD#ÃЦ!Ã@ÐðÕ!à !ðçðdÃàµ%à X%Ã"Ãàµ%ÃÚ(Ãp’'Ã0ü%à Û$ðÃ$Ã`!Ã0%ÃàÇ"à%#ðX!ÃpÎÃðÃp&Ã"Ãðè#Ã0#àœ$ð()Ã@5#Ã@¾!Ã` Ã@/$Ãp˜&à ó Ãàµ%Ã0ð'ÃPÓ$ÀB&ðF$ÃЬ ÃpÈÃàJ"à í!Ã=#Ãp’'Ã`î&Ãò$ÃPÇ&Ãì)Ãà¯&ß!Àã à Õ%ÃpŒ(à ^$Ã`w%Ã{'è&â'Ãà>$Ãp¶!ðR"ÃàÇ"Ãpª#ÃàÙÃÀö"ÀZ"÷ú#Ãðâ$Ã@¾!Ãu$ÃК#Ãð‰ðáÃà\Ã0 Ã0¯à |ÃÀ!à„(ð()ÃÆ!à j"ÃðS'ÃPÇ&Ãðâ$ÃPD'Ãðk#ðÉ#ð±'ðÏ"Ã` Ãø#ÃPb"ÙÃp¶!Ãðâ$Ãðî"Ãà8%Ãðô!Ã1%ð.(ð:&Ã"ðL#Ã7$ÃÃp°"ðL#Ã@5#ÃÆ!Ãmà Ã@MÃp-#Ãi&Ãà)Ã`k'Ã0…$ÃàD#à1!ÃÐÖÃðÃÀ ÃI!ÃК#ÃÀm$Ã`e(Ã#ÃÐ)!Ãp¶!à ç"à–%ÀÑ#à–%Ãà>$Ã`#Ãp'$Ãðe$Ãp¶!Ù"ÀéÃ@YÃ1%ÃP>(àœ$Ãp¤$Ã"Ã0…$Ã`‰"Ãðô!ÀûÀÃì%Ãpñ,ÃÐ'Ã@A!Ã@;"àCÀéàœ$ÃЬ Ã0!Ãp°"ðÕ!Ãðw!ÃàÍ!ÃðÜ%ÃðÜ%Ã0&àÌÃpEÃàÁ#Ã{#Ã0‹#Ã"ð·&Ãðk#ÃК#Ãð ÀZ"ðX!ß!Àã ðÏ"Ã@)%à p!à É'Ã0%à%#Ã`ú$ÀH%ÃðÐ'à¢#Ãà\ÃÀ Ãp3"Ãø#ÃР"Ã@A!ÃPV$ÀN$Ãu(î%Ã@5#Ãp¼ à à%#ÃPë ÃÒÃ"ÀË$ÃàJ"ÃàÓ Ã 1!ÃÀê$Ã%'àŠ'Ã@²#Ãp¤$Ã1%Ãà8%ðF$Ã0¯ÃàÓ ÃÀ!ÀB&Ã@5#ÃàÙÃÌ ÃPÇ&à$Ã"à !ÃàD#Ã@¸"À`!ÃÀð#ðF$Ãðq"Ã0…$ÃàP!à !ÀT#à Ã(Ãp¤$ÃàÍ!Ã@Ä Ã€×"Ã0#Ãðî"ÃÀ… ÃÀm$Ãðe$àOà p!ÃàÁ#Ãp3"Ã0"Ã0!Ã1%à Ãðk#ÃÐ#Ã@²#ÃР"ô$ú#Ãp!%Ã`ô%ÃÀä%ÃÐ)!Ã`‰"ÃðÖ&Ã@'Ã`}$ÃД$ÃP»(Ãà,'à Ï&ÃðY&ÃðÖ&Ã7$Ãpª#Ãþ&ÃÐ)!à í!ÃPV$Ãp-#Ã@¬$à |Ã0$Ãà£(Ã`‰"ÃÀy"à%#ÃðÀlÃ0ü%Ã0 ÃI!ðR"ÃÐ%à F(ÃÀ"Ãð Ãðw!à !ÃÀ"ÓÃ`è'à 'Ãþ"ÃÀê$ð½%Ã$ÃPb"ÃàÍ!Ã@;"ÃÀ"Ó#ÃPÍ%ÃЂ'ÃPb"Ã`ƒ#Ã`$ðR"Ãðô!ÀN$ÃPÁ'à®!ÃP÷ÙðF$Ãðk#Ãðw!ÃÀ!ÃÀü!à´ à7 ÀZ"à+"Ã`›à1!ðÏ"Ã0%Ã0$ÃPÙ#Ã`#Ãp¼ Àf ÃР"ÃPÃàÓ Ã`}$ÃP\#à á#à ÃÀs#è&Ã0%Ã"ÃPb"ðR"ðL#à %à %Ã`ú$ÃÀü!Ã@5#ðÏ"ÃÀê$Ã.ÃpÂà í!Ã=#ÃPJ&Ã0#ÃP\#à ùÃðe$ÀÑ#ÃЬ ÃpcÃÀ!Ãà'Ã`#Ã`!Ã`ƒ#Ã` "ÃД$ÃPß"Ãpª#Ãp'$Ãø#Ã`ô%à%Ã"Ã@A!Ãpª#Ã`$Ãàµ%ÃI!ÃÀ‹Ã@Ä Ãº#Ã`ú$Ãi&à X%ðL#Ãp°"ðjðÿÃàV à ùÃ`ú$Ã0%à%#ðçÃPÙ#Ã@(ÃÐv)ÃØÃ0£Ã°Û Ã`ÃР"Ã0$Ã0‘"à ÀûÃиÃ`}$ðL#ÃÀs#Ãp3"à ç"ÃÐ#"Ã0$à j"ÀÑ#Ã`ƒ#Ù"Ã`k'Ã`ú$ð½%Ã#ÃPn Ã@Ä ÃÀ… à¨"ÃÀü!Ã0"Ã`‰"Ão%ðR"ÃpEÃ@MÃÀ… ðÏ"Ã{#Ã( Ãp'$ÃàÍ!ÃPtÃp9!ÃÀü!ÃÌ Ãà»$Ãp9!Ão%Ã@;"à¨"Ãðú ðÉ#Ã@¬$ÃÆ!ÀéÃÀ!Ãp¼ Ã`‰"Ã"ú#ÃÀ!ð½%Ãðe$Ã0!ÃO à ‚ÀlÃà\Ã"Ã¥ Ã0‘"Ã{#Ãð Ã`• à X%ð:&À¿&ÀZ"ÃÀ‘ÃðƒÃ`$à7 ÃP ýÃpEÃ`§à ÿÃ@5#Ãà\ÀT#Ã0ü%à ó ÃO Ãðô!ÃÀ"Ã@#&ðF$ÃÀê$Ãð•Ã¥ÃPñÃð} ÃPb"ÃÒÃ"!Ã{#Ó#Ãp3"Ãðú Ãp¼ ÃÀ!à%#ÃàÓ Ã`*Àã ÃPñÃàJ"ÃÐ/ ÃðƒÃPÍ%à ÃððóÃð Ã"Ã0‘"ñÃ`§Ã@A!ÃÐ;Ã[ÃpÂÃPtÃ@5#ÃPn Ã0!Ã`!Ãp¶!ÃÀýðóà !ÃÀf à=ÃpÂà |Ã`³ÃàV Ã@MÃðq"ðF$Ã0 ðÏ"Ç!Ã"Ã@ÐëÃ0¯Ãð‰Ã0!ð½%à%#ÃÆ!Ã0‘"à7 ÃÀ!ÃÐ%ÃÀ… à #ÃðÃ`• ÃàJ"Àf Ã@G ÃPß"ÃÌ ÃÀ!ðF$Ãp3"ÃðÃO ðÃ$ÃO à ùà ഠÃ0‹#Ã@¬$ðÉ#Ã0—!ÃPV$ÃP>(à7 ÃàåÃpÈÃ0‘"ÀÝ!Ãp¼ ÃP’Ã0,ÃaÃÐ/ Ãp!%ÓÃÐÐàOÃ(à |Ã0£Ã0‘"ÃÀö"ð@%ñà ÿÃPÇ&Ã@¬$ÃI!Ãp9!Ã` "ÃЦ!Ã@A!ðíÇ!Ã@ÐÃp? Ãðà ÀÑ#à !à®!ÃðÃ` Ãp-#ð^ Ã@_Ã0»Ã@MÃàV ÀlÃ`!Àã à%#Ãò$î%à p!ÃðÃÀ,à v Ã@Ðà7 ÃPb"Ã`‰"Ã0 Ã( ÃàÍ!ÃÐ$à ç"àÀÃ@ÐÃ02à ‚ñÃpEÃЂ'Ã`}$ÃÐMÃÀÃ`<ÃpWÃ0,Ã"ÃI!ÃÐ'Ã@¸"à7 Ãð àCÃЬ ð^ à Õ%ÃàV ÷Ã@ÖðÕ!Ãðw!àCà ‚Ã@;"à¨"ÃàV ÃpÂà ùÀf à ˆÃÐ)!à ó ÃpÈÀÑ#ÓðX!ÃÐŽ%À`!ÃpEà p!ÃÀ"à ç"ÃÐ#"ÃР"Àã Ã0%ÃÀê$Ã0"à ó Ã@A!Ã0‹#ÃðƒðáÃ0»ÃPýðóÃðƒÃp¼ ÃpQÃÀg%ÀN$àºÃ0&ÃpEÃÐ)!Ã@5#Ã` ÃÀ!ðóÃÀ!ÃÀ"Ã@G Ù"ÃÐ5ÃPn Ãðô!ÃPn ðáÃÀ—ðÕ!Ã` "ÃÒà ŽÃº#ÃÀ!à+"ÃÐ)!Ã#Ã@;"à1!ÀË$Ãðè#ÃàÇ"ÃÐ/ Ã0 Ã@;"à à+"à%#Ã@5#Ãp¶!ÃÆ!Ãðô!Ãp¶!à+"ÃР"Àã Ãp¶!Ã"!ÃpQÃðw!Ã@5#Ã@MÃð‰ÃàbÃ`ÃP\#ÃÐ%ÃÐ;Ã@¸"ÃPV$ðÃ$Ù"Ãðî"à ÿÃ"!À×"À`!ðjÃ"ÀlðpÃÒÃ0"Ã`¡Ã`$ÃÀ… Ã"Ã@ÖÃ`­Ã`*ÃÐÐðÿÀ„à ð^ ÃÀÃðô!Ã0 ÃÐÄÃàýÃ`*à´ Ã0¯Ãиð|Ã@¾!ÃàV ÃUÃÀ£ÃðÃØÃÀ‹à ùÃÞð‚ÃÃðq"Ã@ÊÃð àCðÉ#ÃpÂà ÃÀ—ÀðóÃ@¾!ðÕ!ÃðÃÐÊÃ"Ãðî"Ãðk#Ã`Ã@úÀŠðˆÀéÃоÃ@ÊÃ`!Ã`<Ãmà àÀÃPýÃ0£ÃðÃðÃð Ãà\Ãð} Ã0ÁÃ°Û ÃŸ!ÃÀ… À„ð”à ÃÐ_ÃÐÐà ùÃÐÊÃ0,Ã`$ÀZ"ÃàÙðà ÃpWÃоÃàhÃp]Ãð ÃàhÃ@ÐÃàßà |ðáà p!Ãð•ÃpQÃ`0ð Ã`ÀZ"àÀÃyÃ0©ðL#Ã`*ÃðÃO ÃÐ/ ÃÀÃ`$À ÃÃ@MÃpÎÃÀ¯Ã@eÃ0"Ã@ÊÃ@Yßà7 à í!à´ ÃÀ!Ã`­Ã"!ðdÃàtÃPn Ãpž%ÃFÃ@qÃà\ÃðÃ0ÙÃ.ð|ÃmÃÐ#"ÃÀö"Ã¥ Ãð­à  Àõà |Ã0©ÃP÷ÃÐ/ Ã@SÃÀ—Ã@Ä Ã0£Ã@¸"ÀrÃ`0ÃÐÜëÃÀÀûÃ@ÐÃ` ÃO Ã`­Ã0»ÃÀ¯à ˆÃ0‘"ÃàbàÀÃÀÀÃ@èà7 ÃPV$à j"Ã0!ÃFàäÃ:ÃàÇ"ÃPn Ãp]Ã:ÃÐGÀÃêà í!ÃÐ5Ã:ÃЦ!Ãp? ÃàP!ÃàD#Ãpª#Ã@G Ã0£à p!Ã0 à1!à ÃàbÙÀf à ó ÃвÃPtÃPtÃ°Û Ã0ü%ÃК#à¨"Ã"!Ã0 Ã0£àCðdÃP†ëÃ{#à7 ÃР"à%#ð½%Ã#ðjÃÀy"ÃÀy"ÃÀs#Ã0y&ðL#ÃиÃ@G ðL#Ã0y&Ã`w%ðçÀÃÒÃð} Ãp¼ ÃД$à á#ðÏ"ÃPÇ&Ã(Ã@'Ã0$à R&ÃÀ"Ã0"À¿&Ãc'à–%À6(ÃД$Ã0$ÃÀy"Ãðq"Ã"!î%Ã@Ž)ÃÀê$Ã"Ã@¾!ÃÀ—à=Ã@ÊÃÐ#ÃÀs#ÃàÁ#Ã@/$à %Ãi&Ã0‹#Ãðà !ÀéÃ`w%Ãþ"ÃàP!ÃÀy"Ãæ&à Ï&Ãò(À<'ÃÐ$à d#à ^$Ã@¾!ÃàÙàœ$ÃÀê$ÃPb"ÃàD#ÃC"ÃàD#ð½%ð:&Ã`}$Ãì%Ã0ö&à%àœ$Ãðk#Ãð_%à ðÃ$ð:&Ãæ&Ãp'ðX!Ã@ÐÃàJ"ÃÀê$ÃPÙ#Ãà©'à Õ%Ãà>$Ãø#Àf Ã`}$ÃPP%ÀT#ÃÀa&ÃPñÃÃPå!Ã1%Ãpž%ÃC"ÃÐ#"Ã0$àºÃ` "ÃÐ#Ãà8%Ã0"Ãp'$ÃPß"Ãp!%à p!à&ÃР"ðáÃ.ÃØÃaÃðÖ&ÃÀü!ÃpQÃÀð#Ã"Ãp°"Ã`q&Ó#Ã7$Ã`!ÃPë ÃÀ"ÃЦ!ÃÐ%ÃÐ)!ÃÀ‹Ãðk#Ã@ &ÃàD#ô$Ãà»$ðR"ð@%ÃÐ%Ã(Ã0s'à¨"Ã`k'àŠ'Ã` ÃO Ãp? ÃàÍ!Ãu$Ã@/$ÃÀa&ðÏ"ô$Ã@A!Ã"!Ã"Ã0£Ãì%Ã@²#ÀÝ!Ã0%Ãðâ$à Ï&À**ð¥)Ã$Ã`}$ÃpÂà ‚ÃðÃ"Ãðâ$Ã`w%ÀË$ÃPb"à ç"ÃPP%Ãà2&ÃPß"Ã7$À×"ÃÐŽ%ÃðÖ&Ã0‘"Ã0&ÃÐ%Ã`$à 'Ãà©'ÀÅ%Ãp3"ÃÀê$Ã$ÃР"Ã` "Ã`• Ãð‰Ã`!ÃД$Ã0—!à ^$ÃÀð#Ã0m(ð4'ÃPb"à=â'Ã0Þ*ÃÀð#Ã`‰"Ã0 Ã`‰"Ãp3"Ãà8%à–%Ã`ú$Ã0‘"ð:&Ãðè#ÃвÃД$Ã0%Ã"ÃC"ÃÀê$ÃК#ÃUÀÝ!Ã"ÀéÃ0¯ðL#Ãþ"Ãu$ÃÀð#Ã0 Ãp-#ÀrÃLÃ[ðL#ðX!à¨"Ãà>$Ã0…$Ãà\ÀN$ÃвÃÀ Ç!ÀË$Ã0y&ÃàßÃ0,Ãø#àœ$Ã@Ä Ã`!Ã`• ÀÑ#Ã@;"Ã` ÃPtÃÀ Ã`¡Ã@'Ãp-#ÃàbÃPÃÀÃ1%Ã0©ÃЬ ÃPß"Ã0…$ðáÃpQÃ@MÀT#è&ÃÐ$ÃД$ÃI!àÆàºðÕ!ÀrÃ0µÃвÃp¶!Ãp¼ à d#ÃpQÃ`HÃÀ‹Ã0&Ã08ÃÐ/ Ãðw!ú#ÃO ÃP\#à ùðÿà ÿÀlÃ` "ðçÃpKà v Ã0!Ã`¡Ã`!ÃP÷à |à á#ÀË$ÃàJ"ÃpKÃàßÃÐ/ ÃaÃp¼ àIÃ@/$Ã` à í!Ã0&÷ðX!ÃÌ ÃPzÓà=ðÃàýÃ[à !à ð‚Ã` Ã"ÃÐ#Ãðe$à í!ÃÀÃР"à d#ÀéÃР"ÀÝ!à À ðùà ˆÃPn à !à p!ÙÃ0,à ˆÃÀs#Ãp¤$Ã@Ä Ã ÒÃÐ/ à ˆÃmà ÃÀÃ0&à p!Ãðƒà ùÃðÃÐYÃPÃР"Ãà»$Óß!à X%à%#ðáÃÀ!ðdßÀxëðÉ#ÃÀü!à šðÿà ÃÀ… Àã ÃPå!ÀûÃàßð^ ðpÃиÃPÍ%Ã"ÃÀ Ã`$à=ÃàP!ÃpÔÃ0µÃ@;"ÃЈ&ô$à ÿà Ã@¾!Ã0 à p!Ã`k'ÀÅ%à ó Ã0©ÃÀÃPÃàÙÃÐ$Ã@âÃpEÃ0"Ã1%ÃPµ)ÃPtÃÒÃP’÷Ã`<Ã`¡Ãp¤$à !Ã7$Ã@¸"ÃÀ"ÃвÃðÃ0%ú#ÃPå!Ã`!ÃPß"à R&à %ÃàÙÃ0%Ãp&Ãø'àCÃPÃÀ"Ãpª#ðdÃ`­ÃÀ‹ð^ à%à$ÃвÃ0 Ãðè#ÃàÓ ÃXàCà v ÃÀm$Ãðq"à$Ãp'$Ã0%Ã0 ÃÐ/ Ã`#à´ ÃPV$ÃвÃ@A!ÃÐ)!Ã$Ã` "Ã0"Ã@#&Ã&Ã](Ã0ü%ÃðÊ(Ã@ˆ*ÃÀº,Ãà-Ã@ç/Ãph.ÃðA*Ãpý*àT0ðu1ÃÀ2ÃÀ1ü1ÃÝ2à 1Ã`)2Ã’4ÃàU5ÃЙ8Àô2ÃÀ„5Ã@X2à u5Ãðÿ4Ã<8Ã@¥:ÃàÆ7ÃPö3ðÂ9Ãñ9Ãp&9Ã0–6ÃÐ(6ÃðÛ:Ãå;Ãp>Ã09ðª=Ãp…>ÃÀË>Ã0f>Ãà®;à :Ã`‚8Ã@™<ÃÀé9ÃÐ<Ãp:Ãà=9Ãà%=ð’AÃ0l=ÃðÏ<ÃPO:ÃPÀ<ÃЇ;à @Ãp>ÃPÒ9Ã0r<ÃÀB@à 9?Ã@ ?ÃÐø=Ãp<Ã0`?Ãð4AÃp—;Ã`á=Ãð4AÀ²=Ãý;Ã0~:à Q;Ãð:@Õ>àq@Ã\=ÃÐu>ÃÐò>ÀG:ÃðÏ<À¦?À²=ÃÀ`;à Ô:Ã@=Ã=Ã0x;àw?Ã`d=ÃÐo?ð¤>ðª=ÃÐæ@Ã@@ÃÀé9Ãp¯7à :à;Ãp;ÃÀé9à ¼>ÃðR<à‰<ÃÐþ<Ã<8Ã’8Ã`í;Ãb@Ãàœ>à K<à W:ó9ð3<ÃÀf:Ãh?ÃðF>Ã`‚8Ãp?Ãàœ>ÃPO:à•:Ã@±8ÃPä6ÀY7Ã@@6à­6ðÎ7ù8Ã@";Ãð@?ÃðÛ:ÃPØ8ÃT4Àè4ÃÀÝ;Ã@±8ÃŒ5Ã@½6Ã@F5Ã÷8Ã0+3Ã×3Ãð0Ã!6Ã0¨3ÃðŽ2à<4à9ÃП7Ãpµ6ÃÀ„5Ãð2Ã0C/Ã`)2ÃË5à o6ÃPð4Àe5Ã@½6À‰/ÃpÇ3Ã`4Ãï/ÃÀœ1Àk4Ã`6Ã` 3ÃPs4ÃN5Ãàm1Ã@F5ÃZ3ðu1ÃÈ/àË1ÃÐ@2À›,Ã`5ðc4ÃàÌ6ÃðŽ2Ãp\0ÃÀ+/Ã@^1ÃPs4ÃàÒ5Ã`¦2ð/ÃÐR/Ã`/1àH2ÃÀ¢0Ãàm1ö2Ã`#3ÃÝ2Ã@X2à ".ÃP/Ã7ä1ð“,ÃpÓ1Ã`2Ã0Ò,Ãpý*Ã0Ø+Ãà£(À.Ã`G-à ¥-Ãpë-Ã0U,à`.Ãà.Ãàg2Ãð1à 0Ã0Ò,Ã`Ê,ö.ð/Ãõ.Ã@ˆ*ÃP…1Ãé0ÃÀÆ*Ã`Y*ÃÐÕ.Ãph.Ãx.Ã~-Ãà+Ã-ÃÈ+àÝ.Ãp )Ãø'Ã9.ÃÐF1ÃÔ-ÃÐá,Ãà)Ãpt,Ã`Ê,à @)à @)à +ÃP -ÃðS'ÃPV$à ½)ü-Ãpñ,ÃP2*ÃÐÏ/à Ÿ.À.Ã0C/àé,Ãð5,à ½)à)Ã(à~)ÃÀº,Ã0C/Ãû-Ã@š'Ã0ð'ÃÎ*ÃP/ð/Ãà&(Ãþ"Ü(ÃÐF1Ä,ÃPÁ'Ã0ö&Ã`#Ã0ö&Ãà*À6(Ã0%ðL#Ãæ*àr+Ã`è'ÃW)Ãà)Ãð5,Ãà*Ãp&Ãà2&à ·*À¡+ð«(ÃPP%à .,Ã@'ÃP-Ãp )ô$Ã@¬$àï+Ã0ð'ÃÀa&Ã`Y*Ã@ÿ+ú#à¨"Ã&ÃÀm$à Ï&Ã@'à F(Ã%'ÃÀg%Ã`$à)ÃÐí*Ã`_)ÃÀÞ&à á#ÃЈ&ÃðY&à X%Ãðô!ÃÀö"Ã`Y*ÃÐí*ÀË$ÀË$ÃPb"ÃPë ÃàÁ#ð4'ÃД$À0)Ã{#Ã`ú$ð4'à(à 'ð4'Ã`Ü)Ãðe$à X%à ½)à Û$Ã0a*ÃPD'à ^$Ã0&ÃàÍ!Ã,Ã@#&ÃР"Ã`$ÃðY&ÃðÜ%Ã0©ÃPÍ%ú#Ão%à¨"Ãàßàœ$ÃÀØ'Ãà2&À<'Ã$Ãà2&Ãà»$ÃðÜ%Àéà7 ÃÐÿ'ÃÀm$ð@%ÃPJ&ÃPÙ#Ã` "ÃàD#ð@%Ãp¶!à%#Ã$Ã`#ÃàD#à&Ãp'Ãpª#Ã+&ð¥)Ã1%Ãðâ$Ãp¶!Ã`!àIÃäðF$Ã0#Ã1%Ã`ƒ#Ã$Ãpž%ÃÀ… ßÃ0!Ã&Ã1%Ão%ÃР"à ó ÃÐAÃ@ÖÃ@Êà7 à !à–%ÃД$ÃÆ!ÃÀä%ðÃ$ÃPÙ#ÃÐ$ÃðÖ&à É'ÃpÂà |ÃÐ5ÃàÙÃp? ÓÃ0—!Ã{#Ã` "ÀÝ!ÃpàñÃð} Ã0¯Ã°Û Ãà\à j"à ç"ð^ ÃgÃ0!ÃPÙ#Ãà¯&Ã0£Ã0&à+"Ãþ"Ã02ÃpKà ùÃC"ÃЬ à ðvÃ`­Ã0©Ã@;"ÃP\#ÃP€ÃÐ'ð±'ô$à j"Àð|Ã0 ÃиÃÃ@Ä Ã =ÃоÓÃ0¯à+"Ã=#Ãðk#ÃðÜ%Ã=#Ã@ÖðdÃà\ðíÃ0"à ÃðÃþ"Ãp'$àÀàºÃðw!Ã`$àÀú#ÃàD#à%#ÃpÎÃÒÃàD#à7 Ãð} à%#ÃàÍ!Ã4ÀÝ!ÃÃð›ðÕ!ô$î%ÃÐ#ÃC"Ã%'Ãðq"Ã`• Ãиà !Ã[ÃPh!ÃðƒÇ!ÃвÀÝ!ÃÀa&Ãì%ÃÀs#ÃÒðçà ŽÃðà ÃpQÀã ðÉ#Ãðk#ÀT#ÃÐ;ÃUà Ãp9!Ãðî"ðL#Ãp°"Ã¥ À`!à&ÃàD#Ã0%à v ÃÒÃØðáÃ@¸"ÃЦ!Ãðî"à %Ãò$ÃàÁ#ÃÐ$ÃЦ!Ã( Ã@Üð@%Ãp*Ãp*À¡+ðŸ*Ã0ä)Ã@'ÃК#ÃÐ|(Ã`Ö*ÃÔ)à ·*àï+Ã0Þ*ÃP©+à +àZ/Ãàö/à 4+Ã0[+ÃP&,ÃÐÉ0Ãà‘+ÃP2*ÃðG)Ãp*Ã0C/ðo2Ãpå.ÃÐÏ/À›,Ã`¾.Ã],Ã,Ã@+ð¥)à +Ã@ç/ÃpP2Ã@^1ÃP…1Ã0Æ.Ãà…-ð+Ã0Ò,Ã0Ì-ð .Ã0Ì-ÃP—.ÃP-Ã`S+Ã0Ø+à ·*àõ*ÃÐç+Ã`Ö*À§*ð+ÃÂ,ÃW)Ãu(Ãð).ÃÀÀ+ð/Ãpå.à ·*Ãi*àH2Ã@Ï3à 0Ã0Ò,Ã`Ö*Ã`Y*Ãpå.Ã0C/Ã`;/ÃÀ¨/ÃÀº,Ãà.Ãà.à ·*Ã`â(Ã0Ø+ðþ/ÃP0Ã?-Ãà )ð“,Ã@Ž)À6(Ã`Ê,Ãà.À,ÃW)Ã0a*À•-Ã`Ö*Ã0[+Ã`q&ÃP»(Ã0U,Ê+Ü(Ãpt,Ã9.ð,Ã@ó-ÃÀ´-ÃÔ)ÃÐÿ'Ã`Ð+à «,Ãpn-à 0Ãðš0Ä,ð()Ãì)Ã@+Ã`Ð+À,ÃðÄ)Ãà‹,àZ/Ãà+ÃÐá,Ãà‹,À,ÃðÐ'àã-à (-Ãð¾*Ã0ö&à @)ð/Ãi*Ã0[+ÃÎ*ð,ÃÐù(Ã0[+ÃÐó)Ãð5,À-Ãð¸+Ã0[+Ãø'Ãà¯&Ão)ÃQ*ÃP2*Ãò$à É'Ã`â(ÃP©+ð«(ÃPÁ'à ·*ÃðÐ'Ã1%ÃÐj+à~)ÀT#Ãà+ö.ÃP&,ÃP2*ÃðS'Ãðú à ç"Ã@¬$Ãò(Ã$ÃÐ#ÀH%Ã`S+Ãæ&Ã%'Ãà,'ÃЂ'Ã`ô%Ã`Ö*ð+Ãà )Ã@¸"Ã7$ÃÐÿ'ÃPJ&ÃЂ'àœ$Ã@#&ÃÚ(À¹'à(Ã{#Ã$Ãp(Ãðâ$Ãc'Ã0g)ÃP»(Ã@²#ÃP\#à ·*Ãð¾*Ã@(ÃðM(ð()ÃÀC+Ãà8%à Õ%ú#À³(Ã@(Ãðâ$Ã@;"Ã"ÃÐù(Ã`ƒ#Ã@#&Ã0ê(ÃðA*à L'Ãðâ$Ã](î%ÃI!Ã0ö&ÃÐÿ'à$Ãðk#ÃàÓ Ã`ƒ#Ã0g)À¡+ÃÐ &ÃÀð#ÃPJ&àœ$Ã@/$ÃÆ!Ã0%Ãðâ$ÃàD#ÃPJ&Ãp’'ÃÐ#Ãàµ%Ã0m(Ãu$à ùÃàP!Ã`w%Ã%'Ã](ÃÀØ'ÃÀa&Ãð_%ÃP\#Ã#ÃPÍ%Ãì%à7 ÃðÜ%ÃàÁ#ÃÐ$Ãà2&Ãà»$Ãpª#ÃðS'ÃÐ$Ãp¶!ëÃð_%Ã(ÃÐv)Ãà»$ÃàÓ Ã"à„(Ã0ð'Ãpž%À`!à í!Ã`³À×"Ã`k'àœ$ÃÐv)Ã0y&àÆÃàÓ Ã j"ÃÆ!Ã@#&ðÉ#Ã0—!àºÃ` "Ãðk#ÃO Ã0‘"Ãu$Ù"ÃÐAÃ`• ÃPh!ÃàßÃ0¯Ã$ÀH%ÃPP%Ã`‰"ÃpKÃ`›ÃÀö"ÃÌ Ãäà ”Ã@ÊÀ<'ðÏ"ÃPñà |ÃÀ… Ãp9!ÃPzÃêà ŽÃàV ÃPh!Ãðô!à&ÃÐ/ ÃÐÊÃpÎÃpEÃpEÃ@MÀã ÀéÃp? ÃI!ÃC"Ã@ÊðR"à®!ÃЬ ÃC"ÃиÃ`¡ÃàD#àCÃ0,ÃUÙÃð} Ãðî"Ã@A!ÃàåÃ0£ÃPýÃPb"Ã"Ã@MÃ`§Ã°Û ÃÐ5÷Ã@;"à´ à á#à j"ðX!ðÏ"ÃÀs#à ç"ÃPzÃ4à ç"Ã`• ÃàP!Ã:Ã@_ÃPë ÃgÃ@âÃиÃвÃ°Û Ã€xðjÃ4Ãàµ%Ã@ &à ùÀrÃpKà À`!Ã.ð^ ÃÀ—ÃàÓ Ãð ÃPë à ùñÃàÓ Ã0£ðáÃäÀrÀéàÆðçÃÒÃЈ&ÃÆ!à ˆÃ0 ðL#ðÏ"Ãp°"Ã`³ÃPå!ÃC"Ã`›ÃO ð^ àÌÃPÙ#ÃÀð|Ã@SÃ"Ã0»ÀrÀ×"ÀN$ÃÀü!Ã@SÃð§ÃÀ ÃÐÄàIÃÀ—ÃPýÃð} ÃêÃð§Ãà€ÃÐAÃPtÃÀ~ÃPŒÃpÎðçÃ@G Ãð} àÌàOÃÃØà ç"Ã@A!Ã0,Ãð à ÀxðvÃÀ×"ÃàÓ Ã`$Ã`ÅÃàhÃ@ÊÃ`*ÃðÃPýÃaÃàßÇ!Ã.ÃÌ Ãgðjð|ÃpQÃpQð|Ã`³ÃPýàÀÃоÃ08ÃÃÀ‹ÃPå!ÃpKà 5Ãà÷ÃàbÃÀ à Ã@SÓÃиÃPn Ãиà |Ãà\ÃPP%Ã"ÃÐÄÃàýà ”Ã@úÃ0ÁÃ(ðçÃ`!Ã0ÁàÒÃgÃäà ÿÃÀ!Ãp¼ àIàöÃ0ÙÃЬ ÃPýÃaÃ` ÃàÙðjÃ0"ÃPtÃPŒð|à ùÃðÃ>Ãøî†ÃxtðYŒÃhúˆÃÀž‡Ãt…ÃÖƒÃ`C„ÃĂÀ&ÃÐl~Ã0i|Ã@7vÃðytÀßtÀ\uà ãvÃPvrÃpÖoÃÀ™pÃÐÒmÃÐÞkÃÀ.mÃ0ÏkÀlÃ@änÃÅnð¢hÃ`ÓiÀkÃÐeÃpwjÃÐðhÃ0pfÃp•eðÌaà(aÃÐdÃ`Œ`ÃЩ_à m`ðÞ^à ö^à ê`ÃÕ]Ã@Ç^Ãp§bÃ`˜^Ãàe\Ãàè[Ãð'XÃ@V\ÃÀù`ÃÃ`Ã`?XÃÐÍYÃ0)]ÃP[ÃÿVÃð9UðWàdWðüYÃÐPYÃ`9Yà µTÀXÃäTÃgPÃ0qQÃðÈRÃÒSÃpõUÃpSÃÀÖQÃÀÖQÃüPÃpSÃðàNÃ;MÃPÃ@@Ã0Z@Ãà%=ð†CÃÀ6BÃÐcAÃÐÎDÃà~Càw?Ã0Z@Ã0ÅCà -AÃP==à W:Ãà+<Ãp…>ÃÀf:ÀÐ8á<ÃÀFÃ@KIÃ`^>ðQ7Ã>à:ÃÐ<Ã@“=ÀÐ8Ã06à:à ?>Ãp?Ã=Ãðá9Ãà1;ÃPÌ:Ãð^:Ã`ù9Ã`í;ÃÀ`;à Q;Ã`|9à ?>Ã0ï<Ãz8ÀS8ÃPä6ÃŒ5Ã0:ðE9Ãz8ÃðÛ:Àk4ä5ÀÖ7à¹4Ãp:Ã`6ÃPê5ðE9ÃàÀ8ÃЙ8Ãñ9Ã`‚8Ã@@6Ã-4ÃЫ5à æ7Ã`|9ðÎ7ðÚ5à ]9Ã`4Ã0 8Ãð‚4Ã@48ÃB7Ã0®2Ãн2ðà4Ãðv6Ã0%4ÃŒ5à9à 3Ãàm1ÃPö3Ã@^1Ã@Û1ÃÐÉ0àT0ÃÀ3à<4Ãpb/Ãз3ÃÐÏ/À.Ã@j/ð/ðò1Ãðÿ4Ã`/1Ãð1Ãàm1àB3ÃÀœ1Ã0º0Ãp>5ðì2Ã`2Ãð¦.àN1ÃÐÛ-àT0ö.àT0Ãr/Ã0´1Ã071à 6Ã4Ã`¬1Ã`²0Ãé0ÃPð4À}1ÃpÙ0Ãàä2Ã@d0ÃP£,Ãð¬-Ã`50Ãð#/Ã`2Ãà‹,ÃP/ä1ÃÐá,Ã`4Ãðˆ3à /ÃP1Ã0º0ÃÀœ1ÃÐÕ.Ãð).à 0ÃpÓ1ÃP2à<4ÃH6Ã`5Ãf1Ã0Æ.ÃP¯*ÃÀ¨/Ã`/1ÃЫ5ÃÀ¢0ÃP8)Ãph.ÃP—.Ã071Ãà.Ã`A.Ã?-ÃP0Ãð/-Ã@p.ð‡.Ãpñ,Ã],à 4+Ã0I.ÃÐd,ÃP -Ãð;+ÃÐ|(à «,Ãà.ÃÐá,Ã@ÿ+ÃÀÒ(ÃÎ.Ãð¬-ÃàU5ÃàØ4Ãðù5ÃPü2Ãà.Ã`Ä-ÃÐp*àã-àÑ0Ã?1ÃÐá,ÃÀI*Ãð²,ÃP/Ã`²0ÃÐL0Þ2Ã`¦2ð-Ãì)ÃÐj+ÃÀ+/à .,àÑ0ÃW-ÃÐÏ/ÃÂ,Ãpn-Ã`¾.à /ÃQ.Ã0I.Ãpñ,Ã0Æ.ðu1Ã-0Ãû-ð/ÃÀ1Ãð).Ã@ÿ+À,Ãp*Ãà—*Ã0Þ*Ãà )Ã`k'ð‡.Ãð¬-ÃP-À1à 0Ãû-à (-ÃÀ1.Ãà+ÃP -Ãà-ÃÈ+À /ÃÑ4ÃÐR/ÃÀ¢0àã-Ã0Ø+Ã@v-Ãà+Ãз3Ã@v-Ã@ÿ+àé,ÃpÙ0ÃÀ1.Ã0a*àé,ÃP‹0àï+Ãï/Ã0O-Ãpb/ð-Ã0º0À.Ã`Ê,ÃÈ+ÃP,+ÃÀÆ*À§*Ã@”(ÃðM(ð-à 1àé,ÃpÙ0ÃÐR/ÃÐí*à ·*Ãð¬-Ãð).Ã`Ê,Ãà…-ÃË5ÃÈ/Ã@+Ãû-ÃÐ|(Ã0ê(Ã`S+À0Ã-ÃÐÕ.Ã,ÃÀ¢0ÃÀº,ÃW-Ãð|5Ãàs0Ã0À/ð‡.ÃÀ®.ð{0Ã?-Ã0À/Ãð1ÃÂ,àÑ0À0ÃÀ1Ã~-Ãàü.Ã@á0Ã@í.À1Ãàs0Ãн2ÃN5Ã3ÃðŽ2Ãðÿ4ÃPð4à 1Ã`;/Ãà,À /Ã8ðÈ8àÑ0Ãàa3ÃpÁ4ð3ði3ÃT4Ã'5ðò1Ã?-Ãð4Àe5Ã@L4Ã!6ÃÑ4ÃpP2ÃÀû6à þ3ÃÐ@2à 2à 3Ãñ9Àe5Ãp,8ÃPÒ9À7àH2ð{0à 6à W:ÃÀ 4Ã’4Ãà[4ÃÐ9Ãh;Ãp:Ã0û:Ãý7ÃÐ¥6à ì6à æ7Ã07ÃЫ5Ãp£9ÃŒ5Ãð”1ÃPð4Ã@.9Ãp :ÃàO6Ã*;ÃЙ8Ãð‚4ÃPÞ7Ãб4ÃÐ44àŠ'ðE9Ã` 7Ãð 3ÃH6Ãp¯7í:ÀS8ÃŒ9ÃÐ:Ã0¢4Ã0¨3Ã7Ã×3à 6ðÂ9ÃPÒ9ÃB7Ãðp7à$8àB3ÃP2à u5Ã05ÃàÒ5ÃP[8ÃpÁ4Ãз3ðÚ5Ø3Ã@½6Ã`8ÃÐ.5ÃÐ.5Æ6ÃÐF1Ãl0ÃÀœ1à ò5ÃàO6ÃPy3ÃPy3ÃÐ.5Ã92ÃN5ÃÀ~6ÃÈ/Ãð‚4Ã'1ð{0Àq3Àw2Ã0¨3à o6Ãð”1ÃPê5Ã07Àâ5ÃP2Ãàa3ðø0ð/Ãp¯7ÃÀ6Ãp27àH2ê4Ãðù5Ãз3Ã05Ãû-ÃP1à­6ðc4ÃÐ:3Ã`50Ãð”1Ã`¦2ðò1Ãð0Ãàm1Àî3Ãð4Ãð 3Àe5À7ÃЫ5ÃÈ+Ãð5,Ã0Ì-ð‡.Àw2Ãpë-Ãpb/ÃpD4Ã92Ã`¾.Ã0I.àT0ÃÀ3ÃpÙ0Ã-0Ãp»5Ã0+3Ã0C/ðþ/Ã`¦2ÃÀ¢0àé,Ã0Æ.Ãàü.Ã@ *À.Ãpb/Ã`50À-À‰/Ãr/ÃÐj+ÃP/Ã`¸/ä1Ãàü.ðŸ*ÃP¯*Ã`G-Ã0U,ðò1ÃÐv)Ã)Ã0=0Ã0®2ð-Ã-Ã`A.Ã0ê(Ã],Ãpb/ÃÐÏ/ö.ÃÀ¨/ÃÐ:3ÃÚ,Ãà )à Ã(àf-ÃÐR/ÃÐí*ÃÐj+ÃÀ´-Ãà…-Ã,Ã`S+ÃP&,Ã)Ã0g)ÃP¯*ð+ÃÐÛ-ÃÂ,Ã`A.Ä,Ãû-Ãð¦.Ã`Ü)À§*Ã?-ÃW-ÃðA*Ã`Ð+Ã0ð'Ã0…$ÃÚ,À•-à Ã(Ãæ*Ã@Ž)ð™+Ãû-Ã0s'Ã`Y*Ãð/-Ãpn-Ê+Ãp )Ãà)ðŸ*ü-Ã`Ä-ÃP&,Ãx.ÃÀÞ&ÃP&,ÃÐá,ÃP -Ãð¾*À6(ÃÀO)ÃÔ)Ãà—*Ã@v-ðŸ*Ã@ù,Ã`Ä-Ãï/à 0ÃЂ'Ãp!%Ã`â(ÃP¯*Ãp*À**ÃÈ+Ã0Ò,ÃE,Ã@(Ã*Ã0y&Ã`Y*Ã0m(Ã0g)Ãpz+Ã@(Ã`Ð+Ã0Ø+Ã@ˆ*ÃP¯*Ã@|,ÃðÐ'Ãà>$Ã`q&ð,Ãæ*ÃPÁ'Ãð5,ð-ÃðÊ(ÃðÊ(àr+Ãp )ÃÐ &Ã0#à¢#ÃðM(Ão)Ã`Ü)ÃÐù(Ãà'ÃÐp*Ã+&Ã@ˆ*Ã@|,ÃÐç+ÃE,Ãpñ,Ãà‹,Ãð;+ÃP2*Ãpë-ÃP/Ã`S+ÃP>(ÃÀI*ÃÐp*ð4'ÃðÖ&ÃЂ'Ã*ð4'Ã-Ãð¬-à d#Ã`î&Ãp€*À¡+ÃðG)ÃPµ)Ãð_%ÃÐ|(à ½)Ãà£(ÃÐv)ÃÐÿ'à d#ÃÐ%à Û$Ã0m(Ãà+Ãà'Ã@'ÃÀU(è&è&ÃÔ)Ãp'Ãp†)à(Ãì)à Ã(Ãp’'ð()ÃÐó)ÃÚ(ÃPµ)ÃÀ=,À$+Ã`ƒ#À¿&Ãð¸+Ã%'Ão)Ãu$ð:&Ãp’'à L'ð()Ãp&Ã*Ã0s'Ã0g)è&Ã0#Ãp†)ÃðÖ&à L'ð4'ÃPß"Ãæ&ÃÀO)à Û$Ã0ð'ÃP\#Ãà,'Ã@”(ÃÀC+è&ú#Ã@(Ãà—*ÃðÄ)ÃðM(Ã](Ãà'à Õ%à–%Ã+&À³(ð4'à Ï&Ã=#ÃàJ"Ã7$ð±'ÃÀa&À§*Ã+&ð+à ·*Ãò(ÀN$Ã0"Ã0g)Ãc'Ãp'$Ãðe$ÃÐ|(ð.(Ü(ÃÐí*Ãà»$Ã`ƒ#Ã0ü%ÃÔ-ÃÀO)ðL#ÃðÄ)Ã`k'ÃPÓ$Ã7$Ãà'ÃðS'Ã3/Ã0[+Ã)à)à R&àŠ'ÃðÜ%ð.(Ãà'À­)Ã`â(ÀH%Ãà8%Ã@+Ãp€*Ãþ&Ãà©'ÀH%ß!ÀÅ%Ãc'ð«(Ã0ä)à%àŠ'Ãø#à @)Ãð_%ÃÀð#Ã*ð½%Ã`q&Ãpž%ÃðÊ(ÃðA*Ã`ú$ÃðÜ%Ãc'àŠ'Ã7$Ã@'Ã&ÃPÁ'ÃàÁ#ð.(à F(ÃPÓ$À­)à Ã(Ãà8%ÃPÍ%ÃÐ%ÃP/ð.(Ãp¤$ð+Ãp¤$ÃÀg%ð·&ÃÀØ'ÃðÊ(ÀË$Ã`ú$ÃPÇ&Ã`q&ÃÐ &à Ï&ÃÐ|(Ã0y&à$Ãp˜&ÃÐ'Ã0s'Ã0%Ãò(Ãà,'Ã@(à(Ã`Y*Ã`ú$Ãð¸+ð¥)Ã`w%à X%ÃÀg%ð()ð .ÃÀÆ*àŠ'Ã@²#Ã@)Ã@ *ð·&ÀÑ#à–%ÃPP%Ã@'Ãp&Ãà2&Ã`Ü)ÃP{ Ã$t“#ÂÂ0€XLÂsRÂ…O€žjÂà™€Âà ƒÂàQŒÂ``”Âàž”Â 7 Â ®¡Â€6¨Â€<§ÂÀa¦ÂæªÂà©§Âà‹¬Âà®Â`¬±Â i·ÂàUµÂ`‚¸ÂÀ¶Â`óºÂàÆ·Â ³µÂà¿Â ÅÂ2ÈÂà ¶¿ÂÀ§Ä€ˆÄ 5ÊÂ`"ÈÂà`ÈÂ@iÄ ²Ê pÕÂ`ËÂöÑ€½ÐÂÀîÍÂmÓ çÖÂÀÚÂ@÷Ö ùÓ€:Ñ€vÇÂ@bÚÂàØÂ ‹Û ‘ÚÂÀÿß äÂU×€oÝÂ`ñäÂà;ã öÞÂàè ´éÂà¸ã +ë€-è€Qâ–áÂà²äÂ@Æó àì 倘ë í iëÂàìÂ@®÷ÂàÃàçð ï rô€ÁùÂàRôÂ`zãÂlèÂÀo÷ÂÀWû 3ôƒùÂ@ÿ€hó‰øÂÐfÃúú€&þÂ}ú€&ÃÀæøÂàÉõ Åû zà ³ànÿÂÀWûÂÀKÃÀWûÂ`öøÂà«úÂ@~ÿÂ;ÃÀ°Ã@ïÃÄÀÃà] ÃÀ ÃP¥Ã;ÃÙ Ã@éÃ`ÆàëÃÐéÃp|ÃzÃÐÃð®Ã0ÈÃ0ÈÃÊÃ5Ãð®Ã0ÎÀ ÃÐãÃ`IÃð%ÃÀ ÃÓ ÃÀ'Ã`OÃ`Ià8 ÃÀ’ Àm ÃÀ!ÃÐÑà Ãàøðk Ã# à Ã0ª Ã`– ÃpÉ Ã0¼Ã°Ü Ã°Ü Ã` ÃС Ã0’ Ã0ª È Ã€Ø Ãð`ÃðéÃ0ŒÃ0†Ãÿ Ãp· ÃàQ ÃàÚ Ã > Ãp½ Ã# Ãð Ãð~ ÃÀëÃ`Ãp«ÃPQÃÐÃ@ZÃÀz ÃÀnÃ0ðРÈÃPWðÄÃpÃЉà k ÃÀnÃðÑÃp(Ã0ŒÃPKÚ ÃPWð¦ÃÐõûÃ|Ãp™ÃPÚÃŽÃ`Ãp(Ã|Ã0Ã0zÃPÂÃ0>Ã0©àà MÃ`ràD Ãpà ÃðËÃ@Ã`ãð Ã`éÃPKÃ`Š Ã°5ð)Ã@$Ãð6ÃàÀœÃ@›ÃЃÃ@ Ã``à ÐÃÀëÃðï Ã0bÃ`×ðÃ`fÃ`HÃà ÃÐwÃÀ>ÃÐSÃàýÃðBÃ@ƒàöÃðjÃ0Óà ¦ÃÃ0ñÃ^Ã@‰ÃÐôð”à ¦Ãð6ÃÐîÃPžà ¦ÃP˜Ãà /Ã0PÃ`Ñà #Ã^Ã@qÃ`0À´ÃP˜à  Ã``ðÿÃ@îÃXÃÐkÃð­ÃöÃÐôÃpuÃð6ÃçÃ`BñÃØÃ"ÃÀµÃ0»ÃpKà ŽÃÐÖÃ`¹ÃàñðˆðÃP!Ã.ÃÀ&Ã.ÃÀ©ÃÀ8Ãp‡Ã0DÃð‰ÃÀ—Ã( Ã0©à+"ÃPýà[ëÃpÎÃ@_ÃàåÃ`Ã`¡Ã0ÁÃ^àaÃÀ—ÃàßÃ0&ÃàhÃÀð^ ðíÃ0»à ‚ÃpEÃàëàCÃPtà ˆÃ0ÇÃàzÃÀ£ðóÃgÃC"Ã0!ÀrÃ`$ðpà ó à ‚ÃÀ‹ðíÃpWÃ.à ùà=Ã`à®!ÃÏÃ0©ðˆÃðÃÉÃpoÀð‚Ã`¡Ã0©ÃPÃpuÃð$À„Ã`0ÃUÃpÈÃÀ¯ðùÃ0,Ã08ÃððÿÃ0>Ã@A!ÃÐAÃpÈÃ@ÖÃP ÃðÃ@ÊÃp¶!ÃÀ£à®!ÃÒÃðÃyÃsÃÀ2ÃRÃÐSðà ÃàßÃàñà ˆÃ0 ÙðvÃ@Sà Ã[÷àUà Ãð ÃàÙÃ@YÃ@ÜÃ`¡Ã`ÅÃ0JñÃPÃðk#ÃP Ãà÷Ã@_Ùà !ÃêÃð Ãsà  à ÃP’Ã[Ã@MÃUÃ0Ç÷à1!àUÃ@SÃ¥ÃÀ£Ãð Ã@èÀÃÀ,Ãà Ã@wÃPžàÀà ”à ÃÐÊÃ`¡ÃàåÃðÀõÃ`¿Ã0>Ãð‰Ã"Ã0 Ãà€ÃÃÃ0>ð|ëà[ÃвÃ.Ãð àÀÃPå!Ã4Ãðî"ÃPë ðçÃ0¯à=à ÿÃÀÃànÃÐ5Ãp¶!Ã@ÖàÀÃð¡ÃÃÃ0!Ã:Ã@à ÿÃðƒÃ@Y÷ÃàëÃ@SÃØÃa÷ÃÃÀ‘ÃP\#Ã`0ÃðÃß!Ã`*Ã`6ÃFÃàÓ ÃÐ5à ùÃ0—!Ã0¯Ã0£ÀõÃиÃ`§ÃàbÀ`!Ã`ú$Ã0…$À`!à !Ã°Û Ã@SÃð•ÃÒÃðw!à ‚ÃàJ"ÃÐ)!ÃpÂÃÀ!Ãp°"Ã@¾!Ãðú ÃÐ/ à ‚ÃðÃðÃÌ Ã0—!Ãð à®!ðÉ#Ã`ƒ#Ã`!ÃØÃ`$ÃÞÃ"ÙÃ0µÃëÃpKðvÃ¥Ãð} ëÀ~ÃêÃ`³Ã( Ãànà ”Ã@èÃ@ÜÃ@/$Ã0&àÒÃàåÃaÃÃPë ÃК#ÃðƒÀlÃ"ÃР"Ã`‰"Ãð} Ãp9!ÀrÃàÇ"ÃÐ#"Ã@eàIÃàßÃàV Ã0‘"ßÃ@kà ¦ÀéÃPtÃÀ ÃP†ÃÃÐ;ÃpÔÃÐeÃpÚÃ{#Ãp3"ÃÆ!ÃP÷ÃpQÃPn ÀN$Ãpª#Ãà»$ÀN$à´ à Ãpª#à ç"ÃPß"Àf ÃàåÃaÃà\ÃpÎàIà ÃÃÀ!ÃàJ"à ó ÓÃp9!ëÃPå!ðçÃÌ Ã°ùÀf Ã`!Ã0>ÃÐMÃÐ)!Ã` Ãp-#ÃpÎÃоÃвÃ`#Ã`!Ã@ÖÃ`Ãð Ã`Ãàhà ŽÃ"!Ãðà à%#ÀZ"ÃðÃ"!Ã{#Ã$ÃÌ ÃUÃ0 Ã`}$Ã` "Ãðî"Ãðe$ðÕ!Ã°Û Ãð_%ÃPJ&Ã0…$ÃÀ… Ã@A!ÃPV$Ã@¾!ÃÀê$Ãp'$à$Ã@G Ã@5#ÃД$Àã Ão%ÃÀØ'ÃðM(Ã( ÃPå!à í!Ãp3"Ão%Ã0%è&Ã`q&Ãà8%ÃÀð#Ãðô!Ã0s'Ó#ÓÃ@/$Ã( ÃÐ#Ã"!ÃPñÃPå!Ãðq"ÃPå!ÃðÊ(ÃðS'Ãðî"ÃÐ)!Ã`#ðáÃàzÀÝ!ÃàJ"Ãðè#Ã$Ã=#ÃÐ$Ã@ÊÀrÃp-#Ãðk#ðL#ÃPÙ#à Õ%Ã@²#ô$à ç"Ã@¾!ÃÐ'ðX!ÃpEÃÐŽ%À›,ÃPñðÿÃð¡ÃÉà=Ãðè#Ã$Ãðq"àºÃðú Ãð} ÃЦ!ÃÐ)!à ðR"à p!Ãþ"ÃPë Ã+&Ã0"Ã@Ðú#ÃðƒÃÒÃPå!Ã@¾!Ã0"ÃPÍ%Ã0y&ð«(Ã`!ÃðàÆÃ@/$à à´ ÃðÃ`¡ÀéÃ0‘"Ã`!Ã@ÖÃ@;"ÃР"ÃPtÃpÂÀÝ!Ãp¼ Ã0ö&ÃÀO)ÃàJ"À`!à+"ÃC"ÃàÇ"Ãpž%à Ãp3"ÃÀ"Ãþ&Ãò$ÃàbÃànÃ@ÐÃp!%ðÉ#Ã{#Ãà8%Ãc'ÃÀy"Ãðî"Ãi&ÃPÍ%Ãðî"Ã` à ˆðáÃЦ!Ãð} ðÏ"Ãø#Ã0%ÃÐAÀrðjÃÐ5Ã@Ä Ã¥ à Ã@ÐÃPP%Ã0y&ðíÃ@¾!Ç!ÀéÃ`!ÃоÃ@š'Ã` à Ç!ÃPå!ëà ó ô$Ã.ÃàV ÃpQÃàtÃø#ÃàÙÃÀ‹Ã@âÃàP!Ãðe$à ùÀÝ!ðX!ÃÀ!Ãà¯&à¢#ð@%ÃК#ÃàÙÀûÃ@ÖÀ`!Ã`0Ã@ÊÃÐ#Ãðw!Ãì)à Û$Ã`ƒ#ÃЬ Ã@Êú#à1!à í!ÃpKú#ÃPÙ#ÃÀö"Ã{#Ãðè#ÃÀ"ÃPP%ÃpQÃpQÀ`!Ã( ÃÐ#"à´ ÃÆ!Ã` "Ã0"Ã`ÃÐ5ÃPë ðáÃàP!ÃК#ÃÀg%ÃК#Ã0 ÃPÙ#à ÿà í!à®!ÃPJ&ÃI!Ã0"Ã0 Ã"ÃàD#ÃPb"ÃP†Ãp¼ Ã`ƒ#ðX!à1!Ã`#à¨"Ã0"Ãà>$ÃÀy"ÀË$ÃÐ#ÃД$ÃÀ"ÃsÃÀ!àCÇ!Ãðú Ãp!%Ã{#ðX!Ã0%Ã0#Ãðô!ÀéÃO Ã@A!à R&ð@%ÃPJ&ÃÌ ÃpÂÃp'$Ãp&ÃPD'Ã@G ß!à ç"Ã`• Ã`¡Ãp¶!Ã0ä)à Õ%à %Ã`§ÃPh!à ó Ã"ÃpÂÃ"Ã`!ÃЬ Ã"ú#ÃÀ‹à´ ÃР"à ^$ÃPÙ#ÀÝ!ðL#Ã@)%ÃðÜ%Ã$ÃPÓ$ÃÀä%ÃPÙ#ÃÀ"à !àœ$Ã=#à ó Ãà>$Ã0ü%ð½%è&à j"ðÃ$ÃÀä%Ã@)%Ã#Ã@š'Ã%'à ^$Ã0 ÃPh!Ã`ú$ÃK+Ãpt,ÃÚ(ð:&ðóà7 Ã`#ÃÀg%ÃÐ$Ã{#ÃàD#Ã{'ÃàÁ#ÃÀð#â'ÃPë Ãp-#Ã0‹#ÃЦ!ÃðY&ÃàD#ÃC"ÃàÙÀïÃPÙ#Ãø#ÃC"ÀË$Ã0m(Ã@¬$ÃÆ!ÃÀ!Ã@ÊÃp¼ ÃPD'ÃðÐ'è&ð·&à$Ã0%ÀÝ!ÃPýÃäÃø#Ãpž%à L'ÃÐ &Ã`w%ðR"Ã`‰"Ãà8%Ã@)%à d#Ã%'à X%Ãp(Ãà£(Ã0s'à Ã(ÃÀa&Ã0ð'ÃP>(ÀB&ÃÐ5Ã"Ã`ú$Ã@š'ÃðÄ)Ã@#&Ãc'ô$Ãø#Ãp )ÃðS'ô$Ã=#ð4'ÃÀÞ&Ã+&ÃÀm$è&Ãà2&ÃÀÞ&Ã`}$Ã0ö&ð±'ÃðÐ'Ã0y&ô$àºÃp-#Ã&ÃK+à @)ÃÐ &ÀT#à$Ã7$Ãp3"à ó Ã0 Ã0 ÃР"ðÃ$à Õ%ÀT#Ã0‹#Ãp!%à í!à¨"ÃÐ'ÃPÍ%ÃÀê$ÃPÓ$à Û$Ã`ú$Ã0$Ã@;"Ã0ü%Ã0#Ã@Ã0©ÃpÂÃ0‹#Ã@MÃÐ#"Ã@ &ÃðG)ÃðÖ&Ã{#Ãð‰ÃàÍ!Ç%Ã0%à %Ãì%ÃðÄ)à R&ÃP\#ÃÀ!Ã@5#à ç"ÃÐ#Ã`k'Ãðô!Ãþ"ÃPV$ÃÀð#Ã@A!Ã"ðF$Ãp3"ÃÐ)!à R&ÃPå!ÃPñÀÑ#Ã%'Ãð} ÃÀ!ÃÀê$Ã@¬$ðÃ$Ã`!Ó#Ãð à´ Ãp¤$ÃÀÞ&ÃðS'ÃÐŽ%ÃÀê$ðR"Àïà ðçÃð ÃÀð#àŠ'Ãæ&ðçÃ7$ÃðÖ&Ã+&ÃPÍ%Ão%Ãpª#Ãðq"ÃÐ5ðL#ÃР"Ã"Ãp¤$Ã7$è&Ã`â(Ãðq"ÀÑ#ÃÀ"ÃÀg%ð@%Ãp˜&ÃðÄ)Ã@#&Ã`#ÃPÙ#ÃàJ"Ã0$Ã0$ÃÀ"à d#Ãþ"Ã`w%Ãðî"ðÕ!Ã0y&Ã0‘"Ãà2&Ã@¾!Ãi&à®!Ã`• Ã@MÀéÃp'$Ã@)ÃPP%Ãp¤$ÃÀ"Ã0#Ã@#&ú#Ãp¤$ÃÀ['ÃÀÀ+Ãp-#Àlð^ Ã@¸"Ã0%Ãì%à Û$ÃÐŽ%Ãà»$Ãæ&Ãð_%ÃÀð#Ãàµ%à @)ÃД$ÃК#Ãðâ$Ãðq"Ã@”(ÃÀm$à%#Ãp9!Ã0,ÃР"ðÏ"ÀT#Ã0—!ÃК#Ã`ú$Ã`q&Ã@š'Ã0y&ÃÐp*ÃàÓ ÃPñÃÀy"ÃÒÃpÈÃÀa&à¢#à ç"Ãp°"Ã0‘"ðáðL#Ã0ö&Ãø#ÃPJ&Ã7$Ãp9!ÃÐ$à%ÃÀa&Ã@/$Ãð Ã@/$Ãþ"Ã@¦%à d#ÃД$Ã`}$Ã(Ãà»$Ãp!%À¿&ÃÀa&Ãpž%ÃÀy"ð.(ðF$ÃÀy"ð@%ÃP\#ÀïÃPÓ$à¨"Ãðq"ÃÀü!à ùàCëà–%Ã&ÃÐ%Ãà2&Ã@5#Ã@G ðR"Ãp'$à ^$ÃàP!ÃàÇ"Ã@/$Ã](Ãp )Ã%'Ã`}$ÃPP%ÃðA*ÃPV$Ã0ä)à Û$à&ÃQ*ðÃ$Ãðk#Ã@”(Ãp*Ãðè#ÃÀ!Ãðe$à–%Ã](àœ$Ã@¦%Ã0ö&ÃД$ÃðS'ÃÀ['à Ï&Ã0g)Ã@/$à–%à%ÃÐ'ÃÐ'ô$Ãþ"Ã0‹#Ãì%ÃÀØ'à(Ã=#àCð·&ÀË$à%Ã0ö&Ãðè#ÃÀä%à Ï&ðÏ"Ãà'à&Ãà»$Ãø'Ó#ÃPh!ÃÐ)!ÃÐ|(ÃPh!Ç%à d#Ã0#Ãðâ$ÃÀö"Ã{#ðF$Ã`#ÃÐ/ Ç!Ãà,'ÃPß"Ãðô!Ã`w%àœ$Ã@Êð4'Ãà)ÃÀ['Ã`q&Ã`ƒ#ÃPÙ#à ^$à$ÃðS'Ã`$Ãðw!ÃР"Ãpª#Ã0ö&Ãp'$ÃÀg%Ã@(Ãà»$à¢#Ã` "Ãà‘+ÃP2*ÃPÁ'àŠ'Ãðô!Ãðq"Ã&Ã0ä)Ã`Ö*Ãð_%Ã0…$Ã"ÃÀU(Ãà2&ÃPb"Ã0%à¢#ÃðÖ&Ã@¬$Ãà*ðŸ*Ãà©'ð«(Ãþ&Ãp†)Ã{'Ãp¤$Ãì%à j"ÃPP%Ã0%ÃPÙ#Ãò(ÃðS'ðÏ"Ãð} Ão%Ãà'À×"Ã`‰"Àã Ãpª#Ãà,'à)ÃðÐ'Ã0%ð½%ÃÐ &Ãò(ð@%Ã0%à Ã(Ã{#ÀÝ!â'Ãæ&ÃPÓ$Ãu$ÃÀa&ÃÀs#Ã#Ã(Ã`w%à~)ÃðÜ%à R&Ão)Ãp'$ÃÐ$Ã`q&Ã@/$Ã`î&À0)à É'Ãp(à R&àŠ'ÃР"ÃД$Ãà+Ã],Ã+&àœ$Ã`è'ð·&Ã0Þ*à (-ÃÈ+ÃЂ'ÃÀÒ(Ãp&Ã0‘"Ã$ú#Ã7$ÃP2*Ã0Ì-Ãpt,Ã(Ó#Ãà>$Ãà»$Ã0ö&ÃðM(ÃðA*ÃÐ$Ãø#ÀH%Ã7$Ãðâ$Ã`î&Ã(Ã`Ü)Ã0"Ãþ"ÃPë ÃоÃ"ÃPÙ#Ã@/$Ã`#Ãc'ð.(ÃÀm$Ã`ƒ#ÃЈ&ÃðÖ&Ã@²#ÀN$Ãp(Ã0y&ÃðY&à X%à+"ÃPP%Ã@'à 'ÃPß"Ã@²#Ã+&ÃÐ$Ã`î&Ã0ü%î%àŠ'Ãp˜&Ã@#&à á#Ã`ƒ#ÀÅ%Ã@/$ÃЈ&ÃpŒ(Ãà+Ãà)à R&ÃÀ"ÃPÍ%ÃÎ*à~)ÃÐ &Ã0‹#ÃPÙ#À6(ÃPÍ%ß!Ã0‘"Ãp&ÃÀg%ÃPP%Ã&ðÉ#ô$Ç%ÃÐ'ð·&ÃЦ!à–%Ãò$Ã°Û Ã7$à ç"ëÇ%ÀB&ðX!à ÃÀÞ&ÃÐv)à í!Ã@¾!Ãu(ÃðY&ð@%à$à p!ðL#ÃpÎÃàJ"ÃÆ!Ãp3"Ãà)Ã`#ÃP»(Ãpž%Ã0‹#Ãò$ÃPn Ã&À×"ÀT#àŠ'ÃÀy"Ã0©à7 Ã#Ã0‹#ÃЬ ÃР"ÃpÂÃ`!Ã`ô%Ãà,'ð4'ÃPë ÃÐ#"àœ$ÃÐù(Ãi*Ãà»$ÃP\#Ã0…$Ã0ü%ÃàÁ#ð:&ðL#ÃÐ5ÃÀ!Ãðw!Ãp’'À6(ÃàÁ#ÃÀ… Ã@MÃÀö"Ã`ƒ#ÃвÃð_%À¿&Ãþ"ÃðY&à á#Ã`}$à´ à X%Ãp¶!ÃPtÓÃpª#Ã$ÃÐ$Ã"ÀÝ!ÃÞÃÀ"à X%ÃÒÃÀ"Ãðú Àã ÃÀy"Ã@¬$Ã` "à Ã@¬$ðdÃ0"à F(àŠ'Ã0‹#ÃÀ!ÃД$Ãp'$Ã"!ÃPñÃàÍ!ÃPV$Ã@¬$Ãi&Ãà¯&Ã$Ãp9!Ã.ð½%ðÃ$Ã=#Ãà,'Ã`î&ß!ÃPå!Ãðk#à%#ÃUÃàV ÃàD#Ã=#Ã@/$à !à Ã(à :*à–%ÃÐÄà !ÃК#ÃP\#ÃàÍ!ÀrÃðî"ðL#à%#Ãðî"Ãþ"à j"ÃÐ#"ÀT#Ç!ú#ÃàV ÃÀm$ð()Ãò(à&ÃÐ'Ãp¤$ÃC"Ãà»$Ã0#Ã0#ÃÀê$ð±'ÀN$Ãà)ÃÐp*Ãð_%ð¥)à&Ãðú ÀÝ!àœ$Ã.ðÕ!Ã"ÃÐ5ÃÀÃ"Ãðe$à ÃàÁ#Ã`k'Ãà2&Ã0"ÃÀð#Ã`#à ^$Ã`‰"Ãà,Ã0ä)Ã{'ÀÅ%Ó#ÃPh!Ù"ÃЦ!ÃðÃðâ$Ã@(Ãà©'àœ$Ãð¸+À<'Ã`‰"ÃðÃaÃ` "Ãà8%ÃàÙÃÆ!Ã@¾!ðÕ!ô$Ã@²#à Û$ÃPÁ'ÃàV Ã@5#Ã#Ãpž%Ã0#à¢#Ã`ú$ÀH%ð·&Ãæ&ÃP\#Ãà¯&Ã1%À³(Ã@¦%Ã$Ã&À`!ðÉ#Ã0ð'àr+ðÕ!à %ÃÀa&àŠ'Ã0ð'Ã0%Ãpž%Ã0ü%Ãà¯&Ã7$Ã@Ä Ã$Ãà>$ÃàÍ!ÀH%Ã&Ã`k'à 'à&Ã`w%ÃÀ… Ã0$à R&à L'à&Ã0…$ðF$Ã0‹#Ãð_%Ã@ *Ãø#À¿&ÃPh!àœ$Ã@ &ðÃ$Ãð Ã@¾!ÃðM(àœ$Ãðe$ÃÀü!à¢#Ã@'à„(Ã#ÓÃpQÃ7$Ã@”(Ã)Ü(À`!Ãp¤$Ãð_%ð«(Ãp€*Ãpz+ß!Ãp3"à !Ãò$ÃÀ!à ÃÀ!Ãà©'àx*ð@%ÃÀð#Ãà>$Ã0 ðÕ!Ãà>$Ã`#Ãp-#ÃÆ!ÃЦ!à%àCÃЦ!Ã@Ä Ã( ð^ Ãpž%Ã`è'ð@%ÃpŒ(ðF$Ù"ÃР"ÃàÓ Ã á#ÃðS'Ã$À`!ÃÀ… ð^ Ã0‹#Ãà£(Ã`$ÃÀð#ÀÅ%Ã#ðÕ!à %ÃК#ÃP\#ÃàÇ"à p!Ãà\ÀN$ÃÐŽ%ÃÀØ'Ã=#Ãø#Ã0‘"Ã0…$Ã0$Ã0 ÃPë ðÕ!ÃÀê$Ã"ÃàýÃ`ÃPb"î%à %Ã0—!ÃÀ—ÀïÃðw!ÃPV$Ã0 Ã(ÃÀ… ÃÀ—Ã"ÃPV$ÃàJ"ðpÃäÃØÃвÃвÃðe$à í!ÃвÃà\ÃpÈÃÀy"Ã`ô%Ãp-#à®!à v Ã` "à Û$ÃÀð#à„(ÃPb"à Ã` "à X%ðÏ"ÃI!ðçÃàJ"Ã@¬$ÃPÍ%Ãðî"à á#ðÕ!ëðÉ#Ã`}$Ã0 à j"ÃPn à R&ÃPÙ#Ãp¼ Ã{#Ã@¾!ÃÐ#"ÃêÀT#ÃÀ‹Ã0—!Ã%'ÃÀê$ÃàP!à®!Ãð‰ÀÑ#ÃÐ5ÃPñÃ`ú$Ãà»$ßÃ@èÃÀy"Ãðq"ÃpÈðÕ!Ã0ö&Ãð¾*ÃК#Ã`‰"ÃpÈÃðw!ðÃ$Ã0#à+"Ã`ú$Ã@)%Ã@5#ÀË$Ã0‹#ÃPb"ÃД$Ãà8%Ã@²#Ãp? à%#ÀH%Ãpª#ð½%Ã0%ÃPÓ$Ãðâ$ÃЂ'Ãà£(ëÃàP!Ã@A!Ãð§ÃЦ!ÃðY&Ã@”(Ã0‘"Ã( Ã`¡ÃPýÀxÃ.à ^$à Û$ÃÀy"Ãp-#à 'Ãðô!ÃЦ!ðÏ"À`!ÃÀy"ÃÀm$Ãi&ÃÐ#Ó#Ã0$î%Ãp¶!ÃÀü!Ã@(Ãp(ÃPå!ÃànÃ@ÐÃðk#Ã@”(ÃÀm$ÃиÃðw!Ã`‰"Ãø#à j"ÃpÈà$Ã0#ðÏ"ðáà p!Ãp3"ðX!Ã`#ðR"Ã@¸"ÃàP!ÃÐ)!à%#ÃÀü!Ã0#ÃàÓ Ã“à p!Ü(Ã@;"ÃP€Ã"Ã@G à !Ã@5#Ã0 Ã`}$ÃÐÿ'à X%Ãp¼ ÃPh!Ã0#ÃðƒÃò$ÃÀg%Ãà>$Ã`‰"ÃÐÿ'Ãpª#ÃÀÒ(ÀÑ#Ãðw!ÃÀg%Ã0ö&ÃPÍ%ÃÒÃPß"Ã@#&Ã0y&ÃðY&Ãp’'ÃÐ%ÃÀy"ÃPÍ%ÃPzÃ`§Ã`}$ÃÀ['Ãà»$Ão%Ã0"À¿&ÃPÁ'ÃPÁ'ÃÐ%Ù"ÃÀÞ&à$Ãð_%ÃиàIà&à&Ã@5#ðÏ"ÃP2*à ½)Ã(ð4'Ã&ÃO ÷ÃÀ"Ãþ"Ã`!à1!ðL#à$Ãp-#Ãà2&ÃàJ"Ã$ÃðS'À¿&ÃÐ%ðX!Ã0,à L'Ã](À×"ÃàÓ Ã“#ÃР"Ã@Ä Ãp )ÃÐ &Ãp'$à ç"Ã0‹#ÃК#Ã0…$ÃÀ['Ãðw!Ãðè#ÃÀ"ð^ Ã0£à Ãàµ%ð4'Ã@/$Ã0m(ÃÐ%Ã¥ Ãà»$ÀÑ#ÃÀI*ÃàÇ"Ãðú Ã`#Ã`Ö*ô$Ã0"à Ï&ÃØÃÐ/ Ã` ÃPb"Ã"Ã0#Ã`#Ã0#Ã`#Ã"!ÃpQÃUà®!Ã0$Ãp&Ãð} ÃPV$Ã@²#à !à´ Ãàµ%Ã`è'à ^$Ãà»$à–%Ã"Ãi&Ãì%ÃÀO)ÃPb"à p!Ã@G à í!ÃÀê$Ãðq"Ã0y&ÃðM(Ãþ"ÃPP%Ãþ&Ã@YÃðà ”à%#Ã0$ÀZ"Ã`‰"ÃÀü!ÃàÓ ÃàÍ!Ãðw!ÃPÙ#Ã0—!à !Ãp'$à+"Ã0!Ãðq"ð()à$ÃpÂÀéÃÀÃ@Ä Ã€`!Ã`ú$Ã0$Ãðk#ÃÐ#Ã`Ö*ÃðÜ%ÃÒÃà8%Ã`‰"Ã@/$ÃÌ Ã %ÃØÃоÃàÍ!Àã Ã@5#Ãвà p!à¨"Ãþ"Ã0Þ*Ã@)%ðÉ#à ˆÃ@kÃ0 à p!ðdðdÃ`• Ãp¶!à í!ðF$Ã0‹#ÃàÇ"à d#ðÃ$ðáàÀÃPÍ%ÀË$à$Ã`}$ðçÃÀ‹Ã0 Ã` "ÃÀ Ã@YÃPtÃÀ… à´ ÃPå!Ãì%Ã@ &Ãu$Ã0—!ðíðdÃð Ã@Ã`ðÉ#ÃÀm$ÃðY&Ã@¾!Ã{#ÃPå!ðL#Ãðƒà L'Ã1%Ã@²#Ãþ"Ã@Ä Ã Àú#Ã.Ã`#ÃPñðpÀZ"ðR"Ã"ÃЬ ÃÒÃ0!ÃÐ)!Ãðe$ÃÀ!Ã7$ÃC"à ç"Ã`ÃðƒÃàÁ#àÀÀéÃÐAàCà v ÃO Ã`!À~Ã`§ÃÐ)!Ã0¯ÃÀ!ÀÝ!à v ÃPýàaÃàµ%à¢#Ã@5#ðvÃÐ;àœ$ðL#Ã`}$Àã ÃðÃpQÃÀ Ã`!ÓÃК#ÃàJ"Ã@ÖÃ`0à Ó#ðçðùà ð^ ÃÒÀéÃPn Ãðú Ã0"à ‚à Ã0£Àïà d#Ã`¡ÃàhÃ1%ÃàV Ã0#ÃÀ!ÃÀ‘À~Ã`­ðóÃàbÃ¥ ÃPå!ëÀÝ!à v ðáÃÒÃÐ/ àÆàIàØÃà v ÃP\#ÃPýÃPtÃP†Ã@Sà ùÃàåÃpÎñà |À×"Ã0!Ã0,ÃÀ à v ÃpKÃPn ÃàåÃäÃ@Sð^ Ã`!àœ$Ã@¸"à Ã(Ãà‹,Ãð#/Ã012ÃÐ:3Ã`š4Ã0+3ÃÐ44Ø7Ãp£9ÃPO:ç;à§7à Ô:Ãn>Ãb<ÃÙ=ÃÀÅ?ÃP?ÃVBÃÇ@Ã÷<Ã0HCÃJDÃÀ³BÀEÃ`"HûBÃ@àEÃÀ­Cà_CÃPCÃÀ}KÃJÃJDÃ&FÃÀHÀÿE×LÃÐ9HÃpaDÃð¥CÃàïEÃPDà GÃ@cEðJMÃÐ’NÃðþIÃÐEFàGGÃPûGà¸IÃ@9LÃмGÃ@ÔGÃMJÃ`KÃмGÃð{JÃ`¥GðVKÃIÃà`HÃP`LÃÀ IàOÃ@ÈIÃ0JÃÖHÀÛKÃ@EJ×HÃpÀIÃp1LÃàOÃФKÃÀ}KÃ0›JÃÀJÃÐ'KÃðæMÃLÃ` Là²JÃp=JðßIÃPrIÃð‡HÃ@?KÃLÃeFÃ@ÚFÃ@EJÃpºJàAHÃKà/KÃÐMÃALà †GÃkEÃðGÃ`JÃ0 MÃОLÃPéJÃà×IÃаI×HðåHÃKÃÀJÃ0JÃ0$IÃÀ$EÃÀGðzEÃ0­Gð÷EÃð{JÃÐ-JðnGÃ@ÎHÃÄKÃàxDÃ@oCÃpy@ÃàŠAÃÀ$EÃ8GÃð{JÃÀGÃ0§HÃ,EÃÐ9HÃàfGÃp[Eð Cà žCÃÜGÃpäCð CÃ0¹EÀóGðbIÃ0×@ÃP¨@ÃðFÃP–CÃÐÈEÀíHÃ@EJÃLà ¤BÃÁAÃpIHÀˆDÃàéFûFÀAàƒ=ÃðŸDõGÃÐò>ÃÍ?Ã0BDÃpÒFÃ`«FÃPŠEÀpHéEÃ0×@Ãp…>ÃÀË>ÃÙ=ÃÍ?Ãð"DðŒBÃP+@ÃàBÃÐu>ÃÀË>àô?ÀCà °@Ã0`?À/>à ?>ÃpðAÃÐ]BÀ¸<Ã`X?ÃðÕ;ð'>ðAÃPœBÃÐ{=Ã\=Ãp?Ã@“=ð˜@ÃPÌ:Ãn:à <ç;ÀA;ð°<ÃÙ=ÃÀN>à>ÃÐ:à :Ã`p;ð¶;Ãp<Ãàœ>Ã0f>Ãpö@Ãp?Æ:Ã0:ðÂ9Ã@¥:ÃN5ÃàØ4Ãðó6À_6ÃPm5ÃË5à <ÃÀ`;ðÎ7Ã0:Ã0x;Ãp86ðW6ÃÀ~6Ãz8Ã`ó:ÃŒ9Ã`”5Ãðá9à;ÃàØ4ÃЙ8ÃPO:Ãp£9Ã0%4Ã09ÃÐ(6ê4à¹4ÃPØ8ÃÐ ;Ã`ˆ7à 6ÃH6ÃЙ8Ã7ÃÀŠ4à Ú9ä5ð]5ÃàO6Ãб4ÃT4à 0Àî3Ã7ÃPs4ÃÀï8Ãðá9ÃÐ:ÃàI7À_6ÃÀ5ÃpÙ0ðÚ5Ã@.9Ãpµ6Ãr/ü1Ã`4Àâ5ÃÀõ7ÃàC8ÃpÁ4ÃàI7Ã@F5ÀÖ7Ã5Ã-4ÃÐ"7Ã9Ãn:ÃPy3ÃÐ@2ÃÀ2Ã-à þ3Ã@:7ÃàI7Ã0®2à 1Ãàa3à*7ðÔ6ÃÀ3Ãp&9Ãý7ÃT4Ãà7:ÃÀ5Ø3Ãð”1ÃÐ@2ÃÀ3à¹4Ãð^:ÃPm5ÃP2Ã4ÃPm5ÃàC8À_6Ãp>5Ãðp7ÃГ9ÃàÒ5Ã0À/ö.ÃW-ÃPs4à u5Ã'1Ãp»5ÃàÞ3Ã07ÃÐ9í:ÀÐ8Ãp>5ÃÀ~6Ø3ÃPÞ7ÃГ9à06Ã`5Ã`/1ð3Ãpµ6Ã@Ï3à³5Ø3Ã012Ãðó6ü1à “0ðo2ÃÑ4ÃÀé9ä5à u5ÃÐ9ÃÀ5Àô2ðo2Ã`¸/ð‡.Ãl0Ã0Ø+Ã0+3Ãã1Ãõ.ÃPy3à<4Ãàä2ÃÐ:3ÃÀ6àN1Ã0®2Ã`¬1Ã@ç/ê0ÃPs4à¿3ÃÐÃ1ðo2Ãp86Ã-0à`.Ãн2ÃP-ÃP0ÃÐ^-Ãàö/Àè4ÃÀ%0à ".ÃÀ¨/à 1ð]5Ã@X2à (-Ã0º0Ãð1ðø0Ãl0Ã`A.ÃÀ1À‰/Ã`)2àH2ðø0ÃP1Ã@ç/Ã0+3ÃP2ðo2Ãàm1Ãð1Ãð /àH2Ã0º0À§*ÃpJ3ÃÀõ7ÃpÇ3Ã@‚+ð .Ã0À/Ã0Ì-ÃP-Ãà*ð-Ãð1à Ÿ.ÃP2ðo2Ã@ù,ÃÐÕ.ÃÐR/ÃÎ.Ãðš0ÃÐÕ.Ã`A.ÃP/Ãàm1ÃÀ´-ÃÐj+Ã0=0ÃÀ%0ÃP©+ÃP&,Ãð¬-ÃpV1Ãð²,Ãà,Ã9.Ãp\0Ãð²,Ã0O-Ãà.ð/ÃÀ®.Ãàê1Ã0Æ.Ã~-Ãð /Ãàö/Ã@j/àï+àf-Ãx.Ãpñ,Ã@ù,ü-ÃP.Ã071ÃÐÉ0ðø0àx*Ãà+ÃÀC+ÃÀÆ*ÃK/Ãi&ÃP£,Ã0O-Ãx.àx*ð¥)àõ*Ã0g)Ãð¾*ÃÀ7-ð¥)ÃPÁ'À­)ÃÀ=,àé,à Ã(à Ã(Ã*Ãð²,Ã0Ò,Ãû-àl,Ã@ *Ãx.Ãì)Ã~-Ã@ó-ÃÐv)Þ2Ãàê1ð/Ãð;+Ã@d0ÃÐd,ÃP©+è&ÃðY&Ã`S+Ã0Ø+ÃðÖ&Ã0Þ*Ãp€*àé,Ã@+Ã@ &Ão%à 4+Ã0Ø+Ö)î%à .,Ã](ð()Ã](Ã0m(ð.(À**Ã0Ì-Ã0a*Ã@)à @)àl,ÃP&,ÃÀ1.ÃÀ7-Ã0´1àõ*ð™+ÃÐÏ/ð"*Ã?-àû)ô$ÃPh!Ã`Y*ð/ÃP&,ÃÀO)à É'Ã0$àŠ'ÃðÖ&ÃðÄ)Ã](Ãà+Ã0U,Ã0ä)àŠ'Ãò$ÃP2*àr+À³(à É'Ãp€*Ã*à 'Ã0s'à&Ãp’'Ãþ&Ã`î&Ã%'Ã`w%Ã@'Ãp*à .,Ãp÷+àT0Ã`G-Ãpž%Ãp )Ã0‹#Àõà É'ð,Ã`S+Ã`q&Ão%Ãpý*Ã@+ÃÀä%ÃÐ%Ãi&ÃPÙ#Ãp!%ÃÀØ'Ãà£(ÀÅ%ÃÀê$Ãæ&ÀÑ#ðÃ$Ãpý*à ·*ÃÐ|(Ã`â(Ãà8%Ã0%ÃPÓ$ÃpŒ(ÃÐ|(ÃPµ)ð-Ã0g)Ãp’'Ã@ &à Ã(ÃPñÃPÙ#ÃÐù(à~)ÃðG)Ãþ"ÀÑ#ÃðM(à ½)Ãp˜&ÃPÍ%Ã`è'Ãæ*à&ÃÐù(ÃðM(ÃЈ&ÃД$Ã@)Ã0ä)Ãp’'ÀH%à X%Ã1%à %Ó#ÃðS'Ã1%Ã`q&Ç%à%è&ÃðS'à F(ÃðÊ(à :*Ãà&(à Õ%Ã`î&ÃÐŽ%Ã=#ÃÀ['Ãp˜&Ã@/$Ã`è'ÃÐç+ð·&à„(Ãpý*À¹'à Û$ÃC"Ãþ&Ã0ö&Ã0s'àï+Ãà*ÃP2*à d#à ‚Ã`!ð4'À¹'Ão%Ã0ð'Ã&à ó ÃÐ &Ãc'ÃðÊ(Ãc'Ã`k'ð@%ÃðÊ(ð.(ÃPJ&Ão%ÃPÇ&ÃPÍ%Ã&Ãp¤$ÃðY&ÃÐp*Ãà8%à ó ÃP\#ÃP8)î%Ã0…$Ãi*ð.(à L'Ãp’'ÃðÐ'Ãà*Ã`î&Ãp'$ÃPn Ãp'$Ã`e(ÃÀg%Ãp&ð±'ÃÀU(ú#ðR"Ã0"àœ$Ã&à R&ÃàÁ#ô$Ãp!%ÀN$Ãp9!Ãp'Ã$ÃPJ&Ãp˜&à Õ%ÃК#ÃpŒ(à~)à(Ã0s'ÃpŒ(ÃÀm$Ãp'$Ã1%ÃÀm$Ãp3"ÃPÙ#ÃÐ$Ã(Ã0…$Ãp&à&Ã`ƒ#ÃPß"À³(Ã0ü%Ã`q&Ãp(àû)Ã@'Ã0‹#Àéà®!Ã%'à L'Ãp’'Ãp†)à X%à~)Ãp˜&ÃÀg%Ã7$Ã0#ÃÒÃÔ)ð .ÃÚ(Ã@Ä ÃÌ Ã°É#ð·&Ã`è'ÃðA*Ã0O-Ã`ô%Ã0$ÃàÁ#Ã@#&Ãà'ð"*ÃÐ$Ãà»$Ã`_)à F(ÃÐ%Ã"Ãà»$Ã@/$Ã@5#Ãu$à R&Ã`q&ÀB&ÃW)Ã0%Ã@;"Ãà¯&ÃPÍ%Ãò$ÃÔ)ÀÅ%à%#ðÃ$Ã+&à&à~)À**ÃÐŽ%Ãpž%Ã@š'Ã@Ž)Ã`è'Ãðî"Ãà¯&ð·&Ã@/$ÃàJ"ð½%Ã0s'Ã*Ãp'Ãì%Ãþ&Ãò(Ãð_%Ã`ú$Ã1%Ãp'$Ã@;"ÃðÜ%Ã@”(à .,Ãðš0Ã~-à&ÃPzÃ`›Ã08ÃàÇ"ÃP8)À¹'ÃÀê$Ã$ÃÐó)ÃðÖ&À<'Ãà )Ç!Ã%'ÀB&à ^$ÃÀü!à á#Ã0Þ*ÃÐ &Ü(Ã,ÃP\#Ãp'$ÃðÜ%ÃðÐ'ÃЂ'ÃÐÿ'à„(ÃPÍ%ÃÀm$ÃpŒ(Ã`Ö*Ãø#ðdÃ@#&Ã7$Ão%à$Ãðe$ÃÐ$ÃðÐ'â'ÃÀÞ&ð.(Ã0%ÃO ÃI!à–%ÃÐv)à ½)Ã@)ÃÐ &Ã0—!à X%Ãð_%Ã@¬$ÃÀm$Ã@#&àŠ'Ãþ"Ãp¤$ÃД$à :*Ãp†)Ãpž%ÃðÖ&Ã0ê(ðF$ÃP>(Ã0ö&ÃÀÒ(Ã@²#ÃÀØ'Ã`k'ÃðÊ(Ãò$Ã@)ð«(à)ð4'Ã`Y*Ã0%À¿&Ã1%ÃЂ'À¹'Ã0ä)Ãø'Ãp*Ã`Ð+Ã`M,Ãpz+Ç%Ã0%Ã0"Ã`!Ã`ƒ#ÃÐ'Ã?-ð½%Ã"Ã0%à Õ%Ãi&ÃÀa&ÃðÖ&Ã0m(Ãu$ÃPÁ'ÃÀØ'ÃÐ'à„(Ãæ&Ãà»$Ãð_%ÃP»(Ãà—*ðŸ*Ãì%Ãp )àŠ'Ã`â(ð±'Ãæ&ÃÐ#"Ã@/$Ãp’'ÃàJ"ÃÀ"ÃÐ#ÀN$Ãà'à¨"ß!à Ï&Ãð¾*Ãð¾*Ãà'Ãu(ðÉ#Ãp˜&ð"*Ã@”(ÃÀs#Ã0 Ã@¸"Ãò$à R&ÀË$à ç"Ã0s'Ã0m(ÃðY&Ãp*ÃÐ &Ãpª#à ç"Ãi&ÃК#Ã0%Ãà'Ãp&à |Ã` "ÃÀO)à L'â'ðÃ$Ã`‰"ÃàD#ÃpŒ(Ã0g)ð·&ÃPP%Ãàµ%Ã`}$Ãðî"Ãpª#à X%à X%Ãæ&ÃPb"ÃÀê$Ãà£(ÃðÜ%Ã`$ÃÀê$ÃÚ(Ã`è'Ã@/$Ã`}$à í!ÃPV$ð^ Ãà»$ÃÐù(ÀÅ%ÀT#ÃÐ &ð"*Ã@#&ÃðY&Ã{'Ãpž%ÃЂ'àû)Ã0ä)ÃÀ"ðÉ#ÀT#à=ÃpÎÃ"ÃP>(à R&Ãðú ÃÃ`!Ç%Ã"ÃÀg%à p!ÀN$ðL#ÃÀê$ÃP2*À<'Ã+&Ã&Ã0m(Ãpž%Ãð ÃPÍ%ÃPÇ&Ã0y&î%ÃàÓ ÃP\#Ã0ü%ÃðS'Ãà2&Ã`ƒ#Ãu$ÃÐ%ÃpŒ(À`!Ãà*à %Ã0g)â'Ãþ&ÃÐ#ÃвÀéÃPzÃÃø#ÃК#ÃÐŽ%ð,ðF$ÀN$à p!ÃÔ-à É'ÃPh!Àf ÙÃo%à&à Õ%ÃÐ#Àã à1!à v Ã0‹#Ãðe$ð4'Ã@š'À³(Ãà,'àœ$ÃÀy"Ã`î&Ã0m(Ã`$à á#Ã`ƒ#Ã`‰"Ã`!ÃàÁ#Ã`î&Ãp9!ÃÐÿ'ÃÀU(ÃP>(è&Ãpž%Ã°Û Ã0"Ã&ÃPJ&ÀË$À¿&à´ Ã@A!ÃI!ÃPß"ÃÀö"ÃàÓ ÃÐ &ÃÐ &Ö)ÃðÊ(Ã1%ÃàJ"Ã0$ÃpKð‚Ãðw!ðF$ÃPÇ&ÃК#Ã@5#Ã@¾!Ã@¦%Ãðe$ÃÀö"à Û$ÃðÖ&ÃÌ Ã`• Ã@¬$Ãp˜&ÃÀy"Ã( Ãp¼ à v ÃàÍ!ÀN$ÃÐ#"Ã0 Ã@MÃC"à d#Ã0"ú#ÃЬ ÃO à í!à+"Ã@²#Ãp3"Ã`ƒ#Ç%ÀH%ÃC"Ãð‰à ÃÀs#Ãþ"ÃàV ÃPë Ã0‹#Ã`ƒ#î%Ã0%ÃpKÃPb"Ã"ÃI!ÃЬ Ã0‘"Ã0—!ÃpEÃàP!ð^ Ã@MÃ@5#Ã0#ÃÐ#ÃÐ)!ÃàÓ Ã0£ÓðF$Ã`‰"ÃÀä%Ãp3"Ã@Öà1!Ã( Ã`Ãðk#Ã0 à Ã0$ÃÆ!ðáà !ÃI!ÃP\#Ã=#ÃUÃÀ… ÃÀö"Ã`#Ãðq"Ã+&ÃЈ&Ã`e(À¹'Ã@Ä Ã*Ã0%Ù"Ã0…$ÀZ"à j"Ã@A!à+"ðdÃ=#à~)ÃК#ð½%Ãp!%Ã{#Ã0—!ðdÃàÇ"ÃðÜ%Ã¥ Ã@/$ÃÐ &Ãp¤$Ù"Ã{#Ã@¬$ÃÀm$Ã`• ðíðÏ"Ã0$Ãà>$Ã@5#ðçÃÐ/ ÃàD#ÃPÙ#ÃÀ‘à ÿÀlÃàbÀ¿&ð@%ÃPÇ&ÃÀg%ÃÐ#"Ã0ü%Ãà»$à F(Ã`î&Ã0$ÃД$ô$ð@%Ãp¤$à´ ÃPÍ%Ã0#Ãðî"Ã"à d#ÃÀ"Ã@¬$à ç"ÃPn Ãp3"ÃД$à R&ÃPV$Ãà,'Ã@#&ÀN$Ãpž%à d#ÃPP%ðÃ$Ã`q&Ãp(ÃÀm$Ã:à î%Ãp-#Ã0%ÃÀÞ&Ãc'ÃàJ"Ã`w%Ãðe$Ã@ÊÃ`î&Ãà>$Ãp&ðF$Ã{#Ã"ÃÆ!Ãðk#Ãðè#ð4'Ãp¶!Ã$Ã0%Ãø#Ãp°"Ã`›ÃÀð#Ã`ô%Ãi&Ã@”(ð()ÀZ"Ù"ÀË$ÃР"À`!Ã@”(ÃðS'à Õ%Ã@¸"ÀrÃ`• Ã$à+"è&Ã@¾!ÃPß"ÃÀa&Ãþ"ÃÐ%ÃPÇ&àŠ'Ãàµ%Ão)ÃPtÃàP!ð()ð·&à%#ÃPzÃ"ß!Ãp!%ð¥)Ã`è'Ãp'ÃÐ%ÃоÃP÷à®!Ã`ú$ÃÐŽ%Ã0$Ãp’'Ã0‘"Ãàµ%à%ÃÀä%Ã`î&à%#Ãðq"ÃÐ &Ã@/$Ãð_%ÃTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Î (ê(·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxZ8HEAPXHYdescriptionsection_0section_1section_2 Hn_sections ðc¨À[ ·—NM (CLASSTABLE`Ü 0SNODhY˜d(hå88fTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(8Ü ÿÿÿÿÿÿÿÿ @TITLEDescription of channel 2 8 FIELD_0_NAME n_sectionsÀdàfTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhhHEAPX gdatadescription8  @œ°iq·—NM€SNODXg°Úà…-Ã0Ì-Ãà+ÃÂ0Ãàg2ÃP1Ã?1Ãl0ÃPü2Ã@ç/ÃP,+ÃðR<ÃàI7ÃàÌ6ÃàÌ6ÃP,+à +Ã0¨3ÃP‘/ÃP0Ã0=0ÃÀÀ+ÃÀ–2ÃpÓ1Ã@j/ÃÈ/ð/à×/Ãð¦.À0Ã0=0Ã0Ì-Ã0¨3Ã@j/Ãpµ6ÃPü2à 3Ã`G-Ã0=0À‰/Ã{'àõ*Ãàê1ÃÐç+Ãp!%à Ï&Ãû-ÃP1Ã5Ã0¨3Ã`;/à 2À /ÃPy3Ãpz+Ãx.ÃÀ7-Ã*Ãð#/ÃÈ/àT0ð/Ã`¬1Ãàä2Ãï/ÃÀ„5Ã`A.ð‡.àÑ0Ã33ÃP0Ãr/àr+ÃÐX.Àè4à Ÿ.Ãð#/Àƒ0Ã4ÃÐ:3Ãàs0à (-Ã0O-ÃÐÉ0ü1Ø3ÃÎ.Ãu(Ã0º0Ã`Ä-ÃP/ÃP/ÃÐÏ/ÃPö3Ä,Ãð”1Ãàä2ÃÀ¢0Ãp\0à ".Ã33Ã0Þ*Ãp€*ÃÚ,Ãpn-Ã@ÿ+Ã`Ö*Ãð /ÃK+À$+ÃÀ7-Ã0Æ.Ãà.Ãàö/Ãr/Ã@í.ÃÀº,ÃÐ^-ð/ÃÀ–2ÃE0ði3À /Ã0O-ÃÐÃ1ðø0ÃÀ 4Ã-0Ãð /ÃP -à 0Àw2Ãp'$ÃP¯*ÃP,+Ã@ù,Ãðš0à`.ð‡.àœ$Ãà )ÃÀ®.Ãàö/Ãð¸+Ã0[+Ã0O-ÃP1À-ÃÀ1ÃpÙ0ð-Ã05à 3ÃÐL0ÃE,à Ÿ.Ã*àf-Ãà,àû)ÃÐF1Ãpn-ö2ÃÀ5Ã@Õ2Ã@L4ðø0Ã@p.Ã0À/ð4'Ã0º0ÃÀ+/ð“,Ã@Õ2Àƒ0ÃW)Ã@ó-ð3Ãï/Ã`Ð+Ãð¬-à×/Ã’4àÅ2à ¥-Ãà )à 4+Ãày/Ã-0ÃÈ+Ã0Ò,ÃÈ+ÃÑ4Ã`”5ÃÀœ1Ãð 3ö.ÃpJ3à­6ÃpÁ4Ãð¦.Ö)àf-Ãph.à ‡2à (-ÃP…1ÀÖ7ÃÀx7ÃÐ44ÃÐL0Ã0À/à ".àZ/Àw2Ãc+àf-à ò5Ã`8ðà4àã-àÅ2Ãï/Ø3Ã@|,ÃÀº,ÃP,+ÃP1à 1ÃpV1ÀÐ8à o6ÃE0ð·&ÃÀ 4ÃÀ1Ãõ.ÃP‹0Ã0º0ðì2Ã`50ÃÐÕ.Ãà‘+Ã@ù,Ã-0ÃpJ3Ã@R3Àô2À›,ä1à 0À1Ã-0ÃP2ÃpP2ðW6Ã<8ÃÀr8à {4Ãp»5Ãà[4ÃÀI*ÃP2ä1ÃPs4à ò5Ãp©8à 1ê0Ã0 8Þ6àË1Ã@Ï3àH2ÃÀ¨/ðÈ8Ã@R3Ã@Ï3Ã÷8ÃPð4Ãz8Ã5ð“,Ãpn-Þ2ÃP0à­6Ãð‚4Ã`‚8Ãðj8Ã0¨3ÃPü2à<4Ã?1à`.Ãp¯7Ã@(:ÃÐL0Ãðj8Ã0x;à ò5Æ6Àe5Ã@F5ÃÐF1ÃPð4ÃPÌ:Ã`”5ÃpJ3Ã-4à06Ã`8Ã33à 1Ã`²0ÃZ3à i7à ì6Ã@@6Ã0¢4ÃàU5Ãp—;Ã0+3ÃàØ4Ã06Ã`‚8ÃPg6ù8Ä,àB3Ã`š4ÃÐ(6Ãðp7ÃП7Ã*;Ãàê1ÃH6ÃÐþ<ÃÀ5ÀA;ÃÐ<Ãp©8Ãð /Ãðÿ4à u5ÀY7à ‡2ÃàC8ðo2ÃH6ðø0Ã@É4ÃÀx7Ãp»5Ã=Ãp:Ã07à ]9Ã@½6ÃÅ6ð9;ÃPØ8ðò1à ]9à§7Ãðp7Ã06à 3Ã?1Ã@^1Ã@á0Ãpñ,ð/ÃÀ5Ãб4ÃPü2Ãðó6ö.Ã@·7Ã@Õ2ðu1Ãàm1ÃàÆ7ÃÀ2ÃPO:Ã`6Ã071à$8à Ÿ.Ã@ó-ÃPä6ü1ÃàO6ðÔ6ê0ÃPä6Ã06ÃpÇ3à ]9Ã`50Ãà—*Ã3ÃPO:Ãn:Ã7àÑ0Ã@F5àB3ÃÑ4àH2ÃðŽ2à<4ðo2Ãð 3Ã@.9à›9ÃpJ3ÃÀ´-ê4Ã@Õ2ÃÀŠ4Ãt9ÃÀr8Ãðÿ4à•:Ã-4ÃÀÀ+Ã7ÃÐ"7Ãà.Ãð4à ‡2Ãàä2Ã`”5ÃPs4à¹4à³5ðÔ6Ã9Ãp27Àô2ÃpD4ÃPy3ÃÀŠ4ÃPy3à c8Ãðÿ4Ø3Ã0x;ð¶;Ã@^1ði3ÃÀã:à ì6Æ:À}1Ã05Àú1Ã`š4Ã`ˆ7À‰/ÃQ.àN1Ã`d=Ã`”5ÃÐX.à æ7à<4à 2ÃàØ4ð{0ðÔ6Ãp86à*7Ã@:7Ã@";Ã0¢4ð‡.ÃÀ%0ðÚ5ÃPä6ÃðŽ2Ãpµ6Ã@X2Ã0 8à W:à9Ãz8à<4Ã`5ÃÀl9ðÚ5àH2Ã92Ã07ÃPä6ð3Ãàð0Ã0=0Ãàê1ÃÐ¥6Ãðó6à 2à :Ã÷8Ãà[4Ãà®;ÃП7à§7Ã0„9ÃÀr8Ã@Ã5Ã7À0Ã4ÃÀf:Ã@48ÃÐÕ.ÃÐ(6Àè4Ã@F5àN1ð/Ãàö/Ã0Æ.Ø3ÃÀ–2Ã05Ã0Ò,ð3ÃÀ5Ã06Ãðù5Àô2ÃÐ(6ÃN5Ã`‚8Ãp\0àZ/Ãð”1Ø3àÝ.ÃŒ5Ã7ÃÀ6Bà‰<ÃPº=Ãðù5ÃÀØ'À.ÃÐ¥6à Ú9Ã05ÃPm5ð‡.Ã`)2ÃÀr8Ø3ÃP—.ÃPð4àT0Ã`¬1Ã0¢4ÃB7Ã`Ž6à ø4Ãpß/ÃÈ/à ø4ÃàU5ðø0ÃP‘/ðÚ5ÃpD4ÃÀ2ðc4ÃÀ3ÃE0Ãàg2Ä,ä1Ãàä2ÃÐ8ÃÐ:3ðþ/Ã!2Àî3àH2Ã92ÃPö3ÃpP2àB3Ø3Ã0¨3ÃÀŠ4à o6ÃE0ÃPü2à 1Ã0¨3ÃP‹0Ãð0ÃpÓ1Ø3ÃÀï8Ã0I.ê4Ãàm1ÃP,+Ã0%4Àe5ÃpÙ0Ã’4Ã!6à “0ð3Ã0+3Ã5ÃpÁ4ÃPm5Ã0O-ÃÀ['Ã`4Ã0œ5ÃpD4ÃÀ3Ã7ÃP´>Ãз3ÃŒ5à Ú9ÃЫ5ÃpJ3à$8ÃPÌ:ÃàI7Ã-4ÃÐ ;Ã0%4Ã@:7Ãðÿ4à ø4à Ô:à E=ÃPg6Ã012Ã@F5Ã`5ÃÑ4Ãý7ÃÀ3à­6Ã9Ãp&9Ãpµ6ðc4ÃË5ÃП7Ã`Ž6ÃÀ~6ÿ7Ãð4Ã69Ãh;ü1à$8Ãp&9Ãß@ÃÀN>Ãà%=Ã` 7à¿3Ãß<ðBà ì6àH2ÃPÆ;à {4Ã`ó:Ã0–6ðQ7Ãh;Ãß<à :à Î;Ã0–6ç;Ã0x;Õ>ðE9ð¶;Ãå;Ãðp7Ã@.9ð¶;à06à <Ãà7:àƒ=À;ÃÀõ7ÃB7Ã0ï<à ø4Ã`v:Ãë:ÃPs4ÃÀ~6ÃÐ:ó9à @Ã@oCà Q;Ãp©8ÃÐ8ð?:ÃÐø=ÃPð4Ã07à:ÃPØ8Ãðp7Ã@á0à65Ã*;à§7Ãà[4Ã@Õ2à i7à Q;Ãñ9ÃN5Ã` 7à$8ÃÐ ;ÃàÆ7Ãð|5ÃpÁ4ÀÜ6À7ÃÀ×<á<ÃPÌ:ÃÅ6Ãðd9ÀÖ7Àk4ÃPÒ9Àî3Ã`|9Ã0œ5ÃpÁ4à c8ÃÀã:à 3Ã07Ã0œ5ÃPÒ9Ã'5ðAÃp…>ÃÀ¿@ðñFÃàÆ7Ã`ˆ7à;ÀM9Ãh;à Q;à È<ÃÀZ<Ã@Ï3Àƒ0Ã`²0Ã`¦2ÃÀ`;Ã0f>Ã@L4ÃpÇ3ÃPð4ÃÀ5à ]9Ãðç8Ãб4Ãàa3à Ô:ÃP[8ÃÐ8ÃpÙ0ÃPö3Ãà´:À¸<ÃÐ<Ã`Ž6Ã`ù9Ãàœ>Ã@=Ãz8ÃÀã:ÃÀû6Ã9Ã07àô?Ã`š4ðÎ7Àè4Ãp©8Àk4À_6Ãpµ6à ì6Ã?ÿ7ðÎ7Ãð|5Ã-ÃÀ6ÃÐF1ðW6à06ÃП7Ãp£9ÃЙ8ðì2Ã0º0Àw2ÃN5à i7Ã@±8Ãt=ÃB7Ã0l=Ã`ù9Ã`8ÃP2ÃpD4à­6Ãã1á<ÀÜ6Ãp>5à¡8ðQ7ÃÐÉ0ÃàÌ6à;Ã!6ðæ3Ãðí7ðÚ5á<ÀÜ6Ãp©8ÀÜ6ð¶;Ãðp7à i7Ã0–6ÃàÀ8à :Ã`”5ÃÐ.5Ãb@ÃÀl9Ã`”5Àâ5Ãðj8Ã`A.à*7à06Ã`j<à×/ÃŒ5à06à ò5à•:í:Ã`5Ãl0ð'>ÃÀ¨/Ã`Ž6Àè4À1Ã@¥:Ã92Ãp¯7à {4Ã@Û1Ãð5,ÃðŽ2ÃB7Ãàº9ÃN5Ãp»5Ã?ÃÀ6Ã@É4Ãз3à u5Ãð”1ÃP2à {4ÃÅ6Ã06Ø3àÝ.Àƒ0à Ô:Ã’4Ã'5Þ6Ã@^1Ã`M,À0Ã@^1ÃÐR/à<4Ã`²0ÃPs4Ã'1Ãà‘+àË1Ãàð0à06à 6Ãðˆ3ÃЫ5ÃÀ~6Ãðv6ðW6ÃàÌ6Ã’8ÃPU9à65Ãp¯7ÃÐ¥6ÃÐF1à 2ðu1Àe5ÃP -ÃÐL0Ã@d0ÃÀI*Ãàö/àÅ2ðà4ÃÀ3àZ/Ã@·7àN1ðø0à «,Ã`š4Ã0À/Ã0~:ÃÀœ1Ã0Ò,À‰/à×/à 1ÃÐ@2à9ðu1à<4ÃÀr8ÃàO6ÃÀ1Ãð‚4ÃP—.Ã!2à 2Ãàs0Ãð0Ã@Õ2à 3ðQ7Ã`A.Ã-0à³5à K<Ã@Ã5Ã0¢4ÃàU5ê0Ã`;/àH2àË1ÃP -Ã@É4Ãàä2Ã33Ã8ÃÂ,Àw2Ã05ÃpÁ4Ã0®2ê0Ã-0ðà4Ã@·7Ã@Õ2àÝ.ÃpD4ÃÀf:ð°<Àè4ÃÑ4Ãàä2à 0à W:Ãðˆ3ÃÀ6Ãé0à 6ðò1Ã@Ï3Ãз3Ã0®2Ãð4Àƒ0Ãõ.Ãð /ÃPö3Ã7ÃÀ~6Ã@X2ÃÀ3Ãàê1ðò1à c8ÃàO6Ã?1à 3Ã`A.Ã@Ã5Ãðp7ðÔ6ÃÐ:3Ã0Æ.Ã@Ï3ÃàÌ6ÃÐ"7ÃpÇ3Ã`2Ãð”1Ã@ç/Ã3àË1ÃT4Ã`Ü)Ã9.Ã`5ÃàO6Ãpµ6Ã@48ÃË5ÃN5Ã@Õ2Ãàö/à 0Ã92ÃH6ÃГ9ðW6Æ6ÃÂ,Ã0®2Ã0+3À‰/Ä,ü1ù8ÀM9Ãp‘<Ãð·@ÃÐì?Ãp :Ã`v:Ãpå.à 1ÃÀ¨/à ™/Ãà[4ÃP0ðK8Ã5Ã`/1Ãðó6Àw2ð-ÃÀ®.Ã@·7Ãð^:Ã@.9ÃPm5ðQ7ÃT4Ãf1ð/ê4Ã@Õ2Ãà´:ÃÝ2Ã@F5Ã0=0àË1Àq3ÃpÇ3ðQ7Ã`ˆ7Ãðó6ÃÐ44ðÚ5Ã@±8ðc4à<4à ò5Ãð4ÃàÀ8Ãñ9àÑ0ÃÀf:Ãн2Ã!2ÃÝ2Ã×3ÃP1ÃPØ8ðW6ÃÀ+/Ãн2Ã×3Ã@É4Ã`#3Ã0º0Ã012ÃÈ/ÃpÍ2à 3Ã@í.à 1Ãz8àT0Ã0O-Ã@:7à u5Ãà[4ÃÀ5Ãб4ÃàÀ8Ã`¦2ð/Ã0%4àB3Ã@L4ÃÑ4ÃÐ.5Ã-0ÃÝ2Ãp\0Ãà[4ÃÀ–2ÃPö3Ã-0Ãàö/Àô2à K<Ã@Ï3ÃÅ6ÃQ.Ã0¨3ÃN5ÃŒ5Ãà¨<ÃÐ(6Ã`50à<4ö.ÃË5Ãàg2ÃÀ„5ÃàU5ÃÀ 4Ã@Ï3Ã@L4Ãpñ,Ã@F5à¿3ÃÐL0ÃpŒ(à 3Ãà.Ãp27Ãpß/à ™/ÃÀ%0Ã@Ž)ÃÐÉ0ðò1ðÔ6à þ3Ã'5Ãð¬-Ã@Ï3à06Ã@F5Ãàm1ÃÀ–2Ãpµ6Ãð²,Ãà—*Ã`50Ãðš0Ã`¬1ÃÀ5àN1Ãàm1Ã3/ðo2ÃÐÕ.Ã`50Ã’4Ã@á0ÃÐÕ.à o6Ã0´1Ãp€*Ã`;/Ãàä2à 3ÃÀØ'Ã0C/ÃPü2Ãð5,Ã-à o6Ãð).ð,Ã@ó-ê4Ã0®2ð-ð/ÃÐ:3Ãðv6Ã7Ãà‹,Ã06ÃàÒ5Ã`M,Ã!2ð+Ã0À/Ã@ó-ð]5Ãðj8Ãà*À›,ÃpV1àr+Ãà.ÃK/Ã0O-à Ÿ.ü-À.ö.àZ/Ã@Õ2Ãð”1ÃP‹0Ãð¬-À.Ãàö/Ãð 3Ã0œ5ÃP.Ã9.ÃÀ7-Ã0Ò,ÃZ3ÃpÁ4ÃE0ÃW)à 3Ã0¢4ÃÀ%0Ã?-Ã`2Ãð 3ÃÀ=,ÃE,ðu1ÃpÇ3àH2ÃÀ+/Ã`²0Ãàs0À›,ÃÀ1.Ã!2ÃpJ3Ãì)Ãàð0ÃP0àZ/ÃpÓ1ÃP1Ã@š'Ã@ˆ*ÃP -ÃÐ^-ÃP -Ã`Y*ÃÐR/ÃP2Ã'1ÃÐ^-Ãð /Ã3Ãð).Ã@Û1Ã` 3à 6ÃpÁ4Ãð|5Ãã1Ãpë-Ã0U,Ãð#/ÃÐd,Ã071Ãày/ä1ÃP -ð/ÃÀœ1ÃP2ÃÀ7-àH2Ãàº9Ã06ðc4Ãðí7à 3ÃK+àï+Ãpb/ÃÀ¢0ÃpJ3Ãà-Ã`/1ÃPy3ð3Ã`2Ãpn-Ã0g)Ã-0ÃÔ-ðÔ6ði3Ã'5à æ7Ãàä2Ãз3ð-ÃÀ2ÃÂ0à³5Ã06à /Ãày/Ã`¸/ðo2Ã@@6àT0Ãð /Ãðš0Ã0–6àõ*Ã0¨3Ã`¸/Ã` 3ÃP,+ÃÀ1.ÃP—.ÃÐj+ÃÀ3Ã@á0Àq3Ãf1ö.ð-Ã@Õ2ÃÀ¨/Ãï/ÃÐv)Ã0C/ÃÀC+ÃÀ¨/Ãðˆ3Ã0®2Ãð 3ÃP-Ãæ*ÃP0Ãà‘+Ä,Ø3ðì2ü-Ãð¦.Ã0´1Ã`;/à /àõ*Ãð”1Ã` 7ðæ3ÃÐÕ.ÃP‹0ÃP0Ã`S+Ã`¾.Ã3/Ã@Õ2ö.Ã0Æ.ÃÀ~6à×/ð{0Ãð²,Ã3/Ãé0À_6Ã0¢4àé,Ã@p.ÃÝ2ÃÀ5ð¥)Ã@ù,ÃP1Ã`Ê,ÃpÇ3ÃP2Ã`2Ã0º0Ã0º0à ¥-À§*Ãà‘+Ã@X2àB3Ã@Ã5ÃðŽ2à (-Ãð).Ã012Ãðš0Ãà[4Ã!2ÃP-ð .Ã@É4Ã!6ÃPü2à¡8ðo2Ã0C/à ø4ÃP&,ðø0ÃP-Ã@p.à 0Ã],À$+ÃÀ1.à ".Àú1Ãp*ÃP.à ‡2ð/ÃàÞ3ÃP&,àõ*àB3ü1ÃÀ¢0ÃP2*àõ*ÃÐF1Ê+ÃP©+Ã@v-Ãàü.À0ð/ÃÀ1Ã@R3ÃÐ@2Ãà.ð/Ã`/1Ã7ÃÀ 4Ã`M,ÃÀœ1ÃÐ:3Ã0C/ÃP&,ð-ÃÐ44ðo2ÃÀ–2Ãð2àT0ÃÐF1Ãàm1Ã@Û1àZ/Ã0=0Ã071Ãã1Ãày/ÃÝ2Ãà.Ãû-ðÚ5Ã’4Ã`Ð+ÃÀC+ÃÐj+ÃP1Ã@Û1À}1àÅ2Ä,ÃÐÉ0à­6à¹4à Ÿ.Ã`â(ÃP©+ÃÀ¨/ÃÐÛ-ð,Ã9.Àú1ðo2ÃPö3ÃpÍ2Àƒ0ðþ/ðo2ÃÀ 4à ".ÃP.ÃÐj+ÃÀÆ*ÃÀ+/Ãà.Ã@í.ÃÐÃ1ÃÎ.ÃÐÕ.Ãð/-ÃE,Ã071ÃP0Ã?-ä1à “0Ãð¦.Ãð¸+Ã@j/ÃÐá,Ãð‚4ÃP1ÃÈ+ÃÀ3Ãð#/ð/ð/ÃP1ÃÐF1ü-Ã@L4àZ/ê4à à8Ãf1Ãõ.à “0Ãr/ÃÚ,à ø4ÃÐ^-Ã`/1ÃpÙ0ÃÂ,Ãð²,ð.(à 1ÃÂ0À¦?Ãð0ÃÀ6Ãð|5Ãð;+ÃW-Ãp\0Ã@í.ð+À.À.Ãà+àH2Ãз3Ã4Ã3/ÃpÇ3Ãð|5ê0à ™/à ".Ã!2ÃðŽ2ÃðÊ(ÃP‹0Ã@É4Ã(ÃÀ2Ã`M,Ã`;/ÃÀ¨/Ãðš0à 3ÃÐÛ-ÃÀ®.Ãð‚4Ã?1Ãà.ðø0ÃZ3ÃÀ®.àZ/À}1Ã{'ÃQ.Ãph.ÃÀ¨/àÝ.À,Ãpt,ÃP‘/ÃÀ¢0ü-ÃQ*À-Ã0I.ÃpV1Ã0Þ*À¹'ÃP-Ã@Õ2à 2ðÂ9Ê+ÃÐç+Ã?-ÃÀ®.ÃÐX.ðò1Àú1à 1ð/Ã0Æ.ÃW-ÃÔ-Ãày/Ãàü.Ãð0ÃÀ®.ÃP…1Ã~-Ã0C/Ãð‚4ÃÐá,Ã`Ö*ÃÐ^-Ãà—*ÃÐ8Ãpb/Ãà£(Ãàö/ÃP£,Ãf1Àô2Ãð|5à„(Ãp*ð()Ã`e(Ãàs0Ã0I.à 1ÃP/Ã@p.Ã@|,Ãð¦.Ã`A.ÃÐL0à ì6ÃÐL0àÝ.Ã`M,Ã`¬1ÃP.ÃP»(Ã`¦2ð"*ÃÐv)ÃE,ÃP‹0Ãp÷+Ã0Ò,àÝ.ÃÐR/Ã`)2Ã@ù,Ã@ù,Ãð /àŠ'Ãàm1Ã×3À›,Ã0=0ÃÐ^-Ã`50Àk4Ã?1À•-ÃÐj+Ãðù5Ã@ç/ÃP/Ã@Ž)ÃpP2ÃpD4Ã`¸/Ãàê1ÃPê5Ã`#3Ãp(àr+Ãé0ÃÔ-ÃÈ/Àú1ð]5Ãàö/Àú1ÃQ.ÃÂ,ÃÈ/à 2ÃÐÕ.àr+ð{0ÃÐL0à 2ÃE0ö2Ã`¾.Àw2Ãàö/ÃÐÕ.Ãàð0ÃPµ)Ã0%Ãн2Ã0º0Ã`Ä-À­)Ã@ÿ+ð/ÃÐó)ÃÀ®.Ãpß/ÃÐÏ/ÃPm5Ã`Ö*Ã`Ö*Ã-ü1Ãpb/ÃÀ1ÃðŽ2Ã@|,Ã@:7Ãð /Ã0C/Ãàs0ÃÔ-Ãð 3Ãf1ðo2Àƒ0ÃÀ3ÃÚ,Ã0º0Ã@";àã-ü-Ãx.Ã@L4ÃÐÃ1àf-Ã`Ê,àã-Ã@á0Ã0C/Ãðˆ3Ãð#/À}1Ãàü.À1ÃpP2ðo2Ã’4ê4Ã0–6ÃÝ2Ã7ÃÀ¢0ê4ÃðŽ2Ã0%4ÃÐ:3Ã3Ãé0Ã`¦2ÃÀ1Ã8Ã@ç/Ã06Ã@Û1ÀÐ8Ø3Ã`¸/Ã0%4ðu1Ã`¬1ö.Ãðš0Ãн2à¿3Ãðù5Ã`¾.Ã@É4àN1ÃPð4ÃÐ@2ð«(ÃpV1ÃP…1Ã`6Ã0œ5ÃàU5Ã@(:Ã@“=ÃàBÃ7Ãpµ6ÃpV1àN1Àâ5à “0ÃPÞ7ÃÀr8Ã` 3à u5à 0ÃÀ2Ã`6ÃÀ 4ÃÀx7à­6Ã'5ÀÊ9ÃÀr8Àî3à*7Ã33ðQ7à*7ó9ÃPê5ÃÀ2à u5Àk4ÃÝ2Ã`š4Ã@48ÃÀN>ÃàÆ7à þ3Ã`8ÃË5ÃPð4À7ÃÅ6ÃðÕ;Ã`#3à 3Ã0„9Ãз3ð’AÃå;Ãp—;ÃPm5ÀÐ8ÃÐ"7ù8ÃàÀ8à o6Ã0œ5ÃÐ ;ð?:À²=Ãb<Æ6ÃÐ44à ò5à<4Ãp‹=Ã0–6ÃPö3ÃÐ:3à ]9Ãðv6Ãб4ÃŒ5Ã33Ã`”5Ã@á0à 2ÃÀû6Ã0û:Ã`ó:ðÈ8ÃÀû6Ã@.9Ãp>ÃÀÝ;ÃPO:Àâ5Ã`6Ã@X2à*7ÀÐ8Ãðp7ðE9í:Ã@(:Ãp&9Ãn:Ã0~:àB3Ã`š4ÃàU5Ãàö/À7à i7Ã7Ãà[4Ã@R3Þ6ÃN5Þ6Ã05Ãàä2Ã`Ê,à 1ÃÑ4ÃÐR/ðþ/ÃÐ@2Ãðp7Ã`5ÃÐL0Ã0+3Ã-Ã@d0Ãp»5àB3àN1Ãð0ö2Ã`‚8ÃðÉ=ÃÐ:ÃÎ.ÃðÛ:ð9;ÃðŽ2àÑ0Ã3à þ3Ã9Ã8ÃP‹0Þ2Ã×3ÃpD4Ã`5à<4ü1À}1Ã`50à ™/ÃÐX.Ãpå.àË1Ã0C/ÃÐ.5Ãз3ÃÀ2Ãн2Ã<8Þ2Ãà.Ã@ó-Ã0–6Ã7Ã`¦2À7ä5ð3ÃÝ2à`.ÃÀ5ÃpÁ4ÃP‹0Ãàð0à (-ÃÀ3Ã`¾.Ãà-ÃÀ–2ÃÀ3Ã0ä)Ã`50Ãðˆ3ÃT4à65Ãày/Ã0Ø+Ãà‹,Ã@á0Ã@Û1Ãàü.ÃW-Ãpß/Ãàð0Ã@|,Ãpµ6Ã0œ5Ã@^1Ã0Ø+ä1ðc4Ã3/Ãàg2ÃÐX.ÃP2ðò1Æ6Ãé0ÃàÌ6àÝ.ð .ÃPð4à ì6Ã`4Ã`4ÃpV1à¿3ÃP-à 3Ãàê1Ã0´1ÃÀû6ð/Ãp\0ð,ÃpJ3À_6Ã`#3ðø0à 3à¡8Ã0º0À.ÃE,ðu1Ãн2Ãà-Ã`Ê,Ã`S+à 4+Ã’4à ‡2à “0ê0ð/À}1Ãà-Ã0Ò,Ão)Ã0Ò,Ã`S+à³5à×/Ãpñ,àÑ0Ã5à u5Ãà—*ÃÐd,Ãð2À1ÃP‹0à×/ÃÀr8ÃðŽ2à ".Ã0–6Ã7ÃpÁ4ÃÀœ1Ãð /Ãpñ,Ãð#/ÃP/ÃP‹0Ãð).Ãõ.Ã9.ÃÀ¨/ð-Àú1ÃÚ,Ã`Ä-Ã+&Ã9.ÃàÀ8ÃpV1ðò1ðu1Ã`²0ÃPJ&Ã@ÿ+Ãp86Ã`”5ÃÀ2ÃP0ð/Ã@d0Àô2ÃÂ0àT0Ãð0ÃPs4ÃP2ÃÐÛ-Ã`è'ÃÐv)Ã`G-Ã?1ð/ÃPö3ÃPm5ðÎ7ÃÔ-Ãà©'ÃP/ÃÀŠ4ÃP…1ÃÂ,ð .Àƒ0Ãl0Ã<8Àw2ð]5Ãð /Ãàê1Ã0À/Ãð /ÃÀ2ÃÀ3Ã@í.ÃP…1Ã@Õ2ÃP1ÃP/Ã0®2ÃPm5Ãн2à 2Ãð²,à /ðì2Àè4ÃPm5Ãð¸+Ã`;/Ãì)ÃÂ,ÃPð4à {4Ãï/Ã@|,àÅ2ÃQ.ð/Ã5ê0ÃpD4Ã0¢4ÃÀ5à 3Ãðp7ö.Ãpz+ÃP/ÃÀ3ÃPy3ÃE0ÃŒ5Ãðš0ÃàÒ5Ã`Ž6ÃÀÆ*Ã'1ð3ö2ðu1Ã0¢4Àô2ÃÀ+/ÃÐÛ-ÃpÍ2ðÎ7ÃÐÏ/Ãð”1à 3Ãð¦.Ã`G-àZ/ðÚ5Ã@Ï3àé,Ã@L4Ã`#3Àƒ0Ã4ÃÐ44ðc4à u5ÃP‘/àÑ0ðŸ*àH2ÃàU5àÝ.à 0ÃÀ–2à×/Ã`#3à§7Àô2Àe5Ã'1ÃÑ4Ãpz+ðø0Ã@|,Ãr/ÃàÞ3Ã33ÃÐ.5Ã0Ì-Ãð2ÃÐÕ.ðà4Ã-ÃP‹0à*7Ãé0Ã09Àè4Ãð1à 1à¿3ÀÖ7à ‡2Ã'1Ãàa3ÃÀ3à 1ðc4Ãð”1Ãðš0Àô2Ã5à:Ã0–6Ã`50ð{0ÃÀŠ4Ã?1ÃP‘/Ãpz+ÃЫ5Àq3ÃE,Ã0®2Ã`6Ãб4Ã`‚8ðæ3Ã0:Ãf1ÃÀI*à «,à :Àâ5Ãб4ðø0Ã0º0Ãàü.ÃÐR/ÃpÁ4Ã@^1àT0À‰/ÃpV1Ãàm1à 2ÃÐÉ0ÃðL=à W:ÃГ9À¡+à Ÿ.Ãб4ÃÐ¥6Ã@Ï3ÃÀ2Þ2Ãðp7ð‡.ÃÐd,Ãð0à i7Ã`”5Ã@Õ2ðc4À.àÝ.Ã0´1À-àf-À­)ÃÐÉ0ÃP1Ãp27ÿ7ÃðÛ:ð/à65ÃÀ–2ÃZ3Ã0À/Ã0U,Ã`¬1ð/ÃàÒ5Ã0+3Ã@R3Ãp86Ã`#3Ãð#/Ãàs0Ãð#/Ãàü.Ã@Ï3Ã-Ã-4ÃE0À1Ã!2Ã\=Ãà®;ðu1ÃÀ„5àË1à 2ðu1Ãàm1Ã@Ï3ðæ3ÃP‹0à «,ÃÐÕ.Ã×3Ã@Ï3Ã`;/Ã@R3ÃP‹0Æ6Àú1Ã@Û1ÃÐ.5ÃÀ2Ã`è'Ãï/Ãñ9ÃpÍ2Àè4ÃP[8ö2ÃPö3ö.à ".Ãð/-Ãû-ÃPy3ÃÀI*ê4ö.à 0Ã0Æ.Ã`G-ÃP/ÃÐL0ÃÐ:3Ãày/Ã÷8Ãðù5Ãày/Ãàö/Ã071Ã!6ÃàO6Ãpb/Ã0+3ÃP‹0ê0Ãðˆ3ÃP0ÃpÓ1Ã@Õ2ÃÀ2Ãðv6Ã`¦2Ã?1Ãð¸+Ã0´1ÃÂ,ÃpV1Ãp>5ÃÀœ1Ã’8ÃÀ¨/Ã071Ã0œ5Ã'1Ãð¾*ÃPs4Ã0%4À0Ãp86Ø3ÃPê5Ãpz+à~)ÃÐÏ/Ã0Š8Ã0+3ê4Ãà‘+Ã`Ä-Ã@ç/Ã@ó-ÃÐÏ/Ã`¸/Ãàä2àN1ü1ÃPs4Ãð5,Ã`²0ÃT4ÃÐÉ0ÃpV1Ãð1Ä,ÃpÓ1Ã`)2Ã0œ5Ãðš0ÃW-ÃP2Àâ5ÃP2Ã-0Ãб4ÃÐ:3Ã?-ÃàÞ3ÃW-ÃW-ÃÐÕ.ðò1ÃpV1à×/Ã0º0Ã0º0ðÈ8ÃÐ:3ÃÐL0ÃÐR/À‰/Ã,àl,ÃÐÃ1Ãð 3À‰/ÃN5Ãpb/ðþ/ÃÎ*Ã@p.Ã`G-Ãàê1Ãc+ÃP&,ð,Ãû-ÃPö3ðì2ÃÀ+/ÃÐ"7ÃàÞ3ÃÐÉ0Ãp,8Ã0¢4Ã` 3À /ÃP£,ðÈ8ÃPÞ7ÃÀ¨/àT0Ã@«9ä1Ã-Ã0Æ.Ã@|,ÃP…1Ãðÿ4Ã` 3Ãð”1à*7àT0ÃÀ„5ÃÐ:3Ãð1Ã33ðo2Ãà.Ã'1ÃÀÞ&Ãp*Ãàm1à ì6Ã@á0Ã'1Ãà.Ã@ù,ÃÐX.Ãà*Ão)ÃÀ%0Ãr/Ã'5ðþ/Ãð0Ã0À/Þ2ÃÑ4Ã`š4Ã4ðÚ5ÃÀ5Ãðù5ÃÐ@2à ‡2ÃP2àB3àN1Ãày/ÃP—.ÃÀ 4ÃÐÉ0Ã@Ã5à 0Ã` 3Ã0¢4Ãp86ðc4Ãt9à;Ã0û:Ã@É4ðæ3Ã@d0Ãà…-ÃË5Ãð‚4à c8Ã-4Ãàa3Àú1Ãн2Ã3ö2àÝ.Ã0¨3Ãp&9ÃàÀ8Ã0®2Ã0Æ.ÃP‘/À0Ã@X2ÃÀZ<ðQ7ÃH6À1Ãз3Ã@ç/Àô2Ã-4Ã-à i7Ã@X2ÃPy3à06Ã0Æ.ÃÀ´-à~)Ãà)Ãð¬-Ã3/Ã`/1ä1Ãðí7Ã@Ã5Ã`)2Ãp;Ã@R3àf-ðÔ6ÃPm5ÃÐÃ1Ãðÿ4ÃP‹0Ãð‚4ü1Ã`²0Ãð|5À‰/ÃÀ+/ÃP©+Ãàü.ÃÔ-Ã@^1Ã0¢4ÃÀr8ÃÐç+Ã`;/ðæ3Ãph.Ãï/Ãr/ðà4à Ÿ.ðu1Ã`8ÃÅ6Ã`‚8ÀM9Ãp©8Àe5à ø4Ã@R3à à8ÃPö3ðu1ÃЫ5Ãðš0à 6ÃÀx7ÃŒ9ðÚ5à 3Ã071Ã@R3Àî3ð-Ãàs0ÃÀ6ÃN5à}>Ã9.à65Ã`4Ãðí7ÃÀ–2à`.ÃÀ 4Ã0%4ÀÊ9Ãð‚4ÃpÇ3Ãð).à³5Àî3ÃàÌ6Ãp€*Ã`¾.ÃÐÕ.Ãð2àÅ2à¿3Ã` 3Ã3/ðø0ÃàU5ðW6Ã7Ã0¢4ÃPy3Ãã1Ã-ÃÀ=,ÃP/àï+à¹4Ãðv6Ã@d0Ã@ç/ÃP…1ÃÀ7-Ã@Ã5Ã`4Ã3Ãàs0Ã`5ÃpÇ3ÃPð4Ã0+3Ã@48Ã`¦2Ã012Ã0+3Ãp»5Ã`A.ðà4ÃÀŠ4ê4ði3Ãp»5ÃÝ2ÃÐ^-Ã`)2ÃP…1Ã!2Ãý7ð/À0Ã'1ÃË5ÃË5ÃàÆ7ð{0Ã`8Ã`2à ™/à 0Ã`/1À0Ã4Ã`²0ÃB7Ã` 7ð .ðø0Ã@±8ðø0Ãàä2ÃÀ1ÃÀŠ4Àw2ðW6ÃPü2Ã@L4ÃÐ.5Ã@Ÿ;Ãp>5ÃÀŠ4Ã`2Ã` 3ÃÐ44à <Ãðv6ð3Ãð‚4ÃÝ2Ãб4Ãн2ÃPs4ÃN5Ãpn-Ãð2à ‡2à¹4ÃàÌ6ÃH6ÃT4Ã0x;ÃpÁ4Ãð /ðò1ÀG:àË1Àƒ0ðQ7ÃÀl9ðc4Ãã1ÃÐ44Ãàö/Ã0I.àÅ2Ãð‚4Ã3/ÃðŽ2ðÚ5ðà4à 2ÃW-À-Ã],Ã0º0Àk4à i7ÃàÒ5ð/àã-Ã`¸/ÃðÊ(ÃÝ2Ãð /ÃÐ¥6À.ÃP©+Ã0À/ÃPÇ&ÃP…1À /ÃP/ÀG:à u5Ã@Ï3ð“,ÃP‹0ÃÐL0ð]5Àq3ði3à 6Àk4ÃðŽ2à ò5àN1à æ7ð‡.ÃÂ,ÃP,+ÃÐÉ0Ãpµ6ÃpV1ÃP…1Àƒ0Ã`¸/ÃPü2ÃÀŠ4ÃÀ¢0à Ÿ.Ãà…-ÃP -Ã0a*ÃÀœ1Ã0Þ*ÃpÓ1ÃPg6ÃàÌ6Ãpb/àT0Ã@R3à ™/ÃE,Ã@É4Ãà‘+Àú1ÃÐÃ1ÃZ3ÃÀl9ÃÐÃ1Àú1à ‡2ÃpÁ4ÃP%AÃàÌ6Ãï/ðà4ðø0ð“,Ã@|,Ãàê1à ™/ÃÐÛ-ðÚ5ÃàÒ5Þ6Ã33à 1àN1ÃŒ5Ãp27à:Ãà.Àî3Ãð4ÃPs4ÃP‹0Ã0º0Ã0Æ.Ãð/-ÃP2Ã0¢4Ãï/ÃÐÏ/Ãl0Ê+Ã`²0Ã×3Àô2à›9ÃàØ4Ã@ç/ÃÀ%0Ãp\0Ã0¨3Ãý;Ã-4ÃÀŠ4ð/ðo2Ã×3ÃP2ð]5ÃP©+ÃÀ5Ã0œ5ÃP/Ã!2Ã07ÃÀ–2Ãr/Ã`/1ðæ3à o6ÃÀ1ÃP0ÃÐù(ðŸ*ÀS8À}1à×/Ãr/ÃÀ–2ÃÀl9ÃÀ3ÃPö3ÃPy3Ã-0Ãpñ,Ãð‚4Ã012à ".ð‡.ÃÀ1ÃÈ/ÃÐÏ/Ã012Ãû-àH2à:ÃÀ–2Ãн2Þ2ÃK/Ã0I.ÃÀº,ðo2Ã`¾.Ãð¾*àË1Ãàm1àŠ'Ãðÿ4Ã@v-à`.ÃÐ8ÃP0Ã`š4ÃÐL0ð/ÃÀœ1Ãð0à Ÿ.à 3ÃP2Ãàm1Ãð¦.ÃpJ3Ã@d0ÃP -à /Ãé0Ãà-ÃP -ÃP‹0ÃÐÏ/Ãðç8ÃPy3Ãpn-ðì2Ã@R3à¹4à*7Ãàä2Ã33àÝ.ÃpÙ0Ã0–6Ã`ù9Ãð1Ãp86Ã@Ï3Ãð¬-Ã?-Ã@L4ÃPÒ9ÃÀ%0Ãp¯7ÃpJ3Ãàä2Ãp»5à i7Ã012Ã@ç/Æ6Ãp&9Ø3ÃÐÏ/ðÚ5ÃPO:ÃÔ-À-Ã@Ï3ÃÐ.5Ã33Ã@R3Ã0%4Àô2Ã?1à³5àB3ÃÀ¢0ÃpJ3Ãpb/Ã0´1Ãð|5à³5Àú1ðo2ÃÐÃ1À0ÃàØ4ê0ÃàÌ6ÃÀŠ4Ãàü.Ã06Ãð‚4ÃÅ6Ãð¬-ÃP‘/ð]5ÃPð4ðK8ÃÝ2ÃÐL0ÃP/ÃPê5à ‡2Ã@j/Ã@@6ÀÐ8Ã4Ãн2Ãðˆ3Ãp\0Ãð1ÃB7Ã`‚8Ãï/Ã0¨3à¿3Ã`#3ÃPU9À0Ã@ç/ð“,ÃÀl9ÃPU9Ã`50ð/ÃÐ:ðò1ÃPð4Ø3Ãз3Ã-4Ãðp7À}1Ãð).Ã@ç/ÃÐ:3Àî3Ã`)2Ã0´1Ã` 3ðø0ÃPO:ð/à 6Ã7ÃZ3à o6ÃÐ"7ÃP…1Ãà,ÃP…1ÃÐÃ1Ãp&9ÃÀã:ð+ü-À•-ÃP1ÃP—.ÃÐ^-ðc4Ã0¢4Ã`2ÃÐ:3Ã?1ÃP»(Ã@ˆ*Ãð¬-Ãàä2àÑ0À$+ÃÐF1ÃP2Ãñ=À;<Ã@É4Ãph.ÃP.Ãày/Ãàs0À,ÃP2Ã0¨3Ã0œ5Ãàg2Ãàö/ÃÀ–2Ãн2ä1Ãp&9Ãð‚4Ã@X2Ã0=0ÃP/Ãï/Ãà[4Ãð”1Ãé0ä5Ã@á0Ã9.ÃP/Ã`_)Ãf1Ãpb/à<4ÃàÒ5ÃPö3ÃÀ2Ãð;+À‰/àÅ2ÃË5Ãã1ÃÀõ7ÃàÞ3ÃpP2à 1Þ2Ãpë-ÃP1Ã0À/ÃÐÃ1à<4ðÔ6ä1À-à×/Ø3Àú1ÃÐá,ÃpÙ0Ã@‚+Ã0Æ.ÃpÇ3Ã0º0Ãph.ÃÀ1ÃpÍ2à 1àÝ.Ã9.ÃÐÃ1Ãð2ðþ/ÃP—.Ã0=0àé,Ãpn-ÃÐ:3Ãàð0Ã`;/ÃPm5Ã3/ÃP.ÃW-Ã`Ð+Ãph.à “0Ãpt,Àú1ÃÈ/Ãð²,Àú1ÃpD4Ãpý*ÃP£,ÃÀ1ÃÐÃ1ÃÐá,ÃP‹0Ãð5,Ã`G-ÃÐí*à «,à³5ðc4ð“,À‰/À¡+àN1ð"*à 'Ã~-Ãï/Ãf1Ã@^1Ão)Ãð5,ÃàÒ5ðQ7à ]9Ãi*À¡+ð-Ã@É4ÃP -ÃÀ=,Ä,ÃP2Ã@Õ2Ãà.Ã@+ÃÚ,Ãr/Ã9.à§7Ãà+àZ/Ãð 3Ãpå.ÃP/à (-Ã@‚+ÃP-à ‡2ÃÐ ;Ã0=0À.ÃpP2Ã`2ÃP0à~)ð™+ð«(Ãpb/Ä,ÃÀÀ+Ãpt,Ã` 3Ãн2à 2ÃpÁ4ÃÀ6Ã92ð/Ãl0Ã05ÃPy3à “0à 1à 0Ã0º0ð‡.à 0Ã,à «,ÃÈ+à o6ÃÐÃ1ÃÐL0À.Ãб4ÃÐÉ0Ã0Þ*ÃÂ0ê0Ã`”5À}1ÃK/Ãàö/Ãà.Ã<8Ãàs0ÃP¯*ÃT4ä1Ãõ.À7àB3ðc4à 1ÃÀ~6Ã@·7Ã071Àô2Ãp86Ãpë-àH2Ãì)Ö)ÃP.À•-ÃÀ2Ã×3Ãð1ÃÐá,Ã'1ðo2àr+ð-Ã@ç/Ã@Ï3ÃÐ9Àô2ðø0ÀS8à 1ÃÀ+/Ãà.Ã@Õ2à9à 3ÃPð4Ãà‘+ÃÈ+ÃðŽ2ÃPg6Ãà.Ã@p.ÃpJ3Ã5Ãàm1Ãpb/Ã0Æ.à¹4Ã0=0Àî3ÃŒ5àZ/Ã`A.Ã@d0ÃðŽ2Ã0+3ðò1Ã-0ÃÀ¢0ÃP2ÃpÍ2ÃT4Ã0®2ÃÂ,Ãpë-ù8Ãðv6à þ3ÃÐR/Ãà…-ÃÀ3Àô2Ã`d=Ã`8À‰/Ã`S+Ãð²,ÃÂ0ÃÐ44ðo2ÃÐF1ðÂ9Ã`;/àÅ2Ã0O-ÃŒ5Àô2ü1ÃÐL0Ã`¾.ÃÀ3ÃP‹0ÃPö3Ãðˆ3àÅ2Ã`4Ãp27Ã0´1ÃQ.Ãàð0Ãн2Ãp»5Ã?-à`.à .,Ãpb/à ]9ÃÐ:3Ã-4Ãðˆ3Ãб4ÃPÞ7Ã!2Ã`¦2Ã0 8à¿3à þ3ä1Ãð2Ãàä2Ã0C/Ã@j/Ãpµ6à ì6Ã`¸/ÃP/Àô2ÃPö3Ãp,8à<4Ã×3Ã7À1Ã@½6Ã4ÃP1ê4à c8Ãð 3à :*Ã-4Ãðÿ4ðò1ði3Ãpn-àÝ.Ãt9à ò5ÃpP2ÃÂ0ÃÀº,ð-Ã4ÃP -Ã0¢4Ã5ÃÐ"7ÃÑ4ðu1Ãpb/Ã0–6Ã@j/Ãð¦.Ãàg2à 1Ã07ÃÀx7Ã@L4ÃÐX.Ãð 3ÃP/ÃP1ÃÐR/ÃŒ5Ã0œ5à¹4ÃP/Ã9.Ã`Ž6ði3Ã012ðþ/ðÎ7ÃP1Ãõ.Ãð2Ãã1À /Ã-4ÃpV1ê0à 1ð-Ãð 3Ã9Ã'1Ã071ÃpV1ÃÀ2Ã`Ä-ö.Àw2Ã`Ä-Ãàs0ÃPü2ÃÂ0ÃÎ*Ã4Ã4ÃpP2Ãðç8ÃÀ2ÃÐí*àÅ2Ãp27Ã@L4ð/Ã@ó-Ã@X2à­6Ãð/-Ã@ç/ÃП7ÃB7Ã0À/Ã`¦2Ã`¾.Ã`4àõ*ÃÐF1Ãp»5ÃPy3ÃÚ,Ãàm1Ã@^1Þ2Ãð¬-Ã0I.ð"*ðø0Ã@d0àã-ð/à ¥-Ã`;/ðò1Ãðp7ðþ/ÃÀO)Ãpz+ðþ/ÃÐÉ0ðc4à³5Ã@ç/ÃÐ8Ã@R3Ãp÷+Ã@+ÃÐF1Ã`Ž6ð,ÃÀ¢0ÃpÍ2Ã`²0Ã’4ð/Ãð²,ÃÐÃ1ÃN5ÃÀr8Ãð¦.Ã`Ü)ð .ðW6ÃP1Ã`)2ÃÀ%0Ã92à :*Ãð¸+à æ7Ã×3ÃÈ+ÃP…1à 1ÃpÙ0Ã0®2Ã0Æ.Ã0C/Ãð|5Ãõ.à 1àã-ÃðÄ)ÃpÁ4À0à (-ÃT4àÑ0Ãàö/ÃÐ"7ÃàØ4Ãx.Ã012ÃÐR/ðc4Ö)ð/Àƒ0Ã@^1à ½)à<4Ãàê1ÃÐç+Ãi*Ãpë-Ãpñ,Ã0C/Ã@á0Ãà,Ãpz+Ãph.Ã0À/ÃÀ´-Ãàü.Ãàü.à ±+ð@%À›,à :*à /ÃÈ/Ãpë-Ãð¸+Ã0U,Ã@Õ2ðÚ5à ì6ÃP[8Ãl0à³5à­6Ã*à ".Ã@)ÃP1À•-Ãà.Ã0´1Ãð0ÃÐ44à¹4ð-Ãpë-ÃP2Ãð²,Ãàê1Ã@d0à :*Ã3ÃP2Ã@j/Ã0U,Ãû-Ãà—*ÃÀ®.Ãàä2Ã@á0À-ÃpÇ3àÝ.Ãàü.ÃðŽ2ÃÀ=,àÑ0ÃP.Ã-0àË1Ãàð0ÃPÁ'ê0Ãð¬-Ãp÷+Ã`¬1Ãû-à¹4ó9Ã0¨3Ãð2ðþ/Ãày/Ãl0Ãàa3Ã,Ãð1Ãð¦.ðø0Ãph.ÃP0À1Ã0®2ÃÐ44Ã0º0ÃÀ1ð‡.à 1Ã0=0ÃZ3ð/Ã`Ð+Ã`¦2À_6Ã@«9ÃЫ5Ã0é=Ã92ðþ/Ãð#/Àk4Ã@±8à o6Ã@^1Ãðù5à +Ã@p.ÃE0à o6ÃP…1ÃàØ4ðo2àB3ÃPs4Ãf1Ã?-Ã`)2Ãð5,à:Ãà[4ÃÀ¢0ÃàÆ7ÃH6ÃP‹0Ãû-à o6ði3ÃPö3Ã`5Ã`)2ÃN5Ãðù5à ±+Ã`¸/ÃÐ(6Ãà.Ãl0ð .Àƒ0Ãðv6Ã@R3Ãз3à`.ÃÐd,Ã'1ÃÐL0à þ3Ãpå.Ã05Àq3Ã0C/ÃZ3Ãpn-ÃÀï8Ã@48Ã@·7ÃàU5Ãpt,à 0ÃàÒ5Ã@@6Ãðÿ4Ãà+Ãõ.Ãð 3ðÔ6Ã3Ã`š4ÃÀ´-Ã-0ÃPö3ÃpP2à¹4Ã@‚+àÝ.ðò1Ã?-Ã0Ì-ÃÀõ7Àƒ0À}1Ãt9ÃÀ3ÃË5Ã@Û1ÃP¯*Ãf1ÀÖ7ÃÝ2ÃÂ,ÃP,+Ã`4ÃÈ+ð‡.Ãàm1Ã?-ðì2Ãàßà 2Ãi*À•-Ã0+3Ãr/ÃÐÏ/Ã0C/Ã’4ÃÐF1Ãðp7Ãpt,Ã@ç/ÃpV1Ã33Ãf1àN1Ãàö/ÃP2ä1Ã@Ï3Ãàü.Ã`/1àÑ0àT0Ã33ÃÀx7Ã@L4Ãàä2ÃÀ3Ã0+3ÃŒ5ÃÐL0ÃÀœ1Ã*Ãàm1àÝ.Ãpå.Ã0%4Ãc+Ã@F5À0Ã0Æ.Ã`$Ã`e(ÃÀ3ÃÐÃ1Ã`6à æ7Ã0Ì-ð‡.ÃpÁ4ÃË5ÃÎ*ÃÈ/ÃP2àB3ÃPê5Ãðš0Ã0+3ð/Ã012Ãpµ6Ãð#/Ã'1Ãpë-ÃPä6ÃP0Ãð0à ™/ÃÔ-Ãpß/Ãðç8à65Ã@á0ðo2À.Ã@R3Ãà )ÃÀ´-ÃP/ÃT4Ãð‚4ÃÀ3ÃP -ð/Þ6ðÂ9Ãà,à$8ÃP1Ã0´1Ã9Ã],Ã0Þ*ÃÐÏ/Ãðv6Ã@v-Ãf1Ã`Ð+Ãàü.àé,Ãð0Ã33à ‡2ö2ÃÐj+ÃП7ðÈ8À‰/à 1à «,À}1Ãð2Ã@Û1ð"*Ã0Ò,Ãì)ÃP1àÝ.Ã@í.Ãà.ÃK/Ã3/ÃK/ÃÐÉ0ÃÐ44ÃÀœ1Ã9.ðì2ð/Ãàa3Ãà=9ÃÐÉ0Ã`Ä-à`.ÃàØ4ÃÀO)ÃÂ,ÃP»(Ã0[+ÃP0Ä,Ãð”1Ã0º0Ã`”5Ãp\0ð/ÃÐÃ1à¿3ÃP.Àè4Ã@X2àB3ÃÀ=,Ã`50ü1Ã@X2ÃÑ4Ãày/Ãð|5Ã@í.ÃÀ„5ðþ/Ã`¬1Ãðˆ3Ãðÿ4à ¥-ð/Ãб4ðò1Ãpb/Ãr/àN1Ã05Ã!6Ã@Ï3Ã0¨3à 3ÃPö3Ãàö/Ãàê1ÀÐ8Ã`Ê,ÃP-Ãp»5ð‡.À1ðÈ8Ãã1ÃpP2À /À /à ±+ü1ÃÀ„5ÃÐÉ0ÃÐF1àË1Ã@Ã5Ã@á0Ãp27ÃPg6àl,ÃÀ„5Ãà.À§*À‰/Ã4ÃÀ1Ãl0Ã` 7àÑ0Ã?-àÝ.ÃÀ%0Ãð2Ãàü.Ä,ÃË5Ã`¸/ðø0Ã`/1Ã0%Ã@ç/Ãàa3ÃT4Ãàm1àÑ0Ãr/À.ÃÚ,àË1Ã@d0ðo2ÃÐL0Ã0¢4ÃÝ2ÃÈ+Ã0Æ.ÃðŽ2Ãf1ðu1ÃË5ÃÀ¢0Ãз3àH2Ã@Ã5à É'Ã0[+àH2ÃÀõ7à 3ÃÐR/Ã0U,ÃÐù(à 1À-ÃÀ+/Ã`Ä-Ãû-Ã?1Ã,àï+Ã071Þ6ÃP2Þ2Ã0Þ*Ã’4ÃÀ´-Ãàð0ÃÐR/Ãð5,Ã0O-Ã@j/àÑ0Ã@Ï3ÃÐí*ÃÐd,Ã0%4Ã@p.Ãà…-ÃÐÏ/ÃÐ@2Ãà‹,Ã~-ð-Ãpß/Ã~-ð¥)à„(Ã`A.ÃÐ^-ÃK/à~)ÃK/À}1Ã)Ãpz+ÃW-à 2Ãx.Ã?1ðì2Þ2Ãàü.ÃP2Ãз3ÃP©+Ãàð0Ã`M,ÃÀ%0ÃÐÕ.Ã)Ã@^1ÃЫ5ö2À‰/Ã0C/ÃÐÛ-Ãt9Ã`¸/Ãð”1à 1Ãàm1À­)Ãð²,à³5Ãà+Ã@ù,ð{0Ãðˆ3ðQ7Ãph.ÃP&,Ãð¸+ÃÐÃ1Ã)Ãð).Ã@Õ2ÃÝ2àË1ÃðŽ2ÃpÍ2ð/ÃÐÕ.Ãp86ÃP-à «,Ã@F5Ã012Ø3Ã9.ði3ðÚ5Ãà1;ÃÀ3ÃÐ¥6ÃpP2ÃPÇ&Ã@R3Ã@p.Ã@ç/ÃpÇ3ðì2ÃÀ+/Ãpå.à ì6Ãðv6ÃÐÉ0ê0Ã`Ê,Ã`¦2à /Ã012Þ2ÃPð4ÃpV1ÃP0àã-à 1Ã-Ãpß/ÃpÙ0àÝ.Ã`)2ð-Àq3ÃpÁ4à¿3Ãàs0Àk4ðæ3Ã@d0à /ÃÀ1.Ã`50Ã3/ÃàU5ÃÀ6ÃPg6à (-ÃÀÌ)ÃpÓ1ê0ÃP&,ÃÂ0Ã0œ5Ã0´1Ã05à +Ã0=0à ™/Ã`50à×/ÃÐR/Ãc+àÑ0ÃÐ:3ðø0Ã0a*Ã`4ÃPy3ÃP…1Ã@ù,ÃÐ:3Ãi*Ãpý*Ãð”1Ã`Ä-Ã@á0Ãð2À‰/Ãà.Ã`Ê,Ãpå.Ã`/1Ã@|,Ã`Ð+ÃP.Ã`Ê,ÃP©+Ãн2Ã0U,Ãï/àÝ.Ã0Ò,ÃÐÉ0ÃÐÏ/Ã@+Ã?1Ãð).ÃðG)Ãà+ÃÂ0ÃÀŠ4Ã-Ã@ç/àZ/Ã92àÅ2Ã@p.Ãì)Þ2Ã@±8Ã@‚+à «,Ãþ&Ã@^1Ãì)À0ÃÝ2Ã)ÃÑ4ðø0Ãp\0Ã0À/Ãp÷+Ã@|,ÃPg6Àe5ÃÀ=,à Ã(à 1ÃàÒ5ÃPö3ÃpÁ4Ãl0ÃÀ1.Ãàü.Ãày/ÃP0Ã`M,ð-ÃÀ„5ÃÀ–2ð‡.Ãà.Ã06Ãé0àÅ2Àe5Ã`Ð+à¹4ê0Ã@p.Ã0´1ÃÐj+Ãàä2àT0Ãà[4Ãз3Ã7à .,Ãp¤$Ãpý*Ãð#/ÃP1Ãr/ÃpP2Ãp>5Àú1ÃÀ+/àã-ÃÀ–2Ã0®2Ãð 3àÑ0Ãp>5à ì6Ãð1Àô2ÃÅ6àÑ0ÃÐX.Ãph.Ãi*À1ÃÀ 4ÃÐ44Ã@í.Ã@|,ÃÀ1ÃPü2à “0ÃÐ^-ð{0àT0àf-Ãà.Ãàa3àÑ0Ã`4Ã~-ÃÝ2ÃÀ1Ã@Õ2ÃðÄ)Ão)Ã@ˆ*ÃÐj+ÃE0Ãð0à (-Ãàm1ÃpÍ2Ãpb/ÃpD4Ã@ó-ÃW-Ã9.Ã@‚+Ã0–6ÃÂ0à×/ÃÀÆ*ö.Ã33Ã7ÃPµ)Ã*Ãð¦.àB3Ã-0Ã0a*àé,à×/Ãph.Ãà'Ã` 7Ã3ÃPü2ÃPö3ÃÀœ1Ãõ.ÃÐp*Ã@^1àï+àZ/Ãp86ÃÀ6Ã@^1Ã`¦2Ãð#/à06Ã0´1ÃW-À7ÃÐ.5Ã0´1ÃÐp*ÃÐ"7Ãà[4Ãf1àé,ÃP2*àZ/Ãàð0ð]5ðu1ÃP‘/Ã@48Ã!2Ã0º0ÃÀ3ÃÀ®.À,ÃP1Ãû-ðò1Ã3ÃP©+Ãæ*ÃÐÕ.à “0ÃP1ÃP2*Ã~-Ãp\0À.ÃàU5Ãà‘+ð™+Ã0®2Ã0´1ÃðA*Ãàg2ä1Ã`¸/Ã0´1Ã@É4Ã!2ÃP…1Ã0®2Ã@‚+ÃÂ0Ãpb/Þ2Ãð¦.Ã!2Æ6Ãàð0ÃÐó)Ã?-ÃQ.ÃÔ-ÃÀ¨/ÃÐ|(ÃÐÏ/ü1Ã012Ã`š4Ã0À/Ãð”1ÃK/Ã`¸/Ã'5ÃPÒ9à 3ðø0Ã?1ÃÀ¢0ÃÀ1.ð-ÃÈ/ð-Ãpý*ÃÐX.ÃÀÒ(Ã0C/Ã`š4À•-ÃÀ=,Ãpå.Ãà-à W:à³5Ã0Þ*Ã’8ÃÐ.5Ã@^1Ê+ÃP0Ã@p.Ãà‹,Ãð0ð.(Ãð /ðþ/ði3ÃðŽ2Ã05Ãð¸+Ãàü.ÃQ.Ãàä2à×/ðÔ6à “0Ã?-ÃÐ:3Àƒ0Ãàä2Ã0C/Ã@X2ÃË5À$+î%ÃP2àÅ2ði3Ãàö/ÃP—.àï+ÃP‹0ðò1ðc4ÃÀ®.Ã@v-à 3À­)Ã`;/Ã@|,Ã`Ð+ÃÀ3Ãðù5ÃpJ3ðò1ÃÈ/ÃÀI*à ™/ð“,Ãpt,Ã@Û1Ã05ÃP/Ã@É4Àq3Ãàü.ÃÈ/ð·&Ã0C/Ãp¯7Ã3ÃàÒ5Ã@X2Ãð4Ã0À/Þ6ÃPy3Ã`Ð+ÃP-Ã@d0à ·*ÃÝ2Ãp\0Ã3/Ã3/Ã`;/Ãð4Ã05ÃQ.Ã!2ðø0ÃP—.ÃÐ44Ãé0Ãàa3Ã@:7à9Ã@d0àÑ0À1àH2ÃÐ@2Ãp÷+ðò1ÃZ3ÃÀ®.ÃÐ44ðo2Ãàm1àl,Ãð#/ði3ÃÐL0àN1Ãà.ÃÀ=,Ãû-ÃÀ 4Ãð²,Ø3Ã`¬1Ã0+3À}1Ãày/ÃpÁ4Ãð1Ãà.ð/ðò1Ãàü.Ã06Ãð2Ã0Ì-Àô2Ãàm1ð/ÃÀ3Ãðj8ÃÝ2Ãð¬-Ã`M,Ãð¬-Ã0O-ÃÐd,Ãõ.Ãû-Ãð¬-à ".Ä,ÃðG)À.ÃK+Ã@í.Ã-0àZ/ÃðS'ÃÀ´-Ãc+Ã@Ï3ÃP…1ð]5Ã0=0À‰/ÃP…1Ãc+Ãàð0Ãð2Ãð¦.Ãi*à`.ÃP0Ã071Ã@^1À‰/ÃÀ6ê0ÃÀÆ*Ãð²,Ã@|,Ä,àT0ÃÐ:3Ã0º0Ã0À/Ãpå.ÃpÓ1Ãз3Ãõ.ÃÐ:3Ã0=0Ã`;/Ãà.ÃÈ/Ã)ÃÐd,à06Ã@É4ÃE,Ãð /Ã0ð'ÃÐj+Ãp\0Ãà)à .,ÃP,+Ãpñ,Ã)À-Ãð1ê4Ã071ÃÐá,Ã-0Ãð1Ã`¬1ÃÚ,Ãi*Àî3Ãl0À /ÃÐv)Ãpn-ð¥)Ã`M,ÃÀ®.Ã0g)à¿3ÃP©+À.Ã0Ø+Ãðš0à ø4Ã` 3Ãph.ðo2Ã4Ã@v-ÃÐX.Ãà )À**Ãà©'Ãpý*Ãõ.Ã0Ì-ÃP/Ã`Y*Ãà—*Ãð0Ã@ÿ+Ã`#3Ã`2Ã@^1Ã012Ãà+Ãà+Ãàs0ÃÐp*àÝ.Ã0ä)Ã@ *Ã0Þ*Ã`G-ÃÐÃ1Ã](À0ÃW)Ã`¾.à 0Ã`#3ÃPü2ÃÐ^-Ã`M,à 2Ã0%4À**Ã@p.Ä,Ãû-À-àT0ð‡.ÃÐX.ðQ7Ã3Ã?1Ãб4Ã@v-ÃÐL0Ãàö/Ã?-Ã`Ê,ÃðŽ2ÃÀ%0ð/Ãàö/Ã`G-Ãu(à06Ãð1ÃÐÏ/àé,À¡+à .,ðþ/ÃK/Ã@ù,à Ÿ.Ã`5Ã0I.Ã0Ò,ÃÀÀ+Ã@ù,Ã@F5Ã0=0Ã`¸/ÃÐj+ô$Ã+&Ã@(ÃÝ2à ™/Ãà‘+ÃP—.Ã012ÃK/Ãày/à ø4àH2Ã@š'Àô2Ãð2à ±+ÃðA*ÃW-ðø0ÃP—.ðþ/Àw2Ãð¸+ÃP¯*ÃP¯*à ¥-ÃÀC+ÃPÁ'ÃÀÀ+ÃP -Ãàä2Ãàö/ÃP-Ãp'Ãpt,À /Ã0À/Ãà-àû)àB3Ãð¦.ð/Ã`/1àû)ÃÀ%0ÃP£,Ãpñ,ü1Ã9.ÃÚ(àf-à65Ãð¬-Ãð²,ÃP -Ãpñ,ÃÀC+Ã0U,ÃÐÕ.Ãð¦.à ‡2ÃÀ¨/Ã`2à /àï+ÃK+Ãõ.Ãé0ÃÐÃ1Ãð¬-Ã`ˆ7Ã@p.à “0à ø4àH2Ãf1ê4Ãàü.ð-ÃH6ÃàØ4Ã'1Ãàü.Ãø'ÃÀ7-Ã×3à ™/Ãp*ÃÚ,ÃÀ%0À_6ÃpJ3ÃÐF1Ã0õ;ð˜@à 9?Ã*;Ã5ÃPa7à 3ÃÀé9ÀÄ:Ã@Ï3à%#ÃðS'ðþ/ÃpV1à×/ÃP…1Ãï/ÃK+à ™/Ãpñ,ÃP/ð“,Àú1Ãð”1ü-ÃÀÆ*ÃÀÀ+Ãp86Ãp>5Ãàm1Ã,Ãðˆ3ÃÀû6à¡8Ãàm1àÝ.Ã@p.À1ÃàI7Ã0Æ.À-ðE9Ø3ÃÀ5ö.Ã@á0Ãf1ÃÐ(6à ì6Ã69Ãp,8ÃB7à:À²=Ã÷<Ãàê1Ã`Ä-Ã0O-Ã33Ãðp7Ã5àÅ2àf-Æ:Ã@.9ð]5ÃB7ÃÀx7Ã@á0Ã@Ï3Ã!6ÃÀÃÐø=à u5ÀÜ6àƒ=Ãp¯7ÃÐ<Ã`‚8à;Ãðí7Ãt=Ãp‹=Ã`ù9ÃPC<ÃPC<Ã*;Ã@É4Ã0À/à à8ðÈ8Ã0ï<ÃàC8à$8ÿ7À¬>Ã;ÃàÞ3Ã0r<ÃPÌ:à$8à06Ãë:à›9Ã9ÃÐ¥6à>Ãp27Ã@·7Ãp=à ¶?Ãðp7Ã9Ãà´:ÃÐ"7ÃB7ÃPÞ7À¸<ÿ7à¹4ÃPº=ð¼:Ãà1;à u5ÃàÆ7Ãz<à c8ÃàI7ù8à=ÃÐ<Ã@@6à à8ÃPy3ð°<ðW6Ãàg2ÿ7à ‡2ÃÀõ7Ã@ ?à à8Ãp27Ãp27í:Ã0:ÃÐ"7Ãð4ÃPÒ9ÃÐ9ÃP1Ãàö/ÃÀŠ4Ãp86Ã071Ãàa3Ã0~:Ã`Ž6ÃðÏ<Ã0„9Àè4ÃP1?à›9Ã`5Ãð2ÃÀ+/ÃÀ–2à­6ðÚ5Ã012Ã0Š8ðW6ÃÀ„5Ãàº9Ãp‹=ðì2Ã`8Ãh?Ã0f>ÃÐæ@Ãp:ÃÐ¥6ÃðF>ÃÐ:à:à ì6Ã7ÃÀ1Ãà1;Ã0r<Æ6ÃpÁ4ÃÑ4à 3ÃðÕ;Ø7à‰<à§7Ãð:@ÃPI;à 3Ãð|5à Ú9ÃàI7Ãз3ÃPÞ7ÃPü2Ã05Ã`ˆ7à*7ðÚ5ÃÀ5ÃàÌ6ÃÀ`;ÃàO6àÅ2ðQ7ÃP7>ÃÐø=ÃÐ¥6Ã9ðc4Ãé0Ã’8ÀY7ÃPØ8Ãð‚4Ã7à 6Ã!2Ãp£9ÃàC8Ã09Ã`‚8ÃPÆ;ÃÐ"7à æ7Ã@<Àî3ÃÀ–2Ã@Ã5Ãà[4ÃàØ4Ãã1Ã07Ã`|9à ì6Ã@½6ÃÀ5ðK8Ø3ðo2Ã012Ã@";ÃÐø=Ãðá9Ãðù5ÃÐ(6ÃÅ6à i7àT0Ãé0Ã0~:Ø7ÃH6Ãz<à=Ã4ÃÀ–2ÃpJ3ðÚ5ðÈ8ÃÀ3ó9Ã@É4Ã`ù9Ã`8ð]5Ã@Ÿ;ð9;Ãð|5ÃN5ðÔ6Ã0:à à8Ã`Ž6Ã@=ÃÀ2Ã07ÃÀ%0Ã0œ5ÃðL=ÃÀ×<ÃàI7Ã`|9à Ú9Ã`5ðc4ÃÀœ1Ã0–6À¸<à 3ÃÐÉ0Ã0U,à ò5Ã!6Ã’8ÃPÒ9Ã@L4Ã09ðW6ÃPê5Ã0 8à u5ÃPC<Ãðó6Ã0+3Ãð|5Ã8Ãðÿ4ÃPs4Ã`š4Ã5Ã`5ð3<Ã0 8ÃÀé9Ãp;Ã5Ãз3à ™/Ã@¥:Ãp;ù8ÃÀ¢0ð3Ã0 8Ãý7Ã@L4ðæ3Ãð2Ã0O-ÃÀx7ÃÀ~6Ã0~:ÃàÌ6ÃÀ„5Ã69ÃàU5Ãp86Ã@¥:ÃÐ:3à o6Ãð4Ã@Û1Ã@L4Ã@@6àZ/ÃÀŠ4ÃÀŠ4ÃÀ~6Ã0=0Ãð).Ã0 8à i7ð]5À_6Ã'5Ãp£9à 6Ã0:à «,Ãx.ðW6ÃàI7À.Ãà=9à ø4ÃÚ,Ãé0Àâ5ði3ÃÀ6ÃPs4à æ7Ã9.Ãð0ð9;ÃpV1Ã8Àe5Ã8Ãàº9ÃÀ 4ÃàÀ8à u5ð]5ç;Ã06ÃЙ8à u5ÃÐF1Ã92ÃpÓ1ÃÀ3ÃH6Ã@R3ÃÀf:Ã@«9Ã@É4Ã’4Ãà[4Ãà.Ã×3Ã0¨3Ãpµ6Ã@Ï3ðÔ6ÃpD4àé,à 0à ™/ÃP -ð]5ÃàØ4ÃÐ8ÃÀ5Ã`¦2Ã`#3ÃàÒ5à­6ðà4Ã06à æ7Ãp©8à {4ÃW-ÃPð4à 2ÃÐ(6àH2Ã`4à ]9à­6Ãð1ðo2ÃpÁ4Àw2ÀÖ7Ã`Ä-Ãp»5ê4à 3ð3ê4à u5ÃЫ5ÃÐÃ1à 6Ã@ó-Ã0®2ÃàC8ÃÀŠ4ðc4Ãàä2Ãн2Ø3Ãàm1à$8ÃÐ44Þ2ÃpP2ðò1Ã9.ÃÐÛ-à ì6ÃÐþ<ÃÐp*àN1ÃàÞ3à 6à 3ÃÑ4à æ7éEÃÅ6Ã`6ê4Ã0Æ.Ãc+Ã` 3ÃPö3Ã?-Àâ5Ã`4Ãpb/ÃÐÕ.ÃàÀ8Ã@Ï3Ã`Ê,ÃÐÉ0Ãàä2ÃK/ÃP2ÃàÒ5à 2Ã0¢4ÃP…1à u5Àe5À}1Ã0U,ÃPy3Ã0U,ÃÐç+àl,Ãð0Ãpß/ð“,ði3Ã07ÃN5Ãð‚4ÃàU5Ã@^1Ã’4Ãð4Ã0I.à ±+Ãàê1ð{0à 3Ã0œ5Ãàü.Ã`50Ãàð0ÃàØ4Ã`5Ãð‚4à Ÿ.Ã0´1ÃÂ,ÃP©+ðò1Ã@d0Ãð4àÑ0Ã@v-ÃÂ0Ã@d0Ã@½6à:à i7Ã-4ðc4à þ3Ã05ðW6Ã’4ÃÑ4ÃÀx7Ã071ÃPê5ö2ÃÐÕ.ÃPs4Ãð#/Ãà.Ã@Û1Ã`4Ãàs0ÃÀ3Ã9.ðo2ÃÀ2ÃP‹0À›,Ã@á0Þ6ä1Ã`6ðà4ÃÀr8Ãз3ÃPs4ÃT4ðŸ*Ã@R3Ãpµ6Ã3ðc4Ã@L4ÃÐ44Àî3ÃÀ3Ãз3ÃÐj+Ã@j/ÃE,ÃðŽ2Ãx.Ã0Ì-ðQ7Ã@Û1ÃÐ44Ã06ÃÀ´-à @)ð]5Ã@48Ã@Õ2Ã` 3ð/ÃÀ 4Ãàa3Ãðp7Ãз3ðø0Ãf1à 6Àƒ0Ã@X2ð-à65Ãpb/à×/à /À}1Ã0=0Ã],ð,à¹4Ãàa3ÃÅ6ÃP…1ÃPs4Ãàs0Ãà…-Ãàs0à ".ð+ö2ði3àÅ2ÃE0ÃH6ÃÐÏ/Ã0I.ÃÐÃ1Ãp>5ÃpÍ2à 1àl,Àq3Ã071Ãð2Ã?1Ã@á0Ãð/-Ã`¦2Ã@Õ2Ã3Ã0U,ÃPy3ÃàO6Ã’4à «,À¡+ðo2Ãï/Ãàm1ÃÀ%0Ãð4ÃàÞ3Ã<8Ãp>5Þ2Ã`Ä-Ãð#/Ãl0àH2Ã5À7Ã@ç/Ã5ÃÀf:Ãз3ðQ7ÃÀŠ4ê0Ã`Ž6Ãp—;Ã5ÃÐ"7Ãàº9Ã0®2ÃZ3ÃÀ5ÃP…1Ã@½6Ã0Š8ÃPm5ð/ðÎ7ÃP+@à ò5Ã’4Ãà®;Ã07Ãp,8Ãß<à¡8Ãp86ÃPØ8ÃðÛ:Ãp…>Ã07à65ÃЫ5Ãз3Ã0´1Ãp :ÃÀ6Ã`/1Ø3ÃàØ4Ã0–6ÃÐ{=à o6à:ðQ7ð9;Ãà®;Ãå;ÃPÞ7à65Ã0Š8à¡8Ã5ÃÅ6Ãß<ÃJ@Ãðç8Ã*;Ãp»5Àâ5ÀS8ÃÑ4Ãàa3ÃÐ.5ÃÀï8éEÃÀl9Ã÷8Ã`”5Àe5Àè4ÀÜ6à {4ÃN5ðþ/Ã@·7ÃPa7Ãðˆ3Ãðç8Ãð|5ðQ7ð°<Ã@™<ÃàÌ6à 3ðE9Ãà>ÃÀx7ðQ7Ãp?à Â=à65à65Ãt9Ãð½?ðW6Ã@·7à9Ãà+<ðà4ðò1À_6Àe5ði3ä5Ãý7Ã69Ã`¦2Ãð4Ã@±8Ãp©8à;ÃPä6ÃPð4à 2ð‡.ðK8ÀÊ9ÃÀ„5ðQ7ÃÀ3Ã`8Ãt9Ãà+<ÃpD4ð/Ãñ9Æ6ÃÅ6Ã0¨3ÃàÀ8À_6à Ú9Ãðp7à W:ÃàI7ð°<à Â=ÀÐ8à {4Ã0œ5Ã`4Ã@½6Ã@·7Ã@^1ÃPð4ÃÐ8Ã@¥:Ã÷<Ãp:ÃÐ.5ðÂ9Ã!6Ã`6à65Þ2ÃÀÝ;Ãh;Ã@X2Ãp&9à*7Ãà=9ÃðÛ:Ã4à§7Ãp,8Ã-4à06ÃÀ3ÃÍ?Ã@Ÿ;Ã`ù9ç;Ã÷<ÃàO6ÃT4ðò1ê0Ã@R3ÃE0ÃPÞ7à×/ÃÀû6à à8Ã'5ÃpV1Ã07Ã05ÃPC<à•:à 2ÃpP2Ã@:7Ã`2Ãðó6ðW6ÃÀ„5Ãp&9ÃPö3ÃŒ5Ãpß/Ãà[4Ã@á0ÃÀ–2à ò5à›9ÃPÒ9àÑ0Ãð2ÃPs4Ã07ðà4à (-ÃÝ2Ãpß/ÃpP2Æ6à c8ðÚ5ÃГ9ÃPm5ð/ÃZ3ÃÐ:ÃŒ9Ã012ÃÀŠ4Ãày/ÃÐ(6ÃPÆ;ÃÀf:Ã05Ã0´1ÃT4Ãà,ÃpÙ0Ã9.ÃÐ.5Ã`”5Ã@½6ðà4à<4Ã-0ÃŒ5À_6Ãß<à×/ö2à i7Ã0¨3ÃÐ"7ÃP‹0ÃÀŠ4ÃÐÃ1Ã'1ðÚ5Ãðˆ3Ã](ÃÀº,Ãð/-Ã`4Ãб4ÃÐF1Ãé0ð .Àô2Ã0®2Ã`/1ÃP2Ã@á0Ãà‹,Ø7à`.Ãàê1Ã0 8ÃÀf:Ãpë-àH2ðc4Ã@Ž)Ã`²0ÃE,Ãàa3ðÚ5Ã`S+ÃPm5à 1Ã012ÃÀx7ÃQ.ÃÂ0Ã0C/Ãl0Ãð#/ÃÀ®.ð .ÃPm5ðþ/Ãð/-ÃÀ~6Ã’4Ã0º0ÃÀ®.ÃpÍ2Ã0Ì-ÃP-Ã@Û1ÃÐ:3ÃP2à ±+ÃÐá,àË1ÃÀ=,ÃðŽ2ÃpÙ0À.Ã`2ÃP…1ü-Ãpt,Ã`²0ÃpÙ0Ã05ÃP&,Ãð¦.ÃÀ5ö2Ã@ù,à ".à ò5ö.Àe5ÃpÍ2Ãð‚4ÃÀ3ÃpÙ0Ã@ˆ*Ãàê1ÃðŽ2Ã@d0àé,Ãð¦.Ãpñ,ÃÝ2ði3ÃP0ÃP2àf-àB3Ã`;/Ä,ÃPy3Ã`¬1à<4Ãð0ÃpÓ1ÃÀ–2Ã012Ã@d0ö.ÃZ3Ã-4Ãé0Ã`;/ÃP1ÃP—.À,Ã`/1ö2àé,Ã],Ã`Y*Ãà‘+Ã0À/à «,Ã@Û1Ãàê1ði3ÃQ*Ã?1Ã0a*Ãà.ðc4ðÂ9ÃÐÛ-ð-Ãã1Ã@Õ2ÀÜ6Ã`A.à 0àã-Ãl0à 1Ã012ÃÈ/ÃË5ÃÐX.Ã@R3Ãé0Ã`Ö*À.Ã@ç/ÃpP2Ãð”1ÃP/À1ÃðG)Ã!2àÑ0À}1ÃЫ5Ã69à ø4Ãàa3Ãf1Ãн2Ãp86Ã@X2àÝ.Àî3Àq3Ã0¢4ÃðS'ð,ð .Ãðÿ4Ã!6à ‡2ÃðŽ2Ãr/ä1Ãàm1Ã0 8Ã@^1ðì2ÃÀ~6ÃpJ3ÃÐ.5Ã`50ðþ/Ã@É4Ã`2Ã05ÃH6ÃÐ8ðà4Ãàm1à 1À‰/ÃpÙ0Ã0+3Ãp )Ãn:Ã?1ÃÐF1Ãð4Ãðˆ3ði3ÃŒ5Àƒ0ÃЫ5ÃP/ÃP2Ã0Ò,ð{0ÃÐL0Ãpý*ÃÐÕ.Ã@Õ2ð{0Ãð 3Ãð‚4ÃT4Ã92Ãõ.ÃÐá,Ã0œ5ÃàØ4ÃPy3Ã012ðø0ðu1Ãð¬-à /ÃP—.Ã0–6ÃPy3Ãp86ÃP2Ãz8Ã`#3Ãà-Ã`6à 3ðø0ÃàC8à i7À7ð¥)ÃÀ1Àƒ0Ã0À/à<4Ã`¦2ÃpP2Ã-Ãð 3ÃÐÏ/ÃPÇ&À•-Ã`4ðæ3Ãð4ÃÂ,À‰/Ã`¸/Ãн2Ã0 8ÃPð4À;<Ã`ó:à³5Ã`6ÃÐj+ÃàØ4ÃГ9ÃÐF1àÑ0Ãp :Ã@R3Æ6Àô2ÃpD4Ãã1à 0Ãé0Ãðÿ4ÃpÇ3Ã`š4Ãð|5ðÔ6ðQ7Ãð|5Ã9.ÃÂ0ÃPg6ÃàÞ3Ã` 7ÃÐ@2Ãàm1Ã@á0Ã`4Ãðˆ3Ãðš0ð™+ð/ÃÀ5Ã0C/Ã@^1Ãp£9ÃPs4ÃP‹0ÃPÆ;Àú1à¿3àH2Ãõ.à ò5Ã0+3Ãð 3À.Àú1Ãðd9ÃÐ.5Ãðp7à65Ã4Ãn:ÃP‹0à 0Ã4ÃPü2ÃQ.À$+à 1ÃÐÏ/Ãt9Ã92Àq3Ã071ÃP/à /Ãðv6À‰/Ãõ.Ãðv6ÃpÁ4ÃÀÑ=Ã07Ã@48ð]5ð/ÃÐá,ð/À,ÃPy3ÃàO6à 2ÃàÞ3ÃÈ/ðì2Ã@Ï3ÃÐF1ðø0ÃÀ+/Ãpb/Ã@48Ãð|5Ã`50Ã05à .,à¹4Àâ5Ãà-Ãàü.Ã`²0ÃÐ:3ü-Ãõ.ÃP/ÃP£,à þ3Ã@á0Ãà.Ã9.à ¥-ÃÀÀ+Ã9.ÃÀ%0ÃPs4ÃP0ð/À›,Ã`¬1À.ÃÐd,Ê+Ãàð0à o6ÃðŽ2à 1ÃÐd,Ã`¬1Ã`2ÃpV1Ãðˆ3àN1Ã×3ÃЫ5Ãð|5ÃPy3ðø0ÃPü2Àô2ð‡.ÃÚ(ÃQ.Ãày/ÃP‹0Ãð¦.à :*Ã@v-ÃÐÃ1Ãз3ÃàÒ5Ã0Ø+àË1ö2Ãàs0à u5Ã0´1ÃP‘/à 3ð/ÃÀ3ÃPü2Ã0®2ð™+ð/ÃP2Ã0C/Ão)à ·*à×/ÃÀ¨/à 3ÃpÁ4À‰/ÃÀº,ÃpJ3ð .Ã`Ä-Ã3/Ãз3ó9ÃÐ44Ã`50ÃP,+À}1ÃÎ*ÃPg6ð3ÃÐ:3Ø3ö2ÃpJ3à`.Ã@d0Ã0Þ*Ã` 7Ãàs0Ã`4Ä,ð3Ã?1ðW6ü1à 2Ã`¾.à ".ÃPü2Ãàm1Ãð1à «,Ãï/àË1ÃÐÕ.ö2Ãày/ü-ÃÀ3Àw2Ã0C/ÃP2*Ã0g)Ãðí7ÃÝ2Ãpn-ÃÐR/ÃK/Ã0®2Ãpn-Ãp27Ã@F5Ãð2Ã@á0ÃE,ðc4ðW6Ãpå.ÃpP2Àú1Ã0¨3ÃÀ„5à×/Ãpå.à 1Ã!2Ã`2ÃÐd,ÃÂ0à65Ãày/Ãpn-àï+à 1Ã@p.Ã`Ê,ÃP‘/Àú1Ã'1ÃÀ®.ÃPm5Ã33ÃpP2Ãp>5Ã@R3Ã@(:Ã0º0Ãàä2ÃÀ¨/Ãàä2Ãàg2ÃpD4à¿3Ã`¸/ÃÐF1Ãðš0ÃPö3Ã3ÃГ9Ãð /Ø3à «,ð/ÃÀœ1Ã@R3à 0ðc4Ã@Û1Ãð0Ã?1Ã0º0Ø3Ãl0ðu1Àî3Ãð|5Ã0À/Ã`G-ö.Ãàm1ÃÐv)ê0Ãð0Ã@F5ü1À‰/Ã`/1ÃPm5Ã’4Ã’4à ì6Àq3Ã0C/Ã@L4à`.Ã`2ÃðŽ2Ãpn-Ã0¢4Àq3Ãàa3ÃPê5ÃÀ 4ÃpV1Ã07ðW6ÃÀx7ÃÐÃ1ð{0ð.(ðQ7Ã0´1ÃÐÏ/ðo2Àè4ÃPö3Ã?1Ã!6ÃÀf:ÃpP2Ã0¢4à æ7ÿ7ÃЫ5ÃPê5Ã071Ãph.Ã@Û1ði3Ãpå.ÃÀœ1Àw2à ".Ã@ó-ÃðŽ2À1Ãð1Ãp(ÃP/ÃÀÀ+ÃÐÛ-Ã0+3ðæ3ÃPØ8Ã`”5à 1Ã07Ã3/ÃÔ)Ãð¬-Ã`/1ÀÖ7ö2à 3ÃÀ1.ÃÀ1.Ã'1ÃPö3ÃP2à ¥-Ã`2ðo2ðW6ÃÀ 4Ã@p.Ãõ.À7Ã9Ã'1ðo2Ãð 3ÃPa7à Ú9àB3Ã3/ÃPü2À /Ã÷8ÃK/Ã92Ã`Ð+ÃÀ+/Ãðù5ðc4ÃÐd,Ãph.ö.ð-Ã0®2Ã@á0à ".ðæ3Ãðÿ4à c8ü1Àe5ð3Ã0Š8Ãàs0à 3ÃÝ2Ãð0ÃPö3ÃðX;Àk4ÃàÞ3ÃE0Ã@48à o6Ã`4Ãpñ,Ã0=0Ã0O-ÃðŽ2Ã05Ãz8Ãp©8Ã@F5ðK8Ãб4ÃàU5Ã0%4Ã3ÃPü2ÀÜ6ÃàÒ5ÃpÇ3ÃÀ¢0Ãð /Ãà[4à³5Ãày/àã-Ã0x;ÃÀ+/Ãà[4ð/ðò1ù8Ã06À1Ã`Ä-àB3ÃðX;Ã9.ÃÀ 4Ãðˆ3Ã0¨3ÃЙ8Ã7à ø4ÃPê5ÃPØ8ðÚ5à§7Ãà7:Ã0%4Ãà.Ã`_)ði3ÀG:ÃÀ5ÃP…1Ãp©8Ã3Ãpb/Ã’4Ãà[4ÃÀx7Ã`A.Ãð‚4ÃpD4Ã@R3Ãàº9Ã@";Ãph.Ãp27ÃàU5ði3à Q;ÃpÇ3à ‡2ÃÐ44Ã`;/Ã0=0Ø7ÃT4Ãð#/Ãð”1ÃPê5Ã92ÃÀ%0Ãðˆ3ÃPü2ðà4Ãð1Ãàä2Ã@É4à 1à u5ÃàÌ6Ãt9à:Ãàä2ÃÐþ<Ãt9Ã0ï<Ãà=9à>Ãà–?Ãð|5ÃP[8à‰<àƒ=Ãà7:ð9;Ãp>Ãà–?ÃÀf:ç;Ãp£9ð'>Ã0„9Ã`Õ?À¬>É@ÃÐo?ÃPU9Ã@™<Ã0l=Ãà?à•:à ?>ð'>à 9?ÃÐo?ÃÀû6à:Ã69Ã>BÃ@=ð!?Ãð‡HÃ@";ÃГ9Ã?à 3@Ãý;Ã0TAÃ?ÃÓ>Ã`Ï@ÿ7Ã2DÃÀÅ?ÃÀû6Ãà>À#@ÀÜ6Ã0„9Ãp;Ã0ËBà W:Ã`Õ?ÃÀl9à}>àYDÃ?à§7Ãp27ÃÐ<àú>ð†CÃp<Ãp…>à È<Ã0Ý?Ãð@?Ã@";Ã0Š8ðÎ7ÃpaDÃàûCàî@ÃÀZ<Ã?Ãz<Ã`Û>ð>Oàw?Ã;Ãñ=Ã0%4Ã@¥:Ã`d=ð?:ÃP+@ÃPº=Ã}Bà=ÃPI;Ã0õ;Ãð±AÃ@«9àú>À¬>Ã8ÃÍ?Ãà–?Ãn>ÃPŠEÃ\=ÃðÏ<ÀA;à Ú9ÃÀÑ=À/>ãFð'>Æ:Ãðj8Ãp=ÃÐþ<à ?>Ãp?Ã@>à @ÃPÌ:ð€DÃ`4EÃp27Ã0¢4Ã`^>ÃPœBÃ@@ÃpsAÃàœ>À#@Ãp?Ãð^:í:Ã@.9ÃÀÅ?àú>Ãð·@ÃÍ?ÃÐ9ÃÐ¥6Ã`ç<Ãð±AÃ@‡?à È<à Ô:á<ÃÐàAÃP–Cà ?>ÃÀT=à›9ÃÐþ<ÀG:à ]9ÀAðª=ÃÍ?ÿ7Ã07Ãh;à <ÃP–Cà åLÃÖHÑMà GÃpÌGÃLà ˜Dà;ÃP%AÃÐ<ÃP==ÃPC<Ã@¥:à ?>àâBÃ0Ã@>ÃЙ8Ã@Û1ð3<Ãë>à W:ÃÀé9ÃЇ;Ãð|5ÃT4Ã@±8Ã`ˆ7Ã*;Ã`j<Ãp—;Ã?à›9ðBðE9ð¤>Ãp—;Ã>ó9À;<ÃÀ×<í:ðK8Ã0l=ÃÐÔCÃàÒ5ÃP1?Ã8Ãà–?ÃpsAÃpµ6ÃÀõ7à Q;Ã0:Õ>Ã@·7Ã`|9Ã0–6Ã$<Ãð@?ÃÀÝ;Ø7ÃP%AÃpö@à§7ðW6Ã`ó:Ãà´:àq@ÃЇ;Ãp;Ãp<Ã$<Ãà>ÃPœBàèAÃp86ðÚ5Ãðj8À;<Ãp :ÃP2Ã`6Ãðp7Ãð4À;ð¶;Ãå?ÃPO:Ãàœ>àî@Ãà´:ÃŒ9ÀA;ÃðŸDà È<Ãp?Ã$<à•:àú>ÃðÉ=ÃPm5Ã0Š8Ãà?àq@à Â=À¦?Ã09ÃPÞ7á<Ã@:7ÃPØ8Ã`š4Æ6Ãp,8Ãà„BÃh;ÃЙ8àeBÃz<ÃPÌ:Ã0Z@ÃÐ9Ãà7:ÃÐ<ðK8ÃЫ5ÀÖ7Ãt9Ã`ù9Ãðù5Ã@@Ã@±8Ã` 7ÃÀã:ÃЇ;ÃÀZ<à :à:à>àkAÃÑ4Ã÷8ÃP==Ãn>Ã@";Ã?Ã8Ãàº9àw?Ã7Ãß@ð-=ÃPI;à}>ÃPI;ÃP…1Ã0%4ÃàÒ5ÃàO6À¾;Ø7Ãb<ðÂ9Ã@É4ÃB7ÃÀÑ=Ãß<Ã0l=À;<Ãp—;ðE9Ãp27Ã09ÃÐ ;à9ÃÐò>ÃЙ8à$8Ã`A.à o6ÃŒ5Ã`”5ÃPa7ÃPa7ÃPÒ9ÃP[8ðÂ9à i7ÃÙ=Ãß<ÃŒ9Ãp»5ÃÀ5ÃÀr8Ãà[4ÃÐ@2à o6ÃЇ;Ãðí7ÃPê5Ã@R3ðE9ÃÐ<ÃÀ3ÃÀ3ÃPa7Ã@½6Ã07Ã0:ÃpD4Ãt=Ãð4Ã7ÃÐ"7à 3ðÔ6Ã@½6ÃË5Ãð0Ãp86Ã!2ÃŒ5Ã0®2Ã09Àè4Ãàm1à­6Ã`|9Ã0:ÃN5Ã@É4Ãë:Ã`2à W:Ãàê1Ã`ˆ7à c8Ã0œ5Ãt=ð{0Ãð0à65ðW6ð{0À1ð?:Ã@X2ÃÐ44Ã`#3À7Ãb<Ã`8Àq3ÃЫ5ÃÂ0Ãp\0ÃàO6à :ÃÐ9ÃÐL0ð{0Ãpß/Ãp,8à9Ãï/Ãн2Ãðˆ3Ã`š4ÃÐ@2Ã0é=Ã'1ÃPð4Ãp;Àk4ðo2ÃPm5ÃPü2Ãàä2ÃÀÀ+Ã3à «,Àî3à {4ðà4ÃÐÃ1Ã@Õ2ö2ÃÀ¢0Ã@R3Ãà.Ã`#3Ã-0ÃP.ÃP£,ÃÀ„5à×/ÃÀœ1Ã×3ÃÝ2Ã0Ò,Ã5ÃðŽ2Ã0I.Ãðv6ÃpD4ðì2Ã`¸/Ãp¯7ðc4ÃPð4Ã`¸/à×/Ã`Ä-ðþ/Ã3ÃЫ5Ãз3Ãàä2ÃÐÛ-ÃpP2Ã<8ÃÀ3Ãð”1Ã~-Ãð0À¡+Ãr/Ã@½6ÃàÌ6Æ6à “0Ã!2ÃPg6àH2Ã`M,ÃE0Ã@v-Àú1ÃÐÕ.Ã0C/ÃË5Ã0¢4Ãðš0ðc4Ø3Ø3ÃÐL0Ãà)ÃP0ÃÀ+/Ã`4Æ6Ãp,8Ã@ó-Ã'1ð/à (-À‰/ÃðÛ:Ãz8ÀS8à +Ãû-ä1Ã`/1Ã@ÿ+ði3Ã` 3Ã@”(Ãn:Ã0 8ÃàÀ8ÃÚ,Àô2ÃàÒ5À.Ã0I.ð{0Ãp27ÃÑ4àÝ.Ã`/1àÝ.ÃÀ 4à Ú9Þ2Ã!2À7Ã@X2ÃP2À1ÃÐF1ÃÀ2ÃT4ÃP1à 6ÃàO6ÃPð4ðø0Ãðù5Ã<8ÃPÒ9ÃÐ.5Ãà…-ð-Ã`²0ÃÐÕ.à ¥-ðo2Ãз3ä5à 1ÃÀ+/Ã4Ãàð0Ãpå.ÃpP2Ã0r<Ã@48Ã!2à Q;ÃÀ2Ã@d0Ã`4Ãð1à 1Ã8à 2À¡+Ã`)2Ãðí7Ãðˆ3Ã@Õ2ö.ÃÀ®.à 1ÃÀï8ÃPÀ<ÃÐj+ÀY7Ã`”5ÃÐF1ÃpV1Ãpß/àT0ÀM9Ã0º0Ã0º0Ã`5Ã'5ðæ3ÃÀ„5à¿3ÃpJ3à ‡2Àƒ0ÃÀ¨/Ã3/ÃE,Ãé0ö.ÃpJ3à þ3Ã4Ã0¢4Àî3ó9ö2à×/ÃÐÕ.Ãp27ÀÐ8ð9;Ã0%4Ãpå.ÃP2àZ/àB3Ã@^1Ã@½6Ã`/1Ã@48à$8ÃÀ6Ãðù5ÃÐj+Ã3/à ‡2Ã`š4Ã@Õ2Ãàm1à 3ÃÀ–2àT0Ã0¢4àË1Ãð4à Q;Ãð¬-à ™/ÃpD4Ãн2Ã`¦2Ã`6Ãp27ÃàÒ5à 3ÃPä6à=ÃPa7Ãp©8Ã`/1ÃÐ9Ã`)2à 6àl,Ã@@6ÃpV1à 1Ã33ÃPs4Ãàm1ÃpÙ0ÀÖ7ÃÀ–2ÃPð4Ã!2Ãl0ÀS8Ãðv6ÃPê5ÃÀÒ(ðc4Ãp©8ÃPÞ7à i7ÃZ3Ã0=0À-ÃPg6Ãð2À}1Ã@@6Ã0 8Ãðù5Ã@Ï3ÃPö3Ãph.à ‡2Ã0œ5Ãp&9ä5ÃK+Ã0Ì-Ã`4ðæ3ÃÐ^-Àâ5Ã@@6ÃÀf:Ã×3Àî3Ãð|5Ã’4ÃÐF1ÃÀ+/À.Ã3Ã4Ãàä2Ã` 3ÃpÁ4Ãàs0Àâ5ÃŒ5ÀÄ:Ã0œ5Ãз3à ¥-ÃÐÃ1Ãà´:Ã`8ÀÜ6Ãý7à æ7à›9Ã0–6Ãï/à c8ÃN5Ã`ó:ÃÀ 4ä1Ã`|9Ãàa3ÃZ3Ãr/ð/ÃP‘/ÃÐÃ1Ã’4Ã@·7Ã?1ÃP.àB3Ã`2Àk4ÃàÞ3ÃÀ~6Ã@É4Ãðš0ÃÐ:ÃÐÏ/ÃPy3Ã0Š8Ãðù5Ãà´:ÃÐ@2Ã@á0Ã@á0Ãðó6ÃP2Ãàä2à /ÃpÓ1Æ6ÃÐ44Ãpß/ÃÝ2ÃP0ÃP—.À1Ã`²0à­6ÃPm5ÃàU5Ã0À/ÃÐù(Ã'1Ã'5Ãð”1ÃÀœ1à 3À /Ã@X2Ø3Ãðš0ðþ/ÃàÒ5ð{0À¡+Ã@+ðc4à Ã(àÑ0ÃÀ3Ã!2ÃàI7Ãð”1ÃÀ1.à 3ÃPü2Ã0I.ÃP/à 0Ã0Æ.Æ6Ã`š4Ã071ÃÀ3Ø3Ãph.ÃÐç+Ã`50Ãf1ÃP1Ã33à`.ð,ðò1ðø0ðÚ5Ã07ÃÀ×<à à8Ãð¦.à9ÃPä6ÃàO6àf-Ã@á0ÃPy3ÃÐ(6Ã0=0Ãi*ÃÀ2Ã`¸/Ãr/ÃPü2ÃÑ4ÃÐÉ0Ã`Ä-ÃàÒ5à Î;Ã@48ÃÐ9Ã`p;Ã0œ5Ãp¯7Ã33ÃpÇ3ÃÀÝ;àƒ=Ã!6ðÔ6à³5Ãà1;ÃðR<ÃpsAÃ69Ãðj8à<4à æ7Ãð:@ÃðF>ÃЙ8Ã@½6ÃPØ8Ã0„9Ã0r<ÃÐÃ1Ãp86Ãðÿ4Àâ5Ãà¢=ÀÐ8ÃPI;ðÂ9ÃPÀ<Ãå?Ãà>Ã`ó:ð@Ã@.9à=à;ÃP[8ÃÀŠ4Þ6à$8Ãà=9Ø3ð'>Ã0ï<Ãp:Ãp¯7ÃPØ8Ã0Š8Ã0–6Ã`v:Ø7ÃÀŠ4ÃÎ.Ã’8à Q;ÃГ9Ã@«9ÃðÉ=Ãà=9Ã07ðK8Ã@«9Ã` 7à=Û=ÀY7ðÈ8Ã0×@à æ7ÃðR<Ãðù5Ã@48Ãðj8ÃÑ4ÃÀf:ÃPÒ9ÃðÛ:Ãh?Ã`|9Ã@(:À¾;Ã`ˆ7ÃPð4ÀÄ:Ã0é=Ãðd9Ã?Ã0NBÃ@L4Ã`X?Ã@48Ã69Ã`‚8Ãt=Ãà®;ÃPO:À7Ã`ó:Ãp&9à›9ÃÀx7à>ÃÀï8ÃPI;Ã69Ã@·7Ã0l=ÃP==à {4Ã×3Ã0–6ÃÐ.5ÃГ9ÃP[8Ã÷8Ãp :Ãý7À¸<Ã`Õ?Ãà=9Ãp…>ÃP¨@ç;ðì2à ¶?ðž?Ã0:ÃÐ.5à‰<Ã09Ãà®;Ãb<ÃB7ÃÐ8Ãñ9Ã@Ã5Ã7à=ÃPÒ9Ãp86Ãp©8ó9ÃÍ?Ã`Û>ð'>à i7Ãt=Ãp?ÃPO:À_6Æ:ðQ7à06Ã÷<ÃPC<ÃÀï8ÃVBÃÀx7à 6Ãt9ÀÜ6ÃÀ×<ÃP[8ÃГ9Ã@Ÿ;Ã`8ÃÀN>Ã@<Ã69ÃЙ8à È<à;Ã`v:ðà4Ãðj8Ã0„9ðK8ÃŒ9à o6ð]5ÃàU5Ã’8ÃÀl9Ã@½6Ãz8Ãðó6Ãp&9Ã`ó:Ã0ã>Ã0û:ÃT4Àe5Ãàº9Ã`ó:ÃàÀ8ð¼:ÃPO:Ãz<ðE9Ã÷8à;à¹4ÃЇ;ðK8ÃÐ<ÃÐ¥6Ã’4Ã0´1ÃðÛ:Ã`p;ðK8ÃÀx7ÃP1ÃPa7à9Ã0~:Ã`4Ã@@6à¡8Ã`8ÃP…1à³5Ãà´:ÃðX;à06Ãà´:ÃP2ÀÐ8Àk4ÃÀ3ðì2ÃÐ9Ãt9à³5ÃÀ1ÃÀÝ;Ã@‡?Ã`ÿ8Ã@(:ÃàC8Ãàœ>ðÈ8Ã0l=Ãp;ÃÐ¥6Ã@^1à×/ÃPð4ð]5ÃÅ6À_6ÃÀl9ÃpÁ4ÃÀ 4ÃÐ:3ðo2ö2Ãf1ÃpÁ4Ã92Ãt9Ã@:7ðc4àT0ÀÜ6ÀÖ7à þ3Ãà7:Ã07Ãý7ÃÀ¢0Ã@·7ÃÐ9à 0Ã0®2ÃPÒ9Àâ5ÃPÒ9ÃÐ44ð/Ã`”5à 3ÃÐ44ÀÄ:Ã0Š8ÃàØ4ðò1à 1ÃÐ9ÃП7Ã`Ž6à à8à i7ÀA;Ã`2Ãàð0ÃÀ¨/ÃÀ%0Ãðv6Ãð4Þ2ö2à06ÃÀ~6À‰/Ãð 3ü1ÃP—.ÃÀ¨/Ã0œ5ÃH6Ãp\0àÑ0ÃÂ0Ãã1ÃP2Ã@L4ÃÂ0Ã0C/ü1Ãð1Ã@d0ÃP‹0ð3ÃPs4Ãày/ði3à o6Ãð2Ã`Ž6ðo2ðÂ9àB3à o6ðø0Ã8ÃÐ"7ðu1ü-ÃË5Ã×3ÃП7ÃÑ4à ™/àÑ0ÃÀ3ðÈ8à c8Ãðÿ4Ãf1Ãàö/à 2àÅ2Àk4Ã5ÃÀ3ÃÐR/Ãà[4Ø3àH2Ã`š4ð-=à Ô:Ã0+3Ãàä2ðÚ5à æ7ÃÐ"7Ãf1Ã0C/ÃÐR/Ãð4ðu1ÃZ3Ã@j/ÃZ3Ãð 3Ãðí7Ã05Ã?1ÃpÓ1Ã3à§7Àâ5Ãp»5ÃP2Ãp©8ÀY7ÃpÇ3àT0ÀÖ7ÃàU5ÃÐ¥6ðÂ9Ã0º0Ã0œ5ÃP1ÃÀ¢0Ãð 3ð/Ã@Û1Ãë:Ã7ÀÜ6Ãð).à (-Ãð /ð/ÃÀl9ÃÀ`;ÃÝ2à i7ÃPÞ7à ‡2Ã@X2ÃT4Ã`2ðo2à­6Ã@·7Ã@«9Ã`ù9ÃPö3Ãð|5Ãf1Ãз3Ãð‚4Ã69Ãðˆ3ð-ÃÐ.5ÃÐ44à ]9Ã07Ã0x;Ãé0Ãp27Ã@É4ÃPs4Ã÷8Ã@j/à 6ÃpÙ0àË1Ã012í:Ãà.ÃZ3Ã`4Ã06Ãðù5ÃÐ44ÃÀ3ÃP©+ÃÀ3Ã0º0ÃpP2Ãàg2Àe5Ãl0Ãày/ðÎ7Ãp»5à Ô:Ã-àT0ê4ÃPÆ;Ã@X2Ã`6ö.ÃP2Ãpb/ÃP[8Ã;ÃP2Ã@Õ2ðæ3ÃPa7Ãé0Ãà.Ãpñ,Ãð/-Ã0Ò,Ã0–6ÃðŽ2ÃpÇ3Ã0Š8Ã`/1à “0Ãàm1Ã`M,ÃÀº,ÃÀ3ðÎ7Ãàa3Ã`¸/Àô2Ãf1ê0Ã`Ê,Ãû-ÃpÁ4Ã0œ5Ã@p.Ãð/-Ãp&9Ã@¥:Ã0´1àN1ÃÐR/ü-Ãl0ÃP2ÃpP2Ã?-Ã?1ÃÀœ1ð .Ãð‚4Àw2Ã-0Ãð4ð/Ã0Š8Ã@Ã5ÃpÁ4Ã0=0ÃÀ%0Ã@F5ÃàÞ3ÃP‹0Ãàð0Ãà.Ã0+3Ã0¢4ðÔ6Àú1Ã0º0ð/ðc4Ãð”1ÃP2Ãðù5ÃÀã:Ã`6Ã0¢4Ãð‚4ÃT4ê4à o6ÃPü2à þ3Ã4Ãð4Ãðù5ÃÐF1Ã0º0Ãð1ÃЫ5Ãp27Ãàm1à þ3Æ6à¹4Ã`”5Ã@d0ÃàU5Ã`Ž6Ã@ù,ÃÀ®.ÃÀŠ4Ãã1à ™/Ãpß/Ãý7ÃPÆ;Ãpµ6Ã0 8Ø3Ã3/Ã0®2ÃPÞ7ÃЫ5Ã0¨3Ãб4Ã0C/Ãf1ÃÀ~6à ì6à o6ð/Ãày/Ã`¾.ðì2ü1ö.ÃpD4ÃЫ5Ãàa3ÃP—.Ã!2Ãé0à Ô:ðW6ðo2Ã0C/ÃP/ü-Ãðˆ3ÃÀœ1Ãpn-Ã@R3Ãàg2ÃP0Ã` 3à {4ÃB7ö.Ãà*ö2Ø7Ã` 3Ãt9à o6ÃÀ%0Ã@á0ÀÖ7àN1àã-Ã5Ãðˆ3ÃpÍ2ÃÀŠ4àT0à /à ò5ü1ÃÐ44ðà4Ã33ÃPm5ÃÀ~6Ã@R3à 0ÃÀ–2ÃPy3Ã0À/ÃpJ3ÃÅ6ÃÐÏ/Ã×3à i7ÃB7Ã`#3ðø0Ãf1ÃT4Ã`²0à :*ÃÎ*à o6à :Ãàä2ÃpÙ0Ã@^1Ã0º0ÃP…1ð3ÃÐL0Ã`50àÝ.àT0Ãð/-Ãð¦.ÃÀ–2Ãà‘+ÃÐó)àÝ.Àq3ÃP2Ã5ÃàÞ3à u5ð3ö2Ã’4Ãàa3Ãà[4Ãû-ÃP‹0ÃpÇ3ÃÀ1ÃÀ5ÃpÁ4à ‡2Ãpb/ðc4Ã0À/ÃT4Ã@Û1ê0ÃP/à 0Ãx.Ã@í.ÃPö3ÃÀû6Ã0Æ.ÀÖ7Ãpb/à .,Ã0s'ÃÀŠ4ÃÀé9ÃÀŠ4Ã0%4Ã0´1Ã'5Ã?-Ãph.Ã@X2Ã@p.Ãàð0Ãð0Ã0a*à /Ã@Õ2Ã@Õ2Àw2à 3ÃÝ2Ãc+Ãp>5Ãðó6à¿3ÃÐd,ÃÀ2ÃÀ+/Ãph.Ãàü.À7Ã0ê(Ã@v-Ãð4àB3Ãpb/À0à /ÃP‹0Ãpµ6Ã0´1Ãï/ÃÐ(6Ãà‹,Ãðˆ3Ã0C/Ã0´1Ãpý*ÃÀÌ)Ãð 3ö.Ãð”1Ã-Ãày/à Ú9Ã`M,ÃÀ%0Àú1à 3ÃàÀ8Ã0+3à “0Ã@R3Ä,ð-Ãpý*Ãð2Ãð2Ãб4ÃÀÌ)ÃPm5Ãï/à .,Ã06ÃðŽ2Ã@j/Ãà.ÃÀI*ÃŒ5Ãàa3ÃP£,Ã-0àl,ÃÐ"7à 2ÀG:À1ÃðG)ü1Ã0–6ÃП7ðÚ5Ãð”1ðu1Ã`;/Ã` 3Ã’4ðo2ðc4à Ÿ.Ã071À1ÃP&,Ã`²0Ã@F5Ã`5Ã@í.Àî3ÃÐó)Ãpñ,Ãp>5ÃP2Àq3àÅ2Ã`ˆ7Ãз3Ã`¦2Ã0Æ.Ãðv6Ã@É4ÃH6Ãp»5Ãà1;Ãàð0ÃpD4à¿3Ã`6Ãà1;Ã’4Ãð”1Ã0`?À @à Ú9ÃðL=Ãpµ6Ã@<Ãë:ÃðÏ<ÃPä6ÀS8Ãp=à E=Ãpü?à ]9Ãt9Ã@½6À/>ÃP´>Ã`ç<à›9ÃÀé9ÃÐo?ÃÐþ<ÃЙ8Ãt=ÃÀã:ð°<ÃPÌ:Ãà%=Ã`|9Ãñ=Ãà AÃÐo?À¦?Ã@«9ÃÀÝ;Ãz<à ¼>ð¶;ÃÐ44à 9?Ã@{AÃÀõ7ÃÐ:ÀA;ÃÀã:Ãz8àî@Ã0¿DÃPü2ÀM9Ã`Û>Ã0r<Ãð±AÀ¸<ÃЙ8Ãà–?Ã`d=Ãp?à °@à Â=Ãp—;Ãð.BÃ`X?à È<à È<Ã0ï<Ã@uBÃ÷<Ãp;à Ú9Ãn:À¾;ÃðGàq@à Â=Ã`í;Ã0ï<àâBàkAÀAÀšAÃÐ{=Ã>BÃð4AÀ)?ðE9ÃP´>Ã@<À)?ÃAÃÐ:ÃÐ8ÃBÃ0×@Ã@>ðAÃ}BÃð@?ÃpêBà žCÃJ@Ãh?Ã0NBÀ5=Ãà®;ð@ÃðF>ÃP¨@ÃÀé9à‰<ð°<Ãp=ÃÙ=Ãð.BÃPI;ÃPº=àq@ÃÐø=Ã0NBÃà+<Ã0„9Ã0×@Ãå;ÃP¨@Ã`Ï@Ã@“=Ã`p;ÃÀN>ÃÀl9ÀÊ9à Ú9ÃP´>à Â=ÃÐàAà•:à›9Ã09Ã0õ;ÃÐò>ÃÀÅ?ðK8àH2À5=Ãàê1ÃÀË>Ã0ËBÃàBðÂ9À5=ÃÀl9ÀÐ8à Q;ÃÑ4ÃPÀ<ÃPÒ9ÃÀé9Ã<8ÃÐ ;à‰<Ã`j<ÃÐ8Ãp¯7Ãp:à Q;ÃpmBÃ\Aÿ7Ãðd9Ã0Š8à à8à W:à à8Ãà1;Ãb<à ?>ÃÀZ<àÅ2Ãðó6Ã\=Ã0û:ð¼:Ã?À5=ÃPU9ÃðÏ<ÀÐ8ð°<ÃÐ9Ãðí7ÃÐ.5Ã`4ÃPä6Ã@½6à E=ÃÀ3ÃЫ5À)?à;ÃpmBÃ\=ÃP7>ð°<ÃàÒ5à¿3Ø7ÃÀ`;à W:ÃÝ2Ãð 3ð-=É@í:ÃÀ 4Ã'1Ã07Ã=à06Ã0:Ãðù5ÀS8Ã9Ã@½6ÃÐ<ÃÐì?ÃðÉ=à ‡2ÃPU9ðW6à þ3Ãàº9Ãðj8Ã`‚8Ãà=9ÃàU5ÃŒ5ÃÀZ<ÃV>ÃÐ ;Ãð^:ÃPg6Ã@É4Ã06Ã@Õ2à 1Ã0Š8à$8Ã÷8ÃàI7ÃàU5Ã0:ð?:À;<Ãh;àB3ðÚ5Ã0:à c8Ã@·7à$8Ãp:à§7Ã`p;Ã@F5à þ3Ã69Ã@.9ÃÀ5ÃP[8Ãàg2à¹4à c8à W:à­6Ã`2Ã` 7à$8Ãh;ÃГ9à u5ÃàÌ6à>ÃPÒ9Ã`ç<ÃÐÃ1ÃPO:ÃÀ`;à à8ÃÅ6Ã!6à65Ãðí7Ã'5Ãz8Ã0„9Ãà[4ðÈ8ÃPÞ7à06Ã8Ã`ÿ8Ã`‚8Ã@:7ù8ÃП7à ì6Ã`|9à c8Ãp—;Ã071à ".ÃÀõ7Ãðv6ð3ÃP0Ãà?Ãà+Ã@ç/à•:ÃP©+Ã5à ø4Ã0¢4Ãàð0ÃàÒ5ÃÀx7Ã@Ã5à {4ðW6ð3<ÃPð4ÃÝ2Ãб4ÃЙ8ÃÐ¥6Ãý7ÃÐ(6ÃÐÉ0Ã`Õ?à i7à Q;Ãàº9ÃàI7ÃÀ+/ä5Ã@(:ÃT4Ãp>5ÃàÌ6ÃpD4ðæ3ÃÀõ7ðæ3Ã@F5ÃàÀ8ÃÐì?Ã`Û>ÃÐ(6Ã0Ò,à³5Ãðó6Ãp,8àT0Ã`)2Ãp>5Ã09ÃÀZ<Ã×3à /ÃT4ÃÀŠ4ÀS8ÃàÆ7Ã-0ÃÀr8ÃЫ5Ãà[4ÃÀŠ4Ã3/Àè4Àk4Ã7Ã@X2Ã!6ði3Ã`5ðW6à06ÃÀr8Ã`5Ãñ9ð]5Ã@:7Ã0¢4Ãðù5ð]5ÃàU5à×/ÃÀ3ÃÐÉ0Ã`‚8Àw2ÃPy3ÃÐ@2Ã92ÃpJ3Ãàê1ÃÐ"7ÃÐR/ÃN5Àe5ð™+ÃÀ–2ü1à i7Ãð.Bð’Að9;Ã\=Ã@>ÃP+@Ãð·@Ãb<ÃPä6à 1Ã@p.à (-Ãà.ÃP‹0ð]5ÃàÞ3Ã0C/à Î;Ã0õ;à$8ÃPg6Ãp¯7ÃPÞ7À0Ã@F5ÃàÞ3Ã3/Ã0Æ.ÃÀ®.Ãàg2à¡8Ã@.9Ã3/Ã0%4ðo2Ã05à¹4Ãr/Ã@í.ði3à³5ÃpÇ3Ã@@6Àk4Ã`8Ãp>5ÃÑ4ÃÐ9ÃÐ44Ã0´1ÃÀN>ð?:à*7Ã@Ã5Ãp†)à ".ð3ÃÀ3à*7à¹4Ã5ÃPy3Ã`v:ÃÐ:Ãð|5Ã×3ð/Ãï/Ã05Ãpµ6àÑ0Ã@á0ÃÀ 4Ãàs0ÃpÙ0ÃpD4Ã3à æ7Ã`|9Ãàm1Ãð1Ã`5ÃT4Ãð4ð{0Ã-4ÃN5ÃP…1Ã0–6Ã@X2Ãð0Ãð2à ‡2Ã`6Ãp¯7ÃÐ<Ãp27ÀM9Ã`#3Ãð¬-ð‡.ÃPs4Ã@@6Ãà1;Ã`ç<ÃÐ44à «,Ã@á0Ãà1;ÃÐ¥6ÃPy3ÃP2ðÚ5Ãz8Þ2Ã`¸/Ê+à “0ÃÀ„5Ãð2ðì2Ãã1ÃÝ2ÃH6ÃPÌ:ÃàC8Ãðá9ÃP‹0Ã`50ÃàØ4Ã0C/ÃÀ3Ã0+3Ã`)2ðo2ÃÀï8Ã`)2Àq3ÃpÓ1Ãp27ÃàU5ê0Ãr/Ã0œ5ðà4Ãðˆ3ÃH6ÃÀ¢0Ãðÿ4àT0Ã3Ã5Ã7ÃPm5ðÚ5Ãð|5Ã`6À‰/ÃpV1Ã`ˆ7à o6ÃpÇ3Ã0I.Ãx.Ã!6Ã0º0ðc4ÃÐ"7ä5ÃЫ5Ã09à {4Ã@X2Ã` 3ÃàO6Ã@F5Ãp\0Ã@@6Ã@·7ð¼:ÃÀ3Ã@X2ÃÀ1.àÑ0Ø3ÃŒ9Ãð4Ã0´1Ã3àH2Àî3àH2Ã’4ðæ3ÃPð4ÀÊ9Ãz8Ãp :ÃPð4Ãз3Ã0%4Ãðˆ3ÃPy3Ã@|,à¹4Ãp27Ã0=0ði3Ã!2Ã92Ãàa3ðK8Ãë:À‰/Àq3à Ú9À7Ã07ÃPÒ9ÃPØ8Ãð 3Ã'1Ãp86Ã0r<à=ÃÀ1.à›9à$8Ã`²0àã-Ã0®2ðo2ÃàÌ6ÃÑ4Ã`Ž6ÃàÀ8Ã` 3ðK8ðo2Ãàä2Ã`²0Ã`6ÃÐ44À_6Ã`#3ÃàÞ3Ãð¬-ÃP0ð/ðæ3Þ2Ãp:Ø7ÃP/Ã0I.Àq3Ã`š4Ã’4à 3ÃpÓ1Ã3Æ6Ãà=9ÃT4Ã-0ðà4ê4Ãб4ÃÀ3Ã?1ÃÐL0ÃàÞ3Ãr/Ãð /ðà4ðò1Ã3/ÃPa7Ã0´1ÃÀ¨/ð{0ÃP…1ÃPa7Ã0Æ.ðu1Ãð#/à ‡2ê4ÃðŽ2Ãà7:À‰/ð/ðÔ6à 6Àî3Ã3Àú1ð/ÀS8ÃÀ3ÃP‹0Àâ5Ã@|,Ãð5,ÃÀ+/Ã0–6ê0ÃÀ3Ã0–6ÃÝ2à þ3ä5à<4ÃP1Ã@ *ÃÐd,ÀY7í:ÃÎ.ÃàU5Ãз3Ãà—*àÅ2Ãð^:ÃÀŠ4ÃPg6à /Ã` 3à¿3Ã`¸/Ã`2ÃP/Ãp*ÃP2ð{0ÃP0Ã@j/Ã`5ê4ÃàU5ÃH6ÃP‹0Ãpß/à ·*ðo2ÃÂ0ÃÐ:3Ãp»5Ã@ç/Ã0Ò,ÃÀÀ+Ã-0Ã`50ÃÐX.ÃP2Ã0 8Ãû-Ãàm1ä1à 3Ã×3Ã0I.à 1ÃàÞ3ÃàÀ8ÃPê5Àè4à “0ÀY7àl,Ãð#/àf-ÃÐÏ/ðW6ðW6Ã92ÃàØ4Ãl0Ã`2ÃPÀ<ÃàC8ÃÐ.5ðþ/Ãp*ÃÚ,Ãðÿ4Àƒ0ð“,ð/à9àÝ.Ã@É4Ãæ*ÃÀ['Ãð5,Ã@p.Ã@á0Ã` 7Ã0%4ÃZ3Ãàs0Ø3à<4à ¥-Ãp’'ð .ê4à ™/Ã?-Ãà[4Ã0–6à§7ÃÀ7-Ã@í.Ã@É4ÃàO6Ã@Û1Àq3ÃàU5ÃPä6à u5À0à~)Ãx.Àú1ÃÀ2ð+Ã0Æ.Ãc+Ã5Ãð^:àé,Ã3/ð/àT0àH2ÃàØ4Ã`ˆ7Ãà…-ÃPÌ:ÃP1Ã-Ãã1àN1Ã`¬1ÃPg6Àú1Ãpµ6Ã`¦2ÃŒ5ÃÀ5Àè4Ã3/ÃÐ@2ð .Ãð¸+Ã`4Ãð|5ÃÀ–2àÅ2Ã5Àú1ÃE0ðÔ6Ã`50ÃÈ/Ã0+3à “0Ãð¦.ð¶;ÃP.Ã@í.ÃÀ~6ÃàÞ3ö.àË1ðQ7ÃQ.ðu1ÀS8ÃÀx7àB3ÃP2Ã09Ã`2ÃЫ5ÃÐÃ1Ã05Ãpb/ÃÀ 4ð3à ø4Æ6Ã`Ž6Ã@(:ðò1ÃE0à¿3Ã0¨3Ã07ÃÀ 4Ãð 3ÃpÁ4àN1ÃT4Ãp»5ÃЫ5à ‡2ðþ/Ãн2Ãðp7ÃË5ÃÀõ7Ã÷8Ã@@6ÃPÌ:Ã`š4Ãý7à$8à þ3Ã@X2Ãp¯7Ã0:Ã` 3ÃP2ÃÐ@2ðÔ6Ãð”1Ã`j<ÃðÏ<ÃàÌ6ÀY7ö2Ã@@6Ãðç8àÅ2Ãï/ÃàÆ7Ãðš0ÃÀÒ(ÀS8Ãàä2à ì6à›9ÃÀl9Ã0 8à o6à ‡2Ã`”5ðÎ7Ãð4Ã` 3Ã0¨3Ãé0Ãàä2Ã4ÃàÒ5Ãðç8ÃГ9Ãðí7à 3Ãpµ6Ã0¨3ÀÖ7à u5Ã`4à›9à06à 1ÃÀ6à u5ÃàÒ5ÃH6Ã`v:ÃÝ2Ãp&9ÃZ3Àè4ù8ði3à9Ãðù5Ãð4ÃÀã:Ãð‚4Ãðí7À7Ã0=0Ã0U,ÃP -Ãàä2àÑ0Àk4ð-àB3ÃàÞ3ÃÑ4ÃÐÛ-ÃpJ3ü1ÃÐ44Àâ5Ã?1Ãà[4Ã4Ãà¢=Ã@Ï3Ã@Ã5ÃÀÑ=Ãð|5ÃPö3ðo2ð{0Ã92Ãà‹,ð¤>ÃàC8Ã`/1Ã7ÃÀÑ=Ã@(:Ã0´1ÃÀõ7ðQ7ÃàÌ6ÃП7ÃÀ2Ãpµ6Ãàä2Ã`50ÃÀ–2ó9Ã92ðÎ7Þ2Ãàg2Ã`š4Ãðv6Ã0+3Ãp\0à c8àH2àB3Ãðš0ö2Ã`v:à 0ÃÐ"7Ãðv6ðW6ÃP2Ã0œ5Àw2ê0Ã071ÃpÙ0Àe5ä5Ã4ðo2Ã@í.Ãð /ÃàÌ6ÃÐÃ1ÃpP2ð-à06Ã@j/Ã@^1ðo2à ".àB3ÃpJ3Ã0À/à ø4Ã`/1ÃZ3à ø4ðì2à×/ðW6ÃÀU(Ã?1Ãàð0ÃP…1ÃÀ3ðc4à {4ÀÜ6ÃÐÏ/Ã`¾.Ã@(:àq@Ãð^:Ãàs0Ã7Ã7Ã<8à*7Ã9ÃÀÑ=Ã7Ãp£9ÃðX;Ãh;Ãà®;à u5Ã0~:Ã`j<ðQ7ÃÐ9À;ðE9Ã`Ž6Ã0Æ.ÀÜ6Ã@";à i7ÃÐ:Ãp :Ãp86Ãà‹,ÃT4Ãå;ÃðR<ÃàI7Ã<8Ã`4à ]9ÃÐ<ÃÀÝ;Ãp27ÃÐ(6ÃàI7Ã0û:Ã@«9àw?Ãp©8À)?àô?ÃV>Ãà–?ÃPg6Ãz<ÀA;Ãp£9ÃÑ4Ã33à•:à Q;Ã`|9à­6à*7ð'>ÃðÕ;Ãà®;Ã÷<ÃÐo?Ã`^>ÃÐu>ÃðÕ;Ã@<Ãp&9Ã@¥:ÃP´>Ãðá9ÃðR<ÃP1?Ãà+<Ã0NBÃàCà;Ã@ ?ð÷EÃ`ÃBÃà>Ãð"DÃÇDÃ0ÅCÃ`½Cá<ÃpsAá<Ãp&9Ã`±Eð’AÃAÃÐ{=ÃAÃp…>àSEÃ,EÃBÃÀ$Eð˜@àú>Ã@>Ãð@?Ã@ìCÃÀ³BÃÙ=ÃeFÀšAÀŽCà>ÃkEÃpö@Ã0Ý?Ã=ÃðL=ÃÐ9HÃЇ;àkAÃ06FÃÓBÃÀ$EÃÀ0CÃP%AÃà%=ÃðÛ:ð@Ã@¼KÃàÝHÃôCÃPûGÃpðAÃDAÃàõDÃP EÃ@ÔGðzEà zIÃàûCÃÐcAÀ)?à ¶?Ã2DÃ0ÅCà>Ã÷8Ã0NBÃ`R@Ã`Ï@Ãð«BÃà@ÃÀÃ0ÅCÃÐàAÃà¿MÃ06FÃ`"HÃÀ³BÃz<Ã`ó:Ã0³FÃPDà zIà ¤BÃÓBÀÿEàSEÃÀf:Ã@iDÀ¬>Ãà@ÃÐÂFÃ@uBà EÃwCÃàõDÃÐcAÃJ@Ãpö@ÃÐò>ÃÐcAÃpgCÃP%AÃÐþ<àô?Ãð½?Ã06Fà ¶?É@Ã`R@ÃÙ=ÃP+@à Â=ÃpÞDÃPDá<Ã@æDÃð4Aàƒ=Ã0Z@Ã@ÂJÃ0à žCÀ5=Ãp<Ã0Ý?ÃÐEFÃpðAÃ@‡?ÃPC<á<ÃP%AÃ@øAÃn:Ãà–?Ãà®;à -AÃð½?Ã`ù9Ãt=ð-=Ãðá9à ?>Ã0ã>ð¤>Ã`p;ÀÊ9Ãà?Ã;Ã07ÃP–CÃÐÔCàkAð'>ÃðL=Ã*;À”BÃ0TAàw?Ã0„9ÃÐ<à ¶?ÃðŸDð3<Ã`4Ã69Û=Ã`X?ÃPÀ<Ãn>ÃðX;É@ÃPDÃ\=à <ÃP¨@Ãpy@ðAÃ`ó:ÃÐ<Ãð@?ÃŒ9ÃPg6Ã0ÑAÃàœ>àƒ=Ã`j<Ãà„BÃ0ã>Ã`á=ÃÀN>ÃÀ×<àkAÃ=Ã0Ý?Ã0¢4Ãðù5Ãðv6à °@ÃP==Ã`”5ÃpÁ4ÃP®?ÃPC<Ã@";ÃPº=à$8Ãðÿ4ÃÐ:Ã!6Ãp27Ã÷<ÃÀZ<Ãðp7ÃpD4à ø4ÃЙ8ð9;ÃPÀ<Ãà¨<ÀA;ÃPÞ7ÃÍ?Ã@uBÃ`á=ÃðF>Ã`ó:Ãë:Ã@þ@ÃÐ ;à ø4Ãðó6à Q;Ãà=9Ã0œ5ÃГ9à :ÃàU5ðE9Ã@«9Ã0œ5Ãë:ð¶;Ã@.9ÃPê5Ãpö@Ã0:Ã09à æ7ÃÀf:Ã@½6ÀS8ÃàÞ3Ã0´1Ãë:Ãà1;ð¼:ÃPI;Ã0œ5Ãðí7ÃÑ4à­6ÃÐ"7ÃPy3à u5ÃŒ5ÃÀ2Ãðj8à¡8Àô2à þ3ði3Ã0–6ÃÀï8ÃÀË>à•:à K<Ã4ÃPy3Ã06Ãp,8ÃàÆ7Ãðç8Ãàä2ÃPs4Ã8ÃÐ.5Àw2ÃÀ¢0à65à ø4Ã@.9Ã’4Ãp»5àú>Ãp—;Ã@·7Ã07ÃH6à 1ÀÊ9ð¼:ÃÀ5Ã`X?Ã7ÃZ3ÃpD4ÀÖ7Ãp£9Ã@Ã5ðÎ7ÃT4Ã92Ã-0Ãp86ÃpD4Ãðí7À_6Ãõ.Ã@É4Ã@«9Ãðç8Ã@@6ðo2Ã3Ã0ã>ÃÀT=ð9;ÀS8Ã@«9Ãpµ6ÃŒ9Ãðù5ði3Ã'1Ãt9ù8ðo2à:ÃЙ8Ãðç8ðÔ6ÃPU9ðo2Ã@@6Ãz8ÃÐ9ðÚ5Ãp©8ÃðÉ=ÃÐ:3Ãp»5à o6ÃN5à 1à ø4ÃàÞ3Þ2Àè4Ã0®2ÃPm5Ã@F5Ãà=9Ãàm1Ã`G-Ãð/-ÃpÙ0Ã@Õ2ð3ÃPy3àÑ0ÀÜ6Ãpµ6Ãðj8à 3ð¼:Ãà,Àk4ÃÀ2Ãf1à¿3Ãðp7Ã@@6à ]9Ã@ÿ+Ã4Ã@48Ãð¬-Æ6ÃÀ–2ÃÀ+/ÿ7Ã0¢4ÃÐL0ðo2Ãðˆ3ðÚ5ÃŒ9Ãp&9Ãà=9ÃPü2ð]5ðÎ7À7Ãp27Ãõ.ä5Ã0®2à 1ðø0à ø4ÃpÁ4ÃÐ44ðW6ÃàÒ5Ãð”1ÃpÁ4ÃÐ@2Ãt=ð!?ÃPö3Ã-4ÀY7Ã@ ?Ãð‚4Ã07ÃàI7Ã@·7ÃÀ 4à 3ðu1ÃÐ:3Ãñ9Ã'5ÃPä6Ãàð0ÀS8Ã@=Ã09Ã0 8ö2Ãз3ÃÀ–2Ãp86Ã÷<À_6Ãï/Àî3à¿3ð/à¹4Ã09Ã`¦2ÃpV1Ã0´1ÃÀ3Ãн2ÃÝ2ði3à06Ãб4Ã@<Ã@±8Ã4Ã3ÃÐÉ0à i7Ãð‚4ÿ7ÃPÆ;Ãà¢=ÃÐÉ0À7Ã!6Ã@í.Ãз3Ãp;Ãp©8Ãðù5ÃÀ„5Þ2ðì2ÃÐÛ-ÃÐ^-ðÔ6Ãðp7Ã4àÅ2Ãð‚4ÃP‹0Ãз3Ãàö/à þ3Ã0º0ÃðŽ2àT0Ã3ð/Ãð 3ðc4Ã`¾.ÃÀœ1Ãðš0à`.Ã`”5Ã@·7ÃàÞ3ÃÂ0Ã0–6Ã`ç<ðK8à=ÃÀ5Ã09ÃðÛ:ÃP[8ÃPg6ÃP0ÃPü2à 1Ãðó6à 6à¿3ÃP,+ðc4ÃàÆ7Ã`4Ãðv6Ãðp7ÃÀ2ÃÐL0Ã5Ã@É4ÃK/Ãpß/Ã?1Ã071Ãàä2Ãf1à ò5à§7Ãð|5à 6Ãð 3ÃÐ:3Ã@d0àN1ðÚ5ÃÀx7Ãpý*Àâ5Ã0Ì-à×/Ãðÿ4ÃÐR/Ã-4Ã`²0Ãðp7ð¼:Ãðó6Ã5Ã-4ÃŒ5ÃT4ÃàÌ6Ãн2à 3à 1ð/ÃÈ+ÃPy3Ã@±8ÀÜ6Ã0%4à þ3ÃpD4Ãðÿ4Ã'1àx*ÃðG)Ã`²0ÃÀ„5ÃZ3àÝ.Ã92ðc4Ã’4Ã’4à<4à¿3à “0Ã92ÃÐWCÃpÓ1ÃpÍ2Ãðÿ4Ã0´1Ã0®2ÃÀ2àl,Ã0U,Ãé0ÃÐÛ-à`.Ã-à³5ÀÜ6ÃpD4À0àÅ2ê4Ã0Ì-Ãp>5ÃE0à 1à 0Ãð#/Ãð¾*Ã0Ì-ÃpV1À}1ö2à<4Ã@í.Ã0´1àÝ.Àè4ÃàØ4ÃE,ðo2ðò1àÅ2ÃàU5Ã0¨3Ãl0ÃÐF1ÃÐÃ1Ã*àŠ'Ã*ÃÐÃ1à ".ÃpÁ4Ã`¬1Ã`A.ÃpÙ0Ã@:7Ã@É4Ãpb/Ãà,ü1Ã`”5Ã-4à$8ÀÜ6à þ3Ã@R3ö2Ã@ÿ+à Ÿ.ÃÐÛ-Ã@ÿ+Ãð²,Ã`Ä-Ãl0Ãð¦.à`.ÃÀ–2À}1ä1ÃÀœ1Ã0%4Ãðš0ÃÀ2àÅ2à`.àN1à¿3Ã0œ5à i7Ã],Ä,Ãpñ,à 3Ã`¬1ÃÐ9Ãàö/ÃÐÕ.ÃÀ%0ÃÐR/àÝ.Ã`¸/Ãàö/Ã@p.Ãð5,ÃpÓ1Ã`Ð+Ãi*Ãð¦.Ã5ÃЫ5ÃÀõ7à þ3ÃP2Ãàs0ÃpP2ÃpÇ3à Ÿ.Ãã1ÃPa7Ã`²0à Q;àl,ÃÀ7-Ãl0Ã5à¿3à «,ÃpJ3Ã!2Ã0¢4ö2à ™/Ã@Û1ÃP‘/Ã`#3à ‡2ðE9ÃÀ3Ã`50ÀÜ6ð9;Þ2Ãðš0Ãн2Ã@^1ÃÑ4Àw2ÃÂ0ö.Ã`Ä-à “0ÃàÒ5à`.ÃÀI*ÃÀC+Ãõ.à 1Ã0Ò,Ã05Ãã1Ã@á0ÃÀr8ðu1ðu1Ã×3Ã'5Ã`50Ê+Ãð;+À$+ÃPü2ÃÑ4Ã`¾.Ã`_)Ã0®2ðu1Àw2Ã012ÃP1ÃÐ:3Ãl0Ãð#/Ã@í.ÃÀœ1ðÚ5Ã!2àl,Ãû-Ã`Ê,ÃP -ÃàU5ÀS8à 1ÃÐÉ0À.Þ2Ãн2à ·*ÃÐp*Àw2ðK8ÃàI7Ãðó6ÃPü2Ãð/-À_6ÃàC8ÃÐ@2à 0Ã3/Ãàö/Ã`50à ‡2àÅ2à*7ðQ7Ã0„9Ã@F5ÃÀ2Ã@F5ÃÐ"7Ãp&9Ã3ö2ÃÀ–2Ã?1à “0ÃÀ1Ãàü.ðþ/Ãp\0ÃpÍ2Àî3Ãðá9ÃП7Ã0´1à³5ÃðÛ:Ãã1àZ/Ã@á0Ã8Ã0I.ÃÔ-Ã!6ÃPm5ÃP/ðW6À²=Ã@X2Ã@X2ÃÀï8Ãà®;Ã05ÃpV1Ã0~:Ã@½6à<4Ãàº9Ãý;Ø3ÃPU9Ã@·7ÃðÕ;ÃÙ=à ò5Ãà®;Ãp—;Ãà–?à¡8ÃPU9Ãn:Ãàm1ÃPm5Ãp,8ÃP…1Ã7ÃPg6ÃÀû6Ãðÿ4à ‡2ð°<ÃàÆ7Ã`ÿ8ÃpJ3àÑ0Ãp©8ÃÐ:ÃÀ`;ÃðL=Ãpµ6Ãë:ÀG:Ãß<Ãp&9Ãt=ÃÐø=ÃÐ:3Ã0:ð-=ÃÐu>Ãà@Ã9ðÎ7ÃÐ44Ã05ÃÀ 4à•:ÃÐ{=Ã@½6Ãðv6ÃàO6Ã0+3à :ÃPö3ÃàÀ8à9Ãб4ÃðŽ2ù8ÃB7àË1ÃÀŠ4ÃÐ.5ðQ7Ãp—;Ãб4Ã`;/Ãàº9ÃÀã:Ãðù5Ãàº9Ã0 8ÃàU5à›9Ã@>à c8ÃÀÝ;Ã$<Ãp :ð¼:ÃPy3ÃPm5ÃГ9Ã0`?Ã?Ãðp7Ã@(:à æ7Ãn:Ãý;Ãp>5ðÚ5Ãp&9à;Ãà+<Ãðv6Ãð 3ÃPö3Ã@=ÀS8Ãðp7à 1ðW6Ã`ˆ7À²=Ãå?Ãp,8ðK8Ã÷8À7Ã@½6ÃPØ8ÃP[8Ã0x;ÃÀf:ÃPÆ;Ã`4Ãp,8ù8ð°<Ãðp7Ã0®2ÃÀû6ÃÐ.5Ã`8Ãà1;Ã7Ãà¢=à ¶?À²=ÀÜ6ÃÀZ<ÃPÞ7ÃÀû6Ãðp7À)?ðE9Ãðj8ÃÐ:Ãp¯7à ]9ÃpÓ1ÃPy3ÃP[8à­6Ãðó6ÃàØ4Ãðp7à¡8Ãà7:à›9ÃÐ ;Ãb<Ã@:7ÃÀr8à 6ðc4ÀÜ6Ã`5ÃÀ„5à È<ç;ÃàU5Ãß<ÃPÒ9ÃÐ:ÃË5Ã@48Æ:Ãð‚4Ã69Ã3ÀÄ:À¾;Ã` 7Ã@·7ÃðÉ=Ã`6Ã09ÃÐ<Ã69ÃÀZ<ð¼:Ãp‹=ÃЙ8à$8Ãë:Ãðá9Ãðp7ÃÐ"7ÃГ9ðE9Ã0Š8Ãб4í:à Î;Ãðÿ4Ã@«9Ã@";ÃÀÝ;ÃàÒ5ÃÀï8Ãàê1Ã`ÿ8Ã07à :à*7ÃÐ ;Ãð).ðì2ÃÀZ<ÃpP2Ø7Ã@¥:Ã69ÃPð4Ã@Ã5Ã0–6À;<ÀS8Ã06ÃpP2à¡8à c8à u5ÃÀ6Ãp86ðÎ7ÃP[8À7Ãp¯7Ã!6Ãð4à «,ÃP[8Ã`8Ã0û:Ã`‚8ðæ3à o6ÃK/à E=Ã0Š8ÃàÆ7Ã0¨3à 1ÃpÁ4ÃÀ5Ã0+3Ãp»5Ãp27à9ÀÄ:ÃÐ44Ãàm1Ã'5ðæ3ÃÐ9Ã`ù9Ã`ÿ8ÃÀ 4ÃPs4à:ÃðŽ2ÃП7ÃpÇ3Ã'1à <Ã7Ã@d0Ã0~:Ãðj8Ã`5Ãðj8Ãp=à Q;ÃN5Ãà-ÃË5Ãàü.Ã@R3à 6ÃPy3Ãàm1ÃPy3Ã@Û1ÃPÞ7Ø3Ã0–6à³5Àk4à 2ÃÐ.5Ãß<ÃÀr8ÃÑ4ÃPO:ÃÑ4à 0Ã×3ü1Ã`d=ÃÀl9à¡8à i7Ãp—;Ãp?Ã`5Ãz<Àè4Ã0f>ÃÐ8Ãð 3Ã`|9ÃPä6à i7ÃÐX.Ãб4Ã@R3Ã@48ÃP2Ã05Ãð 3Ãp©8Ã0 8ÃP2à Ÿ.ÃP2ðÂ9à Ô:Ã@ç/ÃQ.Ã4ÃàÞ3Ãý7Ãp>Ãðí7Ã`‚8ÃÐ@2ÃÐÕ.ÃÀr8ÃPö3Ãl0ÃÐ44ðà4à 2Ã0À/à*7ð]5ÃÝ2ÃPü2Ê+ÃЫ5Ãpñ,ÃpD4Àk4Ã05Ãð.BÃ@uBÃBÀ5=Ã?Ã?ð!?ÃÀ 4ðø0ð]5Ãpb/Ãðš0ÃZ3ÃÀ3Ã3Ã`”5Ã`8ÃÐ9Ãðd9Ã05Ã0º0ÃPy3à§7ÃÀH?ÃPU9Àú1Ãàs0Ã0º0Àq3ÃN5ÃÀx7Ã0x;Ã`4Ã@@6ÃÀõ7ÃP[8Ã06Ø3Àô2ÃàU5Ã@L4ÀÖ7ÃÀ5Ã0¨3à 3ÃÀ5ðþ/Ãày/ÃpV1à 3ðþ/ÃpÇ3ÃÀ~6ðà4ÃÀ1.ÃàÞ3Ã071Ã4ÃðŽ2ðc4Ã`ˆ7Ã92Ã'1à /ÃÂ0Àî3Ã@Ã5à :ÃZ3Ã@Õ2Ãàê1ðò1Ãàg2à³5Ã0é=ÃÐ.5Ã92Ã@48ÃÀŠ4Ãë:Ã0º0Ã05Ã` 3Ãp»5Ã05Ã06Ã<8ðW6Àè4Ãà[4Ãб4Ã`²0Àè4Ã-4ÃП7Ã`ù9Ã0®2À_6Ãн2ði3ÀÖ7à65Ã0º0ÃÐF1ÃÎ.à <Ãp<Ã@";ð]5Ã` 7ÃàC8Ãp27à i7à¡8ê4Ã0õ;Ã0û:à65Ã`²0à<4ÃàÌ6ðÚ5Ã`/1Ãë:à•:ðQ7à W:ÃPg6Ãà®;ðc4ÃàØ4ÃÀ~6Ã5ðc4Ãp&9ÃPê5Ã`8à§7ÃÐ8Àe5Àk4ð-=Ãðv6À;Ãp©8Ã@±8Ã@É4ÃÀr8Ãà[4ê4Ø7Ã0%4Ã69à à8Ãñ9à›9ÃÐ:à <à Ô:ðÂ9Ã`2Ã’4Ã0x;Ãð^:ð¶;Ãà=9ÃÀõ7ÃB7ÃðŽ2àB3ÃðX;ÃðÛ:ÀÊ9à à8ÀY7ð3Ã@d0Ã'1Ãðç8ÃÐ8ÃB7ðò1Ãp :ûBÃ!2Ãp;Ã07Þ6à¡8Ã0:Ã@Û1Àk4à¿3ÃÀ2ÃÀ6Ã8Ã8Ãp<Ãð^:Ã7ÃÐ¥6ÃÐ:Ãp=ÃÀõ7Ã$<Ã@‡?ÃÎ.Ã÷8Ãpß/Ã07Ãðš0ðK8ÃpP2Ãà[4Ã`|9Ã`#3ÃÐR/Ã`Û>à c8Ã` 7Ã<8àT0Ãàö/Ãà1;ðE9à ì6Àe5ÃÀx7Ã7ä5Ã'5à È<ÃP/ðà4ÃП7ÃPÒ9Ã0Š8ÃÀf:ðà4ÃÀ~6Ãðˆ3Þ6ð9;ÃP==Ã0–6Ãp86ÃP1Ãt9à¡8Ã`Ž6à³5ÃpÁ4Ãn:Ø7ÀM9ÃàÒ5ðæ3Ã@d0Ã7Ãp86ÃÀf:ðÚ5Þ6ðÚ5àN1ÃàÆ7ê0ðÚ5ÃE0Ãð”1Ãå;Ãð).à “0À1ÃpJ3àT0Ã÷8Ãà¢=Ã@<ÃË5Ã@á0Ã@d0ÃÀ¢0ä5Ã0~:Ã`v:ðÎ7à u5Ã3/Ãðó6Ã5ÃPÞ7ÃË5Ãð‚4Ãp>5àB3Ã`_)Ãàg2ÃP2Ã@Ã5Ã0~:À5=Ã`2ÃP-àN1Ãà…-ÃË5Ãà[4ÃÀ~6ÃðŽ2ðÎ7ÀÜ6Ã@L4Ã!6Ãð4Ã0¢4Ãð#/ÃÐF1Ã` 7ÃÀ3à­6Ã05ÃÐ(6Ã@^1Ã4Ãðó6ÃÀé9Ãàs0ÃÀœ1Ã@48Ãðí7Ãp,8ÃЇ;ÃPI;Ã05ÃË5Ãà%=ÃÀ6À1ÃÂ0Ã`5ð/Ãé0à þ3Ãã1Ã0Æ.Ã33ÃÐÏ/Ãã1à à8ÃЙ8Ãz8Ãpµ6Ã0®2Ø7ÃÀã:Ã0 8ðu1Ã0¢4Ãàa3Ã5Ã0–6à ø4ÃP£,Ã012ÃðŽ2Ã÷8ÃàC8àB3Ãðp7ÀÜ6Ã`6à 6ÃPm5Ãë:ÃÀx7ÃàU5ÃPä6ÃZ3Ã0„9Ã4à³5ÃPö3ðQ7Ã@";ÃÀï8Ãpµ6Ã@j/Ã@.9àB3Ã@F5Ãðÿ4ÃÐ"7ÃÀl9ÃÀ¢0ÃÅ6à ò5Ãðÿ4Ã4ÃÀf:ÃÀ 4Ãà=9à þ3ÃÐL0ÃàO6Ã0Š8Ã`ÿ8Ã`;/Ã0´1Ã`8Ãl0Ã`š4à¡8à¹4ÃpÙ0ðE9ÃàÌ6ÃÂ0ÃàÆ7ð9;ÃPI;à {4ð3Ã0+3Ãн2Ã0¢4Ãàa3Ãà[4ÃZ3ÃàÆ7ÿ7Ãð1ÃpÍ2Ã071Ãðˆ3Ã4Ã!2ð?:Ã0:ÃB7à¡8Ãt9ÃÀ5Ãðp7ÃÀŠ4à 1ÃŒ5ÃÀœ1ðÔ6ÃpðAÃpy@Ã0 8Ã06ðì2ÃK/ÃPm5ÃÐ.5ÃH6Ãñ=ÃÐ44Ã-0Ã0¢4ÃàÀ8à¡8Ã0„9Ã@Ï3ÃÅ6à 9?Ãn:Ã3à 3Àî3Ãàö/Ãð”1Ãðp7à*7ÃÐ<ÃÐ.5ÃPü2Ã`ˆ7Ã@¥:Ã0®2ÃB7à ì6Ãß<Ã@.9Àe5à Î;Ã\=Ã`ˆ7ÃH6ÃÐ¥6Ã-4Ã`ˆ7Ãà´:Ãб4Ã`50Ãð^:ðc4Ã`8ÃÐ"7Ãp&9ð/ÃÀ®.Ãðÿ4à³5ç;Ãð”1Ã9Ã`|9ÃÐ:ÃðL=Ãf1à ‡2Ã0ï<À_6Ã`50Ãp,8ÃÀ6À;ÃЇ;Ãðÿ4ÀÐ8ÃÐ<ä5Ã0–6ðÚ5Ã@á0Ã`M,ð-ÃË5ÃP2Ã0¢4à Ú9à 3Ãð‚4ðo2Ãðÿ4ÃàO6Ã` 3Ã`;/à 1Ã7à¹4Àî3Ãàa3à i7àÝ.ðò1ðÚ5Ãàs0ðò1Ã0–6ÃàÌ6ÃE0ÃàØ4ÃÐ(6Ãð‚4ðò1Ãp\0ÃÀ5ÃðG)ÃÐÏ/ê0ÃЙ8Ãl0ÃÀ6Ã@F5Ã@L4ð,ði3Ã0Ì-ÃÐÉ0Ãz8ÃPü2À_6ä5ÃpV1Ã`¸/à¿3Ãpn-Ã÷<Ãà=9Ãð0ÃPs4ÃP…1à ì6Ã071Ã`š4àN1Ã@Û1Ã012ÃH6àl,ÃQ.Ã@Ï3ðÈ8Àú1ÃP0Ãн2Ã!2Ã@:7ÃàÒ5Ã`4Ã@@6à•:Ã` 3Ãp :Ã@@6Ã92ÃP.ð+Ãð|5Ã'5Ãз3Ã!6ÃàÞ3Àw2à06ÃÂ0ÃpÇ3à æ7ÃpÙ0Ã!6À‰/ÃÀ–2ÃÀ3Àw2Ã`4ðþ/ÃÀ3ÃZ3ÃÅ6ÃPa7Ã05ðo2ÃÀ3Ã012Ãã1Ã*ÃÐL0Ãð2ÃÐL0Ã@Û1ð/à`.à 1ÃÀ1Ã@d0Ã`/1ð-ÃÐÃ1Ãp27ÃÀœ1Þ2Ãàö/ÃP-ðÚ5Ãð‚4ÃÔ-Ã`²0ÃÀC+Ã0À/Ã`#3Ãð 3Ã0 8Ãð”1à ò5Ã0¨3ÃT4ÃN5ÃPs4ðÚ5Ã0û:ÃÀœ1Ê+ÃàÞ3Ã` 3Ã-0Ã`Ü)Ã`2ðo2Ã`2ÃÐÃ1Ãð|5À}1Ãpz+ÃÀ3à*7ÃÐF1ðæ3ÃÀ7-Ã`5à65Ã0C/ÃT4Ãàü.Ãà-à³5à*7ðW6ÃàØ4à ‡2ðø0Ã@Ã5Ã0º0ö.Ãàs0À•-Ã-4Àk4ÃÀ1Ã3/Ãà-Ã?-Ã0¨3ÃÐæ@Ã`²0Ã92Ã`Ê,Ãpn-Ãx.ÃP‘/Ãð).Ã@ç/ÃpP2ÃÎ.à “0ÃÐ@2ÃpJ3àT0Ã012ÃÔ-ð{0Àâ5ÃpV1ÃÐ@2Ãû-à (-à 0Ã`Ä-Ã`#3ÃÀû6ðø0à9Ãð2ð{0ÃÐÃ1ÃÝ2Ã8ÃP—.ÃÀ®.ÃÀ~6Ãб4Ã@X2Ã@48ÃPê5Ã0¨3Ã'5à;Ã0¢4ðÚ5à06Ãð‚4Ã33Ãpë-ð3Ãpn-Àè4Ã`ˆ7ð/À}1Ãf1Ãp>5Ãðj8Ã0„9ÃÀ–2ÃPö3Ãpë-Ãð/-Ã-4ÃÐ¥6ÃpD4ðo2ÃP1Ã`‚8Ãp :à 2ÃÐj+à¹4àÅ2Ã0%4Ã0%4Ã@Õ2ð .Ã@í.Ã`/1Ãàö/Ã33ÃpV1Ãð /Ãx.Ã@á0ð‡.Ãз3ÃÀ´-ÃpP2Ã5Àú1ÃÐ.5Ã`8à 3ÃàØ4Ãpµ6Ãð#/ÃÀœ1ÃPy3ü1ÃÅ6Ãà-Ãõ.Ãp27Àk4àN1Ãà.Ã`2Ã@L4ÃË5Ä,ÃðŽ2ÃÑ4Ã`¸/Ã` 3ÃpD4ÃÀ„5ö.ÃÀœ1Ã`v:Ã0Š8ÃÀ5ÃÐÛ-ðu1Ãàö/Ã0–6Ã07Ã3à þ3ÃÐ.5Àe5à06Ãðó6à§7Ã@d0ÃÀ3Ã012ÃÀ6Àk4Ãàa3à 3ö2Ãl0Þ2ÃË5Ãpn-Ãl0Ã`6ð{0à×/Ãà‹,ð-Ãà‘+ê0ä1Ø3ÃÀœ1ÃP—.à 1ÃÀ3à ‡2ÃГ9ðæ3ÃZ3Ãpß/ÃÐ.5ÃPð4Ã`5à¹4Ãà…-ÀÜ6à¿3ÃÀ1Ãày/Ã`¸/à 3ÃpV1à þ3ÃÀ¨/Ãpß/ÀÜ6ÃÀx7ÃT4Ãð1Ãàg2ÃPs4Ãàs0ÃÐ:3Àè4Þ6ö2ÃÐ@2Ã33Ãð|5ÃÂ0Ãx.Ãï/Ã`Ö*Ãé0ÃÀ1.Ã@ù,Ãð”1àZ/ó9Ã@í.ÃÐ^-àã-à ".ÃpÍ2Àâ5àÅ2ÃÐ44ÃàC8Ø7Ãt9à­6Ã'1à à8à 1Ãðÿ4ðæ3ð9;Ã33à È<ÃÀ 4Ã@·7à65Ã`ˆ7Ã@½6ÃàI7Ãðv6Ã5ÃàI7Ãðˆ3ÃB7Ãp>5Ã@í.ÃÐ¥6Ãðç8ÃË5Ã06ÃÀï8à c8ÃPU9ç;Ã@R3Ãp»5Ã`ÿ8Ã`¦2ÃÀ`;Ã`/1í:ðo2Ã@48Àk4à06Ãp<à;Ã0f>ðQ7ÃàÒ5ÃPê5Ã*;Ãp=Ã`^>ðÔ6ðà4ÃЇ;àN1Ãpß/Ã0û:Ã`ˆ7Ã`”5Ã0~:ÀÄ:Ã0x;ÃÐ8Æ6ÃàU5Àè4ÃàØ4ÃÐR/Þ2Ã@F5Ãý7Ãàº9à ø4Ã0„9à 6Ã`ˆ7ðÔ6Ãàg2Ãн2Àk4à Ô:ÃÐ8Ãàä2Ã0®2ÃÀ3ÃÀ3Ãð 3Æ:ÃpÁ4Ã@<ÃàU5Ã@@6Ã'5ÃP2Ã@±8ÃàÞ3Ãð^:Ã×3ðK8ð¶;ÃP2Ã0:ÃÀõ7ÃE0Ã012Ã÷8ðà4ÃPä6ÃàU5ðÈ8Ã07Ãð”1Ø7Ã4ÃÀx7Ãðí7à æ7ÃPy3Ãp£9Ã7Ãà–?Ã`LAÃt9Ã@X2Ã`”5À²=Ã-4Ãp>5àú>Ã@48à à8Ãðç8ÃPÞ7ÃN5Ã0 8Ã'5à³5àZ/ÃÀï8ÃàI7ÃàO6ÃpÇ3ÃP/à¹4ðE9Ãðv6Àk4ÃPÒ9Ã÷8ÃÀ„5ð3à¡8à Q;Ãðç8Ã@Ï3ÃP.ÃT4ÃÀ6ÃÀû6Ãàö/Ã012Ã0+3à {4Ã`š4à à8Ãàê1Ã8Ãpn-ÃÀ 4Ãp,8Ã3Ã@48Ãð 3ðQ7Ã`8Ã×3Ã0–6ÃÑ4ÃЙ8ÃÀ¢0Ã7ðQ7Ã`š4ÃÀ 4À /à}>à§7ðà4à u5ÃŒ5ÃPê5ÃpÇ3ÃPÒ9ÃŒ5ðþ/ÃPs4Ã0À/ÃÐ¥6Ã!6Ãã1Ãàa3Ã`ù9ÃPð4Ãб4Ã@48Àƒ0ð¼:Ã@>ÃPü2Ã`4Ã@Õ2Æ:ÃpJ3à “0Ã`¬1Ã33ÃÀ„5Ãf1À7ÀM9à¹4À_6ÃÐ.5ÃPä6à:Ã@X2Ãàê1Ã@«9Ã@";ÃÐ"7Þ2Ã×3à}>Ã@™<ÃÝ2Ã3ÃÀõ7ðo2ÃàÆ7Ãp&9à ø4à9Ãpö@ÃË5Ã06ÃH6À‰/Ãàä2Ã@.9ÃP[8àË1Ã0¢4à 1Ãp,8ÃÀ+/àB3Ø3ÃP…1ÃàU5Ø3ö2Ã@^1À5=Ãðí7Ãðˆ3ÃP…1Ã0À/ÃPê5Ã×3Ã`#3Ãp27Þ2Ã`#3à æ7ÃÀû6ÃK/ÃN5à<4ÃðŽ2Ã4Àè4Ãp27Ã0 8ÀÖ7ð]5ðø0Ãp»5Ã0–6ÃàÒ5Ã!2Ã0¨3Ã@½6À_6Ãå;à 2Ã@|,ÃÐ9Ã@.9Ã`d=À/>Ã!6ÃPÒ9ÃÀ–2Ã`¦2à$8ä1Ã07ÃàO6À7Ã`‚8Ãб4Àî3Ãp>5Ãp>5Ã7ÃN5à;Ã=Ã*;Ã@±8Ã'5Ã0º0ð{0ÃK/ð¼:ð¼:À;<à•:Ã`5ÃÅ6Ã*;Ø3ðE9Ã`”5Æ6ÃÐþ<Ã0+3ÃH6Ã0û:Ã`8Ãñ9ÃPÆ;àƒ=Ã0+3ÀÐ8ÀA;Ãß<à æ7Ã-4Ã’4ÃÐ"7ÀY7ÃЫ5ÃÑ4Ãp,8À;à­6Ã@Õ2Ã`”5Ã`”5Ã÷<Ãp,8Ã8ÀG:Ã07Ã`v:Ã@48ÃPÞ7ÃPØ8Ã0+3Ãã1ÃN5ÃП7ÃÐ:3Ã÷8ÃPg6ÃŒ9Ãðá9Ã33ÃàU5Ãð@?Ãt=Ã@.9Ã!6ù8ÃÍ?Ã;à Ô:Ãб4à Î;ÃÐ:ÃÀÝ;Ãp<ÃÀû6ÃPö3ÃЫ5ÃPä6ÃPä6ÃЙ8ÃðÕ;ÀS8ðc4ù8à :ði3à65àú>ÃÓ>ÃÐ9Ã9ÃÀ2ÃPð4ÃÀ~6Ãðd9ÃÙ=ðÂ9Ã@@6Ãt=Ãðÿ4ÃÐ(6ðu1à•:ÃÐ:ðÚ5Ãðv6à­6à ò5ÃÐ8ÀY7ÀÄ:Ãh;à›9Ãà?ð¼:Ãðÿ4Ã?1ê4Ãp©8ÃÀï8Ã3/Ãðó6à à8ÃÀ2Ã’4Ãàg2Ã0+3Ãpµ6Ã`š4à;Æ6Ã'1Ãàa3Ãб4ÃT4ÃpÍ2ðø0Ã`¸/Ãð).Ãp,8à 2Ã@R3Ãàm1ÃPg6à i7Ãp»5ÀÜ6ÃÐÃ1ÃT4Ãðç8à ]9Ã?-ÃW-ÃP…1à¹4ÃÐ44ÀÖ7ÃP2Ãp»5Ã*;Ãp¯7ÃàÞ3à 3ÃŒ9Ãð4à 3Ã0C/ê4Ã`;/ÃÂ0Ã`/1Àw2ð]5ÃPm5ê4Ã~-À­)ÃP8)ÃÀI*ð{0àZ/àé,ÃpÇ3Ã`5Ãé0Ã33ÃPê5Ãз3ÃpD4Ãð1ÃÀ 4ÃÐ44ðò1ü-Ãàð0Ãðÿ4ÃB7ÃpÁ4ÃÀ–2Ã4ðæ3ÃPö3ÃÀ5Ã0À/ÃPg6à i7Ãàg2Ã@F5Ãð2ÃP‘/à 1ÃÐÃ1Ã×3ü-Ã0´1ÃàI7àN1Ãp\0ÃÑ4Àq3à ò5ÃÀŠ4Ãàä2Ãr/ðæ3Ãp,8ÃP¯*à 3Ã`/1Ãr/Ãð0Ãð‚4Àè4Ã0À/à 1Ãf1Ãàm1Ã0À/Ã0C/ÃPy3Ãp‹=ù8ê0à<4Ã07ÃГ9Ãàm1ÃàÞ3ÃB7Ãð‚4Ã`¸/ÃðÛ:Ã0®2ðì2Ã`50Ã` 7À;<Ã0:ÃП7Ã0¢4à 1ÃB7Ãð‚4à³5ÃBÃAÀ;ÀM9ÃÂ0Ãб4à$8Ãðá9ÃÀõ7Ãp27à Ô:Ãàº9à à8Ã@½6Ãз3Ã9Ãб4à•:Ãn>À/>Ãàœ>à o6Ã`d=à Ô:Ã0é=Àk4Ãðp7àq@ÃÐø=Ã0r<ÃÀ6ðK8Ã÷8Ã@F5Ã0:Ã@¥:Ã@";Ã0Š8Ãà¢=Ã\=Ã0:ÃÀŠ4ðW6à ò5à³5ÃÐ:ÃÀõ7ÃàO6Ã`^>ðÎ7Ã`)2Ãà®;Þ6Ã@Ã5ÃàI7ðÚ5Ãp>5à<4Àk4ÃðÉ=à§7à³5Àî3Ãh;Æ:ÃÀ*Dà Q;Ãðv6ÃÀ6Ã06Ãð^:Ã@·7Ãðš0ÃpÍ2ðæ3Ã0œ5Àe5ÃàU5Ã69ÃV>à$8à à8Ãp£9ÀÊ9Ãp‘<ÃÐ ;Ã0x;à Ô:ðE9í:Æ:ÃH6ðÔ6à ò5Ã;ÃàC8ä5Ã0%4ðc4ðÂ9ÀG:Ãz8ÃÀ3Ãðù5ÃpÇ3Ãðÿ4Ãp»5Ãн2Àq3ÃPC<À#@ÃÀ„5ÃpV1ÃPä6ð?:ÀÄ:Ã07Þ6ÃàU5ÃàO6ðÈ8à @Ã@";ðÂ9Ã7à Ú9Ãðç8ÃPÞ7Ãð”1Ã07Ã-4Ã012Ãp>Ãðó6ð3<Ã0x;Ãà1;Ãp?Ã0 8Ã@@6ÃÀõ7à 6à o6à ]9Ã0l=Ã0r<Ã`á=ðK8ù8Ãp :ð°<ÃŒ5Ãð2à ì6ÃN5Ã7ÃŒ9ÃPO:à :Ã0:ðK8ÃÐÃ1ù8ÃH6Ãp86Ã*;Ã` 7ÃÀé9ÃÐ.5à ø4Ãp86ÃÐ(6Þ2Ã@:7Ã`ÿ8à;Ãð½?Ãt9ÃÐþ<Ã@Ã5ÃP…1à 2Ãñ9Ãñ9à ø4à ‡2ÃÐ8ðÎ7Ãp»5ðE9à:Ã@Ã5ÃÐ9à ‡2ù8à¹4àN1ÃГ9Àô2ÃÀ–2ÃÈ/Ãб4Ãp:à 6ÃpÓ1ÃàU5Ã@á0Ã@Û1Àâ5Ã<8Ãp27Ãðj8ü1Ã0Ì-ÃPö3Ã8À7ÃÀx7Ã@X2Ãp :Ãë:Ãз3Ã`;/Ã!2à 1Ãàä2Ã'1Ã@ç/ÃT4Ã`|9Ã8ÃÐ"7Ãðí7ðc4Ã@á0Ãðd9Ã`¦2Ãð‚4ÃàO6Ã69ÃÀÆ*Ã@Ã5Ãp86ÀÜ6Ã07ÃË5Ø7Àq3ÃàÆ7à<4ÃàÌ6Ã@É4à06í:Ãðj8Ã33ðæ3Ã!2ÃPö3Ãë:à65ÃŒ5Ãp&9ÃPð4ÃÀ3ÃðŽ2Àô2ÀM9Ãð”1Ãp\0ÃÐ"7Ãàð0ÃÀ–2ù8Ãp\0ö2Ã'1Ã`)2ð/ðÔ6ÃB7Ãàa3ðæ3Ãp\0à*7ÃÀ–2Ã012Ã@j/ÃÐ44ÃÐ44à*7ÃðÕ;ÃB7ÃŒ9Ã?1Ãð4ÃN5à Ô:ÃPm5ÃP1Ãàä2à 2ÃPI;Ø3à³5Ã0%4Ã@½6ðQ7Ã@p.ä1Ãð‚4Ãðˆ3ÃÐ@2Ãr/ÃÀŠ4ÃÀ5ÃÀ¢0Ãp86àB3ÃЫ5ÀÊ9ð/ÃT4ð+Ã<8ðÔ6ÃÐ8ÃÐÕ.ÃÀ3Ã` 7Àe5Ã`²0ÃPU9Ã@.9Ãà=9Ãàg2Ã@R3ÃpÇ3Ãð0Ãàm1Ã`5Ãpb/à$8ÃÀõ7ÃZ3Ãp»5ÃŒ5Àè4Ã@@6Ã` 3Ãàê1Ã-4ÃÀ 4ÃP/Àè4Ã`š4ÃP1àË1À-Ã-0Ã`”5ÀÖ7Ã@Ï3Ãð2Ã4Ãð1Ã0û:ü-ÃPö3ÃpD4Ã`A.ä5Ãàü.ðW6Ã`5ÃPð4à /Ã`)2àZ/Ãàê1Ã071Ã`6ÃpÁ4ÿ7ÃT4ÃPð4ði3à ¥-Ãà[4ÃE0ÃÀC+ðì2à Ÿ.ÃÀ%0ÃÐF1À}1Ã0C/à­6Ãë:ö2Ãf1à 2ðò1ÃÐ44Ã@v-Ãàö/ÃÀx7ÃP1à`.ÃÀ%0à ™/Ã33ö.ð3Ã07Ã0º0ÃpÍ2Ã~-À0ÃÝ2à•:À /À.ÃàÌ6ÃàÞ3ð .Ã0+3ð]5à æ7Ã],Ã0U,à ‡2Ã’4Ã@Õ2Ã0¢4à 1Ã~-Ãз3ðì2Ã@L4À›,Ãн2Ã0º0ðW6ÃÐ44Ãr/ÃÑ4à 1ÃPm5Ã4Ã`¾.Ã3Ãðá9Ã`š4ÃàÀ8Ãp£9ÃÐ:3Ã0–6Ã`ó:Ãð2àÅ2ÃpJ3Ãðÿ4ÃàÒ5Ã`5ðÚ5Ã`#3Ãð¦.ÃÀr8ÃÐ.5Ã0œ5Ã0´1Ãpß/ÃP1ÃPê5ÃpÇ3Ã’4ÃðŽ2Ã`¬1ÃB7ÃÐ9àË1à06ÃÀ5Ãð^:Ã@ÚFÃÐi@ÃÍ?à Â=ÃÐ8ç;Ãb<à§7ê4ðÔ6Ãð#/Ã@ó-Ãpb/à 3ü1ÃÀÑ=ÀY7Ãðj8Ãð1ð3à ò5ð¶;ð]5Ãàü.ð]5ö.Ã`¸/Ãàg2ÃPö3Ã33ð‡.ÃÎ.Ãð”1Ãðÿ4Ã92ÃP2Ãðš0ð-ÃpJ3ä1ÃÐ(6Ãðù5Ã`A.Àk4à ‡2à¹4Ã@Ï3ÃN5à‰<ÃàU5Ãà-ÃÐÏ/ÃÀ7-Ã`²0Ã×3Ã5àN1Ãã1ÃpD4Ã0¢4ÃÀ–2ðÚ5à×/Ã÷8Àq3Ãà+ÃàO6Ã33ÃÀõ7ÃPy3Ã@p.Ö)ÃÀ+/à 6Àî3Ã`ˆ7ÃÀ1Ã0C/ÃT4ÃÀ¨/ÃÐÉ0à u5Ãà®;Ãà[4ÃP2ðø0Ãб4àõ*Àô2à þ3à 2Ã3/Ãðš0Ãð‚4Ãû-Ãð0ù8à ò5Ãàö/ðo2Þ2Ã@á0ðà4ÃÐ:ð/À-ÃÐÃ1à ò5Ã69Ãб4ÃÐR/ÃÐÃ1Ã~-ÃÎ*ÃÀ5ðò1ÃPö3Ãð|5Ãp\0Ãp÷+àË1à ì6à06Ã5à þ3Ã@ç/Ã`ó:Þ6Ãàä2àÅ2à 3Ã`š4Ãàa3Àq3Ã0´1ÃZ3ÃÀœ1Ã@±8Ãf1ð .Ã0a*Ã@ó-Ãr/Ãðd9Ã-4Ã9.ð]5Àú1ÃpÓ1ÃÀ2Ãpß/à /ÃàÞ3Àô2Ãph.Ã`M,Ã`2à à8ÃPØ8Ã012À}1ð/Ãð‚4ÃÐ44Ãà…-à ½)à Ÿ.Ãpë-ÃÐá,ÃPü2Ã`¸/à F(à ".ÃP2ÃÐR/ü1Ã0y&Ãàê1Ãðù5ÃÂ0Ã?1Ã071ÃP.à ì6ÃPü2Ã`2ð .Ãàm1ÃЫ5ÃÐÕ.Ãð 3Ã@í.à ø4ÃÐ(6ÃÀ3ÃÀ7-ÃÐX.ð-Ãðˆ3Ã33Ã`G-Àq3Ãr/Þ2Ãl0ÃÀC+à (-Ãà…-ÃK+ÃE0Ãàö/À,Ã*ÃQ*à<4à×/Ãpz+ð™+Ã'1à`.Àô2Ãï/ðW6Ã`¦2Þ2Ã0O-Ãæ*Ãð5,Ã@ù,ÃE0Ãl0ÃP»(À³(Ã!2ÀÑ#ÃÐç+àZ/Ãà+Ã`;/ð()Ã!2ð/Ã0Ì-ÃK/Ã0g)Ã`A.Ãн2Ãàs0ÃP¯*ð,à ¥-ÃÐR/ÃÀ®.ÃÀœ1Ã!2ðæ3ù8Ãph.Ãð /ÃP…1Ã`;/ü1Ãàs0à (-ÃÀ3ÃŒ5ÃP.à ".Ã`Ü)ÃpV1Ã33ÃÐ:3ÃÈ+ÃÂ0Ã`¸/à`.à ¥-ÃP/ÃP2à¹4Ãpß/à ½)Ã0Þ*Ã`G-à “0ÃE0Ã~-ÃÐó)Ãpz+ðæ3Ã@j/àû)À.Ã33Ã`Ð+Ãày/ÃÐX.ÃZ3À**Ã@v-à (-ðò1à ¥-ÃÐÿ'Ã`î&à +Ãà‘+è&ÃÐv)Ãð²,ÃP—.Ã`Ž6À.àÝ.ÃÂ0Ãðp7Æ6àB3Ãàð0à&àŠ'Ã@ó-ÃP©+Ãpñ,ÃðÖ&Ãì%à «,ÃÀœ1Ãð/-ÃÐÉ0à)à–%ÃÂ0Ã@í.Ãpt,Ã0º0À¿&À-ü1ÃP©+àû)ÃÐX.ÃP—.ÃP1Ã0[+ÃW-Ã`S+àÝ.Ãð¬-Ãð¦.Ã4ü1Ã*ÃP -ÃP‘/à 4+Ã@á0Ãð2Ã-Ã@p.ÃP£,ÃÐF1Ã`;/Ã`Ü)ÃðG)Ã`è'Ãð”1ÃÐÉ0Ã@‚+ÃÐp*Ã0ö&Ã0[+ÃpÓ1ð .Ãà.àr+ÃÀ+/àZ/àõ*àT0Æ6ði3ÃK/ÃðÄ)Àq3Ã`M,ÃK/ð™+àï+àÑ0Ã@ù,Ãà…-àB3Ã@‚+Ã*Ã`Ð+Ãð0Ãàö/ÃpD4ð]5ÃÀÆ*Ãã1À.ÃŒ5ð‡.Ã0I.ÃÀØ'Ã,Ã`/1ÃK+Ãà.Ãà+àZ/ÃÀ3ÃÐj+Ãï/ÃQ.ÃP/À-ÃÐF1Ã@ç/ÃpÙ0à ±+Ãð”1Ãн2ÃE,Ã0À/ÃÐÃ1ÃÐ9ÃÐ@2Ãõ.ÃÐX.Ãp(àÅ2ÃË5Ãp86ÃPg6ðÔ6Àî3ÃPü2Ãl0Ã@ç/Ãr/ÃÀ¨/Ãp*àN1Ãàm1ð-à ¥-ð]5Ãàê1Ã@ó-Ã~-à`.Àô2ð,Ãð0Ã` 3Ã`¸/Ã0Ø+Ãð1à×/Ã@@6Ã@.9ÃÀ3Ã'5Ãã1ÃÐ"7à þ3Ã`Ä-ðò1àã-ÃpÓ1Ãpz+ðæ3ÃÐ¥6Ãn:ü1à`.Ã`5Ã@½6Ã@Ï3À›,Ãà,Ã0¢4Ãpµ6Ãõ.Ãpß/Ãý7Ã0À/ÃÀr8Ã@á0ÃÀ+/ÃÝ2àN1Ãð4ÃГ9Ãð|5À‰/ä1Ã`6ðÚ5ÃàÞ3ÃÀ®.àã-Ã`4Ãðe$ðþ/ÃP/Ãð¾*À1à {4ÃP0Þ2Ãàö/Ã@í.Ãà[4Ã`¦2Ã@Û1ðÚ5Ãð 3Ãð”1Ãàê1ÃpÍ2Ãã1ÃPa7ÃàÌ6Ãð”1ÃðŽ2à ]9Ãl0Ã`50à +Ã@ç/à65à «,À_6à {4Ã@v-ÃP©+à ø4Ã?1Ã'5Ãàð0ÃÐÕ.ðà4À}1ðì2ÃÀï8à 6ð-ÀÜ6à ™/Ãpn-Ã`¸/ÃË5ÃE0ÃÀœ1ÃpV1ÃP2à ".Ã@^1ÃÔ-Ãð /Ã7à ø4ÃÐF1à¹4à 1Ãð”1àÅ2Ã@á0ÃÐ8Ã`š4Ã0À/ð-ÃË5Ãð|5Àè4ð/àË1Ãý7Ãðù5Ãð /à à8ÃP2Ã`Ê,Ãï/Ãðˆ3ð .ÃÈ+Ãàð0ÃÐÛ-Àè4Ã0+3ÃÂ0Ãé0ÃK/à 3Ã@ç/À_6Ã3/ÃÀ–2Ã-4ÃpJ3Ã!2Ã@^1Ãx.ð/Ã0O-Ã`A.ÃÐL0ó9ðÔ6Ã@ç/àZ/à06ðì2ÃàÒ5Ãð¦.Ã`A.Ã0®2Ãð‚4à³5ÃÀ2Ã7Ãp\0Ã0Ì-Ãpµ6Ã@X2ÃP…1Ã@|,Ãðš0Àƒ0Ã`Ä-Ã9.À§*ð]5à­6à Î;Ã@^1ÃÀ2ÃðÐ'Ãày/Ãpn-Ãà,Ã` 7ÃðÄ)Ãþ&àN1Ã@Û1ÃP0ÃÐ@2Ã@á0ÃpV1à +Ã33Ã`M,Ãð5,ÃP,+Ã0=0Ãàs0à 2Ãàü.Ã@Õ2à ¥-Ã0I.Ã@p.Ã'5ÃPö3ÃpÍ2Ãp€*àË1Ãx.ÃðG)ÃÀ¢0Ãõ.Ã0Ø+à`.à Ÿ.Ã`ÿ8Ãx.Ã3/ÃÎ.Ãз3Ã`)2ÃàÞ3Ã@ÿ+à ½)Ã0C/Ãà—*Àî3Ãp÷+ð/ÃPµ)ÃÐÃ1ðo2à .,ÃW-ÀB&Ã0´1ü1Ãph.Ãà+ÃÐv)à ".ÃP»(àã-ÃÀÆ*Ãà‘+ö2ÃÀÌ)ÃN5ÃZ3Ãà+à 0à ™/À•-Ã0[+ÃÀ¨/À0)Ã0Ò,Ã@|,Ã`Ð+Ãà+ÃÀ¨/Ã0º0àé,Ã3/À.à ±+ÃÐÕ.ÃÀ7-ÃÀ1.Ãà*Ãp\0À-ÃP‘/ÃPü2Ãà-ð-ÃpÁ4ðu1Ãp÷+À¡+à 0ÃÐí*Ãð/-ÃP1Ã@#&Ã@X2ÃP—.ÃP‘/À§*ÃÐ^-Ãàm1ÃÀ3ÃP/àé,àï+Ãï/à ¥-ÃÐ@2Ãph.Ãð).ð“,Ãð /Ã`/1Ãб4Ãp(ÃÀ=,ÃÐÛ-Ã3/ð{0Ã,ÃP‹0ö.àã-À.Ã0O-Ã,À**Ä,Ã`;/Ãð1Ãpë-Ãàm1ÃP -Ã0®2ðø0ê0Ã@^1ÃB7ÃàU5ÃpÇ3àT0Ã0¢4Ã`¾.Àq3Ãð”1À /àl,Ãp>5ðu1à þ3ÃPê5Ãðó6ÃÀé9à;ÃpÓ1ÃÐ.5Ã0¨3Ã0r<Ã0Ý?ÃPÆ;Ã@L4ÃÐ¥6ðK8ÃðX;ÃðX;Ã09ÃPÞ7ÃÀ`;à E=Ã05ÃðÕ;ðÂ9à›9Ã`8Ã0–6Ãp£9ÃÀl9Ãà=9ù8ðQ7ð]5Àw2Ã0œ5Ãðá9ÃPÀ<ÃÀ×<Ø7Ã8ð°<ÃàÞ3Ãðó6Ã@.9à Î;ÃkEÃðó6ÃðL=ðž?Ã`ó:Ãðd9ÃPÞ7ðÈ8ü1À1ÃPÆ;Ã’8Ãà7:ðÈ8ðQ7Ãp»5ÃàU5à›9ÃÑ4ÃàO6À7Ã07Ãt9ÃàÀ8à§7ÃГ9Ãз3Ã`Ž6Ã`ÿ8ðà4Ã0Ò,ðW6À}1ÃpD4ÀÊ9À;<Ãà®;Ã<8Ã`í;ðÂ9Æ6Ãà%=à u5ÀG:Ãp£9àB3í:À¾;Ã@·7Ã@¥:Ãp,8Ãp¯7ÃpÁ4Ã@F5ÃàÆ7ÃPI;ÃðÛ:Ã@";Ãpµ6À;<Àe5ÃÐ(6ÃÐ{=Àâ5Ã06à>ðà4Ãðí7Ã@>à•:à¿3Ãð|5ÃÅ6à o6Ã0û:Ã`8À¾;Ã@™<ÃðF>Ã5Ãз3ð3<Ã@æDÃb<ÀY7à -AÃà AÃ>BÃà?à ]9ÃðÛ:à žCÃ2Dð€DÃP–CÃ`:DÃÐEFÃ8CÃà„BÃÀ0CÃP%AÃå;ÃÐKEà¾HÃà×IÃ@QHÃð¥Cð†CÃPxHÃÀHÃÐÈEÃÀ×<ÃpÞDÃeFðnGàî@ðzEÃðÕ;ÃÓ>ÃîDÃÐQDà †GÃ@ìCÃ`JÃ0$Ià5JÃ0Ã`ÃBÃÀÅ?à Â=Ã2DÉ@Ãð·@Ã@cEÃà×IÃÐÔCÀŽCÃàrEàâBðtFÃPBÀEÃà~Càî@àGGÃð™Eà ªAÀ @ÃÐÚBÃP¨@Ã0`?Ãà„BÃðF>Ãà~Cà žCàÊFÃP¢AÀŽCÃ?Ãð·@ÃpIHÃÐWCð!?ÃÐcAà !CÃÀ¡EÃÐWCÃð±AÃÐWCÃ0­Gà hLà GÃPŠEÃðF>ðAÃ06FÃ`FBð†Cà FàâBÃÀ`;Ã>FàèAÃÇ@Ã@þ@ÃP„Fà DÃAÃÀ­CÃ0`?Ãh;Ã0x;Ã0:Ãà–?ð9;Ãà–?ûBÃàÝHÃ}BÃ`R@Ã0ÑAÃ`:DÃqDÃ?ÃPFÃÀB@ÃJDÃ0ã>Ã&FÃPº=ÃPI;Ã`Û>Ã`@CÃðX;Æ:Ã09ðž?ÃÀ§DÃ`Õ?Ãn:ÃÐæ@Ã`±Eàî@Ã=ÃðR<Ãðù5Ã0f>ÃàlFÃ2HÃV>ÃÐ:ÃJDÃÀGðŒBÃpäCÃp£9ÃÀÑ=Ãð·@Ãp‹=ÃÀT=Ãp>ÃÀ­Cà FÃÐ]BÃ,EÃp‘<ÃÐ<Ã0x;à>ÃPC<ÃPÌ:Ã0û:ÃPº=Ã`X?ÃÐcAÀBÃPBð¤>ÃÀÑ=Ã`‚8Ã@@ÃÀÝ;Ã@™<ÃP1?Ãý;Ã`R@ÃPI;à:Ã`v:ÃÐ9Ãðç8Ã0Z@ÃÐæ@Ã0r<ðÂ9ÃÀ×<ÃPº=Ã`p;Ãb<Ã`‚8Ã>BÃ0x;à;Ã@ ?Ãð½?à W:Ã@™<ÃðF>í:ð¶;À5=Ãp=à*7à›9ÃÀÝ;À;<Ãß<Ãð½?ÃÐì?Ãý;Ã@48Ãð^:Ãà1;àú>Ã0Z@ÃðÕ;Ã0û:Ã09Ã\=Ã@þ@Ãp>ÃÀÝ;Ã0~:ÃPCÃ0Ý?à Ô:Ãà=9ÀS8Û=ó9ÃÀ×<à @ÃÀé9Ãðd9ÃÐ{=ÃðÉ=Ã`Ï@Ã`^>ÃPÒ9Ã0õ;ð˜@Ãb<ÀEÃŒ9ÃÐo?Ã` 7Ãðj8à ?>Ãp—;Ã$<Ã@:7ÃÀf:Ãà%=ÃÐ:ÃÀÃ@@Ã@‡?à <à à8Ã07Ã@=Ãñ9Ã`ç<à È<ÃPBÃðj8Ãðj8Ãå;ÃÀ~6ð'>Ã`ÿ8à¡8á<Ãàœ>à>Ãå;ÀY7Ã0é=ðà4Ãz8Ãà¨<àî@Ã`ÿ8Õ>ÃÐø=à}>Ã÷<ÃðÉ=ÃàÞ3Ãð‚4Ãå;ÃPÆ;ÃÐ<Æ6Ã0Š8Ã0ã>à <Ãñ9Ãà=9Ãà´:À;<à:ÃPÌ:Û=àÅ2ÀG:à•:Ã0Z@à;Ã`ˆ7Ãë:Ãà%=ÃÙ=Ã0ËBÀ;<à K<ÃðÕ;ÃPê5ðÎ7ð9;Ãà´:Ã@ ?í:à ]9ÃàC8Ã`4Ãà[4Ã`6ÃPÆ;ÃàÀ8Ãpµ6Ã`j<Ã?ÃàC8à i7à W:ÀY7À5=Ã@¥:Ã!2ði3ÃB7à c8ÃàÀ8Ãð2ÀÖ7ÃГ9ÃðF>ÃÀ 4ÃÀõ7Ãp<ÃÀã:Ãt9Ã@.9ÃN5ÃPy3ÃÀé9Ãà7:à à8Ã`8à Î;Ãz<ÃP7>Ãn:à§7Ã09ÃÀÝ;Ãp86ðì2ðì2ÃPü2Ã07Ã`Õ?ÃPC<ÃÙ=Ãp:ÃÐá,ÃÐ.5Ã`á=À¸<Ã`8ÃË5ö.ðQ7ðW6ðÈ8ÃðÛ:à æ7Ãð1ÃPØ8ÃàI7ð]5Ã9Ã`/1Ãp©8Ã`‚8ÃÀ 4Ã07Ãн2ÃPs4Ãà[4Ãðp7ÃPØ8à65ÃÀ¢0ÃÀ¢0ÃП7ÃÀl9ÃPÞ7Ã×3ðÎ7ù8ù8Ã07Ã0r<Ãà[4Ãàê1Ãðj8Ãp86ðÔ6ÃPä6Ã09ÃÀr8ÃÀf:Ã@½6ÃÀf:Ãàg2ÃB7à§7ÀÖ7Ã@48à þ3Ã`)2Ãp&9ð¼:Ã0:ðà4ð/ÃÀ„5Ã0I.Ãðd9ÃÀ¢0Ãàa3Ã`5ÃpJ3Ãðv6Ãðá9Ã7ÃÐ44ÀA;Ã’4Ã0:À‰/Ãp27à ì6ðÔ6ÃÐF1Àe5ÃÅ6Ã`”5ó9à¿3à ì6Ã0:ÃЇ;Àe5À;<Ãàä2ÃàÒ5ÃàÀ8ÃZ3ðo2ÃP1ÃpÇ3ÃPÒ9ÀÖ7à ì6ä5Ã@«9ÃÐ8ÃV>Ãà¢=ù8à³5ÃàÆ7ð]5ÃpÁ4ÃÐ¥6ðæ3àË1ÃÅ6ÀÄ:ÃÀõ7ÃÀ5ÃÀ1ðK8ðÚ5àÝ.ÃÀ3Ãðd9Ãå;ÃÀ¢0Ã’4À¸<Ãð4à à8à³5Ã<8ü1Ãp\0Ã0¢4ÃÐÃ1ÃàÌ6ö2Ã@d0Ã3Ã`”5ÃpÇ3À.Ãð1ÃÂ0Ã07ÃPê5Ã7ÃÝ2À;<Æ6Ã@Ï3Ãð^:Ã@±8Ã0+3ÃÀ–2à æ7ðà4ÃÀ¢0ÃÀ2Ã07ÃÀŠ4Ãz8Ãð‚4à 3ÃpÓ1ÃP1ðÎ7ÃZ3Ãðó6Ã`ˆ7Ã33Ã0C/Ã@ *àT0ÃÐ9ÃPö3À7Ã`¾.ÃK/Ãp¯7ÃpÓ1Ã@ó-Ãã1Ã@±8Ãàa3à ò5ÃàC8Ã` 3ÃÀ3Àâ5Ãðš0Àk4ÃpÓ1ü1Ã69ÃK/Ã0=0ÃÂ0Ãð¸+Ã0–6Æ6Ã`¦2Ãà-Ã`50ÃÀ¨/ÃÀ3Ãб4Ã0é=Ã012ÃÑ4ðu1ÃpÇ3À_6ð‡.ÃÈ/Ãà´:ÃpJ3Ã` 7ÀS8Ã0C/Ã'1ÃB7Ãp;Ã@48Ãð4ðø0Ã`ˆ7Ãpß/ð-Àî3Ã09ÃP…1Ãñ9Ãp :Àî3Ã`š4Æ6Ã`‚8Ã06à i7Àk4À_6Ãà-ÃÀû6Ãà+<ðK8ÿ7Àî3ÀM9Þ6ÀÖ7Ã@X2Ã?1Ãp\0àÝ.Ãpß/à 1Ãã1Ã`#3ÃÀ5Ã`/1ð'>à °@Ã@±8Ãàg2ÀÖ7ðø0Ãн2Ã×3À-ÃÐ:3ù8Ø3ÃH6à {4ÃP‹0à 1Ø3À•-à /Ã;à›9ÃPy3Ã06ÃÀx7ðÂ9Ã0:Ãðù5Ã` 3ÀÄ:ÃÀx7Ã`”5à ì6Ã0I.Ã@@6Ãðp7Ã!2Ãð 3Ã@É4Àe5Ãà´:ÃàÆ7ÃП7Ãðù5Ã@É4ÃÀ1Ã0´1ÃàÀ8Ã@";Ãðd9Ã@@6àB3à³5Ãð 3ÃPm5Ã012ÃPö3Ãp>5à i7Ã÷<ðæ3à›9ÀÜ6Ã69à Ú9Ø3Ãpß/Ã÷8ÃàI7ù8Ãpë-Ã0¢4ÿ7ç;À¾;ÃðŽ2ÃÀ–2Ã@L4ê0ÃÀÝ;Ãàa3ÃГ9ÃPO:Ãà¨<Ã0„9ÃàI7ÃÀ1.ÃZ3Ø3Ã`5ÃP.ÃÀ1.ðø0ÃàØ4à ò5ðà4ÃPÞ7Ã<8Þ2Ãб4ÃÐX.ÃP0Ãб4ðà4ÃÐ9Ãp\0Ã0œ5à ò5Æ6Ãp©8à Ô:Ãl0Ã` 7ðÂ9ÃÝ2Ã;Ã`4Ã`6ðø0à à8Ãðˆ3Ãðv6Ã07Ãð¬-Ãð4Ãàa3Ãð1Ãà=9ð/Ã@±8ÃÀ`;Ãðó6Ãð‚4Ãðó6Ãà[4Ãз3Ãï/ÃH6à¹4Ã0~:Ø7ð-à i7ÃN5Ãà[4ÃÐ(6Ã0®2Ãpn-ð/Ã`5ö2ÃQ.ÃPê5Þ2Ãðp7à 2à (-Ã0º0à ò5Ã!6Ãà=9Ãðv6Ã`G-à 3ÃË5Ãð /ÃÀ3ÃP2àN1Ãðš0ÃŒ5à ‡2Ãð¬-Ã`/1Ã0®2à “0ÃÀ 4Ã0C/Ã0%4Ã0%4ÃÐ.5Ãàü.Ãp€*Ã@Û1ÃPs4ÃE0Ãpå.Ã`2Ã?1À‰/ÃT4Ã@Õ2ÃÀ´-ê0àZ/à 3Ãpå.Ã@ç/Ãà…-ÃPö3Ãðá9ÃÀ 4à 1àx*Ãl0Ã’4Ãб4Ã<8Æ6à Ÿ.ÃÐÉ0Ãðÿ4Ã3/À§*Ãàs0Ãpå.àÅ2ÃÑ4ÃÐ9Ãp»5ð{0Ãf1Ãðš0ÃPg6Ã@ÿ+à ‡2à 3Ã0U,ðò1ðÎ7ÃÐ44àZ/ÃÐÉ0ÃPð4à “0à ™/ÃÐ¥6ÃPU9ÃPØ8ðc4Ãx.Ã`²0Ãà[4Ã’4à¹4ê4À_6Ã`²0àx*Àw2ðÚ5À•-Ãp27Ã`2Ãû-à 1ÃÐX.Ãà.À‰/Ãàö/Ãð‚4à «,à:ÃZ3Ã@p.ÃÈ/ð¥)Ã@ *ÃðÏ<Ã`#3Ãð2Ãàö/Ã@ù,ÃÂ,à Ÿ.Ãð1Ã`¦2à (-Ãpå.ÃP‹0ð‡.à 1À7ÃÂ,Ã` 3à ò5ÃÝ2à ·*à`.à ™/ÃP¯*ÃÐv)Ã@v-Ãб4Ã@^1à /Ã@^1àB3ÃÀ–2Ãðù5à 6à Ï&À$+Ã-à «,Ã%'Ãé0ÃÐR/ÃP—.Ãà‘+Ã@p.Ãð#/Ã`è'ÃÂ,Ã`A.ÃP&,ÃÀ1.ÃpŒ(Ã`G-Ãð‚4Ãз3ÃÐÃ1Ã*ð,Ã`2Àƒ0à 3ÃÐp*Ãð4Ã0¨3Ã`²0ÃP/à 0à ·*Ã@í.ÃP-Ã`Ö*Ã@Ž)ÃÂ0Ã@^1àõ*ê0ÃP-ÃÈ/Ã@+àÑ0ê0Ã9.Ãà )ðþ/Ã`Ð+Ãð”1Ã07ðc4ðª=àMFÃ0f>Ãý7ÃàC8ÃÀ3Ø7Ã`ÿ8Ã09ÃÐç+à$Ãp(Ã0%Ãày/Ãð‚4ÃpÍ2à³5ÃPU9Ãðù5ÃP2Ãàs0Ã@ç/àË1Ãð¾*Ã9.à @)Ãàs0àB3ÃPm5Ã@í.àZ/Ã@ÿ+Ã`A.ÃpÍ2Ã`/1Ã0–6ÃÀ5Ã3Ã@ˆ*Ã@L4ÃP&,Ã9.Ãð;+Ê+Ãð¦.àÝ.à×/àï+ü-ÃP1Ã'1ÃW-ðþ/ÃpÙ0Ã0Ì-ÃE,À¹'ÃK+ÃÐç+Ã3ÃP‘/ð‡.àÑ0ÃP…1Ãðš0ÃÀ3Ã` 3à (-À.ÃЫ5Ã×3ÃÐL0à þ3Ã0Þ*ÃÐŽ%Ãð²,Ã@p.ÃpP2ð-ÃÂ,Ã4ÃÀ3ð{0à¹4Ã'5ÃÐX.Ãð/-ÃP.Ã`¸/ÃpP2ÃÀ1Ã?1Ãàê1à ò5Ã@É4ÃðY&ÃÀÀ+Ã`A.Ãp>5ðo2ÃPä6Ã0%4Ã`Ü)à 3ÃPs4Àw2ÃÀ3Ã0C/Ãð0ÃÀœ1Ã33à06ÃpD4Ã`¦2àT0Ã@·7Ãð²,Ã@:7Ã@Û1ä1Ãàs0ÃPö3ÃÐí*Ãp†)à ±+Ãð”1Ãpå.à 0Ãðÿ4à³5Ã@ç/ÃÐd,àZ/ÃÀ´-à 1ÃpÓ1À-Ãð).ÃP‹0À•-Ãàê1ÃP/Ã`S+Ã0¢4à×/À0Ã0=0Ã@Ï3ÃpV1ðc4à ¥-Ã@Û1ð+Ã`Ü)ÃÐÛ-À /ð3Ã0=0Ã`Ê,ð"*à (-ÃP1à @)À-ÃÂ,àË1Ã0Æ.ê0Ã@ù,ÃÝ2À.à 1ÃP…1Ã@j/à ‡2ðþ/Ã`4Ãàm1ÃÀ1.À0Ã0¨3ð-=ÃÂ0à`.ÃÐÏ/Ã0Þ*Àe5àã-ÃÀº,Ãð¬-Ã0C/Ãph.Ãà+À0Ã0º0ÃpD4àÝ.Ã`²0Ã06à¹4ÃPö3ÃP-À.ÃÎ*à L'ÃÈ/ö.Ã@^1À‰/ÃPy3ÃP/À­)à :*à~)àœ$ÃÝ2Ã`/1ÃÐ^-Ãr/àÑ0Ã-Ãõ.ðþ/ðþ/Ã`Ä-ÃÐ44àH2ÃK+ðì2ÃP»(Ãð#/àã-Àè4Ã@X2Ã0C/ÃÀ%0ÃÀx7ÃÀ1Ã×3Ãp )ÃÀ2ÃÐÃ1ÃPê5Ãàö/ÃÐù(Ãpý*Ãàü.Ãà…-ÃÀ®.àZ/Ã0[+ÃP‘/Ãr/Ãï/Ã0%4Ã`2Ã0À/Ê+ð3ê4Ãð”1À-ö.à +ÃÐÕ.Ã`#3ÃÐ¥6Ãð2ÃÀ2ðì2ðì2ð .àr+Ãð5,ê4Ã`¬1Ã@p.ð]5Ã`#3ö2ÃpÙ0Ã012ÃE,à .,ÃpŒ(ÃPÍ%ÃÐj+Ã0x;à ø4Ãð¬-ÃÐÉ0Ã`/1Ã3/ðì2ðì2ÃpŒ(ÃÐç+Ãàü.Ã`¾.ÃÐL0ÃpÇ3ðo2Ãp\0ÃZ3ÃÎ.ÃÀU(à (-ÃÐá,Ã!2ÃÀ1à «,ÃÀ3ÃPö3Ã7Ãý7Ãð /Ãpå.ÃàU5ÃÀ~6Ã)Ãpñ,Ã@p.Ãi*ÃÀÌ)ÃPm5Ãà,Ã0ê(Ã0=0à ¥-ÃÐj+àZ/ðò1Ã@Õ2ð-Ãàä2Ãf1Ã06Ãû-à Ÿ.Þ2Ã`50Ãph.ÃÐ:3ÃÀ¢0àË1Ã`6ÃÈ/Ã0º0Ãð/-ðÔ6ÃPs4Ãp )ÃÀ=,ÃÚ,Ã` 3Àq3ÃÀ¢0Ã0º0ð{0Ã~-Ãpý*ð/Ãf1Àú1ÃpÍ2Ã`Ð+Ãð#/à 2Ã`;/À.Ã'1àH2ü-Àƒ0Ãc+Ã`”5ÀS8Ã`/1à ™/Ã'1ÃpD4àT0ÃÐ^-ÃÐ@2à “0ÃpP2Ãày/Ã@d0Ã@á0ðo2Ãp*ÃÐL0Ãã1Ã0a*Ã5Ã@ó-Ã@X2Ã@R3ÃK/Ã~-Ãpë-àÑ0ÃÐ:3à ™/Ã0+3Ã0g)Ã`_)Ã9.ðc4Ã!2ÃÀ2Ã071ÃÔ)Ãà…-ÃÝ2Ã4ð+Ãà…-Ã`;/Ãà=9ö.ÃÐÉ0ð™+Ã0U,Ãà…-àH2ÃP1ê4Ã?-Ã0ä)Ãf1ÃP/Ã`e(Ã@ç/Ã3/ÃÚ,Ã012à þ3Ã`M,Ãàa3Ãà-Ã0®2Ã`50à ì6Ã` 3àl,ðò1Ã0TAÃPØ8Ãb<ð/àÝ.ðc4Àè4Ã@R3ð,À_6à 1Ã0C/ÃÀ~6àï+Ã07ù8ÃàÞ3Ê+Àƒ0Ã33Ã` 3Ã`50Ã`M,Ã`¾.Ã@Û1Ã~-ÃÀŠ4à¿3ÃÐÃ1Ãû-ÃÐá,Ã~-Ãðš0à ø4Ãð1Ã0®2Ãp£9Ã` 3à ì6À.Ã`/1Ãï/Ã0®2à “0Ãà>í:Ãàa3à 2ÃÈ/Ãð /Ã`ó:Ãt9ÃÀ1àH2Ã4Ãð/-ÃP—.à {4ÃpV1Ã’8ÃÀ6Ã`50à ".ÃË5Ãà+Ã92ð]5à*7Ãõ.ÃE,ÃP…1à¹4à 1à «,Àú1ÃЫ5ÃÑ4ÃП7Ã9Ãàð0Ã05Ãàê1ÃPs4Ãt9Ãàü.Àw2Ã3Ã07Ã×3Ã*Ã0[+ÃàU5Ãðp7à {4ÃÐL0ÃP/ÃPð4ÃÅ6ÃÀ2à65ÃÐ@2ÃÐ:3ÃP2ÃÐÕ.Þ2ÃpÓ1Ã`Ä-Ãàð0Ãð²,ÃpÓ1ÃЫ5Ãl0Ãз3Ãà-à 2Ã'1Ã!2Ã`¬1Ãõ.Ãpë-ÃÐÃ1À0à ì6Ãð”1Ã0%4ÃàU5Ãày/ê4Ã5Ã@í.ÃZ3ðà4ÃàÒ5Ãz8Ã@í.ÃpP2ÃÐÃ1Ãp©8à§7ðø0Àî3Ãl0ÃK/ÃÀ1Ãàä2Ãð#/Ãày/Ã0¢4À•-Ãõ.Ãõ.Ãà+Ãï/Ãðá9à 6ðo2ÃÐá,Ãà-àÑ0Ã`6ö2Ã@ÿ+ÃÎ.ði3À**Ãà+à<4Ã-4ÃP1Ã`¦2ÃÝ2Ã0Ì-Àw2àH2Ã0œ5ÃÐÃ1Ã’8Àq3Ã`50àf-Àw2à /Ãpn-ÃP©+ÃÐÏ/À}1ðø0à 6àT0à 4+Ãpb/à06Ãàê1ÃÀœ1ÃàU5Ã4Ãàö/Ãx.ÃÀ1.Ã'1Ãðš0ð"*Ü(ðø0À,àB3Ãà…-Ã0a*Ãàö/ÃÅ6ÃÈ/Ã@á0Ãð2ðò1à þ3Ã*ÃpÓ1Ãð0Ã@p.Ã@á0À•-ÃP&,Ãpë-ÃÈ/ÃPm5ÃK+àã-Ã`¦2Àq3àË1ÃÎ.à 0Àô2Ãð5,Ã8ÃpÍ2ÃÎ.À§*à F(Ã~-Ãpn-Ã@í.à /ÃðA*ðæ3ði3À_6Ãð”1Àƒ0ðŸ*ÃÀ–2ðu1ð+ÃÎ.Ã`¬1ð]5à 2à ·*ð .Ã’4Ã0¨3ê4ðÔ6Ã`Ü)Ãàä2à ¥-Ãðj8ÃÀœ1ÃQ*Ã`²0Ã@ó-Ã@v-Ãé0ÃÀ+/à á#ÃÐÕ.à (-Ãà*Ãpå.Ã33À_6àB3Ãàä2Ã`¾.Ã@j/ö2Ãàê1Ãàs0ÃK/Ã0C/Ã@á0à /ÃpÓ1à “0Ã@á0ði3à 1Ãð1à ".Ã@p.ÃÐL0Ãpå.Àk4ÃpÍ2ÃP.Ãã1ÃK/Ã@R3Ãðd9ÃÀ1.ÃK/ÃÀõ7ÃPÌ:ÃPê5àË1ÃàØ4à*7ÃpÇ3Ãà.ÃW-ÃÀ–2ÃPg6Ãàê1à³5Ãàê1ÃÀ3ÃÝ2à 1ÃÀ¨/Ã’4Ã`/1Ãp86À_6ð‡.à (-ÃË5ÃÀ~6Ã0¢4ð/àÑ0ð/àÝ.À1À_6à9ÃÔ-ÃàÞ3ÃÀ®.ðà4ÃÐÃ1à›9ÃÀ2Ãð#/Ã0û:ÃPð4Ãà-Ã0¢4ÀÊ9Ã`¦2Àq3Ãð2à 3ðo2Ã@j/ÃÐ@2À}1ÃЫ5Ãàa3Ã`4ÃpÙ0Ãp86ÃPy3Ãð0ÃàÞ3Ãàa3ÃÀ7-ÃZ3à i7ÃPÞ7àH2Ã`”5ê0Ãé0Ãàä2ÃÀ5Ãpß/À.Ã`/1Ãн2ðÔ6À7Ã` 7Ã],ÃÐÃ1Ãà…-ÃpÁ4ü1ÃPö3Ã7Ãðÿ4àÅ2Ãð|5Ãð4ÃÀ~6Ã@½6Ãàa3ÃÀ®.Ãpb/ÃP1ÃÐÉ0ð]5Ãð1Ã0O-ÃE0Ã@F5ÃÐ<Ã0C/ÃЙ8Ã!6ÃPÞ7ù8Ãð2ð/Ãp©8Ã`)2Ãp27Ã7ÃP‹0ÃÐ44Ã@R3ÃÐ<ÃÀŠ4à:à 3Ã@:7Ãï/àÑ0Ã@F5ÃË5à o6Ãý7ÃPm5ÃàU5à<4ÃÀ%0Ã0 8Ãð‚4Ø3Ã0=0ÃB7Ã0é=àã-Ãp¯7ÀY7Ã7ÃPO:ÃÀ 4ðW6ÃГ9ÃÝ2Ã@É4Ã3ÃÐF1ÃЫ5Ã07ÃPê5ð?:Ã<8ÃÀû6ÿ7ÃÑ4Àî3à×/Ã0¢4Ã` 3Ã`)2ÃN5Ã@:7Ãë:ÃPs4Ã07àN1ê4ÃÐÉ0Ãpµ6ÃàO6Ã!2ÃPs4Ã071Ãð‚4ÃÀ+/Ã`4à×/ÃPü2ÃPm5ÃPð4ðò1ð/Ãé0ði3Ã0:À_6Ãб4Ã@X2à 6Ãàm1Ã0¨3Ã0®2ÃB7Ã92à /Ã@ç/ÃE0ÀY7à ì6Ã`Ž6Àâ5Ã`”5ÃðŽ2à 4+ÃÐÃ1ÀÖ7Ã`2Àú1Àw2ÃpÓ1ðæ3ÃpD4Ã@F5à 3à¿3Ã-4ÃT4à­6à9à “0ÃÐ:3ÃP2ðò1ð/Ãðš0Ãx.Ã`S+ðì2à ™/ÃÀœ1ÃÀõ7Ã0%4ÃpÍ2Ø3ê0ÃÐ:3à¹4Ã`8ðò1Ã×3Ã4ðu1Ã`X?ÃË5ÃðÐ'ÃÀŠ4Àw2Ã` 7Ãl0à ¥-ÃP1à¹4àT0Ã@j/Ã@ó-Ã3ðÔ6ÃÐ(6ÃŒ5ðà4ðþ/Àô2à 2Ã`5ÀY7Ãð4Ã012Ãã1ÃPü2Ã-0Ã0º0ÃÐ"7Ãý7Ãð4ÃP‘/Ã0=0Ã`¸/àH2ÃpV1Ã0À/Ã05ÃÀ–2ÃÀ+/Àâ5Ã` 3Ã0 8Ãàg2àÅ2Ãàg2ði3Ãðó6Ãf1ÃГ9Ã0À/ÃpP2à þ3Ãð¦.ðE9à­6ÃpÁ4ÃP[8ÃpP2Ã@d0ÃZ3ÃPð4Àk4Ã×3Ã0œ5ðÚ5à 1Ãð /à 2ÃÂ0Ãph.Ã`50Ã'1Ã@·7ÃPö3à {4ÃÐ:3àN1àB3ü1Ãðv6ÃQ.ÃàU5Ã@ç/Ã!6Ã05Ã0–6Ã0®2ÀÐ8ç;ÃÀr8à<4Ãð 3àÑ0à¹4ÃPg6àT0ÃP/Ã'5Ã`Ö*ÃPü2Ã'1à<4ðÔ6Ã0œ5Ã`”5ÃP2À§*ÃÐd,ÃpP2ðc4Ã0¢4Ã0Š8àB3Ã`¬1Ã`¬1ÃðŽ2ä5Ã0´1Ãpn-à i7Ã`Ž6Ã`/1à ".Ãp©8àB3ÃP‘/ÃPg6àÑ0Ã`²0à×/ð?:ð?:ÃÀû6à Ú9Ãàð0ÃÐ¥6ÃPg6ÃpÁ4Ã`Ž6ÃàO6Ã@Ã5Ã@j/Àw2à 0Ã@·7Ã@Ÿ;Ãpµ6Ã`¬1Ãp>5Ãp:ÃÐ:Ã` 3Ãà@Ãà7:Ãý7ÃÀf:à•:àƒ=Ã09Ã` 7ðÈ8Ãh?Ã`Õ?ÃN5Ã0Š8ÃðÛ:à ?>à ¤Bç;ÃP´>Ãà AÃÀ¿@ÃÀË>à <Ã?Ãð½?ÃÐò>Ã0¿DÃàéFÃà AÃà¨<À¦?Ãð:@Ãà@Ã0Ý?ÃÐi@ÃÓBÃÀ¿@ÃPCÃÀ6BÃÐ!LÃÀ*DÃðìLÃÁEÃ&FÃ@ÂJÃÀ IéIÃð™EÀCÃжHÃp[EÃ@øAÃðiMðJMÃÀ•GÃàTJÀ½PÃ`Kà5JïDÃp=JÃêOÃ0èRÃðoLÃ`4EðhHÃ06FÃ2HÃpÆHà ñJÃðÎQà GÃ@ÎHÀvGà hLÀÕLÃ0NðÁNÃ@QÃ0}OÀÕLÃ;MÃpIHÃ00Gà zIÃ#QþLðDNÃ@ TÃplWð¯QÃ`{NÃyM×LðÇMà ÷Ià €HðhHÃàÑJÃ0$IÃP×MÃMÃàfGÃp+Mà VOÃ`JÃðQQÃÀYQÃ`IÃ@¼KÃ0¡IðµPÀ«SÃðæMÃp´KÃ`ÂWÃð'Xà tJÃ`oPÃPfKÃИMÃüLà 2UÃÞQÃÐOÃPéJÃ0LòNÃ0›JÃà*QÃðøJà#MÃÐOÃSÃIÃðuKÃ0 MÃÀkNàˆQÃ@žPÃ`þMà”OÃÀÜPÃmSÃÐOÃ#Qà ©VÃ`òOÃöQà ëKÃpQðÁNÃðIÃðIÃ`øNÃðìLÃ;MÃ0ôPôXÃ@˜QÃà$RÃpÒFÃPÅPÃðcNðPLàNÃPfKÃ@ÎHà¬KàŽPÃà6OÃ`Jà#MÃÀeOËNÃÀ_PÃPÅPÃp RÃ`™IÃÐ’NÃ5NÃALðåHÃЪJÃIÃ0LðµPÃÐ'KðVKÃ@EJÃà³OÃüLÃpÆHÃðuKÀXLÃàNKàOÃàÝHÃRÃÌTÃ@?KÃÀ¡Eà ÓOïHÃPrIÑMÃðoLÃÀGÃÀHÃðøJà²JÃ@øAÃJDÃàà ˜Dà FÃ`FBÃß@ÃPfKÃð.BÃð¥CÃ0Z@ÃÐu>ÃpäCÃð@?Ãð:@ÃÐo?Ã`”5ÀAÃ0ËBÃÇ@àw?à È<ÃÀN>Ãð.BÃÐø=ÃàBðDÃ`·DÃP+@ð¤>Ã@øAð˜@ÃÐi@à 3@Ã@iDà ªAÀ @Ãp:ð-=Ã`ÃBÃÇ@Ãðá9ðª=ÃðÏ<À#@ÃDAÃà¢=Ãpy@ÃP+@Ãp&9ÀˆDÃ0Z@ÃÐø=ð'>Ã*;à 3@Ã7ÃP+@ÃwCà -AûBÃ0é=À#@Ãp :Ã>ÃP®?ÃP®?Ãð.BÃ0`?àƒ=Ã`FBÃP1?Ã`FBÃ@.9à @À#@Ã0Z@àî@àô?ÀÊ9Ã0Š8Ã}BÃ`j<Ã0r<Ãp?Ã`d=ð!?Ã=àq@à 3@Ãð«BÃp?Ãb@Ãà¢=à Î;à Â=À²=Ã`d=Ã0TAðE9àw?Ã09à›9ÃV>Ãà+<Ã@{Aó9Ã@(:Ã@ ?àeBà c8ÃðÃ>Ãàœ>Ãp;Ã0:Ãðá9Ã@";ÃÀf:Ã’8à :Ã@:7Ãt9ÃP®?à 9?à ò5ÃÐ9ÃðF>Ãp,8À7ÃÀr8Ã8Ã0`?Ãð:@à Q;ÃðF>à‰<à Â=Ã0õ;Ãð«BÃ`ÃBÃÀË>Ãp?à ªAÃPC<ÃðÛ:à @Ã0x;Ãpü?ÃÀé9ÃÐ:Ã@48Ã`j<Ã0:Ã`Ž6àw?Ã`ù9ÃpÁ4ÃPØ8à ?>à65à ø4Ã`ÿ8Ã0é=Ãð:@ÃГ9Ã` 7Ã07Ãp?À7Ã` 7Ã@¥:àƒ=Ã@>ÃÀï8Ã0:à E=í:Ãðj8ÀÐ8Ãp©8Ã7Ã0`?Ã<8ÃPg6ÃÐþ<Ã0û:Ã!6Ãð"DÃÀr8ÀM9Ãh;ÃÐ¥6à*7Ãà¨<Ãð^:Ã5Ãð0Ã@F5ÀM9ð¶;à È<Ãý;ÃPO:Ã0~:Ãà[4Ã`6ðE9Ãp=Ã@>Ã7Ãàº9ÃPa7ÃÀõ7ÃP[8Ã8ÃPö3ð3ÃÐ(6ÃPC<ÃÀT=Ã@=Ã`”5ÃÐ.5à þ3à W:À)?Ã`ÿ8Ã@48Ã`‚8Ã0~:àH2ÃpÁ4Ã07Ã@48ÃàC8Ã@Ã5ÃàÒ5Ãðá9Ã0ã>Ã7ÃÀû6Ãðí7ÃPü2Ãàä2Ãpµ6Ã@";à i7Àî3Àô2Ã012à¡8ÃpD4Ã÷8ð]5Ãðd9ÃÐ:Ã@™<Ã05Ãz8Ã`ÿ8à65à¿3Ã`¦2Ã4Ãï/Ãðù5ÃàI7ð3Ã0„9ó9Ãp©8à Ô:à<4Ã×3Ã`^>É@ÃÀZ<ÃàÌ6à­6ÃÐ44Ã`Ž6ÃàÌ6à 1Ã@«9Ãð‚4À0ÃÑ4ÃÀû6Ãp,8Ãà[4ÃPg6ÃP[8Ãp86Ãð|5ÃÀ3ðà4Ãp27ÃŒ5Ã'1Ã0+3ÃÀ–2Ãð”1Ã×3ÃÐ@2Ã@R3Ã@F5Ãz8Ã@^1ÃP0Ãàð0ÃÐ@2Ã0´1ÃpÇ3ÃÐ.5Ãp&9ÃpD4ÃPö3ÃÀ~6Ã0œ5Ãðó6Ø3Ã`”5Ã@R3ÃÐÏ/Ã0f>ÃH6à³5ðc4ðÎ7àÑ0Ã`4Ã`5Ã0~:Ãpµ6Ã`6à*7ði3Ãàê1Ãpt,ü-Ãàä2à “0Ãàs0Ãðá9ðÎ7Ãð¦.à /Ã`ˆ7ÃÐ44ð]5ð]5Ãpë-ÃЫ5Ãà[4Ã` 3ðø0ÃPs4Ãð1àË1Ã9.Àw2ÀA;Ã@R3Àk4Ãàö/Àè4ÃÀ5ÃP/ÃW-ÃPä6ÃP‹0Ã012Ã!2ð/Ã07Ã071Ãð).Ãà—*à 4+ÃÐ^-Ãà.Ã0®2ÃÐR/ÃP‹0Ã0À/Ãð1Ã0 8ÃPð4À.Àw2À¡+ÃÐ &Ä,ÃÀ+/Ã@ç/ÃPÇ&à +Ãû-ÃÎ.Ã@^1ÃÐÉ0ÃpV1ÃP1à “0ÃP1Ã`”5à «,Ã`Ê,Ã0´1Þ2Ã3Ã`;/à×/ÃÐÕ.à ¥-Ã@ù,ÃÀC+Ãp€*Ã0Æ.Ãð²,Ã0+3Ã@Õ2ð,à 0ÃP¯*Ãé0ÃP -ÃÐÛ-Ãð1ÃÐá,À /ÃÀI*à×/Ã012ö.ÃÀU(ÃP2*ð/à 1ÃP…1Ã0ê(Ãð¬-Ã@ÿ+ÃÀ®.Àƒ0Ã7Ã@j/à F(à ™/Ã-0Ã`4àË1ÃP&,Ãà…-ÃÐF1Ãpn-ÃÈ+ð-Ãl0ÃpP2Ã0C/ÃÔ)Ãpn-Ã0I.Ã`G-Ã`¦2Ã`4ðà4ÃÀ=,ÃK/Ã`2Àú1ÃÐÛ-ÃP-Ãû-ÃÎ.Ã0º0Ã0Ì-à ™/Ã5Ãày/Ã@á0Ãã1ÃP/ð-ðu1ÃpÙ0ÃpV1Ã],àx*Ãð1ÃP…1à×/à Ÿ.ÃPy3À-Ã`A.ÃP8)ü-Ã?-Ã`A.Ã5ÃÀ=,Ãà.ÃÐ^-À,à F(ðŸ*Ã`;/Ãò(à 1ÃÀ1.Àú1ÃP2Ã@p.Ãà*Ãð 3ÃP‹0ÃÐ%Ã0Ø+À.ÃÀ+/ÃP0Ã`Ä-Ã0Ø+àN1Ãðp7ÃÀ+/Ã33àr+Ãpå.à {4à 2à`.Ã@Õ2Ãph.ÃÀI*Ãðš0à ".Ãpñ,à×/Ãé0Ã0À/Ãн2Ã`ÿ8à o6Ã@½6à o6ÃÐ44À-À}1à¿3Ãз3Ã`Ð+Ã`ô%À×"Ã0C/ÃÀ7-ÃP2À0ÃÂ0Ã@L4ÃpÁ4Ã@ˆ*Ã-Ãpz+Ã@Õ2Ãày/Ã`¸/ÃP»(Ãpë-ÃP2Ãpb/Ãl0ÃÐÏ/à /Ãx.Ãðš0Ã@L4Ê+Ãpñ,ÃÀ%0ÃÂ0ÃГ9ÃÐ(6Ã0À/à³5Ãà-ÃP.Ãpý*ÃÀx7ÃÂ0Ã@j/Ã@|,ÃK/ÃÀO)ÃÀÌ)Ã`/1ðc4ÃpÙ0àN1Ãà+Ã%'ÃÀI*Ãï/ÃpÍ2Ã@d0ÃE,Ãf1ð™+ð()Ã?1Ã`ˆ7ÃÐ@2ÃÂ,ÃP-à¿3ÃðŽ2Ã@·7à¿3Ã`/1Ã`Ê,àÅ2à 3à /ÃÐ:3àB3àã-àT0Ãc+ð“,À,ÃE0Ãf1Ãà.Ãà‘+Ã`Ü)ðø0À›,Ã@j/ÃÀ1ÃÐL0ÃÀ2ÃE0àT0Ã@á0ð{0Ã0O-Ã9.ÃP2Ã@Õ2Ã92Ã`#3Ã×3Ã`8àf-ÃpJ3Ã0Æ.Ãàs0Ã0Š8ÃÝ2À /Ã`S+à ±+Ã071ÃÐÉ0ê4Ãph.ð .Ã5Ã@á0ÃÀC+Ã`Y*Ãðÿ4àf-ÃÐX.ÃP£,à L'àã-ÃpV1Ãpn-Ã@)ÃÐí*ÃÐX.Ãpn-ÃÐó)Ã0œ5Ãð /ÃE0ÃÐp*Ã`Ð+Ãõ.Ãr/ð()Ãð5,Ãð2ð/ÃÐF1Ãp\0à þ3ð3ÃÀ 4Ã`Ö*Ãi*ð/ÃÐ@2Ãà‹,ÃÐ^-ÃP -ÃP¯*ö.Ã0Ø+Ã@#&ðK8Ãï/Ãé0ðò1ÃP/àã-Ã,à «,Ãàö/ÃÀ3à`.Ãx.Æ6ÃÀ®.àr+ÃÐ^-ÃP-ÃÐX.Ãàð0ÃÔ-ÃP0ÃPµ)ÃÐù(Ãpë-Ãpt,ð-ÃT4Àô2Ãð5,Ãï/àr+ÃÀº,ÃP2Ãp»5ü1Ãà-Ã071ÃÐd,ÃÀ„5ÃP…1Ã-Ã@ÿ+ÃÐL0Ãàü.à 2ÃÚ,ÃW-Ã@p.ÃP2*Ãàg2Ø7ðæ3àÑ0ÃPü2ÃÐÉ0ÃÀÒ(ÃÀÆ*àã-Ã0[+ÃÐX.Ã@á0Ã0=0àÑ0ÃÀ5Ã0C/Ãà'ÃÈ+à×/Ãà)ÃpP2Ã@ù,Ã,Ã@í.Ã`î&ÃðA*Ã0®2À$+à /ö.Ã0ð'Ã0Ì-Ã0C/à «,ÃÀC+ÃP—.à Ÿ.ÃÐF1à×/À-Ãã1Ã`¦2à @)Ãð²,Ãðš0Ã@+Ã@í.Ã@^1ÃÔ)Ã0ð'Ã@d0À0ÃÎ*Ão%Ãæ&Ãð;+ÃQ.À•-ÃP -ÃÀC+Ã0g)Ã0s'ÃÎ*Ãæ*ÃàU5Ãpn-ÃÐÛ-à 1ÃpÇ3ð/ö.ðà4àH2Ãð¬-Ã`Ð+Ã-0À}1ÃÐ|(Ã,ÃP2*Ãн2ÃpJ3ÃpV1à`.Ãð¦.Ã9.ÃÈ/À-à (-Ã@ *Ã`Ð+àï+ð“,Ãð5,Ã`G-ðÎ7Ã0=0À_6Ãð4ÃP2*Ã0g)ÃpÓ1ÃP»(ÃP>(Ã0g)Ã],ÃÀ¢0Þ2Ãày/Ãà‹,Ã0g)Ã*ð“,Ã`Ð+àT0Àô2ÃÐÏ/à .,ÃPs4À}1Ão)í:Àk4ÃÐá,Ã0Æ.ÃÀ+/à 3ÃÐÕ.ê0ÃP,+Ãð¾*ÃÀ®.Ãàð0Ã@ù,à 4+Ãð 3Ãl0Ãpñ,ÃÈ/àH2ÃÀÀ+Ã012Ã05ÃPs4Ãp€*à ·*ÃÀO)Ã@Õ2Ã`A.ðþ/ÃðM(ÃE0Ãà.Ã`;/Ãð /Ã05à 0ðQ7Ã`¾.À›,Ãr/ÃÐÏ/Ãð#/Ãàð0ð{0Ãi*ðŸ*àÝ.ü1ÃP2Ã0Ø+ÃP¯*ÃÐX.Ã`Ä-à 0ð‡.À /ÃpV1ð“,Ãp¤$ÃàÞ3ÃÐF1ÃÀ['Ã`¾.Ãc+Ãpå.Ã-ÃP»(Ãl0Ãðˆ3Ã0C/Ã@ç/Ã'1ÃÚ,ÃPm5ÃpD4Ã'1àT0Ã@v-Þ6àï+à þ3ÃÀ 4ðþ/ðò1Ã'1ÃÐ.5Ã0Þ*Ã@”(ðø0Ãx.Ãà,'Ãà+ÃÐÉ0Ãàg2ÃPö3ðì2Ãpå.Ãï/ÃÀœ1Ã`¦2ð,Ãà )à F(ÃàÞ3ÃÐX.Ãàs0Ãð¬-à ±+Ãr/Ã0 8Ãð4Ãpå.À}1Ãp€*ðæ3Ãð#/Ã`A.ÃÝ2ð]5Ã-Ã@á0Ã0=0ÃPa7Ã92Ã@É4ðu1Ã3à 3Ãàm1ÃÀÒ(Ã@Õ2ÃP‘/ÃP©+à¹4ÃÎ.Ãð /À-ÃÐ.5ü1Ã@á0ÃÀ¢0ÃÈ+à Ï&Ã0Þ*àÝ.Ã@‚+ðÎ7ÃP2Ã'5ðì2Ã@Û1Ãð 3À-Ã`;/ÃPü2à /Ãà,Ãð¸+à 3ÃÐ@2ÃP2Ã@í.Ãð).à {4à /Ã0¢4ÃPü2Ãp*Ã`#3Àú1Ø7ÃP…1Ã0O-ðæ3Ã09ÃÐX.Ã9.à 1Ãàg2Ã`A.Ãð0Ãð2ü1Ãð¾*À›,Ã`4Ãà‹,Ã0I.Ã`e(Ê+ÃT4à ™/Ã@ç/Àâ5Ãð|5ÃàU5à Ÿ.ÃÈ+à Ã(ÃP2*Ã@ÿ+Ãà»$Ãà…-Ã@d0Ã@Õ2Ã0%4ÃÐR/Ã0Ì-ÃÀ%0àÑ0À.Ãàð0À.Ã0+3À0Ãl0À0Ã0º0ÃP -Ã`;/ÃpP2ÃPð4à þ3ÃP…1ÃP0à ™/ÃàÞ3Ã`²0à„(Ã0=0ÃP1Ãàa3Ã4Ã4ÃQ.ÃÀœ1ÃÀl9Ã!6Ã0=0ÃP -Ã`š4à o6à 2ÃÐ@2Ãé0à ·*À0Ã`6Ã33Ã@ÿ+À,ðþ/ÃÀ 4àË1àB3ÃPö3ÃàÞ3Ã`;/ÃÀ´-À /ð-Ãàü.à¿3à<4Ã0Ì-à u5Ãà‹,Ãà-ÃÀ¢0ÃP‹0Ã3àã-Ã92ÃÐ^-À,àT0ÃÐ@2Ã0O-ÃE0ÃÐó)Ão)ÃP…1Ã`Ð+à «,Ã0O-ÃÀ 4ÃÈ/ð .ð{0à ™/ð/ÃÐ:3ÃW)ÃP‘/à Ÿ.Ã`¾.Ãp&Ãàü.ÃZ3ÃÀ®.Ãð#/Ã`¦2Ã0I.Ã@É4ÃpJ3Ãðš0àl,Ãp'ÃÐd,ðu1ð/à)ü-à ø4ÃpD4Ã`#3ÃÀ2Ãp\0ÃÚ,ð«(ÃÈ/Ãð 3Ãà)Ãà*ð .Ã@j/Ãð5,Ã`Ð+ÃP2ÃP…1Ãà—*Ãpb/Ãpý*Ãr/Ã-0Ã`S+ÃÐL0Àw2ÃÀ1À7Àî3ÃÐv)ÃÐÉ0ÃðG)À$+Ãð0à ".ÃÀ7-ÃÚ(À•-Ã@Û1Ã-0Ãð;+ÃÐv)Ã5ÃZ3ÃÀÀ+À$+ÃðM(à`.ÃÚ,Ã0[+Ãà.ÃP&,ð+Ã0Æ.ÃPü2ü1Ã@^1ÃàÞ3ð{0Ã071Ã`¾.ÃP.ÃÐÿ'Ãð5,Ãf1Ã*Ãà—*Ãð5,ÃP8)Ãõ.À›,ÃÐá,Ãð²,À.àã-ÃP/Ã@^1ÃP -àf-à :*Ã@v-Ãà.Ã`50Ãp>5Ãp )ÃÐX.Ã` 3ðì2Ã0Æ.Ãà‹,Ã0ä)ÃP—.Ã9.ÃPD'À}1ÃP‘/ð“,àZ/ÃÑ4ÃPs4Ãàö/ÃPð4ÃP&,àx*à .,Ãàð0Ãà…-ÃÀ=,Ãà+Ãàa3ÃP2â'À /ÃpÇ3Ã0®2ð/Ãpb/Ã0U,Ã`¸/Ãpb/Ã0À/ð()Ã(ÃÀ¨/Ä,à ™/à 4+ÃPÇ&Ã0Ò,Ã0Ò,Ã~-ðŸ*ÃÐL0Ã3/ÃÐá,ð‡.Ã33Ã0º0ð .ÃÀ7-Ã'1Ã@ÿ+Ã0O-Ã0À/Ã0C/Ã@ù,Ã`M,ÃP2ÃÐÃ1à Ÿ.à 0À,À<'ð,Ãà.ÃðŽ2Ã@Õ2ÃÀ%0à 1Ã`G-ðì2ü1à 4+Ãð¬-ð3ä1ÃÐ"7à 2Ã0=0Ã0[+ÃÝ2ð“,Ê+ÃPö3À‰/ÃÐ^-ð/À**ÃP&,Ãà—*À-À›,ÃÐR/Ã0´1àÅ2À}1ÃK/àB3ð"*ÃP,+Ãpå.ÃÀ¨/ðÚ5ð+À1à Q;À}1ÃÀŠ4ÃÀ„5Ãà…-Ã0Ò,à ™/à +Ãpå.Ãð‚4Ã0U,Ã0À/Ã~-Ã@ *Ãð5,Ä,ð/Ãðv6Àk4ÃÀ¨/À¡+ÃpÓ1Ã@Û1Ão)À,ðì2ÃÎ.ÃàÞ3ÃB7Ã@á0Ã3ÃÂ,Ãà—*ä1Ã@É4Ã0C/Ã`¦2ÃK/Àƒ0Ãàa3ÃpV1Ãà+Ãàê1Ãàü.Ãày/Àƒ0Ã'1Ãàð0Ã@p.Ã@p.Ã?-Ã012ÃàI7ä1ÃÐí*à “0ÃÐ44Ãðv6Ã@L4ÃP-Ã0ä)àZ/ä1ÃE0ö.à Ã(ÃÂ,Ã@d0ÃP -Ã`8ÃÎ*Ä,ÃZ3Ã@á0Ãн2Ã0=0à (-ÃÂ0Ã`¾.ÃÐ@2Ãð1Ãr/Ã-4ÃpP2Ã0[+Ãpå.ÃP‘/ð,Ãæ*àû)ð,Àw2à 6ÃÐ ;ÃàØ4Ã`¾.à~)ÃP2ÃpP2Ã`4Ã@L4Ãð¦.Ãà+Ü(Ã!2ðÔ6à×/Ã`S+Ã@L4Ãðv6ÃÚ,À•-à ".Ãà…-àT0ðò1ê0Ä,ÃàÒ5ð/ÃP,+à 0Ã0´1Ãðš0Ã0º0Ã`¸/à +Ã-0Ãf1à ".Þ2ðø0Ã@R3à 1Ãð¦.ÃE0àÝ.à×/Ã@Ã5Ã@F5Ã@L4À.ÃP/ÃÀº,ÃpJ3Ãà[4Ãp÷+ÃÀ´-À›,ÃðŽ2Ãà…-Ã`²0Ãp¯7ÃÑ4Ã`S+Ã92ð3Ãû-ÃÀ5ÃÀ~6ÃPü2Ã012Ã`¬1Ã'1àf-Ãб4ÃàØ4À‰/Ã`2à þ3Ã0º0Ã`Ä-Ãðç8Ãp¯7ù8Ã0%4ÃÐÉ0àË1Ã0a*ð“,ÃÀ1.ÃP—.Ãày/Ãà‘+ðì2Ãð1ÃP-Ã-Ã`²0Ã`¾.Ãàê1àÝ.Ã@‚+ÃP8)ðþ/ðŸ*Ãðš0À•-Ã`¸/Ãàm1ÃÐ^-ÃÀÀ+Ãàä2ðÚ5À•-à<4ÃP©+À‰/Ã'1ÃPê5Ã@á0Ãpn-ðu1Ãx.ÃÐÏ/Ã@Û1ÃÀ 4Ã@½6Ã@ç/Ã`e(à (-ÃpÇ3ÃpÍ2Ã0Æ.Ãû-Ã`Ü)ÃÐF1ð“,ÃÎ.À1Ã0%4ÃP‘/ÃÐd,àé,ð“,Ã`8Ã0À/àË1Ã012ÃÂ0ÃP2ðÎ7ÃŒ5Ãày/ð/À-ÃpP2ÃÀ 4Ãà.ÃÀ=,ð]5ÃÐÉ0À}1Ã@d0Ã5ÃP2Ã`6ÃPm5Ã` 3ÃÀ7-Ã`;/Ãpå.À}1ÃpJ3ÃP0Ã0´1ÃÐ(6ÃЙ8ÃÀœ1Ã0%4À,Ãà.Ã`¦2ÃÐv)Ã@ÿ+Ã3/Ã`G-Ã`Ð+ÃPs4à ".Ãc+Ã`¬1À-ÃpÙ0àé,ÃÀÌ)Ã0a*Ãð1Ãï/Ã0º0Ãðš0Ã~-Ã` 3Ãàm1Ã0¢4ÃÀ~6àT0ÃàØ4à /à 3ÃÀ®.Ã`S+à 6àB3ÃPð4Ã0¨3ÃÀ¨/ÃÀI*ÃpÇ3ÃŒ9ð/Ã`#3ÃðŽ2Ãp86à :À³(Ãò(ÃÐX.Ãðj8Ãpë-à×/Ã’4ö2Ãðˆ3ðAÃZ3Ã`‚8Ãà+à “0À_6ðÚ5Ãàö/Ã@á0ÃP1Ã7ÃÀŠ4ðà4Ãðó6ð¼:ð9;ðu1Ãà.ÃW-ÃÐÃ1ðu1Ãà¨<à¿3à ‡2ä5Ãp27ÃÈ/Ã33ÃÀx7Ã@±8Ãp86ðÎ7Ã`5ÃP2Ã@^1à*7à o6ÃàÌ6ÃÀr8ÃÀã:ð3Ã0=0ÃpÍ2ÃPö3à à8Ãp&9Ãðp7ÃPÌ:ÃÐ:Ã0%4ÃÐ9ÃÀã:ðE9ÃÐ:3ð-Ã92à¡8Ãý7ÃH6ÃPÌ:à¡8Ã0º0ðÚ5ÃÐ"7ÃÅ6ä1ðo2Ã`5Ãðó6ÃN5À;Ãp»5à ‡2ÃÀ–2ð .ÃÀ+/Ã0+3ÃÐá,Ãpß/ÃpJ3Ãp27ÃZ3ÃÀœ1Ã@^1ÃP…1Ã7Ã!2Æ6ö2ÃÀ¨/à o6Ãz<Ã05à¿3Ãp86à 6Ã92ÃÀ–2Ãðó6Ãpn-ÃpV1à¿3ÃЙ8ÃÎ.Ã`#3ÃPs4Ãð”1ù8Ã06Ã0Æ.à 0ðÈ8Ã07Ã0Æ.Ãp’'Ãð).Ã-0à 3Ø7Ã@X2Ãðí7ÃÀŠ4ÀÜ6ÃpÇ3Ãð4Ãðÿ4à06ÃpÓ1Ã×3ÃÀ´-ÃÀ3Ã`¬1ÃàÆ7ÃP1Ã@^1Ã0 8ðæ3ÃðÛ:Ã@";à³5ÃÀœ1Ã@Ã5ÃÀ¢0Ãðÿ4Ãb<à¿3Ãð^:ÃPa7Ãp>5Ãp;Àq3ÃpÍ2Ã@j/à o6À¸<à¡8ÃPØ8Ã@á0ðÎ7ÃÀ®.à*7ÃàO6ðÔ6Ã`ˆ7Ã0:Ãr/ÃÐÛ-ð‡.à ì6ÃPð4à ±+Ãr/Ø3Ã0´1Ã@Û1Ãë:àN1ði3Ãàð0ÃàU5Ã@¥:à 3Ã` 3Àâ5Ãà=9à<4Ãб4Ã`50Ã33ÃP‘/Ãp27Ãðˆ3Ã(ÃpÇ3Ã07ðÂ9Ã`)2Àú1Ãð”1Ãpß/àB3Ãð#/Ãp\0ä1À0ÃÀœ1ÃH6Ãà[4Ã`ˆ7à æ7ÃàO6Ã@Ã5ü1Ão%ÃP©+Ã?-Ã`S+à`.ð/ÃPö3Ãðš0Àw2ÃP2Ãpn-ü1ÃPs4Ã0º0àf-Ãà.Ãð‚4Ã`Ä-Ã`/1à ".Ãé0ÃB7ÃZ3ÃÀ¢0Ãpß/à ¥-ð-Ã0®2Ãð2Ãã1ÃÐj+Ãp†)ðu1ÃÂ,Ãx.ö2À1à 0Ãàä2ÃP—.à 6Ã4à×/Ãð#/Ãpë-Ã`;/ði3Ãð¬-Ãàg2ä1Ã0º0Ã@‚+ÃÐv)Ãl0ÃpÙ0ÃÐL0Ãæ*Ãpß/ÃP…1Ãð¸+Ã@+Ãà.Àk4Ãé0Ãð¾*à /ÃPð4ÃàÒ5Ã@Ã5àT0ÃÀI*Ãpå.à×/Ã@j/Ã`²0Ãl0Ã33à {4à ™/Ã0+3À$+ÃpP2Ãû-Ã@Ï3Ã5Ã?-àé,Ãð¾*àT0ÃE,à Ÿ.à “0Ã0I.ÃðŽ2ðæ3ÃpÓ1Ã`è'àl,ÃP1Ã0=0ÃðA*ðþ/ÃÔ-àõ*Ã)ÃPg6Ã`¾.Ãð /ÃN5ä1Ã0Æ.ÃK+Ãàð0Àk4ÃÐ(6Ãðš0ÃðA*Ãpb/ÃÎ.Ã`”5Ã@@6Ãðš0àl,Ã@ç/Ã-4Ã`¸/Ã@j/ÃÀ¢0Ã!2Ãp\0Ã071Ãð /Ãr/ÃP0ÃQ.Ãp†)ÃÐv)ÃE,à þ3ä5ÃÐá,Ã@ù,Ãð²,ÃPê5Ãà[4Ã@X2Ãàê1Ã3/Ãpb/à 3ÃK+Ã3/À›,Ãð /Ãl0Ã],ÃÀU(Ãð /ÃÔ)ÃÎ*ÃP.Ãf1ÃP2à`.ÃW-Ãpñ,À}1Ã0[+Ã~-Ã0U,ð3Ãpß/ð{0ÃÐR/ÃÀ+/ÃÀ®.ÃP‘/Ã`¸/Ã0Æ.ÃÐç+à ™/ÃpÓ1Ãr/Ã@‚+à ø4ÃÐí*ÃPð4ü1Ã@L4Ã`2ÃPy3Ã@Ï3Ãн2ðþ/Ãàä2Àw2à ø4Ã0+3Ãã1Ãà&(Ã?-Ã×3à ì6à`.ÃðŽ2Ã3/Ã@ÿ+ÃÀ3Ãàm1À.Ã~-Ã@ÿ+ü-Ã`e(ÃÐ|(ÃP¯*Ã`50ðà4Àô2à&Ãà…-à ™/Ã92ä1Ã`/1ÃÈ/ð/Ã071ÃÝ2ÃÀ1.à 0Ã×3À-ÃÀ1ÃÎ.ÃÐ:3Ã@Õ2ÃP-ð‡.Ãðp7Ãz8Ãðÿ4ê0ÃÀ3Ãx.Ãб4ÃP1Ã0¨3Ã@|,àr+Ã0=0Ãf1Ã'1ÃP©+Ã0º0Ãà&(Ã`Ê,ÃpÁ4ÃPÞ7Ãàê1Ã0+3Ã@í.Ãð‚4à :à<4ÃÐ¥6Ãé0Ã@+ÃÐj+àN1Ãp27Ãp\0Ã0[+Ã'1àH2Ã071ÃÐá,ÃP&,Ãl0À.Ãð2à 2Ã0Æ.ö.ÃÐÛ-ÃÂ0Ãàa3Ã071À‰/à×/ð{0Ãð1ÃÀ®.ÃÐp*àã-Ã0O-à ¥-ÃÔ-Ã!2Ã@:7ÃpV1Ã0º0Ã'1Ãð|5Ãp27Ã`¦2ÃÀ2ä1Ã0º0Ã@j/Ãð¦.ÃÐ@2ÃpP2ÃPê5àT0Ã4ÃW-ÃP,+Ãàg2ÃÀ®.à 1Ã`Ð+Ã0ä)à .,Ãð /Ã-0Ã`¬1à 3Ãp86Ã0C/Ãà.ÃÐ@2Ã@p.Ã0´1Ã3Ã06à 1Ã0O-Ã`Ð+ÿ7ÃÀ%0à þ3àï+ÃÐÛ-Ãð2Ãà.Ãð 3ÃE,ÃP -Ãð).Ãpß/Ã-0àT0Ã`/1À•-ÃpV1ÃE,ÃÐí*ði3à ø4ðò1ÃpÓ1Ãpñ,Ã`#3Ã0®2Ãã1Ã4àÅ2Ã],Ãð /Ã@X2ÃÀŠ4ÃÎ.Ã0U,Ã9.Ã,À}1ÃP2ÃP8)Ã0Þ*Ã`š4Ãpt,Ãà‹,ÃÂ0Ã0=0Ã`50Ã×3ÃW)ð-Ãð;+Ã0À/Ã0ä)Ã@ç/Ã3/ö2Ã0 8Ã@ó-ðò1Ãà£(Ãà‘+ÃPä6ÃÀ´-Ãð/-ÃPü2Ãpå.Ã`50Àú1à ".Ãð¦.ÃpJ3À.Ãé0Ãpå.Ãû-ÃPö3ÃÐÛ-ÃpÍ2Ãpb/ÃÎ.Ãpn-Ã`Ê,Ãàm1ÃÀ®.Ãû-ÃÐd,ÃÐF1ÃP…1Ãpz+ðì2Ãpn-À‰/Ã0Ì-Ã?1Ãàê1Ãð#/à ™/ü-ÃPJ&ÃÀ1.Ã*Ã0a*Ã`M,ÃÀO)Ã@+ÃÐí*Ã-4Ã0®2Ãà-Ãx.Ã@Ï3ÃP‹0Ã@ˆ*ÃÀO)Ãàê1ÃÀ%0Ãðˆ3ü1ÃP2*Ãø#Ãpß/ÃàO6Ãàs0ÃË5à 3ÃÀº,ÃÀ¨/Ã~-àÝ.ÃÐ44ÃP—.Ã@|,àf-ð“,ÃÐL0Ã@|,à<4àZ/àÑ0À}1ðu1Ã0Ò,àx*Ã3Ã`5Ãð0ðæ3Ã@á0Ãph.Ãàs0ÃpP2Ã`²0Ã0%4ÃÐÛ-à 1Ö)ÃE,Ãð1à ¥-ÃÀ3à ".ÃpÙ0ÃÀ1ÃÀ=,Ã33à×/Ã0I.ðø0Ãf1Àq3ö2à 0ÃÚ,Ã@ó-Ã0=0Ãð4Ãð¾*ÃÀ1.ÃP -ÃÐá,Ãà‹,ð"*ÃÀ„5Ã`Ž6ÃE0Ã3/à ".Ã`â(ð‡.àf-Û=ä1ÃpÙ0Ã0+3Ãé0ÃpD4Ã`G-Ã@Û1À0ÃÑ4Ã0Ø+à³5Ã`50Àw2Àî3Ãз3Ã@F5ðæ3à ¥-Ã@j/Àô2ÃÀ1.Ãà )À}1Ãp÷+ð()ÃðŽ2à Ÿ.Àô2àx*Ãpn-à×/Ãp>5ÃÐF1Ãз3ü1À‰/Àô2àN1ÃP,+ÃÀ+/Ã07Ã`2àf-Ã`¬1ð3ÃpV1àT0à (-Ã`î&Ãàs0ÃÀŠ4ÃÐ44ÃP/Ã`”5ÃÀœ1à¿3Ã0 8àZ/ÃW)ÃP…1ÃÐÃ1ð]5Ã@X2Ã0œ5Ãð0À /Ã×3Ã`)2Ãp\0ê0ÃÀ„5Ã@Û1Ãз3Àw2à×/ð“,à 3ðu1Ê+ÃP‹0Ã×3ÃðS'Ã@‚+ÃðÄ)à (-Àƒ0ä5ÃP%Aà ¼>Ã`Õ?í:ðæ3ê4à 3Ã0õ;Ã@á0à×/ðÃ$ð¥)à$Ãà+Ãð¾*ÃÐÏ/à`.Ãð|5Ãé0ðQ7Ãt9Ã0À/ÃÐL0Ã5ÃÂ0Ãð;+Ã@X2Ãpt,Ãàð0à ±+Ã33Ã@ù,ÃÐF1ÃK+ÃÀÆ*Ã-0ÃÐÏ/À1À0Ãã1Ã`2Ãð;+Ãc+ÃàØ4Ã0a*Àî3Ãpn-Ãì)à×/ÃÀ¢0ÃH6ÃP-ÃP2*Ã`¾.à 3ðÈ8Ã`Ê,Ãàö/ÃÀC+À}1ÃK/ÃpÙ0Ã0À/ÃpÙ0Ã3Ã×3Ã`Ä-Ã9.Ã'1ðø0ÃÐ:3Ãð|5Ã`¸/Ãpë-à /À-Ã`e(ðø0ÃQ.Ãð¸+Ãà*À.ÃÐÉ0Ãï/ÃÐX.Ã'1Ãðv6ü1ÃÀÌ)à×/ÃZ3Ãð^:Ã5ðu1À}1à`.Àâ5Ã@p.à Ÿ.Ã0À/ÃÀº,Ã`²0ÃË5Ãàa3Ã3/àÑ0ð/Ã0Æ.Ã0I.Ã@í.ÀB&ÃÀ´-ÃP—.à)Ã`e(Ã@á0à ™/ÃQ.Ãàê1Ã0®2Ãðš0ÃÐX.Ã0–6Ãi*ðø0à~)Ã`;/ÃÀÀ+ÃÀ¢0Ã0º0ð-Ãðš0àé,À1ÃÀ1.Ãû-à ½)Ã'1ÃÀ=,Ã0[+ÃP»(ÃÀ1.ö.Ã0Ì-Ã0Þ*à`.à þ3ðÚ5ÃÀ['Ãf1Ã0Ø+ð/Ã0C/Ãàg2Ã0Ø+ÃÀ2à 1àÑ0Ã@X2Ãàö/ð()à Ÿ.Ãàü.ÃðA*àã-Ã0Þ*Ã0Ò,ÃPy3à 6Àƒ0ÃÐÏ/Ãx.ÃP&,ÃÀ7-Ãpß/ü1ü1Ã0+3à ò5Ã`8ÃP…1Ã@d0ÃÐL0À$+ð .ÃÈ+à (-Ãàm1Àƒ0Ãð¾*ÃP2Ãpý*ÃÐ@2àN1ÃK/Ê+à 1Àƒ0àH2Ãð /Ãð /ÃP1Ã?-Ã`)2À‰/Ãñ9Ã@^1ÃÎ.ð‡.Ãðó6à 2ÃÐ^-àf-ÃP—.Ãpß/ÃàÞ3ÃÀ+/Ãàð0Ã`š4ÃÐÕ.Ãðš0ÃK+Ã`¸/Ã0Æ.Ã`¸/Ã,Ãà*Ã0Æ.Ã@X2à þ3Ã`S+ÃP-Ã@ˆ*ÃP -ÃÐd,Ãû-à (-Ã@+Ã`2ÃÀI*ÃÚ,Ã0º0ð-à 4+àx*ð{0ÃðG)Ãà,ÃÀ%0Ãà‹,ÃÐ@2Àw2Ã0U,Ãà+Ã0Ò,ÃW-Ã?-ÃÀ¨/Ö)Ãàê1ÃP1À,ÃÀ=,Ã?-Ã`4Ãà-ÃP2Ã071ÃÈ+Ãpb/Àk4Ãð2ÃðA*ðu1Ãð;+Ã`Y*Ã@ &Ã0Ì-Àw2à&ÃÀÞ&ÃÐ^-Ã0Þ*ðì2ÃÀÀ+Ãð#/ð-Ãðš0Ãà,Ãð5,Ãc'Ã-0ê0ð¥)à 1à(â'Ã`;/Ãà,ÃÐá,ÃÐÉ0Ãðˆ3ðæ3ÃÀº,Ã0g)à 3ÃÀ–2Ãàa3Ã'1Ã@ÿ+Ãàö/à ™/ÃP2Ãp86À1ÃPð4ÃÀÀ+ð/Ã`6àl,ð™+Ãà£(Ã'1ð{0ÃÐj+ÃP2Ãн2ÃÀ7-ÃP2à 1Ãà‘+Ãã1ÃP1Ãàü.Ã’4ÃZ3ð,ÃÐÕ.ÃÀC+ÃP…1ÃP1ÃP‹0Ãph.ÃW-Ã0À/Ã?1Ã0%4Ã@|,Ãàg2Ãl0àõ*ÃP‘/Ã`50Ãз3Ã9.à ]9Ãб4ðæ3Ãr/Ãð0Þ2Ãf1ÃÐF1à¹4ÃÐÏ/ÃÀÆ*Ãà©'Àw2à06ÃP…1à 1Ã0C/ÃÀœ1ÃðÕ;ÃÐ44Ãp»5Ãб4à L'Ãpå.Ã071àË1Ão)ÃÀ3ÃÐÕ.Ãð0ÃÐ:3ðæ3À0Ãàê1àN1ÃE,àÑ0Ã`”5Ã3à 0À}1Ã`2Ã`/1Ã33à Ô:Ã@½6ÃÀ®.Ãð2ÃpÇ3ÃÀ1.Ã0Æ.Ãpë-ÃP£,àÑ0ÃÐá,ðþ/Ã0+3ÃП7à¹4àé,Ã~-Ã05Ã'1Ãp27à ø4ÃÀ~6ðo2ð/ö.ÃP‹0À /À‰/Ãp\0ÃÀ¨/ÃÐL0Ãàº9ÃP2àB3Ãàð0ÃÀ1.Ãà[4à 1Ã3/àé,Ã@:7Ã@^1à ø4À³(Ãé0ÃP1Ãðí7Ãph.à ‡2ä1ÃÀ2À /Ãû-ÃÈ+ÃÐÛ-ð/ÃÐ^-Ã@Ã5ÃP&,à o6Ã0C/Ã9.ðò1Ã0U,Ã0´1Ã,Ãð).ÃpÓ1ðu1Ãà-ÃÀ 4Ã`/1ÃZ3Ãàð0ð/ðo2Ã`5Ã@.9Ãàa3à~)Ã@R3à þ3Ãõ.ð/Ãàs0ÃÂ,ÃP-Ãàa3ð"*à +ðo2Ãx.à 0ðo2ÃÀ¨/Ã071Ã3/Ã`50ÃQ*ÃP0Ãà-Ã`A.Ã0U,Ã@Õ2ÃÐR/À›,Ãàê1ÃÂ0Ã×3À /Ãð;+ÃP£,àõ*àB3Ã`;/À,ÃÀ2Ã?1ð"*Ã~-Ãà.Ãàö/Ãû-Ã@Õ2ÃP-Ã0I.À.Ã071Ã0C/Ã@)ÃÈ/à(ÃpÓ1à×/àf-ÃÀa&Ãà…-àã-à 1ÃpÙ0ÃÀÆ*Ã92ÃÐÃ1Ãpñ,Ãã1àl,Ã0Ø+ÃÐá,Ãp\0Ãð#/Ãð¦.ÃÐó)Ãн2À /à ¥-Ã`¸/Ãð 3ÃpV1ÃP-Ãà‹,À¡+ÃÐ^-Ãpå.à 0ÃpÓ1Ã@|,ðà4ÃP‹0ÃÐá,Ã071Àú1Ãàm1ðÚ5Ãàö/ÃÚ,ÃÐÛ-ÃQ*ÃÈ+à×/ÃP,+Ãð²,Ãpt,ÃÔ-Ã9.Ãà.ÃÐí*Ãð5,Ãp )ð-Ã,Ãpb/Ãpå.Ãð;+Ã?-Ã@ó-À•-Ã,À.Ãðš0àû)ÃÐd,ð/ÃP/Ãx.Ãà.à 2À›,Ã0Ø+Ãð).àé,à ·*à Ï&à Ÿ.ÃÀ=,ÃÀö"ÃðÐ'À›,à06ðò1Ãp»5Ã@j/Ãpt,Ã`S+ÃÀC+Ã`²0ÃÔ-ÃÐÛ-Ãi*ÃP0ÃpŒ(Ãpb/Ãð#/Ãì)à ·*Ãc+à ·*ÃP£,Ã0Ø+Ã012Ãpn-ÃP‹0Ãðš0ü-Ã0y&ÃÀ1Ã-0Ã@í.Ã],ð±'à Ï&à Ï&à ·*Ãp )Ä,ð¥)Ãàµ%ö.ð .Ãpn-ÃPÇ&Ãà+Ã0Ø+Ãc+Ã`Ð+Ã0a*Ã@#&ÃP&,Ã`M,Ã`;/ÃðA*ÃÀ1.Ãpë-Ãð¦.ÃÐd,Ãàs0Ã`Ö*Ãð²,ÃðÄ)Ã0s'Ã0ä)ÃðÜ%À$+À0)Ã`k'ÃðÄ)Ãr/Ã`M,ðø0ÃQ.ÃÎ.ÃÀ=,Ã-0ÃðM(àõ*À-Ã`²0Ãð5,Ä,ð/Ãà…-à ™/À0Ã0Ò,Ã0ê(ÃPµ)Ã0ä)à`.Ãé0Ã`Ü)À³(Ã`50Ã`¾.ÃP—.ÃB7Ãp*Ãà.ÃÀU(Ãc+à×/Ã`G-à F(ÃðÄ)Ãx.Ãp*Ã4à ò5Ã0Ø+Ãx.ÃÀI*ÃÐj+ÃE0ÃÀ3Ã@ó-à¿3Ã@+Ã`Ü)Ã'5à «,àé,Ãà-Ã*Ãû-ÃÐX.Ã@@6à(Ã0a*ÃðA*ÃÀÒ(Ã@v-À¡+ü1ð‡.ÃPÁ'Ãð¬-ð“,Ã@”(Ã@v-Ãàü.ÃP©+à «,Ã$Ãà-Ã012Ã`;/à ½)ÃP2*ÃÎ*ÃP‘/àN1Ãð¬-Ã`G-Ã`â(Ã](ÃÐÏ/Ã`50Ã`Ü)ÀH%Ã@ *àã-ÃÐç+À0)ÃE0Ã012Ã],Ãð#/ÃP-ÃÈ+ÃP…1ð‡.ÃÐÃ1à 0ö.Ãð).Ã@j/Ãð;+ÃÈ/ÃðG)Ãð¦.ðò1Ã?-àã-Ã@v-à /ÃÎ.àl,ÃÐ'à %ÃÈ/Ãà,àï+Ãpß/ÃÀa&Ã](Ã`M,Ão)Ã@+Ãp€*Ãð¦.Ãï/À /ÃP/Ãp’'à “0à /ÃÐó)ÃÐ.5ÃÀ%0Ã*ÃÐ|(Ã`S+ÃP&,ÃÀC+ÃÐó)Ã`S+Ã`Ö*à„(Ã0a*Ãà—*Ã0Æ.À0ê0Ãû-Ãp†)Ãû-Ãà.à «,Ã@ *Ãàµ%À›,ÃÐÃ1Ã`A.Ãph.ÃP¯*à Ÿ.Àƒ0ÃP2*ÃÚ,Ãpë-Ãp÷+Ã0a*Ãph.ÃE0À.ÃpP2Ã`¦2Ãà-Ã0+3ÃP&,ÃÀI*À³(À<'Ãð²,Ãx.Ãpý*Ã0%Ã@ó-Ã0Ò,Ã0Þ*Ãð/-à`.ÃÐd,ÃÀ„5ð/ÃE,ÃÀU(ê4Ã07ð‡.À¡+Ã0C/Ã071ÃÐ^-ðø0ÃÐÕ.Ãà)ÃÀC+ð,ðò1ÃÐX.ð+Ã0[+ÃP-ÃÐÃ1Ã*à @)Ãpt,Ãð/-ÃpÓ1à`.à .,Ã@É4à “0ÃÐç+àf-Ã0Þ*Ãà—*Ã`²0ð{0Ãpý*Ãpß/ÃÔ-Ã`Ü)ÃÀO)ð{0ÃP2*Ã33Ã`²0Ãà‹,ÃP—.ÃÀº,ÃÀ1.à «,Ãp˜&Ãà£(ð@%ð,à 'Ã`Ü)Ãpñ,ÃP2Ã@í.Ãï/ö.Àk4Ã0=0Ãpt,àõ*à /à 1ÃPJ&Ãæ*Ã@‚+à Ã(Ãpn-àõ*ÃW)à ".À.Ãph.Ã@|,Ã@”(Ã(àH2ÃÔ)ÃðM(Ãà+ÃQ*ð .Ä,Ã],Ãpn-ÃP -ÃÐÉ0à ™/ê0Ã`â(ð«(Ã@ *À-Ãð 3À}1Ã&à ½)Ã0ö&ÃЂ'à ±+Ã0g)ÃÐ44Ãàs0Ã0Ò,ð .Ã@ç/ÃÀØ'Ãàö/Ãàs0Ãð;+ÃÐj+Ã-0ÃÀŠ4à «,ÃPD'à ·*Ãû-Ãà )Ãàð0à 1Ãà2&Ãà©'à Ã(Ã0ü%Ãæ&ÃðA*Ã@ó-À /Ãà—*Ã`¸/Ã`M,à%Ãàð0àZ/ð/Ã@ù,ÃÀ¨/ð .Ã0O-ÃP.ÃPÙ#ÃQ.Ãð5,Ãæ*Ã`Ü)Ão)ÃP¯*Ã%'Ã@v-ÃÈ/Ã@”(À³(ÃÐç+Ãp'ÃÀº,à ™/ÃQ.Ã`Ü)Ã06Ãàê1Ãõ.Ãp(ÃÀm$Ãã1Ã@+Ã0ð'Ã5Ãpß/ðì2ÃP2*ð™+ÃPÁ'Ã@p.à /Ã`G-Ãà¯&Ãà.Ãf1ð+Ãpž%Ã@š'Ãà+Ã0O-Ã9.Ãã1Ãpb/ÃðM(ÃÀ+/Ã@¬$ÃP -ÃÈ/Ã`Ä-ÃÎ.ÃÐó)Ãì)à ¥-ÃPh!Ãðî"À$+ÃpÍ2ÃÀ7-ÃÐÿ'Ã0Ø+Ã@‚+Ã`Ö*ð/Ãà,àË1àf-ð,ð()àr+ÃÀ1ÃP.ð.(à (-Ã],ÃpŒ(ÃðÄ)Ã-0ÃÈ/Ã@Õ2Ã`Ð+ÃP2Ãð0àã-Ãp'Ãðq"Ãp€*Ã@|,ÃP2ÃÐÛ-ÃP8)ðŸ*Ãì)ðø0Ã0Þ*ÃK+ð,Ãà—*ÃQ.ÃP©+ÃPD'ÃQ.Ão)àã-Ãð¸+À.à .,Ã0®2ÃÐÛ-ÃÀÒ(â'Ã`Ö*ÃP&,à @)Ã@|,À•-Ã`Ð+ÃÀ´-Ã-0Ã`Ü)Ãà&(ÃP.ÃP -Ã`è'ÃÀ+/À-Ãà‘+À›,ÃÐç+Ãàa3Ãð¬-ð:&ÃÐ'Ãp )Ãà+ÃP>(ÃÐí*Ã0a*ÃP‹0ÃPm5Ãpå.Ã,ÃP.ð™+à~)ê0Ãpý*ÃK+À /Ã0Ò,à ·*ÃÐù(Ãpå.À<'À¡+ð,Ãà&(à :*ÃPÁ'àl,Ã`50Ã0U,ÃÀ+/ÃÀ+/ð{0Ã0g)ÃðÄ)ÃðÊ(ÃÐÛ-Ã3/Ã`Ð+ÃP/Ã-4à Ÿ.àé,À}1ÃP‹0Ã33Ã@R3ÃÀ1.Ã@j/Ãl0Ã`¦2Ãð²,à`.ÃPy3Ãð”1ÃPÁ'ÃP -À.ÃÀÌ)Ã0y&Ã0[+Ã-À•-Ã@ÿ+Ãpb/Ä,Ãð0Ã@ç/ÃP0ÃÐÛ-À‰/Ã`²0Ãé0ðu1Ãpn-Ãàö/à Ã(à {4Ã?-Ã@ÿ+Ãà…-àé,Ãàü.ÃË5ÃPm5à ".à ò5Ãé0Ã`ˆ7ÃÐ^-ÃP&,ÃÐ^-à ±+Ãð0Àw2ÃP©+Ãph.Ã`50Ã`A.Ã`¬1Ã@d0À¡+ÃÀ¢0À.Ã@ÿ+Ãð5,ðø0ÃÀ=,Ã0%4Ã0À/ÃÐÕ.ðø0Ã012ÃE0ÃpÙ0ð/Àú1Ãàð0àÝ.Ãð¦.ÃpÇ3Àô2ÃpV1ð/ÃP‘/à «,Ã`¦2à «,ÃÐj+Ã@d0Ãàm1ÃÀ2Ãð/-ðo2ÃÀ®.ÃP2àÑ0ÃÔ-ÃÐÉ0à {4Ã0´1ö2Ã0Æ.ð“,Ãpn-Àƒ0à ø4Ã9.ð/à (-Ã!2Àî3à ™/à ·*Ã`S+ÃÀ´-Ã`Ö*Ã`A.Ã~-Ãð5,Ø7ä1Ã@”(À›,ÃÀØ'àé,ÃpÓ1Ã33Ã`¦2Ã0´1ÃP—.àl,Ã*ÃÀ+/ÃÀ´-ÃK+Ãà.Ã@É4Àú1Ã0‹#Ãl0ÃPµ)ÃÀ´-Ã`;/Ãà‹,à×/Ã9.Ãpå.Ãà )Ãð/-ÃP -ÃÈ/ÃP©+Ãð;+ð-Ã@ˆ*ðø0à)ÃÐÕ.Ãpë-ÃЈ&Ãðˆ3ÃÀº,Ã`¸/Ã@Ž)Ãà-ÃÀ´-ÃÐd,Ã0Æ.ÃÎ*ÃP-ÃÀ7-àl,Ã0C/Ã0$Ã@)Ã`Ê,À0ÃÐÉ0àÝ.ÃE,Ã?1Ãð¬-Àƒ0ö.â'Ã0U,Ã`Ê,Ãpå.Ã@)ÃÀI*à ¥-à /Ã0U,ÃPÁ'Ã0œ5Ã],Ã0[+ð{0Ãð /ÃðS'ð¥)Ã'1À•-Ã`¬1Ã0+3Ãà)Ã`Ê,ÃÐÏ/Ãð).À§*à<4ÃÀ¨/à Ã(Ãà‹,àé,Ã0a*ÃÐç+Ãà…-Ãà.ÃÈ+à +Ãð/-Ã0[+À¡+ÃÐ'Ãpb/à 4+Ãx.Ãð¬-ð/à /À•-ÃÀ–2ÃÐÏ/ð™+Ãà‹,ÃÐÏ/ð{0Ãæ&ÃP-Ã@Õ2Ã0¨3à 1ü-Ã9.Ãà‹,ÃP©+Ãpë-ÃÀ7-ð,Ã`S+Ã0[+Ã0a*ð+À•-ÃÐ'Ãpz+Ãpz+ÃP.Ã*ÃÀ=,Ã`4Ãà.ÃpÙ0Ã~-à X%àr+ÃÐj+Ãp¤$Ãu$ÃÐ%ÃP8)ÃðA*ð:&â'ÀÅ%ð/Ã`G-ÃÔ)ð-àZ/Ãp'Ã%'Ãõ.Ãû-ÃP/À¡+Ãày/ÃP.Ãð/-ÃP2*ÃÀs#Ã0m(Ã1%à (-ÃÀ 4ÃW-ÃÐd,Ã0Ò,Ã`Ð+Ã`S+ð«(Ã-Ãpë-ÃÀÆ*ÃÐ|(à (-ÃE,ÃÀð#Ã0a*è&Ã`;/Ã`;/ÃÐv)Ã0º0Ãà…-Ãp÷+À6(Ã@ *ÃK+ö.Ã@ÿ+Ã@|,Ãð#/ÃÎ*Ãp\0Ã0=0Ãà…-À0)Ã9.à 2Ã`¦2Ã`50à “0ÃÐ^-ÃÀI*Ã33ÃPö3Ã9.ÃZ3ÃÀ7-Ãà.ÃPJ&ÃðA*ÃPy3ÃQ.ÃÀ1ÃÐR/à “0ÃÐ9ÃP2Ã`50Ã`Ê,ÃÐÉ0Ãà‹,Ãð /ðÎ7à ™/À›,Ãr/Ãàê1Ãàg2Ã@‚+Ã92Ã0+3À$+Àw2Ãp&9ðþ/Ãàg2Àk4ü-ÃàI7ÃàÞ3Ãà[4ÃÐF1Ãà‘+Ã@X2à «,ÃÀº,À}1ÃP0Ãà,ÃP©+Ã`¸/Ãr/Ã0Þ*Ã?1À.ÃÔ-ÃÐL0Ãðÿ4Àk4ÃPö3Ê+Ãàö/ÃÐF1Àî3ð,ÃpP2ÃÝ2Ãàö/Ãà‘+ð¥)ÃP/À /ÃP0Ãpß/à ±+Ã@á0ÃK/ö2Ã@)Ã`50Ãày/Ã`M,Ãà‘+àZ/ÃÐÉ0Ã`/1ÃàI7Ã07Ã@R3Ã0 8Ãð2ÃÐ^-ðþ/Ãð /Ã@|,ÃÐÉ0Àú1Ã@L4Ãp>5ÃÀ´-Ã-0Ãð¦.Ã0–6ÃÀ–2Ãp27ÃÀœ1Ãpë-àã-ÃT4ÃÀ 4Ã~-Ãð 3ÃP‘/Ã071ð .ð/Ãð2ÃÐX.Ãàê1Ã0º0Ã@ó-Ãð¾*Ãà.Ã@‚+à`.Àw2Ã0+3ü-ÃQ.à9ÃÐ.5ð .ö2Ã*Ã@F5Ãð”1à /ÃPs4Ã@ç/ÃÈ/Ãð /Ã0+3à ·*ÃÐ44Ã92Ãðš0Ãã1ÃE0ð/ÃpP2Ã@d0à “0ê0à×/Ã`4Ã`¾.Ã0®2Ã?-ÃÀ2Ã@Ã5Ø3Ãð2ÃP‘/ÃÀ+/Ãl0ÃPg6ÃÀ6à 0ÃPÁ'ÃЂ'Ãð /Ãð”1ÃÀ=,Ã012Ã@R3ÃÂ0Ã`G-ÃÈ/Ãx.ÃàÞ3Ã0O-ê4ÃÐÃ1Ã@ˆ*ÃPy3ði3ÃP2Ãð‚4ÃÑ4Ãð2ÃPü2ÃP…1àf-ÃpÍ2Ãð0Ã@:7à 1Ã`¸/àÝ.ð@%ü-Ø3Ã!2ÃàØ4Ã@|,ê0Ãé0À¡+À.Ãàm1Ã@d0à 1Ã0+3ðø0Ãð /Ã~-Ä,Ã@í.Ä,ÃW-ÃÐ(6àN1Ãpt,Ã0´1à «,Ã5Ãr/ÃP1àZ/à ·*Ã@v-ÃK/à 4+àã-Ãн2Ã@‚+Ãày/Ãà—*À.Ãph.ÃP…1Ãày/Ã’4ð/ÃPð4Ã`)2ð3àB3àT0Ö)ÃÐÛ-àN1Ãpë-Ãr/Ãé0Ã0=0àÑ0Ã@Ï3Ãà,Ãph.Ã012ÃP2ð-Ã0a*Ãð¦.à Ÿ.Ã@R3Ãàð0àT0à 3Ã!2Ãà.Ãà-ÃÀ´-ð‡.ÃP1àN1ÃÀ%0À-ÃÀŠ4àZ/Ãð5,Ã'1ÃÐÏ/À<'ÃÐR/Ãx.Ãà,à`.Ã0Ì-Ã0Æ.Ãà*Ãà+Ã?-Ã0C/à (-Ãàä2ÃÐ(6Ã@Û1Ãð#/Ã`Ö*Ã`M,À1Ã@ç/Ã`4ÃÐÛ-Ã-0Ãày/ÃpJ3ðu1àN1ÃP‘/ÃÂ0ü1ÃÐÛ-ð‡.àé,ÃP&,Ã`A.à 0Ã0Þ*ÃÀ®.àZ/à06Ã,À.ÃÀ~6ÃàØ4ÃP1Ãà.ö.Ãà‹,Ã0º0Ã`5ÃÐ^-ðæ3Ãã1À‰/Ãï/Ãà…-àZ/Ã-ÃP2Ãày/ÃÀ¨/Ãx.àB3ÃP—.Àƒ0Ã0º0Ã3Ãàð0Ãб4à ".Ã@ù,Ã`¦2Ã`Ü)ÃÂ,Ãà…-ÃÝ2à /ÃÀ1ðc4ÃPê5Ãð|5Ãàö/Ãé0ð‡.Ãpå.ÃÔ-Ãðš0ÃÀ2Ãæ*Ãà‘+à @)ÃÈ+ð‡.Ãð¸+à Ÿ.Ã4ÃðM(Ãpë-Ãð¦.ÃpP2àË1ÃP‹0ðì2Ã@^1ð/Ã!2ÃÀr8ÃÀ„5ÃP.ÃÀÌ)Ãàa3ðo2À1ÃàU5Ã`Y*ÃP/à W:ÃPg6Ã@ç/Ã@«9Ãï/Ãà[4ÃE0Ãз3à 1Ã9.ð{0Àú1ÃÀ®.à<4Ãp*ÃÈ+Ãðˆ3ð"*ðo2à “0ÃQ.Àƒ0àï+Ã-0Ã@)Ãàð0ÃÐ.5ð™+Ãð²,ð/Ã@ç/ð“,Ã@‚+Ãf1ÃpV1àË1ðà4à æ7ÃpP2ÃÀ 4ä1Ã0=0ÃpV1Ãð).Ã`A.ÃZ3Ãð¦.Ãð5,Ãð¦.ÃN5Ã@É4Ã012À /ð¥)ÃÀ®.ÃP.ÃÀ%0Ã@Ï3Ã!2ÃP -ð .Ãàð0à .,Ã-àx*Ã92ð-=Ãà–?Ã=Àq3ÃP?à›9ÃPØ8à 3ðò1Ã@)ÃðS'Ã`S+àN1Ã,ÃÀ+/ÃÈ/Ãx.Ã@X2Ã`¸/Ã071ÃpP2ÃP1Ã`Ž6ÃpÓ1Ãr/ÃÐL0Ã0I.ÃÀ¨/ÃW-ÃP -ÃÐ%àŠ'Ãþ&à +à X%Ã0O-à Ÿ.à×/ÃÀ®.Ãr/Ãà.ÃP—.À‰/ÃÐÃ1Ã@Õ2ÃÀ2ÃÂ0à 2àl,à„(Ã`_)Ã`Y*Ã0a*ÃZ3Ã`Ð+ü-Ã-ÃÐÏ/ðæ3àé,Ãð²,Ãà+Ãàä2Ã`A.Àú1Ãf1À /ÃP0à “0Ã~-ðc4Ã0Ò,ð/Ã`Ð+À.Ã-0ÃP—.ÃÐ44à ™/ÃP£,Ã0U,Ãàö/Ãðv6ÃQ.À¹'à @)Ö)Ã0C/ðo2ÃP1ÃÀ1Ãð¸+àõ*À /ðo2Ãæ*Ãò(Ãð#/à ‡2Àƒ0Ö)Ãp÷+àé,ÃÀ=,ÃP8)Ãð¸+à ".ÃÐX.ÃP2Ã@Ï3ÃPa7Ã9.ÃÀ 4ði3ÃÐL0ÃÐÛ-Ã3/ÃT4ê0àÅ2ÃN5Ãð0Ãpz+ÃÐj+Ãз3Ãà2&ÃÔ-Ã`Ê,àÝ.à (-ð-Ã`;/Ãpb/ü1ð()Àƒ0ÃÀœ1Ãã1àZ/àf-ÃE,Ãé0Ã'1à .,ÃP0ÃÐÏ/ÃÀ1.Ãà…-À.Ã0=0ÃP.Àw2Ã@ç/à Ã(ÃÀ 4ÃpV1Ãàü.Ã÷8ÃÐv)Ãð1À6(ðø0à 6Ã0O-ðà4Ã-0Ã-4ÃÐù(Ãð¸+Ãà+àõ*Ãpñ,Ã,Ãp†)Ã`Ä-ðà4àã-à ½)Ã@Ž)ðo2Ã`š4Ãf1Ã9.Ãà…-ð‡.ÃÐá,ÃÀ®.Ãp÷+Ã@j/Ã`¸/Ã-ÃPµ)ÃÐ^-À¡+Ã`¬1ÃÀ2Ãà+à “0ðø0ÃÐp*ÃP1ÃÀ+/Ãàä2Ãp£9ð“,ÃP‹0Ã`;/ð]5Ã`2à F(à ".ÃÐ.5à .,Ã3Ç%ÃÀÀ+Ãð¦.ÃPö3ðÚ5Ãàs0Ã-Ã0´1à 2Ã`A.à 1Þ2Ã0+3ÃE,ÃÐj+Ã],Ãp\0ü1ÃP -Ãpå.à Ÿ.à “0Ãpë-Ã@á0Ã-Ãð/-Ã,Ãpý*Ã`Ö*ÃÎ.ÃÈ/À1Ã0À/ÃP -Ãàö/à 0Ãu(àN1ÃP2ÃP/Ã@(ÃÀ¢0ä1ü-Ã?-Ã{'Ãð¸+Ã0Ì-ÃÈ+ê0Ã`;/ð"*Ãr/Ã0U,ÃÀ1.àr+Ã`k'Ã`Ä-ü-ÃP‘/Ã0Þ*àZ/Ãp÷+Ã`A.Ã@p.ðà4Ãð).à (-Ãpý*ðø0À§*À¡+À³(Ã0=0Ãðù5Ã@X2Ã0Ò,Ã`Ö*À,Ãàü.Ã@ù,Ãx.ÃÐX.ÃÂ,à 1Ãàð0Ãõ.ÃÐó)Ã0º0À.ÃP,+ð/àZ/ÃÀ¨/Ã`_)À0ÃÚ,Ãpö@Àe5Ã0´1Ã@á0Ã@ÿ+à Ã(Ã0a*ÃPP%à 0Ã9.à «,à {4Ãp\0Ã`š4ð/Ãàü.Ã@d0Ãp*ÃPy3Ã@á0Ãà-ü-ÃÐL0à (-ÃÐX.à ·*Ã@ÿ+Ã`¾.Àú1Ã{'àõ*à (-Ã*ÃP2ð/À§*Ãз3ÃPy3Ã@d0Ãàa3ÃÐÛ-Ãà,à~)Ã@L4Ã@X2Ãà*Ãð²,Ã`50Ãð/-ÃÐç+Ã@d0Ã0C/Ãà…-Ã`/1à ".Ã0s'à @)À•-À›,ÃÐó)Ãð0ÃÀ´-ÃÀC+Ãû-ÃÈ+à @)Ã@ÿ+ÃÀœ1Ã7ÃP2à ±+ÃðÄ)Ãu(Ãpñ,à «,Ã0%4ÃP2àÑ0Ãpt,ÃÀ2Ãpb/Ã`)2ÃÐÏ/Ãð/-Ã`Ä-Ãp\0À‰/ÃQ*ÃÚ,ðæ3ÃP1à Ÿ.Ã!2Ã`A.ðu1Ãr/Ã×3Ãp>5Àú1Ã?1ÃPü2Ã0Ø+ÃW-ÃPy3ÃÐÏ/Ã@j/ÃðS'Ãð5,ðø0À-Ã`â(Ãð¬-ÃÐÏ/ÃÐ:3ÃÀ7-Ã0Æ.Ã0º0ö.àé,àZ/Ã`¬1Ãàð0ÃÐÛ-ÃÐÉ0Ã0º0Ã@.9ÃP/Ãð¦.Ã@d0Ãx.Ãp86Ã@Ï3ÃP1àË1ü1ÃÐÕ.Ã07Ã`;/ÃpP2Ãày/Ãð0Ãàg2Ã0Ò,ÃÐF1Ã-0Ã9.à “0ÃÐ:3ÃK/ð-Ã’4Ã`¸/Ãð/-ÃZ3Ãõ.ÃPü2àN1ÃÐÛ-Ãà-ÃÐÃ1ð/ÃÝ2Ã`¬1Ã`²0Ãà+ÃÐR/ÃpP2Ã0=0ÃÚ,ÃP‹0ð3Ãph.ð.(Ã@#&à×/Ã0C/à ".ðÚ5Ã`G-ÃÀ¨/ö2ÃàÞ3ü-Àƒ0Àƒ0ÃPü2ÃN5Ã],ÃP—.Ãð¾*Ã0=0ÃP—.Ã`¦2ÃÀœ1è&ÃÀ3ä5Ãf1Ãн2à .,Ãðˆ3Ã4Ã@ù,Ã4ÃÀC+Ãð¦.Ãpë-Ã@d0ÃÀõ7Ãà‘+àï+Ãð‚4Ãày/Ãp†)Ã0º0Ãp÷+à ‡2ÃP2ü1ÃðŽ2Ã`A.à 3Ã@Ï3Ãpë-Ãàü.Ãð).Ãé0Ã` 3Ãp€*ö.Ã`;/Ê+Æ6ÃPö3Ã92à (-ÃP-ÃàØ4ÃP‹0ÃP…1Ãàö/Ãð;+Ãpn-Ãàm1Ã`A.à 3Ã0º0à 3ð3Ãð#/Ãþ&ÃE0Ã`A.ÃpÍ2Ã@Û1à ¥-Ã9.Ã`5à¡8ð/ÃÀ3Ãð /ÃpÓ1Ãàm1Ã~-Ãà-à .,ðQ7ÃpÍ2Ã92à ".ÃP,+À1à³5Ã7à ".ðø0Ã@|,à`.à 4+Ãpß/ÃW-ÃQ.ÃT4Àw2Ã@|,ð/ö.ÃÀº,ðþ/Àƒ0à (-Ãp»5À0Ã@X2Ã@d0ÃÀÀ+Ã(Ãð”1ÃpP2Ã`#3Ø3ÃP-Ã4Ãн2Ãà-ü-Ã0º0ÃÐd,Ã)Ã0U,Ã3/ÃÐç+ÃÀŠ4Ã?-Ã9.ÃÐÏ/Ã0º0Ã@Û1Ã@Ž)Ãæ*Ã0Ò,Ã@p.Ã012Àî3Ãû-Ã0Ø+À0ÃðG)ÃÐ:3ðo2ÃP&,Ãpt,À<'Ãà—*Ã`e(Ã@p.ÃP‹0ÃpÙ0ÃÐÛ-ÃW)ð™+àZ/ð‡.Ã@ˆ*Ãà+Ãàa3Ã'1ð"*Ãà+Ãàê1à ½)à F(Ã`²0ü-Ã`Ð+Ã@j/à ·*ð+Ãp’'ü-ÃP8)Ã`Ð+ÃÀ´-Ã*à 4+Ãpå.ÃP&,Ãà…-ÃÔ-ð“,ÃÀI*ÃðA*Ã0Ø+Ãò(Ã0ä)À¡+ÃÐÿ'à L'ÃД$ÃÐv)Ãpt,ÃÀC+Ãø#Ã-à ‡2ÃÀU(À /Ã0m(Ã`Ü)Ã%'Ãð;+ðþ/Ã@á0Ê+Ãð5,Ãõ.À.à 1àã-Ãi*Ã0À/Ãr/à Ã(À<'à :*ÃÎ.Ã@p.À$+Ãl0ÃP0Ã0º0ðø0Ãf1Ãà‘+Ã0"ÃE0ÃðÄ)Ãpt,Ã0Æ.Ã`A.ê0Ã`š4Ã@á0Ãp€*Ãà-ÃP—.ÃK/ÃÐç+ÃP,+Ãp!%ÃðÊ(ÃàP!ð™+Ãð²,ÃP -à ±+ÃÐ^-Ãð4Ãð²,Ã@^1ÀB&ÃÐR/Ã`G-Ã0ê(ÃÀ2à 'ÃðÊ(Ãày/À›,ÃP.à ½)Ãà.Ãõ.ÃðÄ)ÃÚ(Ã@í.Ãpß/ÃÐR/ÃÚ(À0)Ãp\0Ãf1ðu1Ã,à ½)Ã0Æ.Ã`)2ÃÀœ1Ã`S+Ã`Ð+à ".ðþ/à$8àÑ0Ã@‚+ð‡.ÃE0Ã33ÃÐF1À§*Ã0m(Ãà&(ÃP-ÃÀ7-Ê+ÃP‹0Ã0®2ðþ/ÃP2ÃpJ3Ãx.Ãà‘+ÃÐF1ù8À0Ãàð0Ã@ÿ+ÃÐd,ÃðG)àZ/ðæ3Ã`Ö*ÃÀ7-àT0Ã@É4Ã`¦2Ã0Ø+ð/Ãl0Ã`50Ãðš0à 4+Ãp\0àB3À.ð/ðþ/à 0Ã@R3Ãàm1Ã?1ê4Ã@d0Ã0ö&Ã0C/Ãн2àZ/Ã?-Ã@ç/àB3àN1ü-à <à9ÃÐ:3ÃÀ+/Ã`;/Ãð/-à ½)àN1à .,ð«(ÃP/ÃP2Ä,Àô2àã-À0Ãc+Ã0U,Ãpz+Ã-0à ".à ¥-Ã1%Ãã1Ã],Ã@í.Ãàð0ÃÐç+ÃÀ=,Ã@ç/ðþ/Ãà.àN1Ãàg2Àƒ0ÃÀ1À›,Ã@ù,Ã'5ÃP‘/à ·*ÃÀ1.ÃpÍ2ÃðA*Ãàm1Ã012ÃÐX.ÃÂ0Ã3/ÃÐ@2Ãr/ÃP.Ã`;/ÃP/ÃPg6Ãx.ÃÀœ1À0Ãð0Ãà…-Ã@+Ã`A.ÃpD4ÃPü2ÃÐp*ÃP/Ã@p.Ã?-Àƒ0àÝ.Ã`_)Ã5ðò1ÃÀ%0Ã0º0Ã0À/à “0Ã`4Ãã1ÃÐù(ÃÐX.ÃPy3ÃÈ+ÃP—.ÃÐÛ-Ã`¸/àé,ÃP‹0Ã@ó-Ã`50Ãà.à`.Ã0=0Àw2ÃPð4à§7ð4'à Ÿ.Ã`¦2Ãà…-ÃÀ¢0ÃÐR/Ã012Ã`²0Ãph.ÃÐX.Ãr/àÑ0Ãpë-ÃÚ,ü-ÃÀ5ä1Ã`#3Ãé0Ãð#/ÃpP2àé,Ãð).Ãp>5à<4Ãp†)Ã9.Ã`#3Ã0À/ð{0ÃÐR/ÃÀ1Ãàä2ÃÀº,Ã@ù,Ãé0Ã0I.ÃÀ2Ãб4Ãàü.ðø0ð+à~)ÃP2Ã@Õ2ÃK+Ãð¸+Ãpë-Ã@^1Ã`50Ãû-Ãr/ÃÐÏ/Ãû-à 2Ã@ÿ+Ãò(Ã0a*Ã@Û1ÃГ9Ã`¾.À6(Ã0®2à Ú9Ã0¨3Ãð1àZ/Ã92ÃP/à .,ö.Ã`Ê,Ãà—*ÃP/Ã0U,Ã-À,Ã@d0À1àÑ0À‰/Ãé0î%Ã`_)Ãð¾*à “0ÃÀ1.Ã0a*ÃÐÏ/Æ6ÃÎ.ÃT4ÃÐÕ.à ±+ÃÐí*Ã@”(Ãà.à ¥-Ã@ÿ+ÃH6Ã` 3Ã`Ö*ÃK/Ãø'àé,Ã3/à 2ÃàI7Ã@R3à³5àõ*Ã@j/Ãà.ê0ÃÔ-ðø0à þ3à ™/Ãpt,ÃÐj+À.Ã@^1Ãà.ö.ÃP2*Ãð /Ã-0Ãà©'ÃÐ^-ðŸ*à<4Ã~-À‰/Ãl0Ã@j/ÃE,Ã0I.Ãð 3à ".Ãð²,Ãp€*Ã`Ð+Ãð¬-ÃÐ^-Ã071Ãð0àH2à Î;ð/Ãõ.Ãð1Àw2Ã9.Ãà…-Àƒ0ÃÀ2Ã`²0Ã@v-ÃÐÛ-ÃP2*Ã0Ì-àï+Ã0¨3Ã!2ÃPs4Ãpý*ÃÐÛ-Ãð5,àã-Ãð²,Ã07ðì2ÃðŽ2Ã0Æ.ÃP»(à ±+à 3ðu1ÃP‘/À.Ã0%4ð,Ã0[+Ãû-à&ö.à`.ÃP—.ÃpJ3Ã@á0À•-Ãàð0Ãpb/à ¥-ð±'ü-Ã0Ò,Ãpt,Ã`)2àB3Ã0Ò,ÃÀ=,À‰/ÃÐF1Ã0+3Ãð5,àŠ'ÃÀ7-À­)ð,Ãà.ÃÀÌ)ÃP©+Ãpt,ÃÀI*Ä,Ãày/Ãð¾*Ã0À/ÃP-à “0à ·*ÃÀ=,Ã0Ì-Ãà*Ã`²0àl,à (-ÃÀ+/Ãà‘+Ãø'ÃP -Àú1Ã@d0ð:&ðÃ$Ãà©'Ãà+Ã0º0ÃP0àZ/Ãpë-ÃÀ2Ã@ó-ü-ÃÀ3Ãp£9àõ*Ã`¾.ÃÀ1ÃÐá,ÃÐX.ÃÀI*Ã`²0Ãã1Ãð /ÃðM(ÃÐí*ÃP©+à .,Ã@í.Ã,Ãò$ð:&Ã0Ò,àr+À$+À.Ãàa3Ãà‘+Ã`Ê,Ü(À0Ãà+à ½)Ãà.Ãp\0Ãph.ÃÐÉ0Ã@|,Ãpñ,Ã@ù,Ã`¸/ÃÀI*Ã0=0Ãã1Ãà )Ã`}$Ã@ó-à ™/Ãà‹,à ½)Ãà£(ÃÀ7-Ãà*Ã9.ÃðÄ)à Ã(ð+ÃÀO)Ãpn-ÃÐÕ.Ã0Æ.ðø0ÃpV1à 'ÃPØ8Ä,Ã` 3ÃÅ6Ãà‘+Ãph.ÃP0àé,Ã@X2À,Ãà.ðu1ð-Ãr/Ãp÷+ÃðA*Ã`Ð+ÃÀº,Ã0À/ÃÐX.Ã!6Ãé0Ã`²0Ãp )à .,Ã!2àË1ð±'ÃP»(Ã0®2Ö)Ãà,ÃÀC+Ãp†)à ™/ÃZ3ÃàÞ3Ãàð0À-ÃЫ5àÑ0Ãàs0ð™+Ãpë-Ã@á0ð-ÃÐL0Ãph.ÃðA*Ã@ó-Ã@|,Ãàm1ð“,Ã0Ø+Ãð 3ÃÀº,ÃÂ0Ã@Û1ð,Ãpt,ð .Ã0+3ÃðÄ)Ã`6à þ3Ã0´1à 1Ãð2Ã@X2À1ÃÐÉ0àË1Ãð²,ÃP2*Ãàð0ÃpÓ1Ã`6ÃpÙ0Ãð).ÃP.àN1Ã@R3ÃÂ0ÃÐj+ÃðG)Ã0Æ.À}1ÃÐp*Ãà+Ão)Ã@|,Ã@ó-Ãp&ð/ðò1Ãpý*à “0Ãày/Ã@j/À**Ãð0Ã0ü%Ãð²,ÃPs4Ã@ç/Ã@(Ã@ˆ*ÃW-ÃpV1ÃÀO)ÃP&,ÃpÙ0ä5Ãð/-À,ÃЈ&Ãà.ð‡.à :*àã-Ãà‹,Ãì)Ãð5,Ã@)Ãpë-Ãpå.à Ÿ.Ãà‹,Ãæ*ÃðY&Ã@Ž)Ãz8à 1ð/À³(à(Ã`_)ð“,ÃÐj+ð«(Ãu$ÃC"À-Ãð¾*àx*ði3Ã0=0à ±+Ã@j/àã-ÃðS'à @)Ã0g)Ã`e(Ã`k'à «,À-Ãðˆ3À‰/Ã0+3ÃpD4Ãpý*Ã{'Ãà2&Ã,À¡+ÃÔ)Ã@|,à (-ü-Ãð /Ã0a*Ãð0ÃP1àé,Ãн2Ã-0ð/ÃpJ3Ãð2Ãpz+à «,à×/à “0ÃÎ.ðþ/ÃÀÀ+Ã`S+Ão)Ã0Þ*à®!Ã@ç/àã-ÃP1à .,Ã,Ãð/-Ã`/1ð/Ã`Ê,Ã`¾.Ã{'Ãð¾*Ãp\0Ãpß/ÃðÊ(Ö)Ä,Ã@ó-À-ð‡.Ãàm1ÃP -Ãpý*Ãà—*Ãõ.Ãp*Ãà+Ã`A.ÃÀ+/ÃðG)àl,Ã*Ã(À›,ÃÀÆ*à +àÝ.ÃW)ði3ÃÐR/â'Ã*Ãà¯&ð™+Ãà.Ã`/1À›,ÃàÇ"Ã`è'Ão)Ãð).ÃP/Ãà-Ã?-ö.Ã@Õ2Ãà‹,à “0ÃÀ=,ÃÈ+ö.Ãà—*à :*ð-ÃP—.Ã0¢4Ã0a*ÃÀ7-à (-ÃÀ1Ãà‘+Ãpn-à +Ã`M,Ã0U,Ãà)Ãàg2Ã0Ò,Ã`Ê,À•-à~)Ã0I.Ã9.Ã)ÃÀÒ(Ã@v-ÃðÄ)à Ã(Ãà&(ÃðS'à L'Ê+À,ÃÐd,ð«(Ã],à 4+ÃÐÏ/à /ÃK/ÃÐÉ0ÃÀC+Ã0a*Ãpž%ÃÀÆ*àõ*Ãà2&ð-Ãð2ÃÐL0Ã4à .,àã-À¡+Ãà*Ã~-ð{0àã-Ãà )Þ2Ã0U,Ã`¸/ÃÀI*Þ2Ã@ˆ*ÃP/Ã],Ã@”(Ã@ó-Ã0Ø+ÃÐ@2À}1Ã@ç/Ã@ó-ÃÀC+À¡+à :*Ã@)Ãu$Ã0Þ*ÃP8)Ãà+Ã@ˆ*ÃÐ^-àÑ0àZ/Ã0Æ.àT0Ãp'À¡+Ã@ç/ÃÔ-Ã0s'Ã`q&Ã@p.àf-ÃÐá,ÃÐÉ0Ãàü.à 2Ã0®2Ãð2Ãà.ð“,à ".ÃÀÌ)Ã@v-ÃÐù(Ã@v-ÃP—.Ãàm1Ãà-àõ*ÃP2*Ã@ó-ÃÐL0à «,Ã@á0Ãà‘+ÃðÜ%ÃÐj+à 4+Ã0Ì-Ãì)Ã&Ê+Ö)Ãð5,Ãp*ð-Ã@í.Ã`Ê,ð™+Ãp¤$ÃÎ*Ãi*àé,Ãp»5ÃÀ3Ã`;/Ãàð0ð¥)Àƒ0Ãàö/Ã`M,Ã0=0ÃÀ¨/ÃpÁ4Ãr/Ãð#/Ãà©'Ã@Ž)Ãc+Ã`M,Ãàü.ü-à Ÿ.Ãð¾*Ã`Ä-Ãæ&ð¥)ÃPü2à×/àï+à .,Ã`M,Ãpb/à 1Ã92Ãð).à ±+ÃP,+Àq3ÃP¯*ÃÔ-ðþ/Ãæ*Ãà‘+Ã3/Ãpñ,àã-Ã0Æ.ð‡.Ã@ù,à ".ä1ð¥)Ãà‘+ðò1Ã@R3ð-Ãàê1Àq3À0Ã@ç/ÃpŒ(Ã`Ä-ê0à 1ÃàÆ7ÃÐL0ðu1Ã@d0Ãàm1Ãp\0Ã@½6àl,Ã`#3ð™+Ãð5,à ±+Ãpb/Ãð¦.ÃP1Ã0Ì-ÃÀ2ÃpV1ð‡.Ã!2ÃP2Ãàm1Ã@ù,à 0Ã`4Ã0m(ÃÐX.ÃÐ^-Ã'1ÃÐÉ0Ã`¦2Ãp»5ðu1Ã*Ãl0Ã9.ÃÐp*Ã0I.à 1à 1ÃÐç+ð-Ã@|,Ã-0àŠ'Ã~-ð/ÃP.ÃÀê$Ü(Ã@v-à /ÃÀ´-ÃpÙ0ÃpÁ4Ãàs0À.ð-Ã%'ÃÀO)Ã,ÃÐj+Ãð/-ÃP8)ÃQ*ð/À0Ãà+Ãõ.Ã@ˆ*ö.Ãà…-Ã`A.ü-ÃK+Ãàä2ÃPy3Ã`;/à /Ã`â(À1Ãз3à 1Ã@í.ÃÀÒ(ÃÀÀ+à Ÿ.àr+ÃN5Ãõ.à 1Ã05ÃpD4Ã0´1Ãà)Ø3ÃPð4Ã0g)Ãз3Ãð²,à×/ä1àx*Ã@(à ±+Ãàs0Àe5ÃpÙ0ÃÈ/Ãà.ÃàU5Àw2Ã?1ä1ÃÀÀ+ðì2ÃÂ0ö2Ãp>5Ã@Û1Ãph.ê0Ã`)2Ã0Æ.Ãð1ÃPy3ÃP2À,ÃP0ÃPm5ÃÐL0à ¥-ä1à 3Þ2ÃK/ÃÀ5à þ3Ãpn-Ãà.Ãl0ÃÀ1.à u5Ã`6Ãà.Ãð¸+ð¥)À /Ã@j/Ã@F5Ã0Æ.Ãx.à¿3ÃÐ^-Ã@F5à 3àB3Ãðÿ4ÃÀ1.Ãð4Ã`Ž6Àƒ0À‰/Ã`50Ãp>5Ãð”1À§*Ãз3Ã@R3Ãð”1Ãp»5ÃÎ.à¿3à~)Àƒ0Ãõ.ÃP‘/Ãpë-Ã`5Ã`;/ÃÀº,Ã0¨3ÃÀ%0à ™/ÃH6Ã0%4Ãàm1Ã0º0à ‡2Ã`Ž6Ã@”(Ãà.Þ2àB3ÃÐ44ð3Ãà2&Ã`Ê,Ãp>5Ãàð0ÃPð4Ãàê1Ã`6À³(Ãðù5ÃN5ð™+ÃpÇ3ÃÀÆ*ÃÎ.Àw2Ã0[+ÃÐ:3Ãàä2Ã@(:Ã7Ãð0Ãp\0ð-Ã`G-Ã-4Ã`6ÃÀ®.ÃpV1Ãpå.Ãð#/Ã`â(ð“,Ãpb/Ã,ÃÀ¨/À‰/ÃÀ1.à R&Ã`²0à 3Àè4ÃÀ1Ã'1Ã@Ã5Ã`¦2ðÈ8ÃPê5ÃðŽ2ÃÀ7-Ãu(Ã0º0À /à 3Ã0º0ÃpD4àN1ÃPð4ÃÀ6ð .ÃÂ,Ã`¾.ð/ÃpV1ÃP©+Ãà,ÃP0Ã@v-Ã0Æ.Ã3/ÃÐí*ÃpP2Ãð1Ã@v-Ãæ*Ã0Ø+À.Ãð0Ãà.Ãð”1Ãàm1Ã@ó-ÃP0Ãp\0Ãàm1ðu1Ã92Ãà )Ã`¾.ð,Ãàð0Ãð|5ÃK+Ãàm1Ã`¬1ÃÎ.ÃÀ2ÃÀ5ðø0À‰/à /À_6ðc4ÃP2*Ãð/-Ãà=9à ™/à06Ã`š4ÃÐu>à ]9Ã@L4Àq3ÃP2Ãàä2Àw2ÃÀ5Ãð|5ÃPö3ÀH%à&À¡+Ã-à “0à`.ÃÀ´-Ã92ü1Ãн2Ã@L4À1à ]9ÃP2ÃPê5ÃÀ–2Ãð¬-ÃP—.Ãl0Ã0®2ÃE0Ãð;+ÃÐ^-Ã3à ™/Ãà.ð .Ãðš0ÃpÓ1ÃðŽ2À.Ã@Û1Ä,Ã0–6Ãðš0Àâ5ÃÐp*àx*ÃPm5ÃP/Ãày/Ãð¸+ð“,ð .ÃPg6ÃPg6Ã@ç/Ãà[4Ã0Þ*Ãàö/ð-Ã0¢4Ã0Þ*Ãàm1Ã@ç/Ãpß/ð™+àÅ2Ã`)2à ø4Ã@Õ2Ã@ó-ÃÀ+/Ãõ.Ã`²0àË1ð“,à i7Ã@ó-Ãé0àÝ.ÃÀ1ÃPÀú1Ã0[+Ã@Ž)ÃPð4Ã0=0Ãà*ÃPµ)Ãø'Ã0=0À-Ãàg2Ã`Ä-àH2Ãï/à ½)ÃÀÌ)ð()ð/Ãà…-ÃÀ´-Ã9.ð“,ÃP‹0ÃÂ0Ãà+Ã0Ø+Ãã1Ã'5Ãp»5Ã`2Ã@d0Ãx.ÃàÞ3ÃÀ®.ÃÂ,à ‡2ÃÔ-ÃÐ@2àË1Ãpå.ÃÈ/ÃÀ3ÃÐ@2ÃPa7ð“,ð .à 4+Ãø'À-À0)Ã0I.ÃP©+À•-àé,ð-à .,ÃÀC+Ãàü.ÃÐF1Ã@Ï3Ã`â(Ã@ù,Ãð;+Ãð#/àÑ0Þ2Ã@í.Ãx.Ãàm1Ã@)Ã@(Ãð).à 0ð“,Ãph.ÃQ.Ãð).à ".ÃPs4Ãì)Ãð2ÃË5Ãàm1Ã`}$ÃÀ+/ÃÀ1Ã0À/Ãð1ðu1ä1Ãà…-Ã`è'Ãà—*ÃPÌ:à E=Ã`50àÝ.ð/Ã0Ì-Ãx.Þ2ÃÎ.ÃÐd,Ã` 3ÃÐ$à ¥-Ã`50Ã-0Ãð1Ãð5,Ã`G-Ã`Ö*Ã`²0à þ3ÃЈ&Ã0ö&Ã*Ãà.Ãx.Ã`5Ãð).Ãp÷+Ãð¬-à 0Ã0Ì-àï+Ã3/ÃÀ´-àŠ'ÃP0ð“,Ãu(ÃÐj+àÑ0Ãð /Ã`¦2ÃK/ÃÀ1.Ã0Æ.Ãx.Ãð 3Ã@ù,ÃÀÀ+ÃÐ^-ÃÀ=,Ãpb/ð-Ã`_)Ä,ÃÀ®.ÃP,+à~)ÃÐÏ/ÃÐX.ðò1ð+Ãà.Ö)Ã0ê(Ãà+Ã`¬1ð/Ã@p.ÃÀ%0Ãc+Ãpß/ü-Ã@ó-Ã0 8Ã'1Ã0a*ä1Ãã1àT0ÃE,Ãr/ð™+à 1Ã@Û1ÃÔ-Ã%'àT0à ·*Ã0a*àã-À‰/Ãæ&ÃQ*Ã0Ì-ü1ÃÀ%0ÃK+ÃÈ/ÃÐp*Ãð/-Ã0O-ÃPü2à {4à ‡2ÃÐù(Ãð1àÑ0à 0ÃÔ-À0ð/à +Ãà¯&à ±+ÃpŒ(àl,àï+Ãf1ÃÐù(à 4+Ã@)à ¥-À7ð“,Þ2ÃP0Ã@j/à 0ÃP—.ÃÐÛ-À§*Ã@ˆ*Ãp*ÃP,+ÃðS'Ãpë-àï+À-ÃðÄ)Ãð;+Ã0I.ÃP.Þ2ÃàÞ3ê4ð/ÃPµ)Ã@p.Ã0ê(Ã0ê(ÃÐ|(ÃPÍ%Ãà )Ã`¸/ÃÐ.5ÃK+à`.à×/Ãpn-ð±'ÃP£,Ã0I.Ã`S+àï+ð"*Ãà.ÃðG)Ã'1ÃP -ÃÀÀ+Ã@|,Ãx.ÃÀI*ÃÀ¢0ÃÀ¨/Ã"à L'Ã@p.ÃÐ:3à ™/Ãi*Ãà©'ð«(Ãð#/Ã`;/ÃP1Ãp†)ÃÀC+ÃÐÕ.à ¥-Ãr/Ã@ç/Ã@L4Ã`2Ãpñ,À}1Ã`)2Ã7Ã@‚+Ã0º0ÃÀû6Ãà,ÃðG)à 1ð/Ãàö/à Ã(Ãà.Ãæ&Ã0À/ÃÀ=,à (-Ãð).Ã0a*ðŸ*ÃÂ0ð{0ÃÐó)Ãpz+à /Ãð¦.à É'Ã@)ð-à 1Ã@p.Ãð).ÃÀº,ÃÀœ1Ã`š4Ã0Ò,Ã0C/ÃQ*Àƒ0à 1Ãð0Ê+ÃP/ÃÐR/ð/Ã`Y*â'Ãð1ÃÅ6Ãl0àl,àÝ.ÃÐÃ1à ø4ÃÂ0Ã`M,Ãà+ÃÐR/ÃÐó)ÃÀ=,Ãð²,Ãð/-à¿3Ãð0ðo2À‰/Ãp†)Ã*ÃðG)À /à­6ÃÐ@2Ãð|5Ãï/Ãpb/Ãð /ð“,Ãð0ÃÐj+Ã`â(Ãð¾*Ãpý*ä1Ãð¬-Ãà-àl,ÃÀÀ+ð-ÃPÇ&à×/ÃÀœ1ð,à 4+Ã`¸/ÃP,+à Ã(Ã@48ð{0Ê+ÃÀœ1ÃÀ3ÃPg6ð+Ã@ÿ+Ã,Ãðš0à (-Ã@F5Àô2ÃÀœ1à i7ÃÝ2À$+Ãp&à„(Ã0º0Ãf1Ãà+Ã'1Ãð¬-ÃÐd,Ãðv6À‰/Ãæ*Àƒ0Ãp\0Ãà.Ã0Æ.à×/Ãð¦.Ã33ÃÐ@2Ã@É4ÃÐÉ0Ãà-Ã'1ÃPy3Ã`G-ÃÐv)à Ÿ.ÃÐÕ.ðø0Ã`2Ã%'Ã0Ø+Ã-0Ã@Ï3ü1àT0Ã0C/ðŸ*Ã@ˆ*ÃP&,Ã`5à×/Ãc+ÃðÖ&Ãp€*ÃÀ2ÃÎ.ÃÈ+À•-À¡+Ã@Ã5Ã0¨3ÃT4à ‡2ÃPê5ð]5à Ÿ.à Ï&Ãr/ö2ÃP,+ÃÎ.Ãt9Ã@í.ÃÐR/Ã0ö&ÃÐÉ0ÃÐÉ0Ã`”5Ã!2Ã!2ÃP‹0à`.Ã0Æ.Ãð /Ã0[+Ãð”1Ã-ÃÐÕ.Ãн2Ã`#3Þ2ÃP-Ã`2à$8Ã0œ5àË1Ã-0ä1Ã0®2À1À.ðŸ*Ãð1àï+Ã0[+ÃP2Ãàs0ÃÀ¢0ÃÐÏ/Ã`S+Ã0O-Ã071ÃÀ´-Ã0Þ*À.Ã`)2ÃP¯*Ã(àN1Ãl0ÃP£,ÃÐÏ/Ãð;+Ãpt,ÃÐÕ.ÃpÙ0Ã0a*Ã`S+ÃàÆ7ÃpÁ4ÃÀ–2ÃðA*Ã`S+ÃЂ'Ãð#/Ã`¾.ði3ÃÀ1.Àq3Ãà-ÃP¯*Ãp†)Ã92àÑ0ÃÐ@2à³5ÃK+ÃP.ð.(ê0Ãð¬-ÃP©+ÃÀ7-ÃÈ+Ã@F5ÃÐF1à “0ÃÀ®.ÃÎ*À›,Ã07Ã@p.à 1àé,à /Ãà…-Ãð‚4ðì2Ã@d0ÃðÄ)ÃpV1Ã`²0ÃE,ÃP -Ãà‘+Ãf1Ãl0Ãl0Ãàs0Ã-0ð‡.àû)Ã3Ãpn-Ãà,'à @)ÃW)Ãpt,Ã`e(Ã`Ö*à×/Ã-0àx*Ãì%Ãðˆ3Ãà»$ÃÀ+/ð‡.ÃPÞ7Ãõ.Ãð²,Ã0C/Ã`¬1à ¥-Ãà¯&Ã?-ð-ö.Ã0C/Ãp˜&Ã@|,àœ$Ãð0ÃÀ´-ÃP£,Ãà+ÃW)Ã@í.Ãà&(ÃÀ´-ÃÀœ1Ã'5Ãàä2ð-ðL#ÀB&àï+à «,àT0ð+ÃÐù(ð/ÃÐ"7Ã\=Ã0ä)Ã`;/Ã3Ãà—*ÃP—.ÃP¯*À›,À$+ÃpP2Ã@ó-ÃÐÕ.Ã`¬1Ãpt,ð™+ð«(Ãà.Ãàs0ÃÈ/Ä,ÃÐj+Ãpn-ÃàO6à 3Ãð2Ãðˆ3ðo2Ã`¾.Ãp*Ã`Ö*Ãp÷+ÃÀ=,Ã`A.ü-ÃàØ4Ã@j/ÃP…1ÃÐÕ.Ãð).Ã`Ð+ð{0ÃP/ÃÈ+Ãð#/ð{0ÃÐF1ÃÀ+/Ãpë-Ã0Ø+ð™+Ã0º0Ãp>5ÃÐ.5ÃPê5ÃŒ5Ãã1Ã0¢4Ã`;/Ã0Æ.ÃðÐ'ÃÀ¨/Þ2Ãð‚4àõ*à (-Ã@á0ÃPg6à65à “0Ã-Ãpb/ÃÐ:3Ã@ *ÃÀ¢0à {4Àw2à (-Ãà‘+ð-ÃT4à Ÿ.ð"*Ã`q&ÃP -ðu1à65à 1ð“,Ã@v-Ãб4Ã`/1ÃpD4ð/Ãð0Ãà£(àB3à ".ÃП7ÃPð4ðò1ÃE0Ã0I.Ã`¸/ÃÀ¢0Ãз3Ã012Ãð;+Àú1Ã@p.ð]5ÃpÍ2Ãpß/Ã?1Ãpß/Ã×3à /ÃÐá,ÃÐF1à /Ä,Ã0®2ÃЫ5ù8Ãð 3ä1àN1ÃÐv)Ã@Ã5Ãð1à (-à /ÃPØ8Ã~-ÃpÙ0Ãf1Ãà¯&Ãé0Ã`¦2ÃZ3À‰/ÃP©+Ãàð0àB3Ã`4ÃPy3Ãн2à 4+Ã-4Ã`50Ã0Ì-ð/Ãð0Ã<8ÃpÇ3Ã-Ãàa3ÃÐF1Ãpµ6à þ3Ã@j/àÑ0à ¥-ðÔ6ä1Ø3Ã0œ5Ã@F5ð{0Ã@·7ÃPy3ÃÀ6ä1Ã@F5Ã-4Ãð¸+ÃðŽ2Ã@í.ð‡.Ã-4Ã`/1Ã0œ5ÃÀ1Ãð0Ã?-à×/Ãé0ÃP,+à /àH2Ãàs0à×/ÃÀ~6ÃÐd,à 0ÃP2ð-Àô2ÃÐÃ1ÃÎ.ÃÝ2àZ/Ãpå.À0Ã0´1Àƒ0ÃP1à ‡2Ãà.Ãpý*Ãð0Ã`2à ™/ÃÐ^-à ‡2àr+ÃpD4Àô2Ã@)ð/Ã3ð“,ÃÀ+/à×/Ã0Ì-Ãã1Ãð2Ãðš0Ã4Ã3/ÃÐá,Ã@^1Ã0+3Ã0C/Ãp )ÃÐ.5Ã0[+Ãà,Ã012Ãð1Ãн2ö2Ã`š4Ãðˆ3Ãð1Ã0Ì-ð/ð·&Ã`²0Ã`Ü)ÃÀ¢0ÃPµ)ÃП7Àe5Ãð²,à¿3ÃP0à`.ÃÐá,ÃÀœ1Àw2ðæ3à “0Ãàö/À.Ãð|5ð .ðì2ÃÀx7ÃpD4ð{0ÃÐÃ1ÃpÍ2Ã0U,Ã`/1Ã071Ã`è'Ãã1Ã@Û1Ãàä2Ã012ÃP‹0àË1ÃÀ3ð()ÃPm5ÃÐ.5à 0Ã0º0Ãr/À,ÃÐ:3ÃÝ2Ã92Ã`¾.ðÚ5à¿3ÃÂ0ÃpÙ0Ãr/ÃÈ/ÃÀû6Ã071Ã?-Ãpñ,Ã-4Ã'1ÃÀ1àT0à {4ÃPä6Ã`”5Àô2Ãx.Ãpn-ÃP/ÃP.Ã@ÿ+Ãõ.Ãl0Ã0+3Àw2ÃÎ.Ãð1ÃÀ®.Ãð2àÑ0Ãàê1ð™+ö2Ãð¸+Ã0I.à ¥-Ã-àõ*Ãà…-ÃP&,Ã0Æ.Ã*ÃÐí*Ã05Ãl0ÃÀœ1Ãû-À**Ã@ &ð·&ð¥)Ã@ *ÃW-Ã*ÃPö3ÃÐÃ1à ™/Ã@v-Ã0Ò,Ã0´1à ¥-Ã`G-ð‡.Ã`e(Ã@X2Ã0%4ÃP‹0àH2ÃP.Ã`Ä-Ã`Ð+ÃP‹0ÃÐX.ö2ÃÀÒ(Ã`S+Ãðˆ3Ã@p.Ã?-àã-Ãà.ÃÐ:3Ãl0Ãð2Ã`G-ÃÐd,Ã`Ê,Ãð1Ãð0àN1Ãpý*à 4+Ã@p.ÃÐÕ.ð-Ã`/1Ãã1Ãã1à*7ÃÐ:3Ãð2Ã0Ì-Ã0C/Ãàs0ÃÎ.ÃðÊ(Ã?1àÑ0Ã` 3Ãð”1ÃàØ4Ãð#/ÃÐL0Ã`)2À /ð/Ãf1ð .Ãà.Ã`M,Ã0U,ÃP,+ÃÀÀ+Ã@í.Ãðš0Ã0Ì-ÃP‹0ÃpÇ3ÀY7ÃàØ4Ãà,Ã0U,à 2À›,Ã`/1ÃÝ2Ã`/1ÃÐd,ÃP&,ðø0Ã@ÿ+ÃÐR/Ã0¨3ÃPä6ðò1Ã@v-Ã@^1Ãpµ6Ãàg2Ã`_)ÃPö3àÅ2Ã@@6ð3Ãr/Ã`#3à á#Ãpý*ð/ÃPü2ÃÀŠ4ðu1ÃÀ2ÃÀ+/ÃàO6ÃP©+Ãð#/ÃÐÏ/à /Ã?1Ã012à 3ÃP0Ã`5ÃÝ2ÃÐÃ1ÃàC8ÃP1à 1Ãf1ÃPO:Ãpå.àB3ÃÀ–2Ä,ÃP-Ã'5Ã0®2ÃPg6ä1À0ÃðG)Àƒ0ð .Ãë:ÃP—.Ã`S+Ã@R3Ãн2à {4à æ7à ¥-ÃÐR/ÃPa7à c8Ã0I.ÃÈ+Ãàg2ðu1ÃÎ.Ã`Ä-à ±+Ãð¸+Ã@ó-Ã@ &ÃP1à .,Ã`¸/ð-Ø3Ãз3à¿3à`.Ã,Ãàü.Ã0–6ÀY7àZ/ü1à ì6ÃZ3ðà4à þ3Ã0Ø+ÃÀÆ*ÃÀœ1ðÚ5ÃBÃå;ÃP‘/ÃЫ5Ãàs0ü1ÃÀº,ÃP -Ãpt,Ã~-ÃÀœ1Ã0´1ö.ði3Ã!2Ãð).ÃÎ*Ã0C/ði3ÃpÓ1Ãàg2ÃÚ,Ã0I.Àú1Ãf1à<4Ãày/àÅ2Ãf1Ã3ÃÀ1.Ã0O-ÃÀ2àÑ0Ã92ðo2à ¥-Ã@ù,ÃP1Ãp>5ð‡.Ãà.Ã@Õ2ÃàI7Àô2à×/ÃÝ2Ã`M,Ãà.Ã@F5Ã@·7À1Ãpå.Ãp÷+Ã@X2ÃP.Ã@^1Ãày/Ãð).ÃpÍ2Ãà‹,àé,à 1ÃH6Ã4Ã0À/ð,ÃP—.Ã0®2Ãû-ÃÐL0ÃZ3à 4+ÃÀ´-àË1ÃàO6Ãà[4Ãð¦.ÃÐL0ÃpV1à 4+à ‡2Ã`²0Ã@Û1Ãò(à<4Ã@j/à<4ÃpP2Ã'1Ãн2àË1ÃÀ®.Ã@R3à Ÿ.Ãpñ,Ãpë-à­6ÃP2*Ãp\0Ã0´1à u5ÃÐ:3ÃP-àï+Ã?1Ãàð0àZ/Ãã1ÃÐ(6À0Ã4Ã7Ã`S+Ãï/Ã4Ã`/1à 1Ã`²0ÃÐÉ0ÃpÓ1Ãð2à›9àÅ2Ãæ*ÃÀ1À}1ðu1À**ÃP1ÃPs4Ã@Õ2ÃÐ44Ã0I.ÃPm5Ãðù5àH2Ãr/Ãз3Ãpµ6à ¥-Ãà'ÃP/ÃÝ2ð/ÃÔ-Ã012Ãð”1Ã9.ÃÐá,à ±+Ãðˆ3ÃðŽ2ÃÐç+Ã`¾.Ã`50Ãpb/ð/Ã@Û1Ãàä2Ã?1Ãàð0ÃàU5ÃÀ+/Ã`;/Ã@í.ÃÐ'à {4Ã`)2ÃP.Ã@^1Ãû-ðþ/Ã012Ã`S+ê0Ãàö/Ã0Æ.àr+ü-ÃP©+ð+à 4+Ãàö/ÃÀ2àÝ.ÃÐF1Ãàä2Ã?-à 1Ãð¸+Ã0U,ä1Ã0Æ.ðà4à`.ÃÀ´-Ãà,ð-Ãû-ä1Ã`¦2Ãà*Ã@í.Ã`Y*àõ*ÃP1ÃÔ-Ã@Û1Ã0œ5Ãl0Ã0I.ÃÀ+/àB3Ã4à /ðø0à`.Ãx.ÃÐp*Àƒ0À7Ã0C/Ãà.Ã],ÃÐÿ'àf-Ã`S+Ãð1Ã0U,À§*ð/Ãpn-Ã`S+ÃÐÛ-Ãðÿ4ÃP0Ãà,'Ã` "ÃP&,Ã0º0à~)à ‡2Ãð /ÃÚ,Ãã1Ã0I.Ãf1Ã,Ã0g)ÃÐÉ0Ãc+Ãl0Ãé0Ãð /Ã0Æ.ÃÀ¨/à :*Ãð4ðc4Ãl0Ãpë-Ã~-Ãà—*Ãû-ÃÀÆ*Ã09ÃÀ5àH2ð{0ÃÚ,Ã0C/ü1Ãð5,Ã!2Ã0Ø+Ãà—*Ã@ù,à Ÿ.Ã012Ã`_)ÃÐX.Ã@p.Ãõ.Ã@(Ãï/ÃÐá,ð .à +Ãð /Ãðˆ3Ãà.ÃÐí*Ã0Ì-ü1à 3Ã`;/Ãày/ð/Ãн2ÃÀ7-Ã@p.à «,Ãà£(ÃP-ÃP.Ã`/1Ãð).Ãpb/À¡+ðò1Ãàs0Ã0=0Ã0Ì-Ã`#3Ãõ.Ã`/1Ã`Ü)Ã@”(ð+Ãp’'ÃP/à 0Ã`;/Ãð 3Ão)Ãàê1ðø0Àk4Ã@á0ÃÀ¢0ÃK/ÃP.àõ*ÃàÞ3ÃpJ3Ãàs0ð{0à`.Ãæ&ð"*àÑ0Ãàö/Ãï/Àè4ÃÐj+ÃP—.Ã3/Ã0´1Ã`k'Ã0ê(Ã0U,ðì2ü-à×/Ã` 3Þ2Ã33à R&à ·*Ãà…-ð/Ãð2ÃÐÛ-à 1ÃT4Ã`)2Ã-0Ã`Y*Ãpª#Ãð5,àû)Ãð#/Ã`Ö*Ã`¦2Ã`Y*ö.ÃÈ/Ãàm1ÃÐ^-ði3Ãr/àB3à 1à (-à ¥-à “0ð-À6(Ã0Ø+àZ/ê0Ãð).Ãpå.à×/ÃÀO)Ãp )ÃQ*Ã0Ì-Ãð /Ãð¾*ÃðŽ2ðc4ÃÀº,ÃK+Ãõ.ð3àT0Ãà+ÃÐX.à65ÃЙ8Ãã1Ãð‚4Ãpn-ð-ÃQ.À.Ã`¸/Ãpå.ÃÀ3Ã@j/Ã@^1ÃP0ðø0ÃP2À}1ÃP‘/Àw2à¹4ÃÀÌ)Ãð /à .,Ã0Ì-Ã`¾.Ãð;+Ãàä2Ã`¦2ÃÀ%0Ãð;+Ã`2àT0ÃP -Ãr/Ãàa3Ãpë-Ã@«9ÃàU5ö2Ãàê1ÃP2ÃPð4Ã0[+ðu1àN1à þ3Ãðp7ð/ä5Ãð”1à ‡2à /ÃÀ%0Ã0Ò,Ãpë-ÃP2ÃE,Ãð#/ÃP.à 1ÃB7Ãà…-Ãà.Ã@ç/Ãp>5ÃÐR/ÃP…1ð,ÃŒ5Ãð0ÃPä6ÃÐÏ/à*7Ãð 3ÃÀ¨/à¡8ÃÐÕ.Ã@±8ÃÀÀ+Ãpå.ÃÐÕ.Ãз3Ãз3Ã92ðÚ5ÃpÓ1Àô2Ã0û:ÃÐÛ-Ã0Æ.ðà4Àô2à 6Ã07Ã@Õ2à;Ø7Ã8Ã@·7ðo2Ãðd9Ã0:Ã*;Ã@.9Ã@É4Õ>ü1Ã!2Ã@¥:Ãðš0Ã<8à*7Ã0¨3Ã`#3Ã0¢4Ã@(:ÃÐ ;à•:Ã`|9ÃàI7Ã@«9À_6ðW6ÃBÃÙ=ç;Ã>Àw2Ã0¢4ÃÐF1Ã÷8à›9Ã0l=ÃÐ:Ã@±8ÃP7>Ãà´:Ãý7Ã0 8à=À¾;Ãp¯7Ã@:7à Î;Ãå;Ã09ÀÊ9ÃðF>à @Ã`^>Ãðí7ä5Ãðÿ4Ã0r<Ãë:Ã69ð¼:Ã@™<Ã`|9ÃÀ 4ð¶;Ãp…>Ã09ÃÐ<à þ3ÃP0Ã0Š8ÃŒ9à›9Ã0~:Ãðù5ðK8ÃPU9Ã’8ÃП7Ã@«9Ã92Ãà[4ÃPm5àH2ÃàÒ5À;ÃpmBÃ8Ã06ÃÐ¥6ÃÓ>ÃÀã:Ã!6ÃÀ~6à Ú9ð¶;ÃPØ8ÃÀ×<Ã`í;Ã@«9Ã;Ãp<ÃÇ@ÃÐ<ÃЙ8à ]9Ã`8ð?:Ã`”5Ãðá9ÃðL=ÃàBÀ5=ÃPº=Ã`v:Ã0õ;ÃÀZ<ÃÀT=ÃÀN>Ãàº9Ãðd9ÃÐ:ÃÀ5Ãh;Ã`^>ð’AÃà¨<Ãz8à 3@ÃB7ÀÄ:Ãб4Ã>Ãt=à ¶?ÃÀB@Ãà7:Ãp,8à à8Ã`^>Ãp?ð@ÃÙ=Ãàœ>à ]9à :Ã@48ÃP7>ÃÍ?ÿ7à•:à ]9Ã`5Àe5Ãp;ÃàÌ6Ã0ï<Ã*;Ã*;ð9;ÃЇ;ð3<à c8ÀÄ:Ãpö@Ãh;ÀA;Ãp<Ãn:ÃPm5ÃðL=ðÎ7Ãð4ÃÙ=ÃÀõ7ðÚ5ÃpÇ3ÿ7Ãð@?Ãý7ÃЙ8Ã`4ÃPg6ð3<ÃàÀ8ð¼:Ã`8ÃPg6Ã`p;Ã`v:à 6ÀY7Ã5Ã0Š8à ò5Ãp :Þ6Ã0–6ÃðR<Ã<8ÃN5à :Ã!6Àk4ÃðL=Ãt=à Q;Ã`ÿ8ÃpJ3Ãpö@Ã`í;ÃÐ9Ã`5Ã@É4Ã2DÃp…>Ãà=9ðE9ù8Ã`á=á<ÃPü2ÃÐ<ðÂ9À²=À²=ÃàÆ7Ãàa3Ã0®2ðc4Ãp©8ÃàO6ÃÐ:Ãðd9Ã0 8Ã@=Ã@±8Ã@:7ÃÀx7Ãp—;Ã5ÃÀx7Ãàê1Ãð 3ÀÜ6Ã8ðÔ6ð?:Ãp :ÃÀf:Ãðí7Ãp©8Ã'5ÃpÁ4ÃÐ<Ã8Ãðç8Ã@(:Ã0¨3ðo2ÃP[8Ã!6ðK8à Q;ÃPC<ÀÊ9Ã0l=ÃÀï8à o6Ã9Ãà7:Ãý7Ã0r<à;ÃÀé9Ã`8ð¼:à•:Ã0¨3Ã7ÃÀ„5à W:ö2ÃÀ~6Ã÷8Ã@48ÃŒ5Ãz8Ã`v:à i7ó9à c8ð9;Ãp£9õCÃÁAÃàº9ðc4à06Ãð|5Ãб4Ã@48ÃPm5Ã@L4Ãp86Ã012À}1Ãà1;Ã07Ã9Ãà[4ÃÐ ;Ã÷8ÃPä6àÅ2à Q;ÃÐ(6Ã06Ãð^:Ã@±8Ãp;à c8Ãà=9à à8ÃPI;Ãðv6Ø7ÃÀû6ÃÀ3ÃPØ8ÃÐ(6ÀÄ:ÃàÞ3ÃPa7ÃÈ/ðæ3Ãà7:ÃÀ×<ð¶;Ã>Ãh?ÃÀ×<Ãðù5Ãp©8ÃÀ3Ã0l=à*7Ã`”5Ã@«9Ã@X2Ãp86Ãp27ÃÀï8Ãý7Ãб4ÃÐX.Ã`¬1à :Ãë:Ãð|5ÃP…1Ã69Ã<8Ã@É4Ãàg2Ã`5ÃÙ=ÃЫ5ÃÀ´-Ã05ÃÀ„5Ã0=0Ãn>Ãð|5Àâ5Àâ5Ã@F5ÃpÁ4à06ðE9Ãз3Ãt9ÃÀ6ÃÐF1Ã@.9Ãð|5Ãðù5ðE9Ã@½6À7à³5ÃÀ3Ãðp7à þ3ÃP7>ÃŒ9Ã7ÃN5ÃÐÏ/ÃÐ44àH2Àú1ÃB7ðW6Ã0 8ÃPs4ðþ/à 1Ã`š4à i7à þ3Ã0¢4ÃÀ1.à¡8à à8Ãðù5ä1à 1Ã09Ã`j<Ãðí7Ã0Ì-Ã`/1Þ2Ã7Ã@Õ2ÃðŽ2Ãð1àB3ÃàÞ3ÃË5Ãðù5ÃpÍ2Ã07Ã0œ5ðo2ð]5ÃP2Ã@½6Ã7ÃPö3ðQ7Ã0–6ð/ÃÈ+Ã?-ÃÀº,ÃÀ–2ð/ðŸ*Ã0Ì-Ã],Ã@‚+Ã?-ði3ðþ/ð]5à (-ÃP-Ãð¸+à /ÃÐF1ÃT4ð{0ðø0ÃH6ð/ð+Ã012Ãp\0Ãû-À­)Ã`S+Ãà,Ãн2Ãàa3ð]5Ãð‚4Ãðó6à ø4ÃPs4ÃPð4Ãàð0Ãx.àf-ü-ÃðŽ2Ã`²0à 3ðc4Ã3/ÃW-ð-Ãõ.ÃpÇ3Ãpë-ÃðÐ'Ãз3ðþ/ðì2Ã012à65Ãpå.ÃK/Ã@ˆ*Ãðˆ3ÃÀ1Ã'1ÃP1Ãp\0Ã-0ÃÂ,ÃP‹0Ãà[4ðW6ÃPy3ÃЙ8Ãðd9Ãp\0à ±+ÃP…1Ãð#/à)Ã@ó-Ãã1Ãðÿ4Ã?-ÃpP2à i7àB3Ã@‚+Ã@|,Àk4ð‡.ÃPü2Ã`¾.à×/Ãàê1à³5ÃÐ@2Ã@Û1Ê+Ã`e(ÃÐí*ê0Ã@Ï3ðo2Ãð0Ãð”1Ãð#/ÃÀÆ*Àú1à ™/à þ3à×/à Ÿ.Ãpë-À‰/à c8Ãð”1Ãàœ>ÃÅ6àË1Ã`”5ÃÂ,Ã0Ì-Ã)ÃÎ*ÃP…1ÃpJ3ÃÀ1.ÃpÙ0À-Ã@^1ð4'ÃÀ®.ðò1Ã9.ÃàU5ÃpÓ1À-Ã0=0Ãû-Ã0Ø+àH2Ãð /Ãð¾*Àw2Ã0+3à`.ä1Ã0%4àï+Ã@í.ÃÀ+/Ãpb/ÃÀ1.ÃÀï8Ãr/ÃpP2Ã`¬1ÃÀC+À.ÃPg6ÃT4Ãàa3Ãàm1ä1Ãàð0Ãh;Ã@d0Ã`²0Ãé0Ã0%4ÃpJ3Ã`50ÃP-Ãpn-àã-ÃÀ®.àB3Ãз3à¿3à 1Ã`¸/Ãз3à 1Ã`50àã-Ã`#3ÃÀº,Àè4Ãf1Ã@R3Ãð|5Ãpå.ÃP0ÃÐ8ÃЫ5Ãp»5ÃpJ3ÃÈ/ÃÐF1Ã`²0Ãf1Ã`¦2ÃP.ÃÀ3Ã0Š8ÃÐ:3Ãðp7À‰/ÃÀ´-Ã0O-Ã-0Àw2Ãðš0Ã`Ê,Ãð²,Àî3ÃÐí*Ã@Ï3Ã'5Ã` 7ðþ/Ã@48Ö)ÃÐÛ-Ã012ð/Ãàü.ð‡.ÃPü2Ã'1ÃÐÉ0Ã`4Ã0´1Ãàm1Ãp\0Ãàê1Ãð 3ðu1ÃE,Ã`;/ÃÀû6ðu1ÃÐ9à³5Ãå;ÃP0ðu1ÃpÇ3Ã`Ð+ð"*Ã0º0Ã@v-Ãð1Ãð1Ãpz+Ã?-àZ/ðW6ÿ7Ãà[4àZ/à u5Ã`50ÃP.Ãph.Ãp*Ãr/ÃÀ%0Ã`2ÃÀ–2Ã@ó-Ã@R3ÃpP2Ã?1Ãàm1Ã7Ãð|5à 3ÃÀ´-Ã`²0ÃÀ3Ãð¦.Ã`Ž6Ã`8à 3ÃÈ+ÃPs4ÃÐ"7ðò1Ã-0Ãà,ðò1Àe5Ã`Ä-ð .Ã@|,ð/ÃE0ÃÂ,Ã071Ãàð0à ".Ãàð0ÃÀœ1ÃÎ.ð‡.ð()à +ÃÀ–2Ãàä2Ã@j/ð“,Ã3/Ãð0Ã0Æ.Ã`²0Ã0Þ*À}1Ãð 3ÃÀ+/ÃÐp*ð"*Ãð#/à {4Ã<8Ã@d0Ãpz+àÅ2ÃÀ„5Ã92à ò5ÃZ3à (-ÃP&,à ø4À_6ÃÀ2ð{0ðà4ðÂ9Ã-0àï+Ã0Ì-Ã`A.Ãà…-Ãï/ÃPê5Àú1à 1ÃP-ÃŒ5à :*ÃÀ1ÃH6Ã@½6ÃP -ð-ðþ/ÃP/Ã’4Àô2ÃÐ@2ðÎ7Ãàê1Ã07ÃT4ÃÎ*Ãàö/àN1ÃÀ¨/Ã@á0ð-ÃÀŠ4Ã@j/ÃP2Ãðó6à “0Ãðˆ3àï+Ã0C/Ã@Û1Ãð¦.ðW6Ãp27àH2ÃP0Ãà+ÃP»(ÃÐ.5àN1ÃpV1ð‡.ÃP0ÃÐó)ði3ÃpP2ÃÐÕ.Ã`A.ÃÀœ1ÃP2Ãð‚4À,Ã`Y*Ã`M,Ãðš0ä1Ã`Ä-ö2Ãp£9à c8Ã0Ò,ÃP&,ÃP©+ÃP&,Ã`e(ÃP8)ÃP—.ð,ÃPü2ÃP‹0ÃP-Ã`M,ÃÀ1àf-ÿ7Ã`¬1à 0Ã`A.Ãpñ,Ã@)Ãï/Ã`Y*ÃÀ%0à 4+À•-ðø0ðò1Ãà-Ã`¾.Ãà.À,àf-Ã0C/Ã`²0ÃÀ´-Ãð;+À.à~)ÃÐÛ-Ã@X2ðà4Ãàg2Ã0Ì-ÃðÐ'ÃW-Ãpå.ÃP1à ".Ãàä2Ã` 3Ãà.ÃP1àÑ0ÃÀO)Ã!6ÃÐj+Ãð2Ãpb/Ãàä2ÃP&,àË1Ã`2ð-Ã-Ãõ.àx*ð/Ãð2à Ÿ.À0)Ãpt,àZ/Ã0À/Ãà—*Ãp*Ã`;/Ãð4Ã0À/ÃP/ÃÀ2ÃÀœ1ü1Ã0Ò,àÝ.ÃÐÛ-Ãpñ,Ã`¬1àZ/Ãàa3ð"*ð+Ãc+Ãð1Ã0Ì-Ã0s'ÀÅ%Ã@p.Ã0º0Ãà.à Ÿ.Ãr/ÃÐÛ-ÃP.ð()Ã012À /Ã@F5Ãph.À}1ÃpÓ1À-Ã0Æ.ÃÐd,ÃPð4Ã@L4ÃP/À.ÃpÓ1Ã0º0ÃÐÏ/ÃàÞ3Ã`2ð‡.ÃÀÌ)Ãý;ÃN5ÃÀ1.Þ2ðW6à 2Ãpn-À›,Ã`2ÃàI7ÃB7ÃPg6ÃÐL0Ã0Ø+Ã0=0Ã-0ð{0ê0Ãr/Ãày/Ã0I.àT0ÃP.À,à 1Ãõ.ð3ð .ÃE0Ã`Ü)ÃP0à 1Ã@^1Ã`50Ã05Ã@±8ÃZ3Ãà…-ÃP/Ã0œ5Ã`4Ã!2ÃÐ@2ÃÀ%0Àe5ÃPy3ÃÀõ7Ã@á0Ãàs0Ã0´1ÃÐL0à «,Ãpb/Ã3Ã0%4ÃàÀ8Ãàð0Ã`¦2Ãé0Ã@ó-Ãà+ÃpÓ1Ã@L4Ã@^1Ø3ÃP/Ãàa3à Ÿ.Ã0À/àN1Ã@ˆ*ðÈ8Ãp>5ÃpV1Ã`Ê,Ã0º0Ã`¦2ÃP8)Ãé0Ãpå.Ã@^1ÃpD4ðW6Ãàm1Ãз3ÃpÍ2Ã0=0Ã`¬1À•-ü1ÃpD4ÃPü2ÃÐÉ0Ã@L4Ø7ÃpÇ3ÃZ3Ã@^1Ã3/Ãà-à65Àú1À}1Ã0U,Ãб4Ãé0Ãðš0àï+Ã@j/Ãð2ÃÀ–2Ã0º0Ã`;/àx*ÃÀ3ÃðÏ<Ã4Ãð /Ã@X2ÃE,Ã@j/Ã?1ÀÐ8Ã@R3ÃÐÉ0À.Ã,Ãð¸+à 2ð-ÃPm5à 3Àk4ðÚ5Ãpb/Ã!6àÅ2Ã`¬1Ã@R3ÃÎ.ÃpÍ2Ã`4Ã`Ž6Ã69Ãàä2ÃP,+Ã`²0à 3ðÎ7Ã!2ÃÐù(Ã@j/Ãð 3à 4+ÃÚ,Ã`Ü)Ã],àÅ2ÃÀ6ÃpÁ4àZ/ðo2Ãp,8ðø0Ãð).Ã`/1ÃÐF1Ã0%4Ã`¾.ÃpÁ4Ã0Æ.Ãð1Ã0 8ÃàÞ3Àî3Àî3ÃðŽ2Ã0´1ÃE0Ã@p.Ã071Ø3Ã@d0ÃàU5Àô2à 3Ã`)2Ã05Àî3àT0àB3Ã(Ã×3À-ð]5àZ/Ã!2ÃÐÏ/Ãð4ð/ðæ3Ã@X2Ã@^1ðò1Ã33Ã` 3ÃT4Ã@p.Ã0Æ.à 3Ã0I.Ã`¾.ó9à ì6Ãðí7ðc4Þ2ÃÑ4ÃÀ6Ãð4à Ÿ.Ã@Û1ÃÐ.5à 6à¡8ÃЫ5ðø0àN1ðø0ÃÀ¢0ÃàÒ5Ãð 3ð]5ÃÑ4ÀY7Ã@X2ÃPü2Ã92ÃP-Ã0´1Ãz8Ãð5,Ãpý*ÃÈ/ÃP2à “0Ã`#3ÃÀ=,Ã0O-Ãàê1Ãð1Þ6ÃP0Ãpµ6Ãðÿ4Ã0À/Ã*Ãð¬-Ãpý*ÃÀ 4ðo2ÃE,à×/ðì2Àî3ðæ3Ãð2àZ/Ã@É4Ã0º0Ã`50à ™/ÃP/ÃPÞ7à•:ä1Ã'1Ã0º0Ã@ç/àË1ÃðŽ2ÃÐÏ/Ã],ðu1à¿3Ã`A.à ¥-ÃÐÏ/À.àË1àZ/Ãph.Ã?-Ã?-Ãõ.Ãàä2ÃÀC+ÃN5Æ6Ãð /Ã-0Ãàð0ÃP/Ã'1ÃÔ-ð,Ãð‚4ðo2ÃÐ@2Ã`š4à «,ÃpP2à ".À‰/Ãé0Ãà…-Ã@j/ÃpÙ0Ãð#/ÃpP2ð“,ðà4à ¥-ÃZ3à06ðæ3ÃÀû6À-à «,Ãà‹,ÃÂ,Ãð 3à×/ÃpÓ1à~)Ãpå.Ãб4ÃÐd,ÃpÙ0Ãpz+àÅ2Ã@X2ðì2ÃÀx7Ã@v-ð™+ðþ/ÃÐX.ð-ÃÔ)Ã`Ä-Ãàö/Ã`Ö*ÃÀ+/Ã,Ã@½6À1Ã*ÃP£,Ãð”1ÃÐp*Ãàs0à`.àË1Ãð1Ãб4ð{0à 0ÃÈ/Ãðš0ÃàÆ7à ¥-ÃÐÛ-Ãpß/ÃÐá,ÃÀä%Ã0À/À-ÃÀ®.Ãàm1ðu1Ã0+3Ã@X2Ãà.ÃŒ5ÃàÞ3Ãû-ÃÚ(Ãà.ÃÐ^-À.Þ2Ãp,8Àe5Ãï/ÃÑ4Ãpt,Ã`è'Ã],ÃÀ1ÃE,Ã*Ã@Û1Ãð).ê0ð“,Ã@Ï3ð“,ÃÀ¢0Ã~-à06ÃÀ¨/ÃP‹0Ãé0à ±+ÃE0àÝ.ÃÐR/Ãpn-ÃÀŠ4ÃÐÏ/Ãpñ,àÅ2Ã0%4ÃÐ44Ãð1ê4ðà4Ãð²,Ã`4ö2Ãàs0à (-àû)ÃP2à 3ÃÐÃ1ÃPö3àÅ2Ã3ÃÝ2à ™/Ã@Û1Ãpt,À}1ÃÀ„5Ãð2ÃpŒ(Ã@ÿ+àB3ÃÀ%0ê4Ãï/Ã@ˆ*Ãõ.àÅ2ÃP-à /À-Ãàö/À-à {4Ãðp7Ãðš0à 3Ã`¬1Ã`¾.Ãð4ÃàØ4ÃpJ3Ã4Ãàs0Ã4Ãз3à /Ã0´1Ã0®2Ãàº9ÃÀ¨/Ãð|5à Ÿ.àï+ÃP…1Ãàs0Ãàa3ÃÐÉ0à 3Ã` 3Ãpb/ðþ/Ãpë-Ã`4Ã0À/ÃÂ,à Ÿ.Ã@ó-ÃÀ%0ÃÀ1Ãã1Ãày/Ãl0àé,àé,Ã@v-ÃÈ/Ã`8ðÂ9Ø3ÃpÁ4Àw2Ã0¨3Ãf1ö2ð/àN1Ã`ˆ7Ã@Õ2àé,Ãõ.ÃÚ,à ™/à 3à o6ðø0Ãð¬-ÃpP2Ãð /Ãà+Ã`”5Ãpµ6ÃЇ;ÃP2Ã0[+à ".à 3ðo2Ã3ÃÀ–2Ã071à /Ãàa3ð .Ãpý*ÃW-Ã0Ø+Ã@Õ2À.Ã`²0ÃH6À1Ã`50Àk4à65ÃpÁ4ðø0Ãð¬-Ãï/ÃpV1Ã`4Ã012ÃpV1ÃÈ/ÃÀ„5Ãl0Ã@ˆ*Àƒ0Ã`5Ã<8ÃÐÉ0ÃN5ÃÐL0ÃÀœ1Ãðj8ÃÀ1Ãpt,ð/Ã0I.Ãï/ðu1Àè4À.Ã3Ãp<Ã?1àã-Ãàä2ÃÀ¨/ÃpÇ3Ã@@6ÃPü2Ãàa3Æ6ÃÔ-À0Ã071Ãf1àr+Ã`)2Ãl0Àâ5àË1Àk4Àè4Ã3/ÃàU5Ã0Ø+à ·*ðu1Ã33Ãð²,À-Ã@Õ2ÃÀC+ðà4Ãàg2àH2à 3Ã0´1ÃPð4ÃÎ.ÃpV1ÃPa7à 1ð-Ã3/Ãàs0Ã`2ðþ/Àâ5à ¥-ð,ÃðŽ2Ã!2Ã@½6Ãàü.Ãý7Ã` 7Ãp\0Ã-0Ãà[4ÃÀ~6Ã@^1ÃpÁ4Ãp&9àB3ð¼:Ã@:7Ãr/ÃP„FÃPº=ÀG:Ã÷8Ã?-ÃÐF1ðÚ5ÃЫ5Ãpë-ÃpÁ4Ãðˆ3À_6ÃPs4Ã×3à`.ÃÑ4Ã4ÃÂ,Ã`#3Ã3Ãð0Ã`¦2Ãð 3Ã0Æ.ÃPö3Ãn:à 6ÃÝ2Ã0Ì-ÃÀŠ4ÃÀõ7Ã0 8ÃÐ:Ã012Ãð2Ãß<Ãà7:ðK8Ã`v:Ãð2Ã@F5Ãph.Ã0¢4Ã05ÃÐø=ÃÐ:Ã*;Ã`¦2Ãð‚4ÃÐ¥6Ã07Ã@½6Ãð|5ÃPü2Ã<8Ã0 8àB3Ãà.À.Ã0´1à 3àH2Ãðù5à 2ö.ÃÀ2Ã0Æ.ÃÐj+ÃP1à 3Ãï/Ãð‚4Àk4Àw2Ã@á0Ã0®2Ã'5Ã0Ø+ÃÐÕ.Ã×3àl,ÃàÞ3à 1Ãàa3à 3Ã012Ãð4ÃPg6Ã0º0ÃÔ-ÃÀ 4Ã`Ð+ÃÀU(Ã`2Ãð#/à¹4à ".à*7ÃÀ®.ð{0Ø3Ã@ç/àË1Àw2ÃpÁ4àï+àÅ2à 3Ãàö/ÃÐ44À.à`.à Ô:ÃÐ¥6ÃP‹0Ãð /àx*Ãð”1ÃE0à¡8ÃpD4Ã@Õ2ÃÀ3àN1ðÚ5ÃÀ¢0ö.à ¥-ÃÀ¢0Ã?1Ãàä2ÃÀ3ÃpP2ÃT4ÃP[8Ã*;Ã`#3à ‡2ð .Ãð¬-Ãà[4ÃP‹0Ã5Ã0=0à ‡2À_6ÃÝ2àÑ0Ã`2ÃQ.Ã` 3ÃP1ÃÐÉ0ÃÎ*ÃÀÌ)ÃK+Ãð).Ãð0ÃÀ 4ÃP2àN1Àe5Ã@Ï3À}1ÃpD4Ã0O-ÃÀ2Ãý7ðc4Ãð2à¹4ðo2Þ6Ãàs0Ã@d0Ã0®2à§7Ã`5Ã0¨3à u5ÃàI7Àî3ÃÐ.5à 1Àú1ÃE0Ã0%4Ã@Ã5ÃP&,Ã012ÃÐp*ðì2Ãðó6Ãð /ÃÀ®.ÃÐ@2ä1à Ã(Ã@p.ÃÀ3ði3Ã` 3Ãð4Ã@á0Ã0º0à§7Ãð 3ÃpJ3à¿3ÃZ3ðo2ÃŒ9Ãà+<Ã@á0Ã0C/ÃÀ5ü1ÃÀé9Ã'1à 3ÃÐR/Ãз3Ã@^1Ã`5ÃP[8Ã@d0ä1ð .ö2Ã`¸/Ãðš0ÃàÞ3Àâ5Ã`#3Ã0œ5à ì6Ã`#3Ã`š4à +ÃÐó)àÝ.à u5ð/à “0Ãð¦.ÃP0ðÈ8ö2Ãl0Ãx.ÃPö3Ã0¢4ð‡.Ã0+3Ãð2Ãðp7ÃÐR/Ã@X2Ã06àÑ0Ãð²,Ã`G-Ã`2ü-ö.ÃÀ5à o6Ã`á=Ã@Ã5Ãp :Ãý7Ã0g)Ã012À.àÝ.ÃЫ5ÃÐF1ÃE0ðæ3Ã0s'Àƒ0Ãà+Ãàa3Ãð”1à65à<4Ã`š4Þ2Ãpµ6Ãà-àB3àN1ÃЫ5ÃàC8Ã0û:ÃZ3Ã`ÿ8Þ6ðo2ÃÀ®.Ã071Ã!2Ã’4Ãp»5ði3Ãý7Ãðá9à­6ð/Þ2ðò1Ã`50ÃÐÃ1Þ6Þ2Ãp—;Ã<8Ã` 7Ã@Ï3ðu1Àe5ÃpÇ3Ã-4ÃÀ¨/àÑ0ÃÐX.Ã92àZ/Ã@ÿ+à 0ÃÐF1ÃÀ¢0ÃÀ%0Ã`|9ðæ3ÃPs4ð/à 1ÃP2Ãà[4à 6ð‡.ÃðA*Ã`¦2ÃPa7ÃЫ5ÃàU5Ãà.Ã`;/Ã`#3Ãб4Ã@L4à ]9ÃЫ5ÃÀ¢0àT0ÃÀ3ÃðŽ2Ãàä2ðì2à {4Ø3ÃÀû6Ã`”5ðÚ5Ã0®2ÃàÞ3Àâ5ÃÐL0ÃE,Ã@F5À1àN1ÃÀ%0ÃÝ2Ã@Û1ÃÝ2ÃE0Ã0´1ö2Ã5Ã@É4ÃÀ+/Ãðš0Ã0=0ÃP1À7Ãðí7ÃÀ~6ÃÐ:3Ã@Û1ÃpÙ0ðø0ðì2À_6ÃÀ„5Ã`4Ã`²0àT0àT0Ãp\0ðì2Ã@j/ðæ3à “0Ã`¦2Ãà=9ÃÐ"7ÃÐÏ/ê0ÃÐÉ0Ã0À/Ãé0Ã@í.Ãàê1ÃàØ4Ãà‹,àr+à «,ð‡.à¹4ÃàÞ3ðW6Ã`š4ÃàÀ8Àî3à65ÃÀ1.à Ÿ.Ãàê1Ãð4Ã@d0Ãðÿ4Ã!2Ã`Ž6Ã'1ÃP/Ã0®2ÃÈ/ÃP‘/à “0À,ÃÐ44ðc4Ã0I.à (-ä5ÃpÁ4ðu1Ã0¢4Ãï/ÃÀ3à×/Ø3Ãà…-ä1ÃÔ-àõ*ÃÐó)ÃÀ 4à`.À /Ã@ù,ðò1ð]5àË1ÃP2à 1Ãr/ÃpP2ÃÀõ7Ãû-à Ã(Ã`e(ÃÐ &Ã`;/ÃÀ%0ÃP/ÃÐF1à 1Ãày/ö.Ãàs0ÃË5àÑ0Ã~-Ã3/ðŸ*ÃÐ"7à<4ÃPs4Ã!2Ã@ÿ+ÃÀ®.Ãàð0Ãày/à (-Ãp÷+Ã@ç/Ã@á0Ã0Ì-ÃÂ0Ãð).ðò1ÃÀ=,Ã@‚+Ã-0Ã`;/à “0ÃÀ´-Ãpñ,à 2Ã'1ÃP/Ã`#3ÃÐÃ1ÃÐj+à65ÀÜ6ÃÐ44ðc4ÃP/Àƒ0Ã0%4à {4Ãàm1àã-Ã0À/Ø3Ãl0ÃPü2Ã0C/Ãз3Ãh;ÃH6à 1ÃT4Ã0%À.à 3ÃÈ/Ãàa3ÃÎ*Ãï/à ò5Ãr/ÃÐ@2Ã@R3Ãàg2Ã`G-à 2Ã4Ã0C/Ã`²0ÃÑ4Ãð /Ãày/ÃÐX.Ãr/ÃÐÃ1ü1à /Ãr/Ã0¨3à 3ÃPä6Ãн2Ã`Ð+Ãp,8Ã@ó-Ãð4Ã3/Ãpn-Ãð/-Ã0´1Ã`G-ÃÚ,Ãpë-Ã],Àk4Ã0%4Àƒ0ð{0Ã05à65ÃÀû6À}1ð/ÃÀ1ðà4ÃÝ2Ãàs0ü1ÃÀ1.à¹4ÃE0Ãp»5ÃP2ÃÝ2ÃpÍ2ä5Ã`4Ãàg2Ã` 3Ã7ê4Ãн2ÃP2ÃÐÏ/Ã-4ÃÀ5Ãðù5ð‡.Ãð¬-Ã0´1ÃÀœ1Ã@½6ù8Ã` 7à ò5ðÚ5ÃÀ%0Ã`Ž6Ãà[4Ãðÿ4Ãð|5Ãï/Ãð‚4Àè4Ãàa3ÃàÌ6Ãàº9ÃÑ4Ãðj8Àâ5ð .ÃÀ3Ã<8Ã@";ÃpÁ4ÃÀ–2Ã@Ã5ÃàO6Ãð”1ÀÊ9ÃÀû6ÀÊ9Ã@ ?ÿ7ÃPê5à u5Ãt9àB3Ãp:ÃðR<Ã@";ðW6ÃÀŠ4Ãàs0ð{0à$8ð'>Ãñ9ÃÀï8ðì2Ã@É4Ã@Ÿ;Ã’4Ã@½6à¿3Ãб4Ã0r<Ãt9Ãp;Ã@«9ÃPg6Ãб4ÃPö3à {4à K<Ã5Ã*;ÃP´>ÀS8à “0Ã09à W:à‰<Ãp=Ã0¢4à c8ÃÀr8Ãb<Ãp©8ÃÅ6ÃÀ3ÃP[8ð9;ð?:Ãð4ÃÀ3Ã0„9Ã`v:Ãàa3à¡8ÃPg6ÃàÌ6Ã@@6ÃT4Ã0œ5à9ÃÐ"7Ã0%4Ãðù5ðBÃ0Š8ÀÐ8ÃàÆ7ÃÀH?Ãð^:Ãp>5ÃŒ5Ã@É4ðÎ7Ã69ÃPð4ÃÐ.5ÃÐ"7Àk4Ãà7:Àq3Ã5Ã@.9Ã`í;ð¼:Ãðÿ4à¿3Ãp¯7Ã÷8ÃÐ(6ÃÀé9ÃÀï8Ãp»5ÃЇ;ÃЇ;Ãt=à¡8ðÈ8Ã@«9à W:ÃË5à o6Ã3ÃÐ44í:ÃàØ4Ã92ÃÀ3ÃÐ{=Ãðd9Ã@·7ÀY7Ã`ÿ8ÃÀœ1ðÎ7À1Ã@X2ÃÀ5Ã`Ž6ÃÑ4à³5Ã@>Ã0œ5ð¤>Ãh;ÃÀ6ÃÐ¥6àN1à E=À7Ã@Ÿ;Ã@(:ÃàÀ8ÃàÒ5À_6ÃÐ:Ã÷8ÀÖ7ÃT4Ã@±8Ãë:ÃðX;ðo2À0ÃÐÃ1Ã@½6Ãàg2Àî3Ã09Ã<8ûBÃ`ÿ8ÀY7Ã@R3ÃŒ9Ãðp7Ã@p.Þ2à ]9à65ÃpÁ4Ã09àÑ0à<4ðE9ÃÐ9ÃðÛ:Ã07ÃÀ3ÃPØ8ð]5ðÚ5ü1ÃpV1Ã0:ÃPÀ<Ãàº9Ã`š4Àk4Àq3Àk4Ã0¢4Àî3Ã@±8Ã@@Ã0õ;Ã` 7Ã`6Þ6Ãðÿ4ÃN5Ã@Õ2Ã`)2À_6ð3ÃP2ðÔ6Ã0Æ.ÃÐR/Ã`50ÀÜ6ü1Àâ5Ãp£9Ãß<Ã@X2Ã`ÿ8à*7Ã` 3Ã],ü1ði3Ãð 3Ã4ÃT4Ã5Ø3ÃP2Ãàü.ÃPy3ÃpD4ÃàØ4Ã7à ‡2Ã`)2ÃN5ð]5Ãð‚4ðu1Ã0:Ã@:7Ã-4Ã?1Ã0À/Ã0ð'Ã`6Ãpå.àÝ.ðà4ÃàÌ6ÃË5Ã@F5Ã0´1Ãày/ð]5ÃŒ5Ã`)2ðì2ðà4ÃÐ(6ð{0ðà4Ã`50Ãð4à¹4ð3Ã-4ÃÐ8Ãðó6Ãph.Ã`¸/ÃÐ"7Ã@48à þ3ÃPs4ð/Ãàä2Àè4Àq3à 6Ã8ð{0ÃP[8ð3Ãà®;ð¼:Ã×3Ã;ÃÐ@2ÃP/Ã33À_6ÃT4Ãàs0ÃP©+Ã`¬1àB3ÃðŽ2À_6ÃÀ1Ã`v:Ã`¬1Àw2Ã4Ãàð0ði3Ã,Ãà )ðæ3à 6ä5Ãë:Ã`5ÃÀé9Ã07Ã012ÃàU5Ãàä2Ã`¦2Àè4Ãàs0à 1Ã!2Ã'1ÃP2Ãð2àT0À$+ÃÀ1Ãàð0Ã071Àw2Ãàö/ÃÐç+àZ/ð/Ãð 3ðu1ÃÈ/Ãðˆ3Àâ5ði3Ãp<à*7Ã`#3Ãð/-Ã],ÃP.Ã0Š8ÃpD4Ã0¢4ðc4ÃÐ8ðà4Ã@Ï3Ãn:Ãз3Ãð2Ã3ðÈ8ÃàU5ðþ/Ãð/-ÃðÊ(Ãpz+ÃÀ5ö.Ã0®2Àe5Ãб4ÃÀ6ðì2à 3À0ðò1Ãp\0Ã0Æ.À1ÿ7ÃPü2Ãã1ÃÀf:Ã@R3ð“,à*7Ã`#3ê4Ãp£9ÃPö3ÃðX;Ã0r<Ãðÿ4Ã05ÿ7à ò5Ã@L4Ã07ÃàÒ5Ã0¨3ÃÐÃ1ÃÀ%0ÃpD4à 3Ã~-Ã@Û1Àk4Àè4ÃN5Ãàa3ÃpÁ4Ã0:à 0ÃÀ1Ãp¯7à à8Ã`2Ãé0Ãà.Ãн2Ã@@6ÃÐ¥6à K<Ã@±8Ãðš0Ãð /Ãàð0Ã0:ÃN5ÃÀ1.Ãð|5Ã@á0à þ3à¹4Ã`ô%ÃP.Ã`)2ð/ÃPy3ÃPa7Ã`/1Ã@Û1ÃÀ~6Ã`¬1ð/Ã92ÃÐ@2Ã`Ž6ÃàÆ7ÃÐ(6Ã@.9Ã0–6Ã0+3Ã3Ã@:7à<4Àô2Ãp¯7ÃPö3Ã@p.ÃàØ4ÃÀ„5Ã06ÃàI7Ãp>5ð/Ãð0ÀÖ7À.à ‡2à {4Ã`5Ã`”5à9ðÈ8à9ÃÀx7ÃÀ+/ÃP -Ãз3ðu1à Ÿ.ÃÀ2Ãðÿ4ÃÐ.5ÃàI7À_6Ã-0Ã` 3à u5ð?:ÃÀ¢0ÃÐR/àT0Ã` 3Ãp>5ÃÐL0ÃÐ:ä5ÃÑ4ÃàÒ5ÃÐÉ0ÃPy3Ã` 7Ãz8Ã?1Ã012Ãð0à 2ÃV>Ã@Õ2Àâ5Ãà[4Ã`š4à {4Ã0Æ.Ãð /ä1à 0Ãð”1ð/Ãl0ðÚ5Ãà´:ÃÀl9Ã`)2Ã3ä5Ã7à 3Ãõ.ê0ÃÔ-àã-ÃÀ–2ðò1ÃП7Ã7ð3Ã`;/ÃÑ4ðc4ÃÀŠ4Ãàä2ÃàÌ6Àq3Ã0+3Ã@^1Ãf1Ã07Àô2Àâ5Ã@^1ÃÀ7-à ™/Ã`¾.à 3Ã`Ä-ðþ/ÃpÇ3Ã69ÃÀ5Ã0[+à «,ði3ÃpP2Àô2ÃPü2ÃÐÏ/ÃÀ´-ÃЫ5Ã-4ÃK+Ø3à³5ÃpV1ÃÐ(6ÃÀ2Ã0À/ÃÀÀ+ä1ÃÀœ1ÃÐ44ÃÐ:3Ã`Ê,Ãpý*ä1Ã69ÃÀõ7Ãpß/ÃP£,Ã@48ÃÀ3Ã0À/àT0ÃÀœ1Ãàm1ð/À_6Ã0Ò,Ãl0Ã@d0ð]5ÃPê5Ø7à u5Ã@R3ÃÀ¢0ÃZ3ÃÀ–2Ã~-àÅ2ðÚ5Ãàê1àË1ÃP&,Ãx.Ãàs0à­6Àe5Ãàa3àH2ÿ7ÃÑ4Ãpñ,ÃÐX.Ãp¯7Ãð”1ð“,ð‡.ÃÈ/à 6ÃÈ+Ã@^1ÃÐ:3Àw2Ã0¨3Ãðó6Ãà-Ã07ÃÐ:3ÃpV1ðæ3ÃP1Ãý7Ã?1ÃpÓ1À0Ãp,8À7ÃPs4à¿3à ™/Ãpt,ÃÀ7-à ì6À›,ÃP0Ã0=0ÃpP2Àw2Ãàü.à 3àl,Ã`G-ÃW-Ãû-Àw2Ã@Õ2à¿3ðò1Ã@á0ü1Ã0¢4ÃÐ.5ÃÀ3Àú1ÃPö3Ãð).Ã`5ÃpÁ4Ã`Ž6ÃðX;ÃPð4Ã07Ã`²0Ã9.ÃÐÉ0Ã33ÃЫ5àÑ0ÃÀ3Ãl0Ãn:ÃP¨@à06Ã@F5Ã` 3À-Ãpµ6Ãð0à «,ðÔ6Ã@Õ2Ã0´1Ãн2ÃP/ÃÐR/à 0Ãé0ð3í:Ã`ÿ8Ãà.Ã071àÅ2Ã0¢4ÃpÍ2Ã-0Ãé0Ã0+3ÃP£,àÑ0ä5Ãàð0Ãðp7Ãð|5Ãà=9Ã3/Ã4ÀÜ6Ãз3à<4Ã@:7Ã@á0à ™/ÃpP2Ãàg2à 1Ã012à ‡2ðu1Ã` 3ðo2ðÂ9ðQ7ÃpV1à¿3Ã!6Ãð0Ãàg2Ã@j/à “0àÑ0Ãð2Ãpß/ÃP0Ã@Õ2Ã05Ãàê1Ãàg2à 3Ã0%4ÃГ9ðE9Ã0 8à ø4ð/Ã?1à ‡2ä5Ãðˆ3ÃÈ/ÃP1à>ð]5ÃÐÏ/à`.Ã`A.Ã071Àq3à 2Ã`š4ÃÈ/Ãð0Ã0º0Ã-4ÃÐÏ/ÃpP2à u5Ã` 3Ã`Ð+Ãpë-ð/ä5ÃàÒ5Ãàg2ðæ3Àô2Ãð4à “0Ãp*Ã`¸/ÃÀ 4Þ2ðò1Àô2Ã@Û1Ã`5Ã`2Ã` 7à­6Ã`”5Ã0U,Ã07Ã`50ÃГ9Ã@L4Þ2Ã@F5Ã0Ò,ÃÀ3à 1ÃàØ4ÃÀ¢0ÃP0Ã`¦2ÃÐL0ÃP2ÃÐÏ/Ã?1Ãðš0ÃPê5Ãpb/Ãð¾*ÃЙ8Ãñ9ðc4ÃP1Ã33àH2ÃPs4à æ7ÃàO6Ã69à (-Ã92ÃÀ2ÃÐ@2ÃPs4Ã`2ÃPü2Ãб4ÃàØ4Ã`Ð+ði3Þ2Ã@Û1ÃP2Ã@½6ð¶;Ã0I.ÃðŽ2Ã@±8Àú1àN1Ã0C/Ã@½6à {4à «,Ãð‚4à ò5ÃÐ"7à o6Ã’4à¹4Ãðù5Ãp,8ÃÐ:Ãàä2Àâ5àN1Ãð2Ã0´1à 3ÃÐ ;ÃÑ4Ãðˆ3Ã` 3Ã`4ÃPg6Ãã1ð¼:ä5ÃЫ5ü1ð]5Ãb<ðÂ9Ãз3ÃPä6ðo2ÃË5ÃÐ44ÃÀH?Ãp£9ÃÀ3Ã`²0Ãð±AÃPÆ;Àô2ð]5ÃЙ8Ã0%4ÃàÌ6ÃPa7ÀÐ8Ã0=0ÃÐ@2ð9;ÃpêBÃðá9Ãðó6ÃàI7ðÈ8ÃP.À‰/Ã`4Ã÷8Ã@R3ÃP‘/ÃPa7à 2Ã0„9ÃÀõ7Ãðj8ÃP?à i7ÃP[8ÃPU9ÃÐ:À/>à06ÃÀã:à=À/>ðÚ5à ™/Ã07à ]9ÃЙ8ðÔ6ÃÀ5À_6àH2Ãðá9ÃÐ:ÃPÞ7Ãðv6ÃPs4Ãpö@Ãh?À}1Ã`š4Ãp‹=Ã!6Ã0ï<ÃÝ2Ã0U,Ãðí7à Q;à;ÃPy3Ã@í.ÃÐ@2ðÔ6ÃPÌ:ÃPü2Ãðç8ÃÀõ7Ãðù5Ãð4Ã0À/Ãðó6ÃàØ4À;ÃN5Ã8Àô2Ã0I.ÃÝ2ÃàØ4Ãp:ä1ÃàÌ6à*7ÃÀã:Ø7à:Àâ5ÃÀx7Ãpß/Ãðj8Ã7ÃÐ"7Ãp27Ãðv6ÀÐ8ðc4à :Ã@·7Ã@:7Ã0œ5Ã06Ã÷8Ãðí7ÃPö3à ø4à=Ãðj8Ã`‚8Ã06ÃpÁ4ù8à ì6àN1Ãð4Ã@48Ãð|5àB3ð¼:Ã06Ãб4Ã`50Ãp©8À/>ÃPº=Ã@·7ÃÐ.5Ãh;Ãðç8Ã@±8ù8ÃP2ÃPy3Ã@Õ2ÃÀ6À¸<Ã0´1ÃPO:ÀG:ðÚ5ÃÀõ7Ãðp7à$8Ã`6à65Ã`5Ã<8ê0Ãð2à¿3ÃP2À0ÃÀ–2Þ6Ã` 3ÃÀ5ÃàÒ5Ãðó6Ã@F5Ãàü.ÃPs4ÃÐÃ1Ã@ç/Ãð|5ð¶;à {4ÃPä6àƒ=Ãàä2ÃÀÝ;Ã@X2à c8À.Ã0œ5Ã012Àw2Ã07Ãðš0ÃPä6Ãðˆ3ðQ7Ø7ÃP2àË1ÃЫ5ðÎ7ÃÀ®.Ã7Ã0 8ÃÀû6Ã'1ÃP2Ã’4ÃP—.Ãpñ,Ãp»5Àq3Ã0¨3à 1Àô2à¿3Ãð 3à 3ÃÀx7Ã0œ5Ã@:7ÃÀû6ðì2Ãðˆ3Àq3Ã@±8àB3Ã@ó-Ã'1ÃŒ5Ã@X2à ".Àè4ÃPê5ÃÀ 4à i7ÃP2Ã0û:ÃðŽ2Ã0[+ÃÐ:3Ãðš0Ã8ÃpÇ3ÃP2Ã0¢4Ã`)2à 6Ã`;/ðo2ÃpP2Ã-0Ã`/1Ãà=9Ã3Ã`¦2Ã@@6ðo2À‰/ÃÐF1à¹4Ã@Ï3Ãpµ6ÃÀ~6à à8ä5Ã`5ÃPÌ:ÃÀl9ÃÐ44ÃpJ3Àq3Ã÷8Ãàm1Ã`¸/ðÚ5Ãðv6ÃÅ6ÃàU5à 3ÀÐ8à Ú9ÃÀ3ÀY7ÀY7à*7ä5à u5Àî3ÃÀï8Ã’8ÃPð4ÃÐÃ1Ã`š4Ã0 8à•:ðò1ÃÐ@2Ã0:Ã0¨3Ã5à$8Ãàa3à 2ÃpÙ0ÀÜ6Ãï/ÃÐ9à65à­6Ã7ÃÀ`;Ãp :ðE9ÃÐF1ÃP‘/ÃÅ6À1ÃB7ðÔ6ÃÐÃ1Ã'1à “0Ã` 3À7ð?:Ã3ÃT4à¡8à c8ÃÀ³BÃà¢=ÃÀ1.Ãàä2Ã0À/Ã0–6Þ2Ãf1ÃÀl9Ã92Ã0º0Ãàa3à ‡2ÃpÙ0ÃÀr8Ø7Ã`²0ÃÐÕ.Ãð|5Ãà+<Ã3Þ2à ‡2ÃŒ5Àè4Ã0x;Ã69Ãp»5Ã0¢4à 1Ãp,8Ã@É4Ã0¢4Ã5Ãðÿ4ÃPy3Ãð|5à à8Þ2ÃàO6Ã@¥:Ãn:Ã@Õ2Ãï/Ã-0Ø3ÀS8Ãàä2ÃT4ÀY7Àè4à i7ðø0Ãð2Ã0 8ù8Ãðÿ4ÃPÞ7Ãé0Ã@F5ù8Ãp¯7ÃÀû6Ãðˆ3Ã0®2Ã@F5Ãt9àË1ÃPê5à 3ÃË5ÃÑ4Ãû-ðu1ÃN5Ãp=ÃÑ4Ã@Û1Ãð4Ã@X2Ãày/Ã33Ã`/1Ã33ÃÐ:3ÃpÁ4Ã9Ã'5Ãð1Ã0I.Ãpb/ðæ3ðò1Ã`2Ãð1ÃÐç+Ø3Ã`ˆ7àÅ2ÃÐÃ1Ãð1Ã` 7à›9ÃpÍ2ÃE0ÃÀ¨/Ãp;ä5Ã-4Ã7Ãðÿ4ÃÀ3à o6à ‡2ÃË5ðø0ðþ/ÃÀŠ4Ã@v-ÃÅ6Àe5Àq3Ã;Ã05Ã’4ð/Ãp©8Àw2ÀÖ7Ãë:Ã?1à 3ù8ÃÐ@2ÃP0ÃÐL0Ãðÿ4Ã`¸/ü1ÃÐÉ0Ãð0Ã!6à ‡2ÃàC8ÃZ3Ã4ÃàU5ÃðR<Ã5ÃH6Ã0%4ÃðÕ;Ã@48Ã@^1ð‡.Ãð¸+Ãp:ê4Ãp,8Ãðí7ö2ÃÐÉ0ð™+Ã`S+Ãð¦.Ã0œ5ÃZ3àÅ2Ã`Ž6ÃPy3ð/ÃÔ-à*7Ãph.Ãàü.à þ3Ã’4ç;Ãý7ÃðŽ2ÃE0ÃÂ,Ã3Ã`;/ÃPö3Ã`¬1Ã`6Ãà[4àã-ÃP2ð"*ðo2ÃðŽ2ÃЫ5ü1Ãp\0Ãàs0À•-Ãð#/ÃðG)ê0Ã`Ä-Àú1Ã012ÃpP2ö.Ãð1Ãx.Ã?-ÃZ3ði3Àq3ÃÐÏ/Ãæ*ÃðŽ2Ø3Ã'1ð{0ÃÐL0ð+ÃÐÉ0ÃK/Ã`50ÃÑ4Ãà…-À1Ãï/Ãé0Ãðí7Ã@";Ã071ð/Ãðš0Ãï/Ã`Ê,Ã0Þ*Ãàö/Ãàð0ÃP,+ÃÈ+Ã`5Ãpb/ö.ð‡.Ãðç8ÃÐX.Ã`Ö*àH2à~)ÃpV1Ãï/Ãàä2ÃÀ3ÃÔ-Ãpë-ðþ/àÑ0Ã0[+à ".à ".Ãàm1ÃÀº,Ã`ù9Ã`š4àT0ÃpJ3Ãp&9Ã012ÃP‹0Ãðš0Ãã1Ãðš0ÃP.ÃÂ0Ãàs0Ãày/ÃÐ¥6ð .à ø4ÃÀ¨/Ãf1ÃÐÃ1ÃK+Ãð0À.Ã0U,Àú1Ãi*ÃpÁ4Ã3/àH2Ã@ù,À•-Ã0U,Ã`â(ð“,ðø0ÃÐ¥6àH2Ãàä2àl,ÃÐÿ'ÃÀ+/Ãð²,Ã0º0ÃÐ^-Ãð”1Ãà-ð“,Ã`¾.àŠ'ÃpP2ÃÀõ7ð“,Ãð/-À­)ÃPö3ÃðŽ2ÃÀ7-ÃP2ÃÐç+ÃÐL0Ãpn-Ãà+Ãàü.ÃP1Ãàs0Ãï/ÃÈ+àï+Ã@ç/ü1à 4+ê0ÃÐÏ/Ã!2ÃK/à 1À}1à /ð¥)ð{0Ã3/ÃÐá,Ã0Þ*ÃÐÃ1ÃK/ð .à 4+Ãàö/Ãà,À$+ð3Ã9.Ã`Ê,ÃÐá,ÃP-Ã012ÃÀ¢0Ã`G-Ãpb/Ã<8Ã5Ãpñ,Ä,Ã~-Ã@É4Ã`2ÃpJ3à¹4ð{0Ã92Ã`G-àH2Ã@R3ÃÐí*ð-Ã0º0Ãð2ÃÀ´-À1ÃÐL0ÃÐ^-ð/àÅ2Ã0%4Ãð²,Ãpå.Ã@.9Ãð2ðŸ*Ãð/-Ã@+Ã@á0Ãpb/ÃÀ1ÃÚ,À.à ±+Ã`¬1Ãp»5ü-Ã`/1ÃÀÆ*ÃÈ/Ã@p.à 2Ã~-Ãð 3Ãàg2à ™/à Ÿ.ÃH6Ã0¢4ÃÔ-Ãp>5Ãð¦.à ".Ãðj8Ã` 7Ãp )à 0Ã@ÿ+àZ/àZ/Ã@Ã5ðK8Ãé0Ã`¾.ÃPÇ&Ã!2ÃÀC+à «,Ãày/Ã0Æ.àÅ2Ã`²0Ãpt,ði3à9Ãpb/à «,Ö)Ãà+ÃÐí*ÃE0ÃpÓ1Ã0I.à .,Ã`Ž6àÅ2Ã`¾.Ãð /Ãp27Ø3Ãý7à­6Ã0¨3ðþ/Ãàm1Þ2ÃÀÆ*àÝ.Ã'5à¡8Ãðù5Þ2Ãà,ðÎ7ÃÀ5ÃE,Ã0®2ðì2Ã0´1Ã`²0À /ÃP1Ã0®2Ãð /Ãr/Ãðÿ4Ã?-Ã0U,ÃPs4ÃpÍ2ÃpÓ1Ãõ.àÑ0Ãàä2Ã0Ò,ÃP…1Ã07ÃÀ3ÃE0Ãr/Ã@R3ÃÀ1Ã0+3Ãx.À}1ðc4Ã0+3Ã0´1Ã@ù,Ã0Ø+Ã@L4à ‡2ÃÀ´-àÝ.ü1Ãàg2Àú1Àú1Ã3/Ãp*Ã@^1ÃpÇ3Ã%'ÃP2Ã@í.ðþ/ÃPs4Ãàa3Ã`š4Ã` 3Ãæ*Ãðš0ð‡.ü1ÃP -ÃK/à×/Ãàê1ÃÀË>Ãl0Ãàö/à¡8àZ/Ã`/1ÃP2Ã!2Àw2À}1Ãà+ÃÐ^-ÃðŽ2Ã06Ãp¯7ÃÀ–2Ã~-Àî3ðu1Ã`5Ãà.à /ÃQ*à 2Ä,ÃÐÕ.ÃÀ–2Ãàö/Ã09ÃÐ44Ãðó6Àƒ0Ã`50à¿3àZ/Ã×3ÃÀû6ÃŒ5ÃÀ%0Àƒ0ði3ÃpÍ2ÃPs4ü1Ã`#3Ãàa3ÃàØ4ÃÀ„5ÃàO6Ãt9ÃÐ44Ã0C/àË1ÃpÇ3Ã06à<4à 2Ãàä2Ã07Ãðó6à þ3ÃT4ÃPg6ÃH6Ãð 3ÃÀx7à*7ð-Ãpt,Ãð2Àe5ÃÀ 4ÃÀ3àË1Ãðó6Ãp>5Ãðj8Ã@48ðc4ÃH6àN1ð/Ãз3ðc4ÃPg6À0à {4Ã0®2Ã@Ï3ÃÐ44Ã`4Ã@á0àË1ÃpD4ÀY7Ã@:7ÃÀï8ÀM9àÝ.ÃÐ@2Ã`4à u5Ã!6Àw2ÃpJ3Ã06à 3ÃàÞ3Ãp86Ã@L4ÃàÌ6Ã@F5Ãà[4ÃPs4ÃÐF1ÀS8ðÚ5Ã’4Æ6ÃÐR/ÃPa7ÃÀr8ðÎ7ÃÀ1Ã0¢4Ã3Ã@Ã5ð]5Ã0–6ÃàO6Ã`š4ÃÀ5Ã`|9ÃÀ3Ãàê1Ã`š4Ã@±8Ãp©8à 1Ãàa3Ã06ÃpP2Ã@ó-Ã!6ÃÐ@2ÃàU5Ãàð0Ã@48Ã`¦2Ã`A.Ã0´1ÃÀ1ÃpÁ4ÃÀ 4ÃÀõ7Ã9Ã@Ï3Ãн2Ã33Þ2Ã@Ï3Þ2ÿ7Ãã1ä1àZ/Ãàê1à 3ÃÐÃ1à×/ÃpD4à 3ÃP2Ã0„9Ãð¦.Ã@F5Ãàä2ä1Ã@F5ÃpÁ4ÃðÕ;Ã4ÃÐÃ1Ãàg2ÃàÆ7Ã3ÃH6ÃÐ:3Ã0:Ã5Ã@L4ÃÀ%0Àq3Ã`2Ã7ðÎ7à .,ÃN5Ã@(:ÃPO:ð¼:Ãàs0à×/à 2ÃpV1ð«(Ã0C/Ã`8ÃðL=ÃàÀ8Ãð‚4ÃPä6í:Ãàº9Ã5Ãð#/Ãà[4Ã@«9à ?>ÃÐ:3àN1Ã`¦2Ã@d0ÃÀ¨/ÃÀ5ÃÐ"7ÃZ3Ã`4à 1Ãp\0ÃpÁ4Ã`4àÅ2Ãà=9í:Ã@Ï3Þ6àH2à×/Ãàs0Ã’4Ã!2Ã!2à Ú9ÀG:Ã`6ÃÑ4Ã`¦2ÃÐÉ0àÑ0àH2Ã0C/ÃÐ"7Ã@.9Ã`Ž6À0Ã`6Ã0û:ÃÐ:3Ã@±8ÃPÀ<ÃP2Ã`”5Àè4àB3Ãðÿ4ÃÀr8Ã@.9Ãàm1Ãt=ÃÐ@2ö2Ãðv6Ãà.Ã0–6Ãp\0ð]5à³5Ãðj8Ã5Ãàg2à þ3Ã9àB3ðc4Ã;ÃÀx7Õ>ð‡.ÃÈ/ÀS8Ãï/ü1Ã>Ã0À/Ã33Ã@>ÿ7ÃPm5à¹4à¹4Ãp;Ãf1ÃP1ÃH6Ãp»5Ã`6à ‡2Ã0º0à ‡2ÃÐ@2ðÚ5Ãð#/Ã`Ä-Ã@F5ðu1Ãð‚4ÀG:ÃÀÝ;Ã` 3Ã0¢4Ãðÿ4ðc4Ã0:ÃŒ5ÃP[8Ã-4Ã0%4ÃÀ„5Ã`¸/Ã0À/Æ:ÃPü2ÃÚ,Ãpµ6Ãðç8àB3à­6ÃpÁ4à¿3Àq3à ".ÃàÒ5ö2ÃŒ5ðþ/ÃP2ÃŒ5à¡8ÃÀx7Ã@^1Ã`²0ÃÅ6Ã7ÃP,+Ã0Ì-ÃP…1Ã@L4Ã],ÃPs4Ã'5Ø3ÃP0ÃÀ3ðæ3Ã0œ5ÃÅ6Ãàä2Ãðù5Ãp>5Àô2ð/à ì6Ãн2ÃÀ„5ÃÝ2ÃÑ4ÃÑ4Ã@Û1Ãph.à65ði3Ã@É4Ãp,8àB3Ã`/1Ãph.à Ÿ.ÃàÞ3Ã07ð3à c8ÃÐ.5à`.Ã@É4À_6ÀÜ6ðQ7Ãà[4Ãà*Ã0=0ÃH6ä1Ãðÿ4Ã0„9Ãà )ÃP/ÃÐ¥6Ãý7ü1ÃÀ5à à8À1ðþ/ÃPü2ðæ3ÃZ3Ã`5ÃàÞ3Ãð‚4Ã'5àË1à ø4ÃÀ3Ãû-Ãp86Ã@d0ÃpÙ0ÃÀ2ÃàÌ6ÃPs4ÃpÁ4ÃЙ8Ãб4Ã@Ã5Ãðj8Ã`5à 2àT0àé,Ãr/àT0Ãð1ÃPö3Þ2Ãt9Ã0´1Ã0Ò,Ã)ÃPa7Ãp\0Ã?1ÃÐá,ÃðŽ2ä1ÃàO6Ã`¬1ÃE0Ã`¸/Ã@ó-Ãà…-à 2ÃÐÏ/Þ2à u5Ø3à 1À‰/ÃÐv)Ã3/àT0Ã07ÃÀ„5à c8à {4à {4À1Ãà[4ÃN5Ãý7Ãàg2Ã071ÃÐù(ÃÀï8Ã`Ê,Ãàü.Ã`¾.Ãï/Ãð1ÃàI7Ãð²,Ã0º0ÃÀ¨/Ã'1ÃðŽ2ðc4Ã09ÃK/ÃW)ÃÀ3Ã`S+Ãð5,Ãõ.ð,ÃÐÉ0Àw2ÃPa7ÃE0Ã`6ÃÝ2À.Ãð¾*Ã@p.À•-Ã0®2Ãàg2Ãf1Ãð 3ÃÀ´-À0àÑ0ÃPê5Ã0´1à @)ÃQ.ÃÐ(6ÃàÆ7Ãн2Ã@Ï3Ã@d0ÃŒ5Ãðp7Ã0À/Ã5ÃÅ6Ø7ÃÀ1À¿&Ãõ.Ãx.ðò1ÃP,+Ã’4à ™/ü1ÃÐÃ1ÃP…1Ã`;/Ãpb/Ãð2À0ÃàØ4Ãàü.Ã`#3ÃP2Ãð¬-ÃÐL0à c8ÃÀ–2à þ3Ã` 3ÃŒ5ÀÊ9Ã@·7ÃÐ(6Ã-0Ã0O-Ãð¬-ÃÔ-ÃPg6ÃÀ1.à “0ð3Ã@·7ÃÐ@2Ãðÿ4ðì2ðæ3Ãà+Ã-Ãpb/Ã0¨3ÃP…1ÃP…1àÅ2Ã@d0ÃÅ6ðW6Ã33Ãø'ÃÀO)Ãpb/ÃÑ4Ã@Û1àÅ2ÃÀ´-Ãp\0à¹4ðø0À-àB3À /ÃPs4ÃpÁ4À.àé,ðo2ÃpV1Ã`Ž6ÀÜ6À}1Ãr/àã-à ‡2Ã0=0Ãp\0ÃðŽ2À}1à³5Ãð0ÃÀ1.à~)Ãð).àÑ0Ãð¸+Ã0Ò,ÃW)Ã`¦2ÃPm5Ã`/1Ãà…-ði3àZ/Ãàs0À.Ãðˆ3ð-ÃP1ÃÀ¢0àÅ2Ã0À/ÃÀÀ+ðþ/Ê+Ã0+3ÃH6à×/Àk4ÃPy3ÃÀ7-Ã0´1Ãàa3Ã’4ÃP—.Ãû-ÃP‹0Ã92Ã0´1ÃPy3Ãð1ÃPÇ&Ã0Æ.Ã`2ÃP2ü1ðŸ*Ãð4Ãàä2ÀY7ÃÀ6Ãp*ÃðG)àl,ÃÎ.Ãp>5ÃPö3Ã`50Ãàa3Ã×3Ãðí7Ãpn-Ã0Ò,ÃP/ðì2Ã@Ï3à65ÃPü2ÃÔ-Ãp\0ö.Ã3ÃÀ1Ã0´1ÃPØ8Ãðó6Ãð 3Ã0º0Ã-ÃT4Ã@X2Àƒ0Ø3ÃE0ÃÔ-à<4ÃÈ/Ãð”1Ã`”5à³5Ãà[4àŠ'Ã`)2Ã0C/Þ2Ãðš0Ã4à þ3Ãp,8Ã0®2ÃpÍ2Ã`/1Ã`p;Ãàa3ÃZ3ÃÐ:ÃPü2Ã0¨3à 3Ã012ä1Ãð/-À}1Ã7à¡8à65ÃàU5Ãàö/Ø7à¿3ÃÐ(6Ãz8ù8ÃÐj+À.Ã`5Ã÷8à {4Ã@É4ÃÂ0ðÔ6Ãðá9ÃÙ=Ãàm1ÃPg6Ã`2Ã@Ï3ðo2ä1Ãà=9Ãp»5À‰/Ã3à¹4ÃPä6Ã@R3Ãp&9ÃÀ~6ö2à06Ã4à 6à§7ÃÅ6ÃàÒ5ÃpÇ3Ã0Š8Ã@.9Ãðí7ÃÐ@2Ãð‚4ÃЙ8Ãp£9ði3ÃàØ4à³5Ãð1ÃÀ2à­6ÃÐ.5ÃP0Ã`²0ÃP1à06Ã@L4ÃÀŠ4Ãð).ð{0à 1Ã0=0à ¼>ÃÐ.5ÃpÇ3Ã0C/ÃPs4Ã0I.à «,Ãx.Àk4ðu1ÃÀ1ð/Àe5ð¼:Ãàs0Ãðš0Ãð /Ã3ÃP2Ãpå.ÃP-Ãð¸+Ãpb/ÃP…1ÃQ.Ã0[+à /ÃÀŠ4ÃàO6à³5Ã071Ãà.ðì2ðì2Ãàü.Ã0º0Àô2Ãð#/ðu1Ã’4Ã9.ö.Ã0Ø+À /Ã`;/ðò1ÃpÇ3Ãày/à “0Ãp\0Ã@|,ÿ7ðò1ðø0Ãð¸+Ã`2àZ/à×/ðì2ð‡.Ãt9Ãp,8Ã`²0ö2ðà4ÃЫ5ð3à<4Ãx.à 0Ã@F5ÃÐ"7ÃÀï8ÃpV1Ãàö/ð3Ã0m(ÃÐÛ-Àî3Ã`#3à i7Ã@j/Ãàü.À /Ãpt,Ã`2à~)ÃÐÕ.à ".ÃÐ44à06Ã`Ž6Ãõ.ü-ÃÀÀ+Ãð²,ÃQ.ÃÀÆ*Ã0=0Ã071Ã`²0ÃK+À /à 1Ãð²,Ãð).Ãðù5ð“,À /Ã`)2ÃP1Ãðp7ÃÀ2àû)Àô2ð .àé,ö.Ã@@6ê0ÃÀ¨/Ã@ç/ÃpÇ3à 0à +ö.ÃN5Ãð 3à ç"Ã0y&Ã0[+ÃÐ^-à¿3Ãð0À_6Ã@½6Ã`¦2Ãà,ÃE0ÃÐF1ÃÀ6Ãà[4À0Ã'1ÃÀ6à 2Ã` 7ÃpÁ4Ã’8ÃÀ1ÃP1Þ2Ã0+3ÃP2ÃpÍ2Ã4Ã5Þ6Ã071ÃpV1ÃN5Ã0º0àÑ0àé,Ã`;/Æ6ÃÀ5ÃPg6Ä,Ãð¾*Ã@Õ2Ãð2ÃPü2ÃÐÏ/ÃpÓ1Àk4ÃÀ1.à 1Ã3/à i7ÃŒ5ÃÐ44à 2ÃPg6Ã`”5ÃÐÃ1ÃÀ%0Ã0œ5ÃÀ3ÃÎ.àÑ0Ãà.ÃZ3Ã@48Ãph.Àe5Ã@Ÿ;Ãðv6ÃÀ„5à 1Ãð0ÃP-Ãx.Ø7ÃÐç+Ãàö/Ã@L4Ã@ó-Ã0C/Àw2ðc4ÃH6À‰/Ã0¢4ÃÀ2ÃÀ3Ã0%4Ã`¾.ü1ÃÐÏ/ÃP/à¿3ÃàI7à “0Ãp27Ã0Š8À-à “0ÃÀœ1àË1ÃÂ,ðþ/Ãàa3À$+Ãl0à$8ÃàI7ð-ÃÐ.5ÃB7ÃPö3ÃÐF1Ãðv6ä1Àe5ÃàI7ÃÀ+/Ã0¨3ÃZ3Ã'1Ã@j/Ã9ðW6à 2ÃÀ2Ãð”1ÃPü2Ã-0ÃP‹0Ãðÿ4ÃÂ0Ãà‹,ÃÈ/Ãàs0ð™+ÃÀ3Ã@Û1Ã@(:ä1ÃPs4À5=Ã`2à 6ðÎ7À•-ÃpJ3Ã33Ã`”5ÃàØ4Ã@Ï3Ã06Ã`6Ã`/1À›,Ã`¸/ð/ÃP2Ãðš0ÃÀ5Àe5Ã0º0ÃÀÒ(ÃÐÃ1à06ê0Ã`Ö*ð™+Ã@|,Ã0I.ÃË5Ãð¦.ð{0ÃÀœ1Ãà.à ±+Ã@ç/ðø0Ã3/Ãàm1Ãpt,Ãf1à³5Ãt9ÃPy3ê4ÃÐÛ-Ã`#3ð/à à8ÃPö3Àe5Ã@Û1Ã@^1Àk4ÃP1Ã@d0Ãàü.àË1Ãàê1à¿3ÃÀI*ÃÀ2ÃpP2Ãð/-à 4+Ã`š4Ãð/-Ãð1Ãày/Ã@+à 1Ã06à “0Ã?1à 1ðu1à­6À_6Ã×3Ãp27ÃÐL0ö2Ã`¾.Ã@ç/Ã@X2ð .Ãðš0Ã0Æ.ÃW-àx*Ã0º0ð‡.à ±+Ãà[4ÃÑ4Ã`/1ðu1Ã`Y*ÃÀ1.ÃÀ%0à¹4ê0ÃW-Ãð¸+à 1Ã0À/Ãï/ÃÀ®.Ã`Ä-Ãð).Ãà)ÃŒ5Ãp¯7Ãàm1àZ/Ã`Ö*Ã92Ãà-ÃÀœ1Ã@É4À.ð/ÃàÞ3ð/Ã0´1ÃpÍ2ÃÀ7-Þ2ÃpJ3ÃÐd,Ã0ä)Ã9.à ¥-Ã@R3Ã`¾.à /Ã@|,Àô2Ãàö/Ã'1À¡+Ãà'Ã`M,ÃÀœ1ð/Ã@+Ãpñ,ÃÀ1.Ã0–6ÃÀº,Ã@í.Ãé0Ã071Ã9.Ã`G-ö.ÃÀœ1ðà4Ãà+Ã@ù,Ãï/Ãþ&Ãàa3Ã0:ÃÐ:à 1ÃP‘/Ã9.Ã`;/ÃÐX.Ãp€*Ã0À/ÃpP2Ã?1ÃÐ.5ÃÐÉ0À.Ãð5,à 0ÃT4ð/ÃÀ1ÃÀ3ÀÖ7Ã0ä)ði3Ã@|,ÃðG)ð+Ã@É4à ‡2ðì2Ã0C/Ã@Û1Ãï/Ãà.àH2à ".à³5ÃPð4Ã0®2Ø3ÃÂ,à×/Ãðí7Ãàa3ÃÔ)Ãà‹,Ãàð0Ã@ó-Ã@á0Ãàa3Ã05Ãàê1ðŸ*Ã0º0Ã0C/à c8Ãðp7À /Ã0=0àï+Ã071Ã@X2À•-àÑ0Ãã1Ãp>5ÃÀ3Ã` 3À7Ã`/1Àô2Ã3/Ã0´1Ãx.À›,Ã`;/Ã@É4Àè4ê0ÃÐÕ.Ã`â(Ãpß/ÃÀº,Ã0C/ÃÀŠ4à ½)ð‡.àT0Ã`ˆ7Ã0®2Æ6Ãðç8ðæ3Ã@L4Ã?1à ·*À¹'ÃÐF1ÃpP2ðì2ÃÐL0í:ÃP%AÃ@(:Ã`ˆ7Ãp¯7Ãð”1Ãp,8ÃÐ"7Ãð 3ÃÂ0à c8ðW6ÀÊ9à Ô:ÃË5ðQ7ðÚ5Ã!6Ã@^1Ã@±8ÀA;Ãp£9Ãà¨<Ã`ç<Ãp£9Ãý7Ã@¥:Ã`R@ÃàU5Ã0Š8ÃÐ9Àô2ÃP…1ÃÀZ<Ã0r<à þ3À¾;ÃH6Ãpö@ð?:ðÈ8Ãp>5ÃàU5ðW6ð¼:ÃPØ8Ãà®;Ã`ó:ÃàC8Ãp—;À7à}>Ã0Š8à§7ÃÀÑ=àw?à Ô:Àk4Ã`|9à}>Ã’8Ã06ÃÂ0Ãp,8Ã`2ÃðX;ÃЫ5ÃpP2ÃàÆ7ÃðÉ=ÃPm5à¡8Ã@@6à$8à K<ÃðX;Ãàº9ÃÀ 4ÃŒ5Ã0+3Ã0+3ÃÀl9à Â=Ø7à ì6Ã8CÃÐ:ÃPC<ÃðL=ÃðÏ<ÃPÌ:À¸<Ã@™<ÀÐ8Ã0ï<Ãp‹=Ã0~:Ã07Ãp :ÃÐ ;ÀM9ÃPa7Ã0 8À7à06ÃàÌ6ÃЙ8à i7àw?Ãà1;à›9à ì6Ã`4Ã@=Ã×3ÃðŽ2ÃpD4Ãx.ÃPÞ7Ãðp7Ãð”1Ã`v:Ã09Ã0:ÃàÞ3Ãà®;Ãp&9À_6Ãð|5ð¼:ÃPØ8ð¶;Ãn:ÃŒ5Ã3/ðÎ7ÃÐì?Ã$<à ò5ÀS8ÃÐ"7ð3<Ã@Õ2ÃЫ5ðE9Ãz<Ã@";Ã0~:ÃÐ ;Ãpµ6ÃÀ„5Ãp&9à¡8Ã'1ÃpÍ2ÀÐ8ðÚ5ÃÚ,Ã0 8ÃàC8Ã@øAð!?Ãð2ÃpÁ4À0Ã`/1à•:Ã!6ÃÀ„5ÃÐ¥6Ãð1à•:Þ2Ã`²0ÃÀ5Ã`#3Ãð4Ã0œ5à à8Æ6ðE9Ãë:Ãð2Ã@L4ÃPä6ç;ÃÀr8ÃÀx7Àú1ÃP1Ã0®2Ãðá9Ã06ÃàÆ7ÃàÆ7Ãð0Ãý;ÃÀ–2ðþ/ÃÐÕ.Ã-4Àk4Ã`2ÃÀ3Ãpµ6ðÚ5ÃÐ(6ÃðÛ:Ãà=9ÃÀ6ÃÐR/Ã3ðu1Àw2ÃÀ2ðþ/à Ú9Àú1Ã`p;à o6Ãð#/Ãàö/Àe5à ò5Ã92Ãà‘+Àô2Ã9Ã@.9Ã`ˆ7Ãpë-Àî3ÃàC8Àè4ÃpÇ3ÃpÁ4ÃÚ,ÃÐÉ0ÃPg6ÃPð4Ãt9ÃpV1ÃpÙ0à à8àB3ðò1à65Ãp,8Ãб4ÃÐÏ/à ™/à K<ÃÅ6ÃPÀ<Ã@(:à ì6ÃÐ@2à c8Ã0:à<4ÃÑ4Ã0¨3à Ú9ði3ÃðÛ:Ã0Š8ÃPs4ÃàCÃ05ð?:Ãð 3ÃÀ¨/ÃÀ3ÃPê5ÃÐá,À;À_6ê0Ã3ÀÊ9Ãý;à ø4Ã`#3ÃÐ@2ÃE0à¿3Ã@Õ2ÃpV1Ã0®2ÃÐá,Ã@Ã5Ã@L4ÃÀ+/ÃÐF1ðu1Ãé0ÃÀ„5Ã69ÃPê5Ã`A.Ã@j/ÃÀ6Ê+àÝ.Ãà1;Ãt9Ãà.Ã0+3Ãp86Ãà[4Ãf1À‰/Ãð2ÃÀ–2Ãð”1Àq3Ã@Ï3ðc4ÃÀœ1Ãð|5Ãðÿ4ÃÐþ<Ã`8Ã@F5ÃÂ0Ã@í.Ã@É4à þ3Ã’8ÃàÒ5ði3ÃÐ¥6Ã`ó:ÃpJ3Ã@^1Ã0%4Ã5Ãàä2Ãé0ðK8ÃPØ8Ã`4Ã0¢4Ãï/ðK8À_6ÃÐ:3ðò1Ã@·7Ã0À/ÃÀ6ÃPÌ:Ã@@6ÀS8à³5ÃЇ;Ã0ã>Ãë:ÀS8Ã0+3ÃH6ÃP1?Ãp»5Ãz8Ã@þ@Ã`ç<Ãp¯7à ]9à Ô:ÃðÃ>Ã`ç<ÃÀx7ÃÀï8ÃÐ ;à E=ÃÀï8Ãp…>Ã0~:ð-=À#@ðª=ð-=ÀG:Ã;ÃeFÃ@‡?Ã>Ã@";Ãp?ÃÁEÃPÌ:Ã0ã>ÃÐø=Ãý7ð˜@ÃÀÑ=Ã@=àq@à Â=À/>ð-=Ã`Ï@Ãð.Bð†Cð'>Ãð·@Ãð4Að@Ã`ÉAÃÀ*Dàô?Ã`Û>ÃàûCÃ@ìCð’AÃà1;Ãà>Ã0¿Dà²JàeBÃð:@Ã2DÃÀ³BÃ@‡?ÀpHûFÃpy@À”BÃ00GÃ@æDÃÀ­CÃ}BÃÐÂFÃP EÃ>BÃð«BÃP+@ÃÀ¿@ÃÀÑ=ðŒBÃeFÃ0Ý?ÃÁAÃpÀIÃpØEÃ@æDÃÀ›FÃ@ÈIÃð‡HÀvGðDà>àw?ÃÐEFðŒBÃpü?Ã`LAà GÃ0HCÀ¸<ÃðÃ>ÃP„FÃ0BDÃ&JËJÃpaDÃ`ç<ÃÀ*DÃúBÃP–CÃ0`?ÃÐÈEÃ0Ã0ã>ÃDEÃà`HÃèEà nKÃ@uBÃ@øAÀ”BÃÀ›Fð˜@ÃÀ$EÃSIÃP„FÃ`±EÃîDÃpgCÃ0­GÀÿEÃ@WGÃîDÃ0¿DÃPõHàÄGÃð HÃ0TAà È<ÃÙAÃмGàâBÃöMàÖDÃDEÃðFðŒBÃP EÃ0BDÃ0ÑAàÜCàÜCÃàxDð’Aà ¤BðDÃàZIÃPFÀ¦?À DÃÜGÃÐÔCÃPœBÃPŠEÃ0³FÃðIà ÷IÃÐWCÃÀ*DÃà`Hà €HÃÖHÃHÃ`·DÃÐcAÃ0•KÃÀ§DÃÐQDÃwCÃpsAÃ`Õ?à ŒFÃPDÃpðAÃ@þ@Æ:ÃÀÅ?Ã,EÃð±AÃYHÃ@oCÃàCÃÀGÃ`Õ?ÃP¨@ÀvGÃÍCÃàlFÃ`±EÀAàYDà ¤Bà=ð@Ãå;ÃP®?ÃÐQDÃ0`?ÃpðAÃ0àeBÃÐ<Ã0ÑAÃPéJÃÍCÀÐ8Ã0ÑAÃàéFÃÀH?ÃÓBÃà+<Ã`FBÃÐWCÃð¥CÃàõDÃð^:ðž?ÃpmBÃà@Ãpy@à ?>ÃPC<Ã`ÉAÃ`R@ð9;Ãß@à -AÃpmBÃp?ÃÀ§Dð3<ÃÐ<ÀBÃÓBà ?>ÃÐ<Ã0Ý?À @Ã`^>Ã?ÃÀ¿@Ãñ=ð¤>Ãð™Eð'>ÃPº=Ã`^>Õ>ÃГ9ÃÍ?ÃÀË>à:ÃÀ×<Ãðd9Ã0BDÃ`«FàâBÃpy@Ã0r<Ã\=Ã@«9à 'BÃÐWCð CÃð@?ÃÀÃp :Ã0û:Ã`Õ?Ãpü?Ã@øAÃ`ÉAàSEÃ8CÛ=ÃÀã:ÃðL=ð¼:à 9?ÃVBÃ0l=Ã8ÃðX;ÃpsAàú>Ãå?àq@Ãb@ù8ð-=Ãß<Ãp?Ãh;á<Ãp…>Ã`Ï@ÃAÃ@:7Ãà®;ÃÀÅ?ÃÐþ<Ã@‡?ÃPU9ð°<ð˜@ÃЇ;Ãð4AÃP–CÃ0l=Ãñ=Ãp—;ÃPÒ9Ãh;Ãðp7Ãn>à>ÃÐì?Ã0õ;Àâ5Ã@(:ÿ7ÃÓ>ÃPÒ9ÃP1?à u5à ?>Ã`^>à ?>à Q;à$8Ãñ=Ãà1;Ãà+<ÃÍ?Ã@uBÃÀÝ;à­6ð?:ÃàÌ6ÃÐ:ÃÐ]BÃÀT=Ãp£9ÃàÒ5à ì6À²=ÃàÀ8Ã07Ãà7:à‰<ÃàI7à @Ã@þ@Ã`š4Ãz8Ãð«BÃÐu>Ãà¨<à;Ã`á=à9à W:Ãp£9É@ÃÀ­CÃN5ÃPº=ÃÐ"7Ãð0ÃÐ9ÃPØ8Ãb@ÃPC<Ãb<Ãp£9ÃÐu>ÃÐ:Ã`8ÃPð4ÃÀÅ?Ã`R@ð3<ðÂ9ÃPä6ÃЙ8ÃЙ8Ãðv6Ã0x;ðÂ9Ãp:ÃÐ ;Ã7à à8ÃÐ:ÃPü2Ãà[4ù8ÃPÆ;Ã0–6ðQ7Ã>Ã@Ÿ;Ã09à¹4Ã@½6Ãpµ6Ã-4ÃŒ9ÃðL=Ã@";ÃàÆ7Ãðj8Ã`”5ÃÐ(6Ãðá9Ãà–?Ã0×@Ã>Ã@“=Ãb@Ãà´:Ã@<Ã;à i7Ø7Ãðç8ÃÐ¥6ÃÐ{=ð3Ãp27ÃðX;ÃV>Ãà´:Ã5Ã’8àq@Ã@:7Ãpµ6Ãp :Ã@«9à$8ÃÀõ7Ãðj8Ãpµ6ðø0Ã`6à Ô:à ò5Ãt9ð¤>Ã0~:ðÈ8Ã`v:Ã`Û>ÃË5ÃP®?àq@ÃЙ8ÃPÆ;ðÔ6ÃÐ(6À¾;ÃÐþ<à§7ÃÀû6Ãt9Ãpµ6Ã@Õ2Ã` 7Ã`6Ãà=9Ã0l=Ã`8Ã`v:ÃÀï8Ãð2Ã@Ï3Ãp»5ÃPÌ:ÃÐ:ÃàC8ðK8ÃPØ8ÃPU9ðÎ7Ã5àB3ÃpÇ3ð3ðQ7Ã@>ù8ÃÀf:Ã@“=àkAà :Ã0õ;Ãp©8Ã÷8Ã0f>Û=ÃÀ¢0Ã@É4ù8ÃÐo?ÃЙ8Ã@½6Ã0:ÃÐ(6ÃN5Ãðj8Ãp&9Ã0„9ÃPð4ÃðX;à ì6ÃðL=Ã`¦2Ã7Ãà7:ÃàÀ8Ãz<ðÔ6Ã`ÉAà;ÃÀã:ÃP[8ÃPa7ÃÀ2Ãðd9Æ6ä1Ãz8Ã@ ?Ã0¢4Ãp:Ãp,8ÃàO6ðÂ9Ã;ÃP==Ã0û:Ã’8ð¼:ÃðÛ:ð-=à‰<Ã`v:ÃÀõ7ÃPC<Ã0`?Ã0¢4ÃÐ8ÃÅ6ÃPO:ð¶;Ãà´:ðÈ8Àe5Ãp:Ã>ÃÀï8Ãt9ÃÐþ<à Â=ÃPÆ;À7à;ÃÐ8Ã7Ãý;ÃÀÝ;Ãp86Ã`ù9Ã07Ãn:Ã09ð9;ðž?ÃàI7ÿ7ÃÐ ;ó9ÃàU5Ã@.9ÃЇ;ÃÀË>Ã$<à W:à 3@Ãà@ÃP–CÃÐ{=Ã>ÃÀB@Ãà®;ÃÐì?Ã?Ã0l=ÃðL=Ã0NBÃÐ ;Ã÷<ÃV>àSEÃÀB@ïDà Fð’AãFÃJÃÓBÃP7>Ã@>Ãp :ÃPDÃÀ¡EÃPCÃ0ï<Ã`Û>ÃP%AÃ00GÃ@þ@ÃÐàAÀvGÃpsAÃÐÔCÃt=Ãß<À”BÃà¢=ÃPGà žCÀ¦?ÃÐàAïDÃôCÃîDÃ0HCÃÀf:ÃpðAÃP7>Ã0x;Ã0TAÃÀÅ?Ã@@ÃÀ¡EÃ@oCÃðFÃÙAÃpö@à}>ð'>ÃÐ:Ãp…>àú>Ã`4EÃPŠEÃh?ÃÀl9Ã`LAÕ>Ã`Ï@À/>ð!?Ãà+<Ãpö@àî@à ¶?Ã`ÃBð!?ð†CðAÃÀ³BÃ@þ@Ãð½?Ã8CÃAÃðEÃ0ÅCÃÐàAÃP~Gð†Càô?ð˜@ÃðL=ÃÐ"7ÃÐÔCÀ”BÃb@ÃÐò>à‰<ð˜@ÃÀ¡EÃðÉ=ðAÃà?ÃPO:ÃpsAÃ*;à$8À”BÃÀ×<Ã@@ÃàŠAÃ`R@ÃÐ<Ãpü?Ã0Z@ûBÃp?à•:Ãë:àkAà -AÃpsAÃðL=àú>ðBà 3@Ãå;Ã0õ;Ã@@Ã`ù9ÃPº=ð9;Ãà´:ÃàI7à‰<Ã`·DÃà®;Ã0é=Ãp©8à;Ãp:ÃÐþ<ð?:Ãý7Ã0x;ð3<á<à æ7Ã09Ãp:ðW6Ãp=Ãð^:ÀÖ7ÃÀf:Ã;ÃŒ9à Ú9ÃðÃ>Ãß<À_6ÃðL=Ã<8Ã*;Ã@Ã5Ãð^:ÃÀã:Ãp…>ÃàC8ÃÀÝ;Ã`Õ?Ã>Ãà7:Ãp?ÿ7Ãp :Ã=ÃÀ6ÃÀ5Ã`d=À¬>Ãp;Ãp‹=Ã`ÿ8Ãà´:ÃÀZ<à$8Ãt9ÃÀõ7ðæ3ðò1Ã@=Ã;Ãðù5Ãðí7Ãt9ÃPU9Æ:Ã33ÃH6Ã'5ÀÖ7Àâ5Ã`|9ÃÀõ7Ã7Ãp£9Ãý;à ]9Ã@@6ÃÐ44Ã@:7Ã@‡?Ø3Ã'1Ãp»5Ãp86ÃÀf:ðQ7Ã92Ã@";àú>ÃÀõ7ÃЙ8Ã@Ï3Ãà7:ç;Ã`j<à o6Ã×3ÃÐ¥6Æ6Ã0ï<ÃÀï8ÃÐÉ0Ã@±8ÃÐi@à³5ÃP‹0ÃàÒ5ÃpÁ4Ã`v:ù8Ã33ÃpÇ3À}1à;Ãb<à à8Ã`ó:Ãðp7ÃH6Ãpµ6Ã`#3Ã5ÃPä6ÃP==Ã`|9àú>Ãz8Ãà=9Ãn:ÀM9Ã@F5à06Ãðj8Ãp&9Ã0l=Ã`ó:ÃPÒ9ÃÀZ<ÃÀ„5ÃÐ9Æ:ÃÅ6Ã`ÿ8ÃPm5ÃŒ5ÃðR<Ã@™<ÃàÞ3ä5ðQ7Ã@á0Ãh;ÃàI7Ø7Ãý7Ã`‚8ÃÐ¥6ðK8ÀÖ7ÃÐ"7Ãðá9Ã`‚8à 1à:ÃPÞ7Ã0:ÃÐ<Ã@(:ÃPg6Ãà7:Ãp?Ãð½?Ãðç8Ãë:ÃÐ(6ÃЇ;ÃÐcAà•:à$8Ãà®;ÃÀZ<à9ÃÀœ1ÃП7ÃPü2Ã@½6Ãý7ÿ7ð¼:á<Ãh?Ã012Ãp>5Ã06Ã<8Àâ5Ã'5Ã`v:Ã@Õ2ÃÀ`;ÃP%AØ3Ã` 7Ãñ9Ã@É4Ã07à:ÃÀ„5ÃàÒ5Ã@±8Æ:Ãà1;ÃÀ6Ã07ö2à65À5=à§7Ã012ÃÀ1Ã`š4Ã09ÃP2à ø4Ãð 3Ã@@6Ã`²0ÃÐ¥6í:Ã5ÃN5ðà4Àq3Ãà7:Ã`5ÃH6ðÚ5ÃPU9Ã`‚8à Ú9Ãp :ÃðR<Ã*;Ã`Ž6ÃÐL0Ãàê1Ã-0Ã06ÃÀl9ÃðX;ÃàÌ6ä5à‰<Æ:ðu1Ãp»5ÃPm5ÃpÙ0ÃÀ6ÃPÞ7Àî3Ãã1Ã`¸/Ã@";À_6à65à*7ÃÀx7Ã`Ž6Ã@Ã5Þ2Ã@R3ÃP-Ãp»5Ã@@6Ãp£9ÃÐÃ1Ø7ÃÐá,Ã@X2ÃpÁ4ÃPä6Ãà[4ÃpP2ç;Ãн2ÃÀ5Ãб4à³5Ã`6ÃP2Ã9.ö.Ãб4ÃÀ3Ã@d0Ã`Ž6Ãñ9Ã÷8ð]5ÃÐÃ1à;Ã’4ÃPa7Ã9Ãàä2à þ3à ™/Ã`Ä-ÃPä6Ã0œ5ÃÐÏ/ÃpP2ðc4ð3<Ã`6ÃPê5Ãpn-Ã`p;ÃB7Ã0–6Ãð1ÃÐ.5Ã`6Ã-0ÃÀœ1Ãð2Àú1ÃÑ4ÃPØ8Ã`2à ì6ÃpD4Ãðp7ÃàÞ3Ã071àf-Ãðç8ÃPð4ÃÝ2ÀÐ8Ãð1ÃÐ9ÃÀx7àB3Ã0®2Ãà7:Ãà7:ÃN5ÃN5ÃË5Àè4ÃÀ3ÃPö3ÃЇ;àH2à ò5Ã@X2à c8ÃÀr8ði3à ‡2Ã!6Ãpµ6ÃÐ:Ã` 7Ã05ÃàÌ6Ã@Ï3ÃË5ÀY7à Q;Ã0~:Ã0é=Ãp,8ðò1Ãðp7Ã@“=ÃÐ ;à i7Ã7ÃàÌ6À7Ãð|5ÃH6ó9ÃPä6Ãp86ÃÀT=Ã@F5á<Ã0Š8ÃðÉ=ÃÀï8ðc4ÃÐ9à¡8Æ6à*7ÃpÍ2ðò1ÃP1ÃÐ8ÃP´>à ]9Ãðí7Ã0:ÃpD4ÃÀ 4Ãp,8Ãß<ðÂ9Ã@>ÃðÛ:Ã@·7ÃàC8Ãý;Ã’8Ã`¸/ÃÀ5ÃÀû6ÃÀf:Ãn:ðE9Ãðç8ç;ÃZ3à¹4ÃðŽ2Ãp27ÃÓ>Ãà7:ÃÀf:Ã@¥:ÃPÞ7à¹4Ã0û:à_CÃh;à*7Ãñ9ÃÀ®.ÃN5Ã`)2Ã7Ã0„9à ì6ÃT4Ã@Û1ÃÀ+/Ã@ÿ+Ã`)2ÃП7Ãн2Ãàa3ÃЙ8Ãðó6à 2ÃàO6ÃPð4ðc4ÃPÒ9Ãà7:ðÎ7Ã0O-ðc4ÃÀ6Ã`)2Àè4Ã`5ðQ7ÃPa7Ã0+3Ø3Ã012ÃàÀ8ÃÑ4ÃP2ÃPm5ðì2à¡8Ã07Ã@É4à 2ÃÐ^-à {4ÃÐ9ÃP‹0ç;Ã@·7àÑ0ÃPm5Ã’8ÃÀû6à:Àâ5Ãн2Ãp©8Ã@Ï3Ãp86ÃÀ6ÃPs4ÃГ9Ã@F5ÃàØ4Ã@ó-ÃàÀ8Ã`v:à<4ÃЫ5Ø3ÀM9ð]5ðà4ÃH6ÃÀ–2ÃàI7ÃÀr8ÃPÀ<ÃàÒ5Ã`¦2À7Ã@·7Ã09ÃàC8ð3Ã012Ãp>5Ãð^:àB3ÃPÞ7ÃЙ8ÃpÍ2Ã06Ã'1ÃZ3Ã0%4Ã07ä5Ãý7Ãàm1Ã0¨3ð¼:ðE9Ãpµ6ÃП7Ãð4ÃÀï8ÃÀ~6ÃÐ¥6Ãðj8ÃË5Ãf1ê4Ãñ9ÃŒ9ÃàØ4à c8Ãð‚4ÃàØ4à*7ðÔ6Ã@X2Ãð#/ÃГ9Ã`‚8Àq3ÃP&,Ã`5à9ÃÝ2Ã?1ÿ7ÃÀÑ=ÃàI7ðÔ6ÃpÁ4ð/ÃÀŠ4Ã@½6Ãz8ðÔ6ÃP[8à¹4à i7Ã3ðE9ÃðÕ;Ãà[4ÃàÞ3Ø7Ãàê1àH2Ã@·7Ãp:Ãðí7ÃðR<ÀS8Ã`¬1àN1Ãð|5Ãðˆ3ÃàØ4ÃàÒ5ÃÐÃ1ðÈ8Ãàg2Ãàg2Ã0–6ÃП7ðÔ6à E=Ãp\0ÃÀ„5Ãðj8ÃpP2ð/Ã`A.ð3Ãðó6à³5ÃÀ„5ÃГ9ð-à`.Ã0+3ÃÐL0Ã0–6Ãð2Ãà[4ÀÄ:ÃÝ2Ã`/1ÃÀ„5Ã@ç/à<4Ã@Ã5Ã` 3ÃP2ä5Ãз3à06à ‡2Ãf1ÃPm5ÃÐ44ðø0Ã`Ä-Ã~-ÃÀ®.ö2Ã@@6Ã`Ž6Ã0®2ðc4Ãl0Ã-0ÃÈ/ÃPy3ÃЇ;à¿3Ã`²0À¡+Ã'5àN1Ã@ç/ÃÐL0à «,à 3à 3Ãpý*ÃE,À /ð{0àZ/ÃpV1ÃÀ2Ãp,8Ã69ÃPy3Ã`)2ü-Ã`¸/ÃГ9ê0Ã3/ÃË5Ã@R3à 2ê0Ã0®2ð]5Ã4Ãðv6Àî3à­6Àô2ÃpV1Æ6Ã0º0ÃÝ2ÃÈ/ÃÀŠ4Ã=ð!?ÃÐ@2Àe5àË1Ãð2Ã3Æ6ÃpÓ1à›9ÃPº=Ã`ù9Ã0 8Ãðp7Ãà AÃ`X?à K<ÃP==ÃPº=Ãð±AÃÐo?Ã@{AÃ0NBÀ#@ÃPœBà ªAÀçIÑIÃÁEÃP´>Ã`ç<àî@ÃpÒFÃÀ¹AÃ@]FàSEÃ0ËBÃqDÃ@EJðåHÃPCÃP¨@ÃîDÃÐ-JÃGà GÃÀT=Ãð"DÃ@QHéEðAÃà¨<ÃV>Ã0¹EÃpÆHÃ@'Oà_CÃ`4Eð€DãFÃJÃФKÃpÞDïHÃ@WGÃPœBÃÀ›FÃp¨MÃPrIÃPŠEÃÀGà)LÃ`ŸHÃ@àEÀpHÃ@ÔGÃ`{Nà åLÃ@@ðåHÃp[EÃDEÃàïEÃð"DÃ@ÈIÃpgCàw?à EãFà †Gà;IÃpUFÃP EÃðIÃ@QHð’AÀŽCÀ DÃ&FÃ,EÃ_GàSEà KðÓKÃP%AÃà¢=ÃàéFÃàõDãFÃPCÃpÆHÀíHÃpü?Ãà~CÃP~GÃ@]FàMFÃð Hà FÃ0¹EðtFÃ0³FÃpÒFÃàûCÃÄKÃ`:DÃàïEÃàfGÃ&JÃ@QHÀŽCÃkEÃpCIÃÀƒJÃPxHÃ0ÅCÃðL=ÃÀ6BÃ0BDÃ`@CÃ0ÑAÃp‹=Ã0•KÃð HÃpºJÃð±AÀ¬>Ã}BðVKÀÕLÃ`.FÃ@òBÃÀ›FÃÀ§DÃPGÃÀ­CÃÖHà HûFÃÐQDÃ@@Ã?Ã0f>ÃpgCÃ`^>ÃPC<Ã0TAà ¤BÃp;Ã@oCÃ@uBÃ@øAðBÃÙ=ÃÐÂFàÖDà EÃÀ³BÃ@ÚFÃ`:DÃÀ¡EÃà„BÃBÃðFÃ0ÅCÃpOGÃðÃ>ÀAðëGÃpaDÃàrEÃP EÃ@]FÃPDÃÀ³BÃPûGÃ`LAà 9?Ã0¿Dàq@à 9?ÃDAÃpIHà ˜Dà ’EÃàBÃ@þ@Ã0×@Ã`Ï@ÃÙAÃ@øAÃp>à ¶?ð˜@Ãpy@Ã@oCÃ0TAÃ2DÃ2DÃàûCÀ#@á<Ã`Û>Ã0Ý?à ¶?Ã,EÃ@@ÃÀ×<ÃÓ>ÃжHÀ|FÃPDÃP7>ðž?ÃðÃ>ÃpIHÃ`Õ?ÃpÞDÃ`ÉAÃ0×@ðDÃÀ0CÃp©8ð?:ÃV>Ãà®;ÃàBÃ@oCð!?Ãp7KÃàrEÃð¥Cà @ÃB7Ã@";Ã@øAÃ@oCà ¼>àƒ=À;ðýDÃ0NBÃàº9Ã0û:Ã`X?Ã0~:ð9;à;Ià ¼>ÀšAà ¶?À²=Ãp?Ã0NBÃ@ ?Ãp;Ã@ìCÃP?ÃÐ ;Ã@ ?Ã`:DÃ0ÅCéEÃ0é=Ã`p;Ã0û:Ãp‹=ÃÐì?Ã0~:Ã@“=ÃV>Ãð«BÀ @Ã*;Ãý;Ãðj8Ãà+<ÀAÃ0¿DÃp?Ãß@ÃàI7ÃÙ=ÃÓBÃP¨@ÀÖ7Ãàº9à;à æ7Ã0ï<Ãà@ÃÀÑ=Ãà¨<ÃÐi@ÃÀ„5Û=ÀAÃðŸDÃðÏ<à*7Ã0x;Ã@‡?ÃðÃ>Ã`Õ?ÃП7ÃðL=Ã0Z@à 9?Ã@@à Î;Ã0:ÃPU9Ã@™<Ãp=à;Ãðd9Ã`ç<ÃÀÃ<8Ãñ=Ã`j<ÃP´>ÃÙ=Ã`í;ÃPê5Ã`50à§7Ãð·@ðÈ8ÃàC8à <Ã@Ï3Àâ5ÃÐ9Ãp;ÃJ@Ã@>ð!?Ãt9ÃH6Ã0~:ÃPC<ÃË5Ãz8í:ÃðF>à E=Ã09à¹4Ãb<ÃП7Ãp£9Ãý7ÃðX;ÃZ3Ãp<Ã`v:ÃÐ44Ã012Ã`‚8Ã`á=ó9ÃÐ9ÃŒ9Ãp,8àƒ=Ãh;Ãp27ê4ÃPð4Ãðj8ÃðÕ;ÃŒ9à$8ÃPm5ÃÀõ7Ãp‘<ÀÐ8ÃàO6À‰/Ã`í;Ã@¥:Àe5Ã!6ÃðÕ;Ã’4Ã@:7ÃàÌ6Ãð‚4à•:Ãð 3À¾;à;Ãðù5ÃÀû6ÃÀZ<ðE9Ã!2Ã`6à ò5ÃÐ:Ãp=à 9?Ã0:ÃZ3àƒ=ð¼:à ì6Ãt9Ãp>5ÃðÉ=ÀÐ8à c8ÃÐ"7à ì6à65Ã0œ5Ãp>5Ãàð0Ã92ÀÄ:ÃpÁ4Ãp>5ÀÖ7Ã0Š8Àk4Ã@=Ãp;ÃpÁ4ðò1Àw2Ã@<à 2ÃÀœ1à³5Ã'5Ãà®;ÃàÀ8Ã`6Ã0œ5Ã0+3à$8Ã@á0Ã*ÃÐ@2ÃàÞ3ÃpD4ÃàÆ7Ãðˆ3Àî3ÃàØ4Ã-4ÃàÒ5Ã0:Ã`Ž6ÃP[8Ãh?ð¶;ði3Ã@á0à o6ÃÐ<ÃГ9Àk4Ã0+3ÿ7ÃÑ4ÃÐ44ÃÅ6ÃÑ4ÃP0ðò1Ãf1Ãðv6ÃPü2Ãðš0ÃÐ ;àï+Ã@ç/à (-Ã’4Ã@ç/ðþ/à$8Ã`ÿ8Þ2ê4ÃàC8ÃÐ¥6Ã33à 6ÃÀ3ÃðŽ2ö2ÃàÒ5Ã012Ã`²0Ã0%4ÃPð4Ãñ=ð°<à ø4ÃÀ5Ãð¬-àZ/ê0Ã92ÃÐÃ1Ãàü.Ãl0ðo2ÃpJ3ðÂ9ÃPä6ç;Ãð4Ãp\0Ãr/ÃÀû6ÃN5Ã3/à 1ÃpJ3Ã-0ð{0Ãðó6Ã@@6ÃàÀ8àl,ÃàU5Ãp»5ÃP2Àî3Ã`#3ÃÀ3ÃpV1ÃE0ÃÝ2ÀÄ:Ã@R3à <ðQ7ÃÐL0Ã@X2Ãh;Ãt9Ã`”5Ãr/ä1ÃàÒ5Ã@Ï3Ãб4Ãà=9Ãðÿ4ÃÀx7ÃPm5ÃàU5Ã@ç/ÃH6Ã<8ÃÀr8Ã012à ¥-Ãà.à Ô:Ã`2ÃpÇ3ÃP[8Ã92ÃPs4ÃP2Ã0Ì-Ãðš0ÃÅ6à æ7Ãp©8ÃÐR/Ã09ÃH6Ãà,Ã07ÃPy3Ãé0Ã`6à¡8Ã!2ÃpÍ2à ™/À1ÃP‹0à³5Ã@Û1Ãì)Ãl0ÃZ3ÃÐ:3Ãn:Ãp27Ã'5ÃÐ@2ÃÐ(6ÃP[8Ã~-Ã0=0Ãà1;Ã` 7ÃÐ@2à ™/ðo2Ã0´1Ãp\0ÃÈ/ðK8ó9ÃÐ:ÃàÀ8Àq3Ã0¨3Ã0%4ÃP0ÃÐL0Ã@R3ÃPü2Ãðš0ÃðŽ2Ãàm1Ãp:ÃàO6Ãðˆ3Àô2í:ÃpÓ1Ã06Ã3Ã0x;à§7ÃÐF1Ã5ÃPU9à*7à 2Ã`8Ãðí7Ãp\0Ã@Õ2ÃÐÉ0ð3ü1Ãð‚4Ã@F5à u5Ã`ˆ7ÃàÞ3Ã0¨3Ãð‚4À}1ÃpP2à à8Ãå;ÃH6ÃPa7ê4ÃÀ–2à<4ÃÀZ<Ãàa3ÃГ9à 3Ãð1Ã’4ÃH6ÃÐ9Ãà1;Ã-4à¡8Ãð4ÃÀ–2Ã?1ÃH6Ã` 7ðc4Ã@X2Ãð 3à¹4Ã0–6à /À.Ã0=0Ã-0ü-ê0Ã0+3Ã@R3ÃÐF1ÃÀ2ÃÀ7-Ã@X2Ã`”5ÃÐ.5ÃPm5ÃÐ^-à ™/Ãð2Àè4Ã`¾.Ãà,ÃP2à*7Ãðù5ÃàØ4ÃP1ÃP2ÃÀº,ÃP‘/Ã~-ÃÐL0ðÂ9Ã@Ÿ;Ãpå.ÃÀ3Ãp86Ã-0Ã012ðÎ7Ã0¢4ÃÀµÃ0I.à*7ÃÐ.5Ãð”1Ã`/1Ø7Ã!6Ã0®2Ã@^1Æ6Ã@:7Ã7Ãàa3ê4Ã012Ã0®2ÃPð4àT0ÃÀ6ðÎ7Ã3ÃÐ:3ðo2ÃÀ5Ãàs0Ã@Û1Ã0´1Ãã1Ãðˆ3Ã@X2À1Ã×3Þ2Ãàð0Ãàa3ÃŒ5Ã@L4Ã0¢4Ã`M,Ãðp7ÀY7ÃZ3Ã07ÃV>Ã@^1ê0Ã07ÃÐá,Ãpµ6Ã`5à “0à ¥-Ãp»5à06ÃŒ5Ãàü.ð3Ã0O-ÃÔ-ÃÀ1.Ã012àr+Ã`S+Ãàs0ÃPÞ7ÃP—.ÃÀ6Ã0º0ÃÂ,Ã`2ÃÐ"7àÅ2Ãp©8Ã` 7Ã0C/Ã`50Ã0 8ÃÀ 4à¿3À$+Ãð0ÃpÇ3Ãé0Ãð|5ÃZ3àZ/Ãà‘+ÃP.ÃÐp*Ãf1ÃP2Ãf1Ãày/ä1Ã09ð"*Ã@d0ÃÈ/ð .à*7ð{0Ãàü.ÃÀ®.Ãé0Ã`²0Ãð¦.Ã@É4Ã4Ã],ÃÐÃ1Ã`4Ãp»5à ".Ã@á0ä5à ø4ÃPØ8Àî3Ã`”5Ã`²0Ãr/Ã’4Ã`4Ã9.ÃÑ4Þ2Ãн2ð/Ã!6ÃP0Ãp\0ÃP1Ãð|5À}1ÃÚ,Ãà.ðø0Ã@ÿ+à ì6ÃpP2Ã09ðæ3Ãð4ÃPê5à³5Ã@Ï3ÃPð4ð3Þ2Ãà.ðò1Ã`50Ãp,8ÃÐ@2Ãàg2Ãð‚4Ã@j/Ã,Ã`¸/Ã!2à ø4ÃÀ¢0à ò5Ã`50à “0Ãð|5Ãðv6Ã`6ðø0à ±+Ã0®2Ã0–6Ãï/àé,ÃÀ´-ÃÔ-ÃÐÏ/ÃàØ4Ã05à×/Ã`#3à 1ä1Æ6Ã0I.Ã~-àï+Ã0Æ.Ã@É4Ãз3ÃÀx7ÃPm5Ãp¯7Ãн2Ã92ÃpÇ3ÃЙ8Ãðˆ3Ã06Ã0´1Ã0 8Ã@Û1Ã`G-ÃàØ4à 0À}1Ã071Ãðš0ðŸ*ö.Ã012ÃT4Ã`¾.ÃZ3àB3ÃP…1ÃÀ%0ÃàU5ÃpP2Ã`Ä-ðì2ð-Ã0Ø+Ã?-ÃPm5Ãà[4Ã-0Ã07Ã69ÃÀ¨/Àw2Ã`G-Ã`Ê,ÃÝ2Ãàð0àB3ð{0Ãð”1ÃPs4àl,ð/Ã`M,ðu1ÃÀ„5à 3ÃP/àB3À7ÃB7ÃÀ+/Ãà*Ãð).Ãð5,Ãï/Àî3ÃÐ@2Ã@í.è&Ã!2à 1ÃP&,Ãx.ÃàÞ3ðþ/àf-Ãàg2Ã3/Ã@L4Ã0¨3ÃàÒ5ð/Ã`)2ÃpJ3Ãp\0Ã@(:Ã`¬1Ã`6ÃÀ5ÃàÀ8À‰/ÃP,+Ã0Ø+àÝ.ÃàÌ6ÃP…1ðu1Ã07Ãð4Ã`²0à u5ÃPä6Þ2ÃpP2À‰/Ãðˆ3à ì6ÃpÇ3à65Ãàä2ÃÀ–2Ãpñ,Ãpë-ÃPö3Ãð²,ð-ÃÎ.Ãý7à‰<ÃT4Ã@Ï3àÑ0Ãò(ð{0Àw2Ã@É4Ãз3ÃP -ðÚ5ÃÐ.5Ã012ÃÀ´-à 1Ãã1Ã@@6Ãpt,Ã92Ã@:7Þ2Ãpb/Ãr/à ¥-Ã`Ä-ðu1ÃP2Ãàê1Ã@|,ÃàÞ3Ã92ÃÀ6ÃÐ@2Àô2Ã92Ã0Ò,ð3Ãàm1ÃP‘/ÃpÙ0Àƒ0Ãàm1ÃÐç+ðæ3Ãp>5Ãñ9Ãð²,Ãf1ÃÐ¥6à³5ðì2ÃÈ/à ".Ãã1ÃPÞ7à 6ÃP0àT0ÃÀ–2Ã@j/ÃP2ÃpP2ð/Ã@X2ä5Ãð#/Ãàü.Ø3à æ7Ã5ÿ7Ã@L4ÃP-Ãð0Ã@á0à;Ã!6ð-Ã0®2Æ6à “0Ã~-Ã`A.ÀY7Ãð”1ÃpJ3ÃPä6Àô2àT0Ãp÷+ð .Ãàm1ÃpÇ3Ãã1Ã0Ò,ði3ÃÀ2ÃÐ¥6Ã`M,à 1ðì2Ãp,8ÃŒ5Ãr/Ã-4Ãpµ6À•-à 3ÃÀ–2à æ7Þ6à 3ÃPg6àf-à “0ÃÀû6Ã`¦2Àe5Ãà´:Ã8Ã`|9ÃÐ:3Ã0Þ*Ãð|5ÃP©+Ãàê1Þ2à ø4Ã3ÃÀ3à ø4Àî3Ãз3Ãp\0Ãð‚4ÃÀ¨/ÃP/Ã`¾.Ã071Þ2Ã0Ì-Ã@á0à ¥-ÃPs4Ã~-ÃÐÉ0Ãð1Ã92À¡+Ãàm1ÃÐd,Ãàs0Ã`G-àZ/À /Ãàü.ð/àB3Ã’4ÃÐL0Ãàü.Ã@ó-Ã`²0Ã`5Ã`ˆ7ÃÀ2Ãõ.ÃPg6àã-à “0Ãx.Ã0%4Ãx.À,à 1ÃÐd,Ã0Ì-Ã-0ÃÐÏ/Ãàð0ÃP0ê0à Ÿ.Ã071Ãpå.Ãð²,àZ/Ã@í.à (-Ã`A.ÃpJ3à (-ÃP1Ã`¬1Ãpb/ÃpV1ÃÀŠ4Ãp\0Ã0U,Ãð2ÃÀ¨/À‰/ÃÐ:3ðò1à`.ÃP1Ã@@6ðÔ6ð-ÃÐ@2Àô2À-Ãðÿ4ÃÀ„5À1ðo2Ã`)2à @)À.Ã*Þ2à ™/Ãà+Ã0=0Ã0º0Ã@^1Ã`#3ÃàÒ5ÃÀ–2Ãð”1Ã0Æ.ÃÐÉ0ÃÐR/ðþ/Ã3ð3Ãàg2àN1Ãp27Ø7Ãày/àT0ÃP2ÃpÙ0ÃÀ%0ê0à ±+ðò1ÃП7Ã0–6Ã`Ä-à ·*Ã0U,Ãpß/ÃPð4ÃÚ,Ã,Ã@ˆ*ÃÐ¥6Ãð0ðÎ7Ã0–6ÃÐF1Ã9.Ã`Ä-Ã33ÃAÃÀ6ÃÐX.Ã0º0ÃÐd,à 4+ðc4Ã@^1ÃàC8Ã@^1Ã`;/Àô2à þ3Ã`50ÃÑ4à06ÃÀ+/ð{0ÃPð4Ãð‚4Ã4Ã`”5ÃÀ 4ÃÐ(6ê0Ãðó6à 2Ãl0ÃàÒ5Àâ5ð“,ÃÈ/ÃÐ(6Ãðˆ3Àq3ÃП7Ã@p.Ã`Y*À•-Ãб4Ã5Ø3Ã`ù9Àe5à 2ðæ3Ã`¬1Àƒ0Ãà¯&Ã@j/Ãàê1Ã@v-ÃðG)À-Ã@á0Ãð¬-ðc4Ã!2ÃpP2Ã-4ÃÀ3Ã012à 0à­6ðà4ð‡.ðK8ê0ÃàU5ðW6ÃPy3ðþ/ði3ÃÀ1Ã`/1Ã`Ž6ÃÐj+ÃE0Ãã1ÃZ3à u5Ã0®2àB3Ãàö/ð+Àw2à¹4ÃÀ¨/Ãà‘+ði3À0ÃàI7à Ã(ÃZ3ÃÀ¨/ÃÐ"7ÃPm5Ãp>5Ã` 7ÃPs4ÃàØ4ÃÀ6Ã’8àB3ðà4ðc4Ã@:7ÃÀ+/ðo2ÃP -Ã4à ]9Ã9.Ãðˆ3Ãpå.à65Ã!6Ã'1ÃPD'Ãàg2Þ2ÃðX;ÃÐ(6ÃŒ5Àî3ÃЙ8ÃPy3Àô2à ™/ÃÀé9ðÎ7Ã`2Ã69Àe5Ãàö/ÃPö3À.ÃÀû6ÃÀ„5Ø3àZ/ð/ÃP‘/Àw2ÃP£,Ã@X2Ã`Ž6Ãà1;Ã07Ã5ÃàÞ3Ãðó6à¿3ð .ÃpV1à*7ÃðŽ2ÃPÌ:ÃPü2Ã@^1ðc4ÃÀ–2ÃÀ5Ã@ç/Ã`)2à ì6Ãð4à 2Ãð|5ði3Ãð/-ÃÐÃ1ÃÐÃ1Ã@Ã5Ãàm1Ãpn-ÃP0Ã@@6Ãðv6Ã0®2àÑ0àZ/ÃpÙ0Ãð4Ã`ù9ÃÐÃ1ä5Àw2Ã05Ãp\0ÃP1ÃÀ¢0ÃÀ–2ðo2Ã0O-ÃÑ4Ã÷8ÃPg6Ãï/ÃÀ1ÃÐ:3ÃE,Ã@·7Ãàð0Ãàm1ÃpÁ4Ã@ù,ðŸ*Ã`¬1ðQ7ÃÀ%0ÃàÒ5Ã@Ã5ÃP©+ð-Ø3Ã@|,Ã×3Ãð 3Ã`ó:Ãð”1ÃÀ–2à þ3à§7ÃÀC+Ã@ù,Ãpz+à ò5à Ô:ÃP2Ãð¾*Ãp86Ãðˆ3Ãû-Ã0U,Ãàü.ÃP©+Ãà+ÃÀ3àB3ÃÀº,Ãpn-ÃP -À•-àÅ2Ãàa3Àe5ðW6Ã012Ãc+ÃpÙ0Ã@p.Ãàð0Ãð¦.Ãð /Ãé0ÃÈ/Ãð”1ÃàÞ3Ã'5Ã0I.î%Ã`50Ã0Ø+ÃÀ3Ãð2ÃÎ.Ã`ÿ8à$8Ã0+3à¿3à “0ð3ÃП7ÃP&,ÃpP2Ã0[+Ãr/ÃÀŠ4Ãà‘+ÃÐ^-Ãð#/à ±+Ãàä2ÃÐÏ/Ãp>5Àô2Ã0+3àH2ÃÀé9ðæ3Ãp\0ðþ/Ãðí7Ãàê1ÃpÓ1Ãæ*Ã×3ÃÀ 4Ã`|9ÃP…1ÃÀ¢0Ã@ç/Ãð0Ãð¦.à 1Ã07ðÎ7Ã` 3ÃÀ1.ÃÝ2ÃpJ3ÃÐ44Ã’8ÃP2à þ3Ãpµ6ÃÐÏ/ð-ð/ðŸ*Ã@ *ÃÐL0ÃÐL0à¹4ðÔ6Ã'5ðo2à þ3Ã@L4ð/Ã?1Ã`Ð+àN1Ã!2ÃÐR/ö2Ãð”1ðà4Ãà-ÃÐÉ0Ã`¾.Ã0O-Ã012ð™+Ãàü.ÃÐÃ1Ã0Ò,à`.Ã@R3Àè4ÃÀÀ+À}1ÃP,+ÃW-À‰/ÃpÁ4Ã`¾.À /ÃP.Ãð2Àk4à {4Ãàs0Ã`#3ÃÀ5Ã0%4Ãà7:àË1Ãà*ð‡.Ãðp7Ãé0Ã'5Ã×3à ]9ÿ7ÀÖ7Ã`Ž6à æ7Ã0%4Ã07Ã’8ð-=ÃpÁ4ÃàO6Ã7ÃÀ~6ÃPä6Ãðù5ÃT4Ã7Ã0é=ÃPU9Ã`j<ðÂ9ðW6Ã0:Ãp…>Ã<8à W:ÃàÀ8Ãà7:Ãp27à ò5ÃPg6Ã0é=ÃPÀ<Ã@Ÿ;ÀÄ:ðÂ9ÃÀã:Ãp‹=Ã÷<à E=à Â=Ã0ï<à*7Ãðí7ÃÀx7Ã`ç<Ã@“=Ã`X?ÃP®?ÃÀx7Ãðj8Ã0Š8Ã`|9Ã@>Ã07à­6àq@ÃÇ@ÃÐò>Ã`^>Ã`j<à=ÃàŠAÃP´>Ã@æDí:ÃÐ ;à ¶?Ã`Õ?à à8Ã×3ÃP==à ?>Ã0Z@ÃÁAÃ$<à­6ÃDEÃàûCÕ>ð3<ÃP´>ð'>Ã0r<ÃP==Ã÷<Ã69ÃÐ<ÃP®?Ã0NBÃ0l=Ã÷8Ã`”5Æ6ÃÀN>Ã`á=ÃP®?ÃŒ9Ã÷8Ã@:7Ãp?ÃЙ8à ¶?ð¼:Ã@‡?Ã`Ï@ÃVBà 3@Ãp?Ã`j<Ã`v:ÃPO:Ã@48í:Ã÷8Ã@=Ã@ ?ÃÀf:í:Ãë:Ãðd9ðK8Ãð^:Ãàœ>ÃPÌ:ð-=ÃÀÑ=ðQ7à¹4à K<ÃÍCÿ7Ã0:ÃÀr8Ã0:Ã07ÀÐ8Ã0:àƒ=à‰<ÃÀ`;Ã0û:ÃÐ<ÃÀT=Ã`ù9ÃÀ`;Û=ÃàÆ7Ã0HCÃ`í;ÃÀ0CÃpÌGà K<Ãðç8ÃÀû6ÃÀõ7Ãn:à È<ÃpðAá<ÃPg6Ãpö@Ãå?Ãp£9Ã<8Ã`š4à à8à*7Ã`š4àã-ðÂ9ÃÀÝ;à W:í:Ãn:àú>Ãpµ6ÃÐ:Ã@<Ã8ðà4ð]5ð{0à<4ÃÐ<àô?ÃÀT=ç;Ã`ç<ÃŒ9Ãë:À_6Ãz8à Q;Àq3Ã07à06ÃÀ`;Ã`ù9Ã09Ã@=Ãp=à‰<àƒ=Ã!6ÃÀl9Ã$<Ã0ã>ÃP1?ÃÀl9ð9;Û=ðK8ÃÐ(6Ãp©8à þ3Ãð^:ÃPÌ:Àk4ÃЇ;à›9Ã!6à ì6Àƒ0ðæ3ÃÈ/ðc4ÃÀf:À}1Ã0%4ÃÀ~6Ãpy@ÃÀé9Ã`|9Ãà´:Ã`d=À¸<Ã@>ðæ3Ã×3Ã`‚8Ãë:ÃÀÝ;Ã69Ãp :à 6à ò5ÃÀ„5Ã>ÃPI;ðª=Ãý7Ãt9à c8Ãp27ÃÐ.5ði3ÃP[8ÃÀé9ÃN5Ã0%4ÃÀ%0Ã@Ã5ÃÐ(6Ãðù5à06ÃÀã:Ã`ˆ7Ã÷8Ã07Ã@:7ð]5ðæ3ÃðÏ<à§7ÃÐ9Ã07Ã06Ãð|5ÃðÏ<à;ÃÐ8Ã` 7Ãàg2Ãð 3Ã7Ãt9ÃЫ5ÃPs4Ãp&9à 6Ãn:ÃPÞ7ÃŒ9ÃÀT=Ã`”5Ãàê1ÃP[8ÃàO6à$8ðu1À5=à ]9ÃÀf:Ã0:à¹4Ãðv6ÃÐ¥6Ã`|9à¹4Ãàs0à65Ãàg2à¹4Ã7ÃðÛ:ÃÀr8ðÈ8ÃЇ;Ãàä2Ãàê1Ã@^1ÃpD4Ã07ÃÐ8ÃPm5ðÂ9ðE9Ã`ˆ7ÃЙ8ÃP/Ãph.ðæ3Àk4Ãp,8ÃÀ3à þ3ðà4Ã@:7Ã0®2ÃÅ6ÃÀ3ÃÐ.5ÃPs4Ã0Š8Ãp>5ÃàØ4Æ6Ã@X2ÃÐ8ðW6Ã8ÃàC8Ã0:à ø4Þ2Ã` 3ÃZ3ÃPa7à;Ã@¥:Àè4Ã0œ5ÃðÕ;ÃÀ5ÃÀ 4ð¼:Ã05Ã@48à ò5ÃÀï8Ãh;à 3à i7ÃÐ(6ÃÀ5ÃPO:ð,Ãp\0Ã`/1Ã`A.Ãàä2Ã<8Ãñ9À}1à ò5Ãðù5Ãðv6ðc4à 3Ãàs0ÃÀ1ÃÐ¥6Ãñ9ÃÑ4ÃN5à “0Ãð|5Ã-0à {4Ã5à$8à i7ÃP0ÃP—.ÃpP2àB3ðo2ÃW-À}1ÃÀ¢0Àô2ðà4à*7Àw2à65ÃP.Ã-0ÃP…1Ãàa3ðà4Ã@Ã5ÃPö3ð3<à à8ÀY7Ã33Ãp,8ÃÀ„5àÝ.ÃÀ3Àè4à<4Ã`G-Ãàö/Ã@Ï3ÃŒ5ÃPa7à 1Ã×3à¿3Àk4Ã<8Ãàê1Ã`5à {4ÃГ9ÀS8à Ú9Ã`ù9Ã` 3Ã0¨3Ãðí7ÃÀû6ÃÐ¥6Ã05ÃÐL0Ã@=Ã`|9ÃÀ7-à<4Ã`8Ãð 3ÃÀ~6Ãðj8Ã`”5Ã@á0ðà4ÃàÞ3ÃE0À}1Ãã1Ãðp7à ò5ÃPð4ÃÀŠ4ÃP -ÃЙ8ÃðŽ2ÃE0Ã`/1Ø3Ãp&9ÃŒ9ÃÀ6ÃÐ:Ã`6à 2ÃÀé9ÃðŽ2Ã`Ä-Àq3Àî3Ã06Ãз3ðþ/Ã×3ÃÀé9Ãp=Ã0Š8ÃÝ2ÃÐÏ/à06àB3ä5Ãð¬-Ø3Ã@¥:Ãz8ÃPO:Ã@«9Ãð /Ãб4ÃЙ8Ãl0Ã?-Ã-4ÃÐÛ-à­6Ãp»5Ã`”5Þ6Ã<8ÃPÞ7Ã071Ã`2Ãð0Ã`8Ã`v:ÃpÇ3Ã`¦2Ã@L4Ã@Ï3Ã@·7Ãf1Ãt9ÃPÒ9Ã0+3ÃÀõ7à³5Ãз3ðÚ5à*7ðW6ÃPÆ;Ãà=9ÃÀû6ðÂ9ÃП7à:Ãp\0Àw2ÃÀõ7Ãñ9ÃÀr8Ã7Ã0C/Ã`ç<ÃÀ3ÃÀ–2ÃpÁ4Ã0®2Àq3à o6àB3Ã@É4Ã@Û1ÃÐÕ.Ãàm1Ãpµ6Ãàº9à 6ÃÐ44Ãðˆ3ÃÀ5Ãõ.Ã0+3Ã@:7àT0ð?:Ã`v:ÃP2ð .Ãh;ÃPO:Æ:à­6Ãð|5Ãl0Ãà[4ÀG:ÃÐÉ0Ãp\0Ã0û:ÀY7ÃàO6Ã`p;ÃÀ3Ã09ÃPg6ðu1ÃÐL0Ã`8à æ7Ã0®2ÃPg6Ã`¬1Æ6ÃÐL0Àw2Ã0®2À›,Ã0U,Ãàê1ÃÀ 4à 6Ã’4à Î;Ãày/àB3ÃPü2ÀM9ðW6Ãàä2ÃÐ44Ã06à c8À7ðK8ÃÀ6ÃŒ5Ãpµ6à æ7Àî3Ã@48ÃÀZ<ÃÀ~6ðo2Ãðˆ3Ã5Àw2Ã4Ã0¨3ÃÅ6Ã0®2À}1Ã@Û1Ãàä2Ã@½6Ã@Õ2à ¥-àÅ2Ãàð0Ãз3ÃZ3ÃPs4à¹4Ãp©8ÃàÆ7ÃÀû6Ã`;/ð¼:Àe5Ãl0Ã*ÃPa7à {4ÃPü2ðþ/Ø3Àƒ0Ãpå.À1Ãð|5àZ/Ãàö/ÃÀ3àÅ2ð]5ÃÐÉ0à`.À1ÀM9Ãph.Ã?1Ã`²0ÃK/À}1Ã!6Ã!2Ã`Ä-ÃÀ×<ðE9à ‡2Ã7ð"*Ã@v-ÃÀ+/Ãð¬-Ã@ *À-Ã0´1Ãàä2Ãб4ÃÀ2à`.Ãû-Ã0û:Ã@Û1Ãð‚4ÃPm5Ãf1ÃP0ÃP1Ã`”5ÃÐ"7Ã0Þ*Ãé0Ã0:Ã07Ã`G-ÃP,+ðò1ðø0Ã0C/ÃÀ7-ÃÐ@2Àè4ÃÀ 4ÃÀl9À}1ÃP2Ãðš0Ãð”1Ã`;/Ã@ó-ÃÐX.ÃÈ+ðW6ÃŒ5Ø3Ã`Ö*ð .Ã@É4Ãày/Ãàg2Àô2Ãðš0à 3Ã@á0ÃÐL0Ø3Ãà.à «,Ã'5ÃpÓ1ÃÐÛ-Ã@ÿ+Ãð²,Ã0O-Ãpn-Ã@'ÃÀ5ÃðŽ2à ·*ð,Ãp»5ÃpÓ1ðæ3Ãàa3ð{0ÃŒ5à ".Ãà-ÃðS'ÃÐ^-Ãà‹,ÃP&,Ä,Ãpz+Ãï/Ã`;/à ø4ÃpV1Ãð0à„(àÑ0ÃÀº,Ãà,Ãp\0ÀÐ8ÃÀ~6ÃpP2ÃðŽ2à¿3Ã07Ã`#3àH2ÀY7Ã`Ð+Àî3ð3Ã`/1à .,ðQ7Ã’4à /ÃÀ¨/ÃP-ÃQ.Ãàs0ÃPü2Ãн2àl,Ãàm1À•-à «,Ã`A.Ãð¸+ÃP0Ãp\0Ã-àN1Ãð2àÝ.À /ðæ3Ãï/ÃÐj+ÃPö3ÃÐd,Ãð¸+ðc4ðò1Ã`2ö.Ãpñ,Ã@R3ð+Ãð).Ãr/ÃÀ1ÃE0Ã'1à 2Ãð¦.à 1ÃT4ÃP‹0ÃpÓ1Ã@:7ÃÚ,Ã@v-Ã@ç/Ã@ó-Ã*Ã` 3ÃЫ5ÃPð4ÃÐX.Ã`¾.ÃP2*ÃÈ+Ãð2àû)Ã@X2à .,Ã@v-Ãðš0Ãpb/ðì2Àw2Ã!2Ã-0ÃÐF1À}1àÝ.ÃÀ=,Ã`Ä-Ãà‹,Ãà.Ãf1ÃÀ¢0ä1Ã,Ãð¬-Ãpn-Ãé0ÃÐL0Ã0=0Ã@p.Ã-0ÃPy3Àî3Ãð2ÃÐÕ.à (-Ãð /Ã@R3à “0Ãð /àf-Ã`A.ÃÐÏ/Ãõ.ê0Ã?1à 6ÃP…1Ãàê1Ãpß/ÃB7Ã`²0ÃpÍ2Ãà[4ÃÀŠ4Ã`50Ãàg2Ãð”1Ãû-Ãpn-Ãàð0À}1Ã@j/Ãàê1Ã×3Ã0[+ÃpŒ(ÃZ3ÃÀÆ*ÃW-ÃÐj+Ãà.À,Ã` 3Ã!2ÃÐ^-ÃpD4ÃÀ3Ã0Æ.Ö)ÃP/ðu1ÃP—.Ãð²,ÃÀº,Ã0Ì-Ãé0Àk4Ãàä2à 0ð“,À.ÃP.ð .Àq3Ã@ó-Ão)Ãà[4ÃP2Ã`2Ãð¸+Ãà )ÃÀ1.Ãï/Ã@48Ãàg2ðà4ð{0ÃðM(à 1ÃÐá,àï+Ãðˆ3Ã@Û1Àâ5ÃÀ1Ã0=0ÃÐL0à ™/ÃE0Ã@á0ðø0Ãàä2Ãpb/Ãàê1ÃÀ´-ðæ3Ã`¾.Ø3Ãð”1Ã@á0Ã@É4à ¥-Ãpë-Ã`2Ã@@6ÃŒ5ð .Ã0Ò,Ã`50ÃÑ4ð™+Ãà+à i7Ãp>5ÃÐ@2à 2ÃPð4à ì6Ãàê1ÃÐR/àÝ.ÃP-Ã`A.Ãðó6Ãð 3Àw2à æ7Ãð4Ãàä2ÃÀ¨/ÃÐ@2À1àÅ2ð-ÃÎ*ÃP£,àé,ÃÐç+À}1ÃW-Ã3/Ãà.ÃÐÛ-ð/Ã0O-Ã@Õ2ÃÀ2àÑ0Ã@p.Àú1Æ6à ø4Ã92À}1ð/ÃP—.ÃP‘/ÃP -Ã,ÃE0ÃÀº,ÃÀ~6ÃÐ:ð3Ãpt,Ãx.Ã`S+ÃPy3ÃP&,Ã0U,ÃÀ´-Ã@R3ê0Ã0+3à 1Ãð”1Ã@d0Ã0I.À.Àú1ÃÀ7-ÃÀI*ÃðŽ2ÃàU5Ã0º0ðu1Ã@Ï3ÃÐd,ÃK/à 0ÃÐç+àã-Ã@á0Ã@v-Ã~-ði3ð{0Ã0U,ð‡.Ä,à “0à›9àË1à 1Ã`¦2ð{0Àk4ÃpÍ2Ãð¦.à¡8Ã33Ã0Æ.Ã0O-à /à 6ÃÐÉ0ÃÀ 4ê0Ãàü.ÃÐF1Ã-0ÃÐd,Ãà'Ã&Ãï/Ãàg2Ãð1ÃÀ3ÃÀ1.ÃPy3Ã!2Ã`Ð+Ãph.ÃÀº,Ãx.Ãph.Ã`¾.àl,ÃÀ1Ã@ó-Ã5À7Ã?-Ã`¸/ð/Ã`¸/Ã`/1ðo2Ãð /Ã`A.Ã`G-àã-ði3ð‡.ÃàU5ðc4Ãà-Ã@í.à Ÿ.ÃÀ¨/Þ2à 1Ã`e(Ã0[+À³(Ã4Ãà[4Ãð1Ãð /ÃP/Ãp€*Ã`š4ÃÀ+/Ã`/1ÃQ.ÃP1Ãà+ÃÀÞ&Ã0Þ*À•-Ãн2ÃÀ%0Ã*;Ã@+à :*à 1À‰/ÃÐX.à 2Ãàs0ð-À§*ð:&ü-Ãr/ÃPP%ÃÀØ'ÃpP2à @)ÃÐ:3à “0Ã0Ò,Àî3à ™/Ãð5,Ãà.Ãð).ÃP¯*ðþ/ÃÎ.Ã@ *ÃP&,ÃÐÏ/à 3à 3ÃðÄ)ð±'ÃW)ð.(à 4+àÝ.Ãð¬-ÃÀC+Ã~-À6(Ãàs0ÃÐÉ0ÃÐÕ.Ãï/Ã`¦2ðø0À­)Ãðù5Ã9.à u5Ã`)2Ã`Ê,Ã%'À1Ãàð0ð-à /ÃÐd,Àw2Ãð1ÃÐÏ/à ¥-À­)Ã0g)ÃÐÕ.Ã`¦2àï+ÃÎ.Ã`¬1Ã`G-ÃÎ*ÃP -ÃP‹0Ã`4Ã@^1Ã@|,Ã@^1Ã`²0ð .ÃÐÏ/Ãà-Ã`G-Ã0C/Ãû-Ãp’'Ã0=0Ã`Ä-Ã0m(ÃÀ7-àÝ.à .,ÃP©+Ãpb/Ã~-Àq3ðþ/Ãð¸+ÃP8)ÃPs4ÃàÌ6Ãf1Àú1Ê+ÃàO6ÃP‹0Ãx.ê0Ãð1Ãp(à 4+Ãàg2Ã`Ä-àT0ÃÀ=,ÃÀC+Ã`¸/ÃÐÿ'Ãpt,ÃK/Ãн2À‰/ÃP©+Ã5ø?žÃ?­Ã¸tªÃ ¤Ã€N¤ÃÀs£ÃPtŸÃ˜nžÃÀ œÃ€›Ãˆk˜ÃÛ—ÃXy—à )˜Ã¸o–Ã0h”à ¾”ÃH|Ã(:ŽÃàÃX&ÃhSÃp±Ãpà8‹Ã°âŠÃX>ŒÃuŒÃÈü…ÃH¬ˆÃÐBˆÃH)‰ÃˆÑ‡ÃXÓˆÃXb†Ã(p…ÃP‡‡Ãxª‡ÃhˆÃ`=…ÃÀ3„ÃÈ…Ãpj„ÃG‚Ãk€ÃÈ€ÃÀ?‚à *ƒÃh„ÃÐ`ƒÃÀK€ÃÐé~ÃÀÈ}Ã@„Ã@û‚Ãà™€Ã †{ÃÐõ|Ã0c€Ãðº~Ã0xÃp¬vÃ@{à NzÃ`Ø}Ã@ }Ãg€Ã -uðéqÃ0ŸsÃ3xÃPFzÃðsuÃPùqÃМvÃÐakÃp5uÃÈtÃð[yàQoínÃÀ«mÃ0FmÃÀ¥nÀVvàÈpùlà œmà mÃ`tðûnÃ`jÃ0ífàÚmà jÃÐÌnÃ@slÃ`>mÃPšlÃHjÃpfÃÀFiÃ0áhÃp•eÃ0^iÃÐêiñcÃïgÃ`jÃThð+gÃÀ_Ãp•eÃF`Ã0`Ã`€bà«`ÃÀjcÃàÖ^Ã`ýbÃp¡cÃ+^ÃPÐcà cÀZÃð[à ‹[ÃÒWÃPƒ[ÃÀddÃPk_Ã`9Yðð[Ã0/\ÃðnaÃP[àÏZÃPq^Ã0¬\ÃP}\ÃàîZÃð!YÃpfXÃ0MWÃ0_TÃ`-[ÃàôYÃÀ[À“WÃ@ýUÃÐÇZà:^Ã@÷VÃÐÙWÃà¡RÃP ZÃÌXÃ7\ÃP­TÃàúXÃ`3ZÃ=WÃÀ¬XÃð¶UÃ@Sð—UÃÀAUà >Sà >SÃÀ;VÃP³SÃpZZÀŸUà »SÃ0ÊWÃÒSÃ@ŒSÃÐÍYÃ0ÐVÃP­TÃð!YÀ4RÃÐhUÃP­TÃ`WTÃ@¤OÃP­Tð TÃP6Sà¸IÃÐPYÃàÐ_Ã0qQÃPÃ@ìCÃð HÃàxDÃpö@ÃÐ9HûFÃÀ0CÃ`^>àYDÃàrEÃàûCÃ0BDÃÀH?ÃðIÃÐÔCÃÓ>Ãà~Cð\JÃ@KIðýDÃ@ ?Ã@]FðzEðñFÃpUFàÜCà !CÀšAÃP+@ïDÃ0NBÃpØEð†CàÜCÃàœ>ð9;À @àÖDÃ>BÃPº=ÃÀÅ?ÃpäCàYDð€DÀpHÃÐ{=àeBÃpmBÀAÃP®?Ã`FBÃPCÃPDÃð.BÃ?À @Ãð±AÃà@Ã`@CàÖDÃ`á=àYDÃP„Fð†CÃ@@ÃpÆHÃP EÃà AÃ\Að˜@ÃJ@ÃàCðBÃ@‡?ÃpðAÃ@(:Ã0BDàÖDÃp>ÀAà_CàYDÃ`½CÃ0Ãð“Fà GÃúBÃp‘<à_CÃDAÃÀ*Dð!?ÃÀ³BÃð4AÃÀN>ÃÀ›FÃ0§Hð'>ð'>ÃÖHÃ@ÔGÀŽCà ¤BÃà¢=Ãð:@ÃÍ?À5=Ã0f>ÃðÃ>ÃàBðýDÃà?àYDÃÐÔCàSEÀšAà FÃ`ç<Ãt=Ã\=à=ÃVBÃ_GÃ@{AÃ;õGÃ0`?à tJÃÇDÃ0é=ÀÊ9ÃP EÃ&FÃ`^>àÐEÃBÃÐu>ÃAà ªAÃ`@CÃPDõGÃ`Ï@ÀšAÃÇ@Ãà¢=ÃÐÎDðBÃ06FÃ`X?ÃÐÔCÃÓ>Ã`á=ðBÃJ@ÃPI;ÃôCÃP„FÃHÀ5=ÃpUFÃDEÃð"Dà}>Ã0:ÃÐWCÃ`@CÃ0ï<Ã>À @à 9?Ã`X?ÃàŠAÃ@òBÃ@øAÃà%=ÃP1?ÃÙAÃP?ÃâFð'>Ã`Õ?à ?>Ã`ÉAÃ8GÃÐÚBÃôCÃp…>àâBÃàœ>àq@Ã=à ?>ÃÀ6BÃàº9ÃðÉ=à ¶?Ãà AÃ>BÃÀB@ÃP==Ã0é=Ã@Ÿ;ÃBÀ¦?Ã0ËBàƒ=Ãý7à 9?Ãë>ðž?à Î;ð@ÀCÃÐQDÛ=ÃÀÑ=ÃÀ×<Ã0~:À¬>à ªAàèAàw?Ã@“=ÃÐu>ÃP%AÀ¬>à 3@Ãð½?Ã`½CÃ8CÃà7:Ãà>Ã@(:ÃúBÃ`·DÃ@@Ãà[4ÃÀ­CÃðF>Ã`á=Ã0l=Ãp‹=ÃÐu>à K<ðÎ7Ãp‹=Ãà®;Ãð«BÃë>ç;ÃpsAÃ0ï<ÀšAÃÐKEÀ#@Ãà7:À¬>Ã?Ã`ç<ÃÀf:ÀÊ9Ãt=àâBÃÐÔCÃð Hà‰<ðBÃðR<ÃðEð-=Ã$<ÃÀÃÀ6BÀ¦?À²=Ã>ÃpäCÃà@Ãð·@ÃÓBÀAÃð¥Cà È<Ã<8ÃP®?ÃðÉ=Ã@øAà žCÃpy@ÃÀ³BÀAàw?ÃP7>ÃðÉ=àkAÀ#@Ãð4AÀ5=ÃðX;Ã0TAÃ0HCÃðÉ=ÃÐÎDà ¼>à Â=Ã`j<Ãà¢=Ãñ=ÃpêBÃ`^>ÃÀ×<ÃÀ`;à žCÃà?Ãà AÃÇ@ÃôCÃÐ:ÃP´>ÃèEàw?ÃÀN>ÃPÌ:Ã@Ÿ;ÃÁAÃðGàâBÃà¨<ÃÁAÃp?ÃðÉ=ð!?àSEÃ0ËBÃ?Ãß@Ã0ï<ÃÐì?ÃÀB@ÃÐQDà ¼>ÃP¢Aàô?ÃpØEÃÐÎDÃwCÃ0Z@Ãë>Ãà–?ÃðÕ;Ã0x;Ãð(CÃpö@Ãh?ç;àw?Ã`d=ÃP+@Ãà+<ÃàŠAÀùFÃPº=Ã`X?ÃPDÃ@{Aà•:à=Ãð«BÃAÃ0ÑAÃPC<Ãðv6ð°<ð˜@À²=Ã`d=Ã?ÃðFÃà?ÃÐ ;ÃÀ6BÃ@@Ãð@?ÃÐu>ð9;Ãð±AÃDAÃPÆ;Ã0:À²=ÃAÃPä6Ã`ˆ7ÃPõHÃ`:DÃÐi@ÃÇ@ÃÐu>ÃÐu>ÃpðAÀ¬>ð!?ÃÇ@ÃÐÎDÃð@?Ãp‘<Àe5ÃP®?Ãð½?ðª=Ãp‘<ÃP+@ÃpaDà æ7à;Ãð:@à DÃVBÃP®?ÃðR<ÃÀÅ?à:Ãb<à 9?Ãå;Ãà@ÃÀÑ=Ã@<ÃðL=Ã?À¬>ÃP¨@ÃÀB@Ãà1;Ãp?ÃAÃpmBÃà–?à W:Ã`4EÃ0TAÃb@Ã=Ã`Ï@ÃðL=Ãb@ð?:Ãð.BÃ@“=à ¼>Ãà@ð3<Ã`·DÃ`±EÃ$<Ãð«BÃ0ËBÃÐo?Ãp>À)?Ãë:ÃPa7Ã`^>ÃÀN>ðAÃ0é=à 9?Ãb@Ãz<à W:Ã@ ?ÃpêBðW6ðÎ7Ã\=ÃÐò>ÃðÏ<Ã0é=ÃPO:Ã÷8Ã@<Ãp—;Ãp‹=ð¤>ÃðR<ÃPC<ÃÐÔCðÂ9Ã0­GÃqDÃ0f>Ãp[EÃÀ§DÃP7>ÃÁAÃ`d=ÃP–CÃ`@CÃÐEFÃàCð¶;õCÃÐo?Ã0×@ÃP==Ãp?ÃÀÃàCà žCðK8ð¤>ÃðÛ:à -Aà Î;ÃVBÃpy@ÃH6ÃPC<ÃÀr8Ã8CÃpy@Ã`ç<ÃP¨@ð€DÃå;Ã0ã>Ã0f>ÀÄ:à=ÃðÏ<Ãà Aàô?ÃÀB@Ã>ÃP¢AÃ`X?ÃàU5à Î;Ã`j<Ãpy@à}>ÃðŸDÀCÀ)?ÃBÃÀ³Bà È<á<ÃÀl9à ¼>ÃÍ?Ã!6Ãà>ÃÀ×<Ã?Ãñ=Ãz8Ãå;Ã@Ÿ;ð°<Ã@òBÃð½?ðª=Ã$<Ã@“=Ã@þ@ûBÃÀÑ=ÃP==ð!?Ã2DÃpö@à=Ãàœ>Ã?Ã`j<Ãp…>Ãë>ÃÀã:À²=Ãð 3ÃÐ<Ã@àEÃðL=Ãz<ÃÐì?à E=Ã0ã>ÃPÆ;ÃPº=ÃJ@ÃàŠAÃðç8ð!?Ãà>Ãà¢=Ãp‹=À#@ð¤>Ã@òBà Î;Ã0é=ÃÐi@à <ÃðR<ÃðR<Ãå?Ã0Z@Ã`Û>ÃÐò>Ãà>Ãn>ð˜@Ã0:Ã9ÃPØ8ÃÀ×<Ã@>ð¶;ÃDAðÂ9à Ú9Ãà@ÃÐ<ÃðX;à;ÃÀH?ÃP[8Ãp :ÃÐu>ÃàC8ðª=ÃPU9À¸<Ãà+<Ã;ÃÐo?À”BðQ7Ã`‚8Ãp,8ÃÓBÃ0„9à È<Ã`Û>ÃPÌ:Ã`p;ÃP+@Ãðá9Ã@É4ÃÐ8ÃJ@ÃÙ=Ãp>Ã}BðE9À)?Ãpü?À¦?Ãp‘<ÃÀB@Ãp‘<à;Ãà=9ÃðR<ÃÀZ<Ã`”5Ã?1Â;ˆÁ€¬¾ÁÀ€Ñ#Â7€±RÂlh€÷pÂãiÂÀeO³qÂÀÂ~Âà‚ ñÂàΌ ü”Â`}¤ÂÀ œÂ@MŸÂ`  ´ Âà€™Â൥ œ¤Â€Ý¡ÂÀ~¶Âu¨ÂàÀ¸ÂiªÂ`§Â <´Â`RÀÂà®ÂÀ`»Â€vÇ ½Â€Å 5ÊÂ@"»Â ÏÂ`Â×Â@]ÆÂ`¥ÇÂ`à÷É€@РjÖÂÀqÍ€^Ë åÌÂ`iÑÂÀ#ÚÂà•Ô€cßÂÀ߀ÈãÂ%߀ÚàÂàGá€cßÂÀÉèÂÀˆÞºÛÂà¸ãÂ@£äÂ@,ã ´é „ñÂàFöÂ`êÂõÂ`&ñÂHî€ï€ÓöÂ@´öÂ`—óÂö ˜øÂ ÂñÂ`õÂ`öÂ`ÁìÂÀ óÂàíïÂÀøõÂàFö Âñ€£þ Œú HûÂâÃÐÃàÃöÂ0KÃà“àåÃpíÃkÃÀàùÂôûÂ`[ÃGÀÃùÂ`aüÂ@xÃpçðôÃÐ0 ÃP"ÃÖÃýÃ` ÃÀžÃPÃÀ-ðk ðk à k ò Ã0 Ãp½ à ð;ÃÐ* Ãðr Ã0ž ðâ ÃPÃp½ Ãðõ ðôÃ0Ã0 Ã@6ÀüÃà?À%Ã°Ö Ã€ä ÃáÃÐÃðï ÃðÝÃP¼Ã0ÙÃ0zÃ0÷à ¬àÃp.à‹à‘ÃÐeð|à ð¾ÃÀtÃà†àÃPc ÃPEÀ–Ãà˜ÃpæÃXÃXÃ`×Ã0ßÃÃÏÃ0Çð”Ã[Ã0ÇàÒÃðBð¦ÃLÃP¤ÃÀ£Ã0ÙÃáÃÀµÃ`¹ÃàaÃà¤Ã@ÃRÀxÃaðdÃ^ÃP!ÃàñÃÀ»ÀÃð§Ãà’Ãáà ¬Ãð•Ã4ÃÐGÃÀÃÏÃàJ"ÃPŒÃÃpiÀ à ‚Ãàßð|À%àØà´ ÃØÃ0!ÃüÃ@Ã0µà Ã0©Ã@•ÃäÃðÃà\Ã@‰Ãà÷Àf à ùÃpÎÃ@;"ÃpKà ‚Ã@ÊÃPzÃðw!ÃðÀxÃ0#Ãðî"à ”Ã`§ðçÃ0ü%ÃÒÃà£(Ç%ÃàbÃð•Ãðw!à&À³(Ã`q&Ãp¶!Ãðî"ÃàñÃ@ÊÃà+ÃPë Ãð¡Ã@¸"Ã@ *Ãà,'ÃÀ"ÃÐ/ à%#Ã0#Ù"Ã`ô%Ãp°"Ã7$Ù"Ã@²#à%#Ãpª#Ãðè#ÃaÃ@Ž)ð4'ðÕ!Ãà»$Ç%àf-à Û$Ãðe$à |Ã0ü%Ã@²#Ãp÷+ÃPÍ%ÃР"Ã=#Ãø'Ãì)à .,à ç"ÃP¯*Ãà¯&Ã0%Ã0#ÀÅ%Ãpž%Ó#Ão%Ã{'ð@%ÃpŒ(ÃÐ)!ô$ÀB&Ãà'Ã0ê(Ã0g)ÃP>(ÃQ*ÀH%ð.(Ã` "Ã0Ø+ÃÐÿ'Ã@²#Ã@;"à «,Ã`e(Ã0 Ã0%ð:&Ã`}$ÃÀC+ÀN$à Ã(Ão)à ".ÃP -Ã@ *ÃðÐ'ÃE,Ãà‘+ÃPÍ%Ãà+ÃÀ7-à Õ%ÃPb"Ãp&Ã{#Ãà+Ãp&Ã@(À­)ÀB&ÃÀC+Ã@²#À**Ã@)À­)ÃðÄ)Ãpñ,àr+ðò1ÃÀC+Ãp&ÃPÓ$ÃPÍ%ÃPÙ#Ãà-à (-ÃðY&ÃP,+ÃÐd,ð/î%ÃK+Ãà.àl,ÃPD'Ãàµ%ÃP -Ãðš0à 1ÃÐÿ'ÃÀê$Ãì)ÃÔ-ÃP>(ÃÐj+à–%ÃÀ=,ÃPÍ%ÃÀº,ÃÀ¢0ÃðÜ%à 4+Ã@)ðø0ÃÔ-Ã0Þ*À§*Ã0a*Ã](Ã0º0Ã0=0Ã@v-Ã],Ãpñ,Ãõ.ü1Ãà.Ã0Þ*ÃðY&Ã*Ãà.À.ÃpV1Ã~-Ã@‚+Ã`ô%à¨"ÃÐ'ÃP&,Ã0ä)ÃÀ®.ÃpP2À$+à ^$Ä,ÀB&Ãû-ÃÀ1.Ã@j/Ã`¸/àû)à @)Ãp€*à&Ãæ&Ã@ *à)àx*Ã0ä)Ã(à ±+Ãû-Ãà.Ã0Æ.ð±'Ã*Ü(Ãi*à É'à„(Ã@‚+Ã0Ì-à ·*ÃÐÉ0ÃPP%ÃO à$Ã-ÃÀÌ)à 1Ãð1ÃÐL0ÃÀC+Ãæ*Ã`Ö*ð½%ð™+Ãp )Ãày/à ".ê0Ã*àõ*Ãð#/Ãð¬-Ãà&(ÃP2*Ã0g)Ãi*ÃÐó)ÃÀ2Ã`A.ÃÀ+/ÃÀ®.àT0Ãï/Ãðâ$Ã`Ð+ÃðG)Ão%Ãà,ÃðA*Ãàö/Ã*ð‡.àr+Ã@|,Ã0O-Ãð;+Ö)Ã0ð'Ãà,ÃÐF1Ãpý*Ã@í.À‰/àï+Ãpë-à ç"à «,ð‡.ÃÂ,Ã@p.Àƒ0Ãò(ÃÀÆ*Àú1Ãã1ÃpÁ4Ã`Y*Ã0O-ð™+ö.ÃÐí*À,à Õ%Ã@)Ãð#/àf-Ã0m(Ãi*À0)Ãð1ÃÐ|(à R&à)À6(Ãà)à @)Ãpt,Ã0O-à ¥-Ã@v-ÃPµ)Ãph.à`.Ãð#/ÃPµ)À6(ÃÐí*ÃÀÌ)ÃÀ7-Ã@‚+ð/ÃW-Ã`;/Ãpb/Ãð).Ãp\0à @)Ã`î&Ã@Ž)Ã@ˆ*Ã@p.Ãpë-Ãpë-ÃP,+Ãz8ä1Ã0º0Ã@+ä1Ãàm1Ã`²0ÃPµ)Ãà+Ã0´1ÃÐÉ0Ãàü.Ãpn-ÃÀœ1ÃÐÉ0Ãð0Ãà.ÃP‘/Ã*Ã1%Ãpt,ÃÀI*Ãpt,Ãpå.ÃP2*Ã0´1ÃpJ3Þ2ðu1ü1Ã`Ö*Ã0Æ.Ã@F5ð3ÃÀ=,Ã@|,À,ÃÀI*Ã0+3Ã@Ã5Ã?-ÃÀ1Ãày/Ãpý*ÃP¯*ðþ/à .,ÃÐá,Ãà—*ðŸ*ð/ÃpV1À¡+Ã0À/ÃÀC+Ã0=0ÃÀ2ÃP©+Ãpë-Ã3/àZ/ü1Ã`A.Ã@j/àÝ.Àƒ0ÃÀ®.ÃP>(Ä,Ã`G-Ã5Ã@v-ÃP2À-à 0ð‡.ÃÐÕ.Ã!2ÃÀ–2Ãð²,ð¥)Ãàê1Ã@ÿ+ÃÐù(Ãà,ÃÐL0ä1ÃP‹0Ã9.Ãà-Ã4ð-Ãû-ÃÐÛ-Ã`2Ã@ˆ*ÃÈ+Ãpb/ðø0ðu1ÃP2ÃÀ1ÃP.Ã@ó-Ã`;/ð"*ÃÈ+Ãpb/ðæ3Ã012ÃP‘/ÀÐ8Àú1Ã@ *Ã`²0ê0Ã`)2ð‡.Ã~-ÃÔ-Ã0Æ.àÝ.àH2Ãàm1à ¥-ð-ÃP -Ã`¾.Ãð 3ÃÀ´-ÃÐ44ÃÀœ1Ãðó6ÃpV1ÃÐ44Ãpb/ÃÐÛ-ð .Ã`/1Ã`¾.ÃP.ÃQ*ÃÀ¨/à 0ÃÀ=,À.Ê+Ã`¾.ÃÀ1ÃPg6À‰/Ã0C/Ãð1Àô2Ã0ä)àT0Ã`/1À‰/Ãï/à ±+àé,Ãð5,ÃÐX.Ã0I.àN1àï+ÃÐÏ/ÃÐL0Ã`Ž6ðQ7ÃÀ–2à ì6Ãà…-Ä,ÃP -ÃÐó)ð .Ã'1Ã@Û1Ãã1à +ðu1ÃP0àË1Ã@^1ÃÐL0ÃP‘/Ãp>5Àq3Ãðv6à o6Ãð0ÃÀ–2Ã`;/à×/Ã`¦2Ã0%4Ãà&(Ã`¸/ð]5Ã0¢4Ãз3Ãpb/ÃÀ%0ÃQ*ÃP…1Ã`ˆ7ÃÀŠ4ÃÀ+/ÃÀ3ÃPð4ÀG:ÃÀ´-Ã@v-Ãpµ6Ã@‚+ÃP0ÃPm5ÃP0Ã9.ÃðŽ2Ã0®2Ã`S+ð-ÃP&,ö.à /Ãð /Àî3Ã@R3à 0ÃÀû6àé,ð,ÃÐÕ.ÃP—.Ã@X2ÃÀ2Ã,àõ*à :Ã09ÃÎ.à 2Ã@Ž)ÃÀ¢0Ã@Õ2ÃPü2Ãl0Ã~-ÃÐL0Ã0º0Ã@^1ð-Ã@ó-àr+Ãð;+ÃÐÏ/Ãpå.ÃN5ÃP…1Ãû-à :*ÃpŒ(ÃpV1Ãðš0Ãpb/à 1ÃZ3ÃàI7à 1Ãðÿ4Ãð1ÃP1ðŸ*Ã@+ÃÐL0Ã0U,Ã@á0À.ð-Ã`â(Ãðù5Ã`#3Àƒ0ÃN5Ãàê1ÃÀ3Þ6Ãï/Ãf1Þ6à×/àË1à (-Ã0+3ÃÐí*ÃpÙ0ÃÀ2Ãà.ÃÀ¢0Ã0I.Ã0=0Ãàê1ÃÐÕ.Ã?-à o6ÃÀx7ðo2ÃP£,ÃP»(ÃÀC+À}1àÝ.ÃpJ3À$+Ãàg2ÃP…1ÃÂ0ÃpV1ÃÀ=,Ã@@6Ã!2Ã@½6Ãðˆ3ÃÐí*ÃÐ^-àr+ÃÐá,À¡+à 1à ‡2Ã@í.Ã0®2ÃÀ~6À.Þ2Ã0Ì-Ã`š4Ãp»5Ã@^1Ã0%4Ã92Ã071ÃÐá,ÃÐí*Ãðˆ3ÃÀÆ*Ãõ.à .,Ãð”1ÃÀ–2àr+Ãà-Ã@L4ÃÀ¢0Ã@j/Ã0œ5ä1Ã0®2ê4ð‡.Ãðš0Ãp\0ÃE0ð+ÃÐÛ-Ã0Ø+Ã0Æ.à`.À /ÃpÇ3ÃQ.À§*à Ÿ.ÃÀ5Ãàg2ÃÀœ1Ãð1ÃÀ®.Ãàê1ðø0ÃÀ=,Ã0ö&Àq3Ã0O-Ã0œ5ÃÀU(Ãà-ÃÚ,Ãé0Ãð 3ÃÔ-Ã@L4Ã`A.Ãàä2à 2ÃÀ 4Ãð¦.ÃÎ.ÃP2*à 3à ‡2ÃÀÆ*Ãàä2Ã@Û1Ãð;+ÃP/à u5à Ÿ.ÃP2Ã0%Ãp¤$Ãð5,Ãpß/ÃÀ„5ÃÀ1.ÃÀO)Ã@+ê0ö2ÃpV1Ã~-ÃP>(Ãàm1Ãàm1ðì2ÃÐÏ/Ã`A.ðÔ6Ã@d0Ã@Û1Ã`)2Ãз3à “0à¿3à9À.Ãàü.ÃÐó)Ã@j/à`.Ãðˆ3ÃÀI*à)àÑ0ÃÐ^-Ãû-Ãб4ü-Ã~-ÃP,+Ãб4ð/Ã012à ".ÃpŒ(Ãà*ðø0ÃP£,Ãph.ÃàÞ3ÃÀŠ4Ãð /à 1ÃÀ+/Ã5Ã`2ÃÐv)Ãð²,ð{0ð{0Ã@p.ÃpÇ3ÃH6àB3ÃË5Ãà-Ãï/ð+à (-à +Ã@ˆ*ÃЫ5Ãàa3Ã!2Ãõ.à “0Ã071Ãpý*Ãà*ÃÂ0ÃP‘/à 3Ã0U,Ãõ.ÃÀ1Ãpå.Ãà.Ãà*ð-Ãà )àr+Ãà+ÃÔ)Ãð”1ÃÀ®.Àú1ÃÐÉ0àf-Ã`50Ã0Ì-Ãð¦.ð/Ã`Ê,Ãð).ÃP2*Ãày/àT0àÅ2Ã`w%ÃQ.À-à +ðà4Ã0Ì-Ã`;/Ãp÷+Ã@^1Ãã1à /Ãð5,à Ô:Ã'5Àú1àr+Ã?-à ±+ÃÀ´-ð{0ÃÔ-ÃÀÌ)ê0Ãp>5Ã@Õ2ð.(Ãà…-Ãõ.ð‡.Ãpý*ÃÐF1ÃK/à`.à`.ð‡.ÃÀœ1Ã0g)ð“,Ã@d0Ã-4Ã0I.Ã0Ø+Ãpë-Ãð¦.Ãð#/ÃPJ&ÃP2*Ã0ä)à (-ðŸ*Ã0ü%ð¥)ÃÔ-Ãà‘+Ã`;/ðò1à (-Ãû-Ã@á0ÃP¯*ðì2ÃÐÛ-Ãé0ÃÀ 4Ã@ù,Ã`Ä-àã-Ãàö/Ãày/Ãà,Ãð0Ã0À/Ãð_%Ãx.ÃÐó)Ãpý*À­)Ã@‚+Ãð;+Ãpß/àû)À³(Ã@ó-Ä,Àè4Àƒ0ð‡.Ãà-Ã0a*ð/ü-ÃQ.à)Ãø'Ã0À/Ã`¸/ð/ÃÂ0ü-Ã0º0Ã`M,ð-ÃP¯*à @)à (-Ãp÷+Ãàg2Ãð5,àÝ.ÃÔ)Ã@ó-ÃP0Ã0ä)ð‡.ð-Ã`š4à “0Ãpñ,Ã@p.Ãp÷+ÃÐX.àx*àŠ'à ±+ÃK+ÃðÊ(À‰/ÃÀ´-Ã0%Ã0O-Ã0®2ÃPµ)Ã@ÿ+ÃÀ1à ¥-ÃÐá,Ãø'ÃÀÒ(Ã`Y*ð .àr+Ã`w%Ã92Ãph.Ãp€*ÃP©+ÃÐj+Ã@ù,ð“,Àe5Ã`Ê,àÝ.Ãð#/ÃðÊ(Ã(Ãpý*Ã-Ã0Ì-Ã0a*ÃP¯*Ãàð0Ãpß/ÃpV1ÃK+ÃE,Ã`Ð+Ã`S+ÃÐv)Ã-ðu1ÃÐÛ-Ãà+àf-À1à Ÿ.ÃÐF1Ãpz+À§*Ã`Ð+Ãðk#Ã@ &Ãð²,Ãpb/ê0Ã)ÃÐç+ÃðM(ÃÐF1à ™/ÃÀ¢0àã-à ·*Ã@F5Ãp€*ÃÐ|(À6(Ã`â(ð{0Ãõ.ÃÀx7ÃpÇ3à(Ã@#&Ã0a*à +àZ/Ãu(Ã@ˆ*àû)à~)ÃÂ,àõ*ÃE,À$+ð:&ð@%Ã0‹#à L'ÃPÇ&Ã0Ø+ÃPy3Ã`G-ÃÀ¢0ÃP©+Ã0y&Ãà&(Ã0‹#Ã@”(ÃÀ+/Ãf1Ã012à×/Ãн2Ãày/À›,à ½)à %Ã`k'ÃÀ¨/Ãl0ÀB&Ã`e(à ·*Ãp(Ã`5À0à ¥-Ã0s'Ã0O-ð‡.ÃP£,Ãà—*Ã`Ð+ð/Ã](Ã0Ì-ÃÐ^-ÃÔ-Ãpt,ÃÀ%0àÝ.ðu1Ã`è'ÃP£,Ã`Ð+àé,à “0Ãà+Ã@‚+Ã@'ð-À}1ðL#à «,à<4Ãà.ð-Ã3/Ãpý*à~)ÃÐp*À¹'Ãpt,Ãp!%Ã`A.à ò5ÃÐÛ-ÃÐj+Ã`G-ð+àã-à(ð"*à :*Ãpt,Ã0Æ.à “0ð¥)àû)Ã@Ã5ÃÈ/ðu1Ãð).ÃÀÆ*ÃP2*À›,Ã~-ü-à +ÃðA*ÃP£,Ãæ*ÃÐÛ-ð"*Ã0ê(ÃÂ0Ã`¸/ÃP©+Ãu(à 3Ãàm1ÃÀ7-Ã@á0ð@%ÃÐí*Ã@Û1Ã`¾.Ã*à ¥-ÃÂ,Ãн2ÃÚ,ðŸ*Ã@+Ãp€*ÃP2Ã`¸/ö.Ã`A.Ã?-Ãð5,Ãà+Ãàê1ÃPÇ&ÃP©+Ãàö/àr+ö.ÃÀÌ)Ãp*Ã@|,ÃP©+À0Ã`Ö*ü-Ã~-Ãðˆ3Ãз3Àƒ0Ã@v-Ã@v-Ã?1ði3Ãpž%Ã@š'ÃÐj+à «,Ãæ*ÃÐv)Ã`â(Ã@|,ÃÀÆ*Ãã1ü-Ãà£(Ãð /À•-Ã0ö&Ã@ç/ÃÀ®.à ".ð±'Ã0Æ.Ãн2Ã3/ÃÐ'à :*ÃðÐ'Ã`Ö*Ãà‹,ÃÀ+/ÃÂ,Ãàð0Ãp€*ÃÀÀ+Ãð4Ã@v-Ãò(ÃpV1Ãð0ÃP£,Ã0C/À1Ãð¬-ÃÐÏ/Ã*ÃðA*àé,Ãpz+ÃÎ*Ã@í.Ãàm1Ã33Ãàê1ð-ÃQ.Ã0Ø+ÃP£,à :*à “0à 0Ãpë-Ãàm1Ãà+ü1àé,ÃÐÏ/ÃZ3Ã0´1ÃàÞ3Ã`/1ðò1ÃÐd,Àk4Ã`e(ÃP£,ÃÂ,Ã`/1Ãàü.ÃÀ+/Ãpñ,Ã0Æ.Ãé0ÃE0àZ/ÃP—.Ãpñ,ÃPJ&Ã33Ã0[+ÃÈ/Ã],Ãp€*ÃK+Ãõ.ð"*Ã@ó-ÃÐÏ/à ½)à “0Ãày/à 3Ã@d0Ê+ÃE,Àú1À­)Ãð0Ã3/ð/Ãr/àT0à 4+À-Ã`²0àï+Ã0Ì-Ã@|,À¡+ÃðS'Ãð²,Ã@š'à (-Ãr/Ã3Ãpz+ÃpŒ(ð()ð/Ãé0ÃÐ^-Ã`¾.ÃÀO)àË1ÃàÌ6Ã07ðÚ5à;ÃÀr8à Q;ÃÑ4ä5à9ÀÖ7ði3ÃàC8Ãh;Ã@@6ðà4ÃÙ=à Q;Ã69Ã<8ÀÐ8ÃPÞ7Ãp:Ã`j<ÃÀ¿@Ãà–?ÀM9À;ÃÀÝ;Ã06Ã@oCàú>Ã0l=ÃPº=ð°<àî@Ã;Ãb<À¾;à=ÃAûBÃàBÃn>Ã@>à>ð€DÃð·@Ã@Ÿ;ÃÀ5ÃàŠAà Ô:ÃPÆ;ð¶;Ã0ã>Ã@=Ã=ÃÐàAÃqDÃÐcAðAàƒ=à ªAðAà Î;ÃpðAÃt=ÃPI;Ãh?Ãà–?Ãð±AÀ¸<Ã0`?à -Að-=ÃÐu>Ãp :ÃÐ{=Ãå?Ãð«BÃà?Ã÷8Ã`ù9ÃJ@ÃÐ{=Ã`ˆ7ÃàŠAà 3@ÃP®?ðÈ8ÃðÕ;ÃÁAÃt=ÃðÃ>ÃðL=à <Ãðv6ÃàÀ8Ã`ó:àƒ=Ã@@à 3@àî@ÃÐì?ÃÀ„5ÃÓ>Ãðp7ÃÀé9Ã09ÃÀf:ÃàÌ6Ã?à ¶?à Î;Ã@>À¬>Ã`^>ÃÀé9Þ6Ãðç8ÃðÃ>Ãà=9ÃÀÝ;Ãà¨<Ãð«BÃÙ=ÃöMÀY7Ãë:Ãð½?ÃP7>Ãý;Ãp£9ð°<ÃPº=ÃBÃp=Ã@>ÃÀã:À¾;Ã0NBÃ@48àú>Ã0 8ð?:ÃÐ:à;ÃЇ;ÃPº=ð¼:à 'Bà¡8Ãð|5Ãp>5Ãp‘<ÃPÒ9àq@Ã`í;Ãb@Ã`LAÃ@·7ÃÐ8Ø7Ã0õ;Ã`v:Ãp©8Ãp :Ã0œ5à9à æ7Ã`¦2Ã`‚8ÃÀ`;Ãðd9ÃÐ:Ãpö@Ã\AÃÀ„5ÃÂ0ÃàC8à à8ÃÀã:ÃÀr8ÃðR<Ãð^:ð¶;À¾;Ã7Ãp‘<à;ð'>á<ÀY7ÀÄ:àH2ð?:à:ÃP[8à i7àH2ðÂ9Àô2Ãp£9ç;Ãp—;ÃП7ÃPO:Ã>ð'>ÃÀ§DÃPØ8ÃV>Ø7Ã\=Ãp…>à‰<ÃPä6ÃÐ¥6Ãàê1ÃÀõ7ÀG:Ã` 3Ãz8Ãë:ÃÐ ;í:ÃàC8Ãà®;Ã`ç<Ãñ=Ãà7:Ã0~:à W:Ã0~:Ã*;Ãë:Ã=ù8ÀM9Ãp©8ê4À7ÀÐ8Ãð|5Ã@48ó9Ã012ÃÐ9Ãb<àèAÀ)?à•:Ã@<ÃÀé9Ãp :Ãz8ÃP´>Ã69Ã9ÃpP2Ãз3ÃPÒ9Ãpü?ð’AÃPº=Ã=Ã`ç<Ãà=9Ã@oCÃPg6ÃÇDà}>ÃPÀ<ÃB7Ã3Ãn:ÃÀ~6Ãàº9ÃÀ×<Ãðá9à ]9ÃË5ÃÀZ<Ã07ÃàÆ7Ãn:ÃÐ9à K<ÃÐ"7Ã0x;Ãp:ÃÀx7Ã8Ãðá9À_6Ã@¥:Ãn:ÃÀÑ=ð¶;ÃÀ¿@í:Ã0õ;à ¼>Ãp;Ãn:ÃpmBÃÐ8ÃàBÃpü?Ã`6Ãt9ðÎ7ÃÀx7ÃðÉ=à i7ÃðÉ=ÃÀf:ð¼:Ã`^>ð¤>àw?ÃГ9ðE9Ã@@Ã@";Ãà7:ÃPÀ<ÃÁAÃГ9ÃAÃPg6à W:Ã0õ;ÃðX;Ã@«9ÃÐ"7ÃÐ ;ÃPg6Ãð|5Ã-4í:ÃÐò>à <Ã@F5Ãz8Ã?ÃpÁ4à¡8ÃÀB@Ã`^>ÃÐ9Ãàg2à c8ÃàO6à à8Ãp&9à;Ãp=à Ô:Ã`ù9Ãn:ê4Ã@Ã5ÃàU5ÃÐ:Ã@>í:Ãà´:à ]9Ã`‚8Ãp&9ÃPÀ<à È<à¡8ÀÄ:Ã`j<Ãðp7Ãz<Ã@«9ðW6Ãðù5Ã0%4Ã`Ž6ðÎ7Ãñ9ÃÀN>Ã@(:Ã09ÃàÞ3à ì6Ø7ÃÐ8à :ðW6ÃÐ@2ÃÀ~6Ã06ÃÐò>à Ô:ðE9Ãà=9Ãp;Ãàg2à65Ã0:Ã69ç;à 6à c8ÃPÞ7Ãn:ç;Ã’8Ã`ç<Ãà®;Ãðá9ö2à­6Ã`š4Ã`|9Ã`á=ÃÀN>Ã@“=à 3@Ã0–6ÃÀ3ÃPÒ9Ã0+3ÃPÆ;ó9à¡8à›9Ãð”1ÃÀœ1àË1Ã`¸/Ã`v:Ã÷8Ã0À/ÃPð4ðQ7ÃàÒ5ä5à {4à :ÃП7Ã`ˆ7ðò1Ã07ÃÀx7Ã<8ð¼:à 6à <à 6Àk4à¡8Ãp>5Ã@:7Ã3Àk4Ã69Ã05ð'>Ãp>5À.Ã@±8à§7ÃП7ÃàC8ÃŒ9Ã@½6Ã@¥:Ãð2Ãp86à¿3Ã`¬1Ãp»5Ã@Ï3Àƒ0Ã@á0Ãph.ÃÐ.5ÃàÒ5à 0Ãð 3ä1Ã` 3ÃÀ–2ðu1ÃN5ÃÐ:3ÃÑ4ð]5ÃÀû6à¹4àT0à ‡2ÃÐ(6ÃÀ%0ðc4ÃÐ(6à ]9ÃpJ3Ã;Ã071À_6ÃPä6àf-Ã33Ãx.ÃÀ6Ã06Ãð”1Ãpn-ÃÀŠ4Ãð1Ãpµ6Ãë:Ãz<àB3ÃÀl9Ã@X2ÃÐ44ÃÅ6à “0à W:Àî3à {4ÃH6ÃpV1à 1ÃÅ6Þ6ÃÀx7Ãp86ÃÐá,Ã<8Ã0%4à 6à æ7Ã`6Ãðó6Ã@48ÃH6Ã07àÅ2ÃÀ5ÃpP2Ã@Õ2Ã`¬1Ã@48ÀÜ6Ãp27à<4Þ2Ãà[4ÃŒ5ÃPä6ðÔ6Ø3Ã!2ÃÐ9Ã`8Ã’8à o6Ã0:Ãpb/ÀY7Ãð 3à ø4ÃÐ@2Ã`#3Ãð²,Ã`/1Ã0%4àÝ.Ã@F5ÃÐÉ0Ã@F5Ã@R3Ãz8À}1ÃE,Ãàö/À1Ã@F5Ãн2Ã?1Æ:à$8ÃàO6Ã@Û1Ã7ÃpÙ0ÃàÌ6ÀY7à­6Ã0%4ÃÀ 4Àâ5Ãðd9Ãðš0ÃP.Ã5Þ6Ãн2Ãp :à ø4ÃpJ3ÃPy3ð‡.ÃP…1Ã0+3ðu1ÃÀ1Ãàm1ÃÐí*ÃÀ¨/ÃÀ 4ù8ÃÀŠ4Ãõ.Ãp>5ðà4ÃàI7ÃàØ4ÃQ.Àâ5à {4Ãð 3Ãp&9Ãà=9à¹4à þ3Ã-0ÃPÞ7ÃŒ5Ã0Ì-Ãà)Ã@Û1ðQ7Ãð4Ã@á0àÅ2àT0Ã@ó-ÃÀÀ+ÃÀ2ÃàC8Ãàœ>ÃÐ¥6Ãðˆ3Ã0º0Ã@±8ÃÀl9Ãð0à 3Ãf1Ã@F5ÃPO:Ã9Ã`4Àú1ÃÐÏ/ÃÐ:3ÃàÌ6ÃÅ6Ãt9Ã07Àî3Ãày/Ãà‹,Ø3Ã`8ÃÐ:3À1à «,à65à {4ÃÀ2Ã@Õ2ÃŒ9Ãðˆ3Ãpb/àÅ2Ãð2Æ6ÃÐ44ÃPs4Ãðd9ÃPê5ÃÑ4ÃpÍ2Àk4ÃÀŠ4ÃÅ6ÃðÛ:Ãð‚4Ãàg2Ã@@6Ãà[4Ã@±8ÃPs4Ãðù5Ã09Ãpë-Þ2ÃÐ9ÃPÞ7Ãð‚4ü1ÃPm5ð3Ã`j<ê0Ãð 3Ã@:7ÃPm5ÃðÕ;Ã$<Ã`/1à¿3à*7ÃP[8ÃÀx7Ãp>5ðà4ðø0ÃŒ5ÀY7Ã7ÃÐÏ/Ã0é=àË1Ã0¢4Ã`š4Ãб4ÃЫ5ù8ÀÄ:Ãðj8ÃÀ–2ä5ÃÀ„5Ã3/Ø7Ã0œ5Ã×3Ã9Ã` 7Ã?1à 4+Ãз3Þ6Ãp©8Ãp¯7ðÚ5ÃÐ"7ðo2Àâ5ÃPð4ÃH6À_6ÃT4ÃÀZ<ÃÀ„5Àâ5ðc4à Ú9ðK8Ãàä2Ãðd9ÃŒ5à9ÀM9à ø4À$+Ãàä2Ãðˆ3Ã92ÃB7ÃÐ(6ÃàÒ5Ãàa3Ãðù5ÃpP2ÃPy3Ãàê1Ã-4ÃÀ2Ãн2À-ÃPg6à {4Ã0+3À1Ãàa3Ãpb/ÃàÀ8Àe5ÃЫ5àH2Ã@‡?ÃP¨@Æ6Àô2ÃÀ®.ÃÀû6Ã`^>Ãðv6Ãðç8Ã07ÃÀ~6Ãñ9Ãðj8ÃàC8Ã@·7ÀÊ9à u5Ãz8Ã@j/ðþ/ä5Ãt9Ãð|5Ã09ÃÐ"7à {4Ãз3à c8à¿3Ã@í.ÃZ3à$8ð¼:à “0À7Ãp»5Àâ5Ãðÿ4Ãðj8à›9à à8ð]5Ã@·7ÃÀl9ÃÐÉ0ÃàU5à ‡2ÃÀ3Þ2Ã0¢4Ãày/Ãð).ðE9Ã0œ5à•:Ãpb/Ãð‚4ÃÀ2ðE9ÀG:ðK8Ãð4àË1Ã`50Ã@Û1Ã09Ãpµ6Àî3ðà4ÃË5ÃÐÛ-Ã×3Ã4à þ3à­6Ã69ðÚ5Ãï/ÃðX;Ã@Õ2ðþ/ä5ÃN5à ø4Ã` 7Ã@v-Ãà*à ø4Ãp86Ã0¢4Àw2ÃàÒ5ÃÐ8ÃÐ@2Ãé0Ãpñ,Ãï/à ™/ÃÐÕ.Ã@Ã5ÃÐÏ/Ã@R3Ã@@6Ã0–6ÃÐ ;ÃÀŠ4Ãàs0Ã0Ò,Ãp÷+ðì2Ãp,8Ã`G-ÃÀ´-ÃÐR/Ã0I.Ãàa3ÃP2Ã5ÃÀ–2ðÚ5àT0Ã`50ðo2ÃÐ.5Ãpë-Ã7ðQ7Ã*ðo2ÃÐd,ÃK/Ã0a*Ã`50Ã`;/ÃpÁ4Ã`²0ÃÚ,À›,Ã`/1Ãàð0Ãð#/Ãàä2Ãpñ,À0Àe5Ãðí7ÃÑ4ä1Ãp>5ö.Ãð¦.Ãã1Ãð4Ãàa3Ã`5Ãðí7À}1Ãà+Ã@Ï3ÃÐF1À /ÃÀ1.ÃP—.ÃÀ=,Ãà…-Ã`2Ã@:7À›,Ã0I.ÃÐÉ0ÃàÌ6Ã-0ÃЫ5ÃÑ4àÅ2ÃÀ~6ÃPy3ð3Ã` 7Ã0%4à›9Ã0%4Ãph.ÃZ3ÃP‹0à 1Ãà[4ÀÜ6ÃàØ4ÃàÞ3à «,À.Ãð2Ã071Ãàð0à³5ÃÀr8ÃÑ4Àw2Ãð 3Ã`A.ÃÐ@2ÀÜ6ð-ðo2Ãl0Ã`¬1à§7À‰/ÃK+à 3à ™/ÃP‘/ÃÐF1ÃPê5Ãf1ÃPê5Ã`)2Ãð 3Ãðÿ4ÃPð4Ãà[4Ãð).à Ú9àH2Ã`50à «,ÃpD4Ãp\0ÃPs4Ã-0ÃP2*ð‡.Ãàa3ê0Ã0œ5ÃÐ:ÃpÓ1ÃÀx7à06ÃÀ~6Ãp&9Ã0=0Ã?1Ãà*ÃÐÕ.ÃÀC+Ãàg2àÝ.Ã0À/à “0à ™/Ã@^1à Ÿ.ÃÀÀ+ÃÀ–2Ãàð0Ãà‹,Ã?-Ã?-ÃÀ7-Ãc+Ãð /à Ÿ.Ã@v-à65Ãðˆ3Ã@«9à•:Ã-4Ã@ó-Ãð/-À.ÃÐ44Ãà‘+Ã0Ì-Àî3àZ/ÃpÓ1Ã@L4à 2Ã-4ÃÀÌ)Ã`#3à×/Ã0®2Ã`¸/Ãàg2ÃÐ(6À-ÃÝ2Ãн2ÃP.Ãðÿ4à65àÝ.ÃÀØ'Ãpñ,ÃÐp*Ã`)2ÃÐ@2à (-Ãðˆ3Ã`50Ã@X2Ãï/Ã`Ö*ÃpÓ1ÃÀ–2Ãð 3ÃÂ0Ãpb/Ãpë-ÃP‘/ÃPê5à ò5ÃpÙ0ÃPy3Àú1Àk4ð/ÃÀ´-Ã`¬1ü1Ãàa3Ã07àH2ä1ðþ/ÃÀÝ;ù8ÃÅ6à<4ÃÀ+/Ãph.Ã!2ÃPö3Ã@d0Àw2Ãð1Àe5Ã`Ž6Ã@Õ2Ã`50à 3Ã-4Ã5Ã0œ5Ãð¦.ÃÅ6ÃpÁ4ÃÅ6ÃÀ¨/ÃÐ.5Ã0À/ÃPð4Ã071ðì2Ãð¦.Ãr/Ã`2Ã3à`.ÃÐ8Ãã1Ãàä2ÃP—.ÃP-ÃÐ.5ðæ3Ãp86Ã`#3à Ÿ.Ãï/ü1àË1ü1Ã9.ÃE0àT0Ã06ÃÐ¥6ðÔ6à (-Ã`2Ã`)2Ã0+3ÃÐÛ-ÃÐ:3Ã0Æ.Ãð4ö2ÃPü2ÃP‘/Ã0¢4Ã@R3ð{0Ãà—*ðà4ÃÀŠ4ÃÀ¢0ÃP-Þ2Ãf1Ãàð0Ã`A.ÃÀ1Ã@Û1Ãf1ðæ3ÃPy3àÝ.ÃÐá,Ã`¦2Ã@Ã5àB3àB3Ãà.ð‡.Ã0I.à “0Ãð‚4ÃÀ¨/àl,Ãàö/Ã`M,Ã`|9Ãðp7Ã0®2à «,ÃÀÆ*ÃÐç+à .,ÃÀõ7Ãã1ÃÚ(Ãð|5Ã33ÃP2àB3Ãð#/ð‡.ÃÀœ1ÃÐ@2àÑ0À /à 1Ãp\0Ãàä2àÑ0À­)ü1ÃP1Ãðš0àl,à 0à ™/ÃpÓ1Ã`M,ÃÀ¨/Ãà.Ãc+ÃÐÕ.ÃÐL0ÃÐ@2Ã~-Ã@Ã5Ãày/Ã`M,Ã'1Ãð²,Ã`#3àû)Ã`k'ö.ö.Ã0º0Ã@R3ÃÀ 4ÃÀ´-Ãà*ÃP&,ÃP‘/ÃÐí*Ãpt,Ãr/Ã’4ÃpV1Ã0Ì-Ã0a*à /Ã33Ãã1ÃÀ7-Ã@|,Ã`ô%À›,ÃpV1Ã~-Ã@d0ÃÐç+ðø0Ã@ˆ*Ã@v-à×/Ã3/Ã&ÃP¯*ÃÐv)À1ÃÐ44Ãpß/Ãr/àZ/ÃP/àT0à R&Ãï/ÃàÞ3Ã071Ãð”1àã-ÃÈ+Ãà+ðæ3Ã`5Ãàs0àT0ÃÀ7-Ã@Ï3Ãàü.ÃÀÞ&Ã'1ÃPa7ÃpD4Þ6Ã×3Ãà©'ÃÀC+ü1à «,Ã`50Ã071ÃÀ1.Ãé0Ãà+ÃÀ7-Ã`Ä-Ã@ *ÃÀÆ*Ã0y&Ã,àl,à`.à 2à 0Ã071ð/Ãp\0Ü(ÃÎ*Ã0O-Ã0+3Ã0®2Ã`²0Ã0ê(À0)Ã0C/ðÚ5àË1ð-à­6ÃÀ¢0ÃE,ÃP,+Ä,Ãðˆ3Ã`M,Ã`/1Ã@^1ÃÐ^-Ãr/ð .ÃP‘/ð™+Ãð5,Ã*ÃðÊ(Ãð2Ã`/1Ä,ÃàØ4Ã`q&ÃP¯*ü1ÃP/Ã33Ã`¦2Ã)àf-Ãð /ÃÐd,ð/Ã0Ì-Ã@‚+ÃP…1Ãð#/ÃЙ8Ãð/-Ã%'Ãðš0Ã@j/Ãpt,Ãæ*Ãx.Ãð5,À›,ÃÔ-ði3Ã0º0ÃÐ(6à×/Ã0I.à L'Ã0ü%ÃÀÒ(ÃÀ¢0ÃÐL0Ã0Ò,ðc4Ão)À¡+Ãà‹,ÃE0Ãày/Ã33Ãð‚4à 1Ã?1à «,Ã`Ð+Ã0U,àõ*Ã`¬1Ãð).ÃP.Ã`/1Ã`Ð+Ãpn-Ãð2Ãà.ÃN5ÃPê5ÃP2à ì6ÀS8Ã`;/Àƒ0Ãn:Ãp>5ÃÀ7-Ãã1ê0ÃP.Ã`/1Ã3/Ãpt,Ãàs0Ã!2Ã9.àZ/Ãõ.Àe5àË1Ã-4ÃÐÉ0ÃpÇ3ÃðŽ2Ã@+Ã`/1Ãàä2À•-ÃÐj+Ã`S+Ã0%4ÃÐá,Ã` 3ÃÐ@2Ãf1ð/Ã'1Ã`A.ð/ÃPy3ÃP.Ã@Û1ÃÂ0ÃÀ 4À1Ã`50Ãð;+Ãpb/Ãð0àÅ2à 1ÃP1à ‡2ÃE,À›,Ãp\0Ãpñ,Ã`²0ÃÐX.Ã’4Ã-Ãð”1ÃÐR/à ™/ÃP-Ã0O-Ãæ*Ã@p.ð,à 2Ãð”1Ã`è'à ò5à 2à (-Ãà )Ã0Ì-À /Ã0O-Ãð;+ÃP,+ÃPü2ÃP-ÃÐF1Ê+ÃP -ðø0ð‡.Ã`¾.Ã-Ã@Ï3à ±+À§*Ã@Ž)Ãàü.Ã@ó-Ã0´1ÃÐá,Ã`¬1à (-ÃW-Ãð²,Ã`k'Ã-À0Ã],Ãõ.Ãpt,Ã0=0ðò1À•-àx*Ãi*Ã`/1ÃÀ7-ÃPµ)ÃÀ1Ã!2Ã@v-Ã`Ð+ÃÐÏ/ö.ÃÐÏ/Ã%'à 4+Ã`¾.ÃÂ0Ã`G-Ã0Ò,ÃÀ1ÃPm5Ä,ÃÀ¨/ÃP0Ã`A.Ãl0à ™/ÃpÓ1Ãð2ÃQ.Ãï/ÃÔ)Ê+ÃÐd,ð+Ãph.à Q;Ã@ó-ÃÚ(àx*ÃPÓ$Ã](Ãð /À›,Ã0[+Ãðˆ3Àe5Ã`/1à Ÿ.ÃÐ:3ö.Ã0%4À /Ãp÷+Ãæ*Ãû-ÃP¯*Ãð5,À /À**ði3ÃQ.Ãà.à×/Ãà)ÃP‹0Ã071ÃÎ.ÃÀO)ÃÀ´-ÃÀÀ+Ãày/Ã~-Ãp÷+Ãpn-Ãæ&à`.Ã0O-Ã@p.ÃÎ*Ã0C/ÃÀ1.Ãð/-à d#ÃK+Ãð/-Ãp¤$Ãð2ÃÐd,Ã-0Ã0Ì-ÃÐR/à Ÿ.ÃÐR/Ãf1ÃÀU(ÃÐç+Àw2à<4àË1Ãp )Ãpå.ÃP—.Ã,Ãþ&ÃÐç+ð±'ÃÐÃ1Ã`¦2Ãà—*ÃÐv)Ã0Æ.Ã`/1ÃP.ÃPÁ'Ãà‹,Ã`G-ÃÀ®.àõ*à ".Ãð¦.À$+Ã0Ì-ð()Ãàm1À•-Ãpt,Ãpý*ÃÐp*Ã,ðÃ$ÃÐp*Ã0[+ÃÀð#Ã&à «,Ãð/-À¿&à~)Ãu(Ã0U,àr+ð/Ã!6À,À.ðŸ*ÃP -ÃK+Ã@ˆ*À‰/à ·*ÃÐó)Ãà…-ÃÐÕ.Ã`_)Ã`G-ÃK+À<'À6(Ã0Þ*Ãà‘+ÃÀU(ÃÔ)Ã@á0ð/àZ/Ãðô!ÃP—.Ãà.ÃÀÆ*ÃP‹0ÃÈ/ÃÀ1.ðþ/Ãæ*Ã0=0À-ÃÀº,Ãàð0ÃZ3Ãp€*À•-Ãà2&Ãpn-À›,Ã'1Ã3/Ãð/-Ãà.ÃE0Ãð5,Ã@|,ÃÐp*ÃÈ+Ão)ð()À‰/ÃpÇ3Ãpn-Ã@á0Ã0O-ð.(ÃЈ&Ãà…-ÃP£,ö2ðà4ÃÐL0Ã@p.à 4+ð/ÃÐL0ÃQ.ðu1Ã`_)Ãà )Ãc+À›,Ãð¦.Ã`â(Ãðÿ4Ãpt,àé,Ã@(Ãû-Ã0º0ÃÔ-Ãp’'Ã@ÿ+À /ÃÀû6Ã`²0Ãpn-Ãð²,ÃÀ7-Ã@ó-Ã@í.ÃÐÛ-Ãàm1Ãð¸+ÃPµ)Ãr/ÃP‹0ðo2Ã@j/ÃðŽ2ð/Ã-à×/Ãp\0ü1Ãpß/ðc4Ãpn-Ãð5,Ãð/-Ãðš0Ãi&À­)ÃÀ7-à .,à :*àé,À‰/ä1Ãà£(ÃP…1ÃP.Ã?-Ê+Ãp\0Ãàm1Ã0´1ÃÐ(6Àâ5Ã'1Ãà.à þ3àT0ÃP¯*Ã0+3ÃP-ÃÐÃ1ÃÎ.ü-Ãò(Ãf1Ãày/ð+Ãà-Àq3à “0ü-Ã`Ü)ÃÀ1ÃpÓ1ù8Ã*Ãc+ÃE,Ã0Ò,Ã0œ5Ã33ÃÎ.ÃP‹0Ãp(Ã0a*àË1ÃÀI*è&àï+ÃPµ)àÑ0Ã~-ÃP£,Ã0Ø+Ê+ÃÀ¨/Ã0Æ.ÃP-Ãà¯&Ãð /ÃÐ@2à ".À§*ÃðÄ)Ã0Æ.ðŸ*Ãõ.À0Ãf1À›,Àq3ÃÐó)Ã@+Ã@Ž)Ã9.à .,ü-ÃP2*ÃÐ@2Ã0g)ÃðA*à 1àÝ.ÃðÄ)ÃP -Ãà‹,Ã0ä)ÃðŽ2ÃÐ@2Ãx.ÃÐí*À¡+à /ÃW-àœ$Ã@ç/ü-Ãð/-àZ/Ãàê1ÃÐÉ0àã-Ã`/1ÃÈ/Ã0Þ*ÃÐR/Ã0ä)Ã`Ö*à 4+À-Ãé0ÃW)Ã0=0Ã0I.ÃK+Ãð5,À6(Ãp )Ãà-à ‡2ÃÀ´-Ãp†)Ã9.ÃÐÕ.àÑ0Ê+àõ*ÃÈ+à³5ÃP.ðŸ*Ãpz+Ãà+Ã'5Ã@Ã5à ‡2ÃÀ1ÃÀœ1Ãý7Ã0U,ÃÀ=,Ã0º0Ãp\0àf-Ã×3À‰/Ã@|,ÃÔ-Àú1Ãð/-ÃÂ,ü1Ã06Ãз3À0ð·&à ¥-Ã`Y*ð¥)Ã0Ò,àã-Ã@í.Àƒ0ÃpV1À0Ãð).Ã@ó-Ã],Ã@í.à 2ÃÚ,ÃPD'à ±+À›,Ã0=0Ãð5,ÃÐ'à`.ðò1Ã-0À /Ãà—*Ã06ðu1àH2Ãð1Ãpz+Ãàä2ÃÂ0à «,Ã071Àq3ÃP¯*ÃP2Ã3Ãr/Ãé0à þ3Ãð/-Ã@L4ÃÀ¨/Ãã1àû)Àú1ÃÀ3ÃQ*ÃÐp*Þ2Ã@í.ð/Ã`¦2ð/ÃZ3Ãp»5ÃPg6Ã`¦2Ãðù5ÃÑ4ÃП7Ãð|5ÃàU5Ãð^:ÃÀ5ÃpV1ÃP7>Ãp£9ðÔ6ÃÀf:Ã0–6à ]9Ã0„9ð¼:Ã33à•:Ãð^:Ãp :Ã0`?ÃЇ;Ã`š4Ã÷8Ãз3Ãå;Ãð|5Ãà®;ðÈ8Ã@Ï3Ã06ÃÀ%0à Ô:ÃP7>ÃpD4Ã`8Ãðó6ÃàO6à Â=ÃÀN>ð¶;Ã@¥:ÃÑ4ÃÙAà›9ðÂ9Þ6Ã0„9Ã09ÃðÛ:Æ:ÃàÀ8ù8Ãp¯7ð¶;ÃàC8Ã9à ¶?à æ7ÃГ9ÃÀÝ;ÃÀl9ÃPg6ÃðX;ÃЫ5Ãë:Ãpµ6Ã06ÃPä6Ã@½6ÃÐ(6ÃP[8ÃPO:Ã`ó:ð@Ã@.9Ãð0à i7ÃЙ8ðAÃ`p;Ã@@6Ãð|5ÃË5ÃP[8Ãp…>Ã=à•:Ãh?ÃÀH?Ãp‹=Ã0õ;ÿ7Ã@@6Ã0%4ó9Ã9ÃàÀ8Ã-4ÀY7Ãý7ÃÐ8Þ6ÃàC8ÃPg6ÃÀé9ÃàC8Ã’8Ãn:à E=ÃÀé9Ãp<ÃŒ9Ãp¯7Ã8ÃÀ„5ÃàÒ5Æ:à>ÃPO:ÃàÆ7ÃPg6À¾;ðÎ7Ã07Ã`š4Ã0:à ¤BÃå?ðÈ8ÃÀ¢0ÃP -ÃàÌ6Ã`š4Ãn:à§7Ã33Ã`|9Ã!6Ã`Ž6Ã`ÿ8Ã`Ž6Ã@@Ã`d=á<Ãà¨<ÃЇ;ÃÙ=Ãàð0Ã@Ï3ÃPä6Ã`ó:ÃB7ÃÐ9Ãàê1Ã9à:Ãp;ðW6Ã0x;ÃЇ;Ã`5Ã0ã>Ãñ9Ã`”5ÃÐ.5ÃÐ:Ã\=ÃàO6Ã071à à8Ãý7Ã0+3Ã07Ã@É4Ãà–?ÃÀÑ=ÃàO6ÃPä6Ã0:Ã0x;à‰<à;Ã0–6Ã`4Ã@=à‰<Ã9ÃðÏ<à‰<ÃPØ8à}>Ãp>5Ãp¯7Ã@L4Àè4ÃП7Ã;Ã@@6ÃГ9Æ6à¡8Ã÷8à‰<Ãp=ÿ7Ã0~:à <à Ô:Ã@48Ãpµ6à {4à ø4ÃÀ 4Ã07Ã0–6ÃÀ×<à 6ÃB7Ãà=9à à8Ã`Ž6à à8Àw2Ã;à Q;ÃB7ÃÀõ7à ø4ðÈ8ÃP+@Ã`p;ÃPI;Ã`á=ÃÐ9à K<Ã` 7Ø7Æ6ÃÀ3Þ2ÃZ3Ã7à65Ãp :ÃÀ3ÃЙ8ÃàÀ8à o6À7ð9;Ã@:7ÃàÆ7ÃÀr8Ã`8ÃàÀ8Ãðˆ3Ã`j<ÃàU5Ãз3Ãðá9Ã7Ãð^:Þ6ÃðX;ÃàÆ7Ãp&9Ãõ.Ã@:7Ã`v:ÃVBà ?>ÃÎ.ü1ð9;à 6Ã07ðæ3ÀÜ6à9à=ÃЫ5ÃЙ8à<4Ãpµ6ê4Ã!6ÃÀ6Ã@L4Ã7Ã8Ã`‚8í:ÃðL=ÃPO:ÃË5À1ÃàÆ7ÃÀï8Ãðˆ3Ãð4Ãàm1ÃÀ3ÃÀ„5ÃÐ@2ÃŒ5Ã`2Ã0®2Ãp©8ÿ7à /ÃЫ5Ã<8ÃÀZ<ðÔ6Ãðç8Ãn:Ã@@6ÃPê5Ãб4ÃP2à ø4Ã@:7Ãp,8ÃÀr8Ã`#3Ã69à³5ÃPy3ð°<Ã@¥:à<4ÃŒ9ði3Ã0 8Ãl0ð3Ãp86ÃÀl9ÃP0Ã012ÀÜ6ÃàO6ðc4Ãà+ÃPÒ9ÃPÒ9Ã@Ï3ÃP1Ã0ä)Ã69ÃÅ6ÃN5ÃpÙ0À0ÃP/ðÎ7Ãðv6ÃŒ5Ãà7:àÑ0àB3ði3ÃàO6ÃÀœ1à ¨(dt ?@4 4ÿxunitsyunitsähÐÛ (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°Ï (ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec0 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitså°çTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8éHEAPX Ðçdatadescription8  @œ€êq·—NM€SNOD(è€[012Ã@F5Ãð‚4ÃP,+à›9Ã-4ÀÜ6ÃH6àl,ð .ÃÀ®.ÃP…1Ãé0à¹4ÃÂ0ÃàØ4Ã05ÃÐR/ði3ð/Ã!2Ã@X2àT0ð,ÃÐÛ-Ã3Ã`A.ÃÀõ7à³5ÃðŽ2Ãpµ6ÀÄ:Ã`|9Ã!6à 0Ã0%4Ã@Û1ÃP[8Ãàs0Ãðš0Ã@^1Ãðó6Ã`š4ÃàÀ8ÃÐ.5Ã@·7ÃÐ:3ð]5ÃÐL0Ãpµ6ÃpÇ3Ãà‹,ÃpJ3Ãà.Ã@F5ÃP1Ãн2Ã?1Ã0À/ÃPü2Ãx.ðæ3ð3à 1Ã@R3ÃàØ4Ã@Õ2Ø3Ã`4Ã`¬1ÃÔ-Ã`A.À.ÃÀ3Ãðˆ3ÃP/Ã@d0à×/Ã4Ãàö/ÃP>(Ãàa3à­6ÃÀ–2àf-Ã@ù,Ã@p.ðæ3Ã3ÃpD4ð{0àÅ2Ã?1Ãàê1Ã` 3Ãà[4Ãpå.Àƒ0Ã@R3ÃPü2Ã06Ãð#/ä1ÃpJ3ö2à<4Ãð0Ã@½6ÃpÓ1Ã` 7Ãé0Ãr/ÃÐ44Ã@j/Ã`G-ÃÐÉ0Ã@p.ð“,ÃPs4Ã<8Ãpb/Ãé0Ã@F5ÃÐL0Ã@Û1ðÔ6Ã@É4À‰/Ã`¸/Ã`4à u5Ãð¬-ÃÐ@2ÃPy3Ãày/ÃÐd,à “0Ãpn-Ã0®2Ã`Ð+Ãp\0ÃË5ðŸ*Ãc+Ã`Y*À›,Ã0+3ÃP0Ã`/1ðE9Ãpt,À.Ãð#/ÃàO6ÃàU5à65Ã@Ã5Ã0´1ðu1ÃE0à þ3Ã07ÃÀ%0Ã05Ã0Ì-Ãð‚4ðþ/Ã,Ãðÿ4Ã` 3Ã`8Ã@±8ÃÐÛ-ÃÀ®.à þ3ð,Ê+à¹4Ã!2Àƒ0ÃÀ7-À.Ã0º0ÃÀ1Àƒ0Ãàê1ÃÐ@2à {4À}1Ãp»5ÃÝ2Ãн2Ã0+3à ·*Ã0Ì-ÃÀ%0ÀÖ7ÃÑ4Ãà‹,à 0Ê+Ã*ð3ÃpÙ0ðo2ÃÀ5ðò1à 3à /ÃP‘/à65ÃÎ.Ãf1ðu1Ãã1àÝ.ÃÐ44Ãp>5ÃÐÕ.ÃÀ%0ðu1Ãpµ6Àú1àÅ2ÃÀ1Ã0¨3ÃPs4ä1ÃÀ¢0Ãpµ6Ã9ÃðŽ2Ãày/Ãàð0à 1À1ðÎ7ðæ3Ã0¨3ÃpV1à06Ãð4Ãpb/ÃÀ5ÃàÀ8ÃÐ.5ðþ/Ã` 3Æ6ÃÔ-ÃPä6Ã`¦2ðo2ÃPy3ÃPm5À‰/Ã071ÃŒ9Ã@(:Ãð /à$8Ã` 3ÀÖ7À1à “0ð-ÃÈ/à o6Ãr/Ã0¢4Ãàa3Ãðš0Ã@½6ÃpP2Ã`5ÃÔ-Àú1à 2Ã@á0ÃàÞ3à “0Ãé0Ã@Ã5Ãð 3Ãð 3ÃpÙ0ÃpÍ2Ãð#/Ã@ç/à 3Ãàº9à¹4Ã@|,Ã012ÃÀõ7ÃPs4Ã@ó-Ã05Ãð”1Ãð2ÃP -Ã0=0Ãб4Ã<8à ™/Ã'1Ãf1Ã0=0Ãà[4ÃP/ÃÀœ1ÃÈ/Ãð¦.Ãñ9ðu1Ã@L4Ã@·7Ãз3ðu1à³5ÃàÒ5À.ÃP©+Ãðù5ÃpÓ1ÃÐ8Ãðv6Ã?1À1Ã@F5Ãpµ6Ãðÿ4ð .àN1ÃÀû6Ã-4Ã0º0ÃÀ3Ã-4Ãý7ÃÀ 4Ã07Ãp86ÃÐ(6à›9Ã`;/àl,Ã0%4À,Ãàs0À›,Ã9.Ãðj8ÃpD4ðu1À¡+ÃÀ3à 6ÃÐ^-à ‡2Ã`”5ÃÀ2ðþ/Ã@p.Ã3à þ3ðà4ÃÀ„5Ã,ÃZ3ð-ÃÀ2Ãàä2Ã`ˆ7à o6ÃpÙ0à þ3ÃPö3Ã0®2ÃÐÏ/Ãpß/ÃP-Ã33ÃpÇ3ðo2ði3à ò5ÃÐF1Ã@@6ÃÀ–2Àâ5Ãб4Ãðš0à ¥-Ã`A.àB3Àô2Ãã1À›,Ãð¬-à ‡2Ã`Ê,Ã`Ð+Ãpý*Ã@)Ã0´1ð .ÃÐ(6ÃÀ3Ã0[+Ãð0Ãã1ÃÂ0Ãpñ,àr+àã-Ãàs0àN1ÃT4ÃÐF1ð{0Ã@É4ðo2Ã33Ã-Ãð /Ã`4Ãpå.à ò5À1Ã@á0ð{0ðò1Ö)ðŸ*ÃÀ~6ÀÖ7ÃÐ@2Ã@p.Ãàð0ê0Ãðˆ3Ã0%4Ã@@6ö.Ãàð0àZ/Ã0Ì-Ã@p.Ãà‹,Ã-ÃÐÿ'Ã0C/àH2Ã?1ðþ/Ã0C/Ã@Û1Ã@|,ÃЈ&Ãà,àû)Ãpß/ÃÀ 4Ã`¬1Ãð¦.ÃpV1Ãi*ÃP£,ÃÐ44ÃP1ÃÀ=,ð/ðì2Ã0Æ.Ãpz+Ãp’'Ã],ÃPö3Ã0I.ÃP‹0Ã'1ä1à “0à /Ãp÷+Ãpý*à 0Ø7ÃPØ8Ãã1à¿3Ã05Ã@‚+ð/ÃPs4àN1ÃÐp*Ã@±8àB3Ãð‚4Ãp27ÃPy3Ã0–6ðQ7ÃP1Ãàs0à­6ÃÐ:3ÃÑ4Ãðš0à•:Ãl0à­6Ã`”5À0à ]9Àe5à ì6à9ÃPÞ7Ã`ó:Ã7ÃÐu>Ã@(:Ã`Û>Ã69ð¶;Ã5ÃN5ÃÐ8Ãp»5à ™/Ãt9ÃðÉ=ðW6Ã@48Ãp :à ø4ÃÀZ<ðQ7ÃPð4Ã4à­6À¬>ÃÀ×<à‰<à*7ÃÐ¥6à=ÃAðBð!?ÃàÆ7Ãå;ÃPÆ;Ã@L4Ã`|9àú>Ãð@?Ãp=à;ÃÀã:ÀÊ9à}>Ã@¥:ðÈ8Ã0:Ãp;À5=Ã`d=ðQ7à³5ÃÍ?Ã`@Cà 9?ÃPa7ÃB7à o6Ãp<Ã0û:ÃÐ"7Ã0ÑAà;ÃP[8à­6Ã`ÿ8ðª=Ã0Š8à ]9Ã@Ÿ;Ã0ã>ÃðL=ÃÐ{=Ãý7Ã69Ãp>ÃàU5ÃðÛ:ÃÐ"7Ãp :ÃÀf:ðÈ8Ãý7Ãp»5Ãp<ÃÀ`;Ãðá9Àw2à§7Ãå;í:àô?à Q;Ã`|9Ã'5Ãðó6Ãp,8ÃÐ44Ã@Ã5Ã7À1Ã`p;ÃàÒ5Ãà>ÃÀ„5À5=ÃðÏ<ÃPÒ9ÃÐ9Ã07ÃàÆ7ÃPÌ:ÃàÆ7ÀÊ9à;Ãë:ÃðR<ðÂ9Ã`‚8Ãý7ÃPO:à¹4ÃP1?ÃP[8à ‡2Ãðá9Ã0r<Ãp<Ãà7:Ãðv6Ãðí7Ãà´:Ã`‚8Ã0+3à ò5ÃÓ>Ãp&9Ã7ÃàØ4ä5Ã0=0Ã@^1à æ7ÃÀŠ4Ã0¨3à þ3à06Ãh;ÃÐ8Ã@Û1Ãð½?ÃB7Ãp‹=Ãp©8ÃÀT=Ã÷8à c8ÃPU9ÃÀZ<Ã7Àe5À7ç;Ã<8ÃPCÃÐ8ÃPÒ9ÃÀË>ð]5Ø3Ã`ó:Ã@«9Ã@";Ã3Ã0r<ÃPÀ<Ã5Ã06ÃðL=Ã4ÃPg6ÃÀT=à c8Ãðó6ÃÀx7à‰<ÃÍ?ÀS8ÃÀT=Ã0:ÃPÒ9Ãðv6ÃàI7Ãðç8Ã0+3Ã0+3Ãp&9ÃÐ8Ã`p;Ãðˆ3à þ3à þ3Ã0–6Ã’4ÀÐ8ÃÀ„5ù8ÃÀx7Ã33ð{0à ì6à È<à o6Ã`Õ?Ã0Š8ÃÅ6Ãl0àZ/Ã`8ü1àr+Ã09ó9ÃPÌ:ÃÀŠ4ÃË5à¹4ÃÐ:ÃГ9À7ð/ÀÐ8Ã`^>ÃàC8Ãpµ6ÃÀŠ4Ã`Ž6Ãð4ðo2Ãà®;Ã0 8à 1à {4Ãë:Ãàê1ÃPs4Ã0–6ÃH6ÃP==ÃàÌ6Ãã1ÀY7à u5ÃPÞ7Ã@½6ÃàÞ3à§7ÃÀ~6Ã@F5Æ6Ãð4Ã`ç<ÃàU5Ãð1ðà4À_6à¹4Ã`#3Ã0–6Ãý7ð3<Ã0œ5ÃÀ`;Ã@>Ã0¢4àÑ0ÃÀ3Ã0º0Ã9.Ã`²0ÃÀ¢0Ãðÿ4Ã!2Ã0%4ÃàÆ7ÀG:Ã`)2Àe5ÃH6Ã7ÃàÆ7Ã-4ÃàØ4ÀS8à ø4ðW6ÀG:ÀY7Ãà[4à ø4ÃPm5Ãð‚4Ãз3à ™/ÃÐF1í:ÃÐ(6Ã`¦2Ãàü.à`.Ã0œ5ÃP0Ã`¦2Ã`ˆ7ðÎ7Ã@L4ÃÐ.5ÃP2ÃÀœ1ÃÀ3Ã0®2Ãб4À0Ã’4Ãh;Ã0œ5Ã07Ã`Ê,ÃP1ÃpD4Ã@L4à06Ãб4à 3ðæ3à<4Ã`4Ãpt,Ãë:ü-Ã0–6ði3àÅ2ÃàI7Ãðç8à*7Ãàê1À7ðE9ÃÀ„5Àè4Ã@:7Ãб4Ã-Ã5ÃÀŠ4à ™/Ã@ù,ÃÐ@2ÃP0ÿ7Ãàg2ÃàØ4Ã'1ÃÐÏ/Àƒ0ð+Ã@R3Ãàä2À_6Ãp\0ÃP -à ‡2ðu1à /Ã0º0àË1Ã0%4Àk4Ãн2ü1ÃÐ:3Ã7Ã'5Ã@|,Ã`Ð+Ãàê1ð]5Ã0œ5ð/ÃÐÃ1Ã’8ÃЫ5ÃàÀ8Ã06Ã3Ãp:Ãðd9ÃPa7À_6à o6ÃÐF1ÃÀ1ÃÐÉ0ÃÀ1.ÀÜ6ÃpV1ÃÀõ7Ãph.ÃpÙ0à³5Ãð‚4Ãàü.Ã`¸/Ã`ó:ðc4Ãð”1Àe5ÃPö3àH2Ã`ˆ7Ãð 3Ã07Àô2à65ÃÀû6Àè4ðæ3ó9Ã’4à ™/ÃÐÏ/ÃP/ÃZ3Ã@á0Ãpn-ÃÐj+Ã3ÃàØ4ÃÀŠ4ÃàÞ3ÃE,à ™/Ã@X2ÃPê5ÀY7Ãðv6ÃÅ6Æ6àN1Þ2ð“,Ã`5ÃàÆ7ÃÅ6ÃÐL0à`.Ãð0Ãð1Þ2Ã`¸/à 1À.ÃPê5Ã!2Ãp»5Ã5Ã-4Ã'1ðW6à þ3Ãf1ÃÔ-ÃÐ:3Ãð2Ãày/ê0Ã`¾.à 1Ã0Ø+Ã4Ãà+ÃÀŠ4ðo2ÃP1ÃP‘/Ã@‚+ÃÀ3Ãl0Ãpë-ÃÎ.ðu1Ã0Þ*Ãð|5à*7Ã0+3à ¥-Ãp*ÃpÇ3Ã0=0ð,Ã0=0ðo2ÃW-Ã@á0Ã!2Àú1ð/ð‡.ÃàO6à {4ðþ/à “0Ã*ðþ/Ã4ÃÀ–2à*7Ã0%4àÅ2ÃÅ6à ì6Ãð0ö2Ã92ÃÐ@2Ãðj8ÃЫ5ð]5àT0à ™/Ãàê1ðþ/Ã?1ÃÀŠ4ÃË5ÃГ9À;<ðW6À7Ã’4ÃÐ:3à 1àZ/ÃP…1ði3ÃH6Ø7ÃП7ÃŒ5ÃPð4Ã`²0À**ê0Ãð/-ÃPö3À‰/Ã0=0Ã9.ÃÐp*Ãé0à ì6ÃÐ^-Ãp»5Ãðó6Ã`5ðu1Ã@@6Ãàä2Ãðˆ3ÃB7Ã@Ž)ÃP2Ãð¦.ð“,ÃE0ðo2ÃPy3ä1Àô2ÃÀ 4à u5Ãà-ä5à æ7Ãàg2ÃP/ðà4Ã92ö.ü-Ã0º0ÃÀ–2ö2ðà4Ãà.Ã0º0Ã0®2Àî3à .,Ãð|5Ã0œ5àB3ÃÐd,Ãà+ÃÀ3ÃpJ3ÃÀ1àï+Ãðí7Ã0œ5ÃàU5ÃÀx7ä5ÃPs4Ãð/-Ã`Ê,àÑ0ÃP‹0ð{0À›,Ãph.àZ/Ã0´1ÃÐX.ð/Ãû-ÃÀ–2ÃÐÛ-ú#ÃÀÒ(ÃÂ,Ãð /Ã`¸/À‰/à¹4ÃÐÏ/Ã@Õ2ÃP -Ã`A.Ãø'ð“,ðþ/Ãà.à 1ÃàØ4Ã-4Ã0´1àT0ð-à (-Ã0C/Ã` 3àË1ÃÀœ1à ¥-ÃÂ,ðÚ5ÃpÁ4ð+Ã~-ü1à «,ð-ð‡.à .,ÃP>(À1Ãý7Ã@d0ÃÀ3ÃT4ÃP—.Ãðš0ÃÀ3Ãàs0ÃP…1ÃP/à`.ÃK+ÃT4Ãàa3Ã’4ÃÀ%0Ãà,ði3ÀÄ:À0Àq3Ã0=0Ã@Ã5À­)à&Ã’4ÃÂ0Ã071À‰/ÃÐÉ0ð]5àZ/ê0Ã0+3ÃÐá,Ãð /ð,ÃPy3ÃpJ3àï+Ãày/ä1ÃH6à ™/Þ2ð/ÃÐù(ÃÀ=,ÃÐX.Ã*Ãð¦.Ãà.à<4Ã@ÿ+à +Ã0º0Ãð).Ãpn-àT0Àk4Ãð#/Ãð”1À.ð‡.Ã0=0Ã!2Ã012ÃpŒ(Ãl0ÃÐd,à 1ð9;à³5Ã0Þ*ÃÂ,Ã`‚8à þ3ö2Àè4À,À0à ¥-ÃË5Àî3Ãày/àZ/ÃÐF1Ãpë-ü1ÃPs4Ã0O-Ãð¬-Ã0Æ.à 2ÃpJ3Ãpë-ð“,à Ã(Ãð).à×/ÃpJ3ÃÂ0ÃàU5Ãp\0ÃÔ-Ã@.9Ãð /Ã`)2ÃpD4ÃÐR/Ãð1Ãò(ä1àõ*À0Ãpb/Ã@á0ÃÐ.5à ".ðo2Ã`Ä-Ã`G-àÑ0Àè4ÃÀ1Ãà,'ÃÀ´-Ã4Ãl0ðø0ÃP‹0ö.Ãàs0à ‡2Ã` 7À5=ÃPÞ7ÃÀl9ÃÀ–2ÃP‘/Ã071ðà4ÃP2ð/Ã0œ5ÃÐÉ0Ãð).Ãð0ÃE0Ã3Ã?1Ã33à Ÿ.à 1à×/ð/à;Ã-ð“,Ã`²0àH2à¿3Ã0À/Ã071ÃP2ði3Ãàä2ð™+Ãð2Ãð5,Ã012Ã0´1Ã`G-ÃàI7à³5Ã@R3ÃàU5ÃðŽ2Ã!2ÃPü2Ãàð0Ã'1ÃÀ®.ÃÐ@2à 'ÃÀ1.Ã’4Ã@^1Ãàä2Ã×3à³5ÃÐR/ÃŒ5ÃP…1Ã0I.Ãàm1Ã`5ÃP…1Ãpn-Ãàð0ÃÂ0Ã@í.ö.ÃT4Ã`¸/ÃPy3Ãð#/ÃpV1Ãð;+à Ÿ.Ãàü.À1Ã0„9ÃP—.ðþ/à 3à ì6Ã@ÿ+àÝ.Ã`Ä-ð+Ã`A.Ãàê1Ãà.ÃP0ÃГ9Ã` 7Þ2Ã'1Ã`6Ã@L4Ã` 3ÃP0ÃpP2ðþ/Ãà…-Ã×3à þ3ÃPg6Ã05Ã4ðà4Ã*Ã@ù,à (-ê0ÃÑ4Ã0Æ.ÃÀ3Ãð1Ã`M,àÑ0ÃPö3ÃpÍ2Ã@í.ÀÐ8Ã5Ã@Ï3à³5Àô2ð{0Ãб4Ãàê1ÃÐd,ÃàÞ3Ã-0Ã@‚+àé,Ã`”5Ã0¢4Ãð4Ãðd9Ã5ä5à 3ÃÐç+Ã-0ê0Ãày/ÃPa7Ã@F5à 0Ãðù5à 2ÃP2à ò5Ãpñ,ÃPü2Ãà[4À0ÃÐÃ1ðà4àf-Àq3Ãpë-Ã@L4ðÎ7Ã0Ø+Ã` 3Ãõ.ðþ/Ã?1Ã!2Ãðš0ðþ/ÃÚ,à ‡2ü1Ã@^1Ã0–6ÃP‹0àB3ÃàI7Ø3ÃЫ5à “0ÃÐÛ-à ì6Ã'5à`.Ã@á0Ãàs0àÅ2ÃÀÒ(à<4ÃP2Ãðÿ4Ã`#3Ã0œ5ÃP==Ã-0ÃÐÏ/ÃP…1à`.à³5À /Ã@ÿ+ð .Ãðp7Ã0–6ÃÐ"7ÃP‘/Ãðš0ÃT4Ãð2Ã`¬1Ãà+ÃÀœ1ÃП7Ã0–6ÃÐR/Ãàä2Ã`6ÃpD4Ã@48Ã0%4Ãð¬-Ã`50Ãàö/ð/Ã`5ðò1Àƒ0Ã`/1àT0ðQ7à 3ð"*Ãà-à ¥-à¿3Ã@ˆ*Ã`;/ÃÐÛ-ÃÎ*Ã3ÃK/Ã69ÃÀõ7ðò1Ãx.ÃÀ+/Ãû-ð/ÃË5ÃÀ2ÃÀÆ*ÃÀŠ4Ã@Ÿ;Ã92ÃÐ¥6Ã@É4À‰/ÃpÓ1ÃpV1Ãз3ÃÀœ1ÃPö3à<4Ãðˆ3Àk4Ãðÿ4ðW6ðþ/ÃÐÃ1Ãàm1Ãàä2Ãpë-Ãpë-ÃÀ 4Ã071ð/ð‡.à Ÿ.ÃÎ.à 0ÃP.Ãà-ÃÀº,ÃÀ´-ðc4à ¥-Ãày/Ã~-Ã0ê(Ã`A.Ã'1ð“,ÀÜ6à þ3ÃÀ3Ã0=0à Ÿ.à Ÿ.Ã9.ü1Ã`;/Ãp€*Ã@)Ä,àé,Ãï/ÃÀŠ4Ã`š4ÃÐ(6ð-Ãõ.Ã’4à æ7Ã09ÃP2À0ÃE0Ã0º0Ã~-Ã`M,Ãðˆ3Ãé0Ãðÿ4Ã@Ï3Ã@+Ã@‚+Ãé0àN1Ã`²0ÃH6ÃàU5ÃÀû6ÃT4Ãà…-à /ÃQ.Ã’4Ãð¦.Ãpë-Ã@j/ðò1Ã0C/àx*ÃÝ2Ã`_)ÃÀ7-ÃÀº,ÃpV1Ã@d0Ã-ÃP0Ã~-Ã@Ž)Ãð4ÃÂ0Ã0C/À}1Ã0Æ.ä1Ã-0Ã`2ÃK/Ã`;/à «,Ãà.ÃÈ/Ã0À/Ãà&(ÃP -Ãì%À-ÃÐÕ.Ãà.Ã0ä)Ãð /ÃÐL0ÃK/Ã@d0ð/ÃÐÉ0Ã0O-ð+ðu1Ã@#&à ·*Ã@p.ÃÀ=,ð-Ãpñ,ÃP/Ã@|,ÃÐÉ0Ãð0Ã`_)ÃðÖ&Ã`G-à65ÃP1ÃP,+Ã0Þ*ÃQ*à ø4à 1ÃP0Ã@ÿ+Ãð¦.ÃÐÕ.Ãû-à +à 3Ã@+Ã`Y*ÃÐ|(Ãï/à 0ð™+ð™+Ãø'Ã)ð“,ÃÐv)Ãp )ð/ÃÀx7Ã4ÃÀ¨/Ã3À¡+Ã3/Ãpë-à 1ÃPê5ÃÈ/ÃpJ3Ã0À/ÃpV1Ã@p.ÃÐ^-À1Ã!2ÃK/Ã~-à Ï&Ã012Ã0®2ÃÂ,Ãðù5ð/à 1à¿3à 1Ã,ÃÀI*ÃpV1ÃÝ2Ã@ó-ÃðA*À0àZ/ÃÐd,Ã0U,ÃÝ2Ã`Ê,Ã@j/Ãõ.ðò1à «,ÃP/àã-à “0Ã0[+ÃÀ 4ÃÐç+à¿3Ã0´1Ãï/ð/à +à ½)Ã0+3à ¥-Ã0U,Ãû-Ã@j/Ã`/1ÃÐÏ/Ãàä2Ãpñ,ðà4ÃpÍ2Ãà.ÃÐX.Ã=#ÀÅ%Ãðš0ÃÀI*ÃÀ+/ÃZ3Ãà=9ÃÀ 4ÃpÇ3Ãpz+Ã@p.ð/ÃÐ@2à¿3Ãàa3àï+àÑ0ÃÐR/à ¥-ði3à¹4ÃP2Ã@Ï3Ã0À/ÃP1Ã`2àé,Ã,Ãà+Ãð).Ã@^1Ã?1ÃÂ0ð/Ã0Æ.Ãpë-ðò1À}1ð3Ãàm1Æ:ÃÐ:3ðQ7ÃÀ+/ÃÐX.Ãpb/Ã!2Ã!2Ãr/ð,Ãl0Ãï/Ãð²,Ãi*À.ÃP/Ãðˆ3Ã`‚8ÃÐÕ.Ãð¦.ð™+Ãðÿ4Ã0=0Ãàü.Ãà…-Ãõ.Ã0¨3Ãðÿ4Ã0I.Ãàa3Ã92ÃP2Ãð5,À•-ÃÐR/Ã`š4Ãp86Ãð /ÃÀ„5Ãï/à .,ÃP-ÃÐÏ/ðÚ5ÃP2Ã0U,Ãà&(à 1àT0ÃàI7à³5Ã05Ã3/ÃpD4Ã012ÃÀ1.ÃÀ1Ãð‚4Ã`4ðò1ÃÀû6Ã`6Ã`2à þ3ÃpÍ2Ãp¯7Ã?1ðà4Ãl0Ã@Û1ðì2Ã0û:à¿3ÃÀ%0Ã0+3ÃÀÀ+à +Ãðe$Ã0U,Ã0Ò,Àè4Ãp\0ÃÀÆ*Ãð4à u5Ã`)2Ãð5,Ãð¦.Ã@í.Ãc+Ãày/Ãð¬-Ãû-ÃE,Ãð”1ÃB7Ã`G-ÃP-ÃÎ.Ãpß/Ã33Ã@X2Ãx.ÃÀ+/àË1Ãб4Ãf1Ã@ó-ÃðŽ2Ã-Ã`¾.Ãð5,àÝ.À0Ãf1Ã012ÃÀ+/Ã0À/àB3Ã`¾.Ã0%4Ã0´1Ãl0ÃàØ4Ã@p.Ãð5,ð{0Àq3ÃÀ2à×/ÃP.ÃP,+Ã92Ã@ *àr+à`.ÃÀ7-ÃÐ:3Ã`50Ãð).Ã~-Ã071Àq3ÃPö3àã-ÃP¯*Ãr/ÃP2Ãà[4ÃÀé9Ãà.Ãph.Ãà-Ãð4ÃŒ5ÃÀ%0à 6Ã@v-ÃÀ¨/ü1Ãðù5Ã@½6Ã0Ø+Ãà.Ã0Ò,Ã0ä)À³(ü-ÃÐX.ÃÀI*Ã`¾.ÃÀº,ÃP0Ãб4ÃÀ®.Ã,Ã`G-ÃÐ^-Ãpn-ÃЈ&Ã`¾.ÃpÙ0Ã`/1Ã@L4Ã@ˆ*Ãð1Ã`²0Àè4ÃÐÏ/à Ã(Ã-ÃP£,Ãï/Ã0O-ð-ÃÀ1àã-Ã071Ãpn-Ãà )ÃQ*ÃpÙ0Ã`Ö*Ãpý*Ãð0ÃÐ:3Ãpt,Àú1Ã0[+Ãàü.ÃàU5ÃÀ+/Ã0=0Ãàð0À‰/Ãà‹,à ±+ÃÀ=,ÃH6Ã?-Ã@Ž)Ã@ÿ+à +Ã@É4Ãpß/Ãï/Ã@ç/àã-Ãð5,à 4+Ãà+Ã0ð'Ã'1ÃP,+Ã3/Ã071Ã`;/À.ÃðA*Ãà*Ãðš0ÃP©+Ãpn-ð .ü1À-ÃÐ:3Àú1à 1ÃÐR/à(Ã`k'Ãl0àé,ð-ÃÂ,Ãpñ,Ã`¸/Ãà…-Ã-0À}1Ã0O-Ã?-àï+Ã?1à 2ÃPö3ÃÀx7ÃpP2à ò5Ã@á0Ã`Y*Ã@)à Ÿ.Ã`S+Ãpë-ÃÀ7-ÃÀ2Ãàs0ÃÂ0Ã0Ø+Ãð¬-Ãàg2Ãð1Ãð).Ã@X2ÃÐ^-àf-ÃZ3Ã`¬1Ãr/à 0Ê+Ãp*Ã0´1Ã9.à «,À¹'ÃðÄ)ÃÐj+Ã@á0ÃÀO)ÃÔ-Ã`Ä-ÃÚ(ÃP—.à ·*àl,ÃÀ7-Ãæ*ÃÀ%0Ã0®2À$+à (-Ãà…-Ã071Ãp86à¿3Ã@”(Ã@á0ÃÀ–2ÃPð4ÃP-ÃÀ1ÃE,Ã@+ÃÐR/Ãàö/Ã?1ÃÀ%0à 4+Ã`/1Ãpë-ÃàÒ5Ã!6ÃÀõ7Ã,Ã,ÃàØ4Ã`¬1ÃÀÀ+Ã9.ð,Ãpn-Ã@|,àx*ÃP‹0ÃÀ®.Ã`¸/àï+Ã?-ðu1Ã0Æ.Ãà-ÃÀa&ÃÐç+à “0Ãðš0ÃÀÌ)à ±+Ã*Ãpn-ÃQ.ÃpP2ðþ/ÃÀ®.À}1Ãà…-Ü(ÃP‘/ÃÀº,Ü(Ãé0Ã-ÃP,+ÃP,+ÃË5Ãr/ÃÀÀ+ÃpJ3ÃÐR/ÃP-Ãày/Ãày/ÃÎ*ÃÀ['À**Ã`¾.Ã`;/ÃP—.Ã0=0Ã`A.Ã92Ã0I.ÃÎ.ÃPg6Ã`5ÃÝ2Ãp÷+Ã`;/ÃÐj+àÅ2ÃÀ%0Ãà-À-Àe5Ã~-Ãð”1Ãð/-Ã0m(ÃP.Ãpn-Ãàð0Ã`”5Ã`50ÃÀU(Ã0U,Ã@Û1à +à Ÿ.ÃP/Ã`/1Ãà-Ã0U,ÃQ.ÃÀ1.Ã@ *Ãàü.à /Ã@^1Ã@F5ÃpÇ3ÃÝ2à ™/Ã`¦2Ãз3à×/ÃK/Ãð 3Àe5ÃÀ1.Ã0®2ÃŒ5Ãà‘+ÃT4Ãà )ÃP1Ãpß/ÃPy3Ã`#3àZ/Àq3à þ3ÃË5Ã`4Ã@á0Ã],à «,Ã@Ï3Ãð”1Ãðá9àé,àã-ÃÂ0Ã`5Ã`²0Ã`50Ã@v-ÃÀœ1ÃP2ÃÚ,Ã@ó-Ãàä2Ã0¨3àÑ0ÃÐd,ÃÀõ7ÃðŽ2ÃàÌ6Ãñ9Ã],Ãày/Ã0À/Ã`2ÃÀ¢0Ã],ÃÀ1.Ãð¦.Ã`#3ÃPü2Ã`;/àï+Ø3ü1Ã@Ï3ÃŒ5Ã@á0Ãà—*ÃðŽ2ÃP/à 1ÃÐÏ/ÃP-Ã`;/ÃP…1ÃÐÏ/àx*ÃÝ2ÃP‘/Ãð0Ã@v-Ã0O-ÃPÇ&Ã`â(à 2à 1à /ð{0Ãp€*Ã`¾.à~)À /Ã0Ò,ðò1Ãpn-à 2Ã@+ð"*Ãð#/ÃP&,Ã3/Ã9.ù8À5=Ãðù5Ãp&9ÃÐ9Ãð¦.Ã0s'Ã@ *Ã0º0Ã?1ð"*Ãò(Ã@ç/Ãp>5Ã-0À‰/ÃÐ@2Ã0Ø+ÃŒ5Ã` 7ÃÀœ1Ãpå.ÃP,+ô$À /ÃÀ2Ãû-Ãð).Ã`/1ÃP/Ãpß/Ãõ.Ã@ *ÃP-ÃÐd,Ã`Ž6Ãé0Ãp\0Ãð5,Ã@)ð,Ã0g)Ã*à þ3ð()ÃÀÒ(à 2à ".à É'ð.(ÃÀ7-Ã@+Ãàö/ðø0Ã@|,ÃŒ5Ã'1Ãf1ÃðÄ)Ã@d0Àe5Ãàs0ÃÐ|(Ãpt,ÃpD4ÃÀ®.Ãpñ,Ã`G-ÃpP2Ãà*Ãàä2ö2ð3Ãf1Ã012ÃP2ä1À.ÃP‹0Ãà-Ã@|,Ãpå.ÃP -Ã`Ö*àû)ÃÐÕ.Ãr/ði3à “0ÃP¯*Ãp-#Ã@”(ð,À.ÃðÊ(à ·*Ã071à×/À<'Ãà*Ãð¦.ð/ü-Ãû-Ã0Þ*àÑ0Ãà.Ã012ÃE0Ã@ó-àã-ð‡.ÃÐÏ/Ã`M,àr+Ã*à 3à 0Ã@R3à ø4ð/ÃÎ*Ã0Ò,à×/ÃpÙ0Ã@j/Ã@ù,àB3à ·*Ãàg2ÃP…1ðu1à +ÃðS'àï+ÃÀ¢0ð«(Ãà—*ðø0àÑ0ð‡.Ã`Ê,ð‡.ÃPö3Ã012Ãàü.ð+Ã`¾.ÃÀ¢0ÃÐX.À.ÃÐF1ÃQ.à +Ãà.ÃÈ+ðþ/ÃÀ%0Ãà.ÃZ3Ãpë-ÃÀ+/Ã`50ÃÐí*À /ÃÈ/Ã@Ï3Ã@ç/Ãб4Ã`/1Ã`¸/àl,Ã@¦%à<4Ãð5,Ãàm1àZ/Ãp€*ð4'à (-ð/Ã@^1ÃP/Ãð”1ÃÐR/àÅ2ÃE0à ‡2ÃŒ5ðò1Ã~-ÃÐ^-Ã0Ò,àl,À›,Ã~-ð .à ì6Ãà=9Ãà[4Ã@ç/à þ3ðc4Ãf1àH2à³5Ã5ÃP0Ã3/ä1Ã@d0ÃQ.àÑ0ðì2Ã@ó-Ãc+Ã@í.Ã0´1Ã0®2ÃàI7àH2Àw2Ãû-Ã`4àÅ2à¹4Ãð1ÃpÁ4ÃÐù(À›,ÃN5ÃpÇ3Ã@v-ÃPy3Ãpn-ÃÀ7-Ãpß/ÃÐ(6ÃÐ@2Ã0=0Ã0–6Ãà.ÃÈ/Ãð2Ãàs0ÃpÁ4Ã`)2ðc4ÃÐ44Ãðˆ3à Ÿ.ðò1Ã@@6Ã9.ÃÐá,Ãàü.Ã`A.À0)Ãàs0Ã`2Ãàê1Ã'1Ãðˆ3Ãð0Ã@Õ2Ãp»5Ã-4Ã@¥:à9ÃÀ~6àB3Ãàê1ð"*Ãàs0ðà4Àè4À1Àâ5àÅ2Ã@í.Ãð/-ÃÀ3ÃPs4à 6à æ7à 0ðu1ÃPÌ:ÃÀ¨/à o6ð-ÃÀ®.Ãàs0Ã`¬1Àk4Àâ5Ã0´1Ã?1Ã@Ï3ÃÀ1.Ãз3Ãн2Ãpß/ÃP2ê4Àè4ÃÐF1Ãàü.à 3Ã@L4Ã3/ÃÐ@2ÃÀs#ÃÐd,ÃÐÕ.Ã?-Ã0ä)À /àÑ0ÃÀ1Ãð¸+ÃP1àH2Ã@ó-À6(Ã@v-à³5Ã@·7ÃP2*Ã0C/à /ÃÀ–2Ã`5Ãà.ö.ÃàO6ÃÀ~6Ã0¢4à ‡2ÃÐj+Ãày/ÃPg6ÃpÁ4ð{0À¡+À$+àB3ÃÐ@2À0à¿3Ã06Ãàð0ÃÐ9ÃÀœ1Ãp\0à<4ÃP…1Ã0º0Ã`Ð+Ãà-Ãé0Ã@Õ2ÃÀº,Àƒ0Ã@p.Ã`¬1À.Ãð/-Ãà—*Ãpß/ê4ÃPy3Ãp>5à 3ÃPs4Ãf1Ãàa3Ã@p.à 2Ã`;/ÃP0ð‡.ð{0ÃÀœ1Ãp»5Ã`Ê,Ãà-Ã`4ÃÎ.ÃÐL0ðì2ÃàI7Ãðù5Ã@d0Ã`5Ã0À/ÃPs4à 1Ã92ÃÐ44Ã05ÃÐF1Ã0:Ã0¨3Ã?-Ã`A.à×/ÃŒ5Ã0º0Ã-0Ãr/Ã071àH2ÃPy3ðþ/ÃÀ1.Ã`;/Ãà—*Ãàð0Ãð|5àû)Ã~-À.ÃP0ÃP£,À›,À$+Ü(ÃPs4Ã`)2Ø3Ã0Ì-ðÔ6Ã06à06àÝ.à (-ðà4Ãr/Ãà+Ãà)Ã`2Ãàm1Ã0=0Ãðv6Ãõ.àN1ÃÐF1ÃP2ÃÀ3à×/àã-Ãà-ÃPg6à9Ãàm1Ã`2Ã`;/ðo2Ã0À/Ãpý*Ãð /ÃP0àf-Ãð1ÃpÓ1Ã@”(À6(ÃÀ+/ÃÐ@2ð-ü-À§*Ãà*Ã`;/Ã`;/ÃÀ®.ð,Ã@^1Ã0Ì-Ã4Ãà.Ãr/ÃP»(Ã@v-Ãð/-ÃÐù(ÃÀÀ+Ãà-Ãð¬-Ã@«9ÃŒ5ÃPP%Ã0´1ð/è&ðŸ*àf-ÃÐ|(ÃÔ-Ã`¾.ÃÐ &Ã`w%àû)Ã@ÿ+ÃÀC+Ãx.ÃP—.ÃÐç+ðŸ*ÃÐí*ê0ðŸ*ÃÈ/Ãð5,ÃE,Þ2ÃÐù(Ã*ö2Ã0¨3à ò5À-Ã],Ãð”1à ‡2ÃP&,Ü(ÃðS'Ã0a*ÃPs4Æ6Ã0C/àõ*ÃÈ+Ãà.À0Ã0®2Ãpz+ÃÀO)Ãð5,ÃP‘/Ã0Ì-àl,ÃÐá,Ãï/ð3ÃP1à<4Ã`Ð+ðo2Ãð¦.à F(Ãà©'Ã@ˆ*Àq3ðu1Ã`Ä-Ãð).Ãàü.Ã0+3à 1ÃÐá,ð{0ê0ÃÈ/à×/Ãð”1À§*Ã@)ð“,ð .ü1ÃpÙ0Àƒ0ðæ3Ã3/ÃpV1Ã0=0Ãð2Ãàö/Ã0Ì-ê0Ãx.ÃÎ*Ã0[+Ã3/à 1Ã`/1ÃðÊ(Ã'1Ã'1ÃÀ´-àÅ2Ã`4ÃàÒ5ÃP‘/ü1à ‡2ÃP‘/Ã071Ã@ç/àË1Ã`5Ã@‚+Ã@ç/ÃÐ¥6ÃpJ3Ã@F5ÃPy3ÃÀÌ)ÃÐp*ÃÀ%0ðŸ*ÃÀ+/Àƒ0à Û$Ã`¾.ÃP2Ãàs0À•-ÃÀ%0Ãð¸+ÃÀC+À-ÃÀº,Ãc+à ½)Ãà,'Ãà.Ã0Æ.ÃK+À,ÃP&,à ¥-Ã@á0Ã3Ã-0à 1ð™+Ãн2àÝ.Ã`š4à~)Ã`ú$Ãp\0Þ2À.Ã0C/ÃÂ0Ãð”1Ãàm1ÃpV1Ã0Ø+à­6ÃP2Ãx.Ãàö/Ãàö/à`.Ãàä2ÃP‹0Ã3à`.À.à ±+Ãà…-Ãð¬-à ¥-ÃÀ=,ü-ð/À§*àÝ.Ãð¬-Ã@|,ÃЈ&Ã@)Ãph.ÃÈ+ð .Ã-0Ã0C/Ã0m(Ãàð0Ã`â(ÃÀ=,Ãpå.Ã-Ãpë-ÃP2*à ™/ê4Ã-4Ãàg2ÃЫ5ÃÂ,ÃÀº,Ã0Ø+Ãà'ÃP-Ãï/Ã0U,à×/ÃÀ3ÃàU5Ãý7ä1Ã0´1ÃÐÏ/ðì2ÃЫ5ð·&Ã-Ã0Ò,ðò1Ãн2ÃÐá,Ã@”(Ã0Ò,Ãð2Ã`/1Ãà+ÃÐp*Ã0ð'Ã012Ã0C/Ã0À/Ã`Ü)Ãpñ,ÃP&,ð-ÃÐó)Ãpn-Àô2ÃÑ4à 3Àƒ0À¡+ð{0Ãðˆ3ðø0ð/ÃP&,Ãð0Ãð /ð±'Ã0O-Ãà…-Ã*Ã@‚+ä1ð3Ãð;+Ã3/ð/ÃP0Þ2Ã@F5ð™+Ã%'Ãl0Ã@½6Ãð¦.Ãð¬-Ãà-Ã`¾.Ã@‚+Ãà‘+ÃQ*à F(À$+àN1Ãð²,ÃÐ'àN1Ã@Õ2à ™/Ã`Ð+à 3Ãàü.à ¥-ÃÂ0Àw2ÃP»(Ãà,Ã0º0Ã0U,àf-Ã0=0Ã0Ì-ÃÀI*Ã`M,ÃÐF1àl,ÃÈ+Ã`G-ÃÂ0Þ2Ã`Ä-ÃP2Ã9ÃpÇ3àé,Ãày/Ã@Ž)ÃàÞ3Ã0+3Ãð¬-Ãà*Ãðî"Ãðe$ü-Ã`;/à (-àï+Ã-0ÃP.ÃP¯*Ã`Ä-Ã)ÃÐÉ0Ãàü.Ã`)2à .,Ãð¸+ð/Ãpý*àÑ0Ãðš0Ã0Ò,ÃÀ¨/ÃÚ,Ã`;/ÃÀ®.Ã-4À**à)ÃP£,ÃÐç+ÃÐv)ÃP8)àH2Ã0Æ.ÃÀ=,À.Ê+Ãpñ,Ãx.ÃÀ®.Ãà.Ã?-Ãàa3ÃÀ1.ÃW)à .,Ã`#3ÃàÌ6à ±+à 0Ã`Ü)àZ/Ã0Ò,ÃÀœ1à ø4ÃPä6Ã`;/ÃÈ/Ã0I.À.Ãæ*Ã`¾.ÃP1À.ÃðA*Ãð¦.ÃP1ÃÈ+ð/ÃÈ+Ãàð0Ã`²0Ã?-ÃÎ*Ã@‚+àÝ.à 0Ãx.Ãõ.Ãp\0ð/Ã*à L'Ãc+à 'Ã@ˆ*ÃÀ´-Ãð/-Ãð¬-Ã`¾.Ö)Ã@ˆ*ÃÐç+ÃÀ%0Ãpß/Ã@š'Ãpå.Ã*Ão)Ãð²,Ãr/Ãðˆ3Ãà-Ã0ä)À}1àf-à ¥-ð¥)à ·*ÃÀ¢0ä1Ã071ð/Ãpb/À$+Ãà*Ã0ö&Ãð²,Ã`}$Ã`;/ÃPD'ð¥)ÃÂ,Ã0Ø+ÃP©+Ãà—*Ã071ð .à 4+ÃÐL0À}1Ãpt,ð,ÃP2ðà4Ã`;/ÃpV1à (-Ãi&àr+Ã0Ø+Ãþ&à /ð-Ãð/-ü-ð/Ã@ç/Ãà+à×/ä1ÃP.à Ÿ.à(ð/Ãà2&Ão)ÃÐL0ÃÐ^-Ã@ˆ*à`.ö.Ãàs0ÃZ3àr+Ãà£(Ã012ÃÀ–2ÃW-Ã0…$Ã0Æ.ÃpV1Ãð /ÃpÙ0Ãr/Ã0Æ.ð+Ãð4Ã`¾.Ãp\0à¿3Ãðš0ÃÐÛ-Ãðâ$ð{0Ã`4ÃÐ"7Ã@É4Ãà‹,Ã0a*Ãð;+Àk4ÃÐ'Ã0ö&Ã0[+Ã@j/ÃpD4Ãf1Ãð5,ð‡.à`.À.ÃP.ÃÂ,Ã`_)Ã@p.ÃÀœ1ÃpÙ0Ã@Û1ÃP -ÃN5ÃpP2Ãï/Ãpb/Ãà‹,ÃP -ð+ÃÐ|(ÃP.Ãé0ÃpV1ÃE,ð“,àH2ÃP,+ðþ/à$8Ãpt,Ãpb/Ãp,8ðæ3Ã-Ã0C/ð-à ½)Ã@ç/Ã@L4à “0Ã`5Ã@v-Ãpë-Àk4à 1ð/Ã`;/ÃÀ['Ê+à 2À$+Ã@í.Ã071ÃÀ¢0Ã@Õ2Ãx.Ã@‚+Ãà[4Ãðù5Ã0:ÃЇ;ÃÀ~6Ãà‘+Ã012Ã`²0Ã-0à Ã(Ã`e(Ãpë-Ã0O-ÃÀ®.Ãà+à ½)ÃP1Ã` 7Ãð#/ÃP‘/Ãpt,ÃÐX.Ãà'ÃÎ.ÃÐF1Ãà.àr+àã-À**Ãl0Ãp»5ÃÐÕ.ÃP£,ÃP‹0Ã*Ã0Ò,ð‡.Ãð /ÃP,+ð .àH2ÃÎ*ð"*ð/ÃÝ2àÝ.ÃÐÏ/Ãðš0ÃÐ:3Ã`Ê,Ãð;+Ãà…-ÃË5àB3Ãà‘+Ãà.Ãàs0à 3Ãð¦.ü-ÃP -Ã`â(ÃðA*Ãu$àx*ÃÀ¨/Ã`#3ÃÀ7-à Ÿ.à “0ÃÐó)Ã0Ø+Ã&Ã`¬1ð/Ã`Ä-à ½)À-ÃÐ^-à 1Ã92Ãà.À.ÃÐç+Ã`Ä-Ã33à ‡2ÃPJ&ðø0ü-Ã@ *ÃÀ´-àB3À}1Ãàm1Ãð¾*Ãpb/àx*ÃÐj+Ãpt,Ãð).ÃpÓ1àB3Ãpb/À,Ã`Ê,ÃÐ^-Ã,ÃÐ8ÃÐR/Ã0º0ÃÐX.à Ÿ.À1Ãà£(ÃÀ+/Ã`;/Ã-0ÃP/Ã@Õ2à ™/ä1Ã`;/Ãð).ÃÀœ1Ã@ó-Ãpå.Ã@X2ð/ÃpV1ÃÀ2Ãpn-ÃP -Ãð0Ãð²,Ã@j/Ã`)2Ã`M,ð/ÃÀC+ÃЂ'Ã@ÿ+Ãû-Ãàm1ÃQ.ÃÈ+Àô2Ã@v-Ã0´1Ãð¸+ÃÀ5ê4ÃP‹0ÃÐç+à F(à 0Ã@É4Ã`50Ãph.Ãð2ÃÐÉ0ÃÀ¨/Ã@R3ÃÝ2à ±+ÃP‘/ÃE0À.Ã@ *ÃÀ´-Ã0g)ÃÐÏ/ÃÔ-Ãð¬-Ã`Y*Ã@j/ÃÀº,ðÚ5Ãðš0Ãé0Ã~-ÃpP2À}1Ãp€*ÃÀ+/Ãð/-ÃÔ)Ãf1ð™+Ãàg2Ã0=0à .,Ãà+À›,ÃP-ÃÀ%0ð,àT0ÃÐá,Ãð¦.ð‡.Ã@v-Ãð¦.Ãày/ÃP2ÃÀ¨/àT0ð-à R&Ã3/ÃðŽ2à /Ã@ó-ÃÔ-Ãð/-Ãà+à .,Ã@ù,Ã@j/ÃPD'ÃQ*ÃpV1ÃQ.ÃÀÌ)Ã`50à (-ÃÐÛ-ÃP1Ãr/à :*Ã0‹#ÃÐù(Ãph.Ãà…-ÃÐá,À•-ÃÐ^-ð+à (-ö2Ãà‹,ÃpÇ3Ã012ÃÐj+ÃÀ+/À‰/À**Ãð¸+À0Ãpn-Ãp*ÃÐÏ/À /Ã@(ÃÔ)à~)ÃP0Ãð¸+ÃP©+ÃP‘/Ãã1Ã0Ò,Ãày/ÃÀÞ&ÃpŒ(ÃPü2Ç%ðu1Ãð#/à 6Ã4ð‡.ÃÀ+/ÃðÄ)à 4+Ãð¾*Ãà&(àã-à ".ÃÐ:3à .,ÃÂ,ÃÎ*ð“,à×/Ã`¾.Ãì%Ãò(ÃðS'Ãð¸+Ãp\0Ã0O-Ã071ÃðG)à 1ÃP£,Ã`#3Ãà-ê0Ãð1ÃðG)ÀN$Ãø'Ã@j/Ãpt,Ã`Ä-à 1ö.ð+ÃÐá,Ã0[+Ãн2Ã@É4ÃÐá,Ãà8%à É'ð+Ã`S+à ½)ð()Ãð1ÃW-ÃÀ%0ð¥)â'Ãð /ÃpÍ2ð .ÃP—.ÃÐ|(ÃW)Ãà&(Ãpž%à„(à ".Àƒ0Ãð¸+Ã@p.Ãp\0Ãð#/Ã0U,ÃÀ2ÃÀI*ÃP-Ãð /Ã~-Ãàü.Ã0ä)ÃÐF1ÃÀ7-à 4+ÃÂ0ð‡.à .,Ã`;/ÃP1ÃP.Ã0´1Ãày/ÃpÓ1Ã05Ãð4àÝ.Ãиà 'ÃÈ/Ã@X2Ãð /Ã@ù,Ãð/-ðþ/Ãé0Ã`Ä-Àî3Ãp†)àÝ.À­)Ã0Ò,Ãà+Ãð 3ÃÀÀ+À­)Ãp\0Ãp»5Ã0º0ÃpÇ3Ã@F5ÃP/Ã@ù,ÃÀ7-Ã@á0Ã×3Ãðù5Ã@@6ÃpÓ1ðì2à +Ã`2ðø0Ã-4Ã0I.Ã@j/àZ/ÃW-Ã05ÃQ.Ã'1À‰/ÃÈ+ÃP1ÃÐÕ.ÃP‹0À›,Ãæ*ÃÀÆ*ð‡.Ã@ó-ÃÚ(Ã0Æ.ÃàO6àf-à /ÃàC8Ãà[4ÃàÒ5Ãà¯&Ã](Ãl0Ãà)ÃÐÕ.ð-Ãð#/à (-Ãð;+Ãé0Ãàö/Ã@ç/Ãf1Ã071ÃÀÀ+Ãày/Ãðí7Ãàs0ÃÀI*Ã0O-ðu1Ãpß/à ¥-à ".Ã9.ÃÐá,ÃÀC+ÃÐÃ1Ãf1à Ÿ.Ãã1ðþ/ð/À}1Ãàö/Ã@Ž)ÃP.ÃÀ®.Àw2Ãà.Ã],ÀÅ%ÃP.ÃÐÕ.Àú1Ã@v-Ã@ÿ+À¿&ÃÐç+àï+Ã@p.ÃW-ÃÀ7-ð™+Ã0Ì-Ãé0Ãð¸+ÃPs4à +À.ê0ÃP2ÃpÓ1ÃÀ¢0Ã0Æ.ÃÐá,Ã@ *à +à +Ã0=0ð,ÃÀ´-ÃÀØ'ÃÀÒ(Ã*ê0Ã0I.Ãà…-ÃÐÛ-àû)ÃE,ÃÀÆ*Ãàm1ÃP©+Ãph.ÃðÊ(ð.(Ã@d0ÃP2*ð“,Ãpb/Ã@ç/ÃE0Ã`¸/à 3Ãàö/Ã`50ÃÐ:3ÃÀœ1Ãp÷+ÃÐL0Ãp>5ÃÑ4Ãð;+ÃÀ1à%ÃP0Ã`;/ÃP¯*ÃP -ÃH6ÃÐ"7Ãæ*ð±'Ãà,'ÃÐ &Ã0ð'Ã`Ê,ð-Ãð2ÃðM(Ãpž%ÃPñÃ@p.ÃH6Ãàa3Ã@L4ðø0ð¥)à +Ãp>5Ã`¸/Ã0C/Ã0U,ÃÀÌ)àï+ÃE,ÃÀ„5à ".ð¥)Ãà»$Ãr/ðæ3à`.Ö)ÃP>(Ãà—*À‰/ð"*À6(Ãì%Ã@+Àî3ð™+à ™/Ã0g)Ã],Ã,àï+Ãà&(ÃP.ÃÀ´-À6(Ã$ÃPÙ#à)Ã`Ð+Ã%'ÃÀÆ*ÃpŒ(Ã@ˆ*è&àr+àl,ÃP&,ÃÀO)Ãà,Ö)ð .ÃP8)ÃÐp*Ãà…-ÃÀC+Ã`ô%Ãp¤$Ã0ê(Ãpñ,À.Ãà‘+ÃÈ+ÃàÞ3ÃÀÆ*Ãp†)ð™+Ã0Ì-ð .Ãà-Ã`A.à ±+Ã`e(à ¥-Ã-0à (-ð"*Ãp*Ã`}$ÃðÊ(à ½)Ã0%Ã0Ì-Ã`_)ÃP,+À-Ãpn-Ã0O-Ã@)ÃÀÀ+ÃÀC+ÃÀ7-ð/ÃÀI*ÃÀO)ÃPÍ%Ã`Ð+Ãà.ÃÀÌ)ÃÀ"ÃÀ®.ÃðG)Ã0m(à ".Ã*ÃÐç+à 0à)à F(Ãæ&Ãc+àé,Ã@ÿ+Ã,Ã0À/ð½%À§*Ã~-Ãì)ð·&Ãà )Ã@ˆ*Ã@ &ð+ÃÀÌ)ÃÀä%ð4'Ã`Ê,ðò1ÃP.Ã`è'ÃÈ+Ã0ü%à R&à ±+Ã,ÃÐ^-Ö)Ãæ&Ãpz+Ã@|,à /à ".ÃPÇ&Ãà£(À³(Ãc+ÀB&ÃðŽ2ÃW-Ã`2Ãà…-Ã`Ü)à 'Ã@š'â'Ã`Ð+à ·*àÅ2ÃðÄ)Ã`â(Ãp*Ã0U,ð .Ã0m(Ã&Àã àõ*Ãà*Ö)ÃÂ,Ã`è'Ãþ&Ã`S+Ãph.À›,Ã0C/ÃÐ^-ÃÐv)ÃÂ0ÃP&,à (-ÃPµ)ÃpÓ1Ã33ÃÀO)Ã@í.ð™+Ãp†)À**à /Ã`Ü)ÃÐj+Ã-0Ã0%4ÃP&,Ãpt,Ãà+Ã0Ø+ÃP/ÃÐj+ÃW-ÃÀÆ*ÃðÖ&ÃÐí*ÃÂ,Ã@|,ÃÐç+Ãph.Ã`²0Ãà+ÃP¯*Ãàö/Ã@‚+ÃpP2Ãàð0ÃÐj+ÃP©+Ãp¤$Ãpý*ÃP—.ü-ð/Ã-Ãpz+ðì2Ãð;+Ãp*Ãà…-à :*ÃÀ1.ÃÐÏ/Ã0[+Ã`š4Ãp’'ÃÂ,À¡+ðŸ*Ãc'Ã=#Ã`S+ÃðÄ)Ãl0Ãðí7Ãàê1ÃðG)ÃPÇ&àû)àË1ÃÀ1à ¼>Ãð^:Ãðˆ3Ãz<Ã0¢4À7Ã`ù9à Î;ð°<Ã`Ž6Ã@±8Ã`ù9ÃðF>ð˜@ÃBÃ@Ÿ;à 9?Ãpü?ÃðÉ=à ?>À‚EðBÃ0ËBÃàœ>Ã0Ý?à ˜DÃÐþ<àw?ÃÀHÃÀ0CÃð@?ÃàBÃpCIÃP Eà -AÃPBÃGÃÐÔCÃ0ï<Ã0ÃpmBàÐEðBÃÐ9HÃÀHÃ0é=ð¶;àSEÃà~CÃÜGÃpäCÃ0¡IÃð™EÃ`·DÃPFÃÐ9Hà GÀˆDÀšAÃ`R@ð'>Ã`@CÃSIÃP´>ÃDEÃðàNð CÃn>ÃÀ³BÃ>FÃ`IÀŽCÃ0TAð†CÀ‚EÃ`«FÃ0¹EàkAÃ0BDÃÐo?Ã@ ?ÃpmBð-=ÃÀN>ÃÀJÃÙ=Ãp?ÃÀ0CÃwCà ¤BÃë>ÃÐ<àSEÃ0§HÃ0ÃP%AÃPDÃ`ÃBà ªAÃð¥CÃ`«FðDÃpsAÃÐì?àÖDðŒBÃPœBÃP®?Ãp?Ãà+<Ãð¥CÃpü?ÃðÉ=ÃPU9Ãð@?õCÃP?ðAÃÐì?ÃÙ=Ã@ ?Ãð4AÃÐàAÃb<ÃðŸDÃP EÃÀÑ=ÃðÃ>Ãý;ð-=Ãàœ>ÃÀÅ?ÃP%AÃðÃ>Ã9ÃP==à Ú9Ãp…>ÃPÌ:ÃÐ<Ã@(:à E=ÀEÃÀ*DÃ0×@Ãp‘<Ãp=ÃÀ0CÃ>Ã09Ã0`?ÃÀ×<Ãz<ÃÐ:ð˜@ÃÐu>Ã@{AÃë:ÀÐ8Ãp;Ã`ç<Ã@";à EÃÐò>Ã@>Ã@";ÃÐi@Ã0é=ÀAÀ5=ÃÀf:ðÚ5ÃPÀ<à -AÃp>ÃÀ6ðE9Ã0 8À;ÃÀH?Ãàœ>ÃPÀ<ÃÐKEÃàº9À/>ð¤>Ã0:Ã`ù9Ã0:Ãðj8ÃÅ6ÃP==Ã0l=ÀA;Ã@ ?Æ:Ãå;Ã@<Ã0:Ã@É4ÃPg6ÃðÕ;ÃП7ÃàU5Ãb<Ãz<à¿3ÃП7ÃÀl9ÃŒ5Ãp>5Ãàº9Ã@:7à ì6ÃàO6Ãà¨<Ã`|9ðÚ5à Î;Ãð@?Ã@Ã5Ã07Ã@F5à ì6ÃàÒ5Ãp»5ÃÀŠ4ê4Ã0~:Ãp»5àÅ2Ãз3Ã06Ãðd9à Î;ÀÖ7Æ6Ã@@6ÀS8à¹4Ãð|5ÃË5Ãðç8Ãñ9ÃÀf:ÃÀT=Ã0œ5ÃÀû6ÃÀ3ÃPU9ÃÇ@ÃÀZ<Àe5ÃPö3Ã06à u5à 3ÃH6Ãðv6Ã×3ðÚ5ÃÀ„5ÃPU9ÃPm5Ã0õ;ÃÅ6Àî3Ãp;àÅ2ÃÀ+/ÃpP2Ãb<ÃPO:ÃàI7ÃÀ6Ãp»5àÑ0Ã5ÃÐ¥6ÃË5ÃPÞ7Ãz8À7Ã`j<ðò1ÃÐ44Ã7Ã@48Ãðó6à È<à :Ãðç8ÃÐ:ÃàÌ6ÃPs4Þ6ÃPO:à W:ÃPö3ÃÀï8ÃPC<ç;ÃÐ:à Q;ÃГ9Ãp£9Ãp,8ð-=Àe5Ã07Ãðç8Ã012Ãà7:ù8Ã`8à:Àk4Ã@·7ÃPä6Ãàä2Ã`j<Ã`ç<ÃÀÝ;ÃÐ8Ã`ˆ7À7à 3ÃÐ.5Ã`ÿ8ðø0À1Þ2Ãß<Ã`5Ã÷8à*7ÃP1Ã8ÃŒ5ðø0Ã@p.Ã`X?Ã0x;ÃP‹0ÃÂ0ðì2Ã-4Ã`ù9Ã07ÃPð4ði3ÃÐF1ÃPs4ðW6Ãðù5Ã0 8Ã0:Ã` 7Ã@:7Ø3à­6Ãp\0ðÚ5Ãðˆ3àÅ2ÃÅ6Ã`p;ÃЙ8Ã@±8À.àN1ÃЙ8ÀÐ8ê4ÃB7à Ô:ÃÝ2à³5ÃàÌ6Ã0„9ÃPä6Ã×3ÃpD4Ãp»5à à8ù8ÃŒ5Ã0+3Ã`”5à 6ÃàÞ3ÃÀf:Àâ5ÃPa7Ã@R3à þ3Ã0–6À0ÃàI7Ãðó6à <ÃÀ5Ãp,8Ãàs0Ã×3à9àË1ÃЙ8Ãðp7Ãà[4Ã@(:À7ÃÐ¥6ÃP2Ãðv6Ã`5Ã69à 3Ãp>5Ãðd9ði3à “0Æ6ÃÐ9à 3ð,ð .Ãàm1Ã0U,àT0ÃÀ3àÅ2ÃpÍ2Ãà7:ÃÐ8Ãàs0ÃPa7ê4ÃÐ:3Ãp©8Ãð).Ãð‚4à i7Ãб4ÃPg6Ã@ç/Ãpå.Ãr/Ãð‚4ö2Ã0À/ÃpÍ2Ã0¨3ö2Ã?1Ã0œ5Ã012ÃàØ4ÃÀ¢0Ã?1à 2Ãà.Àô2ÃÀ1.Ãà…-ÃÀ1àË1ÃÐ¥6Ã` 7ÃàØ4à u5ÃpÇ3Ã@X2ðÔ6à*7ÃPÒ9ÃP…1ðò1Ã0=0ðÚ5ÃÐ:3À•-Ãб4ÃÀ3à ø4à 2Ø3à {4ÃpÍ2Ã@½6Ãp,8Ã` 3Ã@É4ÃÀœ1Ã-0à×/ÃPg6ÃÐÕ.Ã'1Ã`ˆ7ÀM9ÃH6Ãàa3Ä,ÃPö3Ã@ó-Ãà+ÃÐ:3Ã0®2Ã`‚8Ã8ö2ÃÐ@2Ãð#/à ¥-Ãð#/Ãp<Ã@L4Àq3à à8Ãð”1à06à 3ÃÐÃ1ö.Ãð¸+ÃÔ-Ãàa3ðø0à 3Ã`¦2Ã`2Ãð”1Ã@ÿ+Ãu(ðþ/Ã`¦2à`.Ãp*ÃP/À1Ã0®2Ã0®2Ãï/ÃP‘/àN1Ãf1àZ/Ø7ðà4ä1Ã`š4Ãð2ü1à 2Ãàð0ö.à i7Ãð2Ã3ÃÔ)À1Ã@^1à «,Ãð;+à ™/Ã@^1ÃÎ.ÃP‘/à Ÿ.à þ3ðþ/ðæ3À-à (-à 4+Ã`Ö*ÃÀ„5ÃPm5ÃpD4ðo2Ãð¬-àÝ.Ãð¸+ÃW-Ãp\0ÃÎ.Ä,Ã0C/Ãà,ÃÐÉ0à 3ÃP -ðÔ6Ã?-Ãà+Ê+Ãà.Ã@ó-Ã`M,Ãàa3ÃàÆ7Ãp&9ÃÐ.5Ã0´1Ã’4Ã@|,ä1à ±+Ãà.â'ÃÚ,Ã@ç/ÃÐá,à ½)ÃP£,Ã`Ð+ÃP2À1Ã-Ã0a*ÃP»(Ã9.Ã`;/ÃÚ(àl,Ã@(Ãày/Ã`¦2ÃP.Ãð/-àã-Ã`/1ÃÈ/ö2à Ã(àT0ÃÀ´-ðæ3Ãз3Ã0U,Ãðš0ð-Ã0À/ÃÀ¢0ÃP -à„(ÃP2*Ãpñ,Ãð).Ãû-ÃP -Ã0º0Ãðù5Ã'1Ã0œ5Ãày/Ã0º0Ãàm1ÃÀ+/À.Ã0º0Ã@^1Ã`¬1ÃÈ/Ê+Ã`Ü)Ãi&Ã,Ã~-àã-Ã@v-ðø0Ãà…-Ã`Ž6Ã`4àr+ÃÀ®.ÃP8)Ã`2À<'Ã*ÃP£,Ãx.ÃÀ+/Ã92Ãpn-ÃÀ%0ðc4Ã`G-Ã@ó-ð™+Ã@p.ÃP‘/ð{0ÃÀl9ÃP2ÃÀ1.Ãð0Ã`G-Ã@í.Ãð¬-Ãà+Ãf1Ãà)ÃÐR/ÃÐí*ÃÀ®.ÃK/Ã@j/Ã'1ÃÐç+Ã0º0ÃÀÀ+ÃpV1ÃÀ2ÃK/Ã`â(Ãà—*À /ðø0Ã`Ä-Ã`Ö*Ãr/ÃpD4Ãé0Ã@Ï3Ã0U,Ãðš0Ãàê1Ãp\0Ãðš0Ã@(Ã0I.Ãx.ÃÐÉ0à`.À0ÃÐç+À0Ã@Õ2Ã07Ãp÷+Ãpý*À³(Ã@d0ÃÐá,à /ÃPö3ÃÀ6à Î;Ã07À¬>ÃàBÃpÙ0Ãð:@Ãà¢=À;Ã012Ã`;/Ã0%ÃÐÉ0Ã×3Ã`;/ê0ÃÐ¥6ÃÀé9ê4ÃÀ¨/Ã`v:Ã07ðÚ5à65ÃpP2Ãf1ÃPö3Æ6Ãà.Ãð¦.ÃN5à /ÃðŽ2ðK8Ã0„9Ã@Õ2Ãû-ÃÀ5Ã0À/àB3ÃðŽ2ÃÀ1àN1Ã`8Ã4Ãpn-ðŸ*Ã?-àã-Ãà‹,Àƒ0Ã@p.ê4à þ3Ãàö/Ãàê1À¡+ö2Ã@á0Ã@:7Ãp\0ÿ7ði3Ãð /Ãð /à¹4ÃÀ¢0Ãð /Ã-0ÃÀ+/ÃP.à 0à§7àË1àÅ2Ãàm1ÃP—.Ãð²,Ãðš0à:Ã07ÃPð4À1àË1ÃpV1Àô2Ã’8à /à65à³5Ã`Ê,ÃÀ3Àâ5Ãã1Ã0O-Ã3Ã@|,Ãðš0ÃP2ÃPö3ÃàU5ÃÀ–2Ãàð0Ã07ÃPð4à 6ÃÐ.5ÃP2Ã'1Ãðí7ÃðŽ2Ã?1ðþ/ðÈ8Àƒ0ðì2Ã'5Ãðç8ÃÐ:3ÃðŽ2Ã`Ä-à ‡2Ãð¦.à 2à o6Ãðó6ÃÐX.à65Ãpë-Ã@d0Ã-4Ã`¦2ä1àË1Ã3/À1Ãàä2ÃP—.ÃÀ¢0ÃN5àÝ.ÃPð4ÃPØ8À³(Ãp\0ÃÐF1Ã`¾.ÃPö3à 4+à×/ÃpÓ1Ãб4Ã@d0ü1Ãð 3ÃÐX.Ã`#3Ãà…-ÃP0Ãà‹,ÃŒ5Ã-4Ã0Æ.ð«(Àq3ÃË5ÃÐ:3àl,Ãpñ,Ã92Ãàa3ÃÐ:3ÃÐ:3ÃP1Ãð”1ÃPö3à06ÃP2Ãpë-Ã@L4Ã3Ã0=0Ã5Ã0¢4ÃÀ1.Ãï/À0ÃÐÏ/ÃÐj+Ã`G-Ã`6ðc4ÃP©+Ã@p.Ã'5ÃÀ 4Ø3Ãp86ÃP/ÃQ.Ãé0Ã`2ÃP1àË1ÃÚ,ÃÐç+Ãã1ÃpÙ0Ãð”1Ãr/àH2Ãð‚4À0Ã0¨3ðì2Ã012Ã`Ö*À•-Ã`¾.Ã0´1Ãp27ÃÅ6Ãx.Ãà‹,Ãph.Ã@Õ2ÃÐL0Ãà‘+ðc4à ‡2Ã`¬1Ã@í.ÃpV1ÃÀ3ÃÀ7-ÃÀ+/ÃQ.ÃP—.ð‡.ÃP…1Ã`¸/Ãð¬-Ãc'ð .Ã@ù,ÃÎ*Ã3/ÃÀ1.ÃÐÃ1àË1Ãp\0Ã@|,ð‡.ÃK+Ãã1ÃP—.Ã@)Ã0®2à(ÃÎ.Ä,ÃÀÀ+Ãpß/Ã`/1ÃÀI*àã-à`.Ãf1Àƒ0ÃP—.ä1ÃÐ^-Ã0´1Ã-0ð/Ã`Ð+Ãû-Ã`Y*Ã0À/à @)ÃP©+ÃÐù(Ã0À/ÃÐÉ0Ã`;/ÃE,Ã`S+ÃÀ1.ÃÐÉ0Ãà—*Ãà—*Ã0®2ÃP0ÃÚ,Ã3/ÃÐR/Ãð¸+Ã@š'ðì2à «,Ã`š4Àk4Ãé0Àk4Ãpb/ÃÐó)Ã,ÃQ*à ™/àT0àã-ð()Ãph.ÃÂ0Ãph.ÃÐ@2ðø0à ".Ã{'ÃÐd,Ã@R3Ãàü.ð/ÃPð4Àú1Àâ5Ã-0Ãp€*Ã`;/ÃÂ,à ‡2Ã`Ä-ð‡.Ãð¦.ÃpÓ1ÃPü2Ãðˆ3à “0Ãày/ÃðŽ2ÃàÞ3Ã-0ÃÀ®.à «,Ã'5ÃpV1Ã0=0Ãf1Ã` 3àÑ0ÃÀ3ÃÝ2Ã`”5Ãl0àË1à «,ÃÐÃ1ÃpV1Ãã1Ã` 3ÃÀœ1ÃpJ3À0ÃÐ:3ÃÀ´-ÃÐj+ÃP0Ãpn-à þ3ð .àH2Ãðš0à 0Ø3ÃP/ÃB7ðÎ7Ã` 3Ã0O-À­)Ã9.ó9Ãðˆ3à¹4ÃÐ(6Ãðp7à65ÃP2ð«(Ãl0à ™/Ãà+àl,à «,Ãày/ÃPð4àT0Ã@^1à›9Ã0Š8Æ6ÃÑ4à 1ÃÚ,Ãp\0À.Ã`Ö*Àƒ0Ãà[4ÃÀ´-Ãàð0Ã@.9ÃàU5Ã0¢4ðæ3ðò1Ãp»5à 1Ã9.ÃP/ð{0Ãàs0àÅ2ÃB7ÃPÒ9Ãàê1Ã9.à`.Ãp€*à “0ÃЫ5Ã`6Ã`¬1ÃÐ¥6Ãàö/Ã@j/ð3ÃPð4ÃÀ´-ÃÐ.5ÃÐÃ1Ã@d0Ã0®2ÃP[8ð,ðø0Ã071Ã`A.Þ2Ã3Ãp )Ãph.Ã%'Ã`š4Ã'5Ãð2à “0ÃÀœ1Ã@v-Ã`¸/À_6ðc4Ã071Ã0¨3à 3à¹4ÃÐÉ0ÃH6ð]5Ãðj8à<4ðK8à u5ÃÐF1Ãà‘+Ãà—*ÃP-Ã06ÃŒ5Ãàa3ÃK/Ã?1ÃÀ2à (-Ã@Õ2Ãз3ÃÂ,à`.ÃÀ 4Àe5ÃN5Ã`Ê,Ãàð0Ø7ÃÝ2à ™/Ãàð0à ì6ði3ð3ÃÀ1.ÃP‹0ÃP…1ö.Ãð 3ä1ÃP2Ä,Àî3Ãã1à ™/ÃQ*Ãàä2Ãн2Ã8Ãé0Ã~-ðK8Àô2à×/ÃÀ6àã-ÃW)ÃÀ®.Ãï/Ã0¨3Ä,ð+Ãàð0Ã'5À.Ã`50Ã0Æ.Ã0®2Ã~-Ã*ÃÀ®.à 1ðò1à Ÿ.Ãï/Ã’4À}1ÃÈ+Ãà‹,Ã@í.Àô2ÃÐÃ1ÃÎ*Ã0Æ.Ãз3Ãð¸+Ãõ.ÃpÍ2ÃpŒ(Ãã1Ãà‘+ÃÐ|(Ão)Ã`Ê,à /ÃP/Ãðˆ3Ã@d0Ãð”1àZ/ÃÂ,ÃÐ:3ÃÀ®.Ã@^1Ã0ü%Ã@ *ðæ3Ãà.ÃÐX.Ãð4à ø4À}1ÃP…1ÃÀ7-Ãð¬-Ã0C/Ãàa3ÃpÓ1Ãày/Ã,Ãð).Ã012Ãà‹,ÃP©+ð{0ÃÀ%0ÃÐj+à .,Ãб4Ãð¸+Ãàê1àã-À­)Ã`è'Ãé0Ãà,Ãðš0Ãð”1ð“,ÃÐd,Ã`¾.ÃÀ¨/Ãpn-Ã`Ä-Ãû-Ã`;/Ã0Ø+ÃP&,Ã@v-Ãð5,ÃàÞ3ÃÀÆ*ÃP©+ÃÀ¨/ÃÀ¨/ÃÀ=,ÃÐá,Ã)Ê+Ã](ÃÀ®.À1Ã@Õ2ÃPö3Ã`;/Ã@+Ã0Ì-ÃÎ.Ãpë-Ã0[+ÃÀ1ÃP-ÃÀ¨/Ã0I.Ãð).à /à×/Ã0ö&ÃpV1Ãð2Ã`50à Ÿ.Ãpå.Ãð2ÃP>(ÃpÇ3ÃÝ2ÃW-à +àT0Ã@d0Ã@Ã5ÃP.à 'ÃÐÛ-Ã@j/Ã@p.ÃP/Ãp\0Ãàg2ÃÀ–2ÃÀŠ4Ãàg2à /ÃÐF1Ãr/Ø3Ãðÿ4À6(Ã`Ê,à ".à 1ðò1ö.ÃÀ7-à`.àH2à 2Ãн2àT0Ãpë-à65Ã0%4ÃÐÕ.ð/Ã3/ÃP&,ÃP1Ãi*Ãð#/ÃðM(ÃÀ¨/Ã`;/àÝ.Ãàö/À.À1ÃÀ=,Ã-0Ã0ö&ÃP&,ÃK+ÃPs4Ã9.À**Ã`G-Ãõ.ÃÀÌ)ÃÀ=,ðo2Ã`Ü)ð .Ãpë-ð/ðþ/Àú1ÃÈ+à 4+ÃÔ-Ãð”1Ã`²0ð,àr+ð™+À0Ãû-Ã`_)Ã0À/Ã92Ã0%4Ã!2À.ð .Ã@Õ2Ãð 3Ãï/Ã`M,Ã0s'ü-ÃÐÛ-Ã`¬1Ã`¸/Ã*ö.ÃpP2ÃP¯*À³(ÃÐÿ'Ãн2Ãp»5À•-à ±+è&Ã@j/Ã@L4Ãð1ÃÀ¨/Ãph.Ã` 3Ã`50Ãàa3ð/ÃÀº,ê4ÃÎ.À,ÃP,+ÃP¯*ÃÀ¢0ÃP0Ãð¦.Ã)ð-Ãpn-àZ/Ãï/Ãï/Ãì)Ãð¦.Ãð‚4àf-ÃÐÿ'Ã`Y*Ã`Ê,ð,àH2Ãð|5ÃÀx7Ã@d0ÃÐÛ-àT0Ãð/-à×/Ãàa3ÃPy3ÃPü2à (-Ã`¾.ÃÀ%0Ã4Ãð4Ã0I.ÃÐ^-ÃÎ.Ä,Ã`)2Ãp\0Ã3ÃðŽ2Ã0=0Ãï/Ã-Ã`M,Ãï/Ê+àf-Ãpñ,Ãò(à ".ÃÔ-à +ÃÔ-Ãðˆ3Ã33ÃP…1à Ÿ.à<4ðo2Ãàö/Ã0º0À•-ÃÐd,ð-Ã@+Ãð1àÑ0à 1Ãà-àT0à 1ÃÐR/À}1à ™/Ã0Ò,Ãð”1ðW6ÃÐ@2Ãf1Ã`/1Ãð#/ÃP£,Ãp\0àl,Ã@ù,àl,ÃÐÕ.ÃÔ)Ãæ*Ãð0Ã`²0àÅ2Ã@ù,ÃPm5ÃÀ3Ãà-à ™/Ã@L4ÃpD4Ãб4Ã`#3à {4Ã`50Ã@j/Ã@v-Ãð¸+ÃÝ2Þ2ÃÀ%0Ãpb/Ã0¨3Àô2ÃÈ/àÝ.ÃÐá,ÃP‹0àé,ÃÀ¢0Ãб4à06ÃpÓ1ÃÀº,Ãð4Ã33à³5ðo2àÝ.àË1Ãð/-Ãà-Ã`Ê,Ã`Ê,ð{0Ãà.Ã`Ê,Ã0Þ*Ãðˆ3Ãà-Ãð²,ð™+Ã0=0ÃÀ®.Ã`¸/à ‡2Ãõ.ÃpÙ0à ™/ÃÐÿ'ÃÐ@2Ãpn-Ã`¸/ÃÂ0ÃðX;ðþ/Ãð¾*ðø0Ã`Ä-à ±+ÃÐL0Ã4àB3ð/ÃÐÏ/Ãà‹,ÃÀ¢0ðæ3àé,ð.(Ã0Ø+Ã],ÃP.ÃP…1ÃÀ2à ™/ÃÀÀ+Ãx.àã-Ã@ù,À}1àÝ.ÃÐX.Ãpý*ÃPÁ'ÃP-à @)ÃP©+Ãp*ÃP,+Ãð5,Ã`Ä-À§*À‰/ð-Ã+&à%ð/ÃP»(ÀB&Ãàm1ÃÈ/ði3Ã@d0Ã-0ÃÀ®.ÃP -Ã?-Ã@ *ÃP1ÃPs4à 1Ã`š4Ã,Ãà‹,Ãð /Ãpë-Ãð /Ã0À/àr+Ã@^1ÃÐ.5ÃÀ3Ãpß/Ã`50Ãu(Ã`)2à 2ÃÐç+ð-ÃÂ0àr+ÃÐX.àx*ÃЈ&À6(àã-Ãï/Ã*ÃÐÉ0ðà4ÃÐ@2Ãð/-Ãà…-ÃÐÿ'à :*ÃÐù(Ã`k'Ãð¸+ÃÀC+À}1Ã@‚+Ã`ô%Ã0%àl,Ãpt,Þ2Ã`#3ÃP‘/à «,Ä,ÃK/À1Ã`;/Ãpz+ÃÎ.à ·*Ã@d0àï+à ™/Ã`)2ÃÐ(6À0ÃPg6à ".ðø0Ã0C/ÃÐÛ-Ã@j/ðu1Ãû-à (-Ãð”1ÃW-ðò1Ã0Þ*Ã?-Ã@í.Ãð#/à 3àé,ÃÀº,ð‡.Ã?1Ã@j/à~)Ãà‘+ð-Ã](ÃP‘/Ãpž%Ãð¬-Ãp'ÃÐÛ-Ã-0Ãã1Ã@‚+Ãæ*ÃÀØ'Ã0Ø+à(Ãà‘+ð+Ãp*ÃÐR/À•-Ãð²,Ã`e(Ãò(Ãpn-Ã`A.Ãà )ÃÐç+ð"*Ã06Ã0+3Ã@í.Ã@";ÃÀ%0Ãàü.Ã@j/ÃÐp*àé,Ã0º0ÃW-Ã0ä)À³(Ã@#&ð"*Ã0g)ÃÚ,Ãð).ÃÐÛ-Ãð¸+àï+Ã0Ò,à~)ÃÀ¢0Ã0[+ÃÀ2à)ÃÀU(Ãf1ÃÀ5Ãàü.Ãз3ÃÂ0Ã@‚+ð@%Ã`¸/ð/Ã`q&ÃÀÌ)Ãà‘+ÃÀ¨/ðò1ÃP2À‰/Ãà+ÃE,ÃÀ=,ÃÀœ1Ã0Ì-à +Ã`e(Ãû-ÃÐ^-ÃP£,à Ã(ÃÀg%Ã?1Ãз3Ã0I.Ãpý*à„(à ™/Ã@ˆ*ÃÀI*Ãà…-Ãà-ð+Ãl0Ãð”1Ãpz+Ãà‹,Ãð¾*à F(ð .ÃPy3Ãðˆ3Ã@#&ð-À,Ã`è'ÃÐÛ-Ã`Ê,Ã`/1ð+Ã`Ð+ÃÐÿ'Ã0Þ*Ã?-ÃÀ¢0Ãpb/ü-Ã@j/ð+à 1àõ*ÃÀ2Àî3Ãð/-Ã~-Ãà¯&ÃÐ%Ã0s'Ãà£(ÃÐX.à`.ð‡.ÃÀÀ+à Ÿ.ð/ð+Ãà‹,Ãà-à&À6(Ãf1Ã071à 1à {4ÃpP2ÃP2ÃÀ%0ÃpJ3Ã`Ð+ð“,ÃÀr8Àw2à @)Ã0ü%ÃÀº,ÃK/Ãà+Ãà…-ÃÀ´-Ãà‘+Ã0U,Ãc'ÃP2à ".Ã`#3Ãð1Ã-à /Ã@Û1Ã-0ÃðŽ2Ãp†)Ãð¸+à «,à Ÿ.Ãp*àf-ÃQ*àl,ÃPÞ7Ãб4Ãpß/ÃÐÉ0Ã0O-Ã3à ø4Ãàs0Ãð;+à +à 0Ã@É4Ã,Ã?-À‰/àT0ÃÔ)Ã@ç/ÃÐí*ÃT4Ã0Ò,Àƒ0Ã,Ãð¾*à ".Ãð;+À‰/ÃPy3ð-Ã0a*ÃQ.ðø0Ãph.Ãð¬-ÃÀº,Ã`Y*Ã0[+ðþ/ÃpV1Àƒ0ÃÐÉ0Ã0Ø+ð™+Ãp÷+Ã@ÿ+ð,Ãн2ÀÜ6ö.Ã`è'ÃÐŽ%ÃPÁ'Ã0ä)ü1Ã@X2Ãð”1ÃðS'ÃÐÉ0Ãð /ÃÀ=,À›,àH2Ã@p.Ãð5,ð±'àï+ÃP -ÃÂ,Ã@^1ÃÀº,Ãpz+Ã`Ð+à ".Ã’4ÃÐj+à 4+àl,Ê+àÑ0à 1ÃP&,àr+Ã`A.ÃpÙ0ÃPy3Ã@v-Ãì)Ãpå.à 3Ã@É4Ã9.ð .Ãõ.Ãð0à 1Ãp’'Ã)Ãp )ÃP.Ã@ó-ÃÀ2Ãpñ,Ã0º0Ã`Ê,Ã@í.Ãð‚4Ã@á0à /ä1Ãð2ÃÐÛ-àf-ð .ÃP-Ã~-Ã*ü1Àô2Ã0¢4Ã`8àf-Ã`e(À¡+Ãàa3ÃÀ3ÃÐj+À¡+ÃÀ7-à 1Ãàä2ÃŒ5À-à .,Ã3Ãpñ,ÃW)ÃðÄ)Ã`Ö*À}1à {4Ã?1à /ÃÀ 4ÃЙ8Ã0Ò,ÃP‘/ð¥)Ãð /Ãà+à 4+ÃÐÏ/À /ÃÀ%0à /Ãðˆ3Ü(Ão)ÃðS'Ãp(Ãà+à “0Ãày/àõ*ÃÂ,ÃÐ^-Ã@‚+Ã`²0ð-À¡+Ã?-Ãl0ä1à .,Ã`Y*Ãû-à /À,Ãðâ$Ã?1ÃÐF1Ãð;+Ã(ÃP -Ãà‘+Ãð;+ð,ðø0Ãpå.ÃÀ+/Ãpn-ÃðÐ'à`.ð4'ÃÀ+/Ãà+Ã`;/Ã0I.ÃðÊ(Ã`M,ÃK/Ãæ&Ã`Ð+ÃÐd,àÝ.ÃP,+à “0Ãpz+ÃpŒ(à ¥-ÃÐù(à 4+ÃÎ*Ã0ê(àã-Ãð5,À$+àl,ÃP©+Ãà‘+Ã@)%ÃÈ+ÃÀ®.à„(ÃÐù(ð4'Ã@ç/Ã@|,à`.À.Ã0Ì-ÃP‹0Ã`/1ÃK+ÃW)ÃPð4àr+Ã9.ÃP‹0Ãï/Ã-0Ã` 3Ã@‚+Ãû-ð«(Ãpn-ÃÈ+Ãðš0à 1ÃðM(àé,Ã`²0à “0Ãð0À0)Ãà*Ãà.Ã`Ê,Ã@ó-ÃÐç+à .,Ãàð0à +ÃP2*ÃP0ÃÐR/Ãp€*Ãp )ðŸ*à (-À›,Ãð¾*Ãà©'Ãð¸+ÃÀC+Ã@ÿ+ÃP2*ð“,ÃP¯*ÃÀ+/ü-Ã-0ÃE,Ã~-Ê+Ãà&(ÃÀÀ+ÃP,+ÃÐ^-ÃP8)àx*à :*Ãð/-à 1ð3à R&ÃÀØ'Ã0ä)Ã@á0ÃÚ,À•-Ãà&(À›,ð/ÃÀ+/Ã0I.ÃðM(Ã`Ð+ð¥)àé,ÃpV1Ã?-Ãð/-ÃÐd,Ãà*ÃP0à ·*ÃÐç+Ã-4ð{0ðu1ÃP£,ÃàÁ#Ãp†)ÃÐ%Ã0‹#ð/Ê+ÃÐX.Ãð#/ð“,ÃÀC+Ãà—*ÃÀ 4Ã`e(ð¥)ÃP»(àZ/ÃÂ0Ãð1ÃÀ%0Ãð¬-à 1Ãû-À}1ÃP‹0À}1Ã0À/ÃÀÀ+àÅ2Ã`#3ðæ3ÃÔ-Ãæ*ÃP2Ãð¸+ÃÀ1Ãàa3ÃpÁ4Ãà*à É'Ã-0ÃÐX.ÃÀ+/Ã0U,ä1Ãз3ÃÈ+ÃÐÛ-ÃÐ¥6ðu1Ãà…-àl,àl,àé,Ã?-Ã-ÃPm5ðu1Ã0Æ.à Ÿ.ÃK/ÃÀ3ÃPy3ðc4Ãðˆ3À7Ã0%4Ã`Ê,ÃpV1Ãð0ÃP2Ãàm1Ã05Ã×3Ã'1ÃPg6ÀG:Ã0®2ÃÀ%0à¹4ðo2Ã` 3Ã0Ì-Ã`¬1ÃàÒ5ä1Ã071ð‡.ðQ7Ãf1ÃÐ(6ÃPs4àõ*Ãð/-À /ä5Ãl0Ã0Ò,ÃÀû6Ã`2ÃÀ3ÃPy3ÀY7ÃÀº,Ä,ÃÀf:ði3ÃPö3Ã-4Ãr/Þ6à65Ãp©8ðì2Ã@X2Ã0+3Ã@Ï3àZ/Ãð¬-à×/àH2Ã`²0Ã0 8Ã3à 1ÃÐ:3Ã@Õ2Ã3ÃË5À¡+Àq3ÃP‘/ÃpJ3Ãp,8ê0Ã×3ðø0Ã!2Ã0Ì-àã-Ã,ðò1Ãé0ÃÐç+Ãàü.Ã7Ã92Ãà,ÃÀ–2Ã0%4ð-Ãpñ,Àô2Ã?1Ãp€*Ã@ç/Ã`š4à 0àN1ÃÀ´-ÃK/ði3Ã{'ÃP…1ÃÐj+Ã`50Ã`#3Ã@L4Ãp(Ã-àT0ü-Ã0®2Ã`š4à~)Ãpz+Ã@|,à 1à ±+Ãð5,Àƒ0à 2Ãð1Ãp÷+Ãõ.ÃP2*ÃÀÒ(ÃpP2ÃpP2ÃÀ¢0Ãà.àÝ.Ãð /Ãðó6À$+À•-Ã`;/Ã`)2ðæ3Ãà…-à 2à 1ÃÀ3ÃàÌ6ÃP£,ð¥)ÃP&,ðQ7Ã`S+ð"*Ãû-Àú1àH2ä5ÃPê5ð .Ã`¸/ÃÔ-Ãð5,ÃPü2Ãð4ÃðŽ2àÝ.Àâ5Ãðÿ4Ã3/Ã0[+ðo2Ã`50àB3ÃPy3À7Àô2à 0Ãæ*Ã`Ä-ÃðŽ2Ãà,Ã`#3ÃÀ„5Àú1ÃE0Ã`”5Ãp>5ü1ÃK+Ãpå.Ãà.ÃP…1àZ/À¡+ÃÐá,Ã0®2ÃpÇ3Ãð²,àZ/ÃÐL0Ãp\0À0à Ÿ.à ¥-ÃP£,Ãð¬-ÃÐR/Ã`)2ä5ÃZ3Ã@ç/Ãàê1Ã`50Ã0I.Ãð /à`.ÃÂ,ÃÀ1ÃÀŠ4ÃT4Ãð|5ÃP2Ãð#/ÃÀC+ÃÐ.5ÃP‹0ÃP-Ãpµ6Ã@d0Ã`Ê,à ™/À.Ãã1Ã@í.ÃÂ0ÃÐ@2Ãi*Ã~-À}1Ãà&(à /Ã@j/ÀÖ7Ã0®2Ãàü.ÃQ.ðø0àé,Ãð¬-ÃÀ1.Ãð²,Ã@á0Ãp(ÃP,+ð,ÃÐ44Ãð /À¡+Ã`M,Ã0U,ÃpP2à ½)ÃÐ^-ÃÀ¨/ÃÔ)À­)àN1Ãpß/Ã0À/ÃÀÒ(Ãà.À•-Ãб4ÀÐ8Ã69Ãðó6Ãpë-Ãð”1Ã`/1ð/ðo2ÃP -ÃP©+ÃP.ÃpD4Ãð¾*à +Ã`G-ðþ/à 0ÃÀ3à ‡2ÃÀœ1ÃP1Ãpå.ð-ÃÈ/Ãð1Ã],Ã?1ÃÈ/Ãàð0à65àã-ÃÀU(ð"*Ã`A.ÃP2Ã0º0à ™/ÃpÓ1Ã` 3ðþ/Àƒ0Ã0+3ÃÀœ1à ™/ÃÀ=,ÃP¯*Ã`Ð+Ãðˆ3Ãн2Ã`Ð+Ã0®2à Ÿ.Ã`A.à ½)Ã0y&Ã`)2Ã@½6Ãð”1ÃÀ3Ã0C/ð/ÃÀõ7Ã@F5Ãàê1Ãï/Ãà+Ã`50Àq3Ãàê1à ™/Ãl0Ãð¦.Ã*à`.Ãày/à&Ãï/Ã`)2À.Ãà¯&Ã0ê(À.à 1àZ/àf-ðo2ü-Ãc+Ã@j/ÃÐ44Ã3/Ãï/À•-Ã`¬1Ã@^1Ã`Ä-Ãàö/Ã`2ÃÐÉ0Ãðš0ðþ/àô?ÃPI;ÃÀÝ;Ãp>5ÃÀ~6ÀÜ6ÃÀõ7ð3ÃÐ.5ÃP/Ã@ˆ*Ãàü.ð .ÃÐR/Àƒ0ÃÐ44Ã×3À.à Ÿ.Ã`¦2Ã0ä)Ãàg2ü-À§*ü1Ã0º0Àƒ0Ãl0Ã0a*Ã0=0Ã0O-Ã@ˆ*ÃÀ´-ÃàÒ5ÃàØ4À,ÃàÞ3ÃÀŠ4Ãð2ÃÐÕ.ÃÐ.5ÃP,+ÃP -Ã0%4Ãà,Ãpñ,ÃPü2ÃP2Ãp»5ðæ3Ãpë-ÃÀ1.ÃP0ÃÐ"7à ¥-Ãpt,à 3ÃðA*Ãàs0Ãð¦.Ã@ÿ+À<'À›,Ã0O-Ãi*Ã92à þ3ÃÐX.à`.ÃÐL0ÃP…1À.Ãð#/Ã@ó-Ãû-Ãl0À.Ãc+à×/Ãàä2Ã0O-ÃN5ÃÐF1ÃÀO)Ãø'Ã{'à(À¡+Ã`_)Ü(ÃÐ:3Ãàê1ð .à ¥-àÅ2Ãð0Ãi*à 3ÃK+Ãp†)à&ÃW-Ã@d0à :*à {4Ã`6à (-ÃÂ,ð .ÃÐL0ð‡.ÃÀI*À.ðþ/Ã@Û1Ãàð0Ã@^1Ãà—*àã-Ãpn-Àú1Ã0O-ð,Ãph.ÃÐj+ÃðM(Ãà…-Ã0Ì-ÃP0Ã0À/À•-Ã0Ì-À.ðŸ*Ãàö/À,Ã`/1Ã?-ð™+ð™+Ãà—*À.Ã0À/Ã0Ò,Ã0ö&àZ/ÃÈ/Ã?-ÃP.Ã@ÿ+àã-ü1Ã`A.ÃP2*ð:&Ã`2Ãà)ð½%Ãð¸+Ãà‘+ÃÀ¨/Ãð#/Ãi*ÃPÇ&Ãpý*à;à ‡2Ã!6Ãpz+ÃàÍ!ÃP2*Ã@í.à 1Ä,à¹4à`.À /ÃÐÿ'Ãp€*Ã0O-Ã3/Ãï/ÃpP2Ãày/ÃÐÃ1à ò5Ã@í.À¿&ÃK+Ã`¾.ÃÀ=,Ê+Ã0[+Ã0Æ.ö.Þ2ÃÀ¢0Ã0ü%Ã`²0Ã!2àZ/àZ/Ã`š4Ãpn-Ã0ä)ÃE0Ã@L4Ã@^1Ã@ÿ+Ã9.ÃÐj+ÃÐç+ÃË5Ã`S+Ã0Ì-Ãã1Ãï/ÃÐF1Ãà‘+À§*À-à @)Ã@ˆ*ð .ÃÎ*à¨"À¡+Ãàm1Ã`Ð+Ãà.Ãã1ÃQ.Ãð /Ã@v-ÃÐ^-à„(Ãà.Ã0+3Ãæ*ð-Ãð2Ãà-Ãð0Ã`50Ãp\0À$+à&ü-Ãà+ÃÐF1ÃÐÉ0ÃP2*Ãà£(ÃÐp*Ã`S+ÃÔ)ÃÀ´-Ãpý*ÃðA*Ãp&Ãð2ð,ÃÀº,Ã@v-Ã0Æ.ÃÀ1.Ã0º0Ã0Æ.Ãã1Ãàö/Ã(àõ*ÃÐí*ÃðÄ)ÃÀÆ*Ãr/Ã0Æ.à ½)ÃÀÀ+Ã@ç/ÃÎ.Ø3ÃP—.ÃP>(ð4'ÃpJ3Ã@Ã5à 3ÃP0Ãà‹,Ã`;/Ãðš0Ã@^1Ã0Ì-Ãpb/à`.ÃÀU(ÃP…1ÃðŽ2ðo2ö.À§*à “0Ã`;/ÃPü2Ã3/à ½)ÃQ*ð-Ã@Û1Ãr/ÃP.Ãà‹,à&ð“,Ãpå.ÃÐç+Ã`M,Ã`Ê,à ·*ÃŒ5ðø0ÃÐL0ÃP—.ÃPü2ð“,Ã9.Ã@^1Ã@^1Ã@Û1ÃÐd,ðì2ð3Ã0%4Ãà-Ã0%4Ã012à 3àN1Ãàö/Ãx.ÃÔ-Ã@@6Ãð).Ã*àf-ÃÀ®.Ã0Ò,àÑ0Ã92Ãpý*Ãð²,ÃÀ¨/Ã@Ž)à ™/Ã`;/ÃÀ%0Ã@p.ÃP.Ã`_)Ã0º0Ã,ÃÈ/ÃP2*à ½)Ãà‹,Ãæ*Ã`Ö*ÃÀÌ)Ãð1à Ÿ.ü-Ã0º0Ãpb/ð+ÃÐÛ-Ãðˆ3à “0Ã0Ò,ÃÀ3ÃðM(Ã0ä)ÃÐ|(Ã@+ðø0ÃÂ0Ã071Ã@^1Ã@(ÃÐv)Ãð¬-Ã012Ã(ÃÀÆ*Ã0Æ.Ã9.àN1ÃÀ3à×/Ã0ð'Ã@ó-Ãàü.ÃÀ2ð-ð+à (-ÃP£,àr+ÃðÄ)Ã-ÀH%ü1à “0Ãð¦.À$+à “0Ãpb/Àƒ0ÃÐ^-ÃÐù(Ã?-ÃE,ÃÐ|(Ãà‹,Ãr/Ã×3Ã-Ã0Ø+Ã`Ê,à ™/Ãpn-ðà4Ã07à .,ÃÐp*À‰/Ã`Y*ÃÀ®.À0Ãð¸+ÃpÙ0Ã0Ø+Ã0I.àÑ0À›,ÃÀ+/Ãì)ÃPg6Ã@|,à .,Ã0I.ðŸ*ÃðÊ(Ã@ÿ+Ã`ô%ð“,Ãx.ÃW-ÃÔ)ÃpÙ0ÃÐp*Ãà—*Ãà—*Ã0[+Ão)À¹'À§*Ãc+Ãpß/Ã`;/Ö)Ãû-ÃÐÛ-Ãpz+ÃPÍ%À§*ÃÀ¨/Ãpý*Ãà…-à «,Ã*ði3ÃÀÆ*ð™+Ãpå.Ã0Ø+ÃE,Ãp'Ã@¬$ð()ÃÐp*Ã0%Ã`è'Ã],à$À³(Ãc+ÃÐó)à 0ü-ÃÐó)ð“,ÃpÇ3ÃP&,À**à L'ÃÀ1à R&à ÃЂ'à %Ã@v-ÃÀ7-Ãà )ÃÀ=,ä1à @)Ãf1Ã0Ì-ÃÐp*Ã`¾.Ã0Ò,Ãû-Ãpt,À.ÃÐ:3Ãày/Ã@|,À**ÃÂ,ÃÐ^-ÃQ*ÃÀÒ(Ãð/-àN1ÃÀ1.Ã@ÿ+ÃðS'ÃÀ"Ã'5ÃÐ@2ÃÐ@2ÃÎ*à Û$ð"*ÃÐ'Ãð_%Ã`Ä-Ãl0Ã`Y*ÃP,+ÃÀ+/Ãé0ÃÐ|(Ã&Ã`A.ÃÀÀ+ÃÀ%0Ãx.Ã0O-à 3ÃP,+ÃP8)ÃðÄ)Ã@+Ã@v-Ã`M,Ãð;+à 1Ãð0Ã!6ð¥)À$+Ã0a*ÃÐó)ÃP1Ãò(Ã@|,Ãàm1ð{0À,Ã0ê(à×/àŠ'Ãì)Ãà-ÃÚ,À6(ÃÀ=,Ö)Ã@‚+Ã@ç/ð]5ðŸ*ÃÐp*ÃðS'Ãà¯&ÃK+Ãl0Ãð0Ã'1ÃÀ%0Ã?1ÃpÁ4Ã`¬1Ã`¾.ÃPð4Ãз3ü-Ãð¦.Ãp&Ã`G-Ã`;/À¡+à (-ÃÀ=,ð-Ã`¬1ÃpD4ü-ð/ÃÀ+/à ·*ÃP.à ·*ÃÈ/àT0àÝ.ÃÂ,À-Ãà‘+ð‡.Ã0Þ*Ãpz+à R&Ãày/à 0À**ÃÀØ'ÃðÖ&À­)Ã0Ì-Ã`Ð+Ãà‘+ÃPÁ'à&ÃÐX.à ·*ÃP©+ÃÐç+ÃÐj+ÃPÍ%Ã?-ÃQ.Ã0U,À$+ð/à “0ÃW)Ãà‹,ÃP.à`.Ã0g)Ã?1ÃP&,à ±+à 4+Ã`î&Ão)Ão%Ã~-Ãì)Ã`S+à¢#Ãð¦.Ã`S+Ã`Ê,À­)Ã0Æ.ÃÀ%0ÃÀ3Ãàg2À§*Ã`50à /Ãæ*À•-Ãp÷+Ãà'ÃpP2Ãð;+ÃK+Ã@)À1Ã0Ò,Àè4ÃðS'ÃÀÞ&Ã0x;Ã0´1ê0Ãõ.Ã`k'ÃPÙ#ÃÐL0Ã@5#Ã@‚+ÃÀI*Ãpt,ÃÀœ1ÃP,+Ã`Ü)à «,Ã-0Ã5Ãp†)à 4+ðþ/àf-Ã,À‰/Ã)ÃP—.ä5à*7ÃE0Ã0´1À1Ã7ÃP2à ".Ãð#/Ã`S+ÃE,Ãàm1à Ÿ.à(ÃðÊ(ð-Ã0O-Ã`2Ãpå.ð‡.ö.àÅ2ÃPÁ'ð()À§*Ãï/Ãl0Ã@ç/Ãà‘+Ã-Ã@|,Ã`Ê,Ã0Ø+Ãf1ÃÐ@2Ãpñ,ÃÀ¢0À›,Ãc+Ã@‚+ÃÈ+Ã0s'À**Ãp€*Ã`Ö*ÃÐÛ-À.Àô2ÃP&,Ãð¾*À³(ÃÐá,Àú1Ãð/-Ãð /ð+Ã`2Ãà)ÃPµ)Ãð;+À¡+ÃÀC+Ã`â(Ãð#/Ãð1Ãp€*Ã`Ä-ð‡.Ã@v-ÃÐ@2ð‡.ÃÀ´-Ã@^1ÃP\#Ãp*Ãp )Ã?-ÃÀÒ(à ½)ÃW-ÃP£,Ã0C/Ãx.Ã-à ±+Ã0g)ÃÀ„5ÃП7Ã’4Ã@ó-à (-à “0Ãðš0Ãð;+à(ÃÀU(Ãàs0à L'à (-Ã`Ê,Ãx.Ãé0Ã0[+Ã0O-Ãà‹,Ã0g)ÃpÇ3àõ*Ã0À/À0)Ãà )Ã0ð'Ãpn-ÃÐí*àH2ÃÀ1.ÃðA*Ã0Ø+ÃP‘/à “0Ãн2àÝ.ÃÀ=,Ã`Y*Ãà'Ãpb/Ã9.ÃÀ7-ÃÀ®.Ã`2ÃpP2À6(ÃÐç+Ã@ *Ãð¾*Ã0®2Ãp\0ð .à 'Ã@v-ÃP1Ãà¯&ÃP-Ê+Ãð#/ÃpD4ðo2À‰/àZ/Ã@Ï3ÃP2Ãð 3ÃP&,Ãà—*àZ/À§*ÃðÄ)Ãæ*ð+ÃÀœ1à)Àî3Ã0C/À•-Ã0=0ÃP‘/à «,Ã-ÃÀÒ(ÃÐv)Ã0Æ.Ã`Ö*ÃÐí*à ".Ã`2à 4+À.Ã@Ï3ÃpV1ÃÐ^-Ãàm1Ã-0à Ÿ.ÃpÓ1ÃpJ3ÃP2ÃÐL0ÃÐÕ.à o6ÃP1ðE9Ã0¢4Ãðÿ4à§7ÃÀ¢0ÃÀ6ÃÀ`;ð'>ÃpÁ4À /ÃàÌ6Ã`š4Ãð‚4Ã@:7à u5Ãð|5Ã0Š8Ã`á=Ã0:Ã` 7Ãp<ÃàÌ6ÃàÆ7ÀÄ:ÃÂ0Ãàä2ÃÀf:Ã06à W:ÃÐ:3ÃГ9ÃPg6ÃÐ ;ÀY7ÃPs4Ã07Ã@:7ÃàÌ6Ã8Ãà=9Ã`ù9à;ÃP7>Ã` 7Ã7Ãã1ÀG:Àk4ÃPÒ9à­6Ã@±8ð!?ÃÐo?à <Ã`X?Ã`¬1Ã0–6à 3Ã0x;Ã`”5Ã`”5Ã0 8Ãз3Ãàs0à 6Ã0–6ÃPö3ð¶;Ã`v:ÃàU5Ã`¬1Ã0û:Ãðù5ÃÐ¥6ÃZ3Ã@F5Ãn:ÃП7ðc4ÀÜ6Ãp»5ÃPy3à$8Ãà1;Ã`d=Ã07Ãé0Ãý7Ã0l=Ãpë-à 1Àî3ÃÐ(6ÀÄ:Àâ5Ãë:Ø3à þ3Ãàs0Ã@Õ2ÃP2Ø7ÃP…1Àe5Ãàs0à 1ðø0ÃÀ3Ã3/ð?:Ã@|,ä1ð/Ã@á0ÃPä6Ã33ð+Ã`S+ÃГ9Ã@Û1ð]5ðu1Ãã1ÃP…1Ãð1ÃÐ9Ãðç8Ãñ9Ãz8ðÔ6ÃP2ÃW)Ãp\0Ã<8ê0Àî3Ã07ÃÀ2ÃÀ–2Ã0U,À-Àè4Ã0Ì-Ãàä2Ã0–6ÃPü2à {4Ã5Ã`”5Ãàa3ÃàÒ5ÃT4Ã7àé,à {4ðÔ6ÃÐí*ê0ðþ/ÃPä6ÃÈ/ð-à<4à<4ð]5Ø7ÃÐÛ-Ãà…-ê0Ãàm1à ø4Ãày/Þ6ð]5ÃàÆ7Ãp>5ÃPy3à 0ÃàØ4ð]5ÃÀ7-ÃÈ/Ã?1àÝ.Ãðˆ3Àè4à æ7ê0Ã@Ï3Ãð4Ãàð0à 3Ãð1àH2À‰/ÃÎ.à “0Ãð4Ã0º0ÃÀ®.Ã?-ÃpÇ3Ãàg2Ã@v-ÃÀ–2ó9Ãàa3ÃPØ8à*7ÃŒ5à ø4À7ÃPä6à ™/Ã’4ÃN5à 0Àk4Ãð2Ã@Û1Ãõ.à 4+ÃÂ,Ãp>5à 3Ãð4Ãð 3ÃpD4Ãp\0ÃÐ(6Ã@F5Ã071Ãàü.Ã`/1ÃÈ/ÃàÞ3Ã@@6Ã` 3Ãpß/Ãн2Ã07Ãt9Ãp :ÃPU9ÃPö3Ã@@6Ã` 7Ã` 7Ã`)2Ã÷8à*7ÃЫ5Ãз3Ãðù5ÃÀï8Ãà%=Ãàº9à‰<Ã`‚8Ã` 7Ã06Ã`š4à c8Ãà[4à ‡2à u5à :à :Ã<8Ãз3ÃÀŠ4ÃàO6ÃË5à06Ã`š4ù8à06Ã!2Ãðó6Ãàð0à :À¸<à ]9Ã0¨3à {4Ãàs0ÃPü2Ã`v:à­6ÃPm5Ãp27Ãõ.Ã`Ž6Ã8à {4ÃÀ¨/ÃÀl9Ã` 3à¡8Ã0–6ðK8ÃГ9Ã07ÃPm5Ø3Ã`5ÃÀï8Ãp¯7ðK8à¹4ðÈ8à c8Ã`‚8Ã@";Ã7ÃË5ÃÐ:3Àî3É@ÃÐ:ÃpD4ðK8àË1Ã4à Ú9ÃÐF1ÃÐÃ1ê0Ã8Àq3à o6Þ6ðÈ8ÃP.Ãð4Ã@p.Ãt9à9Ãp£9Ãp‘<à65Ãðó6à W:à¡8ÀÜ6Ãàa3Ã`)2à 1ÃÀ~6ÃpÁ4Ã@á0à65Ãàg2Ã33à c8Ã`ˆ7ð/ÃàÌ6ÀM9ÃÀ~6Ãt9Ãàs0ðQ7à 6Ã`ˆ7Ã`”5Ãàa3Ã@É4à ¥-Ã@X2ÃK/Ã0´1Ãp,8à i7ÃÐ9Ã9ðÈ8ÃŒ5ÃÀx7Ã33Ãp86à Ô:Ã@½6ÃÐç+Ã`#3Ãp¯7ÃÑ4Ã@F5àË1à ‡2Ãp:Ã5ÃÐ"7Àú1Ãð 3Ã`5ðà4Ã÷8ÃÝ2Ãàð0ÃP[8ÃP‘/ÃpÍ2à ".Ãpn-ðQ7Ã’8à 1À_6ÃÐ.5ÃÀ1ä5ÃN5ÃÐ@2Ãã1à 1ÃÐF1Ã`¦2Ã0¢4à<4ÃP‘/Ã-4àÅ2Ãàð0Ã@^1ÀY7Ã7ðE9Ãàê1Ãð 3Ã8Ã0:Ã@^1ÀS8Ã@+Ã@ç/à<4Ã`#3ÃÐá,Ãð‚4Ãpß/Ã`4ð{0Ãðp7ÃPü2Ãl0Ã0À/ÃÐR/ðc4Ãàä2à¿3ÃPa7ð{0Ã`4Ãàð0Ã’4ÃÅ6àÑ0ÃÀ~6à$8ÃÐ¥6ÃpJ3Ã0–6Àî3àf-àB3Ã0œ5Ãp—;Ã`5Ãpz+Ã@L4Ãàg2Ãðˆ3Àq3à¹4Ã4Ã<8Ã`¬1Ãàº9Ã`š4ÃÀœ1ÃÐR/ðo2ê0ÃP‹0À}1Ã'5ÃPö3ÃÐd,à­6Ãð‚4àÑ0Ãàê1ÃN5à o6ÃP…1Þ6ÃPê5Ãн2Ãн2à 1Ã@ù,Ãà[4ÀÊ9ð]5ÃÀŠ4ÃÀû6ÃPÞ7Ã?-àÅ2Ãð¬-Ãðˆ3ÃÐX.à {4ÃpV1ÃÀr8Ãð/-Ã?1Þ2ÃpÙ0ê4ÃàI7ÃP[8Ã0~:ÃàØ4ÃÐ¥6ÃÐ.5ðo2Ã`”5à³5ð{0ÃàI7ÃÀr8Ãf1Ãé0À0ÃP.Àk4ÃPê5Ã0Š8ð?:ÃÀr8ÃPm5Ã0U,à 0Ãï/ÃðÐ'À**Ã@ *Ã0U,Ãpt,Ãð1Ã` 3Ã0º0Ã`2à 0ÃÀœ1Ã0O-Ãðˆ3Ãðÿ4à`.Ã0–6Ã` 3Ãã1Ã`;/Ãph.Ãpt,Ã`¬1Ã0À/Ã@:7Ã@48Ã`Ê,ÃP£,ÃÐX.ÃPð4ÃÂ0ð“,Ã-Ã0+3Ã3ð/Ã`;/ð,Ã`#3Ã0l=ÃÐ.5ÃÀ7-àB3ÃàÞ3Ãðí7à<4Ãð2Ãf1Ãðv6Ãl0Ã0À/ðø0Ã`4Ãà…-ÃÐ.5Ã`)2à<4àr+Ã@)à 4+Ã@p.Àw2ÃK/Ãp÷+Ãàê1ÃÔ-ðu1ÃðŽ2àé,àH2Ã`2ðu1À-Àâ5Àâ5ÃP&,Àq3ÃP‹0à 2Ãн2ä5ÀÖ7Ãð‚4Ã0À/ö2à­6Ã0´1Àî3à¿3ÃÀ¢0ð-ðø0ÃÀ+/àZ/à Ÿ.Ã0Æ.Ãð#/ÃÐ@2à³5Ã’4ÃÐ@2à$8ÃðŽ2àH2à¿3ÃÂ0Ãðù5à<4ðþ/à ±+ÃP2Ãpn-ðÔ6Ãð1Ãp\0Þ2ð"*Ã!2ÃÐ^-à “0Ãàü.ÃP0Ãàð0ðc4Ã×3Ã`¦2À_6Ãr/ÃÀº,ðc4ÃÎ.ÃÂ,Ãб4Ã`¸/Ãð1Ãà.Ã’4ÃŒ5ÃÈ/ÃàÞ3Ãàê1Ã@Û1ÃÐ:3ðò1ÃÐ@2Ãà.Àƒ0Ãà‹,Ã`;/ð-ðu1Ãàg2Àú1ÃP&,ÃÐ^-Ã`Ä-Àè4Ã'1Ãàö/à ø4ÃÎ*ÃÀ´-ÃpP2ÀÖ7Ãб4Ãé0àË1ÃP0Ã`50ÀÖ7ÃÀ„5Ã×3ð™+Ã071Ã`Ê,Ãf1Ã×3ð/ÃÐÛ-à 2Ã`ÿ8ÃÐÕ.ÃPs4Ãðù5Ã`²0Àk4Ãð2Ãð0ÿ7ÃàØ4à¿3ÃÂ,Ãà[4Ãà…-à<4Ã0%4Ã3/à u5Ãàä2ÃPy3Ãp©8àÑ0à .,ÃÐ:3Ã@í.ÃÐp*Ã`4À›,Ãðp7Ã`Ž6ÃÀ1.Ã7à ‡2ð-ð-Ã@É4ü-Ã`A.Ãý7Ãà*ÃE,ÃÀû6Ä,àé,Ã0Æ.ÃÀ1àN1Ãc+ÃP0Ã`¾.ÃPa7À}1Ã0ê(Ã3à~)ð/ÃP&,ð™+Ãð¸+Ã0a*Ãpë-Àô2Ãph.ÃÀ„5Àú1ð-Ã071ÃpÓ1ÃW-ÃÐÿ'Ãàm1à 1àH2Ã@L4Ãðˆ3Ã`2ÃÀ3Ãð0Ãr/Ãpn-Ã` 3Àk4Ã`)2ÃÈ/Ã071Ãpñ,Ãð /Ã`50ÃÐL0Ã0À/àé,À}1Ãð‚4ð/ÃÐ^-Ã@X2ÃZ3À.Ã` 3Ê+ÃÐá,Ãpt,À0ÃÐÉ0àH2àé,Ãpb/Ã`5ð-ÃÐR/ÃP2à*7àZ/Ãðˆ3ÃQ.ÃÂ,Ãp\0ð/Ã0O-ÃÀ3à<4à 1Ã@ù,À0ÃÐ.5Ã@í.ÃPÆ;Ã`Ž6ÃÐd,àZ/àr+ÃÐj+Ãð;+Ãã1Ã`2Ã!2À}1ÃÀ1à 1ÃÀä%À0Ãã1à 1ÃÐR/Ã0a*Ã0º0ÃÀ–2ÃÀ+/Ãà)ÃE,À.Ãàg2Ã-0ÃÐÕ.ÃÂ0Ã×3àÑ0Ãû-ÃÐL0Ãð¸+Ã@d0Ãx.Ãàä2ÃÚ,Ã0Ì-Ãpß/Ãðš0ðò1ÃÐ:3ÃP/ÃpÁ4ÃP2ð .à ¥-Ãpë-ÃÀ1.ð3Ã-0Ãp )à 1ä1Ã`)2àf-Ãõ.ÃÀ 4ÃàØ4Æ6Ãû-ä5Ãð¸+Ã`ˆ7Ã9ÃàÌ6À}1à 3Ãð#/à¹4Ãõ.Ã`2Ãà.Ã05à ø4Ãf1Ø7àN1Ã@j/Ã9ÃV>à³5ÃPê5Àk4àN1Ã0Æ.Ãð¬-Ã@ç/ÃÐ:3Ãpµ6Þ2Ã33ÃÀ„5Ã`¾.Ãðš0à o6Ãp\0Ãð4À,Ã3Ã0®2ÃPs4ÃðG)ð]5Ã0´1ð/ÃPð4ÃÐF1Ãðš0à ".à +ÃÀ2ð“,Ãà.ÃÅ6ÃðŽ2à ™/Ãðš0ÃÀÆ*À‰/à ¥-ÃÀ~6à 6Ã@p.Ã!2Ã0O-Ã@á0Ãз3Ãàg2ÃQ.ÃÀ®.Ã@R3Ã-4ÃpÇ3ÃÐÛ-àË1Ãpn-Ã` 3ÃPa7ÃpÍ2ÃK+ÃP2Ãðù5Ãp©8àÑ0àr+à ì6ä1Ã`G-ÃPy3ÃpÓ1Ã@X2ÃpÙ0ÃPs4ð3Ã@p.Ã0I.Ã0+3Àq3À}1ö.Ãr/Ã0Ø+Ã-0À}1Ã`Ê,ÃÐX.Ãðù5Ã` 3Ã`G-ÃP1Ã?1ÃpV1ÃÐ@2À7à i7Àî3à 3à 1ðE9Ãl0à 1Ãð).ÃðA*ðQ7Àq3Ãï/Ã0+3Ã0À/Ãà.ÃÐÃ1ð/Ã`A.àÑ0Ãpµ6ÃpP2Ã7à ™/ÃP2à ‡2Àú1ÃÐd,ÃP -à /ÃÀ5à65àË1Ãðù5à 2ÃÐ"7Ãð /ÃÐÕ.Ã@L4àB3ä1Ãõ.ÃðŽ2Ã0%4àË1Ãã1Ãf1Ãàð0Ã` 3Ãð2ÃPê5Ãð 3Ãæ*Ã`A.Ã@ÿ+Ã`#3Ã0¢4Ã@Ã5Ã`5à³5ÃPÆ;ÃP–CðAÃp?À¬>Ã`ˆ7ä5ÀS8Ãз3Ãðp7à ø4àf-ÃÎ*ÃÀC+Ãð”1ÃT4Ã06Ã`5ÃPg6ðÈ8Ãð”1ÃÎ.ð-Ã@Û1ÃÀ3Ã@Õ2ÃÀ 4Àk4ÃÐX.Ã`#3à ‡2Ã`5Ãp,8Ã@X2àH2Ã` 7Ã0´1ÃPg6À•-Àw2ÃpJ3Ãày/Ãð 3Ã’4Ãð2ÃpÙ0ÃàÞ3À¡+ÃK/à³5Ã0¨3Ãðí7ÃàÞ3Ã@á0Ã@X2ÃàÞ3À.à65ðu1à u5ÃÐ9Ã0¢4Ãð1à­6ÃàÞ3ðþ/ÃPê5ÃPg6ÃÀ~6Ã`ó:ðø0Æ6ðà4Ã0º0à­6àÅ2ÃàI7ðÈ8ÃàO6Ãpë-Ã0´1ÃÀ3à06à ‡2ÃpÇ3Ãð#/Ã’4ðK8ÃÐ44Ãà[4Ãàð0Ã@R3ð3ðc4àN1Ã@";ðE9Ã@(:à:à ì6Ã@·7Ãé0ÃÅ6Ã5à 6ÃpÓ1Ã`)2ÃÀr8ÿ7ÃPÌ:ä1ÀÐ8Ã4ÃpÙ0àB3à c8Ã`Ž6ÃÐ:Ã÷8Ã`#3Ã0Š8Ã69ÃPÒ9ÃPØ8àË1àÝ.Ã'5ÃT4Ãн2à:Ã`ó:Ãð4Ã0®2à§7Ã7Ãp<Ãðó6ù8Ã<8ði3ÃPö3Ã9ÀÜ6ÃÅ6ÃT4Ã4Ãà.ð‡.ÃÀ¨/ðW6ÃpP2ÃT4Ãpz+Àe5ÃÀN>ÃT4ðc4ÃPÌ:Ã05Ãàº9Ã0Š8Ã0U,ÃÀ~6à 3à65ÃŒ5ðÔ6Ãz8ÃГ9ÃЇ;ÃpD4Ã@Õ2Ãðí7ÃГ9ÃpP2Ãt9ðÎ7à 1Ã`ÿ8Ãà%=ðò1à ø4Ã'1Ã0–6ÃÐ.5à þ3àN1à o6ÃÀ„5ðÔ6Ã@48ð9;Ã0¢4ÃÀ„5ÃpÁ4à§7ÃpV1à¹4À_6Ãp:Ãð”1Ã92ÃàÀ8Ã69à É'ðì2à ì6Ãà.à 2Ã@d0à “0ê4ÃAÃ0+3Ãн2Ã’4ÃZ3ðc4ÃÀ¢0Ã0–6Ã`4Ã@í.à ™/ÃÀŠ4ÃÐÉ0Ã!2ÃP1À.Ã0®2Ã'5Ã`6À_6Ã05Ãðš0ÃP2àN1Ã@F5ÃÀ„5ÃpÓ1ðu1ÃP1ÃÐ:3Àk4Ã0–6à “0ÃÐÃ1à×/Ã3Ã'1ÀY7Ãðç8ðà4ÃÐF1ÃÀ 4ÃpP2ÃpP2Ãl0Ã`50Ãf1ÃÐÕ.Ãð4Ãàê1Ãà¨<ÃPÌ:ð]5Ã7Ãz8ÃPg6Ãð²,ÃÂ0Ãð¦.Ã'1ÃÀ3à 3Ã`G-Ã'1Ãé0ÃT4À0Ã@^1ðò1ÃP2ÃÀ5Ã0´1ð+Ãà.Ãðv6ÃÐ.5à¹4Àw2Ãð¬-Þ2ÃÐ^-ÃpÙ0Ãpå.Ã`¬1Ãн2Àk4ÃÐ ;Ã`Ž6Ã-0Ãp©8ÃÑ4ÃPü2à­6Ã`¸/Àî3Ã0¨3à /ÃK/Ãàs0ð{0ÃÐ:3ÀY7ð{0ÃàÒ5À›,Ã'1Ã*Ãàä2ði3à (-Ãû-ÃPü2ÃÀ~6Ã@Ï3Ãà…-àé,à (-Àƒ0ÃÑ4Ã`#3À•-Ã@ç/ÃE0ð .Ã071Ãð2Àâ5ÃÀ5Ã@Õ2ÃÀ7-ÃÐ@2Ã3/ÃÐ:3Ãàa3ÃÀ~6ÃPü2Ãðó6Ã5Ã-ð/Ã0®2ÃÐÉ0Ãõ.ÃðÜ%Ãð#/àõ*Ãpß/Ãï/Ãr/Ã@X2ÃP2ÃÀº,Ãàa3ÃÔ-àÅ2ÃÐí*ÃÝ2Ã~-ÃpÙ0Ã`Ä-ÃÀœ1ðo2àT0Ã0º0Ãн2Ãð1Ãf1Ãë:Ãpt,Ãl0Ã@ù,à`.àÅ2àË1Ã@Ž)ÃÀ¨/Ã5ÃÐ@2ÃÐ:Ã’8à 3Ã@í.Ã`)2ö2ÃP1àT0ð‡.ÃÐ44Ãð/-ÃpÙ0àÑ0ÃÐ:Ã` 7ð/Ã`)2à «,ð¥)à 2àr+Ãð²,ði3ÃZ3à þ3ÃÀ5Àè4ÃÀ=,ÃðS'Ãpt,ÃpÓ1ÃÀ1Ã`2ÃÀœ1Ãðí7ÃÐX.Ãc'ÃPÁ'Ã`¦2Ã?1Ã@Õ2ðE9Ê+ÃÈ/ê0ö.ÃЫ5Ã0O-à ™/ä1Æ6Ãl0Ãð /Ã3Ãpå.ð“,ð/à .,Ãp\0ÃÐÕ.Ãà…-ÃE0Ãðù5Ã` 7à (-ÃPð4Ãà.ð/àl,ÃŒ5Ã7ÃÐÉ0ÃPa7Ã`2Ã@Õ2ÃÂ,Ãpå.à<4à9ÃP2ðì2ÃÐ(6Ãð|5Ã0´1Ãð‚4àï+Ã0+3à ø4ÃË5Ãð 3ÃP0Ãðv6à u5ÃÐÏ/ð-ð‡.à¡8ÃP[8ÃÝ2à:Ãðv6ÃÐ.5à•:ÃÐ.5à ò5ð™+ÃpJ3Ãàð0ÃÂ0Ãf1Ã0œ5ÃðÕ;ÃpÓ1à ".Ã’4Ã×3Ã@@6Ã`6ÃPü2Ã@F5ÃPU9ðÂ9ÃÀÑ=Ã@";Ãß<ÃÐ:Ãh;à c8Ã0TAÃà%=Ã0ã>ð?:ÃPÌ:ÃÐ<Ã@@6Ãp?ÃÐo?Ã`·DÃ0NBÃDAàeBÃP~Gð¤>Ãà+<ðŒBà EÃDAÃôCÃð:@ÃPBÃÐQDÃÙ=à ªAðÙJÃpÒFÃ0ÑAÃÀH?ÃÀÃ@ ?À DÃð HÀˆDÃ`±EÃð±AÃ0f>ÃÀ6BÃ}BÃPxHÃ@!Pà}>ÃàrEÃ2DÃ@oCûBÃ0HCÃqDÃÀ•GÃ`·DÃ@‡?Ã?Ã`:DÃÐÚBà Ú9à @ÃÐ]BÃ`(GÃð.BÃpy@ÃÐø=ÃÐu>ÃôCÃ0Ý?ðÓKÃ@‡?Ãb@Ãàœ>ÃpgCÃÀN>à_CÀM9Ãp<ÃPDÃà„BÃ`|9Ãp&9Ãð^:ÃÐò>ÃÀ¿@á<Ã@=Ãpy@Ãh?Ã0×@ÃÀf:ÃÓ>ÃÐWCÀ”Bà ¶?Ã0õ;ÃÀf:à Â=Ã@iDÃÐàAÃP==à @ð CÃ`ç<Ãà>àeBÃ=Ã0ÅCà FÃàBà Î;Ã0„9ðž?à=À¦?Ã`ÿ8Ã`¥GÃà AðDÃîDÃÐæ@Ã@uBàw?É@à;ÃPÌ:Û=Ã@>á<ÃwCÃPÀ<ÃÐo?ÃÙ=Ã`í;ÃÀ¿@Ãp—;ð!?ÃðL=ÀBÃpy@ÃÐo?à ¶?ÃÐu>ÃúBÃ@@Ãb@à 9?ÃP1?ÃpgCÃ`|9à ?>à ’EÃðÃ>ÃPº=ÀCÃÀ¹AÃ@<Ã0×@í:à:ÃPU9Ãà%=Ã`p;ÃP[8À_6Ã0ËBÃp?ÃpOGÀÄ:Ãp=Ãb@Ã`|9ÃP¢Að¶;ðÂ9Ãp‹=à 'BÃP==ÃÀl9ð’AÃå?Ãà>Ãt=à 9?Ãp—;ÃÀ`;à:àw?ÃP´>Ã0x;Ã@‡?ÃàŠAÃ`í;ÃV>ÃŒ9Ã0~:ÃÐ:à$8ÀA;Õ>Ã@{AÃPBà‰<Ã@‡?Ãð:@Ã`Û>ðÈ8à Â=Ãß<ÀG:Ãà%=Ã`d=Ãp:Ã`Û>ÃÀ¹AÃ0é=Ã`j<ÃP7>Ãð:@á<ð¶;Ãp…>Ã`í;Ã`á=Ãå;Ãðd9Ãð^:Ãp86ÃÀ¿@Ã07ÃPa7Æ:ÃÀ×<Ãp<À7Ã07ÃÐø=ÃÀÅ?Ã0x;Ãð@?Ãðá9Ã0l=ÃÐ8ó9ÃPÀ<Ã0x;ÃPO:à•:Ãp=Ã`ç<ù8ÃÐ<à§7Ãð4AÃÀã:ÀÊ9ÃPI;ÃPÌ:Ã`d=Ãà¢=ÃPO:Ãt9àeBÃ`Ï@Ã@.9ÃГ9Ãð.Bà !CÃàº9Ãp,8Ã09à @à:à Â=À¬>Ã`‚8ÃÀf:ÃÐ:ÃàÌ6Ãpµ6Ãðù5Ãp,8Ãn:ð¼:ÃPC<Ãå;à -AÃp;ÃPC<ÃЫ5Ãðç8Ã@«9ÀG:Ã0x;ó9Ãðù5ÃàC8à¿3Þ2à ?>Ãp<Ãp‘<Ã*;Ãà¢=à;Ã*;Ãb<Ãz<Ãt=ÃÓ>ÃÀõ7ÃÐKEÃÀH?Ãñ9Ã09Ã` 3ÃðX;ÃðÃ>À5=ÀÄ:Ã`5à Î;Ãà–?Ã` 7Ãß<Ã`FBð¤>ÃàÆ7Ã3Ã0:ðÂ9ð¼:ÃÐ9Ãp£9ÀÜ6Ãð2ÃPm5Ã0Š8Ã$<ðž?Ãp>ÃN5Ãp\0ÃÀl9ðÔ6Ã’8à*7Ã`8Ã0û:Ã'5ÃÀû6ÃÀ6ÀÜ6Ã`š4à 6Ãðj8í:à¡8ÃP¨@ÃÀï8àT0ÃÐ:ÃÀé9Ã5ÃÐ@2à;à9ðc4ÃÈ/Ãý7Ãñ9À7ÀS8ÃГ9Àô2ÃPm5ÃÐ¥6ÃÐ9ÀÜ6àH2Ã0œ5ÃÅ6Ãp>5Ãð‚4ÃpD4à:Ã`Û>Ã@.9ÃÀû6Ã7À¸<ÀA;Ã@@ÃP´>ÃЇ;à ø4Ã0l=ÃPØ8Ãp86àH2à Î;Ãñ9ÃP[8à o6Ã0:ÃÀ¿@Ã0õ;à$8à9ÃPs4ðK8Ã@<ÀÊ9à ]9Ãp‘<Ãàa3ù8Ãå;Ã`#3ä1ðo2à§7à;ðE9ÃðÉ=Ãñ9ðª=ÃPÒ9Ã0¨3ÃЇ;ðæ3ÃðÛ:Ã0 8Ã0–6Ã@Õ2ó9Ã`j<Ã0:à­6ðÈ8ÃÀT=Ã0ã>Ã@¥:Ãðd9Ã0%4ðQ7Ãðj8ÃPg6ÃPØ8Ãð1Ãàa3É@À¾;Ã@«9ÃÀf:Ãðù5Ã05Ãb<ÃÀr8ÃÀr8Ã0:Ã`^>Ã`‚8Þ6ÃÐ.5Ã?1ÃÀŠ4ðÈ8àƒ=Ãï/àZ/Ãp :Ãà+<ÃÀÅ?àB3à c8Ãp¯7Ã`ˆ7ÃB7Ã05Ãp27Ãàº9ÃÐ"7ðE9à­6ðc4ÃH6ÃPC<ð'>Ã`ó:Ã@½6ÃðÛ:ÃàU5à æ7Àâ5ÃP…1Þ2ÃàÌ6Ã0`?ðì2Ãàm1Ã`¦2Ãðç8Ãp>5Ã0–6Ã÷<Ã@«9Ã@½6ÃÀf:ðW6ÀÊ9ÃÐ"7Ã0Z@Ã@¥:Ã`‚8Ãð^:Ãp&9ÃЫ5ÃÀ5Ãð^:Ã`í;ÃP[8Ã$<Ã@«9Ã`”5à¡8ÃÀ¨/ü1ÃPö3Ã@<à c8ÃpÙ0àƒ=ÃàC8Ã@R3Ãn:Ãб4ÃÎ*Ã0%4Ã`p;Ã`ˆ7Ã`‚8Ã`6ÃÀ3Ã`Ž6ÃPä6Ãà–?ÃŒ9ÃàÆ7à 6à 2Ã`ˆ7Ãn:Ãpµ6Ãз3Ã7Ãðj8ÃÀ 4ÃÀé9Ã`2ÃÀl9Ã@Û1ÃpÍ2à65Ã@Õ2ðÎ7ÃH6ÃPä6Ã@¥:ðo2ù8ÀG:à ò5ð3Ãà[4Ã!6ði3Ãð‚4Ã@@Ãp>5Ãðç8ÃÀf:Ãý7à65Ãðá9Ã@>Ãðv6Ãpn-Ãð0à*7Ã'1Ã@F5ä5ÃÂ0Þ2Ãðó6Ã`#3Ã`”5ðo2Ãð^:à›9ÃÐ"7ÃPð4Ãà=9à­6Ã07à06Ãà=9Ã7Ãz8ü1Ã` 7À}1à ".Ãp>5Ã0¢4à o6Ãð /Ã0º0ÃpP2ÃÀ2Ã!6ÃH6Ã@48Ã5Ã!6Ãðp7Ã09ÃÝ2ÃP1Ã`”5à ‡2Ã0Æ.Ã×3Ãð4ðW6à u5Æ6À;à65Ã3/ÃÀŠ4Ã0~:Ø7ðc4ð{0Àè4à 2Ã071àB3ÃàÒ5ÃÀ 4à 3ÃT4Ãàm1Ãp86ÃÀr8Ãб4ðE9ÃÀõ7Ãp27ðø0Ã!2Ã?1à þ3ÃГ9Ã@·7Ã0 8ÃÐL0ÃH6ðÔ6Ã`Ž6ðà4ÃÐ(6Ã@X2À_6ÃàÒ5à u5Ã0–6ðø0à ø4ÃpD4ðo2Ãp86Ãð¬-Ã09ð3ÃË5à§7À}1ÃH6ÃÀ~6ÃàÌ6ÃÐÛ-Ã0~:Ãðá9à¡8ÃpP2ðÈ8à<4Ã`¬1à 1Ã`‚8ÃPg6ð]5Ã`ÿ8Ã0 8Ã×3ö2Ãà=9Ã69Ã`š4ÃPö3ð]5ÃÀ„5ÃÀ6Ã@¥:ÃÀõ7Ã`Ž6ÃàU5ÃàÒ5à þ3Ãз3Ã`ó:Ãp&9ÃàØ4Ã69Ãp?ðK8ðæ3Ã@±8àõ*Ãð/-Ã0º0Ã`²0ÃP1ÃàC8Ãð1Ãð‚4Ãz8ÀS8à9ÃÑ4ðÔ6ÃZ3Ãé0Þ2ÃÐ:3ÃP1Ã0–6Ã?1ÃÐ:3Ãàa3ðo2Ã@ç/ðW6Àk4ÃÑ4À‰/ÃZ3ði3à 6Ãpn-ÃàU5Ã’4à¹4Ã071ÃÐ44Ãà[4ÃÀ3Àâ5Àe5ÃÀ3Ã` 7àB3À.Ã`)2Ã@Ï3Ã8Ãàü.ÃP1ÃpP2ÃÀ2ðu1Ã@Û1Ãàg2Ãð4ÃPü2ÃN5Ãð0Ã0+3Ãð‚4ÃÐÉ0Ã0À/Ãðí7ÃÀû6ê4ÃÀ6ä1Àƒ0ðo2ÃPê5Ãã1ÃÀ®.ÃÀû6Ã0%4ÃàØ4àT0ÃPs4ð9;ÃÐ:Ã05ÃB7ÃPa7ÃàÌ6ÃPI;Ã@“=Ã0„9Ã`d=ûBàw?Ãð@?ð˜@Ã`ÉAà$8à u5ÃP®?Ã`^>Ã@@ûBà ¤BÃàZIÃP1?Ã`ÃBà °@Ã`·DàYDÃ,EÃ8GÃàûCûBÃ0¿Dð€DÃ0§HÃ0qQÀùFÃèEÀ^KÃb@ÃÐ<Ã0BDÃ`KÃàÑJÃÓBà5JÃÀHÃ@àEÃ@ÈIÃИMÀRMÃ@æDà¸IÃPõHð,RÃàÑJÀpHÃÖHÃÀƒJÃÐ3IÃgPðÓKÃÞQÃИMÃð°VàùSà ñJðÇMÃà*QÃ0›JÃðæMÃp=JÃP³SÃ`MÃÀÐRÚRÀ·QÃÀGTÃÐ PÃ0ôPÃPZMÃÐNÃ0_TàvTÃgTà 2UÃÀ_PÃyQÀ“WðVÃäPà^XÃð[à ¯UÃCZÃàÜ]àíUàóTÀŸUÃ@’Rà ÁRÃ@Uð—Uð…XÃPXÃíYà ‘Zú[ÃmSÃ0qQÃ@†TÃŽTÃÒWÃ@ñWàùSÃð3VÃð’[ÃPWÃÐzRÃ@ªNà YÃ`¼XÃ@÷VÃÀ²WÃP ZÃ]ÃpõUÃ@>`Ã`¤\à ‹[ÃàwYÃð¼TÃ0)]Ã^\Ã%[ÃÐ8]ÃàƒWÀi^ðYÃл\Ã`¼XàXYÃе]À‡YÃêSÃpfXÀì]ÃpË\Ã@nXÃ`ª[à [cÃ`-[à:^à XàÉ[à.`Ã0‚cÃ`'\àXYðTÃðªWÃàXÃ@ñWÃP[Ãá[ÀWaàÃ\à YÃ@ TÃPú\à \ÃÐ2^ÃÀ/XÃ0²[Ã0¾YÃÐ\WÀu\ÃÒWÃÐ\WÃÀ¾Uà XÃ@÷VÃÀZÃ`?XÃpûTðVÃàXÃ0ÐVàÕYÃÀ‚_ÀWÀ‡YÃ@nXà ÁRÃ`QUÃpÝYÀþZÃ^Ãp`YÃÀ/XÀ¥TÀ¥TÃ0YUðYÃ=WÀWÃàqZà ZÃp¿^ðm\ÃP[ÃVÃ@UÃ=WÃ`ÂWà XÃÐtSð‘VÃ`WTÃÐVXÃp`YðUÃp`YÃðZÃÀ5WÃðÈRÃ`àRÀZà _ÃUWà >SÃ`àRÃ@ýUÃðªWÃÆYÃ|WôXÃ[VÃpQàÛXÃP\ÃðZà 8TÃ@ëXÃ@ëXÃÀâOÃ0‰MÃÐnTàáWÃÞUÔSÃЀQÃð°VÃ0;ZÃ05[ÃÐñSÃPBQÃ@†TÃðRÃàTÃ0YUÃ@SÃ@RÃP×MÃÐŒOÃÆUÃP\Ãà•TÃàúXð…XÃ`øNÃà VÃ0kRÃŽTÃpQÃmSðVÃpYÃŽTÃ`ÔTÃ@†TÃà§Qà &WÃ@÷VÃ`æQÃaQÃ@QÃÀÜPà ¯UÃ`WTÃ`ÔTÃðÚOÃÐOÃðÚOÃà§QÃà¡RÃà³OÃüPÃP§UàOàùSÃ`iQÃ@ýUîYÃ`ÈVÃpéWÃÐ’NÃLÃð-Wà ÍPÃ`iQÃêOÃgPÃmOÃðàNà DRÃÐnTÃŽTÃ`{NÃpxUÃ`òOÃäPÃÐMÃ0kRÃ@¤OÃÐNðJMÃpPÔSÃP›WðTÃ`KÃà³OÃÀôLÃàƒWæPð8PÃðÂSÃP×MÀ·QÃ0 MÃKÃ0›JËJÃð¼TÃLÃðÚOÃðàNÃàBMÃ0 MÃ/OÃ0kRøMÃ0NÃIÃÐ3IÃ`ŸHÃà×IÃ0KÃöMÃpPÃð9UÃÀîMÃжHà ÷IÃÀ_Pà hLðÓKÃÖHÃpÒFÑIà tJÃаIÃ@!PæPÃðWPÃ@ÂJÃÐMÃàNKÀçI×HÃALÀRMÀÛKÃ`JÃð]OðµPÃ`ÚSÃsNÃ@-NÃ`ŸHÃ`oPÃðFÃ00GÃÐEFÃpºJÃ0}Oà¦LÃИMÃðæMà ÓOÃðcNÔSÃP`LÃð{JðåHÀÿEËJÃ@EJÃ` LÃÀúKÃÐŒOÃà¹NÃpºJà MÃPfKÃÀúKÃp®LÃ@QHÃðøJÃHÃàÅLÃÐ3IÀEãFÃ8GÃp¨MÃ@ÔGÃpÞDÃ…OÃÐWCÃPãKÃüLÃ@¶LÀvGÃÐàAÃ`±EÃ`FBÃGÃkEÃÀ0CÃÐ'KÀùFÃàõDéEÃðEÃ0$IÃðòKÃÐEFðhHÃ@‡?ÃP~GÃ`ÃBÃPCÃüLÃà×Ið!?ðýDðÙJÃÁEÃpgCÃ0×@à FÃ@æDÕ>ÃP1?à €HÀ|FÃpUFÃ>FÃpmBà <ÃжHÃð«BÃPBÃжHÃÀ}KÃSIàGGÃ@ÎHð†CÃ@{AÃðFÃà`HÃðIÃ0¿DÃÁAÃpÌGÃ@ÚFÀvGÃÐÈEàkAÃ`R@ÃBÀ @ÃÀÅ?Ã@QHÃDEÃP¢AÃÀN>Ã`±EÃ@ÔGÃàfGÃ@iDÃà–?Ãß<Ã@uBðDÃñ=ÃÀH?ðzEà @à !CÃÀFÃ\=Ãà~CÃÐi@ÃÐ{=Ã,EÃàŠAÃP`LÃð¥Cð?:ÃÀã:àq@Ã`.FÃÀl9Ã?àô?Ãà>ÀBÃÐKEÃð(Cð÷EÃ0Ý?ÃpðAÃà´:à Î;ÃðÉ=Ã@@Ãà~Cð°<Ã0×@Ãb@àú>Ã0f>Ã@]FÃpsAð'>ÃAÃJDðª=ÃPa7ÃAÃÀ­Cà>ÃÍ?Ã0ËBÃð«BÀ¦?ÃPU9Ãà Aàƒ=àkAÃP?ÃÐWCÃ@iDÃPBÃpaDÀ @À/>Ã`p;à‰<Ãp‹=Õ>ÃÀ§DÃP EÀ”BÃ`^>À²=ÀˆDÃ@cEÃ`ÉAàeBð¤>Ãà@Ãp¯7Ãp—;ðDÃpaDÃ`p;ù8Ã*;à E=ÃPDÃP+@ÃÀ`;ÃÀB@Ã`@Cà ¶?Ã`½CÃP¨@Ã0×@Ã0é=Ã0„9ÃÓBÃ&FÃP Eðž?Ã@“=Ãp[EÃ0TAð’AÃ@{AÃ`X?Ãà®;Ãà@ÃpØEÃ÷8Ãð¥Cð@Ãð½?ÃÀÅ?ÃàŠAðÂ9ð CàkAÃ\=Ãp :ÃP1?Ãðv6Ã`FBÃP®?ÃÀN>à °@Ãà¨<Ã`Õ?ðAÃÀÅ?ÃP–CÃ\=ÃðÏ<À;<ÃP1?Ã÷<ÃÐæ@ÃÐÚBÃÐ]BÃðL=Ã`ÃBÃÀÑ=Õ>à=à<4Ãå;ÃàC8àèAÃð·@à 'BÃ0é=Ãb<à}>À¦?Ãz<ÃÐi@Ã`@CÃ`X?Ãðç8ÃÀ¿@Ã0ËBÃë:ÃpðAÃЀQÃà¿MÃ@3MÃPxHàèAð9;ðDÃÇ@ÃðÕ;Ãà>Ãz8À7Ã`‚8Ãàœ>Ã}BÃAÃÇ@Ãð·@Ãð™EÃpðAÀˆDõCÃPº=ÃÙ=Ã`Õ?ÃÀû6ðBðª=à ¶?ÃBðÂ9Ãp&9Ãð^:Ø7Ãð«BÃ$<À;à ?>Ãp\0Ãp:ü1à ]9Ã0û:ç;À¾;Ãðv6ÃÀË>Ã`:DÃ÷<ÃPÆ;ð'>Ã0õ;ÃÐò>Ãp27à u5ÃàÀ8ÃPÌ:ÃúBðª=Ã`ç<Ã0„9Ã0Š8ðE9ÃÀÑ=Ã0l=à æ7à ¼>Ã9ð¼:à i7Ãý;Ã@<Ãðí7à Ú9Ãðv6Ãà>àƒ=Ã@±8à W:ðQ7Ã0Š8Àq3ÀÄ:ðK8ðÔ6À)?Ãð|5Ã0û:ÃÀf:à;ÃÐ@2ÃÀ×<ÃÐ{=Ã@±8ÃÐ8ÃPê5Ãp>ÿ7ÿ7Ã@¥:ÃP[8ÃPa7ÃЙ8ÃPI;Ã$<Ãp:ÃpÁ4Ãt=Ø3Ã`|9à à8Ã@";Ãðá9à9Ã÷<à ò5ð?:í:ÃÀT=Ãp=à þ3ÃPC<ðK8à;ÃP[8à ¼>ðÈ8ÃÀN>ð¼:Ã`j<Ã@>ÃÀx7ÃÀï8Ã06ÀÜ6Ã`ˆ7Ãp»5à à8à ‡2ó9Ã@™<Ã`5Ã0¢4Ãà?ÃÀf:ÃðÉ=Ã÷8ÃЫ5Àâ5ðE9ÃpÁ4ó9Ãðá9Ã@ ?Ã`‚8Ã`ˆ7ðæ3Ã`ÿ8á<Ø7à*7à ì6Ãt9Ã`Û>à;ÃàØ4Ãðá9Ã@·7Ãp,8Ã05ÃÀŠ4ÃPü2à <Ø7Ã0:ÃPC<Ã@d0ÃpP2à ò5Ã`6ÃP1?Ã’8Ã7ðK8Ã0Š8à æ7Ãp,8Ãðj8Ø3ÃàO6Ãðó6Ã0+3ðc4ÃàO6Ãðó6Ãp¯7Ãð‚4àB3ÃÀx7ðÂ9ÃЇ;Ã06ÃÑ4Ãà¨<ÃÀ6BÃÀ6Ã`ˆ7à o6Ãp&9ðþ/Ã`š4ÃÀ1ÃÀx7ÃÝ2à*7ð¼:ÃÀõ7ðW6ÃPä6Àq3ÃÐÏ/Ã@:7à 0à u5Ã@½6Ã×3Ã@(:àN1á<Ãp27à:ð]5Ã’8Ã92à06Ã69ð¼:ÃàU5ÃPy3Ãl0ÃÐ@2À7à¹4à­6Ãà%=ù8ðW6Ã012Ãðó6ÃÀœ1à<4ðÚ5ÃàÀ8ÃP[8Ãp»5ÃàÞ3Àè4Ã`5Ãp©8Ã` 7Ãû-ÃPy3Ã@Ã5ÃÀ6Ã0¨3Ã`²0Ã@";Ã07ÃÐ8Ã`2Ã3/Ãð#/ÃP2ÃpÍ2ÃàC8Ã0+3Ã'5Æ6Ãp©8ÃÂ,à¹4Ãðó6Ã@F5à=Ã@<à à8ÃB7Ã`6ä5à*7àÑ0Ã`50Ã@@6Ãý7Ã0´1ÃàU5ÃPs4Ã@Ã5Ã0%4à*7Ãðù5Ã012Ã`ù9À5=ð .à o6Ãp>5ÃpÁ4Ãð4ÃPs4Ãð#/À1à “0Àq3ÃàU5ÃPê5ÃZ3ÃÀÝ;à þ3ð?:ÃÀx7Ãà7:ÃÀ„5Ãàa3Àq3à65Ã0~:Ãðí7ðæ3ê4ÃÐ"7ÃàÀ8ÀÜ6Ãà´:Ãà[4Ã0º0À1à§7Ã@Ã5à 6ðW6Ã7ÿ7ÃÐÃ1Àè4ÃpD4Ãð /Ã@F5ÃÐ(6à³5ð¶;ÃPm5ÃÀœ1ÃÐ^-à 2ÃÝ2Ã`Ž6Ãð).Ãà[4ÃÐ9Ãà1;Ãðÿ4à ¥-à;Ã7Ã`š4Àî3ÃÀ3ði3ðì2Ãp—;ÃpD4à¹4ÃðX;Ãðí7Ã@:7à u5Àô2Ãp>5à o6ðK8Ãб4Ã<8ÃZ3ÃpV1ÀA;Ã’8ö2ÃÐ.5ÀÐ8ÃpJ3ÃP1Ã`¸/ÃðŽ2Ã`š4Ã`5Ãh;Ã0:Ã@«9ðQ7Ã@Û1Ã`”5Ã07ÃÐ@2Ãï/ÃÐX.Ã5à 3Ã?1Ã’4Ã@Õ2Æ6ÃðŽ2ÃàO6ÃЫ5ÃpÍ2ÃpJ3ÃZ3Ã0=0Ãp¯7Ã@:7ÃÐÏ/ÀÜ6ÃÀé9ðÂ9Ã$<ÃÀû6Ã92ÃÀ6ÃàC8Ã`Ž6ÃÀx7Ã5Ã3Ãà‹,Ã0a*ÃP…1à*7Ã0+3Ãб4ÃT4ÃN5à ì6Ã0´1Ã`Ž6ÃÀ–2ÃPð4Ãб4Ã07ÃP0Ã`¦2ÃPä6Ãàê1ÃN5À}1ÀY7Ãp86ÀÐ8à 6ÃPs4Ãp :Ã!6ÀG:Ãp,8à§7ÿ7ÃÐ.5Ãpµ6Ãðp7Ø3ÃPÞ7à 6ðo2Ã7ÀÜ6Ã`;/à ò5à u5Ã8ÃàÞ3à ‡2Ãp,8Ãz8Ãðó6Ã@±8Ãpß/Ã5Ã07Ã$<Ãp»5À›,ðÂ9ÃpÓ1Ãï/Ã-0Ã012à­6à i7Ãp27ÃÀ3à 1à 0Ã` 3ÃÐ¥6ù8ÃàU5Ãàm1ÃÐ(6ÃÐ"7Ã7Ã` 3Ãàa3ÃpJ3à§7Ã@Õ2ÃPü2Ã3Ãf1À0Ãû-Ãpå.Àw2ÃpÙ0ÃÝ2ðK8à ì6ðæ3Ã`2Ãàa3Ã3ÃpD4Ãб4ÃÐ(6ÃPs4àH2Ã0+3Ãày/Ãp,8Ã$<Ãàä2Ãp»5Àw2Ã@Ï3à 1ÃÀ„5ÃPö3Ã07Ãð”1ÃÐ ;Ãðˆ3Ã0%4Ã0¨3ÃPs4ÃÐÃ1Ã09Ã0®2à¿3Ã`#3ðu1Ãð|5à­6Ãpß/ÃÐÏ/ÃB7ÃÀã:Ø3àT0ÃàØ4Ã`2ÃÐÕ.ðu1Ãàö/ÃPê5À‰/Ãð2àT0ÃŒ5ÃZ3Ã`50à*7ÃP1àZ/ðu1Ã`Ž6ÃЫ5ÃÀ–2ÃpÇ3Ã3Ã~-ði3à$8ÃÐR/ÃPö3Ãx.à ‡2Ãàs0ÃPa7ä1À /Ãp¯7ðà4ÃÐÏ/ÃP&,ÃÐ^-Ã-4Àô2ðÚ5Ãàº9ÃàØ4Ãàº9Ã@F5ÀÐ8ÃÀx7Ãб4ÃÐL0Ãðÿ4à 6Ãðp7Ã0®2ðÈ8Ã3ÃQ.Ãà.ÃÀ„5Ãð1Ãl0ÃP2ði3ÃÐ¥6Ã`5Ã0Ì-ÃPa7ÃÀ2Ã?1Àî3ÃÀ%0àË1Ø3ä1Àô2À /à<4à ".Ãàg2À.Ã@ç/Ã`¸/Ãàg2Æ6Ãà[4ðì2àï+Ãï/ðQ7ÃP.Ãðç8ÃÀ~6Ãà+à ±+Ãà-àr+ÃÐÉ0Ãð|5àB3Ã!2Ã92Ã`2Ã`2Ã@p.à×/Ã@Û1ÃB7ÃP‘/Ã@Õ2Ã0=0ÃÐÛ-ü1àl,ê4ÃÝ2ÃK/À‰/Ã@ç/Ãðÿ4Ãà+À}1ÃPC<Ã` 7Àe5à 3ðŸ*ðì2Ã`¦2Ãð|5ÃÀ3ÃP2*Ã÷<ÃÐF1Ã`ù9ÃPÞ7Ã3/Ã@š'Ã071ÃpÍ2à þ3Ãàð0Ã@d0ÃÐF1Ãp£9ÃÐ(6Ãðš0ÃP2àË1à 1ÃpP2àN1à¿3ÃàU5àã-Ã@ó-Ã33à W:ðW6Ã×3ÃK/ð-Ãp\0Ãà[4Ãð/-Ãð1ÃÀ+/à65Ã`”5ÃpP2ÃP1ðì2ÃP‘/ðì2à*7ÃÐj+ÃP/Ãàº9ðo2ÃPö3à 6ÃÐX.àË1ÃÑ4Ãà )Ã`;/ÃpÙ0à 0Ã`”5à 2ÃÀZ<Àè4Ã`¸/Ã0À/à 6Ãp86à ø4à 3Ãð4Ã`#3Ãð2àZ/ÃPö3Ã`¬1ð-ð/Ãð 3Ã0 8ðu1Ãàs0ÃÐ44Ã@X2àÅ2Ã012ÃT4àN1Ãàð0ÃPö3À1ÃàØ4ÃPa7Ã33ÃK/À.ÃPs4ü-ê0Ãp\0Ãp¯7Ã8ÃpÁ4ð/ü1à 0ÃÀx7ÃÀ5ÃàÞ3Ã0œ5Ã0®2ÃÀ1.ÃP-àN1Ãp\0à æ7ÃÀ2ðþ/ÃÐd,Ã0Æ.Ã`8Ã@F5ðo2Àw2à 3ð“,à (-ÃpÍ2Àk4ÃЙ8ÃÐL0à Ÿ.Ã`ó:Ãï/Ã@d0Ã`50À.Ãr/Ãð 3Ã@X2à “0Ã0Æ.Ã÷8ÃPm5ði3Ãð /Ã@|,Ã@í.à /Ã`M,ðì2Ã@@6Ã@R3ÃP1ÃÀ2Ãàm1à “0Ã0+3ÃpV1ÃÀ„5àr+À-ÃPµ)ðò1Ã7Ã@F5ÃðŽ2Ã`š4à 1ÃP2ÃP…1ÃÐÏ/ÃÂ,ÃT4Ã3à 1Ã`_)ð/À1ÃÐá,Ãðš0ÃÀ+/Ãph.Ã@p.Ãð¦.Àâ5Ã0U,ÃÐÃ1Ã0=0à ™/ÃpD4Ãàö/Ãõ.ÃpP2Ã?1à¿3Ãð‚4Ã4Ã@^1Ã012ÃÀ1ðà4ÃP2à 0Ã`ˆ7Ãð /ÃÐÃ1Ã`¦2ÃÂ0Ã05àË1à /Ã`4ð/àÅ2Ãðó6àB3Ã0C/Ãà—*Ã-Ã`²0ÃpÇ3ä5Ã@X2ÃÀÆ*Ã'1Ã*Ãð/-Ã`ô%ÃP—.ÃP…1ð/Ã3/Ãàö/Ãð2Ã@Ï3ð/Ãð#/Ãf1ÃP&,Ê+Ã4Ã@R3ÃP/àN1Ã`M,àH2Ã@R3à65ðo2àB3Ãð²,Ãàê1à ø4Ã`k'ÃPÒ9Ãðó6Ãà+ÃP»(ÃÚ(Ãб4Ã@Ï3ÃpÙ0ÃÐF1à 0à /ðø0ÃPü2Ãu(Ãð¬-à ¼>À#@à ò5Ã-4Ãàm1à 4+àË1à Î;Àw2ÃÀ´-Ãðš0Ãf1ÃÀœ1Ãð#/Ã@d0Ã0=0Ã0%4Ã` 7Ãà[4ÃP2ÃpÙ0Àô2Ã5Ãð).à i7Ã33Ã`¦2ðu1Ãà[4ÃÀ¨/Ã`Ü)Ã05Ã`/1ÃP.À,à Ÿ.à65Ã'1ö2à ".Ãð/-Ã92Ã5Ãð).Ã0´1ÃP1ÃÔ)ÃÐv)àf-Ã0Ò,ÃÔ-ð{0ÃpD4Ãð/-Ã012àË1Ãð1ÃQ.Ãà&(Ãà+ðæ3Ãз3Ø3ÃpÓ1Ãpñ,Ã0Ø+ÃÀØ'àÝ.ÃÂ0Ã@+Ãàs0Ã33ÃÎ.Ãà.ÃÀ1.Ãð4Ãà+ÃK/Ãpë-Ãpý*Ãð¸+à Ÿ.ÃÐX.Ãp )Ãð/-ÃP—.Ãp\0ÃÀÀ+Ãð²,ÃÀ¢0Ã@Û1À•-Ã`²0À}1ð/à .,àx*ÃP/Àî3Ã0Ì-Ãpý*Ã@p.à ±+ð/Ã`2àã-ÃÀ=,Ã@ *Ã@^1ÃPµ)ê0Ãà'àé,ÃÐF1àZ/Ãc+ÃÐv)À,Ãð”1Ãàä2Ãf1Ã5Ãà‹,Ãð¦.à F(ÃP—.ð/ð/Ãpt,Ã012Ãð0Ãð).À§*Ã`Ê,ÃÀ1ðc4ð‡.ÃQ.Ã)ð“,à ™/ðø0Ãн2ÃÀ+/ÃÐX.ÃÐX.Ã`A.à)Ã0º0ÃÀ1Ãpå.ÃÎ.À<'Ãàö/àÝ.àB3Ã`6Ãx.àã-Ã0À/Ãàð0ðŸ*Ãð¦.Ã92Ã0I.ÃÈ+ÃP>(Ã`Ö*Ãà*Ã@v-ÃÀO)ðþ/Ã0¢4àË1Ã@Ã5Ãðÿ4Ã’4Ãðù5à þ3Ãàg2ÃPy3ÃЫ5ÃQ.ÃÐ"7ê4À}1Ã-4ÃP-ðu1À1Ãà[4ÃÐÏ/ÃГ9à06Ã@|,Ãc+ðu1Ãàö/ÃÂ0Ã0¢4Ã012àZ/à ò5Ã×3Ãàð0Ã0O-Ã@ç/ÃpD4ÀÜ6ÃÀ~6Ãý7Ãðí7ü1à :Ãðí7ÃpJ3ð{0Ãp÷+Ãà+à (-Ãp27ÃàO6ÃÀx7Ãðù5ÃpÙ0Ã@á0ù8Ã0+3Ã@ó-Ã`í;ÃàO6Ãàg2ðK8ÃÅ6Ãh;ÃPê5Ãðv6Ã`‚8Ã-4Ãàa3ÃH6ÃPö3ÃГ9ÀÖ7Ã`2Ãp86Ãp<Ãðí7Ã`²0ÃpÇ3ÃÀT=ÃЙ8ÃŒ9ÃN5à “0à 4+Ãðˆ3à i7Ã0+3ö2Ãð|5ÃÐL0Ã`5Ãp;ÃÐ"7Ã@Õ2ÃÀ6Ã`Û>ð]5Ãf1Ãà+ü-à ò5Ãï/ÃPê5Ã@d0à9Ã0Æ.ðc4ðQ7ÃÐ<Ã07Ã0C/ÃÅ6ÃÑ4Ãн2Àw2Ã0:ÃÀf:Ã0–6Ã0À/Ã5Ãà[4Ã0:Ã@«9ÃpÍ2Ã7ÃÐÉ0ÃÔ-Ãб4Ã92Ã0º0Ã!2ðo2Ãð /ÃT4Ã`²0Ã0O-ÃÀœ1ÃàÞ3ÃÀ2Ãàg2ÃP0À}1À_6ðW6Ã05ÃPÞ7Ãз3Ã07Ã0®2ÃPs4ðø0ð]5ðÚ5Ã`Ž6Æ6ð-à Ô:Þ2Ãï/Ã`¬1Ãpß/Ãð|5ÃÀû6à ]9ðì2Ã@·7Ãp£9Ãðó6àË1ÃÀC+ÃP—.à c8À.ðo2ä1à æ7à ™/Ãn:à 6à “0ä5àË1Ãp>5Æ6ÃÀ–2ÃÐá,Ã`)2ðW6Ãà.àË1Ã92Ã@½6ð/ð]5ÃЫ5Ø7Ã0+3ÃÀ„5Ãl0ÃPä6ÿ7ðc4ðW6ðW6ÃàC8Ãðˆ3àN1Ãý7Ã’4ÃÀr8Ãé0ÃpV1ÃQ.Ã5Ãàg2ÃÐX.Ãàð0Ãp>5à ø4ÃPØ8Ã@É4À7ÃÀ3Ãðj8Ãp»5Ã@L4ÃpJ3Ã` 7Ãðv6Ã-4ÃP‹0Ã7í:Ãp27Ã’8Ãf1ÃàÌ6Ãð‚4Ã0¢4Ãý7Ã@(:à 6ÃPg6Ã@.9à Ô:Àƒ0ÃPê5Ã0®2ç;Þ6à65À}1Ã@Ã5ðÔ6Ã05ðW6ÃPÞ7Ã`2ÃB7ð¼:Ãðó6Ã@R3Ãðv6ÃÐ.5Ãp\0Ã0Š8ÃÀË>Ã5ÃPö3ðÔ6ÃÀZ<Ã0Š8à$8ÃË5ÃàU5Ã0:Ãp<À;Ãp>5Ã@ç/Ãý7Ã`5àw?Ãp,8Ãð4Ã` 3ÃPy3Ãðù5Ãð|5Ãðp7Ãp;Ãz8Ã<8à c8à {4ÃÐÃ1ÃÀ5Ã`2Ã0 8à$8Ã’8Ãà[4ÃpÁ4Ã0¢4Ã09Ã`4Ã` 7Ã@ù,ÃÝ2à$8Æ6ð/Ãï/Ã` 7à¿3ÃP2ÃàO6Ã`‚8ÃÐ8ÃÀ3ÃŒ5ÃPg6À_6ÃÐ:3ÃàÒ5À @ð?:Ã@@6Ãp,8Àe5à o6Àk4Ã012à$8ÃÑ4Ã@^1Àq3ó9Ã×3Ãð2Ã@L4ÃË5à Ô:Ãàs0Ã0Ý?ð“,Ã`²0ÀS8à o6Ã`4àB3Ø7ÃÐ44ÃàÞ3Ãn:ÃÐ44à u5Ãý7Ãp27Ã@Ï3Ã07ÃP==Ã\AÃ9ÃðX;Ã012Ã@‚+ÃàI7à;ÃpD4ÃÀ3ÃPÆ;ÃPð4Ãð 3ù8Ãðó6Ã0¨3à {4À1ÃpD4à Î;Ã@.9ÃPØ8ÃÐ ;ð/ðæ3Ãz<Ãp‹=Æ6à ø4Ã0+3Ãpß/ÃPö3Ã`4Ã0¨3ÃàI7ÃPy3ÃðŽ2Ã!6Ã`Ž6Ã0–6Ã05ÃàÌ6ÃPa7ÃpÇ3ðà4Ãf1Ãðˆ3Ãз3ðæ3Ãðj8ÃPØ8Ãðó6Ã0œ5Ã0–6Ã`ÿ8Ã`‚8à$8ÃÀ6à ø4ÃÐ"7ÃPð4Ã-4Ãp27Þ6Ãðˆ3Ãн2Ã`ˆ7àB3ÃpÁ4ÃP2Ã;Ãðp7à06Ø3ÃpD4ÃÀ~6Ã@«9àÑ0ÃÀ~6ÃЫ5Ã`)2Ã`50à§7ÿ7Ã0%4ÃÐF1Ã`)2ðo2Ã0œ5ÃÐ44Ãð|5ð{0ÃÝ2Ã`|9ðì2àT0ÃÐ¥6ð9;Ã0 8ÃÀ 4Ãðv6ÃàO6Ãp»5à­6ðÚ5Ã`”5à Î;ÃPÞ7ÃPÒ9Ã0¢4à u5à ì6Ã÷8ÃÀx7à :ÃàI7ÃPÌ:Ãàa3Ã`š4à¡8ÃП7Ã×3Ã@±8Ãð|5ÃÐ44Ã?1Ã÷8Ã`¦2Ã!6à65Ãàa3Ãð0Ã`‚8Ãðç8Ãðˆ3ðì2ÃàU5Ã`8Æ6Ã@d0Ãl0ÃE0Ãà´:à u5ðc4ÃÀ2ÃPs4Ãàm1ÃPê5ÃË5àB3ÃÅ6Ãp&9ÃÀ„5Ã07Ã0œ5à o6Ã0–6Ã06Ãð2ÃPa7Ãн2ÃàÌ6à¹4ê0ÃÈ/Ã@@6Æ6Ãð”1Ãн2ÃË5à§7Ã@L4à W:Ãàð0ÃPÞ7Ãàg2ÃàÞ3ÃpÁ4ÃpÁ4ÃàÞ3Ãp86ÃÂ0ÃðA*Ã@@6Þ6ÃÀ6ÃÐF1Ã`2ÀY7Ã@X2ÃÐ:Ãðó6Ã0+3À²=Ã@@6ÃÐ"7ÃPO:ÀS8ÃÐ.5ÃP—.Ã@";ð?:à 6Ãp:ÃÂ0ÃÝ2Ã07ÃPy3ÀÖ7ÿ7ÃЙ8Ãðç8ÃPä6Ãð 3à æ7Àk4ÃÐ:3ÃPg6Ã;ÃðÏ<Ã0~:Ã`Ž6Ã!6ÃPÆ;Ã07ê4ÃÐX.Ãð1Ã’4ÃPm5Ã8Ã`ÿ8ÃàÒ5í:Ã!6ÃЫ5à Ú9Ã’4ÀA;à 3ðÔ6ÃàO6ðæ3Ã'5à 1ÃÀõ7Ãðí7Ã`ˆ7ÃP2ÃpP2Ã@j/Ã0Š8à>Ã@É4ÃÐÉ0Ã0Š8ÃÐø=Ã`Ž6ÃÀ6Àƒ0Ã@·7ÃÀ„5Ã`¸/Ã33ÃàØ4ÃH6Ãð±AÃðá9Þ2Ã0¨3Ãl0Ã@:7ÃH6ÃT4Ã@^1À‰/Ø7à i7à­6Ãð4ÃŒ5Ã06à$8Ã`6à Ÿ.ÃÂ0ÃÀã:ÃPm5ÃPØ8Ãp‹=à*7Ã0%4Ã`50Ã`ÿ8Ã5Ã@j/ÃP1Ã@É4ÃðŽ2àB3Ã`|9ÀY7ÃÐ@2àË1Ãз3Ãp:Ãðj8Ãðó6Ã` 3Ã`š4Ã'5ðÚ5Ãàä2À¡+Ã`¾.ÃÐ:3Ãàm1ÃÐ"7Ã012Ã@±8ÃÐ¥6Ã`ù9ÃÀ5Àô2ð,Ãl0Ã@Ï3ÃàÌ6Ãàa3ÃPü2ÃÐR/à ¥-à<4Ãp;Ãз3ÃЫ5àT0Ã012Ã`²0Ãp>5Àk4Ã071Ãõ.Ãð#/Ãð1ðÂ9Ã0ï<ðÚ5ÃÀõ7ÃÀ„5à 3Ãt9à ì6ÃP.Ã9.Ãàü.Ã`2À¾;Ã06Ã@48àN1ÃP£,à ‡2ðc4Ãàm1Æ6ÃП7ÃPä6Ã0´1Ãpb/Ã`¸/ÃÀ1.Ãð¦.Ã`4Ã07Ã@X2àN1Ãà=9Ã`ˆ7Ã`50Ã012ÃðÛ:ðì2Ãpn-Ãð2Ãàê1Ãph.Ã@·7ÃÐÏ/Ã8ÃÀ®.Ãà,ÃPÆ;Ãã1ÃÀf:ÃPg6ÃàI7ÃÐÏ/Ã@Ï3Ã!2Ã0C/ðÚ5ÃÀœ1Ã`5ÃP0Ã071à ò5ÃPö3ÃP‹0Ã3à­6ð/Ã071Ã`#3Ãàð0ÃÐá,Ãð).À.Ã`²0ÃP…1à 1ÃÐ:Ãàê1Ã3à i7Ã3àH2Ã92à§7ÃàO6ÃÐí*àf-ð/ÃPy3Ãð 3Ã@Û1ð/ð/Ã@í.ù8Àâ5à­6ðo2ÃÔ-à³5À /À}1Ãàä2Ãf1Ã`6ÃPä6Ã@Õ2Ãõ.ÃT4ä1ÃPy3Ã@Ã5Ã0Ì-Þ6Ãp86Ãàg2Ã`4Ã@(:à ì6à¹4à³5Ã0®2Ãp>5à æ7Ã`2Àw2À›,àÑ0Ã@F5Ã`/1Ã`¸/Ã05Ãf1Ã`¸/ÃÐá,ÃpJ3Ãp>5ÃpP2à ¥-ð/ÃpÓ1Ã`”5à 3ÃPy3ÃPy3ÃÐ44Ã@:7Ã`4Ã`¸/Ãð#/ÃàI7ÃÐ¥6Ã’8ÃÐÉ0Ãð).Ã0Æ.Ãõ.ê0ÃŒ5É@Ã`ç<ÃÀï8Ã`Õ?ÃPÞ7Ãpå.ÃЫ5Ã!6Ø3Ã-4ÃP>(Ãp\0Ã`;/Ã`Ž6ÃÐ:Ã5ðÔ6ÃÀx7ÃÀû6Ãб4ÃpÇ3ÃÐ¥6à i7Ãt9Ã`5Ã071àB3ÃPð4Ãз3à:ÃЫ5Ã69ÃÀf:Ã012ÃP£,À‰/Ã-0ðì2ÃP1ÃÀ×<ÃP‘/Ãé0Ãð0Ãð¬-Ã5ð/Ã@É4Ãp£9ÃZ3ÃðŽ2ÃàÌ6Ãà[4ÃÐd,Ãðç8Ã7ð-Ãà7:ÃPä6Ãð|5àÑ0Ã@¥:ÃPm5ðø0Ã0¨3ÃÐ@2Ã`ù9àË1à Ú9àÅ2ÃÀœ1ÃÐ@2Ã!6ÃÐR/ðì2Ã33ä5àH2Ãàð0àN1ÃP1ÃÀû6ÃpV1ÃÐ44ÃÀ6ðu1Ãé0Ã@ç/Ã0¢4ÃÝ2ÃÐÕ.ðà4à “0Ãàä2Ã0y&ð¥)Ã05à ò5Ã!6ÃT4ÃЫ5ÃH6ê4ä5Ãpµ6Ã0®2ðì2ÃÐÏ/Ãx.ÃðŽ2Ã@Û1à ]9Ã@Õ2ÃÐÉ0Ãàê1Ãp£9ð‡.Ã07Ãð4Ãð1Ãp»5ði3Ãàü.Ã-0Ã?1ÃpÇ3ä1Ã33ÃÐ¥6Ã3/ÃE,Ã`/1ÃÀ 4ÃPü2ä1ÃP2ÃÀ 4à65à (-Ãà[4Ãi*Ãàö/à o6ÃË5Ã`6ÃpÓ1à ‡2Ãà=9Ã’4ÃPg6ÃP…1Ãpb/ð¶;à 3Ãàm1ÃàU5ÃÀ–2Ãý7ðu1ÃÀ´-Þ2ð/Ãàº9à¹4À²=àÅ2à 1Ãà.ÃÂ0Ãð#/àË1Ãð2ÃàÌ6ðì2à /Ã?1Ãà‘+ÃÀ¨/àB3Ãp>5ðo2Ã`)2Àè4Ãf1Ã*;ÃÀ1.àN1Ã`M,à 2Ã0´1Ã06Ã0¨3Ãp»5Ã`Ä-à à8Ãð1À1Ãà.Ã`A.ü1ÃÂ0à*7Ãð|5ð-ä5ðu1À›,Ã’4Ã06Ãàg2ÃÀ¨/ÃPy3ð/Ãf1ÃpÇ3Ãð²,à «,Àô2Ã0®2Ãàö/ðø0ê0Ãà.Ãl0Ã`ù9ÃÀ5Ã@)ÃPö3ÃP.ÃÐR/Ãн2ÃÐ:3ðu1Ãp&9à 1ÃÐÏ/ÃÎ.ÃÀ3ð‡.ÃP‘/Ã~-à 1Ãé0Ã06ÃW-à ±+ä5Þ2À_6ÃpÓ1ÃP2Ãð2ÃPg6ÃPU9ÃðŽ2àË1Ã@Ï3À /Ãðv6ÃÐ44Ã0–6ÃÐ44ÃàO6Ã'5Ã@Ã5ÃÀï8À7Ãðí7à {4ÃPO:Ã` 7Ã`¦2Ã0À/ÃàÀ8Æ6í:Ã0:à§7à Ÿ.ÃpP2ÃÀ1à65Ã`Ä-à :à¡8ÃPö3ðÈ8Ãpµ6Ã`/1ÃÐ@2àË1ð]5Ã`8ðK8ð3ÃÀû6Ã>FÃà?Ã7Ã@F5Ã33ÃpV1Ã0–6à ø4ÃÅ6ðÈ8Ãý7Ãб4ÃÀÝ;à$8Ãt9À}1ÃÐ:à ø4Ã07ðà4ÃÀû6Ã@á0Ã`|9Ã`5ÃÀ2ÃPÒ9ÃÐ ;ðò1ÃÐj+Ã!2ÃN5ÃŒ5Ã07Ã`Ž6Ãp86àH2Ãf1Ãp;Ã0œ5À•-ði3àf-àN1Ø7ðc4à Ô:à ì6Ã@á0ÃàI7ÃÐþ<Ã0:Ã`ˆ7à9à c8ÃN5àB3Ã'5Ã`Ä-ÃÀ„5ÀÄ:ÃÐÕ.Ã` 7Ãðj8ÃðŽ2àl,Ã07Ã5Ã07Ã@L4À1ÃàU5Ãð 3à æ7Ã012Ã@@6Ãb<ÃàU5ðø0ÃÐ@2ÃÀ2Ãl0ÃÐç+À_6àH2ÿ7Ã?1Ãð2à 3ÃÀ5ÃPÒ9Æ6ÃàI7àN1ð/Ãpt,Ãðv6àl,Ã4Ã@^1Ãðù5à 1ðu1Ã@É4ÃÀé9Ãðù5ÃPü2Ãf1Ã7Ãàü.ð,ÃàØ4ÃÀœ1ÃÐL0Ã@ç/Ã0œ5Ãå;Àƒ0Ãp86ð{0ÀY7ÃÀl9Ã`š4ÃàÒ5Ã` 7Àâ5Ã@ó-ü-ÃÐ8Ã`”5À7ÃÀf:àã-Ã'1à i7Ã92Ãðù5Ã07ðÚ5à65Ã`š4Ã@¥:Ã0+3Ø7ðÂ9Ã@X2ÃðŽ2Ã92ÃàU5Ãðí7ÃÀ2ð¼:ðc4Àô2Àî3ÃàØ4ÃP‹0Ãà+Ãpn-ðÚ5ÃàI7Þ2ÃT4Ãp»5ÃpD4Ã’4Ã!6ÃPö3ÃÀ„5Ã@L4Ã33ÃÀ–2Ã`”5Ã@É4à9Ã`í;Ãf1Ã0I.Ø3Ê+ö.Ã`ÿ8ÃàU5Ã`¬1Ã@Ï3ÃP2Ã`)2ÃàØ4Ã9Ãð1Ãà=9ðà4ÃpP2ÃpÍ2Ãl0à¿3ÃàI7Ã!2ðu1Ãàa3ä1Þ2Ãðó6ðæ3Ã05ÃPê5Ã`#3Ãf1ðÚ5Ã-0ÃÐ.5Ã0œ5Ã?1à 1Ã0¨3ðæ3ÃÀ´-Ãð¬-à 1Ã<8ÃÐd,Ãðˆ3Ãà7:Ã@É4Ã@Ã5àl,Ã`;/ÃÐÉ0à 1Ãàa3ðÔ6ê4Ãð1Ã@^1À‰/Ãày/ÃE,à ì6Àâ5Ãp>5Ãð2ÃÐ:3Ãàm1ÃÀœ1à 0àB3ðc4Ã@v-Ã`¬1Ãð1Ãð0Ã'5ÃpÍ2Ãà+ÃÐF1Ã@j/Àw2ÃP1ð3ð .à(ðò1ä5ÃP¯*ö.à<4Þ2à­6à­6àÝ.à 3Ãð 3Ã`A.Ã0Ò,Ãph.àH2Ãàö/ÃÐÃ1ÃpÇ3à .,ÃÐX.ÃÀ´-ÃÀ6ÃP—.Ãp>5à 1à¿3ð]5ÃÀ®.ÃÐF1Ãpë-ÃpÙ0Ãð 3Ãðí7Ãx.Ã`v:à06àB3Ãð¸+Ãà[4Ã`4ÃÐç+ÃpV1ÃP…1Ãp )Ãàs0Ãl0ðò1Ãн2Ã@p.Ãð”1ÃpÁ4Àƒ0ð .Ãf1àé,ðu1ÃÐ.5àû)ÃpV1À-àT0Ã`²0ÃPð4ÃH6Ã012Ãð/-àH2Àî3ÃŒ9Ã`¦2Ã@Û1Ã`¦2ÃÀ1.à ò5ÃÐj+ÃPm5Ãð /ÃÔ)À.Ê+ÃP&,ÃÂ,àË1Ã@j/Ãpb/Ãï/Ã@R3Ã`#3ÃÂ0Ãð0àl,Ã@ÿ+ÃÈ/Ã`²0Ãà,Ã`M,Ã012ðà4ð{0ÃP‹0Àô2ÃÎ*ÃP‘/ÃàÞ3Ãðš0ÃP&,àN1ð-Ãàs0Ã0[+Ã071ÃE0Ã~-Ãã1Ã@ù,ÃÀ´-ÃP‹0àZ/ðò1Ã-ÃÀ7-à ™/ÃÐÉ0Ãû-Ãð¬-Ã`_)ÃQ*Ãàü.ð‡.àË1Ã@|,ÃÀÆ*Ã*ÃK/ÃÀ¢0ÃÎ.à 2Ãp&ð/Ã0=0ÃðÄ)Ãà'à (-ÃÐL0àã-Ãð#/ðo2Ãð²,ö.à 0Ãx.Ãp*à L'Ãé0ÃÝ2Ã0ä)À•-Ãl0À-ÃPÁ'Ã0a*Ã@ù,à 2Ãà.À /Ãp86Ã0º0ð-àZ/ÃÐ|(àË1Ã`Ê,Ã`¬1ÃK+Ã`¬1Ãð0Ã?1Ãð /Ãð#/Ãl0Ãp>5ð‡.ÃK+Ãà£(Ã0O-Ã`î&Ã@+àÝ.Ã`Ð+Ã@ÿ+ÃàÌ6Ãðp7Ãx.Àî3à¿3Ä,ÃÀÆ*Ãà+ð«(à65ÃÀº,Ã`¾.Ãà )Ã0I.Ã`M,Ãp\0ÃàÒ5ðu1Ãà[4ÃpÁ4Ã`¸/ð‡.Ã×3ÃpÍ2Ã@d0Ãà‹,à06ÃÀ6Ã`‚8Ã@j/Ãð /Ã09ðK8ÃPm5Ãð|5àN1Ãl0à×/ÃÐç+Ãà.Ã0À/À7à ò5Ã0Š8ÃK+Ã@á0Ã`2à ø4Ã@á0ÃÐÛ-à 3ÃÀ¨/Ã?1ÃÑ4Ã3Ã`50ÃÀº,Ãð 3ði3Ãð4Ã0C/ÃÐ44ÃP1à ¥-ÃàØ4ÃГ9À.à×/ÃP2ÃÀ®.Ã0º0Ãð¦.À}1Ã0C/Ãð‚4ÃÀ¨/Ã071Ã`)2ÃÂ0Ãàð0Ã0U,Ãp€*ÃðG)àB3ðÔ6Ã@R3ðø0Ã`50Ã`Ö*Ã0Ì-ÃÂ,ÃÐ.5Ãàü.Ã@:7Ãð).ÃÂ0ÃÀ1Ãð/-ð+ð/ÃÀ¨/Ãp\0Ã0C/Ã*à ".ÃH6Ã3/Ã`2à ì6ÃPy3à65ÃÐ8Ã012ÃÐ:3ÃÐ.5Ãt9ÃÝ2Ã'1ü1ÃÐÃ1ÃpÁ4ÃE0à Ÿ.ð/Ã0Ì-ÃðŽ2Ãf1Ãð0à 1à 3Ãàð0Ã071Ãr/ÃP‘/ði3ðø0àl,Ãð /Ã!2ÃP-Ã`#3à¿3ÃÀ3ÃpÇ3à ‡2Ã`š4ÃP‘/ÃÐd,À‰/Ã,Ã@X2Ãð2Ãðp7àH2Ãà,'ÃP/à :*ðì2ð?:Ãàö/à ·*ÃÔ-Ãð /ä1Ã0=0Àw2Ã`”5ÃðŽ2ÃÐ:3ðø0ä5Ã`2Ãð).Ã0Ì-ÃZ3àÝ.ÃPÍ%Ã?1ðø0àï+ÃT4Ãàê1Ã`50Ã@Õ2ÃðŽ2àÝ.ÃÀœ1Ãðù5à u5Ãð#/Ãàö/Ã@½6ðì2Ãf1ÃÐÉ0À1ð‡.Ãà)ÃP/ÃQ.àÑ0Ã3/ÃP,+ÃP -ÃðŽ2à ø4ÃÐÕ.à ™/ÃÐF1ÃàØ4Ã@‚+ÃÀ®.Ã0I.ði3ÃàØ4ÃÐÛ-Ã@X2Ã0=0Ã0À/Ã0O-Ãàä2à<4Ã@j/ÃÐ¥6ÃÝ2ðo2Ã`¦2ðþ/Ãð²,à “0ÃÐÃ1Àè4Ã09Ã9.à 2Ãð”1à .,Ãà…-Ã`â(Ãàm1ÃPm5ÃðÏ<Ã0Ò,À**Ãàa3Ãð#/ÃQ.Ãõ.Ã0À/ð-Ã`š4Ã0%4ð«(Ã0+3à +ð]5ÃÝ2Ã`A.Ã0C/Ã-ÃPö3Ãpë-À0Ã071À‰/Ã`¸/à ".ÃÐj+ÃÀ%0ÃÐ<Ã×3ÃàÌ6Ã012Ãp÷+ÃàU5Ã!2Ã-0à Q;àÝ.ÃÀ1À.ÃÐÏ/ðu1Ãà+Ãà*ÃÂ,Ã0O-Ã'5Ãp<Ãpå.Ã0Æ.ÃÐ44ðu1Ãi*ð/Ãx.ÃP&,ÃÈ+À_6Ãð‚4ÃP -à “0Ã012Ã-4Ã@v-ÃÔ)Þ2Àî3ÃÀ 4Àè4Ãð /ÃP/Ã`¸/ð-Ø3ÃÂ,Ã`)2Ã0Ì-Ãã1Ã0I.Ü(àl,ÃP2*Ã0Ì-Ãð¸+Ã@R3Ãàä2ð™+Ãð¦.Ã@Û1Ã-0Ãð4Ã` 3Ã3À.à65Ã-0Ãà…-Ã@X2Ãp»5ÃÐÕ.ÃÐj+Ãì)ÃÐÕ.Ãp»5Ã0ä)à /Ã`¾.Ãà—*ÃÀÆ*Ã69àZ/Ãf1ê0ÃЂ'ÃP -Ã0$à ±+à F(ð{0à ‡2Ã@p.ÃPü2Ãðš0ð“,Ãpß/Ã)Ã`;/à 1Ã0C/à 1ÃÀ1.ð‡.Ãpñ,àr+ÃP -ÃP -ÃÐÉ0à 1ÃÐ^-À0ÃÂ,à «,ÃÀ 4Ãð2Ãð /Ãc+Ãpt,ÃÀº,ÃP‘/Ãà+Ãpë-Ã0ä)Ã!6Ãð¦.À›,Ã@á0ÀÐ8ÃpÍ2à 4+Ãð”1Ãx.Ãp&Ã`S+ÃÎ.À /Ãx.ÃÀI*ÃÐÏ/Ã@v-Ãàö/ÃðY&ÃÀ¨/Ã@í.ÃpV1ÃP2à :*À-ÃP.Ã3/ðø0Ã@ˆ*ÃP‘/ÃÀŠ4Ã7À.Ã0[+ÃðŽ2ÃÐd,Àƒ0ð,ÃpÙ0Ãp\0À§*ÃÐ.5à ‡2Þ2Ãp†)Ãp'Ã`¾.ÃP0à (-ÃÐF1àû)Ã*à×/Ã0´1ÃÀ1.Ãàð0ÃpD4Ãð¦.Ã3Àƒ0ÃÐÉ0Ãð).Ã`A.Àw2Ãì)ð,à {4ÃÀ„5ðò1ÃÂ,Ã@ù,Ã0Æ.ÃÀ=,à “0Ã,Ã0=0Ãà.Ã`¬1Ãàg2Ã0O-ÃPµ)Ãû-Ãp©8ÃPs4Ã9.ÃQ.Ãpë-à {4ÃP…1ÃÚ,Ã@ç/ÃÀ 4ÃàO6Ã@v-Ã`²0ÃÐL0Ã?-ÃðŽ2Ã@í.Ã0Æ.Ãð0Ãàê1àB3Ãàm1ÃÂ0ÃÀ+/Ãàð0à 1à ".à 4+Ãà-ð/ÃpP2ÃÐÃ1ÃÀ´-Ã-0Ãð¾*àZ/Ã`Ž6à$8ÃÐá,à ".Ã-0ÃÐ:3ðÔ6àË1Ã@R3ÃÀ´-Ãi*ðþ/Ã4Ã0C/ÃP‘/àx*à .,ð{0Ãl0Ã`²0ÃpÇ3Ã0=0Ã@j/Ã@‚+à «,à «,ÃÀ®.Ã@ç/Ã33ÃЂ'ÃQ.Ã`¸/ÃÀœ1Ãð¬-Ãpb/ð,à þ3ÃÐL0Ãàê1ðo2Ãà©'Ã`)2ðæ3Ãð¬-Ãб4à ]9Ã`G-Ã@d0Ãàm1ð“,Ã9.Ã-0Ãp»5àr+Ãð2ÃP‘/Ã`_)À-Ã×3Ãp»5ÃàI7Ãàð0Ã`#3Ã`”5Ãæ*ÃP -àZ/Ã9.ÃÀÒ(ÃÀ¨/Ãà+Ãàö/ð/ÃPµ)Ãàm1ÃÀ3ÃÐ^-ÃÚ,Ã`Ê,ÃÐó)Ãày/Ãð¾*Ã0À/ÃpÁ4à×/Ãðš0àf-àr+ðì2ÃÀ7-Ã`50ÃP—.Ãð).ÃP…1Ã*à «,ÃÐÏ/à 1ÃÐ:3ÃÀœ1Ã`Ð+Ãð/-Ãð¸+ÃÐá,à 4+Ã3Ã`;/Ã`¾.Ã0I.ÃðA*Ãc+ÃÈ/Ã@ç/ÃP1Ãà…-ÃÐv)Ã@ˆ*ÃÐv)àN1ÃpD4Ã@ÿ+à×/Ãð;+ð"*Ãà&(Ã(Ã@Ž)ÃP©+Ã0C/Ã×3Ã3/à ^$ÃÐç+Ã'5Ãð/-à R&Ã0ä)à ±+Ãày/Ãph.Ãõ.Ã`e(Ã@ÿ+Ã0[+Ãàð0À•-ÃÀº,Ã-Ãð#/Ã-Ãà&(Ão%àŠ'Ãà )ÃP/ÃP‹0À§*ÃÂ,ÃðÄ)Ã,Ãpå.Ã@'ÃP -àl,à 4+ÃÐL0Ê+ÃÀ=,à ".Ãà,Ãð).Ãàs0à¿3ðø0ÃÀ3ÃÂ,Ã0Ø+ðŸ*àl,ÃÐí*à(Ãp÷+à ±+À}1à­6ÃP‘/Ãõ.Þ2ÃP…1ÃÐR/Ã`Ä-à .,Ãà‹,Ã0Ò,Ãì)À¿&à ¥-Ã@j/Ã0Æ.Ã@ *Ãpž%À**à ·*Ã@ &à d#ÃÐÉ0Ã`”5Ãà.àË1ÃðA*ÃÐÛ-Ãàö/Ã0=0à Ÿ.ð½%Ãà+ÃpJ3Ã],ð,ð+ÃÀ%0Ãpn-Ãð).àÑ0Ãpb/ÃP -Ã`Ð+Ã@š'àõ*ÃP‘/ð"*ÃPü2ÃðŽ2à<4Ã`q&Ã@ç/ð/Ã0C/ÃÀI*Ã0O-ð‡.Ãpb/Ãpë-Ã0g)Ãx.ÃP0Ãì)ê0ÃÀ¢0ðc4ÃW-ÃÐ:3ü-Ã0ä)ÃP£,ÃÎ*ÃP -ÃÐ^-à ™/Ã`¾.Ãp€*ÃÎ*Ãà,ÃÂ,Ãà,ÃÐd,ÀB&ÃÀU(à)Ã@L4À,à :*ÃÐá,ü1Ã0Æ.Ã` 3ð/Ãà‹,Ã0®2ðø0Ã`;/Ãà-Ãð_%Ã`;/Ãû-Ã@+ÃÀ¨/Ãà-ÃÀÀ+Ã*Ã`M,ÃÀÀ+Ã×3Ã92Ão)Ãàö/Ãà,Ã0C/àÑ0À‰/Ã`Y*à /à ½)Ãàa3ÃÐÏ/ð‡.Ãpb/àH2àB3ÃÂ0à¿3ÃÈ/ÃP-Ãàö/Ã4À0)ÃÀ2Ãðš0Ã`#3Ãl0àr+ÃP>(Ãx.ðò1àl,ÃP,+Ãàs0à~)à×/ÃÐR/Ã0[+Ã`Ü)ÃP&,Ãð /ÃÀ–2Ãð¬-à 2Ãpz+Ã`e(ÃÀ1.ÃÔ-ð{0à ‡2Ãð|5Ã0À/À³(ÃÀI*ÃÐR/ÃÀ1.ÃðÊ(ÃðG)Ãàs0à “0Ãph.àÑ0ÃÐR/Ãð0Ãð;+Ãð#/Ãð1ÃÀ3ÃK+àÅ2Ã05Ã06ÃàÌ6Ã0C/àH2ÃE,Ã`š4ÃK+Ã0Ò,Ãàº9ü-ÃÀ´-Ãàä2Ã?1à)Ãx.Ãàê1Ã@Û1Þ2Ã071Ãà+Ãph.Ã-4À•-ÃZ3Ãàð0Ã0´1à 1ÃÐL0ä1Ãp\0Ã@ÿ+À /à {4Ã-Ã`¦2Ãàm1Ã3/Ãpb/Ã@^1ðþ/Ãà‹,à ™/Ã7ðø0à–%Ã'1Ã×3Ãðç8Ãðí7ðæ3À1ê0ÃÐÉ0Ã-0À.à ¥-ÃÀ6Ã92Ãc+à 3àN1Ã@X2Ã@+ÃÀ1.Ãàð0ö.Àô2ê0Ã0º0Ã@p.Ã0[+ð/Ãp,8Ãз3Ãàö/ä1ð‡.à u5ðW6Ãð/-Àô2ÃÀ¨/Ãз3Ãð /Ã`A.Ãð).Ã@ç/à¡8À1ä1ÃÈ/Ãû-Ãàð0àï+ðò1Ãðš0ÃPm5à 0Ãð5,Ã0I.Ãr/ÃðA*à (-Ã@+à¿3ÃÈ/Ã9.Ã@½6ÃÀ¨/ÃW)Ãp»5à ™/à ¥-Ãà.ðo2Ã0+3àõ*Ãàa3Ã@ó-Ãð²,à ½)Ãà‘+Ã`4à×/Ü(Ãp\0Ãàm1ÃÐp*à ¥-à {4Ã'1Ã~-Ãн2ÃP£,Ã@Õ2Ãð#/Ãàü.Ã`²0Ãx.Ãð /ðo2Ã@Ž)ÃE,ÃpP2à 3ð“,ÃÐí*àZ/Ã@Ï3ÃPö3Ã`¦2à :*Ãu(ð.(ÃÐX.Ãð).àï+ÃP—.Ã`¬1Ã`;/Ã],Ã],À$+àr+ÃÀ1.ÃQ.ÃðG)Ã0s'ÃÀ6À1ÃÝ2ÃP -Ã@ *à 0ä1Ã0´1ÃÀ´-Ã0I.ÃÐÉ0à ‡2Ãpë-ðc4ä1ÃÀC+àõ*Ã0%4à «,Ãà*ÃE0ÃÀ['Ã`e(À.ði3Ã`Ü)à þ3à 3Ãð1àã-ÃÚ,ÃÀ®.Ã@)àõ*ÃÐÛ-Ãð).ÃðS'ÃÐÃ1Ãà‘+Ãpb/ÃðÊ(àõ*ÃÐó)ð/ÃÀº,ÃT4à ™/Ãà‹,Ãà)ð-àï+ÃÚ,ÃÀŠ4Ãàö/à)Ã0U,ÃÈ/ÃÀ['Ã)ÃP,+Ãàg2Ã],ð.(ÃÚ,Ãà—*Ãà.Ãû-à @)ÃðM(ð:&ð-Ã`â(Ã(ÃW)ðø0Ãð¸+ð«(Ã`¸/Ãà¯&ÃÀC+Ã@(Ãà,Ã-0Ã?-Ã0Þ*Ãà )ÃÐÏ/ÃÀ®.Ä,à ±+ÃP-ÃP£,Ã3/À}1ð{0ð/Ü(ÃðM(àË1Ãð 3ðþ/àã-Ãpý*Ãð;+à(à 4+Ãp&9ÃPg6Ãõ.Ã`)2ÃÀ´-Ãæ*Ã`Y*ÃÐá,Ã`Ä-Ãà'Ãpz+Ã0Æ.à :*À /Ãà&(ÃðG)Ã@v-à¿3Ã@ù,Ã@š'ÃðY&à /Ä,Ã-à ™/à 2Ã0I.Ãì)ÃÀÌ)à 1àl,à ½)Ãpë-Ãð).À-ÃÐí*àé,Ã071Ãph.à ".ÃК#Ãà‘+ÃÚ,ÃP/Ã-0Ã`Ä-ÃÐj+Àî3Ãpñ,Ã0Þ*ÃW)Ã,ÃÀC+à (-ð"*Ã-0ÃÔ)Ã(Ã`G-àf-Ãà,Ãp(à .,Ã0U,Ãp\0Ã0a*ÃðÄ)Ãà )Ãc+Ã3/Ãà.Ã`Ð+Ãpz+Ãc'Ãpž%Ãp€*Ãð /Ãi*Ã0O-Ãû-Ã0m(à ½)Ãð;+è&Àƒ0à 3Ãð1ÃQ.ÃÐÃ1Ã@ù,Ã`Ä-À0)Ãò(àf-à ·*Ãpý*à /Ãæ*Ã0Ø+ÃÀI*à ¥-ÃP,+ÃÐF1Ã@Ž)Ã0s'Ãày/Ãp;à:ÀM9Ãp>5ÃPO:ÃÀõ7à Ÿ.Ã,Ãé0Ã*à%#ð±'Ãàü.ð‡.ÃÀ1.Ã*à ¥-àÝ.Ã@ó-ÃPs4Ãàä2Ã`2Ãà‘+Ã@á0ð/Ã`¦2Ã@ÿ+Ãf1ÃÀO)ÃÐX.À /ÃÐ'Ã`S+ÃÀ®.Ãð 3À§*Ã@ç/à§7Ã@X2Ã@d0Ã@ç/ÃÐÛ-ðþ/Ãн2ÃpÍ2ÃpD4ÃP…1à (-àT0Ãð‚4Ãàs0Ãð¸+ÃÈ/ÃpP2à ™/Ãàs0à¡8Ã3Ãð /À}1ðÚ5ÃP‹0Ãpn-ÃpJ3Ã0I.À›,à<4Ã`G-ÃðŽ2ð]5ÃP‹0Ãã1Ãày/Ã0O-Ãû-Ãàê1Ã`š4Ã0Æ.Ã0%4ÃpÍ2ÃpÇ3ä1ÃÐ(6ð¼:ðc4Ã`Ê,à 3à×/à ¥-Ãû-à Ÿ.Ã`)2Ã0®2À}1ð/Ø3Ã-0Ã@É4àB3Ãà…-àÅ2Ãð2à 6Ã@j/Ãp†)Ã071ä5Ã07Ã×3ÃQ.À.ð‡.àÅ2À_6ÃðŽ2ÃÀ3à þ3ÃÀ„5Ã`”5À‰/Ã@ÿ+ð/Ãf1ÃŒ5Ãб4Ã0Æ.àB3Þ2ÃÐó)ÿ7ÃP‹0àZ/Ãx.ÃpÍ2àT0Ãày/Ãàg2ÃÀÀ+Ã'5ÃÀ 4Ãð /Ã@^1ÃÀ®.Ãð1ä1Ãð¬-Ãp\0ÃЫ5Ã@F5À7ÃÚ,à 1à 2à 0À¡+Ã@^1à³5Ã@Õ2Ã@d0à¿3ÃË5ð¼:Ã0+3ÃPö3Ãðˆ3Ãæ*Ã3Ã0¢4Ã8Ãàð0À.ÃÀ 4Àè4Ãб4ÃÔ)ÃÐR/ð“,àN1ÃàÒ5ð-àé,à +Ãr/Ã@É4Ã`6ðì2à «,Ã@d0Ã0Æ.Ã07àZ/ÃpÓ1Ãð^:Ãð#/ÃT4Ãð¦.Ãà.Ã0´1Ãàs0Ã-Ã0a*Ê+Ã`”5à W:ÃP—.ÃÐL0ÃPö3ð/Ã@X2ÃÀ+/Ã`Ê,Ã-ÃP1Ã`¾.ÃpV1ÃPg6Ã0´1Ã@á0Ã`#3Àî3à¹4à ‡2ö.ð3Ãð2Ã92ð/ö.ÃpÇ3ÃP—.ÃÐá,Ã@ç/à ".Ãð).ÃÐL0ÃZ3ÃH6Ãr/Ã@á0Ãp\0Ãà—*Ã'1à 1Ãp,8Ã'1ÃP0ðþ/àN1ÃÀ¨/ÃpJ3à ¥-Ã@á0ÃÀ~6Ãð¦.ÃÀ1.Ã0Þ*à Ã(Ãà+Ãð;+ÃpÙ0Ãph.àN1Ãàð0à 0ü1à`.ÃÐX.ÃðS'Ãà‹,Ã`;/à ".ð,à 4+à ™/ÃQ.Ãð;+Ãàü.ÃÀº,Ã`¬1Àq3à (-Ã0I.Àú1Ã`6ð™+Ã@+à ™/Àƒ0ð/ð-Ã3/ÃÐL0ÃP.Ã0¨3ÃÀ3ÃpÁ4Ãp86à +Ãpý*ð‡.àN1À /ð“,ÃÐF1Ã@á0Ã@v-Þ2ÃÐÕ.Ê+Ã`G-à ‡2àH2àT0Ã0Æ.Ã@Û1Ã92ä5Ã0%4àT0ä1ÃÐ:àé,à(ÃÐ^-ÃàÞ3Ã`Ê,Ãàð0ð/àT0ÃP…1ÃÐÃ1à ¥-ÃÈ/à 0Ãàê1àé,ðò1Ã@Ï3ðþ/Ãpë-àË1Ã`5ÃP2ê0ð«(ÃÂ,Àî3à o6Ã?1Ãðp7à ¥-ÃÀ+/Ãp,8Ã\=Ã@Ï3Þ2à`.ÃÐ@2Ã`Ž6Àú1ðÚ5Ã4à “0Ã@L4ÃÀ¢0Ã-0à ™/Ã`ˆ7Ã@á0ð3à /Ãé0Àe5Ã@ç/ÃPð4à`.Ãp\0àé,ÃP0Ãæ*àB3ÃÀ=,àÅ2ÃÀ¢0Ãl0Ã@ù,ð/Ã÷8Ãp(Àô2à*7à65àT0ðW6à³5Ã@ÿ+àB3ðc4Ã3ä1Ãæ*àã-Ãr/ÃÐF1Ãpµ6ð/Ãày/ÃÐ:3Ã`M,Ã92à§7ÃZ3ÃÐÉ0Àî3à 3ð“,ðŸ*Ã@.9ÃÐR/ÃPö3ÃÎ.à ™/Ã0Ò,ÃP1ÃÐ44ðþ/ðu1ÃàÞ3à:ÃpÙ0Ã5àH2à 4+ÃÐ@2Ã@d0Ãx.Ã@+ÃÀ–2ÃP/ÃpÙ0ÃÐÏ/à L'ÃÐj+à(Ãp€*ð/ÃÐÃ1ÃÐ:3ÃÀ1.Ãàa3Ãàð0ÃQ.Ã0Ì-Ã`Ö*ÃŒ5à Ÿ.Ã05Ãpz+ÃpD4ÃpÍ2ÃÔ-Ã-0ÃP-Ã`M,Ãé0ð‡.à 0Ã3Ãé0Ã0À/Ãàm1ðc4ðò1ÃP‘/ÃÎ.Ã0´1ð/ÃPö3ð3ÃÐL0Ã`¸/ÃÐÉ0Ãð”1Ã`)2Ã~-Ãàê1ðò1ÃP‹0ÃT4ÃP©+Ãàö/ÃB7Ãðÿ4ð{0Ãc+ð"*à 4+Ã,ÃðY&ÃÐí*Ã0a*Ã0º0Ã0g)ðø0ÃÐá,Ã`Ä-Ã0=0Àƒ0ÃpÁ4Ã`¦2ÃÐÃ1Ã`²0Ã`50ðc4Ã@d0Ã`¾.ÃÎ*ð()àÝ.ÃP—.ðþ/Ãð).ÃH6Ã0¢4àl,À0)Ãæ*àã-ÃÀŠ4Ã0C/Ãð¸+ðu1ð{0à 3Ã@p.ÃÀÆ*Ãf1Ã0Ø+Ã0+3Ã0O-ÃÀ¢0ÃpP2Ãï/Ã`Ê,Ã`;/ð·&ð‡.àf-Ãð”1ÃÀ+/ÃPD'ÃK+ÃÐá,Ã`Ð+ÃЬ Ãà‘+ÃàÞ3ðì2à «,Ãpå.Àú1Ã@j/ð/ð/àõ*ÃpV1à þ3ðŸ*ÃÀœ1ÃðG)Ã@)Ãpt,Ãð¾*ÃÈ+Ãpt,àé,à`.À}1ðø0à×/à .,Ãp†)à Ÿ.Ãp27Ã3/Ãð).ÃÀ=,ÃÐ^-Ãð|5Ãpý*ÃÐí*Ã0Ì-ÃpV1ð“,Ãpz+Ãc+Ö)ÃðÐ'Ãð /ÃП7ð{0ð+Ãà©'À.ð .Ã`¦2ÃpÇ3ÃÎ*à “0ÃÐp*ð«(Ê+Ã@v-ð/Ãà.àr+ðÚ5Þ2àÝ.à„(Ãà )ÃP2ÃPµ)ÃÐj+ÃP1Ã0º0à Ÿ.Ãpt,Ãõ.À1ðþ/Ãð).Ã@á0Ãpñ,ÃÀÀ+ÃÀ%0Ãr/ÃÀU(Ã0I.Ãph.Àô2ÃÀ2Ãð¸+ÃÐd,àé,ÃpÇ3ÃP.àr+àã-à i7Ã0[+Ã`;/àx*À›,Ã@F5à Ÿ.À<'Ãà—*Ãð²,Ãà+Ã0º0Ã0ö&ÃÐÏ/À¡+Ãð¦.ÃP0Ãx.ÃP—.ð“,Ãð¸+à 2Ãð/-Ãpý*à ¥-Ãpn-Ãx.Ã`;/àõ*Ã@+ð-ÃÂ,Ã9.ÃÀ+/Ãã1Ãð/-ÃÐd,àÑ0Ãð¸+Ã,àã-Ãðp7àf-Ãà&(ÃÐ|(Ãp£9ð/Ã92ÃðÄ)Ã@v-Ã`}$ÃPµ)Àƒ0àl,ÃЂ'À.Ã@v-Àô2ÃP2ÃðÐ'à :*ÃÂ,ð“,À**ÃÐŽ%ð-Ã9.ÃPm5Ãp>5ÃP1ÃÀ¨/à×/Ã0À/Ã4Ãã1à 1Ãpý*ÃQ.ÃÂ0ÃÀ„5Ã`4ÃQ.Ãà.à ø4Ã0´1Ãð‚4ÀÜ6ÃÀ¢0Ã@R3Ã@Û1à þ3ÃàØ4ÃpV1Ãн2Ãðù5ÃÀõ7Ã@á0ÃPä6ðQ7Ã0Æ.ÃÀ3ÃÀ~6À_6Ã0œ5Ã@«9à$8Ã0¢4Ã-0ÃPü2Ã0¨3ÃPs4ÃÀœ1Ø3ðÔ6Ã-0ÃÀ5ÃÐ:Ã07Ãð|5ÃàÞ3ðc4Ã0Æ.Àè4ÃÐÃ1ÃðŽ2à­6Ã`2Ãp86à9Ãå;ÃË5Ã?-ÃÀ~6Ã@@6Þ2ÃP&,Ã0 8ÃП7Ã0é=Ãб4ÃÀ 4à à8ðÔ6ÃPy3Ã@";ÃÐ:ðì2ÃPs4à Q;Ã0:ÃP -ÃPð4Ã`;/ÃP2à ò5à {4ðo2à 1à ø4ÿ7ö2Ã$<Ãp>5ÃPm5ÃàI7Ãð2Ãàê1Ã@É4ÃPs4ÃÀé9À5=Ãðv6Ãý;ð!?à <Ã0Z@Ã`8ÃðÃ>À;ÃÐ<á<à¹4ð¶;Ã@(:Ã0l=Ã0r<ÃàÆ7Ã`á=Ãp£9ÃðÉ=Ãà@ç;ÃÀÑ=Ã0×@Ã@>À²=ÃpÒFà °@ÃpsAÃð±Aà <Ãàº9Ãà+<Ã@“=à=Ã÷<ð†CÃpmBà È<Ãp…>Ãt9Ã@@6Ã!6Ã`LAÃÐàAÀ Dàw?ÃpêBÃàCÃp…>àq@ÃÇDð9;À#@à 3@Ãp‹=Ãë>ÀÿEÃÀ›Fð°<ÃàÆ7ÃP?ÃÐ ;Ã`d=ÃÙ=Ã0û:ÃpaDð’AàkAÃPÆ;ÃÀ„5Ãà¢=à ¼>Ãp‹=Ãt=Ãp?ÃðF>ÃPº=Ãàœ>Ã`í;À¾;ÃÐQDÃ@@ÃðÏ<É@ð˜@ÃÐþ<Ã`Û>Ã`Õ?Ãp=Ã0r<Ãñ=ÃP==ÃÀ0CÃVBÃà–?Ãð·@ÃàÀ8ÃÀ0Cðž?Ã@=ÃàÒ5Ãà®;ÃÀT=Ãp?ÃPÀ<Ãh?Ã0é=ÃÓ>Ã@«9Ãp?Ãñ=Ã@";ÿ7Ã0Š8Ã`|9à Ô:Ã@:7Ãp‘<ÃÀ6ÃðR<Ãp—;à;Ãà´:Ãpy@à È<Ãðp7à‰<Ãý;Ãà–?à Q;ðÚ5Ã0:ÃÐ"7Û=Ã@(:ÃÐ ;à$8àƒ=Ã5ÃPØ8àî@ãFÃ0„9à*7ÀY7ÃðŽ2Ãp?ÀS8à Ú9Ã?Ãp;ð¼:Ãß<Ã69Ãp‹=ó9Ã0:ÃÀã:Ãà¢=À;Ã`ˆ7Ã0×@ÃpsAÃp;ð?:Ãn:Ãp?Ã>BÃà–?ð3<ÃÐ8Ãë:ç;Ãp=Ã$<ÃЫ5Ãàº9Ãз3à à8Ã@Ã5Àw2à Î;ÃÀÑ=Ãp‘<Ãp&9ðc4Ãð1ÃÀ~6Ãðp7Ãð|5ÃП7Ãý7Ã`8Ã@.9à ì6ð¤>Ãpµ6ð¼:Ã0:ÃÀû6Ã0´1Ã*;ÃÐ¥6ÃÀï8ÃPê5Ãz8ÃPg6ÿ7Ãðá9à u5Ãp¯7Ãðp7à×/Æ6ÃB7ÀY7ðì2à•:Ã09Ãp27ði3Ã’4ÃPm5ÃÀ–2ÃPÞ7ð‡.Ãð‚4ÃN5Ãðˆ3Ã’8Ã0Š8ÃPg6à i7Ãð‚4Þ2ðu1Ãðj8ÃÐ(6ðæ3ÃpÇ3Ãàa3ÃP1Ã06Ã!6Ã`š4ÃÐ.5ð]5Ãð|5ÃPÞ7ÃpÁ4à ø4ÃàÆ7ÃÀr8ÃPð4Æ6à i7ðò1Ã`Ž6ÃP2ÃN5ðÚ5À}1Àq3Ãf1Ã07ðÂ9Ã@Ã5ê4Àô2Þ2Ãp :ÃŒ9Ãàs0Ã@j/ÃpD4à<4à o6Ã×3Ã5ÃpV1ÀY7ðþ/Ã?1ÃP‹0Ã`4ÃÀ6ÃÀ¨/Àƒ0Ãã1ðò1Ã0–6à {4ðc4ÃPg6à ‡2Ã`¸/àB3Ã0º0ÀÜ6ðu1ÃÂ0Ã@Õ2ÃÐÃ1Ãl0ðø0Ã`¦2à9à;Ã7Ã3ê0Ãб4à ]9Ã@Ã5ðò1Ã@F5Ã0¨3Ãp»5ÃP2Ã’4Ã07Ã`‚8ÃÐL0à {4Ã`Y*à 2Ã@p.Ã0Æ.Ã-0ðà4ÃÐF1à ‡2Ã33ÃPa7Ã'5à ‡2ÃÀé9à=à­6ÃÀï8Ã@@6ðà4à65ÃPI;à “0ÃH6Þ2à u5ÃK/ÃPö3ÿ7Ãð2Ã07ÃpÍ2àB3Ã@<Ã`8à 3ÃÝ2Ã-4Ã0À/Ã`š4à*7ÃÀ=,ÃŒ5ÃÀû6ÃÀf:à à8Ã7ÃÀ6Àw2ÃÐL0ÃÐá,à {4Þ2Ã@á0ÃPm5Ãã1à c8ÃÐ.5Ã`ˆ7Ã`50Ãðˆ3Ãð¦.Ã9.Ã’8Ã69Ã8ÃPg6ÀM9Ãðj8à K<à 3ÃP/ÃÀ%0ÃpÙ0À0à þ3Ã0´1Ã@í.Ã'1Ã@É4ÃÂ0Ãf1ÃPy3Ã012ðª=Ãp©8à c8Ãp»5Ãðj8Ãàê1Ãr/ðW6ÃÀ2ÃŒ5Ãб4à¿3Ãð0Ãàm1ðK8À‰/ÃàC8Ãðí7ÃàÞ3ÃП7À /àB3Ã`#3Ãà7:Ã0À/ÃÐÕ.Ã?-ÃPy3Ã`6Ã`ÿ8Ãàa3Ã9.Ã0¢4à 6Ã0%4àÅ2ðu1à65à§7Ã`50ÃÀ–2Ã0´1Ã@:7ÃðÕ;ð-Ãà[4ðò1ÃÔ-ÃÐ44ðò1Ãðp7ÃpÇ3à ò5Àè4Ãpß/ÃÀ´-Ãð#/ðþ/ÃN5Ã05Ã0¨3ÃàU5Ãñ9ÀA;ÃÐ@2ÃÀ®.Ã'1ðÎ7Ãð¦.ÃPö3Ã4ÃàÞ3Ã`¾.ÃpV1ÃÀ3ÃP2ÃàU5Ãpb/Ã@^1ÃÀ´-À•-ÃP0Ãp¯7ÃPê5ðc4ði3Ãý7Ã`š4ÃpP2ÃP2à:Ã'5Ã0Æ.Ã@Û1ðì2À§*À}1ÃÀŠ4Ã`¬1à ‡2Ãðÿ4Ã`5ÃZ3ÃЙ8ðK8ÃÐ<Ãl0Ãà&(Ã012Ã0´1ÃpJ3ÃP&,Ãð¸+ÃP—.ÃÝ2àË1Ãðÿ4ÃpÓ1Ã4Ã0[+Ãàm1Àq3à ¥-ÃpÁ4Ã@48ÃÐL0Ã`/1Ãpb/À•-Ãз3ÃPy3Ã$<ðW6À.ü-Ã3/Àq3ÃÐ44Àƒ0ÃÀ2Ã0®2ÃT4Ã@#&àT0Ãðj8ÃÐX.à 3Àw2à¡8Þ2Àô2àé,Ã@á0ÃP2Ãàm1Ãã1ê4À¡+Ãx.à³5ðc4à 3Ãð1Ã0a*Ãà&(ÃàU5Ã`5ä1Ãp*Ã`Ê,Ã0%4à×/Ã?-Ã0+3Ã`²0à×/Ãé0àï+ÃÐç+À›,Ã*Àƒ0ÃP‹0ÃÐX.à É'ÃÀ3Ãðÿ4Àw2Ãб4ÃÐ^-Ã`;/ð“,ÃPð4Ãð²,À**à(ÃP£,ÃÐÛ-Ã0C/ÃÀ1.ÃP/Ä,ÃK/ÃÐL0ðþ/Ãà‘+ÃpV1Ãн2Ã-Ãà+Ãð#/à (-Ãðš0Ãð1Ã`5Ã@Û1ÃÂ,Ãf1Ãà.Ö)ÃðA*ð,ÃðŽ2Ãð;+ðþ/Ãàü.Ãð¬-Ãp€*à (-ÃK+à ‡2ð{0ÃÀ+/Ã`²0ðW6ÃÀŠ4Ãà‘+ÃÐó)ðc4Ã@ˆ*à 'Ãpñ,Ãà )Ã0+3Ãã1ÃÐá,ðŸ*Ãà—*àé,Ã@‚+àé,Ã0Æ.ð+ÃÔ)ÃpŒ(ÃÑ4ÃÀ2ÃpD4à`.Ã@ù,Ãpý*ÃŒ5Àq3ÃpŒ(à ¥-à .,Ã`M,Ã5Àô2Ãà—*Ã@@6ÃpV1Ãàü.Ãàs0Ãp÷+Ãï/Ã],ðò1àZ/ð‡.ð“,Ã@ *ð/Ãû-àl,Ã`Ö*Ãc+à “0ÃÐd,ÃpÙ0ÃE,àl,Ã0Þ*Ã~-à`.Ãð¸+à @)Ã{'Ãàö/Ãàa3Ãð).Ãp(ÃÐd,ð-Ã`Ž6Ã@|,àl,Ã@½6Ã*Ã@X2Ã@X2Ã`A.Ãpß/Ãàm1Àƒ0ÃÐd,Ã@ˆ*ÀÑ#àf-à 4+Ã`¦2À0Ã07Ã0O-Ã?-Ü(ÃÐR/ðø0Ã9.Ã~-Ãpñ,ÃK+Ã4ÃЙ8Ã@^1Ã`¸/ÃÎ*ÃPµ)Ü(ÃÀ3ÃÀ3àZ/Ã0O-ÃÐR/Ãà…-à “0Àî3ÃÑ4ð‡.Ã`)2Ã@@6ð“,ÃP&,Ãàm1ÃP…1Ã0Ø+Ãõ.Ã@j/Àâ5Ã?1À_6ÃÈ+Ãp†)Ãõ.Ã0¨3àT0ÃPü2Ã`¦2ÃÀ%0Ã@Õ2Ã@p.Ê+à×/Ã@á0Àw2ÃàI7Ã0%4Ãp÷+Ã`Ê,à (-Ã`A.à Ÿ.ÃE0Ãx.Ãàð0ÃpP2Ã0+3àÑ0Ãð).Ã`#3àé,Ãð2Ã0¢4Ãà£(à 3Àú1ÃPü2ÃÐ:3ÃÐá,ð/Ã@Û1À‰/Ã`;/À›,ÃÐL0Ã0+3Ã-Ãp*Ã0Æ.Ãà[4ÃàÒ5ÃÐÃ1ÃÐj+Ã0s'Ã`/1à «,ÃP -Ãã1À‰/Ã0Ì-ÃÀÌ)Ã0+3à 2à (-Ãà'Ãà‘+ÃÈ/Ãð#/ÃÐX.Ãp86Ãð4ðŸ*àÝ.à06ÃÎ*ÃpÇ3ÃT4à 1ÃÀ7-ê0àË1Ã`;/à “0ÃÀ´-ðò1Ãp>5à65ÃÐL0Ã@á0ÃðM(à ¥-Ãi*ÃP>(ÃP©+ÃÀ+/ÃÐÛ-Ã@Õ2Ãpß/ÃГ9ð]5Ãð /ÃÀ5Ãð 3À0Ãð 3ÃÐ"7ÃÚ,Ã`¾.Ãõ.ÃÀ1.ÃÀ1.ÃPü2ð]5Ã?1ÃÀ3Ãàa3ÃP-ê0à +Ãà…-àf-ÃPm5ÃàÒ5ÃðA*Ã0I.Ã0I.ö.Ãð¬-Ãð /À6(Ãàm1ÃÀº,Ãð¦.ÃÐÃ1Ã0=0Ãàs0à 3Ãàä2ð/ÃPy3ü-Ãæ&À_6Ãð#/àÝ.ÃÀõ7Ãðš0ð.(Ã@X2Ã@½6Ãðÿ4à u5àZ/Ã0+3Ã0¢4Ãàê1à 0à×/Ã`)2Ãr/ÃÔ)à ™/Ã0Æ.Ã0º0ÃpÍ2à&ÃðÖ&À-Ã@½6Ã@Ï3Ãàa3ð .ö.Ãð0Ãn:Ã-0Ã?-Ã÷8Ã`2Ã0m(à Ÿ.Ã'1Ã,À.Ãð|5Àe5ÃÐ@2àÝ.À /Ã`;/ÃÀ1à þ3ð+Ãph.ð/à .,Ö)À›,Ãpn-Ã0%4Ãpn-Þ2à c8Ü(À1Ãðš0Ã,Ãpñ,àÑ0àf-À.Ã*Ãpb/ðþ/Ãp'À­)Ãð‚4Àè4Ãp»5Ã~-ÃpÙ0à(ÃP—.Ã012àT0ÃpP2Ãà+Ã@ù,Ã0¨3Ã-0ÃÐv)à(Ã`/1ÃÀ´-Ã*Ãpb/ð«(à ½)ÃÐÛ-Ã0=0ÃP2à ™/Ã69ÃÝ2Ãò(àõ*ÃÎ*Ê+ÃÀ=,Ã3/Ãx.ðþ/Ãð¬-Ãõ.ð«(ðþ/ÃÀÀ+Ãph.à ½)Ãð¸+À¡+Ã0O-ÃÀ3Ã@X2ð/ÃÈ+À0)ê0àÑ0ÃP.Ãð;+Ã`50Ã`¸/Ã'1ÃP1à×/à 4+Ãõ.ÃÐù(Ã@‚+Ä,ÃÐ^-ð{0Ã`5ÃÐá,àï+Àw2Ã0œ5ð¥)Ãð¦.Ãpå.Ãc+ÃÐ@2ÃÀ´-Ã`Ð+Ã`A.ð-Ã@p.ðø0à ½)Ãpß/Ã0®2Ã`Y*Ãàs0ð‡.ÃÐX.Ã`Ä-Ç%Ãf1à ¥-Ãpå.Ã~-Ãð5,ÃÀØ'à 4+ÃÐv)Ãl0Ãpñ,À}1ÃÀ1Ã@í.ÃÀ 4Ãà+Ãàµ%ð-ä1Ãà*ÃÀÆ*ÃÐX.À‰/Ãð¬-ð‡.À.ÃP‹0Ãð²,Ã0a*ðŸ*ð«(ÃÀ´-ÃP8)Ãpý*ÃàÞ3ÃE,ð¥)àN1àN1Ã0+3ÃÎ.à<4Ãày/ÃP8)ÃÎ*Ãf1à³5ðþ/ÃÀ 4Ã],àÝ.àN1à (-ÃQ.ÃÀ 4Ãp\0ÃÀ–2ÃpÓ1Ãðù5ÃàÒ5Ã92Ã@ÿ+Ã`50Ã@d0Ã0C/ð,Ãph.ÃP…1Ã,Ãp*ÃÀ+/ÃpD4Ã`G-ÃÐ^-àN1ÃÐF1Ãð|5à ‡2ÃÑ4Ã4ÃÐá,À.ð()ÃÀ1.ð“,Ãàö/à Ÿ.Ø3Ã`4ÃÐÃ1Ãpë-ðW6ðþ/àr+ÃPö3Ã{'à þ3ÃÐÛ-ü-Ãàs0Ãõ.ð/ä5Ã@ç/Ãp\0ÃP/ÃPU9ðAÀA;à>ÃÐ<ÃË5ÃÀ2ðc4à 3ÃÀ~6ÃÐÛ-à&Ãà+ÃW-Ãï/à /ÃpJ3ÃÀé9Ã7Ãð¦.Ã@@6Ãà=9ÃÀ„5Ã`#3Ãðš0ä1Ã0´1ÃàÌ6ðE9à­6à {4Ã0¢4Ã0+3Ãc+ÃP.Àú1àé,Ã`/1ðø0ÃÀ+/Ãàs0Ãð”1À0ÃpÓ1Ãà‘+Ãà.ÃðA*ÃPµ)ÃP0Àè4ÃW-à «,Ãб4Ãpå.ÃP‘/ÃK/ðà4Ãð‚4Àk4ÃP2Ãð²,ÃÐÛ-ÃÀ®.Ãpb/Ãðÿ4à “0À,Ãï/Ã`²0ÃÀ´-Àƒ0ÃÚ,Ã@ó-ÃÀ1.ÃÎ*Ã0U,àû)ðŸ*ÃP&,Ã@Õ2ÃÐ¥6Ã`è'Ã0I.Ãp÷+Ãàm1À /Ã0´1Ã`¦2Ãз3Ãpå.Ãàm1ÀY7ÃP1ð-ü1Ãàê1Ã~-Ã0O-Ãàa3Ãï/ÃpV1Ã0Ø+ÃÐL0ð/Ãày/ÀA;Ãàö/ÃPü2Ãpb/ê0ÃT4ÃÀ=,Ãàê1ðæ3à 3ÃQ.Ã@+ð+Ã@^1Ãã1Ãc+ÃÎ.Ã0œ5ÃÀ+/Ãð¸+ÃP,+Ãp&9Ãp>5Ãû-Ã0º0Ãé0Ãà,Ãн2ÃÂ0àT0Ã`A.Àô2àx*Ã0Ì-Ã@ù,Ã0I.Ã0Ø+ÃÀ¨/ÃÐÕ.Ã33À7Ã@½6ÃPö3Ã@^1ÃK/à 2à Ô:ÃÐ"7ðW6àÅ2Ãé0Ã`¦2à)ÃÐ^-ÀÜ6ÃÐF1à ‡2à 1ÃPs4Ãðá9ÃЫ5Ã0x;ÃPI;Ã÷8ÃN5Àe5Ã@:7Ã×3à u5Ãð4ðu1Ãð 3ÃŒ5ö2Ø3Ã7ÃpÙ0à 3à65à¹4Ãàg2Ãб4ÃÝ2Ãз3Ã`)2ðø0Ã-ÃPs4Ão)ð3ÃÐ8ÃП7Ãr/ð-Ã@p.Ãð/-à (-à 2Ãàm1ÃàU5àN1ÃpV1ÃPö3ÃàÀ8ÃÐ.5ÃÐÉ0Ã`¦2ÃpÁ4Ãð4ÀÜ6Ãñ9ÃÀé9ÃPm5Ã@F5Ã0¨3Ãð¦.àã-ÃÐX.ÃÀ3ÃPö3ðu1Ãðù5àT0Ã@Ï3ÃT4Ã`¸/ðþ/ÃE,ÃÐ44ÃП7ÃÀ5ÃÀx7Ã@X2Ã`8ðÎ7Ãõ.Ãà.Ã,Ãð4ÃPö3ÃàU5ÃP—.Ãp¯7Ã÷8ö.ÃÐ44Ã4Ã`¾.àË1à æ7ÃÀŠ4ÃP.Ã3/Ã@X2Ãph.Ãpz+Ã@í.ÃPð4Àk4ð/ÃË5ÃP©+Ãp'ÃÐ:3ðæ3ä1ÃàU5ÃPg6Ãðˆ3Ã@(:ð/ÃpD4ÃP‹0Àw2Ãð0ÃPä6Ã?1Ã'1Ãpß/ÃpÙ0Ã0œ5ÃPü2Àú1Ã@½6Ã`š4ÃàO6Ãp\0Ãð/-ÃpJ3ðž?ÃPÆ;ÃPg6ÃÀ6ÃpP2Àe5ÃpÁ4Ã`/1à (-àf-Ã5Ãðù5ÃÐÕ.Ã÷8Ãðá9ÃÀ6ÀÖ7Ã`6Ã@(:Ö)à 3Ã06ÃЇ;ðo2ðW6ÃàI7Ãàa3ðæ3ÃPê5à 3ÃÅ6ÃPÞ7à 2Ãà,ÀÜ6Ãàð0Ãà=9à ¥-ÃÐL0Ãàö/ÃàO6ÃЙ8à65Ãr/Ãð¦.Ã@”(Ã`M,à /ÃPy3Ãà7:à (-ÃЙ8ÃÀ 4à65ÃàÞ3Ãé0Ã0~:àÅ2à×/à {4Ã@F5Ã@·7ÃÀŠ4Ã'1ÃpV1ði3ÃàÒ5ðÚ5ÃÀ2ÃЫ5ÃÝ2à*7Þ6Ã3Ã@d0Ã`G-Àô2Ãp86ðc4ÃÀ3ÃPÞ7Ã÷8Àô2ðu1ÃPy3ÃàÞ3Ãpß/Àw2À}1ÃÐ(6ÃÐÛ-ðo2ÃP…1ÃÀ6ð/Ã`G-Ã0À/ÃÀ¨/àã-Ãp»5ÃP‹0ðo2ä5Ã0–6Ãpµ6Ãà[4Ã`50Ø3Ã@d0Ã0¢4Ã` 7Ãàm1Ã`;/ÃÈ/Ãàê1Ãp©8Ã0õ;Ã@(:Ã5à þ3ÃðÛ:Ãð|5ÃÐ44à‰<àÅ2à 1Àq3Þ6Ã`Ž6ÃpJ3ðQ7àT0Ãð¦.ÃpÙ0à 3ÃpÇ3ÃàO6Àâ5ÃàI7ðæ3Ã0®2Ã@½6Ã07àB3Ã-4Ã@Õ2ÃÐ¥6ÃP‹0Ã'1Ã@ç/Ãp»5Ãð²,à .,à 1ÃàI7à¿3Ã05ÃÀ7-Àw2Ãà[4Ä,ÃPö3Ã0¨3Ãð¬-Ã3à06Ã`Ž6ÃÀ2Ã33Àî3ÃàÆ7ÀÐ8ÃÀ3í:Ã0Ì-à u5ÃÀŠ4Ã-Ãàö/Ø3Ãð^:Ãðš0ÃPü2ÃPa7Ãã1à¡8ðc4Ãr/ÃàÇ"ÃÀÀ+ÃàÒ5ÃÐj+Ãà.Ãðv6à “0ÃàO6ÃÂ0ÃðŽ2ði3ÃP0à 3àB3àÝ.Ãpå.ÃB7ði3à06Ãð 3à ò5Ã@d0Ã@Ã5àÅ2à (-Ã`²0Ãàð0Ãf1àÅ2ÃP2Ã!2ÃàU5ÃpJ3Ãf1Ã3/ÃpJ3ö2Ã@ç/ÃQ.Ã3/Ã09ÃÀ1Ãp27Þ6Ã@R3Ã0%4ÃK/à§7Ã@Õ2ÃŒ5àB3à W:À.à 2Ãàs0Ã3/Ãð).Ãã1Ãð2Ã@^1à65à þ3ÃT4ðu1Ã@R3À-Ã92Ã05Ãp\0ÃPð4ðo2ÃðŽ2Ã@X2ÃÐ@2ÃŒ5Ã0®2ÀÖ7Ãày/Ã`ÿ8ÃÐWCÃPs4ÃÀ2ÃË5Ãð /àé,à ".Ã5ÃÐ44Ã@F5Àq3ÃÀ¢0àÑ0à 1Ã`50à 1Ã` 3ÃpV1ÃÀ–2Ãð).ÃPg6ÃÀÀ+Ãà.ÃP-Ã`²0Þ2Ãàm1ê4ÃÀº,ÃpJ3Ãð 3Àâ5À0Ã@X2ÃPO:Ã0À/à 2Ãr/ÃÐ(6Ã`#3Ã@É4à /Ãû-Ã@X2Ã×3ÃPy3ÃPm5Ã`¸/Ãû-ÃPs4Ã0À/Ãð¦.à ‡2ü1Ã@F5ðþ/Ã’4Ã'1à {4à×/Ã`²0ä1Ãðš0à «,à ‡2Ãð”1Ãð#/ÃÐí*ÃP/ÃÈ/Ãð 3ÃÀ%0ÃÀÀ+ÃÀ®.ÃPm5ÃÀ¢0Ãð /Ãpn-ÃÔ-Ã@d0Ã`¬1ð/ÃÝ2Ã` 7ÃÐá,ÃÐF1ÃË5Ãàö/Ãàö/Ãð /Ã@Õ2Ø3à<4Ã3/à~)Ãð”1Ãà,ÃP2ÃPê5Ãà[4ÃH6ÃÀ5àZ/à ‡2ðþ/Ãpb/Ã0Ì-Ã0=0Ã?-ÃÐÉ0ÃÐ@2ÃÀ+/Ã@R3Ãà‹,Àî3Ã`)2Ã0®2Ã`¬1Ã0I.ÃÀ1.Ãà>$ÃpV1Ãp»5Ãr/Ã09ÃpÙ0à 2Ã0´1Ãð 3à “0àf-ÃpÍ2Ãн2ÃÐX.Ã0O-à 0ÃP1ÃÐÃ1Ãðˆ3à Ÿ.Ã],Ãð‚4ð/Ã`8ðc4Ã`Ž6Ã*;ð-ÃÔ-ÃÀ%0ÃÐ44ðo2Ã0a*Ã071Ã`A.à 3Ã09ÃPg6ÃÐR/Ãðp7Ã`¸/ÃÐÃ1ÃPü2Ã8ÃÐá,Ã0I.ÃpÙ0ÃÐÕ.Ãã1ÃÚ,ÃðÄ)àÝ.ÃÐ:3Ãð”1àf-Ã`Ä-À0Ã-4Ã3/Ãé0Ã`2Ã@^1ÃP‹0ÃÐÉ0à “0Ã`Ä-Àú1àN1àÅ2ÃPä6ÃÐ(6ÃÈ/Ãà+Ã92Ã0œ5ÃP2Àè4Ã0´1Ã`|9ÃZ3ÃÐF1ðo2ðc4Ã`¸/Ãp:ÀÜ6ü1ÃàU5Ã0%4ÃPm5Àq3ÃÀœ1Ãà-ÃÀ2ÃPy3Æ6ð/Ã012ð3ÃP…1ÃÑ4Ã@X2ðÚ5ÃPa7Ã@«9à$8à›9àË1Ã`;/Ãàä2Ã0+3Àe5ÃÐ(6Ãà[4Ãðv6ðì2à¿3à 0Ã`¾.Þ6Ã@±8ÃÐL0ÃZ3ÃðÛ:ð/ÃÀ2ÃP2Ãp86ÃП7Ã`Ö*ü1à 3ÃàI7ÃpÍ2à ]9Ã’4ðu1ÃŒ5ÃÐ¥6ÃÀŠ4ÃÐ.5Ã@L4ðæ3Ã×3ÃPm5ÃÀ„5ÃàC8Ã09ÃÀ6ðc4ÃK/Ãpn-ÃÀ%0Ã@™<ðc4ÃPØ8ÃàÒ5Ãàü.Æ:ÃpP2à .,Ã`)2à65ði3ð-Ã0Þ*ÃpV1Ãp;Ã`Ž6ÃÝ2ÃÀ3ðæ3à*7Ã07à¡8Ã@“=Àƒ0Ãð1ðò1ÃÀ~6Ã@½6Ã0:ðÎ7Ã@·7ðQ7ÃPü2Ãàa3Ãз3Ãl0Ã`50ÃЇ;Ãð|5Ã`í;Ã`ù9Ã05Ø7Ã0+3ÃPÞ7ÃÀ 4Ã`4Ã3Ã@@6Ã'1ÀS8ð3ÃÐ{=à u5ÃpÁ4Ãr/à06Ã@É4ÃÀ5Ã`”5Ãý7Àk4Ãé0Ã`Ð+Ã4Ãý;Ã0¨3Ã0–6Ã0Æ.ÃT4ÃàU5Ã`#3ÃÀ~6Ãðv6ÃЙ8ÃðÛ:Ãp»5à 3ðE9Ã`v:Ãý;ÃÀ=,ÃB7Ãn:Ãðj8Àƒ0Ã071À_6à¹4Ã?1Ã÷8ðc4Ã0=0ði3Ãp©8ÃÀï8ÃàÞ3Ã`š4Ãï/ÃÀŠ4Ã`‚8Ãðí7Ã0¢4Ã92ðÔ6ÀY7Ã`‚8ÃÐ(6Ãû-à¹4ÃÐÉ0Þ2ÃÎ.à<4Ã`8Ãp÷+àT0Ã@^1Ã-4ÃPö3Ãpß/Ãð 3ÃPa7Ã4ê0Ã0®2ÃPö3À7ÃÀ2Ã`¸/ÃP0Ã0®2ÃÐ:à ".À.À•-ÃÀ„5ÃÐá,ÃE,àH2à 6Ãð1à o6ÃZ3Ãð0Ã0Ò,Ã`¬1Ãн2Ã-0Ã`¦2àH2Ã@X2à ‡2ÃÐL0à 1Ãõ.Ãà[4ÃP2*à 3Ã4Ãð /Ã0g)Ã×3ÃàÞ3Þ2Ã@á0ÃÐ|(Ãp(Ã`;/ÃÐX.Ã@Ã5ÃÐó)ÃÀ=,Ã0®2ÃÀ1ÃpÁ4ÃðŽ2ü-Ã`)2àT0à 1Ã@v-Ãðÿ4Ã5Ãpß/ü1ÃÐd,ÃÀ~6À}1à³5À}1Ãàa3Ãph.Ã×3ÃÅ6ÃpJ3Ã`Ä-ÃàI7Ãð1Ã`/1ÃÐá,ð]5à­6Ãà.à×/àÑ0ê0à “0Ã@‚+ÃÀ3ö2à„(Ãàü.à ™/Ã`A.ÃðA*Ãð2Ã`¾.Ã3ðc4àË1à 0Ãx.ÃÀ+/ÃÀ%0ÃÀ–2ÃP1ðþ/Ã0œ5ÃpÇ3Ãðù5Ãp>5ÃÐR/ÃÝ2Ãð0Ã?1ð/Àq3ðì2ð-ÃP0ð“,ð,ä1Ã'1Ã×3ÃÀŠ4ÃpD4Ã-4Ã@X2Ã0¨3ÃÀ„5Ã'1ÃÀ–2ÃÐÏ/ê0ÃÐÉ0à c8àÝ.Ãp>5ðE9Ã012ði3Àú1ð-àÝ.Ä,Þ2Ãpå.Ã`;/ðò1à~)Ãàg2àÅ2ÃÀŠ4Ãp»5Ã0œ5ð-ÃPµ)àã-à ™/àé,à`.à «,ÃK+Ã'5ÃÐ.5ÃÀº,Ãàµ%Ã0[+Ã@í.à9ÃÀ1Ã`)2ÃŒ5Ãr/ÃÐ^-à¿3ÃÀ%0ÃÐÉ0à06ÃPy3ÃÝ2ÃðA*àï+à “0è&Ã!2Ã@F5ðø0Ãàð0Ã`¸/ÃÀ¢0ðà4Ã?1ÃP/Ãàm1ð+Ã0´1ü1Ãðÿ4Ã0´1àé,ÃPy3à þ3ÃpÇ3Ã0®2Ãx.ð/àT0ÃT4Ãн2Ã@Õ2àZ/Ã@^1À•-ÃPä6Ã@Ã5ð/àN1Ãð 3à 0ÃpJ3ÃЂ'ÃÔ-Ã`)2Ã0I.àH2Ãp»5ÃàÞ3ÃàØ4ÃÀ3Ã`²0ÃÂ0À1Ã33ÃpP2Ãé0À¡+Þ2ð .Ãi*Ã`2Ã@ç/à ‡2à`.Ã` 7ÃÀr8Ãàa3ÃT4Ãð).ÃpÓ1ÃÐÏ/ð{0Ã3/À-ÃpÙ0Ãl0Ã@ˆ*Àƒ0ÃQ.ÃQ.à ™/ðÚ5ÃP©+ð,Ã@É4ä1Ãày/ÃP-Àú1Ãð”1à /Ã`Ê,à “0Ã0C/ÃÀ 4Ã0Þ*Ã,Ã0®2ÃÐL0ÃpP2ÃQ*Ã0~:Ã0Š8Ã-4Ãpß/Ãàg2Ãp(ê0Àƒ0ÃÐÏ/ÃÀ2àH2Ã@ç/Ãð4ðò1ÃÀ3Ã0®2Ã-Ãб4Ã0%4ÃÈ/ÃÐÛ-ÃÐ(6Ã0œ5Ãf1ðu1à 1ä1Ãr/Ãp\0à æ7Æ6ÃàØ4àõ*Ãpn-ÃàÀ8Ãð /Ãð”1ÃpV1Ã`¦2à 2Ã`/1Ãp>5Ãý7ÃàO6À.Ãà,Ä,à ø4ð™+À /à 6à ø4à (-Ãðÿ4àË1Ã@¥:ÃÀõ7Ã`;/Ãð#/àN1à 1ðc4ÃÐ9À1à u5àË1àË1Ãx.Ãp»5ð{0ðu1Ã` 3Ãð²,À.Ã!6Ã07Ã`4Æ6Ã0%4ÃÐ^-ÃÈ+Ã0=0ÃÑ4Ã-Ã`#3ê0à 2Ø7Ãæ*Ã0+3Ã@^1Ã`/1ÃÀ´-ÃPy3Àâ5À0ðæ3àT0àË1ÃQ.Ãp>5ÃP£,ÃÐL0ä1Àƒ0ÃpD4ÃH6à ™/ÃÈ/Ãàs0Ã@d0Ã`Ð+Ãàð0Ã@@6ÃàÒ5Ã@á0Ãàs0Ã0ê(ÃP0Ãp\0Ã!2à þ3ÃP.ÀY7Ã’4Ãà+<Ã0„9Ã`Ê,ÀÅ%À}1Ã0Ø+àH2Ã`²0À‰/ÃÀ1.Ã0=0Ãàð0à 1Ã0´1ÃT4Ãl0Ãr/ÃÑ4Ã@ó-À‰/Ãð#/Ãà.ÃP»(ÃP…1Ã`¾.Ãþ&Ã?1ç;Ã`¸/ÃÀO)Ã`²0Ã!6Àw2Ãàa3àZ/Ã@š'à 3ÃÐÏ/ð-àH2Ã`¸/ÃÀ¢0ÃP/Ãàg2Ã?-Ã](Ãï/ð‡.à (-Ãà.ÃP1Ãà+ÃP0à*7ÃpÓ1ÃÂ0ÃE,ÃpV1Ãõ.àH2Ãð/-ÃP.ð3Ã`”5Ãàê1àT0àË1Ãï/Ã0[+ÃP1Ãà…-ÃPy3àB3Ã012À.Ã`Ö*àZ/Ã0œ5Ã~-Ãð¸+à «,Ãpå.ÃÐj+Ãpë-Ãt9Ã'1ð]5ÃP2Ã`/1Ãð¦.àl,Ã`Y*Ã`S+à Ã(Ã@|,ÃPÞ7à {4à /à þ3ð«(À.Ãðù5À‰/àr+ð"*Ãð/-Ã0À/Ã0–6ÃP.Ã0´1ÃÀ1ð-Ã`S+Ã0=0Ãðp7ÃÀ1.Ã3/Ã`²0àÅ2Ã`#3à u5ÃP.ÃÐL0ðu1Àw2ÃÀ2Ã@X2À}1ðŸ*Ãày/ð/Ãðˆ3Ãà‹,ðo2Ã0¢4Àw2Ãð4ÃÐ|(À§*ÃÀ+/ÃÀ¨/ÃPm5Ãp»5Ã`”5Ã@L4ÃP2ö.ÃP1Ãp,8Ã0+3Ã@v-Ã`Ê,Ã69ÃÈ+Ã9.à /Ãðd9Ã`50À‰/Ã0+3Ãð‚4Àk4àã-ÃÐX.ÃT4à ".à¿3Ã0œ5Ãð/-Ãàä2Ã`G-à¿3Ãð¸+ÃÐL0àË1Ã`/1ÃpV1Ã@Õ2Ã,àT0Ã0¨3Ã071Ã@í.Ãà‹,Ãpå.Ã0Ø+ÃpÁ4à 2Ã`¾.ÃÚ(àN1ÃŒ5Ã0C/Ãã1À /ÃÐp*ð/Æ:ÃpJ3ÃÀO)ÃP…1Ãàg2Ãàä2ÃÔ)Ã`5Ã*;ÃŒ5Ã0¢4Ãð”1Ãð1àõ*Ã`²0Ãé0Ãi*à)Ã0m(Ø3ð‡.Ã`)2àË1à (-Ã@p.à {4Ãõ.ð]5ð-Ã3/Ã0À/ÃÀ„5Àƒ0À.Ã’4Ãð1ÃP-ÃÀ+/Ãð‚4Ã@d0Ãpý*Ã0À/Ã0+3Ã0=0ÃÀ1.àT0Ãpß/à ò5Ãð¦.à 0àÝ.Àî3ÃàO6àé,Ãæ&ð()Ãàg2Ãpn-ÃÀ®.ði3ÃðŽ2Ã-0Àk4Àk4ü1Ãð‚4Ãpµ6ÃÐ"7Ã`í;ÃàÆ7À}1ÃP2À /ü1ÃpV1Ãàm1ÃP.ä1ÃP0à 1Ã@L4ÃГ9ÃàC8à i7ÃЫ5à i7ðÈ8ÃPs4Àâ5ÃPÆ;Ã÷<à>Ãp‘<Ã?à=àkAÃp[EÃ_GÃÀJûFÃ`·DÃàûCÃ0§HÃpgCÃKðåHÃð(CàGGÃ&Jà)LàPÃàOÃÀJÃà¹NÃ0úOÃÀÜPðµPÃNÃðNð>OÃÐ!LÃ0ÅCÃMJÃ;MÃ`KÃðÎQÃ@3MÃp%NøMà¾HðÇMÃPéJÃpÀIÃÀeOÃàÑJÀùFÃ`KÃPTNÃà³OÃàTJÃîDÃpUFÃ0³FÃÜGÃ…KÃÀHÃðFð\JÃðoLÃpCIÃ0BDÃàNKÃVBÃðøJÃ@WGÃqDÃp+MðzEÃeFÃpÌGÃÀ¿@ÃÀFÃpÒFÃÀ¡EÃ@iDà KÃpmBÃ06FÃ0JÃ0$IÃ`ŸHà DÃP~GÃà~CÃðIÃ>FàÜCÃ@oCÃ@iDÀvGàAHÃ,EÃÇDÃ@ÔGÃ@òBÃpIHà¾HàÐEÃÁEÃàTJÃ>BÃ`™Ià ÷Ià †GÃh?ÃмGÃàÝHÃ&FÃ@{AÀ/>Ãð¥CÃpUFÃ}BÃkEðAÃÀ§DÃà@à GÃ@iDÃ06FÃÐÈEÃð±AÃ0Ý?àq@Ã@iDÀ/>ÃAÃPBÃeFÃpgCÀ#@ÃÀ¹AÃÁAàSEà Q;ÃPBÀBÃ2Dð†CÃP?Ãà~CðtFÀ/>ÃðÃ>Ã`:Dà_CÃÙAÃ`ÃBÃz<Ãñ=ÃúBÃAÃð±AðnGÃîDàSEÃôCÃÐì?Ã@òBÃðÉ=ÃðR<Ãp…>ÃàïEÃP–CàkAÃÁAÃ0TAÃÐ<à °@À#@Ã`@CÀ)?Ãð·@ÃPœBÃð‡HÃp<ð€DÃPŠEÃ>Bà ¶?ðzEÀ DÃ`ç<ÃÐø=Û=ÃP==ÃH6Ãà?Ãà´:Ãà?Ãå;Û=ÀšAð CÃÀÀÄ:Ãp?Ãð.BàèAÃ07ÃPO:ÃPŠEÃpsAÃðÉ=Ã@<ðÂ9ÃÐ ;Ã`½Cà}>ÃàxDÀ)?ÃAÃ@þ@ðª=Ã`ç<ÃÙ=ÃVBà 3@à ¼>ÃÀN>Ãß<Ã?ÃÀ•GÃp‹=Ã?ÀM9Ãp86Ãë:Ãp‹=Ã0:Ã*;ÃÇ@à Ô:à K<À²=Ã0õ;Ãb@ÀAÃà¨<Ã\=Ã@þ@Ã0é=à ¶?ÃHà :ÃÐcAÃà AÃP¢AÃÀË>à}>Ãàº9ÃÀï8ÃPC<Ãà%=Ã?ÃÐ<ÃÐWCÃÐø=ÃÀË>õCÃ0›Jà JQÃwCÃÀ$EÃ0àú>ÃÐi@Ãp?Ã\Aàw?ÃÐ ;Ã`v:ÃÐ9Ã@™<Ãp :ÃðF>À²=ÃЇ;Ã@>À;Ã`R@à K<à Ú9ð¼:ÃAÀ;Ã÷8À5=ÃÀ¿@Ã`Õ?ÃÐ9ÃÀT=Ãà?Ã@Ÿ;Ãàœ>Ã0f>Ãpµ6ÀÄ:àú>Ãt9ðE9Ã69ÃÍ?ÃЇ;ÃPI;Ã@¥:à>À¾;ðà4Ãp‹=ð¶;à9à}>À¸<à Ô:ÃÐ ;Ã<8Àk4Ã`|9ÃÐu>à c8Ã@‡?ÀÄ:ÃPU9Ãñ=ÃË5Ã>à Ô:ÃÑ4ó9ÃÀï8ÃЫ5Ãðp7ù8ÃPä6Ã’8ð¼:ÃÀÝ;à È<À²=Ã07Ãn:ç;Ã0õ;Ãp»5à 9?ÃÀË>àN1Ã5ÃPI;ÃðL=Ã`j<à È<Ãà1;Ã`Ž6ð¤>à à8Ã@™<Ã`^>ÃÐ<ÃÀZ<ÃÑ4ÃÐ:ÃP==ÃàI7ð°<Ãý;Ã÷8Ã`/1À5=Ã÷8Ãå;Ãp&9Ãðv6Ãà AÃÐþ<Õ>Ã@ ?ÃÀÝ;ÀA;ÃðŽ2ÀÊ9ð9;ðÈ8ðo2à06ð'>À¸<ÃPg6Ã0+3ÃÀ–2ê4à ì6ÃŒ5Ã-4Ãt9ÃÀ5à ‡2Þ2Ãp—;Ã\=Ãà´:ÃÐi@Ã`í;Ãx.Ã`š4Ãz8ÀÄ:à:Ã`”5à {4ÃPÞ7Ã3Ãð‚4ÃPa7ÃÐ:ð@Ãñ9Ãб4Ãàä2ÃPä6à “0Àú1Ã07Ã06Àî3ÃpÙ0ÃП7À5=À_6ÃPÌ:Ã0Z@ÃPÆ;Ãp,8ÃPö3ð¼:Ã05Ã09à:Ãà[4Ãpµ6Ã@@6Ã0œ5à à8Ã@:7ÃPÞ7Ã@Ÿ;Ã`”5Ã0¢4Ã@¥:Ã@«9Ãp©8ö2Àô2ð9;Ãðv6Ãð‚4ÃB7Ãn:ÃPÞ7ÃЙ8Ã@+ð¼:à i7Ã8Àq3ðc4Ã@R3à 3Ãà=9ç;Ãt9ÃpP2ð¶;Ã5à 6ÃÀ6ÃpÇ3Ã`Ž6Ã0¢4ÃÐ"7Þ6ð]5Ã`#3Ã0®2ÃPU9ÃГ9ÃpD4Ã0–6ÃÐ:ÃÐÃ1Ã4Ã@Û1Ãб4ÃàÀ8ðø0ÃàC8Ãð^:à 3ÃZ3ÃÐ.5ÃpÁ4Ãð 3àË1àƒ=Ã@48Ã@L4Ã`)2Þ2ÃP…1Ãp>5ÃàI7à 2àÅ2Ãàm1Ãà[4Ã!6Ã@48Æ6Àô2ÃàU5ÃÐ ;à 3Ã@½6ÃPÞ7ÃPg6ÃÀ 4Àô2à «,ÃpÓ1ÃÀ„5Ã`Û>Ã` 7Ã@½6ÃÀ~6ÃPU9Ãý7Ã0œ5à þ3à 0Ã`Ž6ÃP2ÃÀl9À5=Ãð‚4ÀÊ9ÃÀ3Ãðd9ÃZ3Ãб4Àô2Ã÷8ÃP[8ÃàØ4Ã@«9Ã`LAðª=Ã0Ý?à 9?à:à ¼>ÃpmBÃÀ$Eà °@Ãp[EÃÀHÃàxDÃpUFÃIÃèEÃ@oCàAHà¦LðëGÃðGÃ0¡IÃ0¡IÃp®LÃ`«FÃÀ IÃ0›JþLðÇMÃ`ŸHàÄGÃð HÃÐNÃðòKÃðIÃpØEÃMøMÃÀKÃp+MÃÐnTËJÀdJÃð HÃð HÃ&FÃ`(GÑIÃà§Qà ßMÃ`iQÀÏMð‹WðµPÃðÂSà¦LÃPHPÀ.SÃÐýQÃ0ôPÃPÑNà VOÃÐ’NÃ0KÃLÃÐ'Kà >SÃÀ_PÃ`ìPÀ±RÃÄKðÙJÀ"UàNÃðIÃp¨MðÍLÃaQÃp1LÃ#Qà \NÃðoLðUàRÃPïIéIÃà§QÃRÃ@EJÃgPÃ@9LÃàBMÃLÃp´Kà ÁRÃmSð2Qà hLà hLàQÃ`oPÃØRÃÐNàNÃÀSRà \NÃ`JÃp„SÃP×Mà €HÃðFÃàTJðXÃðRÃ0›Jà¸I×LÃÊJÀ‚EðÙJÀvGÃ@ÈIÃà¿MÃжHìOÀ(TÃðNÃð{Jà tJð\JÃMJÃÐ!LÃ0¡IÃÀÜPÃpPÃpUFð÷EÃÀ IÃaQÃ#QÃðÈRÃÀHà FÃPfKÃâFÃÐOÃЪJÃàËKÃÐ PÀ±RÃÐOÃ@!PðPLÃPBQÃðWPà/Kà FàAHÃðàNÃ0§HàˆQÃ`"HÃÐ9HÃP`Là¦LÃÀKÃp+MìOÃ@EJÃ@cEà¾HÃ0$IÀ^KÃ@WGÃpUFÃPéJà tJÃ0¹EÃðàNÃàTJÃ0¡IÃÀ$EÃPûGà €HãFÃp¢NÃYHÃð‡HÃ@QHÀŽCÃp®LÃ0 MàSEÃh?ÃàrEÃpgCÃð“FÃÐ?GÃÀwLàÖDÃ}BÃ0HCÃPFÃ0NBà €HàSEÃ00GÃÜGÃ0³FÃÀÃàxDÃkEÃP–CÃP–CÃ@WGÃ0ÅCÃHà¦LÃ@þ@Ãð“FéEÃPûGÃÀ¡EÃP?ð†CÃpØEðDÃâFÃÐÔCÀEÃÍ?Ã8CÀ#@Ã`IÃà AÃð"DÃàïEÃ@cEðDÃ`“JÃ@=Ã`R@ÃPéJÃð¥CÃà%=ÃÙ=À¦?Ã&FÃpØEÃpØEà ŒFðAÃàrEà tJÃñ=ÃPº=Ãà>ÃÀ¿@ûBÃðŸDÃÐò>ÃPDÃèEÃàœ>Ã@“=ÃÀ$EÃÁAÃ@{Að’AÃ@ÚFÃðL=Ã`ÃBÃ0Z@ÃÐÎDÃ`·DÃÀ×<ÃP7>à K<Ã@{Að9;ûBðž?ÃàŠAÀ @Ãp‘<ð’AÃ>ÃJ@à ¶?ÃPÒ9Ãp27Ã`ù9Ã0Z@Ã@¥:ÃÀf:Ã\Aà 'Bà W:à Â=ÃÀã:ÃÐ{=ÃÀT=à ŒFÃP%AÃà@Ã`@CÃÐ9ÃP7>à E=Ãb@à <Ãn:Ã@ ?ÃÐò>ÃÐ<ÃÀZ<Ã0„9Ã=ÃP7>Ãn>Ã@>ÃÀN>Ã÷<Ã0`?Ãp?à Ô:à:ð¼:Ãàœ>ð3<ÃDAÃ@ ?Ãh;ÃP1?Ã@¥:à Ô:Ãp>ÃÀr8ðÎ7ÃÀZ<à>à›9ÃàÆ7Ãðd9ÃàÌ6ç;àú>Ãp¯7ðE9Ã`v:í:Ã`v:Ã`)2Ãð‚4Ã?Ã0é=ð@ÃðR<ð¼:ÃÐþ<ÃPð4Ã@Ã5Ãh;ÃP®?Ãð™EÃð.BÃpö@Ãpy@ÃàI7ÃPC<ÃÀf:Ã0Š8Ãý7Ãp27ÃP‹0à ò5Ãð^:ÃN5Ã@@6Ã0œ5Ã0–6Ã@<Ã0õ;ð-=Ãñ9ÃàØ4ÃÐ:ðQ7ÀÄ:ÃPÀ<À5=ÃàÒ5Ãð 3ÃàC8ÃàÀ8Ã@±8Ãp27Ã!6ÃP-Ã0¢4ÃàC8Ã÷8à$8ÀS8Ã`5ç;ÃÐ:Ãñ=ÃàÒ5ÀM9ÃPÞ7Þ6Ã09ÃË5Ã0:Ã@";ÃÀf:à9ÃÐ:Ãàg2Ã06à ¶?à>Ã@Ÿ;ÃÐ9ÃPØ8ÃÀx7Ã@™<Ã@Ï3Ã!2ÃÀû6Ã0Š8Ã`ù9Ã7ÃàÒ5ÃÐF1à <Ãð^:Ã`ç<Ãàa3ÃÀ6Ãp£9à³5Ã$<Ãð|5Ãñ=à 3Ã`¦2ÃàI7ðÔ6à <à¡8ÃPs4Ã`8ÃÐ@2À /ÃÀû6ÃPÀ<ÿ7ÃÐ9Ãp=à i7Ãðv6ÃðÏ<à§7ÃàØ4à æ7Ãpµ6ÀÄ:àú>Ãð|5Ãð:@Ãp27Ã06Ã’8à 3ÃÀ–2Ãë:Ø7ÃB7ÃÀr8ÃЙ8ÃPÞ7ÃÙ=à Ú9Ã`ù9Ã@½6Ã07Ã0:Ã8ÃÑ4Ã@48ð]5Ãðó6ÃŒ5ÃÀ3Ã0À/Ãpµ6Ã@:7ÃàC8Ãp,8ÃP2Ãp\0ÃpÁ4ðÂ9Ã0:Ãðj8ÃpÍ2Ãðá9ÃŒ5Ãð 3Ã`5Ø3Ã!6Ãðí7Ã@<Ãð|5Ã06Ã<8à ò5Ã@·7Ã69Ã`|9Ãpµ6Þ2ÃÂ0ÃÀ3Ã0~:Ã`5ÃÀ6Ãpå.ð]5àÑ0Ãðÿ4Ãp,8Ãp;à­6Ã@d0Ãp©8ÃpÍ2Ã;ÃÐ.5ÃÀõ7Ã0û:Ã@¥:Ã07ü1ÃàI7à Î;à•:Ãp86ó9ÃÀ–2ÃÀ 4Ã`)2ÃàÒ5ÃpÁ4Ã`#3ðø0ðE9ÃÐ<Ã@É4Þ2ÃÐ:3ê4àN1Ø3ðò1à {4ÃàO6ðÎ7àH2Ã0¨3à`.ÃàO6à¿3Ã@F5ÃÀ–2ÃPg6Ã`8Ã3à³5à 2Ãt9Þ2À7ðK8Ã<8ðc4Ãðˆ3ÃàØ4ð3Ãб4Ãp27ÃpJ3Ã3ä5Þ2ÃPü2àÑ0ÃPØ8Ã@d0Ãðˆ3ÃPð4ÃÀ5ÃPg6à à8ÀÖ7ÃÐ(6Ãðù5ÃÐ:à ™/ÃÀ2Ã05Ã@^1ö2ðÂ9ç;à¿3Ã`6ÀG:ÀM9ÃàO6Ã0º0ð-ÀG:Ã`ù9ð3Ãð¬-Ã07í:à Q;Ã@:7ÃË5à$8Àk4Ãàa3ä1Ã` 3ÃÐL0ðò1Ãб4ðW6Ã÷8Ãð4Ã0–6ÃpÍ2Ãß<Ã@d0Ãðˆ3ÃàÌ6ði3ðW6à ò5ÃPö3ð/ÀÐ8ÃH6ðÎ7Ã`)2Àî3ðo2Ãðó6ÃЫ5ÃÀ–2àû)ÃÐ¥6ðW6Ãз3Ã05ÃŒ5Ãз3à þ3ÃŒ5ÃpÓ1à 2à ‡2ÃàÞ3ÃÀ5ÃÀ–2Ã;ÃPü2Ã@Û1à c8Ã0û:ÃÀ 4àÑ0Àw2ÃÐ.5ÃÐ:3Ã!2ÀÜ6ÃPü2Ãðj8ÃàO6à<4à i7ð]5ÃŒ5à ò5Ã012ðò1ÃàÞ3Ãpå.Ã`2ÃÀŠ4Ã0¢4Ãpµ6à ™/à 2Þ2ÃÀ%0ÃÀ7-ÃÐ@2Ãé0ÃÐí*Ã`¾.ÃÀ3Ãp27ÃÂ0Ãàg2Ãð”1Ã@X2Ã@^1Ãf1Àe5Ã×3Ãàö/à06Ã`Ê,à*7ÃàU5Ãð‚4ÃÐ<ÃN5à æ7ÃPÀ<À²=ÃÀB@à¡8Ãà?ÃÀÝ;ÃP–CàÊFÃp…>ÃP%AÃBÃpy@àâBÃÀH?É@ÃPxHÃpsAà °@ÃàBàú>ÃpmBÃ0¹EÃÀ¿@ÃMJÃÐ?GÃÀ¡EàÐEÃPrIÃpUFÃ@øAÃ`¥GÃ8GÃ}BÃå?×Hà †GÃÀ§DÃ2HðBÃÀH?ÀùFÃÀ­CÃàBÃpaDÃÀ Ið’AÃÀ¹Aà DÃжHÃÜGÀ‚EÃð¥Cà EÃÀ¡EÃðþIà²JÃ2HÃ0*HÃpÒFÃÁEÃèEÃôCÃð¥CÃàïEÃpaDÀ DÃpðAÃîDÃ0¿DÃPCÃpäCÃ`@CÃ?ÃÐEF×Hà ’EÃ2DÃÀ*DÃpUFÃ8CÃPCàâBÃ\AÃ2HÃpsAÀCÃ06FÃ0¿DÃ?Ã@æDÃàlFà ¤BÃð¥CÃжHÃ8CÀŽCà_CÃ@@Ã@ìCàÖDÃP Eàô?Ãh;à}>Ã`^>ðnGÃJ@ÃJ@ÃîDÃÀ³BðAïDðBà ˜DàkAÃðÃ>ÃàûCðnGÀ DÃ0Ã>FÃP EÃÐ{=àî@ÃP1?Ã}BðAÃð½?ÃÀÑ=ðE9Ã÷<ÀAÃðÉ=ð CÃ`@CÃPFà @Ã*;Ã8CÃ\AÃ@øAà‰<ÀBÃ0ã>ÃpmBÃp=Ãð4AÃà>Ãp=Æ6Û=ÃAÃAÃ>ÀŽCÃîDàî@Ã0×@ÃÙ=ÃÐÔCÃ`Ï@ÃPa7Ã`j<ÃúBÀÿEÃ@«9ÃÐø=Ã8CÃÐcAàî@ÃôCð†CÃ@oCÃP–CÃð«Bà <à ¶?àq@ç;Ã@=ÃàxDÃå?Ã0û:Ãà¢=ÃÀÀ¾;àƒ=Ã=ÃЇ;Ãp;ÃÐ<ÃÐo?Ãp;Ãà@Ã$<ÃÐ{=Ãà@ÃP1?ÃPC<ÃPÀ<Ãà7:ð¼:Ã@:7ðž?Ã@@Ã@¥:À @À)?ÃðÉ=ðBÃ0NBÃÐÚBÉ@Ã0û:À¬>Ã`^>Ã`X?ÃPBÃP®?Ã0:Ãð^:ÃJ@ÃPCÃVBÃz8à‰<Ã0Ã09ÃÐ"7ÃðÛ:ÃÀ×<É@Ãt=Ã06ÃPU9Ãðj8ðc4Ãå;Ã0x;À¸<ÃÐo?Ã@Ÿ;Ãà1;ÃVBÃÐ ;Ã`j<Ã`á=à}>ÃŒ9ðÈ8ÃàÆ7Ãý;à 6ÃÑ4à;Ã÷<Ã7Ã’8Ã`2à ?>ÃÀ×<ðž?Ã`FBÃ`j<Ã@¥:Ã8CÃÀZ<à§7Ãp :Ãp:ðÈ8Ã@·7Ãë:Ãp :Ã@Ÿ;àq@Ã9Àk4ÃP‘/ÃPä6Ã>Ã@Ï3Ã@R3ÃPÒ9ðE9Ã*;ÃÙ=à06ÀÐ8ÃàÆ7ÃPU9Ãðù5Ã0®2ðÔ6ÃÐ(6à i7Ã’4Ã0–6Ã@";ÃPa7Ã@(:Ã0–6ÃðÕ;à i7ÃÀ6Ã÷8ÃPy3Ãðÿ4Ãpß/ÃpP2Ãðd9Ãp>5à06ðW6ÃÐ:3ÃPØ8à 3ð¼:ÃЙ8À_6À²=À)?Ãðç8à ò5ðÔ6Ã`ˆ7ðÚ5Ãl0Ã92Ã4Ã@F5Ã@<Ãðÿ4à 3Ãp¯7Ã0–6Ã0õ;ÃÀ×<ÃPÞ7Ã0œ5Ã07Ã<8Ãp©8à ò5Àô2ÃàU5ÃðÏ<Ãð4ÃP/Ãt9Àâ5Ãë:ÃúBÃPI;Ã9Ã`š4à<4ÃП7Ã’4Ã@Ï3Ãð@?Ãðv6ÃP2ÃPg6Ã`”5Ãx.ÃÀr8ÃB7Ã0„9Ã0¢4ÃÑ4Ãðˆ3Ã`‚8Ã<8Ãp»5ÃÀr8ÃÐF1Ãp¯7Ãðˆ3ÃÐ:Ãà7:ÃpD4Ãàº9Ãý7à ì6Ã`Ê,ÃÝ2ó9ÀM9Ã07ÃPÀ<Ãà®;Ãà=9ÃŒ5Ã@48Ã69ÃàC8Ã@½6ÃàÒ5ÃÀû6Ã@:7ð?:Ãà=9Ãàa3ÿ7Ã0„9ÃP[8ðæ3Ãp£9ðK8Ã`2ÃH6Ã'5Ã`”5à ‡2ðQ7Ã0œ5À7ÃÀ3Ãðù5à 3ÃÀ 4Ã0x;ÃÀr8ðÎ7à ò5Ã0º0Ãн2à§7Ãý;Ã0û:ÃPU9ÃpÇ3ÃÀ3Ãàê1ðø0Ãàm1Ãp :ó9Ã0–6Ãðó6í:À¾;ÃЙ8Ãz8ÃPð4Ã0œ5Àƒ0ÃP2Ã!6ÃÀx7ÀG:ÃÈ+ÃÀ1ÃPm5Ãp»5Ãð2Ã@Ï3à¹4ÃP2Ã`p;ÃPU9ð3Ãð|5ÃÀx7Ãñ9Àe5Þ6Ãàa3Ãb<ðì2Ã!6ð3à¹4Þ2Ãà[4ÃÐ.5à ò5ÃP2ðæ3ð3ÃPö3ÃÀ2ÃÐÉ0ÃàI7à 6ÃðF>ÃpJ3Ãà.Ãн2ÀG:Ã0+3Ãð|5ÃÀï8à65ÀY7ð¶;Ã`Û>Ã06àB3ÃPä6ÃÐ¥6ÃÐ:3Ãpµ6ÃÀ 4Ã!6ðÎ7ð]5àB3Ø3ÃpD4Ã÷8à c8à o6Ã0¢4ðò1Àw2Ã@F5Ão)à¹4Ãp27ÃàÀ8Àe5ÃpÓ1ðæ3ÃÀr8Ã`6ÀÊ9ðK8à 0ÃË5Ã@±8Ã0C/ÃÀ5à 6à o6Ã@R3Ã0 8Ãàê1à65ðò1ð3ÃÀ–2à 1ÃT4Ã@±8Ã`;/ði3ÃpÙ0ðQ7ÃГ9ÀÜ6Ã0 8Ã3ÃpP2Ãp>5ÃÐ9ðW6à=Ã-4Ãpb/Ã`ó:àN1ÃðŽ2ÃPy3ÃàI7Ãðˆ3Ã@Ï3Ã`2à*7Ã07ðW6ÀG:Ã@R3ÃÐ@2Ãpµ6ÃÀé9Ã`G-ðc4Ãð).Ã!2Ã0Ì-à {4ÃÐ:3ðÎ7À}1Ãðˆ3Ã`ˆ7Ã@.9À‰/ÃÐ@2à 3Ãн2Æ6ÃPö3ÃÐ(6Ãý7ÃÀ6ÀÐ8ÃÀ–2à 3Ãp\0Ãðÿ4ðø0à 1À_6Ã7ÃpV1ÃÀŠ4Ãàg2ÃÀ1Ãн2ÃÀ–2ÀÖ7Ã`4àZ/Ã0º0ÃPm5ÃÐ<Ãp27ÃðR<ÃP.Ã0Þ*ÃP2Ã7Ã@Ï3Ã0¨3ÃàÒ5à ò5à 3Ã`ó:Ã`ˆ7Ã`6à à8ÃJ@Ã`‚8Ã@F5Ã0¢4Ã7ÃŒ9Àú1à {4Ãðv6ÃPü2Ãð2ÃT4Ã06ÃPü2Ø3ÃàÌ6Ãðš0Ã-0Ã`”5Ã0¨3Ã`5Ã`50Ãð4àÑ0ð]5ÃÐR/Ãð /ÃÐ:3ð]5ö.Ãð0ÃpP2Ã012àÑ0à ¥-Ã`²0Ãõ.Ãày/àf-ÃÀ+/Ãl0ðW6à 3Ãp&9À_6à 1Ã`Ž6à06Ãàg2Ãpn-à 3ð/Ã0¨3ð]5ð?:ÃpÙ0Ã`)2ÃÐ¥6ÃÔ-Ã`”5ðc4À.ðW6Ã@F5ÃÐ:3Ãðù5Ãpñ,ð/À7Ãб4Ãp£9Ãðˆ3Ã@Õ2Ã,À}1à þ3ð3Ãàg2Ãàg2Ãðj8Ã0=0Ãð#/Ãð2Ã33ðø0Ãp\0Ã@R3Ãðù5Ãз3Àk4à 1à 3ÃP2Ã?-ðþ/ÃpP2ÃÀ„5Ãð4ÃÐÕ.Ãð5,Ã`A.ÀÐ8Ãp©8Ã92Ãpt,Ã@^1Ãð4à 1À‰/àf-ðc4Ãi*Ã`G-ÃÐ.5Ãðˆ3Ã`Ö*Ãðÿ4Ãз3ÃH6Ã`G-à³5Ãð /Ãp86ê0Ã~-ðò1Ãàs0Ã`¾.ÃÀœ1Ã071Ã'1ÃPö3Ã`¦2ðò1Ãðˆ3ðW6Ã0Ì-Ãl0ÃÐX.Ã071àZ/àã-Ãl0ÃÀœ1ÃP2ÃpV1Ã`;/À-à 6àÑ0ÃÐd,à Ÿ.ði3À}1Ã0¨3Ã!6àÅ2Ãpå.ÃPÞ7ÃPC<ð .ÃàÀ8Ãà.Ã0Þ*ð/Þ2ÃÐÏ/Ãà…-ÃK/Ã33Ã`4àã-àf-Ãàö/ÃÐÉ0ÃpÓ1Ä,ÃÐ:3Ã0–6Ã`;/ÃP.Ãð2à +Ã0C/ÃpP2À0Ã@ù,Ãx.ð/Ãð4ÃÀõ7Ã0Æ.Ã` 3à¿3ê0Ã0%4ÃP0Ã0Ø+à`.ÃÀ 4à (-À-ð{0Ãàs0ÃÀ1Ãð”1Ã9.Ãàö/ÃÀï8ðø0Ãð²,Ãð”1ÃðÊ(Ã@p.Ã`¦2Ãð 3à {4à ò5Ãðp7Ã0¢4Ã07ðò1à 3Ã×3à “0Ã@½6ÃP Eà ?>ÃÐ ;ÃÀï8ÃPÌ:Ãñ=Ã0Š8ÃÐ ;Ãp27Ã`#3à Ÿ.ÃЂ'ÃK/Ãp\0Ãã1ÃÐ44Ã`8Ã05Ã0:Ã`ç<Ã*;Ã’8Ã'5Àƒ0Àe5Ãz<ð]5Ãp»5Ã`8Ã`4ÃàÌ6ÃP…1Ãp»5ÃЫ5ÃÐá,Ãpb/Àô2Ã0¢4Ã*;ÃP‹0Àè4ð3Ãp86ð3ö2Ãðv6à›9à Ú9Ãðš0ÃÂ0à 2à§7ðà4ðK8Ãt9ÃpP2Ã-0Ãp£9à Î;ÃàU5ÃÐ ;ÃÐ"7à ì6Ã7à Ú9À5=Ã@Û1Ãp\0ÃN5Ã@Ã5à65à:Ã<8ðQ7à o6Ã0l=Ãl0Ãp;Ø3ÃÐ44Ã@L4Ã@d0Ãý7Ã5Ã071ÃÐ:3ð]5Ãðù5Ã@Õ2Ã9Ã0+3ÃÀ6Ãp27ðQ7ÀÜ6ÃpÁ4Ã0´1ÃП7Ø3Ãàê1àT0Ãz8Ã@48Ã06ÃÀ„5ðo2à65ÃÀœ1Ã0À/à 3à 3Ãp¯7ÃPU9ÀÜ6Ã`p;ÃÐ9Ã@Ÿ;Ãб4ÃÀû6ÃZ3ÃðŽ2ÃPä6àT0ÃPg6ÃB7Ã`6Ã@É4Ã@(:Ã05Ã06Ø7Ãp,8ÃÐ:ðQ7à þ3àH2Ã0¨3Ã÷8à ò5Ãp»5ÃàC8Ã`6Ãp¯7ÃPs4Ã@F5ÃÀ6ÃPö3Ãà[4ÃÝ2ÃP1à›9ðà4Ãð|5ðæ3Ã0¢4Ãн2à /ÃÀ2ÃÅ6Ãpµ6ü1ÃàI7Ã9.à 2Ã`G-ðÈ8ÃÐ8ÃÀ~6Ã÷8Ã@Ã5Ãàg2ÃÀ~6à:Ã`j<ÃÀ5ÃÀ®.ÃpÁ4ÀS8ÃPÀ<ÃË5ÃÀ%0Ãðù5Ã<8ÃÔ-ÃP0ð{0ÃB7ÃàU5Ã0´1Ãï/Ã'1ÃK/Ã`¸/Ãã1Ã0Æ.Ãàð0Àô2ÃÂ0Ã0%4Ãðÿ4ÃÐF1Ã@Û1ÃÐ44Ãðv6ÃàO6Ãðˆ3à þ3Ãàö/ÃÀœ1Ãб4ÃàU5Ã@½6Ãà7:Àâ5Ãà[4ÃÂ,Ãpë-à 1ÃÀ1.ÃÐ44Ãð‚4ÃPm5ðì2Ã@Ã5Ã4Ã4ê4ÃÀ1ÃÀ6ÃÀ–2à /ÃàI7à ì6ðÎ7ÃpÙ0ÃP0À.ðþ/Ãð 3Ã92ÃpÇ3ü1ÃÀ~6Ã0À/Ã0¢4Ãp£9Ã`/1Ãð”1ÃÅ6ÃP2Ã3Ãp\0ðþ/ð .Ã0¢4ÃàC8Ã`#3ÃÀ~6ÃK/Ã@F5Ã-0à ·*à 0Ãðˆ3ÃÐ^-Àe5àË1Ãð4ÃPa7à 6ÃP0à³5Ãàð0à06ÃÀ3Ã0Ì-Ãp27ð+Ãï/Ãàð0ÃP2ÃÐÏ/À0ÃP0Ãp\0Ã-0ðW6Ãн2ÃÐF1Ã0À/à 0Ø7ð9;ÃÐÃ1Ãpå.à ¥-à 1Ãð0Ãàö/Ãf1à 2À.Ãn:Ãðˆ3ÿ7à­6Ãð0À}1À0ðæ3ÃP/ÃàÒ5ðì2Ãð2ê0ä1Ãð0ÃàÌ6àõ*À,Ãpn-Ãp\0àB3ÃÑ4À-Ã@L4Ã0º0ðæ3ÃÀ–2Ã0O-à ".ÃPü2ÃÑ4À•-à “0Ã'1ðÔ6à×/Àe5Àƒ0Ã@Ã5Ã`;/Ãà.ÃÐF1Ã-0Ã@p.ÃÐL0Ãð2ÃpÍ2Ã@j/ÃÀC+ÃW-ÃPö3Ã@í.ÃP.ðà4Ã0C/à 2Ãr/ÃP.Ãðÿ4ü1ðæ3à þ3ÃpÓ1Ã0%4Ã012Ã@p.ðE9Ãðù5Ã@^1àZ/Ã`¬1Àè4ðu1à ".Ãð¦.ÃP-ÃPµ)ä1Ã@ *ÃÀC+Ãàg2Ã0+3À0Ã`;/ð‡.ö.ÃPü2Ãð2Ã-0Ã-ÃÀ–2Ã@@6ð/Ãð /à (-ÃPy3Ã`š4Ãð”1ðæ3Ãx.Ã4Ã@d0àZ/Ãï/à¹4À.ÃÀ3Ã@í.Ãpå.ð{0ÃP.à ·*à ò5Ã`;/Ã`”5àÅ2Ãàm1Ã`S+À‰/ÃÀÀ+Ã3/Ã@Û1Ã@ç/àï+Ãû-à /ÃÀ 4ÃÀ–2Ã012ÃP0Ã-Ã0¨3Ã@R3ÃPm5Ã`A.Ã0Æ.Ãày/ÃP2À.ä5àN1Ã`Ö*À0À1Ã0O-ÃÚ,Ã?-ÃÀ%0ÀY7ÃP…1ÃÐÏ/À$+ð{0ÃàU5À-ÃÔ-ð+ð·&à ¥-Ã`Ž6ÃÐR/Ã0Æ.Ã@L4Ãà‹,à<4Ãàö/Ã`A.à ‡2ÃÀ5àH2ðþ/ÃÀ¢0Ã`¦2ÃpD4Ã0%4Ã0Æ.Ã012Ã`ˆ7Ãð1Ã@F5Ã0Ø+ÃÐL0ÃÀ„5ðò1ÃÀ=,ÃP -ði3Ãày/Ã?-ÃàØ4àË1Ã`_)ÃÚ(Ã0Ì-à Ã(ÃP0ÃK/ÃP,+ÃÀ~6Ã@Û1ÃP/Ãp÷+ÃÐd,ÃÎ*ð{0ÃÐF1ÃpÓ1Ã071Ã`¸/Ã33àN1Ãp\0Ãày/à ø4ÃP—.à “0Ã0À/àã-à ò5Ãð¸+ÃpJ3ÃàÒ5ÃÀ–2Ã`50ÃÐÕ.ÃÀ®.Ã9.ÃÐd,àÑ0Ãé0Ã`4Ã`50Ãн2Ãpå.ði3ÃÐÏ/Ã0I.Ãp÷+ÃÀÀ+Ã@X2Ã!2Ã`Ö*ÃÐÏ/Ãà-ö2ÃÀ®.ÃÂ,Ãà&(Ã`¬1ð{0À•-À‰/ÃW-Ãpb/Ã0Æ.Ã@^1Ã@·7ÃW-Ã`#3ð .ÃK+ÃÐd,ð()Ã@š'à «,Ãû-Ãð¬-ÃÚ(ð-à06ð/ÃðM(Ã@Ž)ð .Ãpñ,Ã0y&à (-Ãð5,àé,ÃÐá,ð-àl,Ãp†)Ãph.Ãpb/À /Ãæ*àû)ÃÐÕ.À,ðŸ*ÃpV1Ãð /Ã0O-ÃÀÌ)À¹'Ãà—*Ã-0ÃW)ÃÐù(Ã`¦2Ãû-ÃðG)àf-Ã@p.Ä,À§*ÃÈ/ÃÐÏ/Ã`/1ÃÀ1.Ã-0à ½)Ã@)à ¥-Ã`e(Ãðš0ð{0Ã@Û1à 0Ã`¦2Ãà.àé,ö.ð-ÃÀ 4ÃÀ 4À1à {4àf-Ãà-Ã@ÿ+Ã`â(ÃÀØ'À­)Ãà—*ðì2ÃÐF1ÃE0Ã9.Ãð²,ð .ÃàÞ3ÃÀ=,ð¥)ÃÀ=,ð‡.ÃpŒ(à<4Ã9.ð,ÃÐÕ.ÃÀ–2Ã@í.Ãà+ÃP -Ãp’'àZ/Ãà.à ¥-Ãp€*Ãà'Ãæ&Ã(Ãpñ,Ãð²,ð™+ÃK+Ãõ.Ã0¨3ü-ÃР"Ãæ*Ãpë-Ã@j/Ã`e(ÃÈ+ÃP-Ãpz+àl,ÃP-ð¥)ð/ð"*ÃÐj+Ã`50à :*Ãpn-ÃÀÒ(Ãà…-Ãì)ÃÀ+/ÃÚ,Ãð4Ã`#3ÃÀ¢0ÃðÐ'Ã*à&Ã0Ò,à×/Ã@+ÃÐ &ÃE,ÃÐ^-Ü(àõ*Ãà+Ã@)à 4+ð"*Ãpž%Ã0g)Ã@ó-à ™/Ã0Æ.à$à :*Ãð;+àû)Ã'5Ãpt,à ½)ðF$Ã@'ÃÀº,ÃP&,ÃT4Ã@ó-Ã0œ5ÃÂ,ÃÐá,Ãð0Ão)à Ã(Ãð”1À1ÃЈ&Ã0Þ*àï+à 4+ÃÐÃ1Ã0Þ*ÃÈ/Ã*Ãf1àH2ÃЈ&Ãà)ÃP1ÃÂ,Ãi*Ãà+Ãð5,ÃÀº,ÃÀC+ð .à ¥-Ã0%Ãà,Ã`Ö*ÃÀ7-Ã0a*ÃP£,ÃÐí*ÀÜ6Ãpb/ÃÀÆ*Ãp )Ã0[+Ã92ðæ3àf-Ãà.Ã0+3Ãpz+à (-Ãà)Ãà…-ÃÀ´-Ãð 3Àƒ0Ã0a*Ã@‚+Ãð¬-Ãpß/À-Ã`_)Ã`_)ð-ð"*àN1ÃP1Ã0U,ÃP2Ã@ÿ+Ã`S+Ãà,Ã0[+Ã0´1à ".à×/Ãà—*àZ/Ã071Ãàa3Ãpb/ÃP,+Ã@ *ÃQ.Ã#À‰/À0Ãð¬-Ãð¦.Ãð1ðÚ5ÃÐÉ0Ã`_)Ãðš0ÃpÙ0Ã0g)ÃPÀ<Ã0+3Ã@Û1à06ðŸ*Ã92Ãà+Ãà‹,Ãp\0ÃpÍ2à Ÿ.Ã`A.ÃÀ3Ãàê1à$8ÃÎ.Ãàö/Ãpå.Ã`¾.Ã`4Àî3ÃP‹0Ã012ðo2à 3ÃÐd,Ãз3À}1Ãp:ÃÀr8Ãõ.Ãp\0Ãpn-Ãr/ÃÐd,Ãf1Ã0º0ÃN5ÃÀ„5ÃÀr8Ã@Ã5ÃàÒ5ÃÀ¢0Ãp(ÃÐÃ1Ã@^1à ø4Ã9Ø3à­6Ã`ˆ7Ø7Ã0¢4Ã4Ãé0Ã3/àT0ÃÐL0í:ÃÐÉ0ÃPä6Ã@48à 3ÃГ9Ã`¬1ð3Ãð‚4Ãf1Ãð”1ÃÀ1Ãðp7ÃP‹0ÃH6Ã@Ã5Ãàö/Ãpb/ÃÀ%0ðò1Ã@R3Ãpµ6à06Ãð /Àè4ÃÐ¥6àã-Ã0+3Ãp>5ðà4àË1à`.ÃP‹0ÃT4Ãàð0ä5Ã0C/Ã],ÀÜ6àB3à 0ÃÀ+/ði3ÃPm5ÃÑ4ÃH6Ãý7ðà4ÃÀŠ4Ã`5ÃpÇ3ÃðŽ2ðø0ÃàI7Ã`5ö2ÃÐp*ÃP.à 1à¿3Ã`¦2Ãàg2ü-ÃP0ÃPs4ÃÀ3ÃàÒ5ÃPI;à•:ÃPü2Ãð1Ã071ÃÚ,Ã](Ã`/1Ã0œ5à 3ÃÅ6ÃK/ðì2Ã`4à`.Ã0Ò,Ãð”1Ã07Ãз3Ã@Õ2Ã@)ð-ÃÐR/ði3àr+ÃÀ3à ±+Ã`¦2Ãð).ÃÀ+/ÃP2ð/ð .ÃQ.Ãðÿ4à ø4ÃÐ"7à ?>Ãp27À.Ã071à65ðÔ6ÃÀ 4Ãð|5Ãð4ð .Ãpñ,Ã@Õ2ÃPg6Ãð /Ã0=0ÃT4ÃPs4À1à³5ð,à {4ÃЫ5àl,ÃW-Ã071à 3Ãp27Ãf1ÃÐR/Ã×3Ã@.9ÃàÞ3ÃP -Ã@R3Ãðù5àH2Ãà£(ÃÐ44Ãl0Ã3/Ã`50ù8ð{0ð"*ÃÑ4Ã?1Ã05Ã@+Ãé0Ã0I.ÃÀ–2Ã@L4Ã` 7Ã],Ã33Ã`²0àT0ÃÀ2Ã@Ã5ÃðŽ2ÃÈ/Ãx.ðø0À}1ÃP2ðÚ5Ã0¨3ðò1à;à ".Ã0C/Ãð¾*Ãð”1ÃÀ3ÃÀ–2ðþ/ÃÐ.5ðø0ÃPö3Ã’4Ãï/ÃÀœ1à 3àT0ÃÀ3Ã071Ãx.Ãr/Ã@v-Àô2ÃPð4ð,À}1ö.Ã06ð/ö2Ãr/Ã`6Ãp>5ÃÐd,ÃÐ:3ðu1ÃÐ^-ä1Ãpµ6Ã`¦2ÃÐÏ/Ãð /àÝ.Ã@L4Ã`²0ÃP -Ã0À/ÃP—.ð/ð/Ã05à§7Ã@j/Ãð0Ø7Ã@j/à 3Ãб4Ã@L4ðæ3Ã0=0ÃÐp*Ã@^1Ã0C/Ã0%4Ãp\0ÃàÞ3àl,Ãp†)Àe5Ã@ó-Ã`A.ÃÀ¨/ÃÑ4Ã`Ž6ÃpÙ0ð/ði3ÃàO6Ã` 3Ãàg2Ã`Ð+Ãð0à06ÃÐ.5Ã4ð{0Àq3ö.ð{0Ã0s'Ã?1ÃÀx7ÃÐ:À}1ê0à ]9ÃpÙ0Ã33à¿3ÃÀ2ÃE0à þ3Àú1à ì6Ã012ð-Ã`/1ÃP2ÃÀO)ÃÀ¨/à<4Ã@X2ÃPs4Ã0¢4À-à ™/Ã0 8Ã@É4ðà4Ãàö/à¿3à ‡2ÃàU5Ã`”5àN1ðu1ÃpÙ0Þ2Ãf1ÃP&,ÃÐ^-à 3ÃðŽ2À¾;à 1Ã`6ÃÐ44Ãð”1ö.Ã`š4Ã`¸/ÃpÙ0àé,ä5Ãðš0ÃK+ÃÚ,ð{0ÃpÓ1ÃP,+ÃÀ+/à­6ÃP0Ãðp7Ã`6Ã5ÃPü2ðÔ6Ã`50ÃÐÉ0Àƒ0Ãr/Ã!2Ãp€*Ã@p.ÃpD4Ã`5Ãã1Ã0=0Ãàö/à 6Ã`ù9ÃÀ¨/Ã`2Ã0I.à¹4à ".ÃÎ.ÃP‹0ÃZ3ÃÀº,ÃÀ2Ã`/1Ãã1Ã`¸/ÃÀ¨/Ã@^1ÃÀ3Æ6Ãï/ðò1ðu1Ãx.Ãàa3Ã33Ã` 7Àq3Ãàa3Ãp27à ‡2ÃPö3à 3ðþ/Ã@d0Ãàs0Ãðó6Ã3àH2ÃP—.Ãp—;Ãp&9á<ÃП7Ãðˆ3À7Ã0®2ÃÐÉ0Ãðj8ÃÀ~6ðÔ6ÃÀf:ð¶;ÃAÃàI7Ãz8Ãp¯7Ø3Ãðp7Ã9Ãñ=Ã0x;í:ÃðX;ð?:ÃàÆ7à ]9Ã`á=ðÔ6à¿3à*7ÃPê5Ã’8Ã`#3Ãàa3Ã*;ÃÓ>Ãp—;Ãà1;Ãðd9Ã=Ã0:Ãß<Ø3À7Ãðj8Ã@.9ÃÙ=Ã@>ÃP1?Ã@½6ÃÀZ<Ãë>ð¶;à Ô:à 9?ð¶;ÃÐ(6ÃЇ;à æ7à @Ãp>À¸<Ã0 8ÃðÃ>Ãz<Ã@";ÃÐ8ÃPU9à 3Ãp;àq@Ãàœ>Ãh?ÃÐi@Ãðd9à06Ãà%=ÃPI;à¡8ð3<ù8Ãp<Ã`ˆ7ÃÀÝ;Ãý;à W:Æ:ÀA;Ãp£9Ãz8Ãðù5Ãý;Ã0:Ãë>Ã;ðÈ8ÃÐ(6ÃàÀ8Ãз3Ãà+<à Q;Ãà®;Ãb@Ãp27ðà4ÃÐ<Ã`Ž6ÃðX;Ãß<à ]9Ãà®;ÃÓ>Ã@¥:Ãb<ÃÀõ7ÃH6ÀG:Ã@:7Ãàº9Ã@«9à=Ãp=à›9ð¼:Ãh;Ãp :ÃÀÑ=ÃPÒ9àƒ=à•:ÀY7Ã@";ÃP´>ðÎ7ÃðÛ:ÃàU5Ã@Ã5ÃÀã:Ãh;Ã@@6Ã0%4ÃàÀ8Ãå;ð¶;á<Ãà1;ÃÅ6ÃàØ4À¾;à$8ÃГ9à§7À¸<ÃP[8Ã0:Ã`‚8à ò5Ã3Ãðí7ÃÀ~6ÃH6Ã8Ãý7ÃPØ8ÃÐ<ÃÀ`;Ã9Ã0õ;ÃЫ5à ò5ÀÐ8Ã@Ã5Ãt=ÃPÌ:ÀG:à;à­6Ãà7:à ì6ÃPÌ:ðE9Ãp,8Ã`4Ãà¢=Ã0„9À¬>ÃðX;ÃÐ¥6ÃÐ:ÀšAÃП7ÃÀ6ÃÐ(6Ã@·7Ãp27Ãp:Ã0ï<à æ7Ã@Ÿ;Ã`p;ÃÀã:Ø7ÃÐÃ1ÃÐ"7Ã<8ÃÐIÃý;ÃÐ44Ãë:Ãà?Ã7ÃÀé9Ã0x;à­6à æ7Ãà+<Ã05ð¶;à È<Ã`ˆ7Ã*;Ã÷<á<à ]9ðÚ5ÃðÛ:Ãp—;àw?Ã<8Ã`‚8Ã7ÃÐ<à›9Ã0–6ü1Ãë:Ø7Ã'1ÃPg6ÃÀr8à 9?ÃÐ{=ð9;ÃÀT=Ã@";Ãð^:Ãð”1Ã@48ð-=Ã`š4ÃÐ<à>Ã@½6ä5ÿ7Æ6Ã`6Ãðp7ðª=ÃÐ(6à ]9Ãðv6Ãß<Ã@@6Ã`¦2Ã`š4Ãå;Ãðd9ÃÐ:àã-Ã012ÃÀŠ4Ã@·7à65Ã92ÀÄ:ÃàÀ8à=Ãðj8Ã@=Ãà?À @Ãðç8Ã@F5Ãà¨<Ãp27ÃÐ:ÃPº=Ãß<ÃàÆ7ðÈ8Ãp¯7À_6Ãp‘<Ã0 8à;Ã@±8Ãàê1ÃP2Ã`Ž6ÀÖ7Ãz8à þ3ÃðÕ;À¸<Ãp©8Ã>ÃZ3ÃP2Ãðó6Ã@Ï3ÃÀŠ4Ã@¥:Ãà[4ðæ3ðø0ÃP[8ÃPÒ9À_6Àú1ÃÀr8ÃPê5Ãh;Ãà=9ù8ÃЫ5ÃPU9ÃÀ„5Ãð^:Ãз3ÃPI;Ãb<Ãp>5à›9àN1ð/Ã@½6ó9ð3ÃpJ3à 0ÀY7Ãàa3Ã@ ?Ã0Š8ÃÐu>ÿ7Ã0¢4Ã07Ã`ˆ7Ãp»5ÃP2Ã@Ã5à<4àÑ0ÃÀ®.Ã@p.ÀA;Ãp&9ðæ3ÃÐÂFÃ0x;Ã@‡?Ã@«9àr+àB3ÃÀ6Ã@Õ2à u5ÀÐ8Ã0+3ÃÐ.5ó9ù8Ãh;Ã0x;Ã07à¹4Ãàä2ÃÐ¥6Àk4ÃГ9ÃЫ5Ãp»5à¿3ÃPö3Ãp»5Ã`”5Ã071Ãà7:Ã`5Ã@Ÿ;ÃPy3à›9Ã0:Àq3à 6Ãë:ð/ði3Ã@á0Ã*;Ã`¬1à W:à :Ãp86ðÚ5Àè4Ãp,8à ‡2ÃðR<ÃZ3Ãð‚4Æ6Ãp¯7Ãpµ6Ã@ç/Ãp¯7Ã0ã>Ãà´:à W:ÃÀl9Ã`;/ð{0Ã0´1à ]9Ãðj8à­6ÃPö3Ã@p.Ãï/ÃàO6ð-=Ã0:À;<Ãp&9Ã`8ÃàÌ6à ™/Àq3à 1à 6à 1Ã'5Ã@:7à ì6ÃЙ8Ã05Ãã1Ãð2Ã07Ã@Ï3à ò5ð-Ãз3Àe5Ø3ÃÐÉ0ÃPð4ÃŒ5ÃPI;Ãàä2ÃÐ¥6Ãàa3ÃÀ5ðæ3ð{0Ãð#/à :àÅ2Ãðó6Ãб4Ãð 3Ã0®2Ãðš0Ã`#3ÃÀ3ði3Ãl0À7ðÔ6à 3à 1ÃpÍ2Ã071à 3ÃpÇ3ðÔ6ÃW-Ã`Ž6ÃÐá,ðc4ðÎ7ðì2Ãà…-à65Ã@Õ2ðþ/àB3ÃÐR/Ã@Õ2ÃÝ2Ãà[4à þ3Ã×3Ãà[4Æ6ðø0Ãp )Ã*Ãð”1ÃPö3Ã'1ÃPy3ö2Ã@Û1Ãðv6ÃP/Ãà.Ãû-Ã`#3Ãàö/Ã8ðì2Ã5Ã@j/À›,Ãp&ð“,ÃÀ¨/Ã`¾.Ã@F5ÃЫ5ðo2Ã` 3ÃЫ5àN1Ã'1Ã0=0À}1Ãé0Ã`Ê,ÀÐ8ðÈ8Ãph.Ã@Û1Ã071ÃÐÃ1Àk4ÃÀ+/Ã0Ì-ðÎ7à ™/à ™/à­6Ã0:ä1à ‡2ÃpJ3Àw2à³5Ã`¬1ÃB7ÃÀ1Ã05à§7à ì6Ã-4Ãз3ÀÄ:Ãà7:à i7Ã0Š8Ã07ÃЙ8ù8ÃÐ:ÃÐ44Ãàð0ÃÐ8ù8Ãp86à ø4ÃЇ;à 3ÃPä6ÃŒ9ÀM9À /ðÎ7Ã`6ÃPU9ÃÀ6ÃÀË>à‰<ði3ÃPg6ÃàØ4à Ú9Ã@±8ÃPÞ7ðÔ6À•-à ì6à ¶?Ã`ˆ7Ã`¸/Ã5Ã0œ5Ã`ˆ7ù8à:ÃÀ2ðø0Ãt=Ã@·7ÿ7Ãðd9Ãðˆ3Ãpµ6ÃPÞ7à­6ÿ7ÃàI7ÃàÞ3Ãàº9éEÃ7ÃÀï8ÃÀã:ÃÀr8ÃP/ÃPü2Ãð 3ÃPa7Ãpµ6À¸<Ã@48Ãà1;Ã09Ã<8à=à ]9ÀS8Ãh;ÃP7>à W:à‰<ÃЙ8à Ô:ÃÀ¹AÀ5=à °@Ã`4EÃ`Ï@À²=ÃðÃ>àâBÃàZIÃPœBÃ@ÚFÃ@9Là €HÃàïEÃPDÃÐKEÃ@QHÃ0LÃ0LÃÀ¡EÃ`"HÃeFÃ0*Hà EÃÐMÃIÃ0$IÃpy@ÃèEÃà¹NÃALûFÃ0*HÃ0‰MÃÀúKÃðiMÃKà HÃ@þ@ÃðIïDÃ@3MÃÀ•GÃ`.FÀÛKÃð4AÃЪJÃ` Là ýHÃ0BDÃðæMÃp7KÃàÅL×Hà ýHð2QÃPlJÃ0îQÃÀ*DÃ0BÃ00GÃàxDÃ0§HÀçIðÙJðýDÃÐWCàÊFÃ@iDÃðEà ˜DÃ>BÃ8CÃLÃ`½CÃÙAÃ@oCÃ@{AÃ@ÈIÃ@]FÃpö@ÃàCÃ0Jà²JÃ@æDÃ2DÃGÃÐ9HÃðGÃúBÃ@QHÃPŠEÃP EÃß@ÃÜGðŒBÃP®?àÄGïHÃÀH?Ãð«BÃPrIà)LÃÀT=Ã@@ÃàfGÀvGÀAÃ`@CðDÃÐQDÃqDÃ`(GÃð(CÃ>BÃÐø=ÃÐ?GðzEÃÐcAÃV>Ãà`HÃwCÃð HÃÐEFÃë>Ãp?Ã0¿DÃðF>ÃAð÷EÃ@‡?ÃðGÃîDÃÀ§DÃàŠAÃ@æDà ªAà -Aàq@Ãð@?Ã0`?ÃP+@Ã\=À;ÃJ@ÃpÞDÃkEÃP7>ÃP1?Ã`ÃBÃà+<ð€Dð3<Ãà@Ã`½Cð†CÃ@@ÃðEÃpö@ðª=À/>ÃP®?ð9;Ã0ã>Ãà+<Ãà~CÃðL=ÃÀÃà>à}>à 9?ÃЇ;ÃAð°<Ã`á=Ã0f>àƒ=Ãh;ð˜@Ã@¶LðýDà @Ãà@Ã@48à ?>ÃpÒFÃà¨<ÃÀ³BÃÐQDà‰<ÃÀï8Ãà1;Ã?ÃÀH?ÃÀ¿@ð°<ÃðX;ÃPº=í:Ãå?Ã0~:ðÎ7Ã0×@ÃÀË>Ãp‘<àw?Ãp£9Ã`ÉAûBÃÀÑ=ÃàBÃP¨@ÃpsAÃðF>ÃÓ>Ã0é=Ãð:@Ã`8Ã09ÃÐ:ÃP7>Ãp£9ÃP+@ÃÐ:ðª=ÃÀÅ?Ã0ï<ð-=ÃЫ5Ãðj8ÀG:à 3@à}>À¬>ÃÐàAðE9Ø7ðÎ7Ã`‚8Ã’8ÃP´>ÃPU9ÃÅ6Ã`v:Ãà%=ÃP%AÃðí7à Ú9á<ÃÐ{=ÀÜ6à :Ã7ÃPÒ9ðž?À¦?à ]9ÃЙ8ù8Ã÷8ÃÀl9ÃP®?ÃÀÑ=ÃÐ@2ÃП7Ãh;ÃPÆ;Ã`í;ÀÖ7Àe5ÃÀõ7à Q;Ã!6Ãý7ÃÐ:Ã0„9à Ô:ÃГ9Ãp—;Ãð^:ÃÀl9Ãðó6ê4ðÈ8Ã`ÿ8Ãà®;ÃÐ44Ãн2ÃÐ8Ãðá9ÃPU9Ã69ÃàÒ5ÀA;Ã`5à 9?Ãð^:ÀA;ÃT4Þ2ÃPU9Ã`ÿ8Ã8Ãp»5Ãpµ6à u5Ãðí7àË1ÃÐF1à 1ÃÐ:ÃPg6Ãp»5Ãý7Ã09Ã0:Ã0x;Ã0+3à:ÃÐ¥6à o6Ã0¢4à³5Ã!2ð¼:ÃÀõ7ÃÀ„5Ã`4ÃÐ8Ã`4ÃÑ4ðu1ÃàO6ÃpÍ2Ãp»5Ã<8ÃÐþ<ÃÀï8Ã@Ï3Ã@½6ÃÐ@2ÃÐÃ1ÃN5ÃPÆ;Ã0 8Ã`2ÃPm5ü1Ã`8Ãð^:ði3Ã0„9Ãðÿ4Ãàð0Ãé0Ãp&9ÃPÌ:ÃðX;Ã012Ã0Æ.à§7Ã'5ÃPö3ÃQ.Ã` 7Ãн2Ã`v:Ã`”5ÃÀ 4Ãpß/Ãã1Ãà+<Ã33àH2ðÔ6Ãà¢=Ã0x;Ã4Ã`Ä-ð{0ä5Ã33Àî3í:Ãã1Ã0Š8à§7Ã`A.ÃP1ÃpP2ÃPð4ÃÀ6ÃP0Ãp>5ðì2à 3à65ÃàI7ÃÀœ1ÃÈ+Ã0 8Ã0œ5ÿ7Ã@ç/ÃÀ2Þ6Ãð2ÃpÇ3ÀY7Ãðÿ4ÃÐ.5à;Ãp86à c8Àú1Ã-Ã@@6Ã@‡?Ã`v:Ã’8Ã@L4Ã7ä1à 6ÃpÍ2ÃP2Ã0¨3Ã`5ÀM9Ãз3Ãpë-Ã0œ5ê0ðò1à*7ÃП7à`.ð/Ã`4ÃPs4à 3ÃT4Ã@á0Ãðˆ3à<4à c8Ãñ9Ã@½6ÃÐ:ÃP…1Ã`Ä-à65Ãé0ÃÐL0Ã`;/ÃàÆ7àH2Ãã1ü1ÃP…1Ã@.9ðc4Ã0º0à65Ã@R3Ãàm1Ã'1Ãl0Àè4À•-Ãày/ð-Ãõ.Ã9ÃPU9à³5ÃÂ0ÃÐF1ÃÂ0Ãðj8Ã`ˆ7à ø4Ãð”1Àè4Àe5à­6ÃÀ~6Ãðv6ð9;Ã0¨3ðò1ð/à 0ÃàU5Ã`ˆ7ÃPg6ÃÀ¢0À7Ãðˆ3Ã05ÃP2ÃP—.ÃÑ4ä1Ã`50ðo2Ã0´1ði3ðW6ÃZ3Ãà=9Ã9Ã@^1Ã012ÃÀû6ÃП7Ã0Š8ÃÀ¨/Ãàa3àN1Ãp86ÃÐL0Ã4Àú1Ãà.ÃH6ÃÐ"7Ã0´1Ã`¾.à 1ÃàÞ3Ãз3ÃÀ7-ÃP0Ãl0ÃpV1Ã-4Ãà.Ã@@6À /Ãð4ÃpÙ0Ãï/àB3Ãàa3ðò1Ãб4ÃÀ„5ðo2Ãð4à 3Ãð4àã-à<4à à8Ãpb/à 1Ãp&9Ã@É4Ã5ðÈ8à ‡2àZ/ÃÐÉ0ði3Ã-4Ã` 3à›9Ãðd9Ãp—;Ãp&9Ã7Ãð1Ãx.ÃE0Ãàº9Ãð 3Ã`5à ø4Ãý7Ãà[4Ã0–6Àú1ÃpP2Ã`Ž6ðÚ5Ãðš0à 1Ãp©8Ã09ö2Æ:Ã071ÃpJ3Ã@¥:Ãà+<ÃàC8Ã@Ï3ÃàU5ÃpP2à ]9ÃÐ:ÃH6Àƒ0ÃàC8ÃPä6Ãð|5Ã÷8ÃÀr8à ò5ÃÀ¢0ÃàO6à ‡2Ã05Ã@Ï3Àú1Ãp»5Ãàa3ÃÀ–2Ã4ÃN5Ãß<ä5Ãà[4ê4Ãð‚4Ãðj8ÃàÌ6Ãõ.ÃàÒ5ÃE0Ã0„9Ã`Ž6ÃPm5ÃPm5ÃPÞ7ÃÐ9Ã0+3Ã0¢4ÃP2Ã@™<ÃÀ5Ã@F5À @Ã@X2Ã4ù8ÃàØ4ÃË5ÀÐ8à i7Ãðí7Ã07ÃÀ6Ã`5ðc4ÃàC8Ã@½6ðc4ÃГ9Ãðv6Àî3Ãб4Ãðˆ3Ã@ç/Ã0Æ.Ã@^1Ãðv6ð3<Ã3ÃÀ5Ã0À/à à8Ã7ðW6Ãðj8à “0Ãð¸+à à8Ãp,8Ã4ÃÑ4Àk4Ãp>5Ã69Ãp»5ÃÀŠ4Àƒ0à¿3Ãñ9ÃÐo?ð{0Ã@·7ÃÀ1ÃÐ¥6Ãp,8à`.ÃPg6Ã`Y*Ã`¬1Ãð4àË1Àâ5Ãðá9à;àB3À,Ãp\0Ã@Ã5Ã`6ÃT4ÃÐ44ÃAÃp?ÃPð4ÃP2Ãx.ÃP/Ã’4ð3ÃÐþ<Ã@@6ÃàÞ3Ãб4Ã'5à 6ÃÀ3Ãp&9Àe5Ãðÿ4Ãp¯7ÃPä6ÃP©+Ã92ÃN5ðW6Ã0´1ðæ3ÃH6ÃÐò>ù8Ãp27Ãp27Ã09Ã@L4à$8à ò5ÃÀï8ÃPä6Ãñ9ÃÐ:Ã0r<à 6ÃPg6À5=ÿ7ÃÀr8ÃÀ+/Ã3/Ãp¯7ÃPØ8Ãà[4à à8à§7ÀÊ9Ã$<ð3<ÃÐ(6ÃЙ8Ã07à Ú9ÃPÒ9ÃP[8ðÈ8à­6ðÂ9ð9;Ã9Ã`4ÃàU5Ã`ˆ7à Q;À1Ã`^>Ãà´:Ãý7Ã@R3ÃÀ–2Ãp:Ã`í;ÃàI7à æ7ÃB7ÀA;Àè4Ã0~:àú>Ã'5ÃàÒ5ð+Ã@48ÃÀã:Ã0+3Ã0O-ÃÂ0Ãà¢=É@Ã06ÃÐX.Ã`6ÃÐ ;ÃÀÝ;Ã0œ5À_6Ã<8à ì6Ã@48ð/Ã5Àe5Ãp»5ÃðÏ<Ãàº9ÃPÌ:Ã@É4à W:ÃPm5ÃðL=à Ú9ÃðR<Ã0f>ðQ7ÃÀï8ÃÀõ7Ãðš0Æ6Ã`4Ã0®2Ãð2Ã`;/Àè4Ã` 7ÃPm5à Ú9Ãð1ÀÖ7Ãp©8Ã@48ÃPð4Ã`‚8à 6ÃP==ÃЫ5Ã-4ÃpÁ4ÃÑ4À_6ä1ÃH6Ã@·7à ò5ÃàC8ÃPØ8à 1Ã`4Ã`6Ã@L4Ãà+<ÃÐ¥6Ã@É4ÃÐ44Ã`ÿ8ó9Ã0û:Ã`”5à‰<à ì6ÃÐ9à>Ãðó6ÀÊ9ÃPö3ÃÐ(6ÃB7ðæ3Ãë:ðK8Ã0œ5Ã'5à 1Ã@L4à<4Ã@(:à K<à¡8ÃðÕ;Àô2Ã`¬1Ã0ã>Ã@¥:ü1à<4Æ6ÃÅ6ÃT4Ãð”1ÃP‘/Ã-4Ã!2Ãðó6Ã0%4ÃpÓ1Àq3ÃàÞ3ÃÀõ7Ã@:7à ø4Ã-4ÃàI7à þ3Ã@Ï3ü1à “0ÀG:ÃPÞ7Ãz8Ãð1à­6ÃàI7Ãp>5à u5Ã`ˆ7à þ3Ãï/Ãàm1Ã<8àB3Ã0 8ÃPm5àH2Ãðÿ4Àk4à þ3Ã!2Ø3à;Ã0Š8Ãp¯7ðø0Ã06ÃPê5ðK8ð]5à 1Ãàa3ÀÊ9ÃÀ–2Ã`)2ÃàØ4àN1Ã5ÃÀœ1ÃàÌ6Ã071ðÔ6ÃÀ6Ã@@6ðæ3ÃÐL0ÃÐÉ0ÿ7ÃPð4Àq3ÃÀÆ*Ãð‚4ÃÀ 4à u5Ãàm1Ã`”5ð!?Ã@™<Ãp,8ÃðŽ2ÃÈ/Ãð‚4Ãðÿ4ÀY7àï+À7ê4Ãð|5Ãl0ÃÀ„5Ã@Ï3ÃÅ6Ã`2ÃàÆ7ÃÐF1ÃÐ¥6ÃàI7Ã@«9ÃPs4Ã?1ð{0ÃÐL0Ã0=0ÃÀœ1ð]5à;ðo2Ãз3Àk4ÃÀŠ4à9à à8Ã'1ðÎ7ÃÝ2Ã`¦2Àô2à {4Ã` 7Ã@R3Ã@É4Ãày/à<4àB3à³5ð3Ã`”5ÃàU5ê4ðÎ7ÃÐ"7ÃÐ(6à 3Ãн2Ã`)2ð]5Ã5Ãàö/ÃÔ)Ã`5Ã05Ã@d0Ã`)2Ã0®2à ¥-Ãàg2Ã@j/Ãð¦.ði3ÃÐF1À›,Ã3Ãpµ6Ã`2Ã@^1Ãpµ6Ã@Ï3à 2Ãé0Ã`ÿ8ÃÀ+/Àw2Ã!2Ãà‘+À /Ã'1Ã0º0ÃpÍ2Ã`2ÃÐ8ÃàÒ5Ã4ÃE0ä1Ã`6ðæ3Ã`ÿ8Ãp\0ÃpJ3ÃPö3à þ3ÃÐá,ÃÐ^-Ã?1Ã0®2Ãðˆ3À›,ÃÝ2ù8Ã@L4ÃÐ.5Ãp\0Ãàð0Ã-4ÃpP2Ã0À/ÃÐ@2Ã@j/Ã0+3Àô2Ã0´1à`.à¿3ÃÔ-Ãðš0Ã33ê0ÃÀ´-À‰/ü-ÃK/ÃÀ´-Ãàg2ÃÐL0Ã0C/ö2Ã`ó:à c8ÃP8)à Ô:Ãб4ÃÝ2À.À‰/Ãp»5ÀS8ÃàI7Ãàa3à ".À.ÃÀ¢0à ‡2Ã`S+Ã@É4ÃÀ3Ãð4Ãð#/À7Ãàa3ÃPö3ðÚ5ÃÀŠ4ÃÀ1Ã0C/àË1ÃÀ3Ãp86Ã<8Ãð4ÃàÒ5ÃW-ÃÐ@2Ã`”5Ã@Ï3ð/Ãàs0Ãý7ÃpÓ1àã-ÃÀ´-à65ê0ÃàI7Ãн2ÃPö3ÃÀr8ÀÐ8Ã07Ã07Ãp>5ÃÐL0ÃðŽ2Ã÷8à:Ãð^:à<4ÃPð4Ã`v:ÃÐ8Ãàm1ÃÀŠ4à­6Ãð /à {4ÃPs4ðc4à9ðQ7Ã0%4ÃP2Ãð 3Ã0œ5Ã0¨3ÃpÙ0Àú1ÃàC8Ø3ðà4ÃpÇ3Ã@Ï3Ã69Àe5ÃPÞ7à9ÃÐX.ð‡.ä5à u5à65ÃÐ"7Ãpµ6ðø0ÃÐ.5Ã` 3Ã@í.Ãà‹,ü1ðc4Ãàê1ÃŒ5ðW6Ãà*ÃPä6Ãà®;ÃPg6ÃPü2ÃÀ+/ÀS8ðà4Ã@·7Ã09Ã0–6Ã`6Ã>ÃðÛ:Ãt9Ã0é=Ãðv6À.àB3Ø7ÃÐ<ÃðF>ÃÀN>Ã0f>Ãt9Ã@:7ÃP2Ãp©8Ã@R3Ã×3àH2Ã0:Ãé0Ãàm1Ãà[4à þ3ÃЫ5ÃàU5ÃÑ4Ã0 8ÃPs4à ±+Ãpý*à<4Ãp>5à³5à65Ã`‚8àú>Ã@ ?Ã@{Að¶;ÀY7ä5À0ê4ÃàC8ÃÀf:Ãn:à<4ÃPü2Ã0¢4ðæ3Ã0´1Ã3Àk4Ã@ó-ÃpJ3Ã@Û1ÃÀ6ðÂ9Ã@Ï3Ãн2Ã`Ž6Ãð4Ãp&9ÃÔ-Ã-4à o6Àq3ÃÐ¥6Ã8ÃÅ6Ã0 8Ãp27Ã3/ê0ÃP2Ãp‘<Ø3àB3Ã`4Ã@.9Ã`4Ãð4Ã'5ÃPð4Ãàð0ÃÐ(6Àú1Ã@Ÿ;à i7ÃpÁ4ÃÂ0à ø4Ãp»5ÃÐ(6Ã`Ž6ÃЫ5Ã@Ã5Ã@É4àË1à¹4à ™/ÃpÇ3Þ2Ã'5ÃË5Ã@d0àf-ÃÝ2ðì2Ã-ÃpV1ÃÀ¢0ÃÐ:3Æ:Ãàð0ÃÐF1Ã0´1ÃÀ6ÃÀœ1ðW6Ã`A.Ãàa3à “0ÃÐF1Ãà.Ãl0ÃpV1ÃPö3ÃàU5ÃŒ5ÃP£,ÃP-Ãð4Ã`50ÃÐí*ÃÐç+ÃK/ðì2Ãpµ6ÃðŽ2Ã@v-Ã’4ðì2ð]5ÃÀ„5ðc4Ä,ÃP1Ãðj8Ã'5ð¼:Ãp£9ÃpÇ3ÀM9Ã07Ã`¦2À.Ã05ÃÐÏ/À_6à­6ði3Ã`#3À•-Ãð¬-ÃpJ3Ã~-Ãàð0Ø3ðÚ5Ã0œ5Ãðó6Ã@Û1à ‡2Ã-à 3Ãã1Ã@X2Ã!2ÃP…1Ãz8Ãày/ÃPö3ÃB7Ã@@6Ã0º0ÃðŽ2ÃPa7ÃpÁ4ð-ÃpÓ1Ã@í.àÑ0Ã0U,à ½)Ãà+ÃàÞ3Ãàm1ÃP-ð‡.ÃÀ¢0Ã`¬1ðþ/Ã`/1ÃÀœ1ÃP&,ÃP0ÃW)ö.àÝ.ÃÐR/ðo2ÃpV1ðò1ÃPü2ÃÀ¨/Ãph.ÃÀŠ4Ã@á0Ã`;/Ãã1à`.Ã@ç/Ãà‹,À‰/ð,ö2àr+ÃÀ['à /Ã,Ã`A.à u5ÃPs4à ™/ÃÀ6ÃÀ%0Ã@|,Ã?-Àè4ð/Ã0¨3ðþ/ð/Ã@·7à ¥-à×/Ã-ÃÐÉ0Ã@L4Ãз3Ã@Û1ÃÀ1à ±+Ã0O-Ãð 3Ã0U,Ãp\0à /ÃP0Ã0Ø+àÝ.à Ã(à .,Ãpå.Ãð#/Ãph.Ãð¾*ÃàI7Þ2ÃÀÆ*ÃÀœ1Ãð¸+à @)ð-à;Ãðˆ3à ·*Ãð#/Ãc+Ãàm1à þ3Ã`G-ÃÚ,Ã`/1ÃpÁ4à “0Ã0C/ÃÀ3Ã06Ã`4Ã@ç/Ã0=0Ãé0À0)Ã`k'Ã@ç/ÃÀ2ðc4Ã,ÃP,+ÃðŽ2ÃÎ.ÃÀÒ(ä1Ã012Ãàs0Ãàs0à ‡2ÃpÓ1ä1ð .ðW6Ã@p.ö.ÃpÓ1ÃÀ–2ÃpÙ0ÃP©+Ã0C/ê4Ãðˆ3Ãð2ö2ði3à 2Àe5ðo2ð .ÃE0Ã0Ø+Ãà…-ÃPm5ÃpÍ2Ã`;/Àè4ÃÀ5Þ2ðo2ÃàU5Ãðš0à ·*Ãðˆ3ÃP1ÃÐÏ/ÃZ3Ã`50Ãï/àB3ÃÀŠ4ð,à ½)ÃÀ´-ÃÀû6ÃÈ/Ãð#/ÃPy3Ãpå.ÃP2ð-à×/Ã@L4Ãp86ÃpÁ4Ã-ÃÐX.à 1ä1Ã0´1ÃPð4à 4+à65Ã'5Ãõ.Ã0U,Ãc+ÃP©+Ã@ÿ+à ø4à 2ÃÀ3Ãàð0ÃpV1ÃÐÃ1Ãf1ÃÈ/Ã0Æ.ÃÐ@2Ãð1ÃÀO)Ã0Ø+À0À7ÃàÌ6ÃЫ5Ã@j/ÃPg6ÃÀÆ*Ãðš0ÃÐR/à þ3à 3Ã@á0Ã0é=Ã@¥:ð/ÃÝ2Ã,Ã!2Àw2ðì2Ã`Ž6ÃàØ4Ã@:7Ãà*Ãàs0Ã`¬1à ‡2à³5Ã@^1Ãð#/ÃÐ^-ðo2ÃÐÕ.Ã0C/ÃÂ,À-Ãé0Ãðš0ÃP2ÃpV1Ã`¸/Ãà‘+À¡+À‰/à*7Ã`ˆ7à¿3ÃpD4Ãàð0ð“,ê0Ã0%4ÃP1ðì2à {4ÃÐ(6Ãpý*Ãà[4à³5ÃpD4Ã@";Ã`¬1ÃÐX.ÃàÆ7ÃpÙ0Ã÷8Ãàê1ÃP£,ÃÐÉ0ÃP‹0Ã@p.Àú1Ã'5Ãàa3à ".àB3ÃW-Ã`ˆ7ÃpÁ4Ã07Ã’8Ã071Ãðš0Ãpñ,Ã,àf-Ãã1Ãé0Ãн2ÃÀº,Ãð‚4à06à 1ÃPü2ÃÀ¨/ÃP2Ã`50ÃÀ1.Ã`#3ð¼:ðW6Ãàä2ÃàÞ3ð{0ÃàÆ7Ã0+3Ã`)2Ã0+3ÃpÙ0à Ÿ.Ãpn-À /Þ2ÃàÞ3ðæ3Àw2ð3ÃPs4À1ð™+ÃГ9Ã3ÃP1ÃÀ´-Ã0Ø+ÃpÇ3ÃPy3à K<ÃÐ(6Ã`)2à 1à 1Ø3ÃÀ 4ÃÂ,à c8ÃpÁ4Ã@á0Ã@d0Ãf1à×/ÃÚ(Ã@«9Ãðv6Ä,Ã`50à 1ÃPð4à 3ÃW-à :à Ú9Àe5Ã012Ãpz+Ê+àZ/Ã@ç/Ã!2ÃP—.ÃÀC+Ãpb/Ãàê1Ã0Æ.à ™/Ã`#3ð3Ã0=0ÃÐ44ðà4Ãpb/à ‡2Ãàm1À$+Ã@v-Ãð0ðò1ÃÀ¨/à Ÿ.ÃP.ÃÀ1Ãà—*ÃðÄ)ÃP.ÃÀ%0ÃÀ®.ð/Ã'1Þ6Ã@á0Ã~-Ã×3ÃP‹0ÃÀ3ÃPö3Ã@á0Àƒ0Ã0[+Ã@”(à ".À-ö.Ãpë-ÃPg6àT0ÃÐÃ1ðà4ÃQ.à u5ð .ÃÈ/Ã0I.Ãð5,Ãà.àÑ0Ã`4ÃP£,ÃpÇ3à {4ÃÂ,àõ*Ã`G-Ã@R3Ãð /ð/Ãc+Ã!2ðì2À0Ãð /ÃÀ¨/ÃP/Ãð‚4ÃÀ®.Ã0ê(Ã@j/Ãpz+Ãàð0Ã`¬1Ã`5Ãæ*Ã0[+ÃZ3ÃÎ.Ã@^1ÃP2Ã@‚+ÃÀ=,Àƒ0ÃPü2à 3Ã0[+ÃÀ¢0ðà4Ãà+ÃP,+Ãl0Ã0Ø+ÃP…1Ã0ê(À‰/ÃP,+àé,ÃÀ+/àN1ÃÀ3à :*à`.ÃpV1Ã`Y*ÃpV1ÃE,À,ÃÀ1.ÃÀU(Ã`Ð+Ãp\0Ã%'à ±+Ãð /ÃP&,Ã,à (-Ãï/àT0Ãõ.à 1ÃÀœ1ÃÈ/ð-àû)àï+ü-ÃÐÕ.ÃQ.à`.Ã@á0ÃP0ÃÐÿ'ÃP2*ÃÀ´-Ãp>5Ãð”1Ã0C/Ãû-Ã@ù,Ã071Ã%'Ãp*ðò1Ãн2Ãð/-Ã`Ö*ðþ/Ã`Ð+ð .Ã0¨3Ã`â(ÃP£,ê4ÃPa7à ½)ÃÀ+/àã-Ãà‹,ÃP&,ð/ÃÎ.ÃÐŽ%à ±+Ãà.Ãð#/À•-Ãàê1Ãà)ÃPs4Ã0À/Ãà+Ã`;/ÃK+Ãà.à¿3Ãà.Ö)à Ÿ.Ã@Õ2Ã0¢4Ãðš0Ãðš0Ã,ÃÀÌ)ð‡.ð/ÃP…1Ã@p.Ãà)Ã@'Ã`è'à„(à ±+Ã@ç/ð{0ä1à ".Ãà*Ãàü.Ãàä2ê0ÃÎ*à 1ÃÀŠ4ÃàÞ3ÃP0Àô2Ã0[+à “0ðu1Ã~-Ã@í.Ã@p.ð«(ð{0Ã`¸/ÃÐç+Ã`¦2Ãð /Ãð).Ãð;+ÃÐX.ÃÎ*Ãàð0àé,Ã0C/Ãà£(Ãð1Ãà+ÃP2ÃN5Ã`Y*ÃT4ÃðÕ;ÃPü2à .,ÃpÁ4Ã@½6ê0Ãï/Ãàs0Ãð1Ã@F5à 3ÃÐ¥6ÃPs4ÃÐ@2ÃÀ 4ÃPü2à;ó9ðc4à æ7Ã`Ž6ðu1ÃÀ3Ã05Àâ5Ãð¦.ÃH6Ã@R3ÃÀ3ÃPy3Ã@R3à$8Ãà7:à {4Ã0œ5ÃÀr8Ã09Ãp©8ÃÐ9à¿3ÃPy3à9À¸<ÃP1?à i7ù8Ãp27ðÔ6Ã7Ãp—;Ãðá9Ãð‚4Ãt9Ãë:Ã\=ÃÐ<ðÈ8Ã<8ÃÀ`;Ã@«9ð3Ã69Ã@«9ÃÀû6ÃÀ–2à æ7Ã@48ÃàÆ7À_6ÃT4à;à$8ÃàC8Ã’8Ã@Ã5ÃàI7ÃàC8Ãð 3ÃPa7à:ÀÄ:ÃàO6Ãp»5Ã0–6ðª=ÃàC8ÃÐ:Ø7ÀY7ÃÀf:ðQ7ÃÐ(6à³5Ãð@?Ã`ù9ÃðÛ:ÃÀ5Ãðá9ÀÊ9Ã@F5ÃP…1ç;Ã@";à K<ÀG:Ãà¢=Ãp=à æ7à Ú9ðì2Ãð4Ã0„9Ãn:Ã`6Ã@@à È<ÃÐ"7ÃË5À¸<ÃPÀ<Ã0û:à$8ÃpD4ðE9Ãб4Ã09ÃPs4àî@Ã`š4Ãð¦.à {4À;Ã<8Ãp86ðà4ÃÐ<Ã`@CÃå?Ãà>Ã`Ï@ÃÙ=ÃÀ$Eà FÃð±AÃ0¹EÃÐ9HûBÃPãKÃpaDûBÃ@ÎHð»OÃ0$Ià GÃÐMÃp´Kà²JÃ`þMÃp®LÃ`MÃ2DËNÃà¹NÃ`ŸHÃÀqMÃÀÖQÃÐ'KÃYHà¬KÃ5NÃ5Nà 2UÃðòKÃpºJÃ0LÃðQQà)LÃYHð8PÃÐåUðµPÃaQÃP×Mà ýHÃà×IÃ#Qà \NÀLNÃp¢NÃÐQÃ0îQÃÐ?GÃ`4Eà ÙNð,RÃ@˜QðßIÀóGÃ@’RÃp´KÃðuKÃÀeOÃÀJð©Rà bMÃÀ_PàPÃОLòNÃðIæPÃðoLòNÃÀMSÀRMÃÀJÃОLÃðuKÃp[EÃ0³Fà ÙNàíUÃ0qQÃ0‰MÃÐMÃÀ•GÃSIÃpœOÃÄKÃp¢NÃ0‰MòNð8PÃÐ’NÃ0$Ið÷EÃжHÃKÃÀÜPÃLÃжHà µTÃÀ_PÃp´KÀÉNàAHðŒBÃ…KÃ0úOàRÃÄKà KÃ@3MËJà FÃ0 MÃðGà¾HÃp[EÃPGÃpsAÃ@ÚFà hLÃ&Fà ÍPÃp=JÃMJà ÓOÃ@øAÃHÃ`IÃpUFÃ@ªNÃpºJà GÃàTJÃpaDÃ`JÃ@ÎHÃðìLÃ0›JÃ0‰MÃGKÃP‰ZÃàTÃÄKàÊFÃ…KÃÀ¡EàÖDÃpÆHà žCÃPœBÃÀ$EÃ2HðDÃ0Ã0ï<Ã0ÃÐì?à Â=ÃÀHÃ@æDà¸IÃpØEÃPDð÷EÃ`½CÃ@{AÃà~CÃÐWCà -AàÖDÃå?ÃÀÅ?ÃP~GÃ`±EÃ@ÎHÃVBÃÓBÃàrEãFÃeFàÖDðAÀ¸<ÃP¨@Ã0Z@Ã@@àú>Ã>FðBÃp>ÃÀÃ0Z@Ã@“=ð°<à‰<ðŒBð'>ÃP==Ã@";Ã`:DÃYHÃwCÀG:ÃðÏ<Ã`@CðBÃpêBÃDAÃàŠAà ªAÃÀ0CÃ@@ãFÃÙ=ð˜@Ã0NBÃn:Ãð@?Ã0é=á<Ãà?ÀBÃ@“=ð¤>Ãp…>ÃÓ>Ãß<Ãà7:Ã`ç<ÃðF>À²=Ã0Ý?ÃÐu>Ãp27Ãà®;ÃàÌ6Ãp?Ãp[EÃÁAÀŽCÃ`ç<ÃÀ`;à Q;Û=ð'>Ã`ÉAÃà1;ÀM9ÃÀÝ;à 3@Ã@½6ÃP+@ðž?ÃŒ9ÃÐò>Ãt=Ã0f>ÃBÃP®?à ¶?Ã@@Ãý;Ã@Ÿ;Ãz<Û=ÀóGÃp>ÃP¨@à 9?Ãðá9ÃðÕ;à>ÃàŠAÃðÉ=ðE9Ã0 8ð?:Ã÷<à !CÃpü?À)?Þ6Ãp—;ÃPÒ9Ãàº9Ã0l=ç;Ãà¢=Ã@«9ÃÐ.5ÃÀ2Àè4Ã0ã>Ã`d=ÃðL=ðà4à ø4àƒ=à•:à þ3Ã@48à ?>Ã`v:ÃP+@Ã÷<Ã0BDÃ0ï<Ã@48ðª=ÃàïEÃn:ó9ÃPÆ;à9À¾;ÃÐ ;ÃÀT=Ãß<Ãð|5ÃÀ~6Ãñ=ÃÐÃ1à•:ð9;ðE9ÃЇ;ÃÐ¥6à$8À7Ãb<Ãà+<Æ6ðª=Ãt=Ãp&9ÃÀ6Ãðí7ÃPê5à 1ÃPÒ9ÃàÆ7Ãàü.ÃÐ:ÃZ3Ã07Ãð|5Ã’8Ãðd9ÀÊ9Ø3à65ÃÀx7ÃÐ¥6Ã`6ð°<Ã`ó:ÃÀT=Ã`Ž6ê4ð°<à06ÃÐ<ÃŒ5ÃÀŠ4ÃÐ<Ãå;ÃPÞ7ÃPm5Ã07à*7Ã0%4Ã\=Ã!6Ã!2Ãðç8ÃPÆ;Ãý7ÃàÌ6Ã`ˆ7ÃB7ä1ÃÀ~6ðÎ7ÃPä6ÃàÒ5ÃÀr8à o6ð3ÃàØ4ÃÀ`;Ã;Ãðš0Ãr/Ã@ç/Ãð|5ÃPm5ÃP/Ã`6à i7ÃÐ{=Ã`ù9à 3à•:à9Ã7À}1Ã`G-Ãðó6ÀÊ9Ãàg2Ãàº9ðE9ð3à (-à {4ÃàU5ÃÀ1.Ã0=0Ãà-Àq3à 6Ã@·7Ã69À1Ã0C/Ãðˆ3ÃK/Ã0¢4à06ÃPs4àË1à u5à 6à 2Ã@É4à ø4ÃpD4à¹4Ã`6ÃÐ:3ÃÐX.Àâ5à 1ðc4à Ÿ.ÃpÁ4Ã`í;à 0Ã0C/ÀY7Ã!2ðu1ÃàO6Ãð¦.Ãð”1À}1Ãàa3Ãð4ÃÀx7ÃÝ2à 3Ã@X2Ã`¸/ÃÀ–2Ã0¢4Ã@½6Ã!6à•:ÃП7Ã*;ÃЙ8ðÔ6ðÎ7Ã@½6ÃPa7Ã`‚8ðu1Ãé0Ãð|5Þ2Ãð|5ÀÜ6Ãð”1Ã@ç/à¹4Ãf1ÃpÍ2ðc4Ã!2ði3ÃЙ8ÃÀ~6ÿ7Ãà7:ÃPä6ÃàU5ÃÐÉ0Ãð|5Ãðá9Ã07ÃÝ2ÃÀ%0ÃГ9Ãð.BÃàÆ7à¹4ÃH6ÃH6Ãàð0Ãày/ÃÐ¥6ÃpÓ1Ã0„9ÃÐ.5ÃÀ`;Ãý;ÃPü2Ãàm1àƒ=ÃPä6à 1ä5Ã`”5ÃÐ9ÃÐ¥6à¿3Ã`4ÀY7ÃÐ:ÃpP2Ãðˆ3Ãðd9Ãp»5Ã@:7à c8Ãàê1Ã@R3ÃPü2Ã0=0Ã0´1Ã3à :ðò1Ãf1Ã0 8Ã0+3ÃPê5ðÎ7Ãà+<ÃÅ6ÃpÇ3Ã33ðì2à 1ÃÀ1.Ã3Þ2Ã`ÿ8Ãp¯7Ã-4ÃPØ8Ãð|5ÃЙ8ÃpJ3Ã@ç/À_6à<4À•-Ãàg2àT0Ã8Ã`¬1ÃPÒ9ÃÀ~6ðÔ6ÃÀ×<Ã`ù9ÃpÁ4Ã@R3Ãð#/ÃÀ 4ÃÂ0ÃÝ2Ã`”5ðÎ7ÃP/ÃPð4ÃpV1Æ6Ã0œ5ÃPy3Ãp&9ÃQ.Ø3Ã@·7ÃÑ4Ã` 7Ãðv6ÃT4ÃpJ3Ã92Ãpb/Ã@É4à /Ã0:Ã’8ÃÀ3ÃÂ0ó9ÃË5ÃPê5Ãð”1Ãð 3Ã0+3Àî3Ãf1Ã`ù9ð3Ã@:7Ãð¦.à<4Ã`¦2ÀM9ÃÈ/ÃP2à¹4ÃPÀ<ÃÀã:Þ2Ã!2à u5Ã@Ã5À7Ã4Ã`50à 6Àú1ÀM9ÃPg6ÃË5ðà4Ã0 8Ã>Ã`š4à ò5ÃE,Ã@R3à ò5Ã012ÃP -Àâ5ÃpÇ3ðK8Ã-0À•-ðu1à¿3À_6ðu1Ãày/Ã06Ãàm1ðE9ði3ÃÀ5Ã0–6Ã0´1à ø4Ã0%4Àk4ÃÐÏ/Ã012ÃÀ3Ãpb/Ã@@6Ãpµ6Ãl0ðò1Ã!2Ã`2ÃÀ2Ã`#3Ãðù5À,Ã0Ì-ÃÐ44ÃÈ/Ãн2ÃÀ+/à þ3Ã` 7Ãз3ÃÀé9à ‡2Ã`Ž6à 3ÃÐ@2Ãã1ü1ÃÐ:3ä1à o6ÀÜ6Ã`ˆ7Ã`4à65Ãð‚4Ã05à ™/Ã`;/Ã`5Ãû-ÃÐÉ0Ã`6Ãðó6ÃQ.à ò5à þ3Ø3Ã’4ð/Ã@Ï3À‰/À.Ãp&9Ã0–6Ã-ðÚ5À.ÃÐL0ö.ÃÐp*ÃP0à<4ÃPÞ7ÃpP2ðà4ÃÐu>ÃH6à +Ã0ð'Ã`¬1ÃÀ3Ãðç8ÃPö3à¿3Ãð2Ã'1ÃÐ^-Ãp\0Ãph.Ã-0Àú1à ".Ã@Õ2ÃÀ2à Ô:ÃЫ5Ã`”5à ò5ðø0Ã<8Ã8ÃP…1Ã0¢4ðW6Ã?1Ã0Ò,ÃpÇ3ÃpV1à ™/Þ2Ã0+3ÃÐF1Ã~-àé,ðu1ÃÀû6Ã`š4ð{0Þ2ÃðŽ2ÃpÍ2Ã4ðÈ8Ã012ÃÈ/À1ÃÐÛ-àN1À.ÃPð4ÃPs4ÃÐÕ.Ã` 7ð]5Ãàm1ðæ3À1ÃÐ(6Ãð1Ã@:7à¿3Ã0%4À‰/Ã0Ì-Ã`#3Ã06à {4ÃÐ:3À¾;ÃZ3ðc4Ãàä2Ãày/ÃP‹0Ãн2Ãз3Ã@Õ2Ã0+3Ã@F5Àq3àT0Ãx.ÃÀ3ÃpÁ4à “0À_6Ã@ç/Ãpµ6À§*Ãð5,ÀY7Ãé0Ãð /ÃÐ.5Ã`)2à 3Ãà…-Ã@Ž)ÃÈ+ÃE0Ã0~:à;ðc4ÃàI7À-Ã0=0à 0ê0Ãðù5Ã0¨3Ãð;+ÃàÒ5ÃŒ5ÃÈ/ÃpP2Ãà-Ã0[+à ‡2Ø3Ã@ç/Ãàä2Ãày/ÃT4Ã@É4à «,Ã0[+Ã!2Ãð0Ã@Û1Ãp*À,Ã`¬1ðu1ÃpÙ0ÃK+Ã0º0ð/à (-Ã0®2Ãð¬-Ãàö/Ãr/à 1ÃÀx7à 1Ãõ.ðo2ÃP©+Ã0º0Ã'5àZ/Ã`S+ÃpŒ(Ãàð0àN1Ãàê1à 3ÃðŽ2Ãðš0Ã3/Ã0–6Ã`4ÃÐá,Àô2Ã5ÃK/ÃÐ.5àï+àZ/ð{0ðo2Ãpë-Ã0¨3ÃpV1ÃÂ0Ã92Ãà.ÃÀÆ*ö.Ãð /ÃÀ3ÃË5ÃÐ@2Ê+ÃÀ2àN1Ãð¬-Ã33ö.à 2Ã7Ãp86ÃÐ44Ã0C/à 0Ã@d0Ãpb/Ã`6ÃÀ„5Ã@^1ü-ÃP…1ÃÐÉ0Ãð1ÃÐÉ0ÃÐç+à ™/Ãpñ,Ã`¸/Ã`#3Ã012Ã0+3Ãà,Ãày/Ã@R3Ã4ÃðŽ2Ãx.à 3Ã@Õ2Ãl0ðø0Ã@Ï3ð/ð‡.Ã0I.Ãð).Ã`²0à þ3Ã33Ã@ç/ð“,ÃP…1à 2Ã@j/Ãðí7Ã÷8ÃÀ´-Àî3Ãpë-Ãr/ÃÐL0ÃÀõ7àN1Ãð2ÃðÄ)Ã0Æ.Ã@v-Ã@48àH2ÃpÁ4Ã92à 1Ãp»5Ã3à ì6ÃpJ3Ã0´1Ã`50ä5Ã9Ø7à65Ãp£9Ãpb/Àk4Ãpb/Ãàs0ð]5ÃÀ3ÃÐu>ðo2ÃpJ3Ãàä2ð3Ø7ÃÀ6Ãp,8Àe5à i7ÃàO6Ã@Û1à:Ã@48ÃK/Ãp86Àq3Ã0¢4Ã@^1ÃpJ3ÃPs4à {4ðÂ9à Ÿ.ðc4Ãб4Ã@¥:Ã0À/à o6ÃPÆ;à Ú9Ã0¢4ÃÝ2ÃE,ðÔ6Ãб4Ãàg2Ãé0ÃB7Þ2à*7ÀY7Ã0Ì-ÃK/Ã@X2Ãàä2ÃÐÕ.Ãðˆ3Ã0+3Ã@.9Ã07à<4à­6ÃЫ5ÃðÏ<Ã`5ÃàÆ7Þ2à 6ÃÀ3ÃÑ4Ã06ÃPö3Àq3Ã0+3Ãã1ÃàÒ5Ã09Ãðó6ÃpÙ0Ã`4ÃÐR/Ã0º0ÃPê5ÃN5ð/Ãð /Þ2à 3ÃÀ®.Ã0œ5ÃÀ®.ÃP…1Ø7ÃK/ÃàÒ5ÃPä6Ã`5Ã@R3à§7ü1Ãð1ð+Ãï/Ã7Ã@½6À)?ÃÐu>ÿ7ð9;Ãpå.Ã,Ãï/ÃÀ%0ðK8Ãðÿ4Ã’4ÃP…1Ãðš0Ã33ÃPä6Ã@Ï3Ã3ÃŒ5ð‡.ÃàI7ÃB7ÃÀ2Ø3ÃÐ:3Àw2ÃÀŠ4Ãàm1à 6à c8ÃÐ"7à­6Ã0º0Ãð‚4Ã0´1ÃpÓ1àT0Ãp,8Ã<8ÀM9à /à65ÃÀû6ÃP2ÃpÇ3ÃÐ@2Ã0´1àB3Ã`”5à ¥-Ã8Ã-4Ãl0ÃÀº,Ã0Ò,Ã3/ÃÐ(6ÃPð4Ã@L4à 1ð3Ãàm1ð“,Ã0Ì-Ãð 3ÃZ3à 3Ãz8ÃpP2ÃŒ5àN1ÃЙ8ÃÐL0Ã@:7à <Àô2Ã'1Ãf1Ã`)2ðì2Ã`;/Ãð‚4ÃÑ4Ã`ˆ7Ã@^1Ã0®2ÃÀf:Ãh;ÃÀï8ÃP2ÃàU5Ãàê1Ãp27ÃÐ@2Ãr/ÃàU5Ãðd9ðo2ÃÐÃ1à 2àé,à þ3ÃЫ5Ãðp7Ãà¢=Ã`š4Ã@L4ÃÀ~6à ì6ÃÀ~6à ø4ÃÐþ<Ãp27ð9;à§7ÃPð4à ]9Ã@±8ÃÐ¥6à*7Ã0¨3ÃÐ8Ã@¥:ó9ù8Ãàº9ðÎ7Þ2ä5ÃPg6Ãðÿ4Ã0~:ð]5Õ>Ã`|9Ã`6ÃàÒ5à³5Ãðp7ðÚ5ÃÀx7ÃP2*Ãp86ÃÐ<ÃPy3Ãàð0à i7Ã@·7ö2Ãð^:ÃÀl9Ãý7Àk4à ì6àB3ÃPÒ9Ã07Ã0„9ç;Ã`ˆ7ÃÐ ;Ãt9Ã`|9ÃÀœ1Ãpß/Ã÷<ù8ÃÐÏ/Ãð5,ÃÐ¥6à à8ÀÐ8ðÎ7à :Ã7Ãn:ÃàÆ7ÃP…1Ãà[4Ãð^:Ãàä2à {4ÃÀ%0Ã0%4Ã@:7Ã`|9à ‡2Ã8ÃË5à o6ç;ðÔ6ÃZ3Ãp:Ãðp7ÃPm5ÃÀ6Ã` 3Ãб4Ã@Ã5Ã`í;Ãз3ÃÀ3ÃÀ5ÃÑ4Ã’4ðÂ9Ã`#3Ãp86à ø4ÃÐ ;à W:ÃÝ2Ã'5ÃàU5Ã`8Ãz8Ã3ðÎ7Ãб4Ã06ÃÐþ<à65Ãðÿ4àB3Àâ5ÃàI7Ãð|5Ã0 8ÃÀŠ4ÃP/à ‡2Ã`ó:ÃГ9Ãð‚4ÃÀx7Ã` 7Ãñ9ê4Ã$<Ã`2Ã` 7ÃàI7Ãðù5Ãï/ÃðŽ2ÃÀû6à ì6ÃpD4Ãp»5Àâ5ÃÀ~6À1Ã09ÃÀû6Ã`”5Ãë:Ã06Ã`ó:Ãðj8Ã0 8Ã@·7ÃÀõ7ÃÀf:Àè4ÃàI7Ãp©8ÀÖ7Ãà%=Ã8Ãð 3ÃÐ:Ã5à;à 6Àe5ÃPÞ7Ãðó6ÃÐ:Ãð /ÃàÞ3ÃQ.Ã05Ã@j/Ãý7Æ6Ãàä2Ã@R3Ãà[4ðu1Ãpµ6Ã0œ5Ã0¨3Ã69Ãp>Ãз3ÃÀ5Ãå;ðà4Ã69Ã09Ã0û:Ãp,8à u5Ã33Ã`50Ã`2Ãû-à ‡2ðÂ9Ã@:7ÃPê5Ã@:7Ãpë-Ã0À/ä1Ã07Ã`ó:ÀG:ÃN5Àî3ÃP¨@ÀM9Ã`v:ÃГ9Ãx.à 1à 2ÃŒ5ó9ÃàÞ3à•:ÃT4ÃÑ4Ãàº9Ã`ˆ7ð]5à {4Ã`2Ã@Õ2ð3ÃÅ6Ãp>5ÃPs4ÃN5Ø7Ãð”1àH2Ãp,8ÃÀ–2ö2à .,Ã<8Ã@.9Ãà´:Ã0¢4Ã@>à à8à 2Ãph.àË1Ã`š4ÃÀr8à­6ù8Ãz8ê0Ã'5Ã0œ5Ã3Ãðˆ3Àk4ÃpP2Àq3Ã` 3à ì6ÃŒ5Ãб4ðà4à þ3Ã-0à¹4ÃpÇ3Ã0´1Ã@á0Ã` 7Ã92Ãp»5à<4Ã0¨3Ãpå.Ã!2ÃÀû6ÃP©+ÃpÓ1Ã8àH2Ã@@6Ãt9Ãý7À¸<Ã0õ;ÃÀœ1ÃpÙ0Ã!6Ãt9Ãz8à65à 6à ø4ðc4ÃàÌ6Ã0~:ÃZ3Ãðó6Ã07Ã@v-Àú1à¡8ÃÀ`;à þ3Ã0Æ.Ã-4ÃT4ÃpÍ2Ãðš0Ã@É4ÃÀŠ4ð]5Þ2ÃÐ ;Ãðÿ4Ãàg2Ã012Ãp\0ÃH6Ãý7à­6àH2Ãàg2Ã`|9à ™/ÃP -Ãðÿ4Ã0Æ.Ãàs0ÃàO6Ãàº9Ãh;ÃàÞ3Ãн2Ãp\0Ã0º0ÃÎ.Ãé0ÃQ.Ã`;/Àú1Ã@½6ðW6Ã0–6ÃE0ÃPm5Ã@Õ2ÃpJ3ÃpD4Ã`²0Ã@R3À›,ÃÐÉ0ÃN5à06Ã’4ð/Ã'1Ã@«9à 1Ãð).Ã06Àè4Ãàê1Ã`²0Ã@«9ö2ÃP2àÝ.à 2Ã×3Ãp27Ãà—*Ã`¦2Ãý7ä5Ã`²0ÃÀ¢0ðŸ*ÃÐÕ.Ãpý*Ãàê1Ã0Ò,Ã@d0Ã@ÿ+Ãpý*ÃÐX.Ã!2ðà4ÃpV1ÃÀ+/Ãp*Ã`Ä-ÃpV1Àk4Ã@Õ2Ãà.Ã@R3Ãð;+ÃÐR/à 2à {4ü-Ã`S+à “0ÃÐ44Ã`M,Ãé0ÃÐ44ÃP2à ".àB3Ã-0Ãð).ÃÀ 4Ãð4Ãà…-ÃPÞ7Ã@‡?ä1Ãàm1Àw2Ã`50Ã0I.Ã,Ã'1ÃÐÏ/Ãàg2Ãà)ÃàÞ3Ã@X2Ãph.ÃPü2ÃÀU(Ã`#3ÃÀ2ÃÀ2à /Ãð0Ã@(Ã@p.ÃÐù(Ã0Ò,Ã`¾.à 1ÃÑ4àT0ÃW-Þ2ÃðŽ2Ã×3Ã`/1ÃP‘/Ãà‹,Ã@L4Ã@X2Ã0º0à 3ð,Ã~-àï+Ãpn-À0ü1À›,ÃPs4Ã071ðì2ê0Ãpt,Àƒ0Ãð|5Ãõ.ðø0ÃQ.Ã'1Ãàü.ð-à Ÿ.Ãpý*ÃpV1Þ2ðø0ÃpÓ1Ã×3Àk4ÃÐ@2Àè4Ãð¦.Ãf1Ãн2Ã@|,Ã`¸/ð3àÑ0ÃpÇ3ÃpÁ4Ã`50Ãpß/à /ÃQ.Ãpñ,Ã'5ðÔ6Ã@F5ÃÀ¢0Ã5ðo2ÃÐ(6Ø3Ã@j/À1Ãé0Ã@ù,Ã@í.ÃPy3Ãð1ðì2À-Ãp86ÃÐ@2Ã0º0Ãàö/ÃpÍ2ÃàÞ3Ã×3ÃÝ2ÃPÒ9ü1à ·*Ãà.Ã69à i7ÃàU5Ãp>5ÃÂ0àZ/Ãð¦.àx*à ‡2Ã`Ê,ÃÐÕ.Ãà.Ã!2à “0Ãà-ðò1Ã@ù,ÃÐL0à ò5ÃpÍ2Ã`¬1ÃÀº,Ã0=0Ãph.à ø4Ã@½6ÃÐÏ/ðþ/à þ3Ãð;+à<4Ãð).ÃE,ðu1Ãpå.ÃÀ['àã-Ã@p.Ã0Þ*ÃPg6àf-Ã@ó-Ã`¦2Ã`¬1ÃP0Ã`¬1Ã](Ã0O-à 1à ø4À}1Àî3ÃàØ4ÃP©+Ã0O-ÃP—.Ã`#3Àq3Ã0%4Ãp86àÅ2Ãðç8Ãp=À}1Æ6Ã69Ã`ÿ8Ã` 3ÃÀ 4ÃЫ5Ã`¦2àÑ0Ã`50Ã;Ã`8ðà4Ãð2à þ3Ã`¸/à 3ð,Ãðv6Ãð4à­6ÃÐF1àH2Ã`6ÃÐ:3Ãàs0àB3à þ3à¿3Ãðj8ÃPð4ÃП7ÃàÒ5ÃÐ@2Ê+Ãð#/Ã@á0ÃB7Ãph.Ã0¢4ÃÀ„5àÅ2Ãðù5Ã`5ÃT4ÃàÞ3Àƒ0Ã!6Ã@½6ÃÀ6ÃÀ7-Àƒ0ð]5ðu1Ã`v:Ã0À/Ã012ÃÀZ<àH2ð-Ã4Ãpb/Ã0%4à (-Ãp©8Ãðí7ÃÈ/ðu1Ã07ö2Ã'1Ãðš0à ‡2Ãðç8ÃH6Ãðó6Ãðp7Ãðí7ÃPU9À;<ði3À-ÃÅ6Ã×3ÃàU5Ãð¦.Ã0=0ÃÀû6Ã`”5Ã@·7ÃÐ9HÃ0:ÃÀã:Ãз3ðþ/ÃÐ:3ÃÐ"7Ãp27à Ú9ð9;ðì2Ã`‚8à 6Ã06ð3<Ãз3àÅ2ÃÅ6ÃÐ44ðE9Ãðp7Ã@ ?ÃP?ÃÙ=Ã-4Ãðá9à$8à þ3ÃÀ~6à Q;Ã0é=ÃðL=à¡8ð¶;Ãà´:ðÔ6Ã`p;ðE9à*7Ãðj8à :ÀM9Ãð|5ÃÐ¥6Ã`8Ãà7:ÃàÀ8ÃÐL0ÃP´>Ãß@à Ú9Ã0œ5ð°<à Â=Ãñ=Ã`v:ÃÀé9ÃB7ÃðX;Ãp86à Â=ÀÐ8Ã@^1ÃàÒ5Ãp:à9ÃÀã:ÀS8ÃÐ8ÃPI;Ãh;à <àÑ0ÃÀ%0à ò5Ã69Ã@á0ÃPs4ÃÀï8Ã`FBÃàU5Ã`ˆ7Ã`6Ã05Ãðç8ÃÀ2Ã@<Ã`8Ãp¯7à•:à ì6à•:ÀA;Ã69à Ô:à¹4Ã5ÃЫ5ÃÐ¥6Ãn:Ãp=à­6à§7Ã09ÃÝ2ÃpD4Àî3à¡8ÃàO6ÀG:ÃÀ¢0Ã@48ÃÀ`;Ã=Ãà1;à W:Ã05Ãàa3ÃPð4ÃÀr8ÃPy3Ãt9ÀS8ÃÐ:3Þ6Ãï/ÃPy3À_6Ãý;à :ÃЙ8ÃÐ8Ãp©8ÃpJ3ÃàÀ8ÃÀr8Ãðj8à§7Ã`ÿ8í:Ã@Ï3ðÂ9Ãðá9ÃP==Ã7ÃÍ?Ã@Ÿ;ÃPØ8Ã0À/ðÚ5ÃГ9ÀM9Ãðù5ðò1Ãn:Ã’8ÃPÞ7ð9;À;Ãh;Ãb<ÃÐ:à ‡2ÃpJ3ÀS8Ã0:ÿ7Ø3Ãðó6Ã`²0ÃH6ðK8ðK8Ã69Ã`í;à§7ðà4Ã5ð‡.ÃPm5ÃÀf:Ã0´1Ãß<ÃàU5ÃÝ2ÃPÞ7ÀCÃ@X2Ã@Ï3Ã05ð¶;ÃPa7àÅ2Ãð‚4à¡8Ã`2Ã`6ÃÐ44ÃÀû6Ãpµ6Ã`¦2ê0Ã`5ÃPU9Ã0Š8Ãб4à9ÃÐF1ÃàÞ3à æ7à ø4à;Ã@·7ÃH6ÃÀŠ4ÀM9ÃГ9ÃÀ~6ðÔ6ÃÐÏ/ÃÀ3Ã`8ÃÐ<ÃPä6ÃàÞ3ðÚ5ÃP7>Ãp—;à 6ÃÀ3à ì6Ãà[4Ã`8Ãà´:Ã@48À•-Ãàä2ÃÐ:Ã’8Ã0Š8ÀY7Ãà=9Ã7ÿ7à­6ðW6Ãp¯7Ãp\0Àú1Ãð|5Ãб4ê4à9Ãà´:Ãn:Ãà=9ÃÐ(6Ã@L4ÃàØ4ÃÀ3Ãðÿ4Ãf1à c8ð˜@à ø4Ã33Ãðd9ÃÓ>Ãp,8ð¶;à {4ÃPê5ÃÐ:3ðì2ÃÀ1.ÃPm5ÀÜ6Ãàº9ÃÀ3ðÚ5Ã@±8Ã0–6Ã`p;à›9ÃàÞ3ÃŒ5ÃÀ1.ÃÐ.5ÃZ3ÃZ3Ã7ÃÐF1à<4ç;Àè4Ã@·7ÃpÇ3ÃÐ.5Ãl0à×/àÝ.Ãàs0ÃpV1à¹4ÃàI7ÃÀr8ÃÐ9Ãl0ÃP1ÃП7Ãp>5ÃÑ4à ò5Ã0C/Ãàö/Ãàs0ÃŒ9ÃP‘/Ã`#3ÃpÍ2ðÚ5àN1à ¥-À}1ðc4ÃP…1Ã@.9ÃPê5Ã`š4Àw2ÃPð4Ø7Ã0´1ÃpÁ4Ãðš0ÃÀœ1à c8Ø7Ã@É4Ãà%=à*7Ã!2àË1ÃK/Ã071ðc4ðà4ÃPü2ð3ÃŒ5ð]5ÃT4Ã!2Ãðš0Ãàa3Ã`6ÃP—.Ã@^1ÃPð4Ø3ðì2Ãàê1Ã@Ï3Ã0%4Ãð2À›,ÃpV1Ãl0ÃÀ1Ã`Ê,ÃP‘/Ãàü.ÃÀ¨/à “0ä5ÃPê5ÃÀ6ÃÀõ7Þ2àé,ð‡.Ã33ü1Àw2Ã`š4ÀÜ6ÃÐ:3ÃàU5à ø4Ã0„9ÃÀ1ÃàÒ5Ã` 3à “0ÃÐ@2Àî3Ã0Š8Ã@X2à ¥-Ã@á0À§*À.ÃàO6ÃpÇ3à<4ðu1àZ/ÃÀ„5à*7Ã` 3Ã0®2ÃZ3ÃÀ 4Æ6Ã`Ü)Ã0´1Ãàä2Ã012Ã@d0Ãð0Ã`2Ã92à /Ã071à×/ÃPü2ÃÀ–2ð .ö2Ãp\0Ãp÷+ÃÀ1ÃpÙ0À}1ê0Ãpå.Ã×3ÃPü2ð/Ã`ˆ7ÃÎ.ÃE0À‰/ÃП7ÃÀ7-Ãc+ÃÂ0ÃÐ"7ÃÀ–2Ãà-àé,Ä,Ãð#/ÃÀœ1Ãð‚4Ã@R3Ãð1ÃPð4ÃP…1ðo2Ã3/à þ3à ì6ÃÐÏ/ÃÀ5ÃÐÛ-Ãï/À**Ãà+ÃP.ð{0Ãx.Ã-0Ã@ó-Ãàê1Ãð/-Ãð/-Ãð0ÃP2Ã0ä)Ãà‹,Ã92Ãà-Ã`¦2Ã@ÿ+ÃÀ1Ã0À/Ã0Ò,Ã@ç/ÃÀ´-ÃÀœ1àË1ÃÐÏ/ð{0Ãð¦.Ã`²0ð«(Ã`Ð+Ã@í.à L'à 1À‰/ü-Ö)Ü(Ã@R3Ö)à .,À‰/ÃpP2ê0ü-Ã'1Ã@ç/ð/Ãpb/À$+Ã9.Ãð/-Ã?1Ã'1Ãé0ðì2ðo2Ãc+ð‡.Ãð”1ÃÚ(Ãà,'à ø4àÅ2ð-ÃÀI*Ãà=9ðE9ÃT4ðW6ÃÐL0Ãpz+ð-à 1ð{0Ã0ê(Ã@á0ÃÀ1.ÃP/à ‡2ä1À /Ã@±8ÃN5à<4Ãð4Ãpn-ÃK/Ã@d0ÃpÓ1ð/Ã`²0Ãàä2ÀÐ8ð3ÃÐÏ/àl,Ãðd9ÃÀx7à ¥-ÃÐí*à 1Ãð¦.Ãàê1ÃÀ1àË1à +ÃZ3ÃÐp*ÃpÍ2ÃPä6Ãï/ð/Ãð”1ÃpÁ4ÃË5Ãû-Ãp\0ðo2Ãн2ÃÈ/ÃPð4Ã`”5Ã`/1Ã0¨3Ã`¦2Ãé0Ã`¦2Ã'1Ã@d0ÃÐá,ÃPy3Ã0´1ÃÐ@2Àƒ0ÃÀŠ4ÃPü2Ã`#3Ãý7Ã33ÃP1Ãp»5ÃÀ5Ãàü.Ã@@6ÃÀõ7ðo2ÃÐL0ÃÀ®.ÃÐX.Àe5ðo2àB3Ãз3à 1Ãæ*à­6ð/ÃÐF1ÃÐL0Ãt9ÃP2Ã`A.Ã`¾.Ã@^1ÃÀ–2Ãp,8Ãà[4Ãp>5ÃPy3à³5ÃÐ(6àÝ.à þ3À0Ã`;/à ·*ÃП7Ã` 3ÃÐÛ-Ãày/ðu1Ã@d0à65àT0ÃÀ2Ãï/ä5Ãp86ÃЫ5Ã07ðø0Ã0®2Ã@R3ÃP—.ÃpP2Ã`ÿ8Ã0º0ÃÐÉ0Ãr/Ã012ÃÐ.5ÃÐ@2ÃPy3Ãð¦.Ã9.à “0Ã`8Ã0%4Ã'1Ãà,ð-Ã0¨3ÃE0à ì6Àe5àÝ.Ãðç8Ã@48ÃàU5Þ6Àú1ÃÐ¥6Ãð¸+À§*Ã5àH2À7Ã4ÃPð4Ã0+3ÃÐÉ0Ãðˆ3ð-À‰/ÃP -ê4Ãp©8Ãñ9à “0Ã’4Ãpµ6À‰/àN1ÃÐ@2Ã`”5Ãàm1ðQ7À7Ã9Ã8Ã` 3ðì2ÃðŽ2ÃpD4Ãé0Ã0%4ÃpÙ0à 2ü-Ãðÿ4ÃÐ{=à ‡2ÃÀ2À¡+Ã@L4Ã92Ã69Ãð0Ãðš0ÃpJ3ÃE0Ã<8Ãн2Ãð 3Àú1ÃP1ÃPð4ÃP‹0Ã@½6ÃЫ5ü-à “0Ãðš0ÃÐÃ1ÃЙ8Ãàö/Ã@á0à 3Ã-0ÃÀ„5Ãpz+Ã`‚8Ã@L4Ã@Õ2Ã` 3ü1à ‡2Ãð¬-Ã05àT0àZ/ðø0Ãé0Ãàê1Ãpß/Ã@X2ðò1À1àB3Ã`#3ðþ/ó9ÃÀ~6ÃÂ0Ã@j/à ™/Ãë:à‰<Ã÷8ÃàÀ8Ãà7:Ã`^>Ãf1ÃÀ×<Ã÷8ÃÀ2ÃàØ4Ãà1;Ã`4ð3Ãpß/ÃŒ5Ã0f>Ã'5ÀG:ÃÀõ7à ™/Ã`/1à ]9ÃÀl9à à8Ã`¦2Ãï/À7ÃðÛ:Ã5à<4Ã@«9Ã’8Ã09Ãà[4Àú1Ãpå.àf-Ãõ.ÀÜ6Ã33ÃðÛ:ÃàÒ5Ã0–6Ã0+3Ãðÿ4ÃàÆ7à 3àÅ2Ã33Ãp27ðà4Ã@¥:à E=Ã@±8Ã@.9ö2Ãp>5Ã`”5ÃpD4Ã0Š8ÃN5ÃÀõ7Ø7Ãðù5Æ6à {4Ã`4Ã0+3Ã0®2ÃPÒ9à9Ãб4ð]5ÃàÆ7Ã`¬1ÃÂ0Ã?-Ãðv6ðo2Ã0®2Ã@¥:Ã@Ÿ;Ã@Û1Ã@:7Ãh;À_6ðì2Ã0„9Ãb<à 3à¡8Ã`5ÃpÇ3à æ7Ã012ÃðX;Ãã1ÃÀ1ÀÄ:Ã` 7à¿3ð?:Ãp©8ÃpP2Ãà´:Ã`8ÃП7à06àÅ2ÃÀ`;ÃðX;ÃP2Ã0œ5ÃÀŠ4ð¼:Ã@>Ãp>5À7à¡8À}1ð-ðK8Ã@Û1ÃÀ 4ÃÀ 4Ã0¢4à <ðÎ7Ã0~:ÃÀx7ðþ/ÃpP2Ã@j/à­6ÃpD4Ã@Ï3Ã@X2à06Ãб4à i7Ãð/-ÃП7Ã’8à u5ÀS8Ã`ˆ7Ãp»5ðø0Ã@F5Àâ5ÃðŽ2Ãàa3Ãr/ÃÀ–2à³5Ã@É4Ã`2Ã,Ãð4ÃÀ5ÃàÌ6ÃpD4ÃPÞ7à06Ãh;Ã`4àÅ2à65À /Ã!6à;Ãp&9Ãt9ÀÜ6ÃÐ{=Ãà7:à c8ü1à¹4Ã`v:ÃpÓ1Àè4Ã`|9ÃÐ44Ã!6Ãðp7Ã<8ÃPg6ÃÀx7ð/à×/Ã`¬1ÃÑ4ÃÀ5ÃÐF1Ãðí7ÃÐ ;Ãß<ÃÀ~6ðQ7àH2à9ÃÐ:Ã'1Ãã1àH2à 2ðE9ð3<Æ6Ã09Ã0=0ðc4à‰<Ã<8ÃPð4Ãð^:ÃÐ(6Ãpµ6ÃàØ4ð/Ã`‚8Ãà=9ÀG:ÃÐÛ-Ãpµ6à 3ÃЫ5à -Aà06Ãðj8ÃàI7ðE9ÃP1?ðÈ8ÃH6ÃÀ„5ù8Àî3Ãðó6ðÈ8Ã@·7Ãà7:Ã@^1Ã` 3ÃàÆ7ÃÐþ<Ã<8ÃPÒ9ÃË5Ãн2Ã071Æ6ÃpÇ3Ãðÿ4ÃàÌ6à9Àî3à 3ðò1à¡8ÿ7Ãã1à<4Ø3ðæ3Ãà´:ÃË5ÃàO6Ã7Ã`í;Þ6Ãàg2ð]5ÃÓ>ÃàÀ8Ã@.9ð .ÃÝ2à65à u5ð˜@à :Ãp27à :ðÔ6ÃZ3Ã`ù9Àè4Ãðš0ð3à*7Ã0:ÃàÀ8Ã@Ï3Ã0+3à :Ã÷8à;Ãðd9Ã9Ã@Ã5Ã@Û1ðÚ5ÀÐ8Ãð”1Ã`|9ð]5Ãðˆ3àB3Ã@:7à u5Ãx.ÃQ.Ã@·7ÃŒ9ÃàÆ7Ã` 3Ãp&9Ã4Ã0À/ÃÀ1ÀY7ÃÀû6ÃÀ5Ã`#3àË1ÃÀœ1à06Ãз3àZ/Ãàê1ê0Ãn>ÃÐ:Ã`8Ø7ÃPð4Ã`ù9ÃàÞ3Ã`”5ÃÐ@2Ø3ÃÀõ7À¾;Ãp‹=Àe5Ã3/ÃÀf:ÃàØ4Ãð1Ã`¾.Ãð#/ÀÐ8ÃŒ5Ã'1Ã`5Ãf1Ãý7ÀY7Ãp27Ãð4à æ7Ãp»5Ã'1Ã@É4ÃÀ6ÃÀï8Ãã1À7Ãðš0Ãз3à 3Ãp27ÃðŽ2Ã06Ã0®2Ã@d0Ã`6ÃPÀ<ÃPC<ðæ3Ãàð0Ãð).ðþ/ð{0Ã@j/ÃÀ–2ÃP‹0ÃP0Ã0U,Ã0û:ÃÀœ1ÃpÁ4ÃpÁ4à ò5à 2ÃÐ44ÃP2ÃT4Ã`š4Ãp>ÃŒ9ü-ÃpJ3à¿3À0Ã@F5ÃÀœ1à ì6à<4ÃÀ„5ÃÂ0Ãàm1Ã0Æ.ÃÐF1àï+ÃÝ2ÃpD4ÃðA*Ãày/Ã!2ÃQ.Àw2Ã07Ã`”5ÃÐÃ1Ã@á0Ã`¾.Ã!2Ã0œ5Ãð1à {4à¹4Ã'5ð-ÀÐ8ð/Ãr/ÃÀx7Àk4ÃàÒ5ÃÐF1Ãï/à*7Ãð1Þ6ÃÐ@2Ãé0ÃP/Ã@v-ÃÀ1à 1ÃÀ5Àq3ðò1à ±+àã-Ã@R3àÅ2Ã’4ü1Ãàa3Ã@Û1Ã33Ãð4Ã`)2ÃP1À.ðø0Ãàg2ÃpJ3Ãàg2Ã×3à (-Ã`¸/Ã`4ðÎ7Ã-4Ã0º0ð‡.À‰/Ã0º0Ãpt,Ã@j/ÃÀ¢0À}1ÃÀ®.Ã`”5Ã0´1àã-Ã@Û1Ã`2Ãðp7à 1Ãà[4ÃÐÃ1Ãð1Ã@L4Ã7Ão)Þ2Ã` 3Ãp27ÃÐd,Ã`#3Ãp\0ÃÝ2ÃP2ÃN5ÃP—.Ã@É4ÀS8ÿ7Ã@·7Ã0º0ÃÀ=,À6(ä1ÃÀ%0Ãð).ÃPs4Ã`¸/ÃÐ.5Ã`4Ã0¨3ÃP2*ÃpP2à 1à (-Ãph.ÃÐÏ/ÃÈ+Ãð /Ãàs0à 1ÃÐX.Ãx.ÃÀõ7Ã0À/ÃE0Ã@ *ðŸ*Ã0O-ðì2Ãàö/Ã`¾.à<4Ã`‚8Ãà7:Ãðó6À1Ã0¨3Ã` 3Ã`¬1Ã0´1ÃE,ÃP¯*ÃÂ,ÃPs4ð/Ãð²,Ã`²0Ã@R3àH2Àô2À,à ¥-à à8Ã`²0ÃÐd,à 3Ã@ç/Ãðí7ðÔ6ü1Ãã1Ãàü.Ã@v-Ã`A.Ã0U,àZ/Ã@Õ2Ãð2ÃPê5à ".Ãà[4ÃÐÕ.Ã@É4Ã0+3ÃP—.ÃðÄ)Ã@í.Ãà[4Ã'5Ãé0à (-Ã`¸/Ãã1ÃB7Ã`#3ÃÀœ1àÝ.à ò5ÃÑ4ðþ/Ã012Ã`/1À.Ã`;/Ãðˆ3à ¥-ðo2ÃPy3ÃK+ÃÐá,ðo2Ã`)2à /Ãð0ÃN5Ã`)2Ãð²,ÃP/ð-Ã` 3ÃðŽ2ð,à 1Àƒ0Ãpß/ÃpÍ2Ãð1Ãàm1Ã3/Ã0„9Ã06Ã0´1Ã`/1ÃàÒ5Ø3à 2Ãàa3Ãð2Àq3ðÚ5ÃÅ6ÃÂ,ÃPö3Ãð 3Ã` 3ÃðŽ2Ã`)2Ã@ó-Ã4ðc4Ã0®2Ãð 3ði3Æ6à “0Ã@Û1ÃÀ1À}1ðÔ6ð3<à³5Ãðó6Ãë>ÀM9ÃW-Ã` 3Ãàg2à¿3à ì6ÃT4À7ÃÀõ7Ãðù5Ã0+3ÃH6àT0ð/Ãð‚4Ã@Õ2Ãã1Ã4Ã3ÃPÒ9ÃÐ.5Ã07à æ7Ã`5Ã0®2ÃT4ÃÐ44ÃÐÉ0ÃÐ"7ðQ7àT0ÃPÆ;à u5Ã`50Ãpå.Ãà,ði3ÃàÞ3Àè4Ãàg2à þ3Ãð0àã-Ã@F5ÃÀ2àN1Ã0À/Ã@Ï3Ã`50ÃpÙ0Ãp\0à 1Ã0œ5ðE9Ã` 3ÃPê5à<4Ã`#3ð]5ðE9Ãðj8Ã0~:ðu1Ã-4ÃPü2ÃЫ5Ã05ÃðŽ2Ã`#3Ã@Ï3ÃÀõ7Ã0Ø+Àw2Ã0%4Ã@É4ð3À}1Ã`5àï+ÃÀ1ÃàÆ7ÃÀ2Ãpz+À.ðà4àH2Ãpå.ÃÐÏ/ð‡.À7Ã@Û1Ã`)2ð/ÃÂ,ðø0Ãà‹,ÃÐ:3ÃW-Ã0º0ð3Ãð#/ÃP…1ÃÀº,ÃÀÀ+ð .àB3Ã0Ò,Ãðš0Ã`¦2Ãðó6ö.Ãðˆ3ÃH6ÃÔ-à¿3ÃÑ4ÃPØ8ÃPs4à¿3ÃPm5Àq3ÃÀ1à c8à06Ã@48à Ú9Ã@:7ÃàÆ7ÃÀ~6ÃàÌ6Ã0%4Ã0:ð¶;Ã`|9ÃÐ9ÃÐ<À²=Ã0ï<Ãðp7ÃP[8ÃÀû6ð?:Ãðv6Ãp&9Ã÷8Ãà~CÃ@=ÃÀl9Ãp&9Ãðÿ4à æ7Ãðd9Ãp;Ãå;Ã`ù9Ãðˆ3ÃÀã:Ã*;ÃPC<Ãp?Ãà®;ÃðÏ<Ã@™<ÃЫ5à:ÃPœBÃà´:ð¼:à W:Ã`#3ð'>ÃÀZ<Ã69Ãz8ÃP7>à‰<ÃÐ8ÃPÒ9ÃÀÅ?ÃðEÃp‘<Ã>à þ3Ã`#3ðÚ5Ãp‘<ÃP==à›9Ãðj8à 3Ã`)2ÃðÏ<À¾;Ãz<Ã0r<ÃPa7Ã@Ã5ÃðF>Ã@>Ãp,8Ã`R@Ã0œ5ðc4ÃÀï8ðÔ6à 6À7ð]5Ã0~:ÃÀõ7ÃÐ¥6Ã0û:Ãý;Ãà=9à à8ÃðÕ;à ò5Ã`ù9À7Ãàa3Ãpµ6Ãp©8à}>ÃГ9ÃPä6à ]9ÃàÞ3ÃÐ¥6ÃÀ6ÃÐF1ÃÐ8Ã`”5Ã<8àw?à ?>Ãp=Ã0x;Ã0é=ÃÐ<à þ3ÃàØ4ÃPÞ7Ã@<ÀÐ8Ãà[4Ã@(:À7ÃàO6ÃЙ8ÃPU9à W:Ãà>Ã0I.Ã’4à <ð9;ÃÀ6Ã@·7Ã`ç<Ãð@?ÃÐ8ÃPs4ð]5Ã`v:à;ÃÐ¥6À7ÃpD4Ãý7Ã`j<ðÔ6à à8ÃPÌ:Õ>ÀÊ9ÃP´>À5=ÃðÕ;Ã`ù9Ã0û:ÃГ9Ãp86ÃÐ8Ã5ðÂ9ÃÀN>Ã`j<Ã@ ?Ãt9ÃÐ:Ãðá9ðÔ6ÃðÏ<Ã0Z@ÃP==Ø7Ã0„9Û=Ãàº9àÝ.ÃàI7Ã`R@à W:Ã0 8Ã4Ã`v:ÃP7>Ã@«9à o6Ã0–6Ãb<à ¤Bà§7ÃÀï8ÃðÉ=àƒ=ÃN5Ã7à 6Ã0„9Ã=à ]9Ã`R@ÃÅ6à 0Ã@:7Ãp&9à;à¿3ðæ3Ãàº9ÃÐ¥6ÃÀ6ÃPü2ÃÀ~6ÀM9Ã$<ÃÀË>à ?>ð-=Ã09ÃÀr8Æ:ÃÀ`;Ãý;Ã0:ÃÐ<ÃЫ5ÃÐ¥6ÀÖ7Ã0œ5ðc4à06Ã`ÿ8ÃpJ3Ãàº9ä1ðÎ7Ãb<à;ðQ7Àe5ÃÀï8Ã@";Ãàð0à 6Ã<8À7Ãàs0ÃPÒ9Ãpµ6Ãp :àô?ÃP®?Þ6Ã9ÃÐ ;ÃÀf:Ãðù5Ã0Š8Ã;Ã`í;ÃÐ{=Ã@Ï3Ãé0Ã÷<Ãz8Ã0 8Ãë:ÃP.ÃPm5Ãt9Ã`5à Î;Ã` 7ÃB7Ãà=9ÀÄ:ÀÊ9Ã0„9ÃÀÝ;ÀÜ6à§7ÃpÁ4ð!?ð3<ÃÀf:Ãðÿ4ÃÀû6Ã0œ5àÝ.ðW6ÃÐø=à›9À7Ãðp7à¹4ÃàÒ5ÃP[8Ã@Ï3à :à¿3Ã!2Ãðá9à¡8à•:ðª=àB3Ã0~:à ]9Ã;Ã'5Ãðÿ4Ã`Ž6Ã@Õ2Ãp27ÃàÆ7ðÎ7à ¶?Ã`š4Ã0~:À¦?ÃЙ8ðÎ7ÃГ9Ã0¢4Ã0Z@Ãà7:ÃT4ÃàÌ6Ãð‚4Ã`‚8ðª=Ãp=ÀÄ:ÃÀ3Ã0–6ÃH6Ã0Š8à à8Ãp27Ãðp7Ãðó6Ãàº9Ã0Š8Ãà+<á<ðÎ7à ì6ÀÄ:à›9ÀÊ9Ãà¨<Ãpö@É@Ãà¢=Ã<8Ãp :ÃP+@ÃÐ"7Ã@(:Ã`j<ÃÀl9Ãñ=à K<Ã`ÿ8Ã0l=Ã07à o6à‰<ð°<Ã?Ã@™<ÃÀB@ÃPÒ9à ¤BÃPÀ<Ã0 8ð'>Ã`LAÃб4Ã@·7Ãp;à¡8Ãðç8ÃÀ×<Ã@L4ÃÀT=ÃŒ9Ã@.9Ã0~:Ãpü?ÃPCÃñ=ÃÇ@Ã`FBÃÀZ<Ã0û:ÀG:Ãp;À¦?ÃðÃ>ÃÐ¥6ÃPØ8Ãë>Ãp;Ã0é=Ã05Ã`5à:Ã@48Ãðç8à W:Ã@“=ÃÀZ<Ã÷<Ãh;ÃÐò>ÀM9ÀS8Ãðp7Ã@(:Ã0ï<ÀA;ÃP/ÃàÆ7ÃЇ;Û=ÃPI;Ã0Š8Ãàa3Ã@«9Ãp>ÃÀé9à›9Ãà´:Æ:ÃÀ–2ÃÐ(6ÃÝ2ù8ðE9Ã0~:ÃP[8Ãp&9ÀY7ÃŒ5Àè4ÃÝ2ÃpP2ð¼:ÃàÒ5ÃÐ8Ãð”1ðÎ7Ãðˆ3Ãp86ÀÖ7ðæ3ÃàU5à ø4ÃàO6Ã0Š8Ãz8ÃÀ5à06Ã!6ù8àT0ÃÀ5Ã`ù9àÅ2ÃÐ8Ã@É4Ã-4ÃÐ44Ø3ðæ3Ãp86Ã07Ã` 7Ã@.9ÃÐÃ1ÃÐL0Ãð|5ÃT4Ãß<ðÎ7À_6ÃPU9ÃÀ6ð?:Ãp¯7Ãð 3Ãð2Ãp86à65à æ7Ãð‚4Ã?-Ãð”1Ãðj8Ãà®;Ã07Ã@.9Æ6Ã05à 6ÃPy3à`.Ã`Ä-ðì2Ã`)2ÃP1Ã0®2Ã`8Ã@±8Ã07ÃÀŠ4ÃàI7ðK8à þ3Ãp,8Ã`6ÃЫ5ÃPä6Àƒ0ü1ÃÅ6Ã07ÃË5ÃË5Æ6Ã0%4Ã`#3À,à /Ã`6ÃÀõ7Ã0 8À /ÃÀ1Ãð4à þ3Ã3/ÃpJ3Ã071Ã9.ÃP‘/Ã`¸/ÃP1?ð/Ãàä2Ã@L4Ãðv6ÀÖ7ÃàÒ5Ãð|5ÃPØ8Ã0–6Ãðˆ3Ãðj8à¹4Ãàa3ÃŒ5Ãð2ÃàÌ6Ã012Ã`6ÃH6ÃpJ3Ãð#/Àw2ÃpP2Ã071Ãàê1Àƒ0à ø4ð/àH2Ã0´1ÃZ3Ã0´1à$8Ã×3à ø4Ãðÿ4ðu1Ãàð0à +Ã@v-Ã@ç/ÃPä6Ã×3ÃàO6ÃÀ1Ã@p.Ã-4Ãð1à ø4Ã@:7ÃÐ44ÃpÁ4Ãàä2Ãp\0Ãàä2ðu1Ã@ó-Ã<8Ã0Þ*ä5àÝ.ð¥)ÃÐÉ0Ã@X2ÃP2ÃàC8Ã`ó:Ã071Ãpß/ü-Ãð²,Ã@½6ð]5Ã0Ò,ÃÐ44Ã’8ðæ3ÃÝ2à65Ã`4à$8ð¼:Ã012ÃÅ6Ã06ÃÀû6ÃÐ"7ÃðŽ2ÃN5ÃàU5ÃÀ„5Àe5Ã012Ãl0Ã@@6À7ÃðŽ2ÃÀ5ÃÐ.5ðÔ6Æ:à$8ÃPU9ÃpP2ÃðŽ2ÃðÛ:À0ê4Ãðù5Ã@";Ãð‚4Ãp¯7Ãpå.ÃàØ4Ãðp7À_6Ã0¨3ÃPm5Ãð2Ã` 7ÃÐ:Ãp>5ê4à c8Ã*;à06ÃÀx7Ã’4Ãðj8Ã06Ã69à<4À7Ã!6ÃPä6ç;Ãp&9ÃàØ4Ãàü.Ãð0ð/ÃÀŠ4ÃÀr8ÃpJ3Ã@Û1Ã33ÃàU5À7Ã`ˆ7Æ6Ãð‚4Ã0%4Ã@@6ÃPy3à¹4Ãàð0Àk4à¹4Ãp£9ÃÐ8àÑ0Ãpå.Ãàä2Ã@L4ÃÀl9Ã`²0Ã×3Ãàä2ÃP…1Ãð0à*7ÃàÌ6ðæ3à ø4à 3ði3à¹4Ã×3à¡8ÃÝ2ÀG:Àq3Ãàg2ÀÄ:À1Ãн2Àî3Ãðí7Ãb<à9ÃP‘/Ã09ÃÀË>Ã@.9Ãб4ÃÀœ1Àè4Ã4ö.ÃPO:à×/ÃPg6Ãðó6ðÈ8Ãðí7à<4Ãàä2ÀÖ7Ã'1Ãp>5Àw2à o6Ã07À1ðu1ÃP2ÃàÒ5Ãðp7Ã÷8Ã@Ï3à W:Àw2ÃŒ5ÃPü2ÃN5ðà4ÃЙ8ÃðR<ÀÖ7à:ÃpÓ1ÃpV1ÃPÞ7ÃPm5Ãt9à¹4à§7Ãð‚4Ãðí7Ã33ÃÀ6ÃpÁ4ÿ7à65Ãàg2ÀY7Ãn:Ãr/Ãàü.ÃPa7Ã'5ÃàÆ7Ãà´:Ã!6ÃPs4Ãðˆ3Ã@:7Ø3í:à ø4à ø4à 6ÃàØ4ÃÑ4Ã`8Ãàä2ÃÑ4Ã0õ;ÃPö3ÃÀé9à¿3ðo2ð]5Æ6ÃÐÔCÃz<Ã@F5à ø4Àw2Ã`8ÀÄ:Ã@<Ã`p;ÃàO6Õ>à Î;ÃÀf:à Ô:ÃЫ5Ã0%4Ãp—;Ãðá9Ã0Š8ÃðÛ:Ã`‚8Ã0r<Ãð 3Ã`¦2Ø3ÃpÁ4ðE9Ã@:7Ãà7:ÃÀ6BÃ`d=Ãðš0Ãp>5ÃPy3Ã33à<4ÃT4ÃðÕ;Ãðó6Ã3ÃÀl9ÃÀf:à­6Ã`ó:ÃÀl9ÃÀã:ÀÖ7Þ6Ã`/1Ãð4Ã7ð-=Ã`ù9À}1Àô2ÀÐ8Ãà1;À7Ã!2Ãàm1ù8Ã0Š8ÃpP2ðc4àN1Ã@X2ÃàI7à¿3ÃÐ44ó9Ãðá9Ã7ÃÀl9ÃPê5Ã`2à¹4ÃÀ„5ÃÐ44Ã@48Ãàm1Ãн2à06Ãð2ÃГ9À7à 0ÃpÍ2Ã07ÃÀ3Ã!2ÃPö3ÃГ9à*7Ã`4ÃpÙ0ÃP‘/Ãð 3àÑ0Ã@í.Ãr/Ã`š4ÃÝ2Ã05àl,ÃP2ÃÀû6Ã`/1ÃZ3Ã0:ÃÀ~6ê0ðì2Àq3Ã?1ð/Ã0º0ä1Ãà7:Ã3àH2Ã!2à ¥-à {4ÃP2ÃÀŠ4ÃÐá,Ê+Ã`A.Ãðš0Ãð0Ã33Ã0œ5Ã`”5Ãð^:Ãx.ÃÐ^-Ãðp7à 2Ãp\0ÃP‘/ü1Þ2Ã@X2ü1ÃÀ5Ã,ðà4Àè4ÃPU9ÃàØ4à³5ðæ3Ãð0àÝ.ÃП7Ã@^1à06àH2à {4à 1Ãpµ6ÀÜ6Àe5Ã`¸/ÃàO6Ã@48ÃÀ–2Ãàg2Ã05ÃÐÏ/ÃP[8ÃàO6Ã9.ÃP.Ã@Ï3à 6Ã`A.ð“,Ã0 8Ãð).Ã!2à 1Æ6Ãàü.ç;à 3Ã`50Ã@Û1Ãð).Àè4ðà4Ãð).ÃP/àÅ2Ã0 8à þ3ÃPy3ðu1Ãð5,ÃW-Ãpë-ÃpÙ0Ã3/à 1Ã!6à 1àH2ð3ÃE0Ãpß/ÃЫ5Ã!6Ã0=0Ã0O-Ãà.Ãàä2à ‡2ÃÀU(àf-ÃP-â'ðu1Ãà=9Ã@½6Ãð1Ã0O-ÃK+ÃP»(ÃÀœ1à 2à`.ÃP—.Ãæ*ÃP2ÿ7Ã0%4Ã3ðu1Ãp»5Ã`50Ã×3àZ/ÃPð4à ‡2ÃZ3Ã`2àé,ÃpÙ0ÃÐÃ1à 6ÿ7ÃÀŠ4Ã`;/ÃW-Ãð‚4Ãpå.ÃP1Ãpå.Ãð|5Ãð/-à 1Ã0%4Ã@F5Ã@Õ2À1ÃÀ+/à °@à Ô:Àq3Ã0–6Ã@|,Ã012ÃB7Ã0Æ.ÃÐÏ/ÃP2à 2Ã92ÃK/Ã@ó-À•-à Ÿ.Ã0Æ.ÃP¯*ÃPy3Ãl0ÃP&,ÃP.ÃP…1ÃàÆ7Ã'5ÃN5Ãpµ6ði3Ãðš0Ãà®;Ã`ó:Ã05Ã@L4Ãp£9àèAÃÑ4Ãðí7Ã0%4à W:ÃPs4ÃЙ8Ãå;Ã<8ÃPÆ;ÃàU5Àú1Ã7ÃÀ5ÃpÁ4Ã07Ãp…>Ã`á=Ãðí7Ãàº9Ã@½6ÃÀÝ;Ã@48ç;ð-=ÃÐ ;à$8Ãz<à K<ÃÐ:ð9;Ã9Ãðj8Ã@«9Ã0–6Ãpµ6Ã@¥:à W:ÃЇ;àú>Ãðç8Ãp©8Ã`‚8á<ÃÐ:Àè4ÃЙ8Ãë:Ãß<À_6Ãн2ðÂ9Ã@ ?ÀÐ8ÀÜ6ÃàÆ7Ã*;Ãð:@Ã`j<Ãh;ÃP[8Ã0x;ÃJ@Ãp…>ði3ÃPä6ÃàÆ7ÃpD4ð]5ÃЇ;ðE9ÃÐ:3ÃÐ.5ÃH6Ã0r<Ãðá9Ã@@6à c8à E=Ãà„BÃð@?Ã÷8À7ÃÐ8Ãð@?à :Ã@«9ÃÀ~6ÀÊ9ð¶;ÃàU5Ã4ðK8ÃÐ{=Ã`p;Ã0õ;Àq3Ã0„9ÃÀH?Ã07ÃÀï8ÃÐX.Ã?1Þ6ÃðÃ>ÃË5ÃP‹0ÃÑ4Ãà>Ãà7:Ã0„9Ã`Ž6ðc4Ã06ÃPØ8ÃPC<ÃÀl9ÃÐ(6à$8ÃpÓ1Ãðˆ3Ã`‚8ð3Ã`Û>ÃPI;ÀM9ð!?ÃàU5ÿ7ÃÀÝ;Ã0õ;ðì2Ãp27Ãà7:ÃPü2ÃN5Ã`í;ÃÐþ<Ãp‘<Ã0õ;Ãðá9ÃPä6ÀM9Ã@@6ÃàÌ6ÃB7ÃàÒ5ê4à ‡2ÃPg6Ãn:ÃÀã:Ã’8Ã0 8àH2Ã@™<Ã!6ÃÑ4Ã09Ãp¯7Ãà[4Ã`ˆ7Ã@Ã5à 3à :ÃpÇ3Ã!2ÃÀ6ÃPg6ê4Ã0¢4Ãðp7ÃÀ„5ÃpJ3ð?:ö2à;ÃÀ6ÃЙ8ðÚ5Ã`|9ÃÑ4Ã0¨3Þ2à 2ðÚ5ÀÖ7Ãðó6Ãp»5Ã0®2Ã’4ðK8ÃPO:ÃàO6ðà4Ã`¦2ÃÐÉ0ÃÀ5ÃÀr8ÃÀx7àB3ÃPg6Ãà–?Àq3à ø4ÃP==ðÂ9Ã×3ÃÀ3ÃPy3ä5Ã@@6à*7Ã4ðæ3Ã`2Àî3À7ä1à «,Ãàm1ÃÀ„5ÀÐ8àB3ÃàU5Ã@^1ÃË5ÃðŽ2ÃàÌ6Ã0x;Ãðp7ÃÀ„5ÃàU5ðž?ÀG:Ãð).à æ7à 3ÃPy3ð-ÃpÍ2àf-Ã06Ã0º0Ãpb/à 2Ã'5ÃÀï8Ãpb/Ã@Ã5ÃpÁ4ÃÅ6ðæ3Ãé0Ãr/ÃÝ2ÃÝ2ä5ÃPa7ÀÖ7ÀÖ7ÃP2À¡+Ã-0ÃÀû6Ãñ9Ãå;Ã0+3Ãàð0ÃÀr8Ãðÿ4à¹4Ã0C/Ã0¢4ðì2Ãp27à u5à {4Ã` 3ÃÀ6Ã@«9à³5ÃÀã:ð{0Ã9.Ã`š4à 1Ãð‚4Ã'5à ì6Æ6ÃÐF1ÃÐR/Ã!2àT0Ã@d0Ãà=9Ãp:à§7Ãðí7Ã×3ÃÐ8Àú1Ãðÿ4Ã@L4Ã0¢4ð/ä1ÃPÒ9àZ/Ã0Ø+ÃË5ÃÐ:3Ãð0Ã07Ãн2Ãày/Ãð1ä5Ã05à 1ÃP/ÃÀŠ4Ã`|9Ã0:ö2À•-ÃÀ 4Ã0®2Ã@^1ðò1à (-Ã@v-Ã`Ð+Ãl0à 2Ã@«9ÃÀ~6Ã5àZ/à ì6ðc4Ãàü.Ãðv6Ãн2ÃP0ÃÀû6Ãð2À1Ã`¦2ÃÀ3Ãб4à¹4Ã3/Ãày/Ã0œ5Ã`)2Ã`²0ÃÑ4à 3ðŸ*Ã`š4Ãн2àl,Ãðv6ÃÐ44ÃpD4ðu1Ãð‚4ðì2Ã-àx*ÃP¯*ÃÀœ1Ã7Ãp86Ã7àÝ.Ãàê1ÃÐ.5ÃP0Ã`”5Ãз3Ã@Û1À1ö2ÃÀ1.àË1Ã0¨3Ã×3Ãf1Ã`2Àî3À}1Ã`²0Ã012Ãð4Ãû-à ¥-Ã’4Ãðp7ÃÐ"7ÃÐÛ-Ãàg2Ã@L4ÃàÆ7Àƒ0à 2Ã012ÃpÁ4Ã0¨3Ãàº9à þ3Æ6À}1Ãðˆ3ÃÀ¨/ðo2Ãàg2ÃÝ2ÃàO6Ã`2ê4ê0Ã'5Ã@ç/ÃàÞ3à /À›,Ã92à×/ÃÀ2Ãf1Ã07Àè4ðÎ7à<4ÃPö3ÃPs4Ã012ÃP©+ÃÐá,Ã’4à Ÿ.ÃÀ1.Ã@v-ÃÐR/Ã0C/Ãp»5Ãpë-Ã@ç/Ã0=0à ø4Ã`¬1Ã@í.Ã@ù,ÃN5Þ6Ã92Æ6Ãð²,ÃÈ+Ãû-Ãr/à 1Àw2Ãàm1ÃQ.Ã@Û1à þ3à 0Ã`A.Ãð”1ÃÀ®.ÃP -Ã0®2Ãð#/Ã`¦2à 3Ãð0àË1Ãpb/à ™/ðæ3Ãàm1ðæ3Ã3ÃP1ÃÐR/Ãз3ÃÐF1Ã0À/àû)ü-Àú1ÃÀ=,ÃpÙ0Ã@d0Ãà…-ÃÀû6Ãà7:ÃÐÛ-Ãð|5à ò5ðø0ð-Ãï/ÃPy3Ã07Ã06Àq3ÃÀ–2Ä,À**Ã-0Ã`G-ÃP‘/Ãз3ÃàÞ3ÃÐÕ.Ã`Ü)Ãз3À}1àN1ÃP2Ã@R3à (-ÃðÄ)Ã~-Ã0:Ãàä2À›,Ã!2ÃÐR/À•-Ã0C/ÃPü2Ãðš0Ãð 3ÃÂ,Ãpå.ÃÀ¢0Ãðš0ð"*à +à þ3ÃP…1ÃP/Ãð/-ÃÐL0Ã071ÃÂ,Ãð;+ÃÀ2ð‡.À•-ÃÀ6à06Àô2Ã0O-Ã@R3ð“,à 0Ãð#/Ã`)2Ãp€*Ãï/Ãà‘+àã-Ãl0Àî3ÃÎ.Ã92ÃH6Ã-4àÅ2Ã0À/ð-ð-Ãð0Ãp»5à³5ÃÂ0ÃÐÃ1ÃP&,ÃÔ)Àè4ÃÀ®.Ãû-ÃP1ðc4Ãpå.Ã-Ã(Ã?1Ãð¾*Ã,Ã3/Ã`;/à ]9ð3ÃQ.ÃÈ+Ã`/1àf-ÃÈ+Ãà)Ãx.Ãàa3à¿3Ã-0ð‡.ð-ÃðÄ)ÃÀ=,Ãð).Ã33ÃÀ=,À}1à .,ê0Ã0U,ÃP…1ÃÀ6À.Ã0+3Ãðp7ê0Ãpë-À-Ã-0ÃP/Ãð¾*Ãpå.àl,à ±+ÃÀI*ÃP‘/Ã,Ã`¸/Ãð /à 0Ã@F5ÃÝ2ÃpÍ2àT0Ã@á0Ãð”1Àw2Ãð”1ÃÈ/àÑ0àZ/Ãpñ,ÃÐÕ.à ±+Ã071Ã0´1Ãæ*ÃÑ4Ã`¬1ÃÐÉ0Ãé0ÃÀÀ+ðþ/ÃÐ44Ãà‹,Ã@ù,Ã0¢4Ã012ÃÀ1.Ã0Æ.ÃÀ2ÃPÌ:ÀS8Ãàa3Ãpb/Ãp\0Ã9.ê0ð/à ‡2Ãðv6ÃÐç+Ã0ä)à (-Ã69Ãð‚4Ãàö/Ãб4à ½)Ãà…-ðo2ÃH6àH2Ã@v-ÃpD4ÃPs4Ã`Ž6ÃP2Ãà[4ÃÀ–2ðì2Ãàa3àN1Ãà+Ã@p.À.ö2Ãз3Ãph.Ãб4à ‡2Ã0Ì-ÃÀ+/à 3ÃÀ3Ã-4Ãpå.ÃÐí*Ãð2Ãàm1Ã`)2Ã0À/Ã0=0ÃT4Ãз3à×/Ã*Ã`¾.Ã@F5Ã0´1ÃÐÕ.àT0ÃPÞ7Ã0O-Ã0Ì-Ã@F5ÃÀ1.Ã`50ÃÐL0ÃpV1ð/ÃE0Ãðv6Ã0®2ÃPy3ÃpJ3Ã@d0ÃpÙ0ð]5ÃPg6ÃÐ@2Ãн2Ã@·7ðo2Ã`Ž6Ãð 3à 3Ã0´1ÃPê5ð]5Ãpz+À /ÃÐ:Ã×3Ãp :ðÎ7Ãà[4ÃP0Ãð4ÃÀ+/Ã@Ï3ÃPê5ðà4ÃÐ44ðà4ü1Ã'1À}1Ãð2ðo2ÃpÁ4Ã@R3Ãph.Ã`‚8ÃPð4ÃГ9Ã69À7ÃN5Ã33Ãàs0Ã@ù,Ã`¸/ÃЙ8Ø7Ãð 3Ã`4à ò5ÃÀ„5ÃàÀ8ÃP£,ÃP2Ãà´:ÃÐX.à +Ã`Ð+ÃpV1Ã0¢4Ãà+Ãàð0ÃÐ@2ÃÀœ1Ãðj8ê4à§7ðc4ä1ÃÀ–2ê4à$8Ã0+3Ã0º0ðì2Ã07à {4à×/Ã’4Ãõ.à ø4Ãx.àÝ.ÃÀ´-ÃP£,à¿3ÃÀ3à i7Ã(ü-Ãé0Ã`Ö*Ãðù5Ã`G-ÃP/àã-Ãð1ÃPm5Ãà…-ÃpV1Ãph.Ã'1ä1ÃPs4Ã@í.Ãðÿ4Ãð1Ã@R3Ãàm1à ".Ã`²0Ø3ðæ3Ã0¢4Ã'1ÃÐí*à 1àï+àÝ.Ãpb/Ãû-À}1Ã`4Ãpß/ÃZ3àÑ0à~)Ãàä2Ã`š4Ãð /Ãx.Ãàs0Ã`A.ð/Ãã1Ãl0à 1Ãð2ö.Ãð¦.Ã@ó-ÃP—.ÃpÓ1ü1Àk4Ã07ð,ÃÀ3Ã0Æ.Ã9.Ã` 3à (-à×/Ã`Ê,ÃPð4Ã0g)Ã0Ì-ðæ3Ã-4ðì2Ãf1À$+Ã0[+Ã0O-Ã` 3ÃP -Ã` 7ÃÐd,Ã~-Ãð /Ã0O-Ãð /ÃÀ1Ã`2à þ3Ã`/1À§*Þ2àH2ðæ3ÃÀ%0ÃÐL0Ãð1Ãp\0àf-àN1à (-ðþ/Ã`Ä-Ãp*ÃPÙ#Ãð#/ÃÂ,ÃÂ0Ãð|5à$8ÃPö3ÃP—.ðo2Ã@É4ðþ/ÃÐá,ÃP -ÃP/Ã`2ð-Ã~-ÃÐÏ/àN1à “0ÃÀ=,àZ/à :*ÃÀ 4Ã@Ž)Ãpë-ÃÐp*à (-Ãà+Ã0O-ðò1ü1ÃP2ÃÐ@2ÃÀï8Ãp86ÃÝ2ÃP—.ÃÀœ1à×/ÃÐí*ÃðM(À›,ÃP>(ÃÀ=,à ¥-à þ3ÃÀ3à ±+Ã0m(à /Ã@Õ2Ã@ó-ÃP-à 2Ã~-ÃÐç+ÃP -ÃðŽ2Ã×3Ø3À0ÃP0Ãðè#Ã0U,àÅ2Ãpb/ÃÝ2ö.Ã0[+ÃÐÃ1àf-Ãн2Ã!6Ã0´1Ãн2Ãàa3Ã0À/Ã@j/Ø3Ã`¸/Ã@j/ä1Ã*Ãà—*À1ÃP»(Ã@v-À /àï+ÃÀ¢0Ã-0à ò5Þ6Ãð/-Þ2ÃP…1Ã`Ä-Ãð¸+à(Ãé0Ã92ä1À-ÃÐç+ÃpD4Ã@+Ãpñ,ÃÐù(ÃÀU(àã-ÃàÒ5Ã@ÿ+Ã0U,ðþ/ÃÀ®.Ãðš0ÃK+ð‡.Ãà…-ÃÀI*ÃÀ´-ð-À•-Ã0À/ÃP&,Ã,Þ2Ãð5,ä1Ã0O-ÃÐç+Ã0Ò,Ãò(à +ÃP‘/Ã*Ã@É4ÃÀ+/Ã!2Àƒ0ÃPê5Ã3Ãð¦.Ã@ç/à ".Ãp€*Ã@d0Ãð¦.ÃpÙ0À**ÃÎ.Ãð#/Ãð‚4Ã?1ÃpP2Ã@v-Ã5Ãé0Ãò(ÃE,àH2Þ2ÃPä6ÃÂ0Ã`Ö*ÃÀØ'ðì2Ã@¥:àr+ÃE,Ã@p.ÃÐÕ.Ãàð0Ã`#3ðo2Ãà)ÃPÁ'Ãð1ÃÀ®.Ã`Ä-Ã-Ã`M,à {4Ã3/à ™/Ã0[+Ã@X2à o6Ã071ê0Ãph.Ã`4àN1à 1ÃpD4àË1Ã@í.À1Ã@ç/ÃÀ7-àï+Ãðÿ4à Ã(ÃÐd,Ãàm1Ø7Ãn:à 2à9àõ*Ãð1Ã0I.Ã!6Ã-0Ãõ.àã-Ã0´1Ã`¬1Ã@Õ2ÃÈ+ð‡.Ãpë-Þ2ÃÐ(6Ã`²0À-Ãõ.ÃàO6ÃÐÛ-Ãï/Ãð‚4Ã0I.À‰/Ã4À /Ãàê1Àƒ0Ã071ðì2ÃÀº,ðo2Ãðš0à×/ð“,Ã@^1à 3Ã?-À$+ÃÐ.5ÃH6À.Ãé0Ã5àË1à 1ð{0ÃðŽ2ÃÀ¢0ÃpÓ1ÃP…1ðu1Ã`”5ÃP-Ã0Þ*ÃP¯*ðò1ÃÀ1.ÃpV1à 6à¡8Ã`5ÃÀœ1ÃÈ+ÃÀ6ÃÝ2ÃÈ/ÃÀœ1Ãp(Ãà‹,Ã@ù,Ã],Ã`2à “0ÃÐÛ-ÃÀ1.Àô2ö2à ¥-Ã@^1ÃE0ÃÀ 4ð3Ã0À/Àú1à 6ö.Ãà*à 3À7à Ã(Ãc+Ã@p.àõ*Ãø'ÃE0ÃЫ5Ãð”1ÃÀ7-À¡+ä1Ãã1ÃÀ1ÃT4ÃÐR/Ãàü.ÃÐÕ.Ã`š4à 2Ã@|,ÃPµ)Ãð).ÃÀ=,ÃÀ¢0À.à /À}1Ãàa3àN1Ãà.Ãàs0ÃÀŠ4Ã0=0À1à ¥-Ãð¬-Ã071ê0ð/Ã4Àô2Ã0=0Ã~-Ã0¨3Ãàs0ÃÀœ1Ãàs0Ã0¢4à~)Ãp(Ã0=0Ãàm1Ã0º0Ê+ÃÀ 4Ã@L4Ã0+3ÃàI7ð]5ÃÀã:Ãp86ÃÀ6Ãð|5Ã@á0Ãàa3à u5ó9Ãð 3Ã@@6Ãpb/Ã@Û1Ã!6Ãðˆ3Ã92Àq3ð]5Æ6Ã` 3Ã@«9ÿ7ÃÐ44Ã`#3Ã0¢4ÃÀé9ÀA;ð?:Ã0l=Ãðó6á<Ã@·7Ãp\0Ã?1ÃÐ8ÃÀõ7ÀA;Ãðá9ÃÀ`;Ãpµ6Ãp :Ã0„9Ã@(:Ãp :ÃÀT=ÃP´>ÃÀx7à þ3Õ>Ãh?ÃPa7Ã@=Ã0x;ÿ7Ãà1;ð3<Ãà>À¬>Ã@Ÿ;Ã`Ï@ÃàBØ7Ã\=Ãz8Ãà´:Ãà¢=à ¶?Ãà=9ðÔ6Ãð^:ÃÀË>ðBÃp<Ãðí7ÃPð4ÃÀï8ð°<ÃÍ?Ã?ÀCÃðL=ÃàûCÃP¨@Ã0NBÃð±AÃ`d=Ãh?Ã07Ã!6Ã0:Ã`|9Ã@ ?Ã@.9ÃÀf:ÃÀË>Ãb@Ãà?à ]9ÃŒ9Ãn>Ã0x;ÃÀ`;Ã0û:ÃÀ×<ÃÀÅ?ÃðF>Ãp :ÃÐø=Ã@½6ÃPÆ;Ã`d=ÃÀ¹AÃ@Ÿ;àô?Ãb@Ã\AÃðù5Ã0ÃÐ:À @Ãå;ÃPC<Ã9ÀÊ9Ã0:Ã`ó:Ã`j<ÃPU9ÃàÀ8à @Ã@·7ÃPÌ:ÃðL=ÃÐ"7ÃPº=à>Ãp…>Ãñ9Ã06Ãðí7à È<ó9ÃЇ;ÃðÏ<ÃP==ÃП7ÃÓ>À¸<ÃÀÅ?à>Ã÷<ÃPa7Ã`)2Ãp‘<Ã;ÃP[8Ã@.9Ãp<à 'BÃË5Ã`Û>ÀÖ7ÃÐo?ÃàI7à<4Ã-4ÃPÒ9Ãà=9ÃÀË>Ãà+<à¡8ði3ÃPg6à›9Ã`j<Ã0û:ÀÐ8Ãà´:Ãpü?Ã`á=Ãp<ÃPm5à¹4Ã`ˆ7à:ÃÐ8à=Ãà=9ÃÀ`;ÃÐ:ê4ÃðX;Ãà1;ÃP…1ÃP¢AÃà@Ãðj8à E=Ã÷<Àk4Ã@É4à³5ÃÀr8Þ6à$8Ã`í;Ã÷<Ãðv6ÃPü2ÃPÆ;À¦?ð?:Ãðv6Ãp:ÃÀ`;à :Ã÷8Ã0=0Ã69ðE9ÃàO6Ã0:ðÂ9ÃЫ5ÃPä6ÀM9ÃÐ{=ÃÀÝ;Ã?1Ã0Š8à 3Ã@48Ãå;à þ3ÃPs4à ò5ÃГ9Ãp‹=Ã` 3ù8ÃP==Ã@";Ãp,8ÃÀ3Ã`v:Ã`á=Ã`)2à Ÿ.ÃPÞ7ÃpÙ0ÃPê5Ã<8ÃÑ4Ã@ç/Ãð|5Ã0´1Ãx.Ã7ÃH6ÀÊ9Ã0:Ã`4à¹4ÃÀ 4Ã0¢4Ãà¨<ÃÀ×<Ã`‚8ÀG:Ãðç8ÃÀœ1ÃÀõ7À)?Ãàg2à×/Ã0¨3à 6À•-Ã@Û1ÃŒ9à à8Ã7ÃàU5Ãp,8ðø0ÀS8à È<à ]9ê4ðæ3ÀÖ7Ã3Ãðp7à 0ÃÀ~6Æ:ÃÐ^-Ãt9ÃÐ9ÃP-Ø3Ã@«9Ã!6ÃàÒ5à (-à:Ã3Ã4Ã0 8Ãðp7ÃÀ 4Ãl0Ã`¦2Ã5ä1À}1Ã0œ5Ã`Ž6Ã`/1ÃÐ@2Ãб4ÃP/Ãpß/ðì2Æ6à 3Ãà.ÃÐ8Ãðp7à65àÅ2Ã'1à þ3Àô2ðc4ÃÀ¨/Ãàð0Ãðš0Ãðó6Ãàð0Ãl0Ãð0à æ7ÃГ9ÃÐ.5ð‡.Ã`/1ÃPØ8Ã’4Ã0=0Àk4à06Ã0I.Ã@É4ÃÀ¨/Ã@R3à;ÃÐÃ1ÃÀ1ÃàU5Ã'1Ã`A.ðì2à×/Ã9.Ã@Ã5ð]5À•-Ã071Ã33à`.Ã92ðÔ6Ãàg2Ãàü.ÃÝ2Ã`¦2Ãàð0Ãð‚4Àk4à06Ãðˆ3Àô2Ã`¸/À-ÃH6ÃÐL0ü1Ã0¢4à i7ÃÈ+ÃÐ44Ã@>Ãày/àH2Ãðˆ3à ò5Ãð/-ðò1Ã`¸/Ãày/Ãн2Ãàä2ÃÀœ1àB3Ã0œ5Ãà,Ã`/1À7Ãб4ÃàÆ7ÃÀ%0Ã`4Ã`²0àT0ð{0À‰/ÃÀ%0ÃÀ1Ãз3Ãàä2Ã012ÃÀ2Ã33Ã@É4Àƒ0ðþ/ÃÀ2ð,ÃÐF1ÃàU5À1ÃP/ÃÐá,à +ÃðA*ÃЫ5Ã@ó-Ã@^1ÃÐ@2Ã’4ÃŒ5ÃPs4ÃÐù(Ã`;/Ã`S+Ãpý*Ã@ÿ+ÃÀœ1ÃÐ.5ÃP,+Ãì)à)ÃÐj+Ã-Ãõ.À.ÃŒ5ÃàU5ÃÐ|(Ã?1Ãé0Ã-0ÃpÙ0ÃÐÏ/ÀÜ6Ãð4à u5À-ÃÐÏ/Àw2ðŸ*Ãà )ÃÐç+à 4+ÃÔ)ÃÐ|(ÃÈ/ðŸ*ÃÂ,ÃÀ¨/ÃÀ7-Ãà+ÃPÇ&Ãì)ü1Ãr/ÃðÜ%Ã`â(Ãp¯7Ã`¦2àõ*Ã?-ä1Ã3Ã`2ÃÐÕ.Ã0Ø+à ™/À‰/Ã`²0à ".ÃÔ-ÃP—.Ãû-ÃÀº,ÃàÒ5Ã0º0ÃÐ(6à 6Ãàa3Ãz8ðÏ"Ã)à «,à 1Ãï/ÃÀû6ÃE0Ãà—*Ã@‚+à×/àÑ0Ãà.Ã07ð3Ãl0Ã,Ã0ð'Ãà&(Ã0Ì-Àƒ0àÑ0ð,Ã](Ã0Æ.Ã0Š8Ã],Ãð5,Ã-4Þ2ÃðŽ2ÃP.Ã@^1àé,Ã?-Ãðš0Ã`#3ÃÀ1Ãð).ÃP-ÃQ*ÃÀ¢0ðc4Ã0a*Ãà'ÃÀO)ÃÀ 4àf-Ãpb/Ã`50Ã@R3ÃK/ÃÀ´-Ãà,ÃP-Ãõ.Ãð¬-ÃÂ0Ã`2ÃE0Ã0À/ÃpÇ3Ã`50Ã`¾.Ã0®2à 2Ãà[4Ã`)2Ã`50àï+Ãp†)ÃP/ÃP—.ÃP‘/À.À /Ã`š4ðc4ü-à 3ÃÀ5ÃPö3Ã0Ò,àl,ÃÐ44à ¥-Ã@j/ü1À.Ãà)àf-Ãph.ÃÀ2ÃP0Ãðš0ÃpÍ2ÃÐF1ÃÐR/Ã0œ5Ã?1Ã`¸/à +ÃÀ5Ãr/Ãpë-Ãð¬-À,ÃÐá,ÃpJ3À1ÃÐ:3Ãð2ÃÐF1Ã@v-Ãàü.Ãð¸+Ãpå.À0Ã-Ãì)ðò1Ãàg2Àk4àé,à “0ÃP.Ã`¦2ÃpÙ0ÃÀ~6ÃÐÛ-àŠ'Ã`â(ÃÐL0ÃðŽ2Ã`²0À›,ÃPm5ÃЫ5ÃÐ44ð/Ã`¬1ði3Ãp\0Ã@X2à ".ÃÐí*à “0Ãàð0Ã`A.Ãr/ÃÐR/àT0Ãà+Ã@v-ÃPs4ÃÐç+Ãpß/Ã9.ÃPü2Ãз3Ãà¨<Ãé0ÿ7àé,Ã0U,Ã`50À /Ãà.ÃP¯*Ã@@6Ãð 3ð“,à×/ð‡.Ã@+Ã0À/à³5Ã012ÃÀ3Þ2Ø7à 1ÃÐ:3Ã`Ð+À›,ÃÀ„5Ã@Õ2Ã`Ö*Ã0=0À0Ãàa3àË1à`.ÃÀŠ4ÃÐÉ0ä1ÃpÇ3Ãl0ÃàÞ3Ã`¬1à “0Ãpt,ÃP/Ã`5ÃP1Ãr/Ãl0à<4ä1àÅ2àH2Ã`Ð+Ãà-À›,à ™/ÃÀÀ+ÃpÙ0ÃPö3àï+à +Àú1ÃQ.ÃÐ@2à /ð,Ã`/1ÃÀœ1Ã@ù,ÃÀ®.Ã@ó-à Ÿ.Ã0º0Ã`²0ÃàÞ3Ãð 3ÃÀ+/Ãpå.ð±'à (-Ã-0ÃÐ:3Ãf1Ã0¢4Ã@j/Ã3ð3Ã`2ÃðŽ2ÃT4ðÔ6ðc4ðì2Ã0O-à 0Ãà.ÃP/Ã`²0Ãàs0Ã9.Ãàð0Ã'1Ãàm1ÃÂ0ðu1ðQ7ði3ÃÑ4ÃP-Ã0Ø+Ãpt,ð/àB3Ãð|5Ãõ.Ãà-Ãõ.Ã`Ê,Ã`Ä-à «,ÃÐ^-à~)Ã`¾.à 6Àâ5ÃE,ÃÀ7-Ãб4Ãà‹,à Ÿ.Ã071ÃÈ/ÃÈ+Ãi*Ã@R3Ã0Ò,ÃPD'ÃÀ=,ÃpP2ð™+Ã`e(à&Ü(à “0ÃÀ¢0Ã@d0Ã0Ø+à (-à 3ÃP1ÃP1À_6Ãð0À‰/Ãàm1à 3Ãàg2Ã`¸/Ãн2Ã@R3ð¥)Ãðš0ÃpÇ3Ã*Ãà*ÃP>(ÃP&,Ã`G-Ãðš0à Ÿ.à «,à Ÿ.àr+ÃÀ®.Ã`‚8Ã3àl,Ãæ*ð«(à Ã(Ãà,ÃÀœ1Ö)Ãð).Ã`¸/Ã0Ò,Ãð¸+Ãà+ÃP.àÅ2à 1Ã@ÿ+à Ÿ.À /àÑ0ÃP&,À¹'ð .ÃÂ,Ãà.ÃÐF1Ão%ÃðA*ðo2Ã0À/Ã*Ãà-Ã-Ãï/à Ã(Ã`w%Ã@ù,Ã`G-ð"*Ã`Ð+À.ÃÐj+ÃŒ5ðæ3Ãpý*Ã`²0Ãé0Ãà'Ã0À/Ã0À/ÃÐF1Ãàm1ÃÂ,ÃP&,ð/Ãð/-Ãx.ÃPP%ÃÎ*À$+Ã9.à ø4ÃÀÌ)Ã`;/Ã`¾.Ãà…-ÃP»(ÃQ.Ã`/1Ãð/-àŠ'ÃP,+ÃpŒ(Ã%'Ãà£(Ã`S+Àô2ÃÀ=,Ã3/ð3Ãàm1Ã`M,Ãàö/Ã0=0ÃÐÏ/Ã`Ð+Ãõ.Ã`;/Ãð¦.Ãàü.àã-Ã`_)Ã@Ž)ü-Ãà-Ãï/à 4+à Ï&Ãà,Ãpë-Ãpz+ê0àï+àé,ÃP0À‰/Ã012Ã@ÿ+ÃÀÌ)ÃÐó)Ã`50àÅ2à Ã(ÃÚ(à~)àf-À /Ãàð0Ãà,ü1à~)À0)Ã0¨3Ã0[+ÃÀº,Ãà‹,Àe5Ã`Y*ð‡.à +ê4Ã0C/à 0Àw2Ãæ*à (-ÃÀ+/Ãà&(Ãx.Ã,àT0à +Ã-Ãàg2à (-Ão)À1à 0ÃPÇ&Ã@^1ÃÐ'ÃðÊ(àË1Ã0g)Ãày/Ãà.ÃÐó)Àq3ÃPÁ'Ãà,Ã`5Ã`G-ÃÀ¨/Ã`A.Ãð1ð,ÃÀ+/àõ*À­)Ã`;/ÃQ*à ·*Ã@v-Ãð 3à 3Ã0¢4À,ÃÀ%0ü-ÃpÙ0Ãé0Ãõ.à×/Ã0=0ð“,à)À³(Ãà,Ãi*Ã'1ÃÀ6Ã@ç/ÃÐç+ÃÐ44ÃÐÉ0Ãðš0ÃÐ"7Ãàa3Ãðÿ4Ã0C/ÃÝ2ÃpÍ2Ã0Ì-Ã`¦2ÃÀ¨/Ãàm1Ã@j/Ã0%à ·*Ãð5,Ã0´1Ãp†)àË1Ã`‚8Ãðš0ÃÝ2Ã0I.À-ÃPs4ü1ÃÀ6Ã0Ì-Ã`A.Ã@ÿ+ÃQ.Ã0%4Ã@j/ðà4à+"Ãà)ÃàI7ÃðŽ2ÃpP2ÃpV1Ã012ÃÀ®.Ãû-Ã'1ðþ/à o6ÃPö3Ãé0ðo2àB3Ãàg2ÃÐX.ÃÀ„5ÃpV1ÃÀ¨/ÃÀ%0Àî3ÃÐL0Ã@d0Ãàð0Ã071Ã@v-à)Ãð4ÃàØ4Ãã1Ã`#3Ãàm1Ã-ÃÎ.Ãð;+Ã`50Ã@d0ði3Ãàa3Ã0º0Ã@ù,Ã`²0ðò1ä1Ã÷8Ê+Ãpë-ÃðÄ)ÃE0àH2Ãð 3Ã0C/ÃÐX.ÃÐÛ-Ã@R3Ê+ÃÐp*ð/Ã@p.ÃÐF1ÃÐÉ0Ãpt,Ãàä2Ã3/Ã?1Ãð).ÃÐó)Ã9.ÃP8)ü-ÃÐÉ0ÃÐ(6Ã0®2Ã0Ò,ÃP/ÃÀ%0Ãàm1ÃpÙ0Ã`Ä-ÃÐL0Ã0œ5Ãàa3à {4Ãàð0ÃP‘/ÃPð4ð/ÃP—.Ã@+ðŸ*Ã9.ÃPð4ÃÀ%0Ãн2Ãpn-Àƒ0Ãð0Ã@ù,ð/Ã0=0ÃÐÉ0Ã@j/ÃÔ-Ã0¢4ÃÐ:3ði3Ã@j/ÃÀû6ðc4Ã@p.ð+Ãðÿ4Ã`G-Ã0=0Ã(ÃP&,ÃÀ%0à)Ãз3ÃPs4ö2Ãð#/Ã9.À•-Ãðš0ð“,ü1ÃP…1Ã0O-Ã-0ÃðA*Ãà*ÃÀ=,Ã*Ãp†)ð-ÃP—.Ãз3Ã?-à ™/ðu1Ã@Ï3ö.ÃW-Ã@ó-À-Ãpn-Ãà+Ãà2&À³(ðì2Ãð0à +Ãàü.Ãðš0ð‡.Ãðÿ4ð{0Ã`G-Ãpß/Ãpn-Ã`Ê,Ã`²0Ãà)Ã0a*ÃpD4Ã0®2ÃPD'àã-Ã@ç/Ãì)Ãà )ÃP/Ã`Ê,ÃÀ7-Ãð#/ÃP…1à i7Ã×3Ãpn-Ã`;/ÃðÊ(ÃÈ+Ãà.ð‡.ÃP,+Ãð¬-ÃP-à .,ð“,à 2Ã0=0ö.à ·*ÃP0Àƒ0ð½%Ã`_)Ã0I.ÃpP2Ã@v-Ãà£(ÃpV1Ãð”1àT0Ã0À/Ãpb/Ãà*ÃP1Ã071Ãà,ÃÔ)Ãà.Ã'1ÃP£,ÃQ.ÃÐí*À0ÃÀ~6Ã7À³(ÃW-Ãpñ,À›,Ãð /ÃÐÃ1à 3Ã9.ÃÎ*Ãàs0Ã@R3ÃÐ:3Ãð‚4ÃÀ`;Ã@:7ÃÐ¥6À.Ã-Ã`Y*Ãph.à„(ÃÐÃ1Ã0O-Ã`¾.ðò1Ã`²0Ã0=0Ãàð0ÃP¯*ÃÀ3Ã@ó-Ã@ç/ðò1ð™+ÃH6à 2ðÎ7Ã`v:Ã`¬1ÃðŽ2Ãðÿ4Ã`¬1Ã`;/Ã`Ä-Ãàê1Ã33Ã0Ì-ð-Ã0À/Ãðš0àf-ÃPä6Ãàê1Ã0„9Ãðp7Ã@½6à {4Ã`4ÃÀ=,ÃP©+ÃÀ´-Ã3Ã~-Ã`¬1ÃŒ5ðÚ5Ã@Û1ÃÂ,ð/àl,Ãàm1ÃP‘/ÃÀ®.à ‡2ÃÀ¨/ð«(Ãû-Ã`¦2Ãð#/Ã*ÃP¯*ÃÐá,Ã0C/Ã012ÃÀœ1ÃðŽ2Ã92à 6à þ3Ãã1Ãð#/Ãðš0Ã0O-ÃÐR/À}1Ãp86ÃàØ4àé,Ã@ç/à×/ð/ÃÀ¢0ÃPü2Ã@^1à ò5ðÚ5Ê+Ãàº9ÃðŽ2ÃÈ+Ãð /ðQ7ðQ7à¹4ÃÀ7-ÃP£,ÃÝ2ÃŒ5ÃðÄ)ÃÐ^-Ã`G-àN1Ä,Ãõ.Ã0Ì-Ãð 3ÃP&,Ã0¢4ä1ÃpÇ3Ã`¬1ÃÐÕ.Àô2Ã0´1Ãpß/àÝ.À‰/Ãð¦.ÃK/Ã3/ÃpÙ0ÃÐ@2Ã@½6Ãõ.Ã`¸/Ã@ù,ÃÐX.Ã`¬1àï+Ã0Ì-Ã`A.ð,Ãð¬-ÃP1ÃW-Ãàü.ÃÀ+/Ã’4Ã`¾.ÃÀ®.ÃPy3ÃÀ3Ã`š4Ãày/ÃPÒ9à 2Ã@L4ðì2à o6Ã0Š8ÃPÞ7ÃÀ5Ãз3ÃÀ¨/àÑ0Þ2Ã!2ÃÐ.5ð{0Ãpý*ÃàØ4ÃÎ*ÃÐd,à «,Ã@j/Ã`G-ðc4Ã@L4Ã@á0ð«(Ãpz+Ã@L4àÑ0Ã012Ã0C/ðo2Àe5Ã012Ã*à ¥-Ãð4ÃP2ÃPä6Ã`#3ÃÐÃ1Ãàê1àN1Ø7Ãз3à ‡2Ã@á0ÃPs4Ã` 3Ãàm1Ãpz+Ã@Õ2à ø4ð/àB3ðì2Ãt9à$8à 2Ãàö/Ã'5ÃP‹0Ãð4ÃÀ„5Ãн2ÃT4Ã@F5ÃÀ~6ðK8ÀÐ8Ãàg2Ã0+3ÀÜ6ÃÔ)Ãi*Àe5Ã@ç/À0à`.à /Ã0–6ÃÀf:à 1Ã012àË1Ã0®2ä1Ã?1Ã071Ã0ä)Ã`¸/ÃÐ:3à /Ø3Ã@d0À7Ãï/à “0ðo2ê4Àe5Ãð4ÃÀ3Ã`š4ð3ðþ/Ãàä2Ã`²0Ã`)2Ã@Û1ÃÐ@2àT0Ãp>5Ã33Ãð‚4Þ6Ãð4àÑ0Ãðj8ÃE0ð‡.ÃPö3Ãàa3ðà4Ãé0ði3ü1ÃÀ3à ".Ã0=0Ã0C/àB3Ã@Õ2ðø0Ã0Ì-Ã0œ5Ãз3ÃpP2ðì2Ã`50ÃP/À‰/ÀY7Ã0–6Þ2ÃpÁ4Ãн2ÿ7ÃÐ"7Àk4Ãð).ÃpÁ4ÃP[8à {4ÀG:ÃË5ðø0Ã4à þ3Ã0%4ÃÐR/ÃÀ–2Ãð /ÃÀ–2ÃÐ(6Ãðš0ÃPm5à­6Ã0®2À1ÃÐí*ÃpÁ4Ã@X2à ø4àï+Ã@í.à ¥-Ãð‚4ð3à 3Ã@í.À1à`.Ãà,Ã@p.ð“,Ãl0Ã7à ¥-ÃÐÏ/Ã0I.Ã@ó-ÃàO6Ãð2ÃÂ,Ã@ó-Ãð#/ÃàÌ6ÃP0àÑ0ÃP‹0Ãû-Ã9.Ãp,8Ã`Ž6ö2Ã0+3ÃÀ¨/Ã,Ã`Ü)Ã@á0ÃÀ¢0àr+Ã`¬1à 1ÃÈ+àH2Ã0I.Ã`Ä-àÝ.ðu1Ã0%4ÃpÍ2ÃÈ/à 3Ã0g)à /Ãõ.ÃÀ%0Ãï/Ã0[+ÃàÀ8Ã`Ž6Ã0º0Ãp»5Ãà+à ø4Ãé0Ã@Õ2Àâ5ü1ð/Àq3ÃpÁ4à~)À.Ã0ð'à 'à Ÿ.ÃP‘/Ã`A.À-Ã'1ê0Ã0O-ÃàÞ3ðu1Ã`;/ÃP -Ãpn-Ãð 3Ãàm1ÃÐÕ.ÃE0ÃÐí*ÃÐÃ1À7Ã(Ã@#&Ãæ*Ã92Ã`4ð/ðu1Ã~-ÃÀ~6Ã@í.ð+Ã0Þ*Ã0Ø+à`.Ãõ.àï+à%ÃÔ)ð/Ãð1ö.Ã9.ÃÀ®.Ãph.ÃÀI*Ãð /à ø4àï+ÃP¯*Ã33Ãз3Ã0À/ðu1Ã33Ã`4ÃÐ:3À‰/Ãð4ÃÀ–2ÃE0Ã0Æ.ÃpP2Ã`Ê,Ãð /Ãà[4Ãõ.Ã92ÃÐÛ-Ãph.Ãp÷+Ã@ÿ+Ã`¸/ÃP£,ÃÐ.5Ã@Õ2ÃPy3Ãt9ð-à¹4Ãp»5à ò5Þ2ÃÐÏ/ðæ3ÃÈ/Ã'1Ãàs0À.àl,Ãàö/ÃÐ44Ã'5Àq3Ã-0à o6ù8àã-ð{0Ãé0Àk4Ãé0à ì6Ã09Ãð4Ãàg2ði3ð¶;Ã7àÝ.ÃÀ¨/Ã0I.à06À /à¿3Ãé0ÃÀé9ÃÀ5ÃàØ4Àô2ÃN5Ãð4ÃàÞ3Àƒ0Ã0Æ.ÀÜ6à /ÃB7Ãб4Ã@d0Ãã1Ã@^1à 1Ãàü.Ã`¬1Ãñ9Ãðá9Ã@d0ÃN5ð{0ð‡.Ãì)ÃàU5àË1Ã`8Ãàð0Ã@X2Ãð¬-Ãï/ÃÂ0ðu1ðþ/à þ3Ãï/ÃÀ¢0ÃN5ÃÀ3Ãph.ÃPö3ÃàU5ÃÀõ7à<4Ãð|5Ã@v-ÃÈ/Ã`ù9ÃT4Ãðù5Ã`²0Ãpß/Ã0®2ðo2Ãû-ÃPÞ7Ã`/1Àƒ0ÃpP2ðE9Ã@X2Ãp>5ÃÐí*Ã0Ì-à 3Àq3ÃÀ3Àâ5à /ð .ÃÀ1.ÃpP2À-à {4à ò5Ã0œ5Ã0Æ.àÅ2ÃP0Ãp—;ÃÀ„5Ã@R3ÃÀx7ÃÀ„5Ã`²0ÃP1Ãð 3Ã@½6Ãðš0Ø7ÃÐ:3ä5À.Ãã1àã-Ã`4Ãã1Ã` 7Ã`Ž6Ãpµ6Þ2Ãpë-ÃP/ö2Àè4Ãð0Ãàg2ö2ðþ/Þ2Àw2à “0À}1ÃpÁ4ÃÀ–2Ã`5ÃP2ÃÎ.ð/Ã@ó-Ã4ÃÂ,Ã@á0Ãð¦.Ã@v-ðÚ5Ã0=0ÃЫ5ÃH6Ãà+<ÀÄ:ÀÐ8Ã0=0ÃÀ6Àâ5ð,àN1Ã` 3à ·*Ãp€*ÃP1Ã`6ÃÚ,Ã@Ž)Ã@v-Ãð#/Àw2Ãðp7ÃàÆ7Àâ5Ãàa3Ã071Ã’4ê0à ‡2Ã@É4ÃÐ44À.àÑ0ÃÐÏ/Ã@Û1Ãàm1Ã`6Ã`;/Ãð|5ÃP7>Ãà…-à ‡2Ã4Ãðš0ð/Ãð1ÃÐX.Ã0®2Ã05Ãàê1Ã@R3ðÚ5Ãð²,ÃP1ÃàÞ3ð¼:ÃÎ.Ãðš0àH2Ã`;/Ã@á0Ãð1à 1à “0Ã@p.àN1Ã@L4Àe5ÃP1à 3ÃÐç+ÀÊ9ÃàI7Ã0U,Ã@í.Ã9.àB3ÃÀ1.ÃÐÏ/ä1ê4ÃÐÃ1ä1àË1ÃÀ 4Ã`¬1ÃÐ.5À•-Ã`2ÃpP2ÃÐÃ1ðø0à 0Ã`š4Ã!2Ã3/ö2Ãàa3Ã`;/ðu1Ãð/-Ã@R3Ãõ.à06À_6Ãp )Ã0m(ÃÈ+Ãð¾*Ã-4ÀÖ7à ".Ãð4ðþ/ÃÎ*à 3Ã`2à F(Àq3Ãp27à Ú9ÃP2ÃP8)ÃP‘/ÃÐX.Ãà*Ãð¬-àT0ÃÐR/ê0ÃÐÏ/à «,Ãð2ÃpŒ(à ™/Ã@í.ÃÐX.Ã3ÃpÓ1à þ3Ãã1ð,Ãu(Ãà‹,àÝ.ðæ3Ãpë-Ã~-ÃÀ=,ÃÀœ1Ã`Ö*ÃÐR/ÃpŒ(Ãàö/Ãpå.ÃÀ´-ÃÐç+ê0ð?:ÃàC8Ãp\0Ãà.ð .Ã@ &À.Ãð).Ãp†)à +à ".àB3Ãð2Ãpb/Ãày/àr+Ãp\0Ã@ÿ+ð:&Ãà,Ãð¦.Àƒ0ð"*ÃÐÛ-À.ÃZ3ÃÂ,À.Ãph.Ã0%à ™/Ãf1Ã@^1Ã0´1Ãð/-Ã-ÃP.Ãr/Ã0g)ð¥)ðò1ð+Ã`2Ãph.Ãà+Ã0À/Ã*Ã0´1Ãз3ðþ/ÃÎ*Ã`Ä-Ã0I.Ãð).à ½)ÃÐd,ðu1ÃÀ®.Ãð¸+à .,ÃÎ.Ã~-à .,ÃÀ¨/ÃÐj+Ã0C/Ãp*ÃÐd,Ø3Ãð;+À,Ã`Ü)ÃÀ 4Ã`²0ÃÀÀ+Ã@Ï3ÃH6Ã@X2ÃÀ1.à 0à 1Ãà+Ãð).À-ä1Ãð¬-ÃÀÞ&ÃP£,à ·*à 1Ã071ÃPü2ä1àõ*Ãpµ6Ã?1Ãà£(Ã)Ã@R3ÃÐ(6Ã~-ü-ÃpÇ3Ãð/-ð-Ã@ç/Ãð¾*àl,Àè4Ã@ç/ÃpV1Ãì)Ã@ç/Ãpñ,Ã`M,Ãàa3Ãðÿ4Àú1ÃP0ÃP‘/à ".ÃÀ3ðo2Ãà—*ÃP‘/Ã@ç/ÃpÍ2Ãàü.Ãf1Ã@ÿ+ö2ð‡.Ãб4ÃP/ÃÀÆ*ðu1Ã92Ã0¨3Ã`¬1Ã@ *ÃpP2Ãàð0ü-à 0ð-ÃÐÉ0Ãõ.Ãð¦.Ã`¸/Ã`;/ÃÐd,Ã0I.ÃP‹0à “0Ä,àË1Ãð0À‰/Ã-Ã`/1ä1ÃZ3ðò1à<4Ã012À³(à³5ÃÀ¨/à {4à 3Ã@^1ÃÀ1ð/Ãï/ÃÈ/Ã`4ÃÀº,Ã0a*ð:&À‰/ÃÚ,ÃÐá,ÃÐL0Ã`_)àŠ'ÃÐR/Ã`50Ãà-ÃQ*Ãì)ÃàÞ3Ãàð0Ã92ÃÔ)Ãx.Ãàö/ÃPð4Ã`6à þ3Ã0=0ÃE,ÃPm5Àô2Ã0º0ä5Ã9Ã-0Ã~-ÃP‘/ÃÐd,À­)ÃÀ´-Ã92à ".Ã@j/Ãð#/ê0ÃÎ.àÅ2ÃPs4Þ6ä5À‰/à þ3ÃÀ®.Ã92Ãð4Ãð¾*ö.ÃpD4ÃàÒ5ÃÝ2ÃÐ@2ÃÐd,Ãàð0Ãà‹,À‰/Ãà‹,Ã-0ÃPü2àB3àN1ÃÐÏ/À­)ÃÀ´-ð™+ÃP¯*Ãàs0ÃÝ2Ã`¬1ÃÂ0Ã0®2àl,Ã0ö&Ã0g)Ãp(à /Ã@ç/Ãð /Ãà‹,ÃÀ['à u5Ãз3à 3ÃÐ@2Ãph.Ãà[4à}>Ãl0Ã`¸/ÃP0Ã`Ê,Ã@|,ÃÐ^-Ã`¸/Ãð /Ãàä2Ãð|5ÃP1À›,Ã0C/ÃÐÃ1ÃPµ)Ã0[+à 2ÃP‘/Ã@í.à³5Àú1Ã012Àw2ÃpÍ2Ã`¾.ðþ/ÃP—.ðŸ*Ã0º0ÃÐÃ1Ãð¬-À0Ãð4Ã`M,à×/Þ2Ã5à ".Ã0À/Ã@j/À**Ãà+Ã0C/Ã`Ä-ÃÐX.Ã`Ä-Ã-0Ãày/Ãò(àT0Ãð”1Ã@í.Ã`;/Ãl0Ã92ÃÐ¥6ðŸ*Ã0I.Ã5Ã`¸/ð¥)Ã`4Ã0I.Ãðˆ3Ã@|,À1ÃÀ–2ð/ÃÎ.Ã` 3ÃP0Ã~-ö2ÃP2Ãp\0ðø0àl,ÃÐù(àû)Ãà,À‰/ÃÐó)ðà4à {4Ãû-ÃÎ.Ã@X2Ã0Ø+ÃÐÏ/Ã`Ð+à «,Ãð5,à /ÃÀ=,Ãàs0À-Ã`M,à @)ü1ÃP1ÃÀ´-Ã071à 0ÃÀ¢0ÃZ3ÃP.àÝ.Ãн2Ã,Àî3à 1Ãð¬-Ãз3Ã`¾.ðø0ÃP£,Ã!2ÃPµ)Ãà‹,Ã@p.Ãàê1Ã0%4Ã012ÃÐX.Ã3/Ãà.Ãpß/ÃpJ3Ãð2Ã@R3Ã4ÃÐÕ.à³5Ã@ó-ÃP‘/ð/ÃÀ¨/ÃW-Ãé0ÃP0ÃÀ2ÃÂ0ÃpÙ0àË1Ãé0Ã0%4àl,Ã@ *Ã`A.Ã@Ã5ð .ÃP©+Ãu(à {4Ã`¬1Ã?-ð/ÃW-Ãàê1Ã3Ã@ó-Ã`¸/Ã@í.Ã0Ì-ÃE0Ã0s'Ã@É4à 4+ÃÀ=,ÃÐF1Ãã1Ãx.ð]5Ã`¾.ÃP‘/À**ÀH%à 0àZ/ð/Ãày/Ãð5,Ãp†)ÃÐá,ÃW-Ã0[+à<4ÃÐá,Ã`50à ò5ÃÐ@2Ãpë-ðÚ5àZ/ÃË5ÃÀº,Ö)à 3ÃàU5à<4Ã012Àî3ÃN5ÃpV1Ãðš0Ã0Ò,à¿3Ã@48Ãï/ÃP0ÃpÇ3Ãðÿ4ÃÀ1Ãàö/ÃàÌ6Ã`¦2Ã~-Ã-4ÃÈ/ÃÐÏ/Ø3ü-ÃÐ^-Ã'5Ã7Ã`)2Ã0Ì-Ãð¸+Ã0+3à 1ð3ÃðŽ2À /Ã,ÃP—.Ã@j/Àw2ä5ð+ÃП7ð/ÃT4Ã’4Ãб4ÃÐp*Ã0´1Ãpz+àf-ÃÀ3Ã@j/ÃÀ1À0Ã`A.À.ÃÐX.Ãàä2Ãð1à “0ÃÀ7-Ãï/ÃPy3Ãðù5ÃÀ5ÃP1Ã@^1ÃPy3ÃП7Ã`²0àÑ0Ãph.Ã!2ÃÐ@2Ã`Ü)Ã0U,à 1ð/àf-Ø3ÃÐÏ/ÃP.ÃÀ2Ãð /ÃK/ÃK/Ãã1Ã071ðò1ö.Ã` 3àH2Ãà+ÃP.Ãpñ,ÃÚ(ÃÀO)ÃË5ÃÐ.5àË1à (-À-à c8à 3à$8À.ÃÐÃ1Ã0´1ðæ3ÃÐX.Àq3à +Ã@j/Ãð0ÃÀœ1Ã0º0ÃE0ðæ3ÃpÙ0ÃÀŠ4à›9Ãð”1à ò5Ãð‚4Ã4Ã@Ï3Ã@Ã5à65àZ/Àq3ð‡.Ãà…-ð™+àr+Ã@ù,à ™/Ã@·7Ãph.Ã@á0ÃPö3Àú1Ã@ù,Ã@ç/Ãðš0à ™/Ã0=0ðø0Ãl0ÃPm5Ãð4Ã` 7Ã0®2ÃÐ@2ðø0à¹4Ãà-Ã`Ð+ð-ÃÀI*àï+ÃpP2ð“,Ã07Ã0®2Ãàº9Ãð|5Ãpå.Ãà+Ã@ÿ+Ã@ù,ÃP…1ÃÐç+ð«(Ãpt,Ã`è'àx*ü-Ã`#3ð/Ãà)Ãð²,Ã@+Ã~-ÃP—.à “0ÃP‘/À•-Ã3Ãé0À¡+Ã0®2Ã0´1àã-ÃP2*Ã0I.Ãpñ,Ã`Ä-Ã@R3ÃÈ/ÃP‘/à ".À.Ã@p.à ".Ã@#&Ã*Àk4Ãð”1ðì2ÃP—.Ã!2À‰/Ã?-à ½)Ãà )Ã@ÿ+Ãpß/ð“,ðŸ*ÃP£,Àw2Ãð0àõ*ÃÀC+Ãày/ÃÀ¨/ÃÐR/À›,ðo2Ã-0Ã@^1Ã`;/Ãû-à þ3Ã@ó-Ã`Y*Ã`â(Ãð /ð/Ã@d0Ã@+Ã@^1À /À-à «,ÃÐ:3Àk4Ãi*Ã0Ò,ÃÎ*àã-Àk4Ã@d0àõ*Ãð¬-ÃP0ÃÀ%0Ã`#3ÃÐF1Ãpñ,À$+Ãp÷+Ãà.à×/Ãà—*Ã`M,ÃP‹0ÃÀ~6Ãã1à„(Ãà)à ".àf-ÃÐç+Ã`G-àr+Ã0Æ.Ãð1à /ðþ/ðŸ*Ãз3ÃP[8Ã`Ä-ÃÀO)Ãà'Ãà+ÃÀº,Ã0¨3Ã*Ã?-ÃÐj+Ã@d0ÃpÙ0ÃP1à¿3Ã@|,Ã@j/Ãàg2Ãà,ÃQ*ÃÀ6Ãðˆ3Ã`2ö.ÃÀC+à ±+ÃP.ÃP -Ãi*Ã`;/ÃÐÛ-ÃÐ(6à³5ê0Ã@í.Ã],Ãð¬-Ã@ó-Ã-4ðÈ8Ãp>5ði3Ãб4Ãàê1Ã×3ÃP2ÃÐ"7ÃpÇ3ðì2à u5ðQ7Ãp,8Ãï/Ãë:ÃH6ÃpÓ1Ã@á0Ãð‚4Þ2Ãð 3ð]5Ã'5ÃÀº,Ãl0Ã@í.Ãé0ÃÐÉ0Ã012ÃpD4Þ6ÃË5Ã`¬1Ãðó6ÃÀŠ4Ã`#3Àƒ0Ãf1ÃÀ¢0Ã’4Ã071ÃÐ¥6ÃЙ8àÝ.àT0Ãðí7Ã×3Àk4ÃP…1Àô2Ã4Ã7Ã@±8Ã`6Ã0¨3Ã`‚8à {4àË1À›,Ãð/-ðæ3Ãð”1Ãã1À1Ã`¸/ä1ÃÀ3ð‡.Ã012Ãf1ÃpÇ3Ã0–6ÃÀ%0Ã-Ãpå.Þ2Ã012ÃÀ–2Ã@F5Ãï/Ã4ÃÐ^-à¹4Ã`¬1Ã`¬1Ãpß/Ã0º0àÑ0Ø7ÃÐÃ1Ã`š4Ã4Ã'1Ã@ó-ðø0Ã`š4Ã0¨3Ã3Ãò(ö.à 3ÃpJ3ÃpÓ1ÃÐ(6Ãн2ÀÜ6ðà4ÃÀã:Ãð).ÃPð4Ã0¨3ÃP[8Ã@ç/Ã@Û1ÃÐ(6àÑ0Ã`ˆ7ÃàÆ7ÃpÁ4Ã@·7ÃÀ5à*7ÃÀ3ÃàÌ6à`.ö.Ãà=9ÃÀ®.Ã012ÃÝ2Ã012Ã0+3Ã3/Ã`Ð+Ãàê1àÝ.Àe5Ãp©8ÃPm5Ãð²,Ãð”1ð]5Ã`¦2À•-àH2à æ7Ã8Ãð²,ÃÐ^-ÃàØ4Ã4Ãpµ6Ãp27Ã0¨3Ã0¨3ö2Ãp»5Ã@L4Ãl0Ãàä2Ã@Ã5Ã-0Ãp\0Ã@½6Ã`)2ÃðŽ2ÃpÁ4ÃÀõ7ÃÀ3Ãàg2àT0ÃPØ8Ãð#/Ã0C/ä1ÃP…1ö2à65ÃàÒ5Ãðp7ä1Ã`š4Ãz8ÃÀœ1Ã0=0ÃÝ2à­6à u5Ãàm1ÃÀœ1Ãû-Ãp86à ø4ÃP—.à +Ã`¬1ÃPy3ÃPy3Ã`”5à 3Ãl0Ãà[4ÃpÍ2Ã@ç/à i7à 6Àk4ÿ7ÀÖ7Ã7Ãh?Ãý7à 2Ã0C/ÀY7ÃÐ8à65Ã`S+ÃÐ:3ÃÐÃ1Ã@Û1ð{0Ãpn-Ã-0Ã`¸/ÃÐ8Ãð0ÃÀ¢0ö2ÃÐ8ÃÀ„5Ãà‹,Ãr/Ã0œ5Ãàº9Ã@:7Ã3Ãн2Ã’4ð3Ã0%4Ã@X2Ãàê1Ãð¦.Ã@·7ðW6ðþ/Ã@j/à*7ä5Ã@É4ÃP£,ÃpP2Àk4ÃÐÉ0ÃPy3Ã`6Ã0~:ÃÐ¥6ÃP2ÃЫ5Ã5Ãà‹,ðò1Ã07Ã@d0à06ÃÀ¨/à`.Ã0%4ð3Ã@Õ2ÃpÇ3Ãàä2ðþ/Ã0´1Ãàm1Àk4Ã0®2Ã@X2ÿ7ÃŒ5Ãð|5ðc4ü1àZ/àZ/à ¥-Ã@‚+ÃÀ2Ãð2Ã0´1Ã071Ã0À/Ãp>5ÃPy3ÃpÇ3Àƒ0Ã`¸/à “0ðE9ÃpJ3ð/ð{0ð/Ã@ù,ÃÐ^-Ã@^1Ã@Û1Ãð4Ãðù5ÃÀ¢0ÃpV1ÃPº=ÃÀ 4Ã@ó-ð{0Ã0À/Ã`²0Ã@@6à06à³5ðæ3Ã@^1ÃP—.Àk4ÃàÞ3ÃЫ5Ãðp7ü1ê0Ãr/ÃÀ%0Ãp:Ã0´1Ãà´:Ã` 3ð/Ãà.Ãà.à Ÿ.à 0Ã<8Ã!6Ãr/Ãàs0ÃÐX.Ã`š4Ã@á0ðà4ÃpV1Ãpå.ÃP0ÃÐ@2ÃÀõ7àÅ2à­6Ã@É4Ãp\0Ãà.ÃT4Ãp©8ðì2ÃPs4ÃÀ~6ÃPü2à o6Ã0¨3à /Ã0y&àZ/àÝ.à*7ö2Ã`¦2ÃPü2ÃPä6À›,à ‡2Àƒ0à¹4à 0àZ/Ã0¨3Ã@F5ð-Ãà+Ãðš0à F(àË1ä1Ã-4Ã0œ5ð/ÃЫ5Ãàä2ð3Ã`2Ã`2Ã@d0ÃÀ®.Ãr/ðà4Ãð¦.Àq3Ãà+ð/Ã0O-ÃÀŠ4ÃÀ–2Ãð0Ã×3ÃÝ2ÃP0Àú1ä1À‰/à¹4Þ2ð/à³5à 1à ¥-ÃpP2Ã4à /àH2ÃðŽ2ð]5ê0ÃàÞ3Ãà,ð3ðø0Ã0®2Ãpß/Àƒ0ði3à 6à<4ÃÀ1ðu1ÃðŽ2Ãð1Ã0U,Ãpn-ÃPU9ê0à /à 1àÝ.ð/ÃðŽ2ðc4Ä,Ã`Ä-ð]5à ".Ãé0Ãp©8ü-Ãàê1Ã@±8Àè4Ã@F5Ã`Ê,à 3ðæ3À0à ".à 3ÃðÄ)Ã~-Ã071ð“,ÃPa7ÃÈ/ð/à æ7à (-À /ÃÀº,Ã0O-Ã@í.à ]9Ã'5ÃàØ4ÃÐL0Ã0=0Ãð|5ÃàÞ3Ãн2Ã@½6Ã@±8Ã7ÃP.ÃP.à 3ð{0ÃT4ÃPa7Àè4Ã,Ã`Ä-ÃÚ,Ã-4ði3ÃpÍ2ÃPð4ÃÐ"7ö2Ã`ˆ7à§7Ãé0ÃÀ3ÃP…1ÃT4Ãà.Ãð1ÀM9ðì2Ã@ù,ÃpÁ4Ã@Ã5ÃpV1Ãàö/Àô2Ã012ÃЫ5à ì6ÃZ3Ã@:7à o6ÃPü2ÃÐÉ0Ãà[4Ã@F5ÃH6ðc4Ãð”1Ã@L4ÃÐ(6Ã`²0Ãàü.ÃÀ„5Ã0–6Ãð|5Ãpy@à06Ã`Ž6à•:ð()Ãpß/Ã`Ž6Ã@d0ÃpV1Ã`)2ÃPg6Ãàa3ðQ7Ã0®2àZ/À1Ã7Ãpb/À0ÃàÒ5Ã0%4Ã@|,Ãp¯7ÃÀû6Ã’8ÃЫ5Ãpb/À}1ÃP2Ã@^1Ãp£9Ã`‚8Ã`4Àî3Ã@R3à<4à ".àÑ0à æ7Ø3Ã@½6À1Ã5ÃÀ~6Ãõ.àN1ð]5à¿3ðþ/ÃÐ@2Ã<8à i7ÃT4Àw2Ãp»5Ã92Ã!2Ã×3ü1Ã`¦2Ã`5Ã’8Ã05Ã!2Ãð0ÃP‹0à65À7ðc4ÃPg6à¹4à à8Ã0¢4ðì2ÃÈ/Ã5ó9Ã012Ãðp7àT0Ã@ù,Ãr/ÃPs4ÃÐ(6Ã@L4à³5Ã`¬1ÃPê5ÃPy3ÃPä6Ãp¯7à­6ð/Ãp€*ÃP&,Ã0O-ÃpÁ4Ãp¯7Ãpë-ÃÀ%0Ãpµ6ðc4ÃÐ:Ã`¬1à¿3ÃÀ2À‰/Ã@p.Ã0–6ÃpÇ3ði3ÀÜ6ÃP2ÀM9Ã@L4Ã`²0ÃPä6ÃÀ5À7ÃpÇ3Ã0Æ.Ã-0Àk4ÃÐ:3ÃpÙ0Ã`¬1ÃÝ2Ã?1ÃÐÏ/Ã@^1Ãf1Ã0[+Ã0Ì-ÃÀ–2à þ3ÃÐÕ.Ã0´1Ãx.Ãð2Ãpý*ÃÀœ1ÃpÓ1ÃÔ-Ã`;/à .,àÑ0ði3ÃÐ(6à 6à³5Ãð0ð,Ã@ó-Ãpñ,Ã`S+Ãàü.ÃÀ2Ãз3Ãpñ,Ã!2à 6Ãð/-Ã-4Ã@d0ÃpD4ÃÀ–2ÃÐÛ-àH2Ãé0ð"*à ¥-ÃP-Ãð4ð3ÃH6Àƒ0Ã0[+Ã071Ãð/-Ãð /ÃÐX.Ã*Ã@^1Ã0´1ÃÐR/Ã0¨3ÃÔ-Ã?1Ã0m(Ã`Ö*à “0Ã33ÃàÞ3ÃÀ~6ÃðŽ2Ã×3à .,Ãà.ÃQ.àÅ2ÃK+à 3Ã012ÃÀ¨/à¹4àr+ð‡.Ã`Ê,ð+à /Ãð¸+ð“,Ã,Ã@|,ü-Ã!2Ã012Ãð /Ãpn-ðì2ÃP‹0Ãr/Ãu(Ã0Ì-à /À.Ã@á0ÃÀC+ÃÀ+/ð,Ã0m(Ãpt,ÃÐç+ÃÀ®.ÃÀ 4ð/à ±+À•-ÃÀ¢0Ãp÷+ÃÀÒ(À•-Ã@Õ2ÃÐR/Ãн2ÃÀ7-Ê+à “0Àk4ðò1Ãl0Ãø'à +ÃÐ@2À_6Ãðp7ðì2Ã@á0ÃpP2Ã`6ÃЫ5Ãày/ÃN5à o6ÃÐL0à {4Ã0l=Ãð·@à9Ãt9Ãp27ðÚ5Ãðç8à;Ãz8ðÂ9à <Ã`p;à u5à9Ã0r<Ã`j<Ã*;à 9?ÃðÃ>Ã@@Ãà´:ÀCÃ@>ðÂ9ÃÓ>ÃP%Að9;Ãðç8ÃÐø=Ãà@À5=ÃPØ8ÃàC8Ãý;Ã@=ÃÐ8ðÂ9ÀY7Ã05ÃàÆ7à 9?ÃÐæ@ÃÀB@Ãp;à•:à Â=ð¤>à Q;Ãñ9ÃÀT=Ãpü?Ã`LAÃp :Ãp?ÃÀ`;Ãp>Ã0ÅCÃÀ³BÃÐ<ÃP==Ã@“=ÃPFà GÃðL=à Q;à <Ã@>ÀA;Ã0Ý?à•:ÃÐþ<ÃÀ¿@Ãå?àƒ=ÃðF>Ã`d=Ã0ã>ÃP==ð3<Ãðá9Ã0ã>Ãð¥CÃ\=ÃÀ×<ð3<à ¶?ÃqDÃàxDàú>Ã0ÑAÃp—;à ?>àw?ÃP´>ÃÐþ<Ã\AÃø±¥ÃX`°Ã ¯Ã(ë¯ÃÀC«Ãh½§Ã€³¨Ãø«¦ÃPå¡ÃˆGžÃ•¢ÃŸÃèÆ›ÃhœÃèÆ›Ã€™ÃÐ_˜ÃÈ„™ÃÈ ˜Ã°—Ãð¹–ÃÈœ•Ã@”Ãà’–Ãð¿•ÃhÄ‘ÃÀb‘Ã8Àº’Ã((‘Ãx÷àÃh_Ã`r‘ÃheŒÃÀnð¸‘ÃØùŒÃxzø.ŒÃ ‰ÃXP‰Ã€êŠÃØš‡Ãh‡Ãè,‹Ã`‹ÃøYŠÃ JˆÃ¨1…Ã8‰Ã(ÏŠÃH²‡Ã¨¢‡ÃØ/„Ã(ç†Ã@ï„Ãh…ÃÐZ„àë‚Ãz„Èï‚øáƒÃÈ‚Ãe~øç‚ÈxÃ`ÒÃXñƒÃe~ÃøÃ ³Ã0c}ÃĂØ(€Ã°•Ãðº~ÃX†€ÃÐfÃà™}Ã@œzÃÜ{ÃðgwÃP«~ÃzÃvÃ@%yÃ`Þ|ÃÐ~{ÃÀ]zÃuÃÀ sà tÃ0¥rÀÇxÃ0xÃ@œzàyÃ@Orà luÃp¸tÃ0™tÃÀ sðÑuàÚmÿoÃ@ºuÃP”mÀ€oÃðoÃàˆkÀbtàÎoÃð£mÃP;gÃð nðnÃÐakÃÐIoÃÀŸoÃ@UqÃð&mÃÀŸoÃ0½nÃÀ™pÃ`»mà]mÃ0ÛiðkÃÐshÃ×kÃpƒhÃ0cÀ3gÃ0ÿcÃðnð~nÃ@üjÃp gÃxbÃ0veëdÃðåbà CgÃ0`à ]Ã0Žaè^Ã^\ÃPÖbÃËiÃP¾fà =hÃàAbÄ`ÃÀÿ_ÃàÖ^ðä]ÃÐcÃ\Ã¥eÃp§bÃÐ2^ÃðŒ\ÃÐ,_Ãðz_ÃÉ_ÃR^Ãð÷_ÃpN\à [ÃgÃPÜaÃÃ`Ã0`Ã`?XÃ0îQÃ+ZÃÀ\Ã`3ZÃÒWÃ0 ^Ãá[Ã0)]ÃàXð‘VÃàXÃpŠRÃ%[ÃÀ)YÃPYð‘Và XàÉ[ÃàWÃà‰VÃà Và £WÃPÅPàjVÃpË\Ã0)]ÃpTÀ™VÃÒWÃ0ÊWÃÀ¬XúWðXðüYÃ0SVÃ@-NÃà›SÃPWÃpïVÃ0îQÃ0ÜTà ÍPÃgTÃpZZÃpõUÃöQÃðKRÃyMÃÐNà¦LÃÀ)YàÛXÃ@zVà|SÃ0âSÃ`¼XÃà³OþLÃ0OÃÐýQÃp„Sð—UÃpOÃжHÃPFÃmOÃLÃð™EÃâFÃ@ìCÃàŠAÃà„BÃ0³FÃÀ¹AÃKÃPŠEÃ`JÃPrIÃðŸDÃ@æDÃð"Dà GÃDEûBÃÀÅ?ð\JÃ`«FÃpUFÃp´KÃHÃ0*HÃÀ­CÀCÃð“FÃp´KÃ…KÃмGÃ0KÑIÃ,IÃðGÃ`d=ÃÐWCÃ`·Dà_CÃð(CÃ0BDà ’EÃàrEÃ0¹EÃ0$Ið†CÃÐIà KÃPõHÃÐ'KÃàHLÃKÃp®LÃÀ›FÀAÃPïIÃYHÃ}BÃàéFÃðGà GÃÜGÃ`“JÃp?ÀšAÃHÃ`™IàSEÃ_GÀùFàÜCÃp®Là ÷IÃ0¡IÃLÃ`¥GÃ}BÃPGð’AÃÐÎDÃP–CðÓKÃÐÈEÃ_GÃPfKÃpÀIÃPõHÃÐEFà5JÃAÃÐÂFÃÀÃPDÃ0`?ÃîDÃð HÃ`"HÀ#@ÃàBàGGÃ@{AÃà¢=Ã0NBàq@ÃÐÈEÃà~CÃpgCÃP?Ãà¿MÃpØEÃ0ËBÃÀ‰IÀŽCÃ0Ý?ÃÁEÀAÀóGÃ`@CÃqDÃà~CÃ`ŸHÀXLðßIÃÀGÃGKÃpÒFÃð{JÃë>Ãð·@ÀùFàAHÃ@¶LÃPTNÃ`:DÃ@òBÃ0BDÃмGÃ@ìCà ÙNÃàËKÃÐKEÃÀ¡EÃpsAÃ>BÃpCIÃÐ'KÃ0¹EÃÙAÃÍCÃqDðëGÃ00GÃÙAà FÃÀ§DÃðFÃ@{AÃðÏ<Ãpy@ÃPrIÃ0§HÃ@'OÃpÒFÃ`X?ÃúBÃ@oCÃP%AÃ0¿DÀ @Ã0BDÃÓBÃà@Ã`MÃpÒFÃpmBÃ`¥GðtFÀEðŒBÃâFÃÐÚBÀBÃð±AÃ@™<Ã>FÃ`«Fà !CÃÐ3IàkAÃP´>Ã@“=Ã@ ?éEÃ0³FÃpü?à ˜DÃÍCÃÐKEàƒ=ûBÃÀ¡EÃÀ$ÃÐí*à %ÃàëÃ@'ÃàÁ#ÃðÄ)Ã@¬$ð.(à í!à&Ã@”(ð()à„(à~)Ã?1ÃP>(ÃÐ'ÃÐÉ0à (-Ãpn-ÃÀØ'Ã](Ã`Ü)ÃP>(ÃÀ['Ãà)ÃÀº,Ãæ*Ãp'ð+ð/àx*à F(À‰/Ãàö/à (-ÃÀÞ&À×"ÃÀÞ&à F(à„(Ã0º0Ã0´1à%à ½)î%Ãàü.ÃÀÆ*Ã0%ÃP»(ÃðÖ&ÃP©+Ã`Ð+Ã(ÀH%ð·&À**Ãà2&ÃðÄ)ÃK+ð/à L'À¹'ð¥)Ãà )ÃÚ,àõ*ð“,ÃÀa&Ã`A.À³(ÃÀÀ+ÃPÁ'À /ðŸ*Ã0g)Ãà )ÃЦ!ð“,ÃP£,À­)Ãð¾*Ã@v-à Û$ÃК#Ã0%ÃÀg%ÃÐ%ÃQ*Ãà.ÃP‘/Ãpß/À¹'Ãà&(À$+ðþ/ÃÀy"ÃpŒ(À¡+Ãu(Ãp>5ÃÀ1.Ãà‘+àx*à .,ÃP2*ÃÈ+Ã`è'Ãð¾*àl,Ã`q&à„(à Õ%ÃQ.àË1à&Ãð¾*À§*Ã*Ã(ÃÔ)À$+Ã,ÃД$à&Ã?-Ãðš0ð/ÃP»(Ã`S+Ã0Ò,Ãph.Ã`Ð+Ã0g)Ãð#/Ãpß/à ±+ÃÔ)Ã0ö&ð¥)à&Ã*Ã`6Ã@p.Ãð¾*À$+Ãà'À§*ÃP0Ãà&(Ã@v-Ã0a*Ã{'àf-ð½%ÃÀŠ4Ã@ÿ+Ã@í.Ã9.ÃÔ)Ã0m(Ãà+ÃðÄ)Ã0Ò,Ã!2ÃP—.ÃPD'À¡+ÃP»(ö.Ãð#/ÃÐj+Ã0œ5ÃÀº,â'Ãð;+ÃЂ'ü-ÃK/ÃÐá,Ãà.Ã`e(Ã`A.Ã`Ö*ðÃ$Ã3/ÃÐÉ0ÃÝ2ü-Ã,ð/ðu1ÃpÁ4ÃQ.Ã`¸/Ãð5,À**Ã`_)Ãà*ÃP£,àã-Ãph.Ã-0Ã0À/ÃP¯*ÃÐÕ.ÃPÇ&ÃÐd,Ãð /ÃÀ7-Ã@ó-Ã`/1Ã'1ÃP1à 3Ã@X2ÃÀÀ+ð-Ã@48Ã`;/Ã0Æ.Ãàö/àx*Ü(ð«(Ãf1àB3à~)Ã0Ì-Ãà-Ãð).ÃP2*Ãé0ÃÐX.Ã@í.Ãà—*Ã@”(ÃP\#àx*Ãàð0ÃPµ)Ã@(ÃP¯*Ã@ç/Ã@+ÃÐX.ÃP -à ±+ð"*à ½)ÃÀ%0ÃÐç+ÃP£,Ãð;+Ãð5,ÃÐá,Ãl0Ãð¦.Àq3Ãû-Ã`Ü)Ã@p.ÃðÊ(ð,Ãàê1ÃÀû6Ã`)2Ãï/Ãð#/Ãàö/ÃÀº,àû)Ã@v-Ã@+ÃÐj+Ã@p.Ã@ù,À­)Ãð¾*Ãàê1Ãà.Ä,Àƒ0ÃPü2ÃpP2ÃË5à 1Ã@Ï3ÃZ3à (-Ã0=0À /ÃP‹0ÃÐÃ1ÃpP2Ãàa3àZ/ÃÀÒ(à 1À•-ÃpÁ4Ãð4ÃÐ@2Ãàü.Ã9.Ã0C/Ãã1ÃP1ð“,à +Ãà…-ÃÀº,à ‡2Ãàê1Ãpë-à “0à þ3Ã@á0Ãp\0Ãð#/ÃÐç+Ã0U,Ãз3ÃàØ4ÃPs4Ã`¾.à 3Ã’8Ãðÿ4ö.ÃŒ5Ã0¢4Ãp»5ÃPU9Ãp27Ã0–6ÃÀõ7ÃÀ5Ã<8ÃN5Ãý7ÃŒ5Ãð«BÃ0œ5ÃàÞ3ð]5ÃÀû6Ã0x;ÃÀ~6ÃÐ¥6Àâ5ÃPÒ9Ãn:Ãpµ6Ã0:Ã0:Ãp»5à Ô:Ãt9Ãà´:à$8À¾;Ã`ˆ7ðÚ5Ãðj8à È<à Q;ÃÐ8ÃÀl9ÃÐ:Ãp&9à Ô:Ã`4àB3Àâ5Ã0õ;ÃÀû6Ãpå.ð3<Ã÷<à à8ÃàÒ5Àô2ÃÀ6ÃPs4Ãàs0ÃÐ:Ã0„9Ã0–6Ãp27à i7Ã`8ÃŒ5à þ3Ã@±8à$8Ã@Ã5Ãp:ÃPÀ<à§7à Ô:à i7à 6ð?:Ãp86ð°<Ã4Ã0õ;ÃpÇ3à {4Ã5Ã`¬1Ã'1Ø7Ãp—;Ãð^:ÃГ9ÃpÁ4Ã`)2ÃðÏ<Ãp:à i7Ã33Ã@:7Ã`d=Àú1ÃpP2Ãp»5ÃÐ8ÃП7à u5à ø4ÃЙ8à 2ðì2Ãàa3ê4Ãï/Ãð^:ÃT4à}>Ã`|9ÃpÁ4Þ6ðQ7Ãб4ÃPs4Ãï/ÃÐ¥6à Î;Ã3ÃÀõ7à ì6ÃPg6ÃÀ~6ÃðX;Ãp>5Ãàä2Ã0–6ÃГ9Ã@@6Ã'5Ã@(:ÃPü2Ã0´1Ãp&9Ã'5Ã`)2ÃÀ%0Ãàa3ÃN5Ã`¾.ÃÂ0à<4ÃÅ6ÃB7á<Ã0%4Ãð2ðÂ9à à8ÃPs4Ã@F5ÃW-ÃPÞ7ÃÀr8à ø4Ã06Ã],ÃÐá,àH2Ã`v:ÃT4ÃÀ%0à ¥-Ã`#3à 1à :ö.ðc4ÃPm5ÃPÒ9ÃàI7Æ6ÃÀ¢0Ã`¸/Ã`#3ÃÀ6ðò1Ãàm1ÃÐF1Ø7Ã@ó-ÀÜ6ÃÑ4Ã69Àƒ0à /Ã@Ï3Ãp»5ÃË5Ã-0ÃÀœ1Ã4ÃàØ4ðø0Ã`”5À;Ãb<ðà4Ã@L4Ã@Õ2Àƒ0Ã`)2ÃÐ^-Ãðÿ4Ã!6Ã05à ø4ÃÀŠ4àB3Ãàö/Ã@Ã5Ã0 8Ã0À/Ã@‚+ÃPs4Ã`Ð+Ãð 3Ã`)2ÃP‹0í:Ã0+3ÃÐÏ/ÃÀŠ4à þ3à­6Ãàa3Þ6ö.Ãr/Ã@X2Ã`Ž6Ã@ç/Ã@Ï3ÃÀ+/Ãpñ,Ãpñ,Ã@X2ÃÀ5àf-ðþ/à<4ði3Ãpb/À­)ÃàØ4ð/Ãp€*à Ÿ.Ãà[4ÃÀC+Ãx.ð{0Ã`¬1Ã!2à {4Ã0œ5ÃpV1Ã0O-ÃÐ@2ÃÂ,Ã@R3ÃЙ8Ã@F5ÃpP2Ãï/Ã0+3àN1Ã’4Àî3ÃPö3À1ÃÀ–2Ãð).à “0à +Ãð0Þ2Ãé0à§7Ã`Ö*Ã0g)Ã@Û1ÃÐ44à 2Ã@j/Ãð¬-ðo2ü1Ã@ˆ*Ãð2à06à 3Ãðp7à “0Ãpå.à “0Ã@^1Ã0I.ÃŒ5ÃÑ4Ãà[4ÃPg6Àú1Ãð1ÃP¯*ÃQ.ÃP/ä1à 3Ã@í.Ã@Ï3Ãl0àB3Ã`/1ðÈ8Ã@Õ2à 1Ã@½6Ãðç8Ãà[4ÃÐ@2à ™/ÃÀœ1Ã@F5Àú1Ã5Ãà=9Ã05Ã@ìCÃ3ð/Þ2Ã`50Ãð”1Ãð;+Ãðù5ÃPÀ<ÃÐ44à Ÿ.ÃÐF1Ã0´1Ã@|,Ä,à*7Ã`;/ÃÀ%0À1à ‡2ÃÀû6Ã@½6Ã4à u5Ãà[4Ã-4ÃàÌ6Ã`v:Ã@É4à æ7Ã@";Ã`¬1Ã0+3Ãðˆ3Ãð 3Àè4ðÂ9ÀY7ÃPa7ÃPº=À7à­6Ãð‚4ÃP2Ãð /Ã7ÃPÞ7ð]5ÃPa7à à8Ã0–6Ã\=ðž?Ã@L4ÃP‹0Ã0œ5ÃpÁ4Ã0œ5Ã5Ã0:ÃÀï8ðc4Ãpµ6ÃàI7ÃÀx7ÃÀã:Ãý7à³5ÃÐ(6Ø7ÃÐ(6ÃðÏ<Ã07ÃPI;ÃPÀ<ð¶;Ãðó6ÃÀã:ÃÀ3ÀÐ8Ã07à þ3Ã@>ÀA;Ã`|9Ã`ˆ7Ã<8Ã@«9ÃÅ6ÃÐ8Ãðá9ð˜@À/>à ¼>ÃPê5Ã@Õ2Ãð²,ÃÀr8ÃÀï8à06à§7Àw2à65Ãé0ðÔ6à›9à›9Ãðí7ÃpÇ3ÃN5ðc4à;Àk4à¹4Àe5Þ6ÃPy3ÃP2à ‡2ÃÀœ1Ãp»5Ã0r<Ã0~:Ãp>5Ã@·7ÃpP2ÀG:à$8Ã'1ð3ÃPä6Ã07Ãë:ÃÀõ7à>ÃÀ~6ÃPä6ê0ÃàÒ5ðÂ9ÀÊ9Ã` 7Ã0´1Ã@¥:ÃÐ@2ÃÀ3Ã@ç/Ã`¬1ÃÀ1à i7ÃPÌ:Ãp‘<ð3<Ãp,8à:Ã7ÃÐ(6Ãàa3Ã`8à E=Ãp;Ãph.ÃàÒ5ÃÐ@2ÃP2ö.ÃÐF1ÃÐÃ1ÃÐF1à þ3Ã`#3Ã-4ÃŒ5ÃàØ4Ã0œ5Ã'5Ã0„9À_6à•:Ãà%=Ãàê1Ãðù5Ãðç8Ã`ˆ7Ã0%4ÃT4à ‡2ÃÀ 4ÃÐ.5ÃÐF1Àe5Ã`4Ã` 3ÃÀõ7à ò5ÃÀ`;ÃÐ"7ÃPÞ7Àe5Ã`”5ÃPö3Ã@F5ð°<Æ6ð]5àB3à {4Ã-0Ã`š4Ã’8ÃÐ@2Ã@Õ2Ã`6ÀÖ7à à8à06ä5àÑ0Ã3Ãн2Ø3ðu1ÃP,+ÃpJ3Ãà´:àÅ2Ã`50Ã0%4ðc4Ã@Û1ÃpV1Ã@j/ÃPö3à³5Ã012ðu1Æ6ÃÐ44Ã071À}1ÃZ3Àe5ð3ÃÀl9Ã05ä5Ã`2ÃÎ.ÃÐF1àZ/Ãày/ÃpJ3àH2Àú1ÃàO6Ãày/à 1Ãб4Ã@ÿ+ä1Ø3Ãx.ðò1ÃE0ä5ð]5ÃÀ3à*7Ãð¬-À1ÃpV1à Ÿ.ÃÀ%0Ã071Ã`Ä-ê0Ã`;/À,ü1ÃàÞ3ÃÀ1.ð/ðQ7Ã0–6ÃÀõ7Ã<8Ã`Ð+ÃP2ÃZ3Ãpb/ÀY7Ãl0Ã`¬1Ã@í.À /Ãз3à ¥-Ã0Æ.Ãð#/ÃÐ:3à ø4Ã`¸/ÃÀ7-àË1ð]5Ã@Û1Ãpñ,à þ3ði3Ã0+3Ã92ð‡.ÃpÍ2ð]5ÃP2ÃPê5ÃÐÛ-Ã`50Ã`Ð+Ãðš0Ã`#3ÃÐç+Ã0º0Ãàê1Æ6ÃP/àË1Ã0Æ.ÃPö3ÃP2Ã@ó-Ã@F5Ã0=0ÃÀ=,ÃÀ®.ÃÝ2Àw2ÃZ3àH2ð/ÃpÍ2Ã3ÃÀ~6ÃÐÃ1àË1Ãà-ÃÀ¢0Ã?1Ã0®2À1àï+À0Ãû-Ã@^1Ã05Ã@^1Ãàs0Ã0õ;ÃЙ8ÃÅ6ÃPs4à65Ãàê1Ãð¬-ÃÚ,àÑ0Ã0U,à`.ÃÐÃ1Ã`Ä-Ãph.Ãæ*Ã0Ø+Ã`¬1Ã0–6Ã`4àË1ÃÐL0Ã`2Ã0–6Ã@Û1Ãð /ÃÀ¢0ð/Ãày/À›,Ãð¬-ðu1ÃГ9ü-ÃÚ,Ãà.ÃpÙ0Ã`50à ™/ÃpÓ1ÃÀ 4Àú1ði3ÃŒ5ÃÐ.5ä1Ã@‚+Ã`¦2Ã0®2Ãà—*ð-Ã@Û1à ™/Ã`50Ã7ÃÐÃ1ÃÚ(Ã0Ì-ÃàU5Ã!2ÃP.ÃP -Ã@‚+ÃW)Ã@í.ÃÀ2Þ2ÃH6Ã0®2ÃPO:àÝ.Ãðâ$Ã0º0ÃpÙ0ÃpP2ðø0Ãpt,ÃP1ÃpÓ1À-Ã0´1ÃpJ3àl,Ãð0ÃÎ*Ã`50ÃP2*Ã@ó-ÃàÞ3Ã@ù,Ã0Ø+Ã`S+ÃÀº,ÃP‘/Ã×3ÃPü2ÃP8)ÃÐd,ÃP1ÃàÌ6Ã3/Ã`)2ÃÀº,Ãð/-Ã@á0Ãl0Ãð0Ã@j/Ã`50Ã`_)Ã`¾.Ã071Ã`¸/ÃÐ^-àN1À.ÃÔ-ÃÀ2Ãë:Ã@Û1ÃÐd,ÃÀ+/ê0ÃÐv)ðò1Ã×3ðþ/À‰/Ã`A.à 1ði3Ã07ÃàØ4ðu1à (-Ãð¦.Ãð¬-Ãð²,Ãàö/ÃÀœ1Ãpb/À}1ð/Àô2ÃpV1Ã0[+Ãà.Ã0º0ÃP/Ãàð0Ãpz+Ã`M,Ãp€*Ã@+Ã@É4Ã`S+ÃÝ2ÃÀœ1Ãàð0à 1Ãð /Ã`¬1Ã`¦2àN1Ãt9à 0ÃQ.ðÚ5ÃÐo?Ã×3Ã0=0ÃÀ®.Ã` 7Ã@ÿ+Ãpt,Ã0º0Ø7ó9Ãн2Ã@‚+Ãpñ,ÃpD4à {4à ø4Ã'1àõ*Ã33Ãpµ6ð‡.Ê+Ãàa3à u5ÃÀ3Ãpß/ö2ÃP2à`.Ã@É4ÃÐÃ1Ã'5à «,Ãp\0ÃÐF1à ‡2Ãð 3Ã9.ðì2Ãp86Þ2ü-ÃP/àf-à 'ÃPg6Ãð¬-Ã*Ãpz+ðì2ÃÑ4ÃZ3ÃÐ44À1Ã`2Ãàm1ÃP2Ãpz+à 0ÃQ*Ã@Õ2à ¥-ÃàÞ3Ã`S+Ã0[+ü-ðo2à æ7Ã` 3Àw2à “0ð‡.ÃÐp*ÃðG)àÝ.ðæ3ÃÝ2ÃÀ 4Ãpn-ÃPg6Ãà[4Ã'1ÃP.ðø0ÃÐ"7Ã0º0Ã@‚+Ã33Ãpn-ÃW)ð/Àú1Ãн2ÃT4Ãpb/ÃÀ–2ðu1À‰/ÃP[8ÃÐL0à06Àƒ0Ã`²0ð"*ð()Ã0%ö.Ãï/ÃP0ÃÐÏ/ÃP…1à ±+ÃP2ðø0ÃpÍ2à¿3Ã@í.Ä,ü1à +àÝ.ÃÐ"7Ã`5ÃÐ^-Ãû-ÃÈ+ÃðY&ÃÀû6Ãð#/à .,à×/Ã0+3à 2À•-À0)Ãð).ÃàÞ3Ã0¢4à65ð3ÀY7À0Ãàê1Ãpý*Ã@á0Ã`50Ãà.Ãpë-Ã@X2Ã@É4Ã@á0À /Ãc+Ãð”1Ã0U,Ã`2À_6àx*à /à`.ðŸ*Ã@|,Ã@í.Ãà )ÃÀÀ+Ã'1ÃÀœ1ð{0Àô2à¹4à (-Ãp÷+Ã`¾.ü-Ãà.Ã,Ã0=0ð-Ãð).Ãð‚4Ã` 3Ã@|,ÃÐv)à ‡2Ã@ù,ÃÀ®.Ãæ*Ã`)2ÃÀ1.àr+Ãàg2àB3ÃPÞ7Ã0À/ÃÚ,Ã@‚+Ã@í.Ã0Æ.Ã0Ò,ÃpP2ÃP/ö.Ãpý*Ãð).À‰/ÃPµ)ÃP‘/Ãû-ÃP—.àã-Ãpñ,ÃP‘/àx*à Ÿ.àÝ.ÃP©+Ã@Û1Ãà…-Ãpå.Ã`#3Ãð0ÃÈ/ðæ3ù8ð/ÃÀ–2Ã0O-Ã~-Ã@+Ã-Ãà+à «,ÃK+Ã0œ5ÃÂ,Ãpý*ÃÀ´-àÑ0Ã!2àÝ.àB3Ã?-ÃÑ4Ã0´1Ãð /Ã0O-Ãð²,Ã×3à Ÿ.ð/ÃÐÏ/ÃÐX.Ãph.Ãì)Ã@p.Ãà.ÃQ.Ã0a*ðo2Ã@Õ2ÃЙ8ÃP.àN1à 3Ãð5,Ã`Ö*ðu1Ãà[4Ã*àH2ð3ö2ÃPê5Ã0º0ÃÐá,Ã`A.Ä,Ãàü.ÃÐL0à 3Àè4ÃÀÀ+À.Ã3/Ãû-à +ðu1Ã@í.ÃÀ¨/ðì2Ã`4ÃP©+Ãã1Ãð¸+Ã-0Ã-4ÃpÁ4Ã0Æ.Ãã1À1Ãðÿ4Ã0[+Ãp÷+Ãì)Ã0O-ÃÀÆ*À1à`.ö2À.Ã0U,Ã`Ê,ÃðM(àû)Ã?-ÃPü2ÃpÇ3Ãð2Ã0Ø+Ãpë-Ã'1ÃP2ÃÐÃ1ð()ÃÀ–2ÃpP2ÃÐF1Ã'1ÃB7à 6Ãû-ðc4à 3Ãð¬-Ãн2ÀÖ7Ãàä2à 1Ãàð0Ã`”5Ã-4ð/Ã-0à ]9Ãë:Ãàa3ÃPð4ðW6ÃÀ6ÃpD4Ãl0Ã06à 3ð/à 2ÃÀ%0à 3ÃN5ÃÀ3ÃN5ö2Þ2ÃÀé9Ã@R3Ã`4Ã`50Ã`v:À @ðÚ5ÃðÏ<Ã8À**ÃPs4à 3ÃË5Ã07ÃŒ9Ãp‹=à³5à c8ÃàÆ7ä1ÃГ9Ã0U,ÀÖ7ÃN5ù8Ãp£9ÃZ3Àè4Ã@48ðu1Ãðp7ÀÖ7Ã07ðW6À;Ãp,8ÃàÆ7ÃÐ.5à c8Ã0:Ã`ó:Ãðˆ3Ãz8à Î;ÃPm5Ã09Ã0û:Ãðó6ð?:à‰<Ã`#3Ã7Ã0:Ãñ9ÃPU9ÃPm5Ãà=9ÃÀl9Ã`Ž6ðÚ5à à8à 6Ãðp7Ã`6Ãðˆ3Ãз3Ã*;ÃË5ÃPÞ7à9Ã05Àe5ðÈ8à 6Ã@½6ÃÀÅ?ðÂ9ÃÐR/ÿ7Ã0õ;Ã*;Ãp86ÃÀ~6Ã0 8ÃðŽ2Ãpµ6ÃPÞ7Ãðd9Àî3ÃЙ8Ã@.9à¡8ÃÐ<ÃP—.ÃÀ 4Ãý;ÀÐ8Ã07Ã012À0Ã8ÀS8ÃÀû6À1à 2Ã÷8Ã!6ÃÐ"7À_6Ã92Ã@·7ù8à 1à þ3Ãð|5Ã@«9à$8ÃÐ9ÃðX;Ã*;ÃÀ3à i7ù8à³5ðò1ÃÐ"7ÃÀ6Ã@Ï3ÃðŽ2Ãz8ðÈ8ÃÀr8ðÂ9ÃЙ8à 6ÃP—.ÃpÇ3ÃÀû6ðÔ6à¡8Ãðj8ÃÀ5ÃàI7à¡8ÃP2Ã07Ø3Ã?1Ã9ÃP2Ãðj8ðK8à “0Ãz8ÃÀõ7Ã@d0Ã@·7Ãðÿ4ÃðÛ:ð]5à$8Ã0–6Þ2Ã'1Ã0œ5Ãð4À¡+ÃPO:Ãà7:Ãp»5Ã`š4Ãàä2Ãð|5àÅ2à ‡2Ã7À /Ãð4ð?:ðÚ5ÃÐ"7ÃpÁ4Ã`)2à “0ÃpD4Ãp>5ðò1ðæ3ÃÀ„5à06Ã×3Ãð”1Ãpn-ÃP2Ãðÿ4ÃÀ 4ðÎ7ðì2à<4Ã`#3à*7ÃPa7à “0ÃÅ6ðu1Ã'1Ã`¦2Ã@·7À}1à­6Ã@Ã5Àè4Ãн2Ã-4ÃÐÃ1Ã’4ðÔ6Ãðˆ3àT0ðò1Ã@p.Ã0%4Ã0¢4Ãx.ð/ÃÐ"7ÃN5Ã@R3Ãðš0ÃÀr8ðæ3Ã071Ãðv6Ãl0ÃÀ¢0ÃÐF1ÃÀŠ4ÃP2Ãpñ,Ãp&9Ã@@6ÃÀï8Ãp86Ã!2ÀÖ7Ãð/-Ãàü.ÿ7Ã@L4à à8ÃN5Ãðó6ðÎ7Ã3/Ãðp7ÀÖ7À‰/Ã`²0ðÚ5à {4à ‡2à .,Ãp\0Ã0Ò,Ãf1àH2ÃPü2Ã0Þ*ÃÐÛ-à 6ðW6Ãp?à i7Ã0+3Ãð2Ã0Ò,à ‡2Ã@L4Ãà[4Ã`¾.Ã@É4Ã`ˆ7Ã3Ã0´1ÃàÌ6ÃÀ1àN1àT0Ã~-ÃÀ%0à×/à 2À-ÃÀ%0Ãpñ,Ã0¨3à ø4à³5Ãp>5Ãàm1Ã0U,Àî3Ã`Ž6Ãðš0ÃÀŠ4Ã@X2Ãð0ä1Ã@X2ðu1ÃN5Ã`¸/à “0àÑ0ÃÐ"7Ãp»5ÃË5à 1ÃÀx7Ã`š4ðu1à 1ÃPü2Ãн2à¿3ÃÐÕ.ÃÀû6ÃP/ÃP£,Ã`50à {4Ãб4ÃPü2Ã@ó-Ã@ˆ*ÃÐ:3Ãàê1ä1Àƒ0Ã`2Ãï/ÃГ9ù8ÃàÀ8Ã0+3àÑ0Ã0+3ÃÅ6ðà4Ãàg2ÃÐ.5Ã?1ÃÀŠ4Ã@ó-ÃpÙ0Ãð#/Àw2Ã`Ä-Ã0Æ.àé,Ã`5Ãà‹,Àâ5ÃÀ6ð™+ÃÀ1.à¹4Ã`5Ã0œ5Ã`ÿ8ÃpÇ3ÃЙ8Ã0œ5Ãàs0Ã`50Ãàð0ÃÅ6ðK8Ã'5ðK8Ã0¢4à ‡2Ø3ÃÝ2à ò5Ãl0ÀA;À.Ãàü.À1Ø3Ãб4àl,Ã0%4Ã@(:Ã@L4Ãp27àT0Ã`50à¹4Ãp27ðQ7Ã07ÃT4à¹4Ã@j/ÃPö3ÃpÙ0Àk4ÃpÇ3ÃÐR/Ãб4à ø4à 1ÃP0Ã-Ã'1ÃpP2Ã0¢4Ãð 3Ã33Ãà.ÃÐá,ÀÜ6Ã×3ÃÔ)ÃÀ¨/ð?:Ã0 8ÃP2à 3Ãàê1à06Ã0+3ÃŒ5Ãðj8À0Ã3/à /àË1Ö)ÃÐÕ.Ã@Õ2Ã`á=Ã92Ã@Û1Ãð¦.Ãf1Ã@Ï3ÃÐF1Ã@Ï3Ã0+3Ã`Ä-ÃÐÕ.ÃP2Ãp©8Àe5à 1ÃÀ2àN1Ã@X2Ã@Û1Ãàa3ÃpÓ1Þ2à 3ê0Ã`Ä-Ã0¢4Ã@F5ÃÐÃ1Ãl0ÀM9Ø3ÃÀ1ÃÀ¨/Ä,Ãðš0Ã@v-Ãðÿ4ð¼:Ãн2à 3ð™+ð .Ãàg2ÃÐ^-Àú1Ã` 3ä1Ãé0ÃPs4Ã06Ãз3ÃP0ðc4Ã`¬1àB3Ã`¬1Ã071Ã-0ÃÀœ1à ø4Ã`|9ÃÀœ1ði3Ã7ÃÀõ7ÀÖ7ÃÐ44ÃÐ44Ãph.Ã5ðÈ8Ã`š4ÃÀ®.ÃÐ@2à {4Ãð 3Ã@R3àÅ2Ãp\0ö.Ã`Ž6ðo2à¹4à Ÿ.Ã0¨3Àw2ð]5ðo2Ã`5ÃZ3Ãà1;Ãðˆ3ÃPÞ7Ã` 3Ã@>Ãà AÃàØ4ÃÅ6Ãpß/ÃàI7ÃP2Ã06ÃàÒ5à¿3ð]5Ã@.9ð¼:Ãý7Ã`/1Ã@Ï3Ãà®;ðc4ðo2Ãp©8ðW6Ãðç8Ãõ.Ãð1à¹4Ã`ç<ÃÀã:Àƒ0à W:ðc4à K<Ãp :à 2Ã-4Ã>à;à 1Ã<8à ò5Àî3ðÚ5ÃÀ~6à¿3àH2Ã3Ã0Š8à;Ãp&9Ã`”5Ã`j<ð°<ÃÀã:Ã0º0ði3Ãðù5à¹4ðE9ÃЇ;Ã@F5Ãð|5à¡8Ã8ðK8ÃÑ4Ãðj8à ]9ðW6à ì6ÃÐ:À_6Ã@>Ã@·7ðÂ9Ã0¢4ð3à ò5ÀÖ7ÃЫ5Ã0+3À_6à:à;Ãà®;ÃpÁ4Ã@Ï3ÃPy3ÃðÏ<ÃÀ6Ã8à ]9Ã`5à æ7Ãà%=Ãàº9Ã÷<ÃÐ"7ÃPÒ9Ãp27Ãàð0ðì2à :Ã07Ã`8ÃPs4ä1ðÚ5à Ô:Ã`ÿ8Ã0:Ã0œ5ÃPê5ÃÀŠ4ü1ÀÜ6ÃàO6ÃpÁ4Ã0º0ðu1Ãàs0Ãã1Ãз3ÃÀ 4ÃPO:ÃàO6ÀA;ÃpÇ3ÃPÒ9ÃðŽ2ÃÀ%0ÃÀ+/Ãp\0Ãð/-Ãpë-ÃPI;Ã`¬1ÃP/Ã-4Ã07Ã`Õ?Ã0x;ðÚ5à¡8ÃÐ"7ÃPð4ÀÜ6ð3<Ã`ˆ7ÃÀï8ÃPä6ÃPÞ7À7Ã@L4ÃðŽ2ÃÑ4ÃÐ¥6Ã`6ÃÐ8ÀÖ7à :ÃPê5ÃÐ:Ãàa3Ã0:Ã`ù9ÃÀã:à¿3ÿ7ÃЫ5ÃT4Ã@±8ÃPä6Ã`4Ã@48Ãðÿ4Ãp27Ãðù5à c8Ãð‚4Ãз3Àè4à 6à W:ÃàI7Ãp27ÃàÀ8ÃÐ<àƒ=à þ3Ãàö/Ãf1Àî3Ã`8ÃП7Ãp86ÃЫ5Ã0 8ÃË5Ãð 3ÃP2Ã@Õ2Ø3Ãð^:ÃÀû6Ã@½6Ãày/à§7ÃÀl9Àe5Ãð0Ã`;/à ø4ÃÐ<ÃàÌ6ÃŒ5ðÂ9Ãðù5ÃP1ðQ7ÃPÌ:Ã`2ÃàU5ð‡.à­6Ã`j<ÃÐ¥6à 6ÃpD4Ã'5ÃàO6Ã`5Àî3ÃÐ(6Ãp¯7ÀY7à65Ãp :ÃàO6Ã`/1í:ÃÀõ7Ã÷8Ãðç8Ã@ç/ÃpÇ3Ãàa3ÃÐ44Ã@á0Ã~-Ã0Ø+Ãð|5ÃÐ ;Ã@p.Ãðÿ4À1ð/ÃP1ÃŒ9Ãé0ð-Ã09ðÔ6ÀÐ8Ã` 7ðÔ6Àî3Ã@Ã5ÃÀ~6ÃÀÀS8à æ7Ãà7:Ãà1;Àq3ÃpÁ4Ã÷8ÃÀŠ4Ãã1Ã0+3Ã07Ãp£9ÃPä6Ãð‚4Ã0–6Ã0+3Ã@½6ð3Ã06Ã0º0ÃT4Ã0û:Æ6ðK8à¹4à­6Ã`4Àw2ðÚ5Ãàg2à×/Ã7àH2Ãp86Ã@á0Ãé0Ã0®2ÃÂ0à65Ã’4ÃÐ9Ã’8Ãðp7ÃÅ6ÃÐR/ÃE0ÃðŽ2Ã@@6ÃÀõ7Ã?-Ãз3à¿3Ãp :ÃÐ44Ãðó6ÃÀŠ4ü1à06ÃÑ4ÃP…1Ã@É4Ã7ÃPÀ<ÃPg6ÃàC8Ã3Ãà.ÃÀ6ÃÀ6ÃÀ2Àw2ÃpP2Ã@ó-ÃP&,ÃP2Ãð /ÃÎ*à•:Ã`4ÃÀ1Ãõ.à 3ð/Ãé0ÃpP2ÃÐÕ.ÃPm5àl,Ã92Ã07ð/ÃÀ–2Ã07ü1Ã071ÃÀ–2ÃPy3ê0à ø4ðì2Ã`2à ø4ÃP…1ÃÐ44ÃÐ44ÃÀ7-à×/Ãpë-Ãб4à³5ÃpP2à u5ÃZ3Àè4Ãp:à*7à 3Ãðj8à¹4Ãp>5à 6ä1ÃÐ@2Ã` 3Ã@Õ2ÃÀx7à*7Ãl0ÃÀä%Ãð0à ™/Ãð²,Ãà[4Ãà¨<à E=Ã?1Ã`2Ãðó6ÃB7Ã`2Ã0º0Àe5Àƒ0Ã@d0Ãð”1à<4ÃpP2À•-Ãp27ÃÀ–2ÃP1ÃPs4ÀÜ6à65ÃPð4Ãð‚4ÃÀ%0ÃPy3ÃN5ÃP2Ã0–6Ã`)2ÃP£,Ãpë-à 3Ãày/Ã0´1Ã],ÃÀ1.ÃÐó)Ãð0Ã@ó-Ãr/à (-ÃÀ´-ÃÐÉ0Ãph.Ã071ÃàÞ3ÃÚ,ÃÐd,Ã3Ã`š4ðà4Ã`¬1Ãpb/Ãã1ÃP2Ã0+3Ã@Ã5Ãð4à<4Ãà[4Ã`Ä-ÃpÍ2ÃÀ2Ã@p.ÃP.à 0Ã0¢4ÃPy3à “0Ãàa3ÃÀ+/à 1Ã`Ê,Ãpb/ê4Ãàg2Ãp\0Ãpñ,à «,ð/Ãàê1Ãf1à /Ã@j/Ãàü.ÃÀº,Ã0´1Ã@+Ã0¢4ð™+ÃÎ.Ãàü.Ãð).Ã0O-à`.ðþ/ÃÀû6Ã@Õ2Ã06Àƒ0Ã@L4ÃpP2àZ/ÃÐj+Ãð0ÃÀï8Ãé0ÃP/Ãp\0Ãð¸+Ã?1Ã-0à 1ÃpJ3ÃP/À}1ÃÚ,ü1à06àË1ÃàÞ3à×/à 1Ã@ *À‰/ÃÐó)ÃÀ2Ã0Æ.ÃE,Ãpt,à×/àÑ0ð/Ã`Ä-À1Ãpå.ÃP.Ã`²0Ãpb/àx*ÃP-Ãà—*Ãc+à 0Ãr/Ã`/1ðŸ*Àî3Ãph.àé,Ã],Ãàä2Àú1Ãàü.Ã@Ï3àf-àû)ÃP8)ÃЫ5ö.Ãpë-Ãpñ,Ãà&(ÃÐj+ÃÂ,Ã%'Ãp\0Ãà-Ã0¢4Ãp¯7Ãз3Ãð).à¿3ÃÀ1Ã@±8Ã!6Ã`;/Ãàs0Ã`¾.Ãà'Ãph.ÃP…1Ãl0ÃE0Ãà-ÃÀ´-ÃP,+Ãý7ö2Ã'1Ã`¸/Ã~-à ±+ÃP—.Ã!2ÃP2Ãx.àÑ0ÃÎ*Ãà-Ãà,Ãà,Ãpñ,ÃÀ3ü-ð™+Ãpå.ÃÀ¢0Ãû-ÃÀ 4ÃÀÌ)Ãà&(à×/ÃP/ÃZ3Ã0¨3À•-Ã0[+à ".à :*Ãpn-ÃQ.ð™+ð±'ÃÐj+àã-Ãà+Ã5ÃpP2ðu1Ãpñ,Ã@ç/ÃàU5à<4ð/ðo2Ã0º0ÃÐ44ÃÀ2Ã@Õ2À.Ã9.Ãð²,Ã4àr+ÃÀº,Þ2àÑ0ÃÎ.Ãà*ÃpÁ4ÃÝ2Ã@X2ÃÐ¥6ÃÀ2ÃPð4ÃàÞ3ÃpÍ2Ãi*àf-Àq3ÃË5à9ÃQ.À¡+ÃðÐ'ð .ÃÐR/Ãðá9ÃpD4ð"*ÃÐX.àH2Ã](ð/à 3Ã!2à “0Ãð”1ÃÎ*À0)ÃÂ0Ãf1àË1ä1Àô2ÃN5ÃP1ÃÀœ1àN1ðc4Ã33Ãð0ÃÐÃ1Ãpb/ÃÚ,ÃpÓ1ðo2ÃÀœ1Ã0[+Ãàs0à ™/Ã0´1Ã@d0à06ÃЫ5à ".Ã@‚+ü1ÃÝ2Ã-4Ãàü.Ã` 7Ãð5,Ã`G-ÃÀœ1Ã@p.Ãà…-ÃPð4Ãн2ö2Ãàð0Ã0Æ.Ã@ç/Ãàg2Ã×3ÃÐ¥6ÀM9ÃàC8Ã92Ãf1Àè4ðW6ÃpÇ3À,ÃP…1à “0À¡+Ã071Ã@Ã5Ã~-Ã071Ã!2Àe5à=ðK8Ã`”5Ãû-Ã×3ÃÀ3ÃB7ð]5ðu1Ã×3àB3ÃpD4À0ÃpÇ3Ã`¬1ð+ÃÀÞ&à ¥-Ã-0Ã-0Ã@ˆ*à u5Ã`5ÃPm5ÃP -à 4+Ã`50Ã0é=ÃàU5Ø7à 3à «,à «,à Ÿ.Ãàê1Ãàä2à 0Ã0À/ÃPa7ÃàU5Ãðÿ4à•:Ãàð0à 2Ãàa3Ãàm1Ã@ó-ÃÀ¢0Ã'1ÃP‹0Ã`¾.Ã@ç/ÃPy3àT0Ã0U,Àô2Àƒ0ÀÜ6Ãpb/Ãð¬-ð{0ÃP2ð]5ÃP1Ã`š4Ãðj8Ãp<Ã`ù9ÃÀé9Ã@<Ãp»5à u5Ãp£9ÃÀr8ÃË5Ã0õ;Ãñ=Ã9ð°<Ã@F5Ã7ó9Ãðí7Ã`¬1Ã`ó:Ãðó6ÃÐ:Ã@Û1ðì2Ã0ï<Ã0x;ð°<Ãà?Ãp;Ã09Ãå;Ãp©8à 3@Ãà–?à•:ÃÀ×<ÃÀT=ÀM9Àq3àô?ÃÐu>Õ>à 3@ÃÐ:ÃÐæ@ÃàO6ÃÐ.5ÀÖ7Ã09Ã!6Ã0HCÃ`LAÃÐ<Ã`ç<Ã@@Ã7Ã0r<Ãå;Ã@‡?Ãðd9Ãðí7Ãpµ6ÃÀï8ÃðÃ>àƒ=À¬>Ãà@Ãà+<à•:Ãð|5Ã7ÃH6Ã9Ã8Ã0~:Ã;Ãë:ÃðÉ=à­6à ]9Ã@¥:ðÂ9Ã0`?ÃpmBÃ`ˆ7ÃÀû6ðÎ7ÃÐ:ð9;ù8Ãàº9Ã@48à æ7Ã`j<àƒ=à ¼>Ãb<Àî3Õ>Ã69ÃàÌ6à•:ÀšAÃ0:ÃàÌ6Ã0:Ãh;ð'>ä5ÃÀl9ÃЫ5ðÎ7ÃPÀ<Ã`8Ãp—;Ã0õ;ÃàC8à¹4Ãðv6ÃðÉ=Ãp=à•:Ã@«9Ãà´:Ã09Ã@±8ÀY7À;<Ãp:ð!?ÃPm5Ã@F5Ãt9Ãðù5À_6Ã`ˆ7à9ð9;ÃPU9ÃPð4Ãà@ð-=Ø7Ã69à³5ÀÖ7à¡8Ãð^:Ãz<Ãt9Ã=ÃÀ–2Ã`p;à È<Ã@“=ð-=Ãp‘<Ãh;Ã0~:ðW6à ì6à$8ÃPU9Ãå?Ã`v:ÃÀl9ÃPU9Ã07Ãp :ÃP[8Ã@™<à­6ÃàÒ5ÃPä6Ã0®2Ã`ù9Ãß<Ãß<Ã`d=Ãp£9ÃPI;Ã07Ã05à›9Ãðj8ÃÀx7à -Að@ÃPC<Ã`ÿ8Ãðç8Ãðÿ4Ã0º0ÃÀé9ÃП7À/>Ã0„9Ãp;ÃP1?ÃðÃ>ÃàÀ8ÃŒ5ÃÀã:Ãt=Ã`j<Ã\=ÀšAÃý7Ãp=ÃàO6Ã0Š8à;Ã*;Ãà¢=Ã`ˆ7À7ÃPØ8À¸<ÃP7>Ã0~:ÃðÛ:ð¶;Ãð^:Ãà7:Ãp:ðÔ6Ã@";ÀG:Ãà?Ã`ÉAÃë:ÃÓBÃð:@Æ6ÃPÒ9Ãàº9Ãðÿ4Ã`^>Ãp=ÃðL=ÀS8ð!?Ã`ç<ÃÀ~6à i7Ã` 7Ã@>à§7ÃÀf:Ãñ9ÀM9ÃÀ×<Ãpµ6í:à*7ä1Ã$<ÃðÛ:ÃÀf:Ã0û:À;Ã`p;ÃPÆ;ÃÀ 4à 0ÃÀ6ÃàC8ÃàC8ç;ÃÐ9ÃðÛ:Ãp©8À¸<Ã@=ÃP[8Ã@@6Ãàg2Ã`ÉAÃp:ðÎ7Ã'5Ãðp7Ãðd9Ãp‹=Ã0f>Ã`^>ÃðX;ÃÐþ<Ã0:Ã0x;Ãñ=Ã0ï<ð@ÃÀB@Ãß<ÃÀï8Ã0œ5Ã5ðÈ8à$8à9Ã09ÃpÁ4Ãð¦.ÃÀŠ4Þ6ÀÖ7Ø7à 3ÃpÇ3Ã`Ž6à³5ÃðL=Ø7ðÚ5ó9ÃðÛ:ÃP…1Àk4ÃðÕ;ÃPä6ÃÀl9à06Ãñ9Ã69Ã`ù9ÃV>ÃN5Ãà=9Ãðí7Ã07Ã*;ð°<Ã`d=ðE9à$8Ã`í;Ã4ÃpÇ3Ãàê1ÃPÌ:Ã0„9ÃPI;ÃÀr8àq@Ã0¢4ð]5ÃH6Ã0~:ÃÐ8Ãàg2Ãý7ðæ3ðc4ÃÀï8Ãn>ÃÐ:3Ãàg2ÃÐ{=ÃðR<Æ:ÃÀ×<à³5ÃÀ 4ÃZ3Ã@d0Ãàa3Ãå;Ãðó6Ã07Ã0:ÃŒ9àË1Ã<8Ã0r<ÀM9Ã`ÿ8Ã0„9à ø4Ãð^:Ã3àN1Ã5Àk4à9Ã0+3à•:Ã@·7ÀÊ9Ã`#3ö2Ãàä2Ã@Ÿ;à•:à 6Ãð1Ãë:ÃÐ:3ÃPÒ9à­6Ã0%4ð]5ÃàÒ5ÃÀ6à65ÃÐ:à:Ãp—;ÀÐ8ÃÀ„5Ãp»5ÃàÞ3Ã@.9Ãðç8Ãñ9ÃÐ(6ÃP2Ã05ÃÐ@2Ã@á0ÃÀ3ê4à65ÃàO6ÃàU5Ãp86Ãð‚4ÀÐ8ÃÐ:3ðò1Ãð /à<4Ãðd9ÃàI7Ã!6àZ/ÀY7Ãpµ6ÃàU5Ã!6Ã`¦2Ø3Ã06ÃÀ 4àZ/Ãàö/Ã0º0ÃàI7Ãpå.ü1ÃÀõ7Ãp86ÀÄ:ÃÀ¢0ÃpP2Ã@Ã5Ãà[4Ã5Æ6Ãб4à /à06Ø7Ãðí7Ã’8ÃÑ4ÃPü2À /à :Ã3ðW6ä1ð{0ÃN5Ã0=0À}1à06Ãpý*ÃPÒ9ÿ7Ã'1ÃW-ÃÐ(6ð/ä1ÃPÆ;ä1à 3Ã`¦2Ã@p.ÃÀ2ÃП7à¹4àx*Ãl0à§7à$8ÃT4ó9Ãàm1ÃPð4ÃÀ3ðà4ÃÐ"7à 2ðþ/Ãp27Ã`²0ÃPs4Ã` 7ÃÀœ1ÃŒ5Ãpå.ÃÐ.5ä5Ã0„9ÃÀ5Ã3/Ã`4Ãð /Ã33Ã7ÃpP2ðæ3Ãз3ÃpÇ3ê0ÃP2ÃÀï8Ã0¨3Ãp>5à 3à³5ðu1àË1Þ2Àô2ÃЙ8Ã`#3Àî3à$8Ã0%4Àk4ÃZ3à¿3Ã÷8Ãàä2Ã`”5ÃÀŠ4ÃП7ÃPð4ðu1Ãp&9ÃPa7Ãðí7ü1àË1ÃÀ¢0ÃÐu>Ã0®2ÃË5à06ÃÝ2ð]5ÃP[8à ]9à o6Ã07À¡+ÃP.à ø4Ã@(:Ãt9Ã'1Ø3ÃÐ44Ã@@6Ãðù5ÃÀ„5Ã@±8í:àÑ0Ãð”1ÃÀ6Ã`50Ã`¬1à¹4Ã!2ÃPü2Ãp¯7Ã@á0ÃÈ/Ã?1À‰/ÃPê5Ã'1Ã@Ã5ÃÀ6Ø7ÃPü2Ã`¦2Æ6Ãб4ðW6Ã0®2Ã`¬1Ãp86Ãp»5ÃÀ+/à:ÃàÒ5ði3ÃPØ8ÃB7Ãðˆ3Ã06ÃP…1à à8ÃÐ8àË1ÃP…1ÃÀx7Ãðj8Ã`‚8à u5ó9Ã-4Ã0œ5Ã`4ÃP0ÃÐ^-Àq3ÃÐ:3Ã0®2Ã-0Ã0œ5Ã3ðà4Ãз3Ã0œ5ö2Ã05ð-à 2àË1ÃÀ5ÃÐ^-Ã-0Ã@á0à þ3ÃŒ5Ãt9ÃpD4Ã0+3à¹4à i7Ã0®2À_6Àw2Ãðj8Ã06Ãàa3ÃPð4ÃpÁ4à æ7Ã`#3Ãðó6Ãз3à`.Ã?1Ã33Ã`Ž6Ãã1ÃP‘/ð/ðæ3ðc4Ã`2Ã`4Àe5Ã`Ž6Ã$<à Ú9ðÔ6à<4ÃP&,ÃÐR/àã-Ãð#/à¿3ÃŒ5Ã0œ5Ãðí7àT0Ãà+ÃÀ¨/Ã5Ã012Ãý7Ã@@6ÃP[8à 3ÿ7ÃЫ5à*7Ã0¨3Àe5Ã0º0Ã@R3Ãà+<Ã8Ã`8Ã`š4ðÂ9Ã0:à9ÃÐ.5ÃÀx7Ã@Ã5Àî3ÃP.Ã`5ÃàÞ3ðò1Ã0=0à /Ãà7:Ãë:Ã0C/Ãð1ÃPê5ÃÐ(6Àe5à 1Ã`‚8ÃàÞ3ÃP…1ðø0Ã`v:Ã0œ5ÃT4Ã`š4Þ2ÃÀ3Ãðˆ3Ã`j<ÃÀf:ÃpJ3Þ6ÃÐ:3ÃB7Ãðp7Ã-4à¿3Ãàä2Ã!6ðK8ÃЙ8Ã!2ÃPê5Ã0õ;ÃpÇ3À¸<Ã@Ã5à 3Ãt9à {4Ø3àÝ.ÃN5ÃàÆ7ÃГ9à¹4Àw2àÝ.à 0Ãðç8à¹4ÃП7Ãå;Ãp86Ã`¸/Ãð2Ã` 3ÃpÇ3Ã`¦2À_6ð-ÃÈ/Ãð0à ¨(dt ?@4 4ÿxunitsyunitsÐdh \ (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@Ñ (ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec1 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunits`f€hTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿjHEAPX  hdatadescription8  @œPkq·—NM€SNODøhPÜÀ3Ã`/1Ãн2ÃÀœ1Àô2Ã33Ã@Ï3à ‡2ÃÐ^-à Ÿ.Ã`ˆ7ÃPð4àÑ0Ã` 7ÃÐ(6ÃK/Ã0À/ÃÑ4Ã3ð?:à:ÃPä6ÃP2ÃÀ¢0ÃpÁ4Ãðj8Ãp:Ãàs0Ãàm1Ãðç8ðu1ÃÀ%0Ãàº9ù8ÃpÁ4Ã071à 2ÃPð4ÃÐ:ðÔ6ÃàÆ7À7Ã@·7ÃPI;Ãà´:Ã’8ÃЇ;à “0Ã@Ï3ÃÐ<Ã7ÃÐ8Ã@±8ÃPä6Ã×3ÃÐ"7Ãðv6à:Ã`ÿ8Ãp27ÃÀ 4Ã`ó:Ãb<Ãp,8ÃÀã:Ãà´:Ã`v:ð9;ÃÀû6Ã@Õ2Ãå;Ãý7ÃPÌ:Ã@=à Ú9Ã`í;Ãð4ö2Ã!6ÀS8à³5Ãà´:Ãn:Ãp27Ãß<à o6Ã-0ÃÐ¥6Ãp27ÃÝ2Ãp>ð?:à È<ð¤>ÃðÕ;Ã@½6Ã@±8ÃðX;ÃЙ8ÃPü2à¿3Ã<8à>ÃàC8ÃÐ(6ÃŒ9Ãp¯7ÃN5ÃÐ:3ÃPÒ9ðc4ÃÐ"7Ãß<Ã`j<Ãà%=ðÈ8Ã0 8Ã@¥:Ã0Z@ÀÐ8Ã`ˆ7Ã`š4ÃÀÝ;ÃÐ"7ÀÊ9ÃÀœ1Ã071ÃàÌ6à9à 6Ã07Ãð½?à K<À²=Ãà%=Ãp¯7Ãz8ÃPØ8Ã@™<Ã3ÃPg6ÀY7ÃPü2ÃPO:ÃÅ6ÃPä6Ã@(:Ãà1;ÃÐ9ÃPI;Ã012ÃÀl9ÃÐ8Ã@¥:ÃÀé9À7ä1à {4Ãp©8ÃPI;Ã'1Ã0®2à 6Ã<8ÃÐø=ð°<Ã;ðK8ÃpÍ2Ãà.Ã`^>ä5à i7ÃàÌ6ÿ7Ãh;Àè4à;Ã0¢4ðc4ÃÀõ7ð°<Ã`‚8à “0à “0Ã0œ5ÃÀ„5Ã92à 2Ã`Ž6ÃÀã:À}1Ã` 3ÃPê5Ã05Ã@É4Ã@«9ÀY7ÃB7ðà4Ãàº9Ã@(:à¿3ÃðÕ;Ã`‚8Ã`ÿ8à 3Ã0–6Ãp>5ÃÀõ7Ãp&9ÃàI7á<ÃÐ8Ã÷8à*7ÃPÞ7ðW6ðW6Ãà[4ÃÐ44ÃÝ2Ãë:Ã@.9ÃГ9Ãàü.Ã!2ÃÀ–2Àú1Ãðv6ÃÀõ7ÃÀœ1ä1ðÚ5À}1À}1ði3Àƒ0ó9ÃP==Ãà+<Ãp27à o6Ãf1ðì2ÃÝ2Ã@Ï3ÃЫ5ç;ðE9ÃÐ44ÃàÒ5Ãз3Ã@É4ÃÀx7ÃÀ„5Ãï/ð3ÃÀ„5ðE9Ã7ð]5Ãð‚4Ã@±8Þ2Ã` 7Ã@í.Ã@R3à9Ãë:ÃpÇ3Ã0´1à 6à à8à06ÃÐF1ÃPÞ7Ãðç8àB3Ãl0ÃPð4Ãб4à þ3ðÔ6Ãàä2àÑ0ÃÀ%0À_6ÃÐL0ðò1à•:à•:ÃÐ"7ÀÄ:Ã’8Ã06ðW6ÃÐ.5Ã@L4ÃÀf:Ãðv6ÃpP2Ã@ç/Ãð2ÃE0ÃÐ:Ã@É4ÃÀx7Ãàä2À§*Ã@ç/Ãý7ÃpD4Ø3Ãp¯7ÃÐ@2àB3ÃàÞ3Ãð2ÃÀ2Ãp»5ÃàÌ6Ãð1Ãï/Ãr/Ã@«9ÃàU5Ãðp7ÃÐÉ0Ãà[4à ò5ÃÀ®.ÃðA*ð/ð{0Ã=ÃH6Ãàs0Ã`¸/ö2Ã@j/Ãz8ÃP…1Ã07Ãp¯7Ã`4Ã@ç/ÃÀ%0ÃÀŠ4Ãð/-Ãð /À,Ãà-ÃpV1Ãp\0à65ðì2À.Ã×3Ãph.ÃП7Ã`²0ÃÀx7ÃГ9Ãð 3Ã@ˆ*ÀÜ6Ã0–6ÃP…1Ãp,8ÃpP2Ãð”1àÅ2à 3à*7Ã4Ãà‹,à u5ÃPê5Ã`)2Ãð2ð‡.À‰/ÃÐ9ÃÀŠ4Ã0 8Ã05àé,Ãб4ÃÎ.Ãph.à$8Àe5Ã0À/Ã`#3ÃN5À•-Ãã1Ã`50Ã0´1ÃÎ.Ã0¢4Ã3ðu1à /Ã071Ãp27ÃÝ2àã-ÃÂ0ðø0Ã0Ò,Ã0¨3ÃÀ 4Ãб4ÃPa7Ãàð0Ãð).Ãðš0Ãðv6ðu1àB3à 3àl,ÃpÙ0Ãð#/Ãx.Ã0®2Ãàü.Ãàü.ÃÐÉ0Ãð#/ÃÐL0Ã`50Ã`/1ÃÀ2ö.Ã@^1ÃÀ3ÃP/ÃP…1Ã@R3ÃpÇ3à ½)ÃP/Ã`¾.ê0ÃÐj+ÃK/àf-àû)Ãp\0ÃP…1ÃP©+ÃP0Ã@‚+Ãpå.àT0Ãð).Ã@p.à {4Ã0C/Ã@p.ÃÀº,Ã`4Ãðš0ðø0Þ2ÃP&,Ãph.ÃZ3Ãã1à 3àN1ÃÈ+ÃÀÌ)Ã3/Ãð#/ÃðŽ2ð/ÃÈ+ÃPð4ÃP2Ã8ÃPs4Àú1À‰/ÃP2Ãz8à65À}1Àè4ÃÅ6à 3Ãp86ÃpD4ð?:ÃpÁ4ð¼:Ã`š4Ã4ÃÀû6Ã@:7à;Ã` 7ÃЇ;Ã`v:Ã`5Ã`ÿ8ðø0à {4Ãà=9ÃPð4Ã0C/Ø3àN1Ã@á0Æ6Àè4Ãpå.à¿3à “0à65Ã@L4Ã’4ÃpJ3ÃðÕ;ÀG:Ãðp7Ãð|5ÃП7Ã`5ÃðX;ù8ÃPg6ÃB7Ãp=ÃÐò>Û=Ãt9ÃPa7Ã!6ÃJ@ÃÐ¥6Ãðv6àB3ðQ7ÃPa7Ã`j<Ã÷8ÃÐ¥6Þ6ÃÀf:Ãðç8ÃÐì?ÃT4Ã@™<Ãà7:ÃðX;ÃÀ–2Ã`Ä-ó9ÃpJ3Ãà–?Ãp?à<4Ãðó6Ãà®;ÃN5ÃpD4Ãð‚4ÃË5Ãp—;ÃàÒ5à W:ÃЫ5ÀS8ÃÐ{=Ã@F5à Î;à Ú9Ãðp7Ã69À;Ã0ï<Ã`‚8Àâ5Ã69ÃPI;Ãà=9ä5Ãp,8ÃðÉ=à ?>Ã0f>ÃÐ<ÃÓBÃ`Õ?à W:Ãà7:À¬>à65Ã@™<Ã@oCÃDAÃÀB@ÃÙAÃÀÅ?Ã`ˆ7à›9à 'BÃp‘<à;Ã7ð°<ÃÐ{=Ãp—;ÃðÉ=ÃðÏ<Ã0 8ÃÀÑ=à‰<à=Ã@ ?à K<à @à -AÃÙAÃÁAà <Ãp…>Ã@ ?Ãpü?Ãð^:Ãà+<àô?À;ÃÐQDÃÀ0CàèAÃÀÅ?ÃÁAÃ`^>Ãb@ÃÀÝ;à <Ãp,8Ãà1;Ã`í;ÃÀB@ÀšAà ?>ÃÐì?ð¶;Ã0r<Ãp—;Ã0û:Ãb<ÃðR<ÃðX;Ã?ðž?ÃPI;ÃÀÝ;ÃÀr8Ãë:Ã0Š8Ã@uBÃp;À¦?Àk4Ã`:DÃð@?Ãß@Ãp:Ã@¥:ÃÐø=Ãå;ÃÀï8Ãå;ó9Ãå;à;à ]9ÃBÃ0x;ÀY7ÃðX;ð]5ÀÖ7Ãz<Õ>Ã`ç<Ãý7Àú1Ãp;Ã$<Ã`ù9ðª=ð¼:Ã0õ;ÃV>ÃPU9Ã@L4Ã*;ÃPØ8Ã7ÃÐ<ÃÀl9Æ6ÃÐò>àƒ=ÃÀl9à Ô:ÀÐ8Þ6à ì6Ã0:à c8Ãp,8à§7à‰<à}>Ã0ã>Ãp86Ã`^>ÃÐ<À¦?ÀG:Ãðá9Ã`á=ÃP+@Ø7à;ÃPØ8Ãà%=ÃÀN>Ãý;Ø7ÃàI7ÃàI7Ã`ù9Ã`j<à ?>ÃÀé9ÃÀ5Ãp :Ãðç8ÃPs4à ì6à¹4à ?>Ã=Ãà%=Ãp>Æ:Ã0œ5à ?>ÀS8ÃàÀ8Ãp :Ãðç8Ãðv6à Ú9À¸<ÃAÃP==à;ÃDAÃ`^>ÃÀN>Ã`±EÀAð@ÃðL=Ã`í;ÃÙ=Ãà?ÃÐ]BÃÓ>ÃЇ;ÃÀH?ÃЙ8àâBàkAÆ:Ãh;Ãý;Ã@uBÃpy@Ã@cEÃ`í;à:ÃÐàAà E=Ã0¢4ÃÐ¥6ÃPU9Ã0é=ÃÀ3à 3ð¼:ÃÐò>Ãp&9ÃÀï8ÃÀZ<Ãà+<Àe5Ã09Ã0`?À5=Ãà AÃp :Ãp;Ã@™<ÀÜ6à È<ÃÙ=Ã`‚8Ãà=9à ]9ð-=ÃÐ ;ðÚ5Ã5Ãðv6Ãp‘<Ã0:Ã’8à65ðÈ8ÃÐWCÀG:Ã@(:Ã@«9Ãàº9ÃÀT=ÃðX;Ã@<Ãp‘<Ã`Û>à DÃ@Ÿ;Ãà¢=ÃZ3ðW6à K<à•:Ã@Ÿ;ÀG:à :à W:ÃàÆ7ÀÖ7ð?:Ãðj8Ã9Ã0„9Ã0¨3Þ2í:Ã`á=ÃPä6Ã0–6Ãà7:Ã`p;ðÚ5Ãà1;ÃàÆ7Ã’4ÃðÏ<à Ô:Ã@“=ÃÀr8ðo2Ãð^:Ã@>ðÂ9à 1ÃÀ6ÃÐ:Ã0x;ÃÀ„5à:ÃÀl9Ã@á0Ãt9Ã33à u5à 0ÃPg6à¿3ÃPI;Ãß<Ã7ÃÐ9ð]5ÃÀ~6àƒ=ÃÀ6Ã@F5à à8Ãðp7À;<ÃÀl9Ã`8Ã0–6ÃÀ 4ði3Ãn:ÃH6Ã06Ãðÿ4ÃÀ~6Ã<8ÃPg6Ã`6Ã`5Ãàa3À¾;Ãp,8ä5Ã0é=Ã@±8ÃPö3Ã0´1ÃàÞ3Ø3ÃÐ¥6Ã’8à¹4Ã9Ãðù5ÃðÏ<Ãp:Ã`4àH2ÿ7à þ3Àƒ0Ãð”1ÃPO:àH2ðò1ÃÀ–2Ãðç8Ã@R3Ã0Æ.ÃðÕ;Ãl0ÃÀ1.Ãð|5Ãà7:ÃÀŠ4ö.À›,Ã0¢4Ã0:ÃPU9Ã05ä5Æ6ÃPO:À_6Ãõ.Ãà)ÃÐ"7Ã0¢4Ã@ù,Ã4Ã0–6ÃH6à ø4Ãð2Ãð|5ÃÀŠ4ð{0Ãp\0ê4Ã07ðæ3ÃÂ0Ãà1;à 6Ã7ÃPü2ÃÐL0ÃP‹0ÃÐÃ1ÀÜ6ðK8ÃÀœ1Ãt9ðo2Ãï/Ã05Ã`¸/ÃpD4Ã@48Ã@Ã5Ã’4ÃPð4Ãà[4ðò1ÃÀ¢0Ã@p.Ã0=0Àk4Àâ5Ã'5Ã@L4ÃT4Àî3Ã@d0Ã0–6Ãp86à¹4à o6Ãp86Ãн2à¹4àT0Ã33ÃÐ@2ÃH6ÃE0Ãàs0À0à¹4ðÎ7ÃN5À}1Ã92Ã`/1Ã33ÃP0ð/ÃÐ:3Ãñ9Ãý7ÃÐ@2ÃPs4ð-Ã~-Ã'1ÃàÞ3ÃÐ44Ã071ÃÐ8ä5ÃPU9ðE9ÃE,ÃÀ 4à {4Ã3Ãt9à<4Ãp27Ã0%4Ãðˆ3ÃàØ4ÃE0ÃÀ6Ã05À7àË1ÀÖ7ÃÝ2ÃË5ÃàU5ð¶;Ãpµ6ÃŒ9Ãðí7ÃpV1ÃðŽ2Ã`”5ÃN5Ãàa3à K<à•:Ãð2ÃÀ3Æ6Ãðˆ3à u5ÃÐ8Ãà®;ÃàÆ7Ã!2ðæ3à¿3ÃÀ6ÃZ3ðò1Ãpb/Àq3Ãð).ÃÀ1.ð/ÃPê5Ãð /àH2Ãã1ÃÅ6Ãà7:Ã`A.Ã@^1ÃàC8ÃP2Ãàº9Ã92Ã`5ÃàÒ5ði3Ãàä2Ã`8à u5ð]5ÃPÆ;Ã0=0ÃЫ5à o6àN1à K<Ã5Ã@Ï3À}1ðo2Ãð‚4Ãðˆ3ö2Ãð|5ÃPÆ;Ã@Ã5Ã`2ÃZ3Ã@Ï3Ã-4Ã8ÃÀ6ÃàØ4Ãð|5Ã0~:à 3ÃZ3ÃÑ4Ã’4ü1à06à Ú9ÃPI;ÃÀõ7Ã`)2ÃÐ@2ÃÀ~6Ã0%4ÃE0ÃÀ7-ü1ð?:ðÂ9ÃÀr8ù8à¡8Ã06ÃÀ„5Ãàa3à 3ÃÀ3ðÚ5ÃZ3Àè4Ãp»5Àú1àN1à 3ÃÐÕ.Ã@R3Ã92ü1ðÚ5Ã@F5Ã-4ÃÐR/ÃPð4ÃÀ1ÃÀ1Ãx.ÃÀ=,ÃÐ¥6ÃPU9Ãp©8Ã’8Ã@R3ði3ÃpÁ4Ã@.9Ãн2ÃÀ6Ãà1;Àô2Ã0À/Ãàê1ð/à 2ÃB7Ã07ÃÐ:3Ã'5ÃT4ÃN5ÃŒ5Ãð”1Ãð0Ãн2ÃPa7à§7Àâ5ð]5Ãð /ÃàÞ3à ‡2ÃpJ3Ã0œ5ði3ÃàU5Ã`”5Ã`ÿ8ÃÀÀ+Ã012Ã`š4ð]5ÃðŽ2ÃP-Ã0¢4ðà4Ãð¬-ÃP‹0ðÚ5Ãp÷+à “0Ã@^1ÃÐÏ/Ã-0àÑ0ÃÀI*ÃÀ%0Ã09Ã~-ÃpÓ1ÃÀ5ÃÐÉ0Þ2ÃÐÃ1Ãõ.ð/Ã`50ðc4ä1ÃÐÃ1Ãð 3ä1Ã0%4Ã`)2Ãà.Ãàs0ÃÐÃ1ÃÂ0ÃàC8Ãð#/Ãð;+ÃÀœ1ÃP2Ãàa3Ãð2Ãpå.Ãà+Ã’4ÃÀ~6ÃpÇ3ÃÀ¢0Ã0=0Ã'5Ã`8ð/À1ÃpÇ3Ãàä2à ì6Ãб4ÃZ3Ã`Ž6à ·*ö2Ã'1Ãl0à 3Ãðp7ù8Ã`¦2Ã`6ÃÚ(Ã@=ÃÐ8Ä,à65Ã@ó-Àú1Ã0¢4à<4à ™/ÃÐç+ÃÎ.Ãðí7Ãðp7Ãð¦.ÃÀ„5Ã0:ÃÀ¢0Ãð²,Ãà.Ãð”1Ãpµ6Ã0Æ.ÃÀ5Àî3Ãð^:à æ7Ã92Àî3ÃT4à 6Ãðš0Ã@v-àH2Ãðˆ3Ã'5à<4ê4à65ÃpÓ1Ø3Ã×3à i7ÃPä6Ã$<Ã@Û1ÃH6Ãðš0Ãàê1ð‡.Ãàa3Ãf1ÃP…1Ãàö/ÃpÓ1ðþ/À•-àN1Ã×3ð{0ÃÀ„5Ã`6Ãð‚4Ã-4Ã@ó-Ã071Àq3à ì6à›9ÀÊ9Ã`6Ø3à 3ÃPü2Ã` 3Ãàm1Þ2ÃðŽ2Ã7Ãб4Ã@í.ö2ðø0Ã`¬1à ™/Ã0¢4Ã@É4Ãð0àË1Àè4ÃàÒ5Ã],Ãð¦.à§7Ã0+3à65Ãð 3Ãf1Ãé0à “0à•:àT0Ã`¾.ÃÀ1Ã` 7Ã!2àÑ0ÃÀ„5Ã`4àB3Ãàð0Ã0œ5Ã0%4Ã`2ÃÀœ1Ã`6Ã@L4ÃPä6Ã-0ê0Ã0Ì-ÃZ3Ã`2àH2ö.Ãàü.Ã@ó-Ã-0ÃÈ/À0ð/ÃÀ3ÃpJ3ðc4ÃPÒ9Ãà-ð/ÃÀ„5ÃPm5Ãàg2Ãàê1Ãб4ÃŒ5Ã@R3ÃPö3à 1ÃÀ1ÃP2Àƒ0à ø4ð{0Ã@ó-ÃÀÀ+ÃpP2ÃÝ2ÃÐ.5Ãpñ,Ã`¦2Ãð”1ÃàØ4àT0Ãà-ÃQ.Ãà[4ÃÐÏ/ÃpÁ4ÃÐ:3ÃÀ„5ð{0Ã@á0Ã`š4ÃÀ1Ã071Ã!6à ".ÃP -ê4Ã3/ÃT4ÃÐ"7Àô2Ã33Ã],Ã`)2Ãðˆ3Ã0„9ä1Ã@Û1Ãpå.À1À7Ãð¸+ÃW-àé,Ãx.ö.ÃK/ðþ/Ãàg2Ã’4ÃÀ´-ÃPØ8ðQ7Ãðí7ÃPð4Ãp86Ã0À/ÃP£,ÃÔ-Ã3Ãp>5ÃPg6Ãð /Ã`2ðÔ6ÃÐç+Ãð‚4Ãàg2ÃPy3Ã0+3Ã0À/àé,Ã@48ÃÐ44Ãð”1Ã071Ã`ô%à 1ÃÀ~6ÃÎ*ö.Ãð0Ã`;/ÃÐá,Ãp÷+Ã`2Ãð¦.Ã` 3à ™/Ãð¬-Ã@j/Ãð2ÃP -Ã@ˆ*Ãðš0ÃÀ–2ÃpÍ2à “0ði3Ãï/Ãà‹,ÃÐÉ0Ãpt,ÃÀÀ+Ã`¸/ÃP¯*ÃK+Ã3Àî3Ã0=0ÃÎ.Ãà+à (-Ã?-Ãàä2Ãày/Ã0O-ÃÑ4Àâ5Ãð).Ãà…-Ø7à Û$Ã0®2ÃPy3Ã`2ð,ð()Ãð).àÝ.Ãð1Ã?1à06À_6ÃÀ+/Ã@‚+Ã0I.ðu1Ãày/Ãpë-Ã`²0ÃÀ3ÃÐÏ/Ãð0Ãã1Àè4à×/àû)ÃÀ¨/ü1Ãðù5ÃP‘/Ã`/1ÃP/ÃK/ü-Ãé0Ã9.Ãб4ÃPs4Ãpß/Ã@á0à–%ä1Ã`š4àã-ÃÀ¨/Ãàð0Ã'5ê0à .,ÃÐ^-Ã?1ÃÐí*Ãà—*ÃÀ®.À¡+Ãà…-Ã@^1ÃðÖ&ÃÐÏ/Ãà—*ÃP.ÃpŒ(Ã@‚+Ã0I.Ãc+à 1ð,Ã0U,ÃP -Ãàð0Ãð¸+Ã`Ê,Ã@j/ÃÂ0ÃàU5ð‡.à ¥-Ã9.Ã-Ãà—*ÃÐv)ÃP&,Ãé0ÃÐç+Ã],à 4+Ã@v-Ã@p.Ãðó6ðì2Ã0®2ÃPü2Ãpñ,ÃÀÆ*Ã@Õ2àN1ÃÈ+ÃÚ,Ã@ÿ+Ãc+ÃÐ^-ÃÂ,Ã@Ž)ÃÐX.ÃÐí*Ãx.ÃP0Ã@X2ð+Ãð1ÃðÄ)Ãà)Ãà…-Ã0%ð,ÃÐÕ.ÃW-Ã`Ê,Ãðš0Ãà&(è&Ã`Ö*Ãð¸+ÃÐv)ÃÀ®.Ãà-ð .Ãðè#Ãpz+àl,Ãð0À›,Ã` 3Ã0=0Ãp )Ã@d0ÃÐR/ÃÀ+/à`.Ã`G-ÃÐ^-ÃÀÆ*àN1ÃÐç+Ãà.Ã`;/Þ6ÃÎ*ÃÐ|(Ã@”(à~)à ¥-à Ÿ.ÃÐÉ0Ã`Ê,Ã`G-Ãàð0Ãà-ÃÎ*À-ÃÂ,ÃÀ®.Ãà…-Ã0Æ.à :*À-Ão)ÃÀ´-Ãi*Ã@+Ãæ&Ãà*à ‡2ÃP©+à~)ÃÀ2ðþ/ÃÐÕ.Ãð#/ð,ÃP -Ãi*Ãpz+à :*ÃÐj+ÃPD'Ãph.À /À¹'Ã)À0)àl,Ãp’'Ã@í.ÃP-Ã@”(Ã(ÃÐd,àf-Ã0Þ*ÃÐp*ÃÐó)ÃÐ@2Ãà )Ã*ÃÐj+ÃÐF1ä5Ãpz+ÃÀI*ð/Ã012Ãð#/ð‡.À.Ãà‘+Ã0U,ÃÐv)ð“,Ãà‹,Ã`/1Ãpn-Ãн2À,ÃðÐ'Ê+À,Ãð 3ÃP-ÃP8)Ã`è'Ã@|,Ä,ÃÐÏ/À‰/ÃàO6Ã0Þ*Ãà‹,ÃÐ:3ÃÀ´-à /àl,Ã{'à×/ÃðÖ&À}1Ã@ˆ*ÃðÊ(Ê+Ãpt,ÃP—.Ã@(ÃÐÏ/Ã@ÿ+Ã0O-ÃP©+àl,ð-ÃÐR/À›,ÃP.Ãð /Ã@:7Ãp86à “0À-Ã@(ÃðG)ü1Ãà.Ãàê1ÃÐ:3Ã-ÃP,+ÃpÓ1Ã0I.À§*Ã0ö&Ãð/-À§*ðø0Ã3/ð/àf-ÃÂ,Ãx.ÃPÁ'Ã071ÃW)ÃðM(Ãàü.ð,Ãðš0àx*ÃÀœ1ÃðÊ(Ãpz+Àƒ0ÃP.Ã0~:ÃP-Ø3ÃÐF1Ãû-à ".àx*Ã@Ž)Àô2ÀõÃPñà ‡2ÃÝ2ê0ÃЫ5àl,Ãð5,Ãà‹,ÃÐ^-ÃÐá,Ã0U,ðì2ÃP&,Ãpý*ÃÚ,ÃP‘/Ãà©'à /Ãàä2Ãà'Ã@(Ãp'è&àã-ðò1ÃP-Ãpz+ÃP¯*À¹'Ã0O-ÃÎ.Ãõ.ÃP2*à «,Ão)ÃPü2Ãð¾*Ã0Æ.à ¥-ä1ð™+Ãð/-ü1Ã@+â'ÃP2*ÃÐp*Ãpz+Ã3/Ã@L4Ãð1ÃÀ+/ÃPµ)ÃÐL0ðo2à “0àx*Ã0Ò,À­)àï+ðæ3ð{0Ãðó6Ã`;/à ‡2ÃÀ1.Ã`S+ÃÀ´-Ã@ÿ+ÃÚ(ÃÐç+ÃÀ®.Ãàü.Ã0À/Ã@d0Ã`2Ãð”1ÃÂ,Ã@^1Ãé0Ã@‚+ÃÐÉ0ÃÐp*ÃW)ÃE,Ãðš0Ã0Š8Þ2à`.ÃÈ+Ãð4ÃàØ4ðø0Ã?1À›,À,Ãpn-ð™+Ã-4Ã@í.Ã071Ãà,Ã`¸/Ãph.Ã`Ê,Ã?1Ãàä2ä1ÃpJ3à 1ÃÐX.à 3Ã0º0ÃpÙ0à×/ÃÂ0Ãð¸+Ã!2Ãð).ÃÐÛ-Ã*ÃpÙ0Ãð²,Ãp3"à~)Ãõ.ÃP0Ãà.Ã@ó-Ã`Ð+àé,ÃÝ2Ã4ÃÐá,ÃÀ1ði3Ãph.À**ÃÚ(ÃÐv)Ãpt,Ãû-ÃÐÃ1à ™/Ãpn-ÃÐÏ/ÃÐ^-ÃЫ5À1ÃÀÌ)ÃP&,Ã0º0Ã`A.Ã3/Ãð²,Ãf1àÝ.Ã0[+ÃPµ)Ã@í.ÃÐj+Ãpý*Ão)Ãà‹,Ãà.Ãpå.à 1ÃÐÕ.Ão)ÃÐÿ'ÃÐ^-Ãð;+à Ÿ.ðø0àõ*ÃW)ÃÀI*ÃÀI*ÃP8)ÃÂ,ÃÐ^-Ã0O-Ã(Ã-àÝ.ÃpÓ1à 0à Ã(Ãð¾*Ã@^1Ãý7ÃÀ5ÃÐÏ/Ãð#/ÃPê5Ã071à„(Ãà+à ¥-ÃÐ^-à ±+Ã3Àq3ÃK/à ¥-Ãз3Ãph.Ã@ÿ+Ã`M,ÃðŽ2Ã`¾.Ãû-Ãp\0Ãpt,Ã@j/Ãàö/ð-àN1à<4ÃpÇ3ÀÖ7ðQ7à ø4ÃÀ6Ã0À/Ãp\0ÃÐ:3Ãàü.Ãp÷+ð()ÀS8Àk4Ã`p;ÃЫ5Ã-0Ãl0à¹4Àƒ0Ãàa3Ãà=9à ‡2à:Ã@L4ÃPm5ðø0Ãàa3ÃPä6Ãð‚4Ã`š4Ãð4Ã09ÃT4ÃP…1Ã5Ãl0Ã5ðÎ7Ã0¨3Ã69ÃPg6ÃàÌ6ÃÐ ;ÃPg6Ãpµ6ÃÐ"7ÃPm5Ã@Ï3Ã@«9Ã33Ã@Û1ði3ÃàÌ6Ã09Ãp>5Ãã1Ã3/Ã@Ï3Ã'5Ã0 8ÀÖ7Ã`2ÃÀ3à›9Ãðù5Ãp©8ÃPÒ9Ã0+3Ã@½6Ãn:Ãðˆ3ÃÀ1Ãðí7ÃB7Ãð2Ã`š4À_6à þ3Ãàg2ÃÐ"7Ã07ðE9ÃÀ 4Ã0r<Ã0:à 3ÃðŽ2Ã@Ã5à³5à o6à i7Ãx.Ã`š4ð]5Ø3Æ6à à8ê4Ã`#3ÃPä6ÃÀË>ÃPÌ:ÃГ9ðQ7Ã0œ5ði3Ã`”5ÃÀÅ?ðK8Ã09àT0ÃP[8ð9;Ã@F5Ã3Ã`¦2à c8ÃÀ6Ã5ÃЫ5Ãp£9ð¼:Ã0 8Ãðù5Ã0r<Ã@É4ÃàU5à•:à ?>Ãt=ÃpÇ3ð?:Ã@^1Ã`5Àè4Ãз3ÃàÞ3à ]9ð¼:à ø4Ãðd9Àe5ÿ7Ãl0Ã`”5ÃPä6Ãt9Ã`/1ÃÀé9ÃpÁ4Ã`”5Ã-4Ãàä2ÃÐ<à æ7à c8Ãz8Ã`4Ãðd9ðQ7ÃàC8à*7Ã0é=Ø7ÀM9Ã0:Ãðí7ÿ7Ãàœ>à c8Ãðí7Ã’8ÃÐ"7à¡8Ã`p;Ã@@6Ã05à 'BÃŒ5Û=À_6ä5Ã<8Ãðá9À5=ÃÅ6Ãà=9à i7Ã`|9ð-=Ãàº9Ã0´1ÃN5Ã` 3Ãp‘<ÃB7ÃÐ.5Ã`‚8Ã`í;ð?:Æ:Ã7ÃPÌ:Ãp£9Ã09à¡8ÃÐ9à›9ÃÐ¥6ÃP[8ó9Ãðj8À/>ÀÜ6à¡8Ãp?à­6ÃpÍ2ÃpÙ0ÃPð4Ãðp7Ãñ9ÃŒ9Ã@¥:ðÈ8Ãз3Ã0:ÃP[8Ã`ˆ7ÀÜ6Ãðç8Ã0r<ÀA;Ã0„9Ãð 3ÃN5ÃpÇ3à<4ðc4ÃPö3Ã`8ÃðX;ÃÀ3Ã06Ã÷8à ò5ðo2Ã'1Ãb<à$8Ãð 3Ã÷<à Â=Ãp=Ã`ˆ7Ãpµ6ÃP7>À)?ÃpJ3Ã`6ÃT4à•:À7ÃpJ3à 3à*7ÃÍ?à 9?ÃÀN>ðc4Ã@F5Ãð”1Ã@F5ð/Ã3Ãз3ÃN5ÃЙ8ÃàÆ7Ã×3Àî3à 6Ã` 3Ã`¸/ÃàÒ5à 6à ]9Ã@:7Ãpµ6Ãï/à “0Ã3ÃàÆ7ê4ÃÐL0Ãð0Ãð /Ãp :Ãð·@ÀG:ÃPy3ði3ÃË5ÃÐ44ÃП7Àƒ0Ã@@6ÃŒ5ð3ÃË5ÃPÌ:Ãð/-Ãt9à›9Ãð|5ÃPÞ7Ã0´1à ‡2Ã@L4ÃÑ4ÃpÁ4Ãpå.ðQ7ÃÙ=Ã÷8ÃÐ.5ä5ÃP‹0ÃÐ(6Ãpµ6ÃP0Ãн2ÃÀ3Ã-4à 0ÃÀx7Ãf1ÃÅ6Ã0®2Ãб4ê0ÃpP2ÃàU5Ã’4ÃPê5ÃPö3à9Ã`Ž6ði3Ãã1À1ÃT4Ã`í;Ã~-ðì2Ãðù5ÃÀ–2ð]5Ã7Àè4Ã@·7À_6Ãð4ÃPä6à “0Ãð2ÃðÕ;à³5Ã0¨3ÃÀ%0àN1ÃàØ4ê4ÃÅ6Ã0C/Ã`2ÃÐÏ/Ãày/ðþ/Ãð0à 2àl,Àk4ÃÐÃ1ÃpÙ0ðò1à¡8à 2À1Ã@p.À1Ã0O-Ãpn-à à8Ã`2Ã@Û1Ãн2ÃpJ3Ã0®2ÃÐ44ÃP.ÃÐL0ÃÐL0Ã@v-ÃPö3Ã0®2à æ7ÃÐ:3ÃP…1Ã`²0ÃŒ5àË1Ã0[+Ã`G-àN1àÑ0ÃÀ6ÃÐÏ/Ã33àZ/Ãà&(ÃK/àã-ÃP…1Ã`²0ÃK/ÃPê5Àú1Ãõ.ÃÐÿ'Ã0º0Ã@p.Ã*Ã0C/Ãph.Ã@ç/Ãà…-Ã@ó-ð/Ã0+3ðø0Ãð /À0À0ÃP/Ä,ðø0Ã@p.Ã-4ÃÀ%0Ãàö/ÃÀ 4Ãð2ÃðÄ)Ã`)2ÃÐç+Ã`50à 3ÃÅ6ÃÐÉ0Ãx.Ã`A.ð/ÃP -Ã,ð-àN1à +Ãà‘+à 2à ‡2ÃÐÏ/à¹4Ãp>5à “0Ã0Æ.ð/Ã`2ðu1àÑ0Ãû-Ã?-Ã3/à .,à /Ãàü.ÃÐ(6Àq3Ã9.Ã0C/Ãx.à„(Ãð²,ÃpP2à<4ð¥)Ãõ.À‰/ÃPð4Ãз3Ã@(Ã@|,ÃP.ÃpÙ0à 3Ãð#/Ã0Æ.Ã?1Ãû-Ãð#/ðø0à ".Ã@+Ã,ÃpV1à×/Ã0º0Ã@v-ð/Ãð¦.ÃPg6Ã!6ðc4Ãpß/ÃÀ´-Ã@|,Ã~-Ãàö/Àô2Ã@ó-ð‡.àÅ2Ã`”5àl,Ã@.9Ãз3Ã0À/ÃP,+Ã?1à 1àH2Ãpn-À‰/Ã`Ð+ÃP-ü-ð.(Ã!2Ãàg2à¿3ÃÂ0Ã4ÃpÍ2Ã0º0Ãб4ÃpP2ÃÂ,à ¥-ÃÐF1Ã`”5ÃÐÕ.Ã`²0Ã@í.Ã`;/àÑ0Ã!2à /Ãpb/ð‡.ÃP2Þ2Ã`S+à u5Àƒ0à Ÿ.ÃÝ2Ãf1Þ6àË1ÃK/ÃÀ+/Ãf1àZ/à Ÿ.à 3Ã`¾.Ã012ÃÀ®.Ãpß/ÃÀÆ*ðø0ÃÐF1àl,Ãà,Àw2ð{0ð/Ã`²0Ã`¦2Ãõ.Ã`6ÃP—.Ãpn-Ãpë-Ã33Ãð).â'Ãàü.Ã`Ž6Àô2ðQ7Ã@@6Ãà‹,Ã0¢4à*7à¹4À_6Ã0Ì-À**Ãr/ê0ði3Ãàa3à «,Ãr/Ã`Ê,Ã@d0Ãð¦.ÃP,+ÃÀ®.àl,Ã@á0ÃÐX.à /Ã@Û1Ãз3Ãpb/à×/ÃÎ*à ".ÃÐÃ1ÃÀ®.À•-Ö)Ã`Ê,ÃP‹0ðu1Ø3Ãð0Ãpå.Ã@+ÃP1Ã0O-À›,Ã071ÃÐd,Ãp>5ÃPy3à ¥-Ã@|,Ãà+ð/ÃÀ3Ãðš0ðu1Ã5ðì2Ã×3Ã?-ÃÀÆ*ÃP©+ðæ3Ã`Ä-Ã@ù,Ãpñ,ðì2ÃE,À}1Ã0+3Ãx.ÃP2Ãðó6ÃPÞ7ÃÀ 4Ã`e(À /ÃpÓ1ð{0ÃÀÆ*Ã0[+Ã0¢4Ãpë-Ã0C/à É'Ãð0Ã071Ã0ö&ÃP…1ÃÚ,Ã0+3Ãàa3Ãð¬-Ã0U,Ãà)ÃPö3Ã07ÃÝ2À0ÃpJ3Ã071ÃP0ÀË$Ãpz+ÃÐá,Þ2Ãà=9ÃÀ®.Ã`¸/Ãð0ÃÐX.ÃÐ^-ÃÀC+Ã33Ãph.Ã0º0Ã@|,ÃÀ–2ÃÐÉ0à ½)ðà4Ã`A.Ã@(ð‡.Àq3Ã@v-Ã0U,Ã012à ¥-À•-ÃÐÃ1àé,ðL#ð"*ÃÀ1ð“,ü-ð .à :*Ã`A.Ãày/Ãðÿ4ÃpÍ2Ã`Ê,ÃP-Ã#Ãà‘+À•-à .,à :*Ã0®2Ãàä2Ãз3ÃÀœ1ÃpÁ4À.Ã0U,Ãð‚4ÃàÒ5àï+ðŸ*Ã)Ãà‹,Ã`G-ÃÐ¥6Ã@^1à “0À•-À$+Ü(Ãà‹,Ã×3Ãàg2ÃÀ 4ðÚ5ð‡.ÃÐá,Ã@”(Ãð;+ÃÀ®.ÃÈ+Ãpë-Ã`Ä-ÃÂ,Ã'1ð+Ã`Ö*Ãн2à “0Ãr/Ã'1à³5Ãp&9Ã09à ·*Ã0O-àZ/ÃÚ(ÃÐù(ÃÀC+Ö)àÑ0Ã0C/Ãà—*à 1Ãà.ð-à «,Ã4àB3ÃpÓ1Ãà—*Ãp*à «,ÃÐÏ/à 1ð‡.ð{0Ã0À/ÃPg6Ã07Ã0I.ð/Ãðš0ÃP©+Ãpñ,Ãð /Ã@ù,ÃÑ4Ãpë-ÃÀ%0ÃÔ-ÃÈ/Ãpb/Ãpb/ÃW-Ãàö/Ãð /ðþ/Ãб4ÃÐR/Ãð).Ã0[+Ã@L4ÃðÄ)ö2Ãpn-Ãàa3Ã` 3àf-Ã0%ÃPµ)Ã@d0à Ÿ.Ãr/Ã'1Ã012ê4ÃÀ+/Ãà.à 4+ÃÐF1Ãàm1Ãðš0Ãr/ð{0ÃÚ(Ãì)ÃÐá,Ã'5Ã@j/Ã`2Ã-0ÃH6ðo2ÃpÇ3àË1Ãp\0Ã0À/ÃÀ+/ÃPs4ÃÀ¨/ÃQ.ÃpP2Ã`#3àË1Ãðš0Ã`2Ãð1Ãï/Þ6Ã'1ÃP2àû)ÃPÁ'Ã],Ã06Ãðp7Ã33Ãp86Ã!6à*7Ãð0ÃÀx7Ã-ÃpV1Ãð¦.Ã-Þ2ÃpP2ÃÐL0Àe5àË1àT0ÃÐÛ-ÃÀÆ*Ã’4ä5Ã`50ÃPö3Ã@ù,Ã?1ÃÀ+/Ã0Ò,Ã`Ž6ÃP‹0Ãð4ÃÐ44à ".ÃÀ%0àB3Ãpå.Æ6Ãàs0ÃpÙ0ðþ/ÃÐX.à “0ÃÐ:3ðà4Ã@É4Àú1Ã0Æ.ÃpP2Ãðp7à ø4Ã`¸/à ™/ÃPð4ÃÐ:3ü1Ãð¬-à u5Ã`5à ™/Ãp\0ÃÀr8ÃÐÃ1Ã06à 3ðK8ÀÖ7ÃÀ–2ÃÐ.5ÃZ3ÃPI;ÃÀx7à³5Ã-0Ãðó6Ã` 3ÃH6ðo2ÃP2à o6à65ÃÀ5Ã'5Ã8Ãå;Ã4à*7Ã@(:ÀY7Ãà[4à³5Ã0´1Àk4Ã0+3à à8ÃPm5Ã69ÃàI7ÃP…1ÃЙ8ÃÐ8Ã`|9Ã7à³5à W:ÃQ.ÃPs4Ã@F5ÃP…1ðÔ6Ãë:À¾;Ã`²0Ã@48Àe5ÃÝ2ÃÐ@2À}1ÃÀ6ÃÐ:ðÈ8ðQ7ÃÐ¥6Ã@½6ÃP?Ã@±8ÃàC8Ãà?Ãz8Ã@@6ÃÐþ<Ã0 8Ã07ðÈ8ÀS8ðø0ÃÐ<Ãðv6Ã`š4ð]5ÃŒ5ðà4Ã`4Ãðj8Ø7à c8ÃÑ4Ãp©8Ãà+<ÃàI7à Ô:Ã@48Ã÷8Ã` 7Ã`2Ø7Ãpß/ç;Ãh;Ã0´1Ã0¨3Ã`ó:ÃÐ"7ÃÐ<Ãà%=Ã`‚8Ãà[4à 2à¡8ÃÐF1Ã@Ï3ÃàI7Ã`ÿ8Ãðp7ÃÀœ1ÃÑ4ÃP[8Ãp£9Æ6ÃÀé9Ã06Ã@@6Ãð‚4ê4ÃàÒ5ÃÈ/à 6ÃpÓ1à$8Ã0+3ÃÐ:3Ø3à 3Ã$<ÃN5À.Ã@j/Ã`ÿ8à¿3Ã-4ÃpD4ÃP©+ÃÐ@2ÃW-ÃPð4Ã8Ã0œ5Ã@v-ÃÐ@2Ã’4À1Ã3/Ãðó6Ã@F5Ã`ˆ7à ì6à›9Ã@á0À.ÃÐ@2Ã`4ÃÐ(6ÃE0ðo2ÃÀû6ðo2Ã0º0Ã@Ÿ;ÃPä6ÃPÞ7Ãý7Ã?1Ã` 7ð/Ãð¦.ÃÐ.5Ã`5ÃàU5ÃÀ=,Ãàs0Ã-Ãà)ê4à×/ðÈ8Ãðí7ÃpÙ0Ãàa3à (-ÃàÒ5Ã33ÃàÞ3Ãð0Ã0%4ÃPä6Ã0À/Ã`A.ÃÀ%0ÃpÙ0ðæ3ÃÈ/Ãï/Ã@p.Ã0À/ö2ÃÀ3Ã0ê(ðþ/ê4Ãpå.ðW6ÃpD4Ã@d0ð/à×/ü1Ãð#/ÃPö3Ãc+Ã@Õ2Àƒ0àé,Ãp\0Ã`¬1ÃPü2à;Þ6ÃÀ3Æ6Ãн2ð/Ã@F5À /ÃÐÃ1ÃàU5Ã0–6Àe5Ã0C/Ã`;/Ã07Ãð4à 1À}1Ã0Ì-à Ÿ.Ã` 3Ã0´1Ã@d0Ã0=0Ãð/-ð/Ãõ.ð?:à 3ÃPm5ÿ7ü1ÃN5Ãð¬-Ãðí7ÃàÀ8ÃpÁ4Ã0œ5à ™/ÃÀ–2Ã0+3ä1Ø3Ã?-Ãðš0Ãàê1ðì2ÃÐ@2ðu1ö2ðà4ÃPy3ÃK/Ãн2Ãàð0Ãðù5Ã5Ã`¬1Ã5à 0Àâ5Ã@:7ð“,Ã@”(à ½)ÃÐv)ÃQ.Ã`)2Ãày/ÃPö3à ò5ðì2ðæ3Ãàg2ðà4Ã0¨3Ãà=9ð]5ÃP/ðø0Ãðá9Àô2Ã`50Ãph.ÃÀ~6Ã*Ã`š4ÃpJ3Ã0¨3Ã’4ðø0Ãp»5Ã@d0Ãà[4ð .à`.ÃÀ3Ãàs0à “0Ãl0Àô2Ãà[4Ã0¨3ä5ðà4ÃЫ5Ã’4Ãp27ð/Ãàa3à ò5ÃÐ44ÃàØ4ÃÀx7Ã@R3ÃÐ"7Ãp¯7Ãf1ÃE0àr+à “0ü1Ã3Ã`4ÃÀ2àÑ0Ãpb/ÃP -ð3à¿3Ã0–6ðà4Ã06ÃpJ3Ã`50ÃÐF1à ™/ÀÜ6ÃÐó)ÃpV1Ã`¸/Ã@v-Ãï/Àú1Ã0%4á<Ã0º0Ãð0Ã012Àw2Ã`6Ã@R3ÃÀ 4ÃÐ@2Ãû-ÃÑ4Ã,ðø0Ã0U,ÃðŽ2Ã0Ì-Ã05à¿3Ãð2à 1Ã0®2Ãн2Ã`G-ÃŒ5Ã'5Ã`50Ãc+à ‡2Ã'5Ã`#3Ã0ï<ÃP2ÃpÓ1Ãp,8ÃPØ8àÅ2ÃP/à /ÃZ3Ã@L4Ã`)2Ã@·7ù8Ã0¨3Ã5ÃPs4Ãðó6ÃÐF1Ã0´1Ãpå.ÃpÇ3ÃPü2ðò1Ã071ÃÐF1Ã`5à 3ÃàÞ3à o6Àe5Ã`5ÃÀŠ4Ã@X2à à8Ã@Û1Ã@R3à65à ™/Ã@ç/Ã@d0Ãðv6ä1Ø3à þ3ÃÀ3À.à 3àÅ2Ãà.Ã0C/Ã@R3ÃpÙ0Ã@:7Ã92ÃÀ%0ÃPa7Ã0®2ÃÀ 4ÃPê5Ãð4ÃÀ%0ÃPy3à`.Ãð 3Ã`ˆ7ÿ7Ãð2ÃÐ@2Ã`š4Ã0O-Ã@|,Ã`Ê,àZ/Ãpß/Ã3Àî3ÃP.àB3àl,à 2ÃP2ÃÀº,Ãð /Ã0¨3Ã0Ì-ÃpV1Ãp,8Ãã1Ã` 3ÃÀ–2Ã`2ÃЫ5Ã0û:à 6À /ê0Ã0U,ÃÂ0Ãàs0Ãð|5ÃàÆ7Ãð2Ãн2ÃZ3ÃP‹0Ã`S+à 1Ãû-ÃÐ(6Ã@Ã5Ãð^:Ã0=0Ã@L4ðì2Àú1ÃÐÃ1ÃÐL0Ã`š4Ãð|5ÃÀ7-Ã0¨3ÃPä6ÃPê5àN1Ã@ù,Ã@^1Ãpµ6ðæ3ä5ð{0Ãð|5à Ÿ.Ã@p.ÃàÞ3ðÚ5à 2Ã0º0ÃpJ3Ãp»5ÃЙ8À.ÃÀœ1ðu1ÃpD4àÅ2Ã@j/ÃpV1À}1ÃÐ@2Ãé0ÃÀ 4à­6à*7à Ÿ.ÃÀÒ(ðc4Ã0–6àË1à¿3à i7à 3Ã@R3Ã` 3ÃPð4ü1àË1ÃÀ¢0ö.ðÔ6à {4à ‡2Ãï/Ãð0Ãð1ÃÐF1ÃpÍ2À.Ø7à {4ÃÐ44Ãpñ,Ã'5Ã05à o6ä5ÃPg6ð{0Ãpb/Ãpß/ÃpV1ÃÀº,ä5ðu1ÃPü2ÃÐd,ÃÀ3Àô2Ãàg2ÃàÒ5ÃP.ð-à “0ÃÀ2Ã7À­)Ã`#3à 1Ãp,8Ã0C/Ã` 3Ãpµ6Ã3ðu1ÃÀ2Ã`Ð+àÑ0Ã;ðo2ÃpÙ0Ã@½6Ãf1Ã`Ð+ð/Ãàö/ÃàÀ8Ã`š4À0Àƒ0ÃP…1Ã`)2Ã@F5ÃÀ–2Ã@É4Ãð 3Ãé0ÃÐ@2à Q;Àƒ0ÃÐ.5Ãð¦.ü1Àè4Ãf1à 6ÃPä6ÃÐ:3Ãð0Ã@ù,Ãp,8Ãã1Ãày/ðo2Ã0´1Ãà+ðì2Ãp€*ÃÀ7-Ã`Ê,ÃP0ðÎ7Ã@í.ö.ðu1à¹4À7Ãðá9Ã@Õ2ÃK+Ãàü.Ã`2Ãð|5ÃPö3Ã5Àú1Ãð¦.Ãpb/ÃpÓ1Ãû-Ãï/ÃÐ^-ÃZ3à06ðÚ5Àw2Ã@‚+ÃÐ^-ÃP‘/Ãpb/Ã!2ÃP0à Ÿ.ðì2Ã07ÃK+À-Ã`8Ã@R3Ã?1ÃÔ-ÃPm5ÃÀ¢0ÃðŽ2Ã4ð{0À.Ãðv6ðo2ÃÐ@2Ã`¾.àï+ÃÐÏ/ÃPð4ðì2ð]5ðò1Ã@d0ÃPs4Ãï/Ãðù5Ãðˆ3ÃÐF1ÃPü2Ã@É4Ã@í.Ãð¦.À¡+Ã0´1Ã@á0À1Ã!6Ãpë-àB3Ã`Ž6Ã9.Ãð0Ã071ð]5Ãày/ÃpP2Ãé0Ãàm1ÃPg6Àw2àr+Ã0O-ÃP2Ã`Ê,Ãð2à “0à 1Ã0=0Ãàð0Ã`/1à 2ÃÈ/ÃЫ5Ãph.ÃÀœ1à /àZ/Àô2ÃàÒ5Ã`2À /ÃN5à ø4ÃÈ/Ã`)2Ãp£9Ã`¦2ü-Ã`¾.Ã?1Ãð /Ã0Æ.ÃÐç+Ã@^1Ã`2Þ2à<4ÃÐX.à .,Ãð¦.Ã0[+ÃÀœ1À.ü1Ã0Æ.Ãð0Ã012à 1à 2ÃÂ,Ãà…-Ãð2Ãp86àZ/ÃÀœ1Ã`¾.ÃŒ5ÃÀõ7ö2Ã],ÃpJ3ÃÀ%0Ãðÿ4ü-Ã’4Ã4ÃP1Ãà…-Ã@d0ÃP[8Ã07Ã@Ã5Ã@Õ2à «,Ãàê1ÃP©+ÃÀ%0Àq3Ãõ.ÃÀû6ð™+ÃPm5ÃÀõ7ÃÀ3ÃàØ4À**à þ3à E=à*7Ã×3Ã`|9ð3à {4Ã`4Ãf1ÃP0à ¥-Ãr/ÃB7à­6Ã3Àú1à 1Ã`;/Ãàð0ÃZ3ð{0ÃÐd,Ãpë-ðÔ6à06ÃpV1ÃàÞ3ÃðX;Ãt9à æ7ÃP2ÃÐÛ-Ãðÿ4Ãp86ÀS8Ãàa3ê0Ãpß/ÃÀ¨/ÃÝ2ÃB7ÃPm5ÃÀ6Ãpµ6ÃpV1ÃÐF1ÃÀ„5Ãðv6à<4ÃàÌ6ÃàÒ5Ã0+3ðW6Ã`”5ÃÀ¨/ÃB7Ãàð0ð{0ð/ÃpV1ÃÐj+à ø4Ãðš0Ã@v-Ã`v:à Q;Ã@É4Ã`6Ã@«9à ì6ê4ÃàÆ7Ãð2ÃÀ 4ð¼:Àk4Ã8à W:Ã`8ÃÐÃ1àÑ0À}1Ãf1Ã`/1ÃÀ´-Ã012ÃP/Æ6Ãl0ÃðÊ(Ã0¨3ÃÀx7Ã`š4Þ6ÃàØ4ð3àË1à¿3ðÈ8Ã@í.Àî3Ã33Þ2ÃpV1à ì6Ãr/Ã0O-ö2ÃPê5ÃPð4ÃÐÛ-ÃÀ–2Ã@<ÃP©+ð/Ã@R3ÃQ.Àq3Ã0+3Ã0º0ÃÎ.ÃpV1à {4Ã06Ã!6à ø4ÃÀõ7ÃàI7Ã05Ã`Ž6ÃÓ>Ãp?Ãý;ÃÐì?ÃP1?à¡8Ãb<Æ:àú>Ã`v:Æ:ÃP¢AÃ`ÉAÃàCÃà´:ÃÀï8ÃÐ:Ã0*HÃÐEFÃwCð†CÃ0TAÀ DõCðDà EÃÀ¹AÃà„BÃ0ËBÃ0TAÃàlFõCÃ@cEÃð:@ÃPCÃð@?Ãð:@ÃÁEð’AÃð(CÃPFà ?>ÃÐIÃàBÃÐÚBÃà®;àô?ðýDÃ`"Hð@À¦?Ã@iDÃP7>ÃÐò>ÃàBÃPDÃÐi@ûBÀ|FÃPCÃ0BDÃ,EÃà„Bð'>Ã`“JÃPûGÀpHÃ`Õ?àq@ÃPœBÃð¥CÀ/>Ã0ËBà c8Ã0ã>À¦?ÃP´>ÃÐæ@ÃP¨@ÃpäCà ¼>Ã`í;ÃP„FÃ0é=ð!?Ã`Û>Ã`"HÃ`Õ?Ã`FBÃÁAÃÐQDÃà%=Ã@oCÃð:@ÀšAÃ@“=ÃðÉ=ÃAÀCð'>à °@Ã@uBÃ@>Ã\AÃà?à=ÃpêBàq@à EÃ`½CÃÀ­CÃpUFÃpäCÃ06FÃÀHÃ@ìCÃð"DÃP1?ÃÓBÀçIÃð·@ÃÐcAÃмGÃpmBÃôCÃP EÃÐàAÃÙ=à !CÃà?ÃPBÃàœ>Ãð·@Ãpy@Ã0³FÃ=éEðDÃÀ$EÃàBÃp?à !CÃðÃ>ÃPI;Ã0ÑAÃ00GÃ`FBÀˆDÃb@Ãà+<Ã@þ@Ã`Õ?Ãð"DÃ`(GÃ`Õ?ó9ÃàŠAÃð“FÃ`á=Ã`p;ÃÐi@ÃpêBÃ0HCÃ06FÃDAÃð(CÃ@ÔGÃà%=ÃÀÝ;ÃÇ@ÃâFà ¼>ð-=Ã`FBÃp=ÃàBÃÐÔCÃ>ÃÁAÃ@@ÃÐì?àƒ=Ãð:@Ã`«FÃ0:ð@ÃÁAÃàCÃå;àkAÃ0ã>ÃÀË>à GÃð Hà !CÃÁAÃpêBÃ0õ;ÃÙ=ÃÙAÃ=ð?:ÃpðAÃå?ûBðAÃÀ6BÃ?Ãà„BÃP%AÃ`(GÃÐàAÀ/>Ãp‘<Ã`v:ÃðÏ<Ã`p;ÃŒ9Ãpy@ÃÐ ;Ã`v:à ]9ÃÐ<ÃPœBÃ`R@à W:Ãð@?Ã0x;ð¼:Ãà1;Ã`á=Û=Ã0ã>à ?>À¬>ÃP1?Ã`R@Ãð4AÃ` 7à E=ÃðÏ<Ãð:@ÃÀ¹AÃ`í;ÀA;Ãà7:Ãß@À;Ã>ÃÐ9ÀŽCÃp&9ÃÀ×<Ãb@Ã@>ÃBÃAÃPC<à ?>Ã`Ï@À7Ãà Aà¡8ÃÐ¥6ÃÀÅ?ð9;ÃÀB@ÃÐo?à ¶?ÃÀé9ÃË5àî@ÃPÌ:Ã`R@ÃàxDÃð±AÀ7Ã0NBÃÀÃЙ8Ã@¥:àú>ÃàŠAÃÐ<ÃÀT=à‰<ÃÀr8à K<à K<Ã÷8ÃpgCÀ²=ÃÀr8à ò5Ã@½6à;Ã0`?ÀÄ:ÃÀË>ð?:à à8ÃÐ:Ã`ˆ7Ãh;ÃÐ:Ã÷<ÃÁAÃPº=àB3ÀÊ9ÃPº=Ãp¯7à Â=Ã0û:Ãß@ð¼:ð3<ÃÍ?ÃÀû6à ]9ÃàI7Ãp‘<Ãp&9ÃV>Àâ5Ãз3ÀÖ7í:ÃPê5à­6ù8Ã0õ;ðÔ6Ãå;ÃÐ:Ãñ9À¬>ðK8ÃÀ`;Ãp\0Ã@«9Ã4ÃÐ:Ãb<Ã`¦2Ã<8Ã07ÿ7à¿3à­6à 6ÃðÏ<à§7Ã`ç<ÃЇ;ÃàÞ3Ã` 3Ãp,8ÃB7Ã0û:Ã`v:Ãn:à Ú9ÃÀŠ4Ãð‚4ðÈ8à:Ãà@ð'>Ãp¯7Ã@Ã5ÃPs4ÃPg6ÃÀN>Ãñ9à 2à65Ãàa3Ã7ÃЙ8àT0ÀÖ7ÃП7Ãp86Ã0%4à ò5Ãà=9ÿ7Ãðˆ3Ãàê1Ãðó6ÃÀ¢0à þ3ÃÀ–2Æ6Ãðù5Ã@d0àN1àÝ.Ã07ÃÀr8ü1Ãð”1Ã`#3ÃE0Ãh;ÃàC8Ã],Ã0¨3ö2Ãh;Ã0r<Ãt9Ãðp7À.àÝ.à Ô:Ã@½6Ãðç8Ãp,8Ã!6à9Ã'1ÃÀ5Ã`ù9Ã@R3Ã0º0ÃP0Ã0¢4Ã0¨3Ãt9ÃE0àË1Ã`¦2ÃÐ@2ÃP2Ã@v-ÃÐ8Àâ5ÃPg6ÃPØ8Ã4àÅ2à 4+ÃðŽ2à¿3à 3à :Ãðÿ4à “0Ã0–6À7Àâ5Ãð‚4ü1àB3Ãp<Ãàö/ê4Ø3ÃÀ¢0ð/ÃPs4à u5Ã@.9Ã@:7à 3Àè4Àq3Ã69ÃÀ3Þ6Ãày/Ã@+Ãàö/ÃÀ„5ÃàU5à o6Ø3Ãp\0àr+ÃàI7Àw2Àƒ0ÃPê5à06Ãb<ÃàÌ6ÃŒ5à 2Ãph.ÃÀœ1Ãðd9Ãh;à {4Ã`4Ãã1Ã0+3ÃPö3Ã@(:à¿3à {4ÃE0Þ2ÃpJ3à 1Ã33ÃpD4ÃPÞ7Þ6Ã`ˆ7ÃPÌ:à /Àk4ÃÐÃ1à Ô:Ãðó6à {4Àâ5Ãн2Ã0À/Ã@^1Ãp£9ÃŒ9Ãðó6à¡8Ã@Ã5ÀÄ:à æ7Ãð¸+Ã0¢4ÃàU5à ø4ðà4Ãðÿ4Ã@48Ãðù5Ã0–6Ãб4ðo2Ã÷<ÃàÀ8Ã`í;Ã$<Ãà%=Ã`¦2ÃÀl9Ãà1;àN1Ãf1ÃpÇ3ÃÐ9ÃÝ2ðo2Ãp»5ÃÀ2Ã0+3ÃpÇ3Ã`Ž6ðW6ÿ7Ã`Ž6ÃË5Ã0ï<ð3Ãðù5ÃÐF1ÃT4à 3Ã7ÃPö3ÃЫ5ÃГ9Ã÷8à Â=ÃÐÃ1ÃÀ3ÃàO6ÃPa7à à8à ]9ä5Ã@Õ2ÃÐ¥6Ã@É4Ã0–6Ã`d=à¹4ÃÀ3ê4ÃÑ4à06ÃÀé9Ã=Ã`”5Ã`/1à$8Ã4Ã@:7ÃðÛ:Ã@Û1Ã3ÃÐF1à*7ðì2ÃPð4À7ÃàÒ5Ã@:7ÃàÀ8ÃH6Ã`Ž6ÃàÆ7Ã@F5ÃÐ ;Ãpü?Ãp‘<Ãðó6à§7Ãp,8ÃÑ4ÃP‹0ÀÐ8Ã’8Ã'5Ãp»5ÃÐ@2à u5ÃÙ=Ã<8ÀM9Ã07ÀÄ:ÃÐ<Ã@½6Ã<8Ã5Ã`6Ã-4Ãð /ðæ3ÃÀ6Ãp>Ãн2Ã@R3ÃÀ`;à§7Ãp27Ãð2ö.Ã0º0àT0Àô2Ã@(:Ã@48Àk4à 6Ã@:7ö2ðc4Ã!2ðK8ÃÀé9ÃpJ3Ã<8Ãàä2ö2ÃÐ¥6Ãà+<Ã’4ÀY7Ã`”5ÃÀõ7ê4à {4Ãàg2ÃÀû6Ã@=ÃÐ(6ÃÑ4Ã0:à æ7ÃП7Àk4à*7ÃÀ„5Ãð‚4ÿ7ð‡.Ã`#3à æ7à à8í:Ã;ð°<ÃZ3Ãðù5Àw2ðÔ6ÃPä6ÃÀû6Ã@É4Ã0–6Ã’8à 3Ãн2ÃZ3ÃÐ.5Àe5Ãà1;Ãàa3Ãз3Ãðù5ÃPs4Ã@R3Ã<8ÀÊ9Ãà7:Ã`í;ÿ7Æ6Ãð2Ã0¢4Ã@<Ã@F5ÃÐ44Ã@X2Ã@á0Ã’8Ã`2ÃÐd,Ãðù5Ãðˆ3à ò5ðÎ7ð¶;Ã$<Ã0:Ã-0ðŸ*Ãr/Ã`Ä-ÃPö3Ã7Ã`6ÃÐÃ1Àq3à c8Ãp:Ã’8ÃðÕ;ö2ðQ7ðÎ7à}>Ãðù5Ãð‚4Ãà.ÃPm5ð]5Ãð¦.Àw2Ãpå.Ã0¢4à 3Àw2Ã’8Ã0%4ÃÀ–2Ã9Ãp&9Ã@@6ÃÀ3Ã012ÃЫ5ÃJ@À¾;À7Ãðd9à65à Q;ÃPØ8Ã@:7Ã0ï<Þ2à*7Ãpµ6Ãàa3Ã0„9ÃðÛ:Ã`ó:ÃP==à¡8ÃPI;à :Ã@";ÃË5Ã@Ã5Ãà7:Ã`á=ÃPU9Ã`‚8Ãà>ÃðÕ;ÃPÌ:Ã`Û>à 'Bð°<ÀÄ:à=à W:Ã`d=ÃH6Ãà´:À7Ãý7ÀÐ8À¾;Ãý7ð3<Ã@(:ÀÐ8ÀÖ7ÃP[8Ã@48Ã\=à È<ð3<ÃÐ8à 6ÃPØ8ÀA;ð¤>Ã@™<Ã0ã>ÃP+@ÀšAÃÐ"7ÃP==ÃÐàAÃ>BÃP1?Ã`ù9àô?Ã@ ?Ã`j<à•:ÀBÃÀT=ÃàÒ5ÃPä6Ã`v:Ã`d=ÃÐ8à65Ãn:Ãà+<Ãz<ÃГ9Ã@L4Ã7À²=Ãp<Ã@™<ÃðR<Ã?ÃÐu>ÃÐu>ç;Ãà%=Ã@.9à 3Ã`v:À;ÃPÀ<Ã@(:ÃЇ;Ã@ ?à>ð3<ÃÐu>Ãp‘<ÃÀÝ;à;ÃŒ9Ã’8Æ:ÃBÃÀÝ;ð3<Ã0~:à ¼>ÃàŠAÃà7:ÃÀr8Ã7ÀÜ6ÃpsAà ]9Ãð2Ãp=Ãn>Ãà¢=Ã`^>Ãp—;ð÷EÃÐi@ÃðÕ;Ã0ï<Ãà1;Ã÷<ÀÄ:Ãà¢=ÃPU9Ã0:ÀM9Ãå?Ãp :Ãà´:Ã07ÃЇ;ð!?ÃÐþ<Ãðd9ÃðL=Ã0r<Ã0ï<à žCÃÀË>Ã0„9Ã@½6Ã@:7ÃÀx7ÃП7ÀÄ:Ãàœ>ÃÐ9à>à*7à­6Ãðí7Ãðp7Ãp=ð¼:Ãà=9Æ:à ¶?ÃÐo?Ã69ÃPÒ9Ã@½6Ã@™<ÃÐ ;ð¼:Ã@ ?Ã0~:ÃPö3Ã0é=Ã0ï<Ãð^:ÃÀÑ=Ãp=Ã0õ;ÃÀ¿@Û=Ã`|9ÃÀ–2ÃÀï8Ãà–?ð'>Ã05ÃPI;Ã`d=ðÔ6Ãß<Ã8CÃn:ù8à;ÃÀû6ÃÀ~6ó9Ã;À;<Ã@:7Ãñ9Ã@«9à ]9Ãà–?Ã0OÃ00GÃðcNÃÐÈEÃÇDÃÀÑ=Ãð±Aà Q;à È<à 3@ÃŒ5Ãб4Ãpµ6àâBÃÀé9ÃVBí:Ãð^:Ã@™<ð¶;à Î;ðK8Ãå;ÃÀÝ;ÀA;Ã?1à¹4Ã`#3àË1ÃB7Ã`‚8ÃÀ6Ãß<Ã0Z@ÃPð4ÃÀ`;à ò5à Ú9Ãð·@Ã`Û>à Ô:ÃDAÃ>Ã0û:Ãp;À¸<À;À;Ã0õ;Ãt=ÃV>ç;Ã0l=Ãp;Ã@>ÃÐi@Ã`Ï@Ã0HCÃ0ï<Ãz<à•:Ãå?ÃÀÅ?ÃÀr8ÃwCÃÀ­CÃÐWCà ªAàô?Ã`^>ÃP¨@ð¶;ÃÀl9à E=à=à§7ð@ÃÀï8à>Ã@=á<ÃÐø=Ã,EéEÃ>BÃP¢AÃ8Càƒ=ÃJ@ÀŽCÃ`LAÃÐQDÃ`½CÃÐò>ðñFÀBàô?ð?:Ã@Ÿ;Ãð:@à}>ð@À”BÃÀH?Ã`d=ÃÀ¹AÃpmBÀAÃPÌ:Ãë:Ã@@Ã`·DÃÐì?ÃÀT=Ãp£9Ã>ð'>Ã@oCð CïDÃBàú>ÃÐ<à ¤Bàú>ÃÐø=ðŒBÃpÒFÃà@ÃP¢AÃ*;Ãà´:À¦?à›9Ãð@?ÃÀH?Ã@Ÿ;À¬>Ãà+<Ãý;Ã@<À¸<ð˜@Ã`|9Ãàœ>Ã`v:àú>ÀCÃÐu>ÃÐì?ðÎ7À/>À¬>ÃÐu>Ã7Ãðp7Ãp=Ãà@à 3@Ã`Õ?ÃP´>Ãð@?ù8Ãp‹=Ã0:ÃpsAÃPÀ<ÃÀH?À¦?ÃÐu>ÃPO:à ]9ÃðX;ÃpmBç;Ã`|9ÃPÌ:àkAÃà@Ãà7:ð¶;Ãà AÃÓBÃDAð'>ÃAð°<ÀÄ:Ã*;Ã0r<Ã0¿Dð-=Ã07ÃÐWCðAÃPBÃPg6Æ6à W:ÃÐ:Ã0 8Ã@“=ð?:ÃPBÃà¨<àw?ÃPÌ:Ãà+<à=ÃPÀ<ÃÓ>Ã>Ã@F5ÃpÁ4ÃÀr8Ãà–?Ã`X?Àâ5ðE9Ã`5Ã0œ5ð¤>ÃÐþ<Ã8Ãp :à È<Ãp<Ãp&9ÃðR<ð?:Ãp—;à :Æ6Ã09ÃðÛ:àô?Ãå?ÃÀû6ÃÐ8Ã;Ã;Ã69ÃÀr8Ãp86ð]5Ãp;ð-=ÃÀË>Ã=Ã69Ãpü?ÃàŠAÃà+<ð-=Ã`|9ÃàC8Ã@F5ÃÐ9ÃP1?Ãp=ÀšAÃ`8Ã0û:Ãp¯7à u5Ãà%=ÃÀÅ?ÀA;ðÈ8Ãà¢=ÃЇ;ÃГ9à‰<ÃÅ6Ãp:à ì6à Ú9ÃÙ=à¡8Ã0³FÃð½?Ãp£9Ã0é=à$8ÃÐ8Ãðí7Ãà¨<ÃÀé9Ã0¢4ðo2ÃpÇ3ÃPê5Ãà7:Ãðá9Ã@>Ã0r<Ãà1;à Ú9ÃðX;ðK8Ã@F5Ã`”5à06ÀÐ8Ãñ9Àô2Ã`ç<Ãð‚4Ã$<ÃPÆ;À1À.Ã`ù9ð'>ð]5ÃÀõ7ç;ÃpÁ4Ãðd9Ã@“=à¡8Ã@¥:à È<Ãp&9Ãðç8Ã0œ5Ãë:ðÈ8Ã@½6Ãðj8à Q;Ãðí7ÃÀõ7ÀÐ8à :à <à9À0Ãx.ð]5à W:ÃÐ8à‰<ÃàC8Ãp=Ã` 3Ãp»5ÃP…1ÃÐ:Ã@½6à›9Ã`v:ÃàC8ð]5ÃPÌ:ÃÀ`;Ã@Ã5à c8ÃË5ÃÐ.5Ãå;Ã@:7Ã`ó:Ã`8Ãðÿ4à06ÃÀ~6à Ú9Ã@Õ2ÃðÛ:Ãðç8à þ3à i7ÃÀû6ðÎ7à c8ÃPU9ÃPÞ7à¡8ÃÀr8ðÚ5Ã@±8ÃÐ¥6Ã$<Ãðd9Ã09à ]9Ãý;à Ú9à;ÃðX;ÃðÏ<à*7ÃPÞ7Ã0%4ÃàÞ3Ã@Ã5Ã4ÃП7Ã@Õ2ÃP…1Ã'5Ã@Ã5Ã’8ÃðÕ;ÃðÛ:Ã`”5ÃPä6à i7à Î;àf-à$8Ãàº9ÃPÒ9à*7ÃŒ5ÀÜ6ÃÀ 4à§7à:Ãðá9àÝ.Ãp>5ðÎ7Ã0~:ðÎ7Ã05Ã`²0à ".ÃpV1ÃÐ@2ÃPg6Ãp£9ÃðL=Ãðÿ4ÃÐ9ðo2Ã0~:ÃÀf:Ãðˆ3à§7Ã` 7Ã@.9ÃPÞ7à$8Ã0®2Þ6à à8Ã!6Ã@½6Ãб4ÃÀ1à 3ÃPð4ù8ÀÜ6Ãн2ÀY7ÃÐ:Ã3Ã33ÃÐ¥6ÀM9Ã07Ã@.9à :Ã’8Ãàä2ð{0Ã` 3Ã7ÀÖ7Ã@:7à<4ðK8Ã07ÃГ9Ã07ÃÀ6Ã`6ð¼:Ãз3Ãt9Ã4ÀY7Ã05Ãð|5Ãpt,Ãp,8ÃPð4ðÔ6ÃÀã:à ‡2Ã0–6à ì6Ã`”5à Q;à Ô:ð{0ð?:ÃÀx7ÃT4Ã69Ãz<ðÚ5Ã!6ÃÐ:3à¿3Ã07ÃàÌ6ÃPÌ:Ãðÿ4Ã@Ã5à 3Ã@Ï3Ãp‘<Ø7Ã0„9Ã!6à§7à$8à 3ÃÐ ;Ãàê1ÃpJ3Ãp,8Ãðí7ÃPê5ÃÀ`;à 3Æ6Ãðv6Ã=à}>Ã07ð]5Ãp86Ãà[4ÃðÕ;Ã0 8ÿ7Ã@F5Ã@R3ÀÖ7Ã@Ã5ÃPÌ:Ã0ÑAÃPU9Ã0:ÃàÀ8ð .Àe5Ã07Ã07Ãpå.à 2ÃPy3à¿3ð/ÃÀ¢0ÀÖ7Ãà1;ðE9ÃàO6ÃP2ÃÀõ7ÃÐ44ÃB7ði3Ãp,8ÃB7Ã@:7ÃÑ4à à8ÃàI7Ã@:7ÃÀZ<Ã@48àÅ2Þ2Ãà,à`.Ã4ÃÀû6à ò5ÃÀT=ÃàÀ8Ã`4ÃÐ@2ÀÐ8Ã@«9Ãà[4ö.Ã@:7Þ6Ã@Õ2àB3ÃÐ:3Ã`Ž6à§7Ã`”5Ã`50ði3Ã0%4ÃÀ 4à 3ÃPð4Ãã1ði3Ã0®2Ãàð0Àk4Ãý7Ãð#/ÃðX;Ã0C/à ™/à ø4ÃàÀ8Ã`#3ÀÖ7Ãð^:à;Ãå;à à8ÃðÛ:ÃŒ5Ã`ˆ7Ã@±8Ãàê1Ã@Ï3Ã@“=Ãã1ÃÀõ7Ã0~:à<4Ã0~:ÀY7Ã07Ã@<Ã0r<Ãà¨<à;à ]9Ã0¢4ÃÐ8à•:ðÚ5à Î;ÃV>ÃÐ]BÃðF>ð°<à ?>Ã@É4Ãý7à c8Ãà®;Ã`ÿ8Ã`v:ð@Ãp;Ã0û:ÃÀZ<à=À‚EÃpy@à;Ã0l=Ãp‘<ÃÐø=ÃH6àô?Ã`ˆ7ðW6à=Ã0~:ÃЙ8ÃÐø=Ãt=Ãp—;ÃÓ>Ã07ÀA;Ãàœ>ÃðÉ=Ãð^:ÃÀã:ÀG:Ã@½6à‰<ÃV>Ã0ÑAÃÀ`;Ã9ðo2Ãp—;ÃÐ<Ãp&9Ãàa3Ã07Ãn:Ã0ã>Ãp…>ð˜@Ãà´:à :ðÈ8Ã`ˆ7à Â=ÃB7ÃÀ~6ð’AÀ/>ÀA;ÃPI;Ã`X?ÃðÛ:ÃàBÃ0 8ÃÐ<à Î;ÃÀ³BÃ0é=Ã`á=Ã`j<à}>ÃÀZ<Ãp,8ÃP´>Ãà+<ó9Ãà%=Ãå;à=ÃP7>Ã@>à:Ãàœ>Ãp>ö2ÃÇ@à Ô:Ãb<Ã$<Ã0~:Ã@‡?à K<ÃP´>Ãà+<Ãp,8Ã@«9ÃÀé9Ã@.9ð-=ÃH6Ãàº9Ã@:7Ã@«9ÃÀ`;ðÂ9ÃBÃ$<Ã0õ;ð?:Ã@@Ã@«9Ãå;Ã@‡?ÃÀB@Ã`í;ÃÀû6Ã`j<ÃÀf:Ãðv6Ã`|9ÃPÌ:ÃPO:à›9ÃÐþ<Ãð½?ÃAÃ@<Ãå?ÿ7Ã`j<Ã07Àk4ÃЇ;ÃÐ:ÃPÞ7à¹4à ]9Ã`ù9Û=Ãà7:Ã9ÃЇ;À¦?ÃàBÃ`ù9Ã`8Ãp¯7ðÂ9àèAÃÐ ;Ã$<à K<Ã0f>ù8Ã0 8à§7Ã÷<ÃаIÃp©8ÃV>Ãà–?ÃPs4À¦?ÃðÕ;À/>Ã@ ?Ãt9À;ðE9Ãðù5à*7à9Ãð^:Ã`‚8ÃП7à i7Ã`p;ÃPC<Ãà?à>Ã`ÉAÃ7Ã0û:Ãð·@à Ú9ð-=ÃàO6ÀM9É@à*7ÃàÒ5Ã`ó:à;ÃPÌ:ð?:ÃÍ?ÿ7Ãð 3ÃàÀ8Ã@«9Ø7Ã` 7ÃЙ8Ã0õ;ÃðÃ>Ãp&9ðE9Ã`ç<ð°<ÀA;ÃÀÝ;Ã÷8ÃÀÑ=ÃÀB@à ]9ð¼:ÃðR<ÃÀ`;Ãp,8à;Ã@«9à Ô:à ]9Þ6ÃÀl9ÃP´>à•:Ã9Ãà%=Û=Ã@:7ÃàO6ÀÜ6Ãð /ÃpJ3ÃÀZ<Ã3Ã<8Ãp :Ã@(:àƒ=Ãñ9Ã@<ÃðÏ<Ãà Aà Ú9ÃП7Ãp£9ä5Ãp :À;<Ã0é=Ã7à 3ÃðL=à ]9ÃЇ;Ãà¢=À7Ã`X?ÃÀZ<ÃÀé9Ã8ÃPI;ÃÐ¥6ÃÐæ@Ã0l=Ã`ù9Ã0Š8à :Ãð 3ÃðÏ<ÃГ9Ã`ˆ7ÃPÞ7Ã?1à06Ã0r<à;ÃPÞ7àƒ=Ã@Ÿ;ÃŒ9Ãð^:Ã`ù9à06ÃPä6Ã@±8ÃPm5ÃÀû6à Ú9ÃÀT=À7ÃЙ8Ãñ9ç;ÃÐ9Ã@Ÿ;ÃPm5à›9ÃPÆ;ÃÀx7Ã0Š8ÀY7Ã@±8ÃÓ>ÃÀl9Ãh;à c8à$8ÃðX;Ã<8ÃÀÝ;Ãz<Ø7Ã`4ÃЇ;ÀS8à 2ÃpÇ3Ãz8ðÈ8Ãð4Ãl0Ãp;ÃPa7ÃPÒ9Ã@";à c8à¹4Ãp27ÃŒ5Ãðp7ÃÅ6à Î;à È<Ãз3ðÔ6Ãà´:à06ÀÐ8Ã0–6Ã@.9ÃPs4à u5Ãp‹=ÃPU9ÃPÒ9Ãð^:Ã`ù9Ãà7:Ã`‚8ÃŒ5à þ3Ã’8ÀÊ9Ã` 3Ã`‚8ÃÀ6À_6à Î;Ã33Àâ5ÃÀû6ÃÀ„5ÀÜ6Ãðp7ÃàÌ6ü-ðÈ8Ã’4ÃÐ9Ãà=9à§7ÃÐ ;Ã`‚8Ã07à ì6ÃÐF1ÀS8ÃðL=ðæ3ÃðŽ2ÃГ9ðÎ7Ã@";Ãp86ÃÐ^-ÃT4Ãp©8Ãàð0Ã012à¡8Ã@:7Ã'1Ã'5à*7á<Ã`2ðÚ5Ã`5ä1à ò5à æ7Ã@48à i7Ã`”5àN1Ãðp7Ã@Õ2Ã@R3Ã@=Ã`4ÃÀ~6Ã69Ãpµ6Ã33Ãб4Ã×3Àw2ÃðŽ2Àƒ0Ã@Ã5à Ú9ÃP==Ãàº9ÃPU9ÃT4ÃÀœ1ÃÀx7à$8à¹4à;ÃPØ8ÃàØ4Ã07ÃÀ–2Ã@:7Ã@R3Ãé0à¹4Ã@á0Ãð#/àã-Ãpë-ðu1Ãðí7ÃÐ8Ã`ó:ð9;ðW6Ã@X2à<4Ãàa3ÃÐF1ä1à ø4Ã`¬1À0à E=Ãpµ6à 3Ã` 7ÃÑ4ÀÜ6Ãà[4Ãp»5À›,ðQ7à 9?Ãàº9ÀS8à K<Ã@:7ÃPy3ÃpP2ÃPê5Ã<8ðo2ê4Ãðd9ðì2Ã@.9Ã`ÿ8Ã07Ã@Û1ÃpP2àN1Ã0C/ÃÈ/ÃП7ü1ÃPä6Ã` 3ðò1ÃÀ~6ð]5Ã05ÃÐL0Ã7ðc4Ã’4Ã0r<Ã@Ã5Ã0„9Ã0Š8à 0Ãðš0Ã0+3Ã0r<Ã0û:à¿3Ãp©8ÃÅ6Ã`|9ðà4ÃpÙ0à<4à§7à c8ÃPê5ÃP1ÃT4ÿ7àB3à c8ÃÐ{=ÃPm5ÃPä6Ãý7Ãàa3ðø0Ã@X2Ã@á0ÃÐ44Ã÷8ðæ3Ãн2Ã0¨3Àe5ù8ðK8ÃàC8Ã`6Ã3ÃP£,Ãð2ðQ7à<4Ãð2Ã@á0à65ÀY7Ãð^:ÃàÞ3ÃÑ4à<4Ãз3ð/ð/ÃÀ¢0Ãз3Ãà-Ãðd9Ã07Ãp¯7ÃT4ä1Ãð”1ÀS8ÃH6Ã0U,ÀÐ8Ãý;Æ6à65ÃÀ¨/ÃÐ@2ê0Ã07Ãày/à 6Àe5à ‡2ÃÀŠ4ÃÀ 4Ã0+3Ã`4ÃàÀ8ðK8Ã'1à 1Ãàð0ðc4Ã06Ã`Ê,à ".Ãå;ÃPü2Ã`š4à:Ã0¢4ÀG:Þ6à*7ÃÀ3Ãp£9Ãp86Ã`ó:ÃÀ`;à ò5ÃÀ5ð{0Ã`¦2à ‡2Ãð‚4Ã0:Ãp»5Ã0:Ãàa3ÃPê5Àî3Ã0I.à*7Ãз3ÃÀ6àH2ÃK+à¹4ð]5À7ÃpP2ÃK/ÃÐF1Ã`Ä-Ã0´1ÃB7Ã@½6à9Ãn:Ã0´1Ã@á0Ãà[4Ã’8ÃPä6Ãp¯7ÃÀ„5ÃÐj+Ã’4Ã'1Ã`)2àË1Ãð).à ì6ÃÀ6ÃÐÉ0ÃÀ¨/Ã3ÃZ3Ø7ÃP‹0ÃpÁ4Ã`50ÃÀ5Ãðÿ4Ãн2àB3Ã`¦2Ø7Ãé0À.Ã@Ï3ÃP2Ã`¸/Ãpß/Ã33Ã`2Ãз3Ã`¸/À}1Ã@^1à­6à 1Ãpë-Ã0¢4Ã0œ5Ã@:7Ã@·7ÃE,ÃÐ.5Ãp¯7ÃàO6Ã@ù,Àú1Ã!6À /À•-ÃЂ'ÃðŽ2ÀÊ9ð-ÃpV1ÃÐL0à (-ð/à 3Ã0´1Ã@v-Ãðù5ÃÐÃ1ÃpÙ0ÃPÞ7Ã0I.Ãp\0à­6ÃP‹0Ã`¦2ðò1Ã`)2Ã0œ5ÃÀ„5ÃÂ0Ã@¦%Ãpž%Ãã1Ãàs0à 0Ãàü.ð™+Ãðˆ3ü-ð¥)ÃÀ7-à ø4ÃÐÕ.ü-à 1Ã`;/Ã4Ã~-Ãð0ÃÀ+/ÃÐR/Ã@í.À­)Ãà.Ãð¦.ðo2Àú1ÃÐÉ0Ã×3ÃÐ(6Ã@Û1à 2ÃÀ´-ÃpÍ2ÃÀõ7ðo2Ã'5Ã0C/Ãz8ÃÀ 4Ãã1ÃðŽ2ÃP‹0Ã0œ5Ã],Ã@L4ðì2ÃP¯*Ãpñ,ÃP1Ã×3Ã`/1Ã`Ž6à 3ÃÀœ1Ã@í.ÃPs4à 2Ã@á0ÃÎ.Ã@R3Ã` 7Ã`¬1à 2ÃP8)Ãõ.ä1Ãàð0à /Ã!2ÃP0ÃÐá,Àw2ÃÀ3ÃÀ´-ÃP.ÃÀ=,ÃÐX.Ã0O-à .,Ãàm1ðQ7Ã`¬1ÃÎ.Ãàü.ÃЫ5ÃÀ+/ÃPê5Ã@É4Ã`²0àÑ0à ø4ÃðŽ2à þ3ÃÎ.Ã×3ÃPg6ÃÐÏ/Ã@L4à 1Ã0´1à 3ð/Ã0C/Ãð 3à Ÿ.Ã`#3ÃÐ@2àT0Ãб4Ã`4Ãà+Ã`A.Ã@^1Ã-4ÀCÀ}1Ãàm1Ãpå.ÃÀ=,ÃÀº,ÃÐd,ÃpV1Ã@É4à ‡2àT0Ãð1Ãàö/ÃpÓ1Ã'1ÃpÙ0À0Ãpë-Ã@j/Ãð4ÀM9ÃÐá,ðu1àZ/Ãr/ÃpÁ4À.àõ*Ãp27ÃàÒ5ÃpÇ3Ã0´1Ãàa3à þ3Ã071Ã0C/Þ2Ã@ó-ÃÀõ7ð]5ÃP1Ã3Ã`A.Ã`4Ãðÿ4Ãð#/ði3Ã@í.à­6Ãàg2à “0Ãl0Ã9.ð/Ã'5Ãð2Ã0[+ÃÀ´-àZ/ð/Ã`50Ãp÷+Æ6ÃpÓ1ä1Àq3Ãð0Ãl0Ã@X2ÃpV1ÃÐÉ0ÃP2ð]5Ã?1à­6ÃPs4ÃàO6àH2ÃÀ¨/Þ2Àw2Ã’4ÃÀ1ÃPy3Ãðÿ4ÃÀ¢0à<4Ã×3ÃpÁ4ÃÀ3à×/à «,ÃpÁ4ÃÐ44Ãph.ÃÀ¨/ÃZ3Ã@ç/ÃÀ2ð/àã-Àk4ÃPð4à¹4Ãph.Ãr/Ã@R3Ã`A.Ã-0ÃÈ/Ã*Ãà[4ð-=ê4Ãf1Àk4ÃÀ3Ãpb/Ãp>5Ã÷<ÃðŽ2Ãн2à 0À0Ãб4ÃÐX.ÃÐF1Ã@É4Ãàs0à i7ÃÂ,ÃPy3à 3ð/Ã`/1Ã@(:Ã0%4ÃÀ´-ðu1ðÎ7ð¼:Ãã1ÃàÒ5ÃÐÃ1à 2ÃÀ´-Ã`#3à<4Ã@@6Ã33Ã0–6ÃP/ü-ðc4Ã4ðà4àH2ÃpV1ÃZ3Ãý7Ã0¨3ÃpP2Ã!6Ã`Ö*àZ/àB3ÃpJ3Ãð¦.Ã@Ã5à¿3ÃPð4à¿3Àƒ0ÃP2ÃðŽ2Ã0º0Ãðá9à ‡2Ãð 3ÃÝ2Àú1Ã`š4Ã@í.à «,ðì2Ã`50Ãf1à­6Ãpµ6ÃP—.Ãð”1à {4ÃË5ÃP1Ã0[+Ã`²0Àè4ð/Ã@Ï3ÃðÛ:à×/Ã0¢4ðo2Ãï/Ã@Õ2ÃÐ44Ã071Ã8ðK8à 3Ã`5à “0ÃÐÉ0à×/à 1ÃÀ„5ði3Ã`#3ÃPy3Ã`”5ÃP/Ã?1Ã0C/ðæ3Ã0a*àï+Ãð0Ã071ÃÀ7-Ã@^1ÃpÍ2àõ*ð{0ä5ÃÐ8Àô2Ã` 3Ã’4ÃZ3ÃpJ3ÃÀ5ÃЫ5ÃpÍ2Ã0®2ÃÀ6Ãð1Ãà+Ãé0ÃàØ4Ãà.ÃPö3à 3Àq3ÃÐÃ1Ãày/ÃÐd,ÃpÁ4Ã@Û1ÃZ3Ã0=0Ãà,Ã33Ã@í.ÃÀ¨/Ãàä2ÃPs4ð+ÃÀ7-Ãн2ÃÐ¥6à ø4Ãðš0à L'Ã0I.Ã`¸/À**Ã](Ã@ç/Ãð/-Ã@á0ÃÐL0Ãà…-Ã`¦2Ã@Ã5Ã’4ðu1Ã0I.àã-à “0Ãð/-Ãr/Ãr/Àe5Ãàê1à ".ÃÂ0à 3À.Ã,À­)Ã@j/ÃZ3ÃÐá,Ã`Ð+Àƒ0ðþ/À0Ã0À/Ãpë-Ã-0ÃpJ3Ã0º0Ãp€*Ã0O-Ãàü.ÃÐ.5Ãf1À$+Ã`M,ÃÐR/Ã`Ä-à ½)ÃÐá,àZ/ÃÀï8ÃÐR/àË1Ã4à 1ÃÐF1ÃÀ2Ã`Ð+Ã0m(Ã~-Ã~-à~)ÃP2*ðø0ÃÀœ1ÃÐL0Ã@ó-Ãp\0Ãð¦.ÃÀÀ+Ã`Ö*ÃÀ®.àÑ0ÃÔ-ð/ð‡.ÃÐ &Ã`M,Ã0Æ.Ãu(ð"*Ãà.Ãð¦.Ã`¸/Ã`¾.Ã`Ö*ÃÀI*Ã0C/Ã0Ø+ð¥)Ãp†)Ã@(Ãï/ê0Ã@)Ã`Ä-ÃZ3ðø0Ã@F5ÃÀ3Ã0[+Ãðó6à Ÿ.Ã],ÃÐç+Ã`²0ÃÎ.Ã],Ãpt,ÃÂ,Ãà-ÃP/Àâ5Ã0´1ð,ÃÀÀ+ÃP&,àZ/Ã-0Ãì)ÃP.àf-Ãã1ÃÐ^-ÃP»(À,À /ÃÐá,Ã0O-Ã`S+ð½%à ø4ÃPy3ÃÀœ1Ãðˆ3àé,ð-ÃE0ÃP¯*Ã@ˆ*Ãàð0Ãàm1àË1Ã92ÃðS'Ãï/ð/Ã@ˆ*ÃK+à 2Ãpb/Ã'1Ãpt,ð/ÃÐÉ0ð{0à .,Ã`Ä-ÃÀ´-Ã0Æ.Ã@ó-Ã`;/Æ6àH2Ãà.Ã0Ò,Ãû-àÝ.Ãpå.Ã@^1ÃÎ*ÃP -À.ÃÎ.Ãà,à /Ã`;/Ã'5à 1ðà4ði3Ã`;/ÃP£,ÃÀ®.ÃÐç+Ã3ð/Ãð¬-ÃÀ=,ÃE0Ãð0À,ÃE0ÀÜ6ÃÂ0àN1Ãé0Ã@ˆ*à :*ÃÀÀ+ÃÀ3Ãð²,à¿3ÃÝ2Ã33Ãð0ð3Ã92à ‡2à /àl,ðQ7ÃàÌ6Ã09Ã`ó:ê4à65Ã0+3ÃpD4ðø0Àk4Ãp>5ÃÀ~6Ã0:ÃP[8ÃàO6ÃPa7ÃàI7ÀÄ:Ã`‚8Ãf1ÃÀ6ðAà HÃà%=à ¼>Ã5Nà 'BÃ@™<Ãð(Cðª=ÃЇ;ÃÐ9à +ÃQ.Ãà.ÃPö3ðW6Ã@¥:Ã@ ?Ã`|9Ã@™<Ãà@Ãà´:Ã>Bð?:Ã0û:Ãðó6à æ7Æ6ÃŒ5Ã0f>Ãý;à¡8Ã@·7Ã`4ÿ7Ã0º0Ãp27ÃË5ÃÀ`;ÃðÛ:Ãð|5Ãp»5Ãà[4ÃàÆ7á<ÃàI7ç;à °@ÃË5ÃT4à æ7ÃpÍ2à à8Ã@(:ÃPm5Ã` 7Ã@";Ãë>à§7Ã0TAÃðX;Ãðí7à•:à ì6Ã@Ã5Ã5Þ6Ãb<Ã*;ÃàØ4ðK8Ã<8ÀM9Ã`ˆ7Ãñ9Ã0:Ã@.9à K<Ãð4AÃ*;à­6ÃЙ8ÃðÛ:Ã@Ÿ;à Î;à :ä5ÃÀ`;Ã`ç<Ãp©8ÿ7Ãà+<à*7ù8Ã@(:ÃPÌ:Ãà=9à ò5Ã@¥:Ãñ9à ì6ÃЙ8ÀÊ9Àe5à³5ÃðR<Ãðj8Ã0¢4ÃÀ¢0ÃÀã:Ãðp7ÃàO6Ã0„9ÃÀ1.ÃÀû6à*7ÃðL=à à8à­6ÃPa7Ã`ˆ7à 6Ãp86ðo2Ã0–6Ã`”5ÃÀ6À7àZ/Àk4ÃÐÕ.Ã`6Ãn:Ãë:Ã`š4ÃPa7àË1Ã`¦2à Î;Ãh;à ò5ÃŒ5ÃÀ 4À_6à 6ðÚ5Ã69Ã’8Ã`8Ã@>à06Ã@É4Ã0´1àN1à .,Ãp‘<ÃÀï8à o6ä5Ã8à ™/Ãð 3Ã`6ð{0Ãð‚4ÃÀl9ðÎ7À1Ãàä2Ã<8Àe5ÃÐL0ÃPU9Ã`)2Ã@½6à65ÃÀõ7Ã`|9Ã’8à 3à¿3ÀÊ9à65à ì6Ã0œ5ÀY7Ã@Õ2ÃH6ÃàO6Ãà[4Ãàm1Ãpß/ÃÐ8Ã`Ž6Ãàs0ÃPü2ÃÅ6ÃÀ6ÃPü2Ãàg2Ãp86ÃÀr8ÃT4à 1ÃÀ~6à i7ðà4Ã`¬1Ã@á0à ì6à¡8ðc4ÃB7à­6ÃŒ9Ã0¢4À}1Ãý7ÃPð4ÃP2ÃÐÃ1ÃàÀ8Ã`Ž6ÃPÞ7ÃE0Þ6à 3ÃàÞ3Ã0 8à$8Ã` 3Æ6ÃP[8Ã0´1ÃK/à;ÃÐ"7ÃpJ3ÃÀ6Ã'5Ãz8ÃE0Ãàü.Ã`)2ÃÐ:3ÃPÒ9ÀÜ6Ã`¾.Ã` 3Ã@Ï3Ãã1à 0Ã`¸/ÃpÍ2ÃÀ2Ã05ÃÀ=,À7Ã`4àN1ÃpÓ1À_6Ãàð0Ãàä2Àe5à :ÃPs4Ãð#/Ãð‚4Ã’4à­6ð]5Ã@R3Ãf1ÃÐ:àZ/ÃpP2à65ÃÐ<ÃÐ.5Ãðp7ÃÝ2ÃÅ6Ã012Ã05à ".Àe5ÃÐ¥6Ã?1Ãðv6à c8ÃÐ.5Àú1Ã'1Ã-4Ãðç8Ã`š4à<4Þ6Ãp,8ÃàÆ7Ãp»5Ã05à­6Ã`5à¡8Ã` 7Ã0x;ÃÐ:àH2ö2ðì2Ã0–6ðÔ6Ã@½6à 6ÃPy3Þ2ÃP,+Ã@X2Àq3ÃÐ:Ãð|5Þ6Ã@Ï3ÃP[8ÃÀ 4Ã0=0Ã0¢4Àè4Ã0À/Ã0„9à¡8ÃPð4Ã07Ã3/Ãð|5Ãð 3ÃPä6ð?:Ã<8à ‡2ðW6ÃP‹0ðW6Ã@Ï3Ãp»5Ã9.Ã’4Ø7àB3Ã0I.Ã@í.ÃÀ~6Ãàä2Àk4Ã06à~)ÃÐR/ÃàU5ÃðX;Ãð‚4Ãð0àT0Ã@«9Ã`;/ÃÐç+ÃK/ÃÑ4à<4à o6Àâ5Ã0ã>Ã0x;à›9Ø7ðE9ÃÀï8Ã`ó:ð¼:Ã@{AÃà@Ãð^:Ãë>ÃÐÚBÃÐ{=ÃÓ>ÃÐ<Ã0à Ô:ÃPÆ;À¬>Ãàœ>Ã@{AÃPFÃP EàSEÃ@ìCÃÀ6Bð†CÃpÆHÃaQÃàûCÃwCÃð½?Ã0Z@Ã0ã>ÃàBÃ@WGÀˆDÃpOGÀEÃ`±EÃÐÈEà °@ÃPDÃ0Ý?ÃÀ³BÃÀ³BÃÓ>ÃPŠEÃ@{AÃÍ?Ã`FBÀCà !Càî@ÃHÃ@]FÃÐþ<ÃÐEFÃ@]FãFÃP®?àq@ÃPCÃn>ðnGÃ`:DÃаIéIÀÿEÃÐKEÃP EÃpØEÃPCÃpÌGÃP1?Ãp…>ÃP¨@àÐEà¸Ið CÃ0TAà}>À”Bð¤>ÃÐÚBÃJ@ÃÀ×<Ãh?à Fà DÃpö@ÃPŠEÃpOGÃð"DÃkEÃð«BðDÃP1?ÃPlJÃÀ³BÃð"DÃÀ6BÃÐÔCÃ0NBÃ`±EÃÐ]BÃÀ³BÃðR<ïHÃÍCÃÓ>Ã@@Ã0$IðDà °@ÃP EÃp‘<ÃwCÃÐWCÃh?Ã`FBÃð·@ÀpHÃ0NBéEÃ`±EÃAà @à 'BÃ0Ý?ÃмGÃàûCÃHðBà žCà ŒFÃÀGÃ`@CÃp?ð!?Ãà„BÀvGà žCÃÐæ@Ã?ÃÐQDà @õGð°<à DÃàŠAà ˜DÃ`4EÃÐÂFÃ&FÃpgCÃ0ÅCÃð:@ÃÀÃ0³FÃð™EÃJ@ÃÐì?ÃPÆ;àÖDÃÙAÃJDÃÀÅ?ÃàûCÃÀ§DÃ`X?Ã@øAÃà%=ÃPÆ;Ã`Õ?ÃÀ×<Ãñ=Ãàº9Ã0õ;ÃV>Ãà AÃý;À5=ð!?Ã?à È<ÃÀZ<ÃðL=ðÎ7Ã`Û>à 3@ÃÀÑ=Ã`á=ÀG:Ãp>À”BÃ0~:Ã÷<Ãñ9ÃpmBÃ@àEÃÀÃ0ï<Ãp‘<ÃàrEàÜCÃÀã:Ãn>ÃÐ ;Ã0û:ÃPs4à$8ÃP´>Ã0:Ã<8ðK8à ò5ÀS8Ãp‘<Ãà AÃp…>Ã0`?ÃðÉ=à:Ã@Ÿ;Ã7ÃàÀ8ð9;à ?>ÃPÆ;Ãð±AÃ0×@Ã`X?Ã@þ@Ã`^>Ã0:à Ô:Ãp<ÃPC<ÃpÇ3Ã0–6Ãn:Ãã1Ãå;ÃÐþ<À7ð9;Ã0¨3ÃÓ>Ãà1;à c8À¸<Ã;Ã$<ÃPØ8ÃðX;Ã09ÃP[8à ò5Ã0œ5ðK8Ã0l=ÃÐ"7Ãý7ÃÐ:Ã@Ÿ;Ãðá9Ã`d=Ã@=ÃÀZ<Ãå;ÃV>í:Ã@.9Ã@½6ÃàÒ5Ãð|5ÃÀ³Bð°<ð3<ðE9ÃÀŠ4ÃÐ(6à¡8ÃàÒ5Ã`ó:à ì6Þ6ð3<ð¼:Ã0:à;Ã@";à 3ÃPs4Ãà?Ã@Ÿ;ÃðŽ2à³5Ã`8Ãà1;ÃÀé9Àâ5ÀG:Ãb<Ã`ÿ8Ãp?à ì6Ãn>Ãp…>ÃPº=ÃPÞ7Ãðç8à;ÃPØ8Ãp&9ÃðÕ;ÃÀÑ=À;<ó9à c8Ãt=à c8Ã0õ;ðì2ÃàI7à=ÃP[8Ãàä2Ãà[4Ø7ðÎ7Ã-4Ã×3ðà4Ã@d0ÃÐ¥6Ãà>À¾;Ãà=9ÃPä6ÃPC<à Ô:ÃàÞ3Ãp»5ÃPÞ7à W:ÃðX;Ãðp7à$8à ?>Ã0 8Ã8à•:Ã×3Ã` 3ÃpJ3à E=Ãðù5Àk4ÃP[8ÃàÀ8ðW6ÀY7ÃZ3Ãp&9Ãðá9Ãpµ6Ãñ9ÃB7Ã@^1ÃPä6ðK8Ã@Ÿ;à06ðE9ÃÐ:Ã`ÿ8Ãp :ÃÀ„5ÃP2Ã`4ÃÐ(6ÃPê5ðø0Ã@R3ÃH6Ã06Ã@F5Ø3Ãz<Ãp;Ã0 8Ã0„9Ãà®;ðK8Ã07Ã`4ÃÀŠ4à¿3Ãp&9Ãà7:Ã07Ãt9ÃГ9ÀÊ9Ã012à 1à•:Ã0x;ÃŒ9à 3Ã@Õ2ÃPm5ÃàÆ7ð°<ÃÀZ<Ã`ÿ8ðÈ8Ã`¦2Ã92à¹4ÃÀr8ðo2ÃÐ"7àÅ2Ã07ÃàI7ÃàÆ7Ãðá9Ã7ðþ/ÃÀ6Ã0 8Ãt=à Ô:ÃPI;Ã06ÃÀx7ÀA;Àâ5Ø7Ãp;ÃPð4Ã0–6ÃPä6Þ6Ã09Ã8ÃÐ8Ã0õ;ÃÀN>Ãðš0à u5à æ7Ã-4Ã0=0ÃÂ0Ã`)2ÃPü2ÃPO:ÃГ9ÃÀï8Ã0Š8Ã@L4Ã’8Ã0´1ÃpD4à¹4Ãðp7ÿ7ÃàC8ÀS8ð!?ÃÀ„5ÃPÞ7Ãp‘<Ãn:Ãp‹=à c8Ã=Ãðp7ÃàØ4ð¤>Ã0õ;Ã`ó:Ãà[4à=Ãn:ÃÀï8À#@ÃÀT=ÃÓBÀÿEÃðX;ÃŒ9Õ>Ãý;Ãà„BÃý;Ãð½?àYDÃAÃÀf:Ã9à @Ãð½?ÃÀÅ?Ã`±EÃÐ ;ÀY7Ã`ó:Ã?ÃÍCÃ@ ?à 9?Ãð¥Cà Â=ÃÀB@Ãp?Ãh;Ã`á=ðª=Ã@iDÃð.BÃ`ÉAà Â=Ã0ï<ÃÀÑ=ÃÐ<Ã@.9ÃÐ ;ÃpÒFÃJ@ÃÓ>à}>ÃÐcAÃp‹=á<Ã`ù9ÃП7Ãh?Ã`ÉAÃ0Z@Ãð“FÃ`Û>ÃðGÃÐu>à W:ð¶;À7Ã>BÃàõDÃП7ÃÀl9à E=Ãð±AÃÐi@ÃpsAÃb<Ã0Z@ÀšAõCéIÃ0TAÃp‹=àú>ÃÐàAÃBÃÀf:Ã0é=Ã`p;ÃÀFÃ@‡?À¬>ÃÐ<ÃÐæ@À7ÀY7ÃP1?ð!?À¬>ÃÀÅ?Ã`^>ÃÀÃ0ã>Ã0r<à Q;Ãp…>ÃPÆ;Ãà AÃÐàAð9;ÃÐÔCðª=Ãðj8ÃðÕ;Ãp=Ã`LAÃ07Ã`d=ÃðÉ=ÃÀT=ÀÐ8Ãð·@ÃÐþ<à ?>ÃàC8ÿ7ÃP[8ÃPI;Ãn>Ã33Ãz8Ãr/À7Ãp¯7ÃP==Ã0û:Ãt9Ãð@?Ã0l=Ã0û:Ã>Ã`ù9ðÎ7ÀA;à ¼>ÃÐ9ÃPÞ7ÃÀf:ÃÐ¥6Ã0~:Ã@@6ÃPg6Ã69Ãý;ÃðÏ<àú>Ãð|5Àú1à <à :Ã06Ã`6ÃÀŠ4ÀÜ6Ãà?ÀG:ÃPÆ;Ã0û:ÃÐ"7ÃP[8ðò1Ãn:ö2Æ:Ãp©8Ã@<à­6à*7Ã8ÃЙ8ÀÖ7à Q;à:ÃÐæ@ÃÐQDÃÙAð3<ÃГ9Ãà7:Ã'1ð]5ð°<Ãp&9Ã@=ÃðÉ=Ãp=Ãý;ÃPm5Ãб4ÃÀû6ðà4Ãà´:Ã0ï<ÃÀ¹AÃÀB@Ã`Ï@Ãð^:ðÔ6Ãp86ÃÐþ<à u5à Ú9Ãà7:ÃðÉ=ÃPO:Ø7Æ6Ã0û:ÃPÆ;à ?>ðà4à 6Ãðó6ä5à 6Ã0–6ÃàI7Ã0x;à Q;Ãð4AÃÓ>à K<Ãà®;ÃП7Ãp—;ÃPÒ9À¸<Ã0:Ã`j<Ã05ÀS8à­6à¹4Ã`ˆ7Ãà=9Ãp?Ã@48Æ6Ã!6ÃÀ„5ÃÀ×<ÃÐ ;Ãðd9Ãðó6ÃH6ÃàÆ7ÃÀl9ÃГ9à {4Ãà´:Ãà+<Ãð^:ÃpÇ3à ò5Ã0`?Ã@Ÿ;ÀÐ8à•:Ãß<Ã@½6à:Ã@:7ÃPO:ÃŒ5ÃPg6Ã@½6Ã@48Ã0r<Ã8ÃÀ–2Ã`|9ÃÐ8Ã@=Ã0ã>àô?à Ú9Ãà1;Ãp—;Ã\=ÃðF>Ãà>Ã0¿DÃ0õ;ÃÀË>ÃPU9à Q;ÃЇ;Ã@(:Ã@:7Ã@X2ðÂ9Ãðí7ÃÐ:Ãh?ÃÐ:ÃPÒ9Ã@Ÿ;à u5ÃÐWCÃ@<Ãp£9Ãð2ðà4Ã@F5ÃÀ6ÃP2ÃPä6ÃpÍ2Ãß<ÃPð4Ãð‚4Ã`4í:Ãàa3Ã÷8ÀY7À)?Ã0+3à ‡2ði3Ã@:7ÃÀ2ÀÐ8Ã0 8Ãð|5ÃPm5Ã0¢4ÃÀ 4Àk4ÀÖ7À;ÃP2à K<à Ô:ÃÑ4Ã06Ã@F5Ã’8Ãn:Ãp=Ãp>ÃÐ ;ÃPØ8ÃðÏ<Æ6Ãð /Ãð½?Ã69ðQ7Ã05Ã`š4Ã@F5à;Ãàº9ðK8Ãp;ÃÐo?Ãà[4Ã07Ã÷8Àè4Ãp,8Ãå?Ã0:ÀÖ7ÃЫ5Ã<8Ã`v:Ãb<ÃðL=ðE9Ãðv6À7à o6à<4à06Ãë:ÃЫ5Ã@=Ãà´:Ãã1ÃÀ~6Ã@=à E=Ã@Ÿ;ðÚ5Ã@É4Àî3à 6Ã07Ãp:Ã@.9Ã0 8Ã` 7ä1Ã<8ðÎ7Ãðv6à 3Ãðù5ÃpV1ÃðR<Ã`”5ÃÐ(6ÃPä6Ãà¨<Ã@d0ÃPy3Ãp;ðQ7ðK8ü1Ã0Š8Ãà´:Ãp»5ÃðÛ:Ã-0Ãðí7Ãp»5ð9;Ã@F5ÃB7Àâ5ÃГ9Ãðv6Ãðd9à æ7ÃPÞ7Ã@";à:Ãz8ÃàÆ7ÃpD4ÃPØ8à ì6Ã0~:Ã`|9ÃÐ¥6Ã06Ãà´:ÃàÀ8ÃPa7Ãt9Ã@É4Ã7ÃП7ðW6Àî3Ã@É4ðª=ÿ7Ãð4à*7ÃÀ 4ðc4ÃpÁ4Ã@X2Ã0œ5Ã07Ã8à W:ÃPy3Ã`Ž6ÃÀr8ÃpÇ3Àâ5àÅ2Ãp>5à 2Ã0%4ÃPm5à ‡2Ãб4Ã`”5Ã`¦2à*7Ã`8ÃÀ6Ãð4Ãà¨<à¡8Ã@ù,ÃÐ(6à 6Ã3ÀÖ7Ã3Ã`)2à 2à<4à 3Ã0+3Ãðó6Ã@@6Ã@Õ2Ã@ó-ði3Ãã1Ã`A.Ã@Ã5ð3àT0ÃðÐ'Ãp\0ðà4ÃÐL0ÃP.ö2Ãð‚4Æ6ði3ÃpÁ4Ãx.à$8ÃàÒ5Ãàö/Ãà[4ðu1ÃÐ¥6Ã@á0Àú1Ã’4Ã?1Ã`;/àT0Ã@L4Ã0 8ðò1ÃpP2ÃË5Ã`²0ÃP‘/Ã?-ðò1ê4ÃÀ3à 3à (-Ã0¢4Ãï/Ãð¸+Ã0´1ÀÖ7à*7à06Ã'5Àw2Ãð /à ™/à ™/Ã0Ø+Ãf1ÃÐ(6ÃÀ´-Ãð|5Ã` 3ÃÐÏ/ðQ7Ãðš0à ò5Ã`2Àe5ÃÐ:3À-à ™/ÃЙ8ÃÀf:Àô2Ã`#3à Ÿ.Ãн2ü1Ãà…-ÃÑ4ÃPg6ÃÝ2Ãõ.ð-ð]5ÃÐ¥6Ã0„9ÃPð4ðæ3Ã@(:Ãн2Ã@X2Ãðv6à65Æ6àË1ÃP2Ãàð0Ãã1àB3à ò5à æ7Ã@(:ÃE,ÃÔ-à þ3Ã-Ø7ÃàÌ6ÃP0ü1Ã0®2À7ÃP2Ã4ðì2Ãé0ÃÀ6ðì2Ã@á0Ã@Õ2Ã0´1ÃÐR/Àq3ÃÀ3ê4Ãз3Ãpn-ðò1ÃÀ3Ã@Û1Ã'1ÃP-Àú1Ã@½6Ã`¬1ÃàU5ðà4ÃÀû6ÃpD4ÃŒ5à³5ÃÐ@2ÃÀ+/Ä,Ãp¯7Ã@Ã5Ãðÿ4ðo2ÃpÍ2ðu1Ãp»5Ø3Ã-0ÃÐR/ÃÀ–2ù8Ã0+3ÃÝ2Ã!6Ãz<Ãàa3Ãð /Ãð|5ðÎ7ð/ÃÎ.Ã` 3à 1à ".à ø4Ã@L4àÑ0à “0ÃàØ4Àe5À›,ð/ÃH6àH2ÃÅ6Àe5Ã@j/ÃpÁ4Ã`8ÃÐ(6Ã`ˆ7à ò5Ã0œ5ÃÈ/ÃpD4ÃàÞ3Ãp86ÃÀ1à06Ã`2Ã@:7Ã0:Ã0¨3ÃP‘/ÃÐ(6Ã06ÃP.Ã@·7Ã`|9Ã`š4Ã@±8Ã@(:à 2ði3Àô2ðc4Ã33Ãб4Ã0–6ÀÐ8ði3ÃŒ5Ãp&9ÃÀ7-à 3Àw2ö2Ã0:Ã06Ã@R3Ã@d0Ã` 7ÃÀ3ÃÐÃ1ÃP-ÃP‹0Ãf1Ãð;+à¿3Ã@";à 6ð/à þ3à à8ÃPa7ÃpÍ2ÀÖ7Àe5À7Ã`G-Ãpß/ÃŒ9Ãp86ÃП7ÃpÍ2Ã'5à 6ÃÐÃ1À_6ði3Ã7Ãàð0ðò1Ã`/1ðo2ö2Ã@ù,Ãp\0ÃP1Àq3ÃP[8àÅ2ÃÀ¢0Ã012à­6Ã÷8Ã’4à à8Ãh;Ã`#3Ãð#/ðÔ6Ã0õ;àé,ÃE,àB3ÃÀ6à­6Ã`Ä-à 2ÃÐ"7ÃÐ"7Ã@Ã5Ã],ÃÐ44ÃðŽ2ÃЫ5Ã`5ÃðÛ:Ãp©8ü1Ãð).à þ3ÃpJ3ÃÀ3à 0ÃP/Ãðù5ÀY7Ã07ÃpÙ0ÃpÍ2à 6Ã0=0Ã`2ÃP‘/ÃP2Àú1Ãà[4Ãð|5Ãàa3Ãàg2à~)à<4Ã@R3ðc4Ãð2ÃpÓ1ÃÀ¨/Ãðˆ3ÃZ3ÃÝ2Ãz8à¡8Ã`50Þ2Ã-0ÃE,à 6à u5Ã4à “0Ãðd9Ã69Àô2Ãpë-ÃN5ÀY7à 3ÃpJ3Àk4à§7Ãñ9ÃÀœ1à 3ð/ð]5ÃЙ8Ãðv6Ã?1ðì2ÃP1ð{0Ãðš0ÃÐ(6ÃPg6ÃZ3Ã`)2ÃÐÃ1ÃÀ¨/ÃÐÉ0Ã0O-Ãз3Ãpn-Ã!6ÃÀ3ü1à 3Ã@ó-Ãx.Ãpå.ð3ÀS8Ãpß/ÃW-ÃÐ:Ã` 7Ã`”5ÃÐÕ.ÃÐá,ð{0Ã012ðò1à “0ÃÐF1Ã`50ÃPy3Ø3ÃÐj+ÃÐó)Ã`”5Ãðš0ð™+Ã0º0Ãã1à¿3àN1Ãàê1Ã@Õ2ÃÐ44ð/ðu1Ã0%4àÝ.Ãx.àé,ÃÐL0Ã` 3Ãð /ö2ÃÐ44Ã@X2Ãé0Àq3Ã-0à “0ÃPð4à 3àÝ.Ãðš0Ã92ðì2à Ÿ.ÃÀ=,Ã@d0àÝ.à 3ÃÐÕ.ÃàÞ3Ã`¾.à ¥-ÃÀ7-ÃPD'ÃP‘/ö2ÃP‹0à ì6ÃÂ0Ãàä2àf-ð‡.à “0Ã0=0à 3à (-ðo2ÃP1Ã071ÃÐ@2Ã@p.Ã@á0Ã×3ÃÐR/Ãpå.Ã*ÃÐÉ0Ãàð0àË1Ãà.ü-Ã69Ã0O-Ã3/ÃP…1ÃPð4Ã9.àé,à ò5Àƒ0Ã0Æ.ü-Ãð#/à 2ÃÐÛ-Ã`A.Ã`M,ÃZ3ÃpJ3Ãð0Ãà‘+Ã0=0ÃàØ4Ãã1ÃPs4ÃÂ,ÃpV1Ã0C/Ã@á0Ã@ÿ+ÃP -à «,ÃÀ2à æ7ÃÐ@2Ã`2à þ3ÃP‘/Ãp¯7ÃÀ¨/ÃàØ4Ãðˆ3Ãð4ÃŒ5ÃÀ¨/ðø0Ãð).Ã`/1à¿3Ãt9Ã-0Ã`A.ÃZ3Ã0œ5Ã~-ÃB7Ãà‹,ðÚ5ÃÐ¥6ÃÀ 4Ãð#/ð-ÃÀ„5àf-Ã@|,Ã`;/Ã`¦2Àâ5à06ÃÀŠ4Ãàð0ÃpÙ0à 2Ã@½6à<4Ãðd9ÃП7ÃpP2Ãðˆ3ÀM9àB3Ã@ù,Ã@R3ð-ü1ÃÀŠ4Ø3ÃpJ3ðÔ6ó9ðþ/Ãàm1Ã`Ð+à 1ÃàÒ5Ã`š4ÃPü2ÃPê5Ã`ˆ7à*7Ãàm1à “0í:ÃZ3ÃpÇ3ÃÀ5ðÈ8Ã-4Ãðv6à ø4ÃÀï8à:Ãð/-ÃN5à Ú9Ã@@6ÃÀx7Ã012ÃPg6ÃÐ44Ã@=ÃàÒ5ÃP2Ã'1ðì2Ã071Ãpµ6ÃП7à W:ð9;ÃÐø=À Dà @Ãp<Ã@±8ÃàÒ5Ã`6Ã@X2ð¥)Ãàê1à 0Àî3ÃàO6ÃÐL0ÃP2Ã`¦2Àô2Ãñ9À_6Ã7à i7ÃÀ„5ÃÐÃ1Ã'5Ã`/1Ä,Ãpß/Àw2Ãf1ðò1Ã`4ði3ÃPs4ÃZ3ðc4À}1Ã`6ÃÀr8Ã'5Ã@.9Ãà¨<Ãz8Ã'1à ø4à*7à 2Ã@ù,à 2ÃÀ3ÃpÁ4Ãðv6À7À_6ÃàÞ3àÝ.Ãl0Ãàm1Ã@á0àT0ÃÀ´-ð«(ÃpJ3Ã@á0à ".ÃP,+Àƒ0ÃpJ3ä1Ãð¦.ðø0ÃZ3Ã!6ÃË5Ãà.Ã@Õ2ÃЙ8à i7Ãà=9Ãp :ÃPg6ÃÅ6Ãз3ÃÐÃ1Ã@“=ÃPÞ7Ãðj8à­6Ã0:Ãðˆ3Æ6ÃÀŠ4Ãp27Ã07Ã0¨3ÃÀN>Ã@.9Ãß<Ã0¢4à 6Ãðí7ÀÖ7Ã@L4ð/ÃÀœ1Ã09Ã`ˆ7ÃàØ4ÃPÒ9Ã@«9ÀÐ8ÃÀx7Ã@±8Ã4ÃB7ÃÂ0ÃÀ~6Ã@«9Ãp86Ã`”5à;Ãb<ÃÀx7Ã`6Ãp?ÃÀã:ðÈ8À}1Þ6ÃpÁ4ÃÀ1.ðQ7ÃÐ:ðª=Ã@.9ÀY7ÃÐ44Ã`ÿ8Ã@.9àB3À;Ã0õ;ÃÐ:Ã'5Ã@·7à 6ó9Ã0=0à*7ÀÜ6à ø4í:ÃЫ5ÃPê5ðì2ÃàÞ3Ãå;Ãðÿ4ÃPê5à 3ÃÐÏ/ÃÐ8Ã`j<ðQ7à i7Ã0ï<ÃÐ<ÃÀÝ;ÃÀ 4à§7Ãðá9Ã0¢4ÃÀï8ÃàÆ7Ãp>5Ã7ÃЫ5Ã`¦2ÃPä6Àî3À;Ã`í;ÀÐ8ÃpD4à æ7Ã09Ã@@6Ã@Ã5ÃÐ:ÃàÀ8Ãp©8Ãð‚4ÃPÞ7à;ÃÀ6Ã69Ãà,ÃÀ5Ã`¬1ÃpÁ4ðK8ÃЫ5ð/Ãpb/Ã0¨3Ã÷8Ã0œ5Ã05à 6à­6Ãý7Ãp£9Ãð‚4Ãðÿ4Ãp86Ã0%4Ã0f>ÃÀ6ÃP.Ãf1À;Ã<8àB3ÃÀZ<ÃÀx7à³5Ã5ði3Ã$<ÃPm5Ã`4Ã`ˆ7Ã0x;à•:Ã@Ã5à ™/ÃÐ:3à Â=ÃPê5Ãp\0ð/ü-ä1ðÂ9ðÚ5Ã0+3ÃÐ"7ð?:Ãðí7Ãpb/à ‡2Ãà>ÃÐÃ1ðc4ÀY7ÃÀf:à °@Ã@<Ã09Ã@Õ2ä5ÃÀ`;à ø4ö.à o6ÃÐÏ/à {4Ãà7:Ã`|9à <Ã`”5Ã0I.Ãã1Ã92Ã-4ÃÐR/ÃÐi@ÃàÌ6ÀY7ÃpV1Ãpµ6Ãð2ÃÐ44ÀÊ9ù8ÃpÁ4ðu1ÃP2ÃpÙ0à u5Ãp86ÃÀé9Ãpµ6à ò5Ã0¢4ÃB7ÃPä6Ãp\0ÃÐÏ/Ãr/ÃÀ×<Ãðp7ð]5ÃÀ~6Ã0+3Ãðj8ÃÀ 4Ãàa3ÃàÞ3Ã`Ö*ÃÐ.5ÃÀŠ4àÅ2ÃpÙ0Ãà®;Ã`4Ã!2à×/Ãðˆ3ðì2Ã0%4ÃàO6à 1Ãðd9Ã06Ãp©8ÃË5à 1ÃÀ 4ÃPê5à 1Ãàð0ÃPü2Ã0:Ã`‚8ÃЫ5Àk4à :ðÚ5Ã0û:ÃP.Ãàä2ÃÝ2ÃÐ(6Ãðÿ4Ã`50Ãàê1ÃH6Ã0%4à u5Ã0=0Ã5ÃPa7Ã'5ði3ÃË5Ã@.9ÃÀõ7Ã012ð-Ã@p.Ãp\0Ã`4ÃPm5Ã`¸/àÝ.Ã0=0ð‡.Ã06ÃPÞ7ÃÐ.5ðø0ÃT4ÃÀ„5Ã0=0Ã&ÃÐ¥6Ã`¾.Ãð#/àË1Àâ5ÃPä6Ãàð0ÃðŽ2ð/Ø3à 6ÃÀ~6À}1Ãðó6ÃN5ÃàC8ÃÀ3àl,ðc4Ã8Æ6Ãp\0Ã071Ã`5ÃŒ9Ãh;ÃN5ÿ7ÃàÌ6Ã@Õ2Ã5Ãð‚4ÃàO6à ø4Ãt9Ã-0ÃP0Ã0®2à­6à›9Ã@L4Ã@Ï3Ãðj8Ã`‚8Ãð‚4ÃÀ~6Ãð0Ãt9Ã'1ÃðÛ:Àâ5Ãðd9Ã@48ÿ7ÃÀ6ÃPä6ÀS8à:Ã0®2Ã@:7Ãë:Ã@R3à 3ÃàÆ7ÃPä6ÿ7ðø0à {4ÃP2Ã`²0ÃП7ÃpD4Ãð4ÃЫ5Ã@«9ÃÀ–2Ã@:7Ã@½6Ã` 3Ã@d0ðò1ðÈ8Ãð”1Ãðp7Ãõ.Ã0[+Ã0–6ÀG:Àe5Ã`2Ã05Ã0º0À}1Ø7Ã`50à {4ÃÐÃ1Ã5Ã0œ5à “0Ãð1àÑ0Ã05ðà4Ã05ð]5ÃÀï8í:Ãb<Ã0¢4ðc4Ãàs0ÃPü2Þ2Àe5ÃpV1à×/ÃpÇ3Ãðp7Ã0´1Ã@:7Ã`¬1Ã0–6à<4ÃÝ2ÃPü2Ãàä2Ã@L4ÃPü2ÃÀx7Ãàm1ÃP—.Ã`;/Ãðˆ3ðE9Ã@Õ2Ã`‚8Àú1ð/Ãé0Ã@X2ÃÀ5Ãб4ÃÀœ1à i7ÃPö3ÃPü2Ã`Ž6ÃÐ:3À_6Ã@j/Þ2ðW6ÃàÒ5à u5ÃT4à 0ÃÐL0Ã!2à 6à$8ÃPg6à§7ÃP1ÃpP2ö2Ã0+3à¡8Ã`2ÃðÏ<à 6Ã@ÿ+ÃpÙ0à¹4ÃÐ@2ð™+Ãðÿ4Ã0œ5ðQ7ÃZ3Ã@Û1à «,à à8Àô2ðQ7Ã`ˆ7Ã5ÃÐ44ä5Ãàð0à 1Ãàö/Àw2Ã33Àe5Ãp86ÀÖ7Ã0+3ÿ7Ãz8ÃàO6ÃT4Ãpµ6ù8ÃÀÝ;ÃàU5ÃÐF1ÃÐ:3ÃÀ3Ã0Ò,à ø4ÃàI7à ‡2ÃQ.ÃÐ.5ÃÀŠ4Ãðí7Ã`)2ÃÀ®.Ã05Ã3à þ3à ‡2ÃpV1ðæ3Ã`Ž6Ãðv6à 1Ã0O-à 3Ãà@ÀÐ8ÃðŽ2Ã0®2Ãpñ,ÃpP2ÃP-ÃàO6ðc4àÅ2ðW6Ãàä2ðc4ðæ3ðo2Ãð”1ÃpÁ4Ãðí7à ì6à ø4ÃZ3ÃÐL0Ãàg2Ãð /ÃÝ2Àq3ÃpÇ3ê0à 1ÃÐÉ0ÃàO6ê4Ãð /Ã`p;Ãàg2ÃP/à 6Ãðp7ä1Àk4ÃZ3ðÚ5ÃÐ¥6à ø4Ã0º0ðò1à þ3Ãf1ÃP1Ã@Û1Ãl0Ã@Ã5Ã@@6Ã@É4àÝ.Ã`A.ÃpP2ÃpJ3ÃP…1Ã@R3Ãã1ðÚ5Æ6Ãðˆ3Ã’4ÃÀº,ð{0ÃÐÉ0Ã92àã-ÃE,à§7ÃpP2Ã`”5ÃЫ5Ãàs0Ã0À/à 6Ãàð0àÅ2Ã!2Ã@v-Ã0+3ÃPs4à¿3Ã`6ÃÀ5ÃÐÏ/Ãàm1à ø4ÃЫ5ÃP2Ãpß/ä5ÃP-ÃÐ^-Ã0´1À}1ð,Àq3Àq3ÃÐL0ÃZ3Ãàa3Ãн2ÃT4ÃÐÉ0ðo2ð/ÃË5ü1ÃÐ44Ãðˆ3ÃPg6ÃÀ´-Ã`²0Ã7ÃP‹0Ã@v-ð™+Ãð/-Ã@|,ÃÀ~6À0ðò1ð/ÃpÁ4ä5ö.ð,ÃPü2Ãpµ6ÃÐÉ0ðŸ*Ãà.à<4ÃÀ3Ãн2Ã@ˆ*Ã`¬1À**à “0ÃP‹0Ãày/Ãð5,Ã@L4ðo2à 0ÃK/ÃP1Ã'1Ã@48à 3Ã@á0ð“,Ãp'Ãï/Ãé0Ãð0Ãp†)Ã`¸/à×/ÃÀ¨/Ã071ÃÀŠ4Ãf1ÃpJ3Ãpß/Ã-ÃPy3ÃÀ®.Þ2À /Ã-4ÀÄ:Ã7ÃpV1à Ÿ.Ã@ *Ã0´1ÃÐÏ/ÃP—.ä1ÃÐÏ/ÃP0ÃÀC+À.À.ê0Ã5Ãé0ÃP1Ãò(ðþ/Ã0¢4ÃЫ5ê0ÃÐX.Ã0´1Ãp£9Ãpå.ÃP…1À‰/ðæ3Ã`¸/Ãï/à¡8Ã0I.à`.à65Ã-0ÃÐ@2Ãð0Àî3àB3Ã@Û1Ã`4à o6ÃP1ÃÐX.ð-Àk4àB3ÃàU5Ã`6Ã@X2Ã0´1Ãà‹,àN1Ãày/Ãз3ÃðŽ2ðæ3ði3Ã0ê(Ã@É4Ãàê1Ãð2Àè4Ø3Ãf1ÃÐí*Ãà[4Ã`¬1À}1ÃQ.Ã`¾.Ãà.Ã@v-à “0ä1Ã0+3Ãð/-Àq3à65àÑ0Ã@Ã5Ãp>5ÃPU9Ãð|5Ã7Ãx.ÃÐ44Àè4Ãõ.Ãf1ðÔ6à 2ê4ÃЫ5Ãðó6Ã~-ÃàO6ÃP…1ÃÎ.à (-Ã0º0Ã@Û1Ã05Ã`4ÃÀ„5à³5Ø3ÃÀ3Ãph.ÃÐR/àZ/ÃP‹0Ã012ÃÐ¥6Ã`4ÃZ3Ãà=9à9ÃÀõ7Ãý7Ã’8ÃE,Ãà*ÃT4Ã!2Ã`”5ÃPê5ðu1Ã0´1Ãàg2ðu1àH2À}1ÃpJ3à þ3Ã?1Ã@Ã5ÃÀ6ÃP©+Ãàg2àN1ÃP2Ø7à {4Ã`5ÃÐÕ.Ãx.ÃP2Ã0¢4à<4Ã@d0Ã@É4à×/Ãð¸+Ãð /à 1ÃP‘/Ã@Û1ÃÔ-ÃP2Ãàê1Ø7Ãðj8Àe5ðÔ6ð/À•-Ã0´1Ã0–6Ã5ðø0Ãà.Ã0ê(ÃÀ%0Ã0=0ÃÀ+/ÃÀ1.Ã@í.Ã@^1Ãð2ê4Ãð|5à 3à ‡2Ãp>5Ãpå.ÃÚ,ÃÐ.5Ã-0Ãð0Ãà,à (-ÃÐ¥6à×/Ã@v-Ã071ð¥)Ã@L4Ã@ù,Ã0%4àH2ÃË5Ã071ÃÀ%0Ãx.Ãpz+ÃP.à³5ÃÐR/Ãu(Ãà…-Àk4àé,ÃP-Ãàü.Ã@á0à ‡2Ã@R3ÃPy3ê0Àq3ÃÐp*Ã@ˆ*à ·*Ãp'ðø0ü-ÃW)Ã0U,Ãpý*ÃÀ+/Ã`¸/Ãr/Ã@j/Ê+Àw2ðþ/àl,Ã`50Ã-0Ãx.ÃPü2à 1ÃP‘/Ã0Ø+à 3Ã0®2Ã@”(Ãð5,ÃP1ÃÀ1.ðø0ðø0Ã@j/Ã3/ðW6ÃP‘/ÃÀº,Ãp’'Ãp(Ã0º0Ã@ÿ+ð()Ã)Ãð#/Ã0+3Ã`î&À‰/Ã92à .,ÃÐ|(Ã)Ã~-Ã@j/Ã`¾.àZ/Ã0y&ÃW)Ã@ó-ÃP/À1ÃÀ7-ÃP1Ãð”1Ãàm1à~)ÃP‘/à%ÃÚ(Ãp’'Ãì)Ão)Ãl0Ãð¾*ð]5à {4àf-àB3ð.(Ãàü.ð-ð-Ãû-À.Ãà‹,ÃÐí*Ã@‚+ÃÐ%Ãð¬-Ã`_)Ã`â(Ã`A.ÃP¯*Ãð¸+À¡+À¡+Ãà.ÃÝ2Ãðš0à 1ð .Ãð2ÃW)ÃP0À.Ã0Ì-Ãà—*Ãpz+ÃÀ´-Ãl0Ã@X2ÃÐó)Ãð2Ã@^1Ã0C/Ãà )Ãð¦.Ã!2Ã0Ø+ð™+à +Ã@v-Ã9.ÃÐp*ð{0ð“,à×/àZ/ÃŒ5à ™/à×/ÃÐó)Ã`Ê,Ã@ó-Ãõ.Ãï/ÃÐÃ1ÃÀ–2ÃÀ1.Ãpn-ÃÐ^-à «,ð/à 2Ãðš0ÃÐÛ-àH2ÃÀ®.Ãðš0Ã`Ž6ÃN5à*7Ãr/Àô2ð‡.Ã@ÿ+Ã0C/ÃÀ¨/ÃÐÕ.ÃP—.Ã@ó-ÃÐj+À}1ÃPÁ'àã-ÃÀ%0Ãà-Ã?1ÃÝ2Ã0g)à þ3ÃE,àN1à 1Ãð /àf-ÃÀœ1ÃÀœ1Ã0+3ÃÀº,ð/Ãf1àÑ0Ãð4Æ6Ã@p.Ãp†)ÃÀ–2Ãà.ÃÀ2Ã@48àÑ0ÃÐL0Ãp÷+ÃÐÏ/ÃÐX.ÃQ*àé,àÝ.Ã`;/Àâ5Ãð /àl,ÃÐL0Ø3ðÚ5Ã`¾.Ãpå.ÃpÙ0ü1ÃÂ,ÃpV1ÃE,Þ6Ã0+3Ã@v-Ã0Æ.À-ÃW-À-ÃÀ+/Ã`S+ÃÀ%0Ã`A.Ã0O-ü-àN1ÃpÙ0à 2Ã071Ã-0ð/à 1à Ÿ.Ãàg2Ã`_)ÃpV1Ã`M,Þ2à æ7ÃÀÀ+ÃQ.Ã`Ä-ÃQ.Ã0O-ÃpÙ0Ü(ð-Ãðš0À}1Ãpå.ÃPg6Ã@X2ðì2ÃK+Ãàs0Àw2ð/à Ÿ.à 1ÃË5Ãã1Ã@d0ð,àT0ö2Ãà+ÃÐ.5Ãph.Ã@p.Ã`50ÃÀC+ÃÀ´-ÃðŽ2Ãp;à<4ÃP -Ãà…-Ãpz+ÃP2Ã!6Ã9.ÃpD4ÃPö3ê4ÃÀ=,Ã07ÃpÓ1Ã`;/Ãð‚4ä1Ã0Ò,Ãð/-à65ÃÐL0ÃÀ 4Ã`v:Ãàm1Ãpß/ð/Ãà‹,Àô2ÃÐL0Ã0´1ÃÐ@2ÃÀ1.Ãàê1Ãàð0Àw2àZ/ÃàO6Þ2ÃàÞ3Ãp»5Ã8Ã`4ðø0ü1Ã06Ã@Õ2Ãàö/ÃË5ÃpÓ1Ãàg2Ã@X2ÃPm5Ã071ð3Ãð 3Ã`6Ã05à*7ÃÐ@2Ã~-Ãàm1ÃpP2ÃÀ–2ð{0à “0ði3À›,ð?:ÃàØ4Ã'5À1Ã&Ã@L4Ãp27à×/ÃÀû6ÃÀ5ä5Ãàs0Ãð¬-Ã0Š8ÀÖ7Ã-0Ã@@6Àƒ0ÃÀŠ4Ã`;/Ã06Ãàs0Ã0O-Ãð|5ÃÀ3ÃÐÃ1à 2Ã×3Àô2Ãý7ÃÀx7ÃÐ9ö2Ã0¢4À›,ÃðŽ2à 3ð¼:ÃH6à ‡2Ãб4Ãð1Ã`”5Ã@Õ2ÃpJ3Ãðd9ÃPö3À1ö.Ãàa3ÃP -àZ/Ãàs0ðæ3Ãà[4àH2Ã@·7Ã@L4àÝ.Ãr/Ã`¾.ÃP2Àe5ÃpV1ÃÀ®.Ãð¸+Ã@j/Ã×3ÃÀ 4ÃP2ÃpJ3Ã@Û1ÃÀœ1ê0àË1Ã09Ãð4ðW6Àú1Ã],Ã8à 1ðì2Ãpß/ÃP2ÃP-Ãpn-Ãàs0ó9Ãàm1À}1ÃP-Ãð /Ã`ÿ8ÃÐ¥6ÃpÍ2Ã@p.ðu1ÃÐF1Ã0%4Ã071à É'ÃpÍ2ðo2Ã06ÃP‹0Ã`Ž6Ã`6ÃpÇ3Ãà.ÃPy3ÃPä6Ãß<àT0ÃPg6Ã`²0Àq3ðø0Ã`)2Ã4ÃÈ/Ã@^1Ãð /ÃpD4Ã`/1ÃÐÛ-ð‡.ÃÀº,Ãð2Ãð5,à X%ÃpD4àH2Ãp£9Àú1ÃÔ)ÃpV1Ã@X2Ã@ç/Ã`¸/Ã?1ÃÂ,Ãph.ÃàÀ8ÃÀï8ÃÀ3ÃÐL0À0à (-Ã@R3Ã`”5Ã07Ã`50ÃÐ"7Ãð”1ÃP -ö.Ã’4Ã`4ÃPê5ÃàO6Ãðó6ÃÐ"7ÃN5Ãð0Ã,àÅ2ÃP—.ðà4ÃЫ5Ã0œ5ÃÀœ1Ãðÿ4ÃPy3Àƒ0ÃpP2ð{0Ãf1Ãà-Ãð2ÃàÞ3ÃÈ/Ã0¨3ð-àã-Ã0g)Ã@v-Þ2Àî3Àâ5Ã4ðÚ5Ã@Õ2Ã-0ÃÐÕ.à 3Àâ5Ãàm1ðì2ÃÐÉ0ÃpÇ3à o6à Ÿ.ü1À /ÃPÌ:ÃpÁ4Ã-4ÃpÇ3Ãб4Ã4à {4À0À‰/ðà4ÃpD4ê4ð]5à ø4ÃpÓ1Ãp»5ðW6ÃPö3ÃÂ,ðì2Ã!2Ãz8Ã!2Ã0C/ÃpV1ÃZ3Ã` 3Ã@Ï3à 6ÃàO6ÃàÞ3ÃT4Àw2Ãý7ÀÐ8ÃÙ=ÃÀ–2À}1à<4Ã@É4ÃT4Ãàs0ÃÀ2Ãð#/ê0Ã×3Ã@";Ãð|5Ã`v:ÀG:Ã`í;Ãl0Ã`š4à ì6Ã`)2Ã'1à06Ã@F5Ãð 3Ã`)2Ã`;/ÃBÀG:ÃÀ7-Ã4Ã` 3ÃP.Ãð”1Ã`ó:Ã0Ì-àÝ.Ã<8ÃÀ6ÃÀã:ðK8ðQ7Ã;Ã@:7Ãpë-Ãð‚4Ã@«9ÃðŽ2Ãðp7Ã@d0Ãð4ÃÐ8ðþ/ÃE0ÃË5à*7Ã0œ5ÃpÙ0Ãp,8ÃPm5Ã0C/Ã@j/Ãðÿ4à<4Ãp27Ã’4à “0ðæ3Ã@Ã5Ãз3ÃÀ¢0ðþ/Þ2À_6Ã` 7ðæ3Ãàð0ðÈ8Ã`v:Àƒ0Ã` 7Ã@É4à 2Ãð2ÃÐÉ0Àe5Àk4ÃÀ=,Ã`G-ÃÐÕ.ÃÐ:3àr+ÃP/Àe5Ãð‚4Ãà´:ÃÀx7ÃÐÃ1ÃK+Ã071Ã@Ï3ÃP‹0ÃÝ2Ã33Àè4Ã5ö.Ã!2Ãðš0Ã`2Àô2ü1ÃP1à ±+àã-ð3à•:ö.ÃP2Àè4ÃPü2Ã0I.ÃPy3Ãr/ð .Ã’8ðo2à “0ðø0Ã0´1ÃÐÏ/Ãн2Þ6à`.ÃT4Ãð0Ãð0Ã`¾.Ã07Ãàa3ä1Ãp»5ÃP…1ÃP1Ã071ê4ÃÀ+/Ãðš0Ã`Ü)àr+ÃpÁ4Þ2ÃpP2Ã@L4Ã`/1Ã33Ãð1Ã@|,ÃÀ7-Ã0%4Ã` 3ÃpÁ4ÃÀ3Ãð‚4Ã`š4à 6ÃÀ5ÃðŽ2Ãé0ê4Ã0Ì-Ãð /Ãõ.ð/ÃÀº,Ã9.ÃÐ44Ãð /ö.ÃPê5ÃÐL0à ¥-ÃE,ð()Ãб4Ãð).ÃàU5Ã!6Ãpë-Ã0+3Ã'1à o6Ãp,8Ã`#3à ø4ÃÐ44ÃÐÃ1ê0ðŸ*Ãr/à ‡2àË1Ãð/-Ã0Æ.Ã3/ð-ÃPy3Ã`Ê,ÃÐç+Ãð‚4ð .Ãн2Ãàg2Ãpý*ð/Ã`6ÃZ3ÃÀ%0à ½)ð/Ã0I.à .,Ãðš0Ã@d0ÃP2*Ãàm1àT0Ã'5ö2Ãð¦.à ¥-à F(ö.ðø0Ãp86ÃPö3ÃP2à ™/Ãà-Ã0C/Ã`²0ÃK/ÃÐÉ0Ãp†)ÃÐÏ/Ã@ù,Ãð).ÃÐX.Þ2Ã@L4Ãð 3ÃpP2àT0ÃP/Ãðó6Ã?1Ã33À}1Ãpb/ÃP©+ÃP0Ãð”1à þ3Ã`Ê,Ãб4ði3Ã-4Ãû-ð-Ã`A.ÃÀû6Ã0%4à ‡2ÃÀï8Ã5ÃÐX.à Ÿ.Ã0º0ÃÀ3ÃÐÃ1Ãð2Àô2ÃP.Ãàa3Ã`¸/Ãð /ðc4à 3ÃŒ5À1ÃÀ2ÃÀ%0Ã`)2Ãðv6ðª=ÃZ3Ã` 3à (-ÃP,+à “0à ò5à 2ÃЫ5Ã`2Ã`¬1ð]5Àú1Ãðp7Ã’4Ã@@6Ãàm1Ã`Ä-Ã`¦2ðì2Ãà1;ð/Ã@+Ã`¬1Ã`4Ãð|5ÃZ3Ãðç8Ãðó6Ã07Ãp£9ÃN5ÃpD4à {4Ãl0ÃÀ5ðæ3Àq3à 1à65ÃP[8Ã'5Ãð 3à :Ã`Ï@Ã÷8Ã`4à<4Ãð‚4Ã’8ÃÀf:Ã07ÃГ9à W:ÃÀõ7à Ô:Ã7Ãb<Ãp?à þ3ðK8Ãp©8Ã` 3Ãð^:Ã09Ã0–6Ã06à E=à ‡2Ã7Ã0r<ðÎ7ðà4à65Ãð 3Ã0:Ã0~:Ã?1ÃP2àl,ÃðŽ2ÀY7Ã69Ã@«9à 1ÃÐ"7ÃÐ.5Ã@L4ÃàØ4ÃÐF1Ã4Ã`‚8Ã`š4Ã@@6Ã×3à {4Ã<8À7ÃÀ5Ã`5Ã@±8ÃÀû6Ãðj8ðÎ7ÃPg6ÃPg6ÃÀÑ=ÀÖ7Ã'5Ã33ÃpP2ÃÐ.5Àî3ÃÐ"7ÃÐ¥6ÃÐ<ÃÀ 4ÃàÀ8Ãðí7Ã÷8Ãp,8Ã` 3à Ô:à °@ð€DÃp>ÃÙ=ÃðÃ>Ã@ ?Ã0TAÃP+@ÀÖ7Ãðv6Ã`¾.Ã@í.ÃÀŠ4ÃB7ÃÐ"7Ã92à>ÃðR<à‰<ÃЙ8ð CÃ@";ÀS8Ã`|9ðc4Ã0~:Ãp£9ÃPê5Ã0%4Ã@Ã5Ãh;Ã05ÃÀû6à­6Ãp:Ãñ9ðÔ6Ã@É4ÃàU5ê4ÃPð4Ãн2à¡8ÃàÆ7ÃpðAÃÀï8ÃÐ(6ÃÐì?à•:ðW6Ãàº9ÃÀx7Ã'5ðæ3Ãн2ÃpV1ÃàØ4à i7àN1ÃàÀ8Ã@L4à c8à {4ÃÝ2ÃÐ8ÃPä6ðQ7ÃPg6Ã'1ÃZ3ÃЫ5Ãp>ð3ÃÀ3Ãðç8Ã÷8ÃPê5ÃPÞ7ÃPä6Ã69ÃÀ~6à 3Ãð2à u5Ã3à ø4ÃPö3Ã0r<àË1ÃÑ4Àâ5Ãp>5ÃÀl9ÃÀ%0ÃZ3Ãðÿ4Ã`8à³5ÃðR<Ãpµ6Ãð 3ö.ÃðŽ2ÃàI7Ã` 3ÃðÛ:Ãn:Ã@±8à Ô:ÃÀ 4ÃЙ8ÃÐ44À7ðì2ÃÐ8ðW6Ãã1ÃP—.À¡+ÃàØ4Ãðv6À7Ãðj8ÃàÞ3Ã×3Ã`)2Ã@Õ2àH2Ã<8ÃÀx7ÃÐ ;ÃÐ44ÃPö3Ãð4Ã@É4ÃPO:Ã5ÃpJ3ÃàÞ3Ã0Š8Ã@X2ÃÀ5ÃpÁ4ÀG:ÃÅ6Ãp&9Ã*;ÃPê5Ã×3ÃpÓ1ÃPs4Ãз3Ã'1ðo2ÃàÀ8ÃÀ 4ÃPê5À /ÃÐd,àÅ2ä5Ãx.ÃÀ7-ä5ðu1ÃÀº,ÃÂ,à 3Ã@±8Ã`2Ã`5ÃÀ2Ã×3Ã`2Ãðÿ4Ã0%4à<4Ã5Ãpå.Ã'1Ãàm1Ãp¯7ÃÑ4ÃPs4Ã!2ÃÀœ1ÃpJ3Ã33ÃÀ„5Ã4ÃÐ¥6à 0à ò5Ãày/Ã!6ÃÀœ1à /à<4Ãàa3Ãpß/ÃÀ–2À$+Ã`/1Ãpb/ÃpÙ0Ã`6Ãб4ÃÝ2ÃÐF1Ãàä2Ã071ðì2Ãðˆ3À}1ÃÀ 4Ã×3àÑ0Ãð /àÑ0Ão)à ø4Ã0®2Ãðš0Ãз3ÃЙ8Ãз3À-ÀÖ7Ã`4Ã@d0ÃT4à ò5Ã@Ï3ð/ÃÀ2ÃPê5Ãð¦.à ø4Àú1Ã@Û1Ã@v-ÃpÁ4Àƒ0Ã@.9Ã9À›,Ãàê1ÃÀÆ*à 2ÃpJ3ÃÅ6Àè4à Ú9àÅ2ðo2Ã@Ã5Ã7ÃàÆ7Ã<8ä5à³5Àq3ðo2Ãp>5Ã7ù8Ãðç8Ã0:Ãð^:Ã0%4Ã<8ÃÐ.5ÃÀ3Þ2Ãå;à i7ÃÀ`;ÃÐ44Ãðj8Ã@";à 0ÀY7Ã`/1à³5ÀÊ9Ã07à¹4ÃðŽ2Ã`2Àè4Ã0x;Ã`í;à¿3Ã`á=à§7Ã*;ðì2à 3ÀS8Ã0:ÃPö3Ãt=ð!?Ãp,8Ã@±8Ãà+<Ã@™<Ã7ðž?ÃP==Ã0:Ãðj8Ãà>à•:ðÂ9à i7Ã0õ;ðÂ9à æ7Ã@48Ãð‚4Ãàº9ÃÀ~6ÃÅ6À5=ÃÍ?ÃP+@ÃÐu>À DÃ@.9Ã09Ã@@6Ãt9Ã`d=Ãp&9ð¼:ÀÐ8Ãðá9Ã0ÑAà Î;ä1àË1À/>Ãà>ÃÐÃ1À¸<ÃðF>Ãð@?ÃÀ1.Ã0 8ÃÐu>Ã0û:Ã`|9ÀM9Ãñ9ÃÐ:Ãý;ÃÐ9ÃP¨@Ã`X?Ã`|9Ã`j<À;<Ãàº9Ã`á=ÃÀH?Ãp‘<Ãp27ÃÐ@2Ãp;À¬>ðÎ7Ãh;Ã`‚8Ã0û:Ãð·@Ã’8à Î;ÃÇ@à Q;Ãà7:ÃPÌ:ÃpD4ÃPÞ7Ã;Ãp86í:ð˜@ÀÄ:Ãðá9ÃPº=ÃPº=Ãð|5ÃÀã:ÃPO:ÃÐ<Ãp&9à <ÃÐ:Ã0%4Ã0¢4ÃÀ¹AÃPU9Ãðç8Ã;ÃPU9ÃðL=à Q;Ã@É4ð'>À‚EÃ;ðK8ÃÐ:Ã@¥:Ã@=ÃÀÝ;ÃÐ:Ã=À5=ÃÀN>Ãë>ÃàI7ðE9Ãå?ÃÀÃ0ËBà§7Ãp?Ãý7Ãà@Àâ5ÃPC<Ã@™<à­6Ã@òBÃPÒ9Ãðó6Ãt9ÃP?À)?Ã@Ÿ;À}1à ‡2ÃÀl9à Ú9Ã@.9ù8Ã@.9À¬>ð'>ÃÀË>Ãp©8Ã0TAÃ0x;ðà4Ãp…>Ãð@?à§7ð¤>Ã@ ?Ã@<Ãàº9à§7ð-=ù8Ã’8Ãб4ÃðÉ=Ã`Û>à$8à ?>Æ6Ã0û:Ãðá9ÃpP2Ãà=9Ã@=ÀS8ÃŒ5ÃðR<ÃÀï8ÃðÉ=Ã@(:Ã0:ÃP®?Ãà=9ÃÐ<Ãðó6Ãp©8ÃàÒ5Ãë:ó9Ã$<Ãp27ÃÐþ<ÃÅ6à i7à 9?Ãp,8ÃÐ(6ÃÐ"7Ãà[4à i7ÃB7ÃB7Ãðá9Ã69ÃÐ<ÃÀ 4Ãz8Ãàº9ÀM9Ãð^:ÃЫ5Ã@«9ÃÅ6Ã0Š8Ã9ÃГ9ÃàÆ7ÃàÌ6ðc4ÃÀ3Ã05Ã@Ï3Ã07Ã`‚8ÃPg6à;à­6ÃÀË>à :ÃÀ6ÃÀx7ÃàI7à ì6Ã0û:Ãp86ÃП7Ã@±8Ãà=9ðÔ6Ã@<ðÎ7Ãpë-à*7ÃÀN>Ãt9Ãz8ÃÐ44Ã05Ã@F5Ã!2Ã05Ã÷<Ã8ÃðŽ2ÃÀ 4ÃÐ8ÃŒ5ði3Ã`;/Ã0–6ÃÀ 4ÃPä6ÃÅ6Ã3Ã0é=Ãp—;à<4ÃN5Ã5ÃàÒ5Ãàö/ÃÀ–2Ãp\0Ø3ÃP´>ÃÐ"7ðc4ÃÐ8ÃN5Ãð|5Àú1ÃpÓ1ð]5ÀY7Ã0Š8Ã05ÃÀ+/ÃÑ4ÀS8ÃÐ¥6ÃàÆ7à;ÃP1Ã`A.ÃàØ4Ã@½6ÃÝ2Ã`2à æ7Ã0+3Ã0¢4Ã@@6Ã`2à c8Ãðp7ä5à ø4ðò1àH2Ã0:à c8Ã`;/Ãð‚4ÃЫ5ðc4à i7ÃàÆ7Ãз3Ã-0Ã`/1Àî3ÃЫ5Ãl0ÃPü2à•:Ã0+3ÃàÞ3ÃPy3Ãã1À0ÃPê5Ãàa3Ã`8Ã@^1Þ2Ãà+<Ã0 8Ã`6Ã0œ5Ã@F5ÃÐF1Ã3ÃÐ:3Ãp86ÃP2à65Ãн2àH2Ãp>5Àô2ÃÀ2à c8ÃÀ=,ðo2ÃÐX.ÃÐ"7ÃpÁ4à<4ð3ö2Ã5à .,à 1À.Ã@^1Ã@Õ2ÀšAÃ`Ž6Ã`4ÃpÍ2à þ3Ã`v:Ã`)2Ãph.À¡+ÃÐÿ'Ãð0ÃÐÃ1Ã` 3ÃpV1Ãà.ÃP0ÃPg6ÀÖ7ÀÐ8À1àÅ2Ã@ù,ð‡.Ã0À/à /Ãб4àÅ2ðì2Àî3Ã@X2ÃÀœ1Ã0Æ.Ãà,ÃÀ¢0ÃP.ö.Ãð¬-Ã0º0Ã`;/Ã@|,ðŸ*Ãpß/Ãàð0Ãðÿ4à ".Ãð0ð]5Ãàs0ÃÀº,ÃÐÃ1ÃÀ 4Ãà‹,Ã@d0ÃpÓ1à 2Ã` 3Ã7Ã@j/Ãð2Ã`¬1ÃP2Ãpñ,à ±+Àô2Ãб4à ‡2Ãð¦.Ã@ù,Ã`¸/Ã`)2à u5àH2ÃpJ3Ã`/1ÃÀ3ðò1ÃZ3Ã3/Ã`/1Ã`A.Ã?-ð/Ãpß/ð/Ãà.ÃP—.À0ÃÐÛ-ÃÐX.ÃPö3ÃÐ@2Ã0Ì-Ãpb/Ãð;+Ã9.Ãð¦.ðE9ÃÀ1.ð‡.Ã071Æ6Ã`5ÃÐÕ.ÃZ3ÃЫ5Ã@Û1ÃP1Ãàê1ÃÎ.Ãf1ðQ7ÃP/à)À}1Ã`¾.àÑ0ÃÀŠ4Ãð|5à à8àÝ.à~)ÃÐí*Ã`2Ã!2Ãà[4Ã`6à`.ÃP.ÃÐ:3Ãðí7ÃÀÆ*Ã@|,À;Ãðÿ4ÃÀŠ4Ã0º0Þ2ÃÑ4Ã0I.Ãpt,ÃÎ.Ãð 3Ã33ÃÀ+/Ã`)2Ãf1à +ÃÀœ1ÃP,+Ãàa3ü-ÃK+à 1Ãð1Ãà.Ã'1Ã@š'Ã@F5Ã` 3ÃÀ5ÃP—.Ã-ä1Ã@@6ÃÀ5ÃЫ5Ã@X2Ãð¦.ÃÅ6Ã?-à¹4ÃÀŠ4ð‡.ÃÀ2À.Ãï/ðø0Ãp;Ã@@6ðQ7à$8ÃÀ¢0ä1Ãpt,ÃÐL0Ã@X2Ã@í.à 3Ã@Ã5ÃP…1Ã05À /à 3ÃP…1Ãб4ÃàO6ÃP -Ã0„9Ã`Ð+Ã@|,Ã@)à ¥-ÃÀ6ÃàØ4Ã` 3Ã0®2Ã0®2ÃàI7à ø4Àk4Ãph.à`.Ã`;/ÃPg6Àô2ð/ð‡.Ã0Ò,Àƒ0Ãн2ÃP0Ãðÿ4à 1Ãï/à­6Ãà-ÃPê5ÃPÞ7Àè4à 3Ã0C/À‰/ÃЫ5ÃQ.Ãà‹,Ã0Æ.ðþ/àÑ0Ãàa3ÃÑ4Ã7À›,Ãð2ð-Ãð1ÃÐL0Ã`¸/Ã`¦2Ã0Ò,Ãàa3ÃË5à¿3ðo2Ã0º0ü-Ã@ù,ðÚ5Ã`²0à¿3ÃÀ1ÃÐF1Àq3ÃÐÕ.Ãà…-Ã`¸/Ã0À/ÃQ.ð'>ÃpÇ3Ãõ.Ãàg2ÃÀ1.Ãàü.Ã0Ò,Ã@ù,àB3àÅ2ÃpÓ1à06Ã?1Ãб4ð/ÃP…1ÃPm5Ãà1;à 1àN1ð{0ÃP‹0Ã@X2ÃÈ/Ãà*ð,ðà4ðW6Ã`2ÃPÌ:Ãp€*à 2ÃÐÉ0Ã0¨3ÃPö3ä1Ãï/Ãз3Ã`4Ã0º0àZ/Ã0+3Ãà-Ã`²0ÃP‘/ê0ÃP0Ã@ç/ÃPð4ÃÀé9Ãpå.ÃP,+à :*Ê+Ã@ç/ÃÀ¨/ÃÀ¢0ÃW)ÃP©+ÃpÇ3Ãð1à 1àr+ÃÀ3à 3Ãàs0ÃK/ÃpŒ(ÃP0ÃÐR/à¿3Ã!2Ã`¦2Ã`50ð,Ã!6ä5Ãð;+ÃpÁ4Ãp÷+ÃÂ0Ã9.Ãpn-À$+ÃP -ÃÀ%0à<4Ãð5,ÃÀI*àZ/ðò1Ã?-Ãàa3ÃÀ´-àf-ÃP.Ã@|,ð-ÃÀI*ÃpÙ0àH2ðu1Ã0º0Àk4àB3Ãpë-ÃÀ®.à 3Ã`¦2Ãà+ä1ÃÀ3Ãàö/ð/Ã@+ð .Ã@Û1ÃÐX.ÃP1à i7Ã`A.à ¥-Ã@(Ãã1ÃÀ1.ÃP/Àq3ÃÀ1Ãð).ê0Ãð5,Ãð).Ã0À/ÃÐÕ.À¡+ÃÐá,à 3À /àZ/Ã0U,Ã0®2Ä,ÃÀ¢0ÃÈ+Ã@í.ÃàÞ3à Ÿ.ð‡.Ã`Ö*Ã0Ò,ð .Ã0+3Ãàg2ÃÀ1Ãàê1À•-Ãà)Ãð).àT0Ãð /Ãi*ÃÀ7-À›,ÃÐj+Ã@Ž)ÃÀC+ÃÐX.Ã3/Ã0C/àÑ0ÃÀœ1À,Ã0ä)ð±'ÃðÄ)Ãàa3Ã@ó-Ãà,À}1ÃÐÉ0Ãp*Ã0s'ÃÐ44Ã@í.Ãf1ÃÀ['Ã`Ê,àr+ÃQ*Ã0Ì-ÃpÁ4Ã@É4Ãðv6Ã'1Ãã1Ã0À/ÃP0ÃpÙ0Ã`¬1ÃÀ 4ÃàO6ÃP2ð+ÃP&,Ã-0Ãpz+à ‡2À /Ã`A.Ã~-ÃÐí*ÃÐ.5à Ÿ.Ã0Æ.à 1Ãò(à 1Ã9.ÃÀ%0ÃÈ+Ã`¾.À1Ã`50Ãà.à (-ðu1Ãð¦.à /ÃpÍ2Ãðÿ4Ã0Ò,ÃP£,Ã@É4Ãp:Ãðj8ÀM9ÃàI7ÃË5Ã5ÃГ9à ø4Àk4Ãз3Ãã1Ã<8ÃÀ×<ÃÀ`;Ãå;à9à‰<Ã`v:Ãn:ÃÀ`;ÃÐ"7à*7Ã0„9Ã8ðÎ7Ãå;à Â=ù8ÀÄ:ÃPÒ9í:Ã`ó:Ãн2Ã\=Õ>ðÈ8Ãðç8Ãðç8Ãp:à þ3Ãý7Ãý7ÃÀŠ4à§7à Ô:Ã`ÿ8Ã7à o6Ã7Ãp>5ÃÍ?Ãß<Ã0~:Ã`|9ÃÀÝ;ÃÐ<à06ÃÀr8Ã0`?ð]5à<4Ã@Õ2à 3Ø7ÃðR<Ã`d=Ã3Ãàº9Ã8ÃPg6Ãàg2Ãp,8ÃÀH?Ã@™<à›9ÃÀã:ÃÀé9ÃЙ8Ã`ˆ7Ã@<ÃàÌ6Ãp27Ã0l=Ã’8Ãp£9ðÚ5Ãp<Ãp©8ÃðX;Ãp>5Ãð‚4Ãp:Ãð4ÃðÕ;À¦?à*7ÃÐ¥6Ã` 7Ã$<Ã0û:à à8ÃÐ:à <Ã`^>Ã0~:ÃPä6ÃàI7ÃÝ2ÀÜ6à;Ã÷8Þ6Ã@L4ÃЫ5à Î;Ã`Ž6ç;Ãðd9ÃÀT=ð@Ãp&9ðÚ5Ã`/1à ò5àB3Ã@(:ÃpÇ3ÃP7>Ãà´:ÃÐ8Ã7Ãз3ÀG:ÃЇ;Ã÷8Ã@(:ÃŒ5Ã@48à W:à ì6Ãз3ÃÈ/Ãàä2ÃpÍ2à¿3à•:Ã`p;à 6à o6Ã’4à à8Ãp27Ã09Ãp>5Ã@½6Ã@48Ø7à þ3Ãà1;ÃàU5ÃÀ„5ÃÀé9ÃÀr8Ã0Š8à ]9Ãà[4à65Ãp©8Ø3à o6ÃPÀ<Ã0Š8Ã`¬1ÃÀõ7ÃPÒ9ÃП7Ã`‚8Ã@:7ÃPð4ÃPð4ÃàO6Ã@Õ2Ã09Ãðí7ÃÀŠ4Ãf1à Ú9Ãðù5Ã@";à æ7ÃЫ5Ãà®;ÃàÀ8ÃP‹0à¹4à 3ÃðÕ;à @ÃÐ:ÃÀ1.Ã@É4à È<Ãt9À¸<Ãðí7à¡8à<4ÃÀ6Àq3à Q;Ãàs0ÃÐX.Ãpµ6Ãðó6Ãà´:ÃP/ÃB7ÃP[8Ã@«9Ã3Ãz<ÃPg6à$8Ã9à$8ÃÀ3Ã07Ãà7:ÃPÀ<Ã` 3Ã`;/Ã9Ø3à ]9Ãðÿ4ÃÐ¥6ÃPö3í:ÃPg6Ã`Ž6ÃPg6Ã0~:Ãð2ÃàÌ6ÃÐL0àÝ.Ã@@6ÃP2Ã@±8ÃÀõ7à×/ÃPy3ÃÐ.5ÃpÁ4Ã0¢4ÃPa7à 6Ã0 8ù8ÃÐ8Ã-0ÃЫ5Ãz8À}1Ãpµ6à ì6ÃPÞ7ÃP[8ð°<Ã05Ã`ÿ8Ãp<à=ÃË5Ã4ÃÀÝ;ðQ7ÀG:ÃpÁ4ÃB7à06ÃpÍ2ÀG:Ã@^1Ã`#3ÃàI7Ãàê1ð?:Ã06Ãn:Ã071à ò5ÃpP2Ã0®2ðc4Ã’4à æ7Ã0r<Ã@d0ÃÀõ7Ã0r<ÃÐ¥6Ã@½6ÃpÍ2Ãà,ð{0Ã`”5Æ:À0ÃP2ÃÀ5Ã@É4Ãб4Ã`50ðo2ü-Ã@Õ2ÃÐ.5Ã@@6ð¼:ÃÀû6àH2ÃÐÉ0Ã@d0Ãpµ6Ãà=9à³5ä5ÃÀr8ÃÀ~6Ãðù5ÃpÇ3àB3ÃÐ(6ÃpÁ4Þ6Ãð”1Ã0¢4Ã0´1ÃÐ@2À}1ÃÐF1Ã0+3Ã0¢4ÃZ3Ãf1ÃPê5ÃË5Ãб4ÃpD4Ã`50À0ðo2ÃpJ3Ãã1Àî3Ãðˆ3ê0Ãà‘+àÅ2à 2ÃÐá,Ãï/Ã09Àâ5Ã06Ã`¦2Ãðš0Ã@É4ðu1ÃÐ(6Ã0¨3Ãð2à 1Ãàs0ÃàO6ÃpÓ1Ã@:7à§7Ã8Ã!2Ã0–6à 6ÃÝ2Ã0%4ÃÐ<ö2Ã0C/ÃÀ–2Ãàö/ÃpÍ2à§7à ø4Ã@d0ÃÐ¥6Ã0:Þ6à .,Ã@R3Ãp£9Ãà[4Ãp>5Ãн2ÃpÙ0Ã`¸/ÃÀ=,ÃÐ44ÃPê5ÃÐ@2Ã'5Ã`/1Ãðˆ3ÃÀ5Ã0À/Ã?-ÃÀ5ði3Ã0+3Ã`50à 3à 1ðQ7Ø7Ã` 3ÃB7Ã@Û1Ã@F5ÀÜ6à 3à06à³5Ãðˆ3Ã`/1Ãðù5ÃÐ¥6Ã@X2ÃPð4Àƒ0à 3Ãàa3Ã05Ãð^:à i7Ãõ.Ã012Ãð /ÃàÆ7Ãàa3Ã8Ãàm1ÃÀ¢0Ã3Ãðÿ4à :ä1À•-à ø4ÃÀ%0Ã0O-ðþ/Ãpb/à$8ÃZ3Ãð 3Ãð^:Ã`¦2Ã@48Ø3Ã8Ã@É4ÃЫ5ðÎ7ÃPs4àH2Ã7Ã0+3ÃàØ4ÃÐ.5ÃÀ5Ã4Ãpñ,à 3Ø7ÃàÌ6Ã@Ã5à§7Ãàa3ÃП7Ãð¦.Ãpb/à 6Ãн2ÃÀ~6Ã0¢4Ã@í.ð]5ÃàÞ3Àw2Àe5Ã012ÃÐd,Ãð 3Ãàm1ÃÐ"7Ã@X2ðK8ç;ÃàÒ5ÃŒ5Ã012ði3ÃàO6ðÂ9Ãð‚4Ã0´1ÃK/Ãàm1ÃpÁ4ÃpÓ1Ãð^:Ãà7:Àq3Ã-À›,Ãàg2à¡8Ã@ç/Ã@ç/ÃÂ0ÃðŽ2Ã`;/ÃÀ3ÃÐÃ1ÃP…1àÑ0ÃP2à c8ÃÐÃ1Ãð4Ãp»5ÃPU9ÃÂ0Ãð1ÃPØ8Ã0´1Ã`4Ãp»5Ã`Ž6Ã0´1ðW6ÃP2à ¥-ÃpÁ4À1à 1Ã`”5Ãà[4à u5Ã7À.ÃP[8ÃT4ÃÐ:3À1ÃÅ6Ãðÿ4ðc4ð¶;ÃpÓ1Ã@·7àÅ2À.ÃÈ+Ã@Õ2ÃÐÕ.ÃÐj+ÃðŽ2Ãp\0à­6Ã`#3À.Ãp27ÃÀ2ðþ/ð-Ãl0ÃZ3Ã`¸/ÃàI7ðÎ7Ã0¢4Ã`¸/Ã0I.ð-Ã`;/ÃP1ÃÐ@2Ã@j/ÃÀ%0ÃÂ0ð/ê0Ãp27Ãð/-Ãð|5Ãð2Ã*Ã`M,Ãàü.ÃP2à¡8ÃÀ5à 6Ã4Ã0[+àË1à ™/ÃÀœ1Ãðÿ4Àú1Ã@á0ÃЫ5ÃÀ¢0ÃPð4ÃpJ3Ã@Õ2ÃÝ2à ‡2Ãpå.ÃP2Ãày/Àâ5Ãðç8àT0àÑ0Ãð‚4à “0Ã@j/àH2ÃÐ@2ÃQ.Ãàö/àH2ÃŒ5Ãðÿ4àN1Ãpë-Ã07Ãð 3ðu1Ãð5,Ãf1Ã0Æ.Ãð/-ÃPs4Ãн2ÃpD4ÃP…1ð/Ãæ*ÃÐd,ðc4Ãб4ðc4ÃÀr8ÃB7ÃPö3ÃpÙ0À /Ã@j/ðò1ÃZ3Ã`²0à +à 4+ÃT4ÃàU5Ã0=0ðÔ6ðÚ5Ãà[4Ã@^1Ã@X2ÃÐ8Ã’4À**Ãf1Ãpµ6à65Ãz8Ãf1ÃÐL0à ‡2Ã`”5ðc4à 1Ã0®2Ã`;/Ãpz+ÃpÁ4Ã071ÃP2Ãàü.ÃPm5à 1ÃP[8ÃPü2ÃÀ~6Ã@Ã5ÃP‹0ð/ÃK+ÃÐÉ0Ã!2Ã`¾.à65à9Ã0+3Ãr/ê0Àƒ0Ãph.Ãз3Ãàs0ÃÎ.ÃÐ@2Àƒ0à³5Ã@^1à¹4ð]5ÃPg6ÃPð4Ãã1Ãpë-ð{0à`.ÃP‹0àÝ.Ãpµ6ÃPg6à ™/Ã×3ÃPü2ð“,Ã`A.Ã0¨3ÃP/Ãð1Ã-0Ã0+3ÃÀ®.Ãð1àf-à<4àB3ÃÀ1à “0Ã`¾.ÃÐ@2à “0Ã0À/Ãàa3Ã@É4ÃàU5ÃÀ 4Àe5Ãðš0Ãàä2Ã`”5ÃÐL0Ãàö/Ãб4à þ3à 3Ãp>5ÃpÁ4À›,ÃP2Ã@F5àN1Þ2ð/à ì6à 2àÑ0Ã0º0ÃÐ^-ÃÀ1Ã0=0Ã@L4ðQ7Ã0¢4ÃH6Ã@ç/ÃpÙ0Ã0¢4ÃPm5ö.ÃŒ5ö.Ãàa3Ãày/à 3Ãé0à 6ÃðŽ2Ã071Ã0=0ÃÐá,Ãà[4à<4ÃÐ"7ÃPê5Ãн2Ã@É4à65Ãàä2ÀÖ7Àî3Ãð2ÃÐ44à¹4ÃH6Ãý;Ãñ=ÃÐo?à Â=Ã0„9Ãð”1ðì2ÃPg6à§7ÃP[8ÃðA*ÃW)Ãà‘+Ãpý*ÃÀ+/À /À}1Ã0%4ä5ÃÐ44Àâ5ÃÀ„5Ãàa3à¡8Ã4ÃP&,Ã@+ðà4Ãðù5ÃÀx7À6(ð,Ä,ÃÐ@2Ã@v-ÃÀ¢0À.Ãp>5ÃpÇ3Ãï/Ãx.ÃP‘/Ãph.ÃÀŠ4Ãà.ÃÀ+/ÃÐ:3à 6ðò1à ø4ÃÐ(6ÃÈ/Ãp>5Ã@í.Ã3/ÃÑ4Ãð|5àÝ.Ã@p.À1Ã0¨3ä1à`.Ã@ù,Ã?-ÃÀº,àã-Ã?-ÃÐÏ/Ãé0ÃÀ®.ÃpÇ3Ã`5À§*àË1Ã0´1ði3ÃP1Ã@±8Ãl0ÃÐp*Ãð#/Ãû-ÃàU5ÃP.Ã@Õ2ð«(ö.à­6à {4Ãû-Ãp€*ÃÐp*ÃP…1ÃÀ+/ÃÀa&ðò1ÃÀ3à «,Ã0C/Ãð5,àr+À}1Ã@Õ2à¿3Ã`Y*Ãpt,Ã`G-à :*Ãð;+Ãl0Ã@‚+ÃpÇ3ÃÐÉ0à 1ÃpÇ3ð .ð/Ãpb/Ã&À¡+ÃЂ'Ã@ç/Ãð”1Ã@Ï3À•-ÃÀ=,ði3ð/ð+ð,ÃÀ1Ãé0Ã@j/àf-ÃÐÉ0Ãн2ðø0Ã07Ãð).ð/Ãàð0ÃðÐ'Ã@ù,ä1ÃÚ,Ãpµ6Ãp¯7Ã0®2à 1Ã0Æ.Ã0g)ÃÚ,ÃÔ)ÃP1Ãð4ÃZ3Ã`¾.ÃP1ÃP‹0Ãð#/à 1À0)ÃÀ®.ð-Ãp€*Ãf1ÃÀ3ðò1Ãà-ÃpV1ÃQ.ü-à ø4Ãpñ,Ã*ÃÀÆ*Ãp!%Ão%Ãà,Ãà—*ÃÐX.à 3Ã@p.Ã`_)Ã@”(Ã](ðþ/Ãð¬-à 3Ãà-Ã~-ÀÜ6ÃÐù(Ã(Ö)Ãà…-ÃÀÆ*à +Ãð /Ãì)Ãà+ÃE,Ã@á0ÃÐÛ-à×/Ã*ÃP>(ÃpP2Ã3/Ãph.Ãð;+àõ*ÃÀU(Ãà.ÃP£,Ãpý*ÃÎ*Ã@ÿ+Ã0m(ÃÐv)àÝ.ÀB&Ão)Ä,ÃÐù(Ã@ç/ð·&ÃP©+ÃÈ+Ã*Ãð 3ÃP£,ð“,Ãpë-Ã`M,Ãpß/ÃÂ0Ãì%ÃÂ,ÃЂ'Ã`Y*Ã?-Ãà‹,ÃÐí*Ãf1à @)Ã`Ð+ÃÈ+Ã7$ð"*ÃðÖ&Ã@ÿ+ð/Ü(Ã@²#Ã0ê(ÃÀÆ*à&ÃÀU(à Ÿ.Ãp*Ãà£(ÃP\#Ãð).Ãpn-ð()Ã?-Ã@ˆ*Ã0Þ*Ã0Ø+À**ÃÀO)Ã0À/Ãpb/Ãà*Ã?1ÃP>(Ã`Ü)Ãpn-Ã`$ÃÀê$Ãpt,ÃðŽ2Ãpë-ÃP&,à +ÃÐç+Ãð¸+ð/Ãp€*ÃÚ(à`.ð™+à 1ð+ÃÀ3Ã@j/Ã0ö&ÃÀÀ+ÃÀO)ÃÎ*Ã@'Ãi*ÃP¯*Ãpë-ÃðS'Ãp*ÃÀÆ*Ã@í.Ã0O-ÃÐÕ.Ã@ÿ+ÃpV1àï+Ãi&Ã`M,à(ÃÀº,ÃÐd,ÃÐÛ-Ã`¬1à Ÿ.Ãð/-À­)à :*ä1ÃP&,À /À0)ÃðS'à&ÃÎ.Ã0C/Ãp\0Ãà.ð"*À­)ÃÀI*ÃÀy"À›,Ã0Ì-Ãà‘+Ãx.Ãð²,ÃÐá,ÃðY&Ãpt,Ã],Ã],Ã%'Ã`e(Ãc+Ãpn-Ã@ &Ã071Ãpñ,Ãð0ÃP¯*ÃÀØ'àÑ0ÃÐv)Ãpñ,ÃÀU(ð/à ‡2ÃP/Ã(Ã0ö&Ã0g)Ä,Ãð¬-ÃÀ%0ÃÐp*À0à Ÿ.Ã0%4Ãà‘+ð,ÃÀ%0ð"*Ãà )À1ÃÂ,Ãi*à ™/àã-Ä,ÃpÍ2Ã0ä)ÃP—.ÃÀ7-ÃP,+ðæ3Ãðˆ3Ã012À.Ã`Ä-Ãð¬-àf-Ãpñ,Ã-0Ãp!%Ãp(à +Ãð /Ã@í.À-ÃP»(Ã@|,ÃP‘/Ã@ó-Þ2À.Ã@ˆ*ÃÐÛ-ÃPÇ&à 0Ãpå.Ãð4Ãc+ð,ÀB&Ã0Þ*Ã`Ä-Ã@ù,Ã@ç/À³(Ã`M,àÑ0ÃÐ"7ð-Ã`¾.ÃP,+Ãà.Ãpå.Ãà )Ã`Ä-ÃK+Ãu(ð™+àË1à„(Ã`ƒ#Ä,ÃK/ð«(Ãp!%ÃÔ-ÃÐL0ÃÀ+/Ãð¦.ö.Ã@ˆ*Ãà*Ã9.ÃÐ@2ð‡.À1ÃðY&ð/Ãð4à 1Ãã1à ".Ãð1à 2à ¥-Ãàü.à ".ÃÀœ1ÃP.Ã@d0Ãc+ÃP‹0Àú1ð .à «,ÃÚ,Ã0U,ÃÀ1.Ãpë-Ãã1Ãàð0à 2à .,Ãì)Ã0Æ.Ã?-Ã0Ì-ð-Ãï/À›,Ãð¦.Ãà+ÃÐç+Ã3/Ã`Ð+à ".À‰/à ™/ð‡.Ã`w%ði3Ãé0à`.À•-Ãõ.à ±+ÃÐ@2Ã`Ê,Ã0[+Ãàg2Ã9.Àq3Ã@ó-ÃP>(Ã0ä)ÃP&,ÃP,+Ã`q&À,Ã`G-Ã@R3À1ð3ÃW-ÃÀ3ÃÐÛ-À0Ãû-ÃÀC+ÃP-àõ*Ã92Ã`50ð±'ÃPV$Ã@ *à /Ä,ð¥)ÃPÒ9Ã@p.Ãð¸+ÃpÍ2ÃÀÒ(ÃÔ-à 1Ãi*Ãà-Ãày/Ã`#3ÃÀ7-Ãð¬-à ]9ÃÐí*ü-àÅ2Ã`S+àË1ÃÀÒ(ÃЂ'à (-Ã0Ò,ÃP.Ã'5ðþ/Ã9.Ø3à +Ãðš0Ã&Ãpß/ÃÐF1Ã0Ò,Ãì%Ãpt,Ã,ð™+ÃP£,Ãàö/Ã0¢4Ãû-à ¥-Ãpn-ÃÐÉ0Ãã1ÃË5À‰/à<4ÃÈ/Ã@j/àl,Ã0¢4ðu1à–%à «,ÃP8)ð/Ãàö/Ãp†)Ã0[+Ã`â(ÃÐÛ-Ã0a*Ã`â(ÃÐá,Ã,Ãpñ,à×/àé,ÃP©+Ãàs0Ã0C/Ãþ&Ã0Þ*à 0ÃP¯*Ã0a*Ã0Ò,ð{0Ãàð0ÃЂ'ÃPy3ðW6ÃÎ.Ãàg2Ãpß/ð,ÃÐ^-Ã0Ø+Ãð”1ÃÐÉ0ÃP—.Ãð/-Ã0Ø+ÃÐÏ/Ãàð0ÃàÞ3à (-ð()Ã`50ÃÀ7-ÃÐX.À›,Ã0+3ÃÐX.ÃPü2Ã012Ã`Ä-Ãpñ,Ãàö/Ã@(Þ2Ãð /àN1ÃÐÏ/Ãï/Ù"ÃàÓ Ã ï+ÃÐj+Ãpñ,ÃW-ÃP©+Ã0U,Ã](à +ð/ð{0Ãò(ÃP.Ãï/Ã`/1ÃP£,Ã,ð()Ã@ù,Ã0ä)ÃÐù(Ãð¬-ÃÐL0ÃÐ8Ãð /ÃÎ.Ãl0Ãp )ÃÀI*À­)Ãà2&à (-ÃÐÛ-à +Ã9.Ã0Ò,à (-à +ÃÐj+Ö)ÃP,+ÃP¯*ÃÀ1.Ã9.Ãï/Ãà.Ã@p.ðì2Ã`;/À.Ã0O-ð.(Ãc+ÃÀ´-à @)Ãpë-Ãð/-ÃpÍ2Ã`#3Ãàm1ÃÀ®.à 0ÃP¯*Ã-Ãà.Ãðˆ3àZ/Ã@í.ÃÀ¢0Ãð¸+Ãð;+Ãpß/ÃÐç+Ãû-àã-ÃK+Ãð5,ÃÀ7-àr+ÃÀ´-ÃÐí*ÃpŒ(àË1Ã@j/Ã`/1ÃÐó)ÃÐÏ/Ãp\0ÃÀ+/ði3Ãp€*Ãà.Ã0s'Ãàê1Ã`G-Ãp÷+ÃÈ+Ãp*ÃÀä%Ãð#/ÃÐF1Ãð/-Ã@‚+Ã$ÃðA*Ãà+ÃÐí*Ã0À/ÃÐÉ0àË1àZ/ÃPÓ$Ãð²,Ã`Ü)àé,Ã-0Ã`50ÃÀ¢0Ã3Ã`S+Ã0[+Ã071ÃÀœ1ÃP-àf-Ãã1Ã`2Ã0Æ.ÃÚ,Ãðÿ4ÃàÆ7Ãp>5Ã0®2Ã@½6Ã`Ž6ÃPÞ7à¿3ÃP0Ã33ü-Ã`#3ÃÀ~6Ã@L4Ãð/-ÃZ3Àî3Ã0=0Ãðˆ3Ã@¥:à>Ã0û:Ãp,8ÃàO6ÃÀ¨/ü-àË1ÃZ3Ã'5à 1À0à ".Ø3ðÈ8Ãp;à³5Ãë:à {4ÃÝ2ÃŒ9Ãpµ6Ã`)2ÃÐ@2ÃÀx7Ãð^:ÃÀf:ê4à “0Ã@.9À¾;Ø7ÃÝ2ÃË5ÃpP2ÃpÓ1ÃPU9Àw2à¹4ÃàÞ3ÃPÞ7à æ7ÃË5ð¼:Ã’4ÃPy3àÅ2ðæ3ÃPö3à­6Ãp :à Ú9ÃÀã:Ã@";Æ6ÃPU9Ãp;ÃPä6ÃÀ6àH2Ã@í.Ãðv6ÃpÍ2ÃP1Ãð0Ãàð0ÃÐ9ê4Ã@X2ÃðL=à ø4ê0ÃT4ÃPð4ÃàÀ8ÃÐ.5ö2à¡8à;Ãð 3Ã@±8ù8Ã@·7Ã`š4Ã06Ãðç8ðo2Ã@½6Ãàð0Ã0:Ãpb/ÃÀ 4Ã`š4Ã@Ã5À_6Ã`6Ã33ðc4ÃÐ9Ã06Ã0º0Ã@^1Ã@í.Ãð).à•:Ã0´1àË1à¹4ÃPm5Ã0À/Ã@½6ÃP2Àƒ0à¿3Ã@Õ2Ã0Š8à9Ãé0ÃÀ 4Ãð0Ãðÿ4ðE9ðò1Ã0Ì-Ã`2à ]9ÃÐø=Àô2ÃH6ÃP´>ÃPö3Ã@R3ÃÐ8Ã@^1ÃK/ÃPü2Ã`”5Ãðv6Ã`6à*7Ã` 7ÃÀf:ÃÀé9ÃÀ5ÃàÞ3Ã`ÿ8ÃÐ¥6à¿3ÃÀœ1ÃÀû6Ãàä2Ãà.ÃàU5ÃpÇ3Ã`|9Ã@L4ÃЫ5Ãp>5Ã`2Ãl0Ãðˆ3Ãp»5Ãð0ÃЙ8Ã06à•:Ã0%4ð/Ã`A.ðæ3Ãð¬-ÃÀ1Ãð^:Ã3Àk4ÃÀr8ÃÐ44À_6ê4ðu1Ãàä2Ãб4à06Ã0I.Ã!6Ã0¢4ÃÑ4Ã`2Ã0C/À•-Ãð0Ãà7:ðQ7ðQ7ê4Ãàm1ÃŒ5Ã!2ÃÀ®.Ã33Ãl0ÃÐ@2Ã`²0Ã@";ÃÀ%0Ã×3Àè4Ãõ.Ãp<Ãàm1ÃP‘/ÃÀ~6ÃÀ3ðà4ÃÔ-ÃPê5à ™/ÃÐÃ1Ãàa3Ã`4Ã0C/ÃP‘/Ãð|5Ãp,8ÃðŽ2ÃP‘/ÃàØ4ÃpÇ3ÃÐÃ1ê0ð{0Ãàä2ÃT4Ã@d0à 6Ãp»5ö2ÃÐ44ÃpÍ2ÿ7Ã`š4Ã`|9Ã`ó:àZ/ÃPê5Ãб4À /ð/à à8Ãðÿ4ÃЙ8àÅ2Ã`M,Ãð|5Ã`”5Ã@ó-Ã`6ÃpD4Ãð”1À.Ã0¢4Ã@R3Ãï/Ãð0ö.ð/ÃZ3Ãñ=Ãt9ðÈ8ði3Ãð).Ãpz+Ãf1Ãàm1Ã`2ÃÐÃ1ð{0Ãð4ÃpV1ðW6Ã@‚+ÀÜ6ÃÈ+Ãã1Ã`²0ÃÝ2Àq3Ãà.ÃÐ@2ÃP2ÃÐj+à 1à³5Ã@";Ãp>à 6Ã`¾.Ãã1ÃÚ,ÃÚ,ÃE0ÃÐ:3Ãà+Ã0U,Ã4Ã0%4ÃÀÅ?ÃN5ÃN5ÃÀû6Ãð‚4ÃpÇ3Ã3Ã0~:Þ2Ã`¾.à`.ÃP1à¿3Ã@p.ðì2à 0Àw2Ãà…-Ã!2Þ2àÑ0ÃàU5Ã0¨3ÃÐÏ/Ãð4Ã@L4ÃðŽ2ÃpD4Ãð0ðø0Ã@R3À_6Ãp©8ÃÀÑ=ðÈ8ð?:à W:ÃÀ3ðÎ7ÃÐ{=Àè4ÃÀl9ÃPg6ð°<ÃÀã:ðK8ÃðF>Ã0õ;ÃpmBÃÀÅ?Ã}BÃðEÃ0¿DÀóGÃ`·DàÖDÃðoLÃàZIÃ@“=Ã@àEÃpIHÃ0JðbIÃ@ÎHÃÐ9HÃpÌGÃÀJÃ0KÃ@ÎHÃàÑJðÍLÃp%NÃ`·DÃÀúKÃÀ•GðbIÃÀKÃüPÃPlJÃMõGÃÀGÃLà \NÃpPÃðøJÃp¨Mà KðDNÃmOÃÀôLÃ`IÃÐ!LÃàSà ñJÃSIÃgPÃà³OÃ0LøMÃà`HõGÃÊJÃÀèNÃPrIÃ0•KðVKÃp–PÃÐ'KÃ@¶LÃGKà hLÃp[EàÄGÃ@iDÀXLÃkEàÄGÃðøJà5JÃÐ!Là bMÃÐ!Là KÃpºJìOàÊFÃPfKÃ0¡IÃаIÃPéJÃp´KÃ@ÈIÃðæMÃðIËJÃÀîMÀùFÃ@ÔGþLÃ@àEÃÀ›FÃ0‰Mà ˜DÃúBÃðFÃJÃàlFÃP–CÃ@QHÃpOGÃpÆHÃJDà)LÃP×MÃàÝHÃVBà DÃÐàAà 'BÃàïEÃ0ÅCÃ>BÃpOGÃ`.FÀ DÃp[EÃkEÃð HÃ`.FÃ`:DÃpgCÃð"DÃÐWCÃAÃ@ìCÀ;<à EÃp?Ã`±EÃp[EÃ@þ@à @É@Ãå;ÃPœBðž?Ãpü?Ãß<Ã`j<Ãb@Ã$<à -AÀ DÃpðAÃ@@ÃP~Gà ¤BÃÀ×<ÃÓ>Ã`p;Ã`Û>ïDÃ@QHÃà–?ÃàTJÃð¥CÃp[EÃ0NBÃÐ ;Ã?ðzEÃ06FÃÀ¹AÃÖHðª=à§7Ã÷<à;Ãz8ð?:Ãp£9ÀšAÀAÃë>Ã@";Ã`Û>Ã0`?ÃÍ?Ã0+3Ãp>ÃÀ`;ÃP¢AÃp‘<Ãpü?àƒ=ÃÀé9ðÔ6Ã`ó:à9ÃPÒ9ÃPg6à i7ð¶;Ãz<Þ6Ãðˆ3à§7Ã@Ã5ÃP7>ð CÃ@¥:ÃÐø=Ãàº9Ã0Ý?à i7ÃÀé9ÃÐ<Ãðá9Ã`¦2À0Ã0:Ãpµ6Ã0û:ð!?Ã0–6Ãð|5Ã`Ž6ÀÜ6Ãàœ>À @Ã0û:ÃÀã:à Ú9Ãðç8à c8ÃÀÑ=Ã@";Ã@Ï3Ã@™<Ã@L4Ã`6ð°<ÃÀH?ÃÀ~6ðE9Ãpß/ÃÀ–2ÃÀ6À;<Ãp—;Ãp,8Ã@Ã5à ø4à à8Ã0%4Ã0Š8À;<ÃГ9Ã0~:ÃГ9Ã@.9àH2ðÂ9Ã÷<à­6ÀA;àú>à 9?Ã@‡?Ãàê1à Î;Ã`ç<à9ÃÀl9Ã0~:ÃÐ"7ÃpÇ3Ã@±8Ãðj8ÃÐ(6Ã`)2ðo2Ãðç8Ã8ðæ3ðÎ7Ã@<Ã;Ãàs0ÃPs4Ã`p;Ã9ðª=à9Ãt9ÃŒ5Ã'5Ã0%4Ã0¨3ÃàU5Ã@Ÿ;Ãð 3Ãpµ6ÃÐ:Þ6Ã<8Ãp,8Ãp27Ãðš0à W:Ã071Ãðj8ðÎ7ÃpD4Ã5Ãðó6à Ô:à 0à c8Ãý;Ãpµ6Ãðÿ4ÃH6Ã012ÃàØ4Ã'1Ã@F5ä5Ãð4à06ÃŒ5ðQ7ÃЫ5Ãðj8à 2ðu1ð]5Àè4ÃðL=àB3ÃPö3Ãð 3Ø3ÃÀ„5ÀG:À1à¿3ðE9Ãàa3Ã@d0ÃPê5Ã0¨3ÃÀ1.Ã7Ã@ù,ÃpÇ3ðà4Àî3ÃÀŠ4Àô2Ã<8Ã×3Ãz<Ãð 3Ã@F5ÃN5ð?:Ãðí7Ãðv6ÃPê5Ãð 3ÃpÇ3ÃÐ:3Ãð4Ã@É4Ãðó6ðc4àT0Àk4à K<ê4ä5ÃÀ3À7Ãб4ÀM9Ã@·7Ã`/1ÃPm5à:ÃPê5Ã4Ãr/ÃÀ–2Ã0–6Ãð‚4Ãðç8Ã0´1Ã`‚8ÃÐ:3ÃàO6à ø4Ã`¦2Ã0®2ä5Ã@@6À}1ÃÐ.5ÃðX;Ã`”5ÃpÁ4ÃT4Ã012Ã7ð3Ã5Ãû-ðÎ7à þ3ÃÐÃ1ÃP[8à Ÿ.Ã@Ï3ÃЫ5Ãð”1ÃÐ9Ãà[4Ã@j/Ã33Ã@@6ä5àÅ2ÃPm5ÃŒ9ÃPð4Ãàº9Ã@Ÿ;À/>Ãn:Ã`í;Ã0œ5Ã`4ÃÀ 4ð/ÃÀ~6ÃÀ„5ÀÖ7ÃpD4Ã`š4Ãp :ÃÐÃ1Ã`5Ã@:7Ã3ÀÜ6ÃÐX.Ã0œ5Ãh;ÃàØ4ÃPU9ð“,Ãp:ð]5ÃàÒ5Ãý7Ãðí7Ãpµ6ÃPü2Ã0%4Ãp=à 6ÃГ9ÃpÇ3Ã69à­6Ãð).Ãð2à$8à=ðE9Ãp27ÃÐ:Ã33Ã5Ãý;ÃB7Ãð/-ÃT4ÃàI7à c8Ãà´:ÃÀé9Ãàs0àl,ÃpÇ3à E=Ãðù5ÀÜ6à 3à¹4Ã0~:à06Ã@“=Ãé0Ã0û:ð3ðc4à 6Ãày/Ã7à þ3ÀÜ6à o6Ã0Š8Ãà>ð3Ãð 3Ãàº9ü-Ãàö/ü1Ã0=0Ã'5àÅ2ÃPö3ðc4ÃpP2Ãà[4à 3à¿3à ø4Ãp,8à 2à 2ÃÐÏ/Ã0„9Ã0%4ÃàI7Ã4ÃÐR/ÃpÇ3Ã9.Ã`/1ÀÖ7ÃÀ–2ðc4ÃÀ~6Ãß<Ã@F5ÃÀ5ÃÐ:Ã`š4ÃPü2ÃÀï8à {4ÃÝ2Ãðˆ3Ã`¦2Ãàg2à ]9ÃàU5Ãð4ÃPü2ð .ð-Ã@í.ðo2ÃÐ¥6à ™/Ã3ÃË5ÃP-ðo2Ãp\0Ã` 7Ø3Þ6Ãý7Ãàg2ù8à 1ÃÐR/Ãз3ÃÝ2Ã071àË1ÃP2ÃP -ðø0Àq3Ã`5Ã@X2Ã0º0Ã@Õ2Ã@á0ÃpV1Ãr/ÃP‹0àf-Ã`¸/ÃàÒ5Ãï/ÃÀ5ÃÐF1Ãph.ä1Ã-4Ãðÿ4Ã012Ãp\0ÃÀ2ÃÐá,Ã@R3ÃÀ¨/ÃZ3ÃÀ5Ã0¢4ð{0ÃÑ4ÃP2À,Ãp\0ðo2ÃÐá,à +ÀY7Ã`¬1à ò5ÃpP2ÃQ.À1à «,Ãð2àT0ÃP2Ãà£(ÃÐç+Ã@d0àã-ÃÐ^-ÃÐL0ÃÐd,Àk4à 2à u5Ã@É4à 2Ã@Û1Ãpt,Ã4Ã0Ò,ÃÀ®.Ã0+3À.ÃÚ(à ™/ð .à 1ÃÀ´-Àâ5Ã?-Ã-Ãàð0À.à þ3Ãp>5ÃÐá,Ãàê1Ãð0Ã`;/Ü(ÃÀ„5ð/Ãpý*ÃÐá,ÃpP2Ãð2Ãð /Ãð/-À0)Ãpå.À‰/ÃPÇ&ðø0Ãr/ðì2ÃÐÃ1ÃàÞ3Ã0®2Ê+Ãð¸+àl,àr+ÃÐd,Ãpt,ÃÀ´-Ã@ *Ãp(ÃP©+ÃÈ/à (-Ãà+à ".Ãð²,Ãà¢=Ãpñ,Ãà.ÃpP2Ãpë-Ãà&(À}1ÃÐd,ð“,Ãã1À**ö2Ã`¦2ü1Ãð 3ð/Ã`¸/ÃP8)Ã-0Ã@j/ÃÐ:3Ãàa3àï+Ã@|,Ã@Õ2Ãàð0ð“,Ãày/ê0Ã@Û1ÃW-ÃÀ=,ÃÔ-Ãàm1À.À}1Ãp\0ÃÐj+ÃÀ=,ÃW)ÃK+à “0Ã-4Ã`Ä-ÃP©+ð"*Ã0y&Ãp†)à ‡2Ãà…-ÃÀº,à (-ÃðŽ2Ãp÷+ð/àÑ0Ã0®2Ãн2Ãàs0ði3à :*ÃPü2À‰/Ãà.ÃÐÉ0ÃÀU(Ã0O-à :*ÃQ*Ã`Ä-ð/Ã'1Ã071ÃÀ–2Ã0C/Ã0Ò,Ã@|,Ãæ*Ãx.ÃÀ´-Ã0ä)Ãpb/Ã071À›,Ã@í.Ãàg2ð"*Ã@Ž)Ãàü.Ã0Ò,Ãà.À,Þ2àT0Ãð¸+Ã@p.à u5àÅ2Ãà+ð‡.À.ÃÐj+ÃÂ,ÃÀ7-ÃÐL0Ãpñ,ÃPy3Ã`;/Ãð/-ð/à 3ÃÀ´-Ãà‘+Ã`4ÃÂ0ÃÀØ'à~)àÑ0Ã9.Ã@Õ2ði3Ã@48à o6Ã@Û1ð{0Ã0f>ÃPs4à o6Ã` 7Ã'5ÃàÞ3Ãý;Ãt9ÃPO:Ãð¦.à %Ã0ê(ÃÀI*Ãð;+Ã,ÃÐç+ðu1ð .ÃP2ði3àZ/Ãð0Ã0Ø+Ãð¬-Ãà-à Õ%Ãà-À /ÃÀO)ÃÀ´-ÃÀ´-Ã@ç/ÃP -àr+Ã@ç/Ãpt,Ãð5,Ã@Ï3Ã071àã-ÃpP2Ãð).Ã`Ä-ÃÎ.àÑ0Ã@ *à «,ÃPü2ÃÐR/Ãàü.ÃP2ÃÈ/à 0Ãõ.Ã0=0Ãð2ÃE0ð-ÃÎ.ÃÐL0ÃP-ÃÂ,Ã'1ð/à`.ð¥)ÃP/Ã'1Ãà.ÃP2Ã@v-à65ð‡.Ãð0à¹4Ãpz+Ã`Ð+ðì2Ã0+3Ã`Ð+ð+Ãð/-ð™+Ã`Ð+ÃÀ+/Ã@Õ2ð{0Ãã1à Ÿ.Þ2ÃÐÃ1Ã0Ì-Ã@+Ã],Ãà.Ã@X2ðþ/Ã`¬1Ã`”5àN1ð3ÃP£,Ãx.Ã9.ÃÐç+ÃÎ*Ã0Ò,Ãày/ÃP‘/ÃÀÒ(ÃÐÛ-Ãl0Àk4ðu1Ãð¬-Ãà‘+ÃÀÒ(Ãò(ÃÀO)Ã@'Ãàð0Ã@á0ð-Ã`Ð+Ã(Ã`A.Ãp†)àH2ð{0À.ÃÐÏ/ÃÀ3ðþ/ð{0Ãð).Ã`/1ÃPD'ÃÐ@2Ã@á0ð/ð,ÃPÒ9Ã@±8Ã`5Ã'5ð/à ‡2Ãàg2ü-Ã-Ã`G-Ã@|,Ã@d0ÃÀ+/ÃP/à «,ÃÀ2ÃK+ÃÀ´-Ã!6Ãpñ,À.ÃW-Ã@á0à É'Ã-Ã@j/Ã`Ê,Ã0Ò,Ã@j/Ã-4Ã?-Ãð0Ãpµ6ÃP©+à ½)ê4ÃpÙ0Ã` 3Ãð²,Ã,À,Ã3/Ã`¬1Ãpz+àï+ÃE,Ã-0àã-Ã0º0Ãû-à :*ÃP©+Ãpn-Ã@ç/àé,ÃÔ-àZ/Ã`4Ã3ÃpJ3àl,Ã`/1ÃP,+Ãð).Ãð;+ÃðŽ2Ãàö/Ã`G-Ãð2à 0Ã@v-à (-àr+Ãà‘+Ã`A.ÃÐÉ0ð-ÃK+ÃPü2Ãàg2Ã@R3à ò5Ãà-Ã0ä)Ã`;/Ãàg2Ãé0Ãû-Ãà+À**Ãð¾*Ã~-ÃP‹0Ã@ó-Ãà)Ãà‹,Ãp€*Ã071Ãðe$ÃðS'ÃPy3à ·*Ãð0Ãð4Ã@ç/ÃPy3Ãð#/àõ*à @)ÃÀ¢0Ã071Ã`²0Ãð²,Ã9.Ãð¦.ÃP/ÃÔ-Ã3/àã-ö2Ãàð0Ã@í.ÃÀÀ+ÃpJ3Ã`/1ÃP£,ÃÀ+/Ãr/Ãð4Ãpb/ÃÐv)ÃÚ,ðu1à`.ÃÀœ1Ãàö/Ãày/ÃP…1Ã`/1ÃpJ3ÃP-ÃQ*Ã@ù,ÃÚ,Ãï/Ãð²,Ãph.Ãpñ,Ãàü.Ã],ÃP,+Ãõ.Ã@ *à 0Ãð0Ã~-ÃðÊ(Ä,àï+à~)ö.Ãpë-à 1à Ÿ.Ã@)À•-Ãr/ð™+Ãà+À$+Ãp†)Ã*ÃP0ÃÀ%0ÃÂ,à`.Ã,À<'ÃÀg%Ãà.ê0ðþ/Ãp€*ÃÐó)ÃP.Ãàö/ÃP2*Ãl0Ãàð0Ã0C/ð/Ã@ó-Ã3/Ã0C/Ãàö/Ãð/-À1Ã`A.Ã0Æ.ÃàU5Àw2ÃN5ÃP2Ã?1Ãàa3ðø0À-Ãàü.Ãpñ,ð“,ü1ðc4ÃP0Ã@í.ÃPy3Ã@ù,ÃE,ÃÚ,ÃÀÆ*ü1ÃP&,Ã@^1Ã)Ã@ù,ÃÚ(ð/ð,ð,ÃÐj+ÃP/ÃÐÕ.ÃP—.à ".à i7Àú1Ã` 3ÃÐ@2Ã@p.àf-ÃP1ÃH6ÃP&,Ã@á0ð/ÃÀ2Ãàê1ÃP/ð/ÃÀÒ(Ã`G-àr+ÃpP2Ã0º0ÃQ.Ãàm1Ã@ç/Ã05à .,ÃðÊ(ÃP‘/Ã`6Ãàê1àé,à .,Ã0O-ÃÚ,Ãàð0Ãp»5Ãpµ6Ã0œ5ÃÀ2Ãï/Ã`S+à×/Ãð0Ø3ðÔ6Ã@ç/à 0ð“,Ãl0ÃÐ^-Ãr/ÃÀr8Ã69ÃàØ4ÃÀ6ðò1ÃÀ+/ÃP&,Ãé0à¹4Ãðp7ê4Ã0Ò,Ã`¬1À}1ÃÀ 4Ã92Ãð0Ãpß/Ã3/ÃÀr8ÃÑ4ðò1ÿ7Ãàa3ÃPa7ðÚ5ðø0Ã0®2Ã0+3à 3Ã` 3ÃP.Ãp )ÃÂ0Ã`#3ÃPm5ÃÐ:3ÃP/Ã` 3ÃÑ4ð]5Ã@Õ2ÀÖ7Ã`ÿ8ÃÀ7-Ãpn-ÃpÍ2Ã@Û1ÃÐ"7ð{0Ã` 3Ã`S+Ã`¾.Ã0[+ÃP‹0ÃÀ1Ãf1Ãà…-ÃPê5ÃZ3àT0Ã` 3ÃP/Ã`¦2ÃP/Ãð1Ã0À/àé,à ™/Ãp\0Ãð|5ÃE0Àâ5Ãð¦.Ã`²0À•-Ã0%4ÃPê5Ã@Û1Ãð#/ÃÐÉ0Ã`”5Ãàg2ÃÐ44ê0Ã`¾.Ãн2À1Àƒ0Ã`G-Ã@v-Ãðˆ3à /Ã`#3ÃpV1ä5ö2ð .Ãpt,Ãpb/à06àN1à (-ÃÀº,Ã@ù,à 1ÃÐ^-ÃÐÏ/Ã071ÃÀ3ÃÀ%0à 2Ãà…-à 3ðc4Ã0Ì-ÀS8Ã@«9à Ú9à Ô:ÃÀû6ÃpÇ3Ã'5Ãh;Ãp27ÃÐÃ1ÃÝ2ÃPü2ÃpD4Ãðó6ÃPÌ:Ã06ÃT4Ãé0ÃPä6ðQ7ÃГ9Ã0%4ÃÀŠ4ÃÀŠ4Ãðí7Ã`ù9ÃpD4à 6Ã@L4à 1ÃÀ6Ãðá9Ãà´:Ã0:Ãðù5ðÈ8Ãp»5Ã-4Ã06ÀÊ9ÃÀ 4Ã7Ãð‚4àH2Ã-0ÃP/Ã`4Ãð0à¡8ÃÐ44à:à ø4Ãð”1ði3àÅ2ÃÐ¥6ÃÅ6Àè4ÀÊ9Ã0r<Ã@É4Ã`4ÃÐÕ.Ã0Š8Ãð‚4Àú1Ã@·7Àe5à›9à o6Ã@Ã5ÃPs4ÃÐ9ÃÀï8Ã@Ã5Ãf1ÃPØ8Ã07Ã@“=à9ÃPÞ7Ãõ.ä1ð]5À‰/Ã0%4Ãð#/à ø4Ãðí7ÃŒ5ÃàÒ5ÃÐÃ1ÃP…1Àô2ÀA;ÃPÀ<ÃàÌ6Ã`ˆ7ÃÀõ7ÃPü2Ã`¬1ðì2ðæ3Àe5Àe5Ã`;/à§7Ã09à ò5Ã` 7Ãн2Ãð2ÀÐ8Ã0é=ÃÅ6Ã@Ï3Ã'1Ã06ðø0àB3Ãàð0ÃÐÉ0Ãé0ðu1Ãý7Ãp :Ãr/Ã`A.ÃPÌ:ÃÀã:Ã09Ãz8Ãpµ6ÃП7àq@Ã@‡?Ãðí7ÃPa7Ãà®;ÃÑ4à 0ÃÐ<Ãp&9Ã@:7ÃÐ<ðæ3ÃPÆ;Àè4ÃPÞ7Ãå;ÃÀõ7ÃÐø=Ãðç8ÃÐ<à Â=ÃÀÑ=Ãàg2Ã`‚8Ã'5Ãý;Ãà@Ã÷8Ãà®;Ã`^>Ãh?Ãý7Ã0Š8Ã7à i7ðW6à ]9ÀÐ8à i7Ã0~:ÃðÃ>ÃðÛ:ÃÀT=ÃPCÃà®;ÃГ9à K<à§7Ã`5Ã`í;à È<à}>Ã?Ã@";ÃÀZ<À#@Ãà?Ãà+<Ãðd9Ã0:À)?Ãp?á<à Î;Ãp‹=ÀÄ:ÃP[8Ã`FBÃÐæ@ÃÐ:ÀG:à;ÃÐcAÃ0f>Ãp—;Ã@“=Ã0–6Ã*;à 'Bà -AÃàÀ8Ã@<ù8Ã@½6ÃÐ<Ã0l=Ã0f>Ã0õ;Ãb<à -AÃ’8ÃÐ<Ãë:Ã0Z@àú>Ãp¯7à›9ÃAàî@ÃÀr8ÃðÉ=Ã@";ÃÀÝ;Ã0Ý?Ã0r<Ãà+<Ã0NBÀM9à 3@ÃÀN>Ã0ã>ð'>Ãn:ÃÀr8ÃÀx7Ãðj8à :ÃÐø=Ã@™<ÃP7>ð'>ÃP+@ÃÍ?ð¶;Ã`X?Ãðá9Ãpµ6Ã`ù9Ã\Aà_CÃÀH?Ã0Z@ÃðGÃ@òBÃà@ÃðF>ÃÐ:Ã`^>Ã@@ÃJ@ÃpmBàÜCà 9?Ã`ÃBÃð@?À;<ÃP´>àú>Ã`Ï@Ãð¥CÃAàMFÃð¥CÃ@oCàÐEÃ@";ÃÐu>Ãë>À‚EÀ¾;ð-=ÃàŠAÃ@iDÃ0TAÃ`Õ?Ã0ï<ÃÐQDÃГ9ÃPC<Ã`Õ?ÃÐ<À)?à‰<ÃPDÃÓBà E=Ã0Ý?ÃàBÃ@øAÃP´>Ãß<Ãp?à 'BÃÀ3à:Ã@þ@Ã@“=ÃPØ8Ã0:ÀAÃÀÑ=ÃЇ;ÃŒ9ÃÐ<ÃJ@ÃÀf:Ãð½?À²=ÃàûCÃ0f>ÃðR<ÀÄ:àYDà ò5Ã0ã>ÃðF>ÃàO6ÃPÆ;ÃÐø=à;ÃpaDÃÀf:Ãð^:ÃàÀ8à ]9ÃàO6Ã@(:Ã0„9Ã@@ð¼:À @ÀCÃðÕ;Ã`Û>Ãt9Ãz<ÃÀÑ=Ã0:à<4ÃÀl9ÃðR<ÃÀã:Ãà@ÃPœBÃå;à 'BÃ@>ÃDAÃAÃà®;Ãp>ÃpUFÃ`FBÀEÃ@@à Â=ÃP?ÃP?Ã`ÃBð€DÃ0¿DÃP%AÃ?ÃpêBÃb@ðDÃÐàAÃpÆHÃP~GÃ,IÃ@ÚFÃ0BDÃPGÃ@iDÃ@cEÃжHÃJðµPÃÐ?GÀÿEÃ`:DÃÀ³BÃà×IÃàûCÃ`FBÃÐ3IÃÐQDÃ0JàYDÃPœBÀAÃÀJÃ`½CÃàÑJÃâFÃ`@CÃp%NÃЪJÃPŠEÃð HðVKÃ`™IÑIÃ@iDÃ0NÃ0 MÃðoLà †GàèAÃðþIÀšAÃ&FÃp7KÃÀ¡EÃPDÃ`(GÃ`(GÃPŠEéEÃ`uOàMFÃÐNÃ0¡IÃpOGÃÐÈEà ŒFÃжHÃ`"HÃÐ?GÃâFÃàÅLÃ8GÃpÌGÃÀƒJà tJÃÀ›FÃôCðhHÃ0Jà zIÃÖHÀçIËNÃDEÃ`JÃÀHð\JËNÃ06FÃ`JÃ0BDÃ&JðDNÃJÃ_GàAHÃÐ?GÃÀHÃIæP×LÃ0ƒNÃФKÃÀYQÃÀƒJÑIÃp¢NÃÐ-JÃYHÃÀJÃ`òOÃÀôLà¦LÃMJÃЪJÃp´KðPLà²JÀdJÃPõHÃÀHÃMJÃîDÃ`øNà ýHÃMà ýHà ’EðëGÃОLþLÑIðPLÃ`{NÃ`JÃ2DÃàéF×HÃÐ!Là Gà bMÃPlJÃИMÃðæMÃPïIÃÀeOòNÃÀ•GÃ0§HÃpÀIÃàBMÃÐÂFÃÀúKÃJDà zIÃ`«Fð CÃÀ•GÃ`«FÃðìLÃ0­GàAHÃpUFÃà×IÃJðëGÃ2Hà FÃp´KÃà×IÃàËKÃÐ3Ià €HÃpÒFÀùFÃÀ‰IÃ06Fà GÃpØEÃÀôLÃðGÃVBÃPDÃpOGðDðÁNÃPõHÃ00Gð†CÃp1LÃ`“JàSEÃÐcAÃ0ÑAÃÀ}KÃðcNÃ@?KÃ8CÃÀ‰IÃЀQÃ…KÃpÒFÀˆDÃPBÃDAÃôCÃðiMÃ`ŸHÃðoLÃ,IÃð“FûFà !Cà ëK×HÃpÌGÃALÃÐ?GÃÀ*DõGÃpÌGÃ`±EÃeFàYDÃàTJà¬KðhHÃðGÃàéFð CÃ@QHÃà~CÃ06FÃð“FÃðFÀvGÃP®?Ã@æDÃDEÃ0BDÀ‚EÃÀN>Ã2HÃkEÃîDÃÁEÃðòKÃ0³Fàî@ÃÐ]BÃ@uBÃÀ›FïDÃÀ³BàÄGÃpðAãJÃÀJàw?Ãà„BÃà~CÃb@ÃP+@ÀšAÃÐÈEÃwCÃ0ï<ÃàûCÃ÷<àkAÀŽCðBÃ@uBÃàûCàÖDÃPŠEÃP EÃÀ6Bà €HÃàBÃÀ³BÃÀ IéEÃ0›JÃ0¹EÃð«BÃÀ›FÃ`ÃBÃ@@à ’EÃàBMÀŽCÀ#@Ãß@Ã@ÚFÃ@uBÃpö@ÃÀ•GàYDÃàïEÃîDà -AÃàõDÃPCÃ`«FãFð€DûBÃà¨<ÃpÞDÃPÀ<àèAà žCÀ”BÃ0r<à GÃ0*HÃ@iDà ˜DÃPDðž?ÃÀÅ?Ãp;Ã@@ÃÐ{=ÃP1?Ãñ=ÀBÃ@™<ÃpðAÃDEÃÀÑ=Ã`ù9À)?ïDÃ@þ@ð CÃ0Z@ð°<Ãpü?ÀšAð¤>Ãb@ÃÓ>Ãt=Ãà?ÃðX;ÃÓ>Ã0Ý?ÃðF>à Q;Ãp :Ãð·@Ã}BÃÐò>ÃP==ÃPI;ÃðÉ=Ã0HCûFÃPDÃàûCà ¼>ð†CÃ`IÃ@ìCÃ0ã>Ã0„9Ãà%=Ãð½?à Q;Ã÷<Ã0×@à E=à <ÃàBð9;Ãt9à 9?Ã@48Ã0û:àƒ=à -AÃP´>ÃàC8ù8à <à Ô:à›9Ãn:Ã0:ð?:ð3<Ãp<Ã0Ý?ÃÐÚBÃÙ=ð@ÃÓ>ÃÐ{=Ã@>ÃГ9Ã0=0ÃЙ8ðE9Ãà=9ÃÀÝ;ÃÐ{=à :Ãðó6ÃP1?ÃÙ=ÃÐ:Ãà%=Ãàœ>Ã@«9ÃÐ<ÃÀ2ÃÀT=ÃP®?à•:ÃDAÃð^:ÃPØ8Ã@.9Ã`ó:Ã`X?ÃÀã:ÃË5à¹4Ãë>à Ú9ÃÐ"7Æ6à9à <Ã@™<Æ:à u5Ãà®;À)?Ã@¥:Ã`‚8À¾;Ã’4Ã`š4Ãh;Àk4ðø0Ã0¢4Ãðó6Þ6Ã0–6ÃàÌ6Ã@“=ÃPU9Ã07Ã0%4Ø3Ã@±8à9Ã5Ã`6Ã`”5ÃðÕ;ÃP==ðK8Ãðù5ÃÐ(6ð-=à æ7Ã`5ÃÐ:Ãðd9ÃÀû6à :Ãà%=à³5ÃŒ5Ã0–6Ã@Ï3ÃPØ8ÃN5ÃÐ8ÃðŽ2Ãp\0Ãp86Ãðí7Ãðj8Ã012À7Ã@48ðc4ð?:Àw2Ã05ÃpD4ÃPð4ð¤>Ã0 8Ã` 7Ãà[4à o6ÃÀl9à Ô:Ã@Ÿ;ÃÐ9ÃÐ ;Ã07Ã0+3ð¼:ÀM9àƒ=à :ÃH6ÃpD4Ãð2Ã`Ž6Ãð‚4Ã07À_6ðÂ9ÃÐ@2ÃÐ:3Ã@.9ðÎ7Ã` 7ðQ7ÃàC8Àâ5ÃÀŠ4ðø0Ã0º0À;Ã`ó:ÃPÞ7Ã07ÃÀ 4à <ÃpCIÃàØ4ÃÀã:Ãp>5Ãàº9ÃàC8ð]5ÃPm5ÃàU5ÃH6Ã07à‰<ÀÜ6à ø4Ã0®2ÃÎ.Ã@^1à*7àB3Ã3à 3Ã`‚8ÀÖ7Àô2Ã0¢4ÃàC8Ãà7:àé,Ã@L4Ã@É4à c8àƒ=ö2ÃPð4Ãt9ÃE,ÃàO6ÃpD4ÃP2ÃÀ6Ãf1ÃpÓ1Ãp>5Ãðç8Àk4ÃpJ3Ãp86ÃB7Ã0„9Àî3ä5Ã@á0à 3à ‡2à<4Ãp86ÃQ.àZ/ÃÐ@2à 2Þ2ÃpD4Ãðù5Ã`²0Ã`6ðo2Ãðó6Ã`5Ã`ù9Ãðÿ4ÃÀl9Ã0º0ÃÐL0ÃT4Ãã1ð-Ã@½6Ãз3ÃÀ 4ÃÐF1Ã×3Ã-0Ãà‘+Ã0º0ÃÐÛ-ð‡.Ã@j/À‰/ÃpV1Ãðv6à o6Ã`5ÃàÒ5Ãð0Ã5ÃÐF1ÃT4Ã@F5Ã0=0ð/Ãàð0ðø0Ãðv6Ãà.ÃÀÆ*Ã@±8ÃÐ:3ÃÀŠ4àB3Ä,Ã`¦2Ã!6ÃÐd,ÃÚ,ÃÀx7Ã-4Ã0Š8Ã071Ãð4ÃpÁ4à 6Ã0´1ÃÑ4Ã-4ðQ7ÃÀœ1Àú1Ã`)2à {4ÃÐF1Ãpë-Ãðš0Ã4ÃpÓ1Ãr/ÃÐF1ÃÐj+ÃÐ@2ÃpV1ÃÈ/ê4Àq3Ãðÿ4Àq3Ã'1ð]5Ã@Ã5ÃÐ"7Ã@ç/ÃpÍ2ÃÐÏ/Ã`²0ÃPm5ÃP/Ã`#3ÃË5ÃpV1ð{0ÃpJ3ÃðŽ2Ä,ÃÀ–2Ã0¢4Ã0%4À1Ãðó6ÃÑ4Ãàä2ù8ÃÀ–2ÃpÁ4Ã'5àB3Ãàö/ö.ðo2Æ6Ã`”5Ã~-ÃÐÕ.À‰/À-Ãà+àÑ0ðW6à¹4ÃÀœ1Ã`S+Ãàä2à ™/Ãl0Ãàs0àõ*ÃPy3Ãp÷+ÃP‘/Ã0a*Ãr/à<4Ãl0ÃàØ4ÃÀ+/àË1Ãà.ÃàÞ3ÃÐ44ÃP&,Ã`/1Ãz8Ã`ù9ÃÐ(6àH2Ã’8Ãз3Ã@Ï3ÃPö3Ãã1Ãð#/à o6ÃÐL0ê0ÃP1ðþ/ÃÐ9ÃË5Ãàð0Ã@L4Ã0®2à 3ÃP0Ã`²0àÑ0Ãàg2ÃP-ðò1Ãàð0Ãæ*ÃH6Àâ5Ãph.Ã@ *Ã0´1ÃðŽ2Ãðš0à 1Ãày/Ãé0ÃP/Ãðí7Ãðí7àã-ÃP‘/ÃàC8ÃÀ+/ð/ÃpV1Àw2ÃpÙ0ä1à 3Ãf1ð{0Ã`²0àï+ÃpÁ4Ã0–6Ãpß/ðø0ÃÐÕ.ÃàO6Ã0+3ð3ö2ü1Ãpå.Ã0 8à o6ÃÝ2ÀM9Ã0g)Ã?-ÃP -ÃÐÿ'ÃÐX.Ãpb/Ãp>5Ã0C/ÃpÁ4ðæ3ÃÀ3Ãð /à ‡2Ã`²0Ã@48Ãpt,à ì6ÀÜ6Ã0Ì-àr+Ã071à*7Ã@d0ÃÐÕ.Ã0C/ÃT4Ãp\0Ã7ÃpD4ð,ÿ7Þ2ÃÂ,Ã0+3ÃÐÃ1Ãð#/Ãpý*ÃPü2Ãðù5à*7Ãã1ÃP©+Ãð0ÃP‹0è&à ø4ÃPü2ü-ÃPü2ÃÐÕ.à 1Ã`;/À1ÃP2Ã@á0ÃÀ3ði3Ãàü.Ã@L4Ãð|5ö2ÃÐR/Ãà…-à 2àÑ0Ã@L4Ã9.Ã?-ÃÝ2Ãàö/Ãà…-ð{0àf-Ã@d0ÃÀõ7ÃÀ~6ÃP—.à L'ÃpD4Ãï/ÃÀ2Ã`‚8àB3Ãàm1À$+ÃÐÉ0Ãð#/ö.Ã@Ã5ÃÐL0ð-Ã3/ÃÀ´-ÃÐF1Ã!2Ãðˆ3À.Ã~-Ã@á0ÃP0Ã@á0À.ÃP…1Ã`/1ðu1ÃÐX.Ãpß/à ¥-Ã@ˆ*ÃÐÏ/Ãà,Ã`)2ÃŒ5Ã?-Ã-0Ãpb/Ã0I.Ãàö/Ãð¬-Ãàa3à9à 0à¿3ÃE0Ãàa3Ã0À/ÃPü2ÃPü2ÃÀ¨/ö.ðø0Ã0®2ÃPa7ð-ÃàU5ÃÀI*Ã`)2ÃÀ¨/ÃpV1Ãl0ÃÐF1ÃÝ2Ã-0À,ÃðA*Ãpn-à 1Ãr/Ãðó6Þ6à /ÃÐL0Ãà-ÃÀ+/ÃPµ)Ãæ&Ã0Æ.Ã`/1à 1ÃP-Ã0O-Ã@@6ÃŒ5Ã`²0ÃP.à /Ã-4ÃÀœ1Ã`M,À}1ðì2Ãð 3Ã`²0Ã`S+Ã0Ø+ü1Ã3Ã@L4ÃÐ(6Ãð4ÃàÒ5ð .ÃÐÛ-Ã0¨3Ãð2Ã`;/Ãpn-à 3Ã@j/Ãû-ÃÀº,Ã@X2Ãð|5Ã0=0à «,ÃÐ^-ÃÐL0ÃP1À§*Ãð0Ã@É4Ãàö/ÃÀ¢0ÃpÓ1ÃÀ=,Àƒ0ÃP…1ðu1àZ/à ™/ÃP…1ðu1Ãð4ü1À.Ãpå.Ãpb/Ã`)2Ãàê1Ã@á0ð-ð/Ã'1ðÂ9Ãl0Ã`#3ÃÀõ7ÃÀ3ÃàÌ6À-Ãr/ÃÀ1.àT0ÃP—.Ã'1Ãà.Ãð¸+ÃÀ%0Ãðˆ3Ã05Ãð2ð{0Ãà.à 2Ãr/ÃðŽ2ÃE0ÃÀ¨/à F(ÃÀ1.Ãàä2à 1à 2àÅ2ÃÔ-ÃP/À-Ã0Š8Ãå;Ã@";ð9;Ã0x;à Ú9Àq3À;Ãà Að-=Ã’4Ã`Ü)Ãx.ÃÀû6Ãàä2àú>ÃàxDÃà–?ð¶;ÃP¢AðBÃ>FÃ0NBÃÜGÀpHÃ`(GÃðd9àSEÃÀÑ=Ã@>à‰<à;Ã0f>ÃÀ`;ÃÀ¿@Ãà¢=ÃÀË>ÃÀr8à W:Ãý;Ã@‡?Ã0`?à ]9ð3<ð3<ðK8àq@ðDÃà´:ÃP¢AÃ69Ãà~CÃPDÃðÉ=Ãz<Ãà@à Î;ÃDAá<Ã0f>Ã`ó:ÃÀÅ?ÃÀé9Ã@=Ã0ï<ÃB7ðì2à o6à 9?ÀÖ7ÃPÒ9ÃPÒ9ð¤>ÃÐæ@Ãàä2ÃÐ{=Æ:Ã`ÿ8ÃB7à K<ÃúBÃÐþ<Ã7Ã` 7Ã0¨3ÃÀx7à W:à W:Ã@";ÃÀZ<Ã@L4Ã`ˆ7ÃÀï8Ãp?Ãp:Ãt=ÃÀã:Ãñ9ÃÀx7ð’AÃ0`?ðAÃ` 3ÃЫ5Ãðù5à æ7ÃPÀ<à æ7Àâ5ÃpD4ð?:Ø3ðì2Ã@>ÃÅ6ÃðŽ2ÃPÒ9Ãpå.àH2Ã0+3Ã3Ã0:Ã@=Ã$<Ã@";à W:ð3<ÃŒ5ÃÀl9ÃJ@ÃðÉ=ðÈ8à ]9à:ÃPð4Ãà[4ÃЙ8ç;Ã0`?à*7Ã69Ã@.9Ã0+3Ãh;Ã`‚8ðE9ÀM9Ãð^:Ãn:ÃÀ3Ã@F5Ãë:Ã7Ã0¨3Ãðˆ3Ã'1ÃÀõ7ÃÀ~6Ã@É4à W:ÃÀÝ;Ã0é=ÀÖ7Ã@Ã5Ã@j/àÅ2Ã`2ö2à ‡2à 0ÃpÇ3ÃÀ¨/àÅ2Ã7ÃàÒ5Ãн2Þ2Ã<8Ãp£9ÃPI;ÃÐ8à­6Ã÷8à¹4Ã@É4ÃZ3ÃЫ5ðE9Ã!6Ã@«9ÀY7Ã0 8Ø3Ã`/1ði3Ãà[4ÃPg6à ¥-à +Ã0–6à*7Ã-4Ãðˆ3àH2ÃÀ6ü1Ã@:7ÃÀº,ÃЙ8Ãp>5à à8Ã`”5Ã@ÿ+Ã-0Ãà.ÃPö3Ã<8Ã@48ÃÑ4Ã5Ã`/1ðÚ5Ã`v:Ãðÿ4Ãð 3ÃN5ÃpD4ÃÐ@2Ã012à “0ÃÀ3à i7ÿ7Ã`”5ÃÐ:3ÃP1Ø3Æ6Ã0 8Ã@j/ÃÀ3ÃPm5ÃPö3à ¥-ÃP£,Ã@·7Ã`5Ã@ó-ÃpP2ÃP-ÃÝ2Ã@Ï3ÃÐ9Ã?1ÃÀ¨/Ãf1Ã@|,ÃpJ3ÃÀ–2Ã@Û1ÃpP2Àè4ÃÂ0Ã@X2ê4Ãàö/à06Ãf1Ãð|5Ã@Ï3àT0Ã0¢4ÃÀõ7ÃQ.Ã`)2Ã5ÃË5à­6Ã5Ã`;/Ã0O-Ãз3ði3ÃÐR/ÃÐ(6ÃЇ;à9Ã5Ãph.Ã05à 1Þ2ÃpÓ1Ãàg2Ã@(:à;Ã`š4ÃЙ8ÃH6Þ6ðo2ð]5ÃPØ8Ã` 7Àq3ð†CÃ7Ã@«9Ø7Ã÷8Àe5ÃÐ ;Ã69Ãð±AÃÀZ<ð]5à 6ðì2Ã@.9Ã@:7ÀÖ7Ã@¥:ÀS8Ã`5à$8Ãpµ6ð]5Àî3ÃÀõ7à‰<À}1ÃÀÝ;Ãp&9Ãàs0Ã0œ5ÃÀ 4Ãðç8ð]5ÃðŽ2Ã`v:í:à65à¡8Ãà=9Ã@±8Ã!2Ã@½6ÃP1ÃÀû6Ã`‚8Ãàä2ÀM9Ã@:7à ‡2ÃN5Ãз3ðø0ðK8Ã`í;à$8Ã0œ5ä5ÃÐ:ÃPC<ÃÀÝ;Ãå;ÃÐ9ðE9Ãðˆ3Ã8Ã`”5Ãpµ6ÃÀõ7à o6ÃÐÉ0Àk4ðæ3ÀM9Ãp¯7ðø0ÃpÇ3ÃàI7à æ7À7ðo2Àk4à 1Ã`”5à (-À1ÃE0ÃÐ@2Ãp27ÃðÛ:ÃÐ.5ðì2Þ6à•:Ãàg2Ã012Ãà=9ÃPy3ÃÀ5ÃPü2ÃPü2ÃÀZ<Ã@Ÿ;ÃÐ ;à­6Ã@·7Ã`‚8Ãà=9ÃÀŠ4Ã`¦2Ãß<à Î;ÃÀ~6Ãðí7à›9ÃÅ6ÃÐ:Ã$<à¹4Ãз3à65Ã9ÃÀr8Ãð‚4à ø4ÃP‘/Ã0„9Àk4ÃàÌ6Ãb<Àk4ðÔ6Ã0–6ÃЙ8Ã0„9à06ÃÐ{=Ãð½?ÃP‹0ÃPO:Ã0õ;ÃÀr8ÃÐ:ð¼:Àô2àÝ.ó9Ã@™<Ã` 7Ãp>5ÃPa7ÃPy3Ãà7:ÃÐ"7ÃàO6ÃðÏ<Ã09Þ2Àî3ÃÀŠ4Ã`í;à W:Ã06ÃàI7Ã`Ž6Àe5Ø7Ã@=Àâ5Ã;ÃÀx7ÃpP2ÃП7Ãàs0Ãp86Ã`8Ãðš0ÃÀû6Ã8Ãðp7Ã`”5ÃÅ6ÃÐo?à Î;ÃÐ<à K<Ãàð0Ãðp7ÀÖ7ÃpÓ1Ãðÿ4ð°<Ã`ˆ7ÃÀT=ÃPI;Ãз3Þ6Ã0=0à¡8Ã07ðW6à$8ÃÀ~6Ãp£9ÀY7Ãðù5Þ6Àe5ÃÀ`;ÃÑ4à æ7ðÈ8ÃPm5ÃðÏ<ÃÐ(6Ã` 3à*7ðQ7Ãp…>Ã0~:ÃPg6àN1ðÚ5ÃPð4à È<Ã@Û1Ã@á0Ã@R3Ãðÿ4Ã`4à :Ãpµ6ÃÐ:Ã07ÃÀ5Ãà´:à “0Ã}BÃ`ó:ÃàC8à 1ÃÀÑ=ÃàÒ5à*7Ãz8ðu1Ã!6ÃÀŠ4ði3ðo2ð‡.Ã`5Ã!6ÃÐ44Ã<8ÃÀû6ÃÐ.5ÃN5ÃP2Ø3Àe5Ãð 3ÃPy3Ãày/Ä,À /Ã`¬1Ã92Ã05ÃPØ8ÃPð4Ã],Ã@R3Ã@Ã5Ã-4Ã07Ã06ê0ÃÀ¢0Àk4Ã@F5Ã071ÃPö3Ã0¢4Ãàs0à ‡2Ã0%4ðc4ÀG:ÃЫ5Ã`)2Ã`5Ã`2Ãp27ÃPg6Ã@É4ÃÀ5Ãp :à06Ã`p;Ãý7à06ÃB7Ã@d0ÃÀº,ðÔ6ÃÀ 4Ã69ÃðÕ;Ã` 7Ã`”5Ã`‚8àH2Ã`S+Ãpt,Ã0%4ÃÀ–2Ã012ÃPê5ÃpJ3Ã05Ãð4ÃÐR/ÃÐÏ/Ã012ÃÀ%0ÃÐ:3Ãpë-Ã0®2ðà4à ‡2Ã$<ÃÑ4Ãð4àT0à ø4Ã`#3ði3Ã@É4ðc4Ãx.ÃPê5àÅ2Ãðá9ÃpÍ2Ã92Ã4ðò1Ãð0Ãà®;Ãp¯7ä1ê0ÀA;Ãp¯7Ãp©8Ã@ç/ÃÀ1.ÃP/Ã@Õ2ÃÐ44Ãð‚4ÃП7ðc4Ã@Õ2Ã`Ä-Ãà7:ê0Ø7Ãð0À•-Ãðó6Ã07Ã`¾.ðu1Ã’4Ã@L4ðÔ6ÃË5ÃP‘/ÃÀ1Ã05Ãð /ÃÀ6Ã!6à ".ÃpÙ0à “0Ã0´1ÃÀ¢0Ãð‚4Àî3ÃÐÕ.Ãð).àN1àÅ2Ä,ÃÐÉ0ÀÊ9ð¼:à þ3Ãé0ÃÐ^-ði3Ã33à o6ði3Ãð|5Ã-0à 3ü1ÃÐÉ0à;Ã`4à 6Ãl0ÃP1ÃpÙ0Ãн2Ã0¢4Ã`Ž6Ø7à65àË1Ãð”1Ãp86ÃŒ9ÃЇ;Ãðç8à :*ÃÀ¢0ÃP—.ðþ/ÃÀ2Ã33Ã’4Ãðv6Ã0À/Æ:ÃpP2ÃÐ(6Àè4ÃP.Ã@48Ã`Ê,ÃZ3Ã@Û1ÃpÓ1Ãé0Ãp»5Ã071ÃPs4Ãp&9Ãàs0ê4Ãpë-ä1Ã0®2Ãp86Ã?1Ã@@6ÃÝ2ÀÊ9Ã`Ð+Ã0+3à ‡2Ãp27à à8Ã0g)Ãà…-ÃÐ44ÃpÁ4ÃPg6Ã`¸/Ãðá9Ã!6Ã09ðo2ê4Ã07ü1ÃpJ3ÃZ3Ã`š4à o6Ã`¦2Ãð‚4À0ÃT4à‰<ÃÀ3Ãð|5à­6Ãl0ÃÐ:3àã-ÃT4à¹4Ã!6ÀM9ÃП7ÀG:à þ3Ãp¯7ÃÐu>à <ÃPä6ð9;Ãàü.ÃÈ/à<4Ã0 8à :Ãàä2ÃpÁ4ÃàU5Ãf1ÃPm5à ø4à ‡2à o6ÃPü2Ã0Æ.Àk4Ã'5ÃàO6à ‡2ÃÑ4Ã@Ã5ó9ÃÀ%0ÃÐ.5à§7Ãðj8Ã×3ÃÀ–2Ã7ÃPy3ði3Ã0¢4Ø3ÃPð4à¡8Ã@í.Ãý;à$8à:Ã0x;ÃPa7Ãð /Ã0º0Ã@ç/àT0à`.Ãày/à 0ÃÀ2Ã0Æ.àÑ0Àq3ÃÀ2ÃT4ÃÀ1.Æ6Ãpn-ÃÔ-Ã!6ÃpÁ4Ã`”5ÃpP2à o6Àâ5àÅ2Ã`^>Ãðp7ÃàI7ÃàU5Ã@Ã5ÃÀ1à u5ðæ3à*7àB3àÝ.Ãû-ÃPØ8àÑ0Ãàs0Ãp>Ã09àB3Ã@Ï3Ã0~:Ã0¢4Ã@«9Ã!2ÃN5ði3ÀÄ:Ãð”1ðì2ÃPê5Ã`¦2Ã7Àq3Ãp86Ãðí7à9Ã0:ÃPm5ÃÀr8ðÈ8ÀS8ÃÐ:3ÀÜ6ÃÀï8Ã` 7Ã;ÀÊ9Ã$<ÃPs4ÃÐ<ðzEÃ0~:À¦?Ã`6Ã@";à:ÀÊ9Ãð±AÃñ9Ã0l=Ãà>Ã0œ5ó9à;Ã@>Ãý;ÃÐ:Ã\AÃPÆ;ðK8ÃË5ÃP1?ÃðX;à o6ð@Ãp=ÃðR<ÃÐ<Ãà%=ÃÀõ7Ãp&9Ã@";Ã0œ5Ã@Ÿ;ÃPÀ<Ã09ÃàI7Ã`p;Ãë:à W:à K<ÀÜ6ðÎ7Ãp:ÃàO6ÃÐ:ÃDAÃñ9ð'>ðE9ÀšAÃ`Ï@Ãp—;Ã`‚8Ã69Ãðp7Ã0 8Ãà>Ãp>Ã-0ðÎ7à³5ÃPØ8ÃÐ:ÃÀ„5ÃÀû6à>ÃàC8à Ô:ÃN5Ãà=9à ¶?Ãð^:Ã0œ5ÃàI7Ãðd9à9Ã’8Ãp=ÃP==À¬>à;à$8ÃP%AÃÐ:Ã@·7Ã@@6ÃP´>ÃÐ:Ãt9ÃÅ6à‰<ÃŒ9ÀÄ:Ã`ù9ÃPC<Ã`d=Ã`v:ÃðÃ>Ã`ó:Ãý;ÃÀ–2Ã09ÃðÕ;Ãà¢=Ãàœ>Ã<8à;Ãå;ð?:ðE9Ã\AÃ@Ÿ;à}>ÀÐ8Ã@.9À/>Àq3À5=Ø7à ]9Ã07ÃPm5Ã`j<Ã`p;ÃàU5Ã@™<Ãp:Ã33Ãpµ6Ãðù5ÀS8ÃÐ<ÃГ9ÃÐo?Ãp©8Ã0œ5Ãß@Ã0~:à È<Ãp—;à o6ÃPØ8Ã0–6Ãz8Ãp :Ãp>Ã`Û>ÃVBÃ0r<à c8ð!?à u5Ãt9ðo2Ã`‚8ÃÀf:Ãb<ÃÀr8Ã0x;Ã;ç;ÃÐ.5Þ6ÃÀ`;Ã@½6Ãp27à /Ã@Ï3ðÔ6ê4À;ÃÀŠ4Ã@½6ÃPU9Ãp—;ÃÀ`;Ã0Ý?ð¼:ÃÀ~6ð9;ðæ3Ã9à i7ðÈ8Ø3Ã07à³5Ã?Ã-4à æ7Ã@R3À;Ã@L4ÃГ9ÀÄ:Ãàº9Ã`ˆ7àÑ0Ãf1ÃП7Ãà+<Ã0–6À_6Ã`‚8ÃàC8à o6ÃPÌ:ÃPØ8Àú1Àq3Ã0:Ã÷<Ãp£9ðÔ6ÃPm5ÃÀ–2Ãñ9Ã@Ã5à³5Ãб4ê4ðæ3Ã`”5ð]5À7í:ÃðL=ÃÐ"7Ãàð0à ‡2Àw2Ãf1à ò5à K<Ã`8Ã`4ÃÀœ1ÃÝ2ð]5Ãà7:à ì6à¿3Ã`v:Ãp<Ã@>Ã$<ÃpP2ÃàØ4Ã09ÃÀ®.Ãàa3ÃN5À7à›9ÃÀ5à¡8ÃpÇ3ü1Ãp86ðo2ÃÀx7ÃÐ@2Ãày/ÃPä6ÀM9ÀY7Ãñ9Ãà¢=Ã0–6Ø3ÀA;ð]5à›9Ãp&9Ãp27ÃÐÉ0ÃàU5à*7à ¶?Ã0¢4ÃP2À}1ÃPØ8à‰<Ãðç8Ã0+3Þ6Ã06ÃH6ÀM9Ã'1ðW6ÃÀx7Ã`Ž6ð]5Ã4Ã@:7Ãàº9ÃàO6Ã@j/Ã`ù9ÃðŽ2ê4ÃPö3ÃPö3Ã`d=Ãp©8Ã-4Ã0–6àT0ÀÜ6Ãð|5ÃÐ<ÃÀZ<Ã`š4Àè4à 6Ãp;Ã`d=ÃZ3Ãð#/Ã0¢4ÃГ9Ã$<À5=Àk4ðÎ7Ã@½6Ã09à ‡2à­6Ã!6ÃЫ5Ã0Š8À¸<Ã4à Q;ÃàÀ8Ãé0ÃT4Ãp,8Ãàº9à “0ðÚ5Ã@48Ãð2àB3Ã@¥:Ã!6Ã`¾.ÃÝ2ðì2ÃPü2ÃÐ:ÃpÇ3ÃÀl9ÃÐ:3Ã@Ï3Ãpµ6ÃÐ¥6àÅ2ÃÀŠ4ÃàO6ÃÀf:Ãp>5ÃpD4Ã@48Ã`50Ã@½6à¿3à•:à 0ðu1ðÚ5Ã0¢4Ã@·7ÃÙ=Ã@@6Ã`”5àÅ2à›9Ã0 8ÃÀ´-àË1ÃPä6Ãz8Ã@(:Ã@Û1Ãx.Ã@·7Ãp»5Ãr/Þ2Ãð|5Àú1ÃpD4Ãà[4Ã`)2Àô2ÃÐÃ1Ãн2à ì6Ãr/ÃÐ:3Àè4Ãp :ÀA;Ãðç8àÅ2Þ2à65ö.ÃP£,Ãз3Ã0õ;ÃPÞ7Ãðó6Ã@X2ÃÀŠ4Ãp>5Ãl0ÃÀ¢0ðà4Ã0Ø+À0ðo2ÃÐ:3ðþ/ÃÎ.ÃàO6ÃàO6Àƒ0à 1Àî3Þ2ðæ3ÃÐ.5ÃP…1Ã@X2ÃÀ¨/ð-Ãð1ÃÐL0Ã3/Ã`A.àN1ÃÀû6Ãû-à`.Ã3/ðÔ6ÃÀ„5Àâ5Ãàs0à ".Ã`#3Ã@Û1ÃÐj+Ã'1Ãð 3ÃpÙ0À_6à ò5à {4Ã@L4à¹4ÃàO6ÃÀ3Ã`4Ã9.ä1Ã` 3ù8ê0Ãð|5ÃàU5Ã07Ã@F5Ãà[4Ã@d0à`.Ã`6Ã`¸/Ã`5ÃÀ3Ã'1Ã`”5ö.Ãà‹,Ã`¾.ÃH6Ã`¦2Ãõ.Àô2ÃpP2ÃPg6ä5à 6à ø4Ãõ.ÃÀœ1ÃÐ44ÃÀ¢0Ãp©8Ã0¨3ÃÀ3Ãpë-Ã0=0Ã`50à «,Ã9.ÃË5ÃÀÆ*Ã-0Ãà[4à ‡2Ã`;/à «,ð/àf-àT0Ã071Ã`50Ã@É4àZ/ÃÀ´-à @)ÃðŽ2àr+ÃÀÒ(à`.Ãð¦.Ã0¨3Ãpå.àÝ.Ãx.ü-ÃP‘/Ãð).ð .ÃÀ1.Ä,ÃP©+Ãàð0ÃP…1Ãàö/ÃpÙ0ö.Ãf1ÃP1Ã`Ä-ÃW-Ãð1ðc4à ‡2ÃÀ['À¡+ÃÐd,àl,à 2Ãà.Ã-Ãp86Ã33ÃE,ÃÀ2ÃpD4ð/Ã@ù,Ãà—*Ãi*ÃÐ^-ðþ/ÃÂ0Ãà.à ".à à8Ãpz+Ãp\0Ã`_)Ãàs0ö.Ã-0ÃÀ7-Ã?-Ã0U,À /ðø0àÑ0ÃàU5ÃPä6Ã071Ø3Ãàm1Ã@R3Ã~-Ã0Ò,ÃÐR/Ãðˆ3ÃpÙ0Ãн2Ãþ&Ãæ&ÃÐç+à ò5ÃP -Ã0Ò,ÃÀ®.ü-Ãpz+ÃÐ44Ãf1ÃðA*Ãp\0Ã92À•-Ãpb/Ã`/1Ã`¸/à ¥-ÃE,ÃP0àÅ2ÃðA*ÃÀÀ+Ã@R3Ã@·7ÃÀ=,Ãp\0Ãï/Ãr/ÃÀ1Ã@X2Ã@^1àZ/Ã0º0ÃN5Ãpå.Ã`Ä-à ".ÃpÁ4Ã'5ÃÀ+/ÃÐ@2Ãð0ÃP¯*Ãé0Ãàa3Ãðó6ÃÐF1Ã'1ê4ÃÐd,à)Ãï/ÃÀ3Ãpn-àË1à “0ðo2ÃPy3Ã`;/Ã*ÃE,Ãpå.ÃÂ0Ã`/1àé,ÃÀ7-àé,Ãð 3Ãp»5ÃÐÏ/ÃpÍ2Ãð”1ð‡.ðò1ðæ3àl,À-à <ÃàÆ7Ã’4ÃÀ1.Ã3à 1ÃP.Ãð1à “0à³5Ã0¨3à06Ã@Ï3Ãpý*Ãp>5ÃP…1Ãàü.Ã`/1ðE9ðo2à`.Ãð¦.Ã@:7ð/ÃpÁ4àZ/àf-Ãp>5àé,ÃÚ,à<4Ãpb/Ã`¦2ð]5ð-À-ÃÐÏ/Ã@j/Ã'5ä1Ã@@6Ã0=0Ãð2à o6ðo2ÃÀ5Àî3ÃÐÉ0ÃЙ8Ã’4Ã0º0ÃpÓ1ðK8ð‡.à 0Ãà—*àû)Ã0´1ði3ÃÐ.5Ãðù5À-ð-Ã3/Ãð0ÃÀ¢0Ãàm1Ã@Õ2ÃQ.Ãàs0ÀS8ÃPê5ÃPê5ÃðŽ2ÃpÙ0ð‡.Ã@d0Ãpt,ð/ÃÐX.àB3Ã@j/Ãð /ðo2Ä,Ãð#/Ãp:à 6Ã@ç/Ã@·7Ã0I.Ãð2ÃàÆ7ÃÐ@2Ãpß/ÃÀ2Ãàm1Àq3ÃÐÕ.ÃÐ44Ã012Ãpå.Ã×3à­6Ãð1Ãp»5Ãн2À,Ã`6ÃÐ.5ÃÐÉ0ÃÐ¥6Ã@Õ2à c8Ã@¥:à K<à65ÃÀ1à¡8ðà4Ã07ÃÐ9ÃÐ(6ÃàÞ3ÿ7Ã÷8ÃPð4ÃP¨@Ãë>Ãp&9Ãà7:Ãt=Ãz8Ãz<à 1Ã`6Àk4ÀM9Ã`6ä5à K<ÃN5ÃÀx7Ãà=9ÀG:Ãð‚4ÃÐ44ðÔ6Ã@Ÿ;Ãp£9Ã`ÿ8ÃT4à ø4Ãë:À_6À;ÀÐ8ÃàC8Ãðí7ÃÀl9ÃÀ~6ÃPI;ÃàÆ7Ã7ÃÀû6ðÈ8Ãà%=ÃÐ@2ÃÀx7ð?:Ãðj8ÃàC8Ã\=ÿ7Ãð:@Ãpµ6Ãpµ6Ã@48Ã8ðÔ6ðò1ÃpD4Ãàg2à­6ðì2Ã69ÃPI;Ãà.Ãp©8Ãp<à È<ÃPÌ:Ã@.9Ã@Ï3ð3à ‡2Ãý;Ãðv6Ãðj8Ã<8ÃPÌ:à¡8Ã@Û1Ãp27ÃPä6ÃPê5ÃП7ÃÐ(6ÃPU9ÃPð4ÃPö3ÃЙ8à Q;Ã0%4à*7à þ3Ã`Ž6ÃÅ6Ã0%4ÃàÒ5Ã0º0Ãp¯7Ã`8ðÈ8Ã0„9Ã7Ã@.9ÃPä6Ã@L4ÃÐ@2Ãý;ä5Ãñ9ÃÀœ1ÃPä6ÃpD4à¡8à 3Ã÷8Ã`Ž6ð-=ÃÀ¿@Ã0:ÃÀé9Ã’8À7Ã0%4ÃÐ9Ãðj8Ã4Ã@“=Ãàä2Ãð4Ã`ó:Ã`Ž6ÃÀõ7à 0ÃÀ2à K<Ã@.9Ã0ã>ÃðL=Ã69Ã`X?ðc4Ã@±8Ãå;Ã@øAÃ`ç<Ã`í;Ãð.BÃð2ÃqDÃÐæ@Ã0Ý?ÃàC8À)?ÃÐì?Ã0f>ÃV>Ãà1;Ãà®;Ãà?Ãp»5ÃàÀ8Ãp :à ¤Bðž?à c8à­6ð3<Ã07Ãß@ÃàÌ6Ã@.9Ã69Õ>Ã` 7ÃPO:à;ç;Ã@þ@Ã`ó:Ã`ÿ8Ãб4à§7Ã?1Ãà7:ÃPÀ<ÃÀT=Ãà=9Ãh;Ã0`?Ãb@Ãp‘<à65Ã\=ÃpÓ1ÃÀË>Ã’8à­6ÃÐ ;ÃPÀ<Ãp>5À7À;à ]9ÃÀé9Ã@>Ã`^>Õ>ÃÐþ<ÃÀÝ;ÃPO:Ãp…>ÃðIÃp=Ã0r<ÃЙ8Û=Ãà1;Ãð^:À7Ã?à›9Ãðˆ3Ã=Ã7Ã@@ÃPO:Ãà7:ÃЙ8Ã`í;Ãà¢=Æ:ÃàÀ8Ã@(:à$8ÃpÇ3ÃÀÝ;ÃP7>à;Ãð|5Ãðù5ÃÇ@Ã`Û>Ã@Ï3ÃÐ.5Ãz<Ãp:Ãð(CÃñ=à§7Ãp;Ãpy@Ãà>ÃÀé9ÃÐ]BÃà´:ÀÜ6à Î;ÀM9Ã`ù9Ã@=ÃP´>ð˜@Ã@¥:Ãðí7Ãðv6ÀÐ8Ãð^:ÀY7ÃÀl9ÃP´>ÃpOGð†CÃаIÃðIÃúBÃP7>àeBà Ô:ÃÐþ<ð'>Ã0O-Ãð /ÃÐ¥6ÃЫ5à9À¸<Ãb@ÃðÉ=Ã`X?Ã@½6Ãp;Ã?ÀÜ6ÃÀ`;Ø7ðc4Ã0~:Ã-4ÃpV1ÃpP2Ã` 7Ã@@6Ãàœ>ÃðÕ;ÃÀ~6ÃàI7à;Ãå;Ãðd9ÃÐ{=Ã0 8à Î;ÀÖ7ÃPg6Ãðd9ð¶;ðE9Ãp?à Ú9Ãå;ÃŒ9Ãðç8ÃÐ<Ãðp7ÃPa7ðÚ5Ã`|9ÃÀÑ=Ãðá9ðc4Ãp¯7Ãp<ÃPÞ7Ã07Ã`6ÃPä6ÃÐ:ÃP´>ÃàC8à9ÃÀÑ=Ã0:à<4ÃÐ:ÃðR<Ã@±8ðK8Ã`í;Ã`Ï@ÃPØ8ðÚ5Ã5Ãp©8ÃàÌ6Ã$<Ã`2ÃÀã:Ã7Ãpµ6à$8ÃPÌ:Ã÷8ÃðŽ2Ãàê1ÀÜ6à9Ã0–6ÃÐ(6ÃpÇ3Ã0ÑAÃб4Ã` 7Ãp…>ðo2ê4Ãà1;Ã`ˆ7à<4ÃÀÝ;ÃП7Ã0–6à§7ÃàØ4Ã0 8Ãp>5à Ô:ÃPÞ7Ãp27ðÎ7Ã@(:ð¼:ÀY7à ‡2Ã@:7Ã5à§7ù8Ãð|5àT0ÃÀï8ÃÐ9Ã@Ã5ðì2Ãðù5Ã@«9Ã@:7ÃÀõ7Ã@.9Ãз3Ã@iDÃ0f>Ã07Ãð 3ÃP.À_6Ãë:Ãðó6Ãðÿ4à¿3Ãp,8à:Ã0x;Ã0õ;Àâ5Ã0œ5Ãà¢=ÃàÆ7Ãt9ÃPÒ9ÃðÏ<Ã@(:á<Ã0„9ÃГ9ÃÓ>Àî3à­6ÃÙ=Ã@‡?ÃPÆ;ÃN5à °@Ãñ=Ã0ã>Ã`p;ÃŒ9ÃÓ>Ãàœ>Ãp=àw?Ãp<À;Ã0ã>Ã0¹EÃp :Ã÷<ðBð¼:Ãà¢=ù8à§7ÃPU9Ãà>Ã`^>Ã;Ã`d=Ã\=Ãà@ÃPÀ<ÃÐì?ÃPC<ÃpÇ3Ãp?ð-=ð’AÃÁAÃÀË>ÃÐ9Ãb<Ã@ ?á<ÃÀH?Ãð±AÃPê5Ãà–?ÃDAÃàÆ7à¡8ÃðX;Ãð«Bðª=Ãðá9Ãà=9ÃàÀ8Ãë:ÃГ9ÃÐø=Ã`Õ?ð¶;à=Ã0ã>Ãðj8À²=ÃŒ9Ã*;Ã\=À¾;Ãñ=à=ÃPö3Ã`j<ÃàC8Ãp;Ãp>ÃÍ?Ã?ÃàxDÃPÌ:à 9?ÃЙ8Ãå;à !Cà ªAð!?Ãàº9ðÚ5Ã@";Ã`ç<ð3<ÃЇ;Ãðd9ÃðX;Ã\Aó9ó9ÃÀÅ?ÃÐ"7ÃPFÀ²=ÃÐ"7Ãb<Ãà+<ÀÐ8à$8ÀS8ÃÀx7ð9;Ãp>Ãt9ÃÐ:à æ7Ã`ù9ð!?à*7Ãб4à þ3Ãp86à>ÃÐì?ÃÀã:Ã`2àô?À¸<À¾;Ã0ã>ÃÀ5ÃÐ¥6à‰<ð¶;Ã0x;Ãðç8ÀÊ9ÃÇ@Ãà=9Ã`#3à Q;ð9;À7Ãp—;Ãpü?É@Ã`Õ?ÃÀÝ;Ãp©8à}>Ãñ=Ãð^:à @Ã`Û>ÃÐ{=à ò5ÃàÆ7Ã0¨3ÃÀé9ð3ÃPU9ÀG:Ã`v:ÃÐ ;Ãð‚4ðÔ6ÃPº=ÃÐi@Ã<8Ã;ÃÀÑ=Ã0œ5Ãà´:à ì6à ]9ÃÀ×<ÃAÃÐ"7ðE9Ãp;ð@Ã`ù9Ãà@ÃðL=Æ:Ã071ÃÀ 4ðÔ6ê4Ã>FÃÓ>Ãp&9Ã`8ÃÐ9Ãð^:Ãñ9Ã0f>Ã*;Ã09ÃP7>ÃÀ0CÃPC<ðK8ÃPBÃ*;ÃpÙ0ÃÀr8Ã@¥:Ã`ÿ8Ã09Ã@<ðŒBí:Ã0œ5Ãp‘<Ãð½?Ãp;Ã7Ãp‘<Ã@<Ã*;Àe5à ?>Ã`p;ðQ7Ãðá9Ãp—;ð¼:ð¤>à Ú9Ã0%4Ãð^:ù8Ãðá9ÃH6ÀÖ7à=ÃŒ9Ãð|5à <Ãà@ÃàÅLð°<Ã0ã>Ãð:@à Ú9Ã0õ;Ã@Ã5ÃPg6Ã@(:À;Ã`í;À;Ãà[4Ã8Ãn:ÃPÌ:Û=Ãàº9ÃPg6ÃZ3ÃÐ<ÃàC8Ã`ù9Ã`#3Ã@@6Ø7Ã!6ÃÅ6Ã@(:ð¼:ÃÀÑ=Ã@«9ÃÀN>ÃP Eà æ7à æ7Ãñ9à æ7ÃPO:Ã`5Ã0x;Àƒ0ÃÀŠ4Ãðv6ÀS8Ãà[4Ã69ÃП7Ãà®;ð¤>Ãý7Ã<8Ã0Š8Ã@^1ÃÀ×<Ã`^>à ø4ð9;ðÎ7á<ÃЇ;Ãp<à <ÃË5á<ðK8Ã`ó:ÃÀï8ÀÖ7ÃÁAÃà=9à9ÃPÆ;Ã69Ã0œ5ð'>ÃV>ÃÀõ7Ãh;Ãpü?Ã7Ãpü?ÃÙ=Ã<8Ã@·7Ã06ÃÐ(6ÿ7à9à 3@à {4ðà4Ã`6Ãà–?Ãpü?Ã@F5ÀÖ7à<4ÃÀï8Ã@¥:Ã05à W:ðà4Ãp¯7àN1ÃP-ÀY7ÃÐ:ÃÀ 4ði3Ã69ÿ7Ã*;ÃàC8ÃpÍ2à :Ã07ÃÐ:ÃÀÝ;Ã`6ÀÖ7à=Ãt=ð°<Ãðí7Ãë:ÃPÒ9ðà4àB3ÃÀH?ÃH6ö2Ãðj8Ãàº9Æ:Ã`4Ãðí7Ã0x;Ãðj8ÃÅ6ÃB7Ã7ÃPê5Ã0œ5ÿ7Ã07ÃÀõ7Ã@Ï3ð/ÃÐ"7Ãðó6Ãà.ðÚ5ÃÐ"7ÃH6à*7Ã`ˆ7ÀY7Ãðÿ4à;Ã`/1ÃË5Ã@™<Ãý7Ãå;Ã=Ã0õ;àÅ2Ãp86ÃPa7ÃÀ3Ãp86Ãà.Ã0¢4ðÂ9ð@Ã@·7ÃÀû6Ã@É4Ãб4Ãà7:ðÂ9Ã@É4Ã0¨3ÃP/Ã0 8Ã@:7Ã`4ù8ÃPê5ÃП7ÃÀï8Ãðù5ÃÀr8ÃÐ:ÃàØ4Ã07Ã06Ã@á0ÃЙ8Ã@X2à­6ÃÐ8Ãб4ÃpJ3à¡8Ãàa3Ã'5ÃÀ¢0ÃÐ<Ã`8Ã`8à Î;Ãðˆ3Ãr/Ä,Ãp¯7à 2Ã07Ãp©8Ãë:à i7Ãp>5ÃPg6Ã@R3Ã'1Ãf1ðò1Ã7ü1ÃpÁ4à à8Ã`ˆ7ÃÀ~6ÃàO6Ãðí7ÃЫ5Ã7ÃàÌ6ÃÀr8Ãðv6Ã0¢4Ãz8Ã0¨3Ã`/1Ãðš0ð]5Ã0Š8Ãh;ÃàÞ3à ™/à ø4à 0ÃàU5ÃpÁ4ð3Ã`Ð+Ã@±8à¹4ÃÀ~6à c8Ãp :Ãàs0Ãð#/Ãðˆ3ðo2Ã0ï<Ã@=ÃÐ8ÃÀ–2ðW6Àq3ÀÄ:Ã06Ãð 3Ã0´1ÃN5Ãpµ6ÃÅ6Ã92Ã` 3Ã@«9Ã0û:ðW6ÃÐX.à³5Ã0+3À /Ã-0Ãð#/Ãàa3Ãðv6ÃPg6Ãñ9Ã@Ã5Ã@:7Ã`š4ÃT4ÃÀ1.ÃÀ~6ÃPm5ÃàI7Ãð#/Ãàm1Ã@Ã5ÃÀ1.ÃÐ@2ðÚ5Ã07ÃЫ5ÃÐ¥6ÃË5ÃÑ4Ã@.9Ã`2Ã?1Ã0–6ði3Ø3ÃÀŠ4ÃÐÕ.ÃÀ–2Ãà[4À_6ÃÐ(6ÀÊ9Ã`‚8ÃðÛ:à Î;à‰<Ã@";Ãðp7ðÈ8ÃÀ`;Ãð^:ÃÀŠ4Ã0~:Ã`Õ?Ã`ˆ7ÃÀH?à ?>Ã0ï<Ã@>Ã`FBÃà@ÃAð!?ÃÐø=ÃÐ]BàkAÃPº=Ãà´:ÃðÕ;Ãp‹=Ã0ÅCÃð(CÀCÃà~CÃDEÃpêBÃÀ6BÃ`½CÃàŠAÃP7>ÃÀBÃ`ÉAÃ`ÉAÃpsAàeBð†CÀAÃ@æDÃð(CÀ¦?ÃÐ:ÃÀ¹AðVKðž?Ãð4AÃ0Z@à !CÃð«Bà ŒFÃÀB@ÃàBí:ðAÃà„BÃ0×@ÃpaDÃàrEÃð"DÃeFÃÀ›FÃ\=Ã0ËBÃ@ìCðñFÃÀÅ?à -Að˜@Ã`^>Ã=ÀšAÃP?Ã@@À¸<Ãà1;ÃðÏ<Ã@@Ã?ÃÐÚBÃ>BÃÐ:Ã0„9Ã@™<à 9?Ã`X?À5=Ã;Ãà¢=ÃBÃPÒ9à‰<Ã@™<àƒ=ÃЇ;Ãt9ÃðR<àú>Ãå?ÃÐ<àî@ÃÀË>à}>ç;Ãp>ÃV>Ã\Að÷EÃn>ÃÀT=Ãp‘<Ãðá9ð'>ÃPO:Ã`|9Ã@:7Ã0x;À)?Ã0r<Ã0×@Ãàº9Ã@±8ÃðÕ;À;<ÃÐu>Ãà7:Ã*;Ã`8ÃÀ6BàèAà=Ã@Ÿ;Ãàº9Ãà>ÃP7>ð-=ÃpsAð˜@Ã*;ÃÙ=Ã69Ãà%=ÀG:Ã÷8Ãß<Ãp‹=ÃÐ{=ÃÐ9Ã8ÃÁAÃð·@à‰<ÃàI7Ãp :Ãpµ6àw?Àè4Ãp©8Ã`‚8ð]5Ã` 7à u5à­6à•:ÃPÞ7Ã8ÀÐ8ÀÊ9Ã0ã>ÃP?ÃÀÅ?Ã@þ@à Ô:Ã@>É@à Â=Ã`á=ÃÐ ;à à8Ãñ9ÃðL=ÃpêBÃÙAÃ`^>Ã0NBÃàC8Ãb<Ãð@?ðDÀ‚EÃ\=ÃÙ=ÃPœBÃ`4EÃÀ6BÃ0ÑAÃ@oCÃÇ@ÃAÃ>BÀ)?Ãð·@ÃÀÑ=Ã`Õ?ÀAÃð@?à !CàSEÃ0NBð˜@Ãh?ÃÀB@É@Ã0­GÃÐ]Bð3<Ã@™<ÃpsAÃÙ=Ã@@àî@Ã@{AÃb@à 3@À#@ÃpIHÃpðAÃ0Ý?Ãpy@Ãpö@ÃPDÃÐò>Ãp—;ÃÀé9ÃP7>ðBà=ÃwCÃÐàAÃ`á=ÃàCð¼:À5=Ãñ=ÃDAÃ0r<Ã@=àq@ÃðF>Ã0ËBÃà+<ð?:Ã}BÃAÃð HÃÇ@Ãð.BÃðL=Ãpü?Ã`d=à;Ãàœ>Ã@ ?ÃÀl9Ã@{Að€DÃ}Bà=Ã=Ã`ÿ8À¦?ÃðÏ<ÃŒ9ÃP+@àƒ=Ã@48Ã0BDÃÀ`;à:à <Ã`ó:ÃÀT=Ã`Û>ÃÐ:ÃPC<ÃÀl9à ?>Ãà AÆ:Ã`d=Ã`½Cà È<Ã` 7à;Ãðv6àkAà_CÃP7>Ãp>à æ7ÃàûCÃÀË>ÃÀé9ðÔ6ÃГ9ÃðFà <ÃÐ:Ãb@ÃÐ(6à>Ã8CÃ@Ÿ;à=Ãðí7Ã@øAÃPÒ9Ã`8Ã0ËBà !CÃ0Z@Ã÷8ÃÐþ<ÃÐ<À;<Ãð@?Ãt9ÃÍCÀ;Ãp?à Â=À¬>ÃÐ8À;<ÃÀZ<ÃÐo?ç;Ãà¨<Ã0:À¾;ÃPÌ:ð˜@Ã@ìCÃP==Ã0Ý?ÃPÀ<Ãp=à @Ãb<ð°<à c8Ãð4AÃPC<ÃàO6Ã0l=à65Ãà=9ÃðF>ÃPDÃÓ>Ãp…>Ã`d=ÃÐæ@ÃÀ³BÃÐu>ð-=í:à K<ÃÀé9ÃðÕ;ðª=à i7à E=Ã2DÃð:@ð'>Ã@@àú>Ã0 8Ãðd9Ãð^:ÃÀ`;àô?ÃPU9Ã`p;à o6ð?:Ã`v:ÃpÁ4ÃP[8Ã`ˆ7ó9À#@À;<Ãp=ÃÑ4Ã@:7Ã`ù9ÃÐàAðž?Ãp&9ÃPI;Ãb<Ã@:7à È<à>Ãà Aà æ7ÃPa7à Q;Ã@@6ÃÐ:3Ãß<ÃàÀ8Ãt9ÃPÌ:Ã0ËBÃÀÅ?Ã@.9Ã@=À¾;ÃPÞ7Ãð‚4Ã@48Ø3Ãp—;ðE9Ãðç8Ãz8ÃÀï8ÃŒ9Ãp>ÃPÒ9Ãp…>à i7ÃÐ9à9ÃÐu>ðÔ6Ã0û:Ã07Ãà>Ãp:à Ô:ÃЙ8Ãà1;ÀS8à06Ã0:ÀÐ8ÃpÍ2ð]5ÃÀ5Ãà´:ÃÀ„5Ã@(:ÃÅ6ÃPÞ7à Ú9ÃpD4ÃP[8Ãðç8Ãz8Ã`”5ÃÀ¿@Ã@(:Ãpµ6ðÔ6Ã`Ž6à;Ã0ï<à Ú9Ã@=À_6Ãðç8Ãð 3à i7ÃN5ÃÀ¨/à$8ÃT4ÃP2Ãn:ðÂ9ÃPO:Ãp:ÃàÀ8ÃÐ"7Ãp27ÃàÌ6ÃPÌ:Ãpë-ÃPy3Ãðó6Ãý7ÃP7>Ãð|5ÃpJ3ÃÐ44Ã`4Ã0À/ÃZ3ð‡.Ã69Ã`š4à o6ÃÀï8Àk4à¹4Ãð4ÃàÞ3ðÔ6Ãðj8à :ÃPð4àÑ0Ã@d0à 6ðà4Ã`8Ã69Ãðù5Ã`5Àè4Ã0¨3Ã@.9ÃÐ"7ðì2ÃÀr8Ã@½6ÃàÒ5à þ3ÃðŽ2Àô2Ã@j/Ã8ÃÀ 4Ã06ÃT4ÃpÙ0ÃÑ4Ã0¢4Ã0+3ÃP…1Ã0=0ÃÀœ1Ã`”5Ã0º0ÃPð4Ãð‚4Ãð¬-ÃÀï8Ã`Ž6ðÔ6Ãз3ÃpÍ2ÃË5à ]9ÃÐÃ1ÃÐ@2Ãã1Ãp*À /ÃP…1Ãõ.ÃÀ„5Ã` 3ÃЫ5Àâ5àT0Ã`”5Ãàm1àÑ0ÃT4ÃP£,Ã`4Ã’4Ø3à ò5àT0àN1Ã@ç/ÃQ.àH2À1à`.Ã0Æ.Ãý7ÃPð4Ã`G-ÃÐ@2Ãð¬-Ã05ÃÐ@2àN1Ã`”5Ãp>5Ã7ÃN5à ‡2à³5ÃÑ4ÃàC8Ã@É4à³5ÃPy3ð‡.ÃPä6àÅ2Ã?1ÃpV1à*7Ã@R3ÃÀÌ)ÃH6Ã0%4àZ/Ã@ˆ*Ã`4Ã4ÃÐÉ0à¿3ÃÀ7-Ã`/1ðW6àT0ÃpP2À­)Ãðv6Ãàê1à 1Ãàê1à 0ðK8àÅ2ÃÔ-Ã0I.ÃÐ@2Ã071à`.Ã*;Ãà´:ÃW-Ø3Ã9.Ã@Ï3à þ3ÃÀ¨/ÃÀ´-ÃpD4à (-Àƒ0ÃÀ¨/ÃPC<Ãð 3ö.À‰/Ã05ÃП7Ãð /ÃÀ3Ã0Ì-ö.ÃÝ2Ê+ÃÀ¢0Ã0À/Ãp27Ãà.ê0à­6ÀM9ÃPÒ9ÿ7Ãð 3Ãð4Ã'1ð+Ã!2ÃðŽ2à 3à ‡2ü1ÃPü2Ãð‚4Ã@±8À}1ÃÀ5ÃÈ+ÃpÙ0Ãày/ÃP‘/ÃÐÃ1à ".À0)Ã@Ã5Ã`ó:ÃZ3Ãð /ÃÀ„5ÃH6ÃPm5Ãp©8ÃpÁ4Ãp:ÃÐ:3ð]5Ãr/à 1Ã?1Ã0´1Ãàö/Ã` 3Ãàö/ÃÐF1ÃpÁ4ä1Ãð/-ðu1ð]5ÃH6ÃàÞ3Ã06ÃÀ1ÃPÞ7Ã69ÃÀ¢0Ãà—*Ãð2ÃÝ2Ã@@6À0ÃpÙ0Ã@Ž)À.ÃÀ3Ã0[+À}1Ã-ÃÝ2ÃpJ3ÃЫ5àZ/àÅ2Ã×3ðþ/Ãàs0Àô2ðæ3ÃPü2ð .Ã0g)Ã0À/ÃÐF1ê0Ãï/Ã`¬1Ã0œ5ðò1Ãàê1à u5ÃÑ4Ãl0Ã7Ãàg2à 3ÃP…1ÃŒ5ÃÀ–2Ãé0ÃÀ¢0Ã`6Ã@R3ð{0Ã`²0à “0à³5À1ÃàC8Ãàä2Àw2ÃË5ðo2ÀY7Ã'5Ã0œ5ä1Ã@X2Ãàg2à ì6Ã`²0Ã@j/Ã@Ã5ðW6ÃP -Ã0À/ð/ÃÀ¢0ÃÐ¥6Ã012Ã@±8Ãé0ÃàO6ÃÐ8Ã`”5à*7ÃÀ–2ÃÐL0ÃP‘/ÃpP2Ãàg2Ãð1ð]5Ã’4ÃÐþ<Ã`ˆ7Ãàg2Ãý7ÃÐ44ÃÀ–2Àw2ÃÐ44ÃP0ÃÀ1.Ã`¬1Ã-4Ãï/Ãз3à¹4Ã@·7Ã@p.Ã0+3ÃÐ:3à 3ÃPy3Ã0–6ÃàU5Ãp¯7Ã06à “0ä1Ã`4Ãн2Ãý7Ãñ9Ã0:Ãз3à 2ÃpÇ3ÃЫ5ðø0Ã’4ÃÝ2ÃÐ44Ãàg2ÃQ.Ã`¦2Ã` 7Ã@Û1ÃÐ8Àî3Ã07àN1ÃГ9Ã`/1àN1ÃÀ¢0ÃÀ¨/à¹4ÃK/àH2Ãð‚4à 6ÀG:Ã@Û1Ã33à;Ãðó6ÃàI7ÃÀŠ4à 1àË1à 0Ã0º0Ã'5ðà4Ãpµ6ð{0Ã`”5Ãà7:Ã@±8Ã@Õ2Ãðˆ3À}1à$8Ãð”1Ã@½6Ã`/1ÃPa7ÃPü2Ãp©8ðþ/à {4Àw2Ã071ÃB7à¡8Ãb<àÅ2ÃH6Ã`;/Ã0=0àN1ÃÀ 4Ã@F5Ã`4ÃP2ÃPö3Ã`G-À}1ÃpJ3ÃPü2ÃPy3Ãé0ÃÀ1Ãðv6Ã5ÃpJ3àN1à¹4ÃÂ0ÃàU5ÃÀ–2Àe5à ‡2ÃpÍ2à ò5ÃÀœ1ÃÀ„5À}1ÃÀ3ÃàÆ7Ã!6ÃÀ–2ð‡.ÃðŽ2ðÎ7Ã`š4ÃàÞ3Ãp86à 3à þ3Ã@48ÃàØ4Ã`ˆ7ÃpJ3Ãð /Ã-0Ã012ÃPa7ÃàØ4ÃŒ5ÃÀ®.ÃÐ@2Ãðp7ðc4à³5Ã`²0ÀS8Æ6Ãp»5ÃàU5Ãð¦.à þ3Ãà.Ã0œ5ÃàÒ5ðŸ*Ã@í.Ãp»5Ã`4Ã@X2Ã@@6Ã`#3Ãû-àl,Ø7à`.Ãàð0à ø4Ãðù5à 0à ‡2ÃàÒ5Àw2ÃÀ1Ã0œ5ÃpÁ4ÃÈ+Ã0+3ÃÀ„5ðW6àÑ0ð3ð3Àô2ÃH6Ã!6ÀM9Ãð1ðo2à ‡2à “0Ã@X2Ãà‹,Ã`|9Ã3ÃЫ5Ãf1ÃpÇ3Ã`8à 3Ã7Ã`#3Ã@Û1Ãû-ÃpÇ3Þ2Ã@á0Ãð4ð{0ÃÀ®.à ø4ÃÐÉ0ÃP-Ãpt,Ã@ç/ÃÐÕ.àÝ.àÝ.Ö)Ã@p.ê0ÃÐ(6Ã5ÃP‹0Ãp :ðæ3ÃP2ÃPØ8ð9;ÃÐX.Àƒ0Ãðˆ3À1Ãð²,Ã`¸/ÃàÒ5à06à Ÿ.ð+Ãp€*Ãï/Ã`ˆ7ÃE0ÃP2Ãày/Ãr/Ã’8Ã@Ÿ;Ã0+3Ãð0ð‡.Ã@F5à ø4ä5Ã@Û1àN1à65Ã’4à u5àB3Ãð).ÃP2Ã?1Ã'1ð{0Ãl0à(ÃP‹0à þ3ðo2à65Ãð¬-ÃÈ+ð/ÃK/ð-ðì2ðu1Àw2Ã~-ÃP2*ÃÀ1Ã`)2à ø4Ã`¸/Ã@ÿ+Ãðv6Ãàg2ðo2Àq3Ãð1ðò1Ã<8ðÚ5Ãp»5Ã07Ã3/ÃÐR/ÃÐÛ-Ã0Ì-Ã0º0ÃpD4ÃÐ8à W:Ãp—;à06Ã`#3ÃE0ÃÀû6Ã0¨3Ãàä2ÃB7Ãp¯7À_6Ãpµ6ÃÐ44ÃÀ¢0Ãà.à 1Ã0Ò,ðò1ÃP0Ã0¢4Ãã1Ã-0Ãé0Ã7Ãàs0à «,Ãp÷+Ã0=0Ãàê1Ã@Û1Ãðš0ÃÐ44ÃÐ@2Ã`;/Ãû-à 3ÃT4Ã4Ã69à E=ðì2À-Ã@±8à>ÃP%AÃà¢=à:ð¶;ÃÐEFÃàº9ÃÐ8Ã92Ãà…-ÃÚ(Ã0Ø+Ã@|,Ã-ð3ðo2ÃÀ–2ÃÀï8ÀM9Ãðd9ÃÅ6Ãp‹=ÃÀ3à›9Ã×3ð/Ã0À/Ãð¸+ÃÔ-àT0ÃÈ+à (-ÃÐR/ÃÎ.Ãðš0Àô2Ãàm1Ã@@6Ãðí7ð‡.à 6Ã3ð“,Ãr/Ãõ.ä1ÃÀ¨/Ã0º0ÃP2Ã071à 2Ãð5,Ãðù5ÃÀ2ÃPö3ÃÐ.5Àw2Ãà-ÃÅ6Ãp\0ÃÐá,Ãàs0ü-àÑ0Ã3/Ã@ó-Ãð‚4Ã0Æ.Ã`M,Ãð /ÃÀ®.Ã<8à 0Ãû-àZ/ÃÀ1ð/ÃÀ+/ÃP‘/Ã0¨3à 6À,ÃÐÃ1ð]5à¹4Ãp÷+Ã'5à ‡2ðo2Ã06ÃàØ4ÃÀ2ÃÀ%0ÃÚ,Ãý7À›,Ã0º0ÃpÓ1ÃÐÛ-àÑ0Ãp86ÃÀ2ÃK/à 3Ãàê1ð/à 3ö2ÃP2Ã`š4ÃÐÏ/Ã@ç/Ãpt,àl,ÃÔ)à ".à 1ÃÐL0ÃÐÃ1ÃÀ®.Ã`5Ãàð0Ãï/àl,Ã`5à ì6àH2Ã@í.ü1à ]9Ã3à «,Ãð/-Ãðv6Ãàs0à Ÿ.àé,ÃàC8Ã@X2ÃÀ5Ãðš0Ã?1Ãï/ðì2Ã`A.ÃðŽ2Ãõ.ÃK/Ã`¬1à¿3ÃP—.ÃÐá,Ã`#3Ã@ç/Ã0%4ÃÀ2Ã?1Ãð2Ã?1Ã0Æ.àH2ÃÀx7Ãp»5Ã!2ö.Ã?1ÃÀ5Ã@·7Ãð¸+ÃQ.Ãàa3ÃPs4Ã@X2â'Ãpý*Ãàê1ðò1Ã`ˆ7À‰/ÃÐá,Ãàö/à 0ÃÀ5Ã`¸/Ã'1Ãðš0ÃPg6Ã`²0ÃpÙ0à 1Ãð 3Ã0C/Ãpß/Ã3/Ãàö/à Ÿ.Ã`¸/ÃP—.à 0Ã`Ê,Ãð0Ã`M,À}1Ãð¦.Ãã1Ã](àÝ.ÃÀŠ4Ã@^1Ãph.ÃpV1à ø4Àw2Ã@ÿ+Ãð#/à :*ÃP0Ã0º0ð‡.Ã0O-Ãò(ÃÂ,À$+àr+à 2Ã0œ5Ã`Ê,à Õ%à 2Ã@R3ÃÐF1ÃÂ,à`.À¡+ÃÀ3Ã@Ï3Ã0 8à Ÿ.Ãp†)à ".ð¥)Ãr/Ãpë-à 3Ãð²,Ãl0Ã@í.Ã@d0ÃP2à Ã(Ãàð0Ãé0Ã012Ãpt,Ãð0Ã0%4à ¥-Ã'1ÃÀ¢0àZ/Ã05à /Ãp\0Ãr/Ãà…-ÃÈ+À›,ÃK/Ãð¬-Ã012ð,Ã-0Ãàº9à à8Ãð‚4ê0Ã0[+ÃÀ´-ÃP&,Ãàü.Ã`S+ÃÐí*ð+ÃÐÉ0ÃP©+Ã@ó-à «,à Ÿ.Ã`Ê,Ãб4Ã@á0Ãðš0ÃpŒ(À›,àr+Ã0ä)ÃÀ1.Ãp÷+Ãàð0àN1À /ÃP2ÃÐL0à «,à 'ÃP2*ÃÀº,ÃàÞ3Ãð‚4Ã`S+À,ÃpD4àN1àT0àf-Ãàð0Ã-Ã@d0à Ÿ.ÃÐj+ð¥)Ã0Æ.Ãr/Ãàð0àx*ÃÔ-ÃP©+Ãà.ð/Ã@ó-ÃPü2ê0Ãpë-Ã`¾.Ãà+ÃÂ,à`.ÃÐ:3Ã×3Ãð).Ã~-Ãpñ,Ã@Õ2Ã92Ã0Ø+ÃpÙ0à$8ÃÀŠ4Ãà‹,Àú1à¹4Ã@ó-Ãð0ÃÀ–2Ãàð0ÃP0à`.ði3Ã@á0àõ*Ãð2ðø0ðþ/Ã92Ä,Ã@Û1ð .ÃpP2ÃðŽ2ÃpÙ0ÃÐ%Ã@j/Ãàm1ÃÎ.Ã!2ÃЫ5ÃÐ9Ãз3Ãàö/à³5Ã33Ê+Ãð¸+ÃÀ1.ÃÎ.Àe5Ãð‚4Ã0–6àÑ0ÃðŽ2ÃÐ44à 2ÃP2Þ2Ãà.Ã@í.ÃPü2ÃÀ6ÃÐF1ÃÀ®.à ".Ãз3ÃP -à 1Ã@48ÀÜ6Ãà.ÃÐÛ-À /ðø0ÃðA*Ão)ÃÀ¢0à 1Ã` 7Ã?-ð"*ÃÂ0Ãð /à 0Ã`)2àË1Ãàa3àõ*Ã`¾.Ã0Ò,Ã@v-à65ÃðŽ2ÃàÀ8ÃÐ@2ð .ÃÀ–2à 3ð?:ÃÐR/Ãp,8ÃPU9àZ/Ãàö/à 0ÃÂ0à ±+ÃPü2À}1ÃÀœ1ÃÀû6ÃÐ@2à 6ÃÀ–2Ãà—*àf-Ã0À/à 0àN1à<4ÃPm5ðø0Ã@L4À,à 1Ãà©'Ã`Ö*Ãàö/ÃÐÃ1Àî3ÃÂ0Ã@^1ÃÅ6Ãl0Ã0I.Ã@Û1Ãc+ÃÀ¨/ð-Ø3Ã`Ê,ö.à ò5ÃÀ 4Ãà[4ÃÐ@2à¹4à9ÃÈ/Ã`¸/ÃÎ.Ã`¸/ði3À_6Ãr/ÃÀŠ4Ã@í.Ãз3Ãð‚4ðø0ð/Ãå;ÃàÌ6ÃÀ=,À}1ðì2Ã0C/ö2ÃN5ÃÐ.5Àâ5à65à {4Ã012ðà4Ã0=0Ã0Ì-Ã0:à¹4ðc4à 3À1àÅ2ÃàU5ÃðŽ2ÃÀû6Ãl0Ã@X2ö2à 3Ãз3ÃÐF1ÃP2ÃpJ3Ãð1Þ6ÃpÁ4Ã7Ã`50ÃE,Ã`)2Ã4Ã\=ÃÐ:Ãз3àB3Ãph.Ã’4Þ6Ã@É4ÃÐÃ1ê4Ã@@6Ã?1Ãý7Ãp86ÃÅ6ù8ÿ7à$8Ã`#3ð3ÀY7Ãý7Ã@|,ü1à u5ä5Ã@^1ðà4ÃÐ44à Î;ó9Ã@F5À;Ãðˆ3ÃÀx7ö2ÃàÒ5Ã@½6ê4À•-à ø4ÃÑ4ðà4Ãðd9Ã@Ã5Ã!6Ãf1Ãðó6ÃÝ2ÀY7Ãðá9ðò1àx*Ã'1ö.ÃÐ<Ã`¦2Ã!2ÃÐ(6ÃÀ`;ÃÐ:3ÃŒ5ðW6Ã`²0Ã@ç/Ãp>5ê4Ã0–6ðà4ÃÐ.5Ã`2Ã@·7ÃPÒ9Ã3Ãã1ê4ÃÀû6Ã071Ãàð0Ã7ÃPm5ð/ÃÐÃ1ðø0ÃàØ4À•-ði3Ãз3à ".Ãpb/ä1ÃPê5Ãf1À,ðQ7ÃZ3ÃГ9ÃÀ5Ã4ÃÐ@2Ãàê1ðò1à ".Ã`²0Ã!6ðþ/ÃП7ÃP2Ãp€*Ãàö/ÃП7ðo2ü1Ã!2ÃpÙ0Ã-4Àk4Ã0À/Ãàg2Ã` 3Ã@X2ÃàU5Ãб4Àe5à06à ¥-ö.Ã`/1Ã`ù9àÝ.ðW6à 3Ã?-Àè4à¿3à 6àf-ÃÐX.À›,ðo2Ã@ˆ*Ãàð0Ãý7ÃPö3ê0Ã@ó-Ãpb/À;Ãp>5àB3à 1ÃÎ.Ãðÿ4ÃðŽ2ÃÀ~6Ãðv6Ã0C/Ã`S+Ã`M,Ã` 7Ã012ÃÐX.à o6ðo2Ã`²0à 1Ä,ÃpÓ1Ã@:7Ã33ÃÝ2à 0Ã`š4àé,Ã0¢4ÃÀ®.Ã`)2àÑ0Ã`5Ã4ðæ3Ãàs0Ã0œ5Àe5àé,Ãpë-Ã`Ž6ðà4Ãð¾*ÃðS'Ã9.Àe5Ãp86ÃÐ44ðþ/ÃÎ*Àe5Ãpå.Ã0g)à¡8à 0Ãàs0Ã'1Ã@d0ðW6Àe5Àî3ÃP -ÃpÇ3Ãà…-Ãà…-ÃÐÏ/à 6à 1ðà4Ã-0ÃàÞ3à þ3Ãp\0Ãà,Ã@ç/ÃPð4Ã4ó9Ãà.Ã@F5ü1Ãð0Ã`)2Ãð /ðu1Ã0U,Ã33ÃP1ÃàÆ7ö2ÃÐL0ÃÀ2ÃÀ 4ÃÐÏ/ÃÐR/Ãp27Ã92ÃpÇ3Ã`ˆ7ÃP/Ãз3Ã0O-ÃpŒ(ð™+ÃÐí*Ãð|5Ãð 3Ãðˆ3Ãp86Ãн2ÃðÛ:ÃÐÃ1Ãx.Ã3ÃpÓ1Ãt9ü1à ".à ò5ÃpÇ3àB3ÃÐ<Ã@·7àZ/Ãð4Ã`)2Ã@p.Ãðù5Ä,Ã0Æ.Ãï/ÃpÍ2Ã3Ã0À/ðò1Ãpß/ÃÀ2Ãp\0à65ÃPs4à ‡2à ì6ðà4Ã`¬1ÃàØ4ö2Ãð|5ðà4Ã0¢4ÃP1à Ÿ.Ãõ.ÃpD4ÃÀf:ÀÜ6À**Ã0À/ÃP‘/Ãà-Ãàm1ðo2àN1Ã`)2ÃW-Ãàm1Ãý7Ã<8à 1Ãð¬-ði3Ã`#3ÃÀ2ÃÐ:3Ã0Æ.Ø3Ãðù5à×/Ã-4ÃpÁ4ð{0Ã0º0ð-Ã@d0Àk4Ã@·7à§7Ã@F5Ã`/1Ãð2ÃÀŠ4Ãðš0ÃÐL0ÃÀ3Ã`M,ÃÀ5ÃÀ%0ðþ/À•-ðþ/Ã-Ã@ÿ+àH2à65àH2Ã4Ãl0ö.Ã@d0à (-à 2àã-à u5ÃZ3ÃÅ6Ã5à {4Ãày/Ã@á0ÃT4ÃÐ@2à 3ð]5ðæ3à ±+Ãð#/ÃpV1ÃÐ@2Ã@L4Ãàê1Ãð 3Ãð¦.à .,àT0ÃÐF1ÃðÜ%ÃP.Ã5àB3ÃÐ.5Ã3/Ã`;/à “0Ãð /à ".ÃÀ['Ã`¸/à c8à 3Ã@ó-Ãð0ä1À,Ãï/Ã3/ðì2Ãз3Ã4ÃÐ44ð‡.Ã@Ï3Ã0Ø+ÃÐÛ-Ã0¢4à 2ÃÐ^-Ãð/-ÃÐX.ÃÀ´-Ãàü.Ãà+Ã0I.ÃÐí*ÃP—.ÃÀ®.ð“,ÃÐX.Ãà,'Ãàä2Ã0=0Ã`4Ãð /Ãý7Ãб4ÃT4Ã@ç/ÃÀ´-à­6Ãð5,ð-ü1À.àl,Ã3/ÃÐÉ0à ø4ÃÂ,ÃÐá,Ã@”(ð .à`.ð/Ãp»5Ã`Ä-Ã`v:ü-Ã0Æ.à 1ÃpJ3ÃP1Ã@Ž)Ãð‚4ÃP‘/ä1ÃÀ+/Ãð4Ãà+Ã,Ã@^1Ã`²0Ä,ð/ðþ/ÃP-Ãð¾*ð“,Ã0I.Ã`M,à Ã(Ãc'àN1Ãàð0Ã3/ÃÀ=,Ã@d0Ãpn-Ã@p.Ã'1ÃpÙ0àã-Ã],Ã3/À0ðì2à (-ÀÖ7Ãð0ð‡.Ãàs0à 3ÃP…1Ã0a*ð/à ‡2ÃÔ)Ãàü.Ã`²0ÃPy3Ãð#/ÃP‘/ÃÐ^-Ãõ.ÃP1ÃP -ð/ÃpÓ1Ãàs0Ãàü.ÃP/Ã07à 6Ã@:7Ã`Ž6ö2à 1Ã`4ÃÀÝ;ÃPØ8ÃpP2ÃPm5Ã@ù,ð“,ÃàC8Ã0œ5Ãl0ÃPµ)Ã@½6Ø3ÃÀã:ÃðÕ;à¿3Ã` 7àN1Ã0Ø+àÅ2ä1ÃàÌ6à 3ðo2ðÚ5ÃП7ÃÀé9Ãðá9Ãðv6ÃÀ5Ãp86Ãð).ÃT4Ãp :ÃÐ(6ÃN5Ãàg2Ã09ÃÀ1ði3Ã@¥:Ã`p;Ã@á0àH2Ã0%4Ã09ÃàØ4ðò1ÃЫ5ð°<ðÂ9Ã07à W:À‰/ä5Àô2Ã@É4à*7Ã0º0Ãà+ÃPö3ÃÐF1ÃPy3ðæ3Ãðˆ3ÃpP2ÀS8Ã@¥:Ã@Ï3Ã`2à 1à 3àH2ðW6àË1ö2Ã@Ã5Ã@±8Ã?1Ãð0À7Ãð4ÃÐL0Ã` 3ðÂ9ÃP0ÃÀœ1Ã012Ã92Ã`;/ÃÀ5Ã`2Ãð4ÃÀ~6Ãà=9Ã@É4ÃÀ–2Ã0û:Ã-4Ã`6Ãàð0Ã06Ã`)2ÃÀ6Ã`¬1Ã`2Ãý7Ã0®2ÃpÇ3Ãðˆ3à*7Ãà[4Ã0Æ.Àw2Ã@É4Æ6Ãàê1Þ2Þ2Ãpb/ÃÀ~6Ã`8à 3Ãз3ÃP0ÃÐ(6ÃŒ5Ã`M,Ø3ÃàØ4à*7Ãà=9ð°<Ã0~:Àî3Ã0º0Ã`S+Ã@Õ2Ãr/Ã0ä)Ã0Æ.Ã`ó:ÃÀ+/Ã?1Ã@R3Ã0:Ã`‚8à 0ÃàU5Ãð”1à 2Þ2Ãp,8àÅ2Ãày/Ãpb/ÃГ9ÃÈ/ÃN5à ò5Ã012Ã`#3Ã'1ði3à o6ÃÀ¨/ÃÐR/Ãã1ð9;Ã0 8ÃP—.Ãp>5ð{0ÃÀ3Ã@ù,ÃÝ2Ã@É4Ãðp7Ãpë-Ã@j/ÃàÌ6ÃÀ%0Ã`”5àÑ0Ãð#/ÃPä6Ãf1ÃB7Ã07Ãб4ÃpÁ4ÃPð4ÃÐÃ1Ãð /Ã`#3à 1ði3àH2ÃÀœ1À-ÃPü2ÃÀ¨/à (-Ã@^1ÃPØ8Ãàä2Þ2Ãé0Àw2ÃÀï8ÃÅ6ð/ÃÐ@2ÃÝ2Ãàm1ÃÀx7Ã0 8ð/Ãï/ÃàÆ7Ã!6ÃàÀ8Ãph.ÃQ.ÃÐÕ.ÃZ3À.ðæ3Ã@Ã5Ãðù5Ãð2Ãp,8ÃÐÉ0ð .ÃÀû6Ãp>5Àe5Ã071ÃÐ(6Ã`¬1Àî3À7Ãé0ÃÎ*ÃPs4à 0Ã@í.Ã`ˆ7ÃP‘/à<4Ãp¯7ÃàØ4ÃP/Ã-0Ã`Ä-ÃÐ(6Ãf1Ãð;+à ±+À0Ãз3Ã` 3ðø0ÃE0à 1Ã` 3À‰/ð-Ãp»5Ãðš0ÃPü2ÃE0Àe5àÑ0Àú1ÃÐ@2ÃÐL0Ã0+3Ã`5ÃГ9Ãp£9Þ6Ã3ö.Ãpn-ÃPö3àH2Ã7Ã@d0àl,Ã@ç/ÃH6Þ2ÃP‹0ÃÑ4Ãà+Ã`¸/ÃЫ5Ø7Ãðù5Àî3ÃpÇ3Ãðp7ðc4ÃÀ3ð“,àf-Ãõ.Ã0Ì-Ã0º0Ã0+3À_6Ã33Ã071À}1Ã0À/ÃPð4À}1À.ÃP2ÃP1Ãpå.Ø3à06Ã0´1ÃÐá,Ã`G-à (-Ã0´1àN1à Ÿ.À}1Ã0U,Ãr/Ã0Þ*À0Ã0º0Ã07Ãàê1àH2àN1ÃÀ–2à 3Ã,ðø0Ãðˆ3à 1ÃÀÀ+Ã`2Ã3Ã0Ì-ÃP2ÃP/Ã`G-ð .Ãð0ÃŒ5ÃP…1Ã`/1ÃP.ÃP‹0ÃÈ+ÃpD4ðò1Ã@Ï3ÃÔ-ðþ/ÃàI7à06ÃT4ð/Ã@48ÃPü2ðø0Ã-4ð]5ÃÐ9ÃÑ4Ãý7Ã`”5à³5Ã@Û1ÃP.ð‡.Ã071Ã0O-Ã@á0Ãàê1à þ3Ã07Ã!2Ã@X2à<4Ø3ÃN5Ã`6ÃÐR/Ãé0ÃÐ44Ãpß/ö2Ãàs0ÃQ.À‰/ÃÀ´-Ã×3ðŸ*Ã012ÃÀ 4ÃàU5ðQ7ÃÐí*à ".ð .ÃE0Ã0a*Ãpå.Ãð0ÃpP2ÃPy3Àâ5à 3à×/Ã0O-ÃpJ3Ã-4ÃP£,àÑ0Ãð;+Ã@j/ÃÐL0à 3ÃðM(ÃP -À0Ã@L4Ã0Ò,ÃÈ/Ã`50ÃÐó)Ã@Õ2ðø0à /Ãl0Ãð4ÃÅ6Ã`²0À}1Ã@p.àH2Ãà[4Ãà+Ãà-ÃP2à 2ÃP,+Ãpë-Ã0 8ÃP/ê0àõ*Ãð/-à ·*ðÔ6Ãðš0Ã0À/ÃÀÀ+Ãð0ÃÀ´-Ã0I.à ¥-Ã-Ã@É4Ãð2à .,ÃÀ1.à 0ð/Ãð1Ã0=0ð-ð-ð¥)Àô2à þ3àT0Ãà.Ãð¬-ê0Ã05Ã0¨3ðo2ðÎ7ê0Ã`¸/ð]5Ãp*Ãl0Ãàð0ð/ÃP/ÃP£,Ã@Ï3ÃðÄ)Ã0´1Ãð¦.ÃП7Ã@(:Ãpt,ð-Ã@@6Ø3ÃÀº,ÃÐX.Ã`4ðþ/Àú1Ã`”5Ãf1Ã`Ö*Ãн2Ã@L4ÃÈ/Ã0Æ.à 0Àƒ0Ã0m(Ãp(ÃÔ-ÃPs4à 2À /Þ2àÅ2ÃP£,Ã'1ÃPä6Ã0%4ð-ÃÐd,ÃÐ^-Ãã1Ãï/àZ/Ãàs0àl,ÀÖ7ö2Ã@j/ÃàØ4Ã'1ÃðÄ)ÃÀ–2à ¥-ÃÐF1à 1Ãà )Ãc+Ãàa3À_6ÃÈ+àl,ðþ/Ã0Ø+Ã0œ5Àô2Ã`ˆ7à o6ÃP2Ã-0Ã@ÿ+Ã`Ê,ÃB7Ã`#3Ã@^1Ã,Ãf1ÃpÍ2Ãðˆ3ÃÀl9ð3ðQ7ÃÀ 4Ã0+3Ãp¯7Ãf1ÃÐç+ÃÐ¥6Ã`A.Ã0I.ÃPü2Ã@Û1Æ6Ã92à06ð{0à³5ð]5Ø3Ãàö/ÃÐí*ÃPö3ÃP2ÃÀ+/Ãpë-à¹4Ã`¾.Ãðš0à×/ÃÀ1Ã0Æ.Ã@Õ2Àq3à 1Ãð5,ÃÀ1ÃÐ@2ÃP/Ã`;/Ã(Ãà…-Ã],Ãàê1Ãà-Ã@Û1ÃpÙ0à~)ÃpP2Ãàü.ÃÀ%0ÃP\#Ãà+Ãp†)ÃÀ 4ÃpÙ0Ãp\0ö.à ¥-Ãpt,àr+Ãpñ,Ã@j/Ã`50Ãð1Ã@í.Ãpý*Ãð).ÃÐ.5ð-Ãð/-Ãð²,Ãð/-ÃÀ+/À-ÃÎ.Ã0À/ÃÀÀ+À.Ãà—*ÃÝ2Ãð¦.Ã0O-Àƒ0Ãð²,Àú1à (-Ãï/ði3ð/Ã0Æ.à @)ÃÐÛ-ÃÐó)ÃÀä%Ãàö/ÃÀ1Ã-0ð-Ã-ÃÐ|(ÃK+Ãðš0Ã0a*Ãp )Ö)Ãðÿ4ÃpÓ1Ãð5,Àw2Ã`S+Ã~-ÃÀ¢0Àw2Ãã1Ãpý*Ã`Ð+ÃP,+àã-Ã`2ð‡.Ã0Æ.àã-à 0ÃÐí*ÃPy3Ã`Ä-ÃÀœ1Ã@ÿ+ÃE,ð,ÃÀ%0Ãpz+ð/Ê+Ã],ÃP»(Ã3à É'Ãp*ÃÀ1ÃÀÆ*à .,ÃPy3Ãpb/ÃpÙ0Ãpb/ÃH6Ã`Ü)àN1à ¥-Ã`2ÃÐç+Ã0ð'Ã@+ð/Ã@ÿ+Ã@v-Ã@'ÃÔ-ÃP‹0àH2Ãð¾*Ã`¬1à /À•-à ™/Àú1Ã9.Ã`Ö*Ü(ÃP>(Ãà2&Ã`Ä-à 3à +ðø0ð/Ã`Ð+ÃÐí*Ãà—*à «,ð:&Ãpý*ÃÀº,Ãàs0ÃÀ%0Ãc+ÃP£,ÀÅ%Ã0Þ*Ã@j/àx*ÃÐó)Ã0a*à ‡2ö.Ã,àH2ÃÔ)ÃÀº,Ãæ&À¡+ÃÐÕ.À /ÃÐç+Ão)À-ÃP‘/ÃE0Ã@d0ÃP‘/ÃðY&ÃP…1Ã`A.Ã0´1àÑ0ÃÀ´-Ã`/1ðF$Ãp'à L'Ãc+ÃÀÌ)À**à 4+Ão)Ãp†)À­)Ã05À1Ãà‹,ÃPÁ'ÃðÊ(ÃPö3ÃpÙ0ÃPü2Ãà,Ãà'Ã`50Ã@v-Ãà…-Ã`_)à ™/à ±+Ã@j/ð,Ãæ*Ãp(à +ÃÐj+Ã0I.À‰/Ã0I.ð/ÃÐd,Ãð).Ã0À/ð/Ã`M,À1Ã-ð()Ã`G-Ã?1ÃÐÛ-ÃPµ)Ã0m(à .,Ã],Ã`M,àZ/Ê+ÃÎ.À1ð‡.Ã@|,à ".àZ/ÃÈ/ÃÐL0Ãð0Ã0C/à×/Ãàð0Ã!2ä5Ãðˆ3Ãp86ÃPy3ð .Ãà+ÃÐ@2Ãð /Ã!6Ãà[4ÃpP2Ã`|9ÃÀœ1Ã'1Ãl0ÃÐ¥6Ã'1à 3ÃÀ¢0Ãð4ÃPm5à¿3Ãàê1Ãpë-Ãн2Ã@(:Ãé0ÃpÙ0ÃàÀ8ÃŒ9à$8à06Ãp©8ÀY7Ãp86ÀÐ8ð9;Ãн2Ã9ÃH6Ãàº9Ãðj8Ã<8ðÔ6ÃÐ"7Ã@.9Ãðó6à i7ÃðR<ÃN5Ãp,8Ãð^:Ã0Š8ÃÐ{=Ã>ÃPU9Ã$<Ãàg2à ì6ÃP%AÃDAÃ@{AÃ0¿DÃ?ÃPC<ÃП7Ã`ù9Ã`:DÃÐì?ÃP¨@ÃÀ*Dà ¶?ÃÐ<Ã`p;Ãà=9ÃP1?Ã0*HÃpÒFÃúBðtFÃpÀIÃàlFà Gà ˜DÃß@ÀAà•:Ãày/Ã;ÃðÉ=À¬>ðAð'>ðýDÃ0ËBÃpIHÃkEÃð±AÃÀ¡EÃ@@Ãà@Ãh;ÃPÆ;àeBÃ`ÉAÃÀ`;ÃÀÝ;ÃÐ]BÃn:ÃÀé9Ã`ÿ8Ãp,8À|FÃPBð'>ÃPÆ;Ã`‚8ÃqDÃb@ÃÀ¹AÃ`@CÃ`ç<à‰<Ãë>Ã0ÅCÃàCàú>ÃÀN>Ã0õ;ÃÓ>Ã0ÑAÃÐ]Bð°<Ãt=ð'>Ã0ã>Ã÷8Ã@™<Ãp>Ã=À/>Ãà%=à³5ÃPa7Ãà–?Ã@uBÃÐWCÃð±Aðž?Ãð:@Ãñ9Ã>Ã07ÃpØEÀÄ:ÃÐò>àeBÃÀÃ0õ;Ã`ó:ÃDEÃBÃ0Z@Ã@(:Ã?à W:ÃÀ¿@Ã@";Ã`LAÃð(CÃÐþ<Ãà=9í:ðW6à§7àeBà E=ÃÀË>Ãðá9àkAàƒ=ÃÀr8Ãb<Ãp?ð!?Ã`ù9Ãb@Ã÷<à Ô:Ã0ã>ÀA;Ãà´:ÃÀã:ÃÐø=ÃðÉ=Ãh;à Â=ð!?ð¶;ÃЙ8Ãà7:à !Cð’Aà @Ã`p;Ã07à¡8Ã’8Ã`(GÃ0­Gà‰<ÃÀÝ;ÃÐ8ÃðÉ=Ãp=Ãp>à E=ÃÓ>à=Ã>Ã@=Ã0 8ÃðÉ=Ã0ï<Ã@¥:Ã7ð?:à Q;ðÂ9Àî3Ã$<Þ6à:ÃàÀ8Ãt=Ã69Ã0r<À_6ðæ3Ã0ï<õCÃpsAÃÀÝ;Ã0x;ÃÀB@Ã`Õ?Ã0ï<ÃÐ<ð'>Ã0r<à u5ÃP7>ÃÐ9ÃÀû6Ã@¥:ÃÓ>ÀCÃP+@ÃÀÅ?ÃÀÅ?Ãz8Ãðv6Ãz<ð¶;ÃÐò>ÀÊ9ÃPÀ<Ã`Ï@Ã@.9ÃÐø=Ã`R@Ã÷<Ãðç8ÃN5à i7ÃàÀ8ð!?Ã0TAÃ0~:Ã`Ž6ÃpÁ4ÃPÒ9ÃÐu>Ã7Ã0Š8Ãà@ÃÀŠ4ÃàÆ7Ã0r<ÃP7>ÃàŠAÃp>Ãà>ÃP…1Ãp=Ã`Ï@ÃP?Ã÷8Ãn:ÃÀ5Ãð‚4ÃŒ9ÃÐÃ1ÃÀû6ÃÀÝ;Ã@d0Àô2ÃpÇ3Ãàö/ÃÐ"7ðÈ8Ã`ÿ8ÃP[8ÃPg6ÃPØ8Ã0¨3Ãðš0ÃÀ„5à§7ÃPð4Ã`50ÃPs4à ]9Ãðó6Ã0+3ÃÀã:Ãp»5Ã!6ÃÐX.ðì2Ãpn-ÃH6Ãн2Àw2Ã@(:ÃPy3Ã`Ž6Ãðç8ä5Àô2à o6Àk4Ã0ê(Ã0+3ðu1ðÔ6Ã0+3Ã@@6ÃPO:Ãðp7ÀÜ6Ãð|5ÃÐ:3ÃÐL0Ã@R3ÃP2àÑ0ÃàÒ5ÃÐ8ðÈ8à¹4ð¶;à þ3Ãðí7àé,ÀM9Ãð4ÃPy3ÃÐ.5ÃÐL0ð{0ÃPg6Ã@.9Ã@:7ÃÀ1Ã0[+Ãé0Ã`6Ã`ù9ÃpP2Ã!6Ã?1Ãà[4Ãp¯7ÃP2Ã`;/Ã`¬1ÃÀ 4Ã@½6Àâ5à 2ÀÖ7àÅ2Ã`¦2Ãp>5Ã0¢4Àú1à65Àw2Ã0¢4Ã@á0Ã33à 2ÃP0Ãð1àÅ2ðþ/Ãp¯7Ã0~:ÃàÞ3ðc4ðì2Ã` 3ÃÀû6ÃàI7à`.ÃPU9à¹4ÃÀõ7Ã7ð3Ã07ö2à /Ãp\0à 6ÃÐÃ1àZ/ä5ðì2Àƒ0Ã`²0Ãr/ÃpJ3Ã-4ÃðŽ2ÃpD4àÅ2Ãð4ÃŒ9Ã`5ð/Ãl0Ã@Ï3à9Ãàä2Ã0À/ÃpJ3Ã`Ö*à /Ã@á0Ã0´1Ãàs0Ãï/Ã0À/Ã` 3Ã5ÃZ3ÃÝ2ÃPm5Ãp\0Ã0À/à`.ÃГ9ÃpP2ÃP2Ã'1ÃPg6à65ÃÀ=,ÃŒ9ÃàÌ6àH2àÅ2à:ÃÐ<Ã@@6ÃЫ5Ã`š4ð¶;ÃE,à 1Ãàm1Ãðš0Ãp27Ãз3ÃÀé9ö2ðW6Ãf1à 1Ã~-Ã0Ò,Àâ5Ã0=0à 0Ãp86Ãàm1Ãàm1à 0Ãp»5Ãày/Àq3ÃPm5Ãàê1ÃàÞ3Ãб4Ãpñ,Ã3ÃPð4Ã`²0Ãàê1Ãðÿ4à¹4ðì2ð/ÃП7À7Ãñ9ÃpÁ4Ãð 3ä1Ãð1Ãð²,Ã0®2Ãð2ÀÄ:Ã@Ï3Ã0®2ÃÐ9Àú1Ãð 3Ã`4Ã`Ä-ðì2Ãpt,Ã`”5Ã@á0àÅ2Àô2Ãã1ÃN5Ãðv6à 2à Ÿ.ó9ÃÀ3Ã`5Ã`¾.Ãð²,Ãé0ÃP/Æ6Ãðˆ3ðu1Ãàg2à 2ÃÀœ1àÑ0Ãp :ÃÐ:3Ãpn-Ã92à o6Ã`š4ä5Ãp :à 2À•-Ãàä2ÃÀ´-ÃÀ5ðÚ5ÃPy3Ã`2Ã3Ãã1Ã`¦2Ã’8Ãpµ6ÃÑ4à ò5Ã`š4ÃÀ5ÃÀr8Ã@:7Ãp86ÀÊ9Ã`‚8Ã0:ÃPy3Ãi*ðu1ÃÀr8ÃÐ"7ÃП7Ã`‚8Ãàä2à æ7Ã`6ÃpÁ4Ãð2ÃЇ;ð9;Ã`|9ÃÐ@2Ø7Ã`‚8Ãðÿ4Ã`|9Ãðd9Ã` 7Ã!2ðæ3ÃpÁ4Ã0–6ÃPð4Ãðó6Ã05Ãà7:à¹4ÿ7ÃPö3Ã`‚8Ã`á=ð]5à 1ç;ð?:Ã07Ã0Þ*ÃÐí*Ã’4Ã69ÃÀ3Ã!6Ã09Ã?Ãb<Ã09Ã`8ÃÀf:À‰/Ãð 3à c8ÃÀ 4Ãë:Ã`#3Ãð‚4Ã5Ã@R3ðQ7ÃÐ9À7ðæ3ÃàØ4Ãp;ðo2ÃpV1ÃàÒ5Ã`2à .,Ã05Ã`”5Ãб4ÃÐ:3Ã@É4ÀS8ÃÐX.à æ7Àè4ÃÐ:3Àú1Ã!2Àk4Àô2ê4Ã?-à$8ðø0ÃÀ%0Ãðó6Ã0Þ*Ø7Ã8Ã@@6à65Ãp£9Ã7ÀÖ7ÃB7à ‡2Ã@X2Ã0º0ÃàO6ê4ÃÐ"7ÃàÒ5Ã`|9ÃÀ„5Ãðš0Ã?1à³5ÃE0Ã@^1Ãà=9Ã@F5ÀÜ6ÃÐF1à 1Þ2ÀÜ6Ãàä2ÃÀï8ÃÀ~6ÃàO6ÃpÙ0Ãðv6à 2ÃÐ(6Ãz8ÃÝ2Àe5ÃЙ8Ã4Ã@Ï3Ã05Ã0„9Ãðù5Ã@½6ÃðÛ:ÃÐ9ÃPs4à*7Ãð4à æ7Ãб4Þ2ÃÀ3Ã`)2Ã!2Ã`R@à K<ÃÀ–2ÃH6Ãà‹,Ø3ÃPö3à ø4ð3à ‡2Ãp—;Ã=ÃÐ8Æ6ÃÐ:Ã@48Ãð|5ÃÐ]BÃpgCÃp¯7Ãp:ÃÐò>ÃH6Ãð^:ÃB7Ã@‡?Ãà®;Ãn:ð9;ÃP==ÃÐò>Ã0Ã@>ðÈ8Ã`@CÃBÃp?Ãà AÃÐQDûBÀ¾;Ã>BÃÐcAÃÐÎDÀA;Ã\=ÃP+@ÃP®?á<Ãð4AÃà¨<ÃàBÃP1?ÃÐ{=à ¶?àeBÃP¨@À5=Ãà1;à 3@Ã0f>ûBÃà´:ÃÀÅ?ÃÍ?ÃÙ=àq@ðE9à•:Ã`d=Ã0×@Ã0r<ð°<ð@ÃÀ¿@ÃжHðBÃÀ0CÃ?àq@Ã`ÉAÃÀÃPFÃpIHÃ0$Ià EÃ@ìCð@ÃàCÃ*;ðž?àú>Ãà¢=à Â=Ã`j<àÜCÃP==Ã0×@À)?ÃÐKEÃð4AÃ`á=ÃÐ]BÃpü?ÀóGÃ>BÃt=À¸<ÃAÃ`j<ÃP1?Ã@øAðŒBÃDEÃà>À¬>à 'BÆ:à K<ÃpUFéEÀA;Ã0~:Ã?Ãð:@ÃÀÑ=Ã0û:Ãð@?ÃBðÈ8Ãð±AÃAÃP¨@ÃàŠAÃà+<ÃP¢AÃÀ¹AÃà1;ð¤>Ãð·@ÃÐàAÃ@{Aç;ÃðŸDÀ#@Ãt=Ãb@Ã@=Ã>Ã`ÉAÃPU9ó9Ãp<ÃP+@Ãñ=à E=ÃÐ<ð'>Ã>Ã0l=Ãh;ÃÍ?Ã`á=Ãð.BÃÐo?Ã`X?ÃÐì?Ãpü?Ã4ÃÐò>Ã@ ?ð°<à ì6Ãp‘<Ã2DÃ`d=à=ÀÖ7Ã@±8À²=Ã@:7ð'>Ãà[4ÀÊ9Ã?Ãàº9Ãð¥Cà Ú9ÃÀ¹AÃÐþ<ÃP1?ÃP==Ãð^:Ã`LAÃÐ:Û=ð-=Ã@48Ã@É4Æ:ÃÀx7Ãý;Ã*;Ã0é=ÃP´>Ãp27Ã`8à þ3ÃàÆ7Ã@Ÿ;À;ÃðÕ;Ãà7:ÃpêBÃÀé9ðÎ7Æ:É@ðÎ7ÃPÒ9àw?ð'>ÃðX;ÃPÌ:ÃP==Ã@F5à¡8ðÈ8Ã05Ã7Ã9Ãp»5Ãàº9Ãp;Ã@·7á<ÃЙ8à$8ÃП7Ãàº9ÃÐþ<ÃÀï8Ã*;Ãà[4ÃÀû6Ã÷8ÃÐ9ÃPDÃ@¥:Ã0–6ÃÀï8ä5ÀÜ6Ã’8ÃÀ3Ãà´:ð¶;Ã5ÃЙ8ðo2Ã@Ÿ;Ãà>ÃðR<à§7Ã3Ã0–6Ã69ÃP[8ÃPI;Ãàa3ÃpD4à9ÃГ9ðc4Ã’4à i7ÃPä6ðÂ9Ø3Ãð^:Ãà7:ðì2ÃÐ(6ðÔ6ÃÐF1ÃB7ÃPØ8à ¥-Ãý7ÿ7à à8Ãà7:à 9?à W:à§7ÃÐ9Ãð /Ãðd9ÃÀ`;Ã@";Ã’4à³5ÃÐÃ1Ã@Ã5ÃPg6Ã0%4Ãà=9ð3Ãз3Ãðj8ÃQ.Ã<8ÃPê5Ãp£9ÃÐ¥6Ã0º0Ã`)2ÃÐ"7Ã`)2Ãï/Ã-0ÃPy3Àe5ÃPU9ÃÀ„5Ãð /àÅ2Ãpµ6ÃpÇ3ÃÀ3ðW6ÃÐ44Ã@ù,Àq3ÃП7ðÚ5ðÎ7Ã`v:ðÔ6Ã0¨3ðæ3ÃÐ¥6ÃÐ44Ã3ÃÐÃ1Ã0¢4Ã0ä)Ã@Ï3ÃpJ3Ãз3à ‡2ÃT4Ã0I.Ã`/1Ã0®2Ãàê1Ãð‚4Ã012Àq3ðà4ÃŒ9Ãàº9Ãr/ê0Àw2à×/àÝ.ÃP/Ãð²,ð,ð .ðQ7ÃÀ„5àT0Ãðp7Ãðv6ÃàÌ6Ãp27Ãpz+ÃP2Ãp27à›9Ã012à ]9Ãðj8ÃÀ+/Ãàü.Ã`¾.ÃpÍ2Ã@R3ÃÀx7ÃÀ~6ÃàÆ7Ã5Ãp‹=Ã7Ã5ÃPö3Ã92Àƒ0ÃpÓ1ð3ÃPê5ÃÀ¨/à 3ÃÐ(6Ã`Ž6Ã@Ã5ÃÐX.ÃÐX.Ø3Ã3Ãà-ÃÐá,ÃP1Ãàü.Ãàa3à 3Ãà[4à /ÃŒ5à*7Ã7ð-ä5ÃÀõ7Ã@Õ2Ãp\0Ã8Ã@½6ÃàÆ7Ã0Š8Ãt9àË1Ãpß/à×/Ã@Ã5ÃB7Þ6Ãð/-Ø3Ãн2à u5ÃÅ6ù8Ã3/ÃPa7ÃàI7Ã@½6ÃP2ÃÀ„5ÃÐ.5Ã7ÃÝ2ðÔ6Ã`4àË1ð .Ã7ðu1Ãð‚4à à8ðW6Ã@L4ÃPê5à*7ÃÀ–2Ãàm1ð{0Ã0º0ÃÀï8ðÂ9à ø4ÃT4ðÔ6Ãp,8ÃP==Ãt9Ã0®2ÀÊ9Ã@^1ÃÐ:à <Ã@@6ÃPm5Ã`j<ÃÅ6Ãp<Ãpµ6à o6Ã@·7Ã<8Ãý;ÃÐ"7Ã'5Ã0œ5à ì6Ã@^1ÃàÒ5ðu1ÃÐ(6à ì6Ãðd9ÃZ3ðÔ6ÃH6ÃPI;Ãp27à65ðW6Ãp86ðW6Þ6à c8À/>ð9;ÃÐ:ÃÀ6ð .Ã@:7à¿3Ã4ÃЇ;Ã!6Ã@«9ÃðŽ2Ã@<ÀS8ÃPÒ9Ã’8ÃÀ 4Ã0–6Ãб4Ãñ9Ã0:à ‡2ðà4Ã@R3ÃPð4Ã`v:Ãà[4ÃàO6ÃðŽ2Ãð).à þ3Ã@Ã5à:ÃàÆ7Ã@>Ãp—;Ãðí7Ãp&9ðE9ÃPÌ:ÀÐ8Ã07ðà4Ã05ðÔ6à$8ÃÐ"7ÃÝ2ðÚ5ó9Ãð1ðÈ8Ãà´:ÃÐ<àB3Ãб4ÃàØ4ðÔ6ðc4Ã`#3ÃPÌ:Ãð^:ÃpÁ4à u5Ãp£9ÃÅ6ÃB7Ã`)2ÃE0Ãàö/ÃÀ2Ã@É4ÃPa7ÃЫ5Ã@Û1Ã92Ãp:ðK8ö2Ãðù5Àô2Àq3ðæ3Ãð2ÃÀ5ÃPê5ÃH6ðþ/ÃÐ.5ÃàC8Ãày/Ã`5ÃÀr8àT0Ã@á0ÃÐÃ1Ã`|9Ã`4ðø0à•:Ã`/1ÃàØ4Ãp,8ði3ö2ÀÜ6ÃPs4Ãð2ÃB7ê4ÃpÓ1Ã0%4ÀM9Æ6ÃÐ ;ÃÐ ;Ã`)2ÀS8à 3Ã!6Ã'1Ã’8Ã@(:Ãðá9Ã07Ã` 3ÃPÌ:Ãñ9ðÔ6Ãp‹=Ã` 7ÃPm5ÃP&,Ã`A.Ã?-Ã@^1Ãp&9Ã0¨3Ã!6ÃÀ 4Ãàê1Ã@L4à Ô:Ã0–6Ãp>5ÃÐ"7ÃŒ5Ã0´1ð3Ã0+3Ã92ÃÐ@2ÃÀ3à ì6Ãðç8ÃàØ4Ã071Ãðv6Ã;Ã`ó:Ã`â(Ã0O-ðì2ÃPm5ÃÐF1Ã3Ã'1Àâ5Ãàa3ÃÀ2Ã`Ž6À0ÃPü2ÃB7ÃPä6Ã0Æ.Ã@ù,ð{0Ãàä2Àî3Ã`š4à<4ÃÑ4Ã0=0Ã`/1Ã@á0à×/ÃÀ~6Ã0–6ÃÐ:3Ã`Ž6ÃË5ÃP2Ã`8ð .ðø0Ãpz+Ã0º0Ã0O-ÃÀ2Ã`#3ÃPü2ÃÈ/ÃpÁ4Ãà=9ÃÐL0Ã@j/Ã92à<4Ã` 3Ã0ï<Ã0¨3ÃÐ^-ÃÐ¥6àB3Ãï/ð/ÃÐ@2ð{0Ã9.Ã9.Ãð#/ÃÚ,à:ÃpD4Ã@F5Ãõ.ÃpÓ1Ãp¯7ðQ7Àè4à +ÃÀ=,ð,ÃPð4à o6ðc4ö2ÃÝ2Ã06ÃÔ-Ãpå.Ã0º0ÃÐç+À$+à 0Ã071Ã0C/àr+Ãð”1ð,Ãàê1ÃÀ7-ÃPÁ'ÃPs4ÃP2Ã@j/àT0Ãc+Àw2Ã`G-ÃàÞ3Ãàü.À6(à ".ð/Ã0×@ÃpV1ð“,à 3Ãp†)Ã@ç/ÃQ.Ãà,À}1à 3Ã3/ÃÀ 4Ãà‹,Ãàð0Ã`50ÃÅ6Ãp&9ÃÐL0ÃK/àl,Ãp>5ÃpÇ3Ã0Š8Ãðí7Ãàg2ðø0Ãx.À}1ü-Ãp»5Ãð2Ø3Ã0%4Ã05ðæ3À_6ÃÀ3ð+à ±+ÃÐL0à “0Ã`²0Ã`¸/ðÚ5ÃÀ 4Ã0¨3Ãз3ÃðÄ)Ãpt,Ê+àï+à65à ¥-Ã`Ä-Ã@L4àÝ.Ãð|5Ãà…-à :ÃPð4Ã`4ü1Ã@d0ÃK/Ãð4ÃÎ.ð¥)ÃÅ6Ãн2Ã0Æ.À}1ÃÐ@2ÃÐÉ0à 6ÃÀœ1Ã@v-Ã0=0à¹4ÃP0Ãï/à “0ÃÀ1.ÃÐÏ/À}1ÃZ3Ãàm1ä1ä1Ãð¦.ÃP1Ãðÿ4ÃÀ7-À.Ãl0Ã@‚+ðì2Ãf1à ‡2à ‡2Ãé0Ã@á0Ãp»5Ã'1ÃÔ-Ã`50ÃpP2ðà4Ã3Ãé0ÃP0Ã-ÃË5ÃpÇ3Ã@v-ÃàÞ3à 3ÃPð4àT0à ø4ðì2ê4àN1Ø3ð/ÃÐÛ-Ãà‘+ÃàÞ3Ã`2Ãl0Æ6ÃÐF1àã-à¹4ÃN5ÃÐ:3ÃÀ„5ÃpD4ÃÈ+Ã`/1ðo2À}1Ãï/ÃÐR/Ã@Û1Ã'1Ã`ˆ7Àô2ð]5à§7Ãð‚4ÃÀ–2ÃÀŠ4Ã0:Ø7ÿ7Ãp>5Ãà7:ð9;ð3<Ã@“=Ãn>Ãà>ÃðR<Ãý;ÃÀï8ÃÀÑ=à 3@ÃV>ÃÍ?ÃàxDÃ@@À”BÃpmBÃà„BÃ0ÅCÃP1?ÃDEð@ÃàBÃÁEÃÍCÃBÃpÞDÃðuKÃ8GÃ@ÎHÃ`àRðßIÀ½PÃ`.Fà/KÃPãKÃpCIÃÀwLàGGà¾HÀRMÃpÆHÃKÃà¹NÃð]OÃÀHà#Mà QðÓKà PPÃ/OÃALàÿRÃÀ_PÃÀwLàOÃaQÃ`JÃOÃ`ìPÃPNOÃàÅLÃ@RÀ·QÃÐßVÃpxUÃðÈRàŽPÃP³SÃêOÃФKÃ`uOàçVÃ@QÃà‰VÃRÃ0kRÃPNOÃPËOð8PÃp¨MÃPBQÃÐßVÃÐtSÃŽTÃà VàQÃäPÃÐëTà ÍPÃ0KÃÀSRÃð?TÃÌXÃð]OÃðRà ¯UÃ`ìPÃÐ÷RÃÀèNÃöMðTÃà Và DRÃP*UÃ0wPÃ@!PÃPÃÀÖQÃ/OÃÐ÷RàÛXÔSÃ@Sà/KðbIÃàHLÃ@'OÃ0ôPÃ`ÈVÃ0NÃ0kRÃðøJÃ)PàˆQÃpŠRðµPÃUWÃaQÃðGÃÀMSÃüLÃ0NÃpœOÃSÃ0‰Mà JQðÇMÃNÃ@¤OÃ#QÀÕLÃp–PÃyMÃüPÃp%NøMÃP0TÃà6OÀRMÃ0ôPÀjIÃàÝHÃ)PÃ`IÃ@-NàNÃÐ’NÃ`øNÃLà GÃ`iQÃMJÃ`ŸHàˆQÃðòKÃPZMÃаIà zIÃpœOà”OÃÀJÀdJÃ@°MÃÖHÃ`JÃP„FãFÃKÃTÃGKà ßMÃp RÃÀîMà¦LÃðcNÃß@Ã&JÃОLÃNÃ@9LÃ` Là)LÃÐIÃ0JÃàTJÃp=JÃÀ‰IÃkEãFÃ`™IÃ@ÂJÃðIÃÐÈEàÄGÃðŸDðÍLÃð“FÃwCÃ@?Kð÷Eà Dà ÷IÃÐ3IàÄGÀùFÃ0îQÃ@ÔGÃp+MÃðGÃ0HCÃ@°Mà Gà ýHÃ`"HÃkEÀAÃP~GÃÀƒJÃwCÃàxDÀ‚EÃ0­GõGÃpUFð÷Eà GÃð4AÃ,IÃ`«FÃÐ]BÃð·@ÃàõDÃP Eð CÃÐ?GÃ`:DÀóGà ÷IÃà AÃ>FÃ@òBÃÙAÀCÃà@ÃðÃ>ÃðGà †GÃ0³FàÄGÃp?ÀvGÃÐEFÀCÃPGÃð™EàèAÃVBÃàBà 'BÃP+@à GÃVBàYDÃ@?KÃÀ‰IÃpØEÃèEÃðIÃ@øAÃ0`?Ãàœ>à -AÃP+@à zIÃÀã:ÃðR<À#@Ã}BÀ”BÃîDÃP–CÃ\AÃ$<ÃÐu>ÃàxDÃÐWCÃÐò>Ãz<Ã`LAÃàCÃàCÃ0û:ÃÐQDÃ`Ï@à -AÃPÀ<ÃÀ6BÃÀGÃJ@Ã`^>ÃpUFÃ@ÚFà DÃ0l=Ã`@Cà K<àq@Ã0BDÃ0TAÃñ=ÃðX;Ã>Ã0~:ÃÀ×<à ªAÃ0×@ÃP?à Ô:ÃÀÝ;Ãp>Ãp=ÃÇ@ð¼:ÃP®?ÃPBÃðFà ’Eð CÃP?à žCÃÐi@à <Ã÷<Ã@ìCàâBÃÀ¿@ÃP¨@àô?àkAÃÀ`;ÃPÌ:Ãð™EàkAÀ)?Ã`X?ÃDAÃpðAÃ>ÃÐIÃà`HÃ@‡?Ãà AÃ`Û>Ãà~CÃÀÑ=Ã0Z@Ã@>Ãð(Cà @Ãð·@Ã0¿Dà ªAð€Dð!?ÃÀB@Ã0ËBÃ@-NÃ`·DÃP´>ÃÁEÃÐþ<ÃÙ=ÃP–Cð¼:ÃP¨@ÃPC<Ãn:Ãðó6ÃÐæ@Ã`@CÃÀ$EÃñ=ÃpðAÃ2HÃÙAÃ0r<ÃÀÑ=ÃPÆ;à ?>Ãp&9Æ6ÃÍ?ÃP+@ÃJ@Ã@òBð¤>Ãà@ÃÐ<ðK8à Dð†CÀAÃðF>ÃÀZ<Ãð|5Ã69ÃÐ{=Ãñ=ÃGàô?ðž?à•:àƒ=ÃP´>ÃЇ;ÃÀ¹AÃ`d=ÃÐo?Ãà%=Ã0é=ð3<À)?Ãð:@Ã`R@À¾;ÃÀH?à E=Ã0ÅCð°<Ã?Ã\AÃ8GÃà7:ÃÇ@Ãà7:à ?>àî@Ãp>Ã`Û>Ãàœ>ÃÀ6BÃpsAÀšAÃ@(:ÃÀf:ÃwCÃÀH?ð¶;Ãz<ÃÐþ<à}>Ã06FÃ0Š8Ãà=9à*7àô?Ãp‹=ÃÐàAÃ@™<ÃàÀ8Ã=ÃÐÚBÃP?Ãà?Ãp£9Ã=à Î;ÃðX;Ãpµ6à Q;à ]9Ã<8ÃPÀ<Ã@‡?ÀA;Ãý;ÃàÀ8Ãà=9ÃP?àèAÃp?ÃÐ<Ã@>Ãn>à K<ÃÀÝ;à>ÃÐø=Ãp…>Ãð@?ÃÀZ<à;Ãz8Ã`v:Ãp»5ÃàÀ8à$8Ã`|9ÃÐø=ÃP==ÃÀN>Ã0l=à;à Â=ÃðÃ>Ã`ù9Ãðù5Æ:Ã0 8Ã`”5ÃP´>ÃPa7ðK8ÃÀ`;ÃPC<ÃÐ:à$8àw?Ãß<Ã69Ã@.9à Q;À7ÃÐcAà È<À¸<ð¶;à <Ã*;À¬>à ]9ÀÐ8ð¼:Ã0–6À)?Ã`ó:Ã`Ï@Ã4Àô2ÀÄ:Ã`p;Ãpµ6ÃPÌ:Ã`^>ÃðÛ:Ãp?à DÃ$<Ã@";ÃÀË>Ã'5à i7à ì6ð'>Ãðá9Ãн2Ãz<Ãðd9ÃPO:Ãð|5ÃP%AÃ@¥:ÃÀé9Ãt9ÃÐ<ÿ7Ã@·7Ãë:ÃÀT=ð-=Ãð±AÃPÞ7Ãp;àú>ÃPÒ9ð'>Ã`‚8ÃP´>À¾;Ã0õ;Ã@±8Àâ5Ãp :Ãp‘<Ã07ðÚ5Ã0 8Ãà´:À¸<ÃPê5Ãà Aà Ú9Ø7ÃÀx7ÃàI7à:Ãå;ÃÀH?ÀÐ8ÃPy3ÃPm5ð@À_6Ãз3Ãp?Àw2Ãн2Ã@";Ãð|5ÃГ9ÃP…1à¡8Ãp<Ã33ÃЫ5Àâ5à;ÀÄ:Ãà%=À#@ÃÐ8ÃÂ0ÃÐ.5ðÂ9à ø4à {4Ã8Ã`”5ÃÀ1ÃÐ:3ÃP==Ã`v:ÃPÆ;Ã@þ@Ã@:7Ã’4ðE9à 2Ã7ÃÀ3Ãz<Ã3/à³5ê0Ãð1ÃÐÉ0Ãàð0Ø3ðK8ÃÐ<ÃÀ~6ÀÊ9Ã`ù9ð9;Ãàg2ÃÅ6à 2Ãàm1ÃàÞ3Ã@·7Ãñ=ÃPI;ÃPg6Ã`p;Ã`v:ÃÀû6ÃPm5ÃàÀ8à W:Ã9Ã`ˆ7ðW6ÃPü2ç;à :à¡8à;ÃÀÑ=À;à c8ÀS8à Ú9ÃÀã:ÃpäCÃb@Ã@@ÃÍCà <Ã@™<Ã`^>Ãpü?ÃðþIÀšAÃÀË>ÃÀ¹AÃÐþ<ÃÐKEÃÐ]BÃå?Ãë>Ã÷8Ã0TAÃ`Û>Ã`^>à K<ÃPFÃÜGÀ#@Ã@“=Ã@iDÃÐi@ÃðÏ<Ãàº9Ã@=ÀÊ9ðýDÃ`Ï@à W:ÃðL=ðBÃÙAÃ0`?Ãà@ÃAÃpö@à -AðDà;ÃÐWCð!?ÃP–CÃ`.Fà ¼>Ãpy@Ã?Ãý;ÃÀ×<Ã@>àq@ÃÙ=ÃÁAÃ`^>ð!?Ã$<Ã*;à K<Ãp,8Ã0f>Ã?Õ>ÃÐþ<À)?ÃÐo?õCÃ@ ?Ãð.BÀ/>ÃÀ³Bàú>ÃÀB@ÃðŸDÃ@@à Â=ÃÙAÃà¢=à}>Ã0BDÃp?ÃÀ¿@Ã09ÀÊ9ÃPC<Ã@Ÿ;àèAÃ`ç<Ãp?Ã@þ@à ?>ÃP?Ã@>ÃÐæ@ÃpaDÃÐo?ÃÐo?Ã`p;ÃàCÃÐ:Ãå?Ã@“=Ãp‹=ÃJ@ðÂ9ÃP7>ÃàõDÃ0–6Ãp?ÃPÀ<Ãà?Ã`X?àÜCà}>ÃÀ¿@à ¤BàÖDÃb@Ãà®;ÃÐ<Ã0NBÃPÌ:ÃÀZ<ÃðF>ÃÙ=Ã@<Ã`d=àèAÃ0é=ÃÀ¿@à$8ÀY7ÃÀË>ÃPm5ÃÀZ<Ãà?Ã0Ý?ÃPO:ð3<Ã`ç<à ]9Ã0Z@ÃPÀ<Ãðç8Ã0ï<ÀA;ÃúBà;Ãp,8Ã` 3Ã0%4à ì6Ã@¥:à=Ã7Ãý7Ã<8ÃàO6Ã`‚8ç;Ãh;à Ô:Ã`ó:Ãz8À²=Ã0 8ÃPm5Ã`í;Ãð4AÃðL=Ã`ÿ8Þ6ÃðX;Ã÷8Ã@ ?ÃÐ]Bà Î;ÃðÛ:Ã`á=Ãp>Ãà7:Ãp;Ãà¨<Ã`á=ÃÀé9à à8Ã0¢4Ãn:ðÂ9Ãp>Ãp;Ã0:Ã0x;à¡8à c8ÃÐ<Ãñ9Ã3/ðò1ÃÚ,ÃPü2ÃðR<ÃÐþ<ÃÐ9Ãn:ÃÀ`;Ã06ÃàI7ÃðÕ;à à8Ãp,8ÃàÒ5Ã@48Ãñ=Ãt9à i7Ã07ð3ðÚ5Ã`4Ã@«9ðc4Ã0û:ÃÅ6ÃÅ6ÃÐ(6Ã5Ãð 3ÃB7à­6Ãp<ÃPÆ;Àk4Ã9ÃÀ×<ÃŒ5Ã0+3Ãð 3Ãý7Ã0~:à­6ÀM9à o6ÃPä6à<4ÃPÀ<Ã0f>ÃÀ–2ÃpÇ3Ãp>5àN1Ãà´:Ã`ˆ7Ãð^:Ãpµ6à<4Ã` 7ÃPy3ÃÀé9Ãðp7ÃÙ=ðQ7Ã`ÿ8ÃPð4Àô2ÃPä6Ã@@6ÃZ3Ãðv6Ã@Õ2Ã`Ž6ÃV>ÃÀÝ;ÃÝ2ÃPü2ðK8Ãàö/Ãàa3Ø3Ãðù5ðà4àÅ2àÑ0Ã`”5ÃPs4Ãð).Ãf1àË1Ã@½6À1àZ/Ãз3ÃpÙ0ÃPs4Ã0¨3ÃÐF1à9ÃE0ÃàÞ3Ã@.9Ã92Ãpå.Ã`/1ÃPð4ÃW-Ã`¬1Àè4ÃàÒ5Ãp©8Ã`/1Ãðÿ4Ã@^1ÃÀ['ÃÀ3à65Þ6Ã0õ;à ø4Ãð1à ø4ÃPö3Ã0U,ÃpÇ3Ã`6Àw2Ãàð0Ãðv6Ã0®2ð{0ðò1ÀÜ6Ã4Ãàö/ü1Ãã1Ã`/1ð+ð‡.ÃPy3ð¥)ð‡.Ã`;/ðø0Ã@ó-ÃPð4ÃÀ1ÃK/Ãà.Ãày/Ã@48Ãðá9Ã06Ã5Ã92ÃÀË>Ãp»5ÃPy3Ã@@6ÃPs4Ã071Ã`¾.Ãн2Ø3Ã0Š8À}1Ã@R3Ã0®2ÃPä6ÃÀ5Ãàº9ðu1Ãàö/Æ6àH2Ãðÿ4ÃPC<ÃÀÝ;ðQ7Ã@Û1ÃPy3ðø0ÃPÒ9Àe5à :Ã0:Ãðj8à¹4Ãðp7ó9Ã’4Ã<8À)?Ã@Ÿ;à ?>ðì2À;<ÃðR<ðE9Ãý;Ãà1;ÃàCðQ7ÃÐò>à Î;Ã`ÉAÛ=Ã`j<ÃÐ<Ã`R@Ãë>Ãð¥CÃà¢=ÃðÃ>Ã`j<Ã`á=Ã@iDà ¤BÃÀ¹AàkAÃðÕ;Ã@@Ã0×@Ã0f>ðÚ5Ãn>ÃàŠAÃÐø=ÃP==Ã@@àÐEÃàõDÀ;Ã0TAÃÐì?à -AÃð·@Ã`R@Ãå?Ã}BÃÐcAàYDðBà 3@ð¤>Ã?Ãp?ÃpsAÃ?ð˜@ð¤>ÃÇ@Ã0ËBÀ¸<à Q;à 3@ÃÐÔCà -AÃ@<ÃÐàAÃðF>Ã`Û>ÃP%AÃàrEÃðÉ=ðAÃÐWCÃð«BÃpmBÃÇ@Ãð™EÃжHÃP–CÃ`Ï@Ã}BðzEÃ`ç<ÃÀÝ;à E=ÃpsAà²JÀAð3<Ã_GÃp27à <ÃPI;ðAÃð¥CÃÀÃÐKEÃð·@à -AÀ”BÃð½?Ãp<àú>Ã0f>ÃÀl9Ã0ã>Ã0ËBÃ@cEÃÐ ;àw?ÃÐø=ÃÐo?À;Ã`X?Ãà@ÃDAÃ}BÃðÛ:Ãh;Ã`ó:Ãb<ÃôCÃ?À;<ÃðÕ;ÃÓ>Ãð4AÃpsAà ?>à -AÃ7Ãðd9Ã0®2Ã@½6Ã`”5Ã÷<À¸<ð'>ð-=ÃÀ¹AÃÍ?Ã$<ÃÀ6BÃpêBÃ8Ã`4Ãp&9Ãz<Ãp©8ð¤>ÃÐ:ÃÀ`;ÀÖ7Ãð½?Ã=ÃГ9Ãp=Ã00GÃ$<ÃÐu>ÃúBðŒBÃ0r<Ãp£9ÃÀ×<Ã`í;Ã$<Ã0:ÃÐcAÃÐ¥6ðÚ5Ãß<Ã`X?ð3<Ãp;Ã`ˆ7ÃÐ8Ãðj8Ã@(:ÃPÒ9Ãpµ6ÿ7Ã0Ý?ÃðÃ>Ã09Ã@«9Ãñ9Ãp;ÃÙAÃ@>ÃàÀ8ÃðF>ÃPCÃÐ{=ÃÐo?Ã@«9ÀA;Ã@48Ãb<ð?:Ã0l=à:ðAÀ#@Ãð:@Ãðí7ÃPÞ7Ãðv6ðà4Ãàº9Ãðó6Ã`4ÃðÛ:à W:À;<À;ÃÐæ@Ã<8ÀM9Ã0~:ÃÀã:Ã8à W:à È<ÃÀ5Ã0ã>Ãðj8Ãpµ6àƒ=à›9À7ÃË5à i7à ò5Ã`v:ÃÀr8ÃàŠAÃ07Ã0:ð°<Ãà´:ÃàU5ÿ7Ã@48Ã@=Ãà¨<ÀÊ9ÃPê5Ã7Ãý7ÃÝ2Ãðí7ÃŒ9ÃPð4Ã`8Ãý7ÃàÌ6Ã@·7Ã07Ã@R3Ãp,8Ã`Ž6Ãàa3ÃÀr8Ãð^:Ã÷<àw?ù8ÀÖ7Ã’4Ã7Ã@>à=ÃàÆ7Ãý7ÃT4Ãà7:Ãð”1Ãà%=Ã\=Ã` 7Ã0–6Ã0r<Ã0:ÿ7Ã5ðW6ÃàÌ6Ãð1Þ6ÃN5Ã`‚8à65Ã`ó:Ãpµ6Ã33Ã-4ÃPÆ;Ã0Š8à “0ÃÀï8Ã`8Ãð2Ãp¯7Ãz8Àî3Þ2ÃPa7Ã’8Ãð2Ãàð0ÃP2Ã`ù9Ã`¦2Àe5Ã07Ã@Ã5Ø3ÃP2ÃPð4Ã*;à u5Ã` 3Ã@X2À7Ã@Ã5Ã`#3Ãðš0ÃÐ.5Ãp>5ÃB7Ã0%4Ãt9Ã0%4Ã3Ãð 3Àq3ðQ7à65Ã`Û>Ãp>5Ã@±8à i7ÃP…1ÃÀã:ÃPm5ÃÀx7ð?:ðÚ5ðø0Ã012Ã@v-À1Àô2ÃP1ä1Ã3/ÃÀõ7Ãl0Ãàa3Ãp86ÃpÇ3Ãp>5Æ6Ã071Ãà-ÃÐÃ1ÃpV1ÃÂ0Ã`)2à 1Ã'1ÃP2ÃàØ4à 1ÃÐ@2Ãð 3ÃT4Ã0û:ÃÀ~6Ã`;/à¡8Ã’8ÃP-Ã06ÃË5ÃàC8à 6ÃÐÏ/Ã92Ãr/ÃÐ44Ãð|5Ã@¥:Ãàg2ÃÝ2Ã`G-Àq3à×/ÃÐÉ0Ãý7Ãð1ÃÀû6Ãp86Ã@ç/Ãx.ðW6Àq3Ãp©8ÃàÅLÃð^:ÃÐ"7ÃE0À.Ã7Àè4Ã`5ÃàØ4à<4ÃÀ„5ÃPö3ÃPg6Ã0û:Ã69Ãë:ÃpÁ4Ã-0Ãàm1Ãðó6àÅ2Ã9.Ã33ðò1Ãð 3Ã69Ãàm1àË1Æ6Ãð2Ãàö/Ã@á0àH2ÃPs4Ãð0àB3Ä,ð3ÃÀr8ÃÀ„5ðÎ7ÃðŽ2ÃPä6à “0Æ6ÃË5ð+à «,ÃPê5à /Ãf1ÃàÒ5à ]9ðæ3Ãé0ðæ3Ãàs0Ãà-Ã@É4Ã`š4ÃP‘/ÃpJ3Ã~-Ãp»5ÃÐ:3à­6À}1ÃP0Ã`5ÃðA*àN1Ã@Û1Ã3/ÃP1Ãð/-À}1Ãp\0Ã@Û1Ã-0Ãàð0à¿3ÃÐç+Ã`š4Ã`#3ðE9ÃPy3Ãà[4ÀS8à 2Ã@É4Ãðv6ÃÀ1.Ã`¦2Ãà.Ã`¦2Ã@:7ÃPê5à*7ÃÐÉ0Ãð¬-Ãpë-Ãp86Àw2ÃÐ^-ÃP‘/ÃÂ0à þ3à§7ê4Ã`¬1Ãð¾*ÃÐÏ/ÃpÙ0Ø3ÃpÍ2ÃPm5Ãz8Ãà7:Ãðÿ4ÃÐR/ðì2ðc4À}1à¹4ÃÀ–2ÃW-À}1ÃÂ,ÃpV1Ãpµ6Ã`²0à 1Ã06Ãðù5Ã0Æ.Ãã1àÅ2Àq3ÃÐÏ/Àú1àN1Ãð 3Ãp©8Ãб4Ãàä2ÃpÓ1à þ3àï+Ã`Ð+Ã9.ÃpÙ0Ã`Ž6à 3Ã`Ž6ÃàÌ6Àk4àÑ0Ã`š4Ã@";ÃpÙ0àã-Ãpý*ÃÐR/ÃàC8Ã-4Ê+àÅ2Ã'1ÃpP2Ã@F5à¿3à {4Ãàs0Ø3Ãн2ÃГ9À‰/À7ÀÜ6àÅ2à•:à Ÿ.à ‡2à {4ÃB7ð-ÃÀ 4ð/ü1Ã’4Ã×3Ã0%4Ãpë-Ãàs0Ã0+3ÃP…1ÃpD4Ã`ÿ8àN1Ã`50Àô2ÃP2ðc4Ã~-Ã0=0ð/à “0ÃPä6ÃT4Ã-Ã'1ÃÐR/ÃÐ¥6à§7Ãб4ÃPö3ÃPO:Ã`ù9ÃÐ¥6Ã`Õ?ÃPä6Ã@(:Ã@“=ÃÀ×<à;ÃÀ×<Ãb@à ¶?Ã÷<àèAÃ@ÂJÃÐWCÃ@ìCÃ`¥GÃ@æDÃðFðhHð†CÃàlFÃÀ§DÃàlFÃPGÃPŠEÃpOGÃð HÃmOÃ0­GÃP?éEÀCÃÀHÃ0•Kà ÙNÃàNKòNÃpPÃà¹Nà)LðnGÃÐNÃðQQÃðiMà tJÃPDÃàfGÃPÑNÃyMÃALà ëKÃ0 Mà tJðÁNÃp®Là ÍPÃALÃ`àRÃà¹NÃðøJÃà*QÃÀwLðßIòNàšNÀXLðÙJÃêOÃpCIÃÀHÃ5NÃ`±EÃðGËJÃMJÃðiMìOÃpÆHÃ`ŸHà KÃà6OÃÀ IÃPéJÃÀúKðÙJÃPŠEÃÐ!Là)LÃÀ›FÃ0¹EÃðGÃðæMà;IÃ@'OÃðþIÃpØEÃ[RÃðÚOÃpÌGÃðIð\JÃÀwLÃP„FðnGÃàTJÃ`iQÃ0¹EÃpÌGÃGKðåHòNÃÐÈEÃß@à HÃeFÃðÔPïDÃðFÃ2HðzEÃðGÃÐÂFÃ_GÃ0BDÃ`KÃÀ¡EÃ@ÂJÀˆDà ¤Bà ’EÃPrIÃpºJà KÃÐWCÀáJÃð«BÃ@WGÃ`“JÃÐÎDÃÀ•GÀ^KàAHà ¶?ÃpäCÃÀ0CÃÀGÃаIÃ`"HÃÀË>Ãà@Ã0*HÃpUFÃÐÎDÃPFÀ‚Eð÷EÃÀôLÃàéFÀCÃ0é=Ã\AðDãFÃ`±EÃÐÈEÃ@WGÃÐKEãFÃà~Cà¾Hà²JÃkEÃpêBÃAÃ0HCÉ@Ãp=JÃà Að CÃàõDÃpäCÃÀB@Ã>FàÐEÃàõDÃPõHÃðEÃÐEFÃ@uBÃð·@ÃpØEÃp?Ã\AÃp‹=Ãð±AÃÐì?ðzEÃðŸDÃÀ×<Ã`Ï@Ã`:DÃPõHÃâFðýDð@ÃSIðÙJÃà~CÃà>Ã@ ?Ãp<í:Ãð·@Ãà~CÃpy@Ãð@?ÃAÃàfGÃP+@Ãn>àî@ÃðF>Ã`ç<à Ô:í:Ã`Ž6Ã`ç<ÃpmBÃh;Ãà AÀEÃP%AÃ0l=Ãà+<ð¶;ÃP==ÃðÉ=Ãpy@à=Ã`ù9Ãpö@ð!?Ãà¨<À Dð˜@Ã0§HÃð¥CÃPBÃÐÂFÃ@iDð@ÃÐWCÃ`@CÃÐÈEÃ@Ÿ;Ã@þ@Ã0¹EÃÀFÀˆDÃðÃ>à GÃ`.FÃ`@CàAHïDð˜@ðAÃ@ÈIðVKÀˆDÃJÀÛKÃ@SÃ0JÃ0ÑAðBÀjIÃàéFÃÐEFÃ>FÃ&JÃ`KÃÐ!Là ñJûFÃ0Z@ÃPCÃ`Mà FÃÀJïHÃ0 MÃKÃÐÔCàeBÃÀB@ÃÀ*DÃÐMÃ@KIÃÐ-JðtFÃ`FBÃ@KIÀùFÃÐ’NÃ,IÃ`KÃpOGÃÀ•GÃüLÃðIà žCÃ@{AÃpUFÃP`LÃ8GÃ_GÃ`ŸHÃ`KÃPTNÃ@]FÃð:@ÃpgCÃPŠEÃàfGÃ`(GàÖDðýDÀÏMÃ`±EÃÀ­CÃPGÃPxHàÄGÃJÃÐ’NÃPõHÃðþIà GÃPõHÀíHÃ0LÀŽCÃJDðDÃPrIÃÐ!LÃ0³FðŒBà HÃ`(GðëGÀÕLÃpÌGÃ@æDàSEÃÀ›FÃÐÂFðñFÃð‡Hà ŒFÃP®?ÃSIÃîDÃèEÃ@æDÀ DÃ`™IÃÐKEÃ@æDÃÀ›FÃð±AÃP„FÃ`.FÃ0}Oà GÃÐÔCà GïDàAHÃpêBÃP~GÃÀFÃÐ]BÃà„BÃpUFÃ@QHÃPDðnGÀ|FÃîDÃ06Fð€DÃpCIÃ,Ià DÃ0KÃúBÃ@æDÃâFÃ0$IÃð«Bð@ÃP1?ÃpÌGÃÀFàèAð†CÃÍ?Ã@oCÃPDÃðGà ëKÃ`±EÃ@ ?Ãà@ÃAÃÙ=ðAÃàõDÃpØEÃà AÃàfGÃðIÀ DÃP–Cà ýHÃpaDðtFÃ\=ÃÐÎDÃ0HCÃ@>Ãà–?à ªAÃÀ0CðbIÃPŠEÃÀ³BÃÐ]BÃð4AÃ$<õCÃð(CÃÙAÀCÃpgCÃpOGÃà@Ãß@ÃÀ*DÃpÞDÃV>ÃÀT=àeBÃ@™<ÃÐÔCÃP~GÃVBÃ0BÃPØ8ÃÐ]BÃð:@ÃúBÃÐÎDÃ@òBÃàõDÃ\=Ãð«BÃ`Õ?ÃÀ§DÃ`á=à 9?Ã0ã>à 3@ÃàûCÃÀ›FÃÐ]BàMFà Q;ÃÀ$EÃðÃ>à 3@ÃPœBïHàÖDàÖDÃàCà -Aà HðŒBÃP1?ÃðÃ>ÃÀõ7ÃAÃèEïDÃà¢=Ã`ÃBÃÐÔCÃÐEFÃÀ6BÃÀ­Cà ¶?ÃÓBõCÃîDÃÐ!LÃP®?ðzEÃ0ËBÀCÃð™EÃJ@Ãà AÃðFÃÊJÃpØEÃ`4EÃð"DðbIÃ`«FðŒBàAHÃ`“JÃ0HCÃàfG×LÃPCà}>Ã`LAÃÐÚBà ýHÃ@ ?à DÃ`"HÃ&Fà GÃðŸDÃ`:DÃàïEÃð¥CÃ8GÃ`¥GÃÐàAÃ@<ÃÀÃèEðž?ÃVBÃeFðzEðßIÃÐQDÃ\=ÃâFàÖDÃèEð'>À#@ÃÀ¿@ÃÐ?GÃ0Ã0¡IÃ0ËBàÜCà ëKÃÓ>à›9Ã`Û>à=ÃÍ?ÀpHÃÀ*DÉ@Ã0:ÀÐ8Ã`á=ÃÐ]BÃpØEÃà AðBð†CÃÀÑ=ÃôCÃÐ{=Ã0TAÃ@WGÃ`d=ÃqDÃPº=Ã0%4ðDÉ@ÃwCÃpmBÃ`LAÃ`á=Ãß<ÃP¨@ÃÇ@Ãð«BÃn>ÃÓ>ÃpêBÃh?à °@ÃÀË>Ã`ù9Ãð@?Ã9Ã\=ÃÐKEÃÍ?à ªAÃ`4EÃpü?ÃÇDàkAÃß@Ã@oCéEÃ0HCÃP==ð˜@Ã0x;Ã@“=Ãp—;ð¶;Ã0f>Ã`á=ÃúBÃðF>ÃÐ:Ãå?ÃÐo?ïDÃà@ÃV>Ã`Ž6Ãð(CÃàBÃÐàAÃë:ð!?ÃÐÎDÃÐi@ðtFÃÀB@ÃÀZ<ÃP+@Ã0r<Ã\=ÃÀË>à Î;Ø7ÃðR<Ã0ï<ÃpêBÃ2DÃà>ÃP1?Ãñ=ÃÐò>à>ÃPº=Ã>ÃàC8à;Ãà¨<Ãà1;Ãà–?ÃPÒ9Ã0û:Ã`í;à ?>Ã0 8Ãn>ÃÐ9Ãý;ÃÀÅ?Ã`á=ðÂ9Ãh;ÃàC8ÃÙ=ðÈ8ÃàÀ8à Ú9Ãñ9Ãð|5ÃPC<Ã@oCÃ0Š8ÃPg6Ãz8ð3<Ã$<Ãà1;À Dà W:ÃÐ<Ãë:Ãp,8ÀA;Ã*;ÃPÀ<ÃðR<Ã`‚8ÃÓ>Ã0 8À;Ãð^:ÀšAÃ`Õ?Ãpö@à Î;ÃH6ó9Ã@™<Ã0õ;Ã`½CÃ@ ?à 9?ð'>Ã@=à‰<ÃàÀ8Ã7ÃPs4Ã09ÃN5Ã0 8Ã@¥:Ãpµ6ÃŒ5ÃàU5ÃÀï8à @à§7ÃPg6Ã@·7Ã0~:Ã`ó:à;Ã÷8ÃÐ"7à*7ÃPÞ7Ã`v:ðQ7Ã@í.ÃÀx7à>ÃП7Ã@«9ðc4Ãðp7À5=ÃÀ³Bà {4ÃÐ9ÃÀ„5Ã`Ž6ðæ3Ã-0à ò5ÃÀZ<Ãà–?Ã05Ã09Ã@";Ã0:Ã`Ê,Ã`/1ðì2Ã`‚8àH2ÃÀ6Ã012Àô2à ‡2ù8ÃP2Ãàa3ÃÀã:ÀÜ6Ãp>5Ã`ˆ7ÃpÇ3ð-=à 1Ã@·7ÃÀ~6ÃpÇ3Ã5ÃpÇ3ÃPs4ÃÀé9Þ2Ãàm1Ã0œ5Ã@Õ2ÃPg6Ã4Ã@½6Ã<8Ã05Ã0¢4à³5à ™/à “0Ãn:Ã`#3Àe5ðà4Ã@É4ðÚ5Ã0¨3ðK8Ã`¸/Ã@d0Ã0¨3Ã'5à<4Ã@á0à (-ð]5ÃàÌ6Ãf1Àƒ0Ã0:ÃàÀ8à 3Ãà%=ÀÐ8Ãà´:ÃÀx7Æ6ÃÀ¨/Ã06ÃpD4ÃÐR/à 1Ãð¦.ÃK/ÃP2ð{0ÃÀ1Ãpb/Àè4Ãpß/à¿3Ãp>5ÃàÀ8Ã-4Ã0¨3à¹4àN1ÃÐF1ÃpJ3Ãàa3àË1À1ð/ÃpD4Ø3ÃÐ44ÃP0Ã@L4ÃÀ%0ÃÐÃ1Ãpý*Ãõ.Ã0À/ÃàÒ5à (-à @)ü-Ã@á0ðK8ÃÀ5ðì2Ãpµ6ÃÐF1à$8Ã!2Ãðÿ4à “0Ãz8Ã@±8Ã`á=Ãð²,Ãðv6à*7Ã`š4ÿ7ÃPð4Ã@L4ðu1Ã`8ÃàI7Ãð¦.ÃpP2Ã!6Ã@½6Ã@Ï3Ãpß/Ã0º0Ã@É4Ã0´1Ãà.ð-ÃðM(ÃP0ÃpÓ1Ã'1ð‡.ÃÝ2à¹4Ã`e(ÃPü2ÃàÆ7Ãàm1Ã0º0ÃàU5Ãðˆ3ê4ÃÐ ;Ã`6ÃP/Àƒ0ð/Ãõ.ÃPü2ÃP‘/ÃÀ6Ãp>ÃPÒ9Ãz8Àƒ0À7Ãé0Ã'1ð{0ÃÐL0ÃÀ2Ãp86Ã0+3Ã@ç/ÃpD4ÃPg6í:à :Ã012ÃÐÉ0à65ÀA;ÃÐ9Ã-4ÃàI7Ã09Ãà7:ÃàÌ6ÀÖ7ðì2Ãðÿ4ê4ÃpD4ÃàI7ÃPä6à u5Ã@¥:ÃÑ4ÃЙ8à;Ã`5Ã`š4ÃB7à {4ðÈ8ü1Ã05Ã0+3à ‡2ð9;ÃP2ÃÀx7ÃDAÃ`p;ð“,Àq3Ãðš0Ãà[4à ¥-à 0Ã@±8ÃÀ¨/ÀÊ9ÃPa7ÃàÆ7àB3Ã@F5ÃÐu>Ãp>5Ãà[4Ãp÷+à¹4ðÔ6Ã@R3ðK8ÃPØ8Ã0®2Ã`ˆ7Ã@É4ÃГ9ÃÐL0à65Ã’4Ãðÿ4ê4Ãã1Ãàm1ÃÐ@2Ãp£9à 2ÃP1à³5Ã0C/ÃÀº,àÝ.ðÚ5Ã`”5Ãl0Ãàs0à ø4ÃpV1à ò5ÀÜ6Ã0¨3Ãàä2à Ÿ.à¹4ð3Ã!6ÃP2Ãàº9à<4Ã@Û1ðø0Ã],Ã0º0Ãð”1Ãð 3Ãðù5ð/Ã09Ãp86à06ÃPm5Ãp27Ãðó6ÃË5Ã`¬1àÅ2ðK8ÃÐ"7ÃP&,Ãðˆ3ÃÈ/ÃÀ3ÃPs4Ãàg2Ã`¬1ÃÐX.Ãp&9ÃÀ3ð/ðæ3ÃpÓ1ÃàØ4àT0À‰/Ã0Ì-Ã012Ã@Õ2à ".Ã012Ã'1Ã@Û1ð()Ãpt,Ã`6Ãpµ6ÃPê5Ã`¦2ÃÀœ1ðì2ÃÀÀ+À}1Ã@@6à 2Ãpë-ÃÝ2ðK8Ã@48Ãàü.Ã@á0ÃP2ÃpV1Ã012Ãð1ÃPð4ÃÀ7-Ãà[4ÃpÁ4ÃP…1à 1Ãàs0àË1à ‡2ÃÐÛ-à 0Ãðš0Ãð/-Ã@Ï3ÃpP2ðW6ÃàU5Ã0Þ*ÃQ.Ãpn-Ã`²0ÃÀ 4à65Ãð 3Ãð¦.ÃPü2ðu1Ãð#/Æ:ÃN5Ãà-àÅ2ð/à /à×/ÃÀœ1ÃÀ3Ãð¦.Ã0´1ÃÐ:3ÃÀ3Ãà)Ã`¦2Ãðˆ3Ã071ðæ3Ãï/ð“,Ãð¦.Ãàm1Ãðš0Ã@Õ2àf-Ãpë-ðþ/Àq3Ã@@6Ã0–6Àô2Ãàg2àã-à ±+ÃpV1Ãi*Ã0Þ*Ãàü.ÃÀ5ðì2Ã`²0ÃN5Ãð2Ã@á0ÃÐç+àÑ0Ã@É4àõ*ÃÀ´-Ã`Ä-Ã0+3Àq3ÃP1Ãé0Ã0I.Ã`Ê,ÃÀ1.Ã012Ã`;/ÃÐÃ1À›,Ã`50ðò1ÃÐ:3Ø3ÃPs4Ãàg2Ã!2Þ2Àk4ðo2ÃÐd,Ãæ*Ã92Ãp86Ã-Ãpz+Ãl0à “0Ã0À/à 0ð/Ãph.Ã@Ã5Ãàê1Ã`Ä-ÃÐF1Ãà+ÃÀ 4Ãà…-Ã×3Ã@‚+Ã@v-Ã0Ò,àr+Àú1à (-ð‡.ÃðA*ÃQ.Ã`)2ÃÐÿ'ÃÐR/Ãð¸+ðø0Þ2ð/Ãð 3ÃÀ+/Ã`)2à ø4Ãб4ÃÐÉ0ÃP¯*à Q;Ãðp7ÃÎ*ÃÀº,Ãpb/ÃÀÌ)ÃÀ7-Ãà*à„(ÃÐí*ÃQ*Ã@j/ü-à³5ÃðŽ2Ãà-ÃÐí*Ãã1à 4+Ãpß/Ä,Ãõ.ÃP—.àZ/Ã0º0à`.Ã@‚+ÃÀ1.Ãph.ð/Ã@Ž)Ãà,ÃP2à «,ÃÀ´-Ãð¬-à :*ÃÈ+ÃÀ®.Ã9.ÃP2*Ã@v-ÃPs4ÃÐÉ0à ½)ÃPV$ÃP¯*Ãà…-Ãà,'Ãн2Ãн2Ã071Ãð¬-àB3Ãàg2ÃK+Ãà*ÃE0ÃÀ1Ã@v-ÃQ*Ã`²0ÃÐÃ1Ã0I.ÃPy3Ãð5,àõ*à +ÃP1à 4+Ãà*Ã~-àã-ÃÐL0Ãu(Ã`â(ÃP,+ÃE0ðŸ*Ã'1Ãà-ÃÈ+ÃP0ð¥)àx*Ã0º0Ã*Ã0Ø+à ".Ã@ÿ+ÃpŒ(Ãð).ÃÀ1.Ã`è'ÃÀU(Ã`â(ÃÀ®.Ã@ç/Ã`50Ã`è'Ã0U,Ãð¦.Ãà-Ãày/à «,Ã0Ø+ðø0ÃÀ7-ð .ÃÂ0Àî3Ã@í.ö.Ãð/-ÃÀ1.Ãày/Ã3Ã` 7àf-à`.ÃÀ1.ÃÚ,ð/à .,Ãà.àÑ0ÃÐR/Ãx.Ã`²0Ã`Ä-Ãàg2ÃÐÕ.à 1ð/àû)Ã0À/ð-À-Ã0Ò,Ã0+3Ã`50à 3À.ÃÀr8à ±+ÃÀ%0Ã@í.ÃÐF1ê0ÃP&,Ãð0Àƒ0Ã@|,àÅ2ÃpV1Ø3Ã@á0Ã-Ãé0Ã@í.À1ÃÀÆ*Ã`¸/ÃPs4ÃP0Ã`¦2ÃpÍ2Ãpå.Ãc+Ã0û:ÃÐR/àB3Ã`¾.à ±+ÃðŽ2Ã`Ž6Ã`A.Ã`Ê,àË1ÀM9ð/ÃpD4Ãðÿ4ÃpP2à 3Ãp*ê0Ã@ç/ÃÂ,Ã`Ä-ÃpÓ1Ã06àã-à 2Ã`)2Ã0+3à 4+Ã)ÃP/Ãà )Ãàg2ÃÀ3Ãl0ÃÀ5Ãàa3ÃP©+Ãð²,Ãpå.Ãðv6ðc4ðì2ð‡.Ãàä2Ã-4Ê+À1Ãl0ÃpÁ4ð/Ãð2ÃP‘/ÃÐL0ÃP>(ÃP&,Ãï/Ã06Ãàü.Ã0®2ÀÜ6Ãph.ð .ÃÎ.Àî3Ã@á0àÝ.ÃÀ=,à 0Àk4Ã7Ãð 3À.Ãð1Ã-0Ã0g)à .,ðì2ÃÀ1.ÃÀ%0Ã0g)Ã92ðo2Ã`/1Ã7Ãð”1Ã@R3À-Ãð|5ÃPö3Ãx.ÃÂ,Ãà—*ÃÐÕ.àB3ÃðŽ2àr+Ã`)2ÃÐÛ-Ã0õ;Ãàä2Àô2Ã`50ÃÐj+àã-ÃQ*Ã@|,Ã@+ðu1Ãày/àÅ2ÃZ3ÃÀ1ÃP.Ã?1àN1ÃàÌ6ÃP£,Ãõ.Ãõ.à Ÿ.ð+Ã`Ð+ÃÈ/ÃK/Ã`¦2Ãpë-Ã@+Ã3/ÃP2ð,àû)ðŸ*àÅ2Ãð¬-ÃPö3Ã0+3Ã)Ü(Ã(Ã`²0ÃÐR/À-à :*Ã-Ã?-ÃðA*Ã-î%À$+àx*Ã`¬1ÃÐ.5Ã3/Ãpb/ÃP-Ãð¸+Ãp†)à .,ÃP,+Ãp*Ã`)2àf-ÃP‹0Ã0Ø+Ãð”1ÃW-Ã0Ì-Ã-ÃÐÛ-ðŸ*Ã`Ä-ð/ÃÀ7-Ãx.Àô2ÃQ*ð“,Ãi&ÃÐÏ/ÃàÆ7Ã0m(ÃÐ@2àr+ü-Ã0U,Ã0O-ÃÀ¨/Ãàs0À³(ÃÝ2Ãpß/Ã0C/Ã`Ê,Ã0Ò,Ãã1ðæ3ÃP.ÃÀ¨/ð .Ã`Ö*Ãà-Ã0Æ.Ã0´1ÀÖ7Ã0®2Ãi&Ê+Ãi*ÃP-ÃðÊ(àl,à Ÿ.Ãàm1Àô2Àq3Ãðù5Ã*ÃÐd,Ãû-ÃÐÕ.Ãð2Ã0=0ðþ/Ã`G-ü-àÝ.Ã`¸/ÃàO6ÃÐL0Ã`S+ð/À1À0Ãpz+Ãp†)À§*Ãà'ÃP.Ã@Ž)àõ*àÝ.Ã@)Ã@ *ð{0Ãpb/ð-ÃE0Ã@‚+Ãà¯&Ã@j/Ã@p.ÃÐÛ-Ã`#3Ãpý*ÃÀ3Ãðš0ÃàÞ3ü1ð4'Ã@š'Ãpn-Àî3Ã`2ö.àf-ÃÐR/Ãày/Ê+ÃN5Àô2Ãà+Ã0Þ*Àî3Ã3Ãð;+Ãàö/ÀY7Ã071Ãð/-Ãà‹,à R&ÃpÍ2ÃP.Ãl0àB3Ã?1ÃÎ.Ãðv6Ã’8ÃÀŠ4Ã0´1Ãн2Ã-4Ã071ÃP.Ãàð0Ãpß/ÃP…1Ãð5,Ãà )À-ÃÐç+Ã0I.ÃPö3à .,Ã0O-Ã`¾.Ã`š4à Ÿ.Ã@^1à 1Ã`;/Ãð¸+ö2Ãï/ÃàØ4à Ÿ.ÃH6Ãã1Ã@|,ÃE,ÃП7à 1ü1ÃÐX.ðø0ÃÎ.ÃpV1à¡8Ã`5Ã`;/Ãð#/ÃPö3Ã` 3à­6Ãð).ÃÀ+/Ã3ð/ðì2Ãð¦.ðo2Ã0´1ðø0àT0ÃQ*ê0àB3ÃPä6Ãð”1À•-ÃP -Ã8Ä,à*7Ã07ðò1ÃÀ¢0Ã`4Ã0Æ.Ãàö/ÃÂ0ð .Ã`Ä-ÃPü2à <Ã`Ä-àË1Ã3ÃÀ®.Ãàg2Ã~-àË1ÃÂ0Ã@ÿ+Ã0Þ*Ãà+Ãð|5Ã,Ãð|5ÃpÁ4Ãr/ÃT4ÃK+Ãf1à {4Ãð”1Ã-4Ã`/1Ã`¦2à³5ÃÀŠ4Ãð1Ã-0ÃÀ¨/ÃÐÛ-Ã-Àƒ0ÃÐÕ.Ãб4Ã@X2ÃÐ.5ÃP -ð"*à à8ÃP1ÃàI7ÃÀ3ð-Ãày/àï+ÃÀ1.Ã`;/Ãàä2Àq3ð{0Ãðš0ÃP2ÃPö3ð™+àÅ2ÃPm5ÃP…1ÃÀ¢0ÃP…1Ã`#3Ã071Ã0C/ÃðÄ)Ãð#/ðæ3ð{0Ãðš0Ã0I.Ãà,Ã3Ã`50Ãàm1ÃÀC+ÃÀ¨/Ãð1Ã`2ð3ê0ÃÐÕ.ÃÐÉ0Ã*ÃÂ,Ãà*ðþ/Ã`/1ê4ÃÅ6ÃÀ 4Ã3/à 0ÃÀ®.Ã'1Ãàg2Ã`G-À›,À-ÃT4Ãpn-Ã`Ä-Ãr/Ã0U,Ã`50Ä,àõ*Ãà…-ÃK+Ãpå.ÃÐÛ-Àƒ0àï+ÃÀØ'ÃÔ)Ã071ÃE,ÃP2Ãð²,Ã0ð'Ãð2Ã`G-ði3Ã!2ð/À­)Ã@+ÃðG)ÃE,ð .À.Ãà,Ã0À/à ½)Ãp˜&àé,Ã0Ì-Ã*ÃpP2Àô2À}1ði3ÃàÞ3àÅ2ÃÎ.ÃPy3Ã@ÿ+Ã*àÝ.Ãðš0Ã`¾.Ãpt,Ãð0à 0ð-À¡+ÃP-ÃP/ÃÐL0àx*Ãà.ÃW)ÃE,Ã@ÿ+Ã@á0ÃP>(à ½)Ã0¨3Ãp»5ÃÝ2Ã`¸/Ã?-Ãpn-À$+àû)Ãpt,à ±+àõ*Ãà.ÃK+Ãð¦.Ã@F5ÃÂ,Ã`M,ð/Ã33Ã0´1ð±'ÃP2*Àô2ÃpÙ0ÃÀU(Ã0U,ÃÀ%0ð,Ãз3ÃÀŠ4ÃÀ%0Ã92ÃP£,Ã@X2ð/ÃÀ3Ã,ÃP£,àf-ð"*ä1À<'ÃÀÒ(À‰/Ã@š'àã-Ãò(Ã0Ø+ÃpÓ1Ã@F5ÃPy3ü-à “0à ".Ã-0Ãà…-ÃQ*Ã@Ž)Ãi*Ã0Þ*ðo2ÃPD'Ã,ð,ÃЈ&ÃÚ,ÃÀ¢0ÃÀ¨/ÃE,Ã0ä)ÀB&À1ðŸ*ÃÐÉ0Ãð /Ã0=0ÃÐí*ð±'Ãé0ÃÀ3À³(À¡+ÃÐÛ-à F(ÃðA*ð()Ã*Ã`Ä-ÃP‘/Ã`M,àl,Ãã1À›,Ã@ç/ÃÀº,ÃÀ1ÃpÍ2ÃÀŠ4ü1Ãà'À‰/ÃÐ ;ÃÐ.5ÃÐÏ/ÃP1Ã0Ò,Ã*Ãæ&à «,Ã0À/Àk4à ‡2Ã0a*À**Ãà—*ÃP0Ã0[+ÃÀ+/À›,Ãà*Ãàü.Ãà‘+àr+Ã0Æ.À,àN1Ã`S+Ã*ÃÀO)ÃЂ'Ãðš0Ã@^1Ã` 3àH2Ã0Þ*À**Ãpz+Àú1â'Ãà‘+ÃQ*ð-Ã0g)ÃЙ8Ã0´1Ã@v-Ãc+Ãc'Ã4Ãx.Ã`e(àl,Ãð”1ÃÂ,Ãp\0ÃP‘/à Ã(à Ï&Ã@ÿ+Ã0g)Ã`¾.ð/àÑ0àË1Ã@p.Ã`M,Ã0[+ÃPÁ'ÃÐó)à ±+Ã`¦2à×/ÃÐÏ/ÃÐç+ÃÀº,Ã0ê(ÃQ*Ã@Ž)Ö)Ã`¬1Ãàö/ÃÀ®.à (-Ã`Ê,ÃÐó)Ã@|,à 4+ð:&Ãð;+Ãà‹,ð«(Ãà+Ãàä2Ãpß/ÃÐÃ1Ã@Û1àé,à @)Ãð/-ÃPð4ÃÐj+Ãà,ði3Ãpz+Ã%'Ãàs0ÃàÞ3Ã`â(ÃÀº,à 3Ãày/Ãà,Ã`¸/Ãpë-ð .ÃQ.Ãp )Ã071ÃPü2ÃÐd,À.Ã@á0Ãàs0Ãð‚4ðÔ6Ã`M,ÃK+Ãð¸+Ãã1Ã9.ÃðM(Ãà*à ‡2ÃE0ÃÐp*ÃP/ÃÐL0À /Ã0®2ÀÊ9Ãð0Ãðš0àË1ÃàØ4Ã@X2ÃÀI*ÃÐ44ÃP1Ãб4ÃÐÏ/Àâ5À1À³(Ãн2à¿3Ãàm1Ã0Æ.ÃÂ0À.Ã0Ì-à {4À}1à06ÃÐÏ/Ãðù5à 3Ã-0Ã@Õ2Ã`Ž6Ã09ó9ÃðŽ2à¡8Àô2Ø3Ãp©8ÃÐ:3ÃPö3Ã`4ÃPg6à;ðc4à×/Ã`;/àB3Ãð/-Ãð¸+à<4Àô2ðQ7ÃÀ 4à 2à 1Ã92Ãà[4Ã`#3à ‡2à o6À /ÃàÞ3Ã@X2Ã0Ì-ÃPy3Ã`/1ÃЫ5ÃP…1à i7à ø4Æ6Ãp—;ÀY7Ã@X2à {4Ã'5à<4ÃË5Ã÷8Ãp27ÃÀl9ÃÐ<ðÈ8ÃàÆ7Ã0+3ÃT4Ã3Ã`|9ÃPg6ÃàÌ6Ãp¯7ÀY7Ãðˆ3ÃPê5ÃÀé9ÃГ9à‰<ÀM9Ãp27à þ3ÃðÕ;Ãp,8Ã`ˆ7Ø3ÀM9ÃP[8Ãðj8Ã@.9Ã`|9Ãn:ÃÀr8à ø4ÃÁAÃPÀ<à Ô:à>Ã@·7ÃPÒ9Ã÷8Ã`8Ã`ç<Ã`ç<ðQ7Ãpµ6ÿ7Ã0:Ã0„9ÃÅ6ÃPU9Ã`R@ð@ð]5ù8Ã07ÃŒ5Ã'5à ì6ÃðÕ;ÃàØ4ðK8ÃÀr8àN1à¿3à65ÃÀœ1à§7Àî3Ã0®2Ãðó6Ãà+<à>Ãp&9Ã@48Ãðó6ÃT4Æ:ð3Ãз3ù8à Ú9Ãp86ÃPü2Ã`8à i7ÃÐ9ÃГ9Ã@48ÃÐ:3ÃÀû6à;Ã@>à 6à$8à :Ãb<ðÈ8Ãp,8Ã0%4ÃpÇ3Ãðç8Ã@";àB3ðK8ÃàÞ3à¡8ÃЫ5à {4ðÔ6ÃÀx7à}>ÃÐ<Ãn:à¡8Ãp¯7ÃÀõ7à <ÃÀã:ÃÀé9ÃÐ<Ã@½6à9Ã`v:Ãб4ðÈ8Ã@Û1ÃàÞ3ðæ3ÃÀ2ê0Ã-4ÃÀ5ÀÜ6ÃŒ5Ãð4ÃЫ5Ã`¾.Ã0%4ÃÀœ1Æ:ÃÑ4Ãðˆ3à<4Ãз3Ãðˆ3à ·*ÀÐ8ÃP…1ÃàU5ÃÀ¢0Ã3/Àî3Ã@:7Ã69Ã8ðc4Ã`ˆ7ÃÀ–2Ãðÿ4ÃÀ~6ÃpÁ4ÃPÞ7Àq3ÃP0ÃB7Ã4ÃÀ%0ÃÀ3ÃП7ÃpÁ4ÃPê5Ã`¦2ÃpD4ÃàÒ5ÃÐ44Ãðˆ3Ã4à 1Ã@@6Ã?1à×/ê0Ã@Õ2ÃÑ4Ãp>5ÃPü2ÃQ.à06ÃË5ðà4Ãpb/Ã-4À1ÃÐÕ.Ãð0ä5Ã;ÃГ9Ã7Ã@:7Ã071ÃE0Ã5Ãp»5ðà4Ã`¦2Ã0=0ÃÈ/Ø3Ãp86Ã<8Ãp»5Ã’4à ò5ð9;Ã<8ÃPÀ<Ãày/Ã-0Ã0À/ðò1ð]5ÃPs4Ã06ê4ÃÀ~6Ãð2Ã`6à ".Ãà[4ê0ÃÀ3Ã`5àÅ2Ãð).Ãðd9Ã`²0Ãp>5Ãàg2Ã@Ã5ÃàÀ8à 3Ãpë-àÑ0à Ÿ.Ãt9ÃpÁ4ÃàÌ6À;Ã92à§7Ã`8à­6Ã4ÃÐX.à 1Ã`#3Ãðù5à à8Æ6ÃPs4Ã’4Ãà[4Àâ5ðÚ5à c8ðæ3Ãp27Ã5à•:à ò5Àâ5ðà4ÀY7Ã33Àè4ÀY7Ã`¦2Ã'5ÃàO6ÃÀû6Ãà1;á<Ã0¢4ÃpÙ0Ã×3Ãñ=ÃÀ3Ã07ÃpP2Àô2ÃÐ8ÃÑ4ÃàO6à Ÿ.Ã0–6ÃÐ:3ðK8Ãðˆ3ÃPg6ÃPð4Ã`¾.ÃÀ2Ãã1Àk4Àe5Ã`4Ã`”5Ãà1;Ãðá9ÃPö3Ã0À/Ã`50ðu1ÃPm5Ãp;ÃÐÃ1À²=ÃP1Ã0¢4Ãàð0Ã@ç/ðò1Ã0Ì-Ã`¬1Ã'1Ã0=0Ã0 8Ã@:7ÃàÀ8Ã@·7à 3Ãðí7Ãðˆ3àZ/Ã4Ã`¸/Ã×3Ã92ÃPÆ;Ã@L4Ã`5à¹4Ã`¦2Þ6Ø7Ã@";Ãà®;Ãp86Ã0x;ÃPs4Ã`”5Ã`2Ãн2ÃB7Ãð0Ã@Ï3ÃpV1À•-ÃÀ3ÃÀÌ)À.ä5Ã@X2Ãàm1ÀY7á<Àú1Ãàa3Ã012Ã`š4Ã`|9ÃPÆ;Ã@";Ã@ç/ðþ/à ò5à “0Ã@X2ÃÐ@2Ã@R3Ã0%4à ™/à§7ð3ÀÄ:Ãp86Ãàm1Ãp27Ã`¬1Ãðÿ4ð/ÃÀ~6Àè4ÃÐ.5ÃÅ6Ãàü.ÃÈ/À_6ÃN5Àƒ0à 1ÀM9à Q;ð{0Ã-0Ãx.ðì2Ãð /ÃÀŠ4ðu1à 6Àƒ0ê0Ã`¾.ð"*ÃP©+ÃÅ6ÃàÌ6Ø3ÃàU5Ãày/Ã`M,Ã`6Ãðç8Ãðv6ÃE0Ã`4ÃÀ7-ä1Ã`¬1ðW6ÃÐF1à 0ÃpÓ1ä1ÃðŽ2ÃpÇ3Ã012ÃÀ6ÃPØ8Àw2ÃÐÏ/Ãð”1Ãð1Ã05Ã0®2ÃÐÕ.ÃW-à 2à 3Ãð/-ê0ÃP1à ‡2ÃPy3Ã@X2Ã0+3ÃÐÛ-Ã@@6à¡8ÃÀœ1Ã0À/Ãà[4ðì2Ã@L4Ã@X2ÃPm5ÃÀ6ÃÀ5à 1Ãð 3ÃàO6ÃN5ÃÐÏ/Ã3/ÃP/Ã`;/à ø4ðø0À0Ã0Ì-Ãr/Þ6Ã09à Ô:ÃàÞ3Ã`A.Àú1ÃP2Ã@@6Àè4Ã@á0ÃðŽ2ÃÐ^-ði3Ã@É4àÅ2ÃÀ2ÀY7à06Ã` 7ÃÐ.5Ã@·7ÃP…1Ã0À/Ã0U,Ã,Ãàü.ÃPm5ÃÐ8ÃÀ 4À.Ã@Ã5ð]5Ã07Ã9.ÃÀ2àÅ2à ™/Ã0=0Ã@|,ÃÐF1ÃÐ(6Ãðó6Ã'1ðþ/ÃÐó)Ãð/-ÃP0Ãày/à(ÃP0ÃP—.À-Ã@^1àT0Ã0´1ÃPy3ÃpV1ÃÐF1ÃpÓ1Ã@É4Ã@á0ö.Àî3ä1Ã`¬1ÃpV1Ã`2Ã@^1à­6à þ3Ãp'Ã`”5Ã-Ãpå.Ãf1à +Ãph.Ã`Ð+ÃP -ÃÀ3ÃT4Àâ5Àk4ÃP1Ã0=0ÃÐR/à ".Ãð²,Àô2à¿3Ãàä2ö.Ãà‹,ÃàÞ3Ã0Ø+ÃÀº,ÃP/ÃE,Ãø'Ã`)2Ã`2Ã÷8Ã-4ÃB7Ãð¦.À$+ÃPÁ'à É'ð/ÃÀº,ÃÐÛ-ð/Ã@v-ÃE0Ã@^1Ãph.Ã`Ü)Ã@d0Ã0¨3ê0Ã012ÃÀŠ4ÃÔ-ÃðŽ2ÃÀ¨/Ã071Ã@F5ÃÀº,ð™+ÃP‘/ÃP-ÃpÓ1à 1Ã@‚+ÃÀO)ÃÀO)ÃP…1Ão)Ãr/ÃP‘/Ãà+Ãà‹,Ã`Y*Ãpå.à 1ä1ÃÀ2Ã`¬1ð-Ãæ*à “0Ã`¦2Ã0U,Ãð2Ãðù5Ã],àï+À.ÃÀ¨/Ã@á0Ã`Ž6Ãðˆ3Ã@ˆ*ÃW-Ã@ù,Ãû-Ã0ê(ÃÀU(Ã'1ÃpD4ðì2ÃÀ5à 3àã-ÃÐç+àf-Ãû-Ãl0Ã`/1ÃÀ7-ÃÐó)ö2ÃpÁ4Ã?1Ã@p.Ã0¨3ÃQ.ÃÐp*ðà4ÃP-ÃÀ¢0ÃÀÀ+ÃP£,Ã0O-Ã@j/ÃÐÕ.Ãà…-Ã~-àN1Ã@L4ÃÀº,Ã`/1À¡+ÃÀ3ÃÀ3Ãã1Ã@^1ÃPð4Ãð1Ãàä2à «,Ãà-ÃPö3àl,ð()à (-ÃÀI*Ã`2à ¥-ÃpV1ÃÀ¢0ÃÐF1Ãàa3à×/à ¥-ðQ7ÃÐÏ/àÑ0Ãð1ð‡.Ãð1Ãx.ÃÀ+/ð™+àT0Ãà-Ã@d0Ã'1ÃÀº,Ãð).Ã0À/Ã`/1Ãr/Ã0O-ü-ÃÀ5Ã`A.ÃÐ@2Ä,Ã0I.ÃàØ4ÃÀÌ)Ã`)2Ã071Ãàð0Ãà+Ã0Þ*Ã0%4ÃP/ÃÀ+/ÃZ3Ã0®2Àƒ0à×/Ã`¾.ü-Ã0s'Ã@L4Ãp»5ÃE,Ã`¸/Ø3Ãðš0Ãð‚4Ã)àÝ.Ã`8ÀY7Ã0Æ.Ãð²,ÃÀ®.ðK8ÃàÒ5ÃÀ3Ãàð0ÃÀÆ*ÃP1ðþ/ö.Ã0=0Ã'1ÃŒ5Ã012Àâ5Ã`)2Ãpt,Ã`²0ðu1Ã`ó:ÃP‘/Ãð#/ÃP2àH2ðQ7Ãàm1Ã`A.Ãà.ÃÀº,Ãð2ÃPO:Ã0´1ð-Ã`¦2À0Àô2ÃP2ÃPm5ðø0Ãé0Ã071ÃÐ.5ðò1Ãð¦.Ãz8ðæ3Ã92Àe5ÃpV1ðÚ5Ã],Ã-4à /ÃÐX.À‰/Ãð¬-ÃÀ3Ã@É4ÃÀ1Ãû-à ¥-Ã0À/Ãàm1Ã0%4à ø4ÃÝ2ÃÀ 4à ø4Ãàü.àõ*ðæ3Ã4Ã012Ã0I.Ã!2Àú1à 3Ã'5ÃÀ7-à F(Ã0=0Àƒ0ÃÔ-Ã0Š8Ã0º0Ã`50ÃÀ–2Ã'1Ã0 8Ã7Ã`5Ã@Ÿ;Ã012ÃÀU(ÃP1Ã@½6ÃpP2Ã0º0Ãl0à Ÿ.Ãà+ÃÐX.Ãpt,Ãpë-ð/Ãà.ÃPð4ÃH6Ãð/-Ãà‹,Ãð).Àè4Ãf1à 0àH2ðŸ*ÃPy3Ã`¾.à ".Ãн2Ã3/ÃÀ+/Ã0+3Ã0%4à ¥-Ã`Ä-Ãàg2Ãð /à¿3Ãð¦.Ãr/Ã`¾.àN1ÃPy3ÃQ.à×/Ã,Ãð#/ÃpJ3Ã@d0ÃP.ði3ÃP‹0Ãp*Ã-ÃP -ÃÈ/Ã`š4À,Ã071Ãð5,ÃQ.Ã],à +ÃÐv)ü1Ãàð0Ã`4ÃÀÀ+Ã0Ì-ö.ÃP£,ÃpÇ3À /Ãï/ÃÐL0Ãàa3Ã@Û1Ã@j/à 3à 2ÃÐÛ-à 0à„(à /ð"*Ã@ó-Àî3Ã@v-à 6Ã`2Ãpb/ÃÐÉ0ó9Ã`4à)Ã0a*ðþ/Ã0–6Ã`/1Ã0I.ü-à “0Ãðó6Ã33ÃB7ÃP0ÃÚ,à§7Ãн2Ã`_)ÃP—.à (-ÃÀ1Ãà‹,Ãpt,À§*ÃpÓ1ð‡.Ã@R3Ã~-Ã0U,Àƒ0Ãðˆ3Ãpý*ðo2ði3Ãph.Ãl0ÃÐÛ-Ãà‘+ÃÀC+àr+ÃP‹0Ãpñ,à ±+ðø0ÃÐÉ0Ãp*À¡+Ã0C/Ãàs0Ãr/Ãðˆ3Ã`#3Ãð0ÃÐX.Ä,Ãð).Ãà£(ÃP,+ÃÀ–2ÃÀÆ*ð+ð-Ãð /ÃP—.ÃÐ^-Ã@F5ÃÐ@2Ãû-Ãé0Ãï/ö.ÃÐd,Ã-ðþ/Ã,ÃÀ„5Ãp27Ã@ÿ+à 1ÃÀ1.ÃÐó)Ã@j/Ãõ.ÃÐ:3Ã-0ÃÐÏ/ÃðY&ÃÐí*Ã0s'ÃÀ®.Ã`)2Ã?1Ä,ÃP…1ÃP -Ã`¬1ÃðY&Ãpn-à ".ê4ÃPy3Ã9.ÃÐ^-Ãàs0Ã`¦2àË1Ã’8Ãðÿ4à «,Ãp\0Ã`Ä-ÃÐj+ÃP‘/Ãð¦.ð/ÃK/Ãpn-à +Ãà.Ã@ç/Ãõ.Ã@Õ2ÃÐÉ0ÃÐÃ1À1Ã06ð/à ¥-ÃpP2ðì2Ã@ *Ãà‹,ð¥)Ãpz+ÃpP2Ã0O-ÃÐç+àN1Ãpn-ð/Ã0=0Ã@Õ2ÃÀ´-ÃP‹0Ã0¨3Ãð#/Ãpb/Ã@^1Ã@v-ð,Ãà…-ÃPs4à`.Ã0´1àË1à Ÿ.Ã0O-Ã@ó-ðu1Ã0%4ÃB7Ã`¦2Ãã1ð“,Ã`A.àË1À-ÃÀ1Ã@ÿ+ÃÐ:3ÃÀ¨/Ãàm1ÃðL=ÃÝ2ð3<Ã0Æ.ð .ö.ÃP1Ã012Ãð‚4ÃPð4ÃàO6ÃÐL0Ãi*ÃàU5ÃÀ3À1ÃK+ÃÐF1à 2Ãà,Ã0C/ÃÐX.ÃP0ê0ÃðŽ2Àƒ0Ã3/ÃpD4ÃÀ¢0Ã?1à ‡2ÃÂ0à×/Ãé0ð{0Ã`Ä-à¹4Ã07Ã`¦2Ãà[4ÃÑ4ÃÐX.ðò1Ãpn-Ãý7ÃZ3ü1À}1Ãðç8ðà4ÃK/Ãð0Ã-Ã0¢4Ã!2à¿3ðø0ÃÀœ1ðQ7ÃÀ1.à ±+Ãð2àN1ö2Ã],Ã@½6ÃÀ 4ðu1ÃP.ÃÐL0Ã33Ãð 3ÃàÞ3Ã`Ê,à ¥-Ã0Æ.ðW6ÃÐÃ1Ãt9à65à65Ãðÿ4à i7ÃT4Ã@(:Ã@ù,Ãpb/Ãð /Ãà-ÃÐ(6à 1Ã0Æ.Ãx.ÃÀ¢0ÃÐ@2àé,ÃPü2Ãð/-Ã@ó-ÃÀŠ4Ãð|5Ãp>5ðò1Ã` 3Àƒ0ÃÀ%0Ãð2ÃÀ3ÃpÙ0À}1à 0à ø4Ã0 8ÃpÓ1ÃÂ0ÃÎ.ÃП7ÃPð4ÃÐ¥6Ã`2ÃP—.à ™/Ã0º0Àe5ö2ÃÈ/Ã0À/ÃP‹0Ãà+à 3ü-ÃÐÏ/ÃÐ^-Ãày/Ãp,8ÃП7ÃÀ3ÃÐ@2ÃÀ 4Ã0º0ÃÐá,Ãð¾*Ã*Ãpn-ÃàÒ5à 1Ãf1ÃÂ0Ãð¬-ÃðÄ)ÃÀ%0ð3Ãl0Ã`²0Ãð”1ÃË5Àè4Ãð¦.Ã!2Ã0+3Ã@R3ÃP0Ã@d0Ã@X2à þ3àã-ÃPa7Ã` 7ÃÀœ1à 4+ÃP2Ã`;/Ê+ði3Ãð4ð3ÃÀ®.Àe5ÃŒ5ÃPs4ÃÀ 4ÃQ.ÃK/ðæ3ÃP2à ™/ÃÐá,Ã@d0Ãpn-ÃÔ)à)ð™+Ãð¦.ö2Ã0º0ÃÀ+/Ã`¾.Ã`²0À.ÃÀÆ*Ã!2Ãð0ðu1à¹4Ã@ó-Ã`6àÅ2ÃpÓ1Ã`|9Ãã1Ãðv6ðÚ5ÃÀŠ4Ã],ÃÀ1.Àw2Ã@ *ÃàI7à×/ä1ÃÀ1àï+àf-Ã`50Ã7à¿3Ã`50Ã@(:ÃË5ÀS8Ãàö/Àq3à$8ÃP/ÃpJ3ÃàO6Ã0ä)Ãàä2ÃÀï8ÀS8à E=Ã*;Ã@½6Ãñ9Þ6Ãp27Ã@v-Ã` 7Ã`í;Ãp86Ãз3Ã@·7Ã0„9ÃÀ6Ã0 8Ã@É4Ã×3Ãàö/à9Ã@@6ÃË5Æ6Ãðˆ3ÃàU5ÃðŽ2Ã`ÿ8Ã@uBÃ07Ã@‡?ÃPa7Ã@ù,Ãp*ÃÐ44Ã'5ÃPÞ7ü1Ã7ÀÄ:ÃÀx7Ã0¢4Ãðˆ3Ã@@6Ãà¢=Ãp»5ÃÀZ<ÃÓ>Æ:Ãp86ÃPÆ;Ãàº9Ã@Ÿ;ÃÀf:ÃpJ3ÀÐ8ÃÐ8ÃPÒ9ÃÀ5ÃPÆ;Ãðç8ðÔ6ÃÀx7ÀA;ÀM9Ãðˆ3Ã`5Ãpë-ÃðÛ:Ã`p;Ã0:Ã0~:Ã0:ÃP[8ð]5ÃË5Ã@Ã5àÅ2Ã÷<ðÂ9ÃH6à c8Àe5Ãp»5Ãn:Ãh;ÃÐ{=ÃÀ~6Ã@·7ÃN5ÃPÞ7Ãð1ÃPØ8Ã`ÿ8Ã@Ï3àN1Ãðù5Ã`Ê,Ãðd9Ãðd9Ãà1;à:à ì6ù8ÃÐ"7ÃP[8ðo2ÃÀ2ðª=ÃÐ.5Ã7ÃàÌ6Ãý;Ã`6ÃЙ8Ãðÿ4àË1Ãp¯7ÃàØ4à 2ü1ÃpJ3Ãн2ÃÀœ1Ãð^:Àî3ÃPð4ÃðÉ=ÃÀ„5ÃàØ4ÿ7ÃàO6ÃàØ4Ã×3à­6Ã@(:Ãý7Ã` 7à<4ÀA;ÃpD4à æ7Ãðí7Ãàº9Ã0x;ÃðL=ÃPm5à=Àî3À5=ÃðF>Ã0`?Ãð^:Àâ5Ãð).Ãð^:Ã`)2ÃPs4Ã3à o6à ø4Ã×3Ã0œ5ÃPØ8Ã’4Ã@í.Ãà%=ÃPÌ:Ã@Ã5Ø7Àe5Ãð 3Ã`š4ÀY7ÃГ9ÀÐ8à ò5Ãðv6Ã0–6Ã@|,ÃÀr8ðE9ÃÀ~6Ãý7ÃN5Ã0:Àƒ0Ã92Ã`6àË1Ãp—;Ã05Ã0º0à×/Ãàö/À¸<ÃpÍ2à­6Ã@d0Ã`v:Ã@R3Àw2Ã0º0Ãp©8Ã*;Ãà>ÃÐ¥6Ã06Ãð 3Ã012Ã0¢4Ã8à 2Ã`#3Ã0~:Ã0œ5Ã7ðÚ5Þ6ÃÀ„5À}1ÃpD4ÃpÍ2à W:À}1ÃÐ:3Ãà@ÃŒ5Ã$<Ã9.ÃàÌ6ÃË5Ãз3ÃÝ2ÃÐ.5Ãðˆ3Ãð|5ÃÀ~6à¿3Ãpñ,Ã`50ÃàØ4Ã3/àN1Ã0®2à 3Ãàä2Ã0%4Ãp86Ã0À/ðo2Ã0U,Ã@Û1ÀÜ6ðÚ5à ì6ÿ7ÃPê5Ã0´1ÃÀ3ö2àH2ÃÀŠ4ÃÐF1Ã@R3Ã@R3Ãз3ÃП7Ãð2Ã5Ã07à›9Ã@F5àÑ0Àk4Ã0®2à c8ðÎ7Æ6ÃpV1ÃQ.ð{0ÃÀ 4Ãн2àN1ðò1ði3ÃÝ2ÃÐ44ÃàO6Àq3Àk4Ã'1ÃpÍ2à 1Ã@Ÿ;ÃÀ®.Ãp86Ã` 3ü1à ø4à 2Ã0%4àH2ÃP1Ãàm1ÃÐ@2ÃN5Ã’4à³5ÃŒ5ÃÐX.ÃP2à 3Ãб4Ã`;/Ãp\0ÃÐ@2ð/ðò1Ãàs0ÃÀ®.Ãpå.Ã`2Àƒ0ÃpÇ3Ã@Õ2Ãð4Ã÷8Ã@Ï3Ã0œ5ÃP1Ã@Õ2Ãð2àé,ÃpJ3Ã@Ï3ü-àZ/ÃÀ 4ÃpÓ1Ãpµ6ÃÀ 4ð/ê0ÃÐ44Ãàä2Ãàê1ÃÐó)ÃZ3Àú1Ã@p.ðo2Ã?1àÑ0à 2ÃPö3Ã0œ5ÃÐF1à 2Ã@^1ÃÀÌ)àË1Ã5Ãàm1Ã!6Ãàg2Ã0Ò,ÃÂ0Ã0À/Ã`²0à§7Ã`‚8Ã@^1Ãð¬-Ã@j/ÃP‹0Ã3/àT0Ãðˆ3ðÂ9ÃP1à`.àN1Ã0¢4Ãã1ÃÀ6Ã@Õ2ÃpÍ2ÃÔ)Ã*;Ãðù5ê4ä1Ãpß/Ã`)2Ãpn-Ã@d0à65ÃPy3ð‡.à 1Ã`8Ãpb/Ã0º0ÃP…1Ã@d0à /ÃðG)ð/Ä,ÃP…1Ãf1Ã`Ä-ÃÀ2ÃÐÉ0ÃPÁ'ÃÈ+à (-ÃÀ®.ÃÀ´-Ã`_)Ã0®2Ã0[+Ã`5Ã`Ü)Àî3Ãàm1Ã0[+àB3ÃÐp*Ã`Ö*àË1àT0Ãð”1Ã` 3Ã!2Ãð;+Ã@^1à «,àl,Ã0a*ÃP0Ãû-Ã@ù,Ã`G-Àƒ0àã-Ãàs0Ã9.Ãð /Ã@Û1Ã-Ã`¾.Ã-0Ã@ *Ãà‹,Ã`G-Ã,ÃE0ðæ3ÃÐó)ÃÐ^-Ãð¬-à ".ÃQ.ÃP‹0ÃÐ.5ÃÝ2Ã'1Ã@ÿ+ÃP¯*Àô2À‰/Ã071Àk4à þ3Ã@p.à 1ÃP-Ãà,Ã@d0ði3ÃPy3à Ÿ.ÃE0Ãð^:Ã0=0ÃpJ3Ãà…-Ãp\0à ‡2Ã`¬1Ã@Ï3à 3Ã`š4Ãpý*Ã`2àr+Ã,ÃÂ0Ãð‚4Ã0[+ðò1Àe5Ã06ðÔ6ÃP2Ã`²0àT0Ã0Ø+ÃЫ5Ã@L4Ã0¢4à¹4Ã@p.ÃÀ¢0Ãp€*À.Ã@Ï3ö.ÃpÓ1ðø0Ã@^1Ãðv6Ãð4ÃpP2Ã-4ð/Ãì%Ãpb/Ã0[+ðo2Ã'5Àw2ÃàÞ3Ãpë-ÃÐ(6à ‡2àé,À}1Ã`)2Ãð1Ã0%4ðÚ5Ãp,8Ã`2Ã`;/Ãàð0Ãpµ6ÃÝ2àN1Ã@ *Ã@ù,Ãð|5À.Àq3ð3Ã`#3àN1ÃPm5Ã=ÃàI7Ã@ç/ÃÀû6ÃÎ.Ã071ÃPê5ðÚ5ÃðX;à 3ÃK/Ã0®2Ã@Õ2Ã33Ãðˆ3Ã@j/Ã0ä)Ã4ÃZ3ü-Ãð”1Ã4Þ2ÃP&,àõ*Ãðš0ü-à ™/ÃàO6Ãð4Ãà‹,Ãàs0ÃàØ4Ãðš0à­6ÃàÀ8ð/ðì2Ã0–6ÃpÁ4Ã0=0ÃÀ2Ã0œ5Þ6à­6ÃP2Ãì)Ãé0Ãð 3ÃP[8ÃH6Ã'5À0Ã@Û1Ã0:Ãp,8ð?:à /ÃÀã:Ã05ð{0ü-ä5ÃB7Ãðó6ÃpÓ1Ã@d0ÃÀ2àB3À7Ãàa3ÃÐL0Ãc+ÃÀÀ+Ã071Ã’8Ã@+ÃÀ1.ÃPä6àZ/Ãph.Ã3/ð/ÃE0Ã7Ã07ÃÈ/ÃP2Ã÷8ÃP2Àô2Ãб4ÃÀ3Àq3Ãp27ÃË5Ãð1àË1Ã@á0Ã33ÃàO6ÃÐá,ÃÐL0ÃpJ3Ã`²0à u5Æ6Ã@R3ð{0ðu1Ãpë-ÃÀU(Ã0C/Ã`/1Ã071àZ/Ãð2ÃÀ 4Ã071ÃàU5Ã`#3Ãf1ÃÀ 4Ã0Þ*Ã~-à ‡2ÃPs4ÃÐ:3Ãð¦.Àú1ÃÎ.ÃàÌ6Ã`Ž6àË1Ã`¬1Ãf1Ãp>5Æ6ÃÐ@2Ã-4ðæ3ÃÀŠ4Ã0¨3ÃÐÃ1Ãé0ÃÔ)ÃpP2À1ÃÀ5Ã@ÿ+Ãp€*ÃðŽ2à 3À.ÃÀ7-Ãé0à 2ÃPs4Ãà.Ä,Ã`Ž6à¹4à ò5ÃpP2ÃPö3ÃÂ0ÃÐF1Ãï/Ã@d0àB3ÃË5àZ/Ã@ù,Þ2À.à 0ÃÐÏ/Ãàg2Ã@Û1ð]5ðø0Ã`#3à§7Ã-0Àú1Ãpß/Ã0®2ð/Ã@:7àl,Ãà‹,ÃÐá,Ã@R3Ã`)2Ã@ù,ðþ/Ãàê1ÃÀ3Ã0´1à¿3ü1Ã`A.Ã0º0Ã0À/Ã](Ãx.Ã~-Ã`¬1à (-Ã`2à 0Ã?1à /ÃÑ4Ø3ð/Ãp»5Ãf1Ã012à ¥-Ã@ù,ÃPµ)Ãpý*Ã`M,ð-Ãpý*Ã0[+Ã~-ðþ/Ã`/1à×/Ã0´1Ã@ó-à65Ã0º0ÃÀ7-ÃK/À•-ÃÎ*ÃE,ÃÐR/Ã`Ž6Ã`6ÃP -ð/Ã@p.ÃP/Ã@Û1Ã@X2Ãðd9ÃÀ1ÃÐó)Ãð”1ÃðŽ2ð/ÃÐÏ/ÃQ.Ã@ù,à Ÿ.à¹4Ã`2Ã!2ÃpÇ3Ã9.ðW6Ã0–6Ã33ðþ/à ±+Àk4ÃÀ1.à×/ÃP&,ÃP…1ö.Ãã1ðÎ7Ã@j/Ã3/ÃZ3Ãõ.ðŸ*àH2à 0ÃÀ7-Ãð”1À.àN1À0ÃÂ,Ãà,ÃÀ¢0ÃpÙ0ðu1Ã0º0Ãp*ÃP0Ã@X2ÃП7Ãð2ðò1Ã~-ÃÐF1àH2ð{0à§7ðò1Ã0º0ÃðŽ2ðQ7Ã@ç/Ã`#3à 6à 2ÃÈ+Ãð5,à 2ÃÐ"7ê4ÃÀ%0ÃK+À•-Ã0Ì-Ãà)Ãàü.àÑ0ÃÀ®.Ã0+3Ãé0ÃÐÃ1ð‡.à ‡2ðþ/ÃÎ.à<4Ãн2Ã!2ÃP-ÃÐó)Ã`50Ãà.Ã@F5à È<ÃÝ2ÀÜ6ÃpD4À_6Ã'1Ã`)2Ã@X2Ã@j/ðø0Ã@#&Ãp’'ðþ/ÃàU5Ãàs0Ãð#/ÃÀ3Ãõ.à*7ÃPê5ÃÐ:3ÃpJ3àÑ0Àú1ÃàI7àÝ.Ãàð0Ã071ÃÀ1.ð{0ü1Ã`#3ÃÀ1Ã@½6à 3Ãà‹,Ãð 3ÃpÙ0Ã071à`.Ã` 3Ê+Ã0Æ.ÃÈ/Ã@½6ÃZ3Ãx.Ã0œ5ÃÀ„5ðQ7Ã@Ã5Ã`Ü)Ãc+Ã0a*ÃP—.ÃW)Ã@”(Ã`A.ÃT4Ã@p.ÃP2*Ãàê1Ã0Æ.Ä,ð3ü1Ãàü.Ã@ó-ÃQ*Ã`;/Ã0º0ÃÐL0Ãõ.ÃÐÛ-Ã@^1Ãð;+àr+Ã5ÃP‘/ÃÈ/À.ÃÐR/Ã`Ê,ÃP0Ã7ÃP…1ÃÐ44Ã0[+Ã{'Ã`6à 2ÃP -Ãpb/ÃP—.àB3Ã0%4à “0Ãà‘+Ã@X2ÃÀÆ*ÃÐv)Ãà‘+Ãð²,ÃgÃð²,ðì2ÃPö3Ãàm1à65Ãà+Ãð0Ãàê1Ãð;+ði3ÃpÍ2ÃPê5Ãf1Ã0Ò,ÃÀ1.Ã*à ™/Ã`#3Ã`”5Ã33àH2Ã-4Ã0[+Ãà+àf-Ã0I.Ã@Ï3Ã!2à*7à 0ÃP¯*ÃÐd,ÃP&,Ã@á0Ã`Ä-ÃP&,Ã`2ÃÀ¨/ÃP/à 0Ã0Þ*ð .ÃÀÌ)à<4ÃЫ5ÃÀ3Ã`Y*Ãà,Ã`Ä-ÃÐÉ0ð .ÃÀ®.ÃÀ2Ãð”1àH2ÃàÞ3Ã!2Ä,à ì6ÿ7Ã012Ã@á0Ã!2ÃÐ@2àÝ.ÃÀ+/Ãp÷+Ã0I.Ãà‹,à 3ÃÐL0Ã'5Ã` 3Ã0º0ðò1ÃK/Àƒ0ÃŒ5ÃP1Ã@L4Ã0–6Ã@^1Ã-0ÃП7Ã`¬1ÃÂ,Ã-ÃÐÃ1Ã69Ã`”5ÃPö3à +ÃÐR/Ã`Ö*àx*Ãà‘+ÃàØ4Ãð).Ãð¦.ÃÀ2Àk4ÃÈ/Ãã1Ã-4à 0ÃÐR/ÃÀ2ÃÐX.ÃP1Ã0ä)ÃÐX.Ã`¸/ðø0Ãàê1ÃpV1à 1Ãõ.Ãà‹,Ã`G-à 3Ã`¾.ð-À}1Ã)ÃÐ@2Ã@v-Ã`G-Ã`5Àq3Àú1ÃÝ2À›,Ã×3Ãpå.ÃÐ:3À.Ã@|,à ¥-à ¥-Ãб4à ·*Ã@ç/ÃÀ1.Ã3/Ã'1ÃÐL0ð-ÃàU5ÃÀ%0ð"*ÃpÙ0Ã`)2ÃÐX.Ã`²0ÃÀ=,Ãpñ,Ãàð0ÃÐ'À¡+Ãàä2Ã071à /Ãò(À.ÃP,+Àƒ0à þ3Ãà.ÃÐ44ÃÐÛ-ð/Ãàs0Ã×3àË1Ã0Æ.à Ÿ.ÃÀ–2ÃàÞ3Ãp>5ÃÀ2À.Ãp*àr+Ã0Æ.Ãr/Ø3ð/Ãp\0Ä,Ã@d0à<4ðì2à ±+ÃPü2Ã`š4Ã0ä)ÃÐç+Ã@@6ÃÀŠ4ÃÐR/ÃpV1ÃÀ1.Ãé0ÃÐ@2ÃPy3Ãð).Ã@Õ2ÃÐ44ÃP>(ð"*ÃÐ@2ð/à~)ÃPµ)ÃP/ÃpŒ(Ã`²0Ã`²0Ãðj8ÃpP2ÃÐL0Ã`50Ã9.ÃÀ1.ÃÀ2ð"*ÃÐR/Ã3/ÃPð4ÃP-Ã`;/ÃðŽ2àT0ÃÀÌ)à 3Ãð 3Ã9Ãpß/Ãð#/ÃÀ´-ÃÐÉ0ÃÐ¥6ðò1ÃÐ^-Ãà)Ã0C/Ã'1ÃN5Ã33ÃàU5Ãð¦.Ã0Æ.à ‡2Ãð”1ê0Ãpñ,ÃP©+ÃÀ´-ÃK/Ãð¬-à 0ÃP—.Ã`¸/à +Ãà‹,ð{0Ã@p.Ã@ó-ÃÀ1.Ã~-À•-ÃQ.ÃPµ)ÃÀœ1ÃÑ4Ãàð0À§*ÃÀ1.ðæ3Ãpß/Ãpz+Ã@ù,ÃÂ0Ãày/ÃÀ2ÃPy3ÃðA*Ã-Ã`¸/ä1Ã4Ãà+ði3Ã@v-ÃÐÛ-Ã@d0Ãf1Ã92ð+Ã`2Ã9.Ã?1ÃÂ0Ã0º0Ãð²,ÃÐ@2ÃPg6ÃÀ´-Ã33Ãàs0ÃP1àT0À-ÃP/Ã@í.ð™+à ‡2àÑ0ÃÀ1ð3Ã`¬1À•-àã-à (-Ãà )ü-àÅ2àH2Ãû-Ãpë-Ã@R3Àk4ð/Ãб4ÃÀœ1Ãû-à .,À‰/Ãà.Ã0®2ðÚ5àN1Ãðÿ4Ãàü.à 1Ã@·7Ã<8Ã0Þ*Ã`Ð+à Ÿ.Ãr/Ã`Ž6ÃЫ5Ãð|5ÃðÃ>Ã@Û1àB3ÃÝ2ðþ/Ã`/1Ã3/à 1Ã92Ã`Ð+à¿3ðò1ÃP2Àk4Ãp©8Ã06ÃÐ^-Ã`G-ÃÀº,Ãàm1à {4ÃP.ÃPs4Ãp>5Ã4Ãû-Þ2Ã@á0àH2ðø0ÃÐX.ÃpP2Ãð¾*ÃP‘/Ã@@6à (-à ‡2ÃpV1Ãpt,Ã0´1ÃЫ5ÃàÞ3ÃpÁ4Ã!6à i7à æ7Ã`¬1à ø4à`.Ã@ÿ+À-Ã@X2Ã@ *Ø3ÃpV1ÃP‹0Ãàm1Ãð²,Ãl0ð™+ÃÀ=,Ãã1ÃT4Ã`”5Ã-4Ã`G-Ã012ÃÀ6à³5ðc4Ãð1Ã012Ã`š4ÃÐ@2ð]5Ã012ÃPy3ÃЙ8ÃPö3Ã'1Ãð /Ãà‹,Ã0´1Ãx.ÃP&,Ã0I.Ãð¬-ð‡.Ã×3Ãð 3ÀY7Ãðù5ä1ÃQ.À.à Ÿ.ÃÔ-ÃP2ÃP2ÃÀ+/à`.Ã0Æ.ÃÐÉ0Ã0®2ÃÀ5àN1ð‡.ÃÐÉ0Ã`2à ".Ãé0ð/Ã`4Ãð /ÃP£,Àô2Ø3àË1à 3à 4+Ã@j/ÃÐÿ'à +Þ2ÃH6ÃÐÃ1à³5ÃÐ@2Ã0Ò,ÃÀ¨/ð{0Ã`Ê,ÃÐj+ÃÐÉ0Ã`š4ð-à¹4Ãàö/ÃP…1à “0Ã`4Ã`;/ÃÂ,Ã@ó-Ãà‹,ü1ÃP.ÃZ3Ãб4Ã0I.àÅ2à ‡2Ã@É4Ã`Ü)Ãp\0Ø3ÃÀ 4àÑ0Ãr/Ã@v-ÃP—.Ãð).ÃPü2Ã`¾.à`.À-Ã`Ä-Ã’8ÃË5ÃpÇ3à {4ð/Ãpý*ð/Ãn:Ã05Ã3/Ãð2Ãl0ÃP&,Ã@Û1ÃE0ÃP,+Ãàa3à ò5Àô2Ãã1ð/Ã`k'Ã@+àl,ÃE0Ãàö/Ãðš0ÃpP2ÃÐÃ1ÃЫ5Ãð0ê4Ãr/ÃpÍ2à {4Ã-Ãp>5Ã@v-Ã@á0Ãx.ÃÀ1.à 1Àw2Àw2à ‡2ÃZ3ÃÀœ1Ã7ÀG:Ã`í;à*7Ã`#3Ãz8Ã5Ãf1ÃPê5à ]9ðÚ5Ã`‚8Àâ5Ãðv6ÃàC8ÃЙ8Õ>Ã0û:à à8ÃÐ(6ÃpJ3Ãðj8à È<ÃÀT=Ã÷8àw?Ã,EÀâ5Àe5ÃÀû6ÃÀ×<Ã7ðK8Ã012Ã7ÃÀï8ù8ÃÐ8Ã0œ5ÀÖ7Ãðó6Ãz8Ã7ÃË5ÃPð4ðE9ÀG:Ãp—;Ãðd9Ã09ðÈ8Ã@(:ÃÁAà=àƒ=Ã0„9Ãé0Ãp27ó9Ã`‚8Ãl0ðÚ5Ãp=ÃÀË>ÀG:Ø7ÃPU9à æ7ÃàC8Ã@:7à Î;Àe5ç;Ãh;Àâ5ÀS8à ì6Ãàº9ÃðÛ:Ã@É4Ãб4Ã`6à Ô:ð¼:Ãý;Ã0–6ÃÐ(6ðE9Ã`v:Ãß<Ã@Ÿ;ð-=ðÔ6à °@ÃÐÎDÃp&9Ã@F5ÃPØ8ÃÐL0à þ3ÃP[8Ã@L4Ã7à³5Ã`²0Ã@·7Ãý;ÀA;ÃÐ44Ã0:Ã÷8Ãðù5ÃàC8ÃPU9Àâ5Ã’8à à8Ã@É4ÃÅ6ÃPä6Ã` 3Ã`6ðÔ6ÃÐ8Ãp»5à>Ã;ÃN5Ã@Ã5Ã0:Ã`š4Ã-4ð3Ã`/1Ãý7ÃP==Ã69ÃÀœ1Þ6ÃÀŠ4ðò1Ã7Ã@X2ÃPð4Ø7ÃN5à ø4ÃpÓ1ð]5à c8Ãàº9Ã0:Ã;ÃB7Ãt9Ã@F5ÃÀ6Ã@Û1ÃPy3Ãàº9Àâ5Ã@48Ãp&9Ã0+3ÃPa7à¡8à¿3Ø3Ã0–6ði3Ãà[4À.ÃP1Ã@48à ò5ÃB7ð?:à­6Ã!2Àâ5Àe5Àe5Ãð‚4Ã@Û1Ãðù5Ã`v:à à8Ã0~:Ã3Ã'5Ã@Ã5à9ÃPð4À›,ÃP/Ãp»5Ã'5Ãðv6ðc4Ãp86Ã`¦2ÃÑ4Ãð|5Ã0¨3Ãñ9À;Ãàº9Ã`ÿ8ÃB7Ã` 7àT0ðì2Ãн2Ãð2ÃP‹0À.ÃpÍ2ðæ3Ã0 8Ã@<à à8Ã@É4Ã`/1ðÂ9Ãp,8Àú1ÃN5Ã0œ5Ã0 8ðò1ÃŒ5Ãã1Ã0%4Ãð 3ÃP1Ã`¬1à i7Ã@48à o6Ãð”1ÃpÇ3ÃÀû6Ã@48ÃP1ÃpV1ÀM9àZ/Àk4ðÔ6Ãà[4ÀY7Ãàa3ÃP…1Ãà,Ãpå.Ã@X2àÝ.Ã0+3Ãð1ÃàÌ6ÃÐ(6Ãð”1ÃÀÀ+ÃP1ÃÐd,Ã`¬1Ã0º0Ãp©8ä1Ø3ÃP/Ã0=0Ãé0ÃÝ2Ã0C/Ã@Û1Ã3/ð{0ÃÀ~6Àe5Ã’4Ãð).ðo2Ã<8ÃÀx7Ã@Ž)Ã0O-Ãàm1ä1Ã@X2Ã’4Ã?-Ãc+Ãàä2Ãpb/ð-Ãà.ÃÎ.Ã071Ã`)2Ãàg2àÑ0ÃpP2ÃàU5Ã07Ã@Ï3À.Ã0Þ*Ãз3Ã` 7ÃPg6Ã0´1ÃPm5ÃàÒ5à {4ÀÜ6ÃT4Ã@X2àZ/À¾;Ã`6ðà4ÃpD4ÃÎ.à 3Àq3Ãðí7ÃðA*ðu1ÃÀ–2ðc4Ã@v-Ã!2ð{0ö2Ã@Û1ÃpP2ê0Ã@ *Ã33à ™/ÃÐF1ðø0ÃÀ1Ã0¨3Æ6ÃP£,À.Ã@j/ä1Ãðš0ÃP/ÃÐR/À}1Ã0O-Ã@j/ÃÐ@2àÑ0ÃK/Ãé0Ãàm1ÃÐÃ1Àƒ0àB3ÃP…1ÃP -ðæ3Ãà‘+ÃpÙ0Ãx.ÃÀ1.Ã0I.Ãðj8à ò5ÃQ.Ãpz+ð]5Ãp¯7Ã@^1àN1À‰/ÃÂ0Ã0=0à 1à “0ðo2Ãl0ÃP2à þ3ÃÐÃ1Ãpb/Ãp÷+à þ3Ã@+Ã`Ê,ö.Ã`e(ÃÀ1Ã-0ÃP‹0Ã`¾.Ãp†)Ã3Ãpå.Ãpn-Ãpå.ÃP2Ã`²0ð{0ÃÀ3ÃN5Ã071ðø0Ã0º0ÀÖ7Ã~-À‰/Ã`/1àõ*Ãã1àN1Ã`5ÃðŽ2ÃP£,à Ÿ.À¡+Ãpë-ÃÀ=,Æ6À‰/à 2Ã0+3Ã`k'ÃP‘/ÃÎ.ð™+à 6Ãà‹,ðo2à ò5ÃðŽ2ðu1ÃàÒ5ÃŒ5Ã0–6Àw2à×/ÃÔ-ði3ÃÀû6Ã'1Ãpt,Ø3Ã`4ÃÎ*Ã`Y*Ãð1ÃpÍ2Ãpß/à Ÿ.à 1ÃÝ2À1À•-Ã-À.à ™/à Ÿ.à65àÅ2Ã@X2àH2ÃP/Ãз3Ã@L4Ãà‘+ÃÐá,Ã0´1Ãpß/à Ÿ.Ãðš0Ãr/Ã`5Ã69à§7ÃK/À}1Ãð1Ãf1ðþ/Ã0O-ÃPy3à ì6ð-ê4àN1Ãð 3à (-Ã0O-ÃàI7Ãp86Ã!2Ãàð0ÃP1Ãàm1ÃÀ=,ðø0Ãà.àõ*Ã@|,ÃÐ@2Ãp\0ðþ/Àî3ðì2Ãr/à +ÃÀ+/À.Ãû-Ã~-ÃB7Ã'1Ãð#/ÃÀ´-Ãày/Ãз3ÃÀ1ÃZ3Ãðÿ4ÃÀ®.ÃÀ„5Ãб4Ãz8à*7ÃP2Ãr/À•-Ã@ç/Àe5à {4ÃÀœ1Ãðv6ðì2àÅ2àZ/Ã@^1Ãð2ê4Ãð /ÀÖ7àf-à (-Ã0´1Þ2Ã?-àN1Ãðˆ3ÃpV1Ã'5Ã0%4Ãr/à {4ÃP‹0ÃàÌ6ÃP0ðò1ÃÐ@2àZ/à`.ÃÀº,Ãðù5à­6ÃÀ 4Ãð4Ã`/1Àƒ0Ã@R3ÃðŽ2Ã'1Ã06Ã0œ5ÃÅ6ðÎ7ÃÀœ1àô?Ã\=ÃT4Ã;ÃàI7Ã`ó:Ãp27Ã@@6ðK8ð¶;ðDÃp :Ã0r<ÃÐu>Ãà@ÃмGà ’Eð’AÃP+@Ãà Aà ˜Dà DÃp[EÃúBÃ`:DÃpØEÃð@?Ã0¹EðDÃà„BÃpÌGÃà~CÃqDàÜCÃð"DÃp?ÃÀ*DÃàÝHàGGÃ@ÚFàâBÃàxDÃÐ3IÃpUFÃ8CÃ@òBð CÃ@KIÃ`ÃBðhHÃpmBàÄGÃðŸDÃPûGÃ0ËBÃÇDÃàHLðåHÃ`:DÃb<à_CÃ00GðhHÃ@ÔGÃpÀIïDÃðIÃ@àEà °@ÃP~GÃàZIÃð¥CÃ`¥GÃÖHÃðEÃ`.FÃ@ÎHðßIÃÊJÀçIÃ;MÃ0§HÃYHûFÃð‡HÃðøJÀÛKð÷EÃpOGÃЪJà¾HÃpaDà GÃ@]FÀÿEÃ`:DÀóGÃp?ÃàõDÃàrEÃ00Gà tJÃpÒFÃkEàeBÃP EÃPCàèAÃ0BDÃðIÃàrEÃpÒFÃàïEÃà AÃÐÎDÃèEÃpºJÃpIHÃÓBÃp…>àô?Ã@ìCà_CÃ@æDÃ0¹EÃpÞDÃ`±EÀBÃpgCÃOÃîDÃ`±EÃàZIÃÐ?GÃ`ìPÃPrIÃkEàÊFÃÁEÃÐEFà ˜DÃÀFàô?Ã0Z@Ã@@ÃÀB@ÃP–CÃå?Õ>Ã`:DÃp…>à ¶?ÃAÃÀ§DÃ`ÃBàÊFÃp>Ã@=ÃàéFÃжHÃÀ•GÃàBà=Ã?Ãð·@ÃP¢AÃ`í;ÀAÃpaDÃðF>ÃÐÂFÀˆDð÷EÃð.BÃàlFÃÐ{=Ãå?àÖDÃh?àeBÃpy@Ã`Û>ûBÃwCÃÀ0Càô?Ã0TAÃ0f>Ã@>Ãà@Õ>Ã@ìCÃP¢AÃ0×@ÃwCàÖDàÜCÀšAÃ`Ï@àâBà 3@à DÃÀÃ2DàÊFûFÕ>ÃÀã:ÃàŠAÃP®?ÀÊ9ðBûFÃ@uBÃ0³Fà›9Ã0f>ÃðÉ=À)?à °@Ã@]Fà 'Bà ¶?Ãà®;Ã0ï<ÃàÀ8ÀBÃß<ÃðÕ;Ã@";Ã0:Ãð@?à Ô:à 9?ÃÙ=À5=ÃÀ¿@Ãðv6À7ÃH6á<à;ÃÀ`;Ã@@ðAÀ#@Ã0Š8ÃðÉ=ÃðÕ;Ã5à;Ãp©8ÃàCà 9?Ã\=ÃÀ6BÀ;Ãp<ðŒBÃàBÃ`Õ?ÃVBÃÙ=à i7Ãp;à K<Ã*;Ã0ã>ÀÄ:Ãpü?ÃàC8à Î;ÃÐ¥6Ã@>à c8Ã`d=à ]9Ãn:à 3@ð'>ÃÐ:ÃÐ44Ãp :ÃPÀ<à Ô:Ã`í;àú>ÃpðAð!?Ã?ÃÍ?Ãt9ÃЙ8ÃÐ8Ãß<à È<ÀM9Ã0f>Ã@™<Ãb<ÃPØ8Ã5Ã`í;à›9Ãà¨<Ã0–6à Q;Ãðd9ÀÄ:ÃÀ~6Ã’4Ã@48ÃðÉ=ð˜@Ã`ó:ÃàÌ6à;ÃPa7ð¼:Ã`ÿ8Ãp»5ÃÀÑ=À/>Ã0õ;ÃðX;Ãz8ÃÀé9ðÔ6Ã0Š8ÃPÀ<Ã0:ÃÀû6ÃÀï8à;ÃPC<Ã*;Ã@<à‰<Àq3Ãp=à K<Ãàœ>ÃÀ5Ãà=9ðQ7Ãå?Ãà1;ÃÐ9Ã07Ã\=Ãp;Ãp&9ð¼:à ]9ÃðÛ:ðà4Ã@«9ðž?Ãp>5ÃPm5ðì2Ãðÿ4Ã0„9Ãà®;Ã@L4Ãp¯7Ã07ÃPC<à>ðÈ8ÃÀx7Æ:ÃÐ{=Ãë:Ã0õ;Ãh;ÃPÀ<ð?:ÃЙ8Ã0 8Ã`/1Ãp<à i7ÃàO6Ã07Ãp :ÃÀx7Ã;ÃÀï8Ã@½6ÃðÛ:ðÂ9à æ7ÃŒ9Ã09Ã0„9ÃÀ5Ã0œ5Ã`š4ÃàÌ6ÃAð°<Ãз3Ãðç8à Ú9ÃP7>ÃPÒ9ÃðX;Æ6ÃN5à;Ã@<Ã`v:ÃàO6à§7Ã0 8À;à K<ÃÀ6Ãà1;Ã`ó:Ãp>ÃÐ9à i7ðÎ7Ãà¨<Ã`|9Ã92Ãðj8Ãb<Ã@>Ãp>ÀÄ:Ãà¨<Ãp>ÃP®?ÃÐu>Ãà1;ÃÐ¥6ð¶;ÃpD4Ãð4ðE9ð¼:ÿ7Ã@·7ÃÀé9ÃàC8Ãðí7ÃŒ9ÃPÒ9ðà4ÃÀl9ÃJ@Ã@Ï3ÃÀ`;ÃPÀ<Ãð±AÃ`Û>Ã`|9Ã0Š8Ø3Ã0`?ç;ó9Ã?à*7ÃÐ.5à ]9ù8Ãðó6ÃÐø=ÀÊ9Ã0„9Ãà+<àô?à æ7Ã09ÃГ9ó9Ø7À5=Ã`p;Ãб4ÿ7Ã@@ÀÊ9Ãp»5Ã@=Ã@‡?Ãz8Ãðó6ð-=ÀG:Ãà?Ã@>Ã*;ð]5ÃPO:Ãà%=ÃÙ=Ãðj8Ã;Ãß<Ãðd9ó9Ã0l=Ã`ó:ÃPä6ÃàÀ8Ã>Ã0ï<À¸<à i7ÃÀã:Ãp‹=Ã@>Ã=ÃPÆ;ð¶;ÃÐ<ÃðÃ>Ãà@ÃÀã:ÀA;Ã0×@ÀA;Ãë:Ã÷<À;<ÀY7Ã>Ãðj8Ã`ÿ8ÃÐ9à K<Ã@‡?à}>à§7ð¼:Ã`ù9Ãh;Ã@‡?Ã0„9Ã0„9Ãp:Ã07Ã` 7À¸<ÃГ9ÃÐ:Ãðˆ3Ã`2Ãðj8àƒ=ÃÀï8ÃÐ¥6Ã` 7Ãp:Ãð^:Ã\=ÃÐ(6Àè4Ãp£9ÃÑ4Ã@";à :à¡8à•:ÃÀÝ;ÃðÛ:Ã012ÃPU9Ãðç8ÃPä6à•:Ã`v:à*7Ãp‹=Ã`ó:Ãp¯7Ã0ï<Ã0f>ÃÐ:ð¤>Ã`ÿ8Ã07ÃÐ:à :Ã@ ?ÀÄ:ð3à ]9Ã!6Ã0–6Ã0„9ÃPO:ÃàÌ6ð¶;Ãà[4ÃЇ;É@Ãp&9Àâ5à E=Ø7Ãf1ÃPg6ÃðR<ÃÐ:Ã@±8Ã@";Ãp;Ã07ÃÀŠ4à <ÃÐ:à›9ðò1ÃP2Ã0`?ÃÐ¥6Ã07Ãð^:Ã0f>ÃÐ9Ã0¨3Ã012Ã`Ž6à*7ÃÐ"7Æ:ÃÐ(6àÅ2ÃÐF1ÃÐÃ1ÃàÞ3ÃÀÝ;ÃàU5Ã0À/Ãf1Àq3ÀY7ÃП7ð¼:à W:Ãð|5ÀM9Ã@d0Ã`50Ã05Ã`ˆ7Þ6à³5ðò1Ã0+3Ã`#3ÃÐÏ/ÃÐ:ÃÀï8à u5Ã`”5Ã06Ãðp7Ã07ÃÀN>Ã@=Ãàg2Ã3ÃÀ5ÃÑ4ÃðX;ÃÅ6Ãp,8Ã’4Ã`ˆ7ÃT4à o6Ã4ðÎ7Ãðÿ4ðò1Ã9.ÃÅ6à‰<à³5ÃPm5ÃЙ8Ã`p;à;Ãà¨<Ãp&9Ãp;ðAÞ6Ãå;ÃPØ8ÃPØ8à ".Ã`Ž6ÃÀŠ4Ã@á0ð¼:Ã@±8Ã@X2Ã@±8ÃÀ2Ã4ÃàÒ5à c8Ã`š4Ãp:ÃП7ÃPü2Ã@Ã5Ãn:Ã06à i7Þ6ÃpÁ4ÃЙ8Þ6Ãð 3ÃÐ9Ã`6Ã`ÿ8Ã`ÿ8ÿ7Ã@(:ðÂ9Ãpå.à “0ÃÀŠ4à*7ð°<Ãt9Ãp>5Ã05Ã@Ã5Ãð4Ãàm1Ã@Ã5Ã@j/ÃH6Ãpµ6ðE9ÃPy3ÃÐF1ÃÐ"7Ã-4ö2ÃPs4à :Ãp>5ÃÑ4à “0Ãð|5Ãðˆ3ÃpD4ÃB7Ã`6Ãàa3ÃpJ3Ãz8ÃП7Ã@:7Ãý7Ãp>Ã0ï<Ãp86Ã@·7Ãë:àN1ÃÐX.Àq3Ã` 7àB3Ã@F5à ì6à ]9ðo2ÀG:Ãн2ÃpÇ3à¹4Ã`¦2ðu1Ã`)2Ã0:ÃÐ9ÃÀŠ4Ã@™<Ã0 8à <Ã`”5ÃP/Ã5ÃÐ@2ÃPO:Ãð 3ÃàÆ7ê0Ã’8Ã8à 6Ã<8ÃÐ ;à 1Ãðÿ4ðÈ8à (-à<4Ãð^:Ã`ÿ8Ã`G-Ãàº9Ã'5Ã`#3Ã07Ã’4ÃP2ä5Ãp»5ÃðÕ;ÀÜ6Ã@";Ã0¢4Ãp27à*7à ø4ði3à 2ÃÐ¥6Ãpµ6Ãp;ÃГ9ð?:Ã@«9Ãðÿ4Ãð2Ã÷8Ãàü.Ãð2ðø0ÃÀŠ4ÀY7ÃPÞ7ÃÀœ1Ãà…-ÃàÞ3ÃP—.Ãp86Ãp¯7ÃÀ~6ð¶;ÃÅ6ÃPÌ:Ã’8à Ô:Ã<8Ã!2ÃpÍ2ÃÀé9ðK8ÃP‹0ÃÐF1à 6Ãàä2ÃÐ¥6ÃpD4ÃÀ 4Ãpb/ö2ÃàÆ7Ãp;ÃŒ9ÃPÞ7Ãt9ÃЙ8Àî3ðò1Ãp27Ã69ÃàÀ8Ã0:Ãð¬-Ã@Ï3Ãñ9Ãðd9ÃP/Àè4Ãб4Ã0–6Ã` 3ÃE0Ãð0ÃË5Ãp»5ÃPö3Ã?-ÃZ3Ãp»5Ãð#/ÃN5ðc4Ãõ.ö2ÃÐÕ.ðì2Ã5à ì6Ã0Æ.ÃÚ,Ã×3Ã`|9Ã@á0Ãàö/Ã0 8Ãà1;ÃðA*Ã0Æ.ÃàØ4ÃàI7Þ6à§7à 4+ü1ÃpÓ1à ø4à W:Ã÷8Ã`6Ãðù5Ã@:7Ã'5Ã`Ê,à 3à ì6Ã0 8Ã`#3Ã0®2Ãð4à 6ÃPm5Ãð).àN1ÃÀ3àl,Àú1Àè4Ãð4Ã`5Ã0º0À;Ãpß/Ã0œ5Àâ5Þ2ÃàÌ6Ãð”1Ãð 3Ãð¸+Ãàê1ÃÀœ1ÃÀ„5ÃpÓ1ä1ÃPs4Ãàð0ÃÀ=,Ã`¾.ÃP…1ÃP-ÃB7Ã@.9Àw2Ã-ÃPð4à 6ÃÀ7-ÃÐX.ðø0Ã0û:à¹4ÃàÞ3Ã’4ÃðŽ2ðu1àË1àT0ê4Àe5Àî3Ã3Ãp\0Ã’4Ã`Ä-Ãpß/à¹4Ã@Ï3ÃÝ2Àî3ÃP.Ã@v-ÃÐÃ1à 2Ã'1à æ7Ãàg2Àw2ð/Ãàm1ÃàØ4í:à ™/Ãf1ÃPö3Ãð1Ãpt,Ã9.Ã`6ÃP‹0ÃÀ%0Ãï/ÃP-Ã0Æ.Ãð¦.Ãàö/Ã`M,Ãðˆ3àÑ0Ãf1Àƒ0ÃP‹0ÃpÍ2Ã@X2Ãà-Ã0O-ÃÐR/Ã?1ÃE0Ãà[4Ãp27ÃpD4àH2ÃÐÏ/àN1Ãð²,Ã`;/ð/ÃpV1ÃP—.ð3<à ì6à 1Ãp\0ÃÀ®.Ã`š4Ãà[4ðÎ7ÃP/ÃÀ–2Ã`;/Ã`S+ÃÀ1Ã9.ÃpV1Ã@@6À‰/ð‡.à ‡2ÃÀ%0Æ6à “0ði3ÃP-Ã33ÃÀ„5Ã`S+Ã?-ð«(Ã@p.àï+à×/Ã@p.À /ÃÀ´-À.Ã@í.Ãб4Ã`8Ã?1Ãph.Ã?-ÃàC8Ãï/Ã0À/ÃpÇ3ÃPs4Ãàü.Ãð¸+ð-Ã0C/àé,Ãð1ÃPö3à§7Ãð”1ÃP&,Ã@p.ÃÀ3Ãà.Ã92À**Ãð2ÃÀ3ÃÀ2ÃPs4ÃP‘/ðò1àT0Ãã1ÃpP2ÃK/ÃP/à 0Ãf1À /Ã×3ð{0ÃpÇ3ÀG:Ãð 3Ãð‚4Ã`G-ðu1à ™/Ãpb/Ã0U,ÃÀ%0Ãз3à¹4Ãàm1Ã0Æ.Ã`4ÃP£,Ãð).Ãàs0Ã?-Ã@^1ÃЈ&Ã@í.Ã`Ê,ÃPê5ÃPê5ð .ðø0à×/ÃP>(ð/à /à 1Ãf1Ãpå.ÃÐ44ði3ÃÀû6Ãp;Ã`4Ã@j/Ã`M,ÃPs4Ã@p.ÃÐÃ1ð/ð/ü-ðæ3à u5ÃðŽ2Ã071Ãàê1à ì6Ãàê1à 0ÃàÞ3Ã`”5Ãp\0à<4ðu1Ã@^1ÃPs4Ãð /ð«(ÃÐÕ.Ã071Ãpn-à$8Ã0–6ÃÀ5Ã071Ã`4ÃpJ3Ã0º0Ã92Ãð /à 3Ã@R3ÃÐR/ÃP¯*ð .ü-ÃÀ2à /ð3ÃÐÏ/ÃÀÆ*Ãð¬-ðW6Ã@F5À‰/ÃàÞ3àH2ÃpJ3ÃP2ÃÐ.5ÃpV1Ãàä2Àî3ðà4Ãà+ÃÎ.Ãð0à 0ÃP0Ã@X2ÃpÓ1Àq3ÃPü2à Ÿ.àT0Ã`¦2ÃÀ1Ãph.Þ2ð-Ã0C/Ãã1Ã`¦2Ã@Û1Ãf1Ã@d0Ãð /Ã@í.ÃÀ3àÅ2Ã@@6ÃPs4ÃK+Ã@|,Ãà-Ãà.Ã0À/Ãï/ÃP1Ãàð0Àq3ü1ÃPs4Ã@Õ2Ã0=0Ãàg2Ã33àT0Ãp\0Ã-Ãpb/Ã!2Ãp*Ã`4Ã05ÃÐ¥6ðÔ6Ä,À•-à`.Ã@‚+Àƒ0Ã0Ø+ÃÐX.Ãð²,ÃÂ0Ã@Û1àÅ2ÃÀ3ÃÎ.Ã@ù,àï+Ãð¸+ÃpÇ3ÃP1Ã`Ö*àl,à06àÝ.ÃK/Þ2ÃðA*ÃP©+ÃÀÆ*àã-ð-Ã*Ã`Ä-Ã@Ž)À0ÃÐF1ÃÀ¢0À}1Ã4À}1Þ2ÃpÇ3ðæ3Ãå?Ãàa3Ãðv6à {4Ãà*À-à 3ÃÀ1ÃÐÕ.Ãàê1Ã7ÃÐ(6ÃðŽ2à 4+Ãð¬-À,ê0Ãà+Ãðÿ4Ãàs0ÃP‹0Ã@í.ÃK+Ã0C/Àk4ÃÐÕ.Ãï/ÃÑ4ÃÐ44Ã`²0Ã0®2Àú1à “0ÃpD4ÃÀ2Ã@á0ÃÎ.ÃZ3Ãðÿ4à¿3Ã`¸/Ã!2Ãð²,À6(Ãð#/ÃÐÕ.Ã05ö.ÃpV1Ã012Ãð”1Àƒ0ðo2à ±+ÃP/Ã`50Ãð0Ãð /ÃÀ3Ã,Ã`â(Ãpb/Ãà.À0Ãl0Ã`M,à +Ãàm1Ãð1Ã@v-ÃÂ,Ã`â(ÃÀ7-Ãð0ÃÐÕ.Ãp\0ÃP‘/Ã`Ä-ÃÚ,ÃÀI*Ã@+Ãà.ÃpÓ1Ã@Õ2ÃÎ.Ã@Ï3à¹4à 3Ãðš0Ã`;/ð‡.Þ2Ã-0à ø4Àk4Ã0Ò,ÃÀ¨/ÀS8à06Ãl0ÃÀ+/à .,Ãph.Ã@)ÃP -Ãð”1ÃÐ'ö2Ãp€*Ã`2ðu1ÃÐá,à 1ð()ÃP,+Ã0Ì-àH2ðæ3Ø3ÃÈ/Ãàm1À§*Ã0Æ.ÃÎ.Ã@”(Ãà¯&Ã071à¿3à 1ÃP&,Ã-Ãã1ÃÐÉ0Ã`k'Ãà+ð/ÃÐ(6ÃE,Ã`)2àï+ÃQ*Ã`²0ê0ÃÚ,ðø0Ãð0Ã@Ã5Ã0Æ.ð/Ã`4Ã0C/àB3ö.Ãæ*Ãàs0Ã&à .,àã-à “0ÃpÙ0Ã`š4Ãð;+Ä,Ã@É4ÃZ3Ã0=0ÃZ3ê0ÃÐ^-ð,Ãl0Àâ5àÑ0Ãï/Ã0®2Ãñ9Ã@d0ÃÐó)ÃPy3ÃÀ+/Ã0%4à “0Ã@p.ÃÎ*Ãpß/ð™+ÃÀé9ÃPð4Ãàä2Ã0Ø+Ãð2àÝ.ÃÂ0Ã0U,ÃÐÛ-Àè4àZ/Ã?-ÃÐR/ðK8à<4à ½)ÃP2Ãpn-ÃpÇ3Ãf1Ã@L4ÃÐ.5à³5Ãã1à¿3ðþ/ÃÐ¥6Ãàê1àN1ÃðŽ2Ã`Ê,Ã@Ï3ð .Ãà-Ãæ*àf-ÃàÞ3Ãð¾*à «,Ã],Ã0œ5ÃPö3Ã@Û1Ã0+3ÃP/Ã`²0ÃÝ2Ã`;/à 2ðu1ÃPm5ðì2Ã@á0ÃÐ:3à§7ÃpD4Ã@L4Ãð4Ãð²,àË1ÃPy3à ™/ÃÐ:3Ã@Õ2ðQ7À}1Ã0¨3ÃPy3Àe5ÃP2Ã`¬1ö.ðþ/Ãз3ÃðŽ2ÃPö3Ã'5Ã07Ã@ç/Ã0Æ.à Q;Ãð«BÃp:ÃP®?àB3À /Ã@Ã5àÅ2ÃàØ4Ãàg2ÃàÌ6ÃpÁ4Ã071ÃP—.à65ÃPs4Ã@F5Þ2Ã012Ãp©8Ã@<à ø4ÃPö3Ãpb/Ã0+3Æ6à 6à$8ÃpV1Ãð/-Ãl0Ã0Ø+Ã3ðo2Ã92Ã69ðÔ6Ã0´1Ã3Ã0¢4Àe5Ã0I.Ã05ÃàÀ8Ãp»5Ã0Š8Ã@«9ÃÀœ1ÃÐ9Ã@Ï3ö2à*7ÃÀ´-à ‡2Ã`2ðæ3Ã@^1ÃPs4ð]5à¿3à 1ðu1Ã`¬1ÃÑ4Ã@ç/Ã@½6ÃPs4Ãr/ü-à i7àH2ÃÀ2àB3ÃÀ`;Ø7Ã`)2à 3ÃЙ8ÃÀï8ÃàC8Ãð 3Ã’4Àƒ0ÃÀ3Ãõ.ÃZ3Ãpb/Ã`²0ÃP…1à .,À-àã-Ãðš0Ã@Û1Ø3à à8Ãï/Ã`M,À0Ã`¬1Ã0=0ðc4Ã`S+àN1Ã-0Ãp\0àZ/Ãpz+ÃPa7Ã@Ã5àÑ0Ãn:ÃË5ÃÂ0à ò5Ãð1ÃP…1À}1Ã9.À0Ã`¸/Ã@Õ2Ãð¬-Ã0+3ð/Ã@L4Ã@p.ÃÐÉ0ÃpÍ2ÃÀ=,ÃÀ1Ãб4ÃN5Ãð0ðc4Ãp\0à 3ä5ÃÀ3ÃP‹0Ã@½6ÃÐÏ/Ã` 3Ã@Û1ð‡.àÑ0Ã` 7Ã'5Ã`4Ã`Ê,Ã071Àú1àT0ÃÐÉ0Ã` 3Àô2à {4ÃÀœ1ÃÂ0Ãð¦.ÃàØ4ðò1ÃW)Ã0º0Ã0¨3ÃP-à×/Àw2ÃÑ4ðò1Ã0Æ.Ã`A.Ãàê1Ãf1ÃÀ5à ™/Ãr/àÅ2Ãàä2ÃP2À0ÃÀ¨/Ã@í.Ãà.ÃÐ:3Ãð¬-ÃÀœ1À0À‰/Ãà‹,Ãð4à ±+Ã0®2Ãàü.À0àr+Ãr/Ãðù5Ã`š4Ã0®2ð/Ãà[4àã-Ãày/àã-ÃÐ:3ÃpÓ1ðò1à ‡2Ã071ÃÀ['Ã@ç/Ãð4Ãàs0Ãð¬-ÃÀ7-Þ2Ä,à 1À.Ã0Ò,Ãph.À$+à³5ÃÀ¨/Ã`#3Ã0´1ÃÀ–2Ãé0Ã0O-ðæ3Ãð²,Ã@@6à þ3ü-ÃP8)Ã@R3à06ÃP1àÑ0Ã],ÃÈ/À_6Ã`¬1Ã92ðÚ5Ã,àl,Ã`#3Ãàm1Ã@É4Ø3Ã`Ä-Ã@ˆ*ÃÀÀ+à<4Ã@‚+À6(Ã9.Ãб4ÃpÙ0ÃP0Ã'1Ã@X2ÃZ3Àq3Ã!2ÀG:Ã5ð‡.Ã0À/Ã0º0ÃÀÀ+ÃÀ–2à 3à<4à i7ð{0Ã`#3Ãàg2Ãàü.Ã!2à„(ÃÀ%0ÃpJ3Ã`4Ãð1Ãð0Ã0C/ÃP2ÃP0Ã`š4ÃÀÀ+ð+Ã`4ÃpÁ4ÃPÞ7ê4ÃÑ4ÃpÁ4Ã`4Ã0¨3ÃÀ1Ã9.Ã0¨3Ã`¾.À6(Ãð¬-ðø0à¹4Ã@Ï3Ã0+3ÃÀ2à­6Ãð”1àã-à “0à Ÿ.ÃÀ¢0Ãpn-Ã`¦2Ã@R3ÃB7ÃpJ3à 1Ã`²0Ãpë-Ãðˆ3ÃÐá,Ãð¬-ê0Ã0U,ÃpP2À.Ã`|9Ãð2ÃÈ/Ã`¬1Ã`Ä-Ã@ç/ðo2ð“,Ã`¾.Ã@d0Àw2Àƒ0Ã?1ö.Ã@ù,Ãð2Ã012Ã`4Ãph.ðo2à 0Ãpz+ÃÀ1.ÃPð4ðæ3ê0ÃÀl9ÃPð4à›9Ãpt,ÃË5à Ÿ.Ãpß/Ã`¾.ö2À$+Ã`2à /ðì2ÃÑ4Ã@(:à›9Ã07à c8Ã`8ÀA;Ã@ ?Ã`6í:Ãp :Ã`^>ð!?ÃðX;Ãå;à È<à Î;Ãë>á<Ã×3Ã0õ;ÃÀé9àÜCÃ@ ?Ãà¨<Ã2DðDó9Ã@{AÃPº=ð?:ÃÐu>ÃðF>à Â=Ãë:ÃJ@Û=ÃðÃ>ÃÀÅ?Ã`X?Ã@<ÀCà E=ðª=Ã`v:ÃJ@Ãß@à}>ÃP´>ÃðÃ>ÃAÃ`4EÃÁAÃ@æDÃP?Ãpy@Ãpü?Ã@>ÃP–CÃà%=ÃAðŒBÃà>ÃP1?ÃV>ð!?Ãt9ÃÐ{=Ã=Ã@>Ã0HCÃ`p;à ¶?àYDÃàlFðª=ÃÀÅ?Ãð·@Ãp?Ã0Z@à;Ãp<ÃP%AÃðÉ=Ã@oCÀBÃà¨<à 3@à Â=ÃDEÃß<ÃÐWCà <à Ú9Ã0Z@à 9?ÀšAÃ`á=Ã?Ã>BÃPC<ÃÀZ<ÃPC<ÃÀÑ=à‰<à•:ÃÀÑ=Ã@cEÃÀT=Ã0r<Ãà?ÃÓBÃàº9àô?Ã`Ï@Ã`p;àƒ=ð-=Ã@@ÃðÕ;à}>À¬>ÃpêBà ?>ÀÊ9ÃÀõ7Ã69Ãà?Ãp»5à W:Ã*;ÃðX;Ãà>ÃÐ]BÀŽCÃ`^>Ã`p;à•:ÃÐ{=à È<Ãà¨<Ãp;ÃÐø=Ã@";Ã0x;ÃÀŠ4Ã@·7À;Ãàº9ÀM9ÃÐ<ÃPÆ;Ãð:@ÃPº=ðÂ9ÃÇ@Ã0x;ÃàûCÃ@<ÃÀf:Ãå?Ã`(GÃ`8Ãà=9Ã@“=Àâ5ÃH6ð'>Ãp=à›9ÃÓ>ÿ7Ã÷<ÃPÀ<Ãð4AÃ`ÿ8Ãb<Ãp:Ãà–?ð°<Àq3Ã0Š8Ãðç8à•:Ãð@?à <Ãë:ÀÊ9à;Ãб4Ãp86ÃpJ3Ãp=ç;Ã\AÃà–?ÃЇ;Ã@·7Àk4ÃГ9Ãà1;ðBÃÀÃð½?ÃV>ÿ7ÃP2à­6Ã@48ÃÀ6ÃÀl9Ã09ÃЙ8ÃË5Ãt=À¾;Ãp:ÃÀ–2à*7Ã@É4Ãðj8ÃÐ9Ãð^:Ã<8ÃŒ9à ]9ÃЫ5Þ6Æ6Ãðÿ4Ãp»5ÃÀ„5Ã4Ãý7Ã@48ðÔ6Ã@d0Ã`/1ÃpV1Ã`6à›9ÀÖ7ä5ÀÐ8Ãp=Ã@";à=À”BÃÐ<à æ7Ãðá9ÃÐ(6ÃÐÏ/Ãp»5Ãðv6à ì6ðì2Ãðp7ÃPO:Ãð^:í:ÃàI7ÃPö3Ã`/1Ã`ˆ7à K<ÃðR<Ã09à ø4ÀG:Ã@·7Ã`Ž6ÃpV1Ãý;Ãðÿ4ÃpD4Ãp :ÃÀ5à ‡2ÃË5Ã` 7à$8à 6Ã@X2Ã3à 1Ãã1ÃÀ3Ã×3Ã@(:Ã`ù9ðø0ÃP/Ã`A.ÃŒ5ÃPa7ÃàO6ÃÐ(6ÃЙ8ÃÀ 4À¸<ü1Ã’4Ã071ÃP -Ã-Ã@R3Ã@X2Ã05ÃPm5Ãàm1Ãð0ÃN5ÃÀã:ði3Ãp(ÃpD4à•:ö2Ãã1ü1Ã@á0à ‡2Ãà+à 6Àq3À}1Ãð4ÃË5ÃPö3Ã`Ž6à æ7ÃpD4ÀÜ6ðE9ê4ÃðŽ2ÃÐ.5ðæ3Àô2ê0ÃpÙ0ÃE0Ãày/Ã`5àH2Àƒ0ê0Ã0–6Ã’8Ãõ.Ãl0Ã0œ5À/>ÃPê5ÃÀ®.ÃÑ4Ã`¦2à 2Ã@½6ÃPU9Ã7Ãt=ÃЫ5Ã0–6ÃàC8ð™+ð3Ã`š4à ‡2Ãp¯7Ã012à65à 1Ãàê1ÃП7ðc4ÃÀl9Ãp»5Ã`p;Ã0¨3Ã0º0Ã@Ã5ÃÑ4ÃÀ¨/Ãðd9Ã0®2ÃÀ–2ÃÐF1Ã`¦2Ã07Ãð‚4ÃpÍ2Ãðv6Ã07Ã4Ãp»5ð3<à¹4à ø4ð3à °@À;<Ãp,8ðþ/ÃT4Ãàs0ÃŒ5Ã`6Ãðˆ3ÀG:à ì6Ã`#3ÃÀ1Ãð‚4ÃÀr8Ã`j<Ã0Š8ÃП7ÃðÛ:ÀÖ7ÃÅ6ÃP2ÃàI7Ã`¦2ÃÓ>Ã0 8ÀS8ÃðÕ;à W:Ãb<Ãðç8Ã`p;ð¶;Ã0Z@ð¼:Ã`|9ÃPC<Ã*;ä5Ã@=Ãå;ÃÐi@à -AÃ>á<ÃP[8ÀÊ9ÃГ9à æ7ÀÊ9ÃÐ8Ãp=Ã`d=àèAÀ;À;ÃÀN>Ã@<Ãàº9Ãp£9Ã`X?À5=ÃðÕ;Ã`ç<ÃÐ9à ?>ÃÐì?à ¼>Ãð@?ÃpsAÃÀ³BÃ0r<ð@Ãpy@Ã@(:ÃÐ:Ã0¢4àƒ=ÃÀï8à¡8ÃÐ8Ãàº9Ã@É4ÃÀõ7ÃÀ­Cà È<ÃÐ(6ÿ7ÃÀï8à‰<ÃPÆ;ÃÀã:Ãh?Ãà1;à Ú9Ãðd9Ã0„9à 9?Ãðç8Ã06Æ6ÃPI;Ã@Ÿ;Ã0~:Ãz8Ãn:à>ÃàÀ8ó9à c8ð¶;Ãh?Ã@(:Ã071Ã05ð9;ÃPÆ;Ã\=ÃÐ8Ã;ÃàÌ6Ã09Ãàº9ÃÐ"7ÃÀÑ=ÃàC8à <ù8Ã@@ÃÀã:ÃðÕ;Ãñ9ÃPa7Ã0–6ÃàØ4Ã@½6Ã`í;ÃÐ<Ã@<Ãðÿ4à ø4ÃðX;Ãà®;ÃðX;ÃÐ(6ù8ÃàÌ6Ãz8ð?:Ã@@6ÃÐ44ÃV>Ã012Ãpt,ÃÑ4à 9?Ãà+<Ã’4ÀY7Ã`ç<Ãß<Ã`‚8Ã`ˆ7ÃÐ:ç;à {4Ã0¢4Ã69ÃÐ:Ã@·7ÃÐá,Ãz8à W:ð3Ãz8à c8Ãðí7ÃPm5ÃT4ðW6ð9;à 1Ã7ÿ7ÃÐ.5à¿3ÀA;À¾;ä5Ãp,8ç;Àô2ÃP0àN1ê0Ãðç8Ã-4ÃÀ2Ã’4Ãð2Ãà7:Ãð”1ÃàÌ6Ãpµ6àé,à65Ãà[4à`.Ãà=9à ‡2ÃPê5Ãз3Ã`#3ÃPa7ö2á<ÃÐ:ðc4ÃK/Ã4ÃpÁ4ÃÐ9à ¶?Ãp£9Àq3ÃГ9ði3à¹4à ò5Ã!6Ã-4Ã5Ãз3ÃÀ®.Ã0O-ÃÐ:3ð/à 0Ã0¢4ðK8ÃÀx7Ã@48Ãï/Ã92Ãz8Ã`¬1ð .Ãpå.ê0ÃÀ–2Ã@^1ÃÐ8Ã0¢4Ã@Ã5ÃðŽ2Ãà-Ãp>5ÃÂ0ÃpJ3ÃÐ(6Ãph.ÀA;ÃÀŠ4Àú1à65Ã0º0ÃP[8à;Ãày/Ã0º0à u5à~)ÃÀ´-ÃàO6ÃP/ÃP©+Ã@p.Ã0Ì-àõ*ÃÔ-À0ÃP-Ã0U,Ã0%4Ã'1ðì2ÃÐÉ0à¿3ðÚ5Ã`2ÃÀ3ÃÀœ1Ãr/Ã07à 3Ãp,8Ã’4Ãð”1àf-Àe5Ãàa3à Ÿ.ÃP…1Àú1ðò1Ãð /à*7ÃÀœ1Ãàg2ÀÐ8Àî3Ã@ÿ+à 1ðà4ðæ3ÃÐL0Ãày/àË1Ãðš0ÀM9àÅ2Ã0C/àT0à Ÿ.Ãð¾*ÃŒ5Ã’4ÃðL=ÃPm5ÃPs4ÃP‘/ÃP1ÃàÌ6Ãн2Ãàg2Ãp>5ðì2àÅ2àN1Ãðù5ÃÐÉ0Ãð 3ð .ÃW-Ã09ä5Ã@d0ê0ðø0Ã0º0àl,ð‡.ð‡.Ãз3à 1Ã3ÃH6ÃÐ"7Ã`)2À_6ÃP…1Ãð 3Ã@48Àe5ÃP.Ã` 7Ã`2ÃÀ¨/ÃÀä%àN1Ã@.9ÃÐd,Ãðj8À_6Ãð¦.ÃÀ¢0ÃZ3Æ6Ã0®2ðÚ5Ã?1Ã0´1ȸ Ãøo°Ãˆ‚©Ã0ê¨Ã‡¥Ãx…¢ÃàV ÃØžÃ8„Ãö™ÃØ(šÃ8 œÃø|™Ã0J™Ãˆ’Ã0n“ÃP-–ÃHd”ÃØíŽÃ8̑Èð)”ÃЉ‘ÃhYŽÃÐ ‘ÃØvÔŽÃ qŒÃX8ÃHš‹ÃX\‡Ã¨ŒÃ@ËŠÃhô‰Ã`=…Ã5…ÃX\‡Ã ›…ÃH/ˆÃàu†ÃèÓ„Ãè>ˆÃH¬ˆÃ¸dƒÃ°ú†ÃزƒÃXz‚àz€ÃØ¾ÃøƒÃP.ÃxÎÃØ;‚Ãà‚Ã`ÌÃp{Ã(€ÃeÃP(‚Ã@€ÃHYÃ’}à <}Ã@®wð*|ÃpšyÃPÕwÃPFzà ZxÃÀ?Ã@´vÃðsà'vÃàÏtÃ@¨xÃPáuÃððuÃ0c}Ã`wÃ3xà xÃsÃzÃà@wÃvÃP‚pÃ0.qÃ@=uÃà|mÃàónÃølÃPvrÃølà +kàøhÃÐÞkà ´iÃÀ:kÀoà rà 1jÃ@jàojà –nÃZkÃ0ùdÃàjÃPšlÃÀXfà =hÃãeðºdÃÀXfàuiÃà²dà fýaÃЯ^Ãõbà ê`Ã@J^ÃgÃldà UdÃp0aÃ@D_Ã`zcÃp0aà ö^Ã`3Zà \Ã0š_ÃPYÃ0_ÃÀ ZÃp³`Ãð!YÃ`à äaÃàe\Ã`^Ãð÷_Ã`!]ÃУ`Ã0#^ÃPô]Ã`Ã0aà¥aÀò\ÃÐÇZÃÀ ^ÃPâ`Àà_Ã^ÃÀ#Zà ,VÃÏ^Ã0wPÃp–PÀ™VðVÃ@nXÃ=WÃóXÃÐJZà ,VÃ%[Ã0¾YÃà¡RÃ0úOð£SÃÒWÃ0MWÃP¹RÃðKRð£SÃ0èRÃÀGTÃP¹Rà \Nà —YÃêSÃà}XÃpãXðs[ÃÐÍYÚRàíUàQÃàUÃ@ýUà PPÃÞUðTÃ@†Tà »SÃ@†Tð…XÃðŒ\Ã`ÎUÀ(TÃð¼TÃðWPÃÐzRÃ`]SÃpSæPÃüPÀÃOÃð9UÃ0 MÀFOÃPÑNðÁNÀ(TÃ0 MÃ@ŒSÃPÝLÃ`WTÃÀ_Pà ÍPÃÀSRÃ`øNÃðNÃpQà PPÀ@PÃÀôLÃðÈRÃÀqMà ¯UÀVÃà§QÀ±Rà Gà ©VÃjZÃ`¼XÀ(TÃ`Mà ,VÃÐQÀŸUÃPYÃpTÃaUÀVð8PÀ.SÃóXÃÐbVÃàUÃSÀ‡YàˆQÃ0ÐVÃP0TÃ`9YÃð!YÃCVÃPÅPàˆQÃðÈRÃÐÙWÀ{[Ã1YÃ`ÂWÃÐVXÃàwYàvTÃÐhUÃpõUÃäTÃÐJZà:^ÃÆYÃá[ÃÐbVð TÃpYÃOXÃP*UàpUÃUSÃÐëTÃpQÃX]ðöZàÕYÀi^ÃUSà ‹[Ãð°VÃð?TÀ"UÀu\ÃP³SÃPYð©RÃplWÃ0`Ã^Ãd[Ãà Và ü]ÀWÃpÝYÀŸUÃðÈRÃÐñSÃ`9YÃ0;ZÃ0ÐVÃ0SVÃà}XÂVÃpÝYð‹Wà \ðyZÃÀSRÃ0_TÃà VÃÐzRÃÌXÃÀ\Ã0²[Ã`ÎUÃP•XÃTÃÀš[ÃÀ ZÃêSÃ0kRÃÐýQÃpãXà ‹[Ã0MWÃÌXÃP[ÃàÜ]Ãð¤XÃð˜ZÃ0GXð8PÃðKRÃÿVÃ`þMÃðWPÃÀAUÃ0ÊWàÕYÃÐzRÃpéWÃ[VÃ@ñWÃл\Ãàè[ÃpSÃP‰ZÃ`ìPÃ0âSÃÐPYð‹WúWÃÀGTÃ=[ÃCVÃp„SîYÃÐÓXÃð'Xð…XÃ0îQÃPWÃÀŽ]à ]Ã@ëXÃÿVÃð\ð‹Wà ‹[ÃpTðYÃmSÃ0ÜTÃP›WÃP ZÃpfXÃ`WTà ÁRð&SÃpéWÃpéWÃÀ¾UÃ0;ZÚRÃ`ÂWÃpõUÀþZðs[Ãàk[ÃP¹Rà 8TàóTÃàúXÃÐVXÃ@zVÃà›SÃVÃRÃP›WÃ`àRÃÐ÷RÃЀQÃp„Sð©RÃPw]ÃCZÃÀÜPÃÐ’NÃKÃàÝHÃP§UÃPYÃÐ Pà ÍPÃà}XàÏZÃð°VàQÃPÃÀîMòNæPÀ·QÃð9UÃP¡VÃ0AYÃÒWÃÒSà 2UÃàHLà ÓOÃ`WTÃyMà µTà‚RÃÐtSÃp%NÃàÃ0NBàÜCÃLÃðGà¾HÃpaDÃ`:DÃPéJÃÀJðzEÃ@QHÃP–CÃ@WGÃðEÃÀ6BÃ`(GÃàÝHà GÃÐi@ðhHÃÀÑ=Ã@àEð÷EÃ`@CÀ”Bà †GÃ0`?ÃÐKEÃKÃ@]FÃPœBÃ2DÃâFÃpaDÃ@@ÀšAàÖDÃ0LÃP~Gð\JÃGKð’AÃDAÃ>BÃ0Z@ÃÐKEÃÐi@à zIÃÀ¹AÃGÃð¥CÃJ@ÃPïIÃâFÃà AÃÐWCàô?Ã0*HÃ@]FÃp[EãFÃð«BÃàïEÃ`¥GÃ0­GÃÐ]BÃðIÃ0­GõCà;IÃФKÃ8GàÄGÃ@oCÃJDÃb<à ¼>ÃàxDÃ0BDÃ`¥GàeBðVKÀÿEÃð HÃ0§HÃ0­Gð†CûBÃÐàAÃ0*HÃ@{AðýDéEÃÐcAÃÐu>Ã0§HÃ0BDÃ\Að˜@ÃÀÑ=ÃîDÃÀ$EÃàrEÀŽCÃà–?Ã@@ÃÀ­CÃqDÃAÃð‡HÃÐi@É@ÃqDÃÇ@Ãp[EÃ`4EÃ`Õ?ÃЪJÃDAÃ0BDÃÐQDÀ”BÃð{JÃð“FÃ0Ý?Ã`Ï@À”BÀ”BÃPC<àq@ÃÐÎDÃ@ìCÃÐÂFðDÃàõDÃà AÃh?ÃÀ¿@ÃðEÃ8CÃpêBÃV>ð÷EÃ`@CÃV>ð¼:ÃP¢AÃÁAÃÀHÃÀHÃ0³FÃð¥CÃP%AÃ0NBÃpgCÃÊJÃ`½CÃ`:Dð˜@ÃÐ9HÃÐÚBÃÐÈEà GéIÃ0Ý?Ã@ÚFÀ DÃpy@ÃðŸDà;ÃðŸDÃ0HCÃðGàú>Ãz<ÃpgCÃÐo?ÃÐ9HÉ@ÃP¢AÃÐ{=Ã@ ?Ãà?ÃP¨@Ã`Ï@ÃàûCðBÃð^:ðª=àèAÃPC<ÃÀ³BÃPDÃpgCÃàC8à;Ã`Õ?Ã`@CÃÐì?ÃÀT=àî@ðAÃÐcAÃð4AÃÀZ<àî@ûFÃ0NBÃÐWCÃð‡HÃÍ?Ãñ=ÃP%AÃÀÀ/>ÃP¢AÃÙAðŒBÃAÃð"DÃMJð˜@àÜCà 9?ÃÀ­CÃpgCÃ`ÃBà ¶?Ã@>ð†CÃ0³FÃÐu>ÃðŸDÃDAÃðL=ÃÐ:ð!?ÃÀ¿@À²=ÃÀË>à Â=ÃPBÉ@à²JÃ@ÎHÃ0JÃàûCàèAÃ@";ÃÍ?Ãà@ðDÃЇ;À¬>Ã`@CÃ?Ã`4EÃ`ÉAà 9?Ã0ã>Ã0û:À²=à :Ã@{AÃà„BÃ9Ã0û:Ãp>ÃÓ>ðAÀS8Ãà@Ãà@ÃÐ{=ÃðF>Ã`p;ÃÐæ@ÃpäCÃDAÃÐ¥6À7Ã!6ÃðÛ:ÃàŠAÃГ9ÃPÒ9ÃàØ4Ã@·7Ãà¢=à ?>ÃP7>ÃPÀ<ÃÀ–2€T£Á<ðÁÜÿÁ€ú1€Ð8Â@·7Â@>Ân>€bt•vÂàò†Â_Â@¢y€ҎÂÀ'†Â@BŒÂ`¨ˆÂ ¯ŒÂ ùŸÂ …“Â`­œÂÀIªÂ ¨Â L§Â€ržÂà&¨ÂÀ³Â H²ÂÀé¹Âàä²Â é¬Â r«Â@@¶Â€âµÂ@L´Â uµÂàà¸ÉÂ@EÊ )ÌÂàÅÌÂå¿Â`"ÈÂ@æÄ€4ÒÂ`.ÆÂÀeÏ€·ÑÂ`àÒÂ`òÏÂ`oР\ΠüÝÂ`3ÚÂà}ØÂ "âÂÀâÏÂàîÚ€ØÂ€ÂäÂ@ëØÂÀváÂàÄá "â uéÂÀ“ñÂ`ô ´éÂÀ±ìÂà½÷ÂBïÂà±ùÂðºÀ&þÂ`múÂPŸÃà±ù€åóÂÀEþÂ`‘ôÂ@„þÂpóÀ£þ ÃèàtþÂÜÿÂ`ÌÃ;ÃpF ÃYæÃp@ Ã@H àD Àð Ã`+ÃÀ¶ðY ÃÐNÃÐÝÃ;ÀöÃ# ÃùÃ0ŒÃð Ãðû Ã0ŒÃpÃðËÃ@$ÃPQÃ0€ð/àüÃÀ ÃÀåÔÃPWÃð¹à&Ã`ûà ¸Ã0ŒÃ@•ÀÃÀ¯Ãð³Ãà à‹ÃÀ÷ Ã0bÃÛÃÃ^ÃP!ÃÀ… àgÃ`ÑÃÀ&Ã`6à[Ã0bðùÃÐYÃðNÃP’Ã`¹ÃP'Ã°Û ÃàÃpòÃÞà v Ã@îà ¦Ã`0Ã@ÖÃpàÃ0ÍÃÞÃÏÃ@_÷ÃðÃ`<ðíÃ`*Ã@¬$ÀlÃPë à p!ÃÀ!ð ÃpiÃðô!à Ã`$Ã@ÜðdÃàbÃЬ ÃI!àOà šÃÀy"ÃPn à á#Ã[à v ÃK+ÃÐÿ'Ãp!%ú#À×"ÃPë à´ ÃÆ!Ã@/$ð^ ÃpKÃÀä%Ã`_)Ã0s'â'à R&ÃÀ!ÀH%ÃÀö"ÃàD#ÃPµ)Ãò$Ãðî"è&Ã-Ã`50Ã33ÃÀU(Ã`ƒ#à 'Ãà»$Ãp!%Ã0%ÃÀm$Ãp˜&Ã` "Ã( Ã0m(ðÉ#ÃÐÿ'Ã`q&à ·*Ã@ *Ãàµ%ÃÐ'àx*À§*Ãþ"ÃPÙ#Ã`Ü)Ãpñ,ÃÀ!Ãðe$Ãà—*Ãà£(ðF$Ã`w%À³(à ½)àN1Ã{'Ã0$Ã¥ Ä,Ãàö/Ã3/Ã`¸/àé,Ã+&Ãà£(Ãpz+ÃÐŽ%Ãpß/ÃPµ)Ü(Ãð¸+Ãx.Ã@v-ÃÔ)ÃðY&Ã@'ÃpŒ(Ã`e(À.à %ÃÐÕ.ü1ÃP¯*ÃÀº,ÃP&,ð/ð,à ·*ÃP0à ".Ãà‹,À**Ãp€*ÃE,ÃÀ['Ãàä2Ãð).à~)ÃÎ.Ãàs0Ãc+Ãõ.Ã`Ü)Ãpå.Ã@(àÅ2Ãr/à 4+Ã@+Ã0Þ*Ãp(Ã3ÃP1Ã`¸/Ãð¬-ÃP,+ÃÀ=,Ãà.ÀÅ%ÃP2*Ãð¾*Ãð¬-Ã@ç/ð/À¡+ðþ/ÃP1Ã`A.Ã@v-Ãpý*ÃÀC+Ãà)À.ÃÐ|(ð,Ã@|,ÃÐÿ'Ã0m(Ãð¬-Ã0À/Ã0ê(àN1ÃÀÌ)ÃÂ,Ãàg2ÃÐ^-À0ð-Ã`e(ÃP£,Ã`_)ÃÀO)ÃÐj+Ã`/1Ãðˆ3Ãð²,à “0ð“,ÃÚ,ÃÀ7-ÃÎ.ð,Ã`S+Ã0Ø+ðŸ*Ãû-ð-À.Ã0=0Ã`;/Ãðÿ4àH2à 1ÃT4ÃP0ð+à u5ÃP0À‰/à ·*ÃÐ^-Ã@ó-Ã-Ãà+Ãàö/Ã0Ò,àõ*ð/Ãð).Ã@R3ð-Ã`S+Ãð).à ".Ã@v-ð±'à ½)Ãpñ,Ã`2Ã0U,Ã0À/Ãp€*ÃÐ@2àã-àf-Àè4Ãpb/à ¥-à «,à×/ð“,ð-Ãpë-Þ2ð .ü-à 1Ã0Ø+à :*ÃÀ+/Ãày/Ãé0Ãû-àH2ðø0Ãà…-àÝ.ÃÀ=,ÃB7à ‡2Ã@Õ2ÃpÁ4ÃÀõ7ÃÀ~6ÃPö3Ãà+<Ãà7:à‰<Ã0~:Ãðd9Ãå?à=í:Ã@¥:Ãñ=À5=ÃðL=ÃqDÃðÛ:ÃÀSÃÀqMÃ`àRÃöMÃðcNÃ`WTÃPOÃ0}OÀ·QÃàUøMæPÃP¿QÃà*QÃ0qQÃÐ PÃpQÃÀÐRÃpŠRÃöMÃ@¼KÃ@¤OÃðNð»OÃPZMàÿRÃà0PÃàBõCÃ@?KÀÕLÃÁEÃGÃÐWCÃHÃàõDÃAÃpÌGÃÍCÃ`.FÃSIÃ`KÃðŸDÃPõHÃ@{AàYDÃà×IÃÀ•GÃPïIÃpÆHÃDAÃ2DÃ`«Fà5Jà¾HÃPDÃß<à ëKÃ@?Kà ñJÃàÅLÃà„BðtFÃ0f>à ¶?ÃÐÎDÃ@uBÃàZIÃ0ÑAÀ¬>×HÃàïEÃàïEÃÐàAÃ@QHÃð{Jà !CÃ`™IÃð¥CÃp?Ã0$IðAà hLÃ@cEÃàïEà Ô:ÃPO:Ã0ËBÃÀÅ?ÃwCÀÿEÃ`«FÃÀÃeFÃ@oCÃ0¿DÃà=9Ã`ÃBðAàeBÃ@oCÃAÃ,EÃð™EÀ¬>ð-=à Fà ýHÃp>Ã@™<ÃV>Ã;À @ÃÐcAÃàŠAÃÐì?à ¤BÃP„FÃÐÔCà ˜DÃ`ç<Ã@oCÃÍCðž?ÃPº=à 9?ÃpðAÃ0ÅCÃHÃß@ÃP®?ð@Ãß<ÃÀ¿@ÃмGÃPCÃÀÅ?à}>ÃÐ{=ð°<à 9?Ãð«Bð?:Ãà7:ÃÐ{=àMFÃeFð!?ÃPfKÃ,EÃ`¥Gà @ÃÙ=à ªAàeBÃð.BÃt=ÃpaDÀšAÃ0ï<àÊFÃDAÃ?ÃpÞDÃJ@Ã@ìCÃ}BÃ@àEÀ @ÃV>àî@Ã0Z@ÃqDÃPŠEÃpsAÃp—;ÃðÃ>ÃðL=Ã0ËBðž?Ãð½?Ãà¢=Ãàœ>Ã\AÃp:Ãp[EÃ@Ÿ;à :à -Að’AÃ`Û>À¸<ð¶;Ã`X?ÃÀÑ=à 9?Ã>BàeBà c8ÃÇ@ÃPÀ<ÃP–CÃÀB@Ãå;Ã0:ð¼:ÃÐo?ÃP+@Ãà%=ð'>àú>ð€DÃÐi@à ¤BÃÐàAÃÀB@ÃPFÃ?ÃÀï8àkAÃ`á=Ã`FBð'>Ã@<ÀG:ÃqDÃpö@ù8ÃP´>Ãn>Ã>Ã`Õ?à Â=ÃÐò>ÃÇ@Ãn:Ã$<Ã0„9Ãp:ÃÀã:Ã`ÿ8Ã<8Ãðù5ÃP7>ÃPÒ9Ã0Z@À¸<ÃÀ0CÃÀã:à ?>Ãà@ÀA;ç;ÃÐ]BÃ0ï<Ã@uBÃ0:À)?ð?:Ã0l=ÃÙAÃp‹=Ã@>à 3@Ã`^>ÃpmBÃ69ÃÐ ;Ã*;ÃÀã:ÀM9Ã`R@ð9;Ã÷8ÃðÛ:ÃwCÃp£9Ã0¢4Ãp…>Ãb@À;<Ãp:Ãp‹=Ã0:ÃàÀ8ðE9ÃÀx7à c8ÃPê5Ãp¯7ÀÖ7Ã@>Ã`ˆ7Ãà%=Ãð:@Ã`^>Ãà+<Ãp=Ã`ù9Ãð4Ãp&9ó9Ãz<Ã07à o6ÃÐø=à;ÃðÏ<Ã@½6ÃŒ5ÃÍ?ó9à;ÃP®?ÃП7Æ6ÃÀ%0Ã`^>ÀÊ9à³5Ãð1Ã`á=ÀM9Ã@Ã5ÀÜ6Ãà®;Ã`p;ó9ÃÀZ<ÃÐþ<ð@ÃðR<Ã0l=Ãt9ÃÐ9Ã`‚8à65ÃPÒ9Ãà¨<ÃÀ0Cð@ÃÀã:Ã0 8Ãà%=ÃpmBÃp :à K<à>Ã`R@À/>ð3<ÃP==Ã@±8ÃÀõ7ÀM9ÃôCÃðÕ;Ã@>à=Ã0f>ð¤>Ã69Ãp,8Ãà=9ÃÐ¥6Ãp,8Ã`‚8à:ð°<ÃÀZ<Ã0ï<À;Ãp©8Ã@½6Ãp?ÃÀf:ð@ÃÐ9ðAðW6ÃÀ„5ÃÀ6Ã@@6Ãà7:Ã0„9Ã7ÃPO:ÀÜ6à ‡2à ø4Ãp&9Ã0û:ðÈ8ä1Ãz<Ãt=Ãà1;Ãà=9à W:ÃŒ9Ãp‘<Ã0¢4à Î;à 6Ã0:Ã07à ø4Ã`/1Ã÷8ÃT4Ã0œ5à ]9à¡8À_6Ã` 3à$8ç;à c8ÃÀT=Ãà®;À}1ÃT4Ã!2Ãðí7À;<à È<Ãpü?ÃPÞ7Ã'5Ãp;Ãý;Ã`ˆ7ö2ÃÐ<ÃPO:Àè4ÃÐ:Ãp86Ã`ÿ8Ã0õ;ð¼:ð3<à;ÃÐ8À_6à$8ÃГ9Ø3Ã@½6Æ:ÃÐ(6ÃÐ44ÃÀõ7ðK8Ø3ÃÀõ7ÃП7ÃÐþ<ÃPØ8Ãå;à$8Ã5ðK8ÃÐu>ÃÀB@Ã@48Ãð‚4à 3à¹4à c8ÃPU9ÃðX;à o6Ãp©8à*7ÃГ9Ãå;Ã@48Ãé0Ã@L4à65à³5ÃЙ8Ã×3à$8Ãðd9ðÂ9ÃàÌ6Ã0~:à06ÀG:Ã92ÃŒ5ÃN5Ãë>ÃÅ6Ãðó6Ã0Š8ÃÀl9ÃàÒ5Ã!6Ã@L4ðo2à³5Ã@É4Ã@ç/ÃÀ„5à*7ÃÐø=Ã0x;Æ:ÃÐ(6Ã0~:Ã0õ;ÀM9ÃPU9ðo2ÃðŽ2ð'>ÃpÇ3Ãß<à Q;à ¼>ÃÐu>Ã`ˆ7Ã`p;ÃT4Ãz8Ã09ÀS8ÃN5Ãz8ÀG:à9à¿3à¹4ÃP[8Ã012ä5ÃPg6à ò5à 6à 6ðì2ÃŒ9Ã<8Ã$<à¹4à ø4Ã@ ?Ã0%4ÃPs4ÃpD4à³5Ãàº9Ãã1Ã0+3ÀÊ9à ¶?ÃàÆ7à›9Ãp—;Ã05ðW6Ã@@6Ã0¨3ÃB7à9Ãðç8ÃÀã:Ãz8Ãp»5Ã@½6Ã@±8Ãpµ6Ã0„9Ãðç8àH2Ã@«9ÃÓ>àƒ=ðÔ6À¦?ÃÐ@2Ãàº9Ãz8ÃP[8ÃPö3Ã0–6Ãðù5ðÔ6Ã`ÿ8Ã0x;ó9Ãðá9Ã@=Ãà´:Ãp?ÃŒ5ÃГ9Ã@¥:Ã05Ãà[4ÃàU5ÃП7Ãp&9ÃB7ÃП7ÃÀr8à06Ãà+<Ã`8Ãðj8ÃPa7ÀÊ9ÃPØ8ÃÀr8Ãñ=ÃÀ6Ã`#3Ãàü.Ã`X?à È<À¸<ÃP1?Ã’4à ".ð/ÃÐ.5Ã0„9ÃPy3Ãp&9ÃŒ9Ã`‚8À;à*7Ã07ðÂ9ÃpP2à i7Ãp©8ÃЙ8Ã0–6Ãà=9Ã@ ?à ø4à W:Ã`ó:Ã`í;Ã@.9Ã`|9ÃÀ„5À7Ãp£9Ãpµ6Ãý7ÃÓ>Ã9Àâ5Ã@«9Ãðó6Ãð|5Ãðí7Ã0`?Ãë:à Ú9ÃÐ.5Ã0 8Ã0 8ÃPO:Ã0–6à Ú9Ãàº9ÃÀ6Ã` 7ÃPê5ð3ó9ÃÐ8Ãà´:à;í:ð¼:Ã@:7Ãðç8à§7ÃPs4Ã`5ðÚ5À_6Ãðí7ÃàU5Ã@48ÃPð4ÿ7ç;Ãß<ð¶;Ã0+3Ã×3ðÚ5Ã@48à þ3Ã÷8ÃЙ8Ãà®;ÃPO:ÃÐ ;ÀÄ:Ã0¢4Ãз3Ãðj8Àâ5Ã0:Ãàm1Ãð”1Ãðp7À7ù8Ã÷8Ãðd9à ø4Ãàg2à ™/ðà4Ã0œ5Àâ5Àâ5ÃPÌ:Ã`”5Ãð‚4À;ÃÀé9Ãð”1Ãõ.ÃpP2ÃN5ÀÐ8Ãp86ÃÀû6ÃÐ9ðÂ9ðæ3Ãà[4ÃPm5Ãz8à ø4à 6ÀS8ÃpP2ÃÀû6Ã0¨3Ã@(:Ãp‘<Ã8ÃÐ:3À›,Ø7ÃP0ÃÝ2ÃŒ5À7Ã`Ž6À}1Ãp¯7Àe5Ãp©8Æ:Ã7ÃpÍ2ÃP[8à à8ÃÐR/Ãð‚4ÀS8ÃÀû6Ã`2ðK8Ã`/1Ã`/1à i7Ã@á0ÃZ3ðc4Ãý7ÃÐ:Ãà=9à u5Ãpµ6à65Ã@R3à;ÃPü2ÃÀû6ðÚ5à³5Ãàê1ðø0Ãp&9ÃÐ@2À1Ã9à<4Ã`ˆ7Ã'5ðW6ÃÀ¢0Þ6Ã`8Ãp:ÃV>Ã@L4à¹4Ãp,8ÃÀ~6Ãàº9à þ3ðK8à;Ãз3Ã0 8Þ6Ãð|5Ãb<ÃË5ðÔ6Ã0œ5Ãp;ÃÀ~6Ã’8Ã@>à;ð€DÀ5=Ã`j<à:Ã0„9Ã@™<Ãz<ÃÀÝ;ÃÐàAÃÀË>Ã0~:Ã0`?Ãð"DÃÐàAà @Ã`FBÃë>Ãà>Ã`ÃBÃÍ?Ãp?àƒ=ÃðÉ=ÃÀH?ÃÀÑ=Ã@™<Ãà%=Ãý7Ãp>Ãñ=Ã0ÅCÃà¨<ÃÀ$EÃJ@Ãz<Ã@“=ÃðF>ð9;à zIÃP¢Að˜@Ã0ÑAÃÀx7ÃðF>à DðñFðE9Ã@¥:ÃpäCð’AðAà ¼>à žCÃð·@ÃÀ­CðDðëGÃn>ðª=Ãý;à>ÃГ9Æ:ÃÀï8Ã0é=Ãn>à;à @ÃpðAð!?Ã>BÀ¸<Ãt=ð¶;Ã?Ã@‡?Ãà@ÃP7>ðž?ÃAÃp=ÃPC<ðDÃðp7ð˜@À @ÃÁAÃ0×@Ã@ ?ÃÇ@ÃP¢AÀ¾;Ãð4AÃAÃP EÃà–?Ãp‹=Ã`R@à @Ã0ã>ÃÀÑ=Ã?À¾;ÃP%AÃ0Ý?à -AÃð«BÃÀ×<Ã`ç<Ãë>ÃÁAÃ`·Dç;ÃPº=à HÃ@cEÃðEÃÀN>à=Ã0x;ð CÃ0f>Ã@Ÿ;ÃÀFÃ@™<Ãð(CÃP–CÃPÒ9à @ÃBàq@Ãð½?Ãý;Ã`Ï@Ã=ÃDAÃàŠAÃ`v:à Â=Ãðj8Ã0l=ÃÐ{=Ãð:@ÃÁAÀ#@Ãn:ÃðÏ<Ãà%=ÃAÃp—;à @ðÈ8ÃP®?ÃÇ@Ãý;à Î;àú>àî@à;ÃPØ8Ãh?Ã@.9à‰<Ã@(:éEà ¶?Ãð4Aàî@ð¤>Ãp86Ãp;ÀÄ:Ã\=ðýDÃðL=ÃPg6à i7à;Ã\=ÃП7ÃÀï8à9ÃàU5ÃÀ5ÃÐø=Ãp&9Ãp‹=ÃÀÝ;ÃÀl9Ãý7ðª=ÃPBÃ@ ?ðAÃà@ÃPº=ÃЙ8ù8ÃðR<Ã@(:Ã`‚8Ãàº9Ãà´:à ªAà <Æ:ü1ÃГ9à:ð-=ÃðÕ;Ã0~:ÃÀ~6Ãñ9à Â=Ã@“=Àô2Ãàº9Ã`50ÃÀ2Àè4ÃÐ ;à;à 1ÃП7à ø4ÃB7ÀS8ð .ðu1ó9ÃÐ8ÃÐ.5ÀG:Ã@±8Ãp,8Ã@L4ÃàÌ6Ã0%4à¡8Ã@(:Ãp©8Ã0~:ÃB7Ã÷8ÃÀã:ÀÜ6ÃÀ5Ã`|9Ã`@Cð¼:Ã@.9Ãðó6ÃPð4Ãp27Ã'5ü1Ã@F5ðÚ5Ã0¢4ÀÄ:ÃÀx7à @ÃðÕ;ÃŒ9Ãß<ðæ3ÃàI7à*7à­6ÃÀï8Ã`v:ÀA;Àk4ÃðŽ2Ã`8Ã9Ã`X?ÃÀõ7ç;ÃPC<ÃÀx7ÃPa7ÃPI;àË1Ã@^1ÃË5Ãàa3Ã`ó:à c8ÃÐ ;Ã`6ÃЇ;ÃPs4ÃЫ5À;<Ã`^>Ãë>Ã`š4ÃH6Àe5ÃPs4ÃÐ.5ÃÀ6Ã@Ÿ;àB3Ãp,8Ãð 3ðu1ÃÀã:Ãðv6Ã<8Ø7ÃÀ`;Ã@(:à65ÃÐ"7ÃÐ ;ÃàÞ3ÃÐ ;Ã\=Ã`5à ¶?ÃÐu>Ã=ÃÐ<Ãý7Ã`Ž6Ãðv6Ãðÿ4ÃÀï8Ã0û:ÃÀé9Ãðˆ3Ãðv6Ã?1ÃQ.Ãðó6Ã`í;ÃŒ5à i7ÃÀ„5ÃË5ÃPØ8Ãðp7à Â=Ã7Ãðá9Ã@Û1À$+ÃÐ@2ÃÀã:Ã0 8Ãà7:ÃPØ8ð3<Ãp:ð?:Ã=Ãà@Ãà@ÃÀé9Ãб4àZ/Ãß<ÃÀõ7ÃÀ~6ÃPO:ÃàÀ8ðÂ9ð?:ðÂ9Ãp>Ã`j<ÃPÞ7Ã0„9Ã;ð]5Àq3Ãðó6À1ÀS8Ã07Àè4ÃÀx7Ã\=Ã0 8ð¼:à;ÃB7ÀÜ6ÃÀl9ÃÝ2Ãàg2Ã`d=ÃðR<Ã!6ÀY7ÃàÀ8Ãñ9ÃàO6ÃPÌ:Ãðd9Ã@:7ÃZ3Æ6É@ÃÀé9ÃÀT=Ã@½6Ã`š4Ã07ÃÐL0à65Ãðv6Ã@:7Ã`Ž6Ã`5Ãð|5ÃP1ÃPm5à à8à æ7ÃÀÝ;Ãз3Ã0„9ÃPÌ:Ã0O-Ãð 3ÃÀ~6Ã`ˆ7Ã0x;ÀÐ8Ã;Ø3Ã`|9ÃàÌ6ÃÀ×<ÀM9ð?:à o6Ã`¬1ÃÐ¥6ÃP[8Ã0 8Ã05Ãðù5Ã0:Ãà7:à ì6Ãp&9Ãp86ðÂ9ÃàC8Ãðv6Ãà[4ÃàC8Ã`š4à ì6à o6à :ÃPÞ7Ã`8àw?ÃÐ:Ãðù5Ãðd9Ã’8ç;Ã4à³5ÃpÁ4àB3ÃàI7ÃÅ6Ã`í;ÃЫ5Ã@48ÃPê5Àk4Ãðí7Ã@(:à65ÃÀŠ4Ãày/ÃpJ3ÃЫ5Ã09ÃPg6ÃPa7ÀÄ:Ãp :ÀÄ:ðQ7Ã!6Ãà?Ã5ç;ÃPg6ÃÀf:ÃB7à;Æ:Ã@·7ÃÀ„5Àq3ðc4Ã07Ã@á0Ã`ˆ7Ãðÿ4Ãà´:Ø7Ãý7ÃÐ"7à æ7ÃÀõ7ö2à æ7Ã@“=Ãà¨<Ã0¢4Ã` 7ÃpD4Ã33ÃN5À¬>ÃàÆ7ÃÅ6Ã@(:à65í:ÃP2à9ÃÐ(6Ãðù5ÃÀ~6ÃÐ¥6ÃÅ6à 6ðÚ5Ãðí7ðø0Ãàð0à “0ÃW-à ì6À7ÃÐ.5ðÂ9ÃN5Ãð4à¡8ÃàÒ5ÃÐ(6ÃÀ2Ãðp7ÃЙ8ä5ÃÀõ7à Q;Ã5Àè4Ã@ç/Ã4Ã'5ÃpÇ3Ã`Ž6ÃÀ%0Þ2à*7ù8Ã@ó-Ãé0àH2ÃÀf:Ã`p;À}1ÃŒ5ÃÀr8Ãt9ÃÀŠ4Ãз3ÃË5Ãp¯7Ã`#3ÃàÒ5ÃÐ8Ãà1;à °@Ã@@Ã@·7ÃÐ:3Ãé0Ã?-ÃàI7ÃPö3Ãàü.Ãн2Ãã1à Ã(ÃP2ÃPg6ä5Ã`ˆ7Àâ5Ãàm1ÃŒ9Ã9ÃÐF1Ãl0Ã0–6ÃÀ„5ÃPg6Ã!6Ãàä2Ã@Û1Àô2ð{0Ãph.ÃpÍ2Ã0:Ã92ÃpÙ0àN1ÃH6à 1ÃÀû6ÃÐ@2Ã'5ÃÐ44Ãð0Ã7Ã@R3Ã`¬1Ãpß/àÑ0Ãб4ÀÐ8ÃÀl9ÃP2Ã`6ÃàØ4ÃË5àZ/Ãб4Ãðˆ3à “0Ã0Ì-Ãày/Ãàö/Ã33Ã`¦2Ãàê1Ã`#3Ã`²0Ãàg2ÃàC8Ã-0à¿3Ãà[4àN1Ã0m(ÃÐ@2Ã`8Ãà‹,ÃÑ4Ã`G-ÃÀ¨/à65ÃÐÏ/ÃE0Ã`50ÃÀû6Ã`Ž6ÃpJ3À7Ã`‚8à W:Ã4À•-Ã@·7ÃÀ1ÃPm5Àè4Ã0%4ÃÀï8ÃP-Àk4ÃP‹0Ã?-Ã@|,ÃP/Ã`4ÃPä6Ã@É4Ã0:Ã~-ÃQ.à9Ãpß/ÃP—.Àw2ÃŒ5Ãðÿ4ÃÐ(6ð/ÃÐÛ-à “0ÃpÓ1Ãð‚4ÃPö3Ã0%4Ã` 3Ã012à06ÃP-ö.Àq3ÃП7Àƒ0Ãp27à 0ÃPO:Ã07à ø4ÃÐ^-ÃÀ3Ã`;/Ã'5ÃàÀ8Ã0%4Ã!2à³5Ãð1ü1ÃW-Ã0+3Ã@ *Ãõ.à 3Þ2Ãð).àé,àB3Ãz8À}1ÃÔ-ÃPä6Ã0%4àT0Ã0=0ÃP-Ã@:7ÀM9ÃÝ2Ã0´1à /Ã@Ÿ;ÃPä6ðÂ9Ã@í.Ã012À.à ‡2Ã0´1ðc4àH2ð]5à×/àÅ2ÃN5à 0ÃP…1ÃP©+ÃÀI*Ã0%4Ø3ÃpP2À_6Ãð 3Ãph.Ã?1Ã’4ÃpV1ÃpÁ4ÃÐ:3ðì2à ™/ðŸ*Ãp>5Ã@Û1Ã0´1Ãðp7Ã@@6ðW6à­6ð/àÑ0ÃÐX.Ã@ç/ó9à 2Ãðš0à þ3Æ6ÃÐF1ÃàÞ3ð“,ÃÀ„5ðò1Ã`;/Ã@j/à 1ÃN5à 2ä1À7ÃÝ2à 0Ã@Õ2Ã<8Ã'1ÃÀI*à 4+ÃpÓ1ÃàI7Ã@^1Ã0´1ÃpV1À0ÃpÓ1ÃÀ3ðì2ÃPü2Ãã1Àw2Ã`8Ã!6àH2ÃÐ:3Ã` 3ÃÀ~6ÃÐ¥6Ã@á0ÃÐR/à 3Ã@í.Ã0œ5ÃÐÕ.à o6ÃN5à¿3àf-Ãð”1ð˜@Ãð½?Ã0¢4à 6ÃЙ8Ãð/-àÑ0Ã`Ž6Ãà.ÃpD4Ã'1Ãp\0Ãð2àH2ÃPs4Ã0+3ÃPg6Ã@L4ÃÂ0Ã@:7Ãðá9Ãðˆ3Ã4Àâ5ÃÈ+Ã0À/Ãз3ä1Ã’4Ã@d0ê0ÃàI7Ã`50ÃÈ/Ã-ÃpJ3ÃÀŠ4ÃPy3ÃP0ÃÀ5ÃàÆ7à¹4Ãðÿ4ÃÀ~6Ã@p.Ã`M,ÃÐ(6ÃN5Ãpn-ÃE0ÃP1Ã07àN1Æ6À›,Ãðˆ3Àe5ÃPÌ:à³5Ã@Õ2Ãàê1à 0Ãf1Ã`/1ÃpÍ2Ã×3ÃpP2ÃÀ 4Ã@j/Ã`M,àN1ÀM9ðK8Ã0¨3Ãï/Ãà[4Ãàü.ÃP -Ã`¾.ÃÀ=,àf-ÃÀ%0Ã@R3ÃP2à*7ÃT4Ã0¨3Ã`5à 1Ã0O-Ã@p.Ã@É4àH2ÃP>(Ã0º0ð3Àw2Ãà.Ã3/Ã0Ì-Àw2ð™+ÃÀ6ÃÚ,Ã0œ5ÃZ3à³5Ã@.9ÀY7ÃP/ÃÚ,Ãð).Ã0%4Ãr/Ã@R3à 1Ãl0ÃàÒ5À_6à 6Ã-4ÃP2Ã@d0Ãàü.Ãð2Àâ5ÃÑ4Ãð2Ã`¬1Ã0I.ðu1Ã@ó-Ãû-À1ÃK/Ãà.à ".Ã!2ÃPä6à o6Ã5À}1à 1Ãð1ð/ÃÀû6Ã0œ5ÃPm5Ãð‚4Ãàg2ÃPü2ê4Ã`ˆ7ÃÀœ1Ãð²,À}1à ì6ÃË5ÃK/ð/ðo2ÃpÙ0àÑ0ÃÐX.Ãàs0ÃÀ1Ãõ.ÃàU5Ã-0ÃÐR/Ãð 3Ã3ÃÐ:3ÃÐÉ0Ãð;+ÃÀ„5àË1Ãp\0ðþ/À¡+àr+ði3Ã`6ÃP0ÃpD4Ãã1ÃÅ6ÃÀ+/Ã@Õ2ÃpP2Ã92Ãð4Ã0®2Ö)ÃÐj+ÃÀ1Ãàü.Ã`¾.Ã],Ã@ó-Ãpñ,Ã0¨3ÃB7Ã0º0Ã@ù,ð/ÃP…1ÃP-Ã`¾.Ãà.ÃàU5à «,ÃP‹0ÃP/Ã`¸/à ø4àf-Ãð0ÃW-ÃÐ'ÃpÓ1ê0ê4Ãà[4Ã'1ÃŒ5À0Ãé0ð™+Ãx.Ã`²0ö2À›,à «,ÃÀº,ÃÀ1.Ãpb/Ãà‹,ðþ/ÃP£,À /ÃÐ44ðo2À•-ÃÀ–2Ãpñ,àï+ÃPy3Ãн2Ãà+ðW6Ã071Ã`Ü)Ã0Æ.ÃÐá,Ãð#/à Ÿ.à (-ê0Ãpt,Ãæ*Ãð0ÃÀ%0Ãàm1à 0ÃW-Ãð /ÃП7à o6à ".ðþ/Ãpt,à`.ÃpÍ2àÑ0à Ÿ.ð/ÃpÙ0ÃE0Ã~-ÃÀ=,Ã~-ÃP2*Ã`î&ÃP&,Ãû-Ãõ.ðò1ÃÐÏ/Ã0g)ÃP…1ð™+Ã0a*Ã0a*ÃÐÕ.Ã!2ÃðG)Ãð /Ãà )Ãì%ÃÐÕ.Ã-0Ãph.ÃÀ–2Ãð¬-àÝ.ÃÐó)Ã@+ÃÀÒ(Ã`/1à +Ãà‘+À¡+Ãr/àõ*Ãc'À›,Ãð¦.ÃÀ1Ã92Ã0Ò,ÃÐá,Ãpz+À•-ÃpÙ0Ãà…-Ã0C/ð¥)Ãà.ð/Ãf1ÃÀ3ð-Ãàg2à 2Ãx.ÃP,+à(Ã0Þ*Ã`Ð+Ãð5,Ã~-ÃPJ&àÝ.Ãàs0Ãpt,ÃÀ¨/Ãàs0Ã`Ê,Ã@ç/ð“,Ã`;/Ãð2ÃÀ¢0Ã`¾.Ãph.ð±'À$+Ã`;/ÃP¯*Ã@v-à 1Ã0À/à i7ÃÐá,Ã,ÃÐ:3à (-Ø3Ãp )Ã-0Ã0a*ÃÀ3Ã0a*À-ð‡.À¹'ð½%ÃÐí*Ä,ð-Ãà.Ã`_)ð{0Ã@)%Ã)Àè4Ã,Ãph.Ãp†)Ãpë-Ãð”1Ãà-Ã@ç/àl,ðÃ$à /Ã`;/ÃÂ,Ã@d0ÃÐj+ÃÐí*Ãð¦.ð{0Ã`Ä-Ãð/-Ãð5,Ãð1Ãð¾*Ã0Þ*Ãà.Ã@ˆ*Ã0[+Ãð/-Ã`#3Ãpå.Ê+ÃÀI*ÃÀ¢0Ãp†)Ãà.Ã@í.Ãàs0Ã`¬1Ãp’'Ã`¬1Ã`A.Ãï/Ã@ó-Ã@á0ðò1àf-Ã`6À.àÑ0Ã`G-Ã@‚+Ã0[+ÃP‘/ð‡.à`.ÃðG)ä1Ã`Ð+ÃÀU(Ãp€*Ã)Ãн2ÃàI7ÃÐj+ÃÐó)àx*à ±+ÃÈ/Ãð¦.Ãà,àã-Ãx.ÃÀã:ÃpP2Ã0C/ðo2Ã@X2ð/Ã-0ÃP,+Ã0Æ.à 4+Ã0À/Ãpn-Ã0Ø+ð/Ãà‘+ÃÀ´-ÃÀ+/ÃÀ¢0Ãpå.ÃðÄ)Ãpt,ÃP1ÃpV1Ãàm1Ãð).ÃP1Ã3ÃÀº,ÃÀ3ÃàØ4Ã0Þ*À-ð-Àƒ0Ã0U,Ãph.À0ÃÀ 4ÃÀ3Ãð#/ÃP-Ã@+Ãàê1Ãpt,Ãð).Ãi*ÃК#Ã`M,Ãàü.Ã`G-Ã],Ãð²,ð3àZ/Ãõ.àZ/ð“,ÃP&,à×/Ãà )Ã0Ò,ÃÀØ'ÃÐj+Ã](Ã0%4àÝ.Ã@ù,À³(Ã%'Ã@Û1À¡+ð¥)ÃP -Ãï/ü-ÃÀÀ+ÃЫ5ð-Ã3/Ã@+ÃÀ¨/ÃP&,Ãà-Ã`¬1Ãà—*Ãpñ,Ã0Ì-Ã@v-ð“,Ãà©'Ãò(ÃW-ÃP©+ÃÐ^-àé,ÃÀ´-ð-ÃðÐ'À-Ã@(À$+ÃÐá,àB3Ã`¾.ÃЂ'Ã0ä)Ã`‰"Ã`¾.ÃK+Ãð5,Ã@F5Ã`G-ÃÈ+ÃÀ1.ðc4Ã0s'ÃP.À›,Ã0ð'ÃÐç+Ãp*Ã`50ði3ðþ/Ãà,ÃÐí*ÃÈ/Ãð 3ÃŒ5Ã@L4à 4+Ã(Ãp’'À•-ð-À.Ãð¬-Ã`Ê,ðc4Ã)ÃP,+ÃðÊ(ÃÐç+Ã`S+Ãà…-ÃpÓ1Ãpë-Ãp )Ã`A.Ä,àÝ.Ã92Ã-4àH2àË1ÃàU5Ãõ.ÃÐç+ðo2Ãr/Àw2Ã`G-Ã`S+Ãð/-ðþ/à Ÿ.Ãà*Ã0Æ.Ãï/Ãà‹,ÃÐá,ÃÀ2Ã3/Ãð /Ãàs0ÃE0Ãð#/Ã~-Ãà‘+Ã`š4ÃPð4ð .Ãx.Ü(Ã@í.à 0ÃZ3Ãðÿ4Ã012Ãð /Ãðˆ3àï+àZ/ðø0Ãàê1ÃpP2Ã` 7Ãà‹,Ã0U,Ã@ó-ÃÚ,ÃÀ¢0Ã0Ø+à (-ÃÀ%0ÃÀŠ4ðò1ÃP&,À.à ™/Ãû-Ã!2Ãð”1ÃP/à 3Ãl0ÃàÞ3Ãàm1Ã@ÿ+Ãð).à ò5ÃP‘/Ãp86Ãl0ÃÐá,Ã0%4ÀÜ6Ã`¾.à “0Ã`6ÃÀ1Ãð¦.Ã`;/Ãl0ÃÈ/àN1ðì2Ãr/à¿3Ãðv6ÃÀT=Àâ5Ã05Ãн2ÃÐÃ1Ã@ù,Ã012À$+Ã0Ø+à :*ÃP.Ãð”1àé,Ã],Ãph.Ã0Ì-Ãà…-à65ð‡.Ã0¨3Ãà…-Ã`¦2ÃàÌ6ð]5Ãð 3ÃàÒ5À1Ã?-ÃðŽ2ÃÀœ1ÃÀ2Ãpn-ä1ÃÐÛ-Ã3/ÃÝ2Ã0+3Ãàü.ÃÀ5Ã0+3À.ö2ð‡.Ã0¢4ÀÖ7Ã@½6Ã0®2àN1ÃP2ÃÀ2Ãpz+Ãðˆ3ÃàI7Ø3ÃÐÏ/À.ÃÐÉ0Ãr/à i7Ã`/1ÃðŽ2À‰/Ãð¬-Ã'1Ã0À/ð/ÃPy3Ãày/Ãp»5ÃpÓ1Ãpb/à þ3Ã07ö2ÃÐÉ0ÃPy3ÃPg6ðQ7Ã06Ãð”1ÃÐX.Ãàö/ÀY7ÃÐ@2Ãð2ÃàÆ7Àú1ÃpÍ2Ã`;/Ã'1ÃÀ´-à³5Ãðˆ3Ãð1À.ÃPö3Ãб4Ã`;/Ãàa3ÃÀx7à 1Ãày/ÃÀã:Ãå;ÃPö3ÃPö3Ãpß/Ãð4àÑ0Ã'5Ã4Ã8Ãð5,ÃÐ.5ÃP0ÃPü2ÃË5ði3ðo2à o6Ãõ.ÃàU5ÃPa7àB3Ãðˆ3Ã@á0ÃÀ~6à ì6Ãð#/Ã0À/ði3ÃÅ6Ã3/ÃB7Ã`”5í:Ã0´1ÃT4à 6ð .ÃŒ9ðQ7ð9;ÃÅ6Ã0=0ð3ÃÎ.ÀS8Ãà=9Ã9.àf-À1Ãpå.à 6ÃàO6À‰/Ãp27àÅ2ÃÐ|(À}1ÃH6Ã`”5Ã`¦2Ãé0Ã0Š8Ã`¦2ÃPs4ÃÐÛ-ðò1ÃP1Ãз3Ãàð0à ".ð{0ÃÀ3ÃÂ,Ãð|5Ãàð0Ãðù5Ãã1Ãðÿ4Ã`Ä-ÃPê5Ã0Æ.Ãàð0Ãàs0Ãàü.à ™/Ã05ÃàÌ6à06Ã0´1àl,ÃpÓ1Ã@.9À}1À‰/Ãõ.ÃP‹0Ã3ö2À-Ãð /Ãðˆ3Ø7ÃP2Àâ5ÃÐ(6à ¥-Ã07Ã!2Ãð /ÃÀŠ4ÃÀ–2Ãз3Ãð1Ã@Ã5ÃàC8Ãð|5Ã`6Ãà-ðþ/Ã0C/ÃÐ44Ãp,8Ã@·7Ã@Ã5ÃÀ3ð3Ãà.Ã@ÿ+Ã`¾.ÃÐÛ-ÃÀ´-Ã92Ã` 3ÃÐF1ÃÐF1Ã9.ÃPs4Ã@Ï3À /Ã`¸/à ™/Ã`¸/ð]5ÃÐX.ÃÐÏ/ÃàU5Ãày/ÃÈ/Ãð/-Æ6ÃPä6ÃB7ÃÐF1À**Ã0®2À¡+Ã`š4ÃГ9Þ6Ã@R3ð/ÃÐ^-àH2Ã`¸/Ã@Ï3Ã?1Ã],Ã07Ãðš0Ãð¾*Ãpå.ÃÐR/À›,ÃÀ+/Àe5ÃPs4Ã0a*Ã`Ð+Ãð1Ã4à ‡2ÃÀ3Ã×3Ã0%4Ãàö/à 2Ã`G-ÃÐç+ÃÀ+/ÃÐp*ÃÐÏ/ÃP.Ã0ê(Ã071ÃÝ2Ã0¨3ü-ÃÐÃ1Ä,ÃÀ=,ð()Ã`¾.À¿&Ãð¾*àã-Ãàê1Ã`;/Ãà…-À1ÃÀ+/Ã`¬1à 3ð-À$+Ãð4ÃàI7Ãàê1Ãõ.Ãàg2ÃPm5àÑ0ÃZ3à¿3Ã`š4À_6Ø3à¿3ð3Ãp¯7à*7Ãн2Ãðç8ÃpÍ2Ã92Ã05à Î;ðÔ6Ãã1Ã0r<Ã@É4à>ÃPO:Ã`ˆ7à Q;Àq3ÃÐF1Ã@É4Ø3Ãðj8ÃPDÃ`ù9Þ6Ã@Ÿ;Ã`”5Ã@:7ðK8ÃÀï8à :Ã0ï<Àk4àB3Ã@¥:Ã’8Æ6à <ÃÐ:ÃÓBÃÐ"7ÃÀŠ4Ã`)2à<4à65ÃpD4ÃPö3Ãpb/à9ÃPI;Ã$<ÃB7í:ÃÐ9ðc4à à8ÃðX;ó9à65Ãp»5Ã07ÃPö3ÃpÁ4ði3Ãà´:Ã@>Ãà7:ÃPI;à•:ÃAÀM9ÃT4ÃàÀ8Ã`²0Ãð2À7ði3ÃPð4Ãðó6Ãh;ð¶;À¦?Ã`p;Ãh;ÃPð4Ãðd9ðª=Ãý;ê4Àú1Ãn>Ãðó6Ãp :à¹4ÃÀŠ4Ãðj8à i7Ã@48à Ô:Ã`ÿ8Ãñ9Ã@±8Ã0Š8Æ:Ã69à ò5Ã92Ã’8ÃàÒ5Ãt9ÃÀã:ä1Ã` 3ÃÐ8Ã` 3Ã`ˆ7à Ô:Ãð^:ÿ7Ãð4À¾;ÃŒ5ÃàC8ÀÐ8ðW6Ã@R3à à8Ã0:ÃÀl9Ãàä2ÃPs4Ãðd9Ã@™<Ø7Ãàa3Ã@Ï3Ã@.9à­6ÀÊ9Ãð”1ÃÀ2à­6à þ3Ãp&9Ã!6Ãp :ÃPm5ð]5Ã0¨3ÃÐÉ0à¡8Ã7ÃÀ`;ÃPÆ;àÅ2à 3Ã@F5à ì6Ãp :à à8ÀG:ÀÜ6Ã@X2Ã`ÿ8à65ÃЫ5Ãðá9Ã071ð@ðÂ9Ã7ÃÝ2à i7Ã06Ãð|5Ã`²0ÃÐ9Æ:à=Ã0–6Ãðÿ4ÃÀl9ÃÐ ;Ã0%4ÃP0Æ6ÀY7à i7ÃÀ„5Ãðp7ÃЙ8Ãðó6ÃPm5àÝ.à¹4ù8ÃÀ¢0ÃPÌ:Ã0œ5Æ:Ãã1à o6Ã`š4Ã@Ï3à$8Ãàö/ÃPÞ7à9Ã`”5ÃPs4Ã0~:à E=ó9Ãðˆ3Ã0:Ã@¥:Ã@@6À7Ãpü?ÃÐ9ÃPm5Ãðp7Ã`ç<Ã0õ;ÃÀ5àƒ=ÃàO6Æ:ðBÃ$<Ãp>ÃàO6Ã@48ÃðÏ<ö2ÃÐ]BÃ0õ;À²=ð¼:ÃPÒ9àî@à Î;ÃàûCÃ0NBÃpðAÃ`R@Ã`ç<ÃðÉ=Ãðá9ð!?Ã`4EÃpäCÃ\=à K<ÃÀT=ÃÙ=ÀM9ð¼:ÃP7>ù8Ãðá9Ãà¢=ÃÀÑ=Ãàœ>À;<ÃÀH?à Q;Ã@™<à*7Ã0:ð-=Ã@@6ÃÀï8Ãp©8ÃÀé9Ã`j<Ã`8ÃÐ{=Ã0f>ÃVBÃ÷8Ã;Ã0x;ÃЇ;Ãt9Ã`ˆ7à;À;à‰<ÃPg6Ãë:Ã@½6à <Ãðç8Ã@¥:Ãà1;ÃPO:ÃàC8ð?:à:ÃÐ<à Q;Ã@ ?Ã`í;ÃÐ{=àâBð†CðÈ8Ã$<Ã0œ5ÃàÒ5Ã`^>Ãà>à ?>ÃP¢AÃð½?Ã>ÃðF>ÃPa7Ã@L4ðE9Ãà7:ÀY7ðÂ9Ã0œ5à Ú9Ã`á=Ã÷<Ãðd9Ã0Ý?Ãn>ÿ7ÃðX;ÀÖ7ÀÖ7Ãp—;à Q;ð3<ÃPü2Ã07Ãà´:ÀA;à}>Ãý7ÀA;Ãà1;Ãà´:ÃPÞ7à Q;ÃÙ=Ãð^:ðK8à Ô:à ¨(dt ?@4 4ÿxunitsyunits åhpÝ (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÒ (ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec2 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitsî(·—NM@è`êTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜ì8HEAPXH€êdescriptionsection_0section_1section_2descriptioncommentchannelsAmp1Amp2Amp3Amp4` Hn_sections ö¨àí ·—NM (CLASSTABLEð0SNODˆë¸ö(`Ô 8à†TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(È ÿÿÿÿÿÿÿÿ @TITLEDescription of channel 3 8 FIELD_0_NAME n_sectionsàöùTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆúHEAPX ùdatadescription8  @œÐûq·—NM€SNODxùÐl`nåÂÀÿß [ã çÂ`hæÂ€]à€ÃÏÂ@PÝ€]à £×Â@çÂàvîÂ` á XÙÂÀÛÂàwÙ ‹ÛÂÀÄÔÂÀ²×ÂÀ ÞÂÀ/ØÂ@ ÔÂ@»àÂ7ÜÂ`¤Ü€ìÝ€cßÂ@\ÛÂ@JÞ ŸâÂà¸ã &× íÕÂ@€Õ öÞÂ`¶ÙÂ@’Ò€ìÝÂ=ÛÂ@µá€oÝ sß sßÂ@JÞÂ@ ÔÂÀ¬ØÂàƒ×Â@zÖ ØãÂ@»àÂÀ¾ÕŠãÂ`Œà€‡Ù jÖÂ@&ä¨ÞÂàqÚÂÀ#ÚÂÀÜÐÂ@nØÂ`’ßÂÀóáÂà¬åÂÀçãÂ@ åÂÀ¸Ö màÂ`Â× ¥áÂ@\ÛÂàÐ߀cßÂ`ÈÖ€ØÂ 8ÔÂ@ÍÝÂ`¼ØÂ`¤Ü ¥áÂ@,ãÂÀùà LÛÂÀŽÝÂ1ÝÂÀ ÞÂÀ5× ,ÖÂÀÛ ^ØÂÀßÂà/å êà€æÞÂà ÖÂÀÐÒÂ@-ÎÂ@\ÛÂ@¯âÂ@2â ÝÂÀMÓ ;ÉÂÀÚÂ@8áÂ`žÝÂ@†ÔÂOØÂàâÜ ^ØÂ€KãÂÀ5×Â`’ßÂ`€âÂ`˜ÞÂ`E×Â@JÞÂà5ä öÞÂÀ”Ü [ãÂàÐßÂà 4ßÂ`°Ú€þÚÂ@VÜÂ`!ÝÂ`âÂaÕÂà×Â@êÂ=Û 2ÕÂ`iÑÂÀjãŠãÂ`Â×€ÚàÂà_ÝÂ@t×Â@DßÂÀÛÂÀÊÓÂÒ×Â@'Ï .àÂÀáäÂ`ÈÖÂ@zÖ ÝÂ`†áÂà ëÂàÄá £×ÂÀóáÂàšèÂà/åÂàèÂàAâ @ÝÂàê–áÂ`ŒàœàÂÀRçÂÀÏç€Qâ€ÈãÂ`Þ —Ù€Eä€ Ù ·ÞÂÀdäÂàAâÂàâÜ€ÚÂÀÝÂ@£äÂÀÉèŠã þçÂNíÂ@yëÂ@\ÛÂàMàœàÂãéÂÀpâÂ@ÁßÂ@>àÂàwÙ ØãÂÀÊÓÂ`žÝÂÀjãÂà5ä€ì€zðÂ ÆæÂ€QâÂ@¯âÂ@ÇÞÂ@hÙ DÒÂÀ5× «àÂÀ¥îÂÀùàÂÀùàÂà0ЮݠòéÂÀXæÂ .à–áÂ@‘çÂàGáÂ`€âÂ@bÚÂàôÙÂ`¶Ù€ìÝ€‡Ù ÚÂÀçãÂàSßÂà çÂàÖÞ :Þ€ Ù á×–áÂâ€oÝÂàAâÂàMàÂàÊàÂÀpâÂ@µáÂÀ)ÙÂ@ÍÝ ±ß ¯ÕÂÀˆÞÂà5äÂ`†á€iÞ 4ßÂàwÙÂÀáäÂ`3Ú€™ÖÂ`†á Ÿâ€?åÂ`zãÂ`˜Þ€þÚÂá màÂ@£äÂ@D߀Ú€ ÙÂ@ÇÞÂÀ|à€¼å 2ÕÂÀ‚ßÂáÂ@ÇÞÂ@bÚÂäÔÂ䀞êÂ`à€c߀cßÂ`WÔ€Ö ±ß ·ÞÂ@JÞÂ`†áÂ`°ÚÂÀ”ÜÂà ÖÂ@bÚ€¥ÔÂàeÜÂÀÃé RÚÂÀ#Ú€9æÂàÜÝÂà× ßÍ€ÚÂ`KÖÂ`!ÝÂ@PÝÂ@£ä êàÂÀ߀¼åÂ@hÙÂÀ¬ØÂ LÛÂ`†á ÃÜÂCÚ€RÍ€×Âà;ãÂâÂÀùàÂ@€Õ çÂàÄáÂ@Dß Þâ …ÜÂà5äÂ@µáÂ`-Û þçÂàqÚÂÀÜÐÂàôÙÂ@ÙÛ€EäÂÀ Þ (áÂàAâ„ä …ÜÂÀ;Ö öÞÂ@>àÂ`€â êàÂ%ß´Ü "â Àç„äÂÀŽÝ @ÝÂäÂ1Ý ØÂ gá€"ÕÂÀ/ØÂÀóáÂ`E×ÂÀRçÂ@2â€{ÛÂ@ÙÛ€ÚàÂÀ"ï®ÝÂOØÂ@bÚÂ@DßÂ`Œà€Kã ®ê çÖÂ@£äÂéèÂàGáÂ@JÞÂ`tä¢ßÂ1ÝÂàÜÝ ©ÖÂà_Ý =èÂõæÂ@&äÂ@µá€ìÝÂ@‹èÂ`VéÂlèÂàAâ€ÂäÂ@gîÂÀ½ê Òä çÂ@èÂ@ßÚ ìêÂ`ñäÂ@ÙÛ  æÂ`ëåÂ`÷ã gáÂ@üꀒ쀤é çÂ@»àÂÀpâÂÀÛå çÂ@¯â ä ®êÂ`Á쀆îÂ@éÂÀpâ þçÂ@çÂÀ^åÂ`PêÂ@»àÂÀˆÞÂÀ«íÂ`ëåÂåÂàôÙ Û {èÂà ëÂ@öëÂà¬åÂÀÕæÂÀóá¢ßÂàšèÂ`ñäÂà²äÂ`nåÂàMà aâ åÂ`âÂ@ðìÂÀFéÂÀ ÞÂÀ¥îÂ@ åÂ~åÂÑìÂ`ÍêÂTì ØÂ@…é Uä 7é IæÂ ºèÂà¾âÂ@©ãÂ@ åÂTìÂà²äÂà)æÂÀ‚ß œíÂ`ßÂ@ÍÝÂÀÉèÂÀ^å ãÂÀÚÂÀ·ëÂNíÂàGá–áÂ`¤ÜÂÀÏç ºè€oÝÂÀùàÂ@sì€WáÂÀßÂàGáÂ@ÍÝ€QâÂ@Ìò€nòÂà¾â€ëÂ`ßç€3çÂÀáäÂàÄáÂÀ^åÂÀ4ì oêÂ@2â ð߀Wá€ÚàÂ@»à .à ØãÂÀÏç þçÂÀ4ì =èÂ`>íÂ@zÖÂàMà ¥áÂ`ÍêÂ`â€iÞÂà/åÂà#çÂÀXæÂZë€KãÂ@æÂàvîÂÀ ÚÂàÄáÂÀRçÂrçÂ@©ãÂ@öëÂ@»à |Ó€Wá¿ï IæÂ Þâ ‘Ú —Ù€QâÂ@êÂÀíâÂ`žÝ€hó “äÂÀvဠ٠½ÝÂÀ²× sßÂà¸ãÂàÜÝÂ@ÓÜÂ`†á äÂ`VéÂâ ¥á üÝ .à®Ý€¼å ŸâÂïçÂ`PêÂà¬åÂ@‹èÂà¦æÂÀLè d× :ÞÂ@sì–áÂÀ¸Ö »ÓÂ`\è ·ÞÂÀ”Ü 8ÔÂ@öëÂrçÂ`ëå„äÂàeÜÂ@©ãÂ@èÂàAâÂ`€âÂÀ|àÂ倪èÂ@ÍÝ ÀçœàÂà²äÂåÂà#çÂàÄá XÙ yÞÂà¸ã ÀçÂ@ÇÞÂàŽêÂà€Èã€ÚàÂàSßÂ@&äÂÀŽÝ€æÞÂàîÚÂÀ^åÂ@ÍÝ ÝÂàeÜÂà RÚÂàèÛ ¥áÂà$Ò€cß &×ÂàÖÞÂ@nØÂ¢ßÂÀçã€EäÂÀÐÒÂ`ñä€QâÂ`ëåÂ`ëåÂ`¶Ù€™ÖÂÀˆÞÂàwÙÂä¨ÞÂ@ÙÛÂàÊàÂÀpâÂÀdäÂâÂ` áÂ@PÝÂ`!Ý ÏÚÂà•ÔÂ@÷֠݀òÜÂÀÕæÂ`Œà Òä =è ^ØÂ@&äÂ@©ãÂÀßÂÀùà ½ÝÂ@D߀?å ã åÂ`¶Ù´ÜÂ@&ä€uÜ ½ÝÂÀÕæÂàâÜÂ@ëØÂ DÒÂà}ØÂ@å€3ç€àßÂäÂ`3ÚÂ@ýÕÂ+ÞÂ@¯âÂÀóáÂÀáäÂÀÏç êà€EäÂlèÂÀFéÂÀÛåÂÀçã “äÂÀ^åÂ@ê ÃÜÂ`ÙèÂÀáäÂÀˆÞ oêÂÀçãÂàÜÝÂØÖÂ`âÂàYÞ ´éÂ%ßÂ@÷ÖÂ@êÂàÊàÂà_ÝÂÀpâÂ` áÂÀjã [ã “äÂÀÜÂlèÂÀ‚ßÂÒ×ÂÀÐÒ€{ÛÂxæÂ ìê ØãÂ` áÂ`ñäÂÀXæÂÀíâÂ`ýâÂ ÆæÂ`Íê Oå —ÙÂ%ßÂÀÚ .àÂ@&ä Ìå–á€cßÂÌØÂàèÂÀváÂ@ê :ÞÂÀ|àÂÌØÂ ¥áÂàAâÂ`PêÂà/åÂ`°ÚÂà/åÂàÊàÂ@JÞÂêÓ ØÂÀdäÂÀÛÂ@>à€ ÙÂàMàÂ%ßÂÀšÛ Òä ÃÜÂÀÝ ±ß ð߀æÞÂ@µáÂ ÛØÂ "âÂÀváÂÀÛ ÃÜ RÚÂ`täÂ`!Ý€€ï€ëÂà ë ÜÂ`ßÂ@¯âÂà¬åÂÀ5× (áÂ%ß þçÂ`hæÂ@ç–áÂ@ŒÓÂ`˜ÞÂÀÛÂÀ/ØÂ@ÙÛÂàÔÂ`bçÂÐÂÀŽÝ üÝ€þÚÂ`¼ØÂà¾âÂÀÐÒÂxæÂ êàÂ@ÙÛÂÀ)ÙÂÀ”Ü€RÍ 2Õ mà ÉÛÂ=ÛÂàYÞ :Þ IæÂàôÙÂ`QÕÂÀGÔ€ÚÂ@VÜ FÜÂ`žÝÂ@hÙŠã ±ßÂ`?ØÂ`-ÛÂ@>àÂ`’ßÂ@†Ô &×Â@£äÂàSßÂ=ÛÂÀ|àÂÀ;ÖÂÀ ÞÂ`ÈÖÂ`ÚÓ ðßÂ@…éÂÀ¸ÖÂ`täÂàúØÂ «à€cßÂÀÜ ÚÂÀÛÂÀÄÔ´Ü —ÙÂÌØÂàèÛÂU×€ÚÂxæÂ@bÚÂÀÄÔÂÀŽÝÂ`ßÂ7Ü çÂ`âÂÀíâÂÞÕ®ÝÂÀAÕºÛÂàGáÂ@»à€æÞÂà}ØÂ ^ØÂàÜÝÂ@ÁßÂÀÜÐÂÀ|àÂ@\Û€]à€]àÂÀÚ€iÞ ^ØÂ€Úà óÔÂ@nØÂ€øÛ 4߀Qâ€ÈãÂ ÆæÂ íÕ £×Â@ßÚÂà¸ãÂ@bÚÂàS߀ îÂÀšÛÂÀÿß …ÜÂáÂ`žÝÂ`°Ú ØÂ`täÂàMàÂàØÂ LÛÂàMàÂÀFé€àß ‘ÚÂIÙ´Ü çÖÂ`˜Þ ãÂ@\Û€uÜ ‹ÛÂÀ߀]àÂÀ¦ÙÂàîÚÂÀÚÂÀ#ÚÂ@£äÂàeÜÂäÂÀ/ØÂ XÙ FÜ ÝÂ`hæÂ€Qâ “äÂà)æÂ@DßÂà¬åÂÀÿßÂàpïÂÀjãÂ@ÁßÂ`9ÙÂ@zÖÂÀÜÂà;ãÂàYÞÂ`-Û¨ÞÂÀÛÂ@©ã€ Ù "âÂ@2â€ìÝ ãÂ@©ãÂ`ß «à¨ÞÂàMàŠã€þÚÂàÄáÂ@DßÂÑì åÂà5ä€QâÂ`êÂàMà ÛÂàÔÂÀ Ú 4߀KãÂ`àÂ`°Ú€Ôá¢ßÂ7ÜÂ`ßÂÀAÕÂ@÷ÖÂÀóáÂCÚÂ`!Ý€ØÂàÄáÂÀLèÂ@ ÔÂ`¼ØÂ€iÞ üÝÂðÒÂÀÚÂ1Ý öÞÂà5äÂ@©ã€ìÂÀRçÂÀçã¢ßÂâ OåÂ@ÇÞÂ@ëØÂ`˜Þ„äÂ`ñä Øã€ªèÂÀ‚ß öÞ€]àÂ`åæÂféÂ@ÍÝÂà²ä ãÂÀRçÂ`åæÂà5äÂ`žÝ øèÂÀp ÙÂ@\Û þçÂà²ä€¶æÂ “äÂÀ:ëÂ@\Û UäÂ`bç€cßÂä€uÜÂ@æÂà_Ý€Qâ€cßÂÀ Þ “äÂåÂÀÏçÂ`žÝÂ`¤Ü —٢ߠ´éÂ@VÜœàÂÀ/ØÂ€øÛÂ@&ä€!êÂàÜÝÂ@‹èÂà¸ãÂÀá䀤éÂCÚ ·Þ ¨ë "âÂ@åÙ ØÂàÄá “ä€øÛÂ@,ãÂ`hæÂ ØÂ€KãÂà逤éÂà ëÂÀ^å Cç ‹Û¢ßÂ@èÂ@2âÂ`÷ã€ÎâÂàMàÂ@ÁßÂ`Pê€nòÂ@ åÂ@éÂà_Ý€¼åÂïç„䀇ÙÂÀ|à€ÚÂàSßÂ~åÂ`µîÂÀpâ¢ßÂ`˜ÞÂåÂ`ÍêÂÀˆÞ€Èã€æÞÂàSßÂ@ꀶæÂ øèÂ@ÍÝ ¥áÂ`°Ú ‹ÛÂäÔ ‚ÒÂÀÿßÂ`žÝ´Ü€?å„äÂÀ”ÜÂÀRçÂ`âÂ@åÂÀŽÝ€{Û¨ÞÂ@>àÂà/åÂà¾â ŸâÂ@µáÂà çÂU×®ÝÂ@¯â€Ú ‹Û 4ßÂÀÛ€Ú Òä OåÂà‚ìÂ@JÞ (áÂàÄáÂ~åÂàYÞÂÀ¦Ù ÃÜ ÝÂ@8áÂ`’ßÂàkÛÂ`žÝÂ`Â×ÂÀçã "âÂ@nØÂàèÛÂà×Â`QÕ€ Ù–áÂÀ Þ€þÚÂ`’ß s߀æÞ ÒäÂU×€Úà€Îâ …Ü ÛÂ@\ÛÂ@ÙÛÂÀ”ÜÂàôÙÂàÓÂ@ÓÜ ·Þ Fܮ݀ØÂ7ÜÂÀÜÂÀ Ú€Ú d×ÂÀvá ØÂàGáÂÀùàÂÀ5×Â`?ØÂ€Qâ€øÛ€?å´Ü @Ý …ÜÂ@ÇÞÂ@Áß åÂà;ãÂÆÙ–áÂ`°ÚÂ@nØÂ`÷ã€(ÔÂCÚ€Ú êàÂ@ëØÂ :ÞÂ@bÚ üÝÂ@2â LÛ€þÚ üÝ€"ÕÂ@ëØÂÀ¦ÙÂêÓ 8ÔÂÀ/ØÂ µÔÂ`KÖÂ`KÖÂ@8áÂÀˆÞÂ`9ÙÂ`-ÛÂÀMÓÂÀ²× çÖ€þÚ€‡ÙÂ`†á€ŸÕ€ÖÂ@ñ×Â@nØÂÀGÔ ã€ÏÍ ÕÙ “䀨ÂàqÚ€KãÂâÂ@ÒÂ[ÖÂ`¼ØÂyÑÂ`E×ÂäÔÂÀ²×ÂaÕÂ`E×€iÞÂà‰ÖÂà ÖÂ@ÕÂàMàÂIÙ€4Ò vÔÂÀ/ØÂà}ØÂÀ¾ÕÂÀSÒÂ@ßÚÂ`€âÂ@\Û LÛÂ`!ÝÂ@åÙÂ@3ÍÂàÕ ÃÜÂÀÛÂ`ÎÕÂàÜÝ ñÊÂÀˆÞÂõæÂÀSÒÂÀAÕÂyÑ€«ÓÂ1ÝÂÀ#Ú ÕÙÂÀÊÓÂsÒ€øÛÂ…ÏÂÀóá ÿÒ ˆÑÂàYÞ¢ßÂ`ŒàÂÀeÏÂ@€ÕÂ7ÜÂ`'ÜÂðÒÂ`E×Âà¾â€{Û ‹ÛÂ@bÚÂÞÕÂà6ÏÂàèÛ€Âä€Ú€ìÝ ãÂ@—æÂ`ÔÔÂÀAÕÂÀ²×ÂÎÂ`˜Þ€ÔáÂ@£äÂÀ ÞÂOØÂ@&äÂÀ‚ßÂâÂOØÂÀÚ Ù ¥áÂàâÜÂÀÛ ÁÒÂàúØÂà‰ÖÂ`ªÛÂå€oÝÂàì «àÂÀpâÂ`hæÂ€ÚàŠãÂÀšÛ CçÂÌØÂ€ØÂ gá ¥á€uÜÂÀˆÞÂÀèÎÂäÔ ‹ÛÂöÑÂàYÞ (á ©ÖÂàGá «àÂ`åæÂŠãÂ@ÇÞÂÀùàÂÀ:ëÂàâܨހ¥Ô€Wá yÞ€ÈãŠã€þÚ€òÜ€-èÂxæÂàAâÂ@&ä s߀WáÂÀÛÂ`¤ÜÂÀßÂ`nåÂ@ÇÞ FÜ€cßÂÀšÛÂàAâ màÂ@ç ÃÜÂ`†á gáÂ@D߀ÎâÂÀ|àÂàâÜ ½Ý ç «àÂÀvá ‚ÒÂIÙ¨ÞÂàØÂ ÞâÂ@ÍÝÂ@Dß «àÂÀLè ©Ö€ÚàÂàSßÂ`täÂféÂ@ëØÂ€ÚàÂ×ë€iÞÂ@2â ÀçÂ%ßÂ@ÓÜ ØÂÀjãÂïçÂ@ÁßÂ`žÝÂ ÆæÂàíèÂÀ#Ú€òÜ€cßÂ@ßÚÂÀ¬ØÂ màÂ~å 1êÂà5äÂÀóသê€Ôá€EäÂÀÿß ÌåÂàè ã€ÂäÂ`åæÂ äÂàÄá LÛÂÀ«í {耶æÂ äÂá íÂâÂ@2âÂ`åæÂ`täÂà5äÂà;ã ®ê 瀶æÂÀdäÂféÂ@2–׀3çÂ@©ã ·ÞÂ`˜Þ uéÂÀÕæÂ€¶æÂ¨ÞÂ@üê CçÂ@ åÂ@©ã€òÜ üÝ ÒäÂ@ÇÞÂ`¼ØÂ€cß öÞÂà”éÂÀÉèÂ@‹èÂà¬åÂ`ßÂÀßÂÀÜÂ ÆæÂ Oå€WáÂàAâÂ@,ãÂ@yëÂ`à «àÂ@©ãÂ@åÙÂ@PÝ€Wá ÜÂà¸ã ¢ì€{Û€æÞ Òä€Èã Ù ‹Û XÙÂÀ²×Â%ßÂ`'Ü å {èÂÀŽÝÂ@…éÂàÖÞ ˆÑÂ@åÙÂ`ÈÖ€ Ù€ìÝÂàîÚÂ`ªÛÂ`oÐÂ`€â üÝÂ+ÞÂÀ߀ØÂ%ß sßÂ@堽݀òÜÂÀ;ÖÂ`hæÂ ‹ÛÂÀYÑÂ`iÑÂÀ¬ØÂ@ÇÞÂ@ÍÝ€ØÂ jÖ  Í€æÞ€ÎâÂ@ýÕÂ`¶ÙÂÀ_ÐÂÀÚÂÀÝÂ@ñ×Â`uÏÂÞÕ´ÜÂ@\ÛÂ@Õ ‘Ú€™ÖÂàÐßÂ@åÙÂÐÂU×ÂIÙÂÀ¥îÂÀ߀¥Ô€ÚÂàÖÞÂàèÛÂ`Â×ÂÀ²×Â`âÂÀóáÂÀjãÂàâÜ€3çÂà}ØÂ ÿÒÂOØÂ ã‹ÎÂ@nØÂ€uÜÂ1Ý ‚ÒÂàÄáÂà¹ÎÂ` áÂ`†áÂà sßÂ@ ÔÂà_ÝÂØÖÂà_Ý XÙÂÀÝÂàèÛ :ÞÂ[Ö yÞÂà<ÎÂ@bÚ€æÞ ØÂÀeÏ€“×Â@VÜ€{ÛÂ`?ØÂ`{ÎÂà•ÔÂ@¯â€Îâ€uÜÂ@ÓÜÂà§Ñ ÛÂöÑ€4ÒÂà_ÝÂ@PÝÂàúØÂàÕÂÀ)Ù€׋Π4ß >Ó µÔ€É΀@ÐÂÐÂ`QÕÂÀAÕ ‹ÛÂÀ ÚÂ@åÙÂ`ßÂaÕ &×Â@&äÂÀ;ÖÂÀkÎÂ`ªÛ (áÂÀóá€Ú€ÉÎÂ%ß ÝÂàÜÝ€ÃÏ vÔ€Ö€Ú gáÂàÓ ,ÖÂ` áÂÀˆÞÂ`žÝ€ìÝ€iÞÂ`°ÚÂàéÆÂ`uÏÂ`{΀ÚÂ@ýÕ ½ÝºÛ íÕ á×Â@9ÌÂöÑ€ ÙÂ@!ÐÂ@nØÂ@Ñ óÔÂ@ßÚ :Þ€?åÂØÖ ¯ÕÂÀÄÔÂàSß ®êÂ`€â€RÍ€(Ô ÒäÂ`3ÚÂ@hÙ íÕÂ%ßÂÀjã€WáÂàØÂ mà¨Þ€ÈãÂàÔ€{Û ½ÝÂÀFéÂàúØÂ€òÜÂ@ÇÞÂ@8áÂ`â ©ÖÂ`QÕÂàúØÂÀ/ØÂÀ)ÙÂ`˜Þ \ÎÂàÖÞ LÛÂÆÙ€iÞ€øÛÂ@ÍÝÂàÖÞÂàâÜÂ@hÙ€]àÂÀdäÂâ€ìÝÂ`ÍêÂ`bç gá€ÖÂÀ¾ÕÂ`žÝÂà¦æÂ :Þ …Ü€9æÂ`ÙèÂ%ßÂ@ÙÛ 4ß .àÂ@ÙÛÂÀÉèÂ`tä€øÛ …ÜÂÀ^åÂ@»à …Ü üÝÂà‚ì mà å€uÜÂ+ÞÂÀŽÝ€Ôá Ú€ÎâÂÀjãÂàÄá êàÂ`¤ÜÂ`-Û .à (áÂ@¯â åÂ@>àÂà²ä FÜÂÀFé «àÂÀˆÞÂ`ŒàÂØÖÂÆÙ å€àßÂ@\Û€]à€ÂäÂÀáäÂ1ÝÂ@2â ØÂ :Þ ÃÜÂáÂàeÜÂ`Œà€c߀ÚÂäÂÀváÂÀ¦ÙÂÀßÂÀ Ú€¶æÂ ^ØÂÀóá ¥áÂ@ÓÜÂÀÛåÂà¬å€øÛÂà Ö€9æÂ@—æÂ@»àÂÀšÛÂÀ¬ØÂ€?åÂàAâ Þâ ð߀øÛÂÀíâ€ÔáÂÀ ÞÂ`hæÂ@ åÂÀ:ë ®êÂà|íÂà5äÂÀçã€cß mà„êÂÀÉèÂU×Âàšè œí .à€™ÖÂ@PÝÂïçÂ`!ÝÂ@—æÂÀLè ãÂâÂ@ç ìêÂÀŽÝ€ÔáÂÀÕæÂÀRçÂ`àÂàÂâÂàGá ‹Û€"ÕÂ`VéÂÀpâ Ì倸ÛÂ`Pê —ÙÂÀ ÞÂà²ä äÂÀçãÂ`hæÂ :Þ€ÔáÂÀŽÝÂÀðÂÀ^å€ÔáÂ@2â€ÈãÂà;ã (áÂåÂ@ åÂ`žÝ ´éÂûå äá åÂÀjã€QâÂéè ·ÞÂ`žÝÂà¬åÂ@åÂÀ Þ€oÝ LÛ€Kã€]àÂ@PÝÂÀ‚ßÂ@ñ×ÂàÜÝ :Þ ç QïÂÀ^åÂà¬åÂÀjã Øã€÷ðÂ@1÷ÂÀÃéÂÀXæÂ@JÞÂâ€ÔáÂ@éÂ`zã€ïÂ`DìÂ@8ᠺ耀ï€9æÂà‚ìÂàGáÂà× UäÂ`âÂ@é Oå ÌåÂàê€ÈãÂÀ«íÂ@ç€ë¨ÞÂÌØÂ€!êÂÀŽÝÂ@éÂ@©ã ~òÂféÂÀ½ê€ÈãÂÀjãÂÀváÂ ÆæÂ Àç ÀçÂà”éÂÀùà€3çÂ@[ð (áÂà¬åÂ@VÜÂà)æÂÀFéÂà¸ãÂÀpâÂ@êÂàÿìÂ`åæÂ`÷ã€'é´Ü aâÂ@2âŠã€EäÂ@éÂÝêÂ@‹è ‘Ú€{ÛÂ@ÇޢߠòéÂà çÂà/å€Wá ]í IæÂÀ^åÂ@D߀KãÂ`nåÂ@ÍÝ„äÂ@µá€˜ëÂ`Ùè€Qâ€cßÂàØÂàÖÞ sßÂ`’ßÂ@nØÂ`åæÂ`ýâÂÀÿßÂ`÷ãÂàGá€oÝÂ`täÂà¾â ¥á Oå øè màÂ@¯âÂÀóá€ÚÂ`’ß yÞ Cç Uä ÒäÂÀÏçÂàÄáÂÀ^å€ Ù ÌåÂÀvá «à =è åÂ`ÇëÂÀÕæÂ@zÖÂ+Þ€ŒíÂ@—æÂ (áÂ ÆæÂ€3çÂ@VÜ .àÂ`žÝ @ÝÂÞÕÂàÂÀáäÂ`ÞÂàGá aâÂ@©ãÂ`€â ò€æÞ (áÂàšèÂ`êÂàšè ç @Ý Oå€-èÂàúØÂÀÚ  æÂ€¼åÂ@ÞïÂàèÂà¬åÂ@æÂÀùà =èÂ@©ã€ÚÂIÙ€¼å€EäÂàÐßÂÀˆÞÂ+Þ aâÂàSßÂõæÂàYÞÂ`¤ÜÂÀ@êÂ@åÂÀ óÂÀ·ëÂàMà€Qâ€Èã Bü UäÂ@hÙŠãÂÌØÂÀ/ØÂ`žÝÂ@,ã ÉÛÂÀÿß ‘ÚÂ`˜ÞÂàÜÝÂ@>à cìÂ1ÝÂàèÛÂà¸ã€°çÂàúØÂÀváÂÀŽÝ Šð§óÂÀvá€iÞÂÀRçÂBïÂà·øÂà)æÂ åÂ@ëØÂ@æÂ`ñäÂ@2âÂéè€!êÂ`täÂÀ#Ú ãÂ`nåÂÀ^å€åó 7éÂà¸ã„äÂ`µî€Èã .àÂ@ÇÞÂÀLè àìÂ@=õ€ÚàÂ@&äÂNí cìÂàóåÂÀùàÂàƒ×€°ç ]íÂÀFéÂ@£äÂ`ýâÂ@—æÂ`VéÂ`÷〰çÂàAâÂÀdä ‹ÛÂ@÷ÖÂ@¯â ½ÝÂàYÞÂÀváÂàÖÞ ðßÂ`tä ìÂà^òÂÀ@ê çÂ@èÂà çÂà/åÂàÛòœàÂU×ÂxæÂ€Îâ êà€-èÂrçÂÀváÂ@é üÝ€ÈãÂ`ñäÂàkÛÂàAâÂ`ßÂÀjã ãÂÀpâÂ@nØÂ@JÞÂ@çÂäÂÀ¥î IæÂ@ÍÝÂà5äÂ7Ü CçÂ`ŒàÂàóîÂà ç FÜÂ`zãÂàÊà„ä ÌåÂ@DßÂ+Þ€ÂäÂ`¤ÜÂáÂà)æÂ@míÂ`VéÂÀÚ äÂ@æÂ ŸâÂØÖÂ@å¢ß ©ÖÂ` á øèÂ@sìÂÀFé FÜ ç€ïÂÀùàÂ@hÙÂ`°ÚÂ@æÂ`KÖ ¥áºÛÂÀjãÂ@ 倰ç CçÂ@¯â ÚÂ7ÜÂÀRçÂ@©ã ÞâÂ@Áß Fܮ݀cßÂà_ÝÂÀ/ØÂ@ ÔÂ`KÖ ç màÂàúØÂ€±Ò ÞâÂ@ÓÜÂ`÷ãÂ`ñäÂÀpâ ðßÂ`¶ÙÂÀpâÂ@PÝÂ@ÒÂ=Û ½ÝÂàé ã ãÂ@zÖ€™ÖÂ@€ÕÂÀçãÂÀÜÂÀÛåÂÀ)Ù ½Ý€ØÂ`ßÂÀÄÔÂàkÛÂà¾â ðßÂgÔÂàìÂ`µî  æÂ ÞâÂ@D߀Úà€ÚàÂÀçã Oå ‘Ú êà€WáÂÀ5× gáÂÀdäÂ`'ÜÂÀáä€ÚàÂ`€âÂxæÂ@>à€Èã 4ߨÞÂ@»à ·ÞÂÀŽÝ “䀪èÂ`ýâÂ@8á Cç Òä Òä€ÚàÂÀÝ ÏÚÂ`ñ䀰çÂ`¼ØÂ@ÓÜÂà¬åÂ@&ä€?å€ÚàÂ`3ÚÂà5äÂ@‹è CçÂ@µáÂÀùàÂ@JÞÂ@2âÂÀXæÂ á×€]àœàÂàíïÂÀXæÂ€÷ð àì äÂàwÙÂÀvá€ìÝÂàâÜ äÂ@,ã€æÞÂÀóáÂ@µá€ØÂàeÜÂ`©ð€?åÂ`à€ªèÂ@¯âÂàÄáÂõæÂÀÿßÂà‰Ö ½Ý€9æÂŠãÂàšèÂàè ÒäÂåÂàSß çÂ×ëÂZëÂà#ç íÂâ þçÂ`>í äá€ìÂÀ^åÂÀçãÂ@‹èÂ@&äÂÀÛåÂ`†áÂÀ^åÂàkÛÂÀ|à ]í¹ðÂàŽêÂà5äÂÀ·ëÂà¬å€ÎâÂÀÛåÂ@ýÕÂ`ÙèÂàÿìÂ`ñäÂïç màÂàÊàŠãÂ ÆæÂ€3çÂàê€æÞÂÀÛåÂ@ê %ìÂ`ÁìÂà¬åÂ`ÁìÂÀÃé +ë ™ãÂ@êíÂÝê ÎïÂ`ñäÂà¬å ìê ŠðÂÀdäÂÅî€9æÂºÛ ¥áÂÀXæÂ€Âä€ìÂ@>à ±ßÂà¾âÂÀ™ðÂ@DßÂÀ ÞÂ@µáÂ@ å 1ê Ÿâ Ý [ãÂ@æÂ ¢ì [ãÂÀˆÞÂà¾â çÂ@ßÚÂ`žÝÂà_ÝÂ ÆæÂ@µáÂÅîÂÀLèÂ@Ó܀נ܀’ì€-è ±ßÂ`’ßÂÀçã IæÂãé ÒäÂÀp‘렋ÛÂ@míÂ@gî ãÂ`z〪è =è (á ä€9æÂàGáÂHîÂÀÏç ™ãÂ`n倰çÂ`zãÂàÊàÂ@èÂéèÂ@»àÂCÚÂ@>àÂäÂÀÃé çÂÀáä màÂrç„ä ÝÂõæÂ ãÂÀLèÂ`8î€íÂ@ºõÂ@ å€9æÂ€°çÂ`åæÂàêÂ`ëåÂÀ^åÂàèÂÀXæÂ€ýï ÞâÂÀ@ê œíÂ@Þï€ îÂà¸ãÂÀ·ë ]íÂà¸ãÂàdñÂ@aïÂ@‹èÂà5äÂ@míÂ`µîÂÀRç =èÂÀ½ê ãÂàùí€QâÂàGáÂÀ߀ññ –îÂà)æÂféÂ@…é “ä ðÂÀ"ïÂàçðÂÀ4ìÂÀÛåÂ%ßÂ`÷ã€øÛ äá€Kã€?å¿ï ¥á€'éÂâÂ@ åÂ@8áÂÀXæÂ ìê OåÂ@sì€oÝÂÀ^å çÂÀóáÂ@UñÂãéÂ@[ðÂÑìÂ`hæÂ@äî€-è Oå Qï€]àÂ<ðÂ`\è€9æÂïçÂàŽê àìÂÀ¥î oêÂ`ýâÂ䀼åÂ@yëÂ`ÍêÂ`\èÂ~åÂ`àÂà¦æÂ îÂ@yëÂÀÏç àìÂ@ꀤéÂàRôÂàé Þâ =èÂÀÃé  æÂÀÛåÂÀ Þ ¨ë€ëÂàèÂlèÂ@ðì ØãÂÀ4ì æëÂà;ãÂ`žÝÂà;ã ÈðÂ@>àÂ`€âÂà²ä ïÂàíïÂàjð àìÂ`\èÂ`tä€'éÂ`8îÂ`nåÂ`†áÂ@æÂà/åÂ@yë€÷ð„ä í %ì –îÂ@æÂ@©ã€ŒíÂ` áÂÀ(î EñÂà|íÂÀXæÂ€àß ðÂà½÷ cìÂÀ|à€ÂäÂ@ðìÂ`Ó逘렓ä 1êÂÀpâÂÀ·ë€ îÂà_ÝÂ` áÂàˆëÂ`»í€˜ëÂ`åæÂÀ±ìÂ@êíÂ`ÍêÂ@míÂ` áÂÀ:뀼åÂÀXæÂ€°çÂ@ÇÞÂà|íÂ`zãÂàÄáÂà5ä„ä [ ïÂÀdäÂrç€ÎâÂÀ½êÂàkÛÂá òé {èÂâÂ`¯ïÂÀ·ëÂÀáäÂ`'Ü€ÎâÂà ëÂÀí‪èÂ@yëÂ@JÞÂàÜÝÂ@DßÂÀjã ~òÂÀÿßÂ`täÂàjðÂ@öëÂä¢ß€?åÂÀþôÂÀíâÂàÂàÖÞ pÕÂâ "âÂ`˜ÞÂà¦æÂÀ²× ÌåÂ`€âÂ@8áœàÂNíÂ`PêÂà‚ì€Úà ÃÜ ±ß€ë€ÈãÂ`žÝ s߀‡Ù€àß çÂ@ÇÞÂ@ÙÛœàÂ`€âÂ@ç òéÂ@‹è–á ·Þ ØãÂÀˆÞÂ@,ãÂà5äÂrçÂ@,ã€zð€'é€ ÙÂàÊà öÞÂÀ ÚÂà çÂàˆëÂÀ^å¢ßÂÀ^åÂ` áÂ@yë aâ ®ê€P÷Â@ÇÞÂÀùàÂr瀰ç ñÂ ÆæÂ€ÔáÂàqÚ€c߀¤éÂ@æÂ ‡æÂÀ.íÂ@å®Ý€°ç IæÂ ŸâÂZëÂ@8áÂ`¯ï€ÚàÂ%ßÂÀÝÂ@ÓÜÂ`Pê€?倶æÂ@zÖÂ`zã ÜÂ`˜ÞÂ`߀9æÂ Þâ ÌåÂ`!Ý cìÂÀLè aâÂÀùàÂ`-Û€9æÂàîÚÂ`!ÝÂàeÜÂ@2âÂà#ç€æÞÂàÖÞ€™ÖÂ`Â×ÂàkÛ Ìå¢ß 4߀]àÂ@8á ÛÂàîÚ Ý Îï ÏÚÂÀ;Ö€“×Â` á yÞÂàGáÂÀŽÝÂÀ;Ö ÇÑ å .à€KãÂà}ØÂ`÷ã aâÂàúØÂ„äÂÀùàÂàÕÂÀçãÂ`JëÂ`-Û€àßÂ@©ã çÂ@\ÛÂâ yÞÂ`zãÂ@>àÂ@ç ûòÂÀ|àÂ ÛØÂ ã "â€9æÂ`\èÂûå sßÂÀˆÞÂ@©ã´Ü ½Ý (á€Úà¨ÞÂêÓÂ`°Ú =èÂà çÂàÐ߀°çÂ@»à Àç€KãÂ`ñäÂà)æÂ€EäÂàÐßÂ@¯â åÂà#ç aâ Øã "âÂÀ·ë€WáÂ1ÝÂàì cìÂà5ä u逼åÂàSß %ìÂàšè aâ€iÞ üÝ€ÚÂÀŽÝÂ`åæÂ`ýâÂÀÚÂà²ä aâ ÀçÂ~åÂ@—æÂÀFé ÒäÂàâÜÂ@å€ÚÂ`tä äœàÂ@ÁßÂ@åÂ`€âÂå€uÜ yÞÂ@JÞÂ@bÚ´Ü CçÂ@æÂ Ü´Ü Îï€!ê€àßÂ`'ÜÂàúØÂ .àÂàÄáÂÀGԀΉçÂ@\ÛÂ`cÒ yÞ å üÝÂÀˆÞÂ`ê äÂ`°ÚÂ@8áÂ`zãÂ@ÍÝÂxæÂxæÂ€9æÂ@ö뀘ëÂà¸ãÂ`ýâ–áÂØÖ sßÂÀóáÂ@2â€WáÂÀÜ€Ú ‹Û€cß ãÂ`ÙèÂà¬å ãÂàÜÝÂ@µáÂÀÿßÂÀ Þ€¶æÂÀFé€Kã¢ß åÂ`÷ã «à Ú [ã ¨ë Þâ ã€ÂäÂ1ÝÂ@‘çÂàSßÂÀváÂ`€â Ý€¶æÂ€iÞÂàeÜ ŸâÂÀùàÂÀ|à UäŠãÂ@\Û€QâÂ@æÂ`J뀀ïÂàÄá  æÂ@‘ç “äÂxæÂ`˜Þ€ØÂ`¶ÙÂáÂÀ²× ¥áÂÀ Ú Ù [ãÂ@»àÂÀÛÂ`†á€ÚÂà)æÂÀ4ì€9æÂ`zã gáÂÀ”ÜÂZëÂàMà ÃÜÂmÓ€"Õ ðßÂÀóá ðßÂàwÙÂÀ#Ú ã LÛ€ Ù êàÂâ€3çÂÀ|à £×ÂàÕ vÔÂàÊàÂõæÂ@\Û ùÓÂ@ÓÜÂ`߀ÚÂà)æÂ @Ý ÍЀWá òé ï ÛÂ`€âÂ`?ØÂ€ÚÂ@PÝÂÀ#ÚÂ@÷ÖÂàâÜÂ@æÂ ãÂ@…é á×ÂÀ5× ‹Û ¥áÂ1ÝÂ@åÙÂàSßÂ`'ÜÂà•Ô åÂ@˜ÑÂ` á üÝÂàÐßÂ@PÝ€‡ÙÂÀ)Ù€òÜ ^ØÂmÓÂIÙÂ`3Ú€{ÛÂ`ñäÂÀÝ€ Ù€ÚÂ@÷ÖÂ@»à€uÜÂ@ëØÂ@Ó @Ý ÉÛÂÀÜ€ÚÂÀ5×Â`¤Ü ÝÂÀ:ëÂÀçã ½ÝÂ`˜Þ óÔÂ…Ï ØÂÀ)Ù "â€Eä ÏÚÂaÕÂ`zã ^ØÂ`-Û ØÂ`-Û \ÎÂ@t×ÂÀ¦ÙÂ`QÕ€(ÔÂÀ¸Ö ÇÑÂÀ;Ö€{ÛÂ`3ÚÂ ÛØÂÀ Ú XÙ€4Ò »ÓÂà5äÂ`¤Ü€ÖÂxæÂ ÃÜÂ@˜ÑÂ`ÔÔÂ`žÝÂ`-Û€ ÙÂÀ;ÖÂÀváÂàÜÝÂàÜÝÂÀ²×ÂÀ”Ü€×Â`â LÛÂÀ¸ÖÂàeÜ ùÓÂàÂàèÛÂÀßÂÀ”ÜÂàúØÂÀ¾Õ€(Ô  Ñ JÑ ÚÂàÖÞÂÆÙ€±ÒÂÀÐÒÂàƒ×Â ÛØÂÀíâÂàÕ ½Ý Ò–áÂàôÙÂÀÊÓ€QâÂ@ÍÝÂ`'ÜÂüÐÂ`°Ú€«ÓÂ`KÖÂàèÛ ßÍÂÀ¸Ö€pÈ ùÓÂ@EÊ€4ÒÂ@'ÏÂ@EÊÂ`Â×Â`ªÛ #ÍÂЀÚÂ@\Û ‹ÛÂ=Û pÕ 8ÔÂ`ÎÕÂ`°ÚÂà‰Ö ÒÂgÔ Û€{ÛÂmÓÂà*Ñ —ÙÂ@ýÕ |ÓÂ`ÚÓÂà ÖÂ`ÞÂ@ñ×€ÏÍÂ`°ÚÂ`™É šÎÂ…ÏÂàÝÈ€±Ò€øÛ ðßÂÀÝ ÓÏÂäÔÂÀ¸Ö ^ØÂ@µáÂ`ÈÖÂ@’ÒÂàqÚÂ@÷Ö ÜÂà›ÓÂðÒÂ@PÝÂà¡ÒÂOØÂ€@ÐÂ@ÂÊÂ@°Í€ÚÂà•ÔÂÀôÌÂÀÜЀþÚ€ Ù ØãÂ`ÞÂÆÙÂ`!ÝÂàÖÞÂàYÞ DÒÂ`E×ÂàwÙÂ`ÔÔÂ`ÎÕ µÔ€¥ÔÂà›ÓÂÀÖÑÂ@åÙÂÀ/ØÂÞÕÂ@ŒÓÂÀ¬ØÂ@€ÕÂÀAÕÂàÓÂ`ÎÕÂU×ÂÀÊÓÂà$ÒÂ`?ØÂ@ÕÂ`ÚÓÂäÔÂU×€½Ð —Ù ŽÐ íÕÂOØÂ€"Õ Ë &×Â@ÓÜÂÀeÏÂêÓ DÒ ¯Õ€×Â@ ÔÂ`ýâÂU× jÖÂ`-Û RÚÂÀÊÓ ˆÑÂÀYÑÂ@ŒÓÂ7Ü ØÂà‰Ö€‡ÙÂàôÙÂOØÂ ;ÉÂ`E×€™ÖÂ@hÙÂÀ”Ü ÕÙÂ@ßÚ ŒÆÂà0ÐÂà•Ô ;É€½Ð€±Ò€ Ù€ÚÂ@JÞ ^ØÂ@ÒÂ@ÙÛÂàqÚÂÀ;ÖÂàkÛÂ@÷Ö ÁÒÂÀ#Ú ©ÖÂÀqÍ JÑÂÀ¬ØÂà¾âÂ@PÝÂÀ)ÙÂ`ÞÂà}ØÂ`WÔÂüÐÂàkÛ€“×€Ú LÛÂ`]ÓÂ@ ÔÂ@DßÂ`9Ù óÔÂ ÛØÂ@˜ÑÂÀÐÒÂ@-ΠDÒ üÝ€¶æÂ`†áÂ@ßÚÂáÂàîÚ€ØÂàS߀ÏÍÂÀÛ€ØÂà}ØÂà×Â`øÎ€FÏÂÀ ÚÂ`¤ÜÂÀÝÂ`þÍ "â (áÂ@ÙÛÂà ÖÂ@€ÕÂà²äÂ@>àÂà²ä€iÞ ÉÛÂà ÖÂÀ)ÙÂåÂ@ñ×Â@bÚ ØãÂ7Ü ØÂ`]ÓÂ`ŒàÂÌØÂU×Â@,ã€{ÛÂ`¤ÜÂ@PÝÂIÙ ©Ö€·ÑÂÌØÂ`žÝÂ@t×Â@¯â€4Ò &×€ÃÏÂÀâÏ ‘ÚÂ`?ØÂ@t×ÂàeÜ ÙÎÂ@©ãÂ ÛØÂàúØÂ€þÚ ¦ÌÂàÓÂ+Þ ãÂ`âÂà›ÓÂ`ÔÔÂÀ¾ÕÂ@˜ÑÂyÑÂÀ5×Â`ÚÓÂÀâÏÂ@ÒÂðÒ€ØÂÀÚ€(Ô´ÜÂÀ)ÙÂØÖÂ@€Õ ÁÒÂ@ýÕÂÀ¸Ö 2Õ €ÈÂ@Ó .àÂÀ”Ü óÔ ±ßÂOØÂÀÜÂÀÛ ÓÏÂÀÆÂ ØÂ LÛÂÀ ÚÂ`†á€.ÓÂà}ØÂ ÝÂàeÜ VÏÂ@÷ÖÂà_ÝÂÀÜÂÀ/ØÂà ÖÂÀ5×ÂÀÛ öÞÂ~åÂÒ×ÂêÓ ‘Ú€‡Ù üÝ ©ÖÂÀÄÔÂ@åÙÂ`˜ÞÂ`÷ã€{Û JÑÂ@˜ÑÂ`ß  ÑÂsÒÂU×ÂàèÛÂÀ/ØÂÀ;Ö «à€:ÑÂ`iÑÂ@’ÒÂ@˜Ñ Ý€"ÕÂàúØÂàqÚÂ@DßÂ7Ü ¦Ì ©ÖÂ`¼ØÂ ØãÂà_ÝÂ@ÓÂÀYÑÂÀÖÑ çÂàkÛÂ`†áÂàîÚ XÙ FÜ€ØÂ µÔÂÒ×Â@nØÂ€ÖÂ@hÙÂÀ¦ÙÂà_Ý ‹Û€Ú€"ÕÂ`ªÛÂäÂ@ÁßÂàÜÝÂ`ÞÂÀÖÑÂàqÚÂàÜÝÂ`Â× sßÂ@ÙÛÂOØÂ ‹Û€ ÙÂàÖÞÂ1Ý ,ÖÂ@\ÛÂ`9Ù€(Ô ½Ý€òÜÂÀ#ÚÂ@©ãÂ`!ÝÂÀîÍÂàÄáÂÀ5× Ù ©Ö RÚÂÞÕ€¥ÔÂ@Ó ©ÖÂ@ÍÝÂÀ‚ßÂ`¶Ù¨Þ ÿÒÂCÚÂÀ#Ú DÒºÛ€±ÒÂÀÛ€:Ñ€±Ò ”ÏÂOØÂ ÒÂ@ÒÂ@t× á×Â`QÕÂ`ÎÕÂÀ5× ØÂ màºÛ ÉÛ ÝÂÀÄÔÂ`˜ÞÂäÔ .à ØÂ`ÚÓÂ`˜ÞÂÀ}ËÂ`¼ØÂ ÏÚ€ë€Ú —ÙÂ`àÂÀšÛÂ@ëØÂ@zÖÂ=ÛÂàeÜÂÀ¬ØÂ@ÙÛÂà›Ó ÕÙÂ@hÙÂÆÙÂÀÚ —ÙÂÀ Ú ˆÑÂ@€ÕÂà/å€àßÂÀ)ÙÂÆÙÂ`ÎÕÂÀôÌÂÀ¸ÖÂà•Ô¢ßÂ`¤ÜÂÀ²×ÂÀÜ ÉÛÂÀ ÞÂàÜÝÂàwÙÂà•ÔÂÀ¦ÙÂ@bÚÂà›ÓÂ@>àÂ@hÙÂÀ”ÜÂà×ÂÀÊÓÂÀ#Ú€æÞ …Ü€ØÂ€.ÓÂàØÂÀvá€{ÛÂâÂÀùà€àß @ÝÂàÔÂ@ÍÝ€ÚÂÀ5×€ìÝÂÀÚÂÀ)ÙÂûåÂ`°Ú€ØÂàÐßÂ@ÑÂ`æÑ€Âä€ØÂ€þÚ —Ù€×€þÚ mà ãÂ1ÝÂ@©ãÂ@t× 4ßÂ@¤ÏÂ@¯âÂ`˜Þ€iÞÂÀ5× ÉÛÂà_ÝÂ`žÝÂ@©ã€ìÝÂ`?ØÂ ½ÝÂàôÙ€ Ù€oÝÂÞÕ &×€ÂäÂ@÷Ö ðßÂâÂ ÛØÂ ÿÒ€oÝ üÝ À瀱Ҁ"Õ ½ÝÂ@bÚÂà ÖÂÀ¦ÙÂ`†á êà màÂÀpâÂà;ã ÏÚ äá€ØÂ Ý ‹Û€ÎâÂÀ²× DÒÂ`ßÂÀÛÂ@ßÚ€Ú öÞ€QâÂ@PÝÂàâÜÂÀFéÂÀùàÂ`ßÂsÒÂÀÄÔ€ÚàÂ%ßÂà#ç ¥áÂàÖÞ LÛ d×Â@ÍÝÂÀ¦ÙÂÀváÂ`PêÂ@ÇÞ€ÎâÂ@yë„ä OåÂà ç€(Ԯݠ:ÞœàÂ`Â×Â`ªÛÂà¾â mà RÚÂÀÕæÂàkÛÂÀÚÂàÔ€3çÂá€ìÂ@ç€"Õ ½ÝÂÀ|àÂÀí‶æÂ%ßÂ@ÇÞÂÀ|àÂ@ÓÜÂàâÜÂ@PÝÂÀßÂ@æÂ€òÜÂÀßÂÀŽÝÂ`°ÚÂàqÚÂ`3Ú€±Ò ,ÖÂàMàÂ`†áÂ@\ÛÂ`¥Ç %ì€æÞ€QâÂÀdäÂàeÜ¢ßÂÀeÏÂ@»à ™ãÂÀ|àÂ`E×ÂàqÚÂ@PÝÂÀ#Ú€òÜ€ÚÂ`æÑÂÀ¬ØÂ ·Þ€†îÂàâÜÂ`æÑÂÀGÔÂÀßÂ@VÜÂféÂÀ¾Õ ÉÛ JÑÂàÊàÂ%ßÂ@nØÂÀváÂZë ±ßÂÀÚ€ØÂ ÀçÂÀjã 4ßÂàâÜ :ÞÂ`¤Ü ½ÝÂCÚ FÜÂ`âÂ@£äÂ@ÍÝÂàYÞ màÂ@yë€Ôá gáÂàâÜÂÀvá ¥áÂ1ÝÂÆÙÂÀŽÝÂ@çÂàGá€Ú ÛÂàîÚÂrçÂ ÛØÂ FÜÂ@PÝ êà–áÂÀ¬ØÂ`ªÛÂÀÜÂàAâÂûåÂÀ”Ü ØÂà×ÂÀÛ€ Ù€oÝ ¯ÕÂ`àÂ@\Û€ìÝ êàÂ`°ÚÂ@öëÂ1ÝÂ@¤ÏÂàèÛÂmÓÂüÐÂàeÜÂÀÜ€ÚÂ`oÐÂ`°ÚÂÀYÑ ^ØÂÀšÛÂ`9ÙÂà³Ï ÏÚÂÀ#ÚÂ@ å€4ÒÂàqÚÂÀ”Ü€‡Ù€Ú ã yÞ€þÚ ÇÑÂÒ×€Eä€ìÝ ùÓ äáÂÀÛÂÀAÕ€ØÂ`ªÛÂ`ÈÖÂ@DßÂ@åÙÂ`9ÙÂàƒ×Â`ìЀ Ù€ÚÂIÙÂÀXæÂ`Â×Âà$ÒÂà›Ó >ÓÂàeÜÂ=ÛÂÀváÂÀÚÂöÑÂà×Âàƒ× £×Â`-Û€‡ÙºÛÂÀ¸Ö FÜÂ`˜ÞÂ`zã …Ü€ÚÂÀ²×Â@nØÂ@ëØÂ¢ß íÕÂàîÚ€Ú 8Ô€ØÂ€ ÙÂ`9ÙÂàkÛÂ`¶ÙÂÞÕÂà‰ÖÂU×Â@JÞÂàÕ …Ü€·ÑÂ@åÙ€×Âàƒ×Âà¹Î£ÊÂÀ”ÜÂÀAÕ€ØÂ ÇÑÂ`iÑÂOØÂà_ÝÂÀâÏÂ@ÓÜÂÀ¦ÙÂÌØÂ ÕÙ€‡ÙÂáÂÀ¬ØÂÀ Þ€ÚÂàâÜÂàeÜ€¥Ô€øÛÂ@÷Ö€òÜÂ@€Õ ØÂà*ÑÂ@»àÂàèÛ€"ÕÂ@¤ÏÂàÔÂ@¯âÂ@!РÙÂÀ/ØÂ`æÑÂ`ÎÕ€ØÂ€uÜÂÀpâ —ÙÂ@EÊ áנ݀òÜ€×€ìÝÂÀ¬ØÂÀ5× ‹ÛÂ`ÎÕ€"ÕÂàÐß gáÂÀÝ FÜ ^ØÂ gáÂ@VÜÂÀ)ÙÂÀAÕÂ=ÛÂà×ÂCÚÂ`ÔÔ€ ÙÂU×ÂâÂ`àÒÂ@ÇÞÂ`QÕÂ@ñ×ÂIÙ µÔÂ@VÜ çÖÂ7ÜÂ1Ý€ÕÌ >Ó @ÝÂÀÛ€ÎâÂ`ÞÂ`¤ÜÂ`WÔÂêÓÂÀGÔÂ@ÍÝ€Èã ØÂÀÄÔÂ@ÓÜ |ÓÂ@ÓÜ€«Ó€ Ù€ØÂà FÜ ÓÏÂàÕÂÀˆÞÂ`¶Ù 7éÂ@ÒÂÀ;ÖÂàGáÂCÚÂ`ªÛ€.Ó€pÈ 4߀cßÂ`¶Ù€iÞÂ@ÍÝ ‹ÛÂ`¼ØÂ`à Ú yÞÂ@D߀EäÂÀ|à€Ú€þÚÂ`¤ÜÂâÂ@£äÂà/åÂ`ÚÓÂàÕ ØÂ gá€]àÂÀ5×Â@zÖÂàèÛ màÂ@t× FÜÂ`¶ÙÂ~åÂ@ñ× pÕ€ªèÂÀÛ ±ßÂà;ã€Wá DÒ€¥Ô &×ÂÀ#ÚÂ`9Ù ÜÂÀ¬ØÂ@†ÔÂáÂöÑÂà›ÓÂÀXæÂ€uÜ …ÜÂÀíâ êà€@РFÜÂ@\ÛÂ`¼ØÂàMàÂ@ýÕÂÅîÂféÂ@ŒÓ´ÜÂàÔ ÙÎÂ`ÈÖÂ`žÝ Uä ‚ÒÂÀŽÝ äáÂÀ߮ݠ(á çÂ`ÞÂ ÆæÂ ºè :Þ …Ü »ÓÂ`ßÂ@D߀cßÂÀ@êÂ@ åÂ`ýâÂÀ Ú 1êÂà5äÂ@µáÂ`¤Ü "â€øÛÂ`nå (á€òÜ äáÂà‚ì =èÂÀÿßÂ%߀Îâ 1êÂÀÿßÂ@æÂ OåÂÀjã åÂ1ÝÂÀÿßÂ`°ÚÂ7ÜÂ`VéÂ@»à€ÚàÂ@…éÂàSßÂ@&ä ÌåÂ@å :ÞÂ`â¨Þ€cßÂ`Þ gူçÂÀÕæÂ`3ÚÂ%ßÂÀÃé€iÞ üÝÂàÜÝÂà¾â Ìå Û 1êÂ`åæÂ "â öÞÂ`êÂ`'Ü sßÂàâÜ sßÂÀpâ´Ü€uÜÂ`ÍêÂàÄá€Kã Àç äáÂ@ÓÜÂÀò€ªèÂ`-ÛÂàƒ× äáÂàSßÂÀ)ÙÂàèÛ á×Â`°Ú ±ßÂ`ßÂ@bÚÂ ÆæÂàÐßÂ+ÞÂÀÛ€iÞÂÀŽÝÂ`à€ÚàÂ1ÝÂàqÚÂàGá Cç€ÈãÂ`E×€WáÂÀáäÂà¾â LÛ ÉÛ€ÔဟÕÂÀ ÚÂ@hÙÂàGáÂáÂàÐß “ä …Ü ÏÚÂàÜÝÂ`bçÂàAâÂÆÙÂÀÊÓÂaÕÂ1Ý€{ÛÂ@VÜÂ1Ý XÙ ÌåÂâ >ÓÂ@ÇÞÂØÖÂÞÕÂ@©ãÂÀÜÂ@2âÂ`àÂÀÐÒ€ÃÏÂà$ÒÂÀšÛ Ú€cßÂ@çÂàÄá .àÂOØÂ ØÂàqÚ  æÂ@zÖ€ØÂ ^ØÂ @Ý £×Â`-ÛÂ@Ó€òÜÂ@bÚÂà‰Ö «àÂÀ/ØÂ`°Ú ÞâÂàYÞÂÀAÕ yÞÂÀÜÐÂ@!ÐÂàÖÞÂàâÜ ÒÂ@JÞÂ`3ÚÂÀ5×€þÚÂà Ö€ÉÎÂÞÕÂ`¤ÜÂàèÛÂâÂÀ#ÚÂàYÞÂ@ÓÜÂIÙÂ@VÜ óÔ€.ÓÂ`Â×Âà}ØÂ@ëØÂÀ5×Â`ŒàÂ@÷ÖÂàSßÂ`†áÂà¾â€“×ÂÀGÔÂÀšÛÂÀÛÂÒ×ÂÀšÛ ÏÚÂ`9Ù€þÚÂ․é€þÚ€9æÂ`ÔÔ€ÔáÂ`àÂÀ)ÙÂ@8á€òÜÂ@ßÚÂØÖ ·ÞÂ@ßÚÂå ‹ÛÂ@ñ× VÏ€iÞÂàÄáÂÀ ÞÂ@€Õ€“ׄäÂrçÂ`à€.ÓÂ@bÚÂ`€âÂÀáä€ÂäÂ`9ÙÂ@ÓÜÂà5äÂ@PÝÂÀ”ÜÂàMà cìÂåÂ@t×Â@PÝ ÒÂ@'ÏÂ@ñ×€ÔáÂ@©ãÂÀÏçÂ`â œí iëÂàÊàÂÀÏçÂÀÄÔÂ`¼ØÂ@\ÛÂ`žÝ€‡ÙÂàÄá€Úà äÂàîÚÂÀÛåÂÀ‚߀oÝ ØãÂ`ñäÂ@PÝÂ`°Ú @Ý€ØÂ`QÕÂxæÂ ãÂà²ä€oÝ€àßÂÀÐÒÂ`Óé€QâÂÀjãÂ@&äÂ@£äÂàêÂ`-Û€ªèÂ`bçÂàšèÂ`°ÚÂ`WÔ +ëÂà#ç yÞÂàâÜ ÉÛŠãÂ@2‶æÂ …ÜÂ@æÂ`WÔÂÀ²×€“×ÂÆÙÂÀ#Ú ÕÙÂ`täÂ`'ÜÂ`!ÝÂàÖÞÂ@ å€Úà îÂ@,ãÂÀˆÞÂÀÃé€Qâ€òÜÂÀ ÞÂàÄáÂ`’ß =耰ç€ÖÂ@8áÂàÊࠓ䠱߀3çÂ`ªÛ Ò€¼å€æÞÂ@ÓÜÂCÚÂ`ýâÂÀ”Ü€cßÂÀRçÂà;ã öÞÂ`3Ú ©ÖÂ%ßÂÀÊÓÂ@t× LÛ€?åÂ`-Û LÛÂÀdäÂ@VÜ ‹ÛÂ@&äÂàîÚÂ`-ÛÂOØÂÀáä FÜÂ%ßÂ`€âÂ`-ÛÂ`ýâ€ÚàÂÀ¦Ù¢ßÂàÜÝ€ÔáÂ`täÂÀAÕ€ÂäÂÀáäÂ@Dß ‡æÂ FÜ Þâ mà€‡Ù ÛÂ@÷ÖÂ@ýÕÂÀ)ٮݠ.àÂà Ö vÔÂ@µá€ÖÂЀ"ÕÂà_ÝÂ`°ÚÂ`KÖÂàqÚ êà FÜ®ÝÂ@bÚÂ`Œà€KãÂÀÜ€øÛÂ@ÍÝ ÛÂÀdäÂ`Œà€øÛÂ@ÒÂ`zãÂ`ñäÂ`à€WáÂ`¤Ü¢ß ™ãÂÀ Ú ÉÛÂ`žÝÂU× ,ÖÂà¾â aâ ±ßÂ`÷ãÂÀ‚ßÂ@¯âÂ`°ÚÂàqÚÂ@ßÚÂ@ýÕ€‡Ù á× \ÎÂà$ÒÂ`!Ý ¯ÕÂÀ;ÖÂ`WÔ€þÚÂ`ßÂ`ÞÂÀŽÝ¨ÞÂÀ¬ØÂ€òÜ€cßÂÀÛÂ@bÚ€?åÂÆÙÂàÜÝÂ`PêÂàSßÂ`ŒàÂ@ßÚÂàôÙ€iÞ ãÂ`¼ØÂàÕÂ`täÂÞÕ —ÙÂ=Û £×ÂäÔ FÜÂàYÞ€¤é .à€"ÕÂÀ Ú ÝÂöÑ€ìÝÂ`’ßÂÀ¬ØÂÀ|à ‹ÛÂ`Â×Â`¼ØÂ`ªÛÂà0Р>Ó öÞÂ@ßÚ ‘ÚÂ@ßÚ€ÂäÂà²äºÛÂàMà þç öÞÂàØÂàƒ× ÞâÂÀXæÂ`iÑÂ`?ØÂ€øÛ yÞ´ÜÂÀ ÚÂà5äÂ@Áß á×Â@ÍÝÂàÄá íÕ€‡ÙÂ@£ä€žêÂÀÝÂ`žÝÂ`â¨ÞÂÀ¬ØÂ€Ú€“× LÛÂÀ^åÂàÐß "â€Èã ãÂ@†ÔÂÀÜ€uÜ€ÚàÂ`ëåÂ`åæÂ`QÕ€ŸÕÂ@DßÂàâÜÂ`ßÂÀ Þ¨Þ [ãÂ`'ÜÂ`æÑÂ@ßÚÂ`߀ÚÂ@D߀þÚÂà;ãÂ@÷ÖÂÀÜÐÂàúØÂ íÕÂsÒÂàkÛÂ@ýÕ€±ÒÂIÙÂ@ñ×Â@†ÔÂàÔ ÏÚÂ@ýÕÂàâÜÂÀ”Ü ÿÒ çÖ€±Ò€“×€æÞÂ@©ã€ ÙÂ`ÔÔÂÀpâ€:ÑÂàÂ ÛØÂÀ#ÚÂ@VÜÂ@¯âÂÀLèÂÀŽÝÂ@ßÚ€æÞ€iÞÂ@ýÕÂàYÞÂ`tä äÂ`¶ÙÂ@†Ô —Ù€æÞÂàÕ€ìÝÂàkÛÂàÂCÚ ã ®êÂÀšÛÂà5äÂ` áÂ`¶ÙÂ@üêÂàYÞÂÀŽÝÂÀ ÞÂàÐßÂ`E×Â@>à€‡Ù çÖÂàeÜ´Ü€ìÝÂ`€âÂ+ÞÂ=Û XÙÂÀíâÂ@8á vÔ êàÂÀÕæÂÀXæÂÀÕæÂ@ÓÜ€òÜÂ`˜Þ (á öÞ€òÜÂ`WÔ€‡ÙÂ`÷ãÂ`žÝ€4ÒÂ`Â×Â@ÓÜ ðßÂ@¯â màÂàîÚÂÀ¦ÙÂÀFéÂâÂàÜÝÂ`¶ÙÂ@¯âÂ@êí€oÝÂ`÷ã êà€Kã€ÚÂ@8á CçÂàAâÂ`PêÂ@—æÂ€¶æÂ s߀ÈãÂàYÞÂàØÂ€{ÛÂ`’ß ·ÞÂ@zÖ ðßÂÀóáÂ+ÞÂ@æÂÀ Þ ™ãÂ`nåÂÀßÂaÕÂÀ/ØÂ ½ÝÂ@&ä€uÜÂàwÙ vÔÂÀdäÂâÂà/åÂ@t× (áÂàYÞ€cßÂÀ/ØÂàšè RÚÂÀpâ FÜÂÀ#ÚÂâ (áÂÀvá ðßÂ`†áÂ`!ÝÂà¦æÂãé€òÜÂÀÜ aâ ÏÚÂaÕÂÀÛÂIÙÂ`JëÂÀÜÂ[ÖÂ`]Ó€uÜÂà¸ãÂ`˜Þ€Qâ «à sß CçÂ@¯âÂ`KÖÂàwÙÂ ÆæÂ@JÞ sßÂÀ ÚÂÀÿßÂàÜÝÂÀóá€cßÂ@—æÂ%ßÂàwÙÂ%ß ðßÂ@åÙÂ@»àÂàèÛÂ`°ÚÂÀ^åÂ@ÓÜ ™ãÂàAâÂ@µá€‡ÙÂ@ëØÂ ºè ·ÞÂ@ÍÝÂIÙ´Ü ÏÚÂ@JÞÂàjðÂÀ¦ÙÂàèÛ€™Ö ØÂ@,ãÂ@÷Ö€ Ù€òÜÂ`°Ú´ÜÂ`KÖ€LÎÂÀ;ÖÂ`ÙèÂàâÜ ‘ÚÂ@€Õ€.ÓÂàîÚÂ@\ÛÂÀÜ ™ãÂàÜÝ FÜ gá ØÂÀŽÝÂàÕÂ@ñ×Â@ÓÜÂÀÛÂ`žÝÂà¾âÂ=ÛÂ`¼ØÂ€?å ™ãÂà#çÂà;ãÂàÐ߀{ÛÂÀ߀øÛÂ@ÓÜ åÂ`àÂ@8áÂàwÙÂ`’ßÂ@ ÔÂ@ñ×€à߀Îâ¢ßÂÀ߀òÜ€ØÂàÕ gáÂà¸ã€ ÙÂ`°Ú ¥á ™ãÂ`¶ÙÂÀ#Ú XÙ€iÞÂ@ßÚÂÀ‚ßÂÀXæÂ@¯âÂàGáÂ@æÂ@ßÚÂÀ¾Õ ùÓÂ@÷Ö å€4Ò £×Â`9ÙºÛÂ`Þ€"Õ€RÍ &× vÔÂ@ñ×ÂÀôÌÂ`]Ó–áÂ@€ÕÂ@ŒÓÂ+Þ€× óÔÂ`WÔÂ@€ÕÂ`˜Þ ÎÂ`'ÜÂ@ñ×€æÞ€æÞ€¶æÂàÓÂÌØÂ€àßÂaÕÂÀ/ØÂ`iÑ @ÝÂ@zÖÂÀ¸ÖÂÀváÂ`QÕÂÀ)Ù  ÑÂà•ÔÂÀÝÂÀSÒ ÝÂ@ñ×ÂÀ#ÚÂ@ÙÛ ÝÂÀGÔÂ`-ÛÂ@VÜÂ@÷ÖÂÀÛ„ä€þÚÂÆÙÂÀšÛÂÀ¸ÖÂàîÚÂÀóáÂ@ÑÂ@åÙÂàÔ ÝÂàTÊ ÕÙ ¯Õ FÜÂÀ;Ö pÕÂÀóáÂàÕÂâÂàØÂ€ÚœàÂàYÞÂ`cÒÂàÄáœàÂà¾â¨ÞÂ@€ÕÂ@ÓÜÂ=Û ÞâÂÀÐÒ€"ÕÂ`ªÛ€3çÂÀjã€(Ô [ãÂàÐßÂ`'ÜÂÀ Þ ÃÜÂ`¤ÜÂ@¤Ï ÏÚÂàèÛ :ÞÂÀ‚ßÂ@ÓÜÂÀ”ܨÞÂåÂàwÙÂ`°ÚÂ@\ÛÂàúØÂ@ÍݺÛÂ`QÕÂ@€ÕÂ@»àÂÀMÓÂ`žÝÂ@ÓÂ@ýÕ€æÞ€Ö€ÖÂ`3Ú RÚ ÉÛÂ`âÂ@ÓÜÂ`-ÛÂÀYÑ ÜÂà¦æÂÀ ÚÂàôÙÂ`WÔÂÀ#ÚÂàúØÂ[Ö€4ÒÂà0ÐÂàÊàÂÀ5× >ÓÂ@hÙÂ@˜ÑÂÀ¬ØÂ@¤Ï€«Ó £× s߀ ÙÂ@Dß pÕ  Ñ€«Ó€“× jÖ ¯ÕÂÀYÑ ÙÂàèÛÂâÂ@JÞÂ`!ÝÂsÒÂÀÛ ¥áÂÀAÕÂËÂðÒÂÀÝÂ@ýÕ 2ÕÂ`Þ€àßÂ@ñ×Â`Â× çÖÂÀ ÞÂ`zã€ìÝÂ`à ãÂ@t×Â@ýÕÂ`ªÛ€òÜÂ`†á FÜÂàÐß »ÓÂ@ Ô RÚ´Ü ÇÑÂàúØÂÀjãÂ`zãÂàÜÝ ½ÝÂÀšÛ€ìÂà;ãÂà}ØÂ ßÍÂ`ÊÂ`êÂàÂ`àÂ`¤ÜÂÀ ÞÂÀÝÂ`ªÛÂÀdä ÒäÂ`ÎÕ ¦ÌÂÒ× üÝ¢ßÂ@zÖÂØÖÂàÂÀß FÜÂÀjãÂà¡Ò ÝÂ`hæÂ`\èÂà×Â`-Û ±ßÂ`zãÂÀíâÂÀGÔÂ@ýÕÂà#ç Þ‱ÒÂÀGÔÂCÚÂ%ßÂàGáÂ1Ý åÂ%ß LÛÂ@ç …Ü ¥áÂ`¤ÜÂ@bÚÂ@ßÚ 8ÔÂ@DßÂ@ç UäºÛ€Ôá Ý€“× ãÂ@£äÂàÄáÂ`ªÛ |Ó OåÂõæÂåÂ@PÝÂÀÕæÂÀáä 4ßÂÀÝÂÀÿßÂ@JÞÂ@ýÕÂÀdä "â ØÂ ä ðßÂ@ÕÂà¸ã {èÂÀ ÚÂÀ|àÂÀÛå ]íÂ@ÁßÂ@ÓÜ€¥ÔÂÀ^å ië Ý ùÓ€«ÓÂ@hÙ€QâÂÆÙ ‹Û aâÂûå :ÞÂ`ÞÂ@»àÂ`9Ù´ÜÂ`ªÛÂ@ëØÂÀ¸Ö ÜÂ`ñäÂàYÞÂ@ÍÝÂ`Â×®ÝÂmÓÂ@bÚ ÙÂàúØÂÀÜÂÒ×Â`'ÜÂ@JÞÂÀMÓ …ÜÂ`¤Ü€ìÝÂ@é LۮݠŸâÂ@VÜ ©ÖÂgÔÂàØÂ`àÂàôÙÂ@÷ÖÂ`¼ØÂ`!Ý ÛÂà¹ÎÂ`?ØÂ ÛØÂà‰Ö€“×Â`zã ùÓ ØÂ`¤Ü€ìÝ€Wá€×ÂÀAÕÂàêÂ@ åÂÀÕæÂ€cßÂ`E×Â`]ÓÂÐÂàGáÂ`Â× "âÂÀçã ‹Û€ ÙÂÞÕ .àÂ@VÜÂ`žÝ ¯ÕÂ@©ã€ìÝÂàâÜÂÀŽÝ >ÓÂ`KÖ€ìÝÂà_Ý€ÈãÂÀšÛÂ@åÙÂ%ßÂ`åæÂÀ‚ßÂ@8á€þÚÂÀÚÂÀ;Ö€iÞÂÀ ÞÂõæÂ …ÜÂ@ŒÓ Û€ÏÍ Ѐ@ЀڀÚÂ`æÑÂàÓÂÀ²×Â`˜Þ€iÞ€@ÐÂ@åÙ ^ØÂ`ÎÕÂ`åæÂðÒÂà_Ý ÕÙ€iÞÂ@†ÔÂ@ýÕ€«ÓÂÀ²×Â`Â×Â@˜Ñ RÚ€ÃÏ€ìÝ 8Ô ^ØÂà×Â@JÞÂ@ ÔÂ`àÒ ÏÚÂà Ö RÚÂ`ªÛÂÀSÒ€ÈãÂCÚÂ@VÜ€àß ÝÂàâÜ óÔ€ØÂàèÛ€4Ò€(Ô ÿÒÂ`¶ÙÂÀpâÂ`'Ü€æÞ µÔÂàqÚ DÒÂÀšÛÂ`¼ØÂ@JÞÂ@ÑÂ`QÕ ÿÒÂÀÃé ÙÎÂà}ØÂÀYÑÂÀ.íÂ`žÝ DÒÂØÖ€ÉÎÂàƒ×€(ÔÂgÔÂÀ)Ù ÐÂà`È ©ÖÂ@ÁßÂ7Ü öÞÂàSßÂÀÛŠãÂÀÝÂÀÐÒÂ@zÖÂÀ Ú —Ù pÕÂ`âÂàGáÂà¹Î€vÇÂàBÍÂ@nØÂ@ÕÂ`Â×Â`?ØÂÀ²×€Ö nËÂCÚÂ@3Í FÜÂOØÂ€ÎâÂ`˜ÞÂÀÊÓ€uÜ LÛ d×ÂáÂ`E× …ÜÂà¡Ò RÚ€™ÖÂØÖÂyÑÂ@JÞÂÀ)ÙÂgÔ ØÂ RÚ€ ÙÂ@Õ ‘ÚÂ`°Ú öÞ |Ó FÜÂà­ÐÂ@÷ÖÂ@åÙÂ@ÇÞÂÀ ÚÂÀMÓÂ`¼ØÂ`?ØÂ€oÝ€ØÂàƒ× JÑ 2ÕÂ@VÜ FÜÂ ÛØÂ`’ßÂàúØÂ€¥Ô ÚÂÀÖÑÂÀ‰ÉÂà›Ó ùÓÂaÕ€þÚÂ`KÖÂÀÊÓÂ`žÝÂÀÝ´Ü šÎ€]à ·ÞÂÒ× FÜ "âÂ`àÂ`¶ÙÂ@ÕÂ`ÍÂ@ÙÛÂ@JÞ ‹Û 8Ô á×ÂÀÚÂÀÛÂÆÙ€±Ò€{Û d×€“׀ڠ݀ÖÂàèÛ€þÚ á× FÜÂÀÐÒÂÀ/ØÂüÐÂ@&äÂÀÝÂ`øÎ £×Â@÷Ö …ÜÂ@÷ÖÂ`æÑÂàYÞÂÀÄÔÂ`ÚÓ ½Ý€à߀]àÂ@\ÛÂ`iÑ ˆÑ ÛÂàÔ‘ÍÂÀÛÂÀ²×Â@÷ÖÂöÑÂ`QÕÂ`ªÛÂsÒ€ ÙÂ@ÇÞÂÀ²×ÂÀ)ÙÂÀÛ «à ãÂÀ¬ØÂÀ5×ÂÀùà ‹ÛÂÀGÔ ÝÂàéÂ@©ã€?å ÏÚ€ Ù€ìÝÂ=ÛÂ`¼ØÂ —ÙÂ`ÚÓÂ@€ÕÂÀ_ЄäÂ`†áÂà›ÓÂ@hÙÂ`Þ ‘Ú £×Â@ ÔÂgÔÂ@t×Â`ªÛÂÀÝÂ@žÐÂàMàÂ@JÞÂàâÜ ÿÒÂÀ¬ØÂ€¥ÔÂ@bÚ¨ÞÂÀ¸Ö€±Ò ¯ÕÂ`KÖÂ+Þ ÏÚÂÀ¦Ù PРÙÎÂ@©ãÂàÐßÂ`Â×€Ú "âÂ`’ß 4߀ŸÕ óÔ yÞÂÀ½êÂàâÜ 4߀ÏÍÂÆÙÂÀ”Ü€«ÓÂ`QÕÂÀèÎÂ=ÛÂÀ_РÁÒÂCÚÂà²äÂ@VÜÂÀšÛÂ`¼ØÂ@ëØÂÀšÛÂÀßÂ`¤ÜÂàHÌÂà× PÐÂêÓÂ@µá "âÂÀ¸Ö ÝÂÀXæÂ |ÓÂ`]ÓÂ@JÞÂàÄá ØÂàâÜÂØÖÂ@ÓÜ€“×ÂÀèÎÂ@˜ÑÂgÔÂÀXæÂ@ßÚ ÚÂ`’ß ãÂÆÙ€iÞÂàqÚÂÀMÓÂÀ¬ØÂ`!ÝÂ%ßÂÀeÏÂ`ÎÕÂÀÚÂà¦æÂ´ÜÂàÓ€øÛÂàôÙ Û€ÎâÂ`ÎÕÂÀ¬ØÂ Øã€ØÂàîÚÂÀ|àÂÀXæÂ`ëå€ÚŠãÂÀváÂÀ¸Ö íÕ XÙÂÆÙÂ@ÓÜ€“×ÂÀíâ ‘ÚÂ`'ÜÂ@»àÂÀ²× vÔÂà#ç [ã Ü @ÝÂ`Â× gá¨ÞÂÀÚÂà_Ý 4߀iÞ€Ú íÕÂàwÙÂ@nØÂ@bÚ€àßÂ@JޮݠÜÂ@ßÚÂÀÛÂà‰Ö€ØÂ`žÝ€øÛÂ`˜ÞÂaÕÂ@÷Ö€ÚÂ@JÞ€æÞÂÀeÏ ÕÙÂ@VܺÛÂ`E× RÚ ØÂÐÂ@¤Ï d×ÂÌØÂ ÛØÂÀAÕÂÀ)Ù ÃÜÂ1ÝÂÀÝÂàeÜÂà¡ÒÂ@ÒÂàØÂ€·ÑÂ@ÇÞ€±ÒÂ`žÝÂà‰Ö€òÜÂÀÖÑÂÀ/ØÂÀAÕÂàúØÂàÄá .àÂ`¶ÙÂ`ßÂÀXæÂ€þÚÂÀGÔÂÀAÕÂÌØÂ ˆÑÂÀšÛÂ`KÖ ,ÖÂ@ÓÜÂ`€âÂ@ åÂÀˆÞÂàÜÝ€oÝÂ@çÂ`'Ü ÜÂ`ªÛÂ`âÂÀáäÂÀíâÂ`!ÝÂàSßÂ@µá ‹Û€KãÂÀAÕÂ`¶Ù€×ÂÀÜÂÀ¬ØÂ &×ÂCÚÂ@ëØÂ`Â×Âà¸ã€ÚàÂ`-Û€ØÂ Ù€ÂäÂÀšÛ PÐÂà5äÂÀ”ÜÂàSß ¥áÂ`žÝÂ@ å€Ú´Ü JÑ€¶æÂ€°ç€æÞ€oÝÂ@ñ×Â`QÕÂà Ö ¥á »ÓÂ@bÚ„äÂàÐßÂÀšÛÂÀ²× jÖÂàØÂCÚÂ`Â×Â@\ÛÂÀL蠱߀ ÙÂ`žÝ RÚ çÖÂàMàÂàÜÝÂÀ¸Ö íÕºÛ íÕ 2Õ€à߀æÞÂÀ|à€cßÂÀYÑ€¥ÔÂàÊàÂ`ªÛ ùÓ€uÜ Ù “äÂàèÛÂåÂ`QÕ€oÝ pÕÂ@JÞÂ@PÝ€àßÂàGáÂ`ýâÂCÚ ðßÂÀ¾Õ jÖÂÍÂ@PÝÂàÖÞ€Eä€oÝÂàYÞ jÖ€øÛÂ1ÝÂàMàÂàÕÂ`Â×Â`ëåÂ`!ÝÂÆÙ€¥Ô€òÜ .àÂà¿ÍÂÀ¸ÖÂÀ/ØÂÀ¸ÖÂ`ÞÂÀÝ€ Ù ¯Õ çÖÂÀÜ Ù ½Ý€ÚàÂàÕ€Kã ØãÂ@zÖÂ ÛØÂ Ìå .àÂ1ÝÂÀGÔÂ`iÑÂà¡ÒÂ~åÂ`-ÛÂÀÄÔÂIÙ á×Â` áÂ@ÓÜÂ@’ÒÂÀ_ÐÂÀ¬ØÂ`ÚÓ€{ÛÂ@ßÚÂÀÐÒÂÀÊÓÂ`¼ØÂàÖÞ€ìÝ´ÜÂÀ/ØÂÀÛÂ@ñ×ÂàqÚÂÀŽÝ åÂ@ÙÛÂÀ#ÚÂ`-Û ^ØÂaÕÂ@JÞÂ`!ÝÂÀŽÝÂ@ñ×ÂÀ/ØÂ aâÂ@ ÔÂ@VÜÂ7ÜÂ@hÙÂ@ ÔÂÀ ÚÂÒ×ÂÀ ÚÂÀMÓÂà_Ý ÝÂ=ÛÂ`€âÂ`àÒÂÀˆÞ€WáÂ@>à Oå ŽÐÂ`ËÂIÙ€þÚÂ`ÚÓ 2Õ üÝ€-è ™ãÂà¬åÂÀùàÂàúØÂÀšÛ RÚ€Kã =è …ÜÂ`’߀{ÛÂ`ëå £× FÜÂÀùà ãÂ`!Ý€ìÝ >ÓÂÀ²×ÂÀ5×€"ÕÂÞÕÂ@÷Ö€Eä€]à FÜÂ@ßÚÂ@ÓÜ EñÂàeÜÂ`!ÝÂÀÄÔÂÆÙ :Þ ùÓÂ@8áÂ@ÓÜ€òÜÂÀ ÞÂà•ÔÂgÔÂÀÛÂ@åÙÂ@PÝ &× “äÂ@ÇÞ …ÜÂ`¼ØÂ@t× DÒÂ@PÝ€“×ÂÀß màÂÀ·ëÂÆÙÂ@8áÂÀÛ€Ú®ÝÂ@ÙÛÂÞÕ þç ^ØÂ1ÝÂÀXæÂ äáÂ`'Ü®ÝÂàwÙÂàqÚÂÀšÛ ØÂ JÑÂÀ¸ÖÂêÓ ÉÛÂà×Â@,ãÂàÂÀÜÂÀ¸ÖÂ[Ö ØÂ€ ÙÂ1ÝÂØÖÂ~åÂÀ¦Ù öÞÂ`'Ü€ÉΠ¯ÕÂûå€uÜ€ØÂÀ²×ÂÀ”ÜÂ`àÂÀÉè &×ÂÀšÛÂ@ýÕ€‡Ù ØãÂà/å åÂÀ߀{Û€Ú€“×Â`-ÛÂ@t×Â@åÙ ©Ö€Wá ÛÂäÔ á× XÙÂ@©ã .à —ÙÂÀóáÂàÊà€òÜ ã€òÜÂàwÙ íÕÂÀ/ØÂ màÂÀŽÝ€òÜ 2Õ€ ÙÂÀ;ÖÂ@ÁßÂàØÂ@†ÔÂÀSÒ€{ÛÂ@ÓÜÂàúØÂÀŽÝÂ`°ÚÂàîÚÂ`iÑ .àÂÀ5×€Ö ÝÂ`\èÂÀˆÞ€ ÙÂÀÄÔÂà0ÐÂÏÂÀܠˀ^Ë€4ÒÂÀˆÞ …ÜÂ@zÖÂöÑÂÀ)Ù ‚Ò Ò  ÍÂ@ÓÂ`žÝÂ`°ÚÂÀˆÞÂ`-ÛÂà_ÝÂ`Â×ÂÀ/ØÂ@ÓÜ ÿÒÂ@nØÂ@’ÒÂà;ãÂàúØÂËÂàwÙ ÍР£×Â@zÖÂà$Ò€uÜ€™ÖÂ`ß å ÒÂÀîÍÂ`àÒÂ`ÔÔ ëËÂ@÷ÖÂ[Ö ëËÂ@¤ÏÂ ÛØÂ…Ï á×€4ÒÂÀ)ل䀽РåÌ€óÇÂÀèÎÂ@-ÎÂ@EÊÂ@ÑÂ@ñ×€þÚÂÌØÂ¢ßÂ…ÏÂà¾â ÝÂ@!ÐÂÀ_ÐÂ`KÖÂà³ÏÂÀ;ÖÂÀváÂÀÖÑÂà¿ÍÂË ˆÑÂ`KÖÂêÓ ØÂ ÃÜÂàwÙ€ØÂ[Ö€×ÂÀYÑÂÀAÕÂ1Ý ,ÖÂà*ÑÂ`?ØÂ€Ö ˆÑÂÀMÓ ùÓÂ8ÇÂ@÷Ö #Í  ÑÂà¹ÎÂà;ã€ÎâÂ@nØÂ ÈÂ`E×ÂÏÂ…ÏÂyÑÂ`9ÙÂ`9ÙÂÀqÍÂ`ÔÔÂIÙÂàÂÀ/ØÂà•Ô€Ö€“×Âà0ÐÂöÑÂ@ÈÉÂà³ÏÂàSßÂ[ÖÂ@hÙÂÀâÏÂ[Ö ÙÂàúØÂà¿Í€iÞÂ@’ÒÂ@3ÍÂ@µá LÛ åÌÂ`]Ó€.ÓÂÀAÕÂà‰Ö íÕÂsÒ€vÇÂÀèÎÂ`(ÇÂêÓÂ@ÈÉÂÀúËÂ@÷Ö€øÛÂÀ‚ßÂà<΀.ÓÂ@Ó€4Ò ÁÒÂ`iÑÂÀÖÑ VÏ åÌÂÀ²×€Ú€ÏÍÂöÑ‹ÎÂàËËÂ` áÂà0ÐÂ@ŒÓÂÀMÓ€æÞÂßÀÂÌÂ@Ò€«ÓÂÀGÔÂ@-ΠµÔ€ÖÂ@ÕÂà‰Ö ÇÑ d×€RÍÂ@t× —ÙÂðÒÂ@†ÔÂ@°Í€FÏÂÀeÏÂ`Â×Â`ÈÖÂ@'Ï ŽÐÂ@ªÎ —ÙÂ@\Û€½ÐÂ@ÕÂÀ ÚÂÀÐÒÂ`òÏ ã ÛÂ@Áß »ÓÂ[ÖÂÀ²×ÂÀSÒ€¥ÔÂIÙÂàîÚÂ@DßÂ@€ÕÂ@¤ÏÂ`°ÚÂ@ŒÓÂÀÜРvÔÂ@ÙÛ ÎÂüР/Ë—ÌÂ@˜ÑÂOØÂÀÊÓÂ@t×€‡ÙÂÀSÒÂà‰ÖÂ`E× /ËÂÐÂÀ;ÖÂyÑÂÏÂÀ¾ÕÂ@†Ô  ÑÂà×€ØÂ—Ì€±ÒÂÀÄÔÂyÑ€½ÐÂà$ÒÂà³ÏÂ@¤Ï ùÓ€:ÑÂÀ}ËÂ@åÙÂ`iÑÂ`oÐÂaÕÂàéÆÂÀîÍÂà$ÒÂöÑÂ@÷ÖÂà›Ó °ÀÂàÔÂàwÙ ©ÖÂ@t×ÂÀ¬ØÂ`]Ó Ù€ÖÂàqÚÂà•ÔÂÀšÛ€RÍÂ@ŒÓÂ@ÒÂðÒ JÑ óÔ€×Â`¶Ù€ÖÂà ÖÂàqÚÂÀAÕ íÕÂà³ÏÂäÔÂÀÐÒÂà¡Ò€:ÑÂ@žÐ€]à £×Â`iÑÂ@Ó Û ÿÒÂ`âÂ`ÚÓÂÀ¬ØÂ`3Ú€ÏÍ—ÌÂ@»à Þâ€þÚ€:Ñ ²ÊÂà›Ó Ý DÒÂ`¼ØÂà×Â@-΀ ÙÂÀß ðßÂ`uÏÂ`ŸÈÂÀeÏ ”Ï€òÜÂà Ö ¯ÕÂÀAÕÂ@ëØÂ`ÈÖÂ`þÍ€oÝÂÀ#ÚÂÀMÓ :ÞÂàôÙÂØÖÂÀ”Ü€ Ù ÃÜÂ`ßÂ1ÝÂ`÷ã€ÚÂÀáä yÞ®ÝÂàôÙ€òÜÂÀ¦ÙÂâÂ@©ã€‡ÙÂà‰Ö FÜ€‡Ù€iÞÂÀ ÞÂ@PÝÂ@8áÂÀùàÂÀ Þ€Èã€3ç á× @ÝÂÆÙ ‡æÂ@‹è FÜÂ`¶Ù€iÞ ¥áÂrç åÂ@VÜÂà_Ý aâÂàAâÂ×ë «àÂ@ëØÂrçÂà5äÂÀpâÂ`ŒàÂ`ÔÔ€æÞÂ@ßÚ 〓×Â@\Û yÞÂàÕÂxæÂà¦æÂ@ÍÝÂâÂ`÷ãÂÀÏç –î 䀶æÂlèÂãéÂ@éÂÀçã€WáÂ`ñä ué ŸâÂ@VÜÂàMà€iÞÂ`ÞÂÀóáÂÒ×€ØÂ€°ç çÂxæÂ€?å„äÂÀçã ´éÂÀ±ì€iÞÂ@æÂ sßÂÀíâ€?å€Qâœà®ÝÂlèÂÀˆÞÂ@JÞÂàGá€Âä€WáÂ`žÝ àìÂà çÂ`’ßÂ@êíÂ@êÂ ÆæÂ ±ßÂåÂ@gîÂéè ÀçÂ`bç ÝÂà×Â`ÙèÂ<ð ‡æÂàGáÂ@yëÂàˆëÂ`&ñÂ@çÂâÂÀLè àì€KãÂ@PÝ€ìÝÂàéÂàMàÂá êà€Kã€ÈãÂ@©ã€ÎâÂ`bçÂÀÿßÂÀ‚߀?å ÞâÂ@&äÂåÂ~åÂ`÷ã€?å€ÔáÂâÂ`\èÂÀRç€3çÂ`†áÂâÂ@ åÂCÚÂÀ·ëÂ@ç€?å€?å€ìÂ`DìÂÀ.퀘ë€{Û ië Ôî Ìå gáÂ`VéÂ@å àìÂÀßÂ`ñ䠽ݠöÞ d׺ÛÂ`ÙèÂ@\Û€¶æÂ€ÚàÂ@DßÂ`ñäÂ`VéÂÀRç äÂÀ^åÂÀùàÂ@©ãÂ@»àÂ`JëÂà)æÂ@Ìò€EäÂûåÂ%߀Îâ€3ç ãÂà/åÂÀ ÚÂ`˜Þ€žê .àÂ@2âÂÀíâ Òä€ÂäÂÝêÂ@ßÚÂ`ë值åÂxæÂ€EäÂàS߀ÂäÂàé ‘Ú þç€?åÂ`täÂÀ¦ÙÂà¸ãÂ`ýâÂ@÷Ö (áÂàè€QâÂà¾âÂàè 7é€ìÝ€ÎâÂà”é€3çÂ7ÜÂÀ ÚÂ`åæÂÑìÂÀRç ÌåÂ@‘ç ìêÂà‚ì üÝ d׺ÛÂ`þÍ€c߀iÞÂÀíâÂ`ÞÂ@,ã (á sßÂ`ñä (áÂ@ÙÛÂà5ä€cßÂÀ”ÜÂ@ÕÂ@>à€ÚàÂÀ”Ü Û äဪèÂàGáÂ=Û€3çÂàÜÝÂàÊàÂ`!ÝÂ`â ðßÂ@…éÂà çÂ`ýâÂ`ßÂCÚÂ@ßÚ gá€Îâ€Qâ ·ÞÂÀ5×ÂàYÞ€ÔáÂ@—æÂàôÙ .àÂ`?ØÂÀÜÂÀdäÂÀdäÂàMà€oÝÂàÄáÂ@¯â .àÂÀ¦ÙÂÀ5× öÞ (á€òÜÂ`à üÝ Oå€{ÛÂ`-ÛÂàÕÂá .àÂ@ñ×€oÝ€.Ó üÝÂ1ÝÂåÂáÂÀvá á×Â@ÍÝÂ ÆæÂ LÛ ØãÂ ÛØÂÀŽÝÂà)æÂÀdä ØÂ~å€-è @ÝÂÀ ÞÂNí€9æÂÀŽÝÂ`ßÂà ä€!êÂ`zãÂàÐßÂÀšÛ ÕÙÂ`žÝ ÌåÂàÖÞ FÜÂ@»àÂ`žÝÂ`ýâÂ@ßÚÂ@ å XÙ (áÂÀçãÂ`ýâÂÀ‚ß Cç FÜ :ÞÂ@2âÂ`˜ÞÂ@Áß ÌåÂ@PÝÂÀ”ÜÂÀváÂ`'ÜÂ@>à´ÜÂ`¶ÙÂfé€ÖÂàeÜÂÀÚ d×Â`àÂ`˜ÞÂCÚÂàkÛ ÝÂ` áÂàAâ ‹ÛÂ[Ö€KãÂ~åÂà ëÂÀÿß´ÜÂ`’ßÂÀjãÂÀóá ðßÂÀíâÂàÂ@DßÂ`¤Ü¨Þ€'éÂ`âÂÀÚÂ%ßÂÀÉè øè€uÜÂÀMÓÂàèÛÂàÂ`ŒàÂÀ߀?åÂÀˆÞÂÀß´ÜÂ+Þ Ù€]àÂ@ÓÜ üÝ ãÂÀˆÞÂÀ/ØÂàÄáÂÀ¬ØÂÀ¸ÖÂ`ŒàÂCÚÂ@2âÂ`!ÝÂÀ)ÙÂ`3ÚÂ@Ò …Ü€ØÂ€òÜ sß ÕÙ€ŸÕÂ@ÓÜ ^ØÂ ØÂ€]à€ÂäÂÀÛÂÀí–×Â@µáÂ=Û 8ÔÂ@ÁßÂàSßÂàÖÞ ½Ý€iÞÂ@—æÂÀpâÂ@ÓÜÂÆÙ íÕÂ`¤ÜÂ`€âÂÀÝÂÀ|à€oÝÂ@PÝÂ@,ãÂ`ޠ݀øÛÂ`àÒÂ`iÑ jÖÂÀ²× vÔÂaÕÂàÓ€½Ð€ÖÂ@nØÂÀÛåÂ@ÁßÂÀ/ØÂ+ÞÂ`E×ÂÀ¾Õ 2ÕÂÀ²×ÂÀ#ÚÂ1ÝÂÀùà€¶æÂàkÛÂ@bÚÂ`hæÂ@ÙÛÂ@PÝÂ@Áß 4ßÂ@ÇÞÂàôÙÂÀÜРùÓ gáÂàeÜÂàMàÂ@VÜ ‹Û d×Â@žÐÂÀÄÔÂàÐßÂ@ñ×ÂÀ/ØÂÀ)Ù LÛÂ`-Û€«ÓÂàeÜÂ`òÏÂàîÚ JÑÂ@ÔÇ ¶¿Â ÛØÂ…Ï ÇÂ@bÚ€‡Ù FÜÂ@©ãÂ@hÙ ÙΠß͠ŀoÝ ·ÞÂà›ÓÂÀ¬ØÂ€½ÐÂ%߀þÚ d×€(ÔÂà­ÐÂà¿Í sßÂ`ÔÔ€Ú€þÚÂÀSÒÂÀè΀ØÂ@bÚÂ@÷ÖÂÀ;ÖÂ`°ÚÂàÔÂU×ÂÀ;ÖÂ@¶Ì€òÜÂIÙ€ÚÂ=ÛÂà›ÓÂU× RÚ ˆÑÂÀÜРDÒÂ`9Ù màÂà¡Ò óÔÂ@˜ÑÂ@PÝ µÔÂ@÷ÖÂ@nØÂ€oÝ @ÝÂàƒ×Â`ªÛ€×ÂàÕÂÀ/ØÂ ŽÐ  æÂ`E×ÂÀÐÒÂÀùàÂ`oРØÂàØÂÀÜÐÂ@ÍÝÂU× …ÜÂÀÜÂ`'ÜÂCÚÂ@åÙ Cç€]à µÔÂ@ßÚ–áÂàîÚÂ`ªÛÂ`iÑÂÀGÔÂÀÊÓ€óÇÂ`cÒÂÀ;Ö ØÂ7Ü–áÂ`E×ÂÀwÌ€·Ñ 8ÔÂàqÚ€:Ñ€Ö€ÚÂÀùàÂ`WÔÂ@ªÎ ÙÎÂÆÙÂÀŽÝÂÀAÕ€ØÂ …ÜÂ@\ÛÂOØÂ@åÙ€(ÔºÛÂ`°ÚÂäÔÂðÒ ÓÏÂ@3Í XÙÂ`°ÚÂIÙ´ÜÂ`ÚÓ¯ÈÂ`ÔÔÂ`òÏÂÀÜР»ÓÂ@ÓÂà}ØÂ ÛØÂ XÙÂsÒÂ`QÕ€{ÛÂàkÛ€øÛÂÀ¸ÖÂÀÜÂÀYÑÂmÓ€·ÑÂÀ)Ù€‡ÙÂ@ ÔÂÀGÔÂ@\Û …ÜÂ`iÑÂ`{΀¥ÔÂ`3ÚÂ@Õ >ÓÂ`æÑÂÀùàÂÀ”Ü€¥Ô PÐÂ%ßÂÀáäÂ`¤ÜÂà§ÑÂ`!ÝÂ@åÂÀpâÂ7Ü ÇÑ ‚ÒÂ@t×ÂÒ×ÂÀ#ÚÂÀpâÂ@>àÂ@t×ÂàÖÞÂ@ÑÂ ÛØÂÀdäÂÀ¸Ö ÃÜÂÀ)ÙÂÀ¬ØÂ´ÜÂ7ÜÂ@Jޮ݀"Õ tÊÂÀ#Ú ÜÂU× ŸâÂ`?ØÂàÕÂà$Ò ÜÂàÔÂ`9ÙÂgÔ€“× ÞâÂ`ŒàÂ`€â€‡Ù€·ÑÂàÕÂ`˜ÞÂ@Õ .àÂÀÚÂÀ²×ÂÀÚÂà*ÑÂ@ÓÜÂÀÏç ÕÙ€‡Ù jÖÂÆÙÂ`åæÂà}ØÂÀ‚ßÂ@nØÂ`KÖÂ`¶ÙÂØÖ€ŸÕ ·ÞÂ@åÙ€ÚÂÀâÏÂ@¯âÂ@JÞÂ@åÙÂ@bÚÂ`žÝ€þÚÂÀ‚ßÂ`àÂÀ¬ØÂ çÖÂ@ßÚ€àßÂ`ÙèÂÆÙÂÀŽÝ á×€“× FÜÂ`E×ÂàqÚ€?åÂ`WÔÂà äÂOØÂ ã€ØÂÀùàÂ`KÖÂõæÂ` áÂ`†á ©ÖÂàYÞÂÀçãÂ@æÂ [ã üÝ @ÝÂàÜÝÂ@¯âÂàMàÂà¾âÂ@æÂœàÂ@JÞ€Ú€ÂäÂÀ^åÂÀ‚߀íÂ@—æÂ uéÂÀÜ ÉÛÂØÖÂ`åæÂ@»àÂ@€ÕÂ1ÝÂ@†Ô pÕÂÀÜ  æÂ€Qâ [ãÂ@ÓÜÂ@µá ºè€ìÂ`nåœàÂ`»íÂ`'Ü€ÚÂ=Û >Ó (á ÌåÂà_ÝÂ@µá ÛÂ@ÁßÂ`z〱ÒÂ`˜ÞŠãÂ%ß RÚÂÀ¦Ù€ÚàÂà#çÂÀpâÂ@æÂ@çÂ@µáÂà¾âÂàqÚ€ÎâÂàÜÝ yÞ ùÓ —Ù€™Ö RÚÂ@ëØÂÀ¾ÕÂÀŽÝÂÒ×€{ÛÂÀ¦Ù màÂà}ØÂ€½ÐÂàwÙ€ÎâÂ@nØÂ@µáÂàGá€ÂäÂà¦æÂ–á ·ÞÂ`E×Â@bÚÂÀÜÂaÕÂ`ëåÂ`VéÂ`nå  æÂ`-ÛÂÀÛÂàGáÂ`’ß ^ØÂ@ÇÞ€QâÂÀ|àÂ`ýâÂ`à öÞÂà*ÑÂ@ Ô ãÂÀíâÂÀÛåÂ@nØÂ@ÇÞ XÙŠãÂ`KÖ Ÿâ€uÜÂ`ÈÖ ÕÙ ½ÝÂàeÜ &×Â`ÔÔ RÚÂÒ× ˆÑ–áÂÀóá ±ßÂ@8á€æÞÂ`žÝÂÀŽÝÂ`žÝ ÏÚÂðÒ ÃÜÂÀ)Ù 4ß ÜÂÀ²× aâÂ@ÁßÂ`†áÂ@ýÕ FܺÛÂÀvá FÜÂàÊà´ÜÂ@ÁßÂÀFé€æÞ´Ü IæÂÀóá ÏÚÂå ÏÚ ÇÑÂIÙÂà}ØÂÀ¸ÖÂ@£ä ,Ö€™ÖÂ@ñ×ÂäÔÂ`KÖ€à߀iÞ @Ý RÚ Ü öÞ @Ý FÜ€ìÝÂ`ÞÂ@»àÂàծݠsßÂ@©ã€{ÛºÛÂCÚ .àÂ@åÙÂ@VÜ€ØÂÀÜ€iÞ€WáÂÀ Þ€±Ò´Ü€¥ÔÂÆÙ öÞÂ`¶Ù LÛ :ÞÂà ÖÂâ ÜÂ`Œà–áÂ@JÞ€‡ÙÂ`?ØÂÀ/ØÂ`'ÜÂ@£äÂÀ ÞÂ@ÙÛÂÀ)ÙÂ`°ÚÂ@÷ÖÂàƒ× »ÓÂ@ÙÛÂ@ÇÞÂ@ÙÛ€ØÂÀ¸ÖÂà§ÑÂÀ/ØÂ pÕ€ÚÂ@’Ò€(ÔÂ`ÍÂ@ÍÝÂÀ¬ØÂ7ÜÂ@ ÔÂU× ØÂ@>àÂàîÚÂÀÉèÂà}ØÂ@zÖÂà ÖÂà­ÐÂà§ÑÂàÕ€¥ÔÂà×Â`Â×ÂàúØÂ@bÚÂ`âÂàâÜÂ`†áÂÒ×Âà›Ó ÍЀuÜ XÙÂ`-ÛÂàÄáÂÀ5×€¥ÔÂàÜÝÂ@VÜ d×ÂàÄáÂ@ ÔÂ`¼ØÂ€±Ò€™Ö d×ÂÀ”Ü€XÌÂ@ßÚÂÀ¦Ù€cß 8ÔÂ`WÔ€‡ÙÂ`þÍ€ØÂàØÂ &×ÂÀ¸Ö µÔÂ@ñ×Â@ÁßÂ ÛØÂ@ýÕÂ@t×€uÜÂÆÙÂâÂÀùàÂ@D߀àßÂ@hÙ€ÚÂ1ÝÂCÚÂà6Ï jÖ€]àÂÀÿß ÏÚÂÀ5×Âà²ä :Þ ØÂ@bÚ :ÞÂÀpâ€.ÓÂåÂÀváÂ`KÖÂ@ÁߴܨÞÂÀAÕÂ`?ØÂ öÞ€{Û ,Ö óÔÂàeÜ £×ÂÀ Ú€àßÂ`'ÜÂ@ÓÜÂàÄáÂ`Â×ÂÀpâ çÂÀß êà ÜÂ`KÖÂâÂÀ|àÂ@t×€·ÑÂ@VÜ€WáÂ@bÚÂàâÜÂ@D߀ڢߠØÂ€cß Ý yÞÂ`àÒÂ ÆæÂÀ²×ÂâÂàèÛÂ@ÍÝÂÀ¦ÙÂÀšÛÂ`žÝÂ`˜ÞÂ@ å€ÎâÂàôÙ€ÎâÂàMàÂ@ÇÞÂxæÂÀ²×Âä íÕÂ`øÎÂÀ¦ÙÂaÕÂÀ¦Ù ÿÒÂ@ÇÞÂ`Þ€ÂäÂÀdä ÓÏ ÜÂ`Þ .àÂ@ßÚÂ@»àÂå «à ÁÒ ”Ï€¼å€×–áÂ@ÓÜ á×€cßÂÀ¸Ö€½ÐÂ`Â× ¯ÕÂmÓ ¥á¢ß jÖÂ`æÑÂ`ÈÖ üÝÂ@µáÂaÕÂÀ¾ÕÂà ÖÂ`ÎÕÂ ÛØÂ€Eä yÞÂàê€Wá @ÝÂàƒ×Â`’ßÂ`¼ØÂ@£äÂ`ßÂÀ¬ØÂÀÐÒ ÏÚÂ@ÍÝÂ@µá€òÜÂsÒÂCÚÂÀ”Ü yÞÂÀ Ú ©Ö íÕ ÜÂà¾âÂà;ã ‘ÚÂ7ÜÂ@2â .àÂÀÚÂ@\ÛÂÀÛÂÀŽÝ d×€Wᠥ᠋۠«à ŸâÂÀ¦ÙÂÀGÔÂ@PÝÂàqÚ€ŸÕ …Ü€ÚàÂà×€ÂäÂà×Â@åÂ@åÙÂaÕ ØÂÀ‚ßÂàƒ×Â@\ÛÂ@ýÕÂÀ²×Â@Õ ÏÚŠãÂ`÷ã (á @Ý€žê€oÝÂ@ÇÞ vÔÂ`°ÚÂÀÿßÂ`¤Ü€ØÂ€øÛÂ`¼ØÂàúØÂÀßÂ`†á–áÂ`'Ü€ÈãÂ7Ü€þÚ ØÂ`9ÙÂà¾â (áÂ`-Û€9æÂäÔ€ÃÏÂàMàÂàîÚÂàÔÂ@ñ×Â@åÙ bÍ ÝÂàèÛ€ìÝÂ@åÂ@žÐ Ü ÚÂÀ;ÖÂàƒ×€]à ÝÂ@ŒÓÂÐÂ`‡ÌÂàqÚ€oݢߠpÕÂ@†Ô ãÂÀ Ú€uÜÂ[ÖÂ@nØÂ 4߀4Ò€ÖÂ@€ÕÂÀGÔÂ`ÈÖÂÀ¬ØÂöÑÂ@nØÂ€]àÂ@ÇÞ vÔ £×Â`!ÝÂ`3ÚÂ`æÑÂ@>àÂ@ÍÝÂ@ÁßÂ`Â×€™Ö Ò€LÎÂ`ªÛÂ`¶ÙÂÀ ÞÂàeÜ 4ßÂàØÂ€‡Ù®ÝÂàÜÝ€øÛÂ`'Ü€Ú óÔ öÞÂ@÷Ö€ Ù ¦ÌÂ`ÔÔ€àßÂ1Ý ‹Û yÞÂÀ#ÚÂàkÛÂ@ŒÓÂàØÂ`-ÛÂ@åÙÂÀÚÂà ÖÂ`žÝÂ`ÔÔ @ÝÂÀ²× DÒÂðÒÂ`uÏÂàÜÝÂàîÚÂ@>àÂàÜÝ´ÜÂàÜÝÂ`߀×ÂÌØÂ@t×Â@QÈ µÔÂ@,ãÂ`ŒàÂ`žÝ ÐÂÀ¬ØÂ@åÂ@åÙ¢ßÂà¸ãÂ`QÕÂ`ìРÁÒÂ[Ö€.Ó ÇÑÂÏ€±Ò Ý€uÜÂÆÙÂÆÙÂÒ× d×Â`3ÚÂÀ‚ßÂ@Dß —Ù Ý çÂ%ßÂ`'ÜÂ`!Ý€'é ‹Û€Âä …ÜÂ%ßÂàwÙÂÀÝ êà€{Û XÙ„ä Ù€ÖÂOØÂÞÕÂ@PÝÂà¦æÂ@ßÚ ÕÙÂÀ¾Õ€Úà€¥ÔÂðÒ 4߀ÚÂ@ Ô pÕÂðÒÂ1Ý ÒÂ@hÙ £×Âà}ØÂ`WÔÂàôÙ€"Õ ½Ý ÏÂ@ÍÝÂÀkÎÂ@JÞ ©ÖÂ`!ÝÂàƒ×Â`9ÙÂ@åÙ´ÜÂ`ýâÂ`cÒÂÀ²×ÂÀ²×ÂðÒÂÀ;Ö ÃÜÂ`¶Ù ÛÂÀÚ ð߀iÞ  ÑÂ`ŒàÂ@VÜ XÙÂ@ÒÂÀMÓ XÙÂ@JÞÂ`?ØÂ ÍР—Ù€øÛÂ@,ãÂÀ¬ØÂÀ²×ÂÐÂ7ÜÂÀ²×€(ÔÂÀ/ØÂ@¯âÂ`9ÙÂà*ÑÂ`ËÂÀ¾ÕÂ=Û€™Ö´ÜÂàîÚÂgÔÂ7Ü€ìÝ ·ÞÂ`¶Ù€Ú€Úà€QâÂÀÊÓ £×ÂÀqÍ  Í µÔÂÀ”ÜÂà‰ÖÂÞÕÂà§Ñ .àÂ@VÜÂàBÍÂЀÚÂà0ÐÂÌØÂ€ÚÂ ÛØÂ€çÉÂÀ²×Â`]Ó¢ßÂàÖÞÂ`ÈÖÂaÕ€“×Â`ÎÕÂ7Ü ÛÂà‰ÖÂ@ÓÜ€EäÂ@Áß d× ¯ÕÂOØÂ@˜Ñ ÿÒÂÀMÓ ØÂ@˜Ñ ^ØÂ@˜ÑÂU×ÂØÖ  Ñ€òÜ …ÜÂ7ÜÂ`ÚÓÂÀšÛŠãÂ@¶ÌÂ`3Ú€«ÓÂ@&äÂ@sìÂ@÷ÖÂ`Œà ‘ÚÂ=Û ÛÂÀ)Ù€RÍ ÎÂ`àÒÂÏ€oÝÂàÕÂàÂ[Ö®ÝÂàÖÞ€™ÖÂ`ÚÓÂ@\Û€«ÓÂ@»à€?å€uÜÂàAâÂàƒ× ^ØÂ@>àÂ`ÈÖÂÀÜ´ÜÂ@ßÚ€uÜÂ`-Û ^ØÂà‰Ö€ÉÎÂÀ¸ÖÂ@ßÚÂàèÛ€"Õ€ØÂÀ”Ü€ØÂ@€Õ ÙÂ@÷ÖÂ`?ØÂÀÊÓ )ÌÂðÒ€™ÖÂàwÙ€É΀RÍÂÀ²×ÂÀùàÂÀßÂ@’ÒÂ@\ÛÂÀAÕÂÀMÓ µÔ ,ÖÂà0ÐÂÀËÂ`ìЀ4Ò€×Â@VÜÂ@!ÐÂ@÷ÖÂÀ Ú ÃÜ 4ß ØÂÀ/ØÂIÙÂÀÛåÂaÕÂêÓ ÒÂÀèÎÂ@¤Ï yÞÂ`ÔÔÂ`KÖÂà³ÏÂ@Ó€{ÛÂà_ÝÂÀ ÞÂäÔÂ…ÏÂ@t×Â@¤Ï ÇÑ€ØÂ€ìÝÂàwÙÂ[ÖÂà~ÃÂÀÚ (áÂ ÛØÂ€øÛÂÀ”ÜÂÀÖÑÂàúØÂ ÍРÍРˆÑÂ`™É€"Õ€ ÙÂàèÛ€"Õ ÓÏÂÀÝÂ@ÍÝÂáÂÀAÕÂ`Â×€™ÖÂÀÐÒ´ÜÂÀÖÑÂ` Ì€™ÖÂäÔ ˆÑ€ÏÍ óÔ RÚ€™ÖÂÀ¸Ö ÉÛÂà<Π»Ó ÏÚ íÕÂÀÐÒÂàÔÂà›Ó çÖÂà*Ñ€áÊÂÀ/ØÂ@€ÕÂ ÛØÂàwÙÂ@˜ÑÂÞÕ€ØÂ@nØÂ®Ý ‘ÚÂ@ýÕÂÀ²× —ÙÂ@t×ÂàeÜÂÀÛÂÀ#ÚÂ@€ÕÂà× LÛ€Ö ,Ö Ë VÏÂÀˆÞÂ`KÖÂOØÂ ÁÒÂ`WÔÂ`ÔÔÂ`oÐÂàÕÂ@zÖ "âÂàÜÝÂ7ÜÂ`àÒ€{ÛÂ`9ÙÂsÒÂ@ÑÂà•Ô€æÞ ËÂ@-ÎÂ@ÓÂÀÜРíÕÂàkÛ DÒÂ@¤ÏÂ`Â×Â@ñ×ÂÀËÂ`uÏ€XÌ ΠjÖÂâ ‹ÛÂgÔÂÀšÛ€ìÝÂ`KÖ¯ÈÂÀšÛÂ@¶ÌÂ`ÚÓ€4ÒÂ@ýÕÂà¡ÒÂ`‡ÌÂÀ ÞÂ`¶Ù »Ó€þÚÂ@ŒÓÂ@°ÍÂà¡ÒÂàeÜÂ[Ö€:ÑÂÞÕ ©ÖÂà‰Ö€.Ó€(ÔÂÀÚÂ@\Û DÒÂ@\ÛÂ`¼ØÂ ‹ÛÂ@’Ò «à Û€þÚÂ@êÂ`’ßÂÀîÍÂÀÈ 5ÊÂàãÇÂ`{ÎÂ`ÔÔ gá€øÛ ØÂ åÌÂÞÕ€{Û á×Â@iÄ€ÖÂà×Â`]ÓÂ@\ÛÂà6ÏÂöÑ€ØÂ :ÞÂ`žÝÂ`QÕÂ ÛØÂ€ÎâÂ@µáÂÀ;ÖÂà*Ñ pÕ ÚÂ@÷ÖÂOØÂ€±Ò ÁÒ€øÛ€iÞÂ`KÖÂ@hÙÂ…ÏÂ`àÒÂðÒÂÆÙÂ`¤ÜÂOØÂ`E× ðßÂ@nØÂÀYÑÂ`Â×Â@¶ÌÂÀÊÓ £×ÂÀîÍÂaÕ€¥Ô òéÂ`ªÛÂ`ÞÂà;ã XÙÂ@÷ÖÂÌØÂ@t×Â`?ØÂ`9ÙÂ`Þ€ÚàÂàƒ×€‡Ù€±ÒÂ@ÙÛÂÀ|à ÃÜÂ`°ÚÂ@÷Ö ,ÖÂÀ)Ù ©ÖÂ@žÐÂ@hÙÂàGáÂØÖÂ`nåÂàÕ FÜÂÀ¦Ù RÚ€ ÙÂÒ×ÂÀGÔ d×ÂCÚÂàÕÂà$ÒÂÀ¦Ù ÜÂ+ÞÂ%ßÂÀÜ pÕÂ`¼ØÂÀíâÂûå ãÂ@hÙ LÛ sßÂ`¤Ü ÉÛÂ+ÞÂ`'Ü Òä 8Ô€]àÂÀ¦ÙÂ@ÙÛ FÜÂ@ÓÜ äÂà”逸ÛÂ`žÝÂ`¶ÙÂÀ5×Â`9ÙÂ`QÕÂûåÂ`žÝÂàƒ× ðßÂ@ÍÝÂÆÙ€Qâ ½ÝÂCÚ çÖÂàâÜ @ÝÂ`QÕÂ`àÒÂà¸ãÂOØÂ@ñ×Âà_Ý€9æÂ ´éÂÀ”Ü ÁÒ€Ú€™ÖÂ`9Ù :ÞÂ@¯âÂ`¶ÙÂÀ/ØÂ@zÖÂ`â€cßÂÌØÂ íÕ ËÂ`'Ü ÚÂ@ýÕ ÝÂàMàÂ`æÑ€‡Ù gáÂ`KÖ€òÜ€àß %ìÂ@ÍÝ€uÜÂàúØÂ bÍ ÉÛÂÀ¸Ö€9æÂ@2â ¯Õ ‘ÚÂàqÚÂ@»àÂÀ¾ÕÂàÂàÔÂðÒ ÙÂ`9ÙÂ`ÈÖÂüÐÂ`âÂàÊàÂ`ñäÂÀAÕ .àÂÀÛÂ@t×€øÛÂ@VܨÞÂ`ªÛ  ÑÂÀ/ØÂ€ØÂ€"ÕÂ`9ÙÂ@÷ÖÂàƒ× êàÂ`ñ䀟ÕÂÀ;ÖÂÀ#ÚÂàâÜ DÒ \ÎÂÀ/ØÂ@ßÚÂÀ²×Â@†Ô yÞÂ@ÍÝÂ@ñ×ÂÀ_Р«àÂ@ßÚÂà}ØÂà€ Ù XÙÂàMàÂ=Û [ãÂÀ Ú€“×€ØÂ@PÝÂïçÂàÜÝÂÀ¾ÕÂ@ÓÜÂàÕ 4ßÂàúØÂ@ëØÂ ýÈ€ŸÕœàÂÀŽÝÂÀ;ÖÂ@åÙ€Kã€àßÂàâÜ ©ÖÂ`E×ÂÀpâÂàÕ€·ÑÂ=ÛÂÀÝ€Eä€òÜÂàúØÂ€±ÒÂÀÐÒÂáÂÀ|à ØãÂàGáÂ`’ߨޠ"âÂÀšÛ µÔÂà¸ãÂÀ¬ØÂCÚÂ@ åÂ@\Û€ÏÍÂ@'ÏÂOØÂ`¤Ü £×ÂÀ”ÜÂàGáÂ@ëØÂ RÚ ØÂÀAÕÂ@t×ÂgÔÂ@ÍÝ€àßÂ`ßç ÚÂ@ ÔÂÀ;Ö€ ÙÂ@Õ ¯ÕÂàÜÝÂàƒ× ÛÂ@ÁßÂ@ÁßÂà üÝÂ@'Ï óÔÂ`]Ó€{ÛÂ@nØÂ€òÜÂ` áÂàeÜÂ`'Ü VÏ ùÓ´ÜÂ@Ò€@ÐÂà‰ÖÂ@ÇÞ ØãÂà›ÓÂ1Ý mà ÛÂ@ßÚÂÀáäÂ@\ÛÂàèÛ€oÝÂÀ Ú ±ßÂ`E×Â`ÎÕÂà5äÂ@Õ€™Ö€FÏÂ`àÒÂÏÂ`WÔ  ÍÂ@ÕÂÀçãÂ`¤Ü »Ó íÕ€(ÔÂÀ ÚÂÀ;Ö ^ØÂ`]Ó “䀙֠^ØÂÀ ÚÂ@ýÕÂ@ßÚ ·Þ íÕÂÆÙ ÇÑ ØÂ€ÕÌÂ`¤ÜÂàkÛÂÀÊÓÂ@ÈÉÂàÔÂ`9ÙÂäÔÂ`¶Ù›õÂ`F &× [ã€ØÂÀÖÑÂàÔÂÀ Ú åÌÂ@ÙÛ€ÃÏÂ`ÚÓÂÀkΠ‚Ò RÚ ÛÂ`¼ØÂgÔÂà}ØÂ@ÁßÂ ÛØÂ pÕ ÉÛÂ@åÂCÚÂ`QÕ€Ú "âÂàeÜÂÀ¾ÕÂ`â ÃÜ€uÜÂ@ßÚÂ`ÎÕÂÀšÛÂàÐß–áŠã ½ÝÂ`ëå€Úà€æÞÂÀ|àÂÀùàÂ@\ÛÂ`ýâ @ÝÂÀ²×ÂlèÂÀíâ€Úà€Ú aâ @ÝÂÀjãÂÀçã Ý Û„ä FÜÂàAâ€ìÝÂ@2âÂàGá€ÔáÂ@,ãÂà§ÑÂàMà€¶æÂéèÂ@æÂÀ½êÂ@>àÂrçÂõæÂ ŸâÂÀŸïÂÀçãÂ`zãÂÀ±ìÂrçÂàÊà gáÂ@DßÂÀÉè–áÂÀùàÂ`Ùè ãÂàÄá€þÚÂ@>àÂ@»à gá ±ßÂ@JÞÂÀíâ ÒäÂ@»à äá {è êà þçÂà5ä äÂÀ¦ÙÂ`2ï®Ý Àç ŠðÂà²äÂÀ(îÂ`ëå cìÂ`VéÂÀ”ÜÂr瀤éÂÀ^åÂ`\èÂ`zã =è€òÜÂ@ÇÞÂÀíâÂ@ðìÂ@æÂ ÃÜÂÀÝ åÂÀÉèÂ`€â +ëÂ`bçÂÀ½êÂ@‹èÂ`8îÂ@ê Þâ ãÂàMà€ªèÂ`ßçÂàvîŠãÂ`åæÂ 4߀QâÂà#ç¡ôÂ@ åÂ@ÁßÂÀŸïÂIÙ yÞ€?å [ã€'éÂ`åæÂféÂ`÷ãÂ@äî ã ¢ìÂ~åÂÀáäÂ`Áì ï iëÂ@PÝÂ@bÚÂÀñ rô iëÂàìÂàjð çÂàùíÂ@‘çÂà¬å oêÂNíÂ@éÂ@ÇÞÂ@èÂ`JëÂÀñÂ`Áì ÌåÂZëÂ@瀶æÂàMàÂ`’ßÂ`ë倘ëÂ@ÍÝÂÀdäÂàèÂÀRçÂËíÂ`hæÂ ië IæÂ€9æÂ Àç çÂ`>íÂ`ô€íÂïçÂ@‘ç€Eä «à€?åÂàMàÂ`Çë gáÂà²ä ]í Øã þç€ÈãÂàÐßÂ`àÂàâÜÂÀ ÚÂàkÛÂ`9ÙÂ@ÙÛÂ`ÞÂ`Œà–áÂ@æÂ`\è Oå€EäÂ`ñäÂ@èÂà5äÂ ÆæÂ€?åÂàâÜ€ìÝ€ÈãÂféÂàê€íÂÀXæÂŠãÂÀÝ€Kã ·ÞÂ`ßÂ@äî ãÂà ç ‹ÛÂÀ:ëÂ@æÂàÄáÂàôÙÂÀÿßÂ`Â×Â@ñ×ÂÒ× LÛ üÝÂ1Ý ã ãÂ`oÐÂà¾âÂ`à€Úà€Ö€uÜ ÝÂ`nåÂÀ|à XÙÂ@£äÂ`3Ú€à߀3ç€]àÂàÊà RÚ€9æÂ Ý FÜ€E䀸ÛÂÀÝÂà‰Ö cìÂ@,ãÂ`?ØÂ€oÝÂ@µáÂ+ÞÂâÂ@bÚÂàØÂ`¼ØÂ´Ü€æÞ€Èã€@ЀÂäÂàÊà€KãÂàèÛ€ØÂ€òÜ€Ö ÃÜÂ`°ÚÂ@†Ô€øÛÂàwÙ ‹Û€Âä ØÂÀ¸ÖÂ`ªÛ ãÂÀÜ€Ú€ØÂà‰ÖÂäÔÂà¾âÂ@8á ðßÂ@>àÂÀ²×Â@ëØÂ á×Â`'Ü ©Ö :ÞÂàîÚÂ`¶Ù µÔÂÀíâÂÀjãÂIÙ ÁÒ ÕÙÂ`\èÂ@ÓÜÂ@>àÂ@ÍÝÂ` á–áÂ`'Ü€øÛ ”ÏÂ@JÞÂ`!ÝÂ@8áÂ`KÖ |ÓÂ`KÖ€.Ó€ÖÂ@ëØÂ üÝ€™ÖÂ`iÑ®ÝÂ@Õ€òÜÂÒ×Â@ÓÂ@µáÂÆÙÂà}ØÂÒ×ÂÀSÒÂOØÂ@hÙÂ7Ü€“× ÿÒ ½ÝÂÀ”ÜÂÀwÌÂ`ÔÔ ©Ö RÚÂÀçãÂàôÙ "âÂáÂÀèΠñÊÂ`KÖÂ@ÓÂ@÷ÖÂÀ)Ù ÚÂOØÂà•Ô ¯ÕÂ`Œà µÔÂ@ŒÓ€]à®ÝÂÀ;ÖÂ@hÙÂàâÜ€à߀EäÂ`ëå üÝ (á€ÂäÂ`!Ý FÜ ¢ìÂ`\è sßÂÀ¾ÕÂ`÷ã @ÝÂ@Ó ÍÐÂÀÄÔÂ@ýÕÂÀ¦ÙÂ`˜ÞÂ`ÓéÂÀ|àÂ`Â× ÝÂÀˆÞ FÜÂÀváÂÀjã UäÂàÜÝÂÆÙÂ@ÇÞ |ÓÂ1ÝÂàØÂ@ÍÝÂ`3ÚÂÀ5×–áÂàÂÀ^åÂU×ÂàôÙ€ŸÕÂàÐßÂ`3ÚÂàšèÂ`ßÂ@÷Ö´ÜÂàMàÂà×€ØÂ .à ØÂCÚ á×Â`ÈÖÂ@\ÛÂÀšÛÂ`òÏÂ@ñ×  ÑÂ`QÕÂàôÙ 4ß ±ßÂêÓÂÀÚÂá ØÂØÖ Ù΀FÏÂÀ¸Ö€ŸÕ€]à Ý d× êàÂ=ÛÂ`¶Ù€¥ÔÂÞÕÂ@\Û€‡Ù sßÂÀçãÂÀÛÂàÖÞ åÂ@bÚÂ`-ÛÂäÔÂÀÖÑÂÀ¬ØÂ …ÜÂàAâ€øÛÂ`!ÝÂà³Ï ^ØÂ€ŸÕ€òÜÂ`Œà ^ØÂ ÁÒ á×Â`’߀ØÂÀˆÞ ÚÂ`ìÐÂÀÚÂà×€ÎâÂ@,ãÂÀdä ‹Û€×ÂÀ‚ßÂ@ñ×€æÞÂàÖÞÂÀÃéÂà}ØÂÀÚÂ@D߀ ÙÂ`¼ØÂàqÚÂÀ ÞÂÀ Ú [ã€×Â`-Û€øÛÂÀRçÂ`ªÛÂÀ;Ö çÖ€WáÂ@VÜÂÀ/ØÂàYÞÂÀÜÂÀ5×ÂàÖÞÂ=Û ·Þ–မÖÂ@ÁßÂ=ÛÂàâÜÂ@ Ô ÇÑÂàYÞÂ@åÙÂÌØÂàÄáÂ`ßÂ`ªÛÂ`âÂ`¼ØÂ@÷ÖÂ@æÂ@2â [ã ÚÂ@nØÂ öÞÂ`†áÂÀçãÂ`'Ü ÃÜÂÀíâÂÀÜÐÂà «àÂ`3ÚÂêÓÂÀAÕÂ`¤Ü¢ß€ìÝ ¯Õ ÙÂ@ÍÝÂmÓÂÀÊÓÂ@åÙÂ%ßÂÀóá€WáÂÍ 8ÔÂàYÞÂ`Â× &×Âà ½ÝÂmÓÂàôÙÂ@¯â ½ÝÂ+ÞÂÀÜÂ@hÙ€ ÙÂÀŽÝÂÀß gá ÃÜÂÆÙÂàÂ`ýâ€ÈãÂ@8áÂ`¼ØÂ%߀×Âà ÖÂ@8áÂÀóá LÛ€iÞ —ÙÂÀÛÂàÐßÂÀ|àÂÀXæÂ@\Û€ÂäÂàÕÂÀ¸Ö aâÂÀÚÂ`¶ÙÂ䀪è€{ÛÂâÂ@å€3çÂ@‹è¨ÞÂÀˆÞ€-èÂ@üê€uÜœàºÛÂ`\èÂ`\è …ÜÂ`täÂÀÝÂ@JÞ ,Ö [ãÂÌØÂ ã XÙÂ7ÜÂ@»àÂ`ñäÂÀ Þ ¢ìÂÀpâÂ`¶Ù ÿÒÂÀùà¨ÞÂâ Ú Ú€òÜ€¥ÔÂ@»àÂä®ÝÂÌØÂ á×ÂàÂ`ÙèÂàâÜÂ@åÙÂàƒ×ÂÀÿßÂ@èÂ`’ßÂ` á¢ßÂÀ|à ÜÂ`nå€uÜÂ`’ßÂà)æÂ€Úà€WáÂ`åæÂ@êÂlèÂà¸ãÂ`ñäÂÀ½êÂàšè€Èã màÂà× pÕ ±ß ÝÂ@æÂ@éÂ+Þ€Eä åÂÀváÂÀ^åÂà×€oÝÂ`'Ü€Ú࠽ݠ=è åÂ@ÁßÂàîÚ Oå€ëÂàÕ Oå¢ßÂ@ÇÞÂà‚ì€ÈãÂÀjãÂ`ñäÂà_ÝÂ@bÚÂà²äÂ`KÖÂ@&äÂÀ‚߀àßÂ`!ÝÂ7Ü ·Þ ØãÂÀ·ëÂûåÂ`9ÙÂ`\è ØãÂrçÂ[Ö sßÂàØÂàÕÂÀÛÂÀ|à Uä aâ€Îâ "â€EäÂ`ÞÂÀáä ÃÜ€]àÂ ÆæÂ yÞÂÀ”ÜÂàSß ÃÜÂ@¯â üÝÂä aâ IæÂ@µáÂÀ²×€ÔáºÛÂà)æÂ ã ÏÚ ¥áÂ@èÂÀÕæÂ`žÝ @Ý [ãÂ`€âÂÀjã (á 1êÂàkÛ€uÜÂ@VÜÂÀ¦ÙÂÌØÂÀ¦ÙÂ@÷Ö 4ß ÝÂ`ÚÓÂ@©ã ÉÛÂÀ¦ÙÂIÙÂÀGÔ€{ÛÂ%ߖမ֠(áÂ`¶ÙÂàâÜÂ1ÝÂxæÂ@>à Þâ€Úà Ý€]àÂÀáäÂÀáäÂ@êÂÀXæÂ cì ¥áÂÀ‚ß RÚ€Èã ÃÜ aâÂ`Œà€È〟ՀEä ãÂ~å€øÛ ‡æÂÀÜ üÝÂàÐß ·ÞÂÀpâ ð߀¶æÂ@zÖ€™ÖÂÀÕæÂËíÂà_ÝÂ@€Õ ©ÖÂà§ÑÂà¾âÂ@å öÞÂà‰Ö€àß oêÂ` á gáÂà ç êàÂÀáä€?åÂ@hÙÂÀ|àÂ@¯â ¥áÂ`ñä Ÿâ€ØÂ Òä€EäÂàÄáÂÀÜÂ`àÂ@‹èÂ@éÂ@ç€-èÂãéÂ`Œà mà oêÂ@2â ½ÝÂ@&äÂ`bçÂ`-ÛÂ@è cìÂ`åæÂ ´é€QâÂ@ÇÞ€Èã€òÜ€ÖÂ@åÂ@ÓÜÂ@’ÒÂÀ#ÚÂàMà€cßÂá€Kã ÛÂxæÂÀáä€EäÂÀXæÂ (áÂ`ýâÂÀóáÂ`÷ã€!êÂ`\èÂ`’ßÂÀÜÂÀíâÂÀÉèÂ`ÈÖÂÀ‚ß «àÂ`Óé´ÜÂ%ßÂ@zÖÂ@nØÂàqÚÂ` á 2ÕÂ@8á ¥á d×Â`°ÚÂåÂàúØÂ€æÞ€WáÂÀ5×ÂÀdäÂÀ”ÜÂÀŽÝ ¥áÂûå oêÂ@©ã å ãÂlèÂ1ÝÂ@ÁßÂ@ëØÂà¸ã€þÚÂ` á ÕÙ€oÝÂÀÚ€(Ô€Â䀪èÂ`-ÛÂ`÷ãÂ@Dß –î ÜÂ`ªÛÂàÄáÂ@æÂ@8áÂÀÝ @ÝÂOØÂà Ö€¼åÂàÕ XÙ¨Þ€òÜÂàîÚÂàqÚÂ@hÙÂ@©ãÂ~åÂ@VÜ€øÛÂU×ÂÀùà€cßÂàqÚÂÀóáÂ@8áÂÀ5×Â@\Û ¢ìÂ`Pê€iÞÂ@÷Ö "‼å "âÂ`žÝÂ@ ÔÂÀÜÂ`zã yÞÂà¡Ò€:ÑÂsÒÂÌØÂ@8áÂ`¼ØÂ`?ØÂà‰ÖÂÀ;ÖÂ`ÞÂ`ªÛ ÚÂÀ¬ØÂÀ;ÖÂ@JÞ ÝÂÀpâÂ@3ÍÂ@9ÌÂÀ¦ÙÂÀ‚ßÂÑìÂ`˜Þ ¥á ÃÜ€×Â`æÑ óÔÂàÜÝÂ@\ÛÂ`°ÚÂ@¯âÂ@æÂ ·Þ çÖºÛ€×Âä€oÝÂ@ŒÓÂÀóáÂàwÙÂàîÚ ÉÛÂ`ªÛ ã vÔÂÆÙ ±ßÂ`’ß LÛÂ@ñ× &×ÂÀ#ÚÂàYÞ€àß «à€]à€“×€ Ù€oÝÂÀ)ÙÂÀ¸ÖÂÀèδÜÂ`¶Ù yÞ ðßÂ@†ÔÂ`Í€Ú ‘ÚÂ@hÙ :Þ ‹ÛÂ@ßÚ€‡ÙÂ@÷ÖÂ`E×Â@\Û :Þ 4߀.Ó oêÂÝꀙÖÂÒ× ½Ý€{ÛÂ@—æÂ@å€Wá yÞÂgÔÂ@JÞ€EäÂ@µá€ÔáÂàÜÝÂ@nØÂÀ߀øÛÂÀ¬ØÂ ÜÂÀdäÂIÙ :ÞÂU×Â ÛØÂ€™ÖÂ@ëØÂ êà [ã€Eä ØÂ€ÚàÂ`ŒàÂ@ýÕÂ`†áÂÀ¦ÙÂ`¼ØÂ ÝÂ@Áߠ܀iÞ Ò€àßÂCÚÂ`KÖÂ@bÚÂ`˜ÞÂ`E× íÕÂÀíâÂ@ Ô ùÓ :ÞÂÀ¬ØÂöÑ jÖÂÀ/ØÂgÔ ÝÂ`ÚÓÂ`ÎÕÂÀÊÓ€iÞÂ`¤Ü sßÂàwÙÂ`ìÐÂ@ëØÂ ‘Ú LÛ€×ÂöÑ aâ€Úà€øÛÂ`ËÂ@hÙ LÛÂ@nØÂ êàÂU×ÂàØÂ´ÜÂàYÞÂà Ö€QâÂ`ÔÔÂÀÊÓ€4Ò FÜ€.ÓÂàôÙÂ`KÖÂ`cÒÂÀ|à€™ÖÂàéÆÂ »Ó “ä ÀçÂ`E×Â@åÙÂ`KÖ ÎÂÀÝÂ@åÙ £× pÕ d×Â@JÞÂÀ Ú€¥ÔÂ`žÝÂ@bÚÂÀ#ÚÂÀÜÂ`E×ÂàÄá ãÂÀÛÂ@è€ Ù€cß ©ÖÂ@PÝ€{ÛÂðÒ ¥á€"ÕÂ@ßÚÂ`ªÛÂmÓÂOØÂ ÏÚÂ`9Ù ØãÂ@t×€ÃÏÂ`]ÓÂÀ¾Õ öÞÂ@ÍÝÂ@VÜ ^ØÂCÚ ÁÒ .àÂ`ÚÓÂà Ö d× jÖ ùÓÂ@t×Â`?ØÂàôÙ ˆÑÂÀÚÂ@Õ "âÂÀ¦Ù¢ß sßÂ@>àÂÀ¸ÖÂàÐßÂ`-Û ÿÒ€ÎâÂà0ÐÂ@nØÂà•Ô |ÓÂ@t×Â%߀±ÒÂäÔÂ1ÝÂ@t×ÂàwÙÂ`9ÙÂsÒ€øÛ »ÓÂ@ÓÜÂÀ¸ÖÂÀAÕÂU× gáÂÀÛ€.ÓÂÆÙÂ`ÈÖ öÞ€ÚÂà}ØÂ FÜÂ@ÓÜÂ`9ÙÂäÔ jÖÂàƒ×Â[ÖÂ%ßÂÀ;ÖÂgÔÂ@\Û XÙÂàƒ×ÂÆÙÂ`]ÓÂ@©ãÂÀdäÂyÑÂÀÝ€«ÓÂIÙÂ1ÝÂ=ÛÂ@€Õ  æÂÀ¦ÙÂ`ÞÂÀ ÞÂ`¼ØÂÀßÂàÊàÂàîÚÂ@æÂ–ဟՠçÂ`¶ÙÂÀšÛÂÀ ÞÂà/åÂÀ#ÚÂ@bÚ€QâÂÀŽÝ€Qâ€Qâ þç oêÂà€øÛ€:ÑÂÒ×ÂÀÜÂ`àÒÂÀ²×Â`'Ü ‹Û äáÂàÄáÂäÂ@ÙÛÂÀ‚ßÂ@2âÂÀ¬ØÂàeÜÂ@8áÂ`Â×Â@PÝÂÀŽÝÂ@ÍÝÂÀáä ^ØÂŠãÂ`’ß ãÂà}ØÂ ÚÂ`ÞÂØÖÂàwÙÂaÕ€{Û UäÂå€E䀨ÂÌØÂÀMÓÂ%ßÂàâÜ€“× ‘ÚÂ`!ÝÂ`žÝÂàYÞÂÀŽÝÂ`àÂ@ñ×Â`ëåÂ@ÓÜ€Ú€×€ØÂ@nØÂ@£äÂÀ¬ØÂÞÕÂÀpâÂáÂ`˜Þ ±ß màÂ@¯âÂÀÝ€ÎâÂ`nåÂÀ Þ€‡ÙÂâÂÀ@êÂ@çÂ`QÕÂà}ØÂ@æÂÀŽÝÂgÔÂÀ)Ù 2ÕÂàÐ߀oÝÂyÑ á×ÂÀSÒÂàÕÂÀÜ€9æÂ`’ßÂ`?ØÂ@ÍÝ€cßÂÀߺÛÂÀpâÂ@ÍÝÂ`ýâÂ@ÕÂ@åÙÂ@\ÛÂ@ßÚÂ`ŒàÂêÓÂ`WÔÂ@ÑÂàúØÂ`'ÜÂÀ‚ßÂ`ÍÂÀ¾Õ€ÚÂà¬å€.ÓÂCÚ íÕÂ@JÞ ÕÙÂ@ÇÞÂ`¤Ü sß 2Õ ¯Õ€cß «àÂ@÷Ö 2ÕÂ@t×Âà_ÝÂÀjã ·Þ€ØÂ@Áß ÕÙ ÀçÂ`–׀ÚÂÀšÛÂÀ¸Ö ‹ÛÂ@ŒÓ ÝÂàèÛÂ@VÜ µÔÂ`uÏÂàeÜ€-è ÏÚ€òÜÂ`E×ÂØÖÂ`9Ù´ÜÂÀ#ÚÂyÑÂàÜÝ LÛ€“×ÂÀ ÞÂ@\ÛÂ@ÇÞÂ@PÝÂ`Œà …ÜÂÀ4ìÂà•Ô€4ÒÂà Ö€{ÛÂàqÚÂ%ßÂÀ¬ØÂ`žÝÂ`†á€oÝÂ@t×€øÛÂxæÂ £× gáÂÀ#ÚÂàeÜÂ@&äÂ`Â× ¯Õ DÒÂÀ#ÚÂáÂ`Þ ÿÒÂ`!ÝÂ`?ØÂ@bÚ€øÛÂ@,ã ™ã ãÂ`†áÂÀùàÂ@åÂ`Þ€.Ó ÕÙÂ`˜ÞÂ@»àÂàØÂ ±ß€QâÂÀGÔ ‹ÛÂ`¶Ù€àß yÞ€×Â@ÕÂ`9ÙÂ`]ÓÂ`-Û€ÔáÂ@ýÕÂÀ#ÚÂÀ5×ÂÀ;ÖÂ@©ãÂÀ²×€¥Ô€ŸÕÂ`ÞÂ+Þ >Ó Ù´ÜÂàƒ×Â`?ØÂÀ;ÖÂ`cÒÂà›ÓÂÀ/ØÂ ÜÂ`åæÂ@Áß :ÞÂÀ|à Ò䀸ÛÂàÜÝÂÀeÏÂà$ÒÂ@€ÕÂÀ|àÂà_ÝÂ@ªÎÂÀƒÊÂà× ÏÚÂ`Â× ÝÂÀMÓ€™Ö óÔÂ@€ÕÂ@t×Â@t×Â@8á€-èÂÀÊÓÂÀAÕ @Ý ØÂ`°ÚÂÀˆÞÂ`žÝÂà Ö LÛÂàqÚÂÀóáÂ`’ß„äÂ@PÝÂÀßÂÀ¦ÙÂá ãÂÀÜÂàØÂ ãÂ`žÝ€ìÝ€"ÕÂ7Ü€WáÂ`¶ÙÂ@ÍÝÂÀYÑÂ@åÙÂà5äÂàÐ߀ëÂàYÞÂ%ßÂZëÂà¦æÂ@»à€Kã sßÂÀÃéÂ1Ý€3ç ð߀!êÂÀÜÂ@8áÂ@ å aâÂàYÞÂ ÆæÂ äÂàâÜ ÃÜ€]à á×Â@ÍÝÂûå öÞÂ`ªÛ 4ßÂÀ²×Âà çÂàâÜÂ@©ãÂ`nå´ÜÂ`]ÓÂ`Â×ÂÀ;Ö´Ü “äÂÀAÕÂ`à€žê€ÔáÂ@ñ×Â`QÕ Ò Òä€òÜÂ`ßÂ`ß yÞ¨Þ€þÚÂàèÛ ØÂ çÖ 8ÔÂ+ÞÂÀ;ÖÂ@©ãÂ`àÂ@8áÂ`†áÂ`°ÚÂ@’Ò€cßÂà_Ý ±ßÂ`â @ÝÂ@zÖ ‹ÛÂ%ßÂÀúËÂàÕÂ=Û .àÂIÙ€¥ÔÂ` áÂaÕ d×Â@t×ÂÌØÂ@£äÂ@>àÂ7ÜÂ@åÙ @ÝÂ@èÂõæÂàèÛÂ@Õ€uÜÂàeÜ ¯Õ€àßÂ@DßÂÀÜÂ@nØÂá€FÏÂCÚ &נ݀þÚ ±ß€þÚÂ@»à üÝÂÀŽÝÂàƒ×Â ÛØÂ ¨ëÂ`ê€cß ÕÙÂàwÙÂféÂÀ”Ü öÞºÛÂ@£äÂâÂà•ÔÂ`æÑ€ìÝ ,Ö€“× màÂ@çÂ`3ÚÂ@\ÛÂ@ÇÞÂU×ÂåÂÀŽÝÂÀŽÝÂÀ Ú “äœàÂàúØÂ ¯ÕÂàÖÞÂàeÜ ½Ý ÞâÂ@÷ÖÂÀ‚ß µÔ€cß ÝÂ@VÜÂàôÙ CçÂ@»àÂÀ¬ØÂ`’߀(Ô vÔÂÀ^åÂâÂ`¼ØÂ`àÂ@JÞÂ@ñ×ÂÀ ÚÂ@ÁßÂàAâ€cßÂ`QÕÂ%ß å ðßÂ@bÚ¨Þ LÛ€‡ÙÂàYÞ jÖÂ@ÓÜÂÀ|àÂà$Ò á×Âà¡Ò€"Õ€‡ÙÂ` á€uÜÂ`-ÛÂÀˆÞÂ@ëØÂ íÕÂ`†á¢ß =è€øÛÂà×Â`iÑ ÝÂ`¼ØÂÀÿßÂ@bÚÂ@ÙÛÂÀ É€ŸÕ€EäÂÀÿß £× ‘Ú FÜ€þÚ —ÙÂ@VÜ çÖÂ@†Ô€øÛÂ@JÞ ÏÚÂÀÿßÂ1Ý yÞÂ`’ßÂäÂà ÖÂÀÜ …ÜÂà€Wá —Ù€øÛÂÀÜ€þÚ´ÜÂ`hæÂöÑ€{ÛÂàÜÝÂàÊàÂàÅÌÂÀ)ÙÂ`ÔÔÂ@ñ× ðßÂ`ÎÕÂÀ_ÐÂàØÂ`-ÛÂ@µáÂ@bÚÂ`ªÛÂ@zÖÂ`æÑÂà$ÒÂgÔ FÜÂsÒÂÀ)ÙÂÀvဠـ¥ÔÂ@ÓÜÂ7ÜœàÂ@8á´Ü FÜÂ@åÙ ‘ÚÂà¹ÎÂ@˜ÑÂÆÙ€ÎâÂÀ”Ü ØÂ |ÓÂÀ;Ö€“× sßÂOØÂ ÛÂ`WÔÂ+ÞÂÀ”ÜÂà$ÒÂ`¼ØÂ~åÂÀ¸Ö XÙ 2ÕÂ`3ÚÂÀGÔ€"Õ´Ü€{Û öÞÂ`-ÛÂäÔÂÀ#ÚÂÀÜÂÀ¬ØÂÀ¾ÕÂà 4߀]àÂàAâ Ü€øÛ …ÜÂ@ÙÛÂ`ÎÕÂÀùàÂÀYÑ€(Ô€@ÐÂà‰Ö ŽÐ µÔÂ=ÛÂÀ‚ßÂÀŽÝÂ@hÙÂ`ìЀØÂÀ¬ØÂÀvá€{Û DÒÂÀ5× ‹ÛÂÀÛåÂ`âÂ@ÙÛ€¥ÔÂ`ìÐÂ=ÛÂ ÛØÂ€·ÑÂÀMÓ 8Ô aâÂàkÛÂ`ÎÕÂ`cÒÂÀËÂàwÙÂàØÂ€uÜÂÒ×ÂàØÂ`KÖÂàØÂ@-΀.ÓÂ`àÂàÜÝÂ@8áÂ+Þ€LÎÂ>ÆÂ€ ÀÂàBÍ &× Ù΀QâÂ@bÚ Ý Ý ©ÖÂ@t× ÝÂ`ÎÕÂðÒÂ`þÍÂ`àÒ€“×ÂÀ;ÖÂsÒ |ÓÂ@t× ½Ý ÏÚ £×€ÏÍÂÀÛÂÀ ÞÂÀÄÔ€{ÛÂ`°ÚÂÒ× pÕÂàwÙÂàÔ®ÝÂÀ;ÖÂ`E×Â`!ÝÂ ÛØÂ@†ÔÂ@ÕÂÀ²×Â@µá€ÔáÂ`'ÜÂÀ|àÂ`ìÐÂ`ÔÔÂ@ÕÂ`{ÎÂà}ØÂ ãÂ`KÖÂ`€â Ü€ØÂ@t×Â`¶ÙÂ@ëØÂÀpâÂàSßÂ`!Ý ½ÝÂ%ßÂ`ÈÖÂ`°ÚÂIÙÂ ÛØÂ` áÂàeÜ .àÂ`æÑÂÀ ÞÂÀpâÂ1ÝÂ@÷ÖÂÀ²× @ÝÂÀ Ú £×Â`ìÐÂàèÛÂ@ßÚ CçÂàôÙ ÙÂÀÐÒ jÖÂ@ëØÂ ½Ý€°çÂàÊà€×Â@Dß RÚÂ@\ÛÂÀÝ€ØÂ ÝÂ`QÕÂÀ¾ÕÂ@ÙÛÂÒ×€uÜÂ@ÍݺÛÂ@ÙÛÂ`àÂàÜÝÂàÄáÂ@ßÚÂÀÜÐÂÀíâÂ@\ÛÂÀ¦ÙÂ`æÑÂ`Â×Â@ßÚÂÀ@ê€òÜÂÀ¦Ù ^ØÂOØÂÀqÍÂ+ÞÂOØÂàÓÂ`]Ó€øÛÂàØÂàâÜ ½ÝÂ@nØÂÀšÛ ˆÑÂ@÷ÖÂöÑÂsÒÂàeÜÂ@ßÚÂÀ¸ÖÂÀ;ÖÂЀþÚ€ÚÂ`WÔÂÌØÂà å :ÞÂâ @Ý yÞÂ@ÍÝ€àßÂ@äîÂåÂà× RÚÂ@nØÂ ‘Ú€ÖÂ+ÞÂÀšÛÂÀvá€cßÂrç öÞ€uÜ 4ßÂà‰Ö màÂ@ëØÂ`àÒ€Ö€ÃÏÂÀ/ØÂÀÜРíÕ€þÚÂ@JÞ üÝ€WáÂà¹Î óÔ€{Û ùÓÂЀ:ÑÂ@åÙ 2ÕÂ@nØÂÀ¸Ö€ØÂ%ߺۀoÝ€±Ò€4ÒÂ`÷ã pÕÂ`uÏÂ`à‹Î ÝÂ`ßÂÀ ÚÂ@hÙ üÝ€WáÂ@ÍÝÂ`nå Ú€QâÂÀváœà€@ÐÂ@ÙÛ€?å sß sßÂÀŽÝÂ7ÜÂà}ØÂÀ”ÜÂ@VÜÂ`ñä :ÞÂ@\ÛÂ`3Ú€Ôá€ÈãÂàâÜ êà ÝÂÀÜ óÔ (á :Þ€þÚ €È çÖ€uÜÂ@t×Â@VÜ€ÚÂ@£ä€ÚÂàèÛÂÀÝ€“× ‘ÚÂà¬åÂÀŽÝ :ÞÂàÕ óÔÂàGá Ü á×ÂÀAÕ€¥Ô LÛÂ`’ßÂàŽêÂÆÙ gáÂÀ5×€Ö üÝÂÀ¬ØÂ€Eä€×€FÏ€øÛÂà Ö .à ½ÝÂÀ”ÜÂÀ/ØÂ 8ÔÂÀqÍÂ@ëØÂ ä å€?å LÛ ÏÚÂ~åÂà/å …Ü€Ú€æÞ ½ÝÂ@bÚ€«ÓÂà•ÔÂ`°ÚÂ@PÝÂ@»àÂ@ýÕÂâ€?å ÀçÂ ÛØÂÀ¦ÙÂ@ßÚÂÀÄÔÂ`ÔÔ «àÂ`¤Ü vÔÂ@ÙÛÂà¾âÂÀùàÂà/åÂöÑÂ`¤Ü ÃÜÂ@©ãÂÀpâ¢ß d×ÂÀváÂ`9ÙÂ@ÓÜ óÔ€EäÂÀíâ ØãÂ`ßÂ`Â×Â`ß UäÂàîÚÂà¦æÂ øè ÀçÂ`ýâÂÀ|࠱߀QâÂ`Œà Uä€øÛ€]àÂ%ßÂ@zÖ€(Ô «àÂà;ãÂ@ßÚÂË Ò€“×ÂÆÙ´ÜÂÀeÏÂà×Â@bÚ ½ÝÂ`ŒàÂmÓÂ@t×ÂàØÂ ÌåÂ`ÈÖ ^ØÂ@ñ×Â@ñ×ÂàôÙ€ìÝÂðÒ Ú€oÝ [ãÂÝêÂ`òÏÂàÕ€þÚÂÀˆÞÂÀGÔ £×€uÜ 2Õ RÚÂÀáä€ÂäÂ@VÜ€{Û´ÜÂàîÚÂ`KÖÂ`cÒ —Ù€Kã :ÞÂÀíâÂÀ5×ÂàîÚÂÀváÂ`¼ØÂ`9Ù ãÂàÔÂÀ5ׄäÂ`žÝÂ@ Ô¨ÞÂ`ÔÔ€þÚ€pÈÂ@8á ^ØÂ@>àÂ@¯âÂHîÂàâÜÂ@ÁßÂà;ã¨ÞÂáÂÀíâÂ@…é ÝÂÀèÎÂIÙÂ`Çë¨ÞÂ@ÙÛÂ@VÜÂ@Dß´Ü :Þ êà€ØÂŠãÂxæÂ`¼ØÂ FÜ @ÝÂà_Ý [ã Û€ìÝÂÀ Þ —Ù€EäÂ@ ÔÂ@Ó çÖ  æÂ@ñ×€ØÂ`ýâÂ`˜ÞÂ@>à€ìݠ݀{ۮݠÝÂCÚ ÉÛÂ`E×ÂÍÂ`z〙֠á×€¥ÔÂsÒ€æÞÂ`¼ØÂ .àÂêÓÂÞÕÂ@ñ×ÂØÖ€ØÂ@t×ÂÀ|à€]àÂ`ß —Ù€ÚÂÀÚ ÝÂà×€þÚ …ÜÂ`€â€{ÛÂ@ëØÂ`täÂ ÛØÂÀÜÂÀÄÔÂ`àÂÀváÂÀ|àÂ@PÝÂ@€Õ€Úà€iÞ€™ÖÂÀ#Ú€ªèÂ@ê€Kã ã OåÂâÂ`ŒàÂÀjãÂ@ÇÞÂÀXæÂÀùàÂà#çÂÀ:ëÂ@¯â êà€àßÂÀÛåÂà¬å ÒäÂ`VéÂrçÂ@ÍÝ {èÂ`ÓéÂ@ÓÜ ÝÂTìÂà5䀸ÛÂâÂ×ëÂ`€â ä OåÂ`÷ãÂ`Jë€'éÂ`ÍêÂäÂ@>à€Ôá üÝ ðßÂõæÂ öÞ€žêÂ@æÂËíÂÀLèÂÀ|à å€€ïÂ@£ä€iÞÂ@éÂ`9ÙÂ@µáÂlèÂÀÕæÂ ïÂ`t䀶æÂ`\è "âÂ@…éÂ`†áÂ`˜ÞÂ@2âÂ@PÝÂÀÛå äáÂàéÂ`bçÂ@êíÂ@¯â€ÎâÂÀL蠱ߠ æÂ ãÂ@JÞ€9æÂ ™ã ÉÛ€QâÂÀLèÂ`âÂÅîÂÀÉèÂ@êÂ@zÖ ±ßÂÀÝ€!êÂ@&ä —ÙÂÀ#ÚÂÀˆÞÂÀ²× ãÂà5äÂ@æÂ  æÂ`ÎÕ ãÂÀáäÂ`hæÂ`zãÂ`'Ü„ä€Eä€WáÂàèÛÂÀíâÂ@£äÂ`ßÂ`€â¨ÞÂÀóáÂ`PêÂTì€ÚàÂÀ ÞÂàÜÝÂÀ^å Ÿâ (áÂ@æÂ@&ä ‡æÂÀ ÞÂÀLèÂ`†áÂ@8áÂÀRçÂ@2âÂ`žÝÂÀŽÝÂ` á åÂZëÂÀšÛÂà_Ý€ŸÕÂ ÆæÂ€ÂäÂÀÝÂ@ßÚÂà;ã UäÂÀÉè {èÂÀÜ€uÜÂÀ(î Ü 4ß FÜÂ`ßÂ@ÍÝÂ@&äÂàÊàÂà sß %ì€cßÂ`nå Cç ãÂ`-ÛÂÀùà ãÂ`†áÂÀÏç ¨ëÂãé ´é€cßÂ@åÂâ€WáÂ`\耤éÂÀ.íÂIÙ€EäÂûå€ññÂ`†á ÙÂàÜÝ€ÚÂ`°Ú€þÚ äáÂàèÂÀ.í ØãÂ`!ÝÂÀÝÂxæÂ@‘çÂà²ä ÞâÂÀóá LÛ€€ïÂ@JÞÂ@µá„äÂ`€â ®ê øèÂ`!ÝÂâ€Âä€9æÂ ‘Ú€9æÂ@hÙÂàèÛÂ@©ãÂ`3ÚÂõæÂàkÛÂÀ/ØÂà¸ãÂ@µá LÛ ã Þâ€þÚÂ`nå äÂ@Áß QïÂ@ê þç 瀶æÂ ç á× RÚ [ã œíÂ@¯â :ÞÂÝê Ý UäÂà5äÂÀRçÂàÄáÂàŽêÂ@çÂ`ë倀ï éõÂ`©ðÂáÂ`ßç –îÂ@…éÂåÂ`€âÂÀ@ê þ瀰çÂÀ«íÂ@OòÂ@ åÂ`ÙèÂÀÃéÂ`täÂÀ|àÂ+ÞÂ ÆæÂÀ4ìÂÀò Øã€Îâ ÝÂ%ßÂ@üêÂà¸ã€ªè {èÂ@é ¢ì åÂÀòÂÀváÂà”éÂ@&äÂÀÛåÂ@æÂåÂÀ|à€?åÂÀóá .àÂ@mí þçÂà#çÂ@>àÂ@Dß–áÂ`ýâÂ@2â€?å€ÎâÂàÜÝ€3ç gá êà ÝÂÀÛÂ`zãÂÀváÂÀÕæÂàèÛÂ@—æÂ çÂàèÛÂ@JÞÂà”éÂ`ŒàÂÀ|à€æÞ€Kã€-èÂàÿìÂ`Œà ðß CçÂ`ßç€-èÂÀáäÂâ Ìå€?åÂàÖÞÂ`zãÂÀŽÝÂÀpâÂâÂ@çÂàâÜ¢ßÂ@>àÂÀ‚ßÂ@ÓÜÂ@©ã„äÂ~å€3çÂÒ×€9æÂ`€âÂä ¨ëÂ@>àÂaÕ€ªèÂ@D߀Kã€àßÂå «àÂ@JÞ€WáÂ@\ÛÂàÐßÂà ë¿ïÂ@ðìÂ@瀞êÂNí {è€Ôဇ٠.àÂà)æÂ`ŒàÂ`bçÂ@yëÂÀíâÂ`!ÝÂ`Vé ¥á Ü ‹ÛÂÀpâ€ÚÂ`VéÂ@DߨÞÂÀÜ öÞÂÀ²×ÂÀ|à€àßÂÀ‚ß ¥áÂ@‘ç ¥áÂâ´ÜÂÀùà€]àÂà_Ý€Èã ãÂ@êÂ%ßÂà¦æÂlèÂ@ åÂ@8á ØÂÀ^å€WáÂ@ÙÛ ±ßÂÀÛå–áÂ@êÂÀ²×€uÜ€ØÂ d×ÂÀáä€cß ±ßÂàeÜÂ`’ßÂÀ‚ß Ý üÝÂÒ× Ý .àÂ@JÞÂ`˜Þ€QâÂà)æÂ 7éÂãéÂ@ÓÜÂàꀞêÂÀ.íÂÀÜ "âÂÀ·ëÂ@üêÂlè gáÂ@‹èÂÀŽÝ (áÂàìÂ@‹è€¶æÂ äáÂàÊàÂÀ±ìÂ@\Û ç [ãÂà/åÂàÖÞ€]àÂâ€3ç Oå ®êÂÀ^åÂïç ÏÚ€9æÂÀ)Ù€‡ÙÂÀÿßÂÀdäÂ@©ãÂ@©ãÂÀ#ÚÂàYÞ öÞ ÛÂIÙÂ@»àÂ@2â œíÂ@2âÂÀFéÂZë (áÂ=ÛÂ@ÍÝÂ@ÍÝ€EäÂÀjã øè ãÂ`ýâ ©ÖÂ`˜ÞÂ`nåÂàîÚ€{Û  æÂ€à߀ÚÂà/å FÜÂ ÛØÂÀùàÂ`€âÂ@ÙÛ€{ÛÂÀšÛÂ@JÞ€×Âà_Ý FÜÂõæÂÀFéÂÀˆÞ [ã ÙÂ`ß d×Â@÷ÖÂ`â êà€æÞÂ`nå Àç òéÂ@ñ× åÂà¾âÂ`¶ÙÂ@VÜÂ`zã Ü gáÂà”éÂ`’߀cßÂ`ßçÂÀˆÞÂÀváÂ@,ãÂ`'Ü ã ÀçÂ`ÚÓ FÜ yÞ€]àÂÀ‚ßÂ@ñ×€™ÖÂ@JÞÂÀ#Ú€ØÂà¸ãÂä€ÈãÂÀÜ åÂàèÛÂ=ÛÂ@÷ÖÂ`°Ú ‹ÛÂàÊàÂ@üê +ëÂàSß êàÂ@&äÂ@zÖ gáÂ`-Û (áÂÀóáÂ@¯âÂ`ªÛ€cßÂ@zÖ ÕÙÂõæÂ`ÞÂ`†á ÉÛÂÀ#ÚÂØÖÂ`!ÝÂÀóáÂ`Þœà á×€{Û Ú ãÂà²äÂàeÜÂà³ÏÂaÕÂ`ÔÔ€¥Ô —ÙÂÒ×Â@Áß ·ÞÂ`ÎÕ€ìÝ 4ßÂ`ÚÓºÛÂàMàÂÀˆÞÂ`ßÂàÐßÂ@‹è —ÙÂÀÜ ãÂ@8á®Ý á×Â`žÝ óÔ LÛÂÀ)ÙÂ`KÖ XÙ€ìÝÂÀ/ØÂÀ)Ù€Îâ€Úà ùÓ 8ÔÂÀYÑÂ@æÂ`-ÛÂ@ëØÂÀßÂÀÛå UäÂ=Û íÕ€{ÛÂÆÙÂ`ßÂ`ÞÂàÊà€“×ÂU× ÚÂ`àÒÂàSßÂ`ŒàÂ@JÞ &× ðß ÝÂàîÚ ÕÙÂâÂÀváÂÀçãÂ`E× ÃÜÂàAâ ÝÂÀùàÂlèÂàÜÝÂàÕ ÝÂàMà€?åÂ@&äÂ@VÜÂÀ|àÂ`°ÚÂà;ãÂ`Œà€Ú áרޠ4ßÂ@JÞÂ@ªÎÂ`ªÛ LÛ€àßÂ@hÙÂ@ ÔÂ@zÖÂÀ;Ö€ÚàÂ`Âנ݀"Õ€Ú´ÜÂÀ#ÚÂ@JÞÂàeÜ€iÞÂ`täÂ`ñä çÖÂðÒ ÕÙÂ`9Ù€ìÝ ÇÑ ÙÂÀ5×Â7ÜÂÀˆÞÂàwÙ€ŸÕÂáÂÀpâÂÀˆÞÂàƒ×Â@ÇÞ€«ÓÂàwÙÂêÓÂ@EÊÂ`ËÂöÑÂ@bÚÂàwÙÂÀkÎÂ@÷ÖÂ`9ÙÂ@ýÕ ùӠ܀נØÂØÖÂ`¶Ù jÖÂ`æÑÂ@\ÛÂÀAÕÂ`ÚÓ€ÛËÂÀ)Ù LÛÂ@ÒÂà ÖÂ@’Ò€.Ó  Ñ á×€"ÕÂ@8á ,Ö :ÞÂ@\Û€àßÂ`ÎÕÂ@’ÒÂ`QÕÂÌØÂ ‹Û ÜÂ…Ï 2ÕÂxæÂÀváÂÀeÏÂ@ÍÝÂÀ¦Ù LÛÂCÚ€æÞÂ`ÍÂà¡Ò µÔÂöÑÂà}ØÂà›Ó ÛÂÏÂ`'ÜÂ@2â ùÓÂ=Û€.Ó —ÙÂàkÛ ÕÙ hÌÂ`˜Þ¨Þ ÒÂà}ØÂ ØÂÀAÕÂêÓÂöÑÂÀšÛÂä ÏÚ€ØÂÀÄÔÂÀßÂà€oÝÂÆÙ€ÔáÂ`ÈÖÂ@˜ÑÂ`ÈÖÂàBÍÂ@hÙÂ@>à PÐÂ@ªÎÂ`ÔÔ [ãÂàAâ &×ÂØÖÂÀÖÑÂàÓÂÀÖÑ€‡ÙÂU×ÂCÚ sßÂ@†ÔÂÆÙ ÕÙÂÀ)ÙÂÌØÂàÐßœàÂ`ÚÓ ˆÑÂ`uÏ€ÚÂÀkÎÂÀÄÔ‘Í»ÆÂ XÙÂàØÂ`QÕÂ+ÞÂÀSÒ öޣʠÇÑ ÿÒ Ù ‹ÛÂ`¼ØÂ —ÙÂ@€Õ VÏÂ`ÍÂà*Ñ »ÓÂ`øÎÂàqÚ çÖÂÀ)ÙÂ`hæÂ ŽÐÂàÔÂIÙÂ@ÁßÂàÕÂ`Â×ÂÍÂ`{Πs߀ŸÕ ÙÂÀ)Ù 2ÕÂ@3ÍÂ`Â×ÂàúØÂ ¸ÉÂ@žÐÂà_ÝÂyÑÂÀÐÒœàÂÌØÂÀkÎÂÀAÕÂà}ØÂÀ¸ÖÂ`òÏ d×Âà6ÏÂOØÂ XÙÂà$ÒÂ`æÑÂΠÚÂàÖÞÂ@ Ô |ÓÂÀ}Ë€ìÝ€ØÂ@ªÎÂU×ÂÞÕÂà}ØÂ€oÝÂà ÖÂ`Â×€ÚÂ@ÇÞÂ`Â×ÂÀÖÑ€þÚ€‡ÙÂ`žÝÂÀÜÐÂÀSÒÂU× 8Ô ØÂ€× —ÙÂmÓÂàèÛ€ØÂÀ¦Ù€Ú «àÂ@ÍÝ€×Â`â á×€¥ÔÂ`ÚÓ ùÓ€“×Â@°ÍÂà× ØÂ ½Ý ùÓÂöÑ€™ÖÂ@ñ×ÂàwÙÂÀ Ú€cßÂÆÙÂ@ÓÜÂ@8áÂÀâÏÂà6ÏÂÀÐÒÂàkÛ€àßÂ`!Ý ÁÒÂ@žÐÂ@t×ÂÀÛÂ`Â×ÂÀ¸ÖÂ@ªÎ pÕÂ@nØÂ`QÕ ÚÂ@ÓÜÂà›ÓÂ@˜Ñ ,Ö d× ˆÑ |Ó ØÂ@bÚÂà_ÝÂaÕÂmÓ µÔ |Ó ÁÒ ÉÛÂ@ÇÞÂ[ÖÂ+Þ …ÜÂÀ ÞÂÀóá ·ÞÂà×Âà$ÒÂ@†Ô —ÙÂà$ÒÂ`E× ÚÂàqÚÂ@ëØÂ ÃÜÂ@PÝÂCÚ ÍРíÕÂÀÿßÂÏÂ ÛØÂ@†Ô 2ÕÂàeÜÂ@\Û ÕÙÂÀÜÐÂàeÜÂ@ÇÞÂàîÚ 2Õ ØÂ ŽÐÂà›Ó€¥ÔÂ@ Ô >ÓÂà0ÐÂ@ŒÓ€Ö |ÓÂÀGÔÂäÔ€(ÔÂ@ýÕÂaÕÂà×ÂÀîÍÂöÑÂ`uÏ€uÜÂÀóáÂêÓÂ@†ÔÂ`þÍ€.ÓÂÀ;ÖÂàÕÂà¿Í ÝÂàÕ€dÊÂàÅÌ€ŸÕÂÞÕÂêÓ€æÞ€ÚÂÀYÑ€ÏÍ€·ÑÂàƒ×€FÏÂÀeÏ ØÂ@\ÛÂà›ÓÂàÕÂ`ÎÕ ˆÑÂÀÜÂ`'ÜÂàÑÊÂРRÚÂ`òÏ óÔÂàËË  ÑÂ@ÍÝ ùÓ ÕÙ  Ñ ÿÒ LÛ€çÉÂà•Ô€4ÒÂ`æÑÂ@'ÏÂàØÂ¨ÞÂÀ²×Â7ÜÂ`uÏ€ØÂ@DßÂ`’ßÂÀ¦Ù ¦Ì€XÌÂ@zÖÂàèÛÂà×Â`¶Ù ùÓÂÀùàÂÐÂÀMÓÂÀÜÐÂ@¼ËÂ@ÑÂÀ#ÚÂ@ ÔÂÀ_ÐÂ@°ÍÂÀ)ÙÂ@ÇÞ€(ÔÂ@˜ÑÂÀeÏÂ`3ÚÂáÂCÚ€FÏ€Î⠽ݠ«àºÛÂÀAÕÂàkÛÂÌØÂOØÂÀ²×ÂÀGÔÂàwÙ …ÜÂCÚ ·Þ€«Ó çÖÂ`!ÝÂÀ¦ÙÂ` á€×Âà}ØÂ`3ÚÂ`9Ù€.ÓÂ`]ÓÂ@¶Ì€ÚàÂ`ÓéÂàMàÂàqÚÂàwÙÂOØÂ LÛ öÞÂÀ/ØÂ |ÓÂIÙÂàôÙ€òÜÂàÓÂ@ÍÝÂà›ÓÂ`ªÛ ÛÂ`’ß ßÍÂ`ýâ€iÞÂ@>àÂàƒ×ÂÀ;Ö ØÂÀßÂ~å [ã ðßÂÆÙÂÀ‚ßÂÀÝ ÙΠjÖ ÿÒÂÀ‚ßÂàAâÂ`ÎÕÂàÂ`-Û DÒÂÀ‚ßÂ@ëØÂ€ìÝ€{Û ÁÒ Û “äÂ䀫ÓÂ@’ÒÂ@’Ò Àç 4ßÂÀGÔÂCÚÂrç (áÂ@bÚ RÚ FÜÂàSßÂ@VÜÂâ Ý [ãÂÀÄÔ€òÜÂ`¼ØÂÀ/ØÂ@ßÚ ¥áÂ@2â mà€øÛÂ@bÚÂ@€Õ€(Ô êàÂ@ñ×ÂyÑ 8ÔÂÀ;ÖÂÀ ÞÂ@žÐ ÞâÂàÕÂ@©ãÂØÖ ‚Ò FÜ€‡Ù [ã ÁÒÂ@¯âÂ@ëØÂÀ¾ÕÂÀ¦ÙÂ`zãÂ`âÂ@—æÂÀŽÝ ‡æÂÒ×€‡ÙÂ`¼ØÂ ÛÂ@nØÂ ™ãÂ`˜Þ jÖÂÆÙÂÀîÍÂÀÊÓÂ`˜Þ Û 8Ô€‡Ù€ØÂÀváÂÀ¸ÖÂaÕÂ`¶ÙÂ`žÝÂÀ¾ÕÂ`ÚÓÂÀ¾Õ ·ÞÂÀùàÂàîÚ FÜÂÀ¾Õ€ØÂàîÚÂàØÂàôÙÂÀÚÂ@†ÔÂ@ÑÂà ÖÂ@Ó€Ú ØÂà× £×Â@!ÐÂÆÙ ßÍÂàkÛÂgÔÂ@ÕÂ`iÑ€(ÔÂà$ÒÂ`¶ÙÂ` áÂ2È®ÝÂ`ÚÓ —ÙÂ@ëØÂ@»à€øÛ ,Ö ÙÂ`WÔÂ`ËÂà}ØÂÀ/ØÂ ½ÝÂ`˜ÞÂ@ëØÂ@øÁ ^ØÂOØÂyÑÂÀ_Р‚ÒÂÀ/ØÂ OåÂÀ/ØÂÐÂ@˜ÑÂ=ÛÂêÓ öÞ€ÃÏ€“×  Í€þÚÂ`Â×Â`ÈÖÂÀ5×ÂÀAÕÂÀ#Ú >ÓÂÆÙ€øÛÂðÒÂðÒÂÀAÕ€“×Â@ÑÂàGáÂ`-Û€EäÂàúØÂ`QÕÂÒ×Âàƒ×ÂàkÛÂ@t× XÙ€áÊÂ@†ÔÂ`Â×Â@ýÕÂ@Õ€ÖÂ[Ö ÏÂ@’ÒÂÀÐÒ ½ÝÂ+Þ€ÔáÂàÕÂàƒ×Â@ÕÂÀÖÑÂ@Ò á×€{ÛÂÌØÂ@ÍÝÂÒ×€™ÖÂ`ªÛÂÀ)Ù€XÌÂ`E×Â@¤Ï€“×Â@Ó ñÊÂÒ×ÂÌØÂà¹ÎÂ@ÈÉ€:ÑÂ@nØÂ€¥Ô€KãÂ`'Ü &×Â`KÖÂÀ)ÙÂ@Ò vÔ çÖ€ØÂ ;ÉÂÀ/ØÂ€ØÂðÒÂüÐÂÀÝÂÀ¾ÕÂ@?ËÂ@3ÍÂ@ŒÓ d×ÂðÒÂ@€Õ€.Ó Π2ÕÂÀ ÞÂà¹ÎÂÀÜÂÀ¾ÕÂÀ;ÖÂàSßÂÀ²×Â`3ÚÂÀAÕÂüÐÂ`¶ÙÂ@ Ô bÍÂyÑ€¥ÔÂÀôÌÂðÒÂyÑÂ@ßÚÂÀGÔ @ÝÂ`¤ÜÂ`iÑÂ`ÎÕ ðß ØãÂ@ßÚ ±ß ØÂ@'ÏÂàÖÞ€“×ÂÀSÒ ÓÏ GÇÂ@†ÔÂàôÙÂ@ñ×Â@PÝÂ`ªÛÂ`žÝÂà×ÂÀÜ @Ý yÞ€.Ó€]àÂ`!ÝÂÀYÑ #ÍÂàYÞÂÀAÕ€oÝÂàeÜÂ@ÍÝÂ`æÑ &×Â@ßÚÂÀvá ÝÂÀ”Ü 8Ô€ØÂ`âÂà —ÙÂàwÙÂ@ÇÞ ©Ö ,ÖÂ@-ÎÂÆÙ Ý€±ÒÂàÓÂÀÚÂÀÚÂÀ5×Â@ßÚ ˆÑÂ@˜Ñ ÓÏ€òÜÂàwÙÂà­ÐÂ@nØÂà‰ÖÂ1ÝÂ@µáÂÀ¸Ö€½ÐÂäÔÂàúØÂ€øÛ d× Ï ÿÒ Ú ÃÜ vÔÂàÄá Ù ÃÜÂá óÔ€ ÙÂÀâÏÂ`KÖÂ@PÝ ÙÂU×Âà}ØÂ šÎÂàwÙÂÀ”Ü ÐÂàÔÂ`ªÛÂ` á sßÂ@°Í ڮݠcìÂÀÚ€XÌ ·Þ "âÂâÂ@ëØÂÀÝÂàAâÂ+ÞÂÀ²×€ÈãÂ1Ý jÖÂ`ßÂÀùàÂOØÂ€ŸÕ ÏÚÂ`òÏÂâÂà*Ñ ‚ÒÂÀAÕ ÿÒÂÀ²×€ìÝÂàƒ×Â@JÞ yÞ€øÛÂ@VÜ€‡ÙÂàSßÂ@ÇÞ FÜÂ%ß uéÂÀpâÂÀ/ØÂÀÛÂ@ÁßÂÀÜÂÀGÔ “ä€KãÂ@—æÂ€]à„äÂÀXæÂà/åÂÀÛ màÂà*Ñ >Ó «à¨Þ®ÝÂàÜÝÂÀ ÞÂÀóáÂàèÂÀÝÂÀ¬ØÂ (áÂà¦æÂ ÞâÂ@ÁßÂàèÛÂ@ÓÜ Ìå ÝÂ ÆæÂ@¯âÂÀÛåÂ@8áÂZë€Âä€KãÂ@üêÂàkÛÂà¸ã ÒäÂ@hÙÂ@ÇÞ Û 7逆î üÝ [ãÂ@,ãÂàèÛ ¥á€æÞ„äÂ@ÓÜÂ@ÍÝÂ`Ùè åÂàÊà€ìÝ€™ÖÂ@÷ÖÂ@ßÚ€KãÂÀÛåÂ@ßÚÂ`ÞÂàúØÂ@>àÂ`ýâÂÀ¾ÕÂéè 1êÂ@2â€þÚÂÀÚÂàôÙÂCÚ ØÂ d×€ÔáÂà_Ý “ä Þâ ÜÂ` áÂÀ·ëÂ@£äÂàÊàÂå ãÂ`ßç òé .àÂâÂàjðÂ@êÂÀjãÂ`Pꀤé gáÂà)æÂ ãÂÀÉèÂ@2âÂÀ)ÙÂà*ÑÂ`KÖ€¼å XÙÂàqÚ &×Â@ÇÞ ´éÂ@ßÚÂàeÜÂ`\èÂàèÛ ØÂ@£äÂ`êÂà_ÝÂ@åÂ`nå€EäÂ@»à ÏÚ …ÜÂ@†ÔÂ`࠱߀ÕÌÂ@JÞ¢ßÂàkÛ´ÜÂ1Ý ÃÜÂÀùà¨ÞÂÀ‚ßÂ@©ãÂ@Jޢ߀¤éÂÀ)ÙÂ`àÂ@åÙÂ@nØÂàÊàÂIÙÂ`cÒ€iÞÂ`ªÛÂ@JÞÂ@ÕÂÞÕÂá å ·ÞÂ`ÔÔ ÌåÂäÂàÊà€×ÂÀŽÝ íÕÂÀˆÞ VÏ Û ‘ÚÂ`3Ú DÒ jÖÂàÜÝ ÃÜÂà•ÔÂU×Â@ßÚÂ@hÙ pÕÂÀ;ÖÂ@t× sßÂà•ÔÂÀAÕÂà}ØÂàGáÂ@‘çÂÀ#Ú€ØÂÞÕ ÛÂ`ÎÕ ‚ÒÂ`nå€.Ó 2Õ XÙÂÀÄÔÂ7Ü€ÖÂ`Œà€øÛÂàÖÞ s߀ÚÂà$ÒÂàÔ RÚÂ@Dß …ÜÂÀ5×ÂCÚÂÀ ÞÂ`?ØÂàÕÂÀšÛÂÀÚÂ@åÙÂÀ¦Ù åÂ7Ü€FÏ LÛÂgÔÂàèÛ »ÓÂÀ¸ÖÂÀçãÂàÂà¦æÂàÕ >Ó FÜ —ÙÂ`zã€Wá€ÚÂ@£äÂãéºÛÂÀ”ÜÂ@zÖÂ@ýÕ€×Âà×ÉÂÀ¦Ù´ÜÂà ðßÂ@åÂØÖÂØÖ nËÂØÖ€×Â`âÂ@¤Ï€Ú àì ‹ÛÂÀÛÂ1ÝÂ@ñ×ÂÀ ÞÂ@æÂàèÛ€øÛÂ@µá (áÂ`žÝ€ìÝÂÀ ÞÂxæÂ ÌåÂ@åÙÂ`¤Ü€Â䀥ÔÂ@ Ô OåÂàÊà€ÖÂ@åÙ€Ú€¥Ô€‡ÙÂÀ}Ë pÕÂÀ”Ü€“× íÕ ùÓ€™ÖÂ`ªÛÂ@ÙÛÂrçÂ%ßÂ`åæÂ yÞ€Ú€WáÂ@,ãÂà‰ÖÂÀ²×€þÚÂ`zãÂ@ÙÛ gáÂàƒ×ÂCÚ ‘ÚÂ`-ÛÂ@ßÚÂÀ/ØÂ ^ØÂ ÚÂ`'Ü @ݨÞÂ@ÇÞ€iÞ€uÜ 4߀ Ù ©ÖÂÀÄÔÂÀ²×Â`-ÛÂàwÙ ‹ÛÂ+ÞÂÀ”ÜÂÀYÑÂ`¤Ü€.Ó€ØÂ@ýÕ á×Â@VܨހæÞÂÀÜÂ@>à ÜÂàSßÂ`3ÚÂ`’ßÂ@>àÂ`’ßÂ`àÂàÊà ÌåÂ@>à€"ÕÂà¿Í€òÜÂàîÚÂ@ å üÝÂàqÚÂÀÜÂ@ê ™ã Ý„äÂàAâÂ@éÂÀ”ÜÂÀ ÚÂ`ªÛ .à màÂÆÙ€þÚ ÕÙÂà¡Ò€þÚÂâÂà;ãÂ`E×€Îâ ÜÂà¸ãÂàâÜ —ÙÂÀ¦Ù Ìå çÂ`-ÛÂ+Þ€øÛÂàé Ý€ìÝÂ%ßÂàÜÝ€æÞ CçÂ~å Ý€ìÝÂâÂ`ñä€]àÂÀóá ÛÂ@ÙÛ ™ãÂà¬å sßÂÀ ÚÂÀóáÂ` áÂ`÷ãÂ@nØÂáÂà*Ñ€þÚÂ`ªÛÂCÚ ØÂ€WáÂÀ#ÚÂá …ÜÂàÜÝÂ`ÎÕÂàØÂ@Dß 4ßÂ=ÛÂÀ^å “ä sßÂâ ±ßÂÀíâÂàƒ×Â ÛØÂ@zÖÂà_Ý€±ÒÂà³ÏÂÀRçÂà)æÂàAâÂÀÝÂgÔÂÀˆÞ >Ó >Ó >ÓÂàSßÂ+ÞÂ@ßÚÂà5äÂàeÜ á× ‡æÂ@æÂ çÂÀÛÂyÑÂ`žÝÂ`¥ÇÂ$ô€9æÂ@µá€EäÂà¸ãÂÀÛåÂOØÂàwÙ ‡æÂä Oå +ë öÞÂàÊà yÞÂÀ@êÂ@VÜÂÀ²×Â`Â×€¥Ô öÞÂÀßÂ@£äÂÀ‚ßÂÀ”ÜÂ`ÔÔ ¥áÂà× IæÂ€]à ç€Ôá Ÿâ gáÂûåÂÀíâÂàwÙÂÀßÂ`¶ÙÂ`!ÝÂØÖÂà•ÔÂ`ŒàÂÀMÓ€KãÂàAâÂ`à Ú€iÞÂàèÛÂaÕÂ@ÙÛ€WáÂÀ‚ßÂàSß …Ü–á€ØÂ@ÇÞÂÀŽÝÂÀ‚ßÂÀÿ߀¥ÔÂÀGÔ RÚÂ@ªÎ ´é XÙÂ+ÞÂ@ÇÞ Uä .࠺蠎ÐÂàúØÂ€iÞÂàúØÂ€ìÝ€Kã DÒÂ@zÖ€"ÕÂ`!Ý 8Ô€ÚÂ@2âÂ@åÂà_ÝÂ1ÝÂ@ÇÞÂ`†á ãÂ`bçÂÀ¦ÙÂà}ØÂ€þÚÂ@\ÛÂ[ÖÂ`ÈÖÂÆÙ êàÂ@ßÚÂ@ÙÛÂàAâ d×Â`âÂU×Â7ÜÂÀÜ sßÂ@nØÂ@bÚ ¯ÕÂÀšÛÂ@8áÂÀšÛ üÝÂ@>à ÉÛÂöÑ ‹Û üÝ 4ßÂÀ Þ pÕÂ[Ö€ÚÂ`ÚÓÂ@ëØÂ€™Ö üÝÂaÕÂ`žÝ á×Â@»àÂÀÚÂ`'ÜÂ`ªÛ´ÜÂ`3Ú€iÞ ÙÂ`3Ú€ ÙÂ`9Ù€«ÓÂ=Û€{Û  æÂ€þÚ€ÃÏÂÀ5×Â@nØÂ@åÙÂàîÚ€uÜ .àÂ@2âÂ@JÞ :ÞÂÀ¾Õ LÛÂàèÂà çÂU×ÂÀÝÂÀ¾Õ |Ó JÑÂÀŽÝÂ`!ÝÂÀçãÂ`¤ÜÂ`¼ØÂÀvဥԀÚÂ=ÛÂà•ÔÂàÕÂäÔÂÀ/ØÂ€‡ÙÂà)æÂÀùàÂÌØÂ€òÜÂà­Ð¢ßÂÀÜÂ`uÏÂÀMÓ€Èã ØÂÀùàÂÀ)ÙÂ@JÞÂà›Ó Ú »ÓÂ`ÎÕ >Ó |Ó …ܺÛÂ[ÖÂ@€ÕÂIÙÂÀŽÝ "â Ý€ÚÂÀ‚ßÂÀ¬ØÂÀÜÂ@JÞÂ+ÞÂà²äÂ@>àÂ`’ßÂ`¶ÙÂ ÛØÂÀ¦Ù€ØÂàqÚ ðß ÜÂàÜÝ å€uÜ€WáÂ@Dߢ߀“×Â`?ØÂ s߀ÎâÂ`¶ÙÂ@†Ô€ªè aâÂà/å Òä Ý€Qâ€ÚÂÀ)ÙÂÆÙÂàqÚ€Ôá Ü€ŸÕÂ@£äÂ@ÇÞ ‡æÂ€'é Òä mà .à ·Þ€KãÂ@©ãÂ@&äÂä m࠱߀Úà€“×Â`'ÜÂàÖÞ ¥áÂ`'ÜÂÀóဪèÂ`˜Þ€ªè€oÝÂ`ìÐÂàèÛÂ@¯âÂ`nå´ÜÂCÚÂÀáäÂ@ åÂ@aïÂ@÷ÖÂ`bç€Ú ‘ÚÂ@JÞÂàšèÂâ Àç ºèÂàꀪèÂ~å€cß —ÙÂ@ åÂä çÂÀÛ€¤éÂÀpâÂà5ä CçÂ`zãÂÀòöÂ`nå mà äáÂ@,ã åœà ä€nòÂ`÷ã€cßÂÀ”ÜÂéèÂ`åæÂ :ÞÂ`ßç {èÂà”éÂ@æÂà;ãÂ`Vé gá€9æÂ@8áÂ`€â "âÂ@©ã ¥áÂ`>í &×Âà5ä ä 'öÂÅêÂ@¯âÂàkÛ€ÈãÂà}ØÂ %ìÂ@£äÂÀÜÂ`bçÂ@aïÂ`ÁìÂ@üê€ÚàÂTìÂõæÂ ìêÂ@è ñ­ò³ñÂ@çÂ@ åÂàA‘ëÂÀ(îÂÀùàÂÀ^å€3çÂ`8îÂõæÂÑ쀶æÂÀçãÂÀÉè€3çÂ@JÞ€iÞ€ÚàÂÀùàÂ`>íÂ`ÓéÂ`zã€oÝÂà”逼åÂ`>íÂàóî¨ÞÂâÂÀ4쀒ì IæÂÀÕæÂ þçÂ`åæÂÀÕæÂ`†áÂ@bÚÂ`ßç€3ç€Œí ·Þ ™ãÂÀLè ½ÝÂàì€iÞ üÝ€¶æÂÀÛåÂÀ)Ù CçÂÀ^åÂ+ÞÂÀ5×€cßÂÀXæÂÀ|à€9æÂ@êÂãéÂrçÂ@2â îÂÀÉè ãÂÀáä (áÂ1Ý€ìÂ@ÁßÂàé ½ÝÂ@¯âÂ@—æÂ ‡æÂ€?å ´éÂõæÂ@æÂOØÂ@‘çÂ`µîÂ`ŒàÂÀpâÂÀ|àÂ`€âÂ@‹èÂ`ëå ‹Û .࠽݀ÚÂ`ÚÓœàÂ@ å uéÂ@é€Kã ^ØÂàÔÂ@JÞ çÖÂà¡ÒÂ@åÙ d×ÂÀ ÚÂàAâÂàƒ×ÂàqÚÂ@©ãÂàÜÝÂ`ßç üÝÂ=Û€«ÓÂàÜÝ «à å "âÂ@†Ô aâÂàâÜÂÀáäÂàÜÝÂ`ý ÙÂ@ÙÛÂ%ßÂÀ¦Ù€àßÂâÂÀóáÂÀdäÂ`€âÂ@˜Ñ …ÜÂÀ/ØÂûåÂà¸ã ·ÞÂU× ÛÂàÂ@t×€uÜÂ@ÍÝ ÚÂ@ñ×€ŸÕÂÀ‚ßÂÀ½êÂà_ÝÂ@÷Ö ‘Ú€Ú ÏÚÂàîÚÂ@ÒÂ@ÍÝ LÛÂ`E×€‡Ù€ÎâÂàƒ×Â@Á߀]àÂàÊàÂûåÂ`'ÜÂÀšÛÂ1ÝÂàGáÂéè XÙÂàYÞÂ@ÙÛ àìÂÀÏçÂ@åÙÂÀÿ߀°ç êàÂà¸ã€uÜ gáÂ@VÜÂ@©ãÂ=ÛÂ`zãÂ@&äÂ`†áÂ`]Ó ÉÛ {è ØãÂ@ÇÞ ±ßÂàÄáÂ@µá LÛÂ@—æÂ`ñä ÉÛÂ`?ØÂ ÚÂÀùà€3çÂxæÂ`Áì Ìå€ÚàÂ@…é€ÖÂàÐß ‹ÛÂ@ Ô (áÂOØÂ€ìÝÂ@ñ×€Ú å :ÞÂáÂ@JÞÂÀÛÂ@,ãÂOØÂ`hæÂ+ÞÂ7ÜÂà€uÜÂ`zãÂÀváÂ`àÂ@\ÛÂ%ßÂ@,ãÂÀ½êÂÀßÂÀpâ üÝÂÝꠥᠩÖÂÀ½êÂ`WÔÂ`’ß —ÙÂIÙ€ØÂ€c߀WáÂ@&ä€øÛ€]àÂÀÚ ÙÂ`?ØÂÀ”Ü€Qâ€WáÂ@åÂÒ×Â@ÇÞÂ@PÝÂàÄáÂ1ÝÂ`°Ú€¼åÂàqÚÂ@æÂ€øÛÂ=ÛÂ@‘çÂ`ýâÂàâÜÂ@2âÂ@»à€ìÝ êà ±ßÂ`\èÂ`âÂ@ÍÝÂ`÷ãÂàSß ¥á Øã {èÂ` á€Úà LÛ —ÙÂ@ê€Èã€ÂäÂ@‹è€òÜÂàê .à å€?åÂÀÕæÂàÊàÂ@2âÂ@&䀤éÂà ç€¼å iëÂlèÂàîÚÂà¾âÂáÂ`ÓéÂÀdäÂ@£äÂ@©ã cì€cß öÞ ÒäÂ@8áÂ@æÂ€òÜÂÀ:ëÂ@2âÂxæÂàSßÂÀ^åŠãÂ`Â×€KãÂ`˜ÞÂÀ@ê äá ä ·ÞÂ@ýÕÂÀÃé {èÂ@çÂà¾âÂgÔÂâÂ@‘çÂÀ”Ü &× ØÂ€×Âàé€'éÂÀˆÞ€ìÝÂ`ñäÂ@å€9æÂ€uÜÂ@©ãÂ×ëÂÀFé 4߀Wá [ãÂ`÷ã€3ç äÂàÐßÂÀ½ê ÿÒÂÀ±ìÂÀáäÂ`E×Â@ßÚÂ`bç€Qâ çÂÀ^åÂ`¤ÜÂÀùà IæÂàYÞ€òÜÂ@‘çÂ`¼ØÂ OåŠãÂàkÛ :ÞÂ`ýâÂ` áÂÀßÂÀdäÂàÊàÂ@æÂ`˜ÞÂà¸ã ðß ðßÂ@>à ºèÂâÂÀçãÂÀóá .àÂàèÂ@bÚ .àÂûåÂÀŽÝ gáÂ`täÂàGá aâ ÕÙÂ@ åÂ@üê–á …ÜÂàÜÝ€ÎâÂ@ å ·ÞÂ@£äÂ`žÝÂÀRçÂÀjãÂ@ åÂ@ÁßÂä äáÂ@»à ÒäÂÀÊÓÂ@µá üÝ€òÜÂ@&ä ½ÝÂ@ÍÝ yÞÂ%ß å´Ü äÂ`'ÜÂ`ÚÓÂÀ‚ßÂ`VéÂÀjãÂ@ÓÜ òéÂ@èÂ`\èÂ@©ãÂà5äŠãÂÝꀞêÂ@sìÂÌØÂ€Ôá lõÂàÄáÂ`àœàÂ` á åÂ`†áÂïç =èÂ@gîÂÀáäÂÀ«í€¼åÂÀ¥îÂ@©ã =è€ÚàÂÀ“ñÂ@Á߀ î€!êÂ@é “äÂÀ ÚÂàqÚÂÀÉè i뀘ëÂ`åæÂõæÂ`\è€ÈãÂ@,ãÂÀÉè CçÂ@ê þçÂàùí QïÂrç êàÂ`\è€Úà¢ßÂÀßÂÑì éõÂ@£äÂ`†áÂàYÞÂ`â ðßÂ@Þï€Èã ï ¨ëÂÀXæÂ€3瀌íÂ@åÂ`PêÂ`òÂÀ.íÂÀòÂ@‘çÂÀ Ú aâÂâÂàÜÝÂÀÏçÂ@èÂÀøõÂÀ^åÂâ€ÂäÂ@2â Øã [ãÂ`nåÂ`zã mà€EäÂ1ÝÂåÂ`à€9æÂàéÂà¦æÂ`8îÂ` áÂÀÿßÂ@åÂÀ:ëÂ@&äÂÀ Ú üÝ€iÞÂ@yë®ÝÂÀÃéÂÀpâÂÀ)ÙÂ@¯â ¥áÂ@2âÂ@µáÂÀAÕ ãÂàMàÂ@Dß ^ØÂ ½ÝÂ`nå ±ßÂÀÛåÂ@,ã€ìÂà/åÂä€cßÂÀváÂ`ÁìÂàMàÂâ «àÂ`ß ‘ÚÂ@—æÂ@JÞ€˜ëÂà¦æÂ€]àÂÀùà ìêÂà²äÂ@ßÚÂ`àÂ@ÇÞ€ÎâÂ@JÞÂ`°ÚÂÀvá€cßÂÀÃéÂà çÂàèÂä Òä {è€òÜ Ÿâ€òÜ “ä€-èÂ` òÂ`ý‰çÂ@£äÂÀÃ逤é€ìÂ@…éÂÀXæÂàÏôÂàRô ð 3ôÂÀ@ꀘëÂÀEþÂ@ŠýÂ@Cô€ë€tñÂÀò 'öÂ`µî ž÷ÂàÉõ€>úÂÀàù ?òÂ`õÂ`ÍêÂÀì÷Â`ü÷ TùÂà@÷Â`yøÂ€ï€VöÂÀKý ië  æÂÀàùƒù€Vö ¤öÂ` òÂ@þÂwû€>ú€,ý ¹Ã@„þÂÀ™ðÂÊÃpÃð=à ³þÂ`Æàñþ üÂ}úÂŒÃà <ÃP±Ãú TùÂúú€&ÃàÿÂ@IóÂ`öÂÐrÃ@ÕöÂÀÚúÂ`IÃ÷Â`sùÂ@œú€Óö ŒúÂ`ü÷ÂÀòÂÀ{õÂ`öøÂÀEÀ ÿÂ@„þÂÀàùÂÀàùÂMà3ôÂà à ³Ã`÷ÂŒà†ûÂà¥ûÂ_ÿÂÀ¼ÿÂàþÃÀQü tþÂàÃöÂÀæøÂzàëÿÂ÷Â@~ÿ tþ€»úÂ`…ö€©Ã’Ã`‘ô¡ôÂ`sùÂÀæøÂ@~ÿÂ@1÷Â`…ö€Dù ¹ÃÀKýÂ@¢ùÂwû 'ö€µûÂ@–ûÂ@–û lõ €üÂpvÃÐïÃà“þÂÀòöÂÀKÃð´Ãú ŠðÂ@üÂ`gû ãö ž÷Âà@÷ÂàŸüÂÀ‡ó ZøÂàýÂðCÃ`UþÂõÂà.ú°à 6þÂ@=õÂ@êÂÀ]ú€£þ€£þÂÀo÷ Âñ€Óö€ìÂ`ÍêÂ`gûÂàáñ ÈðÂà@÷€ÓöÂ` òÂ÷Â@Òñ 3ô 6þÂàÕó 'öÂà±ù€ññÂ@ØðÂÀ4ì€Vö€P÷­òÂàþà ûÂ@Òñ ¶ó€bô „ñÂÀ]úÂàFö€÷ðÂ`ÁìÂÀÚúÂîü  ûÂ`ü÷Â`OÿÂÀcùÂà·øÂ@ûÂ`&ñÂÀFéÂ@ ýÂàÛòÂ@¨øÂ`÷ îÂ`õÂ@ºõÂ}ú ¼òÂ@êÂàLõ•öÂÀiøÂBï¡ôÂÀŸïÂ`>íÂÀðÂ$ôÂÀ™ð àì€'éÂàìÂÅîÂ@Òñ ñÂõæÂ€†îÂ`8îÂà@÷ ïÂ@ÞïÂ`Pê ¼ò€ëòÂÀ:ë Wî ¤ö ãöÂ@êíÂHîÂÀ óÂ`VéÂÀ½ê­òÂ`ó iëÂÀ:ë­òÂàdñÂ`»íÂÀdäÂÀð€ßôÂ@´öÂ`hæÂ@míÂàóî€ îÂàXóÂ@êíÂ@=õ€ëòÂàdñ oêÂ@ðìÂféÂHî ´éÂàXó cìÂ@m퀘ëÂàçð ]í€æÞ€¤éÂÀ ó€ýï %ìÂéè ÒäÂÀ¥îÂÀ:ë ŸâÂÀRç€9æÂ@—æÂ "âÂ@IóÂxæÂ€ëÂ`JëÂàAâÂ@—æÂà#ç IæÂ`ßÂ@‹èÂÀdäÂÀjãÂÀdäÂÀFéÂÀ™ðÂ`âÂÀdäÂ`hæÂ øèÂà#çÂ`÷ãÂÀjãÂ@»àÂÀLèÂ@JÞÂáÂâÂ`åæÂ€þÚ¢ßÂ@öë€òÜÂÀíâÂ@ÁßÂ ÆæÂ€òÜ òéÂäÂ@çÂà”éÂxæÂ ðß ´é sßÂà#ç€]àÂÀÃé äÂ`ýâÂ@CôÂ`¶Ù€KãÂ@Dß ìê€tñÂ@&ä ÒäÂ@äî 1êÂÀÕæÂ`ŒàÂÀñ ä aâ€ÔáÂ`JëÂ@©ãÂàSß ò逘ë­òÂ`êÂ@£äÂÀ±ì€íÂ@é€'éÂàˆëÂ@üêÂÀLè œí€Èã ‘Ú€ÚÂàÐßÂ`ÍêÂÀáäÂ`ýâÂÀáäÂ@ÇÞ€™ÖÂàYÞÂà‰ÖÂÀRçÂ`µî gáÂ`ê€쀤é êàÂÀ ÚÂ`!Ý ØÂÀRç€Kã äáÂfé oêÂ@VÜ ÃÜÂ@8áÂÀóá òéÂ@ëØÂ¢ß€·ÑÂáÂ@ÁßÂ ÆæÂ¿ï yÞ€Úà “äÂ@>à Π£×ÂÀ±ìÂ@ÇÞÂ@¯âÂ@\ÛÂ`¤Ü ä€ÎâÂ`'ÜÂÀ‚ßÂ`QÕÂ`WÔÂØÖ€ØÂÀ Ú —ÙÂ`!ÝÂà¾âÂ@2â€øÛÂ@JÞÂáÂ`†áÂàéÂÀáäÂÀ”Ü Ù€¶æÂ@VÜ ãÂàMàÂ@üê€'逇ÙÂÀ#ÚÂ` ò€WáÂ=Û®ÝÂ`ëåÂ@…éÂà‚ìÂ@>à€3çÂ`ßçÂÀŽÝÂÀùà¨ÞÂïçÂ`tä ¥áÂàšèÂ`>í WîÂ<ð ûòÂÀuöÂ@…頢젼òÂàŽê€oÝÂ`ñäŠãÂ`Ù耤éÂ@ðìÂ`»íÂ@¯âÂ@èÂxæÂ€žê€zð€ë ÔîÂxæÂrçÂ<ð€¼åÂ@‘çÂ@çÂ`Pê 7éÂ`Çë œí î€ë ÈðÂÀÉèÂÀRç€-èÂÀÃéÂ@ê øèÂÀ@ê Îï Àç òéÂ@,ã ™ã ~òÂ÷Âàóî lõÂ@èÂ`2ïÂ@ÒñÂ`åæÂ€ýïÂàpïÂàÕóÂ@yëÂ@ÞïÂ`©ð€!êÂàRô c쀌íÂàvî ~ò ÈðÂ@Ìò€€ï€˜ëÂ`ÁìÂ`öÂ@êÂ`ëå¹ðÂ`òÂà çÂà¬å cìÂfé CçÂãéÂ`tä àìÂ@è °ôÂ`8îÂõÂÀñ€ññ³ñ ÚíÂ`ÇëÂÝêÂà½÷€tñ€Óö€ññÂ@êí QïÂ`Áì ðÂ`©ð xóÂ`÷ ÚíÂ@%ùÂÀŸïÂÀð rôÂàÉõÂÀì÷ÂÀæøÂ õó ÚíÂËíÂ`ÓéÂ@ÞïÂÀòöÂÀ{õ ûò€ëòÂõÂùÂàóî€Èã€ëòÂ@%ù ¼òÂ×ëÂàíïÂàáñÂ*ó€nò€>ú€íÂåÂ@œúÂàÕó€ï Qï `÷ƒùÂ`…öÂ@1÷Â`êÂà|íƒùÂpvÃàjð ûò§ó€zð›õÂ@%ùÂÀ±ìÂÀ óÂÀ¥î ð òé€ÙõÂàÉõÂÀRçÂ@Æó€†î€ýï€tñ 7é€ëòÂ@èÂà^ò€Áù ?òÂ`µîÂàXóÂÀò€ìÂÀñÂàçðÂÀ¥î ÈðÂféÂNí€zðÂ`ü÷Â@–ûÂàvî ÞâÂ@æÂÀdäÂú€åóÂÀ·ëÂàXóÂàŽê „ñÂ@öëÂ@éÂ`ÓéÂ@êí¿ïÂ`bçÂOØÂTìÂà5äÂÀjã %ìÂãé æë ½Ý IæÂÀ“ñÂ@‹èÂâÂÀÉè€ î€'éÂ@gîÂàSßÂ`&ñÂ`—óÂ`!ÝÂ@8á€ì€Âä äÂ@ÓÜÂÀóá „ñÂàÛòÂ@çÂÀíâÂÀÏçÂ`VéÂÀñ {èÂàÄáÂàèÛ ØãÂ@ÓÜÂ@ åÂ`JëÂ@8áÂàâÜ€’ìÂ@sìÂÀÚÂáÂ`÷ãÂä€iÞ (áÂàYÞ€QâÂà)æÂÀÉè€òÜÂ@&ä€Îâ màÂÀÝÂÀˆÞÂ@æÂõæÂ Úí ðßÂ`’ßÂ`žÝÂàÔÂâÂÀ¥îÂà5äÂàAâÂõæÂÀ^åÂàŽêÂÀjãÂ`ÞÂÀ”ÜÂà5äÂéèÂ`žÝÂÀdä äáÂ@çÂà¸ãÂà³ÏÂÀÿßÂ@êíÂÀXæÂÀpâÂà¬åÂÀ·ëÂ`täÂÀ|àÂ@Øð€Qâ€Î„êÂ%ß —ÙÂà_Ý€KãÂÀ”ܨÞÂ`ñäÂ@Áß ãÂ`3ÚÂàôÙÂ`÷ãÂÀóá€Eä 7éÂ@Þïœà d×ÂÀÿß ÏÚÂà;ãÂà¸ãÂ`˜Þ ç iëÂ@>àÂ@Dß .à¨ÞÂÀ¦Ù€ÈãÂÀÉè€9æÂàè màÂ@¯âÂàâÜÂÀdäÂ@ç¢ß€Èã ™ã€ÚàÂ@ÍÝÂ@©ãÂ`žÝÂÀÖÑÂ@Áß ŸâÂÀ‚ß åÂ@ÍÝÂ@>àÂxæÂ@†Ô€žêÂ@\ÛÂÀÛ值å€ìÝÂ`àÂ@è ä üÝ Ÿâ êà€ÂäÂ@©ãÂÀáäÂ`ŒàÂ@åÙÂ`ßÂ@£äÂaÕÂ@ÓÜÂÀçã€ÈãÂàS߀ÖÂ`Œà 4ßÂ@&ä€EäÂ@ðìÂ`à€¼åÂà²äÂ7ÜÂ`-ÛÂ@mí ìêÂàèÛ Uä [ã äÂà5äÂÀÄÔÂ@8áÂÀjã (á€QâÂàôÙÂÀ”ÜÂà5ä ðß OåÂ@hÙÂ`JëÂ`Â×ÂÀdä uéÂ@ å  æÂÀÃéÂ%߀cßÂ@zÖÂ@JÞ€ÎâÂ@8á€]àÂ@D߀ÂäÂ@ÓÜ æëÂxæÂ`PêÂNí iëÂÀÕæÂ@åÂÀ^åÂÀ Ú¢ß´ÜÂÀáä gáÂàÊà€EäÂ@£ä¨ÞÂ@zÖ€'é oê æëÂNíÂ@ å ¯Õ ØãÂ`ÇëÂxæÂ@ê ãÂà)æÂ€iÞÂ`¯ïÂ@zÖÂ@8áÂ@ÓÜÂâÂU×€òÜÂ@ç€íÂTìÂ@åÂ@¯â .àÂ@æÂÀ|àÂ`nå€3çÂ@>àÂ@ê€æÞÂ`bçÂÀLè äá ·ÞÂàÿì CçÂ@nØÂ@ç øèÂàŽêÂÑìÂÀFé€hóÂ`¶ÙÂ`€âÂ@,ãÂÀóáÂ`ŒàÂ~値é ÃÜÂÀ^å màÂÀváÂà¾âÂ`Ùè ¥áÂ`ŒàÂ`Œà€{Û ïÂ`†áÂ`ßçÂÀ ÞÂàAâÂûåÂ@ÇÞÂÀÿßÂ`bç€ÔáÂÀÃé€Î ï€Wá€Ôá çÂ@ÓÜÂà_ÝÂxæÂàÂ`ß瀰ç€ññÂ@sì€àßÂ@µá€'éÂ`>í 1ê “äÂÀ"ï€ìÂ@©ã =è´ÜÂr瀶æÂÀáäÂàèÛÂâ€9æÂ äÂ@,ã UäÂ`†á êàÂ@»àÂÀ·ë¢ßÂ@ åÂáÂ@ÍÝÂÀdä ìêÂ`nå€Úà Øã XÙÂåÂ`\èÂ@2â ãÂCÚÂ@éÂ`DìÂÀáä 1ê ¢ìÂ`ßç ÉÛÂÀßÂàèÛÂàeÜ€Q‼堮ê å @ÝÂÀáäÂàíïÂ`ñä€iÞÂåœàÂ@hÙÂÀ5×ÂÒ×€¼åÂÀçãÂàçðÂ`ëåÂàÄá€ÚàÂÀ‡óÂ@æÂ€Ôá öÞ¨ÞÂ@æÂ@£äÂà¬åÂÀÛå ãÂ@åÙ åÂÀjã —Ù€WáÂàÂ@éÂ@Ìò :ÞºÛÂÀRçÂ@,ãÂÀ«íÂ@©ãÂàeÜ ±ß–áÂ@…é “äœà äá (áÂ@&äÂàMàÂàîÚÂà¬åÂ`Jë ãÂ@êÂÀÛå LÛÂ@ åÂÀÕæÂÀÏç Ý uéÂâÂàìÂ`>íÂàÜÝ Û€àß 7é€æÞ€Ôá OåÂÀáäÂ@©ãÂàêÂfé€?åÂ`ñäÂU×€æÞÂà5äÂà|í åÂ`'Ü 7éÂïç€Ú€3çÂà²ä øè€?å :ÞÂÀÕæÂ Ò䀇٠gá€òÜ ©Ö …ÜÂ@—æÂ`ýâ€QâÂ`˜ÞÂ`ªÛÂ@©ãÂãéÂä d׮ݠ—Ù€iÞ´ÜÂ`÷ãÂ`!Ý äá¨ÞÂ`àÒ ™ãÂàšèÂ`3ÚÂ ÛØÂ ·Þ äáÂàwÙÂ`¶ÙÂä€Úà€«Ó€ÚÂÀFéÂÀ²×Â`æÑÂ@ÍÝ ½ÝÂÀ‚ß UäÂÀ¸Ö€°çÂ@yë Ü ±ßÂà›ÓÂÀÜ çÖÂÀÜ ÒäÂ@8áÂûå aâ (áÂâÂà/åÂ@2â€ë€!êÂ@ÓÜ€‡Ù RÚ€uÜ€{ÛÂàÐßÂ`ÞÂ@—æÂÀjã yÞÂ@,ã€ØÂ@DßÂàôÙÂÀjã öÞÂàèÂÀçã€cßÂ%ß "âÂ`žÝÂÀÖÑ€ÚàÂ1ÝÂÀÿ߀Îâ Òä€uÜÂ`ßÂÀíâÂ`bç€ÚàÂàwÙÂmÓ€øÛÂÀçãÂà€¶æÂ`!Ý ‡æÂ Þâ ‘ÚÂ ÛØÂ åÂ@äî€KãÂâÂ`â êàÂ@JÞÂàè¨ÞÂàqÚÂ@ÍÝÂ@2âÂCÚÂÀ¦Ù ãÂ%ßÂ@ßÚ ‡æÂ`ÁìÂ`täÂàÊà ‘ÚÂÀçãÂ1Ý€ ÙÂ@ÁßÂ@»à Ò䀨Â@ÕÂàeÜÂCÚÂÀçãÂÝêÂÀçãÂ7ÜÂÀ ÞÂà¦æÂ@,ãÂ`°ÚÂ@\Û @ÝÂäÂ@…éÂÀ”ÜÂ@\ÛÂ@†Ô€Îâ ã€oÝÂ7ÜÂ`Îծݠã ÀçÂ`3Ú€]àÂ@ßÚ yÞÂ@bÚÂ@ÍÝ 4ß êà€ÂäÂ`ªÛ ,ÖÂàGáÂàÐßÂ`÷ãÂ@ Ô€æÞÂÀ‚ßÂ@»à ·ÞÂ@PÝÂÀíâÂ@ÓÜÂ@èÂ@8áÂÀÚ€ÚÂ`9ÙÂàGáÂâÂ@¯âÂÀpâÂûåÂ@ÍÝÂ@PÝ ÙÂ@hÙ€ÎâÂÀ”Ü jÖ ·ÞÂ`ŒàÂÀóáÂ`†á äáÂÀ.íÂàèÂ@—æÂÀÛåÂÀÃé Ú ]íÂà5ä€3ç LÛÂåÂâ þçÂÀYÑÂ`ÈÖÂ@ÓÜÂÝê€-è (á £×Â@JÞ¨ÞÂà¦æÂ æëÂ@ÓÜ€ÎâÂà çŠã€3ç öÞÂxæÂ ãÂÀXæÂ@ê€{ÛÂ@µáÂ`žÝÂà ÖÂÀváÂ@äîÂ`€â Ìå —ÙÂ`߀-è "âÂ@èÂà;ãÂ`¤Ü€WáÂàÜÝ å …ÜÂå Þâ OåÂ@£äÂ`åæÂ¨ÞÂ`’ß ½ÝÂ`ëåÂ@ÇÞÂÀšÛÂàÕÂàÄáÂà çÂ@åÙ´ÜÂ`Â×Âà¬åÂ`ÞÂÀjãÂÀÿß =èÂ@‹èÂ~åÂ`€â€Èã RÚÂ`ÞÂÒ× ™ãÂ`ëåÂ`€âÂàGá êàÂÀíâÂ@çÂÀRçÂàÐßÂ`'Ü®ÝÂ`-ÛÂÀjãÂ@ÓÜÂàèÛ ±ß "âÂÀ߀iÞÂÀ¦Ù :Þ ä @ÝÂÀÜÐÂ@†Ô€WáÂ`ÔÔÂÀùà€oÝ€cßÂä€Ôá€Ôá +ëÂ@JÞ ½ÝÂàÕ màÂ=ÛÂàôÙÂ@ÇÞÂÀLèÂ`†áÂÀçã åÂ7Ü€'éÂ@—æÂ ð߀ÎâÂ@ÓÜÂ@Áß 4߀'é +ëÂ@»à s߀EäÂ$ôÂà¦æÂ@»àÂ@ÙÛÂ@JÞÂ`’ßÂ=ÛÂÀùàÂà|íÂÀÛå€òÜ€ÈãÂÀŽÝÂ@ÇÞÂ@©ãÂÀíâÂÀŽÝÂ@JÞÂà/åÂ@¯â–á ãÂÀÉè€3çÂCÚÂ@OòÂ`\è€ÕÌŠãÂ`Pê„ä óÔ êàÂ` áÂàÄá %ìÂ~åÂÀ@ê€Qâ %ì€ÚàÂ`Í꠨뀪è .àÂà¬å€ìÝÂ+Þ„ä€òÜ @ÝÂ`åæÂ á×Â@åÂàGá ä ã á× [ãÂÀÚÂ`bçÂàÿìÂà¦æÂÀÛåÂïç ðß üÝ æë Uä€EäÂ@&äÂÀdäÂÀçãÂÀùà ½ÝÂÀ^å€-èÂ+Þ :Þ€-耶æÂ–áÂ@£ä ÞâÂxæÂ@å ÝÂ@JÞÂ`âÂàâÜ ™ã€àßÂÀ”ÜÂÀˆÞÂ`'Ü Øã ©Ö€uÜÂ@¯â¢ß€ìÂõæÂ€nò çÂ@VÜÂûå îÂà”éÂà_ÝÂ`ëåÂÝêÂ`»íÂÀ"ïÂÀÃéÂ`nåÂàèÂàŽêÂ@,ã æë öÞÂ`zã 1ê 7é€!êÂ`bçÂ`ñäÂ@&äÂ@å ‡æÂÀšÛÂáÂ`âÂ`bç –î FÜ ¥áÂ`âÂ`ŒàÂ@2â ÉÛÂ@æÂ@ñ× yÞÂÀdäÂÀ^å„ä€cßÂÀLè€?åÂ`÷ãÂà¦æÂàÕÂ`Â×Â=Û ºè Øã ½Ý€ìÂ@míÂ@\ÛÂ`täÂ+Þ€cßÂà_ÝÂâÂÀvá >ÓÂàAâ “äÂ@&äÂà_ÝÂâ€uÜÂÀáäÂ@»àÂÀÕæÂ ±ßÂ@Á߀×ÂÀÛ€òÜ .à ÞâÂ@ÓÜÂÀÛÂ@ßÚ€àß "â€ÔáÂ+Þ ðßÂ`ªÛÂÀ¸Ö ØãÂ`Â×Â@ åÂÀLèÂà;ãÂ@—æÂ`âÂ`!Ý ‘ÚÂà¦æÂ ÒäÂ@DßÂ=ÛÂ`’ßÂ ÆæÂ@yëÂ`ôÂàdñ ÚíÂÀpâÂÀ½ê€bôÂTìÂÀ«íÂ<ð€DùÂSÃ`8î =èÂàÃöÂ@ÆóÂ`ô€˜ë àìÂ@ åÂÀÃé€ì€VöÂ`,ð ¶óÂ@%ùÂ@aï %ìÂàˆëÂ@IóÂ@Æó rô Eñ ÎïÂ`,ð 'öÂÀ.í Bü€åó€ŒíÂ@ú€,ýÂàRô€í€åó€Áù°›Ã@ÌòÂ÷Â@ê¹ðÂ@´öÂà™ýÂpÃ@mí WîÂ`ÇëÂÀô€VöÂ`[ÃTìÂ`êÂ@%ùÂ@1÷ í€tñÂÀÉè Eñ€P÷Â@+øÂ`©ðÂ@sìÂà ëÂ0ÚÀJøÂ6ñÂ`©ðÂàRôÂ<ðÂ@ åÂà½÷Â`ðùÂ@ØðÂúú€Vö€JøÂ€tñÂàÛòÂÀò QïÂÀ·ëÂ@¨øÂ*óÂ@mí ?òÂ@UñÂà ë õóÂ@ÀôÂ@„þÂÀuöÂÀþôÂ`ðù ÑùÂàFö€ÁùÂà™ý 'öÂÀôÂ`,ðÂ@OòÂ@[ðÂÀòö€P÷€JøÂÀò ü !÷Âà^òÂÀ:ëÂ`£ñÂ`gûÂ`©ðÂ`ê€zð§óÂÀ“ñÂÀ«í ’ùÂÐÀßôÂ`óÂ`£ñ ðÂ`ò ’ùÂàìÂ@êÂÀì÷ ÚíÂ@èÂ倘ë äá ¨ëÂ6ñÂõæÂ@éÂ@éÂ<ð ÀçÂàùíÂ`V逆îÂ`êÂÀ¥îÂ@=õÂÀ¥îÂËíÂ`ßçÂ`hæÂ€†îÂ@êí¿ïÂ@ºõ QïÂàvîÂÀLèÂÑì€ïÂ`nå =è ÌåÂÀÏçÂàŽêÂBï %ì %ìÂÀFéÂà#çÂàùíÂàvî€ìÂ`ÙèÂéèÂ`,ðÂ`÷ãÂÀLèÂà¬åÂ`ýâ œíÂÀ·ë€'é¢ßÂÀðÂÀô€°çÂ@ÓÜÂ@míÂ`µîÂà#çÂÀváÂÀLè  æÂ ®ê Tù€ýïÂ`Óé ´éÂÀð ´éÂÀÉèÂ@êÂ@‹èÂÝê€ÎâÂ`Pê WîÂ`nåÂÀíâ€-èÂàóîÂ`bçÂ$ôÂÀFéÂ`zãÂZë€EäÂÀ“ñ OåÂà‚ìÂ@äᠨëÂÀ±ì  æÂ@aï œí Cç€ÈãÂàé ¢ì ºè æëÂ@ðìÂïç åÂÀ‚ß ™ãÂÀÏç uéÂà5äÂ@—æÂ 1êÂ`ÇëÂ@é€]à oê ºèÂàMà€cß  æÂlèÂ`Ó逌í ÒäÂÀÃéÂ@8ᠱߠØãÂ@ðì ¨ë ðßÂ`>íÂÀ|àÂ@ê uéÂàêÂ`ê …Ü€ÖÂàÿì ðßÂÀÛå€ìÝ [ã ´éÂ~åÂÀjãÂ@åÙ ãÂ`ÇëÂ@‹èÂûå “ä UäÂ6ñ€¤éÂ@µáÂ`PêÂ@¯âÂàšèÂ`ßÂ`Þ ãÂÀóáÂÀpâ ^ØÂâÂà¬å€°çÂ@,ãÂàìÂ×ëÂ0òÂàÄáÂ@…é KðÂ@‹èÂà”é .àÂÀ Ú äáÂ@‹è ŠðÂõÂ@‹è uéÂà€!êÂ`߀Wá€c߀¼åÂ@gî øèÂ@JÞÂ`nåÂÝêÂàAâÂ`€â€àßÂÀRçÂÀŸï€KãÂ@,ã åÂÀváÂÀáäÂ@ðìÂZë ìêÂ`Óé€ëÂà/å ÞâÂÀÛÂ1Ý€ë òéÂàÿìÂ@¯âÂÀ‚ß ÌåÂ`zãÂ@&äÂ@‹è  æÂÀXæÂBïÂàé QïÂÀÉè ¨ëÂ@,ãÂ@yë€ÈãÂÀùàÂàÄáÂ`»í ÀçÂ`ßÂ@µáÂ@»àÂàvîÂïçœàÂà ëÂ@©ãÂÀíâÂ`êÂ@…éÂ`ëåÂÀjãÂ*ó€-èÂÀpâ€uÜÂïç äံæÂÀdäÂ@8áÂ@ßÚ€EäÂÀíâ ië ðßÂlèÂ@sìÂÀáäÂ@PÝÂÀváÂÀ^åÂ@»àÂ`&ñ uéÂ@—æÂÀvဪè€-èÂ@‹èÂà ç€Kã 7éÂà;ã ½ÝÂ`ÞÂ@êÂÀÉèÂà)æÂ€KãÂàÖÞÂCÚÂàSßÂ@£ä ‹ÛÂâÂ@2âÂféÂ`ýâÂà¬åÂ@©ãÂÀ«í€KãÂ`ëåÂlèÂ@‘ç "â äá€ÈãÂ`VéÂ@æÂ`ßÂ7Ü åÂ@¯â êàÂ`,ð ãÂ@©ãÂ`»íÂ`÷ãÂ`nåÂ`\è äáÂ`ñäÂÀ½êÂ`VéÂ@êÂ@¯â€ÚàÂÀßÂ@ßÚÂÀÃé üÝÂàÿì€ÔáÂ@æÂ`\èÂ`,ð ÒäÂ=ÛÂ@JÞ ÔîÂ`ëåÂà#çÂàÊàÂÀ‚ßÂ`ñäÂ@8áÂ@µáÂÆÙ€Qâ€cßÂNíÂ@yëÂÀ:ë [ãÂÀ^å øè€¶æÂ@åÙÂàìÂàì "âÂàAâÂ@ÇÞ€!êÂ`PêÂ@ßÚÂÀ‚ßÂÞÕÂà5äÂÀjãÂÀFé ^ØÂàúØÂ@åÙÂ`åæÂ ÁÒÂ@D߀iÞÂà¬åÂ~åÂà³Ï jÖÂ`߀"ÕÂÀçãÂ`ªÛ OåÂ`hæÂàMà€ØÂ ÉÛÂÀˆÞ€ØÂ€iޢ߀oÝÂ@ÙÛ XÙ (áÂàâÜ «àÂ`Â× äá€oÝÂ` áÂ@bÚ€9æÂÀ‚ßÂOØÂ Àç 4ßÂ@\ÛÂ`ŒàÂ%ßÂ@åÙÂÀ¾ÕºÛÂ@˜Ñ€ìÝÂàé øèÂÀváÂÀÝ iëÂÀ¦ÙÂ7ÜÂ`E×Â`3ÚÂ@PÝÂÀùàÂ`'ÜÂ`žÝÂ`âÂÀ ÚÂ`QÕÂÀÛÂÀ5×ÂÀÚÂÀÿ߀ìÝÂ%ßÂ`ÎÕÂÀ#ÚÂ`ê ŸâÂ`žÝÂ@ÇÞ€WáÂ@\Û .àÂÀóáÂ[ÖÂ@zÖÂ`3ÚÂàeÜÂàeÜ ÚÂ@&äÂ`nå€ìÝ€‡Ù ‹Û .à màÂÀ߀“× öÞÂ@bÚ åÂàGáÂ`tä¢ß€ØÂ`’ß màÂâÂ`ýâÂ7ÜÂà¾â€KãÂÀpâÂ+Þ€oÝ€ ٠݀°ç€Ú Ý üÝÂàeÜÂ@ÍÝÂZë€WáÂ`÷ãÂ@ÑÂÀÚÂÀpâ„ä ÜÂ@zÖ€cßÂ`bçÂ@ÓÜÂÀ”ÜÂ`°ÚÂ@t×ÂÏÂÀváÂÀpâÂÀ²× ØÂàÔÂÀÚÂÀ;ÖÂà/åÂ`ÎÕÂCÚÂàâÜ aâÂäÂ@µá€uÜÂà¸ã »Ó ÃÜÂ`ÞÂ`Þ ÉÛ [ã¨Þ RÚÂÀÉè€WáÂüÐÂàÔÂgÔÂÀ”ÜÂÀÊÓÂÀ)Ù FÜÂ@JÞÂ`˜Þ ÃÜÂ@Á߀ÚÂÀšÛÂàèÂà/åÂà/å€cßÂ`Â×ÂàGá ™ãÂ`EרÞÂ@ëØÂ€oÝÂÀ¦ÙÂÀÿß´Ü (á¢ßÂ`9ÙÂ@ÇÞÂ@hÙ XÙ€9æÂ€oÝÂ`÷ã€æÞÂäÂäÂÀ ÚÂàÄá sß á× ‘ÚÂÀùà FÜÂà Ö —ÙÂäÂ@JÞ [ãÂ+Þ€LΠÉÛÂ7ÜÂ`’ßÂàâÜÂ`˜ÞÂ`bç ØãÂIÙÂÀ#Ú€4ÒÂ@ßÚÂÀ²×€Eä 2ÕÂ@åÙÂöÑ ùÓÂâÂ`9ÙÂ`߀c߀WáÂZëÂàGáÂ@†Ô üÝÂàúØÂ€Eä —ÙÂÀ.íÂ` á ØãÂàÄá€]àÂ`¼ØÂÀSÒÂ@2â€øÛÂ`Áì€ìÝ€iÞ€cßÂaÕ "â€Wá ÃÜ ©ÖÂ@8áÂàÔÂÀˆÞ€™Ö ØÂàâÜÂà¸ã OåÂÀ¸ÖÂÀŽÝÂ@VÜÂéè€{ÛÂðÒ 8ÔÂÀÚÂâ€iÞÂ`¼ØÂà ÖÂàèÛ€uÜ ÃÜ ÙÂxæÂåÂà5ä Ü ÕÙÂ`KÖÂÀ¬ØÂ [㠥ဠـŸÕÂ`ßÂ@,ã c젱ߠ&×ÂàÖÞÂÀ)ÙÂ`Çë€ÂäÂà/åÂàSßÂ@,ã |Ó€ØÂ€cß äœà ‡æÂ …ÜÂ@VÜÂ`ªÛ ‹Û€Qâ äÂ@ÇÞ–áÂ@VÜÂ ÆæÂ`3Ú Øã jÖÂ@»à .àÂ`täÂ@8áœàÂ`\èÂ@»à€Œí ŸâÂâ€ÔáÂÀ¾Õ€uÜ öÞÂ`©ðÂàkÛÂ`ßç€ëÂÀ#ÚÂ@ÍÝÂ`hæÂÀ#Ú€Èã ‹ÛÂ@JÞÂ`hæÂ€òܨÞÂ1ÝÂ`3Ú€Îâ¢ßÂ`ÇëÂÀÚÂÀ”Ü´ÜÂàÐß üÝÂ@ëØÂ ™ãÂÀ·ëÂàâÜÂ`-ÛÂ@µá¢ßÂÀpâ Cç ä U䀇٠ã «àÂÀÏç€Qâ UäÂ~åÂà çÂÀ@ê 4ßÂ@>àÂàÐß Øã ™ã€æÞÂÀ·ëÂ`°Ú ÝÂ`zã€zðÂ~åÂ@‘ç [ã€òÜ€]àÂ@nØÂ`ÈÖ UäÂ@8áÂÀváÂ ÛØÂÞÕ çÖÂ`âÂà”éÂàâÜÂàqÚ€‡Ù ÞâÂ`uÏ êà .àÂÀšÛ ‘ÚÂ`°Ú ¥á ‹ÛÂ`âÂ@>à ŸâÂ`zã€ÎâÂØÖÂàGáÂÀpâ€ØÂ ‘Ú ^ØÂ ÝÂ`'ÜÂàeÜÂÀ”ÜÂOØÂ LÛ XÙ màÂ%ßÂ@zÖ ©Ö 8Ô @Ý€Wá sßÂ7ÜÂ@ëØÂ êàÂÀ ÞÂÀÊÓÂ@PÝ ÉÛÂ`nåÂ@‘çÂ`!ÝÂàkÛ€¶æÂ@÷ÖÂ`3ÚÂ`ÚÓÂà‰ÖÂÀAÕ —ÙÂ@çÂ[Ö á×ÂÀjãÂ`nå€Èã d×ÂàqÚÂà¹Î DÒ€.Ó ÇÑÂ@åÙ€ÚÂ@>àÂàúØÂ@8áÂ@ßÚÂ`?ØÂ€ÚàÂÀÛ |ÓÂ@PÝÂà ÖÂ`ÚÓ€“× ÜÂ@3Í pÕ ©ÖÂ`9ÙÂ@zÖ ÝÂ@£äÂÀ#Ú £×ÂàÕ ŽÐÂ@ÓÂ@»àÂðÒÂaÕÂàGáÂÀÚ ÐÂðÒÂà§ÑÂ`àÒ çÖ€øÛÂ`ÔÔÂ@VÜ LÛÂ@ëØÂ‘ÍÂà}ØÂ@\Û€ØÂ€ŸÕÂàÓÂÀùà Ï€ØÂàeÜÂäÔ€4Ò€àß´Ü€«Ó màÂöÑ £×ÂÀÄÔ€±Ò€{ÛÂ`¼ØÂÀváÂ`'ÜÂÀÿß ^ØÂÀ¬ØÂ€‡Ù #Í Ù 8ÔÂÀ ÞÂOØÂ (áÂ@€Õ€™ÖÂIÙÂÀˆÞ d×€™ÖÂàôÙ€àßÂIÙÂU×ÂêÓÂsÒ€½ÐÂ`uÏÂ`æÑ€“× —Ù€þÚÂÀÊÓÂØÖÂàÓÂàeÜÂàwÙÂÀÊÓÂàwÙÂ@ÓÂ@'ÏÂà$ÒÂ=ÛÂàÄá jÖÂàYÞ€òÜ XÙÂ%߀™ÖÂ`òÏ 5ÊÂ@˜ÑÂ@ëØÂ@ßږဟՀøÛÂ@8áÂÀ_ÐÂüÐÂÀ/ØÂ ŽÐÂ@zÖ RÚÂÀSÒÂ@ëØÂºÛÂàèÛÂàwÙ ‹Û€½ÐÂ`WÔÂ`¼ØÂ`¶ÙÂÀÜÂàÕÂà$Ò€×Â`ÞÂàâÜ€‡ÙÂ@žÐÂÐÂàîÚÂ@¯âÂØÖÂ@Ó ØÂ€ÚÂ@÷ÖÂ@åÙ DÒÂ@ßÚÂ@èÂÀSÒÂà‰ÖÂgÔ íÕ çÖ á×ÂÍ€ìÝÂÀYÑ€×€þÚ &× JÑ d×ÂU×Â`ªÛÂàÄáÂÒ×Â=ÛÂÀÛ€WáÂmÓ€:ÑÂ@ÙÛ ÉÛÂ=Û€.ÓÂÀ²×ÂÀdä RÚÂ@÷ÖÂ`øÎÂ`àÒ€ØÂ€þÚÂ%ßÂàÊà€ÃÏÂ ÛØÂÀdäÂ@>à€ØÂ |ÓÂ@¤ÏÂÀËÂà*ÑÂàîÚ€(ÔÂ@t×Â@>àÂàúØÂ ÝÂ@÷Ö ”ÏÂðÒÂ`¶Ù€.ÓºÛÂ`Í d×€ÖÂàèÛ€ÎâÂàÅÌÂÌØÂ@zÖÂ@8á€ÖÂ`oÐÂ@˜ÑÂÀ/ØÂ€òÜÂà­ÐÂà}ØÂÀMÓÂÀAÕÂà¾â¢ßÂÀGÔ ŽÐ ÉÛ ÜÂ@nØÂ Ý€ÂäÂ`†á ºèÂ@bÚÂÀ5×Â@ÙÛ ÕÙ ¯ÕÂ@ÍÝÂ`ÔÔ€iÞ€Ú€þÚÂÀ#ÚÂ`cÒÂ`þÍ ÓÏÂàÜÝÂà}ØÂ—ÌÂaÕ ØÂ`òÏÂÀ)ÙÂÆÙÂ@ÒÂÀÛ ÉÛÂàÓÂàBÍ ØÂ€ŸÕÂ@VÜÂ@ÒÂÀ5×€.ÓÂàÖÞÂà}ØÂ ‹ÛÂ@ëØÂ@Á߀ŸÕÂÀŽÝÂ`ŒàÂÀ ÚÂ`’ß ÛÂÀ.íÂ`’ßÂ@ÙÛÂ@˜ÑÂ@€Õ d×Â`¤Ü€ìÝÂ`ÈÖÂÀÊÓÂÀ;ÖÂ`¤ÜÂàÂ@÷ÖÂÀ”Ü öÞ€™Ö€ØÂÀGÔ€ØÂÀóáÂ`’ß á×Â` á d×Â@ÍÝÂÀçãÂ`ßÂ`ß çÖÂÀ¸ÖÂ@ÙÛÂ`E×Â@£ä€oÝ€“×ÂÀ‚ß uéÂ@ÑÂÀMÓ€ÚÂàÖÞ ÛÂàƒ× ÃÜ€Ú ‚ÒÂ`°Ú ÚÂ`’ßÂÀ5×Â@Õ€òÜÂ@ýÕ ^ØÂÀßÂ`òÏÂÀ ÞÂàîÚŠã€FÏ€«Ó ^ØÂ€«Ó€dÊ ,Ö ÏÚ ÇÑÂÀâÏ ÎÂÀ)Ù ©Ö ëË€.ÓÂ@bÚ¨ÞÂ`ªÛÂ@ Ô€ÚÂ`’ß µÔÂàZÉ ÕÙ ºè ¥á DÒÂ@ñ×€ÚÂ@ÙÛ´ÜÂàÕ á×Â`ªÛÂ@žÐÂÀÊÓ ùÓÂà0ÐÂ`QÕÂÀ²×Â`E× ±ßÂàôÙÂU× yÞÂÀMÓÂöÑÂÀ¾ÕÂ`bç @ÝÂÀ)Ù £×Â@¤Ï ØÂ`?ØÂàwÙÂ@ÕÂ`9ÙÂà³ÏÂÀSÒ 4ß [ãÂÀYÑ ^ØÂ mà óÔ ÏÚÂ@ÂÊ€ ÙÂ=Û XÙ ÛÂàèÛÂ`ªÛ€]àÂà•Ô€·ÑÂÀkÎÂÀ²×€ÛËÂÀÜÐÂêÓÂ@ßÚÂ@2âÂâÂà­Ð £×ÂÀùà€“×Â`-ÛÂ@ÓÜÂà ÖÂР…ÜÂ@9ÌÂÀÐÒÂÀÖÑÂÒ×Â@ÕÂ@bÚ ¯ÕÂà‰Ö€«ÓÂÀÖÑ€@ÐÂCÚÂÀ ÚÂ`E×Âà¹Î çÖÂàèÛÂàÊàÂà}ØÂOØÂ@÷Ö€«Ó®ÝÂðÒÂàîÚÂ`¼ØÂ ÓÏÂaÕ€Ú |Ó £×ÂÞÕÂà­ÐÂ@'ÏÂ`°Ú ˆÑ ÏÂ@°ÍÂ@ÕÂà<Π Í ,Ö ±ß ØÂ€½Ð ÝÂÀAÕ€4Ò€4ÒÂ`]Ó€òܠ݀@Ѐ.Ó 2Õ vÔÂÀíâ ÄÇÂà¡ÒÂà­ÐÂàô٠܀·ÑÂ@ÙÛ€dÊÂ@žÐ€ÖµÇÂà0РÏÂÀkÎÂÀ¡ÅÂàrÅÂäÔÂaÕÂÀ;ÖÂ@ Ô€@ÐÂ@žÐÂ`àÒ€Ú ©ÖÂÀÄÔ€½ÐÂàÓ€øÛ ÐÅÂ`òÏÂ@°Í çÖÂ@ÓÂÀeÏ #Í VÏ vÔÂ`E×ÂÀYÑ hÌÂà×ÂIÙ ØÂàwÙÂ`‡ÌÂ`ŸÈÂÀMÓ ˆÑÂ`-ÛÂ@ÑÂ`iÑ íÕ d×Âà*ÑÂ@Áß ØÂÀMÓÂ7Ü€4ÒÂ`àÒÂÌØÂ@¶ÌÂàÔÂàúØÂ`ÔÔ€ÚÂÀváÂà§Ñ ŽÐÂÀèÎÂ@bÚ pÕ óÔ€¥Ô µÔÂ@JÞÂ`¤Ü€ÚÂ`½Ã šÎÂÐÂÀ/ØÂöÑÂ@Õ ÒÂå ÞâÂàqÚÂ@ÓÜ€½Ð ÇÑ ØÂ ¯ÕÂ`ÔÔÂ@µá€™ÖÂ@€ÕÂ@÷ÖÂÒ×€ØÂ€cßÂüÐÂ@÷ÖÂàîÚ d×€ØÂ`E×€XÌ µÔÂàÕÂCÚ€™ÖÂ`KÖÂ ÛØÂ ØÂ€LΠ¦Ì ÙÎÂÀùàÂ`WÔ€Ö ±ßÂÀkÎÂ@Õ RÚÂ@€Õ ùÓÂ`àÒÂàkÛÂ@åÙÂ@bÚÂöÑÂÀ)Ù ÝÂ`þÍÂ`¶ÙÂ@nØÂ€ÚÂÀ}Ë€·ÑÂàqÚÂØÖ€ØÂ@»àÂ@hÙÂ@-΀«ÓÂÀvá€ØÂÀ_ÐÂÀ)ÙÂ@€ÕÂ@ñ×Âà‰ÖÂ`¶ÙÂ`KÖ´Ü çÖ€ÕÌÂ`˜Þ€"ÕÂÆÙÂ`¶Ù þçÂ` á€øÛÂ…Ï ²Ê ©ÖÂ`ÞÂ`ÍêÂÀ_Р‹Û 4ßÂÀÿßÂ@ñ×Â@\Û ÃÜÂÀ5בÍÂ`täÂ`ÎÕÂ@€ÕÂ@’Ò ÉÛÂ@ßÚÂ`nå LÛÂ`˜ÞÂ`÷ãÂàMàÂ@˜ÑÂ@˜ÑÂÀÊÂ`QÕÂêÓÂ`Â×Â@DßÂÀŽÝ ^ØÂ=Û€WáÂ`Â× ØÂÀ/ØÂ ©ÖÂÀ ÚÂàúØÂ@’ÒÂ`¤ÜÂ@ÍÝÂ7ÜÂÀ”ÜÂà¬åÂ@hÙÂ@©ãÂûåÂ@ÓÜÂ@bÚÂÀSÒ äá öÞ€ÂäÂ@ŒÓÂ`cÒ FÜÂ@bÚ€òÜ€9æÂ`täÂ`’ßÂ@åÙÂ@åÙÂà¿ÍÂØÖÂ`!ÝÂ`÷ã öÞÂà6ÏÂàqÚ€“×Âàƒ×ÂÀÛÂ@»àÂÒ×ÂÀpâÂ@PÝÂ`ŒàÂ@>àÂÀAÕÂ@žÐ€ØÂ€ ÙÂ@»àÂÀ¸Ö ‹Û —Ù€{Û€æÞÂàÐ߀¤éÂ@PÝ€{Û€æÞÂ`-ÛÂÀÚÂ@ÕÂÀšÛÂàîÚÂ%߀·ÑÂÀváÂÀÝ íÕÂàÓÂàÕ íÕÂÀ¦Ù gá yÞ ^ØÂ€àß ÉÛ€uÜÂÀYÑ€ØÂ€ÔáÂ`9Ù @Ý ‘Ú ‘Ú ØãÂàÜÝÂ`’ßÂà_Ý€¥ÔÂÀÛÂ ÛØÂ`\è€ÈãÂÀpâ€×Â@ëØÂ`àÂ@†ÔÂàÕÂ@ÓÜÂ@PÝ€Ú XÙÂ@PÝÂ`Þ€øÛÂà×Â`øÎ€pÈ€Ö€{Û :ÞÂ@3Í€4ÒÂ@>àÂ`?ØÂ`¼ØÂ RÚÂàèÛ€«ÓÂ`þÍÂ`¼ØÂ êà …Ü zÉÂàÕÂ@Ò óÔ bÍÂÌØÂÀ‚ßÂ`-ÛÂÀÄÔ ¯Õ &×Â`æÑ XÙÂ@PÝ€4Ò PР©ÖÂ ÛØÂ µÔÂ@zÖÂàYÞ šÎÂ@ÇÞ ‹ÛÂCÚ ÝÂ@PÝÂàAâ Ú€uÜ€“×ÂÀ|àÂ@t×ÂàÜÝ DÒÂ@\ÛÂ=Û üÝÂ@JÞÂàâÜÂ=ÛÂÀváÂà}ØÂÀSÒÂ`ÎÕÂ…ÏÂàÓÂ`ÍÂÀÜÂ@»àÂÀ”ÜÂ@ŒÓÂà ÖÂÀšÛ ÛÂ@Ó VÏ€RÍÂsÒ DÒÂ@ýÕÂ`!ÝÂàÝÈ DÒ ÁÒÂ@ ÔÂ@ñ× ÒÂà_Ý XÙÂ`Ë€jÉÂüÐÂ@t× ÈÂÀ;ÖÂà›Ó bÍÂàNËÂ@JÞÂàÓÂ@˜Ñ »Ó ¸É µÔ€ØÂàÑÊ€óÇ€ÃÏÂ`3ÚÂÀÝÂ@’Ò€øÛ€ Ù€ÃÏÂÀ²×  ÑÂOØÂ +ëÂÀ¦ÙÂà$ÒÂÀÄÔÂÏÂ@ÒÂÒ× vÔ€FÏ€:ÑÂà×É€pÈ yÞÂÀšÛÂÀGÔ€:ÑÂÀâÏ€(Ô€@ÐÂà§Ñ€FÏÂÀÝÂ`!ÝÂà}ØÂ`]ÓÂР»ÓÂÀˆÞÂ`3ÚÂ@VÜÂ`9ÙÂÀݠ܀Èã «àÂÀÜÂ@2â £×Âà¾â€àß Ù€@Р|ÓÂØÖÂàÕ‹ÎÂ@µá Øã€cßÂÀÚÂàkÛÂ`]ÓÂâÂÀóáÂàÕÂ@€ÕÂ@ªÎ€ÔáÂÀ?ÿÂÀ`»Â€FÏ bÍ ‹ÛÂÀÐÒÂ@>àÂÀŽÝ óÔÂÀ¬ØÂ@ ÔÂàGá —ÙÂÀÚÂàÐ߀ÚÂàÜÝÂ@ßÚÂÀÊÓ€ÕÌ —ÙÂ`QÕÂÀ/ØÂàÐ߀]à Ï€“×Â`ÈÖ€½Ð€ÚÂà­Ð€XÌÂÎÂÀwÌ€"ÕÂ`KÖ€ÚÂ`3ÚÂàâÜÂ@ßÚ yÞ€ØÂ€Ö á×ÂÀYÑ ãÂÏÂäÔÂ@˜ÑÂ@ýÕÂ`°ÚÂà×Â@ßÚÂ@Õ £×Â`ßÂ`þÍ ÁÒ ùÓÂ@¯âÂ@ ÔÂ@å RÚÂ`¤ÜÂ@åÙÂÀÚ …Ü€Qâ jÖÂÀÚÂ`]Ó€cß .àÂ@Ó PÐÂÀ|à ±ßÂÀˆÞÂ`3Ú€àß ÝÂIÙÂà_ÝÂ@ëØÂÀÊÓ pÕÂÀ¸ÖÂ`?ØÂ ÁÒ jÖÂ[Ö —ÙÂÀ ÞÂÀ#Ú РvÔ &×Â+Þ ÜÂÀSÒÂà€Úà jÖÂ@åÙ€×Â@bÚÂ`ÚÓÂàÜÝ @ÝÂaÕÂÀ¸ÖœàÂàGáÂ@åÙ sßÂàSß \Π>ÓÂàØÂÎÂÀ¸ÖÂ`àÒÂÀˆÞÂàâÜ ‘Ú€uÜÂ ÛØÂÀÛ€øÛ @ÝÂ`oРRÚ ½ÝÂ@>àÂ`àÒÂêÓ @ÝÂ@»à¢ßÂ`°ÚÂOØÂ`'ÜÂ`bç€Ú nËÂ~åÂàèÛÂ`ÚÓÂÀ¬ØÂ [ãÂ`'Ü–á€uÜÂÀŽÝÂ@ëØÂ@Dß «à RÚÂà²äÂIÙ€4ÒÂÀÚ ÃÜÂ`ÚÓ€ìÝ ÁÒÂ`KÖÂüÐÂÀÿßÂÀçãÂÀ²×ÂÀ¦ÙÂà‰ÖÂàîÚ >Ó DÒ ¯ÕÂà}ØÂ`ÚÓÂÀÛÂà×Â`àÂ`˜ÞÂàšè £×ÂÀ/ØÂ ^ØÂ`WÔ ãÂ`’ß ·Þ¨Þ ½ÝÂ ÛØÂÀèΠÐÂ@ýÕ€XÌ —ÙÂ`’ß´ÜÂðÒÂU×Âàƒ×ÂàqÚÂÀˆÞ ßÍ &× ÃÜÂàGáÂ`€âÂàwÙÂ`?ØÂàÅÌ ÓÏÂ@’ÒÂÀóá€ØÂ€½Ð á×€ìÝÂàîÚ€uÜÂÀ Ú üÝÂÀšÛÂ@Õ€×€ Ù€ÚÂU×Â@ÒÂÀÊÂà§Ñ µÔ ,ÖÂ@\Û€Ö€¥ÔÂ@åÙÂ@DßÂÀSÒÂ`iÑÂöÑ á×ÂaÕÂàÓ€"Õ€"ÕÂÀdä€{ÛÂÀÚÂêÓ€ÚÂà•ÔÂÀˆÞ€øÛÂ`E× 8ÔÂ`°Ú  ÑÂ`?ØÂ üÝ€ŸÕÂ@zÖ€øÛÂ`°Ú çÖÂ`¶Ù€ØÂ`ÔÔ êàÂÀ)Ù€‡ÙÂ@&ä ÝÂ`¤ÜÂ@ ÔÂÀíâ€iÞÂ@ëØÂ€EäÂ@&äÂÀ”ÜÂÀ#ÚÂ@ÁßÂ`ßÂ@t×Â@,ãÂÀ ÚÂ@µá€‡ÙÂ`°ÚÂ@€ÕÂÀ²×€òÜÂ`ŒàÂ`žÝ —Ù€cßÂ@PÝÂÀ¬ØÂ@¯âÂ+ÞÂà}ØÂmÓÂÀÜÂ`ߨޠÿÒ (á :Þ 8ÔÂÀÝÂ`]ÓÂЀcßÂ@DßÂàÓ ÜÂ@ýÕÂ@ëØÂ@ÓÜÂ@-΀uÜ 4ßÂÀßÂ@Dß aâ€.ÓÂ`¤ÜÂàúØÂà¦æÂ ÉÛÂ@ªÎ màÂàqÚÂ`ÞÂàqÚÂ,É€RÍÂàwÙ 8ÔÂÀ5×ÂàèÛÂ@¤ÏÂÀ¸ÖÂ`ÈÖÂÀ)Ù ÉÛÂ@†Ô€íÈ á×ÂÀ¸ÖÂ`ªÛ€֮ݠOåÂ`iÑ FÜ sßÂ`Â×Â%ß ßÍ —Ù€Ú€ÚàÂàÔÂ7ÜÂÀáä¨ÞÂ`ÞÂàƒ×ÂÀŽÝÂ`iÑÂÀÚ íÕ€uÜ …ÜÂ@ßÚÂÀÊÓÂàƒ×ÂàeÜÂÀÛåÂÀ¦ÙÂÀ²×ÂÀMÓÂÀ¾ÕÂ ÛØÂ€ ÙÂ@ÓÜÂ@bÚÂàÄáÂàúØÂ€ØÂÀíâÂÀÝ€cßÂàeÜÂàGá UäÂ@ëØÂ@˜Ñ mà€QâÂ`zãÂà}ØÂ€WáÂÌØÂàÊàÂ`-Û "âÂ`òÏÂÀ#ÚÂà²äÂÀÜЀڠÁÒ€Ú€¥ÔÂ`¼ØÂ€ ÙÂ@ëØÂ€{ÛÂ@\Û€WáÂÀ ÞÂÀÚÂÀSÒ ÝÂ=ÛÂÀÝÂâ çÖÂÀYÑÂ@Áß ÞâÂ@PÝÂ=ÛÂÀˆÞÂ@ýÕ¨ÞÂmÓ€òÜÂ@åÙ µÔÂ`¼ØÂ€Qâ„äÂ@zÖ ·Þ æëÂà× ™ã yÞÂ`'Ü ä´ÜÂ@PÝÂ@DßÂ@hÙÂàAâ þçÂ@\Û€àß ÒäÂ`tä yÞÂ`ÎÕÂ@»àÂÀdäÂ+Þ .àÂ`¤Ü ‡æÂàÐß ÛÂ[ÖÂ`°ÚÂÌØÂ`ÈÖÂ`!ÝÂOØÂ`iÑ XÙÂCڜ࠽ÝÂ+ÞÂU×€{Û êàÂàÕ ÙÂ@ÁßÂ`¼ØÂ@ñ× d×ÂàqÚÂÀ ÚÂàÖÞÂIÙ€™ÖÂ`?ØÂ€Úà€Ú ÝÂ`3ÚÂÀÝÂ`3ÚÂ@t×ÂàkÛÂ@8áÂ@JÞÂ@¯â€ ÙÂÀÛåÂ@åÂà²äÂIÙÂà#çÂÀ”ÜÂ`à üÝÂà}ØÂ®Ý€9æÂÀ)ÙÂ@VÜÂU×Â`!ÝÂ`¶ÙÂ`ÎÕ€‡ÙÂàÕºÛÂàMà€9æÂ@>à XÙ ÝÂ`?ØÂ ué€ìÝ öÞÂÀ¸ÖÂÀˆÞÂà ã ÝÂ@Ҡ݀oÝÂÀ|à€{ÛÂÀ¬ØÂÀ^å€uÜ€{ÛÂ@åÙ á×ÂCÚÂ`KÖÂ`9ÙÂ@ëØÂ€øÛºÛ ,ÖÂàÕÂ@nØÂ Þâ€×Â=Û FÜÂà€'é yÞ ÛÂ`ÞÂ@JÞÂ7ÜÂÀÛÂÀ5×ÂàMà 4ßÂ`?ØÂàôÙ ÿÒÂ@¤Ï€¥ÔÂÀjã UäÂ1Ý®ÝÂ`?ØÂ@ëØÂ`ÔÔÂÀSÒÂ@€Õ ŸâÂ ÛØÂÀ²×ÂÀ¦ÙÂ@DßÂ`žÝÂâÂ`E×ÂØÖÂÀ”Ü€{ÛÂ@Íݠ܀ŸÕÂ@&ä€cßÂ@€ÕÂÀ²×ÂaÕÂ@t×Â@VÜ  æÂàúØÂÀÄÔ Øã€ìÝ€]àÂ@VÜ PÐÂ=Û€ØÂ öÞÂàYÞ ½Ý€™ÖÂ@‘çÂÀ5×€iÞœàÂ`ß–á pÕÂÀLèÂ@hÙÂÀÜÂ@ÍÝÂ@&äÂÀp’ÖÂÀÝ€ìÝÂÀpâÂ`ªÛ€Qâ [ã 8ÔÂà¡ÒÂà$ÒÂÀÛÂÀÜ ½Ý jÖÂàÔÂ`Â× jÖÂàwÙ —ÙÂ@>à ÙÂÀAÕÂÀ#Ú UäÂ@ÍÝÂ`žÝÂ`'ÜÂ@ßÚÂÀˆÞÂ`÷ã @Ý€ÚÂàwÙÂàâÜ€ØÂ@&ä ØÂ`Â×Â@ÍÝÂIÙÂOØÂ€ìÝÂàS߀™ÖÂ`KÖÂ@©ãÂ@nØÂà_ÝÂåÂ`zãÂ+ÞÂÀÚÂàÓÂÀGÔÂÀ”ÜÂàeÜÂÞÕÂxæÂ …ÜÂÀˆÞÂàÜÝÂÀpâÂàeÜ€Âä öÞÂ@PÝ :ÞÂ@2âÂ@ßÚ (áÂÀ”ÜÂÀÜ ÞâÂ@,〰çÂàYÞÂ`÷ãÂ@t×ÂàSß ðßÂà×€“×ÂÀkÎÂðÒ€KãÂ`-Û &×ÂöÑ ·ÞÂàSßÂàÕÂ@ÓÂöÑÂÀ¦ÙÂà ÖÂ@ åÂ@êÂÀváÂâÂÀYÑ &×ÂU×Â@÷Ö€™ÖÂÀ5×ÂÀ;Ö Û€ìÝÂÀ¾ÕÂ…Ï üÝÂàwÙ€ØÂ j֮ݠ™ã µÔÂmÓ üÝ€øÛÂ`Â×Â@>à ÚÂÀÜ vÔ€ Ù ØÂ [ãÂÀ#Ú FÜ€oݨÞÂàÖÞÂ`’ßÂ@€Õ ÛÂÆÙÂàÖÞ .à ÉÛÂÀÛÂ`\è€Úà€{Û ØÂ€Ö yÞÂ`ßÂàÕÂ@ñ×€{ÛÂ@©ãÂÀpâÂIÙÂ%ßÂÀÜÂxæÂÀ Ú …Ü ØÂÀdäÂâ màÂ@æÂ@ÁßÂàÖÞ äŠãºÛ üÝÂ@ÓÜÂáÂ@ÓÜÂ`âÂ`\è ‘ÚÂÀ|à€ìÝÂ@÷Ö ‘ÚÂ7ÜÂà¦æÂàAâÂ`€â üÝÂÀjãÂ` áÂÀ²× ÛÂféÂÀvá–áÂ+ÞÂÀ ÚÂ`€â€]àÂâÂ@DßÂõæÂ@2âÂ@ÁßÂàMàÂÀjã üÝÂàwÙÂ@JÞ äÂ@ê ±ßÂ`'Ü€?åÂïçÂÀ ÚÂ`täÂàÄáÂÀáä ‘Ú FÜÂÀß çÂ@8ြåÂÀÛÂ@ÇÞÂÀ Ú ØãÂCÚÂ@†ÔÂ%ßÂêÓÂàqÚ€WáÂ@Áß IæÂÀóáÂÀùà ·ÞÂ@VÜÂÀÜ€{ÛÂ`zã®Ý Ü Ü …ÜÂ ÛØÂ ãÂÀí‼å ÒäÂ`¼ØÂàeÜ åÂ` á sßÂ`žÝ€"ÕÂ@ÓÜ öÞ ½ÝÂ@çÂ@æÂ€uÜ€{ÛÂÀÝÂÀ²×ÂÌØÂðÒ “äÂ`Þ sß ßÍÂðÒ ,ÖÂ@µáÂ=Û "â “äÂ@&äÂ@>à öÞÂ@÷ÖÂÀ|àÂàkÛÂàeÜ ÏÚÂÀÛÂ@ÓÜÂ@2â ÜÂ@Dß .àÂ`€âÂÀÝ —ÙÂà ÖÂà•ÔÂÁÅ€cßÂgÔÂÀÚÂ@Õ€ÚÂ@µáÂ`ßçÂàYÞÂÀ ÚÂ`!ÝÂaÕ ÛÂ@ÓÂÀ²× üÝ á×€iÞ€‡ÙÂ1ÝÂCÚ´ÜÂÞÕÂ`-ÛÂàÖÞÂlèÂÀAÕÂ@>àÂàé ÌåÂ@t× FÜÂgÔÂ@DßÂ`æÑÂ=ÛÂ@\ÛÂmÓ ^ØÂ@\Û ^ØÂ íÕ€"ÕÂÀÜ€“×€4ÒÂ`ÍÂà€‡ÙÂàSß êàÂÀâÏÂØÖÂCÚÂÀ Ú )ÌÂàkÛ çÂàÕ ±ß ÕÙ€{Û Ý |Ó …ÜÂàÊàÂ`!ÝÂÀÜÐÂÀ}ËÂ@t×ÂÀÝÂ@ÑÂà•Ô XÙ FÜÂÀ/ØÂ=ÛÂ ÛØÂ ©ÖÂÀŽÝÂàØÂgÔÂOØÂ€]à€ÉÎÂ@»àÂà‰ÖÂàqÚ ÍР>ÓÂ@ýÕ …Ü€þÚ€“× ²ÊÂ@÷Ö€ÃÏ ßÍ€òÜÂ@&ä µÔÂÀÛÂÌØÂÀÄÔÂ`æÑÂàÜÝ€ ÙÂ@hÙÂà­ÐÂÏÂÀšÛÂÀÐÒÂ`ÎÕ ÇÑÂÀÜ€(Ô€¥Ô ùÓÂÀ¾ÕÂà}ØÂ`Â×Â`ñä óÔÂàÔ€þÚÂ@’ÒÂ`?ØÂ€ØÂ :ÞÂà¡ÒÂÀSÒÂOØÂ€«Ó ŒÆÂ`LÁÂ@ýÕÂàÕÂÀMÓÂà•Ô€RÍÂÀ5×ÂÀwÌÂ@ªÎ ØÂà$Ò JÑÂÀîÍ€uÜÂÀ#Ú &×Â`ËÂ@¤ÏÂàÕ ëËÂ@¼Ë ¦ÌÂÏÂÀÄÔ€:Ñ µÔÂ@hÙÂ@ýÕÂ@ýÕÂ@¤ÏÂ@ŒÓ€ÔáœàÂÀ#ÚÂàèÛÂÀÜÐÂà•Ô LÛ ÍРÐÂ`òÏÂ`æÑ ©ÖÂÀ¦Ù óÔ ÐÂ@÷Ö€FÏ Ú€ìÝ€‡Ù /ËÂÀGÔÂàƒ×Â@˜ÑÂ`ÚÓÂÀ|à gáÂ1Ý ½ÝÂ@¶ÌÂOØÂüРÿÒ€ŸÕ€ÉÎÂÀ#ÚÂàÕÂÍÂÀ Ú¢ß ÏÚÂà‰ÖÂ@åÙÂÀXæÂ`¤Ü ÒÂU×ÂÀ;Ö VÏ _ÃÂ`cÒÂàÕÂÀÐÒÂ`ÔÔ µÔ LÛ€uÜÂÀ¸Ö µÔ £×Â@ÙÛ FÜÂÀÛ€‡ÙÂ`?ØÂ€ ÙÂàÓÂÀ¦ÙÂàØÂ ØÂ´ÜÂÀôÌÂIÙ´ÜÂà¾â€RÍ pÕ ÇÑ€uÜ pÕ »ÓÂàMàÂà}ØÂ‹Î µÔÂ@t×ÂàÕ ‚ÒÂÀ¾Õ óÔÂÀ¦Ù ‘Ú ‚ÒÂ`€âÂ`ÎÕ€.ÓÂà¹ÎÂÀAÕ€¥ÔÂ@åÙÂÀ/ØÂÀ ÞÂ@9ÌÂ@¶ÌÂà}ØÂÀ¾ÕÂàÓÂ@Õ€E䠱߀“×€]àÂU×Â@»àÂÀ¬ØÂÀ/ØÂ€þÚÂÀˆÞÂ@hÙÂàkÛ€@ЀÚÂàÕÂÀ#ÚÂ@’ÒÂ`Â×Â@JÞÂÀ;ÖÂ+Þ ‹ÛÂÀÛÂ`ÞÂ`]ÓÂàYÞÂÀ‚ß …Ü 4ßÂÀÛ€ÚÂàâÜ ±ßÂ@t×ÂàÔ ÝÂ@€ÕÂ`ÞÂàØÂ@Dß &×Â@ÍÝÂÀ¸Ö @ÝÂ`Þ€øÛÂ@žÐ [ã®Ý ,ÖÂ@ÓÂÆÙÂàÖÞ 8ÔÂ@ÓÂØÖÂ`¼ØÂÀóá ìêÂà×ÂêÓ€Ö GÇ ^ØÂ@ëØÂ üÝÂ@!Ѐ±ÒÂÀ^åÂ`]ÓÂ@QÈÂöÑÂà‰Ö á×Â`¶ÙÂ`QÕÂ`ÎÕ€Kã êàÂ@VÜÂàÕÂÀ¾Õ€]à LÛÂÀšÛÂÀîÍÂ`ÎÕ Ò¨ÞÂÀGÔÂsÒ pÕ £× êà€òÜÂ ÛØÂ@ªÎÂÀwÌÂàSßÂÀ ÚÂ` áÂà×Â`àÒÂàÓ óÔ€«Ó®Ý Ÿâ .àÂ@ÙÛÂ@zÖÂà¸ãÂàÊàÂ@JÞÂàkÛ ÏÚ€ØÂ öÞ [ãÂ@‹è ¥áÂ`KÖ "âÂ@PÝÂ@’Ò ØÂ LÛ ÙÂ`ñäÂ@hÙÂ΀ÔáÂÀ²× ¥á€þÚÂ@>àÂ`iÑÂ`æÑÂàÖÞÂÀÚÂÀ^åÂ@‹èÂÀˆÞ®ÝÂ`†á Àç ÌåÂÀSÒÂÆÙÂ`ÚÓ ÝÂàSßÂà§ÑÂàÕ £×Â`ß ŸâÂ@‘çÂâÂà­ÐÂÌØÂ€òÜÂàMàÂ`¤Ü Ý äá ÔîÂÀˆÞÂáÂ`!ÝÂÀ”ÜÂÆÙÂ ÛØÂ€ÚÂÀÜÂàÊàÂÀváÂ`'ÜÂ`QÕÂ@zÖ€uÜÂÀGÔÂ`QÕ sßÂ@2âÂà sßÂ@ÍÝ€EäÂà ÖÂÀáäŠã Ìå –î€Ú ãÂàÐßÂ`÷ãÂ`êÂÀ4ì þçÂÀ½ê€EäÂU×Â%ßÂ`ßçÂ`hæÂœàÂ`†á 4ß äá :Þ :ÞÂÒ×€oÝÂ@£ä Uä€Èã®ÝÂ`ŒàÂ`àÂ@JÞ€cß Ù€ìÝÂÀÜŠã ´é ÜÂÀpâÂäÔ€'éÂ@gîÂÀóá ÏÚÂÀÿßÂ`ÞÂàMà RÚÂÀíâÂåÂ`bçÂ@£ä ã ãÂÀjã€KãÂ@2âÂ`ßÂÀ‚ßÂÀ¦Ù Þâ ŸâÂ@çÂ`¶Ù sßÂàvîÂ`ß砙㠫àÂÀßÂÀdäÂÀóáÂ@—æÂ–áÂ@PÝ Cç ÏÚÂÀÛåÂàeÜ€Èã çÂà¬å–áÂàéÂÀçãÂÀ5× “äÂÀdäÂÀçãÂ+ÞÂà²äÂ7Ü€™ÖÂÀ‚ßÂ@ÍÝÂ@èÂ`-ÛÂàƒ×Â`täÂ@¯âÂÀáäÂÀŽÝÂ`â sßÂ@8áÂÀváÂ=ÛÂ`\è€cßÂÀ/ØÂ ðßÂÀÛ€øÛ FÜ ºèÂCÚÂ`òÏ€àßÂ@ ÔÂ`3ÚÂ`E×ÂÀYÑ öÞ€9æÂÀdäÂÆÙ ÏÂ`!ÝÂàØÂ êàÂÀ|à çÖÂ`°Ú€™ÖÂZë FÜ€¶æÂ€±Ò  ÑÂ@JÞ ^ØÂOØÂ€ ÙÂCÚÂÀ‚ßÂ@åÙ íÕÂà5äÂÀváÂ@†ÔÂÀÄÔÂIÙÂ ÛØÂ >Ó ÛÂ@DßÂxæÂ`˜Þ çÖ \ÎÂ`¶Ù€?åÂÀ5× ÃÜÂÀ‚ßÂÀÐÒ€þÚÂàâÜÂ`3Ú Þâ´ÜÂ@t×Â`ÞÂÀ)ÙÂà$ÒÂ@ÙÛÂ`žÝÂ@Õ€WáÂ@bÚÂÀ ÞÂàÕÂà}ØÂ yÞÂ`'Ü€þÚÂÀÊÓÂmÓÂ`’߀æÞ 4ßÂ@ÍÝÂ`¤ÜÂU×¢ßÂ@ÍÝÂÒ×Â`{΀àßÂ7Ü€ìÝ€QâÂ=Û€Âä þçÂà_ÝÂ@åÙÂÀ5×ÂÀÝÂÀçãÂàAâÂ`ß ‘ÚÂÀšÛ ¯ÕÂ=Û€“× ðßÂIÙÂÀ¾ÕÂÀ”ÜÂà¾âÂÀ¬ØÂ ±ß ´éÂà/å€àßÂà/åÂà²äÂ+ÞÂàAâ ØãÂ@ðìÂÀpâÂÀ Þ þç€ÎâÂÀˆÞÂÀóáÂ@ÙÛ€“× ÕÙÂ%ß ´éÂÀ‚ßÂ@©ãÂà#ç Ý [ãœàÂ`ªÛ€øÛÂà5ä€Ôá óÔÂà²äÂ@çÂàôÙÂ`-ÛÂÀíâ€Kã´ÜÂ@ÇÞÂÀˆÞÂäÔÂ`zãÂ`ªÛŠãÂÀóá¨ÞÂ@åÙÂÀ²×ÂÀ|àÂàeÜÂ@ÙÛÂ@,ãÂyÑ€"Õ jÖ€øÛÂÀŽÝÂ`KÖÂà‰Ö‹Î :ÞÂ@2âÂàêÂ@ßÚÂ@ëØÂÀÝÂ`nå 2ÕÂ@ åÂïçÂ`âÂ@'ÏÂÀ)ÙÂ`ñä åÂ`zãÂÀ”Ü€ìÂ`†áÂàMàÂ`ñäÂ@PÝ€‡Ù ä Ÿâ ©Ö€½ÐÂ@åÙÂöÑÂÀ5×ÂÀ߀¶æÂ öÞºÛ &×€Ö 2ÕÂÀÜ€ÈãÂÀ|àÂ`9ÙÂÀ)ÙÂÀÉèÂ`¼ØÂ€øÛ Π8Ô &×Âà‰ÖÂÀ‚ßÂÀóáÂsÒÂ@Ó€«Ó .àÂà³ÏÂ`æÑ ÐÂ@»àÂ`àÒÂ@ŒÓÂyÑ Ù€™Ö€‡ÙÂÀ”Ü€ØÂ€«ÓÂIÙÂàÖÞÂÀšÛÂ+ÞÂ ÛØÂÀÛÂ`âÂàôÙÂ@ßÚÂÀ¦ÙÂÀ²×ÂCÚÂÀ¾ÕÂ=ÛÂÀÛÂ@ñ×€ØÂàYÞÂÀ_ÐÂà JÑ€þÚ€¥ÔÂ`žÝÂÐÂÌØÂÀ¾ÕÂ1ÝÂàÜÝÂ`‡ÌÂ`ÉÂ@ÕÂà ÖÂàeÜ€×Â@Ò vÔÂ@ÑÂmÓ€@ÐÂÀ²×Â`°Ú ùÓ ÍÐÂ@PÝ€ÕÌÂÀè΀ÃÏÂà)æÂàYÞ pÕÂ@’Ò óÔ€(Ô LÛÂà¿ÍÂmÓ€ ÙÂ`WÔÂêÓŠãÂ`¶Ù‹Î€æÞ ‚ÒÂsÒÂÀAÕÂÒ×Â΀ÚÂà*Ñ 2ÕÂU×Â@?ËÂ@-΀"ÕÂU× sß ùÓÂ@’Ò FÜÂ@µá€ØÂâ€ÚÂäÔÂ`þÍ üÝ€æÞ€ Ù ÏÚÂ@bÚ XÙ £×Â@Ӡˀ×ÂÀ ÚÂ`¼ØÂ ŽÐÂà•ÔÂÀÛÂ@zÖ€æÞ ÇÑÂêÓÂ`Í ^ØÂ@€ÕÂàÕÂ`?ØÂàAâÂöÑ–á d×€ÚÂÀ‚ßÂ@>àÂÀóáÂÀ|à€½ÐÂ`ÈÖÂÀšÛ ÏÚÂÀ_ÐÂà¹ÎÂÐÂà¡ÒÂäÔÂ@ Ô ÙÂàèÛÂÀ#Ú€«Ó€|ÆÂàúØÂÒ×Â`øÎ®ÝÂ`Â× ÝÂÀYÑ  Í Ü ½ÝÂäÔÂÀ²×Â@¯â åÌÂ`-ÛÂ@»àÂÀjã€ÖÂÏÂ`ÎÕÂà_Ý ÚÂ@ŒÓ ‘ÚÂÀ”ÜÂ`àÂ@t×ÂÞÕÂÀ²×ÂÀ)ÙÂàeÜÂÀèÎÂ`-ÛÂà³Ï åÌÂ@zÖÂÀ²×ÂÀGÔ vÔÂà§ÑÂÀMÓÂÀk΀ÏÍÂЀWá —ÙÂ@VÜÂà0Р#ÍÂÐÂÀˆÞ ¥á çÖ µÔÂÀ;Ö vÔ€ØÂ 2Õ€·Ñ€±ÒÂ`Â× ±ß ÕÙÂ`òÏ€XÌÂ`ªÛ ùÓ çÖ ÕÙÂ@ÇÞÂÀ Ú€ÚÂÀ²× )ÌÂ`QÕ€XÌÂ@ëØÂ pÕÂÀ)ÙÂà}ØÂà‰ÖÂ@¤ÏÂ@†ÔÂÞÕÂyÑÂ@nØÂ AÈ vÔ bÍÂ`WÔ ‚ÒÂgÔ DÒÂàqÚÂàkÛÂ@ëØÂ VÏÂ@ÕÂ`ÚÓ€@ÐÂ@PÝ LÛÂ@€ÕÂàúØÂàÕ 8ÔÂÀÝÂ@zÖ ÕÙ€uÜÂÀßÂÀ/ØÂ`æÑÂüÐÂaÕ nËÂ%ßÂ`E×Â@ëØÂ ¯ÕÂ@˜Ñ€×Â`-ÛÂàèÛÂ@!ÐÂyÑ »ÓÂ`QÕÂ`æÑÂÀÛÂ@˜Ñ€:ÑÂ@žÐ ÁÒÂà›ÓÂàwÙÂ@åÙÂ`°ÚÂÀMÓ€™ÖÂ@ÑÂ@÷ÖÂ@JÞ 1êÂÀóáÂ`WÔÂ@ßÚÂ ÛØÂ@nØÂ ¥áÂÀvá´Ü€½Ð€É΀«ÓÂ@DßÂ`9Ù€ØÂ@ Ô 2ÕÂ`’ßÂ@nØÂÀÝ ¥áÂÀ/ØÂà¿Í d×€Ú¨ÞÂàèÛ ÛÂ@zÖ çÖÂ@ÇÞÂ@nØÂ€ÏÍÂØÖÂ@\ÛÂ`-ÛÂ@åÙÂ@PÝÂÀŽÝ ±ß ©Ö ÿÒÂgÔ £×ÂàHÌÂÀ¸ÖÂ`!Ý ÉÛÂ1ÝÂ`3Ú€ØÂÀ/ØÂ`]Ó€þÚ€"Õ ÏÚÂÀÝÂ@ÙÛÂÀÖÑÂ@˜Ñ Ù VÏÂÀÛÂà_ÝÂÀÈ€øÛÂ@>à€LÎÂ ÛØÂÀMÓÂ@PÝÂ@\ÛÂÀßÂ@ýÕÂ`þÍ ÐÂ`?ØÂ`ªÛÂÀôÌÂÀÚ .àÂ@ÙÛ ÁÒÂÀèÎÂàHÌ ÐÂÌØÂÀAÕ Ü ÛÂ`9ÙÂ@3ÍÂàÔÂÞÕÂà×€“× Ý 8Ô d× jÖ€ ÙÂÀˆÞÂ[Ö —ÙÂ`ÍÂ` ÌÂÐÂ`KÖÂà$Ò ØÂ`ìÐÂ@†Ô®ÝÂÀqÍÂàBÍÂ`QÕ€"ÕÂ@†ÔÂÀ;Ö€oÝÂ@ÑÂÀ;Ö€× RÚÂ@'Ï€"Õ€@ЀáÊ  Ñ€“×€(Ô VÏÂ`iÑ ¥áÂÐÂ`?ØÂ@ÓÂÞÕ pÕÂàØÂ€¥ÔÂöÑÂÐÂÀèÎÂäÔÂU×Â@nØÂÆÙÂU×Âà›ÓÂÀ5×Â`ÞÂÀÖÑÂ@ÒÂàÅÌÂ`ÚÓ d×Â`ÎÕÂaÕ€“×ÂÀeÏÂ`øÎÂàÓ€Ú€(Ô VÏÂ@nØÂ µÔÂêÓÂ…ÏÂÌÂØÖ äáÂ@Ñ nËÂ`iÑ€@Ѐ"Õ ÙÎÂÀŽÝÂР…Ü ÜÂ`àÒÂàÓ á×ÂÀâÏÂ`{΀™Ö ‚Ò PÐÂ`oÐÂÀYÑÂÀßÂàfÇÂÀâÏ bÍÂà0Р/ËÂmÓÂ`WÔ |ÓÂÀèÎÂ@nØÂÀÜÐÂàHÌ€^Ë ¾ÈÂ…Ï€@РJÑ ÒÂÀÜÐÂÀ­Ã€ØÂ€‡Ù—ÌÂà¹ÎÂØÖ€×Â`“ÊÂà×Â@’ÒÂàÕ »ÓÂÀƒÊ€óÇ ¦Ì€çÉÂ@ýÕ€LÎÂ@ýÕ ÇÑ óÔÂ@†Ô e ΀ÏÍÂ@KÉ€RÍ ŽÐ ÿÒ€«Ó€.ÓÂÀYÑÂIÙ &×  ÑÂà6ÏÂ`øÎÂàqÚ€ÃÏ Ë £× jÖ€:Ñ€"Õ ÙÂà}ØÂ ¯ÕÂà0РùÓÂÐÂÀ›ÆÂ€Ú jÖÂ@¶ÌÂÏÂàwÙÂ` Ì€¥Ô Π Í€pÈÂ@ÔǑ̀ÃÏ JÑ€½Ð€RÍÂÀwÌ ˆÑÂ`òÏÂn¾ÂöÑ€×ÂÀk΀|ÆÂà¿ÍÂÀ6ÂÂ`òÏ€RÍÂÏÂÐÂÀÖÑÂ`òÏ€:Ñ€(Ô€pÈ ÐÅÂ@øÁÂ`‡ÌÂàwÙ ÝÂ`ÚÓÂ@3Í€±ÒÂÀ}˯Ƞ¸É€áÊÂÀqÍÂÀÆÂ€RÍ€RÍ ÇÂ@ÑÂÀ˾ÂàÅÌÂ`æÑÂà0ÐÂ`KÖ€·Ñ VÏÂà‰Ö ñÊÂ`.ÆÂà›ÓÂ`ÉÂÀÊÓÂ`]ÓÂ`“Ê óÔ‹ÎÂ`¥Ç !À:Ñ #ÍÂPÃÂüÐÂÀÐÒ ¬ËÂà›Ó ëËÂØÖÂ@ýÕÂ…Ï vÔ ÒÂ@žÐÂ@!ÐÂðÒÂ`‡ÌÂ@ÒÂÀÖÑ /ËÂ`ìÐÂàÝÈÂsÒÂà¹ÎÂ@ ÔÂ`ÚÓ ÍÐÂÀÖÑÂà§ÑÂ@¤ÏÂ@†ÔÂ@t×ÂsÒÂ@žÐÂàÑÊÂ@žÐÂÐÂà­ÐÂäÔ pÕÂÌØÂ`ªÛ€(ÔÂà*Ñ€ŽÃÂàNËÂÀÐÒÂ`ÚÓ€½ÐÂüЀLΠÒÂàúØÂÞÕÂ[Ö ÇÑÂ`¶ÙÂ`-ÛÂÀSÒÂÌ€4ÒÂàÕÂOØÂÀ¦Ù€.ÓÂ@†ÔÂðÒÂÀ¸ÖÂÀ)Ù \ÎÂÀ5× ÐÂà‰ÖÂÀMÓÂ@¶Ì YÄÂ`-ÛÂà*ÑÂ`Ê€^ËÂàŠÁÂÞÕÂ`ÚÓÂÀÄÔÂ`KÖ ßÍ ÅÂ`{ÎÂ@†ÔÂÀ‰ÉÂ`æÑÂyÑ€LÎÂàãÇ ¦Ì€(ÔÂ@t×Â@Ñ »ÓÂ`?ØÂ@÷Ö€^ËÂ@ÈÉ€¥Ô #ÍÂ`uÏÂÀîÍ€pÈÂ`ÚÓ€uÜÂ`QÕÂà‰ÖÂÀËÂÀâÏ ÇÑÂÀÊÓÂà<ÎÂ`WÔÂÌÂðÒ€ŸÕ€ÛËÂÀSÒÂÀÊÓÂ`“ÊÂà³Ï€{Û —ÙÂà}ØÂ`9ÙÂsÒÂrçÂaÕ ÎÂ@ªÎÂÀYÑÂà*ÑÂÀGÔ€uÜÂàÓÂ@'Ï ÓÏÂÀâÏÂÀ5×€{ÛÂOØÂÀèΠñÊÂÀÄÔÂà‰Ö bÍ ÇÑÂÍÂyÑÂ`¥ÇÂ@÷Ö€íÈ ,Ö€ÕÌÂàÂ@>àÂàÖÞ ÚÂÀ_Ѐ@Р ÍÂØÖ€4ÒÂÀÜÐÂ@ªÎ óÔÂ@hÙÂ`ÉÂOØÂÀÜЀþÚÂ`Â×ÂmÓ jÖÂgÔÂ`WÔÂ`]ÓÂà¹ÎÂÀÚÂ`{ΠíÕ ©ÖÂÀAÕ€òÜ µÔÂÒ× ýÈ€ØÂ€@ÐÂÀ;Ö‘ÍÂ`“ÊÂ`cҋΠŽÐÂ@’Ò€ÃÏÂ@Ñ ÏÂ@ýÕÂyÑÂà­Ð >Ó d× šÎÂà‰ÖÂà$Ò jÖÂÀîÍÂÀÇÂÀYÑÂ`ÔÔÂÀôÌÂ`øÎ£ÊÂÀ_ЀæÞÂ`9ÙÂÀH¿Â \ÎÂ@†Ô€øÛÂ`ÔÔÂ`]ÓÂÀ5× —ÙÂÀÖÑÂ@¤ÏÂ`WÔÂÒ×ÂÀâÏ€4Ò ŽÐÂà ÁÂÐÂÀ¸Ö DÒ€ŸÕÂ`“Ê ÎÂ@ÒÂaÕÂ`iÑÂà0ÐÂ`™ÉÂ@3ÍÂ@÷Ö€þÚÂà*ÑÂà`È€RÍ ‚Ò€ØÂàÕÂ@nØÂ 5ÊÂÀ}ËÂà­ÐÂ`cÒÂ@øÁÂ`uÏÂ`ÎÕÂÀk΀óÇ µÔ€ÉÎÂ`ÈÖ ·ÞÂ@'Ï€RÍ ÍРhÌ ©ÖÂ`øÎÂà•ÔÂ[Ö ÒÂyÑÂ@3ÍÂöÑÂ`æÑ€±Ò ùÓÂüРjÖ€4Ò ÁÒÂàÝÈÂÀAÕÂ…Ï€jÉÂÀîÍÂ@†Ô pÕ€@Ѐ½ÐÂà$ÒÂÀÐÒÂÀ5×€iÞÂsÒ ÿÒ ·ÞÂ`žÝ€ØÂ@-ÎÂ`Í€æÞ€cß ¯Õ€“×Â`{ÎÂÒ×ÂÀÜР¦ÌÂàÑÊÂ`ÚÓÂöÑÂÀÊÓ €È È \ÎÂàÔÂ`WÔÂÒ×Â`ÎÕ ,Ö€FÏ ØÂ€(Ô ÇÑ€·Ñ ÇÑÂ7Ü Û€“×Â@Ñ vÔ ˆÑ€"Õ€‡ÙÂ@˜ÑÂà‰Ö ÇÑÂ@°Í€ÃÏÂÀ*ÄÂ@ÓÂ`ÞÂ@t× ŽÐ sß ØÂ@ªÎÂ`ìÐÂàYÞÂ@zÖÂ`‡ÌÂ`òÏ pÕÂà›ÓÂyÑÂCÚ ßÍ ÍРtÊÂCÚ€½ÐÂ@ÒÂàúØÂ,ÉÂÀúËÂ,É Ò ÐÂà•ÔÂ@˜Ñ©ÉÂ@†ÔÂ`øÎÂ@EÊÂ@'Ï ùÓ ßÍÂàBÍÂäÔ€ÚÂ`]Ó vÔÂ`ìÐÂ@Ó DÒÂà§ÑÂ@>àÂà‰Ö€øÛÂàèÛÂà¹ÎÂ@˜ÑÂà¨ÞÂ` á åÌÂ@ÈÉ€pÈÂàîÚ€4ÒÂÀÜÐÂ`Â×Â@¤Ï€™Ö€.Ó€¥ÔÂàrÅÂÀâÏÂ`E× ßÍÂÀšÛ ¯ÕÂÀšÛÂ@žÐÂ@ëØÂ@÷Ö€™Ö ˆÑ€™ÖÂ@hÙ á×ÂöÑÂàØÂ`9ÙÂ…ÏÂàôÙÂÀAÕÂà*ÑÂÀ/ØÂ ,ÖÂÀAÕÂÀÐÒ€QâÂÀMÓ€ÚÂ`’ßÂ`ßÂÀAÕÂÀˆÞÂ1ÝÂ@ÇÞ íÕ PР‹ÛÂ`-ÛÂ`€â XÙÂ`E×ÂU×€ØÂ€™ÖÂÀÖÑ€þÚ üÝ XÙÂà‰ÖÂ`'ÜÂ`°ÚÂàMàÂ@ÁßÂ@ÍÝÂà5ä ÉÛ &× IæÂ pÕÂ@€ÕÂ`æÑ íÕÂ@ÓÜÂàƒ×Â`cÒÂ@÷ÖÂÀ‚ßÂ`žÝÂÀMÓÂ`E×Â7Ü å …Ü€ŸÕ€«ÓÂêÓÂÀÐÒÂ@†Ô çÖÂÀ#ÚÂÀ;Ö¢ßÂà}ØÂàwÙÂ`iÑ€jÉÂ`E×Â@ñלàÂÀ;ÖÂ@ýÕ …Ü d×ÂÀŽÝÂàé–áÂ@ñ×Â`Þ —ÙÂ=Û &×ÂàúØÂ€ŸÕ ±ßÂàÄáÂ`!ÝÂ`Â×Â@ëØÂ€æÞ ©ÖÂ`ÞÂ@ëØÂ JÑ |Ó ýÈÂÀ;ÖÂgÔ vÔÂmÓ 2Õ µÔÂÀ)Ù &×Â`3Ú @ÝÂÀÐÒÂ`uÏ€"ÕÂ@žÐÂCÚ€ ÙÂ@\ÛÂ ÛØÂ€ŸÕÂ`Œà jÖÂÀ¦ÙÂ`ÞÂ=Û€ØÂ`ªÛ ÜÂà­ÐÂ@ÓÂà‰Ö ¥áÂsÒÂà×ÂàâÜ ‘Ú€ÚÂ`ÈÖÂ@ÁßÂ`’ßÂ`ÈÖÂ@é (á‹ÎÂ+ÞÂà•Ô€ÎâÂà_ÝÂàâÜ€@ÐÂÀÜÂà5ä ^ØÂ ‘ÚÂàwÙ LÛ ^ØÂÀÊÓÂaÕÂÀAÕ 4ß màÂÀ5× ÝÂàÜÝ ÛÂÀeÏ JÑÂ`¼ØÂà³ÏÂÀkÎÂà¿ÍÂ`þÍ ^ØÂ çÖÂ`æÑÂÀSÒÂÞÕ FÜÂ@\ÛÂÀÚ  ÑÂ`WÔ &×ÂÀÊÓÂÀMÓÂàƒ×ÂäÔÂ@]ÆÂËÂÀúËÂÀ;Ö€‡ÙÂÀ5×ÂÀqÍÂ@-΀ÔáÂÀÐÒÂ@ŒÓÂ@žÐÂ@hÙÂ`É  Ñ€@ÐÂà¹ÎÂÏÂà¹ÎÂàƒ× ‹Û vÔÂà×É )ÌÂ`cÒÂà×ÂaÕ  ÑÂüЀÕÌÂÀÖÑ€.ÓÂ@žÐ€ØÂ‹ÎÂ`Ë /ËÂàHÌ ·ÞÂÀÛ€XÌÂÀúËÂàãÇÂÏ€çÉÂ`]ÓÂ@¯âÂ@°ÍÂ`iÑÂ@÷Ö€·ÑÂà¡ÒÂ`E× ÙÂÀ‰ÉÂIÙÂ@zÖÂÀÖÑ€™Ö )ÌÂöÑÂ`Â×ÂÏÂÀôÌÂÀâÏ€(ÔÂ`!ÝÂÀ/ØÂ`ÞÂàÔÂ`]Ó ÁÒÂÞÕÂyÑ ¯ÕÂØÖÂ`!Ý€«ÓÂ@žÐÂ`’ß &×ÂàwÙÂÀÄÔÂ@ýÕÂ@ªÎÂ@¤ÏÂ`iÑÂà¹ÎÂà•Ô€@ÐÂàÅÌÂà›ÓÂà¹Î ÷ÉÂ@Ñ€óÇÂêÓÂàÜÝÂÀ‚߀ Ù€× :ÞÂU×ÂÀ ÚÂÀSÒÂüÐÂ`Þ íÕ€iÞÂÀ ÞÂCÚÂÀMÓÂÀÜÂ`¶ÙÂ+Þ vÔÂ`KÖ \ΠmàÂЀ^Ë šÎÂ`¶Ù Ù€ÖÂOØÂ ØÂÀ”ÜÂ`WÔÂäÔÂÀMÓÂ`ÈÖ€ÕÌÂÀ)Ù  Ñ€(Ô€ìÝÂ`ÞÂ@nØÂ ÕÙÂÀÊÓÂ@÷ÖÂ@ÕÂ@ Ô ^ØÂ`Þ 7éÂàÕÂàÕÂ@ÓÜÂ@ ÔÂ@\ÛÂàkÛÂ`ÎÕÂ`ëåÂà ÖÂ`þÍ€·ÑÂ ÛØÂ jÖÂÀ_ÐÂ ÛØÂ £×Â=Û pÕÂàÜÝ Û€XÌÂ@ŒÓ óÔ á×ÂÀ›ÆÂ‹ÎÂ@÷ÖÂàôÙÂ`KÖ€¥Ô ÐÂÀÜÂU×€ÏÍ ”ÏÂ@zÖÂÆÙÂÀ5×Â`WÔ€"ÕÂ`E×Â@PÝ€¥ÔÂsÒÂ`-Û€]à€ÚÂ@bÚ 4߀{Û ^ØÂ`ÈÖÂ~åÂÀšÛ ÇÑ jÖÂàYÞ€àßÂ`iÑ€Qâ gáÂà¡ÒÂ`ÈÖ XÙÂà×Â@Õ®ÝÂÀpâÂÀ ÞÂàeÜ |ÓÂØÖ€íÈ »Ó€øÛ€øÛÂ@t× üÝÂ`'ÜÂÀ#Ú óÔ€ÏÍÂÀÜ RÚ ©Ö€:ÑÂÀ¦Ù€àßÂ`Œà¢ßÂÀ Ú PÐÂàèÛ ÉÛÂ=ÛÂÀùàÂàƒ×Â@nØÂ`ªÛ€øÛÂ@ßÚ gá€ØÂàÐßÂÀ¬ØÂ@PÝÂàwÙ€FÏÂ`ÈÖ€æÞ ±ß€iÞÂ`˜Þ ã öÞÂàƒ×ÂÀvá (áÂ`à€ÂäÂ@>àÂÀˆÞÂÀíâ ^ØÂ ‹Û€ØÂ`˜ÞÂ`tä &×ÂÀˆÞÂÀáä «àºÛÂáÂ`KÖÂàwÙÂÀùàÂ@,ãÂ@ñ× RÚÂÀXæÂ@DßÂàÕÂÀ¦ÙÂÀÛå äÂ@ÓÜÂàqÚÂÀ)ÙÂàÊà€ØÂ@DßÂ`ñäÂ@ å€ÂäÂàGá RÚ ¥á´Ü [ã´ÜÂÀÝÂ@ŒÓ ðß Ìå ‹ÛÂ`ªÛ …ÜÂ@&äÂ`ñäÂÆÙÂ@÷֢߀æÞ ÙÂaÕÂàqÚÂÀÝ€{Û ©Ö ÜÂàÖÞ ¥á IæÂ€]àÂàôÙ .à ãÂ`?ØÂ@ÓÜÂà5äÂàúØÂÀ¬ØÂ€{ÛÂ`’ßÂÀÕæÂ`¤ÜÂÀdä ÚÂàAâ «àÂ@÷ÖÂÀ ÞÂÀÕæÂ@¯â€KãÂÆÙÂ[ÖÂ@nØÂ€òÜ ܺۀKã “ä€Èã€Èã “äÂ`àÂÀ/ØÂ óÔ …Ü€ìÝÂéèÂà²äÂ@ÓÜÂÀ‚ßÂÀáäÂÀçãÂÀ^å —ÙœàÂÀLèÂ@2âÂàÕ ¥áÂ`†áÂ`E×Ââ€uÜ€]à€ÔáÂÀ;ÖÂ`'ÜÂàîÚ€ØÂaÕÂàGá ÉÛÂÀ5×ÂÀÛ 4߀cßÂ@ÍÝ ØÂÀ ÚÂÀˆÞÂàwÙÂ@mí gáÂàMà ±ßÂ`ßÂàMàÂàAâ€ÚàÂ`¤Ü€Qâ€oÝÂ`˜ÞÂ7ÜÂÀFéÂ1ÝÂÀváÂ`Óé UäÂäÂÀáäÂà¸ãÂ@é sßÂ@gîÂàGáÂ`nåÂÀ ÚÂlèÂà5ä ãÂÀšÛÂÀÜ ÉÛ–áÂ@ÇÞÂ`tä ãÂ`¼ØÂ RÚÂÀÜ òéÂ@£äÂ ÆæÂÀdä€àßÂÀáäÂ`âÂàÐßÂà•ÔÂ@åÙ€3砱ߠØÂ Ÿâ Øã€ îÂàÄáÂ%ß =è€?å àìÂà ç€íÂ`Pê (á€Âä€uÜÂ ÆæÂ 7逿ÞÂ@ðìÂ@PÝ “äÂûåÂÀçãÂ`˜ÞÂ@ÇÞÂ`-ÛÂà)æÂŠãºÛÂ ÆæÂ€ îÂ@öë€iÞÂ@…éÂ@…éÂ@ÁßÂàéÂ@ßÚ ã äáÂ`DìÂ`àÂÀÚ (áÂàîÚÂàšèÂÀÝÂ@PÝÂ` áÂ@ÍÝ€¼åÂéè ÃÜ WîÂ`ßçÂ@ÁßÂféÂ+ÞÂÀíâÂ@çÂ`˜Þ yÞÂÀùàÂ@åÂ`žÝÂ`â¨ÞÂâÂ`°ÚÂàÊàÂ@2âÂ=Û€æÞÂÀ^å€-èÂ`âÂ@PÝÂà ë€cßÂ@©ãÂä€Èã®ÝÂ`àÂ%ßÂÀùàÂ@JÞÂÀˆÞÂ@©ãÂàAâ üÝÂÀóá€ØÂ`¤ÜÂ@>à ©ÖÂàeÜ  æÂ Òä€iÞÂÀ#ÚÂ`†á LÛÂ`ÞÂöÑ jÖÂÀ#ÚÂ@\ÛÂ@>à€½ÐÂIÙ€Úà Ý ÕÙÂÀ ÞÂ`àÒ üÝÂÀÜÂä€àßÂ ÛØÂ`¤ÜÂrç sß :Þ¢ßÂ@D߀9æÂâÂ`ŒàÂ[ÖÂ@VÜÂà²ä€ØÂ@bÚÂ@çÂâÂàÜÝ€æÞÂàØÂºÛ¨ÞÂ@ Ô€ØÂ`ßÂ@ÓÂàÊà€òÜÂÀváÂàîÚÂÀˆÞ€ÚÂ`'Ü êàÂÀùàÂ@JÞ i뀒ìÂ@ç UäÂà5äÂ=ÛÂà­Ð€?åÂ`DìÂ`†á€uÜ [ãÂ@‘çÂÀ5×Â@,ã íÕ ±ßÂ`àÂ`†áÂ`\è®Ý çÂÀšÛ€(ÔÂ`˜ÞÂ@t× ™ã üÝ€™ÖÂ`¤ÜÂ`˜ÞÂâÂÒלà IæÂ`ëåÂ+Þ ÜÂàYÞÂêÓÂ`ÈÖÂ@ÇÞÂàÐßÂàôÙÂäÔÂàqÚÂÀÚÂÀÉèÂ@ÙÛÂÀ‚߀øÛÂÀÛ€ÈãÂ@æÂ þçÂÀGÔÂÀÝÂ@£äÂ`»íÂàÖÞÂ`¤ÜÂÀ Þ€ÔáÂàÐß :ÞÂ`3ÚÂÀß IæÂ@ÍÝŠãÂ@£äÂaÕ 2Õ ±ßÂ%ßÂÀ/ØÂ€þÚ ±ßÂ`3ÚÂà‰ÖÂÀÝÂ@hÙÂ`-Û€ÈãÂàMàÂgÔ ÝÂÀÚÂ@ÇÞ€uÜÂàqÚ€K〤é "âÂ@>àÂ@ëØÂ á×Â=ÛÂ`KÖ€àßÂ`¶ÙÂÀÊÓÂà_Ý ½ÝÂ`'ÜÂ@ßÚÂàØÂ ØÂ@åÙÂ`3Ú FÜÂÀˆÞ–áÂäÔÂÀ¬ØÂ@’Ò€.ÓÂ1Ý€æÞ€ÔáÂàÖÞ VÏÂ`Â×ÂàÔ€cßÂàîÚÂ`¶ÙÂÆÙÂà/åÂàôÙÂà•ÔÂÀšÛÂÀè΀‡ÙÂ@bÚÂ`!ÝÂÀ)Ù .à‹ÎÂ`9ÙÂàwÙ€Wá ©Ö€ÖÂÀGÔÂÀÜРçÖ ÙÂàâÜÂàÜÝÂ`åæÂ ±ß ©Ö LÛÂÆÙÂ` ÌÂ@ñ× ÒÂüÐÂÀ¾Õ Ú XÙÂÀ²×ÂÀMÓÂÀ²×ÂÀ Ú …ÜÂCÚÂÀSÒ€™ÖÂ`ÈÖ€Kã€{ÛÂâÂ`žÝ .àÂÀ‚ßÂ`’ßÂàÖÞÂsÒ êàÂàôÙÂ…Ï £×Â[Ö€ìÝ€þÚ€ìÝÂØÖÂ`ÎÕÂ`ÈÖ ÜÂ@ÙÛÂàÕ ÏÂ`¶Ù€ØÂ´Ü€ÛËÂÀ Þ á×Â`ÞÂ`ÈÖ€"Õ \ÎÂyÑ ŽÐÂ`ªÛÂ@÷ÖÂàqÚÂà‰ÖÂàúØÂÆÙÂ@ Ô€¥ÔÂàÖÞÂ ÛØÂ@’Ò ÃÜÂ`ÎÕÂ@ýÕÂ`Â×ÂÀ¦ÙÂÀ¾ÕÂ@'Ï€ÖÂÀáäÂàGáÂÀGÔÂ`]ÓÂÀ¾Õ ÐÂ7ÜÂ`KÖ€"ÕÂöÑÂ@JÞÂ@PÝÂÆÙÂÀ¬ØÂÀ¾ÕÂ@DßÂ@ÁßÂÀ#Ú€“×€?åÂàîÚÂÀ Ú ÌåÂà³ÏÂÀwÌÂà}ØÂ  Ñ µÔÂ@˜ÑÂÀAÕÂ`QÕÂ@!РXÙÂ@&ä 2ÕÂ`¼ØÂØÖ ðß d× ÇÑÂðÒ çÖ ¯Õ€¥ÔÂ`ÚÓ€Ú 4ßÂàØÂÀÄÔ´ÜÂöÑÂ`Â×€ ÙÂ`ÎÕÂà¡ÒÂÀ ÚÂÀ²× LÛ ëË 5Ê íÕÂ@ŒÓ ‹Û bÍÂÀÐÒ€áÊÂ8ÇÂÀÖÑ ÎÂêÓÂÀ_ÐÂ`æÑÂ`oÐÂ@ÒÂ@2âÂàîÚ ¯ÕÂà§Ñ µÔÂ`QÕÂà§Ñ€ÚÂ@Õ€]à€cßÂàËËÂ@hÙÂ`3ÚÂ`Â×Â@Õ ëË ÉÛÂ@VÜÂ@ÓÜÂCÚ€ŸÕ 8ÔÂðÒ€"ÕÂàúØÂ€«ÓÂàÕÂÒ×ÂÀGÔÂ@†Ô€FÏÂÍÂ@üêÂ=Û ^ØÂà}ØÂ€:ÑÂÀkÎÂ@nØÂ ÓÏÂ@!ÐÂ[Ö VÏ€™ÖÂ`°ÚÂàîÚ óÔÂÀ¦ÙÂ@ÇÞ DÒÂÀ;Ö #ÍÂÀGԴܑ͠ÉÛÂÀYÑ€Ú€½ÐÂ`ÎÕ …Ü€ÚÂÐÂ@¶Ì€ÖÂàƒ×Â`]ÓÂàúØÂÀ5×Â`ÈÖÂÀ²×ÂàâÜÂðÒ€“× Ï sßÂà$Ò JÑÂ`¶ÙÂÀMÓ€{ÛÂ`iÑÂÀSÒÂ@žÐÂ7ÜÂÀÜÂ`'Ü çÖ PР\Π8Ô £× ^ØÂ £× 8ÔÂà³ÏÂ@ŒÓÂ@€ÕÂ`žÝÂРöÞ€‡ÙÂ@ÒÂ`QÕ &×Â`E×ÂàeÜ€ ÙÂ`¼ØÂIÙÂ1ÝÂ`9ÙÂêÓ 2Õ µÔÂÀ/ØÂ€{ÛÂÀ¸ÖÂ@bÚÂ`ŒàÂ`Óé®Ý€æÞÂ`àÒ€«Ó€·ÑºÛ «àÂÀŽÝÂÀ¸ÖÂ@bÚÂÀ)ÙÂÀ;ÖÂà$ÒÂ@Áß êàÂàqÚÂÀ)Ù RÚÂ`߀™ÖÂàBÍÂ`æÑÂ@Õ ÏÚÂÀMÓÂÀ5×Â@ñ×ÂÀóáÂ@ÍÝ ÁÒÂà}ØÂ@ëØÂ@-Π£× ÜÂ`?ØÂÀMÓ &×ÂàÔ€uÜÂàÖÞÂÀÜÂ`ÞÂ`9Ù šÎÂCÚ€ÚÂ@ÙÛÂà$ÒÂÀ”ÜÂ`â€òÜÂàÜÝÂ%ßÂÀGÔÂ@ÍÝÂ@\ÛÂ`9ÙÂ7Ü gá Ý ÐÂÀÐÒÂÒ×ÂÀ#ÚÂyÑ ÓÏÂ`æÑÂÀpâÂÀ‚ß ½Ý ®êÂ`¼ØÂ€àßÂ1Ý :ÞÂ`3Ú€(ÔÂ@bÚÂä ¯ÕÂgÔÂ@€Õ€±Ò€c߀cß ÏÚÂàúØÂ€æÞÂàÂÆÙ ‘ÚÂ@&äÂàGá€øÛÂ@åÙÂÀ¬ØÂ 2ÕÂÀÊÓ ‘ÚÂà*ÑÂàîÚ€øÛ¨ÞÂÒ×Â@ñ×Âà›Ó€iÞ CçÂ@zÖÂàâÜÂàHÌÂ`?ØÂ`Â×ÂàúØÂ ÁÒÂ@˜Ñ€ØÂàYÞ€ÖÂ@ÕÂàÕÂ`nåÂ`†á€Ú ÕÙÂ…Ï´ÜÂ@Áß :ÞÂ`÷ã¢ßÂàÊà RÚ€ØÂ &×ÂàîÚÂàYÞÂ`-ÛÂÀÜ€‡ÙÂ@’Ò€ Ù ÜÂà•ÔÂ@ñ×Â`˜ÞÂÀ;ÖÂàâÜ :ÞÂ`Œà RÚ ÝÂ`!ÝÂ@Áß jÖºÛ íÕÂ@ÓÜÂ`’ßÂÀ¦Ù€þÚ€ìÝ sß ‘ÚÂÀ Ú ÙÂÀŽÝÂÀˆÞÂÀÚÂyÑÂ@€ÕÂà}ØÂ ðß mà€"ÕÂ`-ÛÂàÕÂà ëÂ@ëØÂ€ìÝÂ…ÏÂ@!Ѐ·Ñ€‡ÙÂ`÷ã á× JÑÂáÂ`â€Ö€ŸÕÂÀÛÂÀváÂÀ”ÜÂàÔ€ØÂ€ÚÂ`Œà€‡Ù€]àÂCÚ pÕÂÀÐÒ Uä ÕÙ XÙÂÀqÍÂ`ÔÔÂàËËÂ@3ÍÂ@PÝÂ`žÝÂÀ;ÖÂàÖÞÂäÂÀŽÝÂ`9Ù íÕÂà¸ã€‡Ù sßÂàÝÈ€@РÒÂ@ñ×Â`'Ü€{ÛÂ`!ÝÂ`ýâÂ`-Û ä RÚÂ`˜ÞÂ@»à ÏÚÂ`9ÙÂ`KÖÂ@PÝÂ@hÙÂÀšÛ ·Þ yÞÂ`QÕ€¥Ô üÝ„äÂ[ÖÂ`-Û ‹ÛÂ`!ÝÂÀÕæÂ íÕÂÀÝ€ ÙÂÌØÂäÔ ©ÖÂàÕ ÃÜ€«Ó LÛÂ`’߀‡ÙÂÀ5×Â@©ãÂØÖÂà×ÂÀ5× jÖÂ@Ó ÿÒÂ@\ÛÂ`¶ÙÂ`-Û ØÂ@åÙÂàôÙÂЀÖÂ@€ÕÂÀ Ú ©Ö€{ÛÂ@bÚÂ@ÙÛÂàeÜÂÀˆÞÂá ™ãÂÀÛåÂIÙ€:ÑÂÞÕÂ@PÝÂÀÝÂ7Ü–á€òÜÂIÙ€“×€Âä ©Ö äÂ@ÒÂ`ÈÖÂ@2‶æÂ` áÂ…ÏÂàƒ× äáÂÀšÛÂÞÕÂCÚ€™ÖÂ`ªÛ€ØÂàÖÞ XÙ€.ÓÂÀÜÂ@\ÛÂàMà€ìÝ€uÜ @Ý ^ØÂ@,ãÂÀóá€{Û £×ÂÀóá Û Û€ÚÂÀ5×Â@ÓÜÂyÑ yÞ FÜ€™ÖÂàÖÞÂ@PÝÂà¦æÂáÂÀ/ØÂàYÞÂåÂÀ ÚÂàwÙÂ@ÍÝÂ@ßÚÂÀ¦Ù .àÂ`!Ý€{Û Ù çÂÀ½ê PÐÂà¹ÎÂÀ_РsßÂÀpâÂ@£äÂ@ÙÛÂÀFé€iÞÂ`hæÂ ÛÂÀ Þ€àßÂ@ÁßÂ@æÂÆÙÂàYÞÂÀÉèÂàƒ×€'é–á Òä äÂàeÜÂ`täÂà#ç ÝÂ`’ßÂà;〰çÂàwÙÂÀùà€ìÝ€‡ÙÂ@ñ×Â`cÒ @Ý€]àÂà_ÝÂ@ å çÂ@çÂCÚ€Ú ½ÝÂ`÷ã êà ÉÛ ½Ý€òÜÂà¬åÂÀ|à Þâ€ÃÏ ØÂÀLè "âÂ@ÓÜÂÀÛå ½ÝÂÀ)Ù sß ÝÂ`°ÚÂ@JÞÂ@ßÚÂà§ÑÂàBÍÂ`¶ÙÂU×Âà$ÒÂÀ#Ú€iÞ çÂ@>àÂ@µáÂ+Þ€øÛ @Ý >ÓÂà$ÒÂ@DßÂ`ÔÔÂÀ‚ßÂÀŽÝ€9æÂÀšÛ yÞÂêÓÂ@ÂÊÂÀ/ØÂÀšÛÂàâÜ€«Ó ÕÙÂàÊàÂÀˆÞÂ`¤ÜÂ`E×€Âä€Ú ðßÂCÚÂU×ÂØÖÂ`zãÂ`EלàÂ7Ü€¶æÂåÂàkÛÂÞÕÂ@DßÂ`ÎÕÂ`]ÓÂÀˆÞÂàâÜ "â IæÂàkÛ€¼å äáÂ@åÂ@ÁßÂÀ/ØÂ`â äá ùÓÂàÄáÂàMà ™ãÂ`\èÂ@ßÚ€oÝÂÀpâ€øÛ€ÚàÂÀÉèÂ@\ÛÂäÔ€ØÂ`?ØÂ7ÜÂÀ ÞÂ@»à LÛ ‹ÛÂ@t×Âà}ØÂÀ¬ØÂàÖÞ £× #Í pÕ üÝ á×ÂÀÛÂ ÛØÂ`9ÙÂÀ¬ØÂÀXæÂ ØÂÀ/ØÂ@&ä€cßÂÀRçÂIÙÂ@ëØÂ yÞÂ@ ÔÂ@€ÕÂà×Â@å€þÚ€Ôá€]à Ú€Qâ ±ßÂ@ßÚÂ`?ØÂ€þÚÂ@t×ÂÀ ÚÂàqÚ êàÂsÒÂÀYÑÂ`˜ÞÂ@8ေҠÃÜÂ`zã RÚÂ`žÝ€]àÂà‰ÖÂÀÜÐÂ`ÚÓÂÀ²×ÂÀ#Ú ã ØÂ@ñ×´ÜÂ@€Õ ðßÂ`߀øÛÂ@ÍÝÂàwÙÂ`¶Ù (á€ÚàÂIÙÂ=ÛÂàé€ÚÂàôÙÂ`æÑÂ`Œà Р«àÂCÚÂ@ Ô€½ÐÂ@»àÂ@ÙÛÂÀváÂ`žÝÂ@÷ÖÂàèÛÂ`ßÂÀ#ÚÂ`àÒ€øÛÂ@\ÛÂ@ñ×ÂÀ‚ßÂàwÙÂÆÙ€uÜ€°ç€ìÝ d×ÂàèÛŠãÂ`°ÚÂÒ×Â`’߀Ö€±ÒÂ@bÚ åÂÀ/ØÂ`ßÂÀÐÒÂ@ÓÜ á×Âà­ÐÂÀ·ë€þÚ FÜÂ`˜ÞÂà¾â Ù ØãÂÀçãÂà¸ãÂÀAÕ€ŸÕÂÀŽÝÂàÊà (áÂ@†Ô€4ÒÂÀMÓ &×ÂÀŽÝÂÀùàÂ`ßÂÀSÒ€4ÒÂÀ¦ÙÂ@ßÚ€iÞ ÏÂàƒ×ÂàYÞÂ`ÔÔÂ`ßÂà_Ý ãÂ@PÝÂ@ÇÞÂ`-ÛÂàƒ× ‹ÛÂÀdäÂ`ËÂ`¼ØÂ€KãÂÀ#ÚÂ`ªÛ  ÑÂ+ÞÂÀôÌ åÌÂÀ;ÖÂÎÂ`ÈÖÂàâÜÂ`zãÂàSßÂ@>à€-èÂ@bÚ gáÂà× ©ÖÂ@\Û 4ßÂâÂ`9ÙÂà$ÒÂ`ìРêàÂ@bÚ ÇÑÂàÖÞÂàîÚÂÀ Ú 8ÔÂ@ÍÝÂ@ŒÓ ÒäÂ@žÐÂàÖÞ€ÎâÂ`ªÛ€™Ö ™ã XÙ€‡Ù ÿÒÂ=Û€þÚ€4ÒÂÌØÂ …Ü lõ€æÞÂ@©ãÂ@ëØÂ€"Õ€“× ÉÛ¨ÞÂà§Ñ @ÝÂ@t×€ìÝÂ`?ØÂ€þÚÂ`täÂÀ_ЀŸÕ€ÚÂàqÚ ¥áÂ@bÚÂ`¤Ü çÂrçÂÀßÂÀÝ [ãÂ@D߀-èÂÀÜ€uÜÂàîÚ ØÂ`zã€òÜÂÀóá€WáÂà”é€?åÂ`€âÂ@VÜ :ÞÂÀ/ØÂ1ÝÂ`€âÂ@ÓÜ€ìÝÂÀ|à 4߀iÞÂ`ÍÂÀùà€WáÂÀ¾ÕÂ ÛØÂàÜÝÂ1ÝÂ`âÂà_Ý€àßÂ%ß 4ß ã :Þ€“×Â@zÖÂ`àÂàÊà€¼å€«Ó ÃÜ oêÂÀdäÂÀXæÂ äÂ`†áÂÀjã€'éÂfé åÂïç€Eä€ÔáÂ`ÍêÂàèÂà¸ãÂ@»àÂ`zã ÃÜ€QâÂ@,ã ·ÞÂ@bÚ 4ßÂÀŽÝ ‘ÚÂâÂàìÂ`zãÂÀ”ÜÂ@ÍÝÂ@µáÂ`ýâÂÀAÕÂ@zÖ åÂ`Çë Ù€æÞÂØÖ€]à ØÂ€¶æÂ@æÂÀRçÂàÊàÂÀ)ÙÂ`ñäÂà/åÂà”éÂàSß ÏÚ ÞâÂ@»à åÂÀXæÂ ÛÂ@èÂÀLèÂ@DßÂHîÂ`åæÂàÖÞ€?å€ ÙÂàwÙÂ`tä ðßÂ@êíÂà¾â ŸâÂ@>à “äÂ1ÝÂÀÄÔÂÀÛåÂCÚÂÀLè aâÂ`’߀WáŠã ™ã  æÂ€Âä€iÞÂÀ¸ÖÂà‰ÖÂÀ”ÜÂ@£ä Ý ué€Kã äœàÂà)æÂàÖÞÂà¾â ½ÝÂ@ åÂàâÜ€ìÝÂàO¶ÂÀ™ð ÚíÂ`\èÂ`'ÜÂ@nØÂ`E×ÂÀpâ€æÞÂ`ªÛÂ`ýâ€àß ‡æÂ@—æÂU×Â@&äÂÀ ÚÂÀ"ïÂÑìÂä …Ü€àß®ÝÂÀXæÂ @ÝÂ@\ÛÂ@2âÂàÄá€4ÒÂÀ^åÂ`°Ú óÔÂ`ÞÂ`€â gáÂ@8á€ØÂÀpâÂ`°ÚÂÀdä€ ÙÂàqÚ ØÂ=ÛÂÑì ¥áÂ@>àÂÀ/ØÂÀ)٠݀Ôá€ÔáÂÞÕÂ`3ÚÂÀ¸Ö ÛÂ`cÒ á×€{ÛÂ@PÝ€ìÝ &×Â@ÇÞ€QâÂ@t×Â`ëåÂ` á —Ù€ØÂ%ßÂ`oÐÂ@€ÕÂ@ ÔÂÀwÌÂÀ¦ÙÂ`Â×Â@hÙ ·ÞÂÀçã€ØÂ€ÎâÂ%ßÂàÕÂÀŽÝÂ`â RÚ ·ÞÂàèÛÂÀ5לàÂÀ;Ö ÿÒ £× ãÂÀÿßÂÀ¥îÂ@nØÂ ÍРpÕÂ`¤Ü ^ØÂ FÜÂ@ÕÂàËËÂaÕÂ@ÒºÛÂÀ;ÖÂöÑÂÀ¾Õ€.Ó€½ÐÂÀÐҮ݀ÃÏÂ`ÈÖ€ÚÂàâÜÂà*ÑÂ@'ÏÂ`ýâÂ@ñ×Â@Ó€@ÐÂÀ¾ÕÂÀ5×ÂOØÂàÕÂ@QÈ€ŸÕÂàÓ€ÕÌ VϠ݀oÝÂà­ÐÂà›ÓÂ[ÖÂ@ÙÛÂÀÊÓ ØÂ`.ÆÂ€pÈ‹ÎÂÞÕÂ@'ÏÂà0ÐÂÀÄÔÂ`Â×Âà‰ÖÂ`ÚÓÂÀ_ÐÂ@ÍÝ€ÛË  Í€.ÓÂà$Ò —ÙÂ@žÐÂàØÂàôÙÂ`KÖÂ@åÙ çÖ &×€øÛÂ@ ÔÂàZÉÂ@žÐÂöÑÂÀÝÂàkÛÂ`Â×ÂÀeÏ ÙÂà× çÖÂÀšÛ ÓÏÂ`oÐÂàúØÂ¢ß€™ÖÂ` Ì€XÌÂ`QÕÂàÖÞÂÀk΀:ÑÂ@bÚ pÕÂÀ”ÜÂàYÞÂàÂàØÂ`'ÜÂ@ëØÂÒ×Â` áÂ`oÐÂ@åÙ &×Â`žÝ \ÎÂsÒ —ÙÂ`ÈÖÂàÖÞ ÍЀ±Ò€‡Ù€Wá ¯ÕÂÀÚÂ`Þ€LÎÂ`ÈÖ€™ÖÂØÖÂ@Õ€Ú€{ÛÂÀ”ÜÂ`KÖÂ@ýÕÂÀSÒÂU×´Ü€9æÂÀSÒÂÀÖÑ ·Þ€ØÂ çÖ µÔÂ`ÚÓÂà;ãÂàèÛÂ`ÚÓÂ`àÒÂ`oЀFÏÂÀÄÔÂ@©ã€"ÕÂ`ÚÓÂ`cÒÂÀÛ ·ÞÂ@ ÔÂyÑ€ØÂ`¼ØÂ@€ÕÂÀ;ÖÂÀÜ€(ÔÂÀÊÓÂ`ÚÓÂÀ^å ùÓ pÕÂÀ/ØÂ PРVÏÂÀYÑÂ1ÝÂÀAÕ€ÃÏ€(ÔœàÂ@ÙÛÂ`'ÜÂ`†á€ÔáÂÀçãÂàÂÀÚÂ`E×€ ÙÂàqÚÂ@žÐÂ`æÑ d×Â@ëØÂ@ñ× óÔÂÀ ÚÂЀŸÕÂàØÂ ÝÂaÕÂÀ¸Ö £×ÂÀ ÚÂà}ØÂ@ßÚÂÀÿßÂ@JÞ çÖÂ@÷ÖÂÀváÂ@—æÂ@PÝÂÀvá¨ÞÂàqÚÂ@ßÚÂ`9Ù ^ØÂ€þÚÂ`'Ü€"Õ gáÂÀÜÂàÜÝÂ`¤Ü [ã Ú DÒÂ@!ЀÚ€™Ö€ŸÕÂ@Õ DÒÂàkÛ€øÛÂ@>à€ØÂ€Ö€™ÖÂ`Â×Â@zÖ 2ÕÂàÓÂyÑ XÙÂÀ¸Ö ÉÛÂÀGÔÂ@ÑÂÀ ޠ݀þÚ€«ÓÂ@hÙÂ`ÎÕÂ`ñäÂàôÙ ÛÂÀjãÂÀváÂ`òÏÂàÐß XÙ€þÚÂ@ßÚ …ÜŠã€ÔáÂüÐÂ`“ÊÂÀèΠ ÍÂÀÿß µÔÂ@ýÕÂàƒ×Â@ ÔÂ`ýâ ØÂ`?ØÂ`!Ý€òÜÂ@bÚÂ`€â —Ù€ÚÂ@÷ÖÂ@ÍÝÂàúØÂàYÞÂ%ß åÂ`nåÂà ç ‘ÚÂ@nØÂ€-è ‚ÒÂ@ªÎ µÔÂÌØÂ@!Р½ÝÂ`'ÜÂàêÂ@t×Â`ìÐÂ`3ÚÂÀváÂ`¤ÜÂ`ìРêà jÖ€@ÐÂÀÿßÂOØÂà‰ÖÂÀjã ]íÂ@€ÕÂàÓÂÀÄÔÂ`ªÛ VÏÂ`¶ÙÂÀ¸Ö€øÛÂ`ÎÕ¨Þ íÕÂÀ5×€Ö jÖÂ`ÞÂ@ßÚÂ ÛØÂmÓ€oÝ ÜÂÀ#Ú€·Ñ öޢ߀¶æÂ`žÝ gáÂàwÙ >ÓÂ@ÇÞÂàGáÂÀÛÂ`ýâ€ìÝÂ`3ÚÂmÓ óÔ &× ÏÂ@ ÔÂ@åÂ`€â »ÓÂ`ÈÖÂ`Þ (á gá€{ÛÂ`°ÚÂÀíâ€oÝÂ@JÞÂàúØÂÀÿßÂÀùàÂ`-ÛÂÀÜÂÀ¸ÖÂ`ÎÕÂ@Ò€ Ù€™Ö êàÂàƒ×Â@Ѻ۠gá€ìÝÂ`àÒ :ÞÂOØÂÀ”ÜÂ`ÎÕÂÀAÕÂàYÞÂ`]ÓÂÒ×Âà¬å€:ÑÂ@nØÂàkÛÂÀ”ÜÂÀŽÝÂ@æÂ`?ØÂÀˆÞÂ@ÇÞ€iÞ ÉÛÂ=Û Û€E䀇ÙÂàƒ×ÂàÕÂàeÜÂâ€KãÂÀ²×Â[ÖÂ`¶ÙÂàMàÂÀ#ÚÂàƒ×Â@ÇÞÂÀÝÂÀ5× 4ßÂÀAÕÂÀGÔÂÀ ÞÂlèÂ=ÛÂ` á¨Þ€ ÙÂ@ßÚ LÛÂÀ ÚÂà›Ó€±ÒÂ@VÜÂ`-Û µÔÂ`¼ØÂÀdä ÛÂàÄá ÇÑ ÿÒÂ`àÂäÔ€uÜÂ`!ÝÂ@JÞ Û ÿÒÂ@t×ÂÀÛ€þÚÂÀ|àÂàqÚÂ@PÝÂ@DߺÛÂ@ñ×€iÞÂ`WÔÂàèÛ€Ú ¥á€Ú sßÂà)æÂ`!ÝÂÀÜÂ@t×Â`÷ãÂàúØÂ`ÚÓÂØÖ ±ßÂ@£äÂàÜÝ€þÚÂàèÛÂ@bÚÂÀˆÞ ÛÂ1ÝÂ`tä€!êÂ1Ý 2ÕÂ@÷ÖÂ=ÛÂ@ÍÝÂÀFéÂà çÂ@DßÂ7Ü€×Â@JÞÂàwÙÂÀÕæÂ êàÂ`¤ÜÂIÙ ‡æÂ`KÖÂà ÖÂàÔÂ@÷Ö LÛÂ@ å€æÞ ÙÂâ ‡æÂ€'éÂåÂÀóáÂ1Ý ðßÂàîÚ çÖ ©ÖÂ@PÝÂÀ¬ØÂàwÙÂÀíâÂ[Ö Ú  æÂÀXæÂ`…ö€]à€{ÛÂàÐßÂ@PÝÂ%ßÂ@hÙÂ`9Ù ±ßÂÀçãÂ@ÙÛÂàSßÂ@¤ÏÂÀùàÂéèÂâ€Ú€]àÂ`3Ú ÝÂ`!Ý Øã :Þ€øÛ ÀçÂ%ß ŸâÂÒ׺ۀòÜ€Wá ØÂÀváÂlè€zðÂ~åÂ@¯â€oÝÂÀjãÂ@æÂÀ߀òÜÂà²äÂ`ñä€ë àì åÂÀáä Þâ øèÂ@ç€KãÂ`ýâÂ@…éÂà;ãÂà¦æÂ`ê öÞÂãéÂ@èÂõæÂàAâÂÀ¦Ù€Kã´ÜÂàeÜÂá öÞÂà²äÂÒ× [ãÂàÜÝ€iÞÂÀ ÚÂà ‹ÛÂ`ŒàÂÀ/ØÂ UäÂàÄá &×Â@ëØÂÀÝÂàqÚÂÀ¾ÕÂ`¤Ü äáÂ@ÍÝ€àßÂ@ÙÛ (áÂ`bçÂÀ¬ØÂ€]àÂ@2â [ã ÏÚ "âÂ@Dß ðß ‘ÚÂà¾âÂà_ÝÂà­ÐÂ`Œà€{ÛÂ@bÚÂ`¶Ù vÔÂ@8áÂÀÛÂáÂ@ åÂàSß„ä ÞâÂÀíâÂ@Á߀àßÂ@zÖÂÀ¬ØÂàÜÝÂÀSÒÂ@PÝ  æÂâ Øã oêÂ`àÂ`ëå€ÎâÂ`ýâÂ@è RÚÂÀvá¢ßÂÀdä PÐÂÀ²×€±Ò (áÂ@sìÂÀíâÂ@ÇÞÂà¬åÂÀ|àÂ%ß 4ß iëÂ`>í @ÝÂà oê oêÂ`ëå CçÂ`ß„äÂÀšÛ ãÂàÊàÂÀ|àÂ`†á ŸâÂÀ)ÙÂ`¶Ù ÌåÂ@»àÂ`˜ÞÂàâÜ 1êÂ@PÝÂ7ÜÂÀùà ÝÂxæÂ@ê ±ßÂàGáÂâÂ@DßÂÀÿßÂ`\èÂÀÛå ué ÉÛÂáÂÀpâ Oå «à€iÞ "â€]à ùÓÂïçÂÀóáÂÀ#ÚÂÀ)Ù€iÞ€ÔáÂ`'Ü öÞÂêÓÂ@åÂàeÜÂÀ”Ü @ÝÂàqÚÂ@¯â–áÂ@ å€WáÂÀáäÂà× Ý =èÂ`ýâÂ`ëåÂÀÛÂÀÖÑÂÀ¦Ù gáÂ@!ÐÂà á×€uÜ ÝÂÆÙ ÏÚ ^ØÂàèÛÂ`QÕÂ`!ÝÂIÙÂÀ Þ 4ßÂ@bÚÂÀùàÂà¸ãÂ`€âÂ@£äÂ@öë–á€ìÂÀ;Ö ½Ý€uÜÂ@\Û ‘Ú¨Þ€Ö ‘ÚÂ@ðì êàÂ@\Û€àßÂÀ)ÙÂ`3ÚÂ`Þ€ÔáÂà¬å uéÂâÂÀßÂàÊàÂàáñ ûòÂZëÂÆÙ gá¨Þ d×ÂÀÿß ¥áÂrçÂÀùà€¤é€ÔáÂà¦æÂ`PêÂ`V逰ç (áÂÀŽÝÂ@8áÂ`÷ãÂÌØÂÀ‚ßÂ@ÍÝ êàÂàqÚÂàMàÂ@£ä ¯Õ ÙÂàYÞ £×ÂáÂ@>àÂ`¼ØÂ@»àÂ@å FÜÂ@†Ô :ÞÂàÖÞÂÀçã 2Õ¨ÞÂ@ÙÛ€Úà ÝÂ`€â¨ÞÂàYÞÂÀ|àÂàôÙ ‹ÛÂà ë€ìÝÂÀváÂÀ”ÜÂ@êÂ@µá„äÂ@ýÕ LÛ ÓÏ€ØÂÀÄÔÂÀváÂ@D߀ìÝÂIÙ€øÛÂÀAÕÂÀ|à 4ßÂà•ÔÂ@zÖÂ@¯â ™ãÂÀÜÂÀÛ€"ÕÂà¡Ò€ØÂ ÛÂ@ÙÛÂ`’ßÂ`Þ€ìÝ€½ÐÂàÂàÄá sßÂ@ Ô–áÂÀíâ€×Â`†áÂ[ÖÂÀŽÝÂÀ^åÂ@>àÂ@VÜ ŽÐÂàÜÝÂ@,ãÂàÜÝÂ@ýÕ€·Ñ€òÜ€ìÝÂÀÊÓÂOØÂ íÕÂ`¼ØÂàèÛ€Qâ DÒ€QâÂ@Dß IæÂ€Ö€ ÙÂà›Ó :ÞÂ@DßÂ`ÔÔÂ…ÏÂ@ÍÝÂ`'ÜÂÀÊÓÂàØÂ€¥Ô€iÞÂ=Û€WáÂÀùàÂ@nØÂ@ Ô XÙÂ%߀þÚ¨ÞÂ@©ã …ÜÂ`¤ÜÂÆÙÂà×Âà×Â@ÓÜÂÀjã @ÝÂàÕÂàôÙÂä€.Ó óÔÂàÓ ·ÞÂ@VÜÂ@åÙ .àÂ@ßÚÂàîÚÂÀè΀iÞÂÀváœàÂ`ŒàÂ@DßÂÀ)ÙÂàîÚÂÀ¦ÙÂÀ¦ÙÂÀ²× gáÂ`âÂà ÖÂOØÂ —Ù€KãÂ`tä êàÂå€ ÙÂÀRçÂà¦æÂ`?ØÂ`¶ÙÂàÂÀ4ìÂ@åÂàÂàkÛÂàîÚÂOØÂà#çÂÀ‚߀æÞ€æÞ ™ã€žêÂ@,ãÂäÂ`˜ÞÂÀ|àÂà¬å (áÂ`!ÝÂ6ñÂ~åÂ`žÝÂ`÷ã€-è€òÜ ,ÖÂ`¶Ù€ÔáÂU×Â@,ã æë€]àÂÀ|à êàÂäÂ@ÇÞ @ÝÂ ÆæÂ ºèÂàîÚ€uÜÂ@æÂ`ªÛ ™ã IæÂ øèÂõæÂ  æÂ@µáÂàÕ€ÚàÂÀˆÞÂ@»àÂ`àÂ@ëØÂÀ”Ü€ ÙÂà}ØÂ sß CçÂ`»í ^ØÂ (áÂ@‘çÂàÜÝ Ù€Kã ºè .àÂÀdä€×Â@æÂ€Úà 4߀]à ±ßÂ`ÙèÂ@êÂ@äî€Œí «àÂÀß ÝÂÀ”Ü€ŸÕ ØÂ`¤ÜÂ@2â€ë€æÞÂ1Ý ^ØÂ€iÞÂÀíâÂûåÂõæÂ€¶æÂ@ÁßÂ`žÝÂ@µáÂ@ç ÉÛ€æÞÂféÂÝê =è [ã OåÂà#çÂ=Û€oÝÂ@bÚÂàÄáÂ`åæÂ€ìÝÂ@µáÂ@ÇÞ€ªè CçÂ@>à ‡æÂ€¤é 2ÕÂ@æÂ`-ÛÂ@ åÂÀ)ÙÂÀ^åÂà²äÂ`µî€ÎâÂÀ·ëÂÀvá êà =èÂàì gá–áÂ@,ã€Èã€È〟ՠ(áÂà¬å€EäÂàGá {è êà ±ßÂ1Ý€¶æÂ@µáÂ@>àÂ`€âÂ@>à {èÂïç .àÂ`ßçÂ ÆæÂ@éÂ@ 值å€-èÂà¾âÂ`âÂ@yëÂÀFéÂàâÜ ´éÂÀFéÂà‚ìÂ@éÂ@2â ÏÚÂûåÂãé þ瀤頓äÂàšèÂ@‹èÂáÂ`hæÂ@‘çÂ`†áÂ@èÂ@êíÂàùíÂ` áÂ`ß瀘ëÂÀùàÂàíï€cßÂÀáäÂ`zã æëÂfé„ä ÌåÂ@ÍÝÂxæÂ@£äÂxæÂ@êÂÀ¥îÂ`tä€9æÂ`hæÂ`©ðÂÑìÂàÜÝ màÂÀˆÞÂ`tä 7逰瀪è [ãÂ`\èÂ`VéÂ`zãÂ` áÂlèÂÀ(îÂÀÛåÂ@1÷ .àÂà/åÂÀváÂ`zãÂÀLèÂÀÛåÂ`?ØÂ`æÑ€?å§ó 3ô ØÂ`à€WáÂ`’ßÂ ÆæÂ =èÂ`ÞÂà)æÂà ëÂ`ŒàÂ@ åÂà çÂàšèÂä ÉÛÂûåÂ@üê ãÂàdñ .à Ý ¥áÂÀváÂÀÿß …ÜÂà²äÂ`nåÂ`ßÂ1ÝÂ`°ÚÂÀóáÂà;ãÂÀváÂàâÜÂ`˜ÞÂ@èÂà;ã€-è (áÂ`’߀Ôá€Qâ ‘ÚÂ@&äÂÀ.í á×Â`ñäÂÀváÂ@ÕÂ` áÂÀ·ëÂ@2âÂ@»à€× Ÿâ UäÂä OåÂà “äÂ@¯â ÃÜ :ÞÂ@DßÂÀpâ IæÂ XÙÂàGá æëÂÝêÂÀÉ耀ï€'éÂà ëÂ@JÞÂÀ ÞÂà/åÂ`nå ÙÂ`¤Ü€Îâ€íÂ`ß瀤é s߀QâÂ×ëÂ`ñäÂÀ ÚÂ`êÂãéÂà;ãÂ@>à€?åÂÀšÛ UäÂ`zã çŠãÂ@ßÚÂlè€ï å€{Û màÂ`†á ŸâÂ@yë ™ãÂ@ÇÞ ·ÞÂÀ”ÜÂÀÕæÂ mà€‡ÙÂ@öëÂ@&äÂ@hÙÂ@ÓÜÂ`ÈÖ &×€]àÂà)æÂÀÿß «à€Eä aâ€3çÂ@ÇÞÂ`ÇëÂ@>àÂàêÂàˆëÂ`ªÛÂ`˜ÞÂxæÂàqÚ ™ãÂ@ÓÜÂÀíâ gáÂà¬å "âÂà5äÂàÜÝÂ`!ÝÂÀíâÂxæÂ`VéÂÀFé ãÂâÂ`€â ðßÂÀvá [ãÂàÊàÂà¬å çÂà;ãÂ@ýÕÂ`ýâÂ`†áÂÀdä åÂÀˆÞÂ@çÂÀÿß´ÜÂxæÂ ä ãÂrçÂ`\èÂ@ÓÜÂàYÞÂ`âÂÀÏç ·ÞÂ@ÁßÂÀšÛÂ`hæÂ`täºÛ€þÚÂÀÝÂ`’ßÂÀXæÂàâÜ€þÚÂ`9ÙÂÀíâ€ì„ä€×ÂÀùàÂ@\ÛÂÀ|àÂÀXæÂàÜÝÂÀÃéÂ@µáÂàAâÂ+ÞÂ`-ÛÂÀ^åÂÀíâÂÀÜ€ÈãÂà;ãÂ`’ß þç gáÂÀ”Ü€ØÂ€ŸÕÂ7ÜÂ`Œà {èÂ`zãÂàâÜ ½Ý€ìÂ@,ã ÛÂàƒ×ÂÀdä {è¨ÞÂàÂÀRçÂ`KÖ £×€òÜÂäÂ@»àÂ`’ßÂÀ²×Â@†ÔÂàÐß sßÂxæÂ€Ôá ‡æÂ@€ÕÂäÔÂàƒ× PÐÂ@DßÂÀ¦Ù€cß 4ßÂÒ× 8ÔÂÀeÏ cì +ëÂ=Û —Ù …ܺ۠ÚÂàqÚÂ@PÝ€ØÂ@>àÂûåÂÀ ÞÂ@ñ×ÂÀwÌÂàqÚ ‹ÛÂÀ‚߀]àÂÀYÑÂ1ÝÂÀÝÂÀšÛÂÀÜÂÀˆÞ «àÂÀŽÝÂ`ªÛ€iÞ äáÂÀùàÂ`!ÝÂàèÛ «àÂ@ëØÂ`Â×Âà¾â …Ü £×´ÜÂÀˆÞÂÀ ÞÂ`æÑÂ@ÙÛÂÀGÔ óÔÂàYÞ íÕÂàôÙ 4ßÂÀÛ€ÚÂà•Ô ©ÖÂIÙÂàîÚÂÀáäÂ@VÜÂU×€øÛ yÞÂ`à êà Oåœà £× ½Ý€þÚÂ@&ä :ÞÂÀÜÂ`'ÜÂ`@àçÖ »ÓÂà§ÑÂOØÂÒ×ÂÀ¾Õ yÞ€«ÓÂÀÝÂ@‹è€{ÛÂ@Dß £× ¯ÕÂà•ÔÂÀÐÒÂàÅ̮ݠ·Þ ÛÂ@ýÕÂàwÙ€“×Â`˜Þ Þ†٠FܢߠÇÑÂ`ÈÖÂÀ)ÙÂsÒÂÀ¦Ù d×ÂÀ)Ù€@ÐÂ@ÑÂÞÕÂ@PÝÂ`¶ÙÂ[ÖÂðÒÂ8ÇÂÀÊÓÂ`ªÛÂ`3ÚÂ@‘çÂ`É€·ÑÂàÐßÂ`9ÙÂàÜÝÂ`÷ãÂ`ÞÂ@PÝÂÒ×Âà}ØÂ »ÓÂ`žÝÂNíÂÀçãÂ[ÖÂ@ÍÝÂà× 8Ô çÖÂà×€(Ô€±ÒÂ`ÈÖÂ`{ΠØÂàÐßÂ@¤ÏÂ@t×ÂÀ¾ÕÂà‰Ö€FÏ Ï ÝÂÍÂàîÚÂrçÂÀ;ÖÂ@ Ô ÷ÉÂÐÂÀ|àÂ@ÍÝ jÖ DÒ€‡ÙÂIÙ€@ÐÂàTÊÂàÖÞ àìÂ%ßÂ@µáÂÐÂÞÕÂ`†áÂÀèΠóÔ öÞÂàÔÂÀôÌÂ[ÖÂIÙ ÁÒ ŽÐÂÀÛÂ@bÚ€Ö @ÝÂÀáä »Ó€:ÑÂà•ÔÂ`ÈÖÂÀ;ÖÂÀ#ÚÂ`]Ó ‘ÚÂàÔÂêÓÂ`ªÛÂ`]Ó€ÕÌÂÀYÑÂà›Ó€±ÒÂÀÛ€ØÂÀšÛÂÀ¦ÙÂ`ÎÕÂ@°Í€@ÐÂÇÄ ùÓÂ`oÐÂÀYÑÂ[ÖÂ`˜Þ ç€àß VÏÂ`uÏÂ`?ØÂU× ÏÚÂ`’ߠ݀ ÙÂ…ÏÂà6ÏÂgÔ üÝÂàƒ×Â@ÓÜ€{Û€ Ù ùÓÂ@-ÎÂ`9ÙÂàÖÞÂaÕ€"ÕÂ@'Ï‹ÎÂÀÐÒ€ÚÂÀ ÚÂЀ(ÔÂ@žÐÂÀSÒÂÀÖÑ ÒÂ@ªÎÂÀè΀ÔáÂà6ÏÂÀ۠ǀ(Ô ÚÂ7ÜÂÀwÌ€±Ò€(ÔÂÀß ©Ö€XÌ€@ÐÂ@ëØÂ@åÙÂ@ÓÂCÚÂàƒ×ÂÀAÕÂØÖÂÒ×Â`3Ú VÏÂÀèÎÂ`E×Â@JÞÂ@ßÚ çÖÂà$ÒÂ@¶ÌÂ…ÏÂCÚÂ`ÔÔÂà¹ÎÂÀËÂÀÕæÂÀ‰ÉÂaÕ pÕÂ@ ÔÂ@Ó 2ÕÂ@hÙ€"ÕÂÒ×€"ÕÂ@†ÔÂÀ#Ú ÁÒ€"ÕÂIÙÂàÕÂÒ×  Ñ€øÛÂ@ÙÛÂÀ5×Â@DßÂ`ìÐÂÞÕÂ@µá ÐÂ ÛØÂäÔÂàâÜÂÀùàÂà§Ñ ÏÚ€:ÑÂmÓ ÏÂÀMÓÂÀÄÔÂà­Ð >Ó„äÂÀ#ÚÂà6ÏÂ`@ÃÂ@÷ÖÂ[ÖÂà ÇÑÂÀ¾Õ ¯ÕÂIÙÂ`¶ÙÂÀ¦ÙÂ@ÕÂÀSÒ £× s߀{ÛÂ@¤ÏÂÀkΠÙÂÀ¬ØÂàÓÂàÑÊ VÏÂÀMÓ d×€iÞÂ@ÑÂàBÍ ‹Û £×Â@ÎÈÂÀÊÓÂÀAÕ ÁÒ &×Â`°ÚÂ`?ØÂÀGÔ Ù€«ÓÂà$Ò @ÝÂàƒ×ÂÀÖÑÂ`]Ó Ò€«Ó óÔ€ÉÎÂÀÜÐÂIÙ€@ÐÂðÒÂÌØÂà›Ó jÖÂöÑÂ`ËÂ`QÕÂ@zÖÂàTÊÂCÚ óÔÂÀ¾ÕÂà Ö€±Ò´Ü€×Â@ÓÂÀ;ÖÂ`QÕ€ØÂÀ¬ØÂÀÄÔ ÐÂà›Ó ÕÙÂà³Ï 2ÕÂ@nØÂ@nØÂÀšÛÂ@Ò€dÊÂÀqÍ sßÂà‰Ö ”ÏÂ`{Π—ÙÂ@Áß Ú màÂÀ;ÖÂÀÛÂûå µÔÂàèÛ€× &×Â`E×Â@VÜ ÜÂÀß Ú ŽÐÂÀ5× LÛÂU×Â@åÙ ØÂ€WáÂ@nØÂ ÛØÂÐÂà•ÔÂ~å yÞ€ØÂ€ØÂ ÝÂà ÖÂÀ#Ú ©ÖÂÀ ÞÂ@ÓÜÂÀ;ÖÂÀSÒ€"ÕÂ@€ÕÂà×Â`“ÊÂ@¼Ë —Ù€ŸÕ€ÕÌ ÜÂ@t×ÂàeÜ ã 5ÊÂÀÄÔÂà<ÎÂ`QÕÂ@ÓÜÂàkÛÂüРÀçÂÀMÓ€oÝÂ`ªÛÂ`-ÛÂàMàÂÀ¾ÕÂÀÊÓÂÀ)Ù—Ì &×€ÎâÂà× ÁÒÂÀ¦ÙÂ`ÎÕÂ@Ó€@Ѐ"Õ€òÜ VÏÂ@ ÔÂ@8á€"ÕÂÀè΀æÞÂöÑÂà}ØÂà6ÏÂà•Ô€™ÖÂ`ÚÓÂ@ñ×ÂgÔÂöÑÂ@t×€òÜÂ@ÓÜÂ1Ý€ÚÂ`ªÛÂàÄáºÛÂÀYÑÂÀ_ÐÂÒ×ÂàÜÝÂ`æÑ XÙÂ@ÓÂðÒ >ÓÂÀ|àÂà$ÒÂÀ)Ù êàÂ`ñä€oÝ ØÂÀÊÓ€ÖÂ`àÒÂsÒÂà×É€uÜ Uä¨ÞÂ`¶ÙÂ`ÈÖ€"ÕÂ@ñ×€oÝ´ÜÂÀßÂ`¤ÜÂÀšÛ »ÓÂIÙ .àÂàØÂ@t×ÂÀßÂÀ ÞÂIÙÂÀqÍ VÏÂÀÝÂÀèΠ¯ÕÂÀÜЀ4Ò€ÖÂÒ×Â`QÕÂàkÛÂ@¼Ë Ý RÚ€{ÛÂÀ¦Ù ÃÜÂÀÐÒÂ`¤ÜÂ`æÑ€Ö€þÚÂÆÙ€uÜÂ@VÜÂÀ¦ÙÂ@°ÍÂ`¤ÜÂàÐßÂ`9ÙÂàâÜÂàÕ vÔÂÀˆÞÂ`cÒ€"ÕÂ`Â×Â`cÒ JÑÂ`QÕÂ`cÒÂÀ)Ù á×Â`Þ€ØÂ@nØÂ &× bÍÂ@ñ×Â`¶ÙÂà$ÒÂàeÜÂÀ¦ÙºÛ VÏÂ@ ÔÂ`?ØÂÀŽÝÂÀÜРDÒÂÀ¦ÙÂà<Π)Ì £×ÂÀ/ØÂ`þÍÂÀYÑÂÀÖѠϣÊÂà›ÓÂÀÐÒÂÀ5×Â@>àÂàîÚ ÉÛÂ@ßÚ vÔÂ@°Í€(Ô —Ù€iÞÂÀAÕÂÀGÔ ßÍÂà›ÓÂà Ö€±ÒÂ@>à çÖ€oÝÂÀ)ÙÂüР2Õ »ÓÂàôÙÂ`ëå ÚÂàîÚ€ ÙÂ@ÕÂäÂà¿ÍÂ` Ì ñÊ DÒÂÀ²×ÂäÔÂ`3ÚÂ`€âÂÀk΀@ÐÂ@t×ÂàqÚÂ`uÏÂà­ÐÂÀùà öÞ ùÓ€øÛ€ìÝ€æÞ ØÂ`!ÝÂàeÜÂÌØÂ ÛØÂ€ÕÌ ÉÛÂà ÖÂÀ¸ÖÂ@ Ô€ØÂÐÂ`Â× Ò´Ü ÀçÂÀ¸Ö€‡Ù¯ÈÂÀ/ØÂ€ÚÂ`?ØÂ vÔÂÌØÂàƒ×ÂÀ/ØÂÀèÎÂà Ö€ÖÂÀùàÂ`QÕÂ@°Í—Ì |ÓÂÀ²×ÂÒ×ÂaÕÂà•Ô £×Â`ÔÔÂà$ÒÂ`àÒ€4Ò€(ÔÂØÖ€ÃÏ€×Â+ÞÂ@-΀ÚÂÀ_ÐÂÌØÂÀ5×ÂÀYÑ€™Ö ©ÖÂ@hÙÂ`-ÛÂÀâÏÂÀ²×ÂØÖÂàîÚÂÀ¦ÙÂ`QÕ€ÃÏÂ`ÔÔ LÛÂà$ÒÂ7ÜÂöÑÂ`¼ØÂ€ÚÂàwÙÂ@ýÕÂ@ Ô€@ÐÂàƒ× ,ÖÂÀ ÞÂÀ)ÙÂ`-ÛÂÀÜÂ@nØÂÀÜÂ@JÞ »ÓÂ@ÍÝÂ`iÑ€]àÂ`ªÛ üÝ€iÞÂàúØÂ µÔ {è £×€±ÒÂà¾â€4ÒÂâÂÒ×ÂàúØÂÀÿß >ÓÂ@ÓÜÂ@t×Â@÷Ö€ìÝ ÝÂÀÛÂàÕ FÜÂ`†á€¥ÔÂgÔÂàúØÂ`Ë jÖÂ`hæÂà$ÒÂàƒ× 8ÔÂàSß …Ü ˆÑ€‡ÙÂà_ÝÂÀ±ìÂ+ÞÂ@Ò ˆÑÂ`3Ú jÖ üÝ (áÂÀšÛ —ÙÂ`QÕÂ@Ò LÛÂ1ÝÂ`9Ù ©ÖÂÏÂà ÖÂÀŽÝ´ÜÂÀ)ÙÂ@ñ× ÝÂ@åÙÂà*ÑÂà)æÂ€uÜÂ@÷ÖÂ@zÖÂ`æÑ jÖÂ`E× 8ÔÂÀ5×ÂÀ¬ØÂ€ìÝÂ@ÓÜÂ@\ÛÂàÕ ÙΠd×ÂaÕ€(ÔÂÏÂ8ÇÂ@hÙ ^ØÂà•ÔÂÀÜ pÕÂÀÊÓÂ`øÎ€øÛÂàqÚ PЀ™ÖÂ`KÖÂàqÚÂ@ßÚÂ`iÑÂ`ÈÖ ¯ÕÂ@zÖÂ`ÔÔÂ`WÔÂà›ÓÂ@nØÂ ^ØÂ€ŸÕ€áÊ€«Ó &×Â`WÔÂà}ØÂ RÚ€@ÐÂàZÉ ˆÑ€™ÖÂ`QÕ êàÂÀ²×€:ÑÂà‰Ö€«Ó€]àÂ@bÚÂÀGÔ ðß êàÂ@ŒÓÂàúØÂ ¯ÕÂ@hÙÂ@zÖ€øÛÂ`ÎÕ¨ÞÂüÐÂ@3Í ÓϺÛÂÀ/ØÂ ©ÖÂ`˜Þ€Ôá [ãÂåÂ`¤Ü ‚ÒÂ@ Ô íÕÂ`æÑ jÖÂ`ÈÖ€uÜÂ@ÙÛÂÞÕÂàÊà ‘Ú€@ÐÂÀ)Ù Ý FÜÂIÙÂÀÐÒÂÀMÓÂ@ýÕ€àßÂ`°ÚÂ`øÎ ÃÜÂàwÙ€LÎÂÀ5× £×ÂÀŽÝÂÀ|à€(ÔÂà§ÑÂ@÷ÖÂàkÛ —ÙÂ@DßÂÀAÕÂÞÕÂàwÙ€oÝÂàÕÂÒ×ÂÀ ÚÂ`ìÐÂÀ¾Õ€‡Ù Π‚Ò XÙÂ`Â× ½Ý€·Ñ€ÚÂ[ÖÂÀÄÔ€ØÂ@hÙÂ@ñ× ÒÂ@ÕÂ@zÖÂ`þÍÂ@»àÂÀ²× ÇÑÂ@ÓÜÂ`-ÛÂ7Ü pÕÂÀÊÓ Ü ^ØÂ ‚Ò€íÈÂ@Ó€òÜÂ`!ÝÂ`'ÜÂÀÚÂ`ìÐÂÀGÔ &×Â@¼Ë óÔÂ`ÍÂÌØÂ@€ÕÂàeÜÂ`{ÎÂØÖ€áÊÂàƒ×ÂàôÙÂÀ)Ù ÇÑ 8ÔÂÀâÏÂ`¼ØÂ€ÕÌÂ@-ΠÿÒÂàÜÝÂ@åÙÂÀSÒ ÝÂ` ÌÂÀ¸ÖÂàÖÞÂ@PÝÂÀ#Ú mà —Ù€3çÂ`'Ü LÛÂ`€âÂOØÂàkÛ€ Ù (áÂCÚÂÀ²×ÂàúØÂ€Âä€oÝÂΠRÚ &×ÂÆÙÂàâÜ€×Â=Û á×Â`ß´ÜÂàqÚÂ`àÒÂüРLÛÂÀYÑÂöÑÂà×ÂÀGÔÂ…ÏÂ@8áÂÀßÂOØÂ LÛÂ ÛØÂ ÚÂà¾âÂÀdä 2Õ 2Õ £×´Ü€ìÝ (áÂ`]ÓÂ`3ÚÂ@bÚÂ@ëØÂ€ØÂ@D߀uÜÂ@ÇÞÂÀŽÝÂ`Þ ØÂ€L΀ÔáÂØÖÂ@-Π4ßÂ@ñ×Â@t×Â`ÔÔÂ@»àÂàâÜ€iÞ DÒÂÀÊÓ #ÍÂ`]ÓÂ`žÝÂ@Dß …ܠ܀oÝÂàqÚÂ`ŒàÂÀ¸Ö€ŸÕÂIÙ ÚÂCÚÂÀk΀ڠÝ «àÂÀAÕÂsÒ€±ÒÂÀÜ€"ÕÂ@åÙ ÉÛÂ@åÙÂ+Þ ÏÚ yÞ€·ÑÂ@zÖ€ŸÕÂàÐßÂÀˆÞÂ@\ÛÂÀGÔÂ@ÓÜÂàÖÞÂÆÙ ùÓÂ`ªÛÂÀ;ÖÂàeÜÂÀRçÂU×Â@ÇÞÂ+Þ ÃÜ d×ÂêÓÂ@VÜÂÀ¦Ù øèÂÒ×Â`˜Þ€×€ÎâÂÀ5×Â@ýÕÂ`÷ãÂ`àÂÆÙÂÀ ÞÂ`¶ÙÂàYÞ€ÈãÂÀ#ÚÂ@\ÛÂàèÛ —Ù´ÜÂêÓ çÖÂ@ÙÛÂ`ªÛÂ`¼ØÂ@>àÂÀÿßÂ`hæÂ (á öÞÂaÕÂÀ:ëÂ@çÂ[Ö óÔÂÀqÍ #ÍÂöÑÂ@nØÂ€.Ó ØÂ€ÚÂ`PêÂàMà ÚÂÀÄÔÂ`!ÝÂ@ÇÞÂ`žÝ€Ôá á×Â`’߀WáÂÀ^å Øã ‹Û ÜÂÀdäÂÀÛ€oÝ XÙÂàúØÂ@ßÚÂÒ×Â@JÞÂ@ Ô PÐÂàúØÂ€Ôá äáÂÀˆÞÂ`àÂ ÛØÂ[Ö€Ú çÖ€ŸÕÂ`-ÛÂ@D߀(Ô ØãÂÀßÂàA‰çÂÀÜ€ØÂàØÂ vÔÂ`Þ íÕÂxæÂ` á LÛ màÂ`QÕ€ØÂ 2ÕÂ@bÚÂÀeÏÂ+ÞÂ@ÍÝÂàèÛÂÀ¦Ù LÛÂÀMÓ "âÂÀ¬ØÂäÔ€þÚÂà_ÝÂ`Â×Â`E×ÂÀÜÂÀ¬ØÂà¸ãÂ@åÙ€ØÂ@÷ÖÂ`¶Ù€½Ð ‹ÛÂ@ÓÜÂ`¤Ü (áÂ1ÝÂ`3ÚÂä€9æÂ`¶Ù€ÚÂ`¶ÙÂÀváÂ@bÚ «àÂ@bÚÂâÂàMà€9æÂ ÜÂÀjã ‚ÒÂà5䀟ÕÂ@‘çÂÀá䀤é€ìÝ üݺÛÂ`†áÂ@,ã üÝÂ=ÛÂ@nØÂ@ÓÜÂ@¯â ™ãÂ@>àÂàÄáÂà;ã 4ß ¢ì€àßÂ@ßÚÂ@£äÂÀ4ì€íÂ@,ãÂàqÚÂÀpâ€KãÂ@UñÂÀ·ë€Âä gá åÂÀô ã€’ìÂ@£ä ‡æÂ ÆæÂ@>àÂ@éÂàì€ÈãÂ`hæÂ€¤é€øÛÂ`ÙèÂ`Vé€ÂäÂ=ÛÂÀáä€òÜÂàÂ`zãÂÀ½êÂ ÆæÂ`†áÂ`÷ã€]à€¼åÂà‚ì€íÂBïÂ@ðì {èÂàèÂrçÂ`†áÂ`täÂ`VéÂ@ÍÝÂàqÚ€]à màÂÀRçÂàîÚ ÎïÂ@£ä€-èÂfé «à€¶æÂÀšÛ€oÝ€ýïÂÀdä ‡æÂ`\èÂàêÂà”éÂÀ4ìÂà¸ãÂÀò ™ãÂ`J뀆îÂÀñÂà¦æÂÀ“ñÂÀ.í øèÂ@¯âÂàÂÀ^å éõ›õ  æÂÀÕæÂ`ëåÂ`VéÂ`nåÂÀjã UäÂÀRçÂ`ýâ€QâÂïç€ÂäÂ`¤ÜÂÀXæÂ@æÂ`€â ÚíÂÀ|àÂÀ½êÂÀ‚ß  æÂàMàÂ`!Ý€ïÂÀóáÂ`ñäÂ`Œà ‘Ú CçÂàMàÂ@÷Ö€iÞÂ@ßÚÂàwÙ yÞ "âÂà_ÝÂ@ÍÝ€æÞ yÞÂ@Dß màÂÀÝÂà_ÝÂ`ŒàÂÀÜÂ@bÚ (áÂ`†áÂ`bçÂ@>à€Èã LÛÂ@PÝÂ`'ÜÂàèÛÂá€Î ÙÂ1ÝÂÀ·ë ÒäÂ@\Û¨ÞÂ7ÜÂàÂõæÂ€?åÂ@çÂxæÂÀíâ€×Âå Àç€9æÂÀùàÂOØÂà5äÂÀùàÂ@ÁßÂ@ßÚ vÔÂà‰ÖÂ1ÝÂÀÛ€]àÂÀÃéÂÀRç ðßÂÀdäÂÀváÂU×ÂàMàÂ@t×Âå€æÞ ð߀oÝÂ@ÓÜÂOØÂ`˜Þ€'é «àÂÀŽÝ ÌåÂàÄáÂ@2â€Wáœà  æÂ ÒäÂ@D߀òÜÂÀáä€òÜ€òÜÂ@8á màÂÌØÂ`\èÂ`¶ÙÂ~å àì€QâÂÀ‚߀ÚàÂà/å€cß„äÂâÂàMàÂ@gîÂ`hæÂ€ Ù ©ÖÂ@ßÚÂU×Â`â ‡æÂ 䠽݀Ú FÜ LÛ€àßÂà‰ÖÂÀÿß üÝÂ@êÂ@†ÔÂÀváÂ@8á …ÜÂàèÛÂOØÂ «àÂàôÙ «àÂÀ:ëÂ@D߀ÚàÂû倶æÂ òéÂ`߀æÞÂàMà€ìÝ .à …ÜÂÀáäÂ@æÂà²ä 7éÂàŽê  æÂ€?åÂ~å€EäÂå€ÂäŠã sßÂàŽêÂÀçãÂ@>àÂàS߀¼åÂÀÿߢßÂÀÝÂ@JÞ¢ßÂÀÿßÂ×ëÂÀpâÂ+ÞÂÀŽÝÂÀ±ìÂûåÂCÚÂ`†á€Èã Øã yÞÂàÖÞ ¥áÂàšè€ªèÂÀjãÂÀdäÂàîÚÂU×€Ú ¢ìÂ@ýÕÂàšèÂ@\ÛÂ@h٢ߠÀçÂÀ ÚÂ@åÙ ÝÂÀ·ëÂ@—æÂ IæÂ þçÂ`àœàÂxæÂÀùàÂûåÂËíÂ`Þ ØÂàÊàÂÀ;Ö öÞÂ`à ¶óÂ+Þ Ÿâ ‹ÛÂ`’ßÂõæÂ–á€9æÂBïÂ@,ãÂà5ä€ìÝÂ@‹è€Qâ€ÎâÂ`¼ØÂ€iÞ€æÞ€QâÂà ëÂà/åÂÀíâ %ì ÃÜ€uÜ CçÂÀÿßÂàMàÂlèÂ@¯âÂÀ”ÜÂ`bçÂÀáä€Ö oê CçÂ@ åÂÀ|àÂàÖÞ€’ìÂâ ÚÂÀŽÝÂ@—æÂIÙÂðÒ€{Û€'éÂà)æÂ€™Ö€Ú€ÚàÂà­ÐÂõæÂ`žÝ Û ùÓÂ`ÎÕ &×ÂÀßÂÀŽÝ ÝÂàúØÂ`¤ÜÂCÚÂàØÂÌØÂðÒÂ[Ö RÚÂÀÿßÂàkÛÂ`æÑ€oÝ€oÝ ºèÂàkÛ ðßÂ@ÒÂ@ëØÂ@ÓÂðÒ€Úà óÔÂ…ÏÂà×Â@ÇÞÂU×Â`WÔÂ@PÝÂàôÙÂàMàÂ@ÕÂÀ|àÂÐÂàÕÂÒ×ÂÀúË "âÂÀôÌÂÀ¬ØÂ d×Âà}ØÂ ˆÑÂÀ5×Â…ÏÂÞÕÂ@QÈÂÀÐÒÂ@¤Ï€ ÙÂ`ìРÚ€™Ö jÖÂ`KÖ€(ÔÂ`]ÓÂÀAÕ @Ý€™ÖÂ@€ÕÂàÕÂÀŽÝÂÞÕÂà}ØÂ€iÞÂ ÛØÂ€ÖÂ@ëØÂ ‘Ú d× ¯Õ £×€{ÛÂ ÛØÂ@ßÚ ÕÙÂ@zÖÂ ÛØÂ´ÜÂ`ÔÔÂ@bÚ ÚÂÀ)ÙÂÀÊ XÙÂ@ßÚÂ=ÛÂàÖÞÂ@ÑÂÀYÑÂ@ÍÝÂàƒ×Â`cÒ€ÖÂmÓ |ÓÂ@!ÐÂäÔÂàÓÂ@ Ô ÿÒÂ@VÜÂÀAÕÂ`¼ØÂ…ÏÂÒ× ©ÖÂ@Õ€Ú vÔÂ`ÎÕÂàÔÂ`]ÓÂ@ÙÛ vÔÂ`QÕÂÞÕ …ÜÂà¡Ò ΠñÊÂ`ËÂÀAÕÂÀMÓÂÀùà€(ÔÂ`9Ù ÇѵǠˆÑÂ`]ÓÂÀôÌÂU×ÂÀ¦ÙÂàÔÂ@ÒÂ`iÑÂÀ5× ÒÂà<ÎÂ`ÎÕÂ`nåÂ@ªÎÂÀÖÑ ÇÑ€íÈ€áÊÂÀ;Ö çÖÂyÑÂ`oÐÂÌØÂÀ5× sßÂäÔÂÀSÒ€ØÂäÔÂêÓ —ÙÂgÔÂÀGÔÂ@!ÐÂ@€ÕÂ`ÈÖ —Ù€ÚÂÀ‚ß íÕ ¯ÕÂ`ŒàÂ@¼ËÂÀ)ÙÂüÐÂÀšÛÂÀ¦ÙÂ[ÖÂ+Þ FÜÂÀß РLÛÂ@ÍÝÂà;ãÂàÂ@&ä d×Â`Â× ÎÂàYÞÂ@€ÕÂÀ¸ÖÂ@ÓÜ ÜÂÒ× ÕÙ€É΀FÏ€™ÖÂà;ã€þÚÂÀŽÝ€Qâ€uÜÂ`ìÐÂ@Ó »ÓÂâ ãÂàÐßÂÀ_ÐÂàÕÂ`]Ó€cßÂ@’ÒÂöÑ |ÓÂ`cÒÂ`¶Ù ÕÙÂ@ŒÓÂ`¶ÙÂàèÛÂÀÜÂaÕÂ`æÑÂ@ÕÂà¡Ò€‡ÙÂàÕÂà²äÂÀAÕÂàÂàôÙÂàeÜ®ÝÂàkÛ á×ÂCÚ :Þ€ÃÏÂ@åÙÂ`øÎ PÐÂ`É 8Ô šÎ jÖÂ@t×Â@†ÔÂÀ¸ÖÂ@zÖÂà•ÔÂàÕ JÑ ÒÂ@ÑÂaÕÂ`]Ó€ØÂÀ¸ÖÂ@ÓÜ Û sßÂ`ªÛ FÜÂ@VÜ€·Ñ Û¨Þ€øÛÂÀ”Ü ÝÂCÚÂà$Ò€·ÑÂÀ”Ü äáÂàkÛÂÀjãÂ`ýâÂÀšÛ 8ÔÂ@¤ÏÂà<Π4ßÂ@£äÂOØÂ`æÑ JÑÂÀ¬ØÂ–áÂàÜÝÂ`?ØÂ@-ÎÂàÜÝ€ØÂàôÙÂÀ ÞÂðÒÂ`!ÝÂàèÛÂÀß PРaâÂ`2ïÂ@¯â€4ÒÂà<ÎÂ`¶ÙÂÀÜТßÂ7ÜÂ`òÏÂ@zÖÂ`uÏ€iÞ gáÂ`\è€æÞÂ@JÞÂ`žÝ µÔ ÇÑÂÀ¬ØÂ@\ÛÂà¸ãÂÀˆÞ€QâÂ`¼ØÂ :ÞÂ`÷ã€Ú´Ü€¥Ô€Eä u頽݀{ÛÂ`’ßÂ`âÂàâÜ ØÂ RÚ€ÂäÂÀXæÂ€ Ù [ãÂÀÿßÂ@ýÕ á×ÂÀ Þ sßÂÀÚ€Ö óÔÂå€uÜÂ@ç pÕ £×Âà;ã s߀oÝÂÀ;ÖÂU× aâ FÜ€ØÂ€iÞ€(Ô€“× ÛÂàÕÂÀváÂ@ÍÝÂÀ¾ÕÂÀpâÂà_ÝÂà¾âÂàúØÂ`KÖÂ@ÙÛÂ@ÓÜ€æÞ€‡Ù€½ÐÂ@€Õ€þÚÂ`Í ÕÙÂ@2âÂ@ åÂ@nØÂÀ ÚÂ`WÔ€iÞÂ7ÜÂàqÚ FÜ ã ã äáÂéèÂÀAÕÂÀÊÓ ‘ÚÂ`cÒ :ÞÂ@VÜ ÿÒ ùÓÂÀ”ÜÂ@…éÂàeÜÂÀ/ØÂ d×Â`ÔÔÂ@JÞÂ[Ö &×ÂÀAÕ Ò€ÃÏ€Wá £×ÂÀÿß êàÂ7ÜÂÀ‚ßÂÀ_ÐÂàS߀Ú …Ü€×Â@ ÔÂ@ÍÝÂàÊà ÿÒÂ`-ÛÂ@ Ô€àß  ÍÂ@ÁßÂÀ¬ØÂ`3ÚÂ@hÙ —ÙÂàÕÂàÜÝÂÀˆÞÂ@ßÚ XÙÂ`zãÂ1Ý€¶æÂ€]à€ØÂ`‡ÌÂ`?ØÂsÒÂêÓÂ@€ÕÂÀAÕ ·ÞÂàÂÀÚÂ@&äÂ7Ü€uÜÂàôÙ RÚÂÀÊÓÂàôÙÂÀÊÓÂ`]ÓÂà×Â`¼ØÂ€¶æÂ€ØÂ7Ü€øÛÂ@zÖÂàÕÂà$ÒÂ@°ÍÂÞÕÂÀÿßÂÀÏçÂ@t×ÂÀ¸Ö€±ÒÂ@ñ×ÂÀkÎÂ@»à vÔ £×€Úà çÖÂÀGÔÂà¹ÎÂOØÂ ÒÂàÕ ÁÒÂ@°Í ÒÂ@Ó€iÞÂÀ¸Ö€ÖÂÒ×Â`iѺÛÂÀ5×ÂàôÙ ¯ÕÂ`uÏÂ@ŒÓÂ`cÒ ÙÂàÜÝ ÝÂÀ/ØÂÀ Ú ©Ö ÚÂ@ÕÂÀ;Ö€«ÓÂ`oÐÂU× ÃÜÂ@!Р€È nËÂ`?ØÂÞÕ ÓÏÂ`-ÛÂ@nØÂàƒ× |ÓÂàÕÂàeÜÂaÕÂà5äÂÀ;ÖÂ`øÎ ØÂ@ÒÂÀÖÑÂÀ ÞÂ@hÙÂàîÚ ”Ï€"ÕÂàwÙ Þâ ¬ËÂ@-Π/Ë )ÌÂ@ÓÂÀ Ú€×ÂsÒÂÀ Þ€™ÖÂÀÜÐÂ@°Í 2ÕÂ@†Ô jÖ€¶æÂ 2ÕÂ@Õ€@Р£×Â`E×Â`ªÛÂ@Õ€"ÕÂÀ²× ÙÎÂàèÛÂ@ÁßÂ@ÕÂà<Πá×ÂÀMÓÂ@°ÍÂà•ÔÂêÓ€dÊÂÀYÑ JÑ€:Ñ€LΠÓÏÂ`E×ÂÀ¬ØÂàîÚÂ+ÞÂ@žÐÂ@ÓÂàÕ ½ÝºÛ Ï€Éή݀iÞÂà}ØÂ jÖ ½Ý çÖÂgÔ€ØÂà}ØÂÀèÎÂ=Û ùÓÂ@ÍÝ ŸâœàÂ@hÙÂ@ÇÞÂ`€âÂ@>àÂÀ”ÜÂ@€Õ€.ÓÂ`ÈÖÂ ÛØÂêÓÂ@\ÛÂàAâ ØÂÀAÕ ‹ÛÂÀ5×ÂÀ;Ö ÁÒÂà²ä€«ÓÂ`9ÙÂÀÛåÂÀÜ ½ÝÂàÕÂ`¼ØÂ FÜÂ`tä ·ÞÂÀÛÂ`3Ú á× ÉÛÂ@hÙÂCÚÂàqÚÂÀ|à @ÝÂOØÂ`ŒàÂÀÛÂÞÕÂÀ¬ØÂ=Û ‘ÚÂ@ÙÛÂà×Â@ýÕ äáÂ@bÚÂØÖÂÀ#Ú d×Â`ÞÂÀGÔ€]àÂÀÊÓÂ@ÓÂÀùàÂ@÷Ö ØÂ vÔÂÀ¦ÙÂÀ)ÙÂ7ÜÂ`]Ó ÁÒÂ@\ÛÂ`ÈÖÂ@åÙ ‘ÚÂ@t×ÂÌØÂÀ|àÂyÑÂà ÖÂ`æÑÂÀ¾ÕÂ`ÚÓÂàÖÞÂ@zÖÂàØÂ mà€Ú ØÂÀÿß á×ÂÀ‚ß >Ó á×€ÈãÂà ÖÂÀÛÂ@JÞÂÀÚ çÖÂàwÙ Ü á×ÂyÑ€:ÑÂ`WÔÂ@Õ€QâÂ`æÑÂÀ¸Ö€½Ð 8ÔÂ@nØÂàqÚ€ÔáÂ@ñ×€FÏÂ@?ËÂgÔÂÀÜ @Ý ”ÏÂÀÊÓÂàÔ€ŸÕ ±ß€ØÂÀâÏ€ìÝ€×€.Ó€.ÓÂÞÕ jÖÂ@DßÂ`{ÎÂ`ÚÓÂ@3Í pÕÂIÙÂ@ëØÂ@-ÎÂÀÄÔÂ@ ÔÂ@!ÐÂà‰Ö ”ÏÂ`ÊÂàfÇÂà‰Ö Ò ¯Õ MÆÂ@3ÍÂÀYÑÂ ÛØÂ £×ÂÀ)ÙÂ`æÑÂ`ªÛÂ@†Ô µÔÂ@zÖÂà$Ò€ØÂÀóáÂÀ ÞÂ`QÕÂÞÕÂöÑÂàHÌ€×ÂU×Â`ÎÕ ²Ê ¯ÕÂÀ5× |ÓÂ@åÙÂaÕ€"ÕÂàÕÂÀ#ÚÂà­Ð ,Ö ÓÏ€{ÛÂüÐÂÏÂÀîÍ :Þ &×ÂàÅÌÂ@¼Ë íÕÂà¿ÍÂ@¤ÏÂ@3Í óÔÂàÔÂ@’ÒÂ@bÚÂ@’ÒÂÀÄÔÂ@ÚÆÂ€× …Ü€¥ÔÂà³Ï óÔÂ@ÕÂ`Õ¿Â@’ÒÂÏ ˆÑ‹Î€Ö ^ØÂ`Â×€±ÒÂ@9Ì€ŸÕÂÀeÏÂÀÄÔÂà‰Ö á×ÂР Í çÖÂÀ|à …Ü€ÛËÂ@Ò šÎÂ`iÑÂÎÂ`øÎÂ@ÒÂ`{΀™ÖÂ@Ó ¯ÕÂ@t×Â@»àÂ…Ï€þÚÂà§ÑÂ`øÎÂ`ÈÖÂU×Â᠎Ѐ(ÔÂÎÂÀ¾Õ ÃÜÂ`ÚÓ ¬ËÂ`øÎ á×ÂÎÂÀôÌ ŽÐÂ@ŒÓ >ÓÂÀw̋ΠçÖÂsÒÂÀ;ÖÂ`Â×  Ñ &×Â`æÑÂ@PÝÂ`]ÓÂ@¼ËÂ@°ÍÂÀÖÑ€±ÒÂàÔÂÀ/ØÂ`±Å |Ó tÊÂ&ÊÂ@ªÎÂÀÝ€{ÛÂ`QÕÂ@¤Ï€ŸÕÂ`°ÚÂØÖÂ@zÖÂà0РÚÂЀڀÚÂ@VÜÂà¡ÒÂàHÌÂ@zÖÂÀšÛÂ`QÕÂ`]ÓÂàÑÊÂàôÙÂÀAÕ€RÍÂÀqÍ»ÆÂ d×ÂÀ|àÂÀ¸ÖÂÆÙÂÀÊÓÂàqÚÂÌØÂ 2ÕÂà‰ÖÂIÙÂÀôÌÂ@†ÔÂ@ÈÉÂÀ_Ѐ.ÓÂÞÕÂCÚ€dÊÂÏ ÇÑÂ`¶ÙÂà›ÓÂOØÂ€·ÑÂ,ÉÂÁÅÂà¡ÒÂ`iÑÂà³Ï€·ÑÂàBÍÂà›ÓÂ`øÎÂ@KÉ µÔ —ÙÂàÕÂÀ_ÐÂÀôÌ DÒÂÌØÂÀÖÑÂÏ€jÉÂÀ_ÐÂÀkÎÂà*ÑÂÞÕÂ ÛØÂ€"ÕÂÀ;Ö ÙÂ@3ÍÂ`±ÅÂsÒÂ@9Ì ËÂÒ× ßÍÂ`ÍÂÀwÌÂÀ¾ÕÂà­Ð ÁÒÂ@ ÔÂüÐÂàÔÂÀ‰ÉÂÀYÑÂ` ÌÂ`uÏ DÒ€¥ÔÂöÑÂ`-Û€™Ö åÌ€ØÂ ‹Û€½ÐÂÀèÎÂðÒÂ`ÎÕ 8ÔÂ`¼ØÂÌÂäÔÂ`þÍ€ÃÏ ÚÂÀèÎÂØÖÂ`QÕÂàwÙ€·ÑÂÀôÌÂ@KÉÂà¿Í€dÊ ÁÒÂÀqÍÂàÓ€¥ÔÂ@-ÎÂà6ÏÂà¿ÍÂ@÷Ö zÉÂà ÖÂðÒ ÿÒÂÀÖÑ ñÊ€ØÂØÖ £×Â`àÒÂIÙ ØÂ ©ÖÂ`iÑÂ`9Ù€ÛË d×Â`Í ,ÖÂ@ªÎ ÍÐÂ@¤Ï ßÍÂ`"ȠπXÌÂÌØÂaÕÂÒ× ˆÑÂàÓÂ`WÔÂ`E× üÝÂÀqÍÂ@ ÔÂ@˜ÑÂâÂà§ÑÂÍÂ@Õ€½Ð ÏÂÏÂÀ¾Õ€àßÂ`WÔÂ@¤ÏÂ@zÖÂ`9ÙÂÀAÕÂgԠ݀ÚàÂà›Ó XÙÂ@-ÎÂàâÜ ,Ö á×Â`ÍÂØÖÂ@VÜÂàÜÝÂ ÛØÂ[ÖÂäÔÂ@nØÂ`˜Þ 8ÔÂ[Ö :ÞÂà× d×ÂÞÕÂ@ÑÂ@˜Ñ «àÂ@µá ÃÜÂ@ñ×ÂÀŽÝÂ`9ÙÂ@ñ×ÂÀóá .à ÉÛ€ÖÂ@ñרÞÂÀÛÂàÐßÂÀAÕÂ`Þ xó …ÜÂàÓÂ@÷Ö€uÜÂ`-ÛÂ@\ÛÂOØÂÞÕÂ`'Ü ”Ï mà РPРÝÂ`žÝÂà¸ãÂÀ¾Õ ðßÂÀ¬ØÂ ÕÙ Ü ÙÂØÖ ÚÂ`-Û ¯ÕÂ`€â —Ù€«Ó€Ú jÖÂÀ/ØÂ@ÑÂ`'Ü óÔÂ[ÖÂÀ;Ö€ìÝÂ@VÜ ã€Ôá pÕ€oÝÂà›ÓÂ`ìЀuÜÂàGဠـÚÂÀšÛÂ@bÚÂàYÞ üÝÂàqÚÂ`3Ú UäÂÏÂÀîÍ >ÓÂÀÄÔ ‘ÚÂÀÛÂÀÄÔÂ@hÙÂàeÜÂ@Õ€.ÓÂàwÙ€ØÂ@ßÚ d×ÂÀ)ÙÂ@ÕÂ@¤Ï€ìÝÂ`°ÚÂ@nØÂ`¼ØÂÀ/ØÂ€Úà€9æÂ Û€þÚ€ÚÂ`'ÜÂÀdäÂÀÝ€oÝœàÂ@VÜ ÝÂaÕÂðÒ pÕÂ`ÔÔÂàÔÂÀÐÒ ¯Õ vÔ £× d×ÂàqÚÂÀGÔÂ@!РLÛÂÀÚ ‹Û ÃÜÂÀYÑ€“×Â@ÓÂÀ5×ÂÀšÛ€RÍ jÖÂOØÂÀÈÂàBÍÂÌØÂ€òÜ ½ÝÂ`‡Ì€±ÒÂàwÙÂÀŽÝÂ@€ÕÂÀ5×Â1ÝÂÀÊÓÂÌÂÀ_ÐÂU×ÂàeÜÂ`WÔÂ@ ÔÂ=Û ‹ÛÂÀ|à€ŸÕ íÕ ‹Û …Ü ‹ÛÂ`÷ãÂIÙÂà}ØÂ@JÞÂxæÂÀíâÂ@ÓÜÂ`ßÂàSßÂ`¤ÜÂ@ßÚÂ`?ØÂ@&ä€ìÝÂ@»à [ã ÏÚÂ`Œà€ÚÂ`9Ù sßÂ@Õ Ù€oÝÂÀ¸Ö "âÂÀÖÑÂ`ìÐÂ`KÖÂÀ ÞÂà_ÝÂ@DßÂðÒÂà$Ò ©Ö€ØÂ@ëØÂ€¥ÔÂÀ)ÙÂ`ÔÔ€™ÖÂÀ¸ÖÂàÕÂÀ/ØÂÀùàÂÀÚÂ@t×Âà³Ï ^ØÂÀ)Ù XÙÂ=Û |ÓÂ@ÙÛ LÛÂÀù࠱ߠÞâÂ1ÝÂ@\ÛÂ1ÝÂÀùàÂ@æÂ` áÂIÙ€-èÂÀáäÂÀÝÂà5ä€ÖÂÀÄÔÂ~åÂ@êÂ`ßçÂàèÂÀáäÂ`VéÂ@nØÂà}ØÂ ÕÙÂÀíâÂgÔÂÀèÎÂ`˜ÞÂ`ýâÂàÜÝ€{ÛÂOØÂ€ØÂ€àß ã yÞ FÜÂU× ðßÂ@åÙÂÀSÒ€× Uä€uÜÂàkÛÂÀÛ´ÜÂ+ÞÂ`-Û€“×€“×ÂÀÛÂØÖ ÙÂàÐßÂ`9Ù€¼åÂ`oÐÂØÖÂ@ñ×€{Û sßÂaÕ€þÚÂÀ‚ßÂ`°ÚÂ@ÙÛÂÀšÛ ¥á€cß .àÂàwÙÂ@ÓÜÂàÓ ùÓ »Ó ‹Û 4ßÂ@zÖÂ@ßÚÂàGá®Ý€þÚÂ@åÙ®ÝÂ`!ÝÂàqÚÂ`ÎÕ Ú€ØÂÀšÛÂà|퀙ÖÂà›ÓÂ@ÍÝÂÀ¦ÙÂÀ¸Ö Þâ á×Â`'Ü€òÜÂÀÝÂÀˆÞÂÀ#Ú åÂàƒ×€æÞÂ`÷ãÂÀŽÝ  ÑÂ@ÓÜ ÉÛ ‘ÚÂ`òÏ µÔ ÃÜÂ@ÙÛÂ@€ÕÂà0ÐÂ`Â×Â` á 4ß®ÝÂ7Ü óÔ "âÂ`˜ÞÂàÖÞÂàeÜÂÀÛÂÀ#ÚÂ`àÒÂäÔÂ`KÖÂ`ßÂÀAÕÂÀ”Ü€9æÂ€·Ñ ‹ÛÂÀ¬ØÂ@ßÚÂ@©ã€ÖÂ`žÝÂ@€ÕÂÀ|à€×€“×Â@ëØÂàqÚÂ`!ÝÂÀÏç£ÊÂÀeÏÂ`zãÂÀúËÂ`«ÆÂ@ñ× ØÂàÓ |Ó ™ãÂ`zã (á ã ÓÏÂ@ÕÂ`Þ FÜ€ØÂ`\èÂ@µáÂàeÜÂ`Â×ÂÞÕ 4ß vÔÂàMàÂ7ÜÂàèÛ€æÞÂ`¶ÙÂÀóáÂ@PÝÂ@t× 2ÕÂ@3Í ÏÚ€¥Ô ©ÖÂÀMÓÂÀSÒ€’ì "â€àßÂ7Ü óÔ€WáÂÀÛ ÙÂàGá€4Ò …ÜÂÀ ÞÂà‰ÖÂ`9Ù€@РRÚÂ`¤ÜÂ@zÖÂ@zÖÂäÔÂ`QÕÂ@ÓÜÂÀÚ ÙÂÀ߀-èÂ1ݮݠ‹Û óÔÂÀŽÝÂÀÜ€×Â`3ÚÂàqÚÂÀSÒÂ@\ÛÂàØÂ„ä ðß ©ÖÂàÔ€"Õ€QâÂàkÛ´Ü çÖ€×Â@µá€{ÛÂCÚ ©Ö€øÛÂàâÜÂ@ÙÛ ÕÙ «àÂà}ØÂ`ÞÂ`âÂÀ Ú «àÂà ÖÂ`ßç &× —ÙÂ ÆæÂÀˆÞÂ@>à pÕ åÂà²ä ½Ý ^ØÂÀ¸ÖÂÀ¾ÕÂà¸ã çÖÂÀˆÞºÛÂÀ Þ ·Þ :Þ€¼åÂ`€â ÉÛ€{Û ÏÚ ÝÂÀÛ &×ÂÀ ÞÂÀÜÐÂ`¶Ù µÔ€EäÂ@ÇÞÂàîÚÂÀÛÂ@JÞÂ@ÓÜÂ`WÔÂ@JÞÂÀGÔÂÀÚÂàÕÂ`¶Ù µÔÂ@€Õ€øÛÂsÒ€ÏÍÂØÖÂ`ÎÕÂ@÷Ö€ØÂ€]àÂ@¤ÏÂÀ¬ØÂ€Ú€ÉÎÂ`˜Þ€çÉ 2ÕÂÀ²×ÂÀSÒ€4Ò€{ÛÂ`'Ü vÔ d×Â7ÜÂ`]Ó ÙÂ@€ÕÂÀÊÓ ÇÑÂ`ÈÖÂÀk΀àßÂ@\ÛÂ@?˺ÛÂ@bÚÂÀ5×Â`{ÎÂÀ;ÖÂÀ ÚÂ@JÞÂ`¤Ü€uÜ VÏ€×Âà‰ÖÂaÕÂÀGÔÂà*ÑÂ@bÚÂ@’Ò ùÓÂ`ªÛÂ@€ÕÂ`’ßÂ@å٠٠ÉÛ€ÚÂÀ)Ù XÙÂ@?ËÂÀËÂ`ÔÔÂÀ/ØÂ ùÓ€ØÂ ùÓÂ`òÏÂöÑ ½ÝÂà›ÓÂ`Â×ÂÀ¦ÙÂ@ Ô @ÝÂÀÖÑ ‘ÚÂÀ)ÙÂà6ÏÂà×ÂÐÂ@bÚÂÀYÑ RÚÂÆÙÂ`WÔÂðÒÂ`ìÐÂÀîÍÂ[ÖÂ`¼ØÂ€¥ÔÂàíï€c߯Ȁ{ÛÂ@ßÚ JÑÂyÑÂÀÖÑÂ@žÐÂÞÕÂ@˜ÑÂ`Ë ©ÖÂ@ßÚ —ÙÂÀá䠽ݠóÔÂ@¶Ì &×ÂÒ×Â`ªÛÂ`°ÚÂ`]ÓÂ@t×ÂÀMÓÂÀ|àÂÀ”ÜÂ`àÒ€øÛ ÓÏÂàãÇ ©Ö‹Î Û áרހØÂÀ¾ÕÂ@JÞÂà¸ã€þÚÂàôÙºÛ öÞÂ`–×Â@°ÍÂÀ¦Ù ½Ý€@ÐÂ@!ÐÂ@hÙ ÈÂ`]ÓÂ@3ÍÂàØÂ€‡ÙÂ@cÅ€™ÖÂàeÜÂàkÛ ÁÒ DÒÂà‰ÖÂ`àÒÂOØÂ@Ó ÇÑÂ`¶ÙÂ`òÏÂgÔÂà Ö ÓÏÂÀ}ËÂÀ²×Â@˜Ñ€ÃÏÂ`¤Ü€{Û RÚ ÍÐÂàîÚÂ`?ØÂàGáÂ[ÖÂÀÛÂ@€ÕÂà×ÉÂ`-ÛÂà­ÐÂ`¶ÙÂ@VÜÂÀ#ÚÂàeÜ |ÓÂäÔÂ`?ØÂÀÄÔÂÀpâÂÀdäÂÀúËÂ`E× üÝÂOØÂ€× LÛÂU× &× ÕÙÂàÕÂ@&ä¢ß€:ÑÂ@ÕÂ ÛØÂ@ýÕÂ@ßÚÂÀ”ÜÂ`âºÛÂÍ€‡Ù€×ÂÀ#ÚÂ`ÈÖÂ`'ÜÂêÓÂáÂàƒ×ÂÀ¬ØÂ@ÍÝÂ@åÙÂ@zÖ Ý LÛÂÀÊÓÂÀŽÝÂÀŽÝ …ÜÂ@ßÚÂÀúËÂàqÚÂ@ñ×Â`°ÚÂ@åÙÂ@>àÂÀ5×Â`€â mà€òÜÂ@†Ô êàÂàÅÌÂgÔÂ`¤ÜÂÀÝÂ@ÍÝÂ`ÞÂ`ŒàÂÀ5×€QâÂ@»à€oÝ —ÙÂ@ÍÝ —Ù ¥á uéÂÀváÂ@µá ØÂ@µá ‹ÛÂàÖÞÂàôÙÂàØÂàYÞÂàkÛÂ@ÍÝÂ@ëØÂÀ/ØÂ sßÂÀùà ŸâÂÀ#ÚÂàMàÂÀíâÂÀ"ï XÙ OåÂàSßÂÀ¦ÙÂ`9Ù FÜ OåÂ`3Ú UäÂ`âÂ@ÙÛÂ`>íÂÀj〇٠«àÂ@…éÂàÖÞÂõæÂÀáäÂàÜÝÂ`÷ãÂ@åÂ@ÓÜ 8Ô€9æÂÀˆÞÂ`ÍêÂÀ|àÂ@t×Â7Ü ãÂÀùà ÚÂàÊàÂÀ¦Ù¨ÞÂ`bçÂÀváÂ`täÂäÂâ OåÂàAâÂÀRçÂ`ªÛÂÞÕ€þÚÂàÖÞ ÕÙ öÞÂÀ¦Ù æëÂà#çÂà_Ý 4߀Kã€æÞÂ@CôÂàMàÂ@8á„ä —ÙÂ`°ÚÂà•ÔÂ@8áÂ@µáÂ@DßÂÀ¾ÕÂ`ªÛ pÕ ©Ö€×ÂÀ ÚÂÀÛÂÀ¦ÙÂ@\ÛÂ@JÞ 4ßÂOØÂ€¥Ô€þÚÂ%ßÂ`°ÚÂ`Â×Â`Â×Â@2âÂ@\ÛÂ@÷ÖÂ`ÍÂIÙÂ@ýÕÂÀ”Ü »Ó€Ú 4ßÂÀ¦ÙÂàÄáÂ@8á€(Ô pÕ >Ó€ÚÂ@nØÂ »Ó d× 2ÕÂ@ÇÞÂàkÛÂIÙÂ`tä€òÜ ŽÐÂäÔÂà‰ÖÂãéÂ`òÏÂà•Ô ÙÎÂÀYÑ€×ÂÀ²×Âà$ÒÂÀ;Ö ‹ÛÂ1ÝÂ`¤ÜÂà­ÐÂU× ÝÂà¡Ò€øÛÂàâÜ 4ß LÛ ÇÑÂIÙ€.Ó ÜÂ`òÏÂ`“Ê€‡ÙÂ`¼ØÂÀÜÐÂÀÖÑ€«ÓÂ@¤Ï€ØÂaÕÂ`ìÐÂàƒ×Â1ÝÂÀ#ÚÂ@ñ× vÔÂà ÖÂ@Ñ >ÓÂ`9ÙÂ`¶ÙÂ`ÈÖ€‡Ù vÔÂ@>àŠãÂÀ¦ÙÂÀÜÂà Ö ¦ÌÂÀwÌÂ`¶Ù—Ì€ ÙÂàƒ×‘Í€áÊÂ`@ÀXÌÂÀƒÊÂ`àÒ€½ÐÂÀÜЀÏÍ ÝÂ%ßÂ@ŒÓ€¥Ô ýÈ‹ÎÂÀÛ‘Í€(ÔÂР£×€×Â@ßÚÂàGá FÜÂÀÐÒÂà›ÓÂ`¤ÜÂàYÞ ”ÏÂàwÙÂÀwÌÂÀAÕ LÛÂ@nØÂÌØÂ@ŒÓ€±ÒÂà$Ò€.ÓÂÀƒÊÂ`cÒÂOØÂ ÛØÂ óÔÂàúØÂ ÓÏÂÀÜÐÂ@zÖÂÌØÂ@ýÕ  ÑÂàkÛÂ@ ÔÂ`!ÝÂÀÜÂ`Â×ÂÀÜÐÂР#ÍÂ`ËÂ@?ËÂÀ ÞÂà×ÂÀváÂ`þÍÂyÑ€±ÒÂüÐÂà”éÂ`-ÛÂ`iÑ Òä®Ý LÛ®ÝÂ@\Û€æÞ ©Ö üÝÂ`žÝ€«ÓÂ@µáÂaÕ€"Õ &× óÔÂÀÊÓÂ`WÔÂàƒ×ÂÀíâ á× çÖ´ÜÂCÚÂàîÚ€Ú óÔºÛÂÀÜÂàÐßÂ@ñ×Âà$ÒÂ`àÂÀ¾Õ€ÃÏÂàÜÝÂüÐÂ`9Ù€"ÕÂÀˆÞ ãÂàÄáÂà$Ò ÉÛ€{ÛÂÀ ÚÂàîÚ Øã «àÂ`9ÙÂÀ#ÚÂ@bÚÂ`÷ã ÃÜÂ@ÓÜÂàeÜ€ÚÂ@PÝ sß á× :ÞÂÀ ÞÂ@nØÂ@zÖÂ+Þ€]à€ÚÂáÂ`E×Â@ŒÓÂàeÜÂà×Â`ÎÕ &× ÞâÂÀßÂOØÂ€þÚ @ÝÂàSßÂ`?ØÂ€òÜÂOØÂà¡ÒÂÀˆÞÂàÜÝ Þâ µÔÂ+ÞÂäÔÂ`æÑ€iÞÂ`ªÛÂà 4ßÂûåÂäÔ€ØÂ€“×ÂÀ¬ØÂ`¶Ù çÖ ÓÏÂÞÕÂ@t×€cßÂÎÂÀ)ÙÂ`žÝ ã "âÂäÔ€“רޠXÙ »ÓÂ@8áÂÀeÏÂÀ¸Ö aâÂÀ¾Õ óÔ pÕ vÔÂ@nØÂ@ŒÓ€iÞ€]àÂÀwÌ £×€þÚÂ@nØÂà}ØÂ@ÑÂ`Â×Â@>à @Ý  ÍÂêÓÂ@€ÕÂ@DßÂ`’ß á×ÂÀ)Ù »Ó d×ÂÞÕ€iÞÂÀÄÔÂ@hÙ …ÜÂÀßÂ@VÜ€·ÑÂ@†Ô®ÝÂÀváÂ`Œà …ÜÂÀÛ€æÞÂàšè´Ü Ý ÇÑ XÙÂ@ëØÂÀŽÝÂà•Ô ¥áÂÀÛÂ`\èœà üÝ€ÚàÂÀ‚ßÂ`˜Þ RÚÂ1Ý€c߀ØÂ ÝÂ@Dß ØÂàMà€àß màÂ+ÞÂ@ÍÝ £×Â`àÂÀpâÂâ€.Ó€ØÂ`Í€™ÖÂ`3ÚÂÀ|àÂÀ/ØÂ ÉÛ mà jÖÂÞÕ€XÌ€Ú å ÍР,Ö¨Þ ¥áÂÀ¬ØÂ@?ËÂÀîÍ äá€uÜÂàÕÂ@ÇÞÂØÖ …Ü€ìÝ€þÚÂÀ;Ö€ ÙÂûåÂ@zÖ€{ÛÂ`KÖÂàÐßÂÀMÓÂÀkÎÂàÅÌ öÞÂ`'Ü€·ÑÂ@ŒÓÂêÓÂ@VÜÂàÐßÂÀÜÂ`cÒÂ@2âÂ@÷Ö 8ÔÂÀ;ÖÂà$Ò€(ÔÂ7ÜÂ@—æÂâ€?候ÖÂ`?ØÂÀÝ µÔÂðÒÂ@ÇÞÂ@ëØÂ`ìÐÂ@8áÂÀ;Ö€ÂäÂ`3ÚÂ`WÔ á×ÂäÔ ©ÖÂ+Þ Ü µÔÂ@ñ×Â ÛØÂÀ²×€‡ÙÂàqÚÂ@ÙÛ€æÞÂÀYÑÂ@ÕÂ`‡ÌÂ@Ó€(ÔÂsÒÂ`°ÚÂ@ñ×Â`?ØÂ`]ÓÂ@†ÔÂÀ¦ÙÂÀÐÒÂÀÄÔ–á XÙ¨ÞÂ+Þ Û€ÈãÂÞÕÂÀ¬ØÂ€Qâ üÝÂÀšÛÂ`Þ ©ÖÂÀ#Ú gá ÕÙ mà 2ÕÂ`ÞÂÀšÛÂà0ÐÂ`Â×Â@nØÂàèÛÂà§ÑÂ@ýÕÂØÖÂ[ÖÂIÙ€ØÂºÛ€Kã€ØÂ€ÚÂ`E×Â@åÙÂ@VÜÂ@\Û aâ RÚ d×ÂÀ²×€Ö äá ·ÞÂàâÜÂ`°ÚÂà¸ãÂ@t×Â@PÝÂ1ÝÂ`àÒ€jÉ Ò 8ÔÂ…ÏÂgÔÂàÓÂàÕÂ`nå LÛÂàÅÌÂ`QÕ®ÝÂàúØÂØÖ £×€ÖÂÀ)Ù d× Ï ^ØÂ€øÛ€ÃÏ üÝÂØÖÂà¡ÒÂ`ÚÓ Ë ˆÑÂà<ÎÂ`žÝÂà¹Î€.ÓÂ ÛØÂ`cÒÂàeÜÂ@nØÂ ¯ÕÂà_Ý d×€æÞÂ@ÓÂ`æÑÂ@hÙÂ@˜ÑÂÀúËÂÀ$Å &×ÂCÚÂ`ßÂÀŽÝ ÞâÂ`]ÓÂà<ÎÂ%߀EäÂÀÜÂ`ÎÕÂÀkΠóÔÂ=Û€ŸÕ€(ÔÂР‚Ò ØÂ@†Ô€L΀ØÂ VÏÂmÓÂ@ªÎÂÀÝÂ`ÔÔÂ@zÖ€4Ò ©ÖÂÀÖÑÂ@ýÕ hÌÂöÑÂ@nØÂÀ_ÐÂÀÊÓ vÔÂ@ñ×€.ÓÂ`oР2Õ µÔ á×ÂÀË€½ÐÂ@°Í€‡Ù @ÝÂ`'ÜÂàÕ€RÍÂÀeÏÂgÔÂØÖ€¥Ô VÏÂÐÂ`òÏÂÀ#Ú ØÂ€«ÓÂÞÕÂ@ªÎÂàÕÂ@ÙÛÂ`ÔÔ ÓÏÂà¡Ò 8ÔÂÀèÎÂàqÚ 2Õ€½ÐÂàÕ žÃ ÇÑ >ÓÂ@÷ÖÂ@€ÕÂ@¶ÌÂ@ ÔÂÀÖÑÂÀ²× £×ÂàîÚÂ@!ÐÂÀ¾Õ€ØÂàqÚÂ`QÕ ”ÏÂЀXÌ  ÑÂàÔÂÀ¦ÙÂ`ªÛÂàîÚÂ`àÒÂà ÖÂ@ªÎÂ@¶ÌÂà§Ñ FÜ 4߀¥Ô€·Ñ€ØÂà¹Î‘ÍÂ`ÍÂ@ýÕ  Ñ 2ÕÂ@\Û€×€«Ó ^ØÂöÑ€‡ÙÂÀ5×Â@PÝÂÀ#Ú€±ÒÂàwÙÂ@Ñ RÚ ÏÂ@¤ÏÂÀGÔÂÀƒÊ ñÊÂà›ÓÂÒ× :ÞÂ7ÜÂÀÐÒ ÙÎÂ`æÑÂ7Ü pÕÂÀSÒ DÒÂàTÊÂÀwÌÂà‰Ö€{ÛÂ[ÖÂ`òÏÂÀAÕ ÇÑÂaÕ ˆÑ€FÏ \ÎÂÐÂ@?Ë GÇ ˜ÄÂ@’ÒÂ@-ÎÂ`!Ý ©Ö XÙ PЀ½ÐÂ@ ÔÂÀ¸ÖÂ`E×ÂÀÊÓÂ@ÓÂà•Ô ½ÝÂÀ¸Ö »Ó—ÌÂÀeÏÂÀÜÐÂ@ ÔÂÐÂàÕÂÏÂР8Ô )ÌÂ@nØÂÞÕ—ÌÂ@ªÎ óÔ€àßÂÀÜÐÂÀYÑ©ÉÂ`E× ùÓ  Í ØÂà6ÏÂ@ªÎÂ@Ò á×Â@†ÔÂ…ÏÂà§ÑÂÍ€ Ù€{ÛÂà§ÑÂ`9ÙÂ`Â×Â@ ÔÂ@÷Ö ÏÚÂ@€ÕÂ@Ò€@ÐÂgÔÂ@t×€:ÑÂ`9Ù šÎÂÀÐÒÂ@nØÂ`ÎÕÂ@ÓÂàƒ×ÂÀSÒ ÛÂÀÖÑÂÀYÑÂà•ÔÂ@ëØÂÀ¦ÙÂà²äÂ`'ÜÂà¡ÒÂà§Ñ êà ÓÏ îÀÂU× ÚÂà*ÑÂàqÚ yÞÂaÕÂ@ÇÞÂÌØÂ@žÐÂ`æÑ ,Ö€.ÓÂüÐÂ@°Í€øÛ€“×Â@bÚ @ÝÂà Ö »ÓÂ@ ÔÂ`˜ÞÂÀ/ØÂÀ¬ØÂ XÙÂÀÜÂU×Âà×ÉÂà¡ÒÂÀ}ËÂ@JÞÂ`]Ó ÝÂàÜÝÂà6ÏÂÀMÓ ÉÛÂgÔÂ@-ÎÂÀèÎÂ@ÔÇÂÀeÏÂàkÛ VÏÂ ÛØÂÆÙÂêÓÂ@Dß ^ØÂ@ ÔÂ@ßÚ€ŸÕÂàîÚÂÀÚ JÑÂÀÜÂÀ/ØÂmÓÂ@åÙÂÀÚ€ ÙÂàqÚ Ù΀øÛÂ`?ØÂ ‚Ò ˆÑÂÀkΠÏ ÙΠ,ÖÂÀÜРÝÂ@ÓÂÀeÏ€.ÓÂ~åÂ@°Í |Ó LÛ £×Â@ÙÛÂÀÐÒÂà¹ÎÂÀ‚ß ¥á 2Õ ßÍÂ@ÒÂÀÊÓÂOØÂ ÙÎÂ`ìÐÂ@’Ò€Ö€{Û JÑÂà<ΠÐÂàèÛ ™ãÂ`ÈÖÂÀAÕÂ`ËÂÌÂ@ÑÂ`ªÛÂ@JÞ€Ú€ØÂà³ÏÂà§Ñ —Ù€ÏÍÂ`E×ÂÌØÂÀÊÓÂ@cÅ€ÃÏÂ@’ÒÂ@˜Ñ€½Ð )ÌÂà*ÑÂà‰ÖÂà}ØÂ@ÎÈÂà ÖÂÀMÓ€±ÒÂyÑÂÀYÑ€ŸÕÂ@˜ÑÂaÕÂ@Ó€ÛË vÔÂ@hÙ íÕ ÚÂÀÊÓÂÀ#ÚÂàÔÂÀMÓÂØÖÂÀÄÔ–áÂ@†ÔÂ…ÏÂéèÂ@ÍÝÂåÂ`¤Ü ÃÜÂÀÿßÂ`òÏÂ`àÒÂàwÙÂÀˆÞ öÞ€oÝ LÛ€æÞÂêÓ ½Ý ¯ÕÂ`žÝ çÖÂðÒÂmÓ ½Ý (áÂ@PÝÂ` á ÙÂà¾â ÜÂÀß (á€òÜÂ@bÚÂ@ñ× çÖ «à€¥ÔÂÀÿßÂ%ßÂÀÛÂ`¤ÜÂêÓÂÌØÂ…ÏÂÆÙ ÙÂàÕÂÀÜÐÂÀ ÞÂ@µáÂ`n倨Â@ÇÞÂâ€.ÓÂàâÜÂ`'ÜÂ@bÚÂ@ÓÂ`?ØÂ`ŒàÂÀpâÂÀ¾Õ d×ÂàGá€ÚÂÀ¬ØÂÀÛÂàúØÂ`KÖÂ@ýÕ ‘Ú ØÂ`ßÂIÙ .àÂÀ¾Õ ÕÙÂÀÛ jÖ€¥ÔÂÞÕÂ@nØÂ jÖÂÀîÍÂ`ÎÕÂ`KÖ öÞÂà¦æÂ`øÎ ÍÐÂ`QÕ jÖÂ@bÚÂsÒ€"Õ€ÕÌÂ`¼ØÂÏÂ,ÉÂÀÊÓÂÀùàÂà ÖÂ[ÖÂàâÜÂàâÜÂ@>à€uÜÂàØÂ=ÛÂ`¶ÙÂU×Â`òÏÂüÐÂÀ‚ßÂÀ¾ÕÂ`†áÂàÂ@VÜÂàâÜ óÔ ØÂ®ÝÂ`!Ý€ØÂ JÑ ÙÂ@Õ€“×€Ú mà d×€ìÝ€Ö >Ó yÞ d×ÂàGá gáÂà}ØÂ€ÚÂ@€ÕÂà_Ý ØÂ çÖ€™ÖÂÀ¸ÖÂÀ5× FÜÂÀßÂ`9ÙÂÀ”ÜÂêÓÂ`{ÎÂÀÊÓÂ@!ÐÂgÔ€™ÖÂÀÄÔ ÒÂÀSÒÂ`KÖ FÜÂàqÚ  ÑÂÀ¦Ù ÍÐÂCÚÂ@!ЀÏÍ€ÖÂ`?ØÂÀMÓÂÀAÕ {è ÏÚÂ@éÂ@»àÂ@hÙÂÀÐÒÂàƒ×Â=ÛÂ@ÒÂàÕ gáÂÀÚÂ@JÞÂÀ²×Â`°Ú€Ú å ØãÂ`3ÚÂÀ5× ðß þçÂàkÛÂ`>í€àßÂ@2âÂ1Ý üÝÂàwÙÂ`ÞÂÀdäÂ`!Ý [ãÂ=Û öÞ á×Â@Dß ½ÝÂ@8áÂ`žÝ ‘Ú ¥áÂÀÐÒÂ@Ò€ØÂ ^ØÂÀŽÝÂ`†áÂà/åÂÀ5×Â[ÖÂ`ªÛ óÔÂ`¶Ù€ ÙÂÀÚÂ@t×Â`†áÂàúØÂ`ªÛ ØÂÀÛÂ@ÇÞ ‘Ú dנπÖÂ`E× µÔÂàúØÂ€ ÙÂà ÖÂ`?ØÂ`¶Ù µÔ ¦Ì óÔÂàØÂ€WáÂ`˜Þ ØÂàMà€uÜ€oÝÂà0ÐÂ`˜ÞÂà¾âÂ`ñäÂÀpâÂÀjãÂàkÛ XÙÂà®Ý€™ÖÂÀLè ðßÂÀ¦ÙÂ@ÇÞ€uÜ AÈ ÕÙÂ`àÂåÂ@\Û ØÂÀGÔ€þÚÂÀßÂÐÂÀÝ ç֠〠ÙÂ`Þ€oÝÂÀÚ ÚÂ=ÛÂÀ”ÜÂgÔÂ@JÞÂ` áÂÀjãÂÆÙÂØÖÂ`WÔÂ`ªÛ€ØÂ`Â×Âà§ÑÂ`-ÛÂÀÛÂ`æÑÂ`WÔÂ`cÒÂ@zÖ€¥Ô FÜÂà¦æÂ>ÆÂ`iÑÂàØÂ€ØÂ€‡Ù €È€4ÒÂ@€ÕÂ`æÑ€Ö ˆÑ€XÌÂ`àÒÂ@ÑÂØÖÂ@€ÕÂ@÷ÖÂàGá ÿÒÂ`QÕÂÀ¾Õ ©Ö€ ÙÂ`oÐÂÀ¸ÖÂÀ²×ÂÀÊÓ íÕ€:ÑÂ`iÑÂ@÷ÖÂgÔÂ`ÎÕÂÀ¸Ö ‚ÒÂÀ_ÐÂàBÍÂà¹Î ßÍÂàîÚÂÀâÏ€4Ò ÿÒ ÕÙÂÀÄÔÂ@'ÏÂ`oÐÂÀËÂðÒÂ`cÒÂ`òÏÂ@ÓÜÂ=Û 2ÕÂÀGÔÂà0ÐÂÀ¾ÕÂÀèÎÂgÔ ©ÖÂ@bÚ #ÍÂ`ŸÈ \Πá×Â@t×€X̺ÛÂÀîÍÂÀ¬ØÂÀ”ÜÂÏ€À‡ÙÂ`ìÐÂ@t×ÂüÐÂ`ÚÓ Ï vÔ€:ÑÂÀSÒÂ`oРΑÍÂÀÛÂÀeÏÂÀSÒÂ`ÍÂ@ÒÂà<ÎÂ`ìÐÂÀ‰É€ÃϠ܀(ÔÂ@ªÎÂ[ÖÂ`KÖ€«ÓÂ`æÑ ‘Ú€^ËÂÌØÂ@æÄ DÒ€¥Ô€™Ö ßÍ ÉÛ á×Âà×Â`oÐÂÀÚ€þÚÂÀMÓÂ@¤ÏÂ@ÓÂà³ÏÂIÙ€ÉÎÂÒ× ÐÂ@ Ô€±ÒÂ` á jÖ DÒ€ÎâÂ`cÒÂ@3ÍÂÀËÂàôÙ€øÛ€"ÕÂ`¤Ü RÚÂØÖÂCÚ€.Ó©É »Ó çÖÂ@ŒÓÂÞÕ ÇÑÂÐÂà‰Ö€iÞÂmÓÂ`iÑÂ@†ÔÂgÔÂàSßÂ@VÜÂÀÜÂ`WÔÂ@t×€òÜ …Ü ÏÚÂ@ëØÂ ‘ÚÂØÖÂ@2â ÛÂ@9ÌÂÀˆÞÂ@8áÂ@ÓÜÂ[Ö ¦ÌÂà›Ó€.Ó »ÓÂ`QÕÂmÓÂÀGÔ€ŸÕÂ@’Ò€(ÔÂ@ŒÓÂàØÂIÙ RÚÂÀ/ØÂÆÙÂ@°Í pÕÂÀÄÔÂ`QÕÂ@VÜÂÀ¬ØÂ 8ÔÂ@‹è íÕÂÀpâÂà¦æÂ@»àÂàeÜ d×€ŸÕ€×Â`!ÝÂàîÚÂ`¤Ü€ìÝ€ ÙÂ@ ÔÂÀ²×Â@\Û á× ÙÂ ÛØÂ ðßÂàMà€·ÑÂà‰ÖÂ%ßÂÀÿßÂ`ŒàÂ@µáÂ@‹è yÞ sßÂ@€ÕÂà­ÐÂÀqÍÂàÕ®ÝÂ`!ÝÂ`9Ù &× d× ¯ÕÂàqÚÂà_Ý€‡Ù äá–áÂÀáäÂÀšÛ òéÂ@nØÂÀÚ 8ÔÂÀ¦Ù çÂÀ|àÂ@bÚÂ`Â× &×ÂàôÙ ‚ÒÂ`¤Ü ^ØÂà•ÔÂàÜÝ€òÜÂÀÕæÂ`ªÛ€KãÂ`†áÂàÄá€þÚÂÀÚ öÞ€"ÕÂ`WÔÂ`{ÎÂ@t×Â@ÍÝÂàÖÞÂÒ×Âà¡ÒÂ=ÛÂ@2âÂ`Â×Â@ßÚÂðÒÂàBÍÂ`WÔÂà§ÑÂ`’߀Ö€«Ó ÏÂ@?Ë€@ЀRÍÂàqÚÂ@¶Ì€4ÒÂ@€ÕÂ`oÐÂ1ÝÂ@÷ÖÂРˆÑ€ÉÎÂÀ¬ØÂàwÙ 2ÕÂà×ÉÂU×Â@VÜÂÀíâÂ`°ÚÂÌØÂ ±ßÂÀâÏÂ@ñ× óÔÂ@KÉ€:Ñ€ÚÂ@VÜÂà¡Ò ØÂ`æÑÂàÕÂÀÐÒÂ@hÙÂÀâÏ€RÍÂÀ¾ÕÂÀ/ØÂ |ÓÂÀèÎÂÀ;Ö€FÏ€×ÂêÓÂ`ÚÓÂ`KÖ‹ÎÂÀÜРÕÙ |Ó€ØÂ`3ÚÂÀ5× #ÍÂ@˜Ñ€LΠvÔ ¯ÕÂà‰Ö ˆÑ pÕ  Í »ÓÂÀèÎÂ@ÒÂÀ;Ö ¾ÈÂ`ªÛÂ@'Ï€ŸÕ ÓÏ€RÍÂÀÖÑ€:Ñ 8ÔÂÀè΀ØÂ€ÏÍ ÏÂÀAÕÂ`9ÙÂ`ÎÕÂ@Ñ€RÍÂÀSÒÂÀÖÑÂ`Ë PÐÂ@Õ µÔÂàËËÂÀîÍ »ÓÂÀ²×Âà§ÑÂ@÷Ö d×€“×ÂÒ×ÂÀqÍ€4Ò€vÇÂ`ÊÂà×É Ï çÖ |Ó€¥ÔÂðÒÂyÑÂ+ÞÂÀÜÂ`iÑÂ@ëØÂÀMÓ€«ÓÂÒ× …ÜÂÀâÏÂàâÜ€ÕÌÂÀ5×ÂÐÂÌÂ[ÖÂ@¼ËÂ@ӣʀøÛÂÀÜ tÊÂäÔÂ ÛØÂà×ÂàSßÂ@nØÂÀ”ÜÂà­Ð |ÓÂ@ÚÆÂ zÉ€ ÙÂ@€ÕÂÀÐÒÂ@ ÔÂÀÄÔÂsÒÂ@ÈÉ AÈÂÀÈÂÀeÏ€½Ð €È ”ÏÂ`oÐÂöÑÂ@åÙ€‚Å€ÉΠÆÂ`¥ÇÂ`ÉÂÍ ÓÏ€™ÖÂ`oÐÂÀ;ÖÂà*Ñ ßÍ€×€4ÒÂ`KÖÂmÓÂàõÄÂ@oàåÌ ÎÂ@÷ÖÂ`±Å ŽÐ ÓÏÂÎÂàËËÂÀ§ÄÂ@WÇ pÕÂà‰ÖÂ@ÒÂà¡Ò ÇÑÂäÔÂ@ŒÓ ÇÑÂ@ÔÇ€ÅÂÀT½Â`ËÂÒ×ÂÀîÍ€ÖÂ@åÙ€RÍÂà$ÒÂ@ªÎ 5ʵÇÂ` ÌÂ@àÅ ýÈÂPà»Ó ”ÏÂ`ËÂ`àÒ€çÉ  Í zÉ ÖÄÂàÅÌÂÌÂ@¤Ï ¯ÕÂÀèΠóÔÂÌÂ@ìÃÂà‰Ö Ï åÌÂ`™ÉÂ@¼Ë£Ê »Ó 8ÔÂüÐÂÒ×Â`øÎÂÀúË ÇÑÂà¹ÎÂàÝÈÂ@9Ì€"ÕÂÀÚÂÀ¡Å RÚ€ØÂ`ìÐÂÀ¦Ù ©Ö Ѐ«Ó £×ÂÀšÛ€iÞÂsÒÂ`øÎÂÀ#ÚÂÒ×ÂÀ•Ç€½ÐÂ@!ÐÂÀÜ Ù€FÏÂ@3ÍÂÀ‰ÉÂÀ›ÆÂ@åÙÂÒ×Â@°ÍÂÀƒÊ€4ÒÂ@'ÏÂàfÇ€øÛÂà³Ï JÑÂà`ÈÂöÑ€±ÒÂÀ)ÙÂÀâÏ€½ÐÂà§Ñ€FÏÂ…ÏÂðÒÂàÅÌÂ@ñ× ¯Õ RÚÂ@¤ÏÂÀúË€RÍ çÖÂ`øÎ 2ÕÂ`?ØÂÀ5×Â@3Í PÐÂÀGÔÂÀMÓ¯ÈÂà×ÉÂ`ÔÔ PР)ÌÂà•Ô ÍÐÂ`øÎÂÀMÓÂÐÂàƒ×Â`ÈÖ ©ÖÂ@>à ñÊÂ`.ÆÂÀ_РØÂàÔÂàÓÂÀÊÓ >ÓÂ@ÓÂÀÊÓÂÀSÒ ^ØÂÐÂ`oÐÂ`òÏ |Ó pÕÂÀÊÓÂØÖÂ@÷Ö€×ÂÀAÕ€™ÖÂ`E×Â`-ÛÂÀÜ€ Ù€æÞÂ`ìЀ.Ó  ÑÂÀÚ€™Ö .àÂÀAÕÂ@ßÚÂà}ØÂ`‡Ì VÏÂ@ ÔÂOØÂ ©ÖÂàôÙÂ ÛØÂ@\ÛÂÀ#Ú€½ÐÂÀeÏÂ`9ÙÂàâÜÂÀšÛ€uÜÂÀÜÂàÄေҠ.àÂàúØÂ`¶ÙÂOØÂ |ÓÂÀGÔ ØÂ€æÞ€þÚÂà³ÏÂ+ÞÂ`E× @Ý€Ú€¶æÂ` á€]à´Ü ŽÐÂ@ýÕ ŸâÂÀ#ÚÂàAâÂ@ñ× ·Þ íÕÂ@ñ×ÂáÂà;ãÂÀŽÝÂÀÖÑÂ`ÞÂàSßÂÀ ÚÂÀÚ ÁÒÂaÕ màÂ@DßÂÀˆÞ @ÝÂ@JÞÂãéÂÀ¦Ù .àÂà Ö€4Ò LÛÂ7Ü€æÞÂÀßÂà}ØÂÀÚ ½ÝÂàqÚ€{ÛÂÀAÕÂÀ¸Ö€uÜ€uÜÂÀ5× ÓÏÂàwÙ€«ÓÂ@EÊ€½ÐÂÀ¬ØÂ`?ØÂÀˆÞ mࠣ׋ÎÂ@˜ÑÂÀÐÒ ©ÖÂÀ‰ÉÂ`‡ÌÂ`iÑÂàƒ×€{ÛÂÀÚ€(Ô ÙÂ`â€Kã ‹ÛÂÒ×Â@Õ —ÙÂÀšÛÂÀ Þ Û ©Ö ØãÂ@8áÂÀjãÂ`†áÂ`ÔÔ„äÂ`ŒàÂ@t× RÚ íÕ Ú€·ÑÂÀ›ÆÂ  Ñ mà ÏÚÂ@ëØÂà*Ñ LÛÂ@bÚ 4ßÂ`3Ú öÞ€™ÖÂ`KÖÂ@Õ€½ÐÂ`Â×ÂÆÙÂÀ”Ü´Ü ÏÂà¡ÒÂàYÞÂ@bÚÂ`iÑ€Wဇ٠Ý üÝ yÞÂ`3Ú FÜÂÀÜ ^ØÂ€ÔáÂÀšÛÂ@ýÕÂ@bÚÂ`]ÓÂ@ßÚ :Þ ½Ý ‹ÛÂÀšÛÂ@€ÕÂ@t×Âà¹ÎÂÀƒÊÂàÜÝ  ÍÂàÊàÂÀˆÞÂÀGÔÂ`¼ØÂ ÿÒÂà§ÑÂÀŽÝ @Ý‘ÍÂÀAÕÂàîÚÂ`˜ÞÂ[Ö ‹Û€™Ö ÕÙÂàèÛ€«ÓÂ@PÝÂ@\ÛÂÀ¦ÙÂ@ÑÂÀ ÚÂà¦æÂÀGÔ ¦ÌÂà­ÐÂ[ÖÂÀÿ߀ڠßÍÂàZÉÂÀSÒÂÀ_ÐÂäÂ@˜ÑÂàâÜÂáÂà)æÂ@ÙÛÂ`âÂ`?ØÂÀ ÚÂ@Õ ÒäÂ+ÞÂÀpâÂàúØÂàÜÝÂ@ÙÛ JÑÂCÚÂàwÙ€"ÕÂ@€ÕÂ@ÕÂ`òÏÂÀ¾ÕÂ`Œà€ØÂÀ¬ØÂÀ”ÜÂ@PÝ€þÚÂ@µáÂ`3Ú®ÝÂ@zÖÂàÐßÂÒ×ÂØÖ óÔÂ`ÔÔÂÀˆÞÂ@bÚ ÁÒÂIÙ ©ÖÂàØÂÀ ÚÂ`ÈÖÂÀ¾ÕÂà¡ÒÂàÊàÂ=ÛÂÀ#ÚÂÀ‚ßÂÐÂÀ)ÙÂ`ÈÖÂ@2âÂ`ÔÔ üÝ€QâÂ`ßÂ@VÜÂ@åÙ >ÓÂ`’ßÂ@ñ×Â`ÔÔ ‹Û€× ÝÂÀ”Ü üÝ Þâ FÜ 4ßÂ@ëØÂ =èÂmÓ nËÂ@˜Ñ Uä [ãÂÀ¬ØÂ  ÍÂàkÛÂ`Â×ÂàeÜÂÀˆÞ ”Ï€FÏÂ@’Ò ÉÛÂàîÚÂÀ²×€™ÖÂ`ÎÕ ”Ï€«ÓÂ`]ÓÂ@VÜ @ÝÂÞÕ ÚÂüÐÂà<ÎÂ`¶ÙÂÀ)Ù€Qâ€]à€ÚàÂÀÛÂ@µá€òÜÂ@ñ× 4ß ÞâÂ`E× :ÞÂÀMÓ ‹Û€þÚÂ@ÍÝÂÀçãÂâ€iÞÂ`ñäÂÀ/ØÂÀ¸ÖÂàkÛÂ`¶ÙÂ@hÙÂàÜÝÂ@ñ× 7éÂ@Áß ÉÛÂÀ‚߀òÜÂ`¼ØÂ@ÓÜÂà#ç sßÂ`¤Ü€Îâ€iÞÂ@ ÔÂ@ÍÝÂÀÄÔÂ@åÙ LÛÂöÑ€!ê€ØÂ ,ÖÂÀ¸ÖÂ@zÖ€àßÂàÖÞÂàÄá µÔÂà0ÐÂ[ÖÂêÓÂàGáÂà›ÓÂ`ÔÔÂ`?ØÂ`zãÂ@ëØÂ€àßÂàúØÂÀ ÞÂÀáä€^ËÂgÔÂÀ)Ù ùÓ Ú€.Ó \ΠˆÑÂ`9ÙÂaÕÂ`¶ÙÂàâÜÂ@ÇÞÂàèÛ€æÞÂÀ¦Ù€òÜÂ@ ÔÂ`ÔÔ€þÚÂÀ)ÙÂÀ#Ú€ÃÏÂ@ÓÜÂ@ÓÜÂ@>àÂàÅÌÂàîÚÂÀjã€ØÂ—ÌÂà×€™Ö LÛÂ@ÓÂ`ëå€ØÂ vÔ–áÂÀAÕ€WáÂàèÛÂ`Â×Â@ÕÂ@ Ô µÔÂÀÛ RÚÂà ç ÜÂÀ߀æÞÂà×€iÞÂà$Ò€4Ò ‹ÛÂÀÕæÂ Û ¯Õ€™ÖÂ@€ÕÂ`WÔÂà}ØÂ —ÙÂÀóáÂ`!ÝÂàâÜÂ`E×€ŸÕ —ÙÂÀGÔÂ`ªÛÂ ÛØÂ€øÛÂ%ßÂ@DßÂ=ÛÂ`E×Â@’ÒÂàÕÂàâÜ€cßÂàÔ Ú bÍÂ`ÈÖ 4ßÂ@ Ô ŽÐÂà¡ÒÂà‰Ö€ÚÂÀYÑÂ@-΀ŸÕ ÜÂ`ÚÓÂ@VÜÂ`]ÓÂ@ßÚ XÙÂ`'ÜÂ%ßÂ@¯âÂÀ²× ÏÚÂ@ÓÂ`uÏÂ`-Û€ÚÂ@ªÎ äáºÛ íÕ€ Ù€"ÕÂàÖÞÂàwÙ€·ÑÂ@nØÂ ¥áÂÀ ÞÂ@ÇÞ¢ßÂàÔÂ`QÕ ±ß€þÚÂà‰Ö€ÃÏÂàÕÂOØÂ%ßÂà•ÔÂ@ÕÂàÜÝ FÜÂ`àÂ`]Ó ŽÐÂàÓ á×Â`ÈÖÂÀeÏÂ@WÇ ‹ÛÂàMàÂ`°ÚÂ@-ÎÂ@€Õ€¥ÔÂà‰ÖÂàîÚ ñÊÂ`ÔÔÂ@ ÔÂ@ÙÛÂàeÜÂà$ÒÂ@Èɠ݀{Û ÙÂ@÷Ö ©ÖÂ`ªÛÂàÓ€:ÑÂР|ÓÂÀôÌ öÞÂ@å ÝÂOØÂ`3ÚÂàÕÂÒ×€4Ò£ÊÂàÅÌÂ`iÑÂÀ”ÜÂðÒ€"ÕÂà­Ð  ÑÂ`ÔÔÂ`ìÐÂÞÕÂà³Ï á×Â@Õ ©Ö ÉÛÂgÔÂà§ÑÂ`žÝÂ@ëØÂ ÝÂ ÛØÂ ÓÏÂ`òÏ ÉÛÂ…Ï€ÕÌ€.ÓÂ@ÍÝÂÀÐÒÂÀSÒÂÞÕÂàqÚ¨Þ¨ÞÂÀÊÓÂ`¶ÙÂÀ ÚÂÀÜÂöÑÂ`'ÜÂØÖ RÚÂ`iÑÂ`KÖ€ÚÂsÒ€ØÂÀÄÔÂÀ”ÜŠãÂ@t×Â`WÔÂ@˜ÑÂ@ßÚ€Ö ,ÖÂàèÛÂÀ_ÐÂ`ÎÕÂ@nØÂ ßÍÂàÓ &×Â@˜ÑÂÀÐÒÂ@t× pÕÂ@ßÚÂà$ÒÂaÕ çÖºÛÂà× ÇÑÂÀYÑ @ÝÂ@ÕÂ@?ËÂ`¤ÜÂ`ÂרÞÂÀ Ú€Ú€Ú¢ßÂÀîÍÂ`ÈÖÂ`žÝ VÏÂ`ÚÓ дܠµÔ€ŸÕ @ÝÂ@nØÂàØÂ 2ÕÂÒ×ÂÀ²×Â@\Û ©ÖÂ@VÜÂ`{ÎÂà*Ñ€øÛ€KãÂàîÚÂà ÖÂ@ëØÂ@ÙÛÂyÑÂgÔÂU×€«ÓÂ`uÏ FÜÂ`-ÛÂÀeÏ ¦ÌÂÀSÒ ÃÜÂàƒ×Â`òÏ ÇÑÂàÑÊÂ`Ë ÛÂU×ÂØÖ ÕÙÂüЀþÚ€·ÑÂØÖÂÀˆÞœà€{ÛÂ@ßÚÂmÓÂÀ”ÜÂ@ÕÂ@zÖÂCÚ€±Ò DÒÂÀáäÂ`¼ØÂàqÚÂ@ÓÜÂÀ ÞÂâÂàÐß 4߀× íÕ (á€]à€«Ó DÒÂ@zÖ€¼å 4ßÂÍ€ØÂ`cÒÂ`'Ü RÚÂàèÛ€“× ÛÂÀGÔ d×ÂÀGÔÂ@ÕÂ`-ÛÂ`ÎÕÂðÒÂØÖÂ@ŒÓÂIÙÂà€øÛÂàèÛÂ@ÕÂ`ÎÕÂ`Â× ØÂ€‡Ù€"ÕÂ`žÝÂOØÂ 4ßÂ@ÍÝÂ`Â×Â@nØÂ€“×€æÞÂÀ)ÙÂ@ÍÝÂÀ/ØÂÀîÍ ¬ËÂÀÈÂà$ÒÂÀeÏÂ` ÌÂ`oР£×Â`iÑÂà­Ð ‹ÛÂ@t×Â@¼ËÂ@bÚÂgÔ ¦ÌÂ@zÖ ‚Ò€ŸÕÂ`E×Â@’ÒÂÀ¬ØÂ çÖÂ@ñ×Â@’Ò \Π‘ÚÂÀÜÂ@PÝ XÙÂà Ö¨ÞÂgÔŠãÂàBÍÂà›Ó€ÚÂyÑ  ÑÂÀ5×Â`æÑÂÌØÂ€ÔáÂÀÚ ÛÂàSßÂ`QÕ ‘Ú€™ÖÂIÙÂ`E× ‘ÚÂ@bÚÂÀ¸Ö ^ØÂºÛÂàÜÝÂØÖÂ`˜ÞÂ@ÍÝÂàôÙÂÀÛ á×ÂÀ¦Ù çÖ€ ÙÂ@ÍÝ´Ü ÜÂ@nØÂ®ÝÂÀÛ ¯Õ€æÞÂ`ßÂ`KÖ€.Ӯ݀Qâ—ÌÂðÒ ÜÂ`žÝ üÝ€.ÓÂàkÛÂÀèÎÂ@ÒÂà¡ÒÂ@JÞÂ`¤Ü £×Â@€ÕÂ`þÍÂÌØÂ óÔÂ`°ÚÂ@ñ×€ŸÕÂÀ#ÚÂ`3ÚÂàeÜ€ÚÂäÔÂÀkÎÂàqÚ óÔ‹ÎÂ@ŒÓÂÀÛå€ÖÂ`?ØÂ€½Ð€¥ÔÂÀÝÂÀ¬ØÂ€:Ñ ²ÊÂÀ²×Â…ÏÂ@ŒÓ ëËÂÀMÓÂ`ÚÓ öÞ [ãÂ@nØÂ€«ÓÂ@žÐÂà*Ñ ,ÖÂÀÄÔ€ŸÕÂ`E×ÂÀ߀“× ^ØÂ ,Ö ¸É ÐÂ`KÖÂÀAÕÂ@˜ÑÂÀeÏÂ@DßÂÀ)ÙÂ`ÍÂÀôÌÂÀ ÚÂ@µáÂ`’ßÂ7ÜÂ`?ØÂÀ_ÐÂà$ÒÂ@zÖÂàÔ€ÛËÂÀÚÂÒ×Â@t×€{Û€½ÐÂÀ;ÖÂ@nØÂà•Ô »Ó ØÂ@\Û€ìÝ &×Â@ßÚÂà¹Î jÖÂ@DßÂ`€âÂÀ”ÜÂ`iÑÂ@nØÂ LÛ€ØÂ :Þ®ÝÂÀSÒ ÕÙ€æÞ€øÛÂ@hÙÂ1ÝÂaÕ€cßÂðÒÂàqÚÂÀ5×Â`täÂ`þÍ€«Ó µÔÂ`ÔÔ€4ÒÂà×ÂmÓÂàÜÝ ^ØÂÀÚÂÞÕ d×ÂàqÚÂÀ‚ߋ΀ØÂ`°ÚÂ`9ÙÂ`-ÛÂ7ÜÂàôÙÂ`E×ÂÀ”Ü€WáÂmÓÂ@ëØÂÏÂÒ×€ ÙÂ@˜Ñ€.ÓÂ`E׺ÛÂàeÜÂà›ÓÂ`iÑ€ŸÕÂ`òÏÂÀÝÂIÙÂ`9Ù …ÜÂÀÄÔÂ`WÔ ¯ÕÂÀÊÂyÑÂ`É >ÓÂêÓ µÔÂ@3Í ˆÑÂà›ÓÂaÕÂ@\Û ÏÚ€àßÂsÒÂ@ ÔÂU×€"ÕÂ@ñ×Â&ÊÂ@nØÂyÑÂðÒÂà ÖÂà Ö (áÂmÓ d×Â@zÖÂ@t×Âà_Ý RÚÂ@3ÍÂêÓÂ@€ÕÂà ÖÂÀqÍ€(Ô€ÛËÂ`WÔ \ÎÂàBÍÂ@ìÀÖÂÀ²×ÂÀqÍÂàƒ×ÂàwÙÂðÒÂ@åÙÂÀÚÂ`ìÐÂ@ÓÂ`Â× ¯ÕÂ`ýâÂÀ#Ú€‡ÙÂà_Ý OåÂ`’ßÂ`?ØÂ€¶æÂàGáÂàúØÂ ¥áÂ@Dß Ú jÖÂ@»àÂÀXæÂ ¥á€ÚÂ`˜ÞÂÀ”ÜÂ@åÙÂà¡ÒÂ@PÝ¢ßÂ@,ãÂ@,〒ìÂàMàÂÀçã üÝ€ÚÂ`hæÂ`Dì í–áÂ`âÂ@ åÂ`ß sßÂ@êí 1ê O倪èÂ@ßÚÂféÂà‚ìÂÀùà öÞ€×ÂûåÂZë ¨ë¢ß ãÂÀLè€-èÂféÂÀóáÂ`âÂà;ãÂ`Çë€!ê .àÂÀ4ìÂ×ëÂÀ(îÂ~åÂ~åÂrçÂ=Û (áÂ@£äÂ`ßçÂ`DìÂ@—æÂÀ.íÂâÂà‚ì äÂåÂ@ 堽݀3çÂÀóá çÂ`ëåÂ`bç€Âä .àÂ`ñäÂÀÛåÂ@hÙÂlè ™ã ÛÂáÂÀŽÝÂ`ÓéÂÀáäÂÀóá òé çÂ`bçÂÀ^åÂÀ^值倪è€ÎâÂ` áÂàèÂÀÿßÂ`’ßÂlèÂ@—æÂ@PÝ aâ€9æÂàdñÂ@©ãÂ@åÙ ðßÂÀvá€hóÂÀ¥î [ãÂéè vÔÂ`ýâ€?åÂ`Dì öÞ€Eä ÌåÂàAâ€Ú ðß LÛ òÂ`åæÂà/åÂ`bç€Wá öÞÂÀíâ ¥áÂÀáäÂ@hÙÂHî OåÂ@çÂ@©ã´ÜÂ@&äÂ1ÝÂàÐßÂ@8áÂ`hæÂ ië ‡æÂ`ñäÂÀÛåÂ`Jë :Þ =è öÞÂ`†áÂ`WÔÂ`àÂ@JÞ€Úà ºèÂ`tä€ÚàÂÀFéÂà)æÂ€¥ÔÂ`¤Ü aâÂÀßÂÀíâ€òÜÂ@µá€oÝ€‡ÙÂÀÛÂÀXæÂ  æÂ@míÂ@êÂåÂ@VÜ FÜÂ`’ßÂàYÞ yÞ€{Û€!ê XÙ€‡Ù OåÂàMà UäÂûå çÂàXó  æÂÅîÂÀÚÂ`ßÂ@8áÂCÚÂ+ÞÂ`hæÂ Ü [ã€?å :Þ€Îâ ÚÂ`žÝÂ`†áÂ`ëåÂÀXæÂ ÕÙÂâ äá ØÂ€àßÂà ÖÂ`÷ã€Ôá aâÂ@¯âÂà_ÝÂà¦æÂ :ÞÂûåÂÀÖÑ 8ÔÂÀÝÂ`ýâÂ ÛØÂ`ßç ð€°ç Cç @Ý ¥á ùÓÂÀjãÂ@sìÂxæÂ ÝÂàƒ×¨ÞÂ`tä€ÂäÂ@ê çÖ RÚÂ@zÖÂ@,ãÂ%ßÂÀß ŸâÂïçÂå &×€àßÂÀjãÂõæÂ€ÔáÂÀ ÚÂáÂàYÞÂ`'ÜÂàèÛ€“×€àßÂà‰ÖÂàîÚ ±ß€ÈãÂ`täÂyÑ XÙÂÀ/ØÂàeÜÂà¾â ÛÂàwÙÂ@8áÂÀdäÂ`¶Ù ÝÂ@hÙ "â XÙÂà#ç :ÞÂ`ªÛ öÞÂ@DßÂ@¯âÂ@ßÚ´ÜÂàÜÝ màÂà_ÝÂÀÚ öÞÂà¸ãÂàÂ`žÝ Ú€¼å¨ÞÂ@2âÂ`ÇëÂ@‘ç–áÂÀvá€ØÂàâÜÂ%ßÂÀŽÝ€ªè yÞ€°çÂ`\è€uÜÂ7Ü€]àÂÀÕæÂ`âÂ`’ßÂ@ÇÞÂûåÂà¸ãÂ`zãÂ`˜ÞÂ@åÙ ±ßÂ@ÍÝ€¶æÂäÂàAâ :ÞÂ@\Û »Ó®ÝÂ@ê€Wá€-èÂÀßÂ@2â€àßÂÀ)Ù =èÂ@8áÂÀˆÞÂ@©ã ™ãÂ`ŒàÂÀjãÂÀváÂ@µá CçÂ`ßç UäÂ`3ÚÂ@ßÚÂ`åæÂà ÖÂ`zãÂÀ¾Õ äÂ`ÞÂàÊàÂàìÂ`\è yÞÂàÄá ¥á€ÚàÂ@VÜ åÂÀÛ u逩ý€c߀ÏÍÂ@ëØÂà•Ô€EäÂÀ Þ€«ÓÂÀˆÞ "âÂÀ‚߀KãÂ@¯âÂ`’ßÂà¸ãÂ`bçÂ`ªÛÂàSßÂ@ÁßÂÀšÛ pÕÂ`àÂÀŽÝÂ~å {èÂÀ ÚÂ@DߊãÂÀ4ì€øÛ ã Ÿâ€àß d× ÕÙÂ×ëÂà¦æÂ€Èã€ÔáÂà²äÂTì€ÈãÂ@ßÚ€Kã€{Û màÂÀvဒìÂ@\Û Uä€]àÂféÂÀùàÂÀóáÂáÂûåÂà#ç–áÂ`àÂU× ´éÂÀÕæÂûåÂ`ëåÂ@öëÂÀdäÂàÐ߮ݠÞâ€]àÂàšèºÛÂàôÙÂ`Pê ÚÂ`÷ãÂÀpâÂ`àÂ`ÞÂ@—æÂ@,ãÂäÂ`!ÝÂ@ÙÛÂ`†áÂ`ñäÂÀÛ–á€ì OåÂàÄá€ëÂàÜÝÂ ÛØÂ€æÞÂÑì€ÎâÂà¸ã€?åÂûå óÔ äá gáÂ@ñ×Ââ ãÂÀÕæÂ@µá ãÂ`hæÂ€uÜ iëÂàMàÂÀôÂ1ÝÂÀÝÂÀÜÂé耼åÂÀÝÂ@ÇÞ€ÔáÂ`zã€!êÂ`à ¥áÂ@©ã€ìÝ üÝÂÀFéÂ`Áì aâ gá€ÈãŠãÂ`˜Þ êàÂÀˆÞÂ`ßÂà²ä€3çÂ@ÍÝÂÀšÛÂ%ßÂ`°ÚÂ`÷〙֠çÂ@ÇÞÂ@hÙ€°ç€cßÂ@&äÂÀ^å .à€Âä UäÂrçÂ}úÂ@ÌòÂ@ëØÂ@‘çÂ+ÞÂ@ßÚÂÀ5×€QâÂÀváÂÀáäÂ`!ÝÂ ÆæÂ`ëåÂà¦æÂ (áÂ`¤Ü (á @ÝÂ@PÝ´ÜÂá Ú 4ß sß êàÂ`z〶æÂ sß 2ÕÂÀXæÂÀÕæÂ`âÂ`’ßÂÀáäÂ`ªÛ€?åÂ@†ÔÂÀ²×ÂÀ”Ü€'éÂÆÙ ±ßÂ7ÜÂÀáäÂÀ‚ß ÕÙÂàôÙÂ` áÂ`-ÛºÛÂ ÛØÂ d×ÂÀ²×ÂÀ‚߀ÚÂêÓÂÀˆÞÂÀáä jÖ RÚÂ@’ÒÂCÚ€"ÕÂ`3Ú€ØÂ ÕÙ ·ÞÂ@zÖÂ@‘çÂ@&ä 8ÔÂÀwÌ LÛÂÀùàœà€ŸÕÂ@ýÕÂ`°ÚÂ@\ÛÂ@PÝÂ@ÇÞ€ÚÂà}ØÂ@åÙÂÀ#ÚÂ`òÏ€ìÝÂ`à FÜ€±ÒÂàúØÂàÐßÂÀçãÂÀ)ÙÂ`¶Ù @Ý€iÞÂ ÆæÂ€ªè€{Û ÜÂà×ÂÀ Ú€þÚÂ@ÙÛÂ7ÜÂÀ)Ù ¯Õ @Ý¢ßÂÀ/ØÂÀÊÓÂ@ÓÂ`ÉÂ`ÚÓÂ@ßÚÂ`ªÛÂÀ ÚÂÀ¦Ù ðßÂðÒÂÀSÒÂÀ¸ÖÂ@Dß ÏÚ ÜÂ@’Ò íÕÂðÒ …Ü€{Û Ú€iÞÂ`¼ØÂ £×€òÜÂÀ#ÚÂàqÚ ùÓÂÀçã íÕÂ`'ÜÂxæÂ yÞ RÚ€¥ÔÂ@ëØÂÀYÑÂ@bÚ€QâÂ@bÚÂà×Â@zÖÂaÕÂàZÉ >Ó ýÈ :Þ€@РÐÂ`QÕÂ@€ÕÂàôÙ´Ü ½ÝÂÀèΠDÒÂ`E×€ÉÎÂÀ•Ç€ ÙÂ`˜Þ€æÞÂÀÊÓ µÔÂàÕÂÀ;ÖÂàÕÂ@ÕÂ`°ÚÂ@VÜÂàwÙÂ@t×Â@-ÎÂ@žÐ€.ÓÂàúØÂà¹ÎÂÀÖÑÂàwÙ€æÞ€¥Ô yÞÂàÕÂ`9ÙÂà ÖÂàÔÂ@PÝÂÀôÌ€{ÛÂ`3ÚÂ@cÅ bÍ 2ÕÂàAâÂÀ²×Â@÷ÖÂΠÉÛÂ@\Û Ù ±ß ¬ËÂ@hÙÂ@ÕÂ`{ÎÂÀÖÑ ΀™ÖÂÀ#Ú‘ÍÂÍ ‹ÛÂ@!Р|ÓÂà×ÂàBÍ »Ó ÎÂÀSÒÂàØÂ`àÒ &×Â@˜Ñ€ŸÕ ¤Â çÖÂêÓ€«ÓÂOØÂ 4ßÂ@t×Âà¡ÒÂÀMÓ DÒÂ`¼ØÂ @ÝÂ`-Û á×Â@t×€™ÖÂ`ßÂÀ)ÙÂ@t×€æÞÂ`æÑÂ…ÏÂàÓÂ`ÍÂ@Õ 8Ô€]àÂ%ßÂàÕ |Ó £× ÉÛÂÀÊÓÂ@ñ×Â`cÒÂ@Õ üÝ€™ÖÂ`àÒÂÀÄÔÂÀ²×Â`cÒÂ1Ý€«ÓÂÀèÎÂà}ØÂaÕÂà§ÑÂ`uÏ #Í€ Ù pÕ &×Â=ÛÂ@ßÚ ÚÂ`¶ÙÂ`ìÐÂ@Ó ØÂàØÂÀqÍÂÀÜ€ŸÕÂ@EÊÂàÕÂÀ5×ÂÒ×Â`¤Ü ñÊÂ`¶Ù &× 4ßÂ@ßÚ 8ÔÂgÔ ½ÝÂ@\ÛÂÀÜÂÀÐÒÂÀYÑÂÀÊÓÂàúØÂ`æÑ /Ë ùÓÂ@÷Ö€·Ñ LÛÂà§ÑÂà׋ÎÂ`žÝºÛ ‹ÛÂàîÚÂàÔ ‚ÒÂ@÷Ö ÿÒÂ…ÏÂ`ËÂ…Ï€¥ÔÂÀ)ÙÂ`4Å bÍ d×ÂÀGÔÂ`WÔÂà›ÓÂÀÄÔÂäÔÂÐÂÀ)ÙÂÀÜÂ@t× çÖÂ`†á®ÝÂàƒ×ÂÀ)ÙÂ@ÍÝÂ@nØÂ€4ÒÂ@ŒÓÂ@¼ËÂ@KÉÂàôÙÂàÖÞ pÕÂÀ5×ÂðÒ€{ÛÂ@’Ò ÍР¦Ì ÇÑÂ`ÚÓ ^ØÂ„äÂÏÂ@÷ÖÂ@˜ÑÂ@?Ë€FÏ :Þ ¯Õ XÙÂ…Ï ÏÚÂ`ÔÔÂÞÕÂÀ ÚÂÀÖÑÂ@\ÛÂáÂCÚ€ÏÍÂ@€ÕÂÀ;ÖÂÀÊÓÂ@žÐ ©Ö€oÝÂ`€â€æÞÂàÖÞ ,Ö  ÑÂÀ#ÚÂ@÷ÖÂà ÖÂà¿ÍÂàwÙ 8Ô µÔ £× Ú ÞâÂÀÿß ±ßÂ`°ÚÂ`?ØÂ€"Õ€ÚÂõæÂ€‡ÙÂ`ÚÓ€ØÂIÙÂà¾âÂ@ýÕÂàâÜÂÀ/ØÂ`’ߺ۠íÕÂ`ÚÓÂ@PÝÂàkÛ çÖÂàBÍÂ@ Ô€× ÜÂ@t×ÂU×€‡ÙÂÀ#Ú€øÛÂÀ/ØÂ FÜÂÀ#ÚÂà}ØÂ çÖÂÒ×Â`3ÚÂà¡ÒÂÀÝÂ@ÇÞ .à€¤éÂÀ¦ÙÂsңʀøÛÂ`Dì€ÃÏ ÍР¯ÕÂÀ¦ÙÂ1ÝÂÀÚ ðßÂàôÙ€‡ÙÂêÓ€4Ò€× ½Ý€iÞÂ=ÛÂà ÖÂÀqÍÂ…ÏÂÀAÕÂ@\ÛÂÀ/ØÂÀwÌÂÀ¬ØÂ€‡Ù ÿÒ —ÙÂà¾âÂ`KÖÂÀMÓÂÀ|àÂ`ýâÂU×€ØÂsÒÂ`Œà€ØÂ@t× ÍÐÂ@ÓÜ ©Ö XÙÂÀŽÝÂ=ÛÂàâÜ êà Ÿâ µÔ —ÙÂ@ÒÂ`’߀ìÝ .à®ÝÂCÚ Ý ÉÛÂ@ÇÞÂ`ÚÓÂ`æÑÂâÂá ÕÙ ÉÛÂ@DߨހQ⠈рKã ØÂ ÏÚ€(ÔÂÀYÑ jÖÂÀÊÓ ©Ö åÂ@€ÕÂÀ ÞÂÀ;ÖÂÒ×€QâÂà¡ÒÂà›ÓÂà$Ò @ÝÂÀ ÚÂ`Â×ÂÀß vÔ ÏÚÂ@8áÂÀùàÂ@ÓÂàØÂ€½Ð FÜÂà¡ÒÂ`{ÎÂàwÙ€ÚÂ`iÑ hÌ ØÂ`¼ØÂ@†ÔÂÀMÓÂà§ÑÂöÑÂOØÂmÓ®ÝÂ@Õ€c߀ØÂ€ØÂU×ÂÀ¸ÖÂ`æÑÂ`ìÐÂðÒÂ@†Ô 8ÔÂÀAÕÂÀ/ØÂ@Ñ€"Õ€c߀ìÝÂ`ÉÂ`àÒÂ@˜ÑÂ@»àÂ`iÑÂÀÊÓ€æÞÂÀeÏ |ÓÂ@ÙÛÂà›ÓÂ`?ØÂÀSÒÂË ÿÒ ÈÂà§ÑÂ@ Ô€ ÙÂà0ÐÂà§ÑÂÀÖÑÂÀkÎÂ@ÓÂÀGÔÂÀYÑ€LÎÂ`ÎÕÂIÙÂÀÜÐÂÀÖÑÂgÔ‘ÍÂÀÊÓÂàƒ×€½Ð 3ÀÂ`æÑ€4Ү݀uÜÂÎÂàØÂºÛ ùÓÂ`ìЀ(ÔÂà<ÎÂ@ßÚÂ`†áÂ@èÂ`WÔ€«ÓÂ@€ÕÂÀ_ÐÂÀAÕÂàúØÂÆÙÂà‰ÖÂà¬åÂûåÂ`E×ÂÀÜ ¦Ì€{Û íÕÂOØÂ ,ÖÂâÂâ £×Â@ÙÛ äá 4ßÂàÜÝÂ@ßÚÂ@ÕÂ`3ÚÂ`Þ€øÛ€cßÂ@VÜÂ`QÕÂ@åÙÂÀ”ÜÂõæÂàèÛÂÀváÂ`3Ú ÒÂ@nØÂ`ÎÕÂÀ߀uÜÂ@ÙÛÂÀˆÞÂ`zã€æÞ€]àÂ ÛØÂ€iÞÂÀˆÞÂ@ýÕÂÀ ÞÂà}ØÂ@ÁßÂÀjãÂ@JÞÂÀÿ߀iÞ€3çÂ@ßÚ óÔ »Ó€þÚ„ä æë lõÂâÂ`°Ú€iÞ öÞ "âÂÀpâÂ@ÇÞ´Ü "âÂ@ÍÝ ¥áÂ`ßÂ@ÍÝÂàîÚÂ`Þ ÒäÂàúØÂÀjãÂ`êÂ@»àÂ`hæÂCÚÂ@—æÂà IæÂÀpâÂÀRçÂÀjãÂ` áÂàÿì Uä Û Òä€ì€QâÂÀ|àÂ@æÂÀ@êÂ1ÝÂÀ Þ £×€ ÙÂ`žÝÂâ„ä ã€¤éÂà5äÂûåÂãéÂÀóáÂÀ|àÂàîÚÂÀáäÂ`°Ú øè aâ ‡æÂ@bÚ€'é "âÂÀ”ÜÂ`àÂÀ^åÂ@¯âÂÀ‚߀ڀŸÕÂÌØÂÀÕæÂÀ(î äá sßÂ`°ÚÂÀ;Ö LÛÂ`nåÂ`täÂÀpâ (á ŸâÂ`!Ý á×Â@ëØÂ`-ÛÂ`¤Ü Þâ Þâ ÜÂ@ÇÞÂàGáÂÀíâÂïçÂÀÛÂ`t䠽݀QâÂàGáÂ=Û üÝÂÀíâ øèÂàÊàÂàkÛÂÀÛ€9æÂ ØãÂ@æÂ€?åÂ`zãÂ`-ÛÂ`3Ú€ëÂ@ÍÝÂ`\èÂÀÛåÂ@ÁßÂ@,ãÂaÕÂÀ²× ç òéÂÀ‚ß sßÂâÂ`¯ïÂéèÂ@míÂÀÛå–áÂÀÉèÂàéÂ@ñ×ÂÀˆÞ …Ü€¼å 1ê “ä Þâ€Ú€°ç€ î€9æÂÀíâÂÀçãÂàˆë¢ß€¤é 1êÂ`Çë€WáÂÀÕæÂÀóáÂÀXæÂ€Wá ïÂàôÙ€ÂäÂ@¬¤Â`‘ôÂà)æÂ øè À瀤éÂà²äÂrç€ÖÂ`žÝŠã ™ãÂ@ÙÛ€!êÂàè ŸâÂ@JÞÂ`!ÝÂÀ·ëÂà¸ãÂàÖÞ ÞâÂàÂ@ÇÞ ã ÎåÂ`€âÂ`åæÂ@è€ÚàºÛ :Þ êàÂ@©ã ã€cßÂ@ýÕ€ÈãÂ@éÂ`ßçÂÀ]ú æë êàÂÆÙÂàîÚÂCÚÂà;ãÂàâÜ äÂÀóáÂÀ.í gáÂûåœà sßÂàÂ` áÂàèÛÂâÂÀ5×Â@t×Â@JÞÂÀÿߊãÂgÔÂàôÙ€iÞÂ@DßÂÀ^åÂ`3Ú€ìÝÂ@zÖ yÞ€òÜÂÀÛÂ`'Ü ÉÛÂÀ/ØÂ ÜÂà¬åÂ`bç ÛÂ@ñ× êàÂ`ñäÂà_Ý mà€9æÂÀ¦ÙÂ` á ÏÚÂÀ/ØÂÀSÒÂ@,ãÂà/åÂÀ²×Â@ßÚ€™ÖÂ@åÙÂ@ÙÛÂÀ|àÂà_Ý d× …Ü êàÂäÔ ÝÂ`QÕÂàèÛÂ`€âÂ7ÜÂÀˆÞ€ŸÕ …Ü€¶æÂ@ÇÞ IæÂ ÝÂÀ¦ÙÂ`ÚÓÂÀ;Ö ÏÚÂà;ãÂÀ²×ÂÀÊÓ ÉÛÂ@JÞÂ@Õ€™ÖÂàqÚÂ ÛØÂàèÛÂàâÜÂ@€Õ nËÂ`ªÛÂÀ¦ÙÂà¡ÒÂ`'Ü ^ØÂ@&äÂ`ÍÂ@Ó óÔ€ÚÂ@¯âÂÞÕ ãÂ`’ß ŽÐ€ØÂàAâÂÀLèÂÞÕÂàÔ ÉÛ€×ÂàqÚ€·Ñ€“×ÂàôÙ ÚÂ`'ÜÂ@ñ×ÂÀ¾Õ€ÚÂàYÞÂÀ¦ÙÂ@Õ ðß —Ù ,ÖÂOØÂ`ß êàÂÀÕæÂÀŽÝÂ@PÝÂ`ÎÕÂÀ5×€þÚ gáÂ@åÙ öÞÂ`KÖ€¥ÔÂ@Ò ‘Ú åÂ`ÎÕÂÀ#ÚÂÏ aâÂàôÙÂàAâ ™ã€{ÛÂ`ªÛÂÀ¸ÖÂ`ÚÓÂÀMÓÂ@ßÚÂàôÙ =è |Ó€iÞ á×ÂÀÜÂ`žÝ ÉÛÂàeÜÂà)æÂÀAÕÂ`°Ú ©ÖÂÀ²×Âà×ÂIÙÂ@ßÚ€WáÂ@µá —Ù€Úà jÖÂ`ÞÂ`WÔÂU׺ÛÂàSßÂÌØÂ€ ÙÂ`˜ÞÂ@Ò .àÂ=ÛÂàÜÝÂÀÛÂ`3ÚÂÀ¸ÖÂ@JÞÂØÖ LÛ€EäÂàÂ`9Ù vÔ€:ÑÂÀ”ÜÂ=ÛÂ@ ÔÂ`žÝÂÀ”ÜÂÀÛÂà_ÝÂ`°ÚÂ`Â× ØÂ ‹ÛÂàeÜ =è€ÚÂ`?ØÂêÓ€™Ö yÞÂÀ_ЀØÂ ·Þ ½Ý ‹Û¨Þ€ØÂ ‹ÛœàÂÀùàÂ`9Ù ±ßÂàMàÂ@µáÂ@¤ÏÂ@÷Ö€‡Ù¢ßÂ@-δÜÂàÖÞÂ@åÙ øè€KãÂÀpâÂ@æÂ€æÞÂ`â¢ß ‡æÂÀŽÝÂà ÖÂÀ ÚÂàÂà¾â€ØÂ`ªÛÂ@é "âÂ`ªÛ€þÚÂmÓÂàÂà‰Ö ÉÛÂmÓÂà`È ÙÂÀ²× ç€þÚÂ=ÛÂ@PÝÂ@ëØÂàÕÂà}ØÂÀ5×Â@PÝÂàÊàÂCÚÂàƒ×Â`WÔ FÜÂÀˆÞÂ`ßÂ@DßÂ`˜Þ s߀"ÕÂ@€Õ€ÖÂÀ_ÐÂà}ØÂ Ü êàÂÀ‚ßÂàôÙÂÀ#Ú€ ÙÂ`-ÛÂ@»àÂÀ#Ú€ìÝÂ@JÞÂ@t×Â`ªÛÂà‰ÖÂ`¶ÙÂàÔ€½ÐÂàÐ߀ ÙÂCÚÂ`9ÙÂÀÿß ©ÖÂU×Â@åÙÂ@’ÒÂà× ÒäÂàÊàÂ`ßÂ`žÝ  Í„äÂ ÛØÂÀ‚ßÂÆÙ€(ÔÂ@ ÔÂ`QÕÂ` áÂàâÜÂ@VÜ ‘Ú€EäÂ`tä€ÚÂ`?ØÂ .à .à yÞÂÀeÏÂà×ÂÀÚÂ`-ÛÂ@€Õ€þÚ€½ÐÂàwÙÂÀ²×Â@ÒÂmÓ€uÜ€ÈãÂÀù࠱ߠÏÚÂIÙÂ@t×Â@8áÂàkÛÂÀˆÞÂ@8á€Îâ€]à ±ßÂ@>à ·Þ Ò€iÞÂ=ÛÂmÓ ©ÖÂÀMÓ XÙÂ`WÔÂCÚÂÀ‰É ‹ÛÂ@ÓÜ ØÂ .à ÛÂ@†ÔÂ7ÜÂà›Ó ÐÂÀMÓÂ@nØÂ üÝÂäÂ[ÖÂaՠ݀ÚÂàYÞÂ@ ÔÂ@!ÐÂÀ¦ÙÂ@÷Ö ^ØÂ`°ÚÂÀ ÚÂÍÂÀMÓ FÜÂ` áÂ@8áÂà‰ÖÂÀ¾ÕÂ`€âÂ@÷Ö LÛ€·ÑÂàÔÂüÐÂ`hæÂ mà ˆÑÂ`ýâÂÀÿßÂÀí⠦̠4ßÂÀ ÞÂ`'ÜÂÀ ÚÂ@ªÎ 8ÔÂÀ¦ÙÂaÕ ©ÖÂÌØÂÆÙÂ`-Û¨ÞÂ`-ۢ߀FÏ jÖÂΨÞÂ`ÈÖÂ@€ÕÂU× óÔÂ`¤Ü yÞÂ@ýÕ€4ÒÂÀÜÂåÂÀ²×€òÜÂ@÷ÖÂsÒÂêÓ€ ÙÂà;ãÂ@ëØÂÀÊÓ€áÊ€òÜÂàØÂ µÔÂ`]ÓÂäÔ€Ö XÙÂÀ ÞÂàôÙ åÌÂ`øÎÂêÓ šÎÂ@zÖÂOØÂ€ÚÂÀMÓ€ Ù€×Â@Ó XÙÂàèÛÂU× hÌÂ@Ò 8Ô 8ÔÂ`þÍÂ@ÇÞÂÀšÛÂ`ÚÓÂ`’߀ŸÕÂ ÛØÂ€uÜÂOØÂIÙ€ØÂ nËÂöÑÂ`oÐÂÀ¾Õ€æÞÂ1ÝÂ@nØÂ7Ü€“×ÂOØÂ€LÎÂà0ÐÂÀAÕÂ`ìÐÂ@hÙ€ØÂ@ѩɗ̠µÔÂÀAÕÂ@VÜ ”ÏÂ@ßÚ€·Ñ€™Ö —Ù РPРÕÙÂ@¤Ï€pÈÂ@ªÎ€(ÔÂÀÖÑ€{ÛÂÀkÎÂ=ÛÂ@Ó &×Âà§Ñ \ÎÂÀÜЀ‡ÙÂ@t×Â`KÖ€·Ñ  Ñ€‡Ù€à߀ØÂà*Ñ ÍÐÂ`iÑ€ÃÏ€(ÔÂÀÕæÂ µÔ€ÕÌÂÀ²×ÂàÕÂРÇÑ€¥Ô€±ÒÂöÑÂà¹Î íÕÂ`'ÜÂà*ÑÂ`]ÓÂ@'ÏÂÀÐÒ€ØÂÀÐÒÂ@nØÂ‹ÎÂ`iÑ€Wá ÙÂÀMÓÂàÔ ‚ÒÂÀÄÔÂ1Ý ØÂ ÕÙÂ`cÒ€‡ÙÂÏÂ@»àÂà›ÓÂÀîÍ Ò óÔ€¥ÔÂàAâÂàÐßÂàîÚÂàîÚÂ@ÍÝ€WáÂÞÕÂ@hÙ€æÞÂ@Ó jÖ€@ÐÂÀ;ÖÂÌØÂ VÏÂàwÙÂ@ýÕ »ÓÂÀ¦ÙÂØÖ ÎÂàeÜÂ@÷ÖÂ`'ÜÂÀ¾ÕÂØÖ€ŸÕ >ÓÂ@ ÔÂ@ÓÜÂ@ÇÞ @ÝÂ`cÒÂàÕ€(ÔÂÐÂЀ‡Ù ^ØÂðÒÂà­ÐÂäÔÂ@VÜ€þÚ€uÜÂÀ‚ßÂ ÛØÂ@†ÔÂà›ÓÂ`cÒÂ@t× ØÂ@€ÕÂðÒ &× »ÓÂÀMÓ ÒÂÀ²× üÝ ÏÚºÛ ^ØÂ@Õ ¦Ì€:ÑÂÀkÎÂ`-ÛÂ`9Ù ÓÏÂàÓ€×Âàƒ×ÂÀ Ú tÊÂ@Ñ€iÞÂÀ5×Â@!Ѐ™Ö€ØÂ ÍЀìÝÂàwÙ çÖÂÀ5×€(ÔÂÀ²× #ÍÂ`KÖ ÝÂ`ìÐÂÀ¾Õ á× ùÓÂÀ)ÙÂ@Áß (áÂàÜÝÂÀ¾ÕÂ@?Ë DÒ —Ù€ÃÏÂ@t×Âà×Â@¤ÏÂÀËÂ`¶ÙÂÀ5× —Ù ÍÐÂàYÞÂàÐßÂÀˆÞ€:ÑÂ`E× ÕÙ s߀uܑ͠#ÍÂ`øÎÂ@PÝ ÏÚ€iÞ¢ßÂàwÙ £×Âà¹ÎÂ`æÑÂÀ5× |Ó€ÏÍÂÀMÓÂ[Ö ÚÂÀâÏÂÀÊÓÂÀ5×€{ÛÂ@†ÔÂ`ìÐÂÀÖÑÂ`æÑÂ ÛØÂ@ÙÛ ‹ÛÂàeÜ …Ü€½ÐÂ@ŒÓÂÀ5×Â`täÂà/åÂ`ÚÓÂÀ¸ÖÂ@÷ÖÂÀ¸Ö€ ÙÂ`€âÂÀ;Ö€™Ö€«ÓÂÒ×Â`täÂ@zÖÂ@ ÔÂàÕÂ`Â×ÂCÚ–á€LÎÂÀ/ØÂÆÙ ÉÛÂüÐÂà×É ^ØÂ@åÙÂà<Π²ÊÂÀÜРá×ÂÀ¾ÕÂÀAÕÂ`@ÃÂÀeÏ€¥Ô VÏÂàƒ×ÂÀ;ÖÂÐÂÌÂàÕ€þÚ  æÂðÒÂ`]Ó »ÓÂРÙÎÂ`øÎÂ@ëØÂ ‘ÚÂ@ÙÛ ÙÂU×€‡ÙÂ`ìÐÂ`]ÓÂ ÛØÂ@’ÒÂ@Dß´ÜÂ@ ÔÂÀeÏ€:ÑÂ`‡Ì€“×€·Ñ  ÑÂgÔÂ@¤Ï Ë‘Í ‘Ú ØÂyÑÂaÕ€½ÐÂÀ;ÖÂ`]ÓÂàúØÂÀÊÓ óÔÂ`ÚÓÂ`‡ÌÂ`iÑÂ`àÒ ÁÒÂàÔ ΀“×ÂðÒÂÀè΀RÍÂÀ¸ÖÂ&Ê€LΠLÛ ÕÙÂ@PÝÂàwÙ ^ØÂà›Ó€±ÒÂ`cÒ ÐÂÀMÓÂÀMÓ€ ÙÂÀúË—ÌÂ`™ÉÂÌ ÍÐÂ@ÂÊ )Ì ˆÑ hÌÂÞÕÂÎÂ`ÉÂÀYÑÂÎÂ2È ùÓ´ÜÂà Ö€±Ò€ ÙÂà›Ó—ÌÂàÅÌÂ@ßÚÂ@’ÒÂ@ìÃÂ`iÑÂ@9Ì ‚ÒÂà0ÐÂàZÉÂ@¶ÌÂÀˆÞÂÀÊÓ€LÎÂÀúËÂ…Ï€@ЀçÉÂÐÂäÔ vÔÂ`E×Â`iÑ ŽÐÂÀ)ÙÂäÔÂ@¶ÌÂØÖ€·ÑÂ@ÑÂÀ;ÖÂËÂ@ŒÓ ËÂsÒÂÀ›ÆÂ`øÎÂàqÚÂ@ÙÛ FÜ ¾ÈÂ`oÐÂÀâÏ€‡Ù‘ÍÂ`?ØÂ@€Õ€@ÐÂ`]Ó üÝÂ@ŒÓÂÀGԠπçÉÂ`?ØÂsÒ d× ¯Õ hÌÂ ÛØÂ—Ì ¬Ë šÎ€çÉÂàÔÂgÔ >ÓÂ@ñ× ÒÂà¡ÒÂ@ Ô ÉÛ µÔÂmÓ€(ÔÂ@-ÎÂ@€Õ µÔÂU×Â`ÔÔÂ@µá€.Ó€™ÖÂà}ØÂ  Ñ€@РÿÒ€±Ò€íÈÂ`oÐÂ@Õ íÕÂà§ÑÂ`ÉÁ &×ÂØÖ€òÜÂ@žÐ &× íÕÂ`3Ú€“×Âà0РXÙÂÀÊÓÂÀßÂ@°ÍÂàHÌÂ@¶ÌÂU×Â@˜Ñ DÒÂÀ¦ÙÂà¿ÍÂ@ŒÓÂÀ¸ÖÂ`ìÐÂ@!РMÆÂ zÉÂ`WÔÂ@hÙÂ@ Ô ëË PÐÂÀÇÂÀYÑÂ@t×Â`±Å Π»ÓÂÀYÑÂ@žÐ€×ÂOØÂ`žÝ :ÞÂÀÖÑÂ`ÎÕÂ`3ÚÂà6Ï ØÂðÒÂ`ÍÂ`cÒ ùÓ ÏÂÀ²×¢ßÂyÑÂ`òÏÂÀqÍ€ÉÎÂÀYÑÂÀ/ØÂÀqÍÂÀÇÂ@!ÐÂϯÈÂÀâÏÂà$ÒÂàƒ×ÂËÂêÓÂ@¤ÏÂàÜÝ :ÞÂ`¤Ü€iÞÂ@nØÂ ÃÜÂà‰Ö óÔÂ@ÕÂàÕÂÀ¬ØÂ7Ü ÐÂ@ÒÂàYÞÂÀ ÚÂÀ¾ÕÂÀÜЀ‚ÅÂ@¶ÌÂ@¤ÏÂÀkÎÂ`¤Ü€ÛËÂ`]Ó £× ÇÑ€×Â`ÍÂàúØÂaÕÂ`æÑ ^ØÂÀÐÒÂÀ¾ÕÂàîÚÂêÓÂ`KÖÂgÔÂÀ;Ö ·Þ ðßÂÀ5×ÂäÔÂ`ÍÂ`ÎÕ ^ØÂà ÖÂÀßÂÀ²× ÎÂU×ÂOØÂêÓ íÕÂ=ÛÂÀYÑÂmÓÂà<΀vÇÂà×ÉÂ@Ò yÞÂÀeÏ£ÊÂ`?ØÂÀ/ØÂ@Dß &×Â@hÙÂÀYÑÂ@t×ÂÀÚ pÕÂàBÍÂÒ×ÂÀ;ÖÂ`¼ØÂ@žÐÂÀ5×Â`E×Â`iÑÂÀÖÑÂ@÷ÖÂà‰Ö AÈÂÀqÍ 8ÔÂ`uÏ íÕÂ@'ÏÂÀYÑÂà ÖÂÀˆÞ á×€½ÐÂ`!ÝÂ@zÖ€]àÂ`æÑ \ÎÂÀâÏ€±Ò€4Ò€çÉÂÀâÏÂÐÂà­ÐÂà•Ô 2ÕÂ@ýÕ ÿÒ€«ÓÂ@9ÌÂsÒ€@ÐÂàÕÂÀ”Ü ÁÒ€ÖÂIÙÂà íÕ  Í‘Í€ ÙÂÏ #Í ,Ö ØÂ€«ÓÂ`]ÓÂÎÂ`ªÛÂOØÂ@ÑÂ@¤ÏÂ@-Πd×€‡ÙÂ`žÝÂÀúËÂÀÊÂÀ;ÖÂà•ÔÂU×ÂàHÌÂà<ΠjÖÂ`\è ðßÂ@žÐÂà0ЀÕÌÂ`]Ó  ÑÂÀ‰ÉÂêÓÂ@ÔÇ€½Ð ¬ËÂyÑ ¬ËÂ@t×ÂÌØÂ€‡ÙÂ`Ë £×€áÊÂ`iÑÂÀÊÂ`iÑ€pÈÂÀ¸Ö ‚Ò ÓÏÂ@€ÕÂ`'ÜÂäÔÂà§ÑÂÀèÎÂàØÂ€:ÑÂmÓÂ@?ËÂÀúËÂäÔÂ@ëØÂ€™ÖÂà›ÓÂöÑÂ`°Ú #ÍÂÀÄÔÂàNË ëË€É΀ÛËÂöÑÂ@ñ×Âàƒ× ”Ï šÎ€ÏÍ ËÂÀÜÐÂ`¼ØÂà¡Ò€LÎÂüЀÛËÂÀeÏÂÀGÔÂ@KÉÂàÕÂ`ÍÂàÅÌ€½Ð€±ÒÂ@t×ÂàØÂ 5ÊÂ`?ØÂ XÙÂØÖÂÀîÍ ØÂÀ)Ù 2Õ VÏÂ`{΀½ÐÂàúØÂ`°ÚÂÀÖÑÂàéÆÂÀÜÂàwÙÂ`øÎÂ`ÍÂÀMÓÂÀ¾Õ€™Ö ÿÒÂàÕÂ`ªÛÂ`'ÜÂ`æÑÂ@zÖÂ`9Ù 2Õ ÁÒÂàkÛ ùÓ ÎÂ@°Í€{ÛÂgÔÂàîÚÂaÕÂÀ¬ØÂäÔÂ@ŒÓÂ@ÒÂÀèÎÂ`àÒÂàîÚÂàîÚ€]à€4Ò ßÍÂ…Ï ùÓÂÀÖÑ ÇÑ d×Â@zÖÂsÒ ÐÂÀGÔÂ@åÂàâÜÂ@ÓÂÀk΀«ÓÂÀÈÂàHÌÂÀpâ€òÜÂÏÂ@¶ÌÂÀîÍÂÀSÒ £×ÂÎÂ`oÐÂ`ËÂÀ¦Ù åÌ€dÊ€@РñÊ€{ÛÂÀ#ÚÂCÚÂ@ßÚÂÀ²× ŽÐÂÀYÑ€‡ÙÂyÑÂÀ_РâÂÂÀÐÒÂÀ5×Â`¼ØÂàôÙÂà¡Ò ^ØÂ ÇÑÂÀeÏÂðÒÂÀk΀½ÐÂ@°Í€±ÒÂÀ¬ØÂU× ŽÐÂ@˜Ñ Ò ¬ËÂÀwÌÂ@ÈÉÂÀGÔÂöÑ€áÊÂàqÚ ÇÑÂàÓÂ`æÑÂðÒ€RÍÂ@!ÐÂÀMÓÂ`ÚÓÂ@QÈ ßÍ á×ÂÀ²×€·ÑÂ`iÑ ýÈÂ@hÙÂ@ýÕÂà•ÔÂàÑÊÂ@žÐÂÀYÑ ýÈÂà­Ð‘ÍÂàïÅÂÀqÍÂ@'Ï€(Ô tÊÂàÔÂ`æÑÂ[Ö€:ÑÂàwÙ€±ÒÂ@3Í€½ÐÂà­ÐÂ@ñ×ÂÀèÎÂÀÐÒ ÇÑ€ØÂ€‡ÙÂêÓ‘Í µÔÂàÕÂ@nØÂ@ëØÂ@cÅ€ŸÕÂÀMÓÂ@-Π>ÓÂ@PÝÂ`{ÎÂ`ÎÕÂ@’Ò ßÍÂÀ)ÙÂ@ýÕÂà§ÑÂÀ;ÖÂ`ÔÔÂOØÂ óÔÂ@3Í RÚÂÀÄÔ nËÂ`ìРǠ^ØÂÀÇÂ@Ò \ÎÂÌØÂ ùÓ JÑÂÀÊÂ@’Ò€.ÓÂ`iÑÂ@žÐÂÀ¾Õ tÊÂ`æÑÂ@˜ÑÂà¹Î€(Ô€^ËÂÀYÑÂ@ÒÂ`ìÐÂ`Ë pÕÂ`cÒÂà›ÓÂÍÂÀkΊãÂ`°ÚÂ`ÔÔÂà¿ÍÂÀ}ËÂÀ;ÖÂmÓÂÀÖÑÂàÕÂÀk΀·Ñ Ï bÍÂàÔÂ`{ÎÂàTÊÂÐÂÀSÒÂ`9ÙÂ@9Ì ¦ÌÂàZÉÂÀÈ ¦Ì€.Ó nËÂà¡ÒÂ@ÓÜ ÍÐÂ`!Ý ¸ÉÂÀƒÊÂ`°ÚÂ` áÂ`âÂ`QÕ |ÓÂàèÛÂ`iÑÂà­ÐÂmÓÂÀSÒÂ`WÔÂ@'ÏÂ`ÚÓÂà Ö XÙ «à€iÞÂ@µá€XÌÂΠÚ ÏÚÂ@ÇÞÂ@ѺÛÂgÔÂ`ß &×ÂmÓ€ÛË ÁÒ ‚ÒÂ`ËÂ@ýÕ ÁÒ ËÂÀšÛÂ`3ÚÂ`ÍÂàÔÂ`E×€¥ÔÂÀ¾ÕÂÀGÔÂgÔ ÐÂÀ#ÚÂ@t×ÂÀâÏ€ÿÅÂ,É€ÕÌ€:ÑÂ@ªÎÂaÕÂU×€ÖÂÀèÎÂà}ØÂ ÚÂ@ªÎ XÙÂàÔ ÐÂ@ñ×Â@†ÔÂÀ;Ö &× ØÂ€:ÑÂÀÊÓÂ@’ÒÂÐÂ@hÙ€Ö ØÂà¾âÂ@VÜ 8ÔÂ@¤Ï _à5Ê€ØÂÀ¸ÖÂà­ÐÂÌØÂºÛÂ@ëØÂ@¤Ï€×ÂàÔÂ`cÒ€(ÔÂàwÙÂÀ¾ÕÂÀ¡Å ©Ö€@ÐÂàƒ× jÖ Ù šÎÂ@Õ  Ñ êàÂáÂÏÂ`WÔÂ`QÕÂ@!ÐÂÌØÂØÖ Ü€ØÂà¹Î ÓÏÂà*Ñ |ÓÂàwÙÂäÔÂ@†ÔÂàÐßÂ@ëØÂÏÂà§ÑÂ[ÖÂÀÚÂÀMÓÂ`]Ó >Ó |Ó€×ÂàÕÂU× ÃÜÂ`E×Â@˜Ñ AÈÂ`cÒÂ`'ÜÂÀˆÞÂÀÿ߀½ÐÂ@\ÛÂ`Â×€øÛÂÐÂàÓ ùÓÂ`WÔÂà0ÐÂØÖÂÀSÒÂ`3Ú &×ÂÌØÂ ñÊ€:ÑÂà›Ó  ÑÂ`’ßÂà§ÑÂà•ÔÂ`iÑ€ŸÕÂ`cÒÂ@'ÏÂÀÊÓ ÁÒ€þÚ€±Ò ùÓ ÓÏ Ò ¯Õ€ ÙÂ@åÙÂàwÙÂÀâÏÂÀYÑÂà­ÐÂÏÂà§ÑÂàÔ &×Â`WÔÂÀˆÞÂàqÚÂ%ß OåÂà‰ÖÂ`QÕÂÀ)ÙÂÀ/ØÂ€ØÂàèÛÂgÔÂ[ÖÂ@8á zÉ€ÏÍÂ@ñ×ÂmÓ€“×Â`ŸÈÂà*ÑÂ@°Í€"Õ€:Ñ á×€ØÂ€dÊ€4ÒÂà¹ÎÂÐÂ[ÖÂ@åÙÂà›ÓÂÀ}Ë ÕÙ ØÂ ÙÂ@>à€ ÙÂ`¶ÙÂ`Ë Ú ^ØÂà¡Ò€òÜ€]àÂõæÂàÖÞ vÔÂàqÚÂ@\ÛÂ@Á߀™ÖÂ`¶ÙÂÀóáÂà_Ý ØÂáÂ+ÞÂà;ãÂØÖÂ@ßÚ ÙÂ`Â×ÂÀèÎÂÀ”ÜÂ@÷Ö€]àÂÀÐÒÂÀ)ÙÂÀ#ÚÂÀ#ÚÂÀÝ ‘Ú ½Ý ÙΠçÖ€Ú€ØÂÀSÒÂÀ²×Â`ªÛÂ`†á "âÂÀ²×€±ÒÂsÒÂÌØÂÀ/ØÂàÊࠣלàÂÀÜ ^ØÂÀÛ óÔÂ@hÙ€ìÝ ä FÜ ÇÑ @Ý€æÞ üÝ Ý jÖÂÀeÏ€4ÒÂ@\ÛÂàúØÂÀ¦ÙÂÀÜÐÂÀ¾Õ ÝÂÀ¸ÖÂ@ÙÛÂ`°Ú€uÜÂ@†Ô€.ÓÂ%ß IæÂ`ÞÂàÊà Ü€ÔáÂà}ØÂ€ÚÂ`â€KãÂÀ Ú€àßÂÀùà€ÚÂ@ëØÂ€àßÂ`ÈÖÂ@Á߀ÚàÂÀjã€QâÂöÑ€òÜÂûåÂàÄáÂÀ¬ØÂÒ×Â@ßÚÂÀ¬ØÂ ÝœàÂ@PÝÂàqÚÂà¾âÂÀóá ,Ö µÔ€ÔáÂ@ê aâÂaÕÂÀÜÂ ÛØÂ`'ÜÂàÓÂÀ”Ü ØÂ@bÚ€ Ù äáÂ@å€:ÑÂÀváÂ`zãÂÀ^åÂ`ÎÕÂà‰ÖÂÀîÍÂà}ØÂŠãÂ@2âÂÀÜÂ@DßÂ@¯â aâÂ`†á ÕÙ®ÝÂÆÙÂàèÛÂ`¶Ù 〇ÙÂÀ¸ÖÂàúØÂ`ÞŠãÂ@,ãÂà× ÉÛÂ@>àÂ`KÖÂà*ÑÂÏ€àßÂ`tä ÞâÂÀÊÓÂÀÛÂ@ÇÞÂÀçãÂÀÄÔ€™ÖÂÀ Ú aâ€QâÂÀ¦Ù€ÃÏÂàÂÀ¦ÙÂàÄá 䀟ÕÂàMà 4ßÂ@éÂ`à€òÜÂ`ìЀÚÂ`ÎÕ óÔ @ÝÂäÔÂaÕ pÕÂ`àÂ@¯âÂüÐÂU×€ÚÂàkÛÂÀíâ€{ÛÂ`nåÂ@åÙÂà•Ô€ØÂÀYÑÂ@ñ×Â`uÏÂÀŽÝÂ@\ÛÂÆÙ åÌ€‡ÙÂÆÙ€ØÂ@JÞÂêÓ ÏÚÂ@ëØÂ UäÂ@ Ô ‹ÛÂ`'ÜÂ`àÂ@ëØÂÀ/ØÂ`9ÙÂ`æÑ ”ÏÂ@žÐÂàÕÂàƒ×Â`E× RÚ€Ú€ØÂºÛ‹Î VÏÂ@ñ×Â@!ÐÂ`cÒÂà*Ñ "âÂÌØÂàôÙÂ=Û >ÓÂÀÛÂ` áÂà0ÐÂÀÜÂÞÕÂ@bÚÂ`-Û ^ØÂ üÝ ÝÂÀÊÓ€cß êàÂà;ãÂ7ÜÂÀÊÓÂ@ÙÛÂÀ¸Ö ”ÏÂÀÊÓÂÀYÑÂ@ßÚÂË€±Ò ÇÑÂ`‡Ì ÜÂàâÜÂÀÛÂ@QÈÂ@hÙÂ`-ÛÂÀ|àÂ`KÖ€“× ØÂ€ÚÂ`QÕ /Ë£ÊÂÀAÕ ,ÖÂ@ÇÞÂÒ× 2ÕÂÀÖÑ€þÚÂ`WÔÂ%ßÂ`cÒÂ@Ò‘ÍÂêÓ ÓÏÂÀËÂ`ÎÕÂà*ÑÂÀ;ÖÂà$Ò€·Ñ ¯ÕÂ@KÉÂÀ¦Ù ÙÂÀ;ÖÂ`ÍÂÀâÏÂà¹Î ‘ÚÂOØÂ`æÑÂüЀ±Ò€{Û 8Ô€çÉ ÒÂ`Â×ÂàNËÂgÔÂU×Â`uÏ  Ñ  Í€{Û £×€Ú ËÂàTÊ ˆÑÂ@†Ô &× ‚Ò€ˆÄ ÄÇÂ`ÔÔÂ`æÑÂÀôÌÂ@ŒÓ€ÉÎÂÀèÎÂ@¼ËÂ@¤ÏÂ`9ÙÂ`cÒÂ@?ËÂ@WÇ€™ÖÂ`Â×Â`àÒ€ÏÍ PÐÂÏÂ`ÚÓÂÞÕ€ØÂäÔÂ@°ÍÂ`þÍÂ@ÈÉÂ`ÚÓÂ`¼ØÂyÑÂÀ ÉÂ@àÅÂêÓÂàBÍÂÀôÌÂà<Π5ÊÂÀÆÂ@ÔÇÂà0РêàÂmÓÂà¡Ò ²ÊÂ@ ¿ÂVÂÂΠÐÅ€4Ò ÃÜÂàÝÈÂÐÂ@ÑÂà0ÐÂ`ªÛÂÀ²×Â@Ó Ù€"Õ vÔ ¯Õ€¥ÔÂÀ¦ÙÂà‰ÖÂ`oÐÂÀqÍ€Ú€½ÐÂàBÍ ÏÚÂ`ÎÕÂ`¶Ù€{Û€{ÛÂ`!Ý vÔÂ@!ÐÂÀÊÓÂÀ#Ú€«Ó€:ÑÂ`øÎÂà•Ô—Ì ˆÑ€·Ñ€¥Ô€(Ô€ØÂ=ÛÂà$ÒÂàÕ€™ÖÂÀ)Ù‹ÎÂ`"ÈÂ`ÎÕÂÀ5× jÖÂ@-΀×€{Û ùÓ€LÎÂÀƒÊÂ@9Ì ¯Õ ÃÜ ©Ö€ÃÏÂ@’ÒÂ`ÈÖÂà_ÝÂyÑÂ`uÏÂ0ª àšNÃPGÃÀ0CÃðX;à=ðE9ÃàÞ3Ã`‚8Ãðí7Ã`#3ð]5ÃÀ 4ÃÂ0ÃÀ%0ð"*Ã0U,Ã`_)ô$à F(ÃP£,ÃPJ&ÀÑ#Ç%ÃPP%ÃàP!à d#Ç%Ã@²#Ã{#ÃðÀlÃ0#ÃÀð#Ãò$Ãà\Ãð} ÃÌ ÃpÎÃÀðÿàÆÃàëëà ”ÀûÃàŒàêÃPÃÐ/ Ãð§Ãð¿à 5àgÃÀ¯ÃðÃ0Jà /à ‚àCÃðHÃÐqÃÀ\àäÃ@ƒÃà°ÃPKÃð0À®àÃ`éÃà¶ðŽð5Ãà3à‹ÃPà Ã0ßÀð ÃPQÃpÈÃ` Ã0†à AÃÃPÔðk à, à eÃ`ÝÀ+Ã@$ÃÀnàÃ` ÃÿÃÿ Ã`~ð_ Ã0zãÃD ðwàD à ú Ã@¿ Ã@×Ã€Þ ÃС à» ÃпÃðà î ðY Ã`„ÃpXÃPÃÀ ÃÐNÃÀ† Ã@T à ÀyÃtÃ@ïàëÃÐBÃ`1ÃÀ˜àbÃ@ãðe Ãй Ã0àÃÄà  Àðƒà ÃÐàD ÀÃP.ÃMÀÃÐÑÃй ìÃÀ Ã`´àzÃ0ÔÃpíÃð®ÃÐãÀ£þÃðœÀ©Ã€&ÃYÃ`1Ã@ûà NúÂÀ9à §Ãâð Ãð®ÃwûÂSÃð¢ðÃ@ûÃôûÂÀEþÂ@~ÿÂÊÃ`UþÂ`÷Â`IàtÃ`äûÂà±ùÂàŸüÂ0]Ã`ÌÿÂ0cÃÀWûÂÀ—ÃpvÃ`ÌÃP.Ãàpï òÂÃà¥û ¹ýÂ@¨øÂ`äûÂpÿð$ÃÐïÃkýÂ@þÂ÷Â`ü÷ cìÂà@÷ÂÀQü ³þ 6þÂÀQü †ûÂ`äûÂ@~ÿÂ`ØýÂÀWûÂà½÷ 0ÿÂ`[Ãà±ù ¿üÂÀ]úÂ`Uþ ˜øÂÀKÃÀQü Ý÷Â_Ã@®÷Â_ÿ€&þÂà½÷Â@ ý ³þÂwûÂ0ÔÃ@OòÂÀo÷  ûÂ`sù -õÂ@IóÂà4ùÂÀKýÂâþ•öÂàjð rôÂà4ù€ëò Âñ ?òÂ@=õ òÂ`÷€ëòÂàýÂkÃ@ŠÃ  ûÂ`…öÂÀþô 3ô ŠðÂà:øÂ`múÂÀ¼ÿÂÀŸï€žêÂÀôÂ÷ÂÀ±ì ’ù€Ùõ€†îÂ@ºõ€>úÂ`ðù€Áù „ñÂ~倀êÂàì€bôÂÀ«íÂ`gû ÑùÂ@Þï ìêÂ@gîÂÀ"ïÂàˆëÂ`ëå –îÂxæÂ ò ÈðÂàÛòÂàçðÂ`&ñÂÀWû ¢ì€\õÂ ×øÂ`>íÂàšèÂÀ±ìÂ`ÍêÂ@aï›õÂà/åÂÀð€÷ðÂ@êÂ`DìÂÀ]úÂ*ó äáÂÀFé IæÂ`Óé­òÂà”é€í øè Òä ÈðÂÀÏçÂàjðÂ<ð ¼òÂõæÂ ÆæÂ@,ãÂ@gîÂ$ô€ªè€ìÂÀð€!êÂ`åæÂà;ã WîÂÀ±ì þç€ýïÂ@…é %쀘ëÂ`JëÂ@…é øè lõÂàˆë æëÂ`ê€ï uéÂ`hæÂÀ^åÂ` áÂ@gîÂ@…é 4ß `÷ÂàŽê€ëò ÅûÂ@ÒñÂ`óÂ` òÂ`b瀘렪õ€¼åÂÀdäÂÀ™ð cìÂÀÕæÂ CçÂ`÷ãÂÀ óÂÀòÂ€ÇøÂ`VéÂ`Óé øèÂ@êíÂ@êÂà”é øèÂÀŸïÂ@…éÂ ÆæÂ QïÂ`ýâ ’ùÂ`»í€˜ë€?å ûò WîÂ`ÍêÂÀRç ¼òÂÀiøÂ@ê¹ðÂ`‘ôÂïçÂ`Jë 1êÂÀLè ºèÂ`÷ã€tñÂÀçã ™ãÂ@ê€ìÂ6ñÂõæÂ@yëÂàùíÂ`ÙèÂÀçãÂ`täÂÀòöÂÀÏçÂà¸ãÂ@éÂÀøõÂ@OòÂ`Vé€P÷ –îÂ@©ã€ÚàÂõæÂ€3çÂàvîÂ`>íÂàóî§ó rôÂ@üêÂ@öëÂTìÂà ëÂà¬åÂ`täÂ`PêÂ@å ž÷Â@Uñ€oÝÂ@ÇÞ UäÂ`µî oêÂ@êíÂ@£ä Ôî «à ÎïÂÀŸï ã 3ôÂ@©ãÂÀóá òé øèÂ@üê€ëÂ@æÂà ëÂÝê ÎïÂ`Pê ®êÂ*óÂöÂà5äÂÀ½ê ¼òÂ@&äÂÀdäÂ`€âÂ`êÂàèÂÀFéÂ`¯ï ¨ë  æÂ€žêÂÀ@ê ï OåÂâÂ`PêÂÀ߀†îÂ`ýâÂà‚ì›õ ¨ëÂÀÃéÂûåÂàÄáÂ`bç œí {èÂÀ4ìÂïçÂÀŸïÂÀ·ë€ªè oêÂ@ê íÂ`ÇëÂ`2ï€Eä€ÂäÂÀ”ÜÂ@£äÂ@»à€]àÂ`ñäÂà¬å òé„äÂZëÂàšèÂÀˆÞÂà¬åÂõæÂ€ªèÂËí€9æÂ€QâÂÀpâÂà ëÂ@bÚÂ`hæÂ@»àÂ@ê¢ßÂ@öëÂàÖÞÂÀ(î ìêÂ`tä IæÂà¾âÂ~åÂ<ðÂÀô€¤é€žê€?åÂ@míÂ`ê€ï CçÂÀRç ÔîÂ`ŒàÂà#çÂÀFéÂ`©ðÂ`ÓéÂ@‘çÂTìÂ@ðì ÀçÂ`,ðÂ`>íÂÀváÂ@åÂàŽê ï€¶æÂ@»àºÛÂÀ.íÂÀ«íÂ`òÂà”éÂxæÂÀð ÒäÂà)æÂÀRçÂàè äá€hóÂ`’ßÂàMà +ë ïÂ@ÙÛÂÀ4ìÂ0òÂÀjãÂ`Þ€QâÂféÂ@êÂ`nåÂàÄáÂÀÕæÂ¹ðÂlèÂ`KÖ€ÎâÂ@ å UäÂ`Œà€¶æÂ` áÂ@µá€ÔáÂÀRçÂ`ß æë€žêÂÀ^å äÂàè€øÛÂÀLè¿ï å Ý åœàÂ`˜ÞÂÀvá€ÚàŠãÂÀÉèÂ`ñäÂ@ å IæÂ@—æÂ ã ÌåÂÀÉè ç XÙ–áÂÀÕæÂ íÂ`Dì€ìÂ@ê Àç å îÂà/åÂ6ñ€¶æÂà ëÂ@DßÂ@Pݮݠ@Ý [ãÂ@2â€9æÂ`ÁìÂ@©ãÂÀjã ´é„äÂ`bçÂ@ÓÜÂ7Ü€oÝÂÀÊÓÂ@…é€-èÂ`täÂ@sìÂ@£ä€'éÂ`ÈÖ @ÝÂ@—æÂ@üêÂ~å€EäÂáÂà_ÝÂ@©ã ÌåÂÀçãÂÀ(îÂÀ:ëÂàêÂà¸ã€uÜÂ`÷ã€à߀ïÂÀ^åÂÀÃ逼åÂâÂàÊàÂ@>àÂ@£ä aâÂàšè€iÞÂÀÝÂÀíâ .àÂàŽêÂ`‹õÂ`àÂÀùà€þÚÂ`ªÛÂ@JÞÂàîÚÂ@\ÛÂàúØÂÀj〶æÂ ·Þ€3çÂ@ê€ÎâÂ`hæÂ@zÖ€‡ÙÂÀpâÂ`ñäÂà¾â€°çÂ@éÂà çÂ`ÁìÂÀ‚߀cßÂ@öë€ë€íÂÀ½êÂlè òéÂÀ”ÜÂ@ å ºè ãÂãéÂxæÂÀáäÂÀ‚ßÂàAâ Òä  æÂ`€â€ÔáÂâÂ`VéÂà)æÂà¦æÂÀÏç ðßÂÀ ÞÂÀ(îÂ@£ä ÚÂàóîÂ@‘ç–á [〒ìÂ@èÂÀóáÂ堺蠴éÂ@è ®êÂ`ýâ ñÂÀ½êÂ@—æÂ LÛ Û oê€iÞÂ`!ÝÂ`E×€EäÂÀÝ á×ÂÀ‚߀Âä ·Þ€ÔáÂ@,ãÂÀLè€?åÂàÄáÂ`ßçÂ ÆæÂ€†îÂàAâÂ@ÓÂ@æÂËí 4ßÂàÐßÂ@yëÂàYÞ€àßÂ$ô€Âä ÒäÂ`åæÂàšè Úí Îï %ìÂ`æÑÂÀ/ØÂ Ÿâ 7éÂàçðÂà¾â€Èã çÂTìÂ@¯âÂÀùà€oÝÂHèÂ@öëÂÀ4ìÂà;ãÂàé øèÂÀRçÂ@üêÂ`ëå (á€í€tñÂlèÂâ ðß åÂ`ñä aâÂ@»à äáÂ`µîÂÝê›õÂ×ë€\õÂà#çÂà¬åÂÀRç ®êÂ@sìÂà¬åÂàAâ °ôÂ`žÝÂ+ÞÂï瀆î cì cì ™ã \ÎÂ@öëÂàšè€æÞ€Îâ€àßÂ@©ã€¤éÂ`ñä ¥áÂàêÂûåÂÀ(îÂ`2ï€ì ¥á "â€ïÂà ë„ä ·ÞÂàšèÂÀÛåÂ`åæÂ€ìÝÂ@,ã Þâ “äÂà)æÂàGáÂ@æÂ@‹è WîÂ@ðìÂrçÂà¦æÂ€tñÂÝêÂ@倆î çŠãÂÀÿßÂ`2ï€!êÂÀ·ë sßÂàÊà€¼å gá€àßÂÀ”Ü 7éÂõæÂ`Ù耤éÂà;ãÂ`€â€cß å€àßÂÀáäÂ@hÙ òé  æÂ@‹èŠãÂà¸ãÂ@8áÂÀp‰ç€K〒ì ,ÖÂ%ßÂïç óÔÂ@ÇÞ ´é€hó äÂéè =èÂÀ ÞÂàÐߊãÂà¬å +ëÂ@‹èÂ@‹èÂ`ýâ ã Òä€ì€-è€'é€þÚÂÀóá XÙÂà_ÝÂÀß OåÂ@ëØÂ€uÜ Hû =èÂÀáä€àßÂÀ·ëÂ@èÂÀóáÂà¦æÂÀváÂÀµ˜Â#ŒÁ€Ü¶Á€ˆÄÁ£ÊÁ€KãÁ@¿ ÂkÂÀ&ÂíÂÀx7ÂÀÝ;Â@ÿ+ÂÀ´-Â@d0€G:€ˆDÂÀï8ÂÀJ€G:ÂIYÂ@Ó\ÂÀˆ^ÂÀZ€ YÂ@÷V€kÂdÂ}zÂq|ÂãiÂÀrÂ@üjÂÀQ|ÂÀ3„€‚ÂÅnÂ@êmÂÀRgÂÀuvÂ@„~€©}ÂYƒÂ`+ˆÂ€ÇxÂÀ"oÂÀ ‹Â`‹Â¸ˆÂ@+xÂÜÂYƒÂ@ÂÀ?‚€s‰Â@’Â@*ÂÀȀ ÂÀ˜ˆÂ Â`´†Â D‰ÂÀzÂ` ÂÀë P‡Âj•ÂàhÂÀŒÂ^—Â`~Âàý™Â …“ ēÂ@}— ð–Â@e›Â€–˜Â`ÂÀñŽÂ@•“Â`r‘Â`ݔ Ö€›Â`¿™Â #™Â šÂओÂ`§Â ¦Â@ÖÂÀnÂLšÂ@“Âá–ˆÂÀ  ›ÂàÓ Â@œÂ L§Â ®¡ÂàP¡Â€+•Â@_œÂ໤Â`YªÂ`*€õÂc«Â‡¥Â@ ¦Â€H¥Âà2¦Â€H¥Â¤Â€×¢Â ¤ÂÀÞ¦Â`î¦Â€®Â ¦Â`_©ÂÀê¤ÂÀا õªÂ B³Â@p®Â`ʬ @©Â€¹§Â j¢Â°Â¦Â@«Â @©Â` ³Â° :ªÂÀ%°Â@۱ ™¯ÂÀU¨ÂÀãºÂ`¬±ÂÀ~¶ÂE°ÂQ®ÂÀ±Â@ÿ«Â`ô¥Â ¥­ÂàI·Â `®Â€­©Â°Â`š´Â¸Â WºÂ “°Â <´Â æ·Â€³¨Âà«Âà©Â`5°Â¸ÂÀãºÂ ¹Â€ÄºÂ ÔºÂ`ÉÁÂÀ~¶Â€»Â`¦²ÂÀx·Â ¼¾Â ú¾Â 0¶ÂÀ´­Â€¾»Â`ÿ¸Â@(ºÂ@À€;¼Â`¦²Â€¾»Â€¦¿Â SÅÂ@þÀ€î³Âà=¹Â@@¶Â·Âഺ€ַÂ9²Â€GºÂ€eµÂ€Ö·Â ¼¾ÂààeÂÂ@L´ÂÀBÀ λÂ`տ Üàâ YÄÂÀ ´Â€šÁÂà¿Â€íÈ€âµÂ@.¹Â@ ¿Â`:Ä€M¹Â@oà§·Â`|¹Â@½Â ‰¼ÂÀ~¶ÂÀH¿ÂÀãºÂàõÄÂÀfºÂ€¬¾Â€ Ä ­¶ÂÇÄÂÀ$ŵǠŒÆÂ€¬¾ÂÀÅ¿Â`)²Â@õÂà=¹Â`p»ÂVÂÂh¿Â ½Â€vÇÂ@½¶Â`^¾Â ÖÄ ȼ€¸¼ÂÀ˾ÂàfÇ ±ÂÀ§ÄÂ@àÅÂÀݻ hÌÂÓ€A»Â -Á /ËÂÀ¹Á€¦¿ÂJÄÂàÀ€Á€jÉÂÓ ÄÇ Ժ e 9¿Â kÁÂÀ•ÇÂàÀÂÀſ )Ì ¤ÂÂÀYÑ—ÌÂÀèÎÂ`“Ê ¤ÂÂÀ‰ÉÂ@iÄÂ`4ÅÂà®»Â@oàhÌÂÀîÍÂàûÃÂÀ ÉÂÏÂ`oЀÛËÂn¾Â E½Â€ÛËÂ`^¾Â@ÚÆÂ@QÈÂ@À zÉÂ`Í €ÈÂàZÉÂËÂÀ¡Å ¾Â €È¯ÈÂÀBÀÂ`:ÄÂà ÁÂ`¥ÇÂÀ ÉÂàrÅ w¿Â )Ì zÉÂ@?Ë»ÆÂÀfºÂ zÉÂÀ6ÂÂàrÅÂ` Ì MÆÂÀH¿ÂÀ›ÆÂñ½Â€jÉ èÁÂh¿ÂàÅÌ #Í€:ÑÂ`øÎÂ@-ÎÂÏÂÀ0ÃÂÀÈÂ`:ÄÂÀ}ËÂàHÌ e nË€RÍÂàïÅÂ@àÅ€vǑ̀XÌÂÀYÑÂbÀ AÈÂ`¥ÇÂ@iÄÂà–¿ÂÇÄÂn¾Â ÏÂ@ÂÊÂ@3ÍÂ`™ÉÂÇÄÂ@ÀÂ`"ÈÂÀBÀ€íÈÂ`ÍÂÍÃÂàNËÂ@u GÇÂ ÊÆÂ nË€jÉ ÄÇÂë¾Â@¶Ì€FÏÂÀYÑÂ`ŸÈÂ8ÇÂ@?ËÂ`@ÃÂ@iÄÂ`X¿Â@9ÌÂÌÂ@òÂÂàÀ€ÁÂ`þÍ€ÿÅ ÆÂ †ÇÂÀ0ÃÂÀ³ÂÂàïÅÂÀ É šÎÂÀîÍ kÁ€óÇ ú¾Â ¾È€‚ÅÂn¾Â ªÁ€óÇÂ`.ÆÂàËËÂÀkÎÂJÄ»ÆÂÀ<ÁÂàxÄÂÀ¡ÅÂ>ÆÂÙÁÂ@ÎÈ€ÿÅÂbÀÂ@WÇÂ`·ÄÂÁÅ€dÊÂÀ0ÃÂ@QÈÂ@æÄÂ@3ÍÂÏÂÀ›ÆÂDÅÂÀ$ÅÂàïÅÂà`È GÇÂÀÊÂÀ_РhÌ tÊ€ÿÅÂ@ÎȯÈÂDÅÂÀ}ËÂÀ*ÄÂ`‡ÌÂU×Â8Ç—Ì£ÊÂaÕÂJÄÂßÀÂ@]ÆÂ`«ÆÂÀ ÉÂ@øÁ nË€jÉÂ2ÈÂÀBÀÂ`Û¾ÂàïÅÂÀ›ÆÂ@]ÆÂ λÂÀ‰ÉÂ`±ÅÂà`ÈÂà×ÉÂÀ•ÇÂÀôÌ€#ÀÂÀÈ€¸¼Â žÃÂ`ÉÂÀwÌ€ˆÄÂ`@ûÆÂ@ÂÊÂ`±ÅÂàrÅ€FÏÂàËË ’ÅÂÀ`»Â€)¿ÂPÃÂêÓ DÒÂÍ€@ЯȠzÉÂ@-ÎÂ`4ÅÂÀÈ ¦ÌÂàÓ °ÀÂJÄÂÀÜÐÂÍ€vÇÂbÀÂÍÂÀYÑÂ`Ë€ÅÂÀ³Â€±Ò ‰¼Â2ÈÂ@°ÍÂÀMÓ eÂÂÀ¿À â ÇÂ਼Â`Í€ÅÂÀÆÂà¹ÎÂbÀÂà¿ÂÀ É€ÛËÂРzÉ ñÊÂ`‡ÌÂÀËÂ…ÏÂà•ÔÂÐÂ@˜Ñ íÕÂ@ñ× |ÓÂàZÉÂ@ÎÈÂ`àÒÂ2È ¦ÌÂÍÂ@?Ë ;ÉÂÀ}ËÂ`àÒ íÕ ÎÂ`É †ÇÂÍ ëËÂà›Ó€ÛËÂ`ÚÓÂ@Ó ñÊÂ`ªÛ ’ÅÂÀÖÑÂàNË€4ÒÂ`ÉÂàZÉÂ`ɠπ·ÑÂðÒ Ë £×ÂÀÊÓÂ@Ò 5Ê VÏ»ÆÂàÅÌ€ÃÏÂÀ ÉÂÀ¿À SÅ ΀RÍÂ@ÒÂgÔÂ`ÎÕÂÀ ÉÂÌÂ@oÃÂÀÐÒÂÀÜÐÂà³ÏÂ@ÂÊÂ@QÈ Ò»ÆÂà}ØÂ€ÏÍ  Ñ ÍÐÂà}ØÂ@3ÍÂ`¤ÜÂÀËÂ`ËÂ`òÏ ùÓÂÀGÔÂöÑÂà<Πˠ ÑÂÀ¸Ö VÏ >Ó ÿÒÂà­Ð€½Ð€(Ô ØÂ@ŒÓÂÀôÌÂ@¤ÏÂ@žÐ ùÓÂ`]Ó VÏ€RÍ€:ÑÂÍÂ@°Í ŒÆÂ`]ÓÂ@!Р2ÕÂgÔ€½Ð€dÊÂ`E×€ùÆÂàïÅÂ`“Ê€ŸÕÂà$Ò ëË€×Â@†ÔÂÞÕÂÌ€«ÓÂàTÊÂ`iÑÂ@†ÔÂà`È ÓÏÂmÓ ÓÏÂ2È ùÓÂàãÇÂÀÐÒ€Ö€“× šÎÂ`ÎÕÂ`¥Ç€|ÆÂ —ÙÂ`]ÓÂ@¤ÏÂÀÖÑÂ`uÏ€LÎÂÀÄÔÂ@3ÍÂÀâÏ n˯Ȁ:ÑÂà×ÂΠ8ÔÂà³Ï€·Ñ€×ÂÀYÑ€RÍÂÀÆÂ€‚ÅÂÀ_Ѐ:ÑÂÀ³ÂÂÀ}ËÂyÑÂ`ÔÔ€ÕÌÂÀÐÒ‹ÎÂà×€±Ò pÕ€:Ñ  ÑÂÀSÒÂ@PÝ€"ÕÂaÕ ”ÏÂgÔ ^ØÂ —ÙÂ@KÉÂÆÙÂ`Â× »ÓÂ[ÖÂà0ÐÂÀ¾ÕÂàÓ hÌÂU×ÂÀAÕÂ@ ÔÂà‰Ö€¥ÔÂ&ÊÂ`?ØÂ@bÚ ‹ÛÂàxÄÂà¡ÒÂüР8Ô€ØÂàËËÂ`±ÅÂÀîÍÂyÑÂ`3ÚÂÀÖÑÂà¹ÎÂ`ìЀXÌÂ@ÂÊ ÁÒÂ`°Ú РëË€RÍ &×ÂÀóá ÷ÉÂ@bÚ€ÖÂ@€ÕÂ@>àÂÀMÓÂ`QÕÂyÑ çÖ ØÂ «àÂ`-ÛÂà•ÔÂÏÂ`¶ÙÂ[ÖÂÀâÏÂàÅÌÂÀ¬ØÂ@VÜÂà¹ÎÂ`{ÎÂ@¼ËÂÀ¾Õ€ ÙÂ`ŒàÂ@ñ×ÂàBÍÂÀÜЀÏÍ€ÕÌ ëË ÁÒÂàTÊÂ`ÎÕÂÀ¦Ù 8ÔÂÀÐÒÂÀkÎÂÀúË —ÙÂ`oÐÂ@°Í ˆÑ  ÑÂÀ ÚÂmÓ »ÓÂ@t×Â@Ó€¥ÔÂ`æÑÂ`’߀"Õ€uÜÂÀèÎÂÀÝ€4ÒÂà¹Î€:Ñ  ÑÂÀôÌ &×Â`¤Ü€“×Â@ÕÂ@ÙÛ‘Í€“×Â`ªÛ€4ÒÂà6ÏÂÐÂà§ÑÂ@ýÕÂ@-ÎÂ`?ØÂàôÙ ©ÖÂÀ ÞÂÀ¸ÖÂàqÚÂÀ²×€"ÕÂà§ÑÂöÑÂ`òÏÂmÓ ùÓÂà$Ò ˆÑÂàÕÂÀ É |ÓÂ`?ØÂÀ)ÙÂÀ¾ÕÂà‰ÖÂ@ÓÂ@ÓÜ€Ú€:Ñ çÖÂÀ/ØÂà›ÓÂÀ¾Õ ÐÂÏ  ÑÂÀ ÚÂ@3ÍÂà³Ï ðß ÁÒÂ`?ØÂà Ö ØÂ€“× tÊÂ@EÊ€:Ñ ØÂàNËÂ@!ÐÂÀkÎÂ@ÑÂ`‡Ì µÔÂgÔ |ÓÂ@˜ÑÂäÔÂ`WÔ ÍЀ×ÂØÖÂ@9ÌÂÏÂ`9ÙÂ`KÖÂÀËÂÀÐÒ€c߀oÝ ²Ê€ÚÂ`Œà üÝ€XÌÂà›ÓÂàZÉÂ@˜Ñ Ú šÎÂà$Ò èÁÂ`ÚÓÂ@˜ÑÂà•ÔÂØÖÂÀwÌÂ@’ÒÂ@ÈÉÂà•ÔÂ@ÕÂIÙÂÀÜÐÂØÖÂ`ìÐÂÀèΠšÎÂ`ÎÕ€XÌ >Ó€(Ô ˆÑ€RÍÂÀwÌ ÿÒÂ`{ÎÂÀÖÑÂÀèÎÂà¿ÍÂ`ÔÔÂ@!РˆÑ ßÍÂΑ͠FÜÂàÕÂÀ¦Ù ŒÆÂàÕÂ=Û 8Ô †ÇÂöÑÂ@Ñ€ØÂ@Ò ñÊ jÖÂ@ÒÂ@!ÐÂ@ÓÜÂÀÖÑ‘ÍÂaÕÂàÕÂ@ ÔÂØÖ hÌÂà<Π|ÓÂà­Ð ,ÖÂU×ÂàkÛÂsÒ ÍÐÂ@¼Ë ŒÆÂêÓÂ@ÒÂ@÷ÖÂ΀Ö £×ÂÀ¾Õ PЀóÇ †ÇÂ`¶Ù€XÌÂ`ÔÔ ;É vÔÂ@°ÍÂØÖ £×Â@ýÕÂ@ÒÂÍÂ@ÓÂ@†ÔÂàHÌÂ`ËÂ`Â× £×ÂÀÜÐÂàƒ×€ÏÍÂ` Ì€ÉÎÂ@¯âÂà¡ÒÂà$Ò |ÓÂ`uÏÂ@9ÌÂ@zÖ€ÕÌÂ8ÇÂ@€ÕÂà­ÐÂà Ö )Ì€:ÑÂðÒÂàÕÂ@ëØÂ@åÙ€òÜÂàTÊÂà¡ÒÂ`E× FÜ Ò ØÂ@zÖÂ@VÜÂ@ÕÂ`ÞÂÐÂ@Õ ýÈ€‡Ù€Ö€±Ò€Ö ËÂÀÛ …Ü 5ÊÂ@¤ÏÂ@˜ÑÂàËË€ÕÌ \Π,ÖÂ@ýÕÂÀÐÒÂ`ËÂ`{ÎÂ@ÙÛÂ`!Ý€ìÝÂÀ¾ÕÂ`nåÂ`ªÛÂ@ŒÓ€:ÑÂÀ¾ÕÂàÕ€ŸÕ€±Ò çÖÂÒ×Â`žÝÂ+ÞÂà­ÐÂ@ ÔÂÏ d×Â@zÖÂ@nØÂà§ÑÂÏÂÀSÒ€^ËÂÌØÂ€‡ÙÂ@†Ô€½ÐÂàqÚ€ØÂ`ÚÓ ùÓÂÀMÓ ,ÖÂ`QÕÂ`ÎÕ Ÿâ ÿÒÂÀôÌÂÀ/ØÂÀÊÓÂ@!РÐÂÀkÎÂ`'ÜÂÀÖÑÂàÓÂà6Ï ©ÖÂ@-ÎÂêÓÂàeÜÂgÔ JÑÂ@zÖÂ`ÎÕÂÀ¦ÙÂÀ;ÖÂÀÛ€™ÖÂ`]Ó€òÜÂà­Ð ¯Õ 2ÕÂ`oÐÂÀ”Ü€ÏÍÂàƒ× ¯ÕÂÀ ÚÂÀSÒ€XÌ \ÎÂàúØÂàNË jÖÂ`øÎÂÀÄÔÂ`QÕ ßÍ ‚ÒÂ@÷ÖÂÀAÕÂ@hÙÂ`ÎÕÂ@Ò |Ó€‡ÙÂsÒÂ`àÒÂ@ªÎÂIÙÂÀ)ÙÂ@åÙÂ`KÖÂ`'ÜÂ@¤ÏÂ`«ÆÂ€½Ð —Ù ÁÒ€.Ó€·ÑÂ@-΀pÈÂ@ÓÂgÔÂ`ÊÂàËËÂ@-ÎÂÀeÏÂÍÂÀ¸Ö€ÖÂÀ¦ÙÂ@Ò ÷É€ÖÂÀ¬ØÂ€ÃÏ &× ØÂ` áÂÀ¾ÕÂ@hÙ »ÓÂÌØÂIÙÂàÕÂÀ¦ÙÂ`Â× 8ÔÂ`™ÉÂ`{Π^ØÂ€¥ÔÂ`ÚÓ —ÙÂÐÂ@ÈÉ€ÛË€±ÒÂ@Ó€ÕÌÂàÜÝÂÀGÔÂêÓÂ@ÈÉ åÌ Ò€ØÂ`Í vÔ Ò DÒÂÀ ÉÂ@ŒÓ óÔ€±Ò€áÊÂsÒÂIÙÂÀYÑ RÚ µÔÂà<΀·ÑÂà›Ó )Ì bÍÂÀeÏ€‡Ù€“×ÂàwÙÂà›Ó€pÈÂàÕ &×ÂÀ5×ÂàHÌÂ@ßÚ€ÛËÂ`ÍÂ`É€^Ë >Ó€ØÂÀYÑÂ@-ΠjÖÂ@¤ÏÂÀ¦Ù€"ÕÂ@ÎÈÂsÒÂàÓÂäÔÂà$Ò€4Ò PÐÂ=ÛÂêÓÂÀ|àÂÀÄÔÂ`QÕ€±Ò çÖÂ@÷Ö€¥ÔÂà×É tÊÂ@ªÎ ØÂ€¥Ô€{Û XÙÂ@åÙÂ@Ó ‚ÒÂà×ÉÂ`uÏ JÑÂ@ÕÂ@?Ë€ÏÍ ÿÒ€«ÓÂaÕÂ@ýÕÂÀ;Ö 4ßÂ@ßÚÂà³ÏÂ`ìРÏÂ@ŒÓÂà›Ó ÎÂàÔ‘Í€É΀áÊÂÀMÓÂ@€Õ FÜÂÀÈ €ÈÂ@?ËÂà•ÔÂ`É MÆÂ€cßÂ@hÙ óÔÂ`Í ßÍÂà$ÒÂà6Ï€çÉÂCÚÂüÐÂ@ÑÂÀGÔÂÀ¬ØÂêÓÂàôÙºÛÂ`E×Â@¶ÌÂOØÂCÚÂØÖÂàÂà$ÒÂ`uÏ€LΠˆÑÂ`ÚÓ ©ÖÂ`þÍÂà­ÐÂ@ÍÝÂ`ýâ bÍÂ@ñ×ÂCÚÂÀšÛÂÀÛÂ@˜ÑÂà}ØÂ ÜÂ@¶ÌÂ`iÑÂ@t×€ØÂ ÙÂЀòÜÂ`KÖ€“ףʠŽÐÂaÕ À瀫ӀòÜÂàAâÂÀÊÓÂ@ ÔÂ@†ÔÂ`cÒÂaÕ€.ÓÂÀ/ØÂ‘ÍÂàîÚÂgÔÂ`øÎ ÓÏÂäÔ€×Â%ß ÿÒÂ`?ØÂ d×€ØÂ@ÂÊ ÚÂU×Â`uÏÂCÚ ÕÙÂ@åÙ€×Â@ ÔÂ`à ^ØÂÌØÂ@ ÔÂüРêàÂÀèΠÕÙÂ@Ó€.ÓÂ@t× óÔÂ`†á ^ØÂàwÙÂ@°ÍÂà­ÐÂÀ#ÚÂ`WÔ  ÍÂ`àÒ€oÝÂÀ/ØÂ Ü€(ÔÂ`9ÙÂ`¼ØÂ@nØÂÒ×Â@ÑÂgÔÂ ÛØÂ1ÝÂÀAÕÂÀAÕÂà¡Ò€É΀ÖÂàØÂ@Ó€“× ÉÛ ½ÝÂÀÜ ,ÖÂ`ÔÔÂ`ÈÖÂ@ ÔÂ`3Ú ÏÂÐÂÀ Ú ØÂ \ÎÂÀ¸Ö ØÂ d×Â`¤Ü€LΠá×Â`Â× gá€òÜ ‘ÚÂàÕÂàôÙÂÀ”ÜÂà}ØÂ`†á sß @ÝÂàúØÂ RÚÂ@zÖ€Eä€ìÝÂà)æÂÀjãÂ@bÚ€uÜ ÍÐÂ@ßÚÂ@&äÂÀ¸Ö ÝÂ+ÞÂÀÛÂ`ÚÓ ÿÒ RÚÂàwÙÂÀGÔÂ@!ÐÂÀÕæÂàÿì ©ÖÂÀ¸Ö ¯Õ€ÚÂÀ ÞÂ@QÈ€oÝ€ŸÕÂU× ¨ë€ØÂÀ;ÖÂ`ÎÕÂ1ÝÂ`žÝ ±ßÂà× ÁÒÂIÙÂÞÕ ½ÝÂ`ÚÓ sßÂ`QÕÂ@hÙÂàÔÂ`KÖÂ@ÒÂ@žÐÂÒ× ÕÙÂ`ìÐÂà›Ó ‹ÛÂà‰Ö ØÂ ÛÂ@>à åÂ` áÂêÓ màÂÐÂ@ýÕÂ@ÕÂ`3ÚÂÀúË ŽÐÂ@ŒÓ @ÝÂÀ¾ÕÂÀ¾Õ ÃÜÂ@Õ ÉÛÂ`žÝÂÀóáÂ@’ÒÂêÓÂ@÷ÖÂÀ‚ßÂà}ØÂ`KÖÂ@ÓÂàÅÌÂà× FÜÂà×ÂÀ)ÙÂ@ÁßÂà_ÝÂÀÚ LÛ ½ÝÂà_ÝÂ@8áÂ`Â×Â=Û ùÓÂÀYÑÂàúØÂÀ_ÐÂà‰ÖÂ`ÔÔÂ`3Ú€ìÝÂÀŽÝÂàAâÂ@Dß …ÜÂ`¶ÙÂÀÚ ëËÂÀÄÔÂ@ÓÜÂ`æÑÂÀÜ ±ßÂ`3Ú  Ñ á×ÂÀ²×ÂÀ²×Âà•Ô jÖÂÀ²×ÂÀ²×ÂÀ²×ÂËÂà¿Í >ÓÂ@ýÕ€Qâ mà€uÜ vÔ€ìÝ€™ÖÂ@>à€ØÂêÓ€Ö ÏÂyÑÂà »ÓÂÀ‚ßÂ1ÝÂ1ÝÂÀ/ØÂOØÂâÂÀpâÂ`3Ú€“×€ØÂÀ)ÙÂ@bÚÂÀ¾ÕÂ@zÖÂ@ÓÂÀYÑ€¥ÔÂ`E× |ÓÂà¡ÒÂà*ÑÂÀ¸ÖÂÀAÕÂàÅÌÂ`-Û XÙ ÝÂàBÍÂÌØÂÌØÂ@!Р·ÞÂ@nØÂ ©ÖÂÀ²×€ÚÂ@ñ×Â`?ØÂ bÍÂ…Ï€Ú€“×Â`-ÛÂ@€ÕÂ…ÏÂU×ÂÀYÑ€Ö 8ÔÂ`¼ØÂ€ØÂ`-ÛÂÀ²×Âà­Ð  ÍÂ`þÍ óÔ€Ú ÇÑ ÓÏ ÍР½ÝÂàîÚÂàâÜ [〫ÓÂ`QÕ€ØÂØÖ 8Ô pÕ ÚÂÀ¸Ö€ÚÂ@bÚÂ`täÂÀÜ€× :ÞÂ@ÓÂÀMÓ ÇÑÂàqÚÂá€×ÌÂ`àÒÂÌØÂ ,Ö€^ËÂ@zÖÂÀ¬ØÂ@¤ÏÂ@¤ÏÂ`ÎÕÂ@¶Ì€ØÂÀ²×ÂÀÐÒ€¥ÔÂ@»à€òÜ€ÉΠØÂ@¶ÌÂàÓ€ØÂÀMÓÂU×€ÏÍÂàËËÂà­ÐÂ@’Ò Π²ÊÂ@9ÌÂàÔÂ@°ÍÂÀ Ú »Ó JÑÂ@!ЀØÂ óÔÂ@¤Ï€Ö€½ÐÂ@†ÔÂ`ÚÓ Ú ÝÂÀqÍ€ŸÕÂÀ_ÐÂàÓ ýÈÂ`{ÎÂ@ÕÂàkÛÂà ÖÂ@’ÒÂÀÊÓÂ@ÙÛÂ`cÒÂàÓÂÀâÏÂàÕÂ@ÑÂ`°ÚÂà¹ÎÂ@ýÕ ŒÆÂ`ÉÁ€(ÔÂ@¼Ë šÎ ©ÖÂ`?ØÂ`WÔ AÈÂ[Ö ßÍÂÌÂÀeÏ ÚÂà›ÓÂÀeÏÂàwÙ |Ó Û ‚ÒÂÀ ÞÂ7ÜÂ[Ö ÏÚÂ`E×ÂÆÙ £× ,ÖÂà6ÏÂgÔ çÖÂ`WÔÂÀMÓÂ@zÖ€dÊ †Ç€ÛËÂàÕÂàØÂ@Ñ€±Ò€òÜÂ`¶ÙÂäÔ€“×€.Ó |ÓÂàÕ £× ^ØÂêÓÂÀÛ ©ÖÂÀÐÒÂØÖ‘ÍÂ@†ÔÂÀ)ÙÂ@ýÕÂ…ÏÂÀÊÓÂ@’Ò d× ØÂ ëËÂêÓÂÀâÏ ÒÂ@ŒÓÂ@÷ÖÂ`¼ØÂ |Ó€ÖÂÀÜЀ“×Â@žÐÂÀqÍ yÞÂàƒ×Â@VÜÂ`ÔÔÂ`4Å â >ÓÂÀ}Ë€dÊ #ÍÂ`ÔÔ Ú€ÚÂÀ¸ÖÂ`'Ü ÓÏÂOØÂ@ÙÛ ÍРˆÑÂÌØÂÀ¾ÕÂÀeÏÂÀËÂ@-΀ØÂ ,ÖÂ@ñ× jÖ šÎÂàÕ€ŸÕÂ`cÒ ;ÉÂ`ìÐÂ@’ÒÂ@¤Ï€ùÆÂÀÐÒÂàƒ×ÂàwÙ ”Ï ²ÊÂΠ—Ù€ ÙÂ`ÊÂà6Ï )Ì‘ÍÂIÙÂ`àÒÂ`ËÂ`Þ ÐÅÂ`ËÂ`Ë 2ÕÂàãÇÂà›Ó Ý ‚ÒÂ@9Ì€±ÒÂÀAÕÂ`ÚÓÂà6ÏÂ@3Í€™Ö VÏÂÀ•Ç€ÉÎÂÀôÌ ¦ÌÂà›ÓÂ`¼ØÂÀ¡ÅÂàTÊÂ`ËÂ@nØÂ`ÔÔÂÀ;ÖÂà$ÒÂà¡ÒÂÀÚÂÀ_РÓÏÂ@9ÌÂ`WÔÂ`cÒ£ÊÂ@¤Ï ¬ËÂ` ÌÂ>ÆÂ@'ÏÂ`iÑÂÀôÌÂ@?ËÂ@ÂÊÂà³Ï 8ÔÂmÓ GÇ€dÊ€^ËÂ@°Í bÍ€¥ÔÂäÔ ÓÏÂ@-ÎÂ`øÎ †ÇÂà<ΠˆÑÂ@ÑÂÀ•ÇÂÀ¸ÖÂàûÃÂÀ¡Å€Å€|ÆÂ@9ÌÂ@€Õ ÇÑÂÀú˯Ƞ¶¿Â@WÇ PРóÔ µÔÂÀqÍ PÐÂàÔ ÙÎÂ`Í PРóÔÂàHÌÂCÚÂà×ÂaÕÂà6ÏÂÀèΠVÏÂàrÅÂ`ËÂüÐÂàÔ ÎÂàãÇ \ÎÂàHÌÂàkÛÂ`ÞÂ7Ü ÿÒ€ÛË ½Ý ^ØÂ`E×ÂàrÅÂ@’ÒÂ@ÓÂÀÈÂÀ_РýÈÂ@9Ì€ŸÕÂÀYÑ ¾È £× |ÓÂÐÂ`iÑ ‚Ò€ÕÌÂ@EÊ€ŽÃÂàZÉÂÀ²× ç֠Ȁ4Ò€íÈ nË€.ÓÂ΀ÃÏÂäÔÂ@3ÍÂ@žÐÂà¹Î€jÉÂÀÊ zÉÂ@¤ÏÂà‰ÖÂDÅ ¸ÉÂ`uÏ€“× ÎÂ`ìÐÂ`WÔ »ÓÂ@˜ÑÂ@Ó€^ËÂ@Õ€«Ó€@Рˠ¬ËÂyÑ€ ÙÂ`°Ú ˆÑÂ@3Í£ÊÂÀqÍÂ`‡ÌÂ`ËÂà­ÐÂàÔ ñÊÂðÒ ÆÂ ¬Ë 5ÊÂ@¼Ë€±ÒÂàÕ£ÊÂ@]ÆÂà¿ÍÂ`æÑÂà`ÈÂÀÇÂ@æÄ€FÏ€þÚÂÀYÑÂÀÛ€ÉÎÂÀSÒÂ@?ËÂà0Р¸ÉÂ`"È bÍÂ`-ÛÂÀwÌÂ@¶ÌÂsÒÂÀMÓÂ`iÑÂ@zÖÂ&ÊÂ@¶ÌÂàÝÈ JÑ€dÊ ÄÇ€ŸÕ ÏÚ tÊÂ@¶ÌÂà¿ÍÂ@±¸ÂÀ›ÆÂ ÷ÉÂÀMÓÂ`:ÄÂVÂÂ@'ÏÂÀË /ËÂ`ÉÂËÂ`¶ÙÂ@ÂÊÂðÒ PРšÎ PЀÿÅÂÒ×ÂðÒ ÇÑÂ@ªÎ€ŸÕÂÏ #Í MÆÂ ΀ÖÂ`QÕÂ[ÖÂ[ÖÂ`-ÛÂ`‡ÌÂÀ/ØÂ Ü /ËÂàÅÌ ¤Â ªÁ µÔÂÀ¦ÙÂ@ÓÂ@ ÔÂà¹ÎÂÀAÕ )Ì ¦ÌÂÀÈÂàTÊÂyÑÂ`ªÛ ªÁ ,Ö€L΀"Õ DÒÂà¡ÒÂÀAÕÂÀ#Ú bÍ XÙ ÙΠ#Í ýÈÂÀÄÔÂ@Ó DÒÂÀ*Ä ЀXÌÂöÑ \ΠËÂ`Í€ÛËÂCÚÂàÕÂ`iÑÂÀMÓÂ`WÔÂÀšÛÂà×É ÿÒ€ ÙÂ`¼ØÂ yÞÂà×ÂgÔÂàYÞÂà•ÔÂ`ìÐÂ@ñ× d× ‚ÒÂ`Í‹ÎÂàéÆÂÐÂ@t×Â@-ÎÂÞÕÂ`÷ãÂ`iÑ€(Ô ØÂ`WÔ óÔÂà0Р\Π5ÊÂà›ÓÂ@bÚÂÀ ÚÂ`KÖ€™Ö€™Ö€4Ò€«Ó€ÖÂÀeÏÂÀúË ÎÂ@†Ô tÊÂÀSÒÂ`ËÂ`ÍÂ`¼ØÂ`ÎÕ ²ÊÂÀÚ ¯Õ PÐÂ`àÒÂÀÄÔ€:ÑÂÀ”ÜÂ@ÑÂàÑÊ€±ÒÂàÔ€@РvÔÂÀÖÑÂgÔÂÎÂ`Â×Â@ªÎ ÙÎÂ`Í ýÈÂ@ÈÉ ñÊ ÁÒ ÝÂ@zÖÂàÕÂà›ÓÂàHÌÂ`ÚÓ€FÏÂ@Õ€Fϋ΀ÃÏÂà6ÏÂà Ö ¬Ë ¯ÕÂÀÐÒÂ`àÒÂÀÊÓÂgÔ€XÌ ÜÃÂ@ÔÇÂÀ}Ë´Ü \΀ÛËÂÀî͑̀"Õ ”Ï ¾È ‹ÛÂ`ªÛÂaÕÂàúØÂà³ÏÂÀÐÒÂ@ªÎÂÀÜÂÀAÕÂÀ­ÃÂüЀ{ÛÂ`ÚÓ |ÓÂ@†ÔÂÀMÓ€@Р£×ÂÀÜÐÂU×Â@ªÎÂ`"È ¤Â ÙÎÂÀ ÞÂàwÙÂàËË€XÌÂÀYÑÂÀÛÂÀ;Ö€L΀±Ò ßÍ€ÉÎÂ`æÑ ßÍÂËÂÀ_ÐÂÀÜÐÂà*ÑÂöÑÂ@hÙ »ÓÂÀÚ€ŸÕ‘ÍÂÀ_ÐÂÀèÎÂ@3ÍÂ`KÖÂàÔÂà•ÔÂäÔÂàHÌÂ@ÙÛ€ÏÍÂÀâÏÂ`uÏ€(ÔÂàéÆÂ`“ÊÂàËË ÐÂàTÊ€4ÒÂ@ªÎ †Ç ùÓÂ`KÖ ÒÂÀ*Ä€LΠßÍÂ`4ÅÂ@˜Ñ ÄÂ@bÚÂÆÙ€ÕÌ€|ÆÂ€XÌÂàHÌÂÀÖÑ€ÉÎÂ@zÖ tÊÂ@9Ì ÁÒÂ@ªÎÂÀ_ÐÂ`ÎÕ ÜÂÀÚÂ@!ÐÂ@ÒÂ`ÍÂ`@À@Ѐ¥ÔÂ`WÔ d× ΠÎÂ`zãÂàÓÂ@øÁ ”ÏÂà`ÈÂ`Â× Ë 8ÔÂ@ªÎÂ@’ÒÂ@]ÆÂà<΀Å ”Ï tÊÂЀ«ÓÂ`ÍÂ@ëØÂ ÕÙÂÀ/ØÂ€:ÑÂIÙ€íÈ ÆÂ@ÂÊ€½Ð /Ë€(ÔÂÀÜР¬ËÂÀ¦ÙÂ`·Ä€ÃÏÂÀÊÓÂà­ÐÂ` ÌÂà$Ò #ÍÂ…ÏÂËÂÐÂ@ÑÂÀúËÂ@žÐ 2ÕÂ`àÒÂ@zÖÂÌÂà¹Î€FÏÂÀYÑ€¥ÔÂ`ÚÓÂ@EÊ€½Ð ŒÆÂÀÐÒ åÌ ßÍ ËÂà¿ÍÂà‰Ö  ÑÂ`(Ç ;É Ѐ½Ð€ÿÅÂÀ›ÆÂ ȼÂ>ÆÂ€|ÆÂàTÊÂÏ€ÏÍÂà¹ÎÂÀeÏÂà$ÒÂ@Ñ MÆÂÀâÏ >Ó€FÏÂ`“Ê€4ÒÂ…ÏÂ`WÔ #ÍÂ`(ÇÂÀ É€Ọ̃ʠÁÒÂ`KÖÂàÝÈÂ`¥ÇÂà*ÑÂ@ìÀáÊ ŒÆÂàHÌÂ2ÈÂPà Í  ÍÂ@¶ÌÂà³ÏÂ`þÍÂÀqÍÂ@žÐÂ`ÚÓÂà<ÎÂÀAÕÂ`‡ÌÂÀôÌ€áÊÂÀ}ËÂ@9ÌÂÀè΀LÎÂÏÂàÓÂÀMÓÂ@KÉÂ@!ÐÂ@3ÍÂÏ€"ÕÂ`QÕ€FÏÂÀMÓ DÒ€ÏÍ bÍÂ@˜Ñ ÍЀíÈÂÀÜРçÖ šÎÂÀ;Ö€ØÂ`3Ú€¥ÔÂ@ÓÂÀqÍ€^Ë€FÏ vÔÂÀÜ ÁÒ ÕÙ µÔ 2ÕÂ@VÜÂØÖ€LÎÂ`QÕÂÀÈ šÎ ØÂ@\ÛÂ`uÏÂäÔÂ ÛØÂ€4Ò 8Ô ÆÂàôÙ€"Õ€ÃϠĀ:Ñ€ŸÕÂ@°ÍÂ`'ÜÂäÔÂÐÂÀÄÔ€±ÒÂÀîÍÂ`ŸÈÂmÓ šÎ £×Â@EÊÂà³ÏÂàÕÂ@ ÔÂ@-ÎÂ@t×ÂÀÐÒ£ÊÂà³ÏÂ`E×Â`¶Ù ÇÑÂàÝÈ ñÊÂÀÐÒÂÀ¸Ö€"ÕÂàÕÂ@nØÂ€™ÖÂ`¶ÙÂÀ ÚÂÀšÛÂ`°ÚÂ`]ÓÂ@hÙ ÆÂ ¦Ì åÌÂÀÜРØÂà³Ï€uÜ \ÎÂ@ŒÓÂ`KÖ ÿÒ 2ÕÂØÖ€ÖÂ@ªÎÂgÔ ëËÂ`ÍÂ`¶Ù€cßÂà•Ô€þÚ€ÛË€ÉÎÂàÓ šÎÂà¡ÒÂà ÖÂ`°ÚÂ@t×ÂÀAÕ ÓÏ ÄÇÂ@ÒÂsÒÂÀôÌ /ËÂ@ÔÇ‹ÎÂ@ýÕÂ@\ÛÂmÓ€×Âà›Ó ÇÑ d× jÖÂà¿Í ,Ö tÊ€«ÓÂÀGÔÂà¹Î—Ì€à߀òÜÂÀÐÒ —ÙÂêÓÂàqÚÂÀ#ÚÂ`QÕ ßÍ€ÏÍÂ@hÙÂÀGÔ ^ØÂ`uÏ jÖÂ@¤Ï ÃÜ€ÚÂ@-ÎÂ@ Ô€ØÂÎÂÀÄÔÂäÔÂÀÖÑÂÀMÓ€(ÔÂÏ ¦Ì ýÈ íÕÂ@†Ô bÍÂ`þÍ jÖ ˆÑ€™Ö ©ÖÂ`æÑÂàÕÂ@ªÎÂÀÄÔÂ@ÕÂØÖ VÏÂàîÚÂaÕ ëËÂ@Ñ€(ÔÂà ÖÂÀGÔÂÀîÍ€áÊÂ@ßÚÂàÕ€±ÒÂsÒ ‹Û€¥Ô #ÍÂ@Ò »ÓÂ ÛØÂ@ÔÇÂ`QÕÂ@€ÕÂ@PÝ ÕÙÂ@!РµÔÂ`æÑÂàÔ ¯ÕÂ`ÊÂðÒ€.ÓÂ`ߑ͠—ÙÂà›ÓÂàÓÂÀ_Р©Ö d×ÂЀ:ÑÂÀîÍÂ@÷ÖÂ`9Ù€·ÑÂÀâÏ€“×Â@PÝ pÕ€RÍÂàÔ€4ÒÂÀGÔ ¬Ë  Ñ ÉÛÂ@ýÕ€“× DÒ ¬ËÂÀ­ÃÂ@ÑÂ`“ÊÂÀSÒÂÀ¦Ù ©ÖÂ@ÑÂ`òÏÂüÐÂ`àÒÂÐÂOØÂ€cßÂàØÂ€4ÒÂÀîÍÂÀÜÂ`°ÚÂàƒ×‹ÎÂ`™ÉÂàZÉÂÀqÍÂ@-ÎÂ@¤Ï ¬ËÂÀƒÊ€ ÙÂ@˜ÑÂÀôÌ AÈÂÀwÌÂ`oÐÂ`òÏ€@ЀŸÕÂ@ªÎÂàÑÊÂ`oР ÑÂÀƒÊ ©ÖÂàBÍ€½Ð ÈÂà•ÔÂ`WÔÂ` ÌÂàlÆÂ`¤ÜÂ`ÔÔÂàBÍÂ[ÖÂ`òÏ ýÈ ŽÐÂ@zÖÂà•ÔÂÀôÌÂ`òÏÂÀ•ÇÂà§ÑÂà­Ð ,ÖÂÀAÕ©É€.ÓÂÀ5×Â@ŒÓ ÈÂÀMÓÂ`ŸÈ -Á PÐÂà¹ÎÂ@ÓÂÀÊ tÊ JÑÂЀLÎÂ`ìЀ(ÔÂÀÐÒ |Ó ÒÂàZÉÂÀ0àÇÑÂÀèÎÂ`ÉÂà×ÉÂ` ÌÂÀÄÔÂÇÄ€^ËÂ`"È ÍÐÂ@˜ÑÂ@ÈÉ ¯Õ 5ÊÂDÅÂ` Ì PÐÂ@ªÎÂüÐÂ`Í hÌÂà¡Ò€ÔáÂ@Áß íÕÂ`ìÐÂÀÊÓÂÐÂÐÂ`Í€·ÑÂà¹ÎÂàÕ€ÚÂ@?ËÂ`(ÇÂ@˜ÑÂàHÌ hÌÂÀîÍ #ÍÂÀƒÊÂ`KÖ ^ØÂ  Í€@ЀìÝ€¥ÔÂ`¶ÙÂ`ÎÕÂ`cÒ€LÎÂÀèÎÂ@t×Â@°Í ÍÐÂàËËÂ`·Ä ÏÂ` Ì ÐÂ>ÆÂàïÅ JÑÂ@'ÏÂ`ËÂÀwÌ VÏ ÒÂàèÛ £× ÛÂà­ÐÂ`ÚÓÂÀÄÔ€óÇÂØÖÂà¡ÒÂàÕÂÀ¸Ö bÍ 8ÔÂ@3ÍÂ@¼Ë€@ÐÂÀÜÐÂà­ÐÂ@hÙÂÀwÌÂ@¤Ï£Ê€‡ÙÂÀÊÓÂ`cÒÂà ^ØÂÏÂ@!ÐÂ`ÍÂÀ)Ù ¤ÂÂà<ÎÂÀ;ÖÂ@žÐÂÀÚ ÎÂ`“ÊÂÀ)Ù€æÞ ^ØÂ |ÓÂ@zÖÂ@ýÕÂàÔÂ…Ï ùÓ ŽÐ ˆÑ ·ÞÂ`žÝÂÀÜÂÀGÔÂà*ÑÂ`ËÂÀÛ€àßÂ@ýÕ€±ÒÂ`iÑÂ[ÖÂ`3ÚÂêÓÂ`WÔ JÑÂàÔÂ@PÝÂÀÊÓÂÀÄÔÂàÔ GÇ ÐÅ bÍ íÕ vÔÂÀMÓÂ@˜ÑÂÀ¾Õ€ŸÕÂ@ÍÝÂ`ÈÖÂÀ¦ÙÂËÂêÓÂ`-Û JÑÂ@-ÎÂ@Ó ‚ÒÂÀÖÑÂàeÜÂà}ØÂÀ¦ÙÂ`¼ØÂ`¶Ù d×Â`-ÛÂIÙÂ@'Ï€ŸÕÂÞÕÂà}ØÂ jÖ ‘Ú€ØÂ€FÏÂÀ‚ßÂ@ëØÂÐÂÀ¬ØÂ á× ùÓ€FÏÂ@t×Â@ÑÂÀÐÒÂÀÜ  ÑÂsÒ€ÕÌÂàÕÂIÙ ÇÑÂaÕ€«ÓÂ`uÏÂ`’ßÂâÂÀ ÚÂà›ÓÂ`KÖÂIÙÂÆÙÂÀeÏÂ`ÚÓ vÔ ÿÒÂyÑ€™Ö ùÓÂàâÜ ÍЀ¥ÔÂÀ ÚÂÀ²×ÂÀÐҋΠÏÚÂ@PÝÂÏÂ@’Ò€:Ñ€(ÔÂÀÛÂÀšÛ \ÎÂ@ÔÇ€×ÂÀšÛÂàƒ×Â`ªÛÂ@ßÚŠã ±ßÂ`àÒÂ@¤Ï ,ÖÂ@ÇÞ ÕÙ€½Ð€:ÑÂà*ÑÂ@ÓÂ@†ÔÂ`QÕÂ@ýÕ€òÜ€ÖÂÀèÎÂÀÚÂ@\Û€ÚÂ1ÝÂàèÛ ‚Ò€‡ÙÂ`€â 2ÕÂ`°ÚÂ+ÞÂÀ¸ÖÂàÓ 4ßÂàèÛ @Ý€·ÑÂÀÄÔÂàqÚÂÀšÛÂ`E× Û »Ó  Ñ PÐÂÀ;Ö íÕÂÀ/ØÂ@˜ÑÂÒ×Â@PÝÂàØÂ@ñ×ÂÀ ÉÂÀÄÔ€iÞ€iÞÂ`ÚÓÂÀÖÑÂ@÷ÖÂ@t× yÞ ÎÂ`ËÂà›ÓÂ@Ñ |ÓÂÀÿßÂà× PÐÂà<ΠÙÎÂ`cÒÂÀGÔ€ÛËÂyÑÂÀ¸Ö€ŸÕ DÒ FÜÂ`WÔÂÏÂÎÂ`E×€.Ó çÖÂ`3ÚÂÀGÔÂÀ‰ÉÂ@ÕÂ@ëØÂÀÊÓÂРŽÐ ÓÏÂ@zÖÂ`øÎ€”€4ÒÂÀÈ VÏÂà<ΠnË ÁÒÂÀ;ÖÂÀ¸ÖÂ@¤Ï€ÃÏ€ÏÍÂÀ²×Âà›ÓÂ`þÍ€™Ö ²ÊÂ@ÔÇÂ@€ÕÂDÅÂV€RÍÂÀMÓ ‚Ò€þÚ€ÛËÂ@˜ÑÂ@ªÎ€«ÓÂà×Â`þÍÂàqÚ€× ñÊ ÍÐÂ@ÔÇÂ@ÔÇ ÷É ˆÑ€XÌÂàTÊÂ@\Û šÎ€‚Å ëËÂ@Ҡπ‚Å žÃÂ`"ÈÂ@ÕÂ…ÏÂ2È€:ÑÂ@EÊÂàÕÂ@3Í€±ÒÂ` Ì€LÎÂ`àÒÂ@ÂÊ€@Ѐ±ÒÂÀGÔ åÌ€Ö Ù jÖ 2ÕÂ`‡ÌÂÀ_ÐÂàôÙÂ`øÎÂ`ËÂ@àÅ ÙÎÂ@nØÂÀÄÔÂsÒÂà¡ÒÂ@9ÌÂ`ŸÈÂ`"È óÔ€‡ÙÂàTÊ bÍÂ@°Í \ΠDÒÂÀ/ØÂ MÆÂË€ ÀÂöÑÂØÖÂÀYÑÂà0ÐÂüÐÂÞÕÂÆÙ€ÃÏÂ`"ÈÂ`ÉÂÇÄ€ØÂ€ÛËÂ@3ÍÂ`‡ÌÂ`øÎÂÀËÂÀYÑÂ@ŒÓÂ`(ÇÂÀúË€vÇÂ@?Ë€çÉ»ÆÂÀâÏÂ@¶Ì ÐÂ`"ÈÂÀÈ ËÂà0Р»ÓÂÀ}ËÂ`àÒ»ÆÂ`uÏÂ@žÐÂ`òÏÂÀôÌ ÇÑÂ`ÎÕÂÀÈ ÷É€ÃÏÂ&Ê€·ÑÂ`ÃÂÂ@-ΠåÌÂà0Рá×ÂÀèÎÂÀqÍÂà„ÂÂÀ•Ç€LΠŒÆÂ`ÍÂ`ìЀÉÎÂÀÐÒÂ`uÏÂÀ#Ú Ù΀ˆÄ€‚ÅÂÀ¡Å JÑÂà¹Î ¬ËÂ`™É  Í Ò ˆÑÂ` ÌÂ`ÔÔ Ï Ú€·Ñ€LÎÂ`þÍ  Í¨ÞÂÀÖÑ€XÌÂÌÂÀË€ÉÎÂÀSÒÂ@Ó SÅ /ËÂ`‡ÌÂÀYÑ ŒÆÂ@3ÍÂÀqÍ |Ó ÎÂÀ;Ö€ÉÎÂ@ªÎ ΀ØÂ`‡Ì€É΀XÌÂ@t×Â`æÑÂàfÇ /ËÂà¡Ò çÖ€·ÑÂÀúËÂÎÂ` Ì€@ÐÂ@KÉÂ\ÁÂ`9Ù íÕÂà×Â@˜Ñ DÒÂ@ÓÜ€LΠµÔÂàÕÂÀèΠ»ÓÂÐÂ@ÒÂà¹ÎÂÀôÌÂà­ÐÂ@'ÏÂ`QÕÂà­Ð Б͠hÌ ðß ¯Õ LÛÂàÅÌ RÚÂ@¶ÌÂàנ〫ÓÂÀkÎÂÀÖÑ ØÂ@ÚÆÂÀeÏÂÀMÓÂ`àÒÂ`ëåÂ@VÜÂà›Ó »ÓÂ@?Ë GÇÂ`ÚÓ€.ÓÂ`KÖ vÔÂÀ;ÖÂsÒ€ùÆÂàÝÈÂ@ ÔÂà<ÎÂà$ÒÂà³Ï  Ñ \ÎÂÀGÔÂ@˜Ñ ñÊÂ@˜Ñ€™ÖÂ@ëØÂ€¥ÔÂàÜÝ ÇÑ ÇÑ€ÕÌÂÀôÌÂÀeÏÂ@ÓÂ`.ÆÂЀ]àÂ=Û Ú ŽÐÂà•ÔÂàÔ DÒ 2ÕÂà× ÚÂ@¼ËÂ`“Ê€½Ð€«ÓºÛÂÀMÓÂÀÚÂÀÊÓ€ÃÏÂÀ#ÚÂ@ýÕ€4Ò £×ÂÀ5×ÂaÕÂÀÊÓÂà›ÓÂàwÙÂÀâÏÂà­Ð £×œà ÙÂÀ¸Ö€:Ñ ÁÒ€‡ÙÂU×€ ÙÂàôÙÂÀkΠjÖÂà‰ÖÂÀGÔ šÎÂ`ÚÓ€“×Â@\ÛÂÏÂ@8á€QâÂàÅÌÂÀMÓÂà_ÝÂ@Dß ØÂ`ÎÕ ^ØÂ`¼ØÂ€.ÓÂ`iÑÂàâÜÂÀMÓÂ`KÖÂà<΀4ÒÂ@†Ô íÕÂà*Ñ äáÂ@ÙÛÂ@zÖÂ@ÑÂàBÍ íÕÂÀÐÒ€oÝÂ@Áß íÕÂà­Ð ÃÜÂÀ Ú ‚ÒÂ`'ÜÂàÐßÂ@zÖÂ`]ÓÂ`ªÛ€ØÂ @Ý€«ÓÂ@VÜÂäÔÂàÕÂà³Ï ¦ÌÂà0ÐÂ@t×€æÞÂÀ Ú ÆÂ@ÓÂàÔ jÖÂ`ÎÕÂàMàÂÀMÓÂ@bÚÂ@ýÕÂÀÜ€4ÒÂà}ØÂ 4ßÂÀMÓÂÀ¦Ù€× Ò ÉÛÂ%ßÂÀšÛÂÀÄÔÂÌØÂÍÂ`]Ó 4ß @ÝÂÀ¾ÕÂaÕÂ1Ý€±ÒÂ`æÑÂÀÛÂàÄáÂÀÖÑ€«ÓÂà}ØÂ vÔ FÜÂ`\è ÉÛ€XÌÂàâÜÂ`¼ØÂ pÕ ÕÙÂà_Ý€ÖÂÀ)ÙÂmÓ ©ÖÂàØÂgÔÂà¹ÎÂÀôÌ€@ÐÂÀGÔ bÍÂöÑÂà­Ð ½ÝÂàÓ€ÃÏÂàÜÝ ùÓ€XÌ ùÓÂ`ÚÓÂ=ÛÂ@ßÚ€iÞ Üœà jÖÂàƒ×€æÞ€4ÒÂÀ5× /ËÂ`òÏ€×ÂÀ²× ëËÂäÔÂ@'Ï€×Â@ÙÛ€™ÖÂàHÌ  ÍÂàBÍÂà¡Ò€vÇÂ@¤ÏÂ`]ÓÂÀGÔ€×ÂÀÐÒ ¯ÕÂ`ÎÕÂà­Ð jÖÂÀ)ÙÂà ÖÂyÑÂ@Õ€:ÑÂÀèÎÂ`àÒÂgÔÂÀ;Ö ùÓÂà×ÂàâÜÂÀ”ÜÂ`'Ü€ÕÌ ÁÒ ÇÑ€.ÓÂOØÂ …ÜÂÀÖÑÂÀ¬ØÂàÓÂ@†Ô ÿÒ hÌÂ@QÈ ÿÒÂ`ÈÖÂ`9ÙÂÀ^å d×ÂsÒÂÀ}ËÂÀ•Ç ëËÂ`QÕÂ`iÑÂ@ýÕ pÕ ÕÙ ^ØÂ`ÔÔÂÀôÌ ÏÂ`?ØÂ`'ܺ۠2ÕÂyÑ #ÍÂàƒ×Â@!ЀŸÕ€:ÑÂ=Û€‡ÙÂ`?ØÂ€oÝÂ`ìÐÂ`¤Ü€±ÒÂà•ÔÂ`iÑÂ@¶ÌÂ@nØÂ@t×ÂÀÜÂÀ²×ºÛ€“×€«ÓÂäÔÂ@¼ËÂÀkÎÂà•ÔÂ@nØÂÀÚÂÀŽÝ€ÚÂÀYÑÂ`iÑÂÀ;ÖÂÀ¸Ö€·ÑÂÀ5×ÂÀ/ØÂÀÛ€cßÂàƒ×Âà<ÎÂàÔÂÀ;ÖÂÀâÏÂ`ÈÖÂÀ}ËÂÀeÏÂàËËÂ`iÑÂüÐÂ@€Õ€ÏÍ d×€ÃÏÂÀYÑ ÇÑÂà¾âÂ@€ÕÂ`ÊÂÍ ¸ÉÂ`?ØÂ€‡Ù —Ù Ù΀ÚÂÒ× íÕÂ@zÖÂ@žÐÂÀúË ŽÐÂ`?ØÂêÓÂ@ßÚÂÀ²×Â@ýÕÂ@˜ÑÂÀeÏÂ@˜ÑÂ`ÈÖ€@Ѐ4Ò€L΀LÎÂmÓÂàèÛ€ŸÕÂ`]ÓÂ`{Π8Ô€±ÒÂ`Â×ÂOØÂ@åÙÂ`¶ÙÂÀMÓ€ŸÕÂÀ²×Â@€ÕÂÀSÒÂÀAÕÂ@ñ×Â`ÞÂÀ¸ÖÂ`ìР:ÞÂà*ÑÂà_Ý &×ÂØÖ€RÍ€^ËÂà­Ð ‹ÛÂàÓÂÀAÕÂà‰Ö€:ÑÂà›ÓÂ@'ÏÂÀ/ØÂ[ÖÂ`KÖÂ7ÜÂ`¶ÙÂàqÚ€ÔáÂ1ÝÂ`ÈÖÂÀÜÂ`oÐÂ@bÚÂâÂ@¤ÏÂÍÂ@Ñ 4߀oÝ çÖÂÀ}Ë€"ÕÂàÖÞÂ@VÜÂÀGÔÂÀYÑ ÒÂà$ÒÂÀšÛÂÀÿßÂ@÷ÖÂ@nØÂËÂ@ªÎÂÀ#Ú ÉÛÂÀÐÒÂ`cÒÂàÔ vÔ€ŸÕ ½ÝÂ`ÚÓÂÀ Ú€ÖÂ@t×ÂaÕÂ@zÖ ÁÒ Ý ÏÚ VÏÂ@JÞÂÀšÛÂÒ×ÂÀ¸Ö ÃÜÂÀšÛÂ`ªÛ®ÝÂ`oÐÂ`E×ÂðÒ€oÝÂ1ÝÂ7ÜÂ@zÖÂ@t× ÎÂà•ÔÂ@˜ÑÂÀ ÞÂÀ/ØÂ€ØÂäÔ 8ÔÂà•ÔÂàqÚ RÚÂàeÜÂà×Â@hÙÂ`¶Ù€ØÂ€¥Ô öÞÂ`]Ó 2Õ€™ÖÂ@÷ÖÂ`?ØÂ@ÓÜ€øÛÂÐÂàHÌÂàƒ×€™ÖÂÀ#ÚÂ@ýÕÂ`Â×ÂÀ²×ÂàÓ ÕÙÂÀÜÂà}ØÂ`˜ÞÂà$ÒÂàîÚ ÚÂ@ÑÂÀ¾ÕÂàwÙÂÀÐÒÂ`ßÂàÕ€øÛÂàÕÂÀAÕ€"ÕÂ`3Ú ÉÛÂÀÖÑ ÃÜÂËÂÀAÕÂ`ÔÔÂÀpâ ˆÑÂÐÂ@åÙÂ@˜ÑÂ@!ÐÂgÔÂÀ)ÙÂ`oР¨(dt ?@4 4ÿxunitsyunits ~hðm (·—NMTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ v (š™™™™™©?msô¯=8é‡ pA¿F:”‰6 š™™™™™©?msô¯=8é‡ pA¿F:”‰6 š™™™™™©?msô¯=8é‡ pA¿F:”‰6 ÿÿÿÿÿÿÿÿ (CLASSTABLE (VERSION3.0 8TITLEDescription of sec0 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitsTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ƒHEAPX Èdatadescription8  @œ8‡q·—NM€SNOD ‚x„ X¨(dt ?@4 4ÿxunitsyunitsÿÿÿÿÿÿÿÿ8ø (·—NM (CLASSTABLE (VERSION3.0 8TITLEDescription of sec1 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitshˆÀAÕÂ`]ÓÂöÑ€LÎÂ@¶ÌÂIÙ RÚÂðÒÂ`{ÎÂÀkÎÂgÔÂÀYÑÂ@÷ÖÂ@ Ô€Ú ÿÒ€"ÕÂÏÂÀÛ€ÉÎÂÀ¦ÙÂàôÙÂ@ñ× >ÓÂØÖÂàÕ´ÜÂ@¯âÂÀÜÐÂ@zÖ d×ÂÀ5× màÂ`ìРØÂ€]à ÚÂÀâÏÂ`ìЀ]àÂÀÄÔÂ@ÁßÂÀÛÂÌØÂàØÂ@ÓÂ7ÜÂàèÛÂ`KÖÂ@JÞ€É΀øÛ€ÚÂÆÙ vÔ PÐÂ`É ÍÐÂ=ÛÂ@Ò€ÕÌ &× ÿÒ€ Ù€àß óÔ€«ÓÂ@Ò >ÓÂ@\ÛŠãÂ`ÔÔ ‘ÚÂ@VÜÂ`KÖ ÇÑÂ`øÎÂÀYÑÂÀ;ÖÂà× ŽÐÂÀ5×Âà×Â@¶ÌÂüÐÂÀkÎÂ@t×ÂÀ¾Õ€{Û ùÓÂ@zÖ 8ÔÂ`'ÜÂàôÙÂà•ÔÂÀAÕÂÀŽÝÂà¹Î€¥ÔÂ`3ÚÂ%߀.Ó ëË JÑ ,Ö 䠽݀×ÂÀ_ÐÂÀ)ÙÂÀ Ú€¥ÔÂ@ÍÝ {è «àÂöÑ‹ÎÂàÖÞ ‘ÚÂ@ëØÂ€“×€ØÂà*ÑÂ ÛØÂà*Ñ "âÂàúØÂ@ÓÜ€RÍÂÀšÛ€ ÙÂà ÖÂà$ÒÂ`iÑ€LΠ”ÏÂà á×ÂyÑ 2ÕÂ`¼ØÂ€.ÓÂ@žÐÂàeÜÂ…Ï€æÞÂÀ;ÖÂ`'Ü RÚÂÀAÕ Ý XÙ jÖÂ@bÚ€ØÂ€ØÂ ‚Ò |Ó PÐÂÀÊÓÂ`ªÛ ÕÙ pÕ íÕÂØÖÂàkÛÂÀ/ØÂ@¼Ë pÕ ¯Õ íÕÂÀÝÂàúØÂ€¥ÔÂÀšÛÂà•ÔÂ@ÒÂà•ÔÂÀqÍ óÔÂÀÚ #Í 2ÕÂ`cÒÂà¿ÍÂ@JÞ 2ÕÂΠÐÂΠöÞÂCÚ ñÊÂ`WÔ ÏÚÂÀÝÂÀÛÂà¡ÒÂöÑ€"Õ ÒäÂ`žÝÂÀ5×Â`iÑÂ`cÒÂàÕ ‚ÒÂà0ÐÂ[Ö ÁÒ ÕÙÂÀ¾ÕÂsÒ ÕÙ€·Ñ€ŸÕÂ`QÕÂ`QÕÂÀkÎÂÀ¦ÙÂÀ_ÐÂÀÊÓÂöÑÂÀÜРjÖÂÀÊÓÂàúØÂ@nØÂ ²Ê»ÆÂ`cÒ€oÝÂÀƒÊ ýÈÂà­Ð —ÙÂCÚ JÑ |ÓºÛ &×ÂaÕÂ[ÖÂà§ÑÂÀîÍÂàèÛÂÀ;ÖÂ@÷ÖÂ@t×Â`ªÛ€:ÑÂ@çÂ`¼ØÂ`]ÓÂàwÙ€ÉÎÂÌØÂ@÷Ö€Œí jÖ šÎ€çÉ PÐÂà­Ð€× |Ó JÑ ¬Ë ÍÐÂ@ŒÓÂà×ÂÀ‰ÉÂ`ËÂàÔÂÀMÓÂ@zÖÂaÕÂðÒ \ÎÂ@˜ÑÂà0Р/Ë jÖÂÀÝ€ÚÂ@åÙ€½ÐÂÀâÏÂ`¶ÙÂ`žÝ ,Ö ÈÂðÒÂàÕÂ`¶Ù€ŸÕÂàÕÂÀeÏ 8Ô€ÖÂ`cÒ€^ËÂà•ÔÂ@-ÎÂàwÙÂ`ÚÓ íÕÂÀ¦Ù ½Ý€Wá ‹Û ŒÆÂàÑÊ ØÂ ÏÚÂÀ”Ü çÖÂ@†ÔÂàkÛÂ`?ØÂÀ/ØÂ€™Ö £×€‡ÙÂÀˆÞÂÀÐÒÂ`ßÂàÖÞ  ÑÂà‰ÖÂ%ßÂÀ;ÖÂà0ÐÂ@\ÛÂÀ/ØÂÀ¬ØÂÀ¸Ö ÜÂÀîÍ€ÚÂà€LΠØÂCÚÂàwÙÂ@JÞÂ`ÎÕÂ@ýÕÂÀ;Ö€ÏÍ µÔ€ÉÎÂ`ÍÂÐÂÀ¾ÕÂàÔÂÀ¾ÕÂÀÝÂ+ÞÂ`¶Ù ùÓ >Ó ØÂ€Ôá€Ú @ÝÂû倨ÂÀÛ —ÙÂà}ØÂ€àß ÉÛÂ`Â× Ú µÔ Øã šÎ ÙÂàîÚ€uÜÂÀáä€oÝ ØÂ d×Â@ßÚ :ÞÂ`Â×Â@hÙÂêÓ€àßÂàúØÂ üÝ ^ØÂ€uÜ€uÜÂ@ßÚÂ@zÖ€"ÕÂ@-Πá׮݀¥Ô ˆÑÂÌØÂà$ÒÂà•ÔÂÀÄÔ ÐÂÀ¸Ö€ØÂ íÕÂÀÖÑÂÏ€ÏÍÂ`ªÛÂ`¶ÙÂOØÂ FÜÂ@ÕÂ@Ò ëË€·ÑÂgÔ )ÌÂ…ÏÂÀ;Ö€ØÂ 2ÕÂ@bÚÂ@ªÎÂ`oÐÂ@åÙÂÀÊ‘ÍÂàúØÂÀ”ÜÂÀ_ÐÂ`uÏ ©Ö ùÓ ©ÖÂyÑÂ@ÒÂ@VÜÂÀ#Ú ñÊ ÙÂ`òÏ µÔÂ@Ñ€(Ô€òÜ ÏÚÂÀ¬ØÂàÜÝÂ=ÛÂÀšÛÂà›ÓÂ@ñ× RÚÂÞÕ —ÙÂ@ñ×Â@žÐÂØÖÂÀvá€4Ò &× »ÓÂ`9ÙÂÀ²×ÂàâÜ @ÝÂ@°Í€Ú ¬ËÂÀîÍ€FÏ ¯ÕÂÀ/ØÂ@ÙÛ ùÓ µÔÂ@ÑÂ8ÇÂyÑ€‡Ù€‡Ù 8Ô€™ÖÂ@ýՊ〙֠&×Â`-ÛÂÀÝÂÀâÏ ÙÂ`-Û€Ú ÝÂ@ÓÂÀÝÂàÄáÂ@ÙÛ Ï £×€¥ÔÂ@ÍÝÂÌØÂ@ÑÂà•ÔÂØÖ çÖÂ@ªÎ€"Õ€·Ñ€ØÂ@’ÒÂà}ØÂàîÚÂ[ÖÂ%ßÂ`nåÂàYÞÂ`ß ØÂ@ýÕ€øÛÂÀGÔÂÀ)ÙÂà6ÏÂàƒ×€ÚÂÐÂÀ/ØÂà<ÎÂ@÷Ö —Ù€«ÓÂCÚÂàËËÂäÔÂ@!ÐÂà}ØÂ |ÓÂ@÷Ö€±Ò€þÚÂà/å Ý ‹Û ÙÂÀ”Ü ‹ÛÂÀ Ú€øÛÂ[ÖÂ@Ò ^ØÂÒ× ^ØÂ  ÑÂ@ýÕÂ`ÈÖ šÎÂ`±Å€.ÓÂ1Ý ‚Ò€"ÕÂ`ÍÂ`ÈÖÂ@©ãÂyÑÂÀ²× ÇÑÂ@ñ×Â@˜ÑÂÀÛÂ`WÔ ÿÒÂÀYÑÂ`9Ù ¯Õ€“×ÂÏÂàËËÂOØÂ &× öÞÂ@÷ÖÂ@˜ÑÂäÔÂÀ/ØÂ 4ß 8ÔÂðÒ ΀.Ó ‹Û€ØÂ@ ÔÂ@bÚÂÒ× LÛÂ`æÑÂàBÍ pÕ µÔÂ`{ÎÂàƒ×Âà¡ÒÂ@bÚ á×  Ñ€Ú€ÏÍ–á µÔ€pÈÂ`?ØÂ`]ÓÂàÓÂgÔÂàãÇ€«Ó€òÜÂ`QÕÂà›Ó d×ÂàBÍÂ@zÖ ÏÂÀ¸ÖÂ`ÞÂà× Ï "âÂÀÊÓ ÓÏ€±ÒÂÀGÔÂmÓ ÎÂmÓÂ ÛØÂÀÝÂ@ÂÊÂ=ÛÂ`{ΠöÞÂ2ÈÂ@¤Ï€·Ñ óÔÂ@àÅ á×ÂàÔÂ`oÐÂ@˜Ñ DÒÂ`ÍÂÀÇ óÔ ½ÝÂàÅÌÂ@˜ÑÂ`ÉÂ`KÖ Ѐ4Ò íÕ€«ÓÂ@’ÒÂ@€Õ ÙÎÂÎÂ@Ñ  Í µÔ€·ÑÂË ˆÑ€cßÂàÄá ‹ÛÂ`9Ù  ÍÂÀîÍÂ@ ÔÂÀwÌÂà<΀:Ñ€ÛË µÔÂ7Ü€ Ù€(ÔÂüÐÂÀÄÔÂÀ5×ÂÀÄÔÂà³ÏÂ@ªÎÂà<ÎÂ@Õ ÏÂÀÿßÂêÓÂàÅÌ ÁÒÂ`QÕÂÀqÍÂ@˜Ñ´ÜÂ@˜ÑÂ`¼ØÂ[ÖÂ@ÚÆÂ`±ÅÂ`þÍÂ@ÈÉÂÀkÎÂàÅÌÂ`“ÊÂÀ¸ÖÂ@!Р2ÕÂÀ›ÆÂ@EÊÂÀîÍ ËÂà§ÑÂ`KÖ 8ÔÂ@iÄÂ`"È€RÍÂà¹Î€4Ò pÕÂ@åÙÂ@ӵǻÆÂÌ£ÊÂ@àÅÂgÔ ÄÇ ¦ÌÂÀ‰ÉÂgÔ ÿÒÂ@9Ì€^ËÂàHÌÂÞÕ´Ü  Ñ ÁÒÂ@Ò€.ÓÂÀèÎÂà•ÔÂ@ÂÊÂ@!ÐÂà$ÒÂà×ÉÂ@cÅ€ùÆÂ@¶ÌÂsÒÂ`þÍÂÀ‰ÉÂÀÊÓÂÌ©ÉÂÀËÂ@-΀½ÐÂ`{Π€ÈÂ@°Í€ÉÎÂ@KÉ ÈÂà0Р÷ÉÂgÔ /ËÂÀÈÂÀÈÂÓÂÂ@EÊÂ@]ÆÂ VÏÂÀúËÂüРÒÂÀ0ÃÂÀ§ÄÂ@Ñ€LÎÂÀÜРAÈÂ@KÉÂÀîÍÂ`.ÆÂ@ Ô€ÃÏÂ@{ÁÂàÔÂPõÇÂÀÈ€ÿÅ€ÕÌÂà¹Î vÔÂÀË ËÂ@9ÌÂРPÐÂÀ¬ØÂ@hÙ€@Р‘ÚÂàÅÌ‹ÎÂ`oÐÂ@€Õ ÓÏ &×Â@ÓÂÀÄÔÂ@9ÌÂàBÍÂàTÊ ’Å€óÇÂ@'Ï ÏÂ`àÒ€:ÑÂà6ÏÂÀ É€vÇ€×Â@9ÌÂÀÊÂÁÅÂ@ÔÇÂ`ÍÂ@¶ÌÂ@¤Ï šÎ€çÉÂàÓÂ`òÏ †ÇÂà×É ²ÊÂ̩ɀÖÂ,ÉÂ…Ï ÛÂ@!ÐÂ`òÏÂ ÊÆÂÀÊÂàãÇÂÀȑ͠VÏ ÈÂàNË MÆÂÀ›ÆÂÓ€²½ÂÀƒÊÂöÑÂÀÐүȠùÓ€FÏÂÀÐÒÂ`{Π˜ÄÂàTÊÂÀîÍÂ`iÑ€(ÔÂÀèΠDÒÂöÑÂÀwÌ€ÃÏÂàÝÈ  Í ”Ï€ÂÂà`ÈÂàÅÌÂüÐÂÀ*Ä šÎ VÏ óÔ ;É€ÅÂÒ× Ç»ÆÂ€ÕÌÂ`(ÇÂÌÂÀÖÑ šÎÂÀYÑ JÑÂyÑÂÀ¬ØÂ€.ÓÂÀ;ÖÂÌ€«ÓÂàËË  Í€ÃÏ€ÕÌÂÀÖÑÂ`æÑÂà6Ï ¦ÌÂàrÅÂÎÂ`ÍÂ@9ÌÂ@9ÌÂ`ÍÂà×É©ÉÂÀSÒÂàHÌ €È€:ÑÂ`uÏÂDÅ€áÊÂà§ÑÂ`àÒ€4Ò€RÍ ”Ï€LÎÂsÒÂyÑÂ`ËÂ`Ê hÌÂ`ÊÂðÒ€ÃÏ Ù΀ÛË ;ÉÂ@ ÔÂ@?ËÂ`ìРAÈÂàïÅÂ@¼Ë 5Ê€vÇ ýÈ€dÊÂÀƒÊÂ@'ÏÂOØÂ@€ÕÂ ÊÆÂÀôÌÂà§Ñ€áÊÂ@-ÎÂàTÊÂ@QÈÂÀ5×ÂÀƒÊ ÐÅÂyÑÂàfǠˀ·ÑÂàÑÊÂ`ÍÂÀÊ€pÈ€pÈ€¸¼Â €ÈÂ@9ÌÂ@3ÍÂÀwÌ€ÏÍÂà<ÎÂÀÇÂ`ìÐÂÀËÂaÕ€ÛËÂà¹Î ÁÒÂ`ìР>Ó€¥Ô ŒÆÂsÒ€±ÒÂ`ÍÂ`þÍ ÅÂà§ÑÂÀÈÂÍÂCÚÂà¿ÍÂ`]Ó€ÏÍÂЀ·ÑÂàÕ€ÃÏ PÐÂ@3ÍÂ`"È€RÍÂ@ Ô  ÍÂ`E×Âà× ˆÑÂÀÐÒÂÀÇ )ÌÂ`.ÆÂ #Í »ÓÂàïÅÂ@-ΠvÔÂàHÌÂ`ÏÀ€±Ò )Ì€ÛË€RÍÂ@Ó€«Ó çÖÂ`ìÐÂ`ÍÂàËËÂàËËÂ`¼ØÂ€4ÒÂ`‡ÌÂÐÂÀúËÂIÙ ýÈ‹ÎÂ`WÔÂüР£×Â`¼ØÂ@åÙÂ ÛØÂ@bÚÂ,ÉÂàÝÈÂÀAÕÂ@!Ѐ½Ð €È ˆÑ ,Ö DÒÂ` Ì€c߀“× 4ßÂ@žÐÂ@Ñ ˆÑÂ`ÔÔÂËÂÀGÔ åÌÂÀMÓÂ`bçÂà ÖÂÀâÏÂ`Í pÕ€øÛÂÎÂ@Ó‹ÎÂà¿Í€:ÑÂà*ÑÂüÐÂàwÙ zÉÂÀôÌ ÿÒÂÀîÍÂÀÈÂ@?Ë ÎÂàËË ßÍÂÀËÂÌÂ&ÊÂÀ;Ö€LÎÂ@°ÍÂà*ÑÂ`]ÓÂ@'ÏÂà6Ï€ÖÂàîÚ€±ÒÂ`{ΠíÕ £×Â`4ÅÂ@\ÛÂÀ¾ÕÂà ÖÂÀƒÊ #ͩɀŸÕ PЋÎÂ@!ÐÂ@hÙ d× ÅÂ`]Ó€jÉÂ@-ÎÂ`àÒÂà³ÏÂ@zÖÂÀÐÒÂ@¤ÏÂ@ªÎ d×ÂÀ_ÐÂ`™É€ØÂ åÌÂ@zÖ ÇÑÂsÒÂ@Ò€{ÛÂÀSÒ ŽÐÂ`øÎÂà0ЯÈÂ`Ë ’ÅÂ@{ÁÂÀƒÊÂ`ÔÔÂÀ;ÖÂà*ÑÂÍ ˆÑÂ@˜ÑÂÀGÔ€¦¿Â@EÊÂÐÂ`3ÚÂ` ÌÂ`.ÆÂ€vÇ tÊ )Ì 8Ô€É΀^ËÂ`ÎÕÂÀÊÓÂ`(Ç€:ÑÂ`ÉÂà¹ÎÂDÅ ÅÂ`æÑ ¦Ì ;É VÏ Ï ÇÑÂ,ÉÂà¿ÍÂàH̵ÇÂ>ÆÂà*Ñ ýÈ  Í nËÂÀSÒ ÐÂàïÅ€™ÖÂÎÂ`¼ØÂ 5ÊÂÀYрŠ&×ÂÀ5×Â@ÂÊ ÄÇÂÀ0ãÊÂ…Ï ΠžÃÂÀ}Ë€ùÆÂà$ÒÂÀÐÒÂÀúËÂÀkÎÂàãÇÂÓÂÂÍÃÂÀúËÂ8Ç PÐÂÀúËÂàïÅÂÀ*Ä ˆÑÂÀôÌÂÎÂ@oÀ.Ó ;ÉÂàÅÌ€áÊ€.Ó &×Â@ìÃÂ@¼ËÂ`ÍÂ@ÈÉÂÀÇÂ`¼ØÂ`òÏÂ`ËÂà³ÏÂ`iÑÂ@ ¿Â@ÈÉ€ÿÅ€(ÔÂ`æÑÂÏ€ÏÍ€RÍÂ`WÔ€RÍ‹ÎÂàNËÂÀeÏÂ,É #Í #Í Ë AÈÂÀîÍ GÇÂ`“ÊÂÀMÓÂàÅÌÂà¿ÍÂË vÔÂ`¥Ç SÅÂÀZ¼Â`"È€«ÓÂ@¼ËÂÀ²×Âà<ÎÂàôÙÂÏÂ`“Ê€ÛËÂÀSÒ€RÍÂmÓÂ@¯â ŽÐ Å€4Ò ΀óÇÂÀÊ )ÌÂ`™ÉÂà¿ÍÂàBÍ ÏÂ`±ÅÂ`Í  ÑÂàlÆÂ λÆÂ Ðũɠ5ÊÂàÜÝ  ÑÂ@˜ÑÂà¹ÎÂà¹ÎÂ`]ÓÂ,ÉÂÀ‰ÉÂ`]ÓÂ@bÚ€±Ò€çÉÂÍ ëË —Ù óÔ€·ÑÂà*Ñ ”ÏÂÀ‰É€XÌ€(ÔÂÀ}ËÂÀ}ËÂ7Ü€«ÓÂ@cÅ SÅÂ@˜Ñ ñÊÂÀƒÊÂàfÇÂÀÖÑ€@ÐÂgÔÂ@Ó€^ËÂ`ÏÀÂÀqÍÂà×ÉÂ@?Ë ŒÆÂ`ÍÂäÔÂàTÊÂ@¼Ë ýÈ ¶¿ÂàÃÂ`:Ä ÐÅ ˆÑÂàÓÂ`iÑ€”ÂÂ`Ê€jÉ€ÏÍÂàZÉÂà0РŽÐÂ`Í€vÇÂüÐÂyѯÈÂ`æÑÂêÓ€(ÔÂ`QÕÂΠÄÇÂÀwÌÂà$ÒÂà¹ÎÂ`WÔ€vÇÂ΀LΠÐÂäÔ tÊÂÀúËÂÐÂ@?ËÂÒ×Â@˜ÑÂ@Qȣʠd×ÂmÓÂÀšÛÂ@ÓÂmÓÂ`øÎ 8Ô ÙÎÂ@€ÕÂÀeÏ€"ÕÂ`KÖ€jÉÂÀÜРˆÑÂêÓÂ`QÕ€.Ó€·ÑÂ@!ÐÂÀ5×ÂmÓ ”ÏÂ`oÐÂ`]ÓÂ@ÑÂÀAÕ ðßÂ`øÎÂ@†ÔÂ@'ÏÂÀ5× »ÓÂàÅÌÂ@JÞÂ`ÍÂ`{΀±Ò #ÍÂÀÛÂ@Á߀ÖÂ`uÏÂàËËÂÀ¾ÕÂ@&ä yÞÂ`ËÂ`{ÎÂÀÄÔÂà•Ô€ØÂÀôÌÂÀGÔ ÿÒ hÌÂ@ Ô Ü |Ó ËÂÀËÂ`ÚÓÂÀ;Ö tÊÂàNËÂ`±Å€.Ó ”ÏÂ@KÉ€¥ÔÂ`Â×€×Â…Ï€ÃÏÂ`ÔÔ€½ÐÂàHÌÂgÔÂ@˜ÑÂ`¼ØÂ Ú€|ÆÂ€«Ó€·ÑÂ`-ÛÂ`ìÐÂ@ªÎÂàÝÈÂà<ÎÂöÑ€"ÕÂÀÜÐÂ`ÈÖÂ@ªÎÂÀôÌ ßÍÂ@ÒÂ@ÂÊÂà<ÎÂ…ÏÂ`‡ÌÂ@¼Ë ÇÑÂà<ÎÂ`iÑ ßÍ ÏÂsÒÂ@'ÏÂ@QÈÂà­ÐÂ@-ÎÂà•Ô ÇÑÂÌÂÀ_Р˜ÄÂÀ›ÆÂÁÅÂ,ÉÂ@iÄÂÀÆÂ`ìРÕÙÂ`ÊÂ`WÔ MÆÂ8Ç€@ÐÂêÓ€ÏÍÂ@!ЀÃÏÂÀôÌ€ÃÏ ÎÂÀƒÊÂ@9ÌÂ`ÚÓÂ@åÙÂÀèÎÂ`uÏ€(ÔÂ[ÖÂÌÂà³ÏÂ`]ÓÂ[ÖÂ@†ÔÂàÓ€ÃÏÂàÔ tÊÂ`9ÙÂàØÂ Ï çÖÂ@PÝ€ÃÏÂÀ5×Â@’ÒÂ@ÈÉÂ@!ÐÂÀ¸ÖÂyÑÂ@÷ÖÂ[ÖÂÀÆÂ\ÁÂà­ÐÂàBÍ ÒÂÀîÍÂÀ¸ÖÂ@Õ€¥Ô ëËÂðÒ ¦Ì ¬Ë ÐÂ`WÔÂÀèÎÂ`ÞÂ@Õ€:Ñ ΠVÏ ÙΠÎÂàBÍÂ`oЀÿÅ€ÏÍÂà*Ñ ñÊÂÀqÍÂÀÊÓ XÙÂà¿Í ¯Õ€±Ò ÎÂà0ÐÂàZÉÂ@ÕÂÎÂ`‡ÌÂ`uÏ ¬ËÂ`ÚÓÂêÓÂðÒÂ@†ÔÂà0РDÒÂöÑÂöÑÂ@þÀ€pÈ‹ÎÂÀGÔ€.ÓÂ@Ò€:ÑÂÀkÎÂàNËÂÀqÍÂ@ŒÓÂ@ÕÂÀÈÂ@'Ï€™Ö‘ÍÂ@†ÔÂ@˜Ñ€áÊ€ØÂÀÇÂ`Í€pÈ ^ØÂà}ØÂ@ Ô€ÛË€ÕÌÂ@zÖÂÎÂÀúË ÒÂ@?Ë€ÛËÂ`òÏÂ@ÂÊÂÀSÒ€«ÓÂ@nØÂÀ*Ä€ÉΠ|Ó€@РÉÛ ßÍÂà¡ÒÂ`ÔÔÂàÅÌ€ Ù \ÎÂ@’Ò€ŸÕ€ÚÂ@ÕÂà$ÒÂÀÈÂÀ}ËÂ`{ΠëËÂyÑÂ`‡ÌÂÀ§ÄÂÀMÓÂÇÄÂ`‡ÌÂaÕ  Í€ÃÏÂÀÜÐÂ@°ÍÂÀ}ËÂ`Í€@ÐÂðÒÂ@ÕÂ`oÐÂ`KÖÂà¿ÍÂÀÊÓ PÐÂÀÐÒ vÔÂРÙ΀"ÕÂ@Ò jÖÂÀ¦ÙÂ@€Õ ÒÂÀÄÔÂ`¤Ü vÔ€íÈÂà¿Í€àùÓ RÚ FÜÂÀ;ÖÂÎÂÀîÍÂÀ5×Âà›ÓÂ`cÒÂÀȋΠvÔ VÏÂÀ_ÐÂØÖ 2Õ€FÏ  Ñ RÚÂ`ÉÂ@!ÐÂU× /ËÂà×Â`‡ÌÂ`KÖ çÖ€íÈ ÙÂÀ¾Õ d×ÂàÅÌÂ@ýÕ€.ÓÂÀ”Ü …Ü ÙΠ;ÉÂäÔÂ@ýÕÂàTÊÂöÑÂ@¤ÏÂàËËÂ@3Í ¦ÌÂ`iÑ€4ÒÂÀ}ËÂ7ÜÂOØÂà­ÐÂÀÜЀ ÙÂ`ÚÓ  Í€ÕÌ ßÍÂÀúËÂÀSÒ pÕÂ@ªÎ /ËÂ` ÌÂ@EÊÂàÓ ‚ÒÂ@ñ×Âà›Ó ‚ÒÂÀÐÒ€‡Ù€¥ÔÂ`àÒ€(ÔÂÀAÕÂÀâÏÂ@KÉÂ@zÖÂÀÄÔÂ`ËÂÀÐÒ jÖ hÌÂ@ªÎ€dÊ JÑÂaÕ #Í ÍÐÂÀpâ |Ó ‹Û 8ÔÂ@zÖ€.Ó ÿÒÂ@€ÕÂÀ#Ú€½ÐÂ@ŒÓÂmÓÂ`˜ÞÂÀîÍÂ2È 2ÕÂÀŽÝÂ@hٮݠ±ßÂ@Ò )ÌÂÀÐÒÂ@9ÌÂmÓÂ`Í DÒÂ`æÑÂ`{΀XÌ€4ÒÂÀ¾ÕÂÀ)Ù‘ÍÂðÒ€“×€ŸÕ d×ÂÞÕ ˆÑÂà§ÑÂ@°ÍÂÀ•Ç Ä ÐÂÀÖÑ€þÚÂàÓÂÀeÏ 5ÊÂ@ýÕÂÀ²×ÂÀMÓ »ÓÂ@÷Ö |Ó—ÌÂ@ªÎÂÀ5×€"Õ€L΀4ÒÂÀÜÐÂ`]Ó 5ÊÂ`™ÉÂàÓÂÌØÂ@Ó€·ÑÂðÒÂÀÜ šÎÂÀwÌ ^ØÂ  ÑÂàôÙ€4Ò öÞÂÀGÔÂà×Âà ÖÂ@¤ÏÂ@ÒÂ@'Ï DÒ€¥ÔÂÀôÌÂÀMÓÂ@?Ë€ ÙÂ`ÉÂ ÊÆÂàBÍÂ`QÕÂÀ;Ö ÙÎÂ@-ÎÂÀÐÒ ëËÂ@?Ë ˆÑÂàÔÂäÔÂ@-ÎÂÀ)ÙÂ@ŒÓÂ`uÏ€ŸÕÂÀwÌÂàËË—Ì ”Ï ^ØÂÀƒÊÂàHÌÂ@žÐ 2Õ jÖÂ`ÊÂÏÂ`ËÂÀkÎÂàHÌÂaÕ€4Ò €È >ÓÂ`.ÆÂàÖÞÂ@bÚÂàMà #ÍÂàTʠπÕÌ »ÓÂÀÐÒ€«ÓÂ@EÊÂ`]ÓÂ`oÐÂà0ÐÂÀT½Â—ÌÂà×ÉÂ@ÓÂÍÂ@-ÎÂÀ¾Õ ¬Ë€«Ó €ÈÂÀ•ÇÂÀSÒÂ@]ÆÂ pÕÂ@÷ÖÂà¹ÎÂ@°ÍÂÓ€çÉÂÁÅ ÿÒÂÀâÏ€Ú VÏÂ@ÕÂàkÛÂ΀áÊÂ`ÚÓÂÀÊÓ )Ì ˜Ä šÎÂaÕÂà¿Í Ë RÚÂ`9ÙÂ`WÔ€4ÒÂ`Â× pÕÂ@†ÔÂsÒ€XÌÂàBÍ€XÌÂÀÊÓÂà³Ï€"ÕÂÀâÏÂÀ‰ÉÂàúØÂ`4ÅÂà­ÐÂ`Ë€áÊ€çÉÂÀƒÊÂ`ìÐÂÀôÌÂ`WÔÂ@ÕÂ@’ÒÂ@ÒÂ` Ì€RͣʠXÙÂÀAÕ Ë ˆÑ€LÎÂ@ÎÈÂ@¤ÏÂOØÂ€óÇÂà_ÝÂ`þÍÂ`{΀ÿÅÂà×Â2ÈÂ@¤Ï åÌÂ`ìÐÂ`Ë€FÏÂ@?ËÂÀeÏ€ÛËÂàÑÊÂÀYÑ PÐÂÀGÔÂ@¤Ï€RÍÂ@ÈÉ€¥ÔÂ`òÏÂ`øÎ )ÌÂÌÂÍàzÉÂ`WÔ šÎÂÀ/ØÂ»ÆÂËÂÀ•Ç€ÃÂ@˜Ñ ÓÏÂgÔÂ@!РÒÂ`æÑÂ`oЀ×—ÌÂÀ¡Å /Ë€:ÑÂ@-ÎÂÀ›ÆÂ@zÖÂ`iÑ SÅ ˜ÄÂÀwÌ PР¬ËÂ@ÔÇÂ@¶Ì ëË VÏÂ@ÑÂà¿ÍÂ@!ÐÂ[ÖÂsÒÂ`WÔÂÀ#ÚÂÀÜÐÂÀ¾Õ ’ÅÂ2ÈÂà$ÒÂÀ¦ÙÂÀAÕ d×Â@ÂÊ€±ÒÂ`ÎÕ £×Â@†ÔÂüЀ(ÔÂÀkÎÂà0ÐÂÀôÌÂÀ²×Â`E×Â@'ÏÂ`ÎÕÂÀ;Ö€RÍÂÆÙ€× VÏÂÀSÒÂÀè΀RÍÂ…ÏÂÌÂÀ)ÙÂÎÂ`ÍÂ@ ÔÂ@ñ×€‡ÙÂ@DßÂÒ× ÏÂÎÂ`(ÇÂ@-ÎÂàÔ€ÃÏ VÏÂà ÖÂ`ÍÂ`¶ÙÂ`¶Ù€ŸÕÂàYÞÂ@ßÚÂ@ñ× ¬Ë‹ÎÂÀÜÂ@\ÛÂàúØÂ`3ÚÂÀ/ØÂÀ¬ØÂ 2Õ ÛÂ@˜ÑÂgÔÂaÕÂ@žÐÂ@’Ò ÕÙÂÒ×ÂÀeÏ€«ÓÂ@t×ÂÀGÔÂ@!ÐÂ`-Û bÍÂÀ¦Ù ‚Ò€RÍ€Ú€{Û 2ÕÂà*ÑÂ@†ÔÂà‰Ö ÎÂ7ÜÂÀ¾ÕÂyÑÂÀSÒÂ@°Í Uä€óÇ ²ÊÂΠ Í #Í ÄÇÂmÓÂ@žÐ \ÎÂàÅÌÂ@ÂÊ šÎ ‚Ò€ÿÅ ²ÊÂàZÉÂ`±Å >Ó ÒÂàÕÂ`ÊÂÀkΠ†ÇÂ`ÚÓÂ@ Ô ùÓÂU×ÂÀ¾Õ —Ù óÔ€dÊÂàÝÈÂÀâÏÂÒ×Â@ªÎ  Ñ ùÓ µÔÂ@-ÎÂöÑ€½ÐÂà*Ñ€XÌ &×Âàƒ×Â`ÚÓÂ@ýÕ‘ÍÂÀúËÂ`ÈÖÂÀYÑ€:Ñ€jÉÂ`uÏÂÀÜÐÂàéÆÂ ÈÂà}ØÂ`uÏÂ@ßÚÂÀîÍ ¯ÕÂ@ Ô ˆÑÂ@ÙÛÂ@9ÌÂ@ŒÓÂà×ÂÀ}Ë€çÉ€:Ñ€4ÒÂ`ÎÕÂ@÷ÖÂÐÂ`™É ÓÏÂ`uÏÂÏ€×ÂàYÞÂÒ׋ÎÂêÓ ©ÖÂ`ªÛÂ`ÚÓÂÀâÏÂ`¼ØÂ ÇÑ ùÓÂÀÄÔÂ@ÓÜ€½Ð ˆÑ öÞÂà$Ò€ÖÂà}ØÂ`ªÛ ,Ö€uÜÂ@ ÔÂ`ÀÏÍÂ`QÕÂà¹Î€™Ö ÓÏÂàÔÂ`æÑÂÀ#ÚÂÀîÍÂ@KÉ€‚ÅÂ@¤ÏÂ@-ÎÂÀqͯÈÂêÓÂ@Ñ ùÓÂÐÂà›Ó€«Ó€.Ó JÑÂ`ÚÓ€·ÑÂ`iÑÂ`ÈÖÂÀšÛ ÿÒ |ÓÂ`ÔÔÂÀÖÑÂÀÈ \ÎÂÒ× 8ÔÂÀ¦ÙÂ@ÍÝÂ@hÙÂÀ‚ßÂOØÂ@!Р‚Ò öÞ AÈÂ`àÒ ÿÒ€4ÒÂ`°ÚÂ@žÐÂà¹ÎÂÀSÒ ÕÙÂ@zÖ tÊÂà³ÏÂÞÕ€RÍ€Ö€^Ë ýÈÂÏÂ`9Ù€øÛÂ`žÝÂ`E× ¥á RÚÂ@°Í€ÛË †Ç€ÅÂ`iÑ ÙÎÂ@hÙ pÕÂÀÜÐÂ`Í d×ÂÀÖÑÂ@ÔÇ»ÆÂ€±Ò€ÃÏÂà•Ô ¯ÕÂÀîÍ \ÎÂàÓ óÔÂ@’Ò€·Ñ‹ÎÂàÕ€ŸÕÂ`·Ä ’ÅÂàHÌÂ`WÔ€× ßÍÂËÂÏÂöÑÂÀ}ËÂÀ¡ÅÂ`½Ã¯ÈÂÒ× ¸ÉÂ2ÈÂ`æÑ ÏÚÂ`ÔÔ )Ì /ËÂ@cÅ£ÊÂ@bÚÂàèÛÂ`òÏÂÀËÂ`ÍÂàNË ùÓÂà‰Ö€vÇ ßÍ€@ÐÂ`òÏ ÍР)Ì€dÊÂ`{ÎÂÀ ÚÂà³ÏÂ`ŸÈÂmÓ ÙÎÂ@ ÔÂ@æÄÂ@ÕÂ`ìЀ@Р¯ÕÂà*Ñ jÖÂ@Ó ØÂ @Ý ÃÜÂ`'Ü )Ì åÌÂ@9ÌÂàÔÂàôÙÂÀwÌ€ÏÍÂà¹ÎÂ`ÚÓÂêÓ€¥ÔÂ@Õ SÅ ÇÂ`{ΠMÆÂ@?ËÂ`þÍÂmÓÂÀAÕ€^Ë€:ÑÂÀÄÔ€XÌÂ`àÒ á×Âà`ÈÂ@9ÌÂÀúË /ËÂ`uÏ íÕÂ`àÒ ñÊÂÀSÒÂ`ÈÖÂ`oЀ:ÑÂ@ ÔÂÀÊÂÀÄÔ ”Ï ÇÑ ΀4Ò€·Ñ€½ÐÂ@ÕÂÀèÎÂàèÛÂðÒÂ`]ÓÂà0ÐÂÀMÓ ¾ÈÂ@ŒÓÂÀ²×Â@ñ×€Ö ŽÐÂ`QÕÂÀSÒÂ`E×Â@ÚÆÂ d× vÔÂÀ_ÐÂÀÜÐÂÀÜÐÂgÔ€{ÛÂðÒÂOØÂÀSÒÂ@¤ÏÂàÕÂ ÛØÂ ØÂÀšÛ jÖÂ`¶Ù€Úà€ÃÏÂ`cÒÂ`¶ÙÂÀ¬ØÂ€øÛÂÀ¾ÕÂÀâÏÂ@9Ì ÏÂ@Õ bÍ€ŸÕÂ`cÒÂÀâÏ€ìÝ ØÂ VÏ ÐÂÐÂ`Ë€dÊÂàBÍ€ÚÂ`WÔ€þÚÂà`ÈÂ`þÍÂÀÆÂ@°Í¯È pÕÂàrÅÂ,ÉÂðÒÂ@hÙÂ@’ÒÂÀSÒÂ@˜ÑÂàœ¾Â€@Ѐ|ÆÂgÔÂÀAÕÂ`QÕÂ@ÂÊÂÀÐÒÂ@EÊ ýÈÂ@Ò€:ÑÂ@!ÐÂÀ_Р ÑÂ@’ÒÂÀÜЀFÏ€ÛË ¬ËÂàÔ‘ÍÂ@!ÐÂàËËÂàwÙÂ`QÕÂÀMÓ ñÊÂàNË ËÂ@ÔÇ€@РeÂÂÀ}Ë€pÈÂöÑ kÁ ô¿Â tÊÂ8ÇÂ`ÎÕÂ@ÒÂ@¶ÌÂyÑ ùÓÂ@'ÏÂÀÈÂàÓÂÀâÏ€(ÔÂ`ÚÓÂÀGÔ ¦ÌÂàkÛÂàÑÊ Ò€½Ð ÖÄÂÀôÌÂÙÁ ÙÎÂ`åæÂàÓÂüРØÂàéÆÂ ¦ÌÂÀ;Ö Ç ¦Ì tÊÂàBÍÂà`ÈÂ`oЩɀ:Ñ€LΠ ÍÂ,ÉÂÀÊÓ ÿÒ JÑÂÀîÍ )Ì€:ÑÂ@žÐÂΠýÈ€ ÙÂ`Ë ªÁ ÇÑ€iÞÂÀ¬ØÂ ¦ÌÂ@àÅÂÀÇÂÀÐÒÂ@˜Ñ€™ÖÂ`Ë€ÛËÂ`·ÄÂ`QÕ‘ÍÂ`â¨Â@ñ×€·ÑÂ@ÑÂ@÷ÖÂÀß ¤Â©É |ÓÂ@ÓÂ@'ÏÂà`È åÌ€XÌÂ`ìÐÂ@?ËÂ` ÌÂyÑÂÀîÍ ;ÉÂÀâÏÂ@ÀÂ@˜ÑÂà¿Í DÒÂ@t×ÂÀ¸ÖÂàZÉÂsÒ ÓÏÂÀ¸ÖÂ@ªÎÂ`cÒÂ@ñ×Â@3ÍÂ`‡Ì€ÂÂ`æÑ€XÌÂ@€Õ vÔÂàHÌÂ`ËÂ@EÊÂ`^¾Â@ÈÉ bÍ€ ÄÂÀÊÂÐÂ@¼Ë ñÊÂàÅÌ€RÍ€ ÀÂàBÍÂ@Ó€™Ö£ÊÂàTÊ©ÉÂà³ÏÂ`æÑÂà­Ð ÁÒ \ÎÂàÔÂ@KÉ€L΀±ÒÂ@3ÍÂÀÈÂ,ÉÂà¡Ò 2ÕÂÍÂ`ÍÂÍÃÂ`ÊÂà¹ÎÂ`ËÂðÒ—Ì E½Âàœ¾ÂàZÉÂêÓ ëËÂà`ÈÂà*ÑÂ@!ÐÂÀ_ÐÂ`òÏ€@ÐÂÀeÏÂ`ÈÖ€¥Ô >Ó €ÈÂ` Ì ”Ï hÌÂÀ*ÄÂàxÄ óÔÂ@ŒÓ zÉÂsÒÂÀ§Ä ñÊ ÎÂÀAÕÂ@nØÂ€·ÑÂ`ÔÔÂ[Ö £×€:Ñ &×ÂÀËÂÀȯÈÂ@†ÔÂàÅÌÂÀ}Ë€:ÑÂÒ×Â@ÈÉÂÀÇ€ÏÍ \ÎÂ@’Ò€ÉÎÂÀèΗ̠΀çÉÂà<ΠVÏÂüРçÖ€RÍ ëË ÏÂ`ÎÕÂ`ìÐÂ@ªÎÂ@WÇ»ÆÂàfÇ ÜÀ^ËÂà•ÔÂÞÕÂ`™ÉÂàËË »Ó—ÌÂÀƒÊÂàTÊ ÜÃÂÀeÏÂ@?Ë nËÂ`4ÅÂÀÖÑÂÀÜЀ^ËÂÀÈÂ`:ÄÂ@ÒÂ2ÈÂ@àÅÂ@†Ô ¦ÌÂÀ$ÅÂÌÂÀÈ€«ÓÂÀ*ÄÂàÝÈÂàZÉ ùÓÂà¹Î ”ÏÂÇÄ ½ÂàTÊÂ@°ÍÂ`(ÇÂ@Õ ËÂ`]ÓÂÀ¦ÙÂà­ÐÂ@ÈÉÂÀôÌ šÎÂ@3ÍÂÀ}ËÂÀ›ÆÂ`±Å ÏÂÀƒÊ çÖ hÌÂÀ É€ Ä€FÏÂ`É€‚ÅÂÀÖÑÂÀÜЀ|ÆÂÍÃÂÀÜЀ|ÆÂ DÒ ÙÎÂ@¶Ì€:Ñ ¦ÌÂ@ªÎÂà­ÐÂ@WÇ€jÉÂà´ºÂàBÍÂ ÊÆÂØÖÂÀ)ÙÂ`ÔÔÂÀ}Ë€½Ð ÐÂ@ÂÊÂ`"ÈÂ`QÕÂ@ªÎÂàÝÈÂà×ÉÂ`cҋ΀ÂÂÀMÓ€É΀áÊÂàTÊ ú¾Âà~ÃÂàfÇÂà³ÏÂ…ÏÂ΀4ÒÂ`ËÂà`È€«Ó VÏÂÀwÌ )ÌÂ@˜ÑÂ@¤Ï€LίÈÂà Ö ÍÐÂsÒÂÀÜЀóÇÂ@WÇÂ`æÑÂ&Ê©ÉÂ…Ï ÷ÉÂ`æÑ ŒÆÂ@cÅÂÀwÌÂà ֠ˀ«ÓÂà ÖÂÀGÔ »Ó€ÃÂÀ$ÅÂ`òÏÂ`àÒ€ÿÅ ÷ÉÂÀƒÊÂÀ}Ë žÃ ŽÐ ”ÏÂÀ³ÂÂàlÆÂ MÆÂ ßÍÂÀÜР!ÃÂ@¤ÏÂà­ÐÂàÕ€:Ñ€íÈÂÀÊÂ2ÈÂЀ¥ÔÂÀÇ€4Ò€“×Â`{ÎÂÍÃÂ@-ÎÂ…Ï jÖÂ@?Ë ÖÄÂ@ÈÉÂ` ÌÂàƒ×Â@™¼Â€vÇÂà6ÏÂ@Ó€·ÑÂÀ‰ÉÂÀMÓÂÐÂaÕ€áÊ 5Ê€ùÆÂàÅÌÂ`·Ä€LΠÍÐÂÀ›ÆÂ ¾ÈÂ@EÊÂÀèÎÂà*ÑÂÀkÎÂÀ ÉÂàÝÈ€ Ä ¾È€dÊÂ@ÒÂ@'Ï€óÇÂ`LÁÂÀSÒÂ`þÍ€(ÔÂ@ªÎÂÀ$ÅÂ@EÊ‹ÎÂàÔ€dÊÂÌ ÓÏÂÀkÎÂmÓ hÌÂ@'ÏÂ`ÍÂ`ÎÕÂ`ŸÈÂàZÉÂÀîÍ€òÜÂêÓÂÀ³Â€óÇÂàãǩɠ€È€.ÓÂàHÌÂDÅÂ`oУʀRÍ€XÌÂÀqÍÂÀîÍÂ`ÈÖ€óÇÂÀ5× VÏÂ`™ÉÂ`ÔÔÂà×ÉÂÎÂàÓÂ@¤ÏÂ@ÎÈ€ÕÌ šÎÂàéÆÂ‘Í ÇÑ žÃÂÀÖÑ ÿÒÂË‹ÎÂ@?Ë€^Ë €È çÖ ÙΠÁÒ #ÍÂàÝÈ ÿÒ€ÃÏÂ@¤Ï ùÓÂ`{ÎÂÀÊÂÀÊÓ ¦Ì jÖÂÀƒÊ ¸É åÌ€^Ë bÍ ²ÊÂÀeÏ€FÏ ñÊÂÀYÑÂðÒÂz¼Â,ÉÂÀâÏÂàúØÂ@ ÔÂÀ¸Ö ”Ï€ÉÎÂ`RÀÂ@Ó€XÌÂ@EÊÂÀôÌÂ`Ê—Ì ”ÏÂàÅÌÂ@!ÐÂÀúË ÆÂ@ªÎÂà*ÑÂ`“ÊÂ&ÊÂ`3ÚÂà³Ï€šÁÂ@Ñ€¥Ô ;ÉÂÀMÓÂÀÇ€|ÆÂ`æÑÂ`þÍÂ@ÎÈ€|ÆÂÀ•ÇÂ@iÄÂà<ÎÂàTÊÂàïÅÂ@!ЀjÉÂ`uÏÂàNËÂ` Ì‹ÎÂ@t×€íÈÂ`“ÊÂàãÇ 'ÂÂÀƒÊÂà6Ï zÉ ÄÇÂ@ÈÉÂyÑÂ`òÏÂÀÇ€;¼Â@3ÍÂРbÍÂ`4Å€ùÆÂ #ÍÂ@KÉÂ`:ÄÂ`ÊÂ@]ÆÂÀ¡Å€ÉΠbÍÂà0ЀùÆÂ@uÂÂ`ÏÀÂ`oÐÂ@ŒÓÂÀkÎÂÀ³ÂÂÀ‰ÉÂ@ÑÂàÅÌÂ@]ÆÂ€ŽÃÂ@?ˀŠAÈ€ÅÂËÂàfÇÂ`™É ”ÏÂVÂÂ@¼ËÂ`@àÓÏ€@Ѐ.Ó ÒÂ`ÊÂ8ÇÂÀ¿ÀÂ@ÂÊÂà–¿Â ú¾Â€ÀvÇ ËÂà¾ÂÀ`»Âà„ÂÂÐÂà•ÔÂ`“Ê€€ Ä tÊÂÀ§ÄÂ@4¸Â€ÏÍÂ@øÁ€dÊÂ@ÎÈÂà¹Î€íÈÂ@oÀÏÍÂ@ÈÉ GdžºÂ ¶¿Â` ÌÂÀÆÂ`ìÐÂà~ÃÂàÝÈ€¬¾Â»Â`ÉÁÂàéÆÂ ;É ¤ÂÂ@ÂÊÂàTÊÂ@9ÌÂàË˯ÈÂÀÖÑ #Í€²½ÂÀãºÂ@{ÁÂÀãºÂÀÈÂàïÅÂàËËÂ÷¼Â@QÈ ÜÀ/¾Â@ÀÂÀѽÂ@ÈÉÂÀ*ÄÂÌ€áÊÂ@ÚÆÂ`F€)¿Ât½ÂÀqÍÂ`Ë€ÅÂ` Ì€ ÀÂÀÈÂ@ÚÆÂÀƒÊÂ`«ÆÂ`ÔÔÂ@3ÍÂÀwÌ€RÍ€vÇ †ÇÂ`4Å zɵÇÂÀƒÊ€ÃÏ€ÅÂàÀÂÀ›ÆÂ@3ÍÂ@'ÏÂ8ÇÂJÄ AÈ€ÏÍÂ>ÆÂ`½ÃÂ`“ÊÂ ÊÆÂ€šÁÂ@¥ºÂ»ÆÂµÇÂ@‡¿Â ¸É©ÉÂÀ*ÄÂàÑÊ ¾È€/¾Â ÇÑ hÌÂ@QÈÂÀ­ÃÂ`{ÎÂÀÜЀvÇÂ`Û¾Â@ÔÇÂ2ÈÂ`·Ä€‚Å ßÍ ¾È ΀‚Å ÈÂÍÃÂ@àÅ€½ÐÂÀÐÒ»ÆÂ ¼¾ÂÀÇ €È€ŽÃÂV 5Ê nËÂå¿ÂÀÈÂÀ‰ÉÂÀÈ 9¿Â`«ÆÂ ÄÇÂ@ÔÇÂ\ÁÂë¾ÂÀ³Â bÍÂà„ÂÂ8Nj΀ŽÃÂh¿Â€#ÀÂàÅÌ€ÛË ÖÄ tÊÂ@ìàÐÅÂà¹ÎÂàTÊÂÀÆÂàËËÂÀ É€ŽÃÂ@oÀdÊÂÀÇÂÀ É€(Ô tÊ ;É ßÍÂ`±Å )ÌÂ@WÇ šÎÂ`.ÆÂ ¾ÈÂ`ÍÂ@?Ë€ÉίÈÂÀ­ÃÂ@KÉ ¾ÈÂ…ÏÂ` ÌÂ`cÒÂÀ›ÆÂàõÄÂ`(ÇÂàHÌ )Ì ,Ö€.ÓÂÓ óÔ€™ÖÂ@ªÎÂäÔÂ&Ê d×Â`ÔÔ ŽÐÂ`øÎ Ë MÆÂÏÂÀÈÂ@ÚÆÂ€RÍ€XÌ ”Ï tÊÂÀqÍÂVÂÂ@3ÍÂVÂÂàBÍÂ@3Í€ÃÏÂàÅÌ ŒÆÂà³ÏÂ`E×ÂàÔÂ`‡ÌÂÀúËÂ`æÑ€ÏÍ€4ÒÂàlÆÂ€RÍÂ@ÂÊ ÅÂ@ÎÈ \ÎÂÀSÒ€ÏÍ ’Å tÊÂ@¤ÏÂüÐÂ7ÜÂ…Ï #ÍÂàÔÂ@?ËÂ` ÌÂÀ_ÐÂDÅ€:Ñ >ÓÂÀÈÂ@°ÍÂ&Ê€«Ó ”Ï ÇÑÂ@’ÒÂàrÅÂàõÄÂàZÉÂΠªÁÂDÅ €ÈÂÀSÒÂ`?ØÂ`.ÆÂ@KÉ †ÇÂÀƒÊÂàÑÊÂà<ÎÂÀÊ Ç åÌ€XÌÂ`ÊÂàÅÌÂJÄÂbÀÂÀÆÂ@ìÃÂàTÊÂÍÃÂàNËÂ@¼Ë GÇÂ@øÁÂàËËÂàÝÈÂàTÊÂÏ eÂÂ÷¼Â ¾ÈÂàxÄÂÀ³ÂÂÀ§ÄÂ@ÈÉÂ@‡¿Â€pÈ #ÍÂÀ¹ÁÂÀ$ÅÂ`:ÄÂÀË ùÓÂ@ªÎÂÀeÏÂ`ÏÀ€ÿÅ åÌÂ`"ÈÂ@QÈ †ÇÂ`@à¦ÌÂJÄ€pÈÂ8ÇÂ@ìÃÂ@QÈÂ@ÂÊÂ`«ÆÂ ëË€LÎÂ@ÈÉÂ`·ÄÂ`“ÊÂÀËÂÀqÍÂÁÅÂÀôÌ hÌ e€ÃÂàrÅÂ@9Ì ŽÐÂ@¼ËÂÇĩɠÐÅ€”ÂÂÌÂJÄ  ÍÂ@EÊÂÀèÎÂ`X¿ÂÀƒÊÂàÂÂ`™É nËÂ`˩ɀ ÀÂ@øÁ©É€@ÐÂÀÊ€ÂÂ`æÑÂÀËÂ`·Ä !ÃÂà`È€:ÑÂ`øÎÂÀ‰ÉÂÍ€pÈÂ@?Ë ÁÒÂßÀÂt½Âñ½ÂàTÊÂ@“½Â ’Å€:Ñ žÃÂ`«ÆÂÍÃÂüÐÂ@ÈÉ€šÁÂ@4¸ÂÀk΀^ËÂÀËÂ@u€¦¿ÂàfÇÂ@KÉÂgÔÂ@ÚÆÂ€vÇÂ`Ë Ù΀ÕÌ ËÂàÅÌÂ`¼ØÂÀ¡Å ²ÊÂ@ÈÉ ˆÑÂÀÊÓÂ,É DÒÂ`ÚÓÂ`.ÆÂ nË€ÿÅ hÌÂà7ºÂ€dÊ ŽÐ€RÍ È ¶¿Â`ÉÁÂ&ÊÂÎÂÀ`»Âàõđ͠Üà¬ËÂ@°Í€ÂÂÀ‰É ÄÇÂÀ§ÄÂðÒÂࢽ—ÌÂ`“ÊÂÀwÌ©ÉÂà§ÑÂÀôÌ€4ÒÂÏÂÀÈ€áÊÂ@ÀÂ@æÄ eÂÂÏÂ`É€áÊ€dÊÂ`ÉÂà­ÐÂsÒ€ÉÎÂ`‡ÌÂ`þÍ ˆÑÂÀË ÖÄ РÿÒÂÀ)ÙÂà*Ñ€:ÑÂàË˩ɠ€ÈÂÀ0ÃÂ@ÔÇÂà~ÃÂ`ÍÂÀYÑÂ`ÚÓÂÀkÎÂ@¼ËÂ@ ÔÂ@-δÜÂ@¤Ï€‡Ù ŽÐ tÊÂà¡Ò ÇÑÂÀÜÐÂàËËÂ`iÑÂà¹ÎÂ`KֵǠËÂ`9Ù€.Ó‹ÎÂöÑÂ`žÝÂ@ÑÂ`Ë€ Ù >Ó ÓÏ 2ÕÂ@Õ vÔÂÏ€XÌÂà<ÎÂ@ÑÂ`¼ØÂ 5ÊÂ`{ÎÂ`E×€FÏÂà¡Ò€:ÑÂà„ÂÂ`uÏÂà¿Í ЀáÊÂ@ŒÓ€4Ò€ŸÕÂ ÛØÂà$Ò€·ÑÂ`LÁÂ`Â×Â`Â×€±ÒÂà¿ÍÂàÓ ÎÂÀwÌÂÌÂ@?ËÂ`þÍ€(ÔÂÀÜЀÏÍ âÂÂ`oРhÌÂàlÆÂÀkÎÂà$Ò€½ÐÂÀÊÂêÓÂ@¤Ï nËÂ`«ÆÂ hÌÂ@¼Ë€ÃÏÂ@QÈ ýÈÂà­Ð€±ÒÂ@¤ÏÂ`«ÆÂ@¶Ì ÎÂgÔÂÀMÓ —ÙÂ@9ÌÂà¹ÎÂ`ËÂÀÊÓ µÔÂ`ŸÈÂàØÂ`òÏÂöÑÂÀÖÑ€FÏÂà¹Î žÃÂ@]ÆÂÀ‰É ¦ÌÂ@QÈÂ@zÖÂ@ýÕÂ@?ËÂDÅ 5ÊÂgÔÂ@!ÐÂØÖÂ@þÀ€áÊÂÀ/ØÂ@?ËÂàŠÁ Ç€íÈ€áÊÂyÑÂ@ÒÂ@ÓÂÀAÕÂÍÂ`KÖ ÏÂ`ŸÈÂà×ÉÂÀqÍ ²Ê hÌÂÀqÍ€ÛË€”ÂÂ@9ÌÂðÒ ‚Ò ÓÏ ŒÆÂÀƒÊÂÀâÏ ¥áÂÀîÍÂÀMÓÂÀÖÑÂÀeÏÂàÓ€™ÖÂà³ÏÂ@†ÔÂÀôÌÂðÒÂ`ìÐÂ@ýÕÂÀ¸Ö€.Ó ÿÒÂðÒÂ@Ó€RÍÂöÑÂÀwÌÂ@'ÏÂààñÊÂÀšÛ çÖ€:ÑÂ`]ÓÂ@t×Â@†Ô€pȯȠ/ËÂ@¼Ë ²ÊÂ@?ËÂ@’Ò€¥ÔÂ`ÊÂÀÜРÙÎÂ`]Ó‘ÍÂ`É ;ÉÂÀMÓÂ`É€ÿÅÂÀƒÊ DÒÂ@˜ÑÂÀ)ÙÂàÑÊÂà$Ò€ÉÎÂàTÊÂÀƒÊ VÏ ßÍÂÍÂÀ ÚÂmÓÂÀôÌ€ ÙÂ`“ÊÂ@'Ï€øÛÂÀ}Ë /Ë åÌÂÒ×Â@÷ÖÂU× ËÂ`Í ßÍÂOØÂ PÐÂ>ÆÂ )ÌÂüÐÂÀ)ÙÂ@Ó€ÃÏ ÿÒ d×Â8Ç€LÎÂàxÄÂà¿ÍÂ`9Ù Ú ˆÑÂ@ýÕÂ@ÁßÂ@nØÂÌØÂ@ÍÝÂàAâ ¥á€QâÂ`ŒàÂÀŽÝ€WáÂÀ Ú oêÂ@gîÂÀŽÝ &×Â@ŒÓÂàèÛ€QâÂ@ÍÝ€“× çÂ@Áß øè ÉÛ |ÓÂÀdäÂà¬å€¼åÂâÂ`Â×ÂÀ Þ€òÜ€ÖÂàkÛÂ@ÁßÂàeÜÂáÂ`ªÛ¨ÞÂÀLè ØãÂ@ßÚ 4ß cìÂ@>à ÕÙÂÀÚ Ôî€9æÂºÛ€?åÂÀÜÂÝê ‘ÚÂÀ Þ ç ‘ÚœàÂâ–áÂÀ¦Ù 4ßÂ@©ã þçÂ%ßÂÀ¦ÙÂ1ÝÂ@&ä êàÂà¬åÂ`€âÂ`âÂàôÙÂ1ÝÂÀ|à 8Ô€Ú IæÂà²äÂÀÜÂà5ä€ÚàÂ@t×Â@\ÛÂÀáä€þÚ®ÝÂ`ß„äÂ`ÙèÂàšèÂÀÝÂà}ØÂ%ß á×Â`ÞÂàÜÝ€“×Â@©ãÂâÂàÕÂàSßÂäÔ ÏÚ€ÎâÂ ÛØÂ7Ü yÞÂ@çÂàwÙ åÂ`˜ÞÂ%߀KãÂ`’߀]àÂ@ëØÂ€×Â@ýÕÂÀÛåÂ` áÂ`E× á×Â`ÞÂâ äáÂ@ëØÂ€iÞ€uÜÂ=Û€9æÂ@ÓÜ€@ÐÂ@ÇÞÂ`ÞÂàÓ [ã€Èã€æÞ®ÝÂ@ßÚÂÀšÛÂ@hÙÂ`Â×Â`€â€XÌÂ@!Ѐ9æÂÀá䀇ÙÂÀßÂÀ|àÂ`ªÛ€×ÂÀ#Ú€oÝÂ%ßÂ@t×Â`]Ó äáÂ`3Ú (á€ØÂ€ Ù ðßÂ@µáÂÀóáÂOØÂ ÏÚ€Îâ®Ý€ØÂ€þÚ€ØÂ@ÓÜÂ@ÁßÂxæÂà Ö€¶æÂ sßÂÀ¬ØÂ€ Ù ØÂ`†áÂâÂÀšÛÂ@‹è€þÚÂÀ½êÂà ‘Ú€Qâ «à äáÂÀGÔÂ`€â€"Õ XÙ ‘ÚÂ ÛØÂ ÕÙ —ÙÂU×ÂðÒ€ØÂOØÂå€òÜÂØÖÂØÖ XÙ Πá×€ÛËÂàÕ ^ØÂ`¤ÜÂ@'ÏÂÀ²×€:Ñ PЀFÏ ÉÛÂà ÖÂÀwÌ€RÍ€ÛËÂ`øÎÂ`Ë€±Ò®Ý ÍЀ]àÂ@ ÔÂÀwÌ pÕÂàÜÝÂ@ëØÂÀGÔÂ@åÙÂÀMÓ ,ÖÂÀóá€àßÂ@!ÐÂà¹Î€FÏ £×ÂÀÐÒ€@ÐÂ@ŒÓÂ@bÚ€cßÂÀ/ØÂà•ÔÂà›Ó öÞÂØÖÂÀ;ÖÂÀ)ÙÂà ÖÂU×ÂàÊàÂàÓ ŽÐÂ@’Ò ØÂäÔÂÀÛÂàÜÝÂ@!ЀLÎÂÀ¦ÙÂØÖÂÀÜÐÂà}ØÂIÙ€¼å ·ÞÂ`ÚÓÂà³ÏÂ`‡ÌÂÀÈ ¬Ë ÏÚÂàôÙÂ`{Πd× DÒÂ@t× tÊÂ@÷Ö€™Ö€±ÒÂ`?ØÂà•ÔÂÀwÌÂ`ßÂ`ìР.àµÇÂ@¶Ì РPÐÂäÔÂàeÜÂ@ÒÂ`{ÎÂ@€ÕÂ@ÓÜ Ü öÞÂ`Â×€FÏÂ`¶Ù VÏÂ@°ÍÂ@ÂÊ€.Ó€þÚÂ`¼ØÂ@ýÕ 2ÕÂàôÙ £×Â`°ÚÂÀGÔÂ@!ÐÂÀÜЀ"Õ bÍÂ`Â×Â`?ØÂ Ü€øÛ€óÇ€.ÓÂêÓ çÖÂÀÜÐÂ@’Ò ‘ÚÂ`]ÓÂÍÂàØÂaÕÂ`iÑÂ@ ÔÂÀ_ÐÂ`æÑÂ@†ÔÂÀ;Ö‹ÎÂmÓÂÀÈÂ@ÈÉÂ@'ÏÂàãÇ ‚ÒÂ`þÍ€ÉΠ2Õ€ÏÍÂ@žÐ€FÏÂÀ¾ÕÂmÓÂÀÈ€jÉÂÀÊÓÂàNËÂÌÂà¡Ò ‚ÒÂ@žÐ€LÎÂüÐÂ@ÒÂàTÊÂ@ÔÇÂ`KÖÂ`þÍÂàԣʠµÔ ˆÑÂ@’ÒÂà*Ñ€™Ö JÑÂ@ŒÓÂ`iÑÂðÒÂ@æÄÂàHÌ€:ÑÂ` ÌÂ@]ÆÂÀËÂ@-ÎÂyÑÂ@ÑÂÀÊ€áÊÂ@{Á£Ê¯ÈÂsÒÂÍÃÂΠPÐÂàBÍÂÀôÌÂÀ¡ÅÂÀ§Ä VÏÂÀúËÂÀYÑÂàÕ€LÎÂ`¶Ù tÊÂ`iÑÂÌÂÀeÏ€pÈÂà§Ñ Πd× hÌ åÌÂÀ0àëËÂ`ÍÂà<ÎÂÀ$ÅÂ@¤Ï€dÊÂ@˜Ñ€ÃÏÂ`¥ÇÂsÒÂ@?ËÂÀÇ€ÕÌÂ…ÏÂ@¼Ë jÖÂ@ÎÈÂ`™É¯ÈÂà$ÒÂ=ÛÂ`]Ó ÍРëËÂÀÊ ÙÎÂ@ÑÂ@ Ô€.ÓÂÀÆÂÀwÌÂÀÈÂ@ÒÂ`ÎÕÂ@!ÐÂ[ÖÂ@Ñ€«Ó ©ÖÂ@?ËÂ@?Ë€jÉÂ@¤Ï bÍÂà ÖÂ@ÓÂ2È AÈÂ@ѣʀvÇ€vÇÂÓ €ÈÂÀ§Ä€ÉÎÂà$ÒÂà$ÒÂÀîÍÂ@KÉ \΀ÏÍÂ@Ò ¬Ë /ËÂaÕ VÏ ¸ÉÂàÕ »ÓÂÀGÔÂÀ É /ËÂ`“Ê€É΋ÎÂ`½ÃÂÀ_ÐÂàÔÂà³ÏÂÎÂÀâÏÂà§ÑÂ`'Ü»ÆÂ€|ÆÂ ‚Ò€]à )ÌÂ`(Ç€ ÄÂàÕÂÐÂ`“ÊÂ`(ÇÂàZÉ€cß µÔ ˆÑ€LÎÂ@Õ 8Ô€áÊÂ@9ÌÂÀ¦ÙÂÀîÍÂà¹Î ˆÑ \ΠŒÆÂÀúËÂ@]ÆÂÀÊÓÂ7ÜÂà<ÎÂ`WÔ©ÉÂÀË€ŸÕ€±Ò€@ÐÂaÕÂ@ ÔÂ`ìÐÂ@ÈÉÂ8ÇÂ` ÌÂÀè΀“×Â`‡Ì€RÍÂÀkÎÂsÒÂÀËÂ@zÖÂ`oÐÂ@ÓÂ@Ñ ^ØÂàwÙ€½ÐÂàÅÌÂ`™É€.ÓÂÏÂDÅ€jÉÂР&×ÂÀqÍÂ@˜Ñ VÏ€«ÓÂà*ÑÂÀÐÒÂ@ÂÊ ÆÂÀMÓ ;É ¦Ì ëËÂÀÐÒ€ØÂ µÔ ˆÑÂ`ÔÔ PÐÂ`þÍÂ`°Ú€QâÂàƒ× ùÓ FÜÂ@\ÛÂ…ÏÂ=ÛÂà6ÏÂ`]ÓÂÀÐÒ JÑÂÀ_ÐÂ`ÍÂ@ÎÈÂ@ŒÓ ÏÂÀîÍÂàxÄÂt½Â@ÂÊÂ@ŒÓÂ`-ÛÂÀGÔÂ`ÍÂ`ÎÕÂàTÊÂ@ÈÉÂàïÅÂ@hÙÂgÔ Ѐ(ÔÂ@EÊÂÀ ÉÂà*Ñ VÏÂÆÙÂ@åÙ 2ÕÂÀAÕ€¥ÔÂà³ÏÂ`æÑ€LÎÂ@KÉÂÞÕÂÀ)Ù #Í€(Ô ØÂàúØÂ@Õ >ӯȀ@ÐÂOØÂ€4Ò€«ÓÂà6ÏÂ`þÍÂ@ÓÂ@ Ô \ÎÂÀ}Ë—Ì€(Ô pÕ¯ÈÂà× ‚ÒÂÀ;ÖÂÐÂ@˜Ñ 8Ô€ÉΠŽÐÂêÓ vÔ ÐÂЀdÊÂÀAÕÂ@€ÕÂ@ò€:ÑÂÀAÕ ÍРÍÐÂ`æÑ€ŸÕ€·Ñ‘ÍÂÀÐÒÂ@’ÒÂÀ¸Ö€ØÂ )ÌÂ@?ËÂÀèÎÂU×€RÍ #ÍÂmÓ jÖ PÐÂàBÍÂ@ÔÇÂàÝÈ€XÌ€óÇÂÀˆÞÂ`uÏÂ@ÚÆÂàØÂàèÛ €ÈÂ`ÍÂ`Þ 8ÔÂà$ÒÂ@’ÒÂà§ÑÂÀÐÒÂÀÄÔ€óÇÂÀÊÓÂà•ÔÂ`]Ӡπ‚ÅÂ`¼ØÂ`uÏÂ@åÙÂ@°ÍÂ` ÌÂ`E× pÕÂÀ;Ö—Ì ýÈÂÀeÏÂ`oÐÂÀkΠÏ€ØÂ ÓÏ€“×Â@-΀ØÂÌÂ`ìЀØÂ  Ñ ÐÂ@-ÎÂÀÿßÂ@ßÚ—ÌÂ`àÂà›Ó öÞÂàôÙÂÀeÏ RÚÂ@¤ÏÂ`-ÛÂàeÜÂ`WÔÂÀ¬ØÂÀ ÚÂà¡Ò ÉÛÂ@JÞÂ`ÎÕÂ@ýÕ€ ÙÂà5䀨ÂàÕ d×Â@'Ï€XÌÂ`ÎÕÂüР&×Âà$Ò€™ÖÂà¿Í óÔÂ@žÐ PÐÂÀ¾Õ ÿÒ AÈ€«Ó ßÍÂ@ýÕÂÐÂàéÆÂÀÜÂêÓÂà•ÔÂà$Ò€"ÕÂÀYÑÂ`ÊÂ@ªÎ bÍÂÀâÏÂ@€Õ ±ßÂÀ ÞÂàHÌÂ@ßÚ€ÃÏ ëË pÕÂ`(Ç ØÂÀèÎÂ`!ÝÂÀÊÓÂ@°ÍÂØÖÂàMàÂÀ;Ö RÚÂÀAÕÂ@>à€uÜÂàÑÊ€XÌ d×ÂÀ ÚÂ`QÕÂ@÷ÖÂ`E×Â@ÕÂà•ÔÂà§ÑÂ`E×ÂÀ/ØÂ€øÛ vÔ¢ßÂ@ÇÞÂ ÛØÂ@åÙÂ`ÚÓÂ`zã ÕÙÂàÄá´ÜÂÀíâ€{Û ië€FÏ ÇÑÂÀGÔÂÀ Þ€9æÂ@÷Ö ÒäÂ`QÕÂÀß ©ÖÂÀMÓÂà5ä gá€ìÝ€QâÂÀ”ÜÂ@zÖÂ`¼ØÂ€WြåÂÀŽÝÂ@»à 4ßÂCÚÂOØÂ ”ÏÂÀAÕÂÀôÌ£ÊÂàÐ߀ Ù pÕÂ@ÙÛÂaÕÂÀÊÓÂ`ÈÖÂÀ/ØÂÀGÔÂ`‡Ì ÏÚ€LÎÂÀ”ÜÂ`Í  ÑÂ`?ØÂÀ/ØÂ@ëØÂ ŽÐÂ`oÐÂ@QÈÂ@!ÐÂà Ö€ìÝÂ@ßÚÂÀ¾ÕÂ@VÜ ÏÚÂ`-ÛÂàØÂ`æÑÂÀ¦ÙÂàÕÂ`ÍÂÒ×Âà­Ð€RÍ á×Â@ÑÂ`àÒÂÀŽÝÂÀ#ÚÂÒ× XÙ€·ÑÂÀ5×ÂÀSÒ ^ØÂ`‡ÌÂà*Ñ€áÊÂ@ò åÌÂ`Í ÕÙ çÖÂ`KÖÂàÕÂà‰ÖÂÀÖÑ …ÜÂ`-Û ¯ÕÂ=Û€™Ö ùÓÂÀ ÞÂÀ²×ÂàBÍÂà¡ÒÂÀÜÐÂà Ö€ÉÎÂàqÚ€@ÐÂ`ÊÂ`ÍÂöÑÂÀ/ØÂ 2Õ  Í€ÛËÂà¡ÒÂ@ñ× óÔÂÀMÓÂÀqÍÂöÑÂÀ5×ÂÍ ¬Ë ùÓÂà€“×ÂàØÂ`-ÛÂ@˜Ñ€@ÐÂÀAÕ yÞ€×ÂÀ;Ö ÛÂ7ÜÂàâÜÂäÔ ”ÏÂàâÜÂÀíâÂÀ5×ÂyÑ )ÌÂÐÂÀkÎÂà¡Ò ÇÑÂOØÂ€½ÐÂÀ¸ÖÂÀ²×Â`cÒÂ@ÍÝ ŸâÂàÕÂ@bÚÂ`WÔ 8ÔÂÀÄÔÂ@÷Ö€uÜÂàGá ÏÚÂÀÊÓÂ@zÖ€þÚ Ý JÑÂ@9ÌÂðÒ 2ÕÂà$ÒÂgÔ @Ý &× d×ÂaÕ€™ÖÂÏÂ@¶Ì \ÎÂ`3ÚÂÀ5×Â@-ΠÁÒÂ+ÞÂ[ÖÂ@9ÌÂ`žÝ€×Â@'ÏÂÀ)ÙÂ`¶Ùœà€Ú Uä ÕÙ€àßÂ@bÚ ùÓ çÖ€±ÒÂÀMÓ€“× .àÂU×ÂÀ”Ü€‡Ù màÂêÓÂ[Ö FÜÂÀùàÂ@†ÔÂ`€â€±ÒÂ@ÓÜÂÀšÛ d× íÕÂsÒ d×€?åÂ1ÝÂ@ªÎÂ@ŒÓ |Ó€vÇÂàƒ×Â`cÒÂ`KÖÂ`¼ØÂÀGÔÂ@JÞÂ@PÝ ÝÂàØÂ |ÓÂÀ¾ÕÂàwÙÂÀÜÐÂ@ Ô€ÃÏÂ`-ÛÂàÕÂÀ ÉÂ`ÈÖÂ`¶Ù ‚Ò ÙÂÀjã€uÜÂËÂ`þÍÂàÔÂÀSÒ ‘ÚÂÀÿßÂIÙÂΠ ÑÂÀ”ÜÂ@ÙÛÂ`?ØÂ@ëØÂ@t×Â`°Ú XÙÂÀß ÏÚ 2ÕÂàSßÂàØÂ€¼å€ØÂ=ÛÂ@bÚÂÀˆÞ ÏÂàqÚÂàØÂ pÕÂ`]Ó€¥ÔÂÀ;ÖÂ@ÒÂ`øÎÂaÕÂ@÷Ö ‚Ò ÉÛÂêÓÂ`ÔÔÂàÕÂ@ýÕ ÝÂU×ÂsÒÂ@nØÂà›ÓÂÀˆÞ€½Ð€Ú ÿÒ XÙÂÀšÛÂàÜÝ ÙÂ@÷Ö ØÂ@†ÔÂàîÚÂ@Ò  Ñ ÉÛÂ@˜ÑÂË ‹ÛÂÀÛÂÞÕÂàkÛÂÀÐÒ £×ÂÀGÔÂÀ²×€óÇ ÒÂ`!Ý ™ã€oÝÂ@åÙÂ@ÍÝÂà›ÓÂ`¶ÙÂêÓÂ@’Ò íÕÂêÓ€4ÒÂà‰ÖÂàèÛÂÀMÓÂIÙÂàÓÂÒ×ÂàîÚ ÉÛÂÀúËÂ+ÞÂ=ÛÂ`†áÂ@ŒÓÂà‰ÖÂyÑ€™ÖÂÀß ÁÒÂ`ÍÂ1Ý€‡ÙÂ`9ÙÂ`þÍÂ`ŸÈ€™ÖÂàÊà€ŸÕÂàÔÂ@hÙÂ1ÝÂ`uÏÂ@hÙ€:Ñ pÕ€±ÒÂ@†ÔÂ`ÚÓ vÔ ñÊÂÀGÔÂ`æÑÂàÕÂÀÜÐÂÀ;ÖÂà›Ó€Ú Ë€½ÐÂ@žÐÂ@ÓÜÂà Ö ˆÑ‹Î DÒÂÆÙ€þÚ (áÂ@¤ÏÂ@-ÎÂ`“Ê€:Ñ óÔÂÆÙÂÀ/ØÂ ÓÏÂ@ ÔÂ`-ÛÂ`ÍÂ`ìРtÊ€±ÒÂÀ/ØÂ  ÍÂÀkÎÂà<Πd× ˆÑÂÀËÂ@ÔÇÂ@ÑÂÀSÒ€ŸÕÂÀGÔ€«ÓÂà§Ñ ÍЀÃÏ ½Ý ñÊÂ@]ÆÂ@3Í ÓÏÂÀîÍÂ`‡Ì€4ÒÂ`“ÊÂÀkΠ£×Â&ÊÂà*ÑÂ`ìЩɀFÏÂÀqÍ ñÊÂÀÇÂÀƒÊÂU×ÂЋΠ¾ÈÂàõÄÂ`‡ÌÂà<ÎÂ`“ÊÂ`Ê YÄÂ@-ÎÂöÑ€FÏÂÇÄÂ@ÈÉ€FÏ AÈÂ@9ÌÂàÀÂËÂÀYÑÂ@cÅ  ÍÂ@°ÍÂÐÂÀîÍÂ@¤ÏÂ@ ÔÂàZÉ€ÏÍ€ÕÌÂàÑÊÂOØÂüРëË tÊÂ`"È€ÏÍ ýÈÂ@3Í—Ì€·Ñ€:ÑÂ@÷Ö€™Ö€«ÓÂ@ÔÇ ˆÑ ÈÂ`X¿Â ÊÆÂ`Í  Í€dÊÂΠ»ÓÂ`°Ú ÁÒ VÏ  Ñ åÌÂÀÆÂÀwÌÂ`]ÓÂÀ¾ÕÂà¹Î PÐÂÀ¬ØÂ`ÈÖ€½ÐÂà<ÎÂÆÙÂ@ÓÂÍÂsÒÂ@¶ÌÂ`:ÄÂàxÄÂà×É€ÃÏÂàTÊÂ@ÎÈÂÁÅÂÀ)Ù€×Â`ÔÔÂsÒÂЀ½ÐÂ`àÒÂÀÊÓ ÖÄÂàÕ ÙÎÂ@QÈ€ÕÌÂ@9ÌÂ@ªÎÂ@cÅ ¦ÌÂÀÐÒ ‚ÒÂU×Â` áÂ`?ØÂ€XÌÂ@?˯ÈÂ&ÊÂ@!ÐÂÀú˵ǀçÉÂÀSÒ €È ’Å tÊÂÀ•Ç‹ÎÂ>ÆÂÀôÌÂÀÊ ˜Ä€¥ÔÂà6ÏÂ`ÉÂ`ÉÁ €ÈÂÀèÎÂ`ÈÖ€4ÒÂ@Ó ÙÎÂàÕÂà•ÔÂÀ¸Ö€(Ô€ÉÎÂàúØÂ LÛÂàfÇÂ@Ó ëËÂ` Ì ÍÐÂ`ÎÕÂÀSÒÂäÔÂÀâÏ€.Ó€ØÂ`æÑ€^ËÂ`ìÐÂà*Ñ zÉÂÀèΠÏÂ@¤ÏÂ`“Ê€:ÑÂ`ìРÓÏ ÙÎÂàBÍ€:ÑÂÀÈ€(ÔÂà§Ñ ÍÐÂ@ÒÂÀwÌÂ`?ØÂ€·Ñ€ŸÕ€«ÓÂÏ€vÇÂ@uÂÂàËËÂ@3Í ŽÐÂ@ ÔÂ@Ñ 2ÕÂà›ÓÂ`ËÂ ÊÆÂ€¥ÔÂ`òÏ€dÊ JÑÂÀƒÊ &× ©ÖÂ`]ÓÂ@t×ÂÀ¾ÕÂÍ bÍ ÕÙ€4ÒÂ@ÎÈÂÀÜкÛÂ`àÒÂ`ÍÂ@?ËÂ`KÖÂàûÃÂÀkÎÂ`ŸÈÂyÑÂ`]ÓÂÀÊÂ@ýÕÂ2ÈÂ@3Í ÙΠÏÂÀ}ËÂÀÆÂ`cÒÂ@†Ô€pÈÂ@ýÕÂÀ_Ѐ×Â`WÔ€øÛÂ=Û ÒÂÀ²× PÐÂ`ìР ÍÂ@ßÚ ÒÂà×ÉÂËÂ`æÑ &× öÞÂ@†ÔÂ`þÍÂ@'ÏÂ@€ÕÂÀwÌ ùÓ‘ÍÂÀYÑ€±ÒÂà<΀ŸÕÂ`ÚÓÂ@ÒÂ[ÖÂàúØÂ@ÎÈÂ@hÙ ^ØÂÀÛÂIÙÂÀqÍ ýÈÂÀÜЀ:Ñ€.Ó€±Ò€±Ò  ÍÂ@˜Ñ€×ÂРDÒ€XÌ tÊÂ`4ÅÂ@EÊ ^ØÂ@?ËÂ@Õ pÕÂ`ÍÂàØÂ á×Â`¼ØÂà›Ó íÕÂ`ìРGÇ zÉ |Ó€@ÐÂ@'ÏÂÀeÏ ËÂ@?ËÂÀwÌ ùÓÂà<ÎÂàBÍ€XÌÂÀMÓÂÀîÍ€ÃÏÂ`]ÓÂÀÚÂà*Ñ íÕ á× VÏÂàÕÂ` ÌÂ`{ÎÂ`àÒÂˠǀÿÅ€íÈ ýÈÂàfÇÂ@KÉÂ@VÜ óÔÂ`uÏÂÀGÔÂàBÍ >ÓÂËÂ@KÉÂ@ÎÈÂÀ ÉÂÀkÎÂÀwÌÂ@˜ÑÂ`F  ÍÂ@hÙÂÀMÓ€RÍÂÏÂ`±ÅÂ`oÐÂà‰Ö€dÊÂ`cÒ€ÖÂÀâÏÂÀ¡Å µÔÂàÔ ¬ËÂÀèÎÂ`oЀ«ÓÂÀ_ÐÂ,ÉÂÀƒÊÂÀk΀|ÆÂ ùÓÂ`iÑÂyÑÂà$ÒÂ,ÉÂàlÆÂ` Ì ýÈ ÷ÉÂÁÅ€ÕÌÂÀÇ ”Ï ÜÃÂÍÂ@KÉÂÀËÂà›ÓÂÀÊӠπùÆÂ@ÔÇÂßÀÂÀƒÊ€ÉÎÂ@ÎÈÂ@¼ËÂ@Ñ tÊÂyÑ ²ÊÂðÒ€|ÆÂà*ÑÂÀúË ÄÇÂ`ÔÔ #Í€«ÓÂ`ìÐÂ`ŸÈÂàûÃÂÍÂ`:ÄÂàÀ ¸ÉÂ@°ÍÂÀ•Ç€:ÑÂà¡Ò—Ì žÃÂ`ìР\ÎÂà0ÐÂÀ ÉÂ@oàYÄ ýÈ€‚Å pÕ #Í ÄÇÂ`™É€@ÐÂÀwÌÂ&Ê ÇÂÀ$ÅÂÀAÕ ÓÏÂ@ÚÆÂ@ÂÊÂ`ÔÔÂ`òÏÂ@’ÒÂêÓ bÍ€½ÐÂÀË€±Ò bÍÂÌÂàÓÂÀƒÊÂ`"ÈÂ@ÎÈÂÓÂÂÞÕ  ÑÂyÑÂÀAÕ€ØÂ`WÔÂ@ÒÂOØÂ€ÕÌÂÀúËÂàãÇÂÀîÍÂÓÂÂÀÊÓ€ÕÌ VÏ nËÂÀúËÂ@’Ò€.ÓÂ`Í šÎ€·ÑÂ`ªÛÂsÒÂÀ}ËÂà•Ô ÁÒ€±Ò€Ö€ÃÏÂà¹ÎÂÀGÔÂàØÂà¹Î€‚ÅÂЀFÏÂà*Ñ€½ÐÂ@ÚÆÂà§ÑÂÀÊÓÂüРvÔ pÕÂ@3ÍÂ`{΀çÉÂàÕ ŒÆÂ Ë íÕÂàôÙÂÀôÌ€«ÓÂ`uÏ DÒÂ@ÕÂ@-ÎÂ@’Ò DÒÂ@Ó€RÍÂ`°ÚÂ@ŒÓ ŽÐ #ÍÂ@ÂÊÂ`3ÚÂ`ÍÂ&ÊÂÀË€ØÂ€¥ÔÂ`cÒÂÀÖÑ bÍ 8ÔÂaÕÂà×ÂðÒÂaÕÂÀôÌÂ`E×€iÞÂ`{ÎÂ@ ÔÂËÂsÒÂ@ÓÜ€ÃÏÂà*Ñ ;É ‚Ò )Ì Ï ¬ËÂ`]ÓÂÀ)ÙÂÀÐÒÂ@iÄÂ`{΀“×€{ÛÂ`'Ü€àßÂΠÏÚ€‡ÙÂâ ÕÙ€·ÑÂÀÚÂØÖÂ`{ÎÂ`“Ê ,ÖÂ@ªÎÂ`òÏ€±ÒÂ`?ØÂÀ#ÚÂ@zÖ ©ÖÂ`ÔÔ jÖÂ1ÝÂU×€.Ó d×ÂÀ›ÆÂàÓÂÏÂ@¤Ï€·ÑÂ@°ÍÂ@QÈÂ@QÈ >Ó çÖÂ`ìÐÂà Ö ÜÂÀâÏÂÀ}ËÂ`°ÚÂäÔ JÑÂàéÆÂàBÍ€«ÓÂÀôÌ çÖÂ@žÐÂÀ¸Ö€.ÓÂ`˜Þ€ÃÏÂ`àÒÂ@åÙÂàwÙ ^ØÂ@ŒÓ€ŸÕÂàYÞÂàîÚÂàúØÂ nË Ò JÑÂÀ¾ÕÂ=ÛÂ`þÍ ÙÎÂ`E×Â`Â×€4ÒÂ@EÊÂ ÛØÂ`ÎÕ .à ÙÎÂÐÂÆÙ ¯ÕÂà‰ÖÂ@ÙÛ‘Í ˆÑÂÎÂàƒ×ÂàÄá ÙΠÛÂà0ÐÂ`àÂàqÚÂ@ÕÂ`ÔÔ ÎÂÀÄÔÂàÜÝ ^ØÂ@3ÍÂà³Ï d×Âà‰Ö€ŸÕÂêÓÂ@JÞ€ÚÂ`3Ú—Ì Ï ÉÛÂÌÂ`QÕÂàÔÂÞÕÂ@Ó€¥ÔÂ`cÒÂ@ ÔÂyÑÂÀ›ÆÂ@-ÎÂ`ÚÓÂöÑ ¦ÌÂÍÂàrÅ ¸ÉÂ`ÎÕÂàHÌ ˆÑ )ÌÂÀGÔ€FÏÂà§ÑÂàÝÈÂ`¶ÙÂ@Ò ²Ê óÔ‹ÎÂ@ ÔÂàÕÂ…ÏÂàâÜ€(Ô ²Ê ùÓÂ@‡¿Â€(ÔÂ`ÎÕÂ`þÍÂ@ñ×Â@ÑÂsÒ Ù  ÍÂà³Ï€FÏÂ`ÔÔÂÌØÂ`àÒÂ@-ÎÂÀËÂ@ÑÂÀË ÎÂà­Ð Ò d×€±Ò >Ó #ÍÂÀ¡Å€ÕÌÂÀMÓÂÀÈÂ`‡Ì 8ÔÂ`Í€×ÂàfÇÂЀ·Ñ ÁÒ zÉÂ`øÎÂ`(ÇÂÀqÍ µÔ‘ÍÂ@¶ÌÂ&Ê€(Ô€RÍ€™ÖÂ`uÏ€^ËÂà$Ò€ÚÂÀ}Ë åÌ bÍÂÀîÍ ŽÐ vÔÂÒ׺ۀ½Ð \ÎÂÀ_ÐÂ@?Ë ÉÛÂ`iÑÂÀÜÐÂêӯȀÛË€jÉ DÒ€“×Â`oÐÂÀúËÂ`øÎÂÐÂäÔÂà×ÉÂà³ÏÂ` Ì€“×€«ÓÂ@PÝ€.ÓÂöÑÂà6Ï€.ÓÂyÑÂÀ5× Ò ;É #ÍÂ`æÑ€ÃÏÂ@'ÏÂ`WÔÂÏÂàÊàÂ`iÑÂÀMÓ Ë ¦Ì ²ÊÂÀ}ËÂ`òÏ LÛÂÀ5×Â@†ÔÂ&ÊÂÀ¸ÖÂÀÜЀþÚ åÌÂêÓÂaÕ€íÈÂË íÕÂ`QÕÂÀeÏÂ`oРJÑÂàúØÂ‘Í )Ì ÙΠ)Ì pÕÂ`þÍ ÇÑ £×Â@¼Ë€òÜÂÀ/ØÂ€ÃÏÂÀ}ËÂaÕÂÀMÓ€^Ë ÙÎÂ@bÚ€@РØÂ@ÈÉÂÀGÔÂ@ñ×ÂØÖ€uÜÂ@hÙ€ŸÕÂР…ÜÂàeÜÂ`'ÜÂ@ýÕÂ`˜ÞÂÆÙÂ`¶Ù íÕÂ`WÔÂÀ)ÙÂØÖÂ%ß nËÂÀÛ€ŸÕÂà³ÏÂ`ÔÔÂÀwÌÂÆÙÂ@ÍÝÂÀYÑÂÆÙ FÜÂÀÝ  Ñ€uÜÂÌØÂgÔÂ`'ÜÂàMà€Wá |ÓÂ@ÒÂ%ßÂ+ÞÂ@æÂàqÚÂ@÷ÖÂÀˆÞÂ@ªÎÂ@t×Âà§Ñ Þâ åÂÀvá öÞÂÀvá 8Ô€4Ò€ìÝÂ@£ä ,ÖÂ1ÝÂÀXæÂà¬å€iÞ ÿÒÂàqÚÂOØÂÀšÛÂ`žÝÂ@ßÚÂûå ÉÛÂÀRç “ä "âÂ@µáÂ@VÜ ÕÙ ,ÖÂà›Ó®ÝÂÆÙÂðÒ¨ÞÂÀ|à ÌåÂÀÕæÂ £×Âàƒ×Â`¤ÜÂ@¯âÂ@&äÂ`'ÜÂàÐß £×€òÜ 4ßÂ`KÖÂÀˆÞÂ`-ÛÂ@nØÂàîÚÂ@!Р¯Õ€Ú ½ÝÂ`’ß äáÂÀÜÂÀ ÚÂ`˜Þ®ÝÂÀ¬ØÂ@bÚÂ@åÙÂÀpâÂ@,ãÂ@bÚ€øÛ üÝÂ@é UäÂÀ߀ÚÂ1ÝÂàØÂÀ;Ö ã€{ÛÂÞÕÂÀçãÂÀÊÓ .àÂ` á LÛÂ`!Ý \΀‡ÙÂ` á€iÞÂÀ”ÜÂàYÞ ÌåÂ`E×€ÔáÂ@—æÂ XÙ ‘Ú ð߀WံæÂ%ßÂ@&äºÛÂ@\ÛÂ@ÓÜ gáÂ@è€uÜÂ`QÕ —ÙÂ@>àÂÀ_ÐÂÀÐÒ€4Ò ^ØÂ@ÇÞ´Ü ä€Ú®ÝÂ@åÙ€ ÙÂ@¯â ÏÚÂäÔÂàîÚÂÀ:ë 7é «àÂ`âÂàƒ× ÜÂÀÛåÂ`ñä µÔ ÕÙ (áÂäÂ@µáÂàšèÂ@ñ×Âá ‘Ú€þÚÂ`€â ¥áÂà ØãÂâÂ@DßÂÀFéÂÀ)ÙÂÀ²×ÂÀÝÂ@bÚ ÁÒ ÁÒ€Wá ½ÝÂÀ#Ú€Ö€ÚÂ+ÞÂ@8áÂåÂÀÐÒÂÞÕÂà×Â@zÖÂOØÂ >Ó Ú€ìÝ ØÂàÖÞÂ`-ÛÂ`ßÂ`¤ÜÂàšè FÜÂÀ²×Â@8áÂ@»àÂ`øÎ á×€uܨހ“×Âà×ÂÀ”ÜÂ`÷ãÂÀÃéÂ ÛØÂ@’ÒÂ`]Ó ÍÐÂäÔÂ@t×Ââ "â …Ü€¥ÔÂÌØÂ`?ØÂ€þÚ ŸâÂ@ÍÝÂ`ŒàÂàMà€‡ÙÂ`žÝÂ`3ÚÂ`ñäÂCÚÂ@åÙÂàôÙÂ7ÜÂàeÜÂ`WÔ @ÝÂÌØÂ gá nËÂÀôÌÂlèÂÀÿ߀òÜÂà}ØÂÀváÂ@åÂ`zãÂÀ¬ØÂÀ²×ÂÀÿß üÝÂ@ëØÂâ 4ßÂ@ÍÝÂÀÏ瀓נ@ÝÂ@ÕÂÀÝÂ`3ÚÂÀRçÂ@8áÂ@DßÂ@ÙÛÂà¡Ò€iÞÂIÙÂÀAÕÂIÙÂ`˜Þ€"ÕÂ`†áÂ`QÕ 5ÊÂ`øÎ€™ÖÂà$ÒÂ`ËÂ@žÐÂüÐÂ@˜Ñ ØÂà­ÐÂÆÙÂàšè ÍРçÖ€«ÓÂ@ÙÛÂ@>à€‡Ù åÌÂ@3Í >Ó€×Âà§ÑÂ`ÈÖÂàeÜÂ`WÔÂ`WÔ |Ӯݠ±ßÂsÒ ØÂ€iÞÂÀ;ÖÂ`°Ú d×ÂÀ#Ú€oÝÂÀèÎÂàÂÀMÓÂ`3Ú £×ÂÀ²×Â`˜Þ€ŸÕÂà}ØÂËÂà¡ÒÂ@!ÐÂÀ_ÐÂàÕÂ2ÈÂ`WÔ ΠÙ€@ÐÂÍÂÀGÔÂ`ÚÓ ˆÑ€LÎÂ`™ÉÂàËË€ÕÌ íÕ jÖ€ìÝ€ÔáÂ@ÓÂÀ_ÐÂ@ÓÜ íÕÂÀGÔÂà­Ð ðß DÒ —ÙÂ@bÚÂÀ;ÖÂ`àÂàÕ PÐÂÀâÏ ¸É¨ÞÂ@ÓÜ ½ÝÂsÒ vÔÂ@ÍÝ ùÓÂ ÛØÂàÓ ,ÖÂ@ç´ÜÂ@Ñ€4ÒÂ@ÁßÂCÚ £×€ÚÂ@˜Ñ€L΀RÍ ©ÖÂ`†áÂÀ)ÙÂàÂàMàÂ%ßÂ@ëØÂÀŽÝ ÕÙ€¥Ô …Ü€{ÛÂ`KÖÂCÚÂàYÞÂÀ‚ßÂ@bÚ VÏÂÒ×Â@hÙÂ`ß d×€:ÑÂ@÷ÖÂàeÜÂ`ÚÓÂ@ ÔÂ`àÂÀ”ÜÂ`žÝÂ1ÝÂðÒÂÀAÕ …ÜÂ@ å ð߀‡ÙÂ=ÛÂ`-ÛÂ@»àÂ`'Ü nË€ Ù ØÂ`bçÂ`÷ãÂ@˜Ñ ÃÜ€EäÂ`÷ãÂÀ^å€òÜÂ@hÙÂ@˜ÑÂ`9ÙÂU× |Ӵܺ۠¥áÂ`3ÚÂÀÚ ±ß “äÂÀíâÂàÂ`täÂà#ç ÕÙÂ@2â€à߀«ÓÂ@t×Â`ªÛÂ`¼ØÂ`'Ü€uÜ€.ÓÂ`â€ØÂ ·Þ€ÚàÂU× ÁÒÂäÔÂàØÂàâÜÂÀSÒÂÀ)ÙÂ=ÛÂ@ëØÂ åÂ@>àÂÀ²×€ìÝ€Ú ã gáÂà}ØÂ@zÖ€ ÙÂ`Jë€Úà€øÛÂàØÂ€ÚÂ@nØÂà}ØÂ`3ÚÂÀŽÝ yÞ€]àÂàÄáÂ@Õ ·ÞÂäÂ`¤ÜÂÐÂ@ÕÂ@¶ÌÂ@žÐÂ@˜ÑÂ`ÍÂöÑÂ`žÝÂÀÄÔÂ`ÈÖ€×Â`žÝ üÝ€ÖÂ@ßÚ ÉÛ€ Ù€ Ù€{ÛÂ`¤ÜÂ@Ó€{Û :ÞÂ@ýÕÂ`°ÚÂ`ýâ ‘ÚÂàÔÂà§ÑÂ@ýÕ€øÛ ½ÝÂ`PêÂ@t× màÂÀRç ðß ‘Ú ùÓÂ+Þ (á Û FÜÂ@ÙÛÂgÔÂàÕ€øÛÂ@Á߀øÛÂ`KÖ ÝÂÀÚÂ@ñ× ÚÂÀÝÂ@ÍÝ€òÜ€ÎâÂàAâÂÀšÛÂ`¶Ù çÖÂ@åÙ ÃÜÂüÐÂ@zÖÂ@t×ÂÀÛ ÃÜÂ@ýÕÂ`¼ØÂÀÖÑÂàSßÂgÔ ‘Ú &×ÂÀ)ÙÂ=Û Û ¯ÕÂ@žÐÂà Ö £×Â`°Ú íÕÂØÖ ÕÙÂ1ÝÂIÙÂàAâ mà€cßÂ@bÚÂ@2âÂÀ‚ß XÙÂ@÷ÖÂ`KÖ RÚÂÀÜÐÂ@©ãÂ`?ØÂ@zÖ ÕÙ íÕÂ`ìРÝ€Ú€×ÂÀ¦ÙÂÒ×Â`†áÂÀÚ ÚÂ@3Í á×Â`ÈÖÂàèÛÂ@’ÒÂÀ¦ÙÂmÓ íÕ …Ü ÕÙÂ%ß ‹ÛÂ`ÔÔÂà¡Ò ÉÛ ÍРΠÚÂ`3Ú ÙÂ`cÒ€ØÂ@»àÂ`Â× ÙÂàÔÂ@Ñ€«ÓÂÀ5× 2ÕÂÀ¬ØÂ RÚÂÀ¸ÖÂË ÏÚÂ`{ÎÂ@PÝ —ÙÂ@DßÂÀ5×Â@žÐÂàÝÈ€‡ÙÂ`àÒÂ`°ÚœàÂÀ¸ÖÂà¡Ò äáÂÀGÔ ØÂ µÔÂ@ÒÂÀ5×ÂÀôÌ á×€‡Ù€™ÖÂ,ÉÂaÕÂ`E× ðß óÔ€¥Ô€“×ÂÀ)ÙÂÀÊÓÂ`uÏ ,Ö vÔÂà*ÑÂ@øÁÂÍÂàÕÂÀúË ØÂÀGÔÂ`?ØÂ ©ÖÂà¡ÒÂÐÂ`cÒÂ@ÚÆÂÀôÌÂ`iÑ AÈ nËÂ@nØÂàôÙÂàÕÂyÑÂ[Ö JÑÂ@ÒÂ`àÒ \ÎÂàBÍÂ@Õ DÒÂ@øÁÂ`æÑ bÍÂ@hÙÂà×ÉÂÌØÂ€øÛ \ΠØÂ@VÜÂà‰ÖÂÀkÎÂ`cÒÂÀ¾Õ€“× 2ÕÂ@ñ×ÂÀÜÐÂ`ÔÔ€ÉÎÂêÓÂà­Ð€½ÐÂ@ÓÂÀôÌ jÖÂüÐÂ`]ÓÂ`'Ü ˆÑ ÍÐÂÀÖÑÂ@9ÌÂ@nØÂ ØÂà‰ÖÂÞÕÂ`KÖÂaÕ VÏÂÀÖÑÂÀÛÂ@ŒÓÂ@ÒÂ ÊÆÂ £×Â@°ÍÂÀÐÒ€{ÛÂàÔÂ@¤Ï ÏÚ€WáÂ@ñ× jÖ€‚ÅÂ@€ÕÂØÖ€ÖÂ@ªÎÂàÔÂ@nØÂ`KÖ @ÝÂU×Â`9ÙÂàÝÈ ÿÒ çÖÂCÚÂ@ªÎÂ@ªÎ€ØÂàeÜÂà}ØÂà­Ð LÛ ÛÂà•Ô€ÕÌÂàƒ×ÂàúØÂ€ Ù€(ÔÂüÐÂÀ/ØÂ@VÜÂàÊà€ìÝÂ@'ÏÂØÖÂÀ)ÙÂ@9ÌÂ@VÜÂ`E× µÔÂ=Û€“×Â@åÙÂ`E×Â7Ü€±Ò´ÜÂà‰Ö ãÂ`E×Â@zÖÂaÕÂÒ×Â@ýÕ ²Ê€¥ÔÂà×Â`ÔÔÂ`WÔÂÀSÒ€ÃÏÂ@\Û ÙÎÂÒ×€@ÐÂàÔÂàÖÞ MÆÂ ¦ÌÂ` ÌÂ@ýÕ /ËÂΠÒ€×€ÖÂ…ÏÂÀîÍÂØÖ #ÍÂ`¥ÇÂÀÊÂàBÍ€{Û€¥Ô€Ú GÇÂgÔ€þÚ€^ËÂÀ}ËÂàNË /Ë€×€«Ó £×Â`ÍÂ`ÉÂ`æÑÂ@ñ× nËÂ`“Ê  Ñ€^ËÂÀ)Ù åÌÂÀÖÑ bÍÂàÕ€ÏÍ€@ÐÂ@3ÍÂ@ÂÊ€ÖÂ`WÔÂÀÈÂÀ)Ù yÞÂÀ;ÖÂ` ÌÂà6Ï XÙÂ@€ÕÂaÕÂÏ ÒÂà}ØÂ ‹ÛÂÀÚÂÀ²×Â@’ÒÂÀAÕÂüÐÂ`cÒ |ÓÂÀGÔ€(ÔÂ@t×Â@JÞÂà‰Ö 8ÔÂÀ)ÙÂüÐÂaÕ€(Ô |ÓÂàúØÂÀÜÐÂÀ¸ÖÂàÕ ùÓ VÏ€RÍ ÛÂàúØÂ`!ÝÂ@hÙÂ@t×Â@€Õ hÌÂÏÂ`ìÐÂàÔÂ@’ÒÂÀwÌÂЗ̀ØÂ ØÂÀÊÓ aâ ·ÞÂ`àÒÂ@!ÐÂ`«ÆÂ€·ÑÂ@'ÏÂÀ¦ÙÂ`ìÐÂàÑÊ |ÓÂÀ‰ÉÂüÐÂ`ÚÓ \΀"Õ€ÕÌ ;ÉÂà­ÐÂÀGÔ #ÍÂ`"ÈÂÀÐÒÂÀkÎÂÀ¦ÙÂàNËÂÀÊ )Ì ‚ÒÂÀîÍ€ùÆÂ@'Ï tÊÂÀ¾Õ ÒÂÀYÑ€RÍ€dÊ ÍР€ÈÂÀÖÑ‘ÍÂâÂÀóá FÜ€ÃÏ )Ì ¬ËÂÀkÎÂÀ#ÚÂ@zÖÂà6ϠˀØÂà§ÑÂ@°Í /Ë ^ØÂÀAÕÂ@hÙ ÙΠåÌ XÙ RÚÂ@3Í€½Ð )ÌÂ@ÑÂ`3Ú РùÓÂàÅÌ Ù΀:ÑÂ`øÎÂàÕ€¥ÔÂÀ;ÖÂà×Âà ÖÂ@ŒÓÂ@ÒÂàkÛ ÿÒ ÉÛ PÐÂ`?ØÂaÕÂ@ßÚÂ@†Ô JÑÂÀMÓ€ØÂÀôÌ PÐÂà¿Í€#ÀÂ…ÏÂÞÕÂ`ÎÕ ‘Ú€:Ñ ÏÂÀèÎÂ@÷Ö€½ÐÂ@¤ÏÂÀîÍÂÞÕÂÀÈÂ@ÈÉ€«Ó ÕÙ ÿÒ ÕÙ€ŸÕ ÍÐÂ@9ÌÂàÅÌ€¥ÔÂ`E×Âà ÖÂ…ÏÂ`QÕ©ÉÂ`Ë€4ÒÂ@VÜÂ1ÝÂ`¤ÜÂà§Ñ€ÉÎÂ`°ÚÂ`ÎÕÂ@’Ò hÌ€:ÑÂ@hÙÂÌØÂà6Ï€LÎÂÀÚÂàúØÂÀÝÂÀ ÚÂ`†á€(ÔÂÌÂ@!Ѐ.ÓÂàÕÂà³ÏÂÀGÔÂ@ÓÜÂ@hÙ ‹ÛÂ`ÈÖÂ`?ØÂ€.ÓÂ`?ØÂàS߮݋ÎÂ`!Ý |Ó VÏÂ@ñ×ÂàNË jÖ FÜÂÀ¸ÖÂÀMÓÂ@€Õ ÃÜ  ÑÂË€«ÓÂàqÚÂüÐÂ@zÖÂ@’Ò ˆÑÂÀ¦Ù šÎÂÀqÍÂ…ÏÂà¹ÎÂàÔÂÏÂÞÕ µÔ ñÊ€jÉ€«ÓÂêÓÂà‰ÖÂÀ ÞÂÀSÒÂüÐÂgÔ€‡ÙÂà*Ñ ñÊÂ@ÍÝÂàYÞÂÀAÕ€×€‡ÙÂà_ÝÂâÂ`ÚÓÂà}ØÂ RÚÂÀ5×ÂmÓÂàèÛ FÜÂàîÚÂ ÛØÂ`iÑÂ@ Ô€(ÔÂ@÷ÖÂØÖÂÀˆÞÂ@ÒÂ@ëØÂ &×Â@€Õ€‡ÙÂ@t×€™ÖÂ`¶ÙÂÀSÒÂØÖÂÀÖÑÂ@Õ ŽÐ€4ÒÂ`æÑÂyÑ ÐÂ@ÕÂà³ÏÂOØÂ€áÊÂÐÂIÙ€FÏ ÚÂÀ¦Ù DÒ ”Ï hÌ€æÞ ¯ÕÂÀ²×Â@nØÂàÓ€¥ÔÂ`þÍÂ`]Ó ÁÒ >Ó ÓÏÂàôÙÂ@°ÍÂÀÚÂàÕÂÀ5×Â ÛØÂ€Ú d×€™Ö JÑÂÀ¸Ö€ÃÏ ØÂÀ)Ù @ÝÂ`Â×ÂàúØÂ@zÖÂÀGÔÂÀ#ÚÂàÕ ^ØÂàƒ×ºÛ ˆÑ 8ÔÂÀÊÓ€±Ò Ý€ìÝ ÛÂ@ ÔÂÀYÑÂÀYÑÂ@†Ô Π|ÓÂÀYÑ ”Ï€íÈ€“×€:ÑÂ[ÖÂÏ€‡ÙÂÀMÓÂàúØÂ€ìÝ ÉÛÂ@ÙÛÂ`'Ü ÙÎÂ`uÏÂàúØÂ ëË€ŸÕÂ@hÙÂÆÙ íÕ€?åÂ@PÝ€@РLÛ€(ÔÂöÑ ÐÂ@ÕÂ`ÍÂà¿ÍÂ`ìÐÂ@Ò€±ÒÂ`‡Ì€^Ë€ŸÕ€™ÖÂ`?ØÂ€"ÕÂà<ÎÂÀˆÞ€"Õ ÁÒ€·ÑÂàÕÂmÓ ‘Ú á× µÔÂ@DßÂà•ÔÂàâÜÂÀ¦Ù ùÓÂÀùàÂ`¤Ü ÉÛÂ`KÖ€·ÑÂ@’Ò ÿÒÂ@ ÔÂà6Ï ÙÂÀ¸ÖÂÀ;ÖÂ`°ÚÂÀ#Ú ÏÚÂ@ñ×ÂàèÛÂ@ŒÓ€¶æÂÀÿßœà€™ÖÂà6Ï ”ÏÂÀÜ ÏÚ¢ßÂÀÚ üÝ€‡ÙÂ`]Ó€ ÙÂÀ5×€Ú  Ñ€óÇÂÀÐÒ€òÜÂÀ²×ÂÀÝ vÔ€«Ó &×ÂÀGÔÂêÓ€{Û€QâÂ`bç vÔÂ@EÊ€‡Ù ÉÛÂ@nØÂ |Ó€þÚÂ`ÔÔÂ`uÏÂ`'Ü XÙ€™ÖÂÆÙ€"ÕÂÀ;ÖÂ`¥ÇÂ@åÂ`ÎÕÂIÙ€WáÂàGáÂÀÜ€.Ó€±ÒÂàØÂÀÊÓ PÐÂ`Í ÌåÂàúØÂ@ÂÊ :Þ ØÂ`{ÎÂ`cÒ ÝÂÀGÔÂ`WÔ€ÚÂ` Ì€ØÂ`¼ØÂ`uÏ d×Â@¤Ï€¥ÔÂ`KÖÂÀ¬ØÂ@€ÕÂà Ö …ÜÂ@nØÂ aâÂyÑÂyÑ€ÚÂàØÂàØÂ@†Ô \ΠöÞ€ŸÕÂ`iÑÂ@¤ÏÂ`øÎ &×ÂU×ÂÀ¾Õ ÙÂà6Ï vÔÂ@ÒÂàwÙÂàâÜ€FÏ—ÌÂÀ ÚÂ@ñ×ÂÀŽÝÂ@ëØÂÀ5×ÂmÓÂàqÚÂà¿Í€jÉ vÔÂàNËÂàØÂ@¤ÏÂÀSÒÂ@ÓÂÀÜ ˜ÄÂÀ/ØÂ€½Ð íÕÂÞÕÂ`¼ØÂ…Ï ²ÊÂ@ Ô€¥ÔÂÀÜ çÖÂ`WÔÂ@ÈÉ )ÌÂÀkΠýÈÂÀŽÝÂ@÷ÖÂäÔ€±ÒÂ`?ØÂ bÍÂ@9ÌÂÀYÑÂÀMÓ VÏÂ@'ÏÂ@Ñ€ŸÕ ¬Ë€:ÑÂyÑÂà¹ÎÂ`òÏ ßÍ DÒÂÀ/ØÂ€™Ö€XÌ ßÍÂÀ_ÐÂ`uÏÂ`™ÉÂàËË€:ÑÂ`æÑ VÏ€óÇÂÀÜР¬ËÂà6ÏÂàBÍ ýÈÂ@ýÕÂ@ÒÂ@†ÔºÛÂ@˜ÑÂ@'Ï€·Ñ á× ùÓÂÀqÍÂÀSÒ ‘Ú—ÌÂ`žÝ vÔÂÀÊÓ ¯ÕÂ`“Ê ¦ÌÂ@ÓÂ&ÊÂÀ/ØÂÒ× 2ÕÂàÑÊÂ`KÖ€¥Ô€RÍÂ@!ÐÂÍÂ@!РÿÒÂ@¤Ï‘Í‹ÎÂÀ_ÐÂÀÜÐÂÀMÓ /ËÂà`ÈÂ`ÈÖÂà³ÏÂüЀoÝÂÀ5× ¬ËÂ@€ÕÂ`ÎÕ DÒ ÁÒ \΀"Õ ËÂ@¤ÏÂ@žÐ )ÌÂ@ÂÊÂ@°ÍÂà¿ÍÂÀ¸ÖÂ@ªÎÂàËËÂ…Ï )ÌÂà}ØÂà¡Ò 2Õ ¾ÈÂÀôÌÂ@¼ËÂ@’Ò€FÏÂ@'ÏÂ`¶Ù |ÓÂ`Í€ Ä YÄÂ@cÅ€·ÑÂmÓ€uÜÂ`æÑ ÙÎÂ`KÖ ÏÂÀôÌÂ,ÉÂ`‡ÌÂ@†ÔÂà¡ÒÂÀ#Ú ÙÎÂ`ìЀjÉ ˆÑÂàîÚ Û :Þ @ÝÂÀ¸Ö€XÌÂ`oÐÂU×€XÌÂ[ÖÂÀ‰ÉÂüÐÂÀÛ ÁÒÂÀÛ \ÎÂà¿Í€@Р¬Ë€ÃÏÂ`àÒÂ@?Ë€É΀ØÂ`-Û PРýÈÂaÕÂàÓÂÀâÏ óÔÂÀîÍÂà‰ÖÂyÑÂÀAÕÂ`øÎ DÒÂà$Ò @ÝÂàÊàÂ@hÙ ñÊÂêÓÂ@åÙÂ`àÒÂ@-ÎÂÏ ØÂsÒÂÀMÓ 2ÕÂÌØÂ€.Ó€«ÓÂà}ØÂ€±ÒÂÀYÑÂÍÂ@?ËÂ`ÚÓÂÀÖÑÂ`oÐÂ`E×Â@ÒÂ@¤Ï€ÚÂ`ÔÔ€(ÔÂàîÚ€4Ò€.Ó ©ÖÂ@žÐÂ`cÒÂ@ÇÞÂ`9Ù ØÂCÚÂäÔÂÀÜÂ@ßÚÂ`þÍÂÍ ÁÒÂà*Ñ€ùÆÂÀYÑ 2ÕÂàwÙÂà¸ãÂ@†Ô€“×Â`Â×Â@ÍÝÂ@÷ÖÂ`{ΠÐÂàTÊ ÝÂ`àÒ —Ù€±ÒÂ@åÙÂ@hÙ »Ó >ÓÂ`]Ó ÃÜ€ØÂàSß ãÂ`ªÛÂCÚ€ Ù€{ÛÂ@nØÂ ¯ÕÂ@ñ×Â`iÑÂÀ¬ØÂOØÂ ùÓ€«ÓÂ@ÑÂ΀RÍÂ@ÑÂàÂÀ²× zÉÂ`WÔÂ@ Ô ©ÖÂ`]Ó &×€«Ó€ŸÕ ÙÂÀSÒÂ@nØÂ€ÖÂ`ìЀ±Ò ¦ÌÂàTÊÂÀ/ØÂ@ÙÛÂà­ÐÂàÔÂ`QÕ Ù€"ÕÂà¿ÍÂà Ö )ÌÂÀËÂÀúË ;ÉÂ`øÎ€“× ‹ÛÂ`-ÛÂÀMÓ€WဥÔÂ`ÔÔÂÀ²× |ÓÂ@t×ÂÀ¸ÖÂ@ÑÂà§ÑÂÀ¸ÖºÛ µÔÂ@ÈÉÂ`þÍÂ`-Û ”Ï ÍÐÂÀâÏ ¦ÌÂÀ_ÐÂà Ö€½Ð€@ÐÂà}ØÂ hÌÂ`Ê€FÏÂ`ÚÓÂÀ_ÐÂÀAÕ ‹ÛÂ@ñ× óÔ€ØÂ pÕÂ@žÐ JÑ PÐÂ@KÉÂàÅÌ€FÏÂ`¶ÙÂ`æÑ DÒÂÀÐÒ€±ÒÂ@¤Ï íÕÂàÔÂðÒ Ï tÊ ÄÇÂ`òÏ€óÇ ˆÑ jÖ »Ó€ÉÎÂÀîÍ€½ÐÂàTÊ ÍР¸ÉÂà­ÐÂàNË Рá× ÁÒÂ`uÏÂ@Ò PÐÂàÅÌÂ`Ê ¦ÌÂà$Ò  Í‘ÍÂà¹ÎÂÎÂ`ÚÓ€×ÂÀYÑ€çÉ€çÉÂ&Ê íÕ€:ÑÂ`(ÇÂ@˜ÑÂÍ RÚ ØÂ€ÉÎÂ`àÒ€ÖÂÀ;ÖÂÀèΠ/Ë€jÉ /ËÂÀGÔÂ`oРíÕÂ@Ò ÐÅÂÌØÂðÒ µÔ µÔ VÏÂÀ²×ÂÀAÕÂÀÊÓ šÎ£ÊÂËÂÀÖÑÂ@KÉÂ`±Å€"Õ€“×€FÏ Ù΀ÏÍÂÀSÒÂÌØÂ@¶ÌÂà×É óÔÂ@÷ÖÂ@÷Ö€ÏÍ €È€íÈ ßÍÂ@ÑÂ@ÔÇ ÙÎÂ`ìР¸ÉÂ@ñ×€½Ð€^ËÂ`ËÂàNËÂÍ 4ßÂ`?ØÂ  Ñ ÐÂà¿ÍÂ`9ÙÂ`oЀ.Ó >ÓÂÀÇ ëËÂüЀ"Õ€øÛ€ÛË ¯ÕÂyÑ€ÃÏÂ`ÈÖÂàwÙÂÀAÕÂ`cÒÂ@°ÍÂmÓÂ@ýÕ—ÌÂ ÊÆÂ@ÂÊ ÄÂöÑ€.ÓÂà›ÓÂmÓÂÍ ¯Õ€Ú ÿÒÂ`æÑÂàÅÌÂ`"ÈÂ@ÈÉÂà× £×‹ÎÂIÙÂÀSÒÂàHÌÂ@¼ËÂà­Ð DÒÂÀ‰ÉÂ`òÏÂà³ÏÂÀÈÂÀÜРŽÐÂÀYÑ ØÂ`Í€RÍÂÀYÑ€cßÂ`ÎÕÂÀ5× ˆÑÂ`ÎÕÂÀ_ÐÂàœ¾ÂÀÖÑÂ@ ÔÂ@ÈÉÂÀ_ÐÂ@ñ×ÂÀâÏ |Ó jÖ ØÂ€Ö óÔÂêÓ€þÚÂàÓ€XÌÂà ÖÂOØÂ DÒ bÍ |Ó »ÓÂà¡Ò |ÓÂöÑÂ`Þ€þÚ  Í \ΠóÔ £× ,ÖÂ@!З̠©ÖÂ`?ØÂÀ”Ü€“×Â`þÍÂ@˜ÑÂIÙ 2ÕÂ@ŒÓ >ÓÂàNË€@ÐÂ@Ó€™Ö€ÉÎÂÀÊÓ |ÓÂ`iÑÂ`ÎÕÂÀMÓ€·ÑÂà$ÒÂ@†ÔÂ`'ÜÂ@ßÚÂCÚÂ@zÖÂÀ”ÜÂÀ²×€ Ù £×ÂÏ ©ÖÂÀ;ÖÂà6ÏÂà0ÐÂ`ÎÕÂà§ÑÂàúØÂÀ²×ÂÏ€"ÕÂöÑÂÀ5×Âà‰ÖÂ2ÈÂ@!ÐÂ@nØÂ XÙÂÀÚÂÀÐÒ yÞÂ`!Ý FÜ ¯ÕÂ@\ÛÂgÔ€øÛÂ@£äÂ`?ØÂ ˆÑÂIÙÂÀAÕÂ@bÚÂ@žÐÂ@ÍÝÂäÔÂ@ßÚÂ@ÓÂ@åÙÂàÅÌÂðÒÂ@ŒÓÂ`oÐÂ@ÓÜÂàwÙÂØÖ€ìÝÂàÕÂÆÙÂÀAÕÂOØÂ`]Ó ˆÑ€æÞ€.ÓÂàHÌ XÙ€™ÖÂà ÖÂ@ýÕÂÌØÂ ÃÜÂ`9ÙÂaՋ΀ڀòÜÂ@PÝ€?åÂIÙÂäÔÂ@-ΠëË€×ÂàÕ \ÎÂ ÛØÂ€×€:ÑÂ`iÑ nËÂàÔÂà$Ò€¥Ô ÓÏÂÀkÎÂÞÕ€:Ñ RÚÂÀ/ØÂàNËÂà¿ÍÂà›ÓÂ`KÖÂ@hÙÂÀpâ®ÝÂàÅÌ ØÂ ”Ï \ΠÛÂ`°ÚÂàÄá‹ÎÂCÚÂ`-Û€Ö ™ã …ÜÂÀ)Ù€XÌÂ`9ÙÂÀAÕÂ`cÒÂ@ŒÓÂ`¤ÜÂ`Â×Â`Â× ŽÐÂ@bÚÂàÔ€ÏÍÂЀØÂ`ÔÔ ˆÑ€«ÓÂ@¶ÌÂà§Ñ —ÙÂà‰ÖÂ@ëØÂ@˜ÑÂäÔÂ@ßÚÂàwÙ€ÛËÂàÓÂ@t×ÂÀÚÂÀAÕÂêÓÂðÒÂ ÛØÂ \ÎÂÀAÕÂ`ÎÕ JÑÂà§ÑÂ`ÔÔÂ@]ÆÂ`!ÝÂÀÜ€ùÆÂ€jÉÂ`ìÐÂmÓÂgÔÂ`ÚÓÂ`QÕÂ`ÚÓÂ`øÎÂà<ÎÂÀ_РÇÑÂàÅÌÂÀ#ÚÂà×€ÏÍ …ÜÂÞÕÂÀÐÒÂ@¼Ë€:ÑÂ`WÔ GÇ íÕ ùÓÂàƒ×Â@Ó‹ÎÂ`{Π8Ô ¬Ë ˆÑÂüÐÂà*ÑÂmÓÂ`þÍÂàÕÂÀˆÞÂ@€Õ ¯Õ »ÓÂ`·ÄÂ@t×ÂÐÂIÙ ÚÂ@ëØÂ ¯ÕÂ@t×Âà}ØÂÀÆÂ`ÚÓ ©ÖÂ@'ÏÂ@¤ÏÂ@°ÍÂ`“ÊÂ`ÉÂ`ìÐÂàHÌÂ@ÔÇÂ`ìРd×Âà‰Ö >Ó ‚Ò ëËÂ`ÔÔÂÀYÑ 3À hÌ šÎÂÀ Ú€LÎÂ@¤ÏÂ`ÚÓÂÐÂàrÅÂàHÌ€½Ð€FÏÂà`ÈÂ@zÖÂÀÖÑÂàÂÂ7ÜÂ@†ÔÂÀ5×Â…ÏÂà×ÉÂÆÙ ùÓ€“×ÂÀÜÐÂ@VÜ ë˵ÇÂsÒÂÀYÑÂ`]ÓÂ` ÌÂ@ëØÂ@÷ÖÂ@DßÂ@nØÂgÔÂ`E×Â`ìÐÂÀYÑ ýÈÂÀMÓ€¥ÔÂ@bÚ çÖ€ÚÂsÒ ^ØÂ`E×ÂÀqÍÂ@†ÔÂÀúËÂÀúË€ÏÍÂ`àÒÂU×€FÏÂ@ÑÂÍ Ë ²Ê€:ÑÂЀ.Ó ÓÏÂ@Õ #Í JÑÂyÑ€4ÒÂàYÞÂ`ÚÓÂÀ‰É€ÿÅ€^Ë ²ÊÂàõÄÂU×ÂsÒ zÉÂsÒ »ÓÂàéÆÂ@WÇ€FÏ ÇÑÂÀGÔÂ8Ç åÌ€±ÒÂàÅÌ—ÌÂÀÄÔ |ÓÂIÙÂyÑÂà*ÑÂàNË 5ÊÂÀî͋΀ÃÏÂÀMÓÂÀîÍÂ@3ÍÂÀ5×€(Ô—ÌÂ@-ÎÂ@]ÆÂ€ÃÏÂ@ñ×Âà ÖÂà­ÐÂyÑ hÌ _ÃÂà}ØÂ ¸É #Í 5ÊÂ`øÎ€ÚÂðÒÂ`uÏÂÀîÍ€ÉÎÂ@ßÚ€4ÒÂÀ5×Âà*ÑÂÀ¸Ö ÿÒ€“×Âà¿ÍÂÀwÌÂÐÂàYÞÂàƒ×Â@ÂÊ  ÑÂàBÍ VÏ ÐÅÂ@ªÎ ùÓÂÀÇ ÁÒÂ@?ËÂÀ0ÃÂ&ÊÂ`iÑÂ`ìÐÂ`æÑÂ`·ÄÂ@àÅÂÀ‰É€“× 8Ô Ë ÍÐÂÀšÛÂ…Ï ¬Ë ’ÅÂÀÐÒ ÍÐÂ`Ê€øÛÂ&ÊÂà6Ï óÔÂàBÍ »ÓÂ`ÍÂ@žÐÂ@ŒÓÂÀMÓÂàâÜÂÀ¬ØÂàrÅ€íÈÂà­ÐÂ@ÈÉÂüЀ:ÑÂÀ;ÖÂ@ëØÂ ÚÂ@-ÎÂ`þÍÂ@nØÂ—Ì >ÓÂ@˜ÑÂ@¤ÏÂÀË ØÂ@hÙÂ@µá µÔÂ@!ЀíÈ ÇÑ ÙÎÂ2ÈÂÀeÏÂ`ìÐÂàƒ×€ØÂ ßÍÂ@€Õ‹Î ,Ö€Ö &×ÂÀYÑ ÒÂ`¼ØÂ@¼ËÂ@’Ò XÙÂ@ÑÂ`ÎÕ VÏÂÀúËÂOØÂ`òÏ€uÜÂ`ÊÂàBÍÂ`‡ÌÂäÔ ÁÒ€¥ÔÂÀ ÚÂ`æÑÂ@¤ÏÂÀ¾ÕÂàèÛÂ@°Í tÊ€ÖÂ`°ÚÂàÔÂ@ÓÜÂÎÂÒ×ÂÀ¾Õ ÙÂ`3Ú ¥áÂ`€â RÚÂÀÐÒÂÌØÂ@ªÎÂÀß íÕÂêÓÂ`°Ú XÙÂàÅÌÂ@uÂÂêÓÂ`æÑÂ@nØÂ`uÏÂmÓÂÀ¾ÕÂÌØÂÀAÕÂÀ|à ¯ÕÂ`Ë€4ÒÂ@°Í JÑÂ`¼ØÂ ¯Õ ØÂ`àÂÀÊÂà§Ñ€ÛËÂàqÚÂÀ‚߀ØÂ`WÔÂ@’ÒÂ@ÑÂ ÊÆÂ€pÈÂÀ;Ö \ÎÂàƒ× ØÂ VÏÂ`¼ØÂàZÉÂÀeÏÂàîÚÂ@åÙÂêÓ‘ÍÂ`?ØÂ`žÝÂ@bÚÂ`¶ÙÂÀÄÔÂÀÐÒ jÖÂÀÜÐÂ`Â×ÂöÑÂÀÚÂà LÛÂàÔ vÔÂàkÛÂ@÷ÖºÛÂ@ñ×Â`'ÜÂðÒÂÀÊÓ jÖ PЀXÌÂàlÆÂ ¬Ë |ÓÂÀâÏÂäÔÂsÒÂ@’Ò‹ÎÂ@ÕÂ`¼ØÂàeÜÂU×€.Ó€±ÒÂÀÄÔÂ@'ÏÂà$Ò€4Ò€ ÙÂ`ìÐÂüÐÂU× ÓÏÂ@¤Ï 8Ô€.ÓÂÀ ÉÂÀ¾Õ€LÎÂ`cÒÂ`]Ó ‘Ú ßÍ€@ÐÂà×Âà¹ÎÂ`ìЀØÂ@ŒÓÂ`¼ØÂ€øÛ€ØÂÞÕÂ` ÌÂaÕÂ@9Ì  Ñ µÔÂàúØÂ  ÑÂÀYÑ€(Ô íÕÂà*ÑÂsÒ€ÕÌÂÀîÍÂà×ÂäÔÂ`ËÂÀkÎÂÀÿßÂËÂÀúˋΑÍÂ@ÒÂöÑ ÿÒ µÔÂà­ÐÂ` ÌÂ`¶Ù ©ÖÂyÑÂÀ Ú ÍÐÂÀ¸Ö jÖÂÀ‰ÉÂàÅÌÂ ÊÆÂ`æÑÂ`ÞÂ`Â×ÂaÕÂÀ¾Õ /ËÂÀqÍÂà•ÔÂ@?ËÂ@ýÕÂ@ßÚ ÐÅÂ@ŒÓ †ÇÂÀwÌÂÀeÏÂàHÌ€“×ÂàÑÊÂ@-΀·ÑÂÀAÕÂ@æÄ ÇÑÂ@?Ë !ÃÂ@ÓÜÂàÅÌÂÀYÑÂÀAÕ ÏÂУÊÂÀYÑ @ÝÂðÒÂ`òÏÂàÕÂ[ÖÂ@QÈ€ÛË€(ÔÂmÓÂgÔÂÐÂ`oÐÂ@ýÕ 2ÕÂÞÕÂà6Ï ;É ˆÑÂaÕÂà§ÑÂ@ŒÓ€™ÖÂ@÷ÖÂ@-ÎÂ@°Í€ÏÍ€@РnË ÇÑÂÀ5×Â`àÒ€ÏÍ ¯Õ€ŸÕÂ`ÎÕ ñÊ€LΠJÑ vÔ€Ú ÙÎÂÀ É PÐÂàÕ ëËÂÀ_РPÐÂ`ìЀ"ÕÂÀMÓÂàYÞÂ@ªÎÂbÀÂ@ÑÂà ÖÂ@†ÔÂ`Â× ”ÏÂ`æÑ€áÊÂ`WÔ Ï )Ì 2ÕÂÀÖÑÂÞÕÂ@÷Ö€LΠ»ÓÂ@°ÍÂ@>àÂ@†ÔÂ`æÑ ²ÊÂ`ÍÂ@˜ÑÂÀîÍ PЀ™ÖÂ@VÜÂÀÐÒÂàÓÂÀYÑ€XÌÂÀèΠ#Í€(Ô »Ó€“× ˆÑ hÌÂàÔÂaÕ |Ó€«ÓÂ`E×Â`]ÓÂ@÷Ö vÔÂ@°Í #ÍÂ@!Ѐ.Ó ‚ÒÂ@EÊ€·ÑÂàâÜÂ@’ÒÂà›ÓÂ@EÊ€ÉΠ ÍÂà ÖÂàØÂ`ÔÔ DÒ€uÜÂ@\Û šÎ ëËÂÏÂ@åÙ€ÉÎÂÀYÑÂÀÝÂ`'ÜÂÀYÑ€RÍÂ2ÈÂ`ÍÂ@VÜÂ`Â×Âà}ØÂ€ŸÕ ;É ±ß ØÂ ˆÑÂ@ÓÜÂàwÙ ÙÂàeÜÂ`ÎÕÂÏÂgÔÂ`WÔÂÀÖÑÂOØÂ€"Õ€«ÓÂðÒÂàqÚ ÓÏ ÿÒÂ`¼ØÂ@åÙÂÀÐÒ —Ù€ŸÕ >ÓÂ@åÙ yÞÂÀ/ØÂOØÂ@ÑÂ@ÓÜÂOØÂ@Õ€“×ÂØÖ äá ãÂ@\Û ÛÂÀ/ØÂ sßÂàôÙ€ÚÂàÓ€(ÔÂ`KÖ€iÞÂ`¤Ü Ù &×ÂÀwÌ€ÖÂÀÐÒÂ`€â€«Ó€Wá ^ØÂ@ŒÓÂ@åÙ pÕÂ@!Р¯Õ (áÂÀÄÔÂàèÛÂÒ×Â@žÐ JÑ€çÉ€·Ñ ^ØÂ jÖ ‹ÛÂÀÊÓÂ@ÑÂÀÖÑÂ`9Ù FÜÂà ÖºÛ öޮ݀òÜ ÝÂÀ¬ØÂ@Õ »ÓÂ@nØÂ óÔÂ`¶Ù Lۢ߀ڠd×Â`cÒÂ@’ÒÂÀ)Ù€“×Â@˜Ñ€·Ñ hÌÂüР8ÔÂ~åÂ@Ò´ÜÂÀŽÝÂüÐÂ@zÖÂ`¤ÜÂ@bÚÂÀ;ÖÂ`9Ù üÝÂU×ÂÀMÓÂ`iÑÂ@ýÕ XÙ —Ù bÍ \ÎÂà•ÔÂÀ¸Ö ÙÂàwÙÂ@†ÔÂüРùÓÂÀÊÓ€‡ÙÂ@÷ÖÂÀ¬ØÂ`øÎ aâÂàÕ€:Ñ £×Â@°Í pÕÂ`QÕ ÈÂüЀÖÂØÖ€ÚÂ`KÖ ÎÂÀÄÔÂ@Ò€þÚ óÔÂÀË ÿÒÂgÔ€“×ÂÀeÏÂÀ¸ÖÂ@Ò /ËÂäÔÂÒ×€ÃÏÂ@Õ ÇÑÂ`ÍÂ@ÙÛ РÈÂ`ÎÕÂà¡ÒÂÏ ‚Ò jÖ€"ÕÂ`'ÜÂ`ìÐÂà<ΠßÍ 8Ô€·Ñ åÌ€Ôá —ÙÂ`cÒÂÀÜÐÂ`àÒ 2ÕÂÀî͋ΠØÂÀ_ÐÂàôÙÂÀ¦ÙÂÀAÕÂàkÛÂ`KÖÂ@¤Ï€4ÒÂ`ÔÔÂàÓ€±ÒÂ@€ÕÂüÐÂÀ¾ÕÂÀôÌÂÀ”Ü çÖ€ÏÍÂàeÜÂ@ªÎ€‡ÙÂ`ÈÖ€ŸÕÂàTÊÂà¹ÎÂ`æÑ€ìÝÂðÒ |Ó€:ÑÂ`æÑ ÜÂ`¼ØÂ@Ñ—Ì‘ÍÂÀ ÞÂ@!ÐÂ`cÒÂ`¼ØÂÀÜÂ@3Í€XÌÂÆÙÂÞÕÂÀYÑÂÏÂΠtÊÂÀeÏÂÐÂà6ÏÂ@˜ÑÂàôÙÂðÒÂÀ É€dÊÂÀMÓÂ ÛØÂ€½ÐÂmÓÂ@!ЀŸÕÂöÑ ÓÏ€šÁÂÀâÏ ñÊÂÀâÏ ²Ê VÏÂÀÈÂ`àÒÂÀ5×€¥ÔÂ`þÍÂ`ÉÂ@ÈÉÂ`þÍ€(ÔÂÀ¸Ö€¥Ô‘ÍÂà0ÐÂüРvÔÂàÕÂÀè΀½ÐÂ@ÓÂ`ÔÔ ÚÂÀôÌÂ@ªÎÂ@àÅÂà¿Í ‘ÚÂàãÇÂ`ŸÈ nËÂ2ÈÂ@ÕÂ[ÖÂÀèÎÂ@¤Ï |Ó€ÃÏÂÀÊÓÂàZÉÂöÑÂ7ÜÂ@†ÔÂ@?Ë tÊÂàãÇÂÀôÌ€jÉ€@Р—ÙÂ8Ç€“×€FÏÂ`!ÝÂà­ÐÂÀGÔÂà§ÑÂÐÂÀkΠAÈÂà6ÏÂÀƒÊ ëËÂÀwÌÂàZÉ DÒÂ@˜Ñ ”ÏÂ@¤ÏÂ`(ÇÂ`¤ÜÂÀAÕÂà§Ñ€ÏÍ€áÊÂÀâÏÂ`ÍÂ@˜Ñ ÙÎÂÀ;Ö€¼åÂCÚÂ ÛØÂ€dÊÂ&ÊÂ@-ÎÂ@¤ÏÂÀúË d×Â`°ÚÂäÔÂ`‡ÌÂÐÂÀúË çÖ€]àÂ`3ÚÂ`òÏÂÀÊÓ€™ÖÂ`òÏÂ@!РˆÑ€ØÂÍ /ËÂ`iÑ€.Ó VÏÂÀ_РÿÒÂà•Ô€ÛË ’Å€XÌÂöÑÂÀ5× )ÌÂÀGÔ ©ÖÂÀ)ÙÂ`3Ú€LΠtÊÂàÑÊÂÀ;ÖÂÀMÓÂÀèÎÂ`ìР&×€Ú€ˆÄ€ÏÍÂüЀ·ÑÂ`‡Ì bÍÂÀèÎÂ@ëØÂ@zÖ JÑÂÀÖÑÂà›ÓÂ`WÔÂàHÌÂàôÙÂ@-ÎÂ@'ÏÂ`òÏÂà×É€@ÐÂäÔ€«ÓÂà­ÐÂ@'ÏÂ@hÙÂ@Ó  ÑÂÀÊÓ DÒÂ[ÖÂ`Ê€ÏÍÂÀ;ÖÂsÒÂà¹Î´ÜÂÀSÒÂà³Ï —ÙÂ`øÎÂÌØÂ`QÕÂ@†Ô€"ÕÂÀÄÔÂ`ÔÔÂÀ5×€½ÐÂ@?ËÂÀÄÔÂàNËÂ@bÚÂ`àÒ€(ÔÂ` á ùÓ öÞÂ@¤ÏÂ@ŒÓÂ`ìРµÔ ßÍ€·ÑÂCÚ€ÃÏÂ@¤ÏÂÀÜÐÂ`ßÂà•ÔÂÀ#ÚÂ@’ÒÂ@ŒÓ€¥Ô ÍÐÂðÒÂ`¤Ü ¦Ì€‡ÙÂàBÍ PÐÂÐÂÀ¸Ö ÙÂÀÊÓÂÀYÑÂÀ#ÚÂàÕ d×ÂÀSÒ€½ÐÂ@hÙ íÕÂ`E× 8Ô€LΠñÊ nËÂ@'Ï &×€ØÂ óÔÂ`ªÛÂgÔ€:ÑÂ[ÖÂàBÍÂöÑÂ`àÒÂà¹ÎÂÀÄÔÂÀ Ú€¥Ô€:ÑÂ`ÞÂÍÂÀÐÒÂÞÕ )ÌÂààbÍ /ËÂêÓ€uÜÂ`àÂ`{ΠñÊ 2ÕÂOØÂ€"ÕÂÀ§ÄÂ`ÎÕÂOØÂ LÛ PÐÂÀ ÉÂ`ÔÔ ùÓ ÏÚÂ`]ÓÂ@hÙ ,ÖÂ@¤ÏÂÀMÓ´ÜÂàÓ€±ÒÂÀ;ÖÂÀ_ЀøÛÂà³Ï€ÿÅÂàHÌ »Ó€ÚÂ@hÙÂ`ÎÕÂ`øÎÂ`iÑ JÑÂ`QÕÂ@¶ÌÂ@ñ×ÂÀGÔÂà*Ñ )ÌÂÀÊÓÂÀ/ØÂËÂà0ÐÂ@÷ÖÂ@!РAÈ PРØÂ@ñ×Â`¥Ç€×Â>ÆÂ€@ÐÂ@PÝÂàwÙ€ÕÌÂàTÊÂ@?Ë€±Ò€RÍÂ@3Í ¸ÉÂÀîÍÂ`uÏ PЀFÏ XÙÂ@-΀±Ò ©ÖÂ`?ØÂ€:Ñ ŽÐÂàúØÂ—ÌÂàHÌ çÖÂÀÜР”Ï€"ÕÂ`ÔÔÂ`ËÂÀkÎÂ@ÎÈÂÀÈÂ@3Í€@Р&×€@ÐÂöÑÂà6ÏÂ@!Р/Ë€±ÒÂ@-΀ÖÂÀ§ÄÂ@-ÎÂ@3Í ØÂ ¯ÕÂà×ÉÂÐÂàqÚÂà³Ï€dÊÂ`LÁÂÀ‰ÉÂàÑÊÂ@¼Ë€ØÂ >Ó ÿÒÂà$ÒÂÀwÌ€^ËÂ@†ÔÂ`Ë )ÌÂÀ;ÖÂÀYÑÂ@÷ÖÂêÓÂ@Ò‘ÍÂÀqÍÂ8Ç€ÏÍ |Ó€ÛËÂ`Í‘ÍÂàNËÂ@’ÒÂÞÕ€× ŒÆÂ 5ÊÂV€ùÆÂ ;ÉÂàÔÂÀÄÔÂÀ/ØÂÀÜÐÂ`@àGÇÂàBÍÂ@cÅ šÎ€jÉÂ@€Õ€LΠ²ÊÂ@òÂÂ`"ÈÂÐÂÀâÏÂ`òÏÂ@æÄÂÀwÌÂÀwÌÂÀ•Ç ÐÅÂÀ‚ßÂ@t× ^ØÂ µÔÂ`“ÊÂÀMÓÂÀGÔÂÀkÎÂÀôÌÂÀúËÂàÀFÏ LÛÂÀAÕ PÐÂÀÐÒ€FÏÂ`øÎÂ@ÎÈÂ@'Ï ’ÅÂÀÊÂÀeÏÂ@ÎÈÂ,ÉÂàïÅ  ÑÂ`QÕÂ@Ò ßÍÂÀÊÓÂ@-ÎÂà`ÈÂ@!ÐÂÀSÒÂ`ÎÕÂàÕÂÀSÒ€.Ó ÁÒ€«ÓÂüРšÎÂ@'ÏÂ@KÉÂàHÌÂÀÄÔ€ùÆÂ€ÃÏÂÀÈ ÄÇ žÃÂ@ëØÂ DÒÂ@Ñ ñÊ \ΠÅ—ÌÂ`ÍÂàBÍÂÏÂ@VÜ€ Ù GÇ€ŸÕ€RÍÂ`WÔÂ@zÖÂ@9ÌÂ`ÚÓÂÀGÔ ,ÖÂ`“Ê tÊÂ@©ã®Ý ëË€ÚÂÀÜ FÜÂ`iÑ Ò ŽÐÂÀúËÂ@-ÎÂ`QÕÂ`¶ÙÂÍ 2ÕºÛÂ`ÔÔÂÀÖÑÂüÐÂ@ßÚÂàÑÊÂÀ_ÐÂ`uÏ€.Ó€ÃÏ ÁÒ ¦Ì 8ÔÂ@÷Ö jÖ ÓÏÂ@Ò€ÉÎÂ`àÒ€·ÑÂsÒÂ`.ÆÂ ‚Ò ÙÎÂÐÂàNËÂ`(Ç€«ÓºÛÂ@ Ô zÉ€cß >Ó ‚ÒÂêÓ€^ËÂ`òÏ€.Ó µÔÂ@ýÕÂÀAÕÂà`ÈÂOØÂ€ØÂ€“×ÂÀMÓ€ŸÕÂÀ}ËÂØÖ ßÍ ÁÒ€·ÑÂàqÚÂÀÐÒÂ@÷ÖÂ`øÎ PÐÂ`KÖ &×ÂÀ ÚÂÀ5×Â`æÑÂ@nØÂ`?ØÂäÔ ”Ï€"ÕÂÀÜÐÂaÕ€ŸÕ  Ñ µÔ‘ÍÂ@ÑÂ`ÚÓÂØÖ€iÞ ØÂ€@ÐÂÀ Þ ÏÚ µÔ€“×€(Ô »Ó ^ØÂ€ØÂÀ¦ÙÂàwÙÂU×ÂÀ¦ÙÂà0РÕÙÂ@Áß VÏÂÀÛÂ@!ÐÂÀôÌ Ò ÚÂÀGÔÂÀ¸Ö >ÓÂ@ŒÓ Ï #ÍÂ+Þ ¯ÕÂÀeÏÂ`3ÚÂIÙ ‹Û ÏÚÂüÐÂ`òÏ ‚Ò€«Ó »ÓÂ@÷ÖÂ`9ÙÂÀ‚ßÂÀèÎÂ@’ÒÂÀwÌÂÐÂÀ”Ü€¥ÔÂÀSÒÂ@ÈÉÂÀAÕÂ`!ÝÂàqÚÂàÐßÂà0Ѐ"ÕÂÀ|àÂà‰ÖÂaÕÂà<ΠÓÏ ¯Õ JÑÂêÓÂ=Û ÉÛÂ`ÎÕ€ØÂÀîÍ€{ÛÂÀ;Ö RÚÂ@åÙÂäÔÂ`æÑÂÀˆÞÂÀ Ú üÝ RÚ€oÝ€ÚÂ`°Ú ™ã 2ÕÂÌØÂ`¼ØÂ`uÏ€òÜÂU×ÂÀÜЀÉΠÙÂ@ñ×ÂÀÜЀ«ÓÂ`ÍÂ`òÏ€(Ô pÕÂ@ýÕÂ@'ÏÂ@ñ×ÂÀYÑ€(ÔÂ@°Í€@ÐÂ`æÑ >ÓÂà0ÐÂêÓÂ`òÏÂÀ²×€ÕÌ€c߀ڀ.ÓÂÀ)Ù DÒÂРFÜÂÀÐÒÂäÔÂàƒ× ÁÒÂ@ýÕÂ`QÕÂ@†ÔÂЀ.ÓÂ`cÒ€“×Â`ÚÓÂ,É€{ÛÂÌ€4Ò JÑÂàƒ×Âà§Ñ€(ÔÂÀÜÐÂ`]Ó ëËÂà­ÐÂÀMÓÂÀ#Ú &× ”Ï€ùÆÂà­ÐÂÀ5×Â`“ÊÂ@†ÔÂÀÄÔ «à€E䀙֠ÿÒÂÀèÎÂÀ)ÙÂà<ÎÂ@¶Ì 5ÊÂà¡ÒÂ@t×Â@zÖÂÞÕÂ@åÙ€áÊ ÙÎÂ@¶ÌÂ`™É»ÆÂ ÒÂÒ×ÂÀÐÒÂ`Ê AÈÂÀÜРÙÎÂÞÕÂ`¼ØÂÀÊÓÂ@ªÎÂÀAÕ @ÝÂ@ÑÂà•Ô€¥ÔÂ`¼ØÂ ÉÛ ùÓÂà•ÔÂÀ²×Â`ÍÂ@'ÏÂ`¤Ü€4Ò€ÛË pÕ ÞâÂÀ¾ÕÂàÜÝÂ@ ÔÂ@cÅÂÀ$ÅÂàZÉÂOØÂàHÌ &× \ΠhÌ€øÛ 2Õ ÍÐÂà0Р\ÎÂà`ÈÂÀƒÊ€“×Â@ŒÓ pÕÂ`°ÚÂ`QÕ€ Ù€@Р,ÖÂ@nØÂ`àÒ€FÏÂ`ìÐÂ`¼ØÂ`˜Þ€ØÂðÒ |ÓÂ=ÛÂ`ÎÕ eÂÂ@hÙÂà­ÐÂ@ñ×€FÏÂ`ìЀ“×ÂêÓ€«ÓÂ`'ÜÂÀ#ÚÂ`3ÚÂ@ªÎÂàÕÂ`]Ó€(ÔÂÀ6ÂÂÀ²×€‡ÙÂ@ÓÜÂ`߀ ÙÂ ÛØÂ >ÓÂ[ÖÂ`òÏÂàÑÊÂ@-ÎÂ`òÏÂ`ÈÖÂÒ×Â@nØÂ`†áÂÀôÌÂà}ØÂ ØÂàwÙÂ@ÂÊÂ@ªÎ€iÞÂàØÂ=ÛÂsÒÂ@Ò ùÓÂ`ÔÔÂ`æÑÂÀMÓÂsÒ´Ü€ÛËÂÀMÓ 8ÔÂ@ ÔÂÀGÔ РÇÑ€™ÖÂ[ÖÂÀÚÂà*ÑÂÀߴܺ۠ÏÚ Oå€cßÂ`¼ØÂ€ŸÕ€ŸÕÂU×€{Û€«ÓÂÀGÔÂ@’ÒÂÀ¸Ö€‡ÙÂà_ÝÂÀ Ú€ÃÏÂ`ªÛÂÀ/ØÂ »ÓÂ`uÏÂ`oÐÂ@ßÚÂ`{Π»Ó€¥ÔÂÀšÛÂ@’ÒÂ ÛØÂàÔ 2ÕÂà0Р‚Ò @Ý )ÌÂÀôÌ µÔ€øÛÂÀMÓÂ`ÈÖÂÀ²× —Ù ØÂ £×ÂÀîÍÂà‰ÖÂÀ‚ßÂ@ÓÂÀAÕÂ@ÇÞÂ`KÖÂ`žÝÂàqÚ LÛ€×ÂÆÙ á×ÂIÙÂà­ÐÂÀGÔ pÕÂÀ¦ÙÂ`?ØÂ@nØÂàâÜÂ@8áÂ`3ÚÂ`žÝ á× d×ÂêÓÂ=ÛÂ@ëØÂàÅÌ ½ÝÂÀ‚ßÂÀkÎÂ@†ÔÂCÚÂàeÜÂÀváÂ`iÑÂà›ÓÂ@t×Â`à —ÙÂ@ýÕ jÖ Ù ÿÒ€™Ö FÜÂaÕÂ`?ØÂ€ŸÕÂÀ ÚÂ@ÕÂ@8áÂåÂ@&ä ÇÑ :ÞÂÀÿ߀ÉÎÂ@ÙÛ€æÞœàÂ`àÂàƒ×€×Â`3ÚÂàÜÝÂ@&äÂà Ö€ŸÕÂ@¯âÂàeÜ vÔ€ØÂÀ)ÙÂ`¶ÙÂOØÂàqÚ vÔÂÀ/ØÂ€ÖÂ`òÏ€«ÓÂ@D߀9æÂà×Â@VÜ€ÃÏÂ`òÏÂ`¶ÙÂàÂåÂà ÖÂàèÛ´ÜÂ@ðì ‹Û€‡ÙÂ`ß ŽÐÂàƒ×€‡ÙÂÀÊÓ¨Þ€øÛÂ1Ý€:ÑÂU×ÂàîÚÂ@nØÂ ÇÑ€“×Â`iÑÂÍ  ÑÂ@zÖÂ@ëØÂsÒÂ@Dß PРÏÚ€×ÂäÔÂÌØÂ€Ú µÔ »Ó µÔÂà×Â@ñ×€Ö ”Ï ØÂÀ ÚÂ`E×Â`"È€:ÑÂàƒ×Â`-ÛÂ@PÝÂÀ ÚÂ@’ÒÂ`ËÂÀGÔ vÔ ŽÐ€ØÂÀ‚ߠ٠Ȁ(Ԡ݀4Ò€ÚÂ@ëØÂàôÙ XÙÂÀÜÂàSß  Ñ bÍ€½ÐÂÀAÕÂàwÙÂ`cÒÂüЀÉÎÂØÖÂàÔ ËÂ@žÐ€øÛÂÀ¬ØÂ »Ó íÕ€(Ô ÿÒ€‡ÙÂ@†ÔÂàãÇ ¦ÌÂ`߀?å€iÞÂ`oРÍРpÕÂÀ¸ÖÂÀjã€Ö çÖ€òÜÂÀ_ÐÂàÓÂ`cÒÂÌ ùÓÂà ÖÂ@¼ËÂàÓÂàˆëÂÀÝÂ@ýÕÂà}ØÂ &׋΀(Ô€‡Ù Ù ØÂ@nØÂgÔÂàôÙÂ`WÔÂ@ÂÊÂà$ÒÂ@ýÕÂ`KÖ€"Õ€(ÔÂÀ_РÙ΀LΠVÏÂàÕÂ`(ÇÂ@ªÎÂOØÂÀÊÓ€“×Âà*ÑÂÀÊÓÂÀÚÂÀAÕÂ@ÂÊ —ÙÂÍÂàHÌÂÀ ÚÂêÓ€±ÒÂ`æÑÂÀ/ØÂ€XÌ€ùÆÂ€FÏ çÖ€^Ë ÓÏÂÀîÍÂ@ŒÓ ÁÒÂÀˆÞÂÀ_ÐÂà•Ô 2Õ &× &×ÂÀŽÝÂ@¤ÏÂÀ}Ë€ÕÌÂ@ëØÂ ÇÑ ùÓÂàBÍÂ`cÒÂØÖÂ@-Π¦ÌÂ`{ÎÂà³ÏÂà6Ï€óÇÂ,ÉÂ` ÌÂÀ¸ÖÂ@?Ë€(Ô ÇÑ YÄÂÍ€"ÕÂàBÍÂàÅÌ€LÎÂ@˜ÑÂ@žÐ€çÉ ©ÖÂÍÂ@¾Â d× #ÍÂÀÜÐÂ@ÎÈÂ`ÚÓ€ŸÕ ÍÐÂÀ/ØÂÀŽÝÂ@2â £×Â`oÐÂ@ÓÂÏÂ@ŒÓ Ü hÌÂ ÊÆÂgÔÂ@ñ× 5Ê€ŸÕÂ ÛØÂ`oÐÂàÅÌÂÀ¬ØÂÀ¬ØÂaÕÂÀ¬ØÂ€ŸÕ £×Â@!ÐÂàfÇ ΠµÔÂ=ÛÂÀúËÂÀ#Ú —ÙÂÀYÑ€ÖÂ@÷Ö€™Ö¨ÞÂ`ìЀRÍÂÀÄÔ VÏ€ÛËÂ`ËÂ`KÖÂ`"ÈÂ`]ÓÂ`ÎÕÂà}ØÂ€±Ò ÒÂà*ÑÂ`æÑ ”ÏÂÀúËÂ`uÏÂ@†ÔÂà•ÔÂàÔ LÛ€«ÓÂ`uÏÂ`'ÜÂ@÷Ö çÖÂ@ÒÂÀ¦ÙÂ…ÏÂ@ŒÓÂ`uÏ tʠπ4ÒÂ@¤Ï »Ó Ë€:ÑÂüР/ËÂÏÂ@ßÚ ½ÝÂ@’ÒÂOØÂÞÕ »Ó ÍÐÂ`3ÚÂ@ýÕÂ@ÓÂðÒ gá€QâÂ@ŒÓÂ`oÐÂaÕºÛÂ`ÊÂàÔÂÀwÌÂðÒÂÀMÓÂÀúËÂ&ÊÂ`9ÙÂ`æÑ‘ÍÂÀGÔÂÀôÌÂ@ýÕÂ`3ÚÂà¡Ò€pÈÂÀúËÂ`øÎÂ@†Ô ”ÏÂaÕÂÀîÍ ÇÑ JÑÂàúØÂà‰Ö ÍÐÂ…Ï€@Р‘Ú ©Ö ‹ÛÂÀÚ Ú€QâÂÀp‥ÔÂÀ_ÐÂÀ¬ØÂÀÐÒ‘Í çÖÂ@>à—ÌÂ@åÙ€×Â@nØÂ€àßÂÀGÔ€±ÒÂ`ÈÖÂ7ÜÂ@ñ×Â`¥ÇÂÀîÍ ”Ï ÚÂ`ÔÔ DÒ€‡ÙÂ@3ÍÂ`¼ØÂ çÖÂÀ#ÚÂÀ¬ØÂ`ÚÓÂ`KÖ µÔÂ@Ó€"ÕÂÀ¸ÖÂöÑÂ@’Ò RÚÂÀ¾ÕÂÀ)ÙÂ@Ó€·Ñ€ŸÕÂàÅÌÂâÂÀÐÒÂàúØÂ@¤ÏÂ@Ó &×µÇÂÀMÓÂ@ ÔÂ@Ò jÖÂÀîÍ€"ÕÂÀÜÐÂ`WÔÂÀMÓ \ÎÂIÙÂà$ÒÂ`'ÜÂÀ Þ ¦Ì€^Ë jÖ ‹ÛÂ`3Ú ΀ÛËÂ`¤ÜÂmÓ ÁÒ ÁÒ ÍЀ@Рá×Â@ªÎ€‡ÙÂà*Ñ€.ÓÂÀƒÊÂ@ÓÂÒ×ÂêÓ XÙÂÀeÏÂ`ÎÕÂ`¼ØÂÀ#Ú ØÂÀ¾Õ pÕ »ÓÂÀkΠPÐÂ`þÍÂäÔÂÀSÒ &×Â@ÂÊ ”Ï µÔ PЀ4Ò 2ÕÂà•Ô€×ÂÀÖÑÂàwÙÂÀÄÔÂà¹ÎÂ`¼ØÂaÕ jÖÂ`¶Ù ÐÂ`˜ÞÂ+ÞÂ@ÁßÂ@ÑÂ+Þ Ï >ÓÂÀ_РÒ ¯ÕÂaÕ€.ÓÂÀqÍÂà‰ÖÂ`3ÚÂ`oÐÂ@!ÐÂàBÍÂ@9ÌÂ`ìÐÂ`]ÓÂmÓÂ`òÏÂÞÕÂÀ/ØÂ€LÎÂ`ÈÖÂ`¶Ù äÂÀSÒ …ÜÂ@DßÂÒ× #Í ùÓÂ`ìÐÂaÕÂàƒ×Âà§ÑÂàèÛÂÀ#ÚÂÀpâ ùÓ€pÈÂàÕ€‡ÙÂ`-ÛÂ`QÕ€ŸÕÂ…Ï€.Ó€·ÑÂàúØÂ€?åÂàÜÝ€ÚÂ@ßÚÂ`iÑÂÀ¾Õ€:Ñ »Ó çÖÂÀMÓÂËÂ@ýÕÂÀ_Ѐà߀ ÙÂàÕ ÐÂ@ñ×ÂÀˆÞ€ÚÂà­Ð ÁÒÂ`E×€@ÐÂ@JÞÂâÂà¡ÒÂ`Ë€ØÂ@†ÔÂ@DßÂà³Ï´ÜÂÀMÓÂÀÊÓÂ`cÒÂÀâÏÂ@’ÒÂ@ßÚ yÞÂ@÷Ö€þÚ ЀçÉ‹ÎÂËÂ@ýÕ &×Â`þÍÂÀ¸ÖÂ@€Õ d×Â@3Í€áÊÂ`{ÎÂР‚ÒÂ@˜Ñ€{Û ¯Õ d×ÂÀÖÑÂÀeÏÂà¿Í 2Õ€·ÑÂU×€“×ÂàBÍÂ@ Ô vÔÂà Ö€"Õ ©ÖÂ`æÑÂÀYÑ AÈÂgÔÂàƒ×ÂÀ¸Ö€ÃÏ€4Ò vÔÂ@QÈÂàBÍ ëËÂÀËÂ@PÝÂÆÙÂà0ÐÂ,ÉÂ`F ŽÐÂêÓÂ…Ï ýÈÂà§ÑÂ@hÙÂ@!ÐÂ@9Ì AÈ žÃ€½ÐÂ@ýÕÂ`ÎÕ‘ÍÂÀÊÂРVÏÂ`þÍ MÆÂà ÖÂà¡ÒÂ@°Í hÌÂ@'Ï çÖÂ`uÏÂÀ É ¦ÌÂÀ_ÐÂÀ²×ÂàÕÂàÕ€RÍ€ùÆÂ ¸ÉÂ@Ò ÁÒÂàBÍÂàkÛ€ÖÂÀYÑ ÎÂ@cÅÂ@QÈÂÏÂäÔ µÔ hÌÂà0ÐÂ`ŸÈ€FÏÂ`æÑÂÀ}Ë åÌÂÞÕ ÒÂà<ÎÂÐÂ`oР”ÏÂÀSÒÂРzÉ€4Ò £×Â`ÍÂ`KÖÂàƒ×ÂÀ#ÚÂ`E×Â`òÏ \ÎÂäÔÂ`ͩɠPÐÂÀÝ á×Âà¹ÎÂ`iÑÂ@÷Ö ˆÑÂ`¶ÙÂ`4Å ,ÖÂ@žÐ€ŸÕ 8ÔÂà¹ÎÂ`þÍÂ@ŒÓ 2ÕÂ`?ØÂ  ÑÂÀÜÐÂà Ö ‚ÒÂ@ÓÂàrÅÂ@'ÏÂ@¶ÌÂöÑ çÖÂCÚ€RÍ šÎ †ÇÂ`{ÎÂ`oРhÌÂ@KÉÂÀeÏ ÐÂÀÊÓÂ@¶ÌÂ@ÎÈÂäÔ ÙÂ`cÒÂÀMÓÂÌØÂ€4Ò€×ÂêÓÂ`æÑ šÎ  ÑÂ@ªÎÂÀ)ÙÂ@EÊ #ÍÂÀˆÞ »ÓÂ@'ÏÂà‰Ö€áÊ »ÓÂ@†ÔÂà}ØÂÌØÂ€@ÐÂàwÙÂÀˆÞÂÞÕ çÖÂà›Ó LÛÂ`ÍÂÀ¸Ö çÖÂà_ÝÂüР£×Â`WÔÂmÓÂêÓ€×Â@ ÔÂ@ñ×Â@€Õ d×€pÈÂ@Õ :Þ€þÚÂ@˜ÑÂ`oÐÂ`°Ú LÛÂCÚ ·Þ€ŸÕÂäÔÂ@bÚÂ@÷Ö ÒÂêÓÂàØÂ€Ú€ŸÕ ÈÂmÓ £×ÂÀ²×ÂÀ)ÙÂÀ¬ØÂ Ù€“×€uÜÂ@nØÂ šÎ ¸ÉÂÀ²×Â`iÑÂ`KÖÂà§ÑÂ@˜Ñ€ØÂÀ/ØÂ@&äÂÀšÛÂ@\ÛÂà ÖÂ@ÓÂ`'Ü ©ÖÂ@ÙÛ µÔ màÂ@nØÂ@ÍÝÂàâÜ€uÜ RÚ Òä :ÞÂ@ßÚ€“×Â,ÉÂyÑÂ@ñ× \ÎÂàÑÊ üÝ ±ßÂà_ÝÂ@ªÎÂ@zÖÂ`3ÚÂ`cÒ öÞ >ÓÂU×€ÖÂIÙ LÛ LÛÂÌØÂ ÕÙÂðÒ€Ú€“×Â@ñ×Â@åÙÂÀMÓÂÀ/ØÂmÓÂ@'ÏÂ`“Ê€ÕÌÂ`E×€ Ù óÔÂ`WÔ€"Õ ÇÑ sß ^ØÂ íÕ€.ÓÂÀAÕÂÀ¸Ö ÏÚÂÌØÂ ˆÑ ¯ÕÂà€·ÑÂàÑÊ ðßÂ`-Û Ò€×Âà‰ÖÂÀÄÔÂ@3Í ÓϺÛÂØÖÂ`{ÎÂ@9Ì ÁÒ€þÚÂàwÙÂüÐÂÀ¬ØÂ@ ÔÂ@3ÍÂ@¤ÏÂ@hÙÂ@zÖ€Ú )ÌÂ@t×Â@˜ÑÂ`KÖ ˆÑÂÀ¸Ö  ÍÂ@KÉÂÀôÌÂÀÄÔÂÀ¦Ù€ÃÏÂ@¶Ì€òÜÂàúØÂ —ÙÂÀîÍÂÀúËÂ@]ÆÂÀwÌ PÐÂÀkÎÂgÔÂ`Ë€vÇ ÛÂÀ#Ú€RÍÂ@ñ×€LΠ2Õ€øÛÂ@¶ÌÂÌÂ`òÏ ©Ö€.Ó »ÓÂ@?ËÂ`cÒÂ…ÏÂÀ ÉÂ@ÈÉÂ`ÍÂðÒÂÀ²×Â`ÎÕÂ@'ÏÂÀkÎÂ`Ë ÙÎÂ@EÊÂ@ÔÇ FÜ€«ÓÂà*Ñ€áÊÂ@QÈ€×Â`ËÂÀÜÐÂË €ÈÂ@ÔÇ µÔÂ@zÖÂ`æÑ€”ÂÂÀ‰ÉÂÀMÓÂÀ#ÚÂÀîÍÂ@ÈÉÂà¿ÍÂ@Ñ RÚÂ@†ÔÂàÑÊÂÀôÌÂ@ÙÛÂ@˜ÑÂ@-ΠhÌÂ…Ï€ ÙÂàÕ€çÉÂ`QÕ€«Ó åÌÂ@Ó µÔ Û ÍР\Π@Ý€ÃÏ ŽÐÂÀAÕÂ`oÐÂÀŽÝ ÁÒÂàƒ× ¦Ì ÁÒÂ…ÏÂyÑ >ÓÂÀeÏ€ ÙÂàeÜÂsÒ ÉÛÂ`‡Ì VÏ€:ÑÂ@9ÌÂÀSÒÂà$Ò kÁÂ`WÔÂ…Ï€{ÛÂIÙÂ@°ÍÂÀÖÑÂà6Ï vÔ€×Â`ËÂ@Ñ€«ÓÂ@ÒÂÀeÏÂêÓ€«ÓÂäÔ€½ÐÂÀèεÇÂ,ÉÂ`¥Ç€É΀ÃϨހØÂ`{ÎÂË 8ÔÂ`ÊÂüРjÖÂÌØÂ ¯ÕÂ@ÑÂ`ÚÓÂÀeÏÂà Ö óÔ tÊÂ`ìЀÖÂÀšÛÂÀËÂÐÂÀAÕ šÎ€½ÐÂ@-΀þÚÂÀ¾Õ pÕ ÎÂà§ÑÂØÖ pÕÂàTÊÂäÔÂÀ#ÚÂÀ¬ØÂÀôÌÂ`ªÛÂ@ÒÂÒ× ÛÂÌØÂOØÂ@PÝ IæÂ "âÂ`ÈÖÂ`E×Â@>àÂÀ.íÂ@µáÂ@ç€æÞ ÃÜÂ`zãÂÀ(î€?倶æÂ€æÞÂà)æÂàˆë€°çÂ@yëÂ`»í =èÂ`>í€hóÂÀ·ëÂ@êÂÀáäÂ`’ß ò KðÂ`£ñ çÂÀÉèÂ`ñä ÀçÂà ë %ìÂ@¨øÂàdñ€ÂäÂÀð ÎïÂà‚ì€ÙõÂàíïÂ@aïÂÀFéÂ@üêÂ@OòÂ@Àô€žêÂ@Ìò Ý÷ÂHîÂ`bç “ä Òä ð•ö•öÂÀñ íÂàÛòÂÀ.íÂ`hæÂ@ðìÂàçðÂà‚ìÂ`ëåÂ@ å€'é æë ®êÂ@ê ¢ìÂ@èÂ@ØðÂ6ñ iëÂ`hæÂ€˜ë gဘë +ëÂ`\è ÎïÂ@IóÂ`n倞êÂÀÕæÂ7Ü ¢ì€zð Ý÷€?åÂà#ç ìêÂ`PêÂ@éÂÀ:ëÂÀçã ¨ë oê€tñÂrçÂÀ(îÂÀpâ€9æÂ€9æÂ@…é€!êÂ`ÙèÂ`ÁìÂ$ôÂàêÂÀFé€ÂäÂ@£äÂ ÆæÂTì æëÂÀÛåÂ@£äÂBïÂà ëÂûåÂÀùàÂ<ð Îï ÂñÂ@aï Wî³ñ í +ëÂÀð€!êÂ@‹è€Ôá ïÂà#ç€ îÂ`©ðÂõæÂÀóáÂ`ÇëÂ@逆îÂÀ·ëÂHî oêÂ@yëÂàdñÂÀÛåÂ@ÀôÂ@ê€îÂ*óÂ@ÀôÂàáñ aâ€ìÂéè oêÂ`êÂÀçãÂ@—æÂ`nåÂ@êíÂ`Óé iëÂàpï (áÂÀ4ìÂ@êÂ`,ðÂrç -õ€€ï IæÂ 7éÂàóîÂÀÿßÂà5äÂ`zãÂÀÉèÂ@çÂÀ½êÂ@ÍÝ 1êÂÀ¥îÂ`à ÛÂ@‹èÂfé€WáÂàÄáÂ@‘ç ·ÞÂ`PêÂ@…éÂÀRçÂ@gîÂà;ã OåÂ`hæÂà”éÂ@\Û€VöÂ`åæÂ Šð IæÂ€íÂÀ(îÂ@ÙÛ Àç ]íÂ@2â Ù [〰çÂÀdä–áÂâÂ@æÂ :Þ oêÂà²ä 4߀øÛ [ãÂàeÜÂxæÂÀ·ëÂûåÂ@ñ×Âà×ÂàâÜÂÀ#ÚÂÀˆÞÂÀÿßÂ@&ä€]àÂ@¯âÂ@÷Ö ÞâÂÀ^å ºèÂ`¶ÙÂ`ªÛÂ`ÙèÂlèÂÀ:ëÂõæÂàeÜ aâÂåÂ@ñ×ÂÀ‚ßÂàGá CçÂÀ½êÂà_Ý€ÈãÂ`ßÂàA‘ëÂÀÉèÂ@‹è€þÚ (á äá ÜÂ@2âÂ@ 倸ÛÂÀvá ™ãÂÀ¦ÙÂ@æÂ [ã aâÂÀ Ú€Ö€ìÝÂÝêÂïç€ÚÂ@\ÛÂÀ‚ß ½Ý ·ÞÂÀ‚ß Oå€Qâ 4ßÂ@2â Û ØãÂ`†á êàÂâ çÂ@VÜÂ@8á  æÂ`ß ®ê 4ß ‚ÒÂ@>àÂÀ|à€ÂäÂÀÝ€oÝ€KãÂrçÂ@D߀Úà 4ßÂ@\Û€uÜŠãÂàMà€9æÂ`ýâÂ@©ãÂà5ä LÛÂ@çÂÀ|àÂÀˆÞÂ@bÚÂ`ýâÂ` áÂÀÄÔÂ@‘çÂàÜÝ IæÂàÿì ðßÂ`!ÝÂàÄáÂ@2âÂà²äÂÀ¦Ù ±ßÂÀÝÂÀ/ØÂ (áÂ@å ½ÝÂáÂHîÂÀÚ€ ÙÂÀùàÂÀpâÂ@[ðÂ@zÖ «àÂ=ÛÂäÔÂ@ÒÂ`žÝ ‹ÛÂÀ/ØÂ+Þ„äÂ@‘ç UäÂÀÛÂàÜÝÂà5ä€oÝÂà¸ãÂ`-ÛÂ ÛØÂ`€âÂ@&äÂà¬åÂ@,ãÂÀdä–á€-蠱ߠ£×€ ÙÂàîÚÂ+ÞÂàeÜÂ@ÕÂ@†Ô öÞÂàMàÂàâÜ RÚ ÙÂ@VÜÂ@å٠٠üÝÂÀùà :Þ "â màÂõæÂ@2âÂ@÷ÖÂ@-ÎÂØÖÂ` áœà ØãŠã ½ÝÂÀ¬ØÂ@&äÂ`àÂÒ×Â`’ß &׊ãÂ@\Û€“×ÂÀßÂ@åÙÂ`˜ÞÂÒ×€ØÂ ^ØÂ`Œà€øÛÂ@&äÂ`!Ý £×Â@ å ÚÂàwÙÂ`?ØÂ€¶æÂâÂÀYÑÂ`àÂïçÂàMàÂ@ñ× vÔÂ@zÖ ØÂ ÃÜÂÀÝÂ@žÐ XÙÂÀ Ú ÞâÂ@˜Ñ ‹ÛÂ@ëØÂ€øÛ ÚÂàGáÂÀRçÂÌØÂÌØÂ`täÂ`àÂ@†Ô RÚ€×Â`täÂàGáÂ@zÖÂãéÂ@JÞÂ~å ãÂÀÜÂÀGÔÂ`]ÓÂâÂ@\Û »ÓÂà•Ô sßÂ`Â× íÕ »ÓÂ@žÐ€þÚ€øÛÂÀÜÂ@»àÂÀ¦ÙÂ@’ÒÂÀˆÞ€{Û íÕ€{ÛÂ[Ö¨ÞºÛÂ`täÂ`’ßÂÀ#ÚÂÀ ÞÂ%ßÂ`àÒÂÌØÂ€“× »ÓÂ`]ÓÂ`°ÚÂÀÝÂ@ÍÝÂ@ñ× …ÜÂ@hÙ ÞâÂ@—æÂ@Dß s߀ŸÕÂà5äÂ@˜Ñ€c߀æÞÂáÂà_Ý üÝÂÀÚ€(Ô€æÞÂ` áÂ@VÜÂàèÛ ŸâÂàƒ× ©ÖÂ@Ñ€ŸÕ€ìÝ Ú€iÞ ±ß€oÝ Ÿâ€9æÂ  æÂ`âÂ@ñ×Â7ÜÂÀßÂ`ñä ¥á RÚ ùÓÂ[ÖÂ@ÇÞÂ`Â×Â`ß ŸâÂÀ¾Õ€QâÂÀèÎÂU×Â~åÂ@¯âÂ@»àÂ`ÔÔÂ@©ã€KãÂ`ŒàÂàSßÂ`\èÂÀ¥î€ÔဟՀ ÙÂ@‘çœàÂâ€ë€Ú ÛÂ@ëØÂyÑÂà¹Î jÖÂ@ëØÂ…ÏÂ[ÖÂÀ¸Ö ¯ÕÂ@hÙÂ`øÎ RÚÂ`Áì€òÜÂÀˆÞÂ@ÇÞ€×Â`ÔÔÂ`-Û sßÂà6Ï …Ü€‡ÙÂ@€Õ€“×Â@hÙ "âÂà¬å «àÂâÂ@åÙ RÚ »Ó´ÜÂÀŽÝ Û€ìÝ |ÓÂ`¼ØÂ ŠðÂ@¯â ÏÚÂà;ã óÔÂÀ¸ÖÂ@ñ× £×Âà¦æÂ€uÜ DÒÂ`þÍÂ@Ñ ©ÖÂàqÚÂ@nØÂ`ÚÓ 4ßÂ`Â×Â`æÑÂ`E× yÞ ^ØÂ@ßÚ ÏÂ@ñ×ÂÀ/ØÂà ®ê€WáÂ@zÖÂà}ØÂ`E×Â`KÖ€3ç€(Ô d× OåÂ@µáÂ[Ö€øÛÂÀÚÂ+ÞÂ`Í€ÚÂÀùà &× üÝÂ[Ö d× ¯ÕÂ`E× ,ÖÂÞÕ€“×ÂÀ¬ØÂà_ÝÂàqÚÂÀóá XÙÂ`ÎÕÂ@€Õ ÕÙÂà$Ò ©Ö |ÓÂÀGÔÂàqÚ€‡ÙÂà¡Ò€Eä€ìÝÂ`€â€ÚàÂ@'ÏÂÀAÕÂà_ÝÂ@ Ô€^ËÂ`€â üÝ ÿÒÂàYÞÂ`æÑ–á d×ÂàwÙÂ@÷ÖÂÀÛ€·ÑÂ`òÏÂ[ÖÂðÒ 2Õ màÂàúØÂ@’ÒÂ@ñ×€ØÂ@\ÛÂ`ÔÔÂIÙ€"Õ &×Âà¾âÂCÚ€ Ù màÂ`°ÚÂåÂ@bÚÂ@bÚÂ` áÂ+ÞÂÀ#Ú ½ÝÂ@ñ× šÎÂÀšÛ€.Ó€c߀uÜÂà•ÔÂCÚ ©ÖÂ`QÕÂÀÄÔ ÉÛ€«ÓÂÀqÍÂOØÂ £×ÂsÒÂÀj〙ÖÂÀßÂ`ªÛÂ`žÝÂ`WÔ &×ÂÀÖÑ óÔÂ`cÒÂÀMÓÂàôÙ€Ú jÖÂ`¼ØÂàâÜÂÀ;Ö .àÂÀ/ØÂ€æÞ€oÝ 5Ê€Ú€:Ñ »ÓÂÀ5×€Ú€æÞÂàBÍ ÿÒ Û€oÝÂÀ#ÚÂàèÛÂàÜÝ€FÏ Ò pÕ 8ÔÂàÔ€oÝÂ[Ö á×ÂàâÜ€"ÕÂ@ëØÂ pÕÂÀqÍÂ@t×€RÍÂ@bÚ€àßÂØÖÂÀ¦ÙÂàúØÂ€ Ù  ÑÂ@ÙÛÂ`¼ØÂ+ÞÂÀÛÂÀ ÚÂà×€(ԜࠅÜÂÀ/ØÂËÂà Ö ŽÐ ÓÏ 2ÕÂÀšÛ sß íÕÂ`uÏÂ@ÕÂmÓÂà¬åÂ@˜ÑÂàØÂ7Ü ØÂäÔ bÍÂà¡ÒÂÀÜÐÂ@PÝÂ@zÖ€‡ÙÂ`ªÛÂÀ¸ÖÂOØÂ £×  ÍÂÀÊÓÂ@Õ€¥ÔÂ[ÖÂ`ªÛ€¥ÔÂà<ÎÂÀkÎÂ@¯âÂàîÚÂÀ/ØÂ jÖÂÀÚ€þÚ€]àÂÀÝÂyÑÂ@ÍÝÂ`¶ÙÂà*ÑÂ@ñ×ÂàÄá¨ÞÂ@t× ãÂÀÜÂ1ÝÂ`!ÝÂ`žÝÂÀÛ sß ÒÂÀîÍÂ@ñ×ÂÀŽÝ€oÝ ÕÙÂ@bÚ Ù äáÂ`'ÜÂÀ/ØÂ ,Ö |Ó íÕÂÀMÓÂ@DßÂ@ ÔÂà0ÐÂÀšÛÂÀ)Ù jÖÂàØÂ`3Ú 8ÔÂ`KÖ ¯Õ »ÓÂ`'Ü ‹Û »ÓÂàÂàeܺÛÂÀÿß ãÂ@ÍÝÂ`QÕÂOØÂ`þÍ ÙÂ`E×Â`9ÙÂàØÂ íÕ€þÚÂ@nØÂ`iÑÂ@¤ÏÂ`!Ý ÕÙÂ`'ÜÂ@t×ÂÀßÂ@zÖÂäÔ :ÞÂÆÙ ðßÂà_ÝÂ`÷ãÂ@µá êàÂÆÙÂàƒ×Âà‰Ö üݺÛÂÀváÂÀÜ ÏÚÂ@2â ‘ÚÂ`cÒÂ@ëØÂ@PÝÂaÕ€þÚÂÀ¸ÖÂàîÚÂÀ²×ÂÀ|à ^ØÂ@ßÚÂ@ñ×Â@JÞ £×ÂâÂ`¶Ù€ÕÌ€·ÑÂ@ ÔÂàƒ× LÛ€Ú ˆÑ ‹ÛÂ@ ÔÂàÕÂàMàÂàwÙÂÀ#Ú ©Ö pÕÂÀÜÂ+ÞÂ@ñ×Â@ÓÜÂ`¼ØÂ êàÂÀ¬ØÂ€‡Ù€«ÓÂàqÚÂÀ|à çÖÂÀíâ \ÎÂ`ÚÓÂÀÚ DÒÂÀÝÂà›Ó€(ÔÂ@nØÂ€ÚÂÀÄÔÂ`øÎÂäÔÂ`¶ÙÂaÕ€øÛÂ`òÏ€ØÂà$Ò ÍÐÂ@¼ËÂàYÞÂ@nØÂ€:ÑÂà¡ÒÂÀ²×ÂöÑÂ@¶ÌÂäÔ ©ÖÂ@ñ× µÔÂàqÚÂ`ÔÔ »ÓÂÀ¸Ö€ÚÂ@¼Ë€×Â@!Р)ÌÂÀYÑÂÀÄÔÂà¹ÎÂ@'Ï ¬ËÂ`æÑÂ`‡Ì €ÈÂÀÊÓ€“×Â@÷ÖÂ@€Õ ÙΠÏ ßÍÂ`-ÛÂà5ä€(ÔÂàôÙ RÚÂ@˜ÑÂäÔ€@ЀFϠπÉÎÂ@’Ò »ÓÂ`àÒÂÀ¦ÙÂOØÂ€:Ñ€{Û€ŸÕÂÀ ÞÂÀ ÚÂà$ÒÂÀŽÝÂÀAÕ pÕÂ`3ÚÂCÚ€:ÑÂ`ÎÕÂà$ÒÂ@Ò ëË€ÃÏÂ@9ÌÂ@ÑÂÀŽÝÂIÙ  Ñ€.ÓÂgÔ ŽÐÂ`]ÓÂÀ)ÙÂ@ÑÂÀôÌ€òÜÂ@žÐÂ`±ÅÂ@ÂÊÂÀÖÑÂ[Ö€ùÆÂ—Ì€ŸÕ€@ÐÂ@9Ì ˆÑ£ÊÂ`ìЀ.ÓÂðÒÂÀèΠá×Â2È€áÊ€áÊ |Ó€‡ÙÂÀ;ÖÂà0ÐÂÀÜÐÂàôÙ ÇÑÂ@zÖ ÐÂÀMÓ€(Ô ëË ,ÖÂÀYÑÂ`ÍÂÀËÂ`QÕ€ŸÕÂ@bÚÂÀ¸Ö€øÛÂàËË yÞÂÀ}Ë 2Õ€½Ð€ÛËÂ@åÙ ½ÝÂ`ÔÔ DÒÂ@žÐ \ÎÂ@ÕÂ[Ö Ò ¯Õ Ï 2ÕÂÀ•ÇÂ`ÍÂÌÂÀÈÂà¹ÎÂàHÌÂà­Ð€ŸÕÂÀèΠ»ÓÂ ÛØÂ ÉÛÂ`ÍÂ@ñ×Â@ýÕÂ@˜Ñ€.Ó pÕÂ@’ÒÂÀÜÐÂÀâÏÂÀôÌ€½ÐÂÍÂà×Â@ßÚÂàÑÊ€FÏÂ@€ÕÂÌØÂ€4ÒÂ@ñ×Â@QÈÂ`QÕ |Ó ÙÂ`æÑÂ@ªÎ bÍÂÀÖÑÂÀÆÂ—ÌÂÀôÌÂ`.ÆÂ`æÑ |Ó ùÓ€ØÂ€‡Ù€"Õ ñÊÂÀŽÝÂsÒ€¥Ô€óÇ€"ÕÂ@ÍÝ ÍÐÂ`ÚÓÂà§Ñ —Ù€¥ÔÂ@¤ÏÂ`ËÂ@÷ÖÂà$ÒÂàØÂ@Ò€dÊÂ@ñ×Â@’ÒÂÐÂÀÐÒ bÍ€ÖÂ@ÓÂ@zÖÂÞÕÂaÕÂ@ÕÂ`ÔÔ ØÂ[Ö ùÓ íÕÂ`ÚÓÂ@ßÚÂàÔ ÜÂà}ØÂ€«ÓÂàqÚÂ@˜ÑÂ@òÂÂÀ²× íÕÂÀ¬ØÂ@µáÂ`àÒÂàâÜÂmÓ Ü .àÂØÖ @ÝÂ@ñ×ÂÀˆÞÂà}ØÂ 8Ô üÝ Ü ëË€uÜ€±Ò £×Âà¡Ò€ØÂàeÜ ÍÐÂÀ;ÖÂ ÆæÂàâÜÂ`!Ý€{ÛÂàúØÂ@zÖÂäÔÂ`ß Ò€ØÂ@ÕÂÀ¸ÖÂ`àÒÂ`ÚÓÂÀ²×ÂàÕÂÌØÂ ÐÂ`¼ØÂÀ¾ÕÂàÂ`QÕÂÀ;ÖÂàÊàÂ[ÖÂ`iÑÂÞÕÂÀAÕ ÚÂaÕÂÀ²×ÂÀáäÂÀÝ LÛ |ÓÂÀŽÝÂ@€Õ ÕÙ€«Ó€“×Â@ÍÝÂáÂÀ¸ÖÂà•ÔÂ`¤ÜÂàYÞ¨Þ€«ÓÂÀAÕÂ@¤ÏÂ`9ÙÂÀ¦ÙÂÀÛ sßÂàÐßÂ`E×Â`àÒÂ`E×ÂØÖÂ@t×€ØÂ€ÚàÂÀ ÞÂ@\ÛÂ`’ßÂ[ÖÂÀÜ€×Âà Ö€þÚ€4ÒÂÀËÂÀYÑÂ`¶ÙÂàƒ× .àÂàÜÝÂ`É€oÝ £×ÂÀÊÓ tÊ€×€·Ñ £×Âà*Ñ ÁÒ ‹ÛÂà×ÂÀ¸ÖÂÀYÑÂàôÙÂêÓÂàÄáÂ@ßÚ€øÛÂàîÚ€¶æÂÀ²× ùÓ€{ÛÂÀ)ÙÂ`æÑ€ÏÍÂ`ÎÕÂ+Þ óÔÂ@zÖÂ`?ØÂüЀØÂЀØÂÀ¾ÕÂU× LÛÂÀÐÒ ,Ö 2ÕÂäÔÂ@nØÂ ÜÂà¡Ò€ÏÍÂaÕ€±ÒÂ@zÖºÛÂ=ÛÂàYÞÂÀÄÔÂØÖÂU×€LÎÂ`¼ØÂ@>à pÕÂÀßÂàôÙ€ìÝÂà_ÝÂ@?ËÂÞÕÂðÒÂÀ¦ÙÂÀíâÂ@†Ô€.Ó DÒÂÀÈ€ØÂ€4ÒÂ@Ò€LÎÂÀÐÒÂ`àÂ`æÑ ÍЀ(ÔÂ=Û€ŸÕÂ@nØÂÀ5× ØÂ€‡ÙÂ@÷ÖÂ@»àÂaÕÂ@ Ô€ ÙÂàÜÝÂÀ#ÚÂà×Â`Â×Â`ìÐÂÀ;Ö€þÚ çÖÂàØÂ`?ØÂàwÙÂÀ¾ÕÂ@ÇÞ€uÜÂ@ýÕÂ`-Û ‘ÚÂÀ¸ÖÂà*ÑÂ@’ÒÂÞÕ€ ÙÂ`KÖÂà‰Ö ÚÂà*ÑÂ@'ÏÂà6Ï ÒÂÀ5×€"Õ€ÕÌ€"ÕÂÀ²×Â@€ÕÂÀúËÂàƒ×Â@nØÂÀAÕ ÛÂ@Ñ JÑÂaÕÂà0ÐÂ@˜Ñ ÒÂ@nØÂ 2ÕÂÀÜЀ{Û ^ØÂ &×Â@†ÔÂàØÂ@°ÍÂà<ΠùÓÂ`òÏÂ@!РÓÏ £×Â`òÏ€¥ÔÂàÔ ÇÑÂàØÂ¯È€ÉΠbÍÂ@!Р¤ÂÂbÀÂ`iÑ á×£ÊÂàØÂÀ;Ö€¥Ô ËÂmÓÂ`'ÜÂàÕÂÀ²×ÂÌØÂ ÉÛ€Ú ÛÂàúØÂ`ÈÖÂØÖÂyÑ€ÃÏ€oÝÂàwÙÂ`°Ú€ŸÕÂ@'Ï®ÝÂàHÌ€ŸÕÂsÒÂmÓÂ`cÒÂ@ßÚÂÀÖÑÂOØÂ€·ÑÂ@÷ÖÂ@Ò€æÞ€æÞ ½ÝÂàHÌÂaÕÂ@ŒÓ€LΠ÷É€QâÂ@ñ×Â@>àÂ`?ØÂ JÑÂ@ÓÜ€ÖÂÀSÒ ÇÑ€"ÕÂÀŽÝÂ`¶ÙÂÀ/ØÂàeÜÂ`ªÛ XÙ€Ú ÃÜÂà_Ý 2Õ  ÍÂ`QÕ ™ãÂÀ¸ÖÂà6Ï \Πgá€uÜÂà¹Î íÕÂ@ýÕÂ@ßÚ ;ÉÂ@žÐ ùÓÂÀ/ØÂà›Ó \ÎÂà¹ÎÂÐÂ`ÈÖ€™ÖÂàƒ×ÂàÓÂà§ÑÂÀ_Ѐ™ÖÂ`ÍÂ`¶ÙÂàØÂ@ñ×ÂÀÜ ØÂÀ)ÙÂ@ ÔÂ`ÎÕÂ`ÞÂàqÚÂ@€ÕÂàBÍ µÔÂ`Â×ÂÀŽÝÂÀjãÂàèÛ PÐÂ@bÚ þçÂ`â íÕÂÀGÔÂ@ÙÛÂàGá >Ó ÐÂ@t×€“×ÂÀÄÔ |Ó ˆÑ€ÉÎÂà}ØÂ@ßÚÂàAâ £× Ò€«ÓÂ1ÝÂ`3ÚÂ`!ÝÂ@ÑÂà§ÑÂêÓÂ@ñ×ÂÀ¸ÖÂ@nØÂ@ÑÂÀÝÂÀ)ÙÂàeÜÂ@VÜ ‚ÒÂàúØÂ ^ØÂÀÚÂ@,ã £×Âà•Ô–áÂàúØÂ€WáÂÀ¸ÖÂ@÷Ö 8ÔÂÀAÕÂaÕ€iÞÂ@ñ× ØÂà}ØÂàYÞ PРÜÂÀYÑÂÀ²× å jÖÂÀ)Ù€LÎÂ@'ÏÂ@ŒÓÂà§Ñ—ÌÂÀ ÚÂÀGÔ XÙÂÀÜÐÂ`WÔ ÎÂÀâÏÂ@åÙÂ`'ÜÂàYÞÂ`KÖÂöÑÂ@ÓÜÂ`ÈÖÂàúØÂàÓ ÙΠjÖ ØÂàkÛ€(ÔÂ`?ØÂ`ìÐÂàƒ×ÂÀÊÓ€þÚÂ@’ÒÂÀÛÂ`'Ü hÌÂÐÂ@Õ ÙÂÀšÛ óÔÂÀè΀þÚ€Ú ÝÂÀèÎÂÀ¾Õ ½ÝÂà­Ð …ÜÂ@ Ô—ÌÂÀÜÐÂà¡ÒÂÀÐÒ ”Ï€«ÓÂá öÞ «àÂ@ëØÂsÒÂÀwÌ€FÏÂàMàÂ`?ØÂà$ÒÂ@zÖ Ìå€àßÂà*ÑÂÐÂ@ÕÂ@ÂÊÂ@ßÚ€¥Ô ‚ÒÂ`{ÎÂÀŽÝ€ŸÕÂÀk΀™ÖÂÐÂ@ ÔÂ@>à€“×ÂàÕ—Ì 2ÕÂàÔ  Ñ ØÂðÒ€{Û ¦Ì šÎ€4ÒÂÀ¾Õ ÏÚ ÿÒÂ`uÏÂà<ÎÂà}ØÂ JÑÂà­ÐÂ@¤Ï€Ö€Ö€‡ÙÂÀ¾ÕÂ@åÙÂ`ìÐÂÀîÍÂà³ÏÂ`àÒÂÀ_РtÊÂÀ¾Õ€ÏÍ £×Â@ñ×ÂЀØÂ€FÏÂÀSÒÂsÒÂ`iÑÂ@æÄÂàÕ€ÉÎÂÀqÍÂØÖ çÖ—ÌÂàËË vԋ΀×Â@Ñ 2ÕÂ@nØÂ ÕÙÂ`ÎÕÂ@†ÔÂ@ÓÂÀ_Р,ÖÂÀ/ØÂ€ÃÏÂÀMÓÂàËËÂÀ_ÐÂðÒÂ@˜ÑÂà§Ñ PÐÂà‰Ö PРXÙ ‹Û€(Ô ˆÑ ˆÑ šÎÂÒ×Â[ÖÂ`Ê PÐÂ@t× ΠFÜÂØÖÂüÐÂÀÆÂ€ÏÍ ÁÒÂàÅÌÂ@ÒÂÀGÔÂ@žÐ€|ÆÂ šÎÂ`“ÊÂ`±ÅÂ@ªÎÂ@°ÍÂ@ÈÉÂÏ »ÓÂ`àÒ©ÉÂ@ŒÓ€«ÓÂ ÛØÂ@ŒÓÂöÑÂ@žÐÂ`ÍÂÍÂÌ ðß \ÎÂÀèÎÂäÔÂ`ÔÔÂðÒ GÇÂ@°ÍÂ@†Ô ˆÑ€vÇ d×Â`oÐÂ@¼ËÂàÜÝ ÷ÉÂ@’Ò€ÉΠóÔ ÍЀ ÙÂU×Â`{ÎÂ@¶Ì ¦ÌÂ`Í †Ç€.Ó€:ÑÂ`òÏ€ØÂà›ÓÂ@ÑÂÆÙÂÀÊÓÂ`!Ý  ÍÂ`Í€ÛËÂ@¼ËÂ@ÓÂàÓÂ@ÓÂ@àÅÂΠåÌÂàNË€ÛËÂÀ•Ç ËÂ@EÊÂ@°Í€ÖÂà¡Ò€XÌ€íÈÂàØÂ€¥ÔÂà$Ò hÌ ÙÎÂÏÂ@ŒÓÂ`þÍÂõæÂ`ÔÔ ÄÇÂÀƒÊÂ>ÆÂÀîÍÂ@WÇ ÷ÉÂàãÇÂàfÇÂ@'ÏÂ`ÍÂ@?ËÂÀèÎÂÀÜРñÊ eÂÂ`þÍÂ@’Ò ÇÑ€‡ÙÂ`“ÊÂà³ÏÂÀôÌÂ`E×Âà¿ÍÂàÔÂ@°ÍÂÀqÍ †Ç€·Ñ ÷ÉÂ@¤ÏÂÀ}ËÂ`òÏÂÀ}Ë ëË €ÈÂ`?ØÂ óÔÂÏÂÏÂ`"ÈÂ`¥ÇÂàNË€¥ÔÂÀúËÂÀ‰ÉÂ@9ÌÂ`ÞÂÀƒÊÂÀúË€ÃÏÂ@9Ì€ÅÂ`ÈÖÂÀÄÔÂ`þÍ 8Ô ÙÎÂmÓÂ@ Ô )ÌÂ`ɑ̀(ÔÂ@’Ò ©ÖÂË€áÊÂÀÊ€(Ô ÍЀjÉÂüЀRÍÂÀqÍÂÀèÎÂà×€.Ó€«Ó RÚÂ@°ÍÂà§Ñ€áÊ Ѐ±Ò€×ÂÀÇ ÄÇÂÀÊ€‚Å€¥ÔÂöÑÂàÅÌÂÀ_ÐÂà× ßÍÂ@]ÆÂÀÄÔ€dÊÂÌÂ`Í VÏÂ`ÉÁÂÀYÑÂ@ëØÂ`àÒÂà³Ï€:Ñ€ÖÂÀâÏÂ`¼ØÂÀËÂ`‡Ì pÕ jÖ FÜÂà*Ñ€áÊÂÀèÎÂàÕ€ÉΠóÔ |ÓÂgÔÂmÓÂ`!Ý ¦Ì ¯ÕÂÀSÒÂà×€‡ÙÂ`¶ÙÂà$Ò€ØÂ`3ÚÂÀâÏÂà­Ð€Ú€^ËÂ@ßÚ —Ù€™ÖÂ@Ñ ùÓ€"Õ€ÕÌ€·Ñ€ØÂÀMÓÂà•ÔÂyÑÂ@ÕÂ@ÂÊÂ`Ë ªÁÂ@ýÕÂÀYÑÂ`oЀjÉ€ÕÌÂ`WÔÂÀÜÐÂ`ÚÓÂÀMÓÂ@ÓÂÒ×€dÊ  Ñ€ÕÌÂ`ÊÂÀ;ÖÂà¡ÒÂ@€ÕÂêÓÂ`]ÓÂàÓÂ`E×€.Ó µÔÂ@°ÍÂØÖ ΠvÔÂà Ö ÒÂÍÂÏÂ`øÎÂ@ÓÜÂ`æÑÂ@ÎÈ #ÍÂà‰ÖÂ@nØÂÀ¸ÖÂÀÖÑ µÔ VÏÂ@’Ò /ËÂ@EÊ‹ÎÂ`’ßÂàÐß ‚ÒÂmÓÂ@ÈÉÂüÐÂàÑÊ€±ÒÂ@€Õ ‘Ú€ØÂ`QÕÂÀ}ËÂmÓÂÆÙÂÀ$Å‹ÎÂ@˜ÑÂ@ªÎÂàZÉÂ`oÐÂà6Ï‘ÍÂ@ñ× ¦ÌÂØÖÂ`þÍ ÙÎÂà•ÔÂàwÙÂ`øÎÂ@†ÔÂà›ÓÂ`™ÉÂ`"È‘ÍÂüÐÂÀYÑÂ`¶ÙÂ@'Ï ,Ö &×ÂÀÊÓÂÏÂàÝÈ &× ,ÖÂmÓÂ`™ÉÂÀâÏÂ=ÛÂ`E×Â…Ï€LÎÂà§ÑÂ@ÓÂÀÄÔÂ`¶ÙÂÌØÂàËËÂÒ×Â@¶Ì€ŸÕ RÚÂ@ªÎÂà•Ô ÙÎÂ`:Ä€«ÓÂ@'ÏÂ@†Ô ùÓÂÀÊÂÀèÎÂà0РtÊÂÀ¸ÖÂÎÂ`"ÈÂ`oÐÂ`{ÎÂÀÜÐÂ8ÇÂ`.ÆÂ@˜Ñ€ŸÕÂmÓÂ@QÈÂÀGÔÂÀ³ÂÂ@€ÕºÛÂ`4ÅÂ`“Ê çÖÂ`ÚÓ ÎÂ@EÊÂ@¼ËÂÀ0ÃÂÀk΀LÎÂРµÔÂ@ñ×€×ÂÀdä€oÝÂ`ÍÂ`]ÓÂ`ÍÂÀôÌ  Í šÎ )ÌÂÀËÂàÕÂ`àÒ€«ÓÂ`ŸÈÂ@{Á€ Ä tÊ ¸ÉÂ`ÔÔ€ÏÍÂmÓÂÀËÂ`ËÂ`WÔ åÌÂ`uÏ€.ÓÂ`ÍÂ@÷ÖÂà•ÔÂ@æÄÂàlÆÂ`.ÆÂ¯ÈÂÀÐÒÂ`þÍ€±ÒÂ`ËÂ…ÏÂ@žÐ ÙÎÂÀwÌ€·ÑÂàHÌ ßÍ€"Õ tÊÂÀ§Ä—Ì ÁÒ ªÁÂ@ÂÊÂ`àÒÂ`]Ó ßÍ  Í ýÈÂÀ¦Ù ÍЯÈÂgÔÂàZÉÂ@ÎȯÈÂ`{΀FÏÂÀqÍÂ@ýÕÂ`-ÛÂàBÍÂÀâÏÂàÅÌ 8ÔÂÀÜÐÂ`ŸÈ bÍÂàãÇÂ,ÉÂË€|ÆÂ Å Ë ^ØÂ ^ØÂ ¾È ¤Â€LÎÂ`ÍÂÀÆÂ ÈÂ`ìÐÂ`{ΠˆÑÂ@°Í \ÎÂ`±Å ¦Ì€dÊ€çÉÂÀGÔÂIÙÂ@3ÍÂ`Ê€(ÔÂ@’Ò€FÏÂÀMÓ€™Ö ëËÂ@ÎÈÂÀÊ ÁÒ€·ÑÂÀSÒ nË hÌ€·ÑÂ@uÂÂ@ÎÈÂ@!ÐÂÞÕÂà¹Î€ÉΠëËÂÀúËÂÀeÏ ëËÂ@’ÒÂÀkÎÂ`oЀ(Ô€ÂÂÀúË »ÓÂÀ)Ù€çɵÇÂÀSÒÂ@÷ÖÂ@JÞ XÙÂ@zÖ€XÌÂÀÛÂà­Ð ¯ÕÂ@’ÒÂ@¤ÏÂ…ÏÂÀ¸ÖÂà$Ò >ÓÂàÀ€ÏÍ |ÓÂ@Ó€pÈ €ÈÂ`ìРåÌÂÀƒÊ ÙΠ‹ÛÂÀSÒÂÀkΠ\΀‡Ù |Ó ‚ÒÂ@EʯȀpÈ GÇÂ@zÖÂÀAÕÂ@iÄÂÀÇÂÀÜÐÂ@÷Ö tÊÂà›ÓÂà›ÓÂà­ÐÂàÕ ÙΠ”ÏÂ@åÙÂàÓÂ@žÐ‘Í ¯ÕÂ@ÂÊÂ@ŒÓ€±Ò !ÃÂ` Ì€™Ö bÍÂ@žÐÂ`ÊÂÏÂÀYÑ á×€¥ÔÂ@ÑÂöÑÂàÔÂ`òÏÂ@žÐÂ`øÎÂàTÊ€×ÂÀ;ÖÂÀMÓ€ÃÏÂ`™ÉÂ`WÔÂ@ÕÂÀ_ЀùÆÂà§ÑÂà¿ÍÂ`.ÆÂàÊàÂÀôÌ ÇÂ8Ç€áÊ€RÍ #ÍÂ ÊÆÂ \ÎÂ`þÍÂ@ ÔÂ`·ÄÂêÓÂÀAÕÂ@ÎÈÂÀÖÑÂ`oРÓÏÂÀwÌÂ`“ÊÂ@nØÂà›Ó ÿÒÂ@KÉÂ`Í€ØÂÀ¾Õ ©ÖÂà›Ó€LÎÂàÅÌ  ÑÂ@˜Ñ€çÉ ©Ö€“×Â@Õ€XÌ€@ÐÂÞÕ ‹Û —ÙÂÐÂU× £× ßÍÂà­Ð ÎÂÀÖÑ  ÍÂÀqÍÂU×€LÎÂ`ËÂ`iÑÂÀÛÂÞÕ ŽÐÂÀqÍÂ@?ËÂà6Ï \ΠpÕ ÁÒ ‚Ò€4ÒÂÀGÔÂÀSÒÂÀSÒ€±ÒÂà³Ï€·Ñ ‚Ò€LÎÂ`WÔ 2ÕÂà<ΠbÍÂÀ}ËÂ@’ÒÂ`(Ç€ÖÂÀYÑÂ@Õ€iÞ VÏÂgÔÂ@ÍÝÂÀ)Ù d×ÂàkÛ€ÚÂà§ÑÂêÓºÛÂ@˜Ñ d× ”Ï ÓÏÂ@¤ÏÂà›Ó LÛ€:ÑÂêÓÂ@ÕÂ@zÖ€ØÂ`?ØÂ@ÙÛÂÆÙ€ÚÂ@ýÕÂ@ÓÜÂà_ÝÂ`E×ÂÀAÕÂÆÙÂÀ²×Â`žÝ ÒÂ`3ÚÂ`°Ú ½ÝÂ@µá´Ü€×Âàƒ×€{ÛÂ`QÕÂàÅÌ á× óÔ€þÚÂ@bÚÂÀAÕ´ÜÂÀÜÐÂ`3ÚÂ`-ÛÂÀYÑ ÁÒÂ`ÎÕÂ…ÏÂÀkÎÂà­ÐÂÀèÎÂÀ¦ÙÂ@'ÏÂgÔ ˆÑÂÀÇÂ@¶ÌÂà¡ÒÂà³ÏÂ`Í»ÆÂ€íÈÂ@ё̀áÊ‹ÎÂÀ_Ѐ"ÕÂmÓ ýÈÂÀÜÐÂØÖÂàÓÂÀ$Å )ÌÂ>ÆÂ€"Õ  ÑÂÀÊ ;ÉÂ@Ò ØÂ ÎÂ`ìРÇÑ bÍÂsÒÂÀôÌ€jÉÂ`ÏÀÂà6ÏÂ@ªÎÂÀÐÒ€FÏÂÀYÑÂ@9ÌÂ` ÌÂ`ÍÂà³ÏÂOØÂ€× #ÍÂ`ËÂ@’ÒÂ` ÌÂ@ÈÉÂàTÊÂÍÂàúØÂ zÉ»ÆÂ@9ÌÂ…ÏÂË€‚ÅÂ@¤ÏÂà§ÑµÇÂ`‡ÌÂ`™É©ÉÂ@æÄÂà0РDÒÂàkÛÂÏÂà6Ï€çÉÂà*ÑÂyÑÂà6ÏÂ@¼ËÂ`™ÉÂ@oÃÂ`d½Â ÁÒÂ`þÍÂàÝÈÂà¹ÎÂàƒ×ÂàãÇ nË ÖÄÂ`iÑ‹ÎÂÀeÏÂ`ÎÕ \ÎÂ>ÆÂ€@ÐÂàBÍÂàfÇÂmÓÂ`ÔÔ hÌ ΠhÌ ¾È€@ÐÂà*ÑÂÀè΀™ÖÂ@ÑÂÀúË€±ÒÂ@ÓÂÀâÏÂàÀÂàéÆÂ`ÊÂ`àÒÂÀ/ØÂ çÖÂàxÄÂ@ªÎÂÀÈÂ@iÄÂàéÆÂ`ÔÔ€×ÂÀîÍÂ…Ï€áÊÂÀSÒÂ@¤ÏÂàÔ€(ÔÂ`Í |Ó  Í ªÁ ßÍ€ÿÅÂ ÊÆÂ`·ÄÂÀ›ÆÂ@˜ÑÂÀË€XÌÂðÒÂ@°Í€ ÙÂ@€ÕÂÀ_Ѐ±ÒÂР8Ô€XÌÂ`“ÊÂàïÅ€çÉ 8ÔÂÀÈÂÀ}ËÂ@žÐÂ@ ÔÂÀÄÔ‘ÍÂÀèÎÂÀÊÂ`Í€(ÔÂà*ÑÂÍÂà¿ÍÂ`(ÇÂÀMÓÂ@!ÐÂàTÊÂ`{΀™ÖÂ`ÔÔ€^ËÂ@KÉ ÍÐÂyÑÂ@t×ÂðÒÂà<ÎÂÀwÌÂ`òÏÂ`¼ØÂÀMÓ€óÇÂ`øÎ ©ÖÂÀ¾Õ bÍ ,ÖÂØÖÂà§Ñ µÔÂÆÙ PÐÂ`þÍÂ`àÒ bÍ€·ÑÂ@9Ì #Í SÅ€ÛË€ÉÎÂà<ÎÂ ÛØÂ@ÂÊ ÁÒÂÀqÍÂ`]ÓÂÀ²×€¥ÔÂÀÊ )ÌÂà×É€ÃÏ ÷ÉÂ`ÎÕÂà ÖÂ@ýÕ€·Ñ€:ÑÂàÔÂÀ}ËÂ@°ÍÂÐÂU× &×Âà$ÒÂà›Ó ,Ö  ÑÂÀkÎÂ@-ΠÐÅÂäÔÂ@QÈ ,Ö€ØÂ ^ØÂ ‚ÒÂÀSÒ ŽÐÂ@VÜ€FÏ€ÿÅ ËÂÀ}ËÂàBÍ€«Ó ¸ÉÂÏ ¬ËÂà<ÎÂ`ÍÂà× ©Ö€@ÐÂ@9ÌÂà­Ð ÿÒ€±Ò hÌÂ`™ÉÂ`ÊÂà Ö€íÈÂ`“Ê 2ÕÂ`QÕÂà0ÐÂ@ÂÊÂà­ÐÂU×Â`¤Ü€uÜ ùÓÂà¹Î€ŸÕ vÔ€ ÄÂÀAÕÂ@ŒÓ€ÛË€ÃÏ€ÛËÂ@3ÍÂàNËÂ\Á€ØÂ`òÏÂÀ ÉÂ`.ÆÂ ¬Ë€óÇÂÍÂàÅÌÂà6ÏÂ`þÍÂà0ÐÂ`ËÂÀ¦Ù ùÓÂ@¶Ì€çÉ€FÏÂà³ÏÂ`ÊÂäÔ€.ÓÂàÕ€“×Â`KÖÂ@’ÒÂÀ}ËÂ[ÖÂË ÁÒÂ`Í µÔÂàïÅÂ@¼ËÂà­ÐÂàNËÂ@3ÍÂÀ}ËÂà¡Ò€:ÑÂÀ5×€(ÔÂàƒ×ÂØÖÂ@ÇÞ€.ÓÂà ÖÂ`Ë ¯ÕÂÀÚ ðß ÐÂàeÜ€iÞÂàƒ× XÙÂÀÜÐÂU×ÂàÄáÂ`òÏ€çÉ€ÃÏÂ@†Ô óÔÂ@÷Ö€FÏÂ`iÑ€ÏÍÂÀ²×ÂÀÄÔÂ@ÎÈÂ@¼Ë€ÏÍ ÓÏÂmÓ ÆÂà<ÎÂРtÊÂÀÚÂÀ#ÚÂÀ_ÐÂ@\ÛÂ@’Ò ÕÙ yÞ€þÚ€FÏÂÀÝÂàeÜ€ÉÎÂ@ŒÓÂÐÂà6Ï ‘ÚÂ8ÇÂêÓÂ@ÑÂU×Â7ÜÂÀƒÊÂ@ÎÈÂ`ÎÕ€ÚÂ`cÒÂ@'ÏÂ`E×Â`WÔ€‡ÙÂàÑÊÂCÚÂ@Õ€þÚ€½ÐÂ`òÏ€½ÐÂäÔÂÀÈ—Ì Ú€‡Ù d×€·ÑÂ@ ÔÂ`iÑÂ@PÝÂ@€ÕÂÀeÏ€ÕÌ JÑ€ŸÕÂà­Ð€(ÔÂÀMÓ€ÖÂ@’Ò€"Õ€ØÂÀÐÒ  ÑÂРßÍÂà6ÏÂ@!ÐÂ@EÊÂÀ¸ÖÂà$Ò ¯ÕÂà6Ï€ŸÕ »ÓÂ@°ÍÂ`ÚÓÂ@ÕÂ@9Ì®ÝÂ`Í€|ÆÂ #Í ÷É XÙÂ@ÓÂ`æÑÂàÕÂà×ÂðÒÂÏÂàBÍÂР)Ì AÈ€L΀dÊ ùÓÂðÒÂ@ëØÂ€±Ò d×€XÌÂ@˜ÑÂÀYÑÂ…ÏÂÀ¬ØÂ \ÎÂàéÆÂ@ÚÆÂÀ*ÄÂÀÊÓ€ØÂ‘ÍÂÀËÂÀ_ÐÂ@†ÔÂ@-΀jÉÂ`ËÂ2ÈÂ@’ÒÂ`cүȀóÇÂöÑ ØÂ ¦ÌÂÀÐÒÂ@˜ÑÂmÓÂ@ÕÂ@zÖÂ`QÕ ;ÉÂ2È "âÂ[ÖÂ@QÈÂ@†ÔÂÀkÎÂàTÊ€ÕÌÂ`QÕÂРÙÎÂÀGÔ ‘Ú \ÎÂ@zÖÂ`uÏÂ@ëØÂ |ÓÂ` Ì ÛÂÀôÌ ÿÒÂàeÜÂ@Ò çÖÂ@nØÂÀMÓ®ÝÂäÔÂ`ýâÂà›ÓÂàÔ ©Ö ØÂÀÛ€±ÒÂàúØÂàeÜ Ÿâ€×Â`oЀLÎÂ@t×Â`9ÙÂ`¶Ù ‘ÚÂsÒÂ`Â×Â`¤Ü€"ÕÂÀ;ÖÂà0ÐÂÀÊÂêÓ óÔ ÿÒ€4ÒÂÏÂÀAÕ šÎ ŽÐÂ[Ö€×Â@JÞ pÕÂÀúËÂgÔÂOØÂU×Âà$ÒÂ@¤ÏÂÀÖÑ€ØÂ`øÎ€ÚÂ@\Û ^ØÂ@t×ÂÀÄÔ€“×ÂÀeÏÂäÔÂgÔ€"ÕÂ@t×ÂØÖ€à߀(Ô ·ÞÂ@8á ½ÝÂäÔ€{Û ±ßÂ`WÔ ùÓÂàËËÂà$ÒÂ`ËÂÀ²×ÂaÕ çÖ |ÓÂ`ÎÕÂ@hÙ€×ÂÀçã ©Ö€™Ö ÜÂöÑÂ`¤ÜÂ`]Ó Øã€æÞ€ÚÂ@zÖÂàúØÂ@ýÕÂÀjã ð߀þÚ 2ÕÂÞÕÂ@ÓÂÀ²× ¯Õ€‡Ù 4߀¼åÂÀÚÂ@÷ÖÂà×Â7ÜÂ@ñ׺ÛÂà}ØÂ@nØÂ yÞÂ`’ßÂÀ;Ö —Ù ÃÜ€ŸÕÂ`9ÙÂ@‹èÂÀß êàÂ`oЀ¥ÔÂ@÷Ö ¾ÈÂÀGÔÂÀ¾Õ 5ÊÂ`ÚÓÂöÑÂà³ÏÂÏ »Ó€·Ñ—ÌÂ`E× ÇÑÂà­Ð VÏÂ@ªÎ€ ÙÂöÑÂ`°ÚÂàÜÝ€ÃÏÂàwÙ ãÂ`E×ÂÆÙ ©ÖÂ`!ÝÂ…Ï d× ^ØÂU×Â@ÕÂ@9ÌÂÎÂ`9ÙÂÀ¦Ù€Ú€LÎÂ@VÜÂàÕÂ@ÙÛÂÀ/ØÂÀÊÓ€øÛÂ`Â×Â ÛØÂ nË Ú€¥ÔÂ`ªÛÂ`ÚÓÂàèÛÂÀ¦ÙÂ@÷ÖÂÀÄÔÂ[ÖÂ@!ÐÂ@ÂÊÂ@nØÂ á×Â@DßÂà ÖÂ@bÚÂ2È ¯ÕÂU×€ìÝ £×Â@Ò 2ÕÂÀ5×Â@\ÛÂàËËÂÀÖÑ£ÊÂ[Ö 8Ô ©ÖÂà*Ñ€(Ô€ŸÕÂ@ŒÓ€.Ó bÍÂ@-ÎÂ`ÊÂÀÚ€ÖÂ`þÍÂÐÂà$Ò GÇÂ`ÈÖÂ@àÅÂÀ}˯ÈÂ`¶Ù ¬Ë GÇ  ÑÂà¹ÎÂ@zÖ ©ÖÂ`ÎÕ  Ñ £×ÂU×Âà‰ÖÂ`3ÚÂ@˜ÑÂàÓ ØÂ@bÚÂÀYÑÂ`Â×Â[Ö€ÃÏÂÀGÔÂÀeÏÂÀÈ —Ù |ÓÂÀèÎÂ`øÎÂ`QÕÂÀYÑÂÀÐÒÂàÔ€ÕÌ€4ÒÂ@¼ËÂ`ÔÔÂÀÚ—ÌÂ…ÏÂ@ÓÂ`þÍÂ@°ÍÂà›ÓÂ@’ÒÂÀèΠ2ÕÂ@ÕÂ`WÔ šÎÂà¹ÎÂà‰ÖÂ`ÈÖÂÀGÔ ËÂàNËÂêÓÂ@ÙÛÂ@bÚÂ`]Ó 5Ê€:ÑÂàúØÂäÔÂÀôÌ ‚ÒÂ` ÌÂÀSÒ€:Ñ€áÊ€@ÐÂÀGÔ ÛÂ,ÉÂ@ÒÂÀîÍÂ`ÍÂØÖ ÿÒÂ@¤Ï #ÍÂÏ£ÊÂ`ÚÓÂ`QÕÂÀÈÂ@ Ô ,Ö€“×ÂÀ/ØÂ€FÏ€4Ò µÔ€uÜ ^ØÂ`æÑÂà$ÒÂ@åÙ ÒÂÀ¦ÙÂêÓÂà›Ó —ÙÂgÔÂ@nØÂÀ¾ÕÂ@ñ×Â@¤ÏÂ@¶ÌÂ@PÝ€FÏ€ØÂ`?ØÂ d×Â@€ÕÂ@3ÍÂÀwÌÂ`9ÙÂaÕÂ`ß FÜ€ØÂ@bÚ PЀ.Ó |ÓÂà§Ñ€ÚÂ@÷ÖÂàÜÝÂà‰ÖÂCÚÂ@¤ÏÂÀ²×€ÚÂ`-ÛÂ[Ö ŽÐÂà}ØÂ ÁÒÂ`žÝÂOØÂ@ýÕÂ@÷Ö€Ú VÏ LÛ ÕÙÂgÔÂ@ŒÓ€ÂäÂà¾â€ÔáÂOØÂ@ÇÞÂàúØÂ ÙÂ`¶ÙÂàØÂ@8á @ÝÂá€Ú ÕÙ€iÞ yÞÂ@åÙ {èÂ`¶ÙÂà×Â`ŒàÂÀÜÐÂmÓÂ@¶ÌÂàÔÂ…ÏÂ@µá &×€±ÒÂðÒ á×ÂÀ#ÚÂÀ”ÜÂÞÕ ¦ÌÂ@÷Ö /ËÂÀÝÂ@t×ÂäÂ@ÍÝÂ`Œà …ÜÂà¡ÒÂÀ5×Â`cÒ ©Ö€ØÂÀ|à€FÏÂöÑÂ@\ÛÂÀÚ jÖÂ@hÙ ÜÂâ sß  ÍÂÀîÍÂ@ýÕÂ@t×Â`KÖ€ ÙÂàâܺÛÂOØÂà<ÎÂ`QÕ€ìÝ€ÖÂ=ÛÂ`žÝ€þÚÂÀMÓ ©ÖÂ`°ÚÂÀeÏ€øÛÂ`ÚÓ óÔÂ`!Ý >ÓÂà‰Ö€ŸÕ€ØÂ@hÙ PЀ¥ÔÂ@zÖÂàqÚÂÀGÔÂ@ÙÛÂ@ªÎ€øÛÂ@ÓÂ`Ë´Ü XÙÂ@ŒÓÂÀ#Ú€ŸÕÂ@ëØÂ ØÂ`°ÚÂ=Û€ŸÕÂûåÂ`Œà€ ÙÂÀ”Ü€ŸÕ íÕ€×Âà›ÓÂÀŽÝ DÒÂ@ýÕÂ@÷Ö &× ÝÂÀ_ÐÂÀ¦ÙÂ@†ÔÂÌØÂ€æÞ€Ú yÞÂÀ²× ÓÏÂЀ ÙÂ@zÖÂ@ñ×€Qâ >Ó€±Ò¨ÞÂÀ ÚÂ`øÎÂ`cÒÂ`‡ÌÂÀ¸ÖÂ@DßÂÀ}Ë€ÏÍ yÞÂ@JÞÂ`E× ÍÐÂ7ÜÂÀYÑÂ@zÖÂÀ¬ØÂ€«Ó ÐÂÀâÏÂ@Õ€øÛÂà<ÎÂÀkÎÂ@ÒÂÀÄÔÂ`Â×Â@ýÕÂ`]Ó d× ‘Ú€ÖÂà_Ý ÓÏ ÃÜÂÀGÔÂÀ¸ÖÂOØÂ@ÒÂÀÄÔÂÀ)Ù€¥Ô€¥Ô£Ê€«Ó€™Ö ÿÒ€.ÓÂ@žÐÂà§ÑÂÆÙÂÀ¸ÖÂà×ÂÀGÔÂ ÛØÂàƒ×„äÂÀ)ÙÂàqÚÂà§ÑÂ[ÖÂÀÖÑ€.ÓÂ`]ÓÂÀ¸ÖÂ@ ÔÂ`žÝÂàNË 8ÔÂ@ªÎÂÀèÎÂ@¼Ë»ÆÂÀ;Ö |ÓÂÀÐÒÂ`Â× ÓÏ á×ÂêÓÂ@-ÎÂ@˜Ñ ÷É ñÊ ùÓÂÀ§ÄÂà³ÏÂ`ìÐÂÀôÌÂ,É ¦Ì jÖÂ` ÌÂ@ÑÂà$ÒÂyÑ ßÍÂ@'ÏÂ`òÏÂ`øÎÂgÔ ‚ÒÂÀ¸ÖÂÀkÎÂÀkΠ2ÕÂ@¼ËÂ@3ÍÂÀqÍÂ`?ØÂ@†ÔÂÀÈÂöÑÂmÓÂ`E× šÎÂÀÈÂÀ•ÇÂÀ›ÆÂ #ÍÂsÒÂ`òÏÂ`E×Â@ÑÂ`òÏÂÀƒÊ€(ÔÂ@3Í€L΀L΀·Ñ á× tÊ ,ÖÂ@'ÏÂÀÇ šÎÂyÑÂ1Ý bÍÂ@ÚÆÂ€LÎÂà¿Í ¦Ì€ÏÍÂàÝÈÂÀ‰ÉÂ`täÂÀGÔÂ@ÂÊÂÀ}ËÂ@QÈÂ`¶Ù vÔÂ`ÃÂÂ,É ¾È€‚Å ýÈ SÅ  ÍÂ`]ÓÂà¹Î GÇ€Ö šÎ€ÛËÂ@]ÆÂ /Ë ΠÐÅ zÉ€ˆÄÂ`ÉÁ ¦ÌÂ…ÏÂ@QÈÂÀ ÉÂ@ªÎÂÀ•ǵǠK¼Â@?ËÂ`Ë íÕÂÀôÌ€RÍ€áÊ€ÕÌ€.Ó€ÃÏÂ@iÄÂàxįȀ½Ð £×€pÈÂ@(ºÂÀ×¼ÂäÔ 8ÔÂÀîÍÂÀƒÊ ëËÂ@ÂÊÂ2ÈÂÌ€^Ë ŽÐ €È Å€"Õ ²ÊÂÀ׼€^Ë >Ó€·ÑÂÀqÍ€^ËÂ`É GÇÂ@ÒÂÀ ÉÂàfÇ€ÿÅÂÀqÍÂà¡Ò€·ÑÂÀ_Ѐ^ËÂàHÌ ñÊ€çÉÂàÔÂÀÈÂ`øÎÂàÅÌÂ`øÎÂ@æÄÂàlÆÂ`"È Å ÅÂ@!ÐÂ`É nËÂ@ªÎ€FÏÂ`ÉÁ ;É ßÍÂ`WÔ )ÌÂÀ¿ÀÂàÑÊ ¬ËÂ`ÃÂÂÀ­Ã€pÈ Ò ¾È€ÏÍÂà$ÒÂ@3ͩɠèÁÂà<ÎÂ@žÐÂÀ›ÆÂ bÍÂ`á½Â€ÃÏÂsÒÂ@ÕÂ@?ËÂÀ‰É ¬Ë JÑ€:ÑÂ2È !ÃÂ@˜ÑÂ ÛØÂ€ÛËÂàH̋ΠnËÂà„ÂÂ,ÉÂ` ÌÂ@¶ÌÂ,ÉÂ@øÁÂ@ÑÂÀƒÊÂ@oÀXÌÂ…Ï á×€ŽÃÂ@¾Â`æÑÂ@÷Ö JÑÂàTÊÂ@ÓÂ`“Ê ÿÒ¯ÈÂÀÐÒÂØÖÂ…Ï óÔÂ`ìÐÂàTÊÂà¿Í óÔÂÀAÕÂÀ¬ØÂÀ²× bÍÂ@¶Ì‘Í zÉÂ`QÕÂ@'ÏÂàúØÂ€{ÛÂàîÚÂêÓÂàûÃÂÀkÎÂ`ÍÂ@ŒÓÂöÑÂÀqÍÂÀƒÊÂÀÐÒ ÷ÉÂÀâÏÂ`-ÛÂà‰ÖÂÀÜРvÔ‹ÎÂÀ ÚÂÀ›ÆÂüÐÂ@Õ€{Û€«Ó >ÓÂ`oЀ(Ô€XÌÂ@’Ò —ÙÂCÚÂ@°ÍÂ`Í£ÊÂàÕ€ÃÏ€ÚÂàÝÈ ,Ö ŽÐÂ`¥Ç€ŸÕ ©ÖÂgÔ ŽÐÂàúØÂ 8ÔÂüРÇÑÂ`"ÈÂ@-ÎÂ`"ÈÂ@9Ì€FÏ ²Ê‘ÍÂ`øÎ  ÑÂ@VÜÂ@ÈÉÂÀâÏÂ`{΀½ÐÂÀkÎÂ` ÌÂàÅÌ€ÉÎÂà‰ÖÂÀeÏÂ@ñ× á×ÂÀ)Ù äáÂØÖÂ&Ê€·ÑÂ`QÕ ˆÑ€4ÒÂÀÊÓ€@Рˀ^ËÂÐÂÀMÓÂàÅÌÂÀ¸Ö€cß »ÓÂ`Í ßÍ  ÍÂÐÂ`WÔÂ ÛØÂ ùÓÂàqÚ€×Â`ÍÂ@ÍÝÂÍÂÍ€·Ñ Uä >Ó ñÊÂà×ÉÂÐÂðÒ íÕ€ÖÂàÔ 2ÕÂà­Ð€WဟՀ¥Ô |ÓÂ`ìРíÕÂ`ÔÔÂmÓ Ù€«ÓÂÀ5×Â[Ö µÔÂ@÷ÖÂ=ÛÂàôÙ ùÓ€¥ÔÂ@€Õ€(ÔÂ@¤ÏÂÀkΠ¾ÈÂà•ÔÂÀùàÂÒ× VÏÂ@3ÍÂ`"ÈÂ`“Ê ¦ÌÂ`3ÚÂÀ¸Ö€XÌÂàÑÊÂ`ÔÔ€(Ô µÔÂ@t×Â`øÎÂà$Ò ¯ÕÂÀ)ÙÂ@ßÚÂÀ5×€±ÒÂ`ÎÕÂÀ¾ÕÂ@ÓÂ@Ó€àß ¸ÉÂ@€Õ€ÛË DÒÂ@ßÚÂà$Ò ‘Ú€oÝ€.ÓÂyÑ óÔÂÀÝÂàÕÂ@ýÕ AÈÂÀ;Ö —ÙÂà›ÓÂ@9ÌÂ[Ö ‹ÛÂÀ5× ,ÖÂàúØÂàâÜÂà›ÓÂ`E× &×ÂàÑÊ ØÂÀ¬ØÂ€“× DÒÂÀÐÒÂ@EÊÂêÓ |ÓÂà×É€þÚ€ÕÌÂIÙÂIÙ€FÏ€pÈÂ`“ÊÂà³Ï€(Ô ^ØÂ@ ÔÂ`Í d×ÂäÔÂ@8á &×ÂÀ;Ö 2ÕÂ`òÏÂ@ ÔÂÀ_Р#ÍÂ`iÑÂÀÛÂmÓ€ØÂ´ÜÂà6ÏÂU×ÂIÙÂàNË 5Ê hÌÂ@PÝ ØÂ%ß Ý JÑ€™Ö PÐÂ`àÒÂÐÂ`ÎÕ€“× :ÞÂüÐÂÀÜÐÂÀ§ÄÂÌØÂ€FÏÂØÖÂ`àÒÂ@’Ò ÜÂ@zÖ µÔÂ`9Ù€±ÒÂÀúËÂmÓÂ`ÍÂàéÆÂ@žÐ bÍÂ@€Õ ÇÑ ÍÐÂ@ŒÓÂ@˜ÑÂ`iÑ€× óÔÂ`Í PР/Ë íÕÂàËË€íÈÂ@ÎÈÂà³Ï ÿÒ€æÞ ÕÙ ÁÒÂ@ýÕÂ`¤ÜÂà×€(ÔÂÀËÂà§Ñ 8Ô ÚÂÀÛÂà$Ò Ò á×Â+Þ€FÏÂ`ÈÖÂÀ¸Ö íÕÂyÑ ”ÏÂ@hÙÂ@nØÂ@ýÕÂ`ÔÔÂà<ÎÂ@÷ÖÂàËËÂÀ_РšÎÂàÓÂ`þÍÂÀ²×‹Î ÇÑÂÀYÑ yÞ€{ÛÂgÔ€ØÂ |ÓÂ`QÕÂ@€ÕÂ@ŒÓÂàÕÂ`àÒ bÍÂÀ›ÆÂœàÂ`ÔÔÂØÖÂ@°ÍÂ`WÔ ùÓÂÀkΠpÕÂ`oÐÂ@¶ÌÂËÂÀ_ÐÂà¿Í ¯ÕÂ@˜Ñ Ï XÙÂ@÷Ö‹ÎÂÀËÂ@ñ×€×ÂàØÂ` ÌÂ8ÇÂÀôÌ€:Ñ )Ì )ÌÂ@ñ×€ Ù á×€jÉÂ@ÒÂÀGÔÂU×ÂÀÜÐÂÀqÍ ”Ï€çÉ—Ì€òÜ€pÈÂ`‡ÌÂà³Ï @ÝÂ`-ÛÂ@ ÔÂ@ÑÂÀèÎÂÀYÑ Ò ‘Ú ÁÒÂ`9ÙÂ`æÑÂ@!ÐÂ`˜Þ€L΀"Õ ÏÂ@Ñ€±ÒÂàÔÂàèÛ€ÚÂ@ýÕÂ@€ÕÂÀkΠÐÂÀÄÔ ÒÂ@nØÂ ÿÒÂ`{ÎÂÁÅÂêÓÂ`ÔÔÂÀÊÓÂÀƒÊÂ`‡ÌÂàxÄ‘ÍÂÀ¬ØÂà$Ò £× /ËÂÀYÑÂ@ýÕÂ@iÄÂ@QÈ€]àÂÀèΠ Í ¸ÉÂÀÄԠǀØÂ@’ÒÂ`ÚÓÂÀÊÂ`“Ê £×€dÊÂ`ÉÂàÕÂà§ÑÂ@˜ÑÂàôÙ jÖ€FÏ hÌÂÀ;ÖÂ@ÒÂàÑÊÂ@3Í®ÝÂ@žÐÂÀSÒ 4ßÂÀeÏÂ`æÑÂ@òÂÂÐÂ`iÑÂ@ÑÂ@¤ÏÂ@Ó ˆÑÂ@ÕÂàËËÂÀÄÔÂ@˜ÑÂIÙ ÉÛ ÝÂÀ¬ØÂ`ÚÓ /ËÂÀ›ÆÂ ÆÂ@oÃÂÀ•ÇÂ`ÍÂàBÍÂäÔ€óÇÂà‰Ö€^ËÂgÔÂyÑ€^ËÂ@ìÀÅÂÀSÒÂ@°Í ,Ö DÒ AÈÂ@€Õ€É΀óÇÂ@KÉÂ@oÃÂà0ÐÂ`iÑÂÀAÕ€·ÑÂ`QÕÂ@ ÔÂ`ÈÖÂÀôÌÂÀwÌÂ@žÐÂàèÛÂ…Ï€·ÑÂÀÄÔÂ,ɑ̀XÌÂÀÜÂ`KÖ ËÂ@ñ×ÂÀAÕ€@ЩÉÂ@!ÐÂ@ëØÂÀÖÑÂ@PÝÂàèÛ ²Ê ˆÑ »Ó€±Ò #ÍÂÀôÌ ¦ÌÂ@ëØÂ ÓÏÂÀƒÊ ëËÂ@ÔÇÂà× ßÍÂ@EÊÂ,ÉÂÀeÏ—Ì ¬Ë€4ÒÂ@nØÂ@€Õ Ò ¬Ë ÒÂ,ÉÂÀÊ€ÕÌÂÀâÏÂàèÛÂI٠ȀL΀½Ð ÍÐÂÀË€“×€¥Ô€XÌÂÀAÕÂà ÖÂÍÂàïÅÂÍÂ@EÊ ÷ÉÂà›Ó >Ó ²Ê€pÈ€(ÔÂ`uÏÂ@9ÌÂÀîÍÂ`±ÅÂ@¤Ï VÏÂ`þÍÂà¡ÒÂàÔ€FÏÂΠÿÒ çÖ ÇÑÂàÑÊÂ@žÐÂ`WÔÂ`æÑ AÈ€×Â@žÐÂÀAÕ  ÍÂ`ÎÕ ÄÇÂ`:Ä VÏ ÍЀÃÏÂ`ÎÕ€ÏÍ€RÍÂÀ¾Õ çÖÂà0ÐÂ` ÌÂ`ËÂÀAÕ ÙÎÂàÅÌÂ@’ÒÂÀqÍÂ`ßç Û€áÊ»ÆÂ €ÈÂ@]ÆÂ`ËÂÀ¾ÕÂ@ªÎÂ@ÔÇÂàÅÌ€|ÆÂ@zÖÂÀÊÂàN˯ÈÂ`oÐÂ@Ò€«ÓÂyÑÂà­Ð ÇÑÂ@žÐÂàHÌÂÁÅÂ@WÇ VÏÂÀqÍ á× Ù ßÍ ŒÆÂàõÄÂà„€RÍÂ`?ØÂàZÉÂ@˜Ñ€“ב̀jÉ SÅÂÀÜР΀RÍ ñÊ€½ÐÂ`ÎÕÂà‰Ö€dÊÂ@WÇÂêÓ€4ÒÂÏÂàÅÌ€LΠPÐÂàNË—Ì€(ÔÂÀÊÓÂÍÂÀ ÚÂ@’ÒÂ`ÔÔ€½Ð jÖÂ@!ÐÂÍ€½ÐÂßÀÂàrÅÂÀ¾Õ ÒÂ`4ÅÂ@EÊ )ÌÂ@ÈÉ ÄÇÂàÝÈÂÀÐÒÂ`æÑÂ`?ØÂ€×ÂäÔÂ`"ȠˀvÇÂÀ‰É ßÍÂaÕ ²ÊÂÀ5× ŽÐÂàÂÂ@ÔÇÂ`·ÄÂÀËÂÍÂ@9ÌÂÀ¸ÖÂmÓÂÌ€ÖÂÀGÔÂÀôÌÂàûàbÍÂÀYÑÂР ÍÂÀwÌ€ÏÍÂ@ŒÓÂ@?Ë °À ’ÅÂ@Õ ¬Ë GÇ DÒÂ@’ÒÂ`WÔÂÀôÌÂ…ÏÂàÜÝÂàãÇÂà§Ñ pÕÂJÄÂ@¤Ï€çÉ óÔ©ÉÂÐÂ@ÑÂÀËÂÐÂ`™ÉÂ`Ë ÄÇÂ`«ÆÂ@ýÕÂ`øÎ ¬Ë zÉÂ@ ÔÂ`àÒÂà¿Í €ÈÂ`øÎÂÀ<ÁÂ ÊÆÂ µÔ€«ÓÂÀwÌÂÐÂàBÍ åÌÂ`ËÂà*Ñ ÙÎÂÇÄ€áÊÂ`ÈÖÂà§ÑÂ`oÐÂà¡ÒµÇÂÀâÏÂ` ̺۠šÎ€jÉÂyÑ€ÅÂÀ É óÔÂÀ ÉÂà­ÐÂÀ¦Ù ‹ÛÂ`þÍ€ÉÎÂ`WÔÂÀÛÂ@!ÐÂ`iÑÂàƒ×ÂØÖÂà§ÑÂÀSÒ ÁÒÂ`Â× d× pÕÂ`9ÙÂà¡ÒÂÆÙ€ŸÕÂ`°Ú >ӠȀ±ÒÂ@ŒÓ€4ÒÂÀwÌ óÔÂÀ‚ß £× »ÓÂÀ5× áב̀¥ÔÂàÄáÂÀSÒ€½Ð >ÓÂ@zÖ åÌ€±ÒÂÆÙÂ`«ÆÂ`þÍÂyÑÂà›Ó µÔ—ÌÂà Ö JÑ ÓÏ |Ó PÐÂÀƒÊÂ@zÖ ÛÂäÔ |ÓÂ@†Ô >ÓÂ@åÙ€pÈÂ`þÍ VÏÂaÕ€@ÐÂ@!ÐÂà Ö€"ÕÂÌØÂàØÂÀúË€RÍÂ@ÎÈ Ï—ÌÂsÒ &×ÂÀÄÔÂ@ßÚÂà$Ò  Ñ€RÍÂ@ÓÂà‰Ö ØÂ`hæÂÏÂ`ìЀ‡Ù PÐÂ@QÈ 2ÕÂ@ÓÜÂ`ìÐÂàËË€™Ö ÒÂàƒ×€ØÂÀÄÔ /ËÂ`oÐÂ@9Ì 8ÔÂ`E×Â@ñ×ÂOØÂ@ÙÛÂÐÂ@zÖ€ÖÂ+ÞÂ@JÞÂÆÙ —Ù€ ÙÂÀÝ ÍÐÂüÐÂCÚÂ`¶Ù ÜÂ=Û šÎ ÛÂ@¤Ï 8ÔÂ`?ØÂÀ²×Â`E×Â@ÓÜÂêÓ vÔÂ`ìÐÂ@VÜÂ@zÖ ùÓÂÀ¾ÕÂ`ÞºÛ€øÛÂ@zÖ óÔÂ@ Ô€ØÂàèÛ€ÈãÂ`¤ÜÂ@ŒÓÂIÙÂ@PÝÂÀ/ØÂ ùÓÂ`-Û ØÂÀÛÂà¹Î óÔ€FÏÂ`WÔÂà ÖÂÀGÔ€É΀ÏÍ ÿÒÂË DÒ€oÝÂ7ܠݠ݀(ÔÂ@ªÎ çÖ€æÞÂ@8á aâÂÀYÑÂ@ßÚÂ`?ØÂ€øÛ€ Ù€:ÑÂCÚÂ@ Ô a‫ÓÂàîÚÂ`’ßÂÀÄÔ€±ÒÂÀÄÔÂ@Õ ‹Û€¥Ô€ÖÂ`€âÂ@bÚ ¥á€ÚÂàGáÂ@ÕÂÀÖÑÂ`¶Ù FÜÂ@!ÐÂ`ÍÂCÚÂ`ÔÔ ÒÂàNË€ÛËÂ@?ËÂ`uÏ ÈÂà*ÑÂÀGÔÂàÓÂIÙÂ ÛØÂ`KÖÂ@ªÎÂ@°ÍÂà•Ô \ÎÂ`àÒÂ`™ÉÂà¹Î vÔÂà¹ÎÂÒ×Â`QÕ ²ÊÂ@¼ËÂ…ÏÂÒ×Â`]Ó€(ÔÂ`{ÎÂàՠ܀«Ó ÅÂyÑ pÕÂ@¤Ï £×€(ÔÂàúØÂ pÕÂ@-ÎÂ@9Ì ¬ËÂ`æÑ€«ÓÂÀôÌÂàÕ d×Â`ÔÔ€“×Â7Ü€áÊÂÀeÏÂà0ÐÂ@-ÎÂàèÛÂ@ÙÛ€"Õ€XÌÂ`iÑÂ`(ÇÂ`]ÓÂà§ÑÂØÖÂÀ²× sßÂà­ÐÂÀSÒÂ@Õ bÍÂ@nØÂРÿÒÂ`¼ØÂ ”Ï hÌÂÞՠ܀(Ô ëËÂ`°ÚÂÀ5×€ÏÍÂ@ŒÓÂà‰ÖÂÆÙ 8ÔÂà}ØÂ DÒÂ…ÏÂÀÊÓÂ@ÑÂ`«ÆÂ€½ÐÂÀÖÑÂÌØÂ€ ÙÂ@ÇÞÂÀßÂ@'Ï  ÍÂÀÄÔ€ÛËÂ`(ÇÂ`ìЀ:Ñ€×Â`Í ‚ÒÂÐÂ`ÈÖÂÀ”ÜÂàîÚ  Í ,ÖÂàïÅÂÎÂ@Ò ²Ê ‚ÒÂ@’Ò üÝ šÎÂaÕÂà­Ð€ˆÄ€|ÆÂ`]ÓÂ2È ÓÏ—ÌÂðÒ ÏÂ`ÍÂmÓ ¦Ì £× ÏÂ@ Ô šÎÂ@'Ï ð߀ÚÂ`]Ó )ÌÂÀúËÂ@EÊÂÀkÎÂ@ªÎ€LÎÂ@iÄÂÀ;ÖÂ`9ÙÂ`uÏ 2ÕÂðÒ |Ó ΀·Ñ #Í ñÊ€ÚÂ@ëØÂàÕÂ`WÔ åÌÂÀ/ØÂ ÐÂ@ëØÂÞÕÂÆÙÂÀAÕÂ`QÕÂÀÈÂÀúËÂÀkÎÂ@EÊÂÀÖÑÂà¿Í /ËÂ`E×Âà›Ó€·ÑÂ`9ÙÂÀ_РJÑ€:Ñ Ò€uÜÂÞÕÂ`{ÎÂ@'ÏÂ@Ó€þÚ€·Ñ bÍ€ÖÂÒ× jÖÂàØÂÀÜ ÕÙÂ@¶ÌÂ@ýÕÂÀ#ÚÂðÒ ÿÒÂà‰ÖÂ`¼ØÂ€:ÑÂ`oЀ@РÙÂmÓÂ`¶Ù€ÕÌÂà¹ÎÂêÓÂ`]ÓÂ`'ÜÂsÒÂàBÍÂ@ÂÊÂÀ²×€|ÆÂ ùÓÂÀ}ËÂ`¥ÇÂ@ÓÂÒ× ¥á€×Â@'Ï DÒÂ`Þ ÏÂ`¥ÇÂÀ ÚÂàqÚÂ7ÜÂà•ÔÂ@’Ò€çÉÂÀôÌ ÁÒÂ`KÖÂ@Õ ÁÒ šÎÂ@ÈÉÂÀèÎÂÀAÕ ©ÖÂ@ýÕ vÔÂ`{ÎÂ`¼ØÂ€ØÂ@zÖ ^ØÂÀ5×Â`°ÚÂ@¤Ï€Ö ØÂ «à€×Â`cÒÂà›Ó€(Ô &×€ ÙÂ`æÑÂÀÖÑÂ@hÙÂàkÛÂà¡ÒÂ@åÙÂà}ØÂ@ÑÂ@ÕÂ`ÎÕÂÀ¸ÖÂÀ;ÖÂ@nØÂ@nØÂÀYÑ ¯Õ€ìÝÂ@ÍÝÂÀ¬ØÂ LÛ€oÝ …Ü€·Ñ ÚÂ@†ÔÂ@DßÂ@!Р©ÖÂàâÜÂÀ5×Â@ÓÜ€æÞ sßÂàƒ×€ÎâÂ`bç  ÑÂ`†á Øã ÜÂÀGÔÂÀ ÚÂÀ^åÂ`ßç Uä (áÂÀˆÞ€Úà Ü€(Ô€Úà€¥ÔÂà ¥áÂÝêÂàÐ߀àß £×¢ßÂ@ëØÂ%ßÂàYÞ Þâ€"ÕÂ@ÇÞÂ`åæÂ ^ØÂ@ÁßÂ`hæÂ=ÛÂ`'ÜÂ1ÝÂå Uä–×Â`3ÚÂ@PÝÂÀ5×ÂáÂ@PÝ Û€òÜ ÝÂ@ýÕÂàMàÂ`žÝ LÛ€uÜÂ@ÁßÂêÓ€×Â@D߀ìÝÂÀ Ú€{ÛÂ@PÝ íÕ £×Â`zãÂàqÚ€¥Ô€æÞÂ@,ãÂ@Ó ð߀ڠpÕ ±ßÂÀ/ØÂ RÚÂÀGÔ€"ÕÂÀGÔ ÁÒÂÀ ÚÂ@ÓÜÂCÚ€“× ^ØÂ öÞÂ@åÙÂ@žÐ vÔ€¥ÔÂ`°ÚÂÀÛÂCÚ€ÖÂ`{ΠÃÜ màÂ`¤ÜÂàqÚÂ`¼ØÂ ,ÖÂàšèÂÀ/ØÂ`°ÚÂÀÜÐÂ`Í GǠ݀4ÒÂÌØÂ@t× jÖÂÀGÔÂÀ‚ßÂÀÝÂ@ÕÂ@JÞÂ@Õ€«ÓÂÀ ÞÂ@\ÛÂ@ÕÂà×ÂÀÛÂ`’߀àßÂà}ØÂ jÖÂCÚÂà­ÐÂÀÐÒÂÀMÓÂÐÂÀÊÓ ÁÒ óԮ݀"ÕÂ1ÝÂ@©ãÂ`øÎÂàØÂ ÇÑÂ`“Ê JÑÂ@t×ÂÀîÍ€‡ÙÂÀÊÓ€ÖÂÀ‰ÉÂ8ÇÂ`ÉÂ`ÍÂÀeÏÂ@9ÌÂÀGÔÂÀ5×Âà6ÏÂÀÖÑÂ@†ÔÂÀqÍÂÆÙÂ`]ÓÂàÔÂ`øÎÂØÖÂÀ5×€:ÑÂÀÖÑ ÏÂ`]ÓÂ`3ÚÂÀÚÂ@nØÂ@åÙ€{Û ÓÏÂ@ßÚ€ŸÕ ÝÂÏ€þÚ ‘ÚÂ@ëØÂÀÚ ÏÚÂÀèΠíÕ€¥ÔÂà ÖÂ…ÏÂÀóáÂÀ¸Ö€þÚ€Ö€¥ÔÂ`9ÙÂàqÚÂ@t×Â[ÖÂ1Ý ¯Õ êàÂ`ßœà€‡ÙÂàôÙÂÀ#ÚÂàÖÞÂà0ÐÂIÙÂàYÞÂ`nåÂáÂà;ãÂ@ÇÞÂ`ýâÂàAâÂ`ÈÖÂ`-Û ÇÑÂà³ÏÂ`'Ü€@ÐÂ@ÓÜ€QâÂU×ÂàÖÞ |ÓÂ`nåÂaÕ€LÎÂà5䀟Հ× …ÜÂ`¼ØÂ \ÎÂ`òÏ€ Ù çÖÂà³Ï á× äáÂàÐßÂ`QÕ€ìÝÂ`Â×Â@Á߀:ÑÂ` áÂaÕÂàÕÂÀ¦Ù uéÂÀjã :ÞÂaÕÂÀÛÂàÜÝ€c߀ÖÂÀAÕÂàÐßÂâÂrçÂ@ýÕ |Ó á×Â@8áÂÀ‚ß ÜÂ@bÚÂÀ#Ú„äÂà_ÝÂ7ÜÂÀÊÓÂ@t×€oݺÛÂÀÚ jÖ€Eä€ÖÂÀÛÂàƒ×ÂÀÄÔÂàúØÂ`'ÜÂ@ÕÂÀ ÚÂà•Ô µÔÂÀ¾ÕÂÀvá "âÂ@\Û ÿÒÂÀváÂÀvá RÚ  ÑÂÀ5×Â@ÓÜÂ@ÍÝÂàúØÂ€ÚÂ`߀Ú€ÉÎÂ@ßÚ€ ÙÂà Ö …ÜÂ@˜Ñ Û &×´ÜÂÀÿßÂ`KÖÂÀÝ ÕÙÂöÑ€oÝ€iÞÂàqڠ݀ÚÂ`ýâ–áÂ+Þ VÏ€þÚÂ`Â×Â`˜Þ áלàÂÀÊÓÂ`žÝÂ`¤ÜÂÀÛÂàS߀uÜ€oÝÂ@åÙ êà€oÝÂ`'ÜÂ`žÝÂØÖÂ@ßÚ üÝ€3çÂàËËÂ@ Ô€¼å€E䠱ߠÒÂ@ßÚÂàÂÀ ÞÂâÂ`¤ÜÂàeÜÂ`åæÂ€¶æÂ€ØÂà_ÝÂ@ÍÝÂàƒ×ÂÀÜЀ@ÐÂÀÚ OåÂàkÛÂ@PÝ äáÂÀ)ÙÂáÂ@bÚÂ`E×ÂÀ/ØÂÒ×Â@ŒÓ–áÂ@»àÂ`¶ÙÂà*Ñ ÕÙÂ`˜ÞÂ@8á ‘ÚÂ`€âÂà#çÂ1ÝÂ ÆæÂÀ ÞÂà5äÂÀŽÝ ^ØÂÀ¸ÖÂ`ýâÂ@ÁßÂÀ¸Ö ¥á FÜÂ@nØÂ€oÝ´Ü ÍÐÂÀ|à ØÂÀSÒ ,ÖÂ`¤Ü ÜÂà;ãÂ@µáÂÀ5×Â`ÔÔÂà•ÔÂ@÷Ö ,ÖÂàâÜ€™ÖÂÀ Þ ÝÂ`uÏÂêÓ PÐÂ@ýÕÂIÙÂÀ#ÚÂÀÊÓÂÀšÛÂÀŽÝ &×ÂâÂCÚ€¥ÔÂàôÙÂàØÂ |ÓÂàúØÂ ÁÒÂÀ¦ÙÂÀ¦ÙÂ@8áÂ7ÜÂ@Õ ÕÙÂ`ßÂÀ²×Â@ßÚÂà­ÐÂ@t×Â@ÑÂ`'ÜÂÀÖÑ€ÚÂÀMÓ€ ÙÂêÓÂ@åÙÂÀ/ØÂ€FÏ —ÙÂàÕ »Ó —ÙÂÀ}ËÂÀÐÒ€¥Ô LÛÂ`àÒ€:Ñ íÕÂÀ ÚÂðÒ ÙÎÂàBÍÂmÓÂÀkÎÂ@рŠÐÂ[Ö€“×Âà¿ÍÂ`oÐÂà*Ñ ‘ÚÂ@ßÚÂÀÝ€RÍÂÀ_ÐÂàwÙÂ@ªÎÂðÒ ÁÒÂÀÖÑ |Ó€Úà FÜÂÀÖÑÂ@t×Â`òÏÂ`°ÚÂ`QÕÂyÑ€ØÂÀšÛÂÀÊÓ ÁÒ€ Ù ÿÒ …ÜÂÀ¬ØÂÀ5׺ÛÂÀAÕ ÓÏÂsÒ  ÑÂ`ÈÖÂàÜÝ€KãÂÐÂ@¼Ë /ËÂ`ÍÂÀîÍÂgÔÂàYÞ ÁÒ€ÉÎÂÀÊÂ`ÎÕÂàúØÂ jÖÂ@øÁÂÌ ‚Ò€ØÂ ÍÐÂÀÄÔÂ1ÝÂ`QÕ ˆÑÂ@ ÔÂà›Ó óÔÂ@9ÌÂ@t×Â@PÝÂIÙÂ`¶ÙÂ@÷ÖÂÀÜÐÂÀwÌÂÀÊÓÂ`øÎÂà‰ÖÂÀèÎÂÀâÏÂ`æÑ |Ó d×  ÑÂ`ìЀ·Ñ€½ÐÂ@ Ô —ÙÂ`QÕÂ`¤Ü€dÊ bÍ  ÑÂ@ÒÂ@ëØÂ ÄÇÂà›Ó–áÂ`QÕ LÛ ‘ÚÂÎÂÀ5×ÂÀÐÒ€RÍ ŽÐÂÀôÌ‘ÍÂÀÊÓ ^ØÂ€±Ò 8ÔÂ`uÏÂÀŽÝÂ@°ÍÂ@åÙÂàÕÂ@ÓÂÀ)Ù€LÎÂ`ÎÕÂ`uÏ VÏÂàÅÌ çÖ ÛÂà`È ,Ö ÕÙ sßÂöÑÂÀâÏÂyÑÂ`KÖ »Ó XÙÂà•ÔÂOØÂ РyÞÂà}ØÂÀwÌÂ@ªÎÂ`oÐÂÀGÔÂ`ÔÔÂ`°ÚÂÀSÒÂ`WÔÂÀôÌÂ@¼Ë€ÏÍÂÀÈÂ`ÎÕ€“×ÂgÔÂÀ_ÐÂ@EÊÂ`ÎÕ€4ÒÂ@€ÕÂàYÞÂÏ ;ÉÂ`ÈÖ ¦ÌÂ@zÖ ÁÒÂ`WÔ€ŸÕ pÕ€¥ÔÂ@€Õ d×ÂyÑ€uÜÂàeÜ :ÞÂ`¼ØÂà›Ó ·Þ 2ÕÂ`æÑ€±Ò€«ÓÂ@ßÚÂÀÛ€ ÙÂ`]Ó XÙ€“×€ÃÏÂU×ÂÀ¸ÖÂà›ÓÂÍ€þÚÂ@÷ÖÂà¿ÍÂêÓÂÀMÓºÛÂ`!ÝÂÀˆÞ€@ÐÂà0ÐÂà³Ï€ŸÕ 2ÕÂ`æÑ€ÖÂàúØÂÀ ÞÂÀŽÝ ÉÛ ‹Û RÚÂ@ÍÝÂÀ¾ÕÂàƒ×Â`ÈÖÂ%ßÂÀÊÓ ÓÏ€@ÐÂÀ²×Â@’ÒÂÎÂ@?ËÂÀÊÓÂÀçãÂCÚÂ@\ÛÂ@ýÕÂÀ_ÐÂgÔÂ`ÚÓ …Ü€æÞÂÀeÏ€·ÑÂ…ÏÂÀ¸Ö€“×ÂÀèÎÂàÓÂ`Ë€½Ð ÇÑÂÐÂÀ¦ÙÂÀ²× êàÂÀYÑÂ`ÎÕÂmÓÂàÕÂ`]ÓÂà›ÓÂàúØÂU×Â@†ÔÂÒ×ÂmÓÂàqÚÂÀÝ„ä€þÚÂàqÚÂ`KÖÂÀùàÂà}ØÂyÑÂ`QÕÂöÑÂàØÂ 8Ô€ÖÂÀÜÂ`KÖ ©ÖÂ[ÖÂ@ ÔÂÀAÕ€uÜÂ`{΀XÌ€òÜÂ+ÞÂ`!ÝÂÀßÂÀ#ÚÂà¾âÂ`ªÛ ØÂ —ÙÂ`àÒÂÀ)ÙÂ@€ÕÂÀ;ÖÂÀeÏÂ@2âÂÀˆÞ ©Ö óÔ ùÓÂÀ‚߀“×ÂÀ¾ÕÂ`?ØÂÀÐÒ »ÓÂ@åÙÂ@nØÂ[ÖÂÀpâÂ@÷ÖÂ`æÑ çÖÂÀèÎÂ ÛØÂÀíâ ÿÒ€:ÑÂÀ)ÙÂ`ÎÕ ÁÒÂÀ ÚÂðÒ VÏ ¯ÕÂIÙÂà›ÓÂ`á½Â á×ÂÀÚ€™Ö€ÏÍÂ`?ØÂ[ÖÂ@ñ×ÂÝêÂÀAÕÂêÓ€½ÐÂ@€ÕÂÀYÑ ©Ö \ÎÂ@t×Â`Â×Â`ßÂàôÙ ØÂ öÞÂÒ×ÂöÑ€RÍ€"Õ€±ÒÂÀYÑ ËÂÀâÏÂ`ÈÖÂàôÙÂà•ԋ΀4Ò€ ÄÂ`ÔÔ ;ÉÂ@t×Âà×ÂÀÐÒ€¥ÔÂ@ýÕ€¥Ô€ìÝÂà§Ñ€½ÐÂÍÂà›Ó€Ú µÔÂ@€ÕÂ@t× —ÙÂà›ÓÂÀYÑÂàƒ×Âà}ØÂ pÕÂàrÅ :ÞÂÀ5×Â@ëØÂ ÍРDÒÂÀèΠñÊÂgÔÂU×ÂÀMÓ€ÛË 8Ô öÞÂ@hÙÂ`]Ó€ŸÕ —ÙÂ@hÙÂàMàÂ`ëåÂ`QÕ ùÓÂyÑÂ@žÐ€RÍÂàHÌÂ`ìÐÂÀ#ÚÂ@VÜÂ@÷ÖÂà¿ÍÂÀYÑÂ@VÜÂÀ|àÂÀ;Ö€(ÔÂ@°Í ŽÐÂÀîÍÂ@åÙ ùÓÂ@åÙÂÀ¸Ö \ÎÂ@ÕÂÀÚÂCÚÂ@€Õ \ÎÂöÑÂÀ_ÐÂ`]Ó€@ÐÂÀ Ú pÕÂ@†ÔÂÀMÓÂÀÊÓ ÝÂàÜÝÂÀ#Ú .àÂà_ÝÂ`QÕ€¥ÔÂ`KÖÂàÔÂÀÊÓ€ØÂðÒÂÀ_ÐÂÀ¬ØÂ@ëØÂ LÛ —Ù »Ó jÖ äáºÛÂ`˜ÞÂÀßÂÀ^å …ÜÂIÙÂ+ޮݠ£×Â@ Ô ÃÜÂÀwÌÂ@ÍÝÂÀˆÞÂàÕÂÀYÑ€]à ÜÂmÓºÛÂ@ÕÂàôÙÂ`cÒ€‡ÙÂÀóá€(ÔÂ`9Ù øè FÜ £×€½ÐÂ@nØÂ —ÙÂÀîÍÂÀÖÑÂ`iÑÂ`iÑÂÀeÏÂ`QÕ ÙÂ`÷ãÂÀ|àÂ@˜ÑÂ`3ÚÂàîÚ d×Âà‰ÖÂIÙ€±Ò€4Ò€:Ñ€ÛËÂÀÜÐÂ@zÖÂ`!ÝÂ@ßÚ€jÉÂ`cÒ pÕÂaÕÂà0ÐÂà¹ÎÂêÓÂÀGÔ ÕÙÂ@žÐ ÍÐÂÀAÕÂ`žÝ çÖÂ@t× ÒÂ7ÜÂäÔÂ@hÙÂÀ_РÿÒÂàîÚÂÐÂ@PÝÂ@nØÂ@¤ÏÂ@,ãÂ@nØÂ€ ÙÂЀ™Ö€™ÖÂ`cÒÂ`ÈÖ€¥ÔÂØÖÂ@t×€Ú LÛ€ØÂàÓÂIÙÂàÓ€ÂäÂÀMÓ€ØÂàkÛ óÔÂÀ/ØÂàYÞÂàqÚ #ÍÂà•ÔÂIÙÂ`ÔÔÂ`9ÙÂ@ëØÂà‰ÖÂmÓÂ`9ÙÂðÒÂ`æÑÂ@ÑÂÀMÓÂà ÖÂà‰Ö€pÈ€:Ñ ÕÙ€(Ô ˆÑÂÏ€ÛË€"Õ vÔ—ÌÂ@Ò€.Ó€ØÂàîگȠØÂ ÙÂÞÕÂà¡Ò€Ö ñÊ ‘ÚÂà³Ï |Ó€Ö jÖÂ`àÒ \ΠJÑ ØÂU× jÖÂàÑÊ 8Ô »Ó Р¬ËÂÀâÏÂ@ýÕÂ` ÌÂ…Ï€XÌÂ@Ñ ÍР)ÌÂÀ²×Âà¡ÒÂØÖÂ@†Ô€ÕÌ  ÑÂÀîÍÂà¹Î€·ÑÂ@!ÐÂàÅÌ€ŸÕ€É΀‚ÅÂÞÕÂDÅÂ@ÔÇÂÀqÍÂà~àÐÂäÔÂÀ²×Âàƒ×€4ÒÂ`ýâÂ…ÏÂÀGÔÂêÓÂàÕÂÀÛÂ@PÝ€Âä€?å€Qâ ¥á€Ôá (á –îÂÀÉè€ïÂ@ ý 7éÂ`Œà–á äÂ@ÇÞ€°ç€ì +ëÂïçÂàóîÂàê€ññÂ`€â QïÂ ÆæÂ€¤éÂ`Çë Àç€!êÂÀ(îÂZëÂTì ®êÂ@©ã€Ùõ€¶æÂÀ{õÂqü KðÂÀþôÂ`‹õ =èÂÝê€ßôÂÀ"ï úÂöÂ<ðÂ`2ïÂÀ‡ó cì ®êÂàvîÂ@[ð æë€ìÂZëÂ@yëÂÀ óÂãéÂ`nåÂ@Cô€˜ë þç ï øèÂÀ.íÂ`ÁìÂ`8îÂ`&ñÂ`Óé åÂË퀞êÂÀ«íÂ`ñäÂ@…éÂ$ôÂà²ä çÂ`åæÂ×ëÂ`Á쀤é IæÂ`VéÂ%ßÂ@,ãÂ@—æÂ€Ôá ®êÂrç `÷ ãÂ@ê„ä ½ÝÂà5äÂ`täÂÀFéÂà¬åÂàÿì ¨ëÂûåÂ@sìÂÀíâ€QâÂÀ.íÂàŽêÂá Ü ™ãÂÀùà ué sß OåÂ`ÞÂÀ(ê€cßÂ`DìÂà²äÂ@»àÂÀ²×€3ç OåÂ`zãÂÀ Þ€æÞ gá­òÂ@ØðÂ@çÂÀFéÂ`3Ú mà çÖÂÀíâ gá€ÂäÂÀÏçÂ`÷ãÂÀíâ Òä ?òÂÀÿß Ìå ¢ìÂà”éÂÀÜÂ@£äÂ@8ဠîÂ@PÝÂ`Óé€EäÂ`ßÂ@bÚÂà€àßÂ`âÂÀáä 4ßÂÀÚÂ@&äÂ`ß ‹Û€Wá LÛÂà¬åÂÀíâ UäÂÆÙ€“×Â`˜ÞÂ`3ÚÂ`'ܨޠÚíÂ ÛØÂÀáäÂ`˜ÞÂ@,ãÂ`Â×ÂàwÙ€Úà€EäÂàAâÂÀ ÞÂÀváÂà}ØÂ gá gáÂàîÚÂ@VÜÂ@VÜÂà;ãÂ@ÓÜÂ@÷Ö€‡ÙÂ`’ßÂ`¶Ù ÉÛÂàØÂ yÞÂàÔÂàîÚ€WáÂ=ÛÂ@÷ÖÂ`¤ÜÂ`WÔ€ÚÂÀ²×Â@bÚÂà ,Ö óÔÂ@bÚÂ@ÓÜ€Ú >Ó óÔÂâ pÕÂàÓ€ ÙÂ@ÕÂà}ØÂ€ÚÂ`°Ú >ÓÂ@bÚÂ`ªÛ ‘Ú‹ÎÂàՠ݀ŸÕÂ`3Ú :ÞÂàÖÞÂ`3ÚÂ`ÎÕÂàÄáÂ+ÞÂ ÛØÂäÔÂÀ”Ü ½ÝÂà×ÂÒ× ÕÙÂ@éÂ@bÚ€“×ÂðÒ LÛÂÀÛ ëËÂÀˆÞ€.ÓÂàúØÂ@˜Ñ€àßÂÀ‚߀ÚÂ7Ü @ÝÂ[ÖÂâ ±ßÂ`zãÂ`†áÂ`]Ó€oÝÂà¸ãÂ`ÈÖÂ@’Ò ©ÖÂÀYÑÂ`iÑÂ@ŒÓ jÖÂIÙÂCÚ€@ÐÂà<ÎÂ`“Ê ä€Îâ Û ÝÂêÓÂ`æÑÂ@ÍÝ  ÑÂÀÜÂ`ÎÕÂ`ßÂÞÕÂÀˆÞ ÚÂÀÜÐÂ`3ÚÂàYÞÂ@JÞ 8Ô€þÚ üÝÂàSßÂU×Â`3ÚÂà}ØÂà¸ãÂÀÐÒÂäÔ ˆÑÂêÓÂ`ËÂ`ÈÖÂ`¶ÙÂ@÷ÖÂêÓÂ@ŒÓÂ@ŒÓÂ@D߀ŸÕ€4ÒÂà ÖÂ`E×Â`ÞÂàîÚÂ`9ÙÂàÔÂ`Í vÔÂ`¶Ù d×Â@ ÔÂáÂ@ßÚÂÌÂÞÕÂÀÖÑÂ` áÂ@ Ô Ë íÕ ØÂ€øÛ€iÞ€×€ŸÕÂà Ö€‡ÙÂ`°Ú ©Ö ÏÂØÖÂ@JÞ ÝÂÀÝÂ`æÑÂÀMÓÂ ÛØÂ ŽÐ 2ÕÂàAâÂ@ëØÂÀ#ÚÂ@bÚÂâÂàâÜÂ@ å @ÝÂ@nØÂàMà pÕÂ`àÂ[ÖÂЀ·ÑÂaÕ€×Âà³Ï ©ÖÂÀXæÂIÙÂà}ØÂºÛÂ`ŒàÂ`3Ú ðßÂ`ËÂØÖÂÀ Þ€·Ñ XÙÂÌØÂàSßÂàÄᠱ߀ÈãÂ@€ÕÂàúØÂà¡Ò€ÚÂ@ÒÂ`cÒÂ`âÂÀ¸Ö®Ý ÙÂá€ØÂ ÛØÂÀ/ØÂ¨Þ€cßÂÌØÂ`˜Þ€KãÂÀ^å´Ü€±Ò ,ÖÂÆÙÂàÖÞÂ@ÙÛ€.ÓÂäÔ .à€ Ù  Ñ sßÂ`žÝÂÀùàÂ@µáÂ@Á߀ڠ8ÔÂàwÙ€‡ÙÂ`ÎÕ s߀{Û ‘ÚÂ@nØÂ (áÂàMàÂ@ýÕÂÆÙ :ÞÂ@ñ×Âà›Ó€ØÂ@éÂ`'ÜÂ`æÑ€ ÙÂÀ”Ü d× ØÂÀ¬ØÂ óÔ :ÞÂ+ÞÂÀSÒÂÀMÓ jÖ ÚÂ`tä LÛÂà_Ý çÂ`bçÂà Ö€cßÂ`!Ý€.Ó€iÞÂà}ØÂÀMÓ RÚÂÀáäÂ`Â×ÂÀÜЀŸÕÂÌØÂ@ÓÜ€æÞ ÚÂÀk΀ÚÂyÑ€¥ÔÂàØÂ@ÙÛÂà Ö€‡ÙÂà× &×Â@ÁßÂ`ÎÕÂ`{ÎÂ`'Ü šÎÂ`.ÆÂ@ŒÓ 8ÔÂà×Â@?ËÂêÓ …ÜÂÀÕæÂ`Ë >ÓÂÍÂÀ ÚÂ`?ØÂÀ”ÜÂ@°ÍÂgÔÂÀ”Ü ½ÝÂ`Â×ÂÀÜРÚ 2Õ€:ÑÂÀqÍ€(ÔÂ`ÎÕÂêÓÂÀÐÒ€áÊÂà§ÑÂ@hÙÂ`iÑÂÀâÏ€™Ö ØÂ ùÓÂÀ¸ÖÂ@ŒÓ  ѵÇÂàÕÂ`oÐÂöÑÂ`ÚÓÂ`KÖÂ…ÏÂ`QÕ µÔÂ`ÎÕÂà*Ñ >Ó€¥Ô€.ÓÂÀ;ÖÂÀ¸ÖÂ`øÎÂÀ_ÐÂÀkÎÂРPÐÂ@Ñ pÕ [ã»ÆÂ hÌÂ`uÏ€"ÕÂ@˜ÑÂ`KÖ á×ÂàÓÂЀvÇÂ`ÚÓ€ ÙÂàôٵǠµÔÂêÓ ¦Ì€±ÒÂÀîÍÂà§Ñ ˆÑÂ@žÐ ¸É€çÉÂàÕ€ŸÕÂàTÊ #ÍÂÀYÑ ©ÖÂÀ ÞÂmÓÂ…Ï PРßÍÂÀ³Â ùÓÂàfÇÂÀ¾Õ€(ÔÂÀGÔÂ`QÕÂÀYÑÂ@-ΠÚ vÔÂ`àÒÂÀŽÝ€ÏÍÂ`òÏÂÀÊÂ`þÍ€FÏ ²ÊÂ`uÏ zÉÂ`òÏÂ@ ÔÂà×ÉÂà$ÒÂàTÊÂ`iÑÂÀ ÚÂÀ¬ØÂÀ•ǯÈÂ`ÍÂ`Ë 2Õ€LÎÂàãÇÂàÔÂàØÂÀîÍÂ`ÍÂ`WÔÂàÕÂÀ‰ÉÂÏ€ÿÅÂ…Ï€4ÒÂàÅÌ VÏ ‚Ò€·ÑÂ`cÒÂ`øÎÂ`«ÆÂ@!ЀdÊ ¸ÉÂ@ÑÂÌ AÈ /Ë RÚ DÒ FÜÂÀèÎÂ@ªÎÂÀ0ÀÃÏ ÅÂ,É ˆÑ€þÚ  ÍÂ`¶ÙÂÀ”Ü€XÌ€FÏÂ@'Ï€óÇÂàÑÊ€™Ö€FÏÂÀƒÊÂ`9ÙÂÀ‰ÉÂÀwÌÂÀËÂ@¶Ì VÏ€jÉÂ@-΀«ÓÂ`]ÓÂ@žÐ€:ÑÂêÓÂàk۠ǀ^ËÂ@ÎÈÂà<ÎÂ[ÖÂÀGÔÂ`ÍÂgÔÂ@'Ï ÇÑÂà*ÑÂ@'Ï€¥Ô€:Ñ ¬ËÂàõÄ ßÍÂ`ªÛÂ@iÄÂÀ_РÏ JÑÂà×É—ÌÂ@†ÔÂ`ÍÂ`Ë€LÎÂ@žÐÂà6ÏÂàÅÌ ^ØÂÀMÓÂ@!ÐÂCÚÂÀwÌÂàxÄÂà§ÑÂ@zÖÂÀÖÑÂ`.ÆÂ )Ì€óÇÂÀôÌÂ`cÒÂ@3ÍÂ@˜ÑÂ`™ÉÂ@EÊÂ@WÇÂ@ªÎ |ÓÂàÅÌÂÒ×ÂÀôÌÂ@ Ô ùÓ ‚ÒÂ@¶Ì€jÉ€@ÐÂÀYÑÂ@'ÏÂÀ²×ÂÀÐÒÂ@!РÄÇÂ@]ÆÂÀƒÊ ëËÂ@bÚÂ,ÉÂ`"ÈÂ@9Ì ¦ÌÂ`WÔÂà¡ÒÂà×Â`{΀pÈ€™ÖÂ`Â×  ÑÂ`¥ÇÂàÑÊÂüÐÂ@'Ï ÁÒÂÀÊÓÂÀâÏ ùÓÂ@ÙÛ £× vÔÂ`‡Ì ‚ÒÂ`ÊÂ…ÏÂàSßÂ`'ÜÂà}ØÂ »Ó ÇÑÂÀÖÑ€ÕÌ€“×€ÂäÂ`âÂÀ”ÜÂà ÖÂàwÙ yÞ€«ÓÂ`æÑÂ@†ÔÂàSßÂ@bÚ µÔ d×€ØÂ€·Ñ ·Þ€:Ñ€òÜ€à߀¥Ô€«ÓÂ@t× £×ÂàwÙÂÀÄÔ ÁÒÂOØÂ@ÙÛ ÜÂ`]Ó ÄÇÂ@-΋ÎÂ`3Ú d×Âà‰ÖÂÀqÍÂÀYÑÂà$ÒÂà‰ÖÂ`æÑ®ÝÂ`øÎÂ`ÊÂ…Ï€"ÕÂÀGÔÂ8ÇÂÀÇÂàÓÂ@t×Â`Ë ˆÑÂ@†ÔÂ`WÔÂ…ÏÂàÑÊÂ@ÈÉÂsÒ FÜ ùÓÂÀšÛ€"Õ «à DÒ ÏÂ[ÖÂ@žÐ€çÉÂÀ ÉÂàúØÂ@3ÍÂ`ÚÓ »ÓÂ@ßÚ ÿÒÂà}ØÂ ÍÐÂmÓÂxæÂIÙ RÚ€:Ñ€“×Â`ÞÂ@>àÂ@ëØÂ µÔÂàôÙÂÞÕÂ@˜Ñ€pÈÂ@÷ÖÂàYÞÂà_ÝÂàMàÂÀÄÔÂmÓÂ@ßÚ ŽÐ @ÝÂ`÷ãÂ`ßÂ`E×Â`]ÓÂÀ#ÚÂ` Ì bÍÂà0ÐÂyÑÂÀwÌÂ`KÖ€ ÙÂ…Ï ÒÂàƒ×Â`9ÙÂ@åÙÂ`«ÆÂ`cÒ ©Ö€.ÓÂ@!ÐÂ`ËÂ ÛØÂ@t×ÂàîÚÂÀ§ÄÂÀ}ËÂÀèÎÂÀËÂ1ÝÂOØÂ`ÎÕÂÀÐÒ »Ó€"Õ€çÉÂ`ËÂà§ÑÂÀqÍÂ`ÊÂÀ;Ö #ÍÂÀîÍÂ@ýÕÂ`Í vÔÂ@’Ò )ÌÂà ÖÂÀèÎÂàãÇÂà¡Ò‘Í >ÓÂ`oÐÂ`±Å€RÍÂ`àÒ€dÊÂ`ÔÔÂ`ÍÂ@€ÕÂ@!ÐÂÀèÎÂ`É€¥Ô€ÚÂà¡Ò€™ÖÂàqÚ€“×ÂРVÏÂàØÂ`uÏÂÀSÒÂ@†Ô€ÃÏÂ@÷ÖÂÀÝÂÀAÕ µÔ€þÚÂÀ‚ßÂ`hæÂ ÏÚÂ@µáÂ+ÞÂäÂ@ÇÞÂ@VÜ€ÖÂÀkÎÂ@¤Ï |ÓÂ`KÖ€·ÑÂ` ÌÂÀqÍÂàrÅ€ÛË ¸ÉÂ`E× MÆÂ€½ÐÂÀ²× ŽÐÂ`oРšÎÂàwÙ ÿÒ jÖÂ`ÉÂР8Ô JÑ µÔÂ@?ËÂ`òÏ€jÉ nËÂ`àÒÂ@ÕÂ@°Í ÷É€pÈÂ@ÚÆÂ !àÁÒ€FÏÂà×Â`cÒ ÒÂ@ÈÉÂàÑÊ »Ó€|ÆÂ`^¾ÂÀÆÂ@EÊÂÀË€ùÆÂ@3ÍÂ@-΀·ÑÂ`ËÂ&ÊÂ@¤Ï vÔ—Ì ¾È ëËÂÀ É€áÊÂ@zÖÂÀeÏÂ@9ÌÂ@iĠǀˆÄÂÀÇÂÀk΀4Ò #ÍÂ`9ÙÂaÕÂ@†Ô—Ì ùÓÂà`ÈÂ@]ÆÂ©ÉÂ@ÈÉÂÀúË ßÍÂ`Û¾Â`ÏÀÂ`]ÓÂðÒ ¬ËÂÀÆÂÀ¾Õ ΀4ÒÂÀèÎÂU×€·ÑÂ@¶ÌÂ@¼ËÂöÑ VÏÂ@ÔÇ ;ÉÂÀèΠVÏÂÀèÎÂÀ¸ÖÂÀÊÓÂ@žÐ ÓÏÂÀ²×ÂÀ;ÖÂÀÊÓ€@ÐÂ@ÑÂ`àÒÂ`“ÊÂ`Ê€4ÒÂÀèΠåÌ >Ó€ ÙÂðÒ ÐÂÀݵǠ)ÌÂ@¤ÏÂàÓ€±Ò PÐÂ`WÔÂ ÊÆÂ—ÌÂÀ_ÐÂ@]ÆÂÀqÍ pÕÂ`?ØÂ`™É€vÇÂ@hÙÂÀAÕÂË€jÉÂ@¼ËÂ@EÊÂ@]ÆÂ€±ÒÂ@ÔÇÂÀ_РÙÎÂÀÇÂ`þÍÂÀ_ÐÂàÕ€þÚÂÀËÂÀYÑÂÀÊ€(Ô ¸ÉÂ`ÊÂgÔÂ`àÒ€½ÐÂÐÂ@ÓÂÀÊÓÂÀqÍÂsÒ LÛÂ`‡ÌÂ@†ÔÂ`ÎÕ åÌÂ`æÑÂäÔ€ÏÍ€:ÑÂ@÷ÖÂà¹Î µÔÂ@'ÏÂ`ÎÕÂà×Â`þÍÂÀ;ÖÂ@žÐ ØÂÀÄÔÂ`òÏÂà0ÐÂÀîÍ€ÖÂÀk΀ÕÌÂ`ÚÓÂ`cÒÂ@ÓÂ@†Ô€"ÕÂÀAÕÂ@÷ÖÂ@ ÔÂÀ¸ÖÂ@ÑÂ`“ÊÂÀÄÔÂ`æÑÂ@ªÎÂ@ªÎ©ÉÂ@ÈÉ ßÍÂ`!ÝÂ`oÐÂÀîÍÂà‰Ö >ÓÂ@ ÔÂÀÚÂÀ#Ú ÐÂÀ;ÖÂ`ÍÂ@KÉ DÒ€±ÒÂÁÅÂÀèÎÂÀ¸Ö€4ÒÂàËËÂ`°ÚÂ`!ÝÂ@Ò PЀXÌÂÀGÔÂ@˜Ñ€4Ò€áÊÂ@ªÎÂ@¤ÏÂÀGÔÂàéÆÂ€ÃÏÂ`{ÎÂàÓ ëËÂΠýÈÂÀÈ€jÉÂ@ìà¬ËÂ`‡ÌÂ`«ÆÂ€.ÓÂÀwÌÂàTÊ€ÛËÂ@ÈÉ€±ÒÂ@ªÎÂ@¼Ë †ÇÂÀqÍÂÀ/ØÂ@bÚÂàÅÌ íÕÂ@zÖÂ`E×ÂÀÛÂ@!ЀRÍÂ@ÔÇÂ@žÐÂÀÊÓÂà}ØÂ¯È ØÂ`ËÂ@!БÍÂ`ËÂ@?ËÂàxÄ DÒ€(Ô jÖÂ`ŸÈ kÁÂÆÙÂ`"È nËÂ@-ÎÂÀqÍ åÌ€½ÐÂ2È ,ÖÂ@3ÍÂ@!ÐÂÀƒÊÂ@Ò ëËÂ@{Á€²½Â>ÆÂ@9Ì€RÍÂ@ÇÞ€FÏ È £× VÏÂÀÐÒ >Ó ˆÑÂ…Ï 5ÊÂÀqÍ ËÂ`øÎÂÀÄÔ 8ÔÂ`ÊÂÀîÍÂà$ÒÂ`WÔ€ÏÍÂ`ÍÂÏÂ`æÑÂ`·Ä€ÕÌ vÔÂ@ÕÂ`ÊÂÀeÏÂöÑÂVÂÂàÂÂÀÊÓÂ`@ÀRÍ FÜ »ÓÂÀƒÊ€×Âà×Â`Í€½ÐÂ`Â× >ÓÂ` ÌÂ@ªÎ ÁÒ€.Ó€:Ñ  Ñ óÔÂÀÊÓÂ@ÔÇ€ÿÅÂ@t× åÌ ÍРÁÒÂ`.ÆÂ€^Ë MÆÂ`þÍÂàõÄ ½ÂÀ_ЀpÈ 2ÕÂàÝÈÂ`ìР”ÏÂ`uÏÂàHÌ #Í€ØÂ@nØÂ ÊÆÂ ÓÏÂàÓÂ`ÈÖ 8ÔÂÀ)Ù \ÎÂàfÇ šÎÂÀ_РzÉÂÀSÒ 2Õ jÖÂ`@ÃÂÐÂ`øÎÂ`ÎÕÂ@ªÎ XÙÂÀƒÊÂ@WÇ€‚ÅÂÀ$Å ŽÐÂÀîÍÂàÅÌÂà×ÉÂÀÜР¯ÕÂÀ‰ÉÂàïÅÂ@ÈÉÂ`@à¸É ƒ½Â€4Ò€ÕÌÂÀÊÂÀÇÂ@-ÎÂÀ_Ѐ±Ò ¦Ì€ÂÂÀ¿À hÌÂU× èÁ 'ÂÂÀ ÉÂ`uÏ PÐÂ@ ÔÂÀ³ÂÂ@øÁ ÈÂ@QÈ€™Ö _ÃÂsÒÂ͠πRÍÂà`È Ä Ä ÐÂ>ÆÂ`ŸÈ€óÇÂ@¤ÏÂ`±ÅÂÀÊÓÂ`™ÉÂàxÄ€ÃÏÂÀ¡ÅÂ`ÃÂÂ@òÂÂÀÈÂÀâϯȀáÊÂêÓÂ…ÏÂ@'ÏÂ`ÊÂÀeÏ ÍР5Ê—ÌÂ@¶ÌÂ@ÂÊÂ`FÂÂ`™ÉÂÀqÍÂà6Ï µÔÂÀèÎÂà×Âà ÖÂ@ŒÓÂ@3ÍÂ@˜ÑÂ@ëØÂ`øÎÂ`¼ØÂ@t×Â@3Í€¥ÔÂÀ5× hÌ ÓÏ 2Õ 8ÔÂ`QÕ€LΠhÌÂÀ}ËÂàZÉÂàÅÌÂ@oà,ÖÂÀYÑ€ØÂ ÍЀdÊ Vϋ΀FÏÂ`?ØÂ  Í £×ÂРRÚ€ÃÏ€«ÓÂà³Ï€‚Å‹ÎÂ@ŒÓ ÕÙÂ@˜Ñ€ÖÂ@3Í ÝÂ@zÖ€ÚÂÀ¬ØÂ SÅÂüÐÂàîÚÂ@ÈÉ ÍÐÂÀÊÓÂgÔÂ@ÓÂ…Ï€±ÒÂ`àÂ`Â×ÂàØÂ &× 8ÔÂ@'Ï ˆÑÂÐÂàÕ íÕÂ`àÒÂàBÍÂËÂ`Â×ÂÀ¦ÙÂÀîÍÂÀ•ÇÂ@ªÎÂË€@ÐÂ`æÑÂ`æÑÂ@3ÍÂà×ÂÀ”ÜÂÆÙ€XÌÂÀ5×€ÚÂÀAÕÂ@ÓÂ%ß ÕÙÂÀ/ØÂ Û 8Ô d×Â2ÈÂÀwÌ ÕÙ ¯ÕÂ`ÚÓÂ`(ÇÂ@t×ÂÀ5×Â`9ÙÂàÓÂÀ ÞÂÀ/ØÂà}ØÂ€RÍÂÏ€·ÑÂêÓÂÐÂ[ÖÂÀwÌÂ`ŒàÂÀÝÂêÓ€Ö ;ÉÂàNËÂ@KÉÂÀƒÊ€ÃÏÂà<ÎÂmÓÂ`Í‘ÍÂÀMÓ€(ÔÂ`ÍÂÀË ÿÒÂ`ßÂ…Ï€{Û ¯Õ FÜÂ`?ØÂ@Ó€×Âá ùÓÂàôÙÂéèÂ`QÕÂ@÷Ö€(ÔÂàkÛÂàwÙÂÌØÂÀGÔÂ@JÞÂ@Áß ÜÂÀdäÂ`ŒàÂàâÜ€«ÓÂÀšÛÂ`˜ÞÂ`ÞÂ`ªÛÂÞÕÂÀ¾Õ LÛ€øÛÂ`¼ØÂ@8áÂÀÄÔÂ@PÝ ¯ÕÂà*Ñ€XÌÂ@ýÕÂà§ÑÂ@¤ÏÂ@†ÔÂÀÜÐÂ`'Ü€ Ù óÔÂà¡ÒÂ@?ËÂÀÊÓ€"Õ £×Â@’ÒÂ@ÙÛ€“× «àÂÀˆÞ »ÓÂàÔ ÝÂÀeÏ Ѐ ÙÂÀ ÚÂ@†ÔÂ@ßÚ€(Ô€ÕÌ ùÓÂ`KÖÂÀ²×€ŸÕÂØÖÂà0ÐÂÀ¬ØÂÀqÍ€“×Â`ÈÖ ÓÏÂÀ/ØÂ`ÚÓ »ÓÂ`ÞÂÀ}ËÂ@ÈÉÂ@žÐÂsÒÂà<ÎÂÀÚÂàÔÂ@°Í‹ÎÂà}ØÂÀèÎÂàÔ ÐÂà‰ÖÂ@˜ÑÂ@žÐÂ`òÏÂ`‡ÌÂ@bÚÂà§Ñ€ÕÌ€™ÖÂ`¼ØÂ@Ò€óÇÂ@˜Ñ ÁÒÂ@Ó 5ÊÂàËË€óÇÂÀÛÂÀAÕ€·Ñ Ï ßÍÂÞÕ€:Ñ ŒÆÂ@÷ÖÂàØÂ€ÛËÂ`{ÎÂàBÍ ÙÎÂDÅÂ`4ÅÂÀYÑÂ@9Ì€áÊÂ@ÓÂ΀XÌ hÌÂÀ/ØÂ`KÖ ÷É ¦Ì ÇÑÂ`oÐÂÀÐÒ€ÏÍÂà¿ÍÂ@zÖÂÀ_ÐÂüРíÕÂ`iÑÂàÂÂ@]ÆÂÀÜЀjÉ PÐÂ`"È ¬ËÂ@¼ËÂ@QÈ çÖÂà­Ð ;É ëË€ÛËÂÁÅ nË >ÓÂÀqÍÂÀÄÔ€^Ë  Ñ ŒÆÂ€ÉÎÂÀ$ÅÂÀ<ÁÂ@¤ÏÂ`ËÂÀƒÊÂàHÌÂÀúË€LÎÂ@¼ËÂÀGÔÂà‰ÖÂ`ÍÂ@°Í€ÅÂ`‡ÌÂÀÜÐÂÀèÎÂÀeÏÂÀ/ØÂÀ#Ú ˜Ä ;É€±Ò€LÎÂàHÌÂÀèΠ¦ÌÂÀÊÓÂàZÉ€"Õ hÌ€¥ÔÂ`Í á×ÂÀ_Ѐ‚ÅÂyÑ ;ÉÂÀƒÊ yÞÂ[ÖÂà<΀4ÒÂ`ÍÂÀqÍÂÀ_ÐÂ@-΀LÎÂÀÄÔÂ@Õ€·ÑÂ@ ÔÂÐÂàlÆÂ@ÎÈÂà§Ñ åÌ Ä Ò£ÊÂÀGÔÂ@!БÍÂ@°ÍÂ`Í »Ó€XÌ YÄÂàÅÌÂàÅÌÂ@€Õ€½ÐÂÀÐÒ€àßÂÀ¸ÖÂà‰ÖÂÀÊÂËÂ`]ÓÂ`ÔÔÂ`ß pÕÂ@€ÕÂ`Í ùÓÂÀ¡ÅÂ`‡ÌÂÎÂÀ¸ÖÂà§ÑÂ[ÖÂà¿ÍÂ@†Ô ‚ÒÂ`ÚÓÂ`QÕÂ@'Ï çÖÂÀeÏ€±ÒÂmÓÂ@åÙÂ@ßÚ #ÍÂðÒ ©ÖÂÏÂà‰ÖÂÀ¦Ù çÖÂ`]Ó€4ÒÂÀÜÐÂ@EÊÂ@'ÏÂ`ªÛ pÕÂÀ;Ö ÇÑ€4Ò€ŸÕÂÀÿßÂmÓÂyÑÂ@t×€ìÝ ÝÂÀ¦Ù€"Õ€ŸÕÂäÔ€ÖÂ ÛØÂ Ë FÜÂàÓÂÀ#Ú€@ÐÂ`ÊÂ@ëØÂ€ŸÕ€ÖÂ@Ó nË ÎÂàúØÂ ”ÏÂöÑ€.Ó€ùÆÂÀ;ÖÂCÚÂÀ•ÇÂàîÚÂ`ÍÂüÐÂ`KÖ ÛÂ`¶ÙÂðÒ€ÛËÂà¡ÒÂÀkÎÂ`àÒÂà¡ÒÂ@\Û @ÝÂÀ;Ö ÷ÉÂÀ;ÖÂ@ÙÛÂ@3ÍÂ`QÕÂÀÄÔÂOØÂ€‡ÙÂà<ÎÂ`cÒÂØÖÂÀÜÐÂ@bÚÂ@ÙÛ€FÏÂÐÂà6ÏÂ@JÞÂ`˜Þ€(ÔÂÀAÕ ØÂ ÕÙÂàÖÞºÛ  ÑÂ@åÙ€‡ÙÂà×Â@hÙÂÀváÂsÒÂüÐÂÀÚÂ@\ÛÂ`ìЀ(Ô vÔÂ`9ÙÂ`žÝ€ Ù hÌ€½Ð DÒÂÀËÂàØÂ ÇÑÂÒ× ÐÂ@ÑÂàØÂ`oÐÂÀMÓÂ@bÚ ÝÂ@÷ÖÂ`ªÛÂ`QÕ€ÃÏ ØÂU× ëË€ Ù  ÍÂà ÖÂ`E×ÂàèÛÂ`°ÚÂà0РÏ€¥ÔÂ`ÔÔ È  ÑÂgÔ€RÍÂÀÖÑÂOØÂ`Â×ÂOØÂ`žÝÂ`ÎÕÂÀÊÓÂÀÊÓÂà­Ð PÐÂ@ÒÂ@-ÎÂЀÅ€ØÂÀ#ÚÂsÒÂàËË€"ÕÂÀ¬ØÂÀÝÂà›Ó ùÓÂÀ/ØÂàâÜÂÀ)ÙÂ@ëØÂ€«Ó€¥ÔÂàØÂ€«ÓÂ@ÑÂU×€ŸÕ åÌÂ@åÙÂ`zã á× ·Þ Ÿâ ÇÑÂà‰ÖÂ@3ÍÂ`òÏ€:ÑÂàÔ XÙ€uÜ —ÙÂðÒÂÀGÔÂ@¶Ì yÞ€ ÙÂ@ÙÛÂ`øÎ ÿÒÂÀAÕ ØÂ Û |ÓÂ=ÛÂà<΀4ÒÂ@†ÔÂ`9ÙÂà*Ñ \κÛÂ`™É€™ÖÂà<Π#Í€·ÑÂ ÊÆÂàÓ ÏÂà`ÈÂ,ÉÂàãÇÂ@ ÔÂ@-ÎÂ`¥ÇÂÀâÏÂ`iÑ ùÓ PÐÂ` Ì€ÕÌ€ÏÍÂ@’ÒÂ@ÒÂ`øÎÂ`KÖÂ`¶Ù FÜÂÀÄÔ ÍÐÂ@-ΠÿÒÂ ÊÆÂ`æÑÂ`ŸÈÂÌÂÏÂ@žÐ óÔÂÏÂ`ìЀØÂàÅÌÂàÝÈÂÀ”ÜÂ@hÙÂ@KÉ ÏÂà ÖÂàÕÂà<ÎÂÀ0à¤Â ÇÑÂ`æÑ€"Õ >ÓÂÀËÂà*ÑÂÐÂÀ›ÆÂ`‡ÌÂÀ$ÅÂ`æÑÂÀMÓ€|ÆÂµÇÂ`{΀ÛË ñÊ ¯Õ ¬ËÂ@WÇÂÀÊÂÀúË ÖÄÂ`ÚÓ »Ó tÊÂÀôÌÂ`ÈÖ€:Ñ€ÛË bÍÂ@ÎÈÂ@uÂÂàéÆÂ@ÈÉÂÀÇÂÀwÌÂà¿ÍÂ@3ÍÂÀË JÑ jÖ€@ÐÂ`øÎ ;ÉÂ`QÕÂÌ )Ì )Ì€·ÑÂàHÌÂàãÇ€ÉÎÂ@¶ÌÂÀAÕÂOØÂ`WÔ \ÎÂ`ÍÂ@ÔÇÂ`É€dÊ€iÞÂêÓÂÀƒÊÂüР”Ï ÿÒÂ@?Ë ;É žÃÂÀâÏÂ@!Р ÑÂà¹Î tÊÂ`ÎÕÂmÓÂ`{ÎÂ@Ò µÔ 5Ê‹ÎÂÀ*Ä€/¾ÂБÍÂÀ5×€XÌÂΠ”Ï zÉ SÅÂà`È ÷É ;ÉÂÀYÑÂàÝÈÂ@€ÕÂÀÇÂ@3Í€ÛË nËÂà¹ÎÂà×ÉÂ@Ñ ¬Ë€ÉÎÂÀSÒÂêÓÂ@'ÏÂ@Ò ñÊÂ@ŒÓÂà¹ÎÂ`KÖÂÀ‰ÉÂ`™ÉÂ`ÍÂÀeÏ€íÈÂÀkΠÖÄ€óÇ ùÓÂ@¶ÌÂàÑÊ ŽÐÂÀ¾Õ€ÚÂà*ÑÂÀSÒÂ@ÎÈÂÀqÍ ¯ÕÂ`WÔÂ`F ;É ÷É€ÃÏ ŒÆÂÏ€XÌÂ`òÏÂ@Ó ÁÒ€RÍÂÀYÑ Ë ªÁÂÌØÂ çÖ€LÎÂ@9ÌÂÀîÍÂ@ÂÊ€RÍÂ@ñ× ‚Ò ŽÐ d×ÂϯȠÎÂÀ¡ÅÂ`‡Ì šÎ ÐÂ`ÍÂËÂÀÐÒÂà<ÎÂ`Ê€ÏÍ AÈÂüÐÂÀ;ÖÂ`Ê ŽÐÂ@ëØÂàÑÊÂÀAÕ ëË€ÛË€(Ô€ŸÕ ßÍÂÌÂüÐÂÀÜЗÌÂ@zÖÂàÅÌÂà0ЀíȩɠbÍÂ@ÒÂ`ÎÕ åÌ È vÔ€XÌ€±Ò€‡Ù€‡ÙÂЀÛË€:Ñ€½ÐÂÀMÓ ØÂÀwÌ YÄÂÀSÒ€±ÒÂà<ÎÂÍÂ@žÐÂäÔ€ÕÌÂÐÂ@'ÏÂà­ÐÂ@†ÔÂ`9ÙÂà³Ï ÙÂ`àÒÂ@ ÔÂà6ÏÂà0ÐÂÀ|àÂaÕÂàúØÂyÑ bÍÂ@ßÚ ËÂ@ŒÓ )ÌÂàíï »Ó ÈÂ@ÚÆÂËÂ@µá€øÛÂà§ÑÂØÖ vÔÂÀAÕÂàAâÂ@µáÂÀGÔÂÐÂ`¶Ù€½ÐÂÀÚÂàîÚÂ`øÎÂ`æÑ Ù ØÂ ˆÑÂ@ÑÂÀšÛÂ`]ÓÂÀšÛÂ`?ØÂ ‘Ú€ŸÕÂüÐÂsÒÂ@˜Ñ€ÚÂ@t×Â@ýÕÂà¾âÂàúØÂ€vÇÂÏ çÖ Ú ÁÒÂðÒÂÀ|àÂIÙÂÀ}ËÂàÑÊ€¥ÔÂ@°ÍÂ`¤Ü€ØÂÀMÓÂàHÌÂIÙ çÖ€“×ÂÀ¾Õ€:ÑÂOØÂÀÝ :Þ€Ö vÔÂ@JÞÂ@-ΠÝÂàYÞÂÀ²× |ÓÂ@ÑÂ@˜Ñ€ìÝ€4ÒÂÀ ÉÂÀ5×ÂÀ¾ÕÂÀAÕ ÏÚÂà$ÒÂ2È pÕÂ@bÚÂ@ ÔÂÀ;ÖÂ`]ÓÂРØÂ@Ñ ÓÏÂ…ÏÂgÔ Ò  ÍÂΠÉÛÂÀ;Ö€"ÕÂà³Ï |Ó€ÛËÂ@t× £×Â@zÖÂР”ÏÂÀ)Ù€"Õ bÍÂà×ÂÀ¬ØÂà­Ð šÎÂÀÄÔ ÒÂÀ_РÒÂ@ñ×Â`òÏ 8ÔÂÀ_ÐÂ@ÂÊÂmÓ€ÃÏÂ@¤Ï€:ÑÂÀôÌ€ÃÏ çÖ  Ñ€ŸÕÂ`ÍÂ`™ÉÂ`{ΠÍÐÂà¡Ò ÇÑÂà­ÐÂgÔÂ@ÓÂ@t× ÎÂÀÈ @ÝÂ`™ÉÂÀîÍÂÀÐÒÂ`ÍÂÀ¸ÖÂêÓ @ÝÂà ÖÂ@°ÍÂ`Í JÑÂ`ŸÈÂ&ÊÂà­ÐÂ`@ÃÂ`KÖ€«ÓÂÀÜÐÂ`øÎÂ@ßÚÂ@QÈÂ`E×Âà<ΠÅ€jÉÂÀMÓÂÀ•ÇÂ@QÈÂÀÊ€FÏÂ@†ÔÂ>ÆÂ d×€L΀ ÄÂ`RÀ \ΠýÈ€ÅÂ`ÚÓ ÒÂÀeÏ GÇ€LÎÂ@ëØÂ@ñ×Âà›ÓÂÀkΠE½ÂÌÂ`ÔÔÂ@?ËÂÀÄÔ bÍÂà¡Ò ,Ö ‚Ò¯ÈÂÀâÏÂyÑ PРÐÅÂ`Ê€ ÀÂÀèÎÂ@3ÍÂÀk΀.ÓÂ@ÓÂ@’Ò bÍÂàŠÁÂàÕÂ@WÇÂàBÍ Ü ‚ÒÂ…ÏÂ`øÎÂ@QÈ ÄÇ€@Ѐ.Ó€#ÀÂÀÆÂ`ÚÓ ßÍÂ@ÕÂÀÊÓ £×ÂÀ5×Â@zÖÂÀqÍÂà0ÐÂ@9ÌÂà6Ï bÍÂ`Ë ñÊÂ@Ó ñÊ€XÌ  ÑÂÀÊÂ`ÀpÈ VÏÂËÂ@ªÎÂ`oÐÂ@˜ÑÂ`ìÐÂ&Ê ÁÒÂ2È ÓÏ yÞ ÙÂ`‡Ì VÏ€ŸÕ ¯ÕÂÀvá DÒÂ@Ñ»ÆÂÇÄÂÐÂàîÚÂÀwÌ nËÂ`ìеÇÂà×ÂÀ¾ÕÂàÅÌ ëËÂ`òÏ‘ÍÂà0ÐÂàTÊÂàËËÂÀ¸ÖÂ@bÚÂà×Â@’Ò€‚ÅÂ@†ÔÂà³ÏÂ`æÑÂ@'Ï PÐÂ@ÕÂàËË pÕÂ@EÊÂà0Ѐ±Ò€4ÒÂàfÇÂ`ÚÓÂà Ö€óÇ ÁÒÂÀ_РMÆÂ—Ì åÌÂ`«ÆÂ`-ÛÂyÑ€·ÑÂ`ìРAÈÂÀk΀·ÑÂÀeÏÂà`È€±ÒÂÀ5×ÂaÕÂ`ÍÂ`E×Â@žÐ ˆÑÂÀkÎÂÀkÎÂÀâÏÂmÓÂ@ýÕ€óÇÂ@zÖÂÀ²×ÂðÒ tʋ΀çÉÂà6ÏÂÀkÎÂà*ÑÂ@nØÂ ˆÑÂÀôÌÂ&ÊÂ@!ÐÂàÓÂÀè΀ÖÂ@†Ô€ŸÕÂ@˜ÑÂ`ÍÂ@t×Â`E×Âà¿ÍÂÀÐÒÂà¹ÎÂ`“ÊÂäÔÂàÕ€"ÕÂàØÂ`ÍÂ`¥Ç€ÕÌÂàËËÂÀwÌÂ@9Ì bÍ GÇÂ@žÐÂ@ÂÊ€ÛË ñÊÂÀÄÔ ÈÂÀƒÊ€±Ò ˜ÄÂ@žÐ ¬ËÂ`3ÚÂÏ  ÍÂ@-΀4Ò YÄÂÀúËÂàÓÂà¿Í€ ÄÂÌÂÏÂÀqÍÂàÓÂ@ÑÂàHÌ tÊ€«ÓÂ`¥ÇÂ@¶ÌÂ`cÒÂ@ŒÓ bÍÂ@!ÐÂ`ÎÕÂ`ÍÂÍÃÂ@ÔÇÂ@¤Ï©É—Ì€L΀ŸÕÂ@æÄÂ@¼ËÂÀ$Å tÊ€¥Ô¯È ô¿Â PÐÂ@ÂÊ€½ÐÂÀ}ËÂ`æÑ€4ÒÂ@ÓÂ@’ÒÂüРpÕ€LΠÍР€ÈÂà³ÏÂ@˜Ñ ÐÂà‰Ö€@ÐÂÀ¿ÀÂ`±ÅÂ@÷Ö€É΀vÇÂ@'ÏÂÌÂà¡Ò ¯ÕÂà›Ó€RÍÂ`ìЀíÈÂaÕ ;ÉÂÀèÎÂ@!ÐÂ@°Í Ù΀ÃÏÂÀ¡ÅÂÀMÓ ŒÆÂ ÇÑÂÀ}ËÂ`"ÈÂÀ§ÄÂ@÷ÖÂÀ¦Ù €ÈÂÀÊ hÌÂ@EÊ 8ÔÂà0ÐÂàÕÂ`Í >Ó€±Ò€|ÆÂ@3ÍÂ@ ÔÂÀ#ÚÂà¹Î€ÃÏÂ`ÈÖ d×Â`uÏ zÉÂ@¶ÌÂ`ʯÈÂàÝÈ€ÏÍ ÜÃÂ@?ËÂ@¶ÌÂ`iÑÂ`ìÐÂ@-Π΀LÎÂàÑÊÂ@ÚÆÂ@ÈÉ€óÇÂÀGÔ ÄÇ€LÎÂà×ÉÂÍÃÂ@°Í€çÉ€óÇÂ,ÉÂÏ ýÈÂ@ ÔÂ`Í€ÉÎÂà­ÐÂ`RÀÂ`cÒÂØÖÂÀÖÑÂ`°ÚÂ` Ì ¦ÌÂà6Ï ÕÙ€XÌ ÷ÉÂÀkÎÂÀBÀÂ8ÇÂ@¤Ï )Ì‹ÎÂÀÈÂÀ/ØÂàûÃÂàlÆÂ£Ê ÆÂàHÌÂÀƒÊ€^ËÂà‰ÖÂàËËÂà¡Ò€áÊ á×ÂàÕÂÀ ÉÂ`uÏÂ`ÊÂÀ_ÐÂ`Ë ÄÇÂÀk΀ÃÏÂà×ÉÂ@¼Ë€Å€àÈÂ@WÇÂÀîÍÂ@˜Ñ ëËÂ` ÌÂÀ ÉÂÀÈÂ@åÙ /ËÂ`ìÐÂ`“Ê€LÎÂ@ÈÉ€ŽÃÂÀÈ £×€pÈÂÀ‰ÉÂà§ÑÂÀË °À hÌÂ`ŸÈÂ…ÏÂà•Ô ¦ÌÂ@¼ËÂ@-ÎÂ`"È ÆÂà¿Í Ù΀^ËÂ`ÉÂà³ÏÂÀÐÒ€«ÓÂÀÆÂÀÜÐÂÀwÌ ÏÂ@°Í€:ÑÂ`·Ä &× åÌÂÎÂàõÄ GÇÂ@¤ÏÂÀSÒÂÀ_ÐÂ@uÂÂà¹ÎÂÀÄÔÂ`âÂà›ÓÂÀôÌ GÇ ÇÂÌØÂ çÖ #ÍÂÀîÍÂÀÇ ”ÏÂ`?ØÂ \ÎÂÀ§ÄÂ&ÊÂÀ/ØÂÀ¾Õ \ίȠ»ÓÂàÕÂà³Ï ÍЀ^Ë€«Ó AÈ€4ÒÂ@€ÕÂÀÊÓÂÀ*Ä ÈÂÐÂ@9ÌÂà‰Ö€ÃÏÂÀMÓÂ`Í ëËÂ@3ÍÂÀ‰ÉÂ@†ÔÂà¿ÍÂ@÷Ö—Ì€ÉΠJÑ ¯ÕÂ`"ÈÂ@'ÏÂ@'ÏÂÀÊÂ@Ñ€ÕÌÂ@Ó‹ÎÂ`ìÐÂ`Â×Â`cÒÂ@cÅÂà6ÏÂ@æÄ¯ÈÂÐÂ@Ò Ù΀:ÑÂmÓÂaÕÂ`oЀÿÅÂbÀÂ@’ÒÂ`-Û€4ÒÂ`.ÆÂ`«ÆÂ@VÜ €ÈÂÀ¾ÕÂàqÚ€ÃÏÂ`ìЀFÏÂÀúË€·ÑÂ@†Ô #ÍÂ`ŒàÂÀ¬ØÂ@!ÐÂà0Ѐ"Õ ÍÐÂà§Ñ ¸ÉÂÌ bÍÂà¡ÒÂ`ÉÂ@¤ÏÂ@9ÌÂÍ Ú ˆÑÂsÒÂ`ÉÂ`±ÅÂ@ÑÂà¿Í€íÈÂà›ÓÂÀYÑ€^ËÂР|Ó€±ÒÂÀôÌÂ@žÐ DÒÂÀ/ØÂàTÊ ÿÒ VÏ PÐÂmÓÂàÓÂ`òÏÂà›ÓÂÀ²×€™Ö€@РÒÂðÒÂ`É€ÃÏÂ`KÖ ñÊÂÀÈÂÀGÔÂÀÜÐÂÀÐÒÂ`Í ñÊÂ`Í ÍЀ‚Å ”ÏÂÀwÌÂ`¼ØÂ`{ÎÂ`Í ùÓÂà§Ñ€ÕÌ »Ó©É€pÈÂ@ Ô€ÕÌ€^ËÂaÕÂ`ìЀ@ÐÂàŠÁ ¾È /Ë 8ÔÂ@’ÒÂ@!ÐÂ`òÏ‘ÍÂà¡ÒÂÀ_Р/ËÂÀ;ÖÂÍÂÀSÒÂàéÆÂ 8Ô )Ì€ÉÎÂ@9ÌÂmÓ nËÂÀúË ÙÎÂÀîÍÂ@¶Ì€™Ö‹ÎÂà$Ò LÛÂÀkÎÂ`“Ê€½Ð€(Ô£ÊÂàïÅ ‚Ò‹ÎÂ@zÖÂ`žÝ )ÌÂ@åÙ AÈ ÅÂJÄÂÀMÓ ”Ï ÅÂÀÊÓ€øÛÂäÔÂ`QÕÂà_ÝÂ@!ÐÂ@°ÍÂ`òÏ 5Ê ÍР2ÕÂ@¤ÏÂà¹Î ÒÂÀ‰É ÇÑÂ`æÑ ¾È bÍ šÎÂà*Ñ PÐÂ@ÑÂÀ5×ÂsÒÂ@ýÕÂØÖ ÍÐÂà³Ï »Ó ‚Ò 8ÔÂ…ÏÂÀeÏÂà„ÂÂ`™ÉÂ@ÔÇÂÀèÎÂ@¤Ï VÏÂÀƒÊÂÀƒÊÂÐÂ@ŒÓ ¾ÈÂàTÊÂ…Ï ÁÒÂÀË€ÏÍÂÀ¦Ù€ÏÍ ˜ÄÂ@!ÐÂà­ÐÂ`æÑÂ`ÚÓÂÀƒÊÂÀôÌÂÀ­ÃÂ@'Ï ²Ê ßÍÂ`Í šÎ€4ÒÂ@?ËÂ@ªÎÂ…Ï ¦ÌÂÀôÌÂ@˜Ñ ÙÎÂ…ÏÂ@t×Â`ËÂ`ìÐÂ@ÒÂ`þÍ€šÁÂÍà2Õ©É GÇÂ@¤ÏÂ`“ÊÂ@3ÍÂÀ¬ØÂ`±Å€(ÔÂàfÇÂÀËÂ`¼ØÂà¹Î€çÉÂÀƒÊ ÁÒÂàÀÂàËËÂ@ªÎÂÀ$ÅÂ`տ¯ÈÂàËËÂÀ5×Â@žÐ€“×ÂöÑ€jÉ ÷ÉÂ ÊÆÂà6Ï€×ÂÀ¬ØÂ ùÓÂΠVÏ ΀«ÓÂàÅÌÂÀÇÂ@ÎÈÂ@ÑÂÀèÎÂÀèΠAÈ tÊ ÿÒÂgÔ 5Ê ¼¾Â ÄÇÂÀ¸Ö ÏÂÀYÑÂ`ÃÂÂÁÅ€çÉÂ[ÖÂÀîÍ È ÷ÉÂÀ§ÄÂà¹Î Ï PЀíÈ€áÊ€RÍÂ@ŒÓ€‚Å€^ËÂöÑÂ@ÂÊÂàBÍ€ŸÕ jÖÂÐÂ`Ê ÓÏÂ`ìÐÂ`þÍÂÀ É€·ÑÂ@EÊÂÀeÏÂ`oÐÂàNË€«Ó€pÈ ˜Ä €ÈÂ@€ÕÂà×ÉÂ`Í ÆÂ`{ΠØÂà0ÐÂÀÜÐÂ@ªÎÂöÑÂ@Ó šÎ€çÉ nË ßÍ ¦ÌÂàBÍ ÁÒ  ÍÂ`.ÆÂ MÆÂÀâÏÂÀ Þ &×ÂàNËÂÀËÂ`òÏ ØÂÀ}ËÂàfÇ ÙÎÂ`Í—Ì€^Ë ŒÆÂ ”Ï€@ЀóÇÂ`øÎÂÀqÍ åÌ ¯Õ ¬Ë€·ÑÂÀƒÊ€ùÆÂÀÇ€óÇÂDÅ #Í »ÓÂ@?Ë€‚ÅÂÀ$ÅÂÀúË€±Ò€jÉÂ`àÒ€ÿÅÂIÙÂà}ØÂàÅÌ€ÕÌÂ`«ÆÂ@KÉÂ`øÎÂ`±ÅÂàÀ€ ÄÂ@àÅÂÀÜЀÏÍ MÆÂ µÔÂÀÄÔÂÀÄÔ ¦ÌÂ`þÍÂÀîͩɀÕÌÂÀwÌÂ@ÑÂÀAÕÂàqÚ d×Â`ÎÕÂÀîÍ©ÉÂÀâÏÂaÕÂÀîÍÂ`“ÊÂÐÂ@'Ï€{Û ¦Ì ŒÆÂ Π£×ÂàÓÂ`Ë ÄÇÂ@žÐÂà$Ò€áÊÂ@ÓÂ@oÃÂ`ËÂÀâÏÂÀÄÔ€@ÐÂ`oÐÂ@KÉÂäÔÂÍÂ`™ÉÂ`øÎÂÀîÍÂ@!ÐÂÀqÍÂ`{ÎÂ`cÒÂÀeÏÂà•Ô€òÜÂàBÍÂÇÄÂ@QÈÂJÄ€(Ô€jÉÂ`ÚÓ /Ë /ËÂ`æÑ€4ÒÂÀ ÉÂ`‡ÌÂà`ÈÂÀwÌ ¯Õ ÿÒÂàÑÊÂ` Ì VÏÂàÕÂàÓÂÀ¡Å€½ÐÂüЀŸÕÂU×ÂÒ×ÂÇÄ tÊÂmÓ€dÊÂàúØÂ@bÚÂÐÂ@ÂÊÂOØÂÀÐÒ 8Ô ëË‹ÎÂ`òÏÂ&Ê»ÆÂÀkΠRÚ ÜÀ·ÑÂ`oРÓÏÂ@Ò \ÎÂÀƒÊ DÒ€4ÒÂÀwÌ )ÌÂðÒ ÙÎÂ@!ÐÂà$Ò ÿÒÂ@žÐÂ`{ΠÐÂ`“ÊÂ@ñ× —ÙÂ,É ¬Ë€RÍÂ`ËÂÀqÍÂ`4ÅÂÀ¡Å©ÉÂ@ÒÂ` ÌÂ`ËÂÀƒÊÂ`‡Ì ¬ËÂ@Ó Ù çÖÂ`þÍ€FÏÂÀîÍÂÀÆÂ bÍÂÀ6ÂÂmÓ€‡ÙÂÀ¾ÕÂ@t×Â`æÑÂà¹ÎÂà*ѩɀ4ÒÂsÒÂÀ5×ÂÀ/ØÂ€øÛÂ@’ÒÂ@°ÍÂÀ/ØÂsÒ 5Ê ëË ,Ö VÏ ‚ÒÂ@ÒÂ@€Õ ÍÐÂÀŽÝÂàØÂµÇÂ`ŸÈÂüÐÂ`àÒÂ`߀·Ñ€áÊÂà<΀(ÔÂÀ¦Ù€·Ñ ˆÑÂÀSÒÂà³ÏÂ`ÍÂ…ÏÂ@’ÒÂ`E×Â@ÕÂ`˜ÞÂ@˜Ñ 8ÔÂà¹Î€|ÆÂJÄÂàTÊ€ ÄÂ@°ÍÂ`‡Ì€ÉÎÂ@-ÎÂ@†ÔÂ`“ÊÂ@EÊ€«ÓÂ@°ÍÂ`òÏ€|ÆÂàfÇÂ`{ΠqÀ€áÊ ÆÂ@t×ÂÀèΠ Ñ 5ÊÂÀ‰É€½ÐÂÀAÕ JÑÂà­Ð€ÏÍ€:ÑÂÍÃÂ`9Ù€«Ó€(ÔÂmÓ—ÌÂ@ÔÇÂàTÊÂ@ Ô€ùÆÂ zÉÂà³ÏÂàZÉÂÀ_РÐÂ@?ËÂ ÊÆÂÀ}ˣʠÍРbÍÂ` Ì€ÉÎÂà`ÈÂàTÊÂ`ìÐÂ`øÎ vÔÂ` á zÉ #ÍÂà×ÉÂ`(Ç bÍ€@ÐÂà Á€‚ÅÂ@¶Ì íկȠëËÂÏ€ÛËÂöÑÂà*ÑÂ`ËÂÀ¸ÖÂÀ$ÅÂÀîÍÂ`Ë ÖÄÂ@¶Ì€dÊ€·Ñ bÍ‘ÍÂÀeÏÂÀîÍÂ@¶ÌÂÀÆÂ ÙΠ€È ÁÒ vÔ ØÂ ÄÇÂàlÆÂ@QÈ‘ÍÂ@cÅÂàÅÌ ΀^Ë nËÂίȻÆÂ@¶ÌÂÀ}ËÂ@’ÒµÇÂÌÂ2ȯÈÂ`“Ê €ÈÂÀݻ #ÍÂàÑÊÂÀƒÊ ØÂ`ÊÂàïÅÂ`{ÎÂ`ŸÈ ¬ËÂÎÂ@ÚÆÂ >Ó€·ÑÂ ÊÆÂ€çÉ ËÂÍ€FÏÂ@ÚÆÂ ÒÂÀËÂÀYÑÂ@àÅ©ÉÂà¡ÒÂ,ÉÂÀMÓÂ`ìÐÂ@KÉÂ`ÔÔ€±ÒÂ@-ΠÓÏÂàBÍÂ ÊÆÂ8ÇÂÀúË DÒÂÍ ,ÖÂÐÂÀÄÔÂgÔÂÀYÑÂPÃÂ`òÏÂà ÖÂgÔÂÇÄÂÌÂÀÊÓÂÀ ÚÂyÑ ÓÏ  ÑÂ@3Í€ùÆÂàîÚ LÛ€"ÕÂà¹ÎÂÓÂÂÀ¡Å€ÏÍÂ@ŒÓ GÇ žÃ€4ÒÂÀ¡Å£ÊÂÀqÍ€XÌÂ@¶ÌÂ`øÎ‘Í |ÓÂà¹ÎÂ`{ÎÂàûÃÂ@-ίÈÂà ÖÂà¿Í 5Ê ÓÏÂ&ÊÂU× XÙÂöÑ åÌÂÀ¸ÖÂàxĠǀáÊÂàƒ×ÂÀúËÂ`ËÂà*ÑÂ@°Í ˆÑÂàÕÂ`ìÐÂÀîÍ nË ªÁÂ`ËÂÀÜРÇÑÂàãÇ VÏÂÀeÏÂ`.ÆÂ`(Ç  Í ØÂ€LΠVÏ ÍÐÂÀ•ÇÂРýÈ AÈÂàãÇÂÀâÏ ëËÂàlÆÂ@ÒÂ@!ÐÂ@ÕÂÍÂà¡ÒÂàZÉÂ`ËÂà6Ï ’ÅÂ`WÔÂÀƒÊ ¬Ë ÐÂàÔ€ØÂà×É #ÍÂ@¤ÏÂ`WÔÂ@¤Ï€ŸÕÂ@QÈÂ@ò€ÉΠ—ÙÂ@ŒÓÂÀYÑ€ÕÌ€ÕÌ ”ÏÂÏÂ@KÉÂà•ÔÂàØÂ ©ÖÂÀk΀.Ó€çÉÂà*ÑÂàBÍ€"Õ ÇÑÂÀ/ØÂ tÊÂ`ìÐÂ@Ó ùÓÂÀ5×Â@ñ×ÂàãÇ€LΠ Ñ€«Ó  ÑÂ&ÊÂà–¿ÂÀeÏÂàBÍ€½Ð )ÌÂÀ ÉÂ`4ÅÂ`«ÆÂaÕ ÝÂ`WÔÂàØÂ@°ÍÂ@-ÎÂÏ ŽÐ ÎÂ`cÒ »ÓÂÌÂØÖÂ`òÏ€ÉΠ8ÔÂ@bÚÂ@ÎÈÂ@°ÍÂðÒÂÀÖÑÂ`æÑ€#À  ÍÂàlÆÂ€çÉÂ@€Õ /ËÂ@†ÔÂà¿Í€ÏÍÂ`4ÅÂ@KÉÂ,ÉÂÀeÏÂöÑ bÍ€ŸÕÂà¡ÒÂ@˜ÑÂIÙÂ`ÔÔÂÀÊÂ8ÇÂÀÈÂêÓ  ÑÂÀ)ÙÂ@ÈÉÂ@9ÌÂÀÖÑ€çÉÂ@?ËÂÀ_ÐÂàËËÂØÖ€ŸÕÂüÐÂ@hÙÂÀƒÊÂÏ ¾ÈÂ ÊÆÂ&Ê€×Â@!ÐÂàÅ̆ºÂµÇÂ`ìР‚ÒÂà ÖÂ`QÕÂÀÊ ”ÏÂgÔÂà§ÑÂ@†Ô 5Ê ,ÖÂmÓÂ`ÎÕÂ@¤ÏÂ@KÉÂÌØÂÌØÂ ÿÒÂ`WÔ€ÚÂöÑÂÀâÏÂÀ*ÄÂ@QÈÂÀYÑÂ@ªÎÂàÑÊ vÔ€:ÑÂ=ÛÂ@Ó€ØÂ€4ÒÂÀôÌÂÀîÍÂàÑÊÂÀ_ÐÂ`™ÉÂÀúËÂ@À zÉÂÀÈÂàËËÂÁÅÂÍÃÂà<ÎÂà³ÏÂàfÇÂàéÆÂ@°Í šÎ€.ÓÂ` ÌÂ`“ÊÂÀÖÑÂ`ÍÂ`?ØÂ@KÉ€ÛË JÑ€jÉÂÀèΠ Í€FÏÂ`KÖÂÀqÍÂàûÃÂ`Ê€” /Ë€ÕÌÂà}ØÂ€·ÑÂ@ÔÇÂÀîÍÂ8ÇÂ…Ï ”ÏÂÀúË€ÂÂ`ËÂÀ¾ÕÂÀSÒÂàãÇ ØÂ` Ì€½Ð€ÿÅÂ@°ÍÂ@]ÆÂ@¶ÌÂ[ÖÂyÑÂ@-΀ŽÃÂà`ÈÂ̯ÈÂ`¥ÇÂÀ­ÃÂ8Ç  Í ËÂ`uÏÂÀ}ËÂ@°ÍÂÀôÌÂ`Ê»ÆÂ€ÛËÂ`Õ¿ÂÍÂàƒ×ÂÀèÎÂÍÃÂ`þÍÂ`àÒ€@ÐÂ@¼ËÂÀÈÂmÓÂ`Í ÄÇ JÑÂÀîÍÂÀ§Ä€ÃÏÂà*ÑÂ@¼ËÂ`òÏÂ@QÈ ÙΠýÈÂ`¥Ç ;ÉÂÀkÎÂ`{ΠÛ»ÆÂ`¥Ç »ÓÂ@EÊÂ@ÂÊÂà›ÓÂÀSÒÂÀ ÉÂ`Í€.Ó çÖÂÀƒÊ ÐÅÂn¾Â †Ç€ˆÄÂÀÇÂà¹ÎÂ`àÒÂÀSÒ€GºÂÀË \ÎÂ…ÏÂàNËÂ@¤Ï€|ÆÂÀ¡Å ÄÂ2ÈÂà<ΑÍÂÀ‰É hÌÂ@ÔǠȀFÏÂÀ•Ç °À ”Ï w¿Â ”ÏÂ`ËÂ`]Ó ¤ÂÂ`{ÎÂÀôÌ€ÃÏÂÀ›ÆÂ©É _ÃÂ`þÍÂàéÆÂDÅÂÁÅÂ@KÉ ¦ÌÂ@?Ë€çÉÂàÔÂðÒÂyÑÂ@ªÎ !ÃÂà`ÈÂ`ÎÕ€çÉ DÒÂÀ$ÅÂ`LÁÂ@bÚÂ@ÓÂ`¥ÇÂÀÇ€óÇ€ÉÎÂà×É  Ñ ÉÛ GÇÂ`þÍÂÀ‰É ÆÂ |ÓÂ@“½Â РýÈÂ`iÑ )ÌÂЀ.Ó€±ÒÂ@ÓÂÍÂgÔÂÀÇÂà¿Í VÏÂàËËÂ[ÖÂ`ËÂ,É€ÕÌÂ@EÊÂ@!ÐÂ@’Ò e€óÇÂ`oЀ^ËÂ&ÊÂàÅÌÂ@ÓÂÀÈÂ@¼Ë \ÎÂ@ŒÓÂÀúËÂÀËÂ@ÔÇÂ`@ÃÂ`Ë€RÍ€ùÆÂ`·ÄÂÀúË ÍÐÂÀeÏÂ@æÄ—ÌÂ\ÁÂÀõ·Â`LÁ€™Ö€¥ÔÂÀqÍÂàZÉÂ`É ÙÎÂÀ$ÅÂ@ÑÂÀÊÂ`øÎ \ÎÂ,É€jÉÂàËËÂ@KÉ MÆÂ@ªÎÂ`Ë€jÉÂ@(ºÂ@ÔÇ»ÆÂ€ ÄÂ@Õ ÁÒÂà*ÑÂÀÊÂàqÚÂÀ‰É AÈÂ` ÌÂà<Π÷ÉÂ@'ÏÂ`™ÉÂÀÊ _ÃÂ` ÌÂ@-ΠtÊ ÇÑÂäÔÂÎÂ@žÐÂ@!ÐÂà¿ÍÂ@æÄ€Å€«ÓÂ`uÏ€çÉÂÀ³ÂÂÀÇÂ`øÎ »ÓÂà³ÏÂÀ‰ÉÂÀkΠ Í ŽÐ€@РVÏ ÇÑÂÀ;ÖÂËÂöÑÂ`ÎÕÂÀÐÒÂàrÅÂÍÂÀ*ÄÂ`ÊÂ`™ÉÂàZÉÂ&ÊÂà×É ”Ï€×Â@¼Ë ÈÂ@ÂÊÂàTÊ ÇÑ PÐÂÏÂaÕÂ@3ÍÂÀYÑ ;É ýÈ ÒÂÌÂ`àÒ€ùÆÂ >ÓÂ@ªÎÂ@Ñ ÇÑ€FÏ ÇÑ€RÍÂ`‡ÌÂàãÇÂ`ÚÓÂà6ÏÂà6ÏÂ=ÛÂÞÕÂÀ•ÇÂÀÈ ßÍÂ@-ÎÂàËËÂÐÂ`«ÆÂÀYÑÂ@9ÌÂ@ÚÆÂ`ÎÕ€¥Ô€·Ñ€ØÂÀ‰É üÝÂ@ŒÓÂ@ÂÊÂàlÆÂ€ÃÏ ßÍ€ØÂ ÍÐÂàrÅ ñÊ ÇÂà×ÉÂ@ªÎ ßÍÂ@ŒÓÂ`ÔÔÂÀ_РØÂ`cÒÂàïÅ ÓÏÂàúØÂ£ÊÂÀ_ÐÂ@3ÍÂËÂ@-΋ÎÂ`Ê€íÈÂ`òÏÂ&Ê€ÏÍ MÆÂ tÊÂÀwÌÂ`(ÇÂÀ¡ÅÂà×ÉÂàÑÊÂ`iÑÂyÑÂ@cÅÂÞÕÂ@9ÌÂ8Ç€±ÒÂ@3ÍÂà6Ï vÔÂÀ ÉÂ`«ÆÂ`™ÉÂ@3ÍÂÀqÍ PÐÂ…ÏÂ@ñ×€^ËÂË ¸ÉÂà ÖÂ@¶ÌÂÀ_ÐÂÀ;ÖÂÀkÎÂÀËÂà•Ô€óÇ€‚Å zÉÂÀ}ËÂ@]ÆÂ@æÄ©É€RÍÂÀ¡Å GÇÂ@?Ë šÎ—ÌÂÀqÍÂ@ò åÌ PÐÂ`{Π˜ÄÂ@ŒÓÂà<ÎÂ`þÍÂ`uÏ /Ë įÈÂà³ÏÂ`ÚÓÂЀÖ€LÎÂË€çÉ‹ÎÂÀÄÔÂ@ÈÉ ¾ÈÂÀ¹ÁÂàZÉÂ@ÓÂ`æÑÂ@]ÆÂ@?ËÂ[ÖÂàËË zɣʠšÎ ñÊ€·Ñ ÅÂöÑÂ@ÂÊÂ@t×Â@¶ÌÂÀMÓ€ÿÅ °ÀÂÀË ,Ö€áÊÂ@¤ÏÂ@EÊÂ@ÑÂÀ_ÐÂÀèÎÂËÂÀƒÊ ÐÅ ¸ÉÂ`ŸÈ /Ë žÃÂÀÆÂÀƒÊÂàûÃÂ@žÐ ÈÂÀÊ ýÈÂ`FÂÂà<ÎÂ…ÏÂ@Ñ ßÍ AÈ žÃÂ`ͩɠ\ÎÂ`ÉÁÂ`«ÆÂÀîͯÈÂ@÷Ö ËÂ`‡ÌÂöÑ€dÊ€áÊÂ…ÏÂà›ÓÂÀîÍ ‚Ò€jÉÂ`òÏ€½ÐÂ@9Ì tÊ»ÆÂ`ÍÂà•ÔÂÀâÏ  ÍÂÀ$ÅÂDÅÂ`@ÃÂ`™ÉÂÀôÌ€XÌÂ`ŸÈ ‚Ò‹ÎÂËÂ@¤Ï ÐÅÂËÂË€ÛËÂ`Ë ¾ÈÂà§ÑÂ@´öÂ`:Ä GÇÂà¹ÎÂ@ÒÂàÔ )Ì€dÊÂà*Ñ€|ÆÂ€óÇÂ@÷Ö€áÊÂðÒÂàéÆÂ€FÏÂÀ‰ÉÂ@ ¿Â@ÚÆÂ †ÇÂàlÆÂàxÄÂÀîÍÂÀ­ÃÂÀqÍÂÀÄÔ DÒ pÕÂ@Ñ ÄÂàïÅ€ˆÄÂ@æÄ€ÃÏÂ`™É MÆÂ@¼ËÂà<ÎÂ@‡¿Â`«ÆÂ zÉÂÀ)ÙÂàØÂ ËÂРËÂàØÂ@'ÏÂ@¶ÌÂÀ‰ÉÂ@¶ÌÂÀ›ÆÂ ÊÆÂ ÒÂ@ªÎÂÒ×ÂÀÄÔÂÀâÏ€áÊÂ@’Ò \ÎÂÀ5×Â@KÉ ßÍÂ@ÔÇÂ@9ÌÂࢽÂ`™ÉµÇ¯ÈÂ@?ËÂÀ²×ÂÀîÍ €ÈÂ@3ÍÂàZɯÈÂÀèÎÂ΀·ÑÂsÒ \ÎÂàîÚÂà<ÎÂ,ÉÂ`«ÆÂ`ÚÓ€ÚÂ`‡Ì ' ËÂÀ_РhÌ ÈÂà6Ï GÇ€pÈÂ@?ËÂ@øÁÂ`{ÎÂÀÈ AÈÂàéÆÂ ÄÇ€±Ò µÔÂàãÇ€‚ÅÂÀƒÊÂàÑÊ€šÁ€^ËÂ@'ÏÂ@3ÍÂ`±ÅÂàfÇÂÐÂ@ŒÓ ©ÖÂ`{ΠvÔÂ@WÇ ÓÏÂ`QÕÂ@ÂÊÂ@÷Ö€"ÕÂÀkÎÂ@¤Ï PР/Ë ÅÂ@KÉ€ÉÎÂÀËÂ@Ó VÏ€·ÑÂà¿ÍÂÀîÍÂ2ÈÂÀúËÂàïÅ€“×€ÕÌÂ`Í€FÏÂÀÇ€FÏÂ`æÑ€jÉÂ@]ÆÂmÓ ÈÂàÔ€uÜ€4ҠπÏÍ ÆÂÀ‰ÉÂàZÉÂ`ÉÂ`æÑÂàÓ èÁÂ`‡Ì¯È È€ Ä ÐÂJÄ €È€jÉÂ@ÒÂ@ÒÂ@WÇÂ@-ΠGÇ \ÎÂ`‡Ì€vÇÂgÔÂÀèÎÂ@9Ì ÄÇÂà›Ó d×Â`øÎÂ@3ÍÂ2È€ÛËÂ@!ЀÁÂ@°ÍÂÀ ÉÂ@ ÔÂ@àÅÂ`·Ä DÒÂÀMÓÂÀËÂ`òÏ€‚ÅÂ@žÐÂ@ÓÂàfÇÂ`ÚÓÂÀSÒÂÀ‰É€¥ÔÂà¿Í nËÂ ÊÆÂ`ÍÂ`˯ÈÂ`?ØÂà Ö€XÌ 8ÔÂÀËÂ@-΀áÊÂ2ÈÂ`æÑ€ÖÂ@ëØÂ@Ñ >ÓÂ@žÐÂÀeÏÂ`þÍÂàÑÊÂàÑÊ€™Ö€ÉÎÂ&Ê ßÍ€L΀FÏÂà<ÎÂöÑÂ`ËÂ`þÍ€·Ñ ÎÂ@°ÍÂ`Ë€^ËÂ`àÒÂÀGÔÂ@†ÔÂÀeÏÂÀ}ËÂ@ñ×Â`ÚÓÂ@ßÚÂ@?ËÂ`¥ÇÂà¡ÒÂÀ_Р/Ë ¸ÉÂ@9ÌÂÀ²× bÍÂËÂ@?ËÂÀ›ÆÂ€½Ð‘ÍÂ@¤Ï ËÂàlÆÂÏÂsÒ»ÆÂ&ÊÂ`4ÅÂU×Â@?Ë—Ì ÷ÉÂàTÊÂ@zÖ ß͵ÇÂÀ_ЀÕÌ€4ÒÂàÓÂÀwÌ ¸ÉÂ@KÉÂÀËÂ`uÏÂÀâÏ ˆÑÂàÓÂàÔÂàZÉÂà$ÒÂàwÙ )ÌÂ`‡ÌÂ@iÄ YÄÂ@WÇÂÀîÍ€™ÖÂ`Ë hÌ  ÍÂÀ•Ç 5Ê€ÏÍ pÕÂàÀ€ÿÅÂ@?ËÂÀË€‚Å€|ÆÂËÂ@°Í‘Í—ÌÂàBÍÂÀÆÂàéÆÂ`ÉÂ@Ó€XÌ ;ÉÂÀ*ÄÂ>ÆÂ@9ÌÂËÂ@’Ò Û ŽÐÂÀÄÔÂà•ÔÂÀÜÐÂÏ€‡ÙÂ`{ΠzÉ€|ÆÂàlÆÂà$ÒÂ`þÍ ëËÂ…ÏÂÀôÌÂÀ0àÃÜÂÀÐÒ€pÈÂðÒ€ŸÕ £×ÂÀÜЀ¥Ô åÌÂ&ÊÂ@’Ò hÌ€ÃÏ€FÏ€:Ñ ”ÏÂ`“Ê€ÃÏ€4Ò PÐÂ@nØÂ`ÍÂaÕÂmÓÂÀÜÐÂ@°ÍÂàTÊÂ@!ÐÂ@ÈÉÂ`"È šÎ ÛÂà³Ï€^ËÂ@QÈÂ@ÎÈÂà¹Î€«ÓÂ@¼Ë ¤ÂÂ@9ÌÂÀ¡ÅÂ`ÊÂà ÁÂÀAÕÂÀÐÒÂÀSÒ€ÏÍ€X̵ÇÂ`@ÀùÆÂàZÉÂÀâÏ ¬ËÂ`9ÙÂÀúËÂàTÊÂÀ³Â ÆÂ ÐÂàTÊ †ÇÂ`uÏÂЀ.ÓÂêÓÂ@-΀ÂÂ2ÈÂ`½ÃÂ@Ò€ˆÄÂ`cÒ€¥ÔÂàƒ×ÂÌÂ`iÑÂÀÊ€vÇÂ@àÅÂàÀÂ2È€RÍÂàïÅ€ÏÍÂ@’ÒÂÀ­ÃÂÀÆÂ zÉ‹ÎÂ`æÑÂ`Ê ¬Ë ýÈÂ`cÒÂÀâÏ ÏÂ@'ÏÂ`‡ÌÂ@¶Ì PРëË ŽÐÂ@nØÂ |ÓÂ@žÐÂ@ªÎ€XÌÂ8ÇÂ@’ÒÂ`æÑ 2ÕÂà‰ÖÂà*ÑÂÀÜЀ±ÒÂà•ÔÂ&ÊÂ`QÕ‹ÎÂÀqÍ óÔ pÕ ÁÒÂ@9Ì€·ÑÂ`ŸÈ€pÈÂ`ÚÓÂàÅÌÂ@ÔÇÂà¡ÒÂÐÂ`æÑ #ÍÂ@KÉÂöÑÂàØÂÀ5× /Ë ýÈÂËÂ@ªÎÂà×É pÕÂ̠πFÏÂ@ÒÂà¡Ò€ŸÕÂà$ÒÂ=Û€ØÂ 5ÊÂ@ÓÂ`ìÐÂÀ;ÖÂÀ}Ë€ÏÍÂÀÊÓÂ[ÖÂÀÊÂ@àÅÂÀîÍÂ@'ÏÂÀƒÊ VÏ  ÑÂàïÅÂà~ÃÂÀ_ÐÂ@ ÔÂaÕÂÀwÌ€ ÄÂ@¶ÌÂÀ_ÐÂÀÄÔ óÔ ëË íÕÂ@¤ÏÂÀYÑÂÀwÌ óÔÂ`þÍÂ@˜Ñ€«Ó çÖÂàÅÌÂ…ÏÂaÕ€cß ,ÖÂÀ”Ü VÏÂÀ_ÐÂ`3Ú ØÂ`cÒ VÏ >Ó pÕÂÀAÕÂ@’ÒÂ@'ÏÂÀAÕ€ÃÏ€"ÕÂ`WÔÂ`æÑÂ@EÊÂÀSÒÂ@¤Ï ÆÂÀeÏÂÀYÑ€{ÛÂ`¼ØÂ®ÝÂ@’Ò ŒÆÂÀâÏ #ÍÂà×€±ÒÂñ½ÂÍ &×ÂðÒÂ@°ÍÂ`@ÃÂ@ªÎ€ÛË Å 8Ô€Ö GÇÂÀÈ ¬ËÂyÑ€çÉÂÏÂÀÇÂÀGÔÂà¿ÍÂà×ÉÂ@9ÌÂ`KÖ  ÑÂ8Ç€ÛËÂÀúË #Í ÇÑ€"ÕÂ@ÕÂ`]ÓÂÀeÏ€.ÓÂ@’Ò€íÈÂà§Ñ€@ЀjÉÂ`øÎÂà¿ÍÂÀ¡Å ÒÂ`E×€æÞ —ÙÂ@°Í€áÊ ëËÂ@¼ËÂàÅÌ  Í€ØÂ`àÒÂà ÖÂ@˜ÑÂ[ÖÂ`cÒ :Þ Ï \ÎÂÀ¾ÕÂàõÄÂÀÊÓÂÀ}ËÂ`ÊÂ`‡Ì©É‹ÎÂ@°ÍÂ@ªÎÂ`‡Ì °ÀÂÀ}Ë jÖ ¬Ë ½Â ÁÒ ÷ÉÂÀÊÓÂ@Õ ÍÐÂüЀÁÂ@¤ÏÂ`‡ÌÂ@÷ÖÂêÓÂ2ÈÂÀÊ óÔÂ…Ï ÇÑÂÀ_ÐÂÞÕÂÌÂðÒ€XÌ  Ñ€·ÑÂà¡Ò—ÌÂ@¤Ï äáÂ@JÞ  Ñ AÈ 5ÊÂÏ ßÍ ”ÏÂsÒÂ`uÏÂÀôÌ ßÍÂ`uÏ€4ÒÂàÕ €ÈÂÀSÒÂ`ýâÂ@˜ÑÂàÝÈÂÎÂ̵ÇÂà¿ÍÂ@QÈÂ@ÎÈÂÀÊÓÂ`"ÈÂ`ÎÕÂ@°Í€vÇÂ`Õ¿Â JÑÂÀèΩÉÂÀGÔ bÍÂ@ÑÂ`ìÐÂà<ÎÂ@àÅÂÀAÕÂsÒÂaÕ ùÓ€XÌ 8ÔÂ@Õ åÌ Ú€XÌ bÍ åÌÂ@˜Ñ Å È€RÍÂÀÊ â€óÇ€ÛËÂ`™É€áÊÂ`àÒ€jÉÂ` Ì ÅÂ`ÍÂ@ÔÇÂ@ªÎÂ@ªÎÂ…ÏÂà<΀RÍÂàZÉÂà`È ;É ¸ÉÂÀwÌ ЀíÈÂ`Í€À.Ó ˜ÄÂ@-ÎÂ…ÏÂ`¥ÇÂ`æÑÂ@æÄÂà*Ñ )Ì tÊÂh¿Â—Ì€^Ë èÁÂÀ›ÆÂ ¸ÉÂàrÅÂ@EÊÂ`"ÈÂ@9ÌÂÀšÛ PРDÒÂÀwÌÂ@ÂÊ€XÌÂ@¶ÌÂÀ›ÆÂ`uÏÂ`“Ê )Ì €È åÌÂÀÖÑÂÀqÍÂ@ªÎÂ…ÏÂ@EÊÂàÓÂÀÄÔ tÊÂ@.¹ÂàTÊÂ`oРÍÐÂ`F€±Ò€×ÂðÒÂÀÖÑÂ@3ÍÂmÓ  Ñ€«Ó ÇÂËÂÀÈÂ@†ÔÂÀƒÊ ñÊÂ@-ΠµÔ VÏÂà$Ò ”ÏÂ@˜Ñ tÊÂ@ÂÊÂÀÜÐÂ@¼ËÂsÒÂ@ÓÂ@ÈÉ VÏÂ@EÊ€·Ñ nËÂÀ;ÖÂêÓ€ÿÅ  ÍÂ…ÏÂðÒÂ\ÁÂ`ÊÂ@°ÍÂ`]ÓÂaÕÂà$Ò€«ÓÂ@ ÔÂ`æÑ€ÉÎÂ@9ÌÂÀîÍ€«Ó 2ÕÂ`àÒÂ@ÓÂ`-ÛÂ@!ÐÂ,É‘ÍÂ@'ÏÂ`Â×€«ÓÂ`oРÙÎÂà$ÒÂ`'ÜÂ@ªÎÂÀÜР…ÜÂàNË€”ÂÂÀÊÓ€vÇÂüÐÂ`æÑÂ`uÏ ßÍ PÐÂ`:ÄÂyÑÂ`?ØÂÀÐÒÂ@žÐÂ`“Ê ÙÎÂ@ÕÂÀAÕÂÀwÌÂmÓ  ÑÂà× ñÊ ÆÂÞÕÂ`cÒÂ@Ò \ÎÂ`WÔÂ`ÍÂ@zÖÂà0Р5Ê ¦ÌÂÀÚÂ@DßÂ@ßÚ€× \ÎÂà0РˆÑÂÀ;ÖÂàÕ /ËÂgÔÂ`iÑÂ@˜Ñ€±ÒÂÀÜ€½Ð€½ÐÂ@ÓÂ`ÚÓÂÀÄÔÂÌØÂÀSÒÂà‰Ö >ÓÂ`þÍÂÀúË PÐÂ`oРšÎÂÀÖÑÂmÓÂ`øÎÂÀ¬ØÂ`?ØÂ@†ÔÂ@ÙÛÂà‰ÖÂÀ ÚÂ`Â×Â@åÙÂ`ÎÕÂ`™É ŒÆÂÀÜÐÂà}ØÂöÑ ÁÒÂÀîÍ bÍ µÔÂàÑÊ #ÍÂÀÊÓÂÀ;ÖÂ@žÐ  ÍÂà<ÎÂàÅÌÂ`æÑ ùÓÂ@Ñ ‹ÛÂÀ;ÖÂÀúËÂ@ŒÓÂàôÙÂ`ìЀíÈÂ@ÕÂ@ÕÂà¡Ò ùÓ ¸ÉÂà*ÑÂ@nØÂgÔÂ@ýÕ€áÊÂà<ÎÂ@ÙÛÂÀ/ØÂ=ÛÂÀèÎÂ@ŒÓÂÀÐÒÂ`iÑÂÀAÕ  ÑÂÀeÏ ÏÚÂà Ö £× —ÙÂðÒÂ`¶ÙÂ`øÎ ˆÑÂ`Â×€¥ÔÂ`3Ú€±ÒÂ@ÓÂ@zÖ ÕÙÂÀ ÚÂ`E×Â`]Ó€ÃÏ 8ÔÂÀÜÐÂ`{ΠÎÂÀÖÑÂà×É ùÓ ÓÏ€(Ô£ÊÂЀØÂ`iÑÂyÑÂ ÛØÂ€4ÒÂÀSÒÂ`iÑÂ`ªÛÂ`Â×Â@nØÂЀÉÎÂ@˜ÑÂàÔ€±ÒÂ`þÍÂ`KÖÂÀ¾Õ€òÜÂ7ÜÂÀ‰É ۢ߀ØÂ€ÏÍ€™Ö ÛÂüЀ(ÔÂ@ŒÓÂ@ñ×Â@žÐÂ>ÆÂÎÂ@ªÎÂÀ#ÚÂ@!Р¯ÕÂÀYÑÂ@bÚ€·ÑÂmÓ€«ÓÂàkÛÂàBÍÂ@9Ì€XÌ ,ÖÂ`ÍÂÀÊÓÂ@ÑÂüРÇÑÂ…Ï 2ÕÂ`þÍÂàƒ×Â@ýÕÂ`òÏÂÀGÔ \΀FÏ ùÓÂ[Ö ÒÂÀÊÓ€:ÑÂÀÊÓ ßÍÂÀ¦ÙÂÐÂÀqÍÂÀè΀FÏ€vÇ )Ì GÇ€RÍÂ@ÂÊ€þÚ€áÊ ÆÂ JÑÂ@¶Ì€^Ë€½Ð åÌÂÀ}ËÂ ÛØÂ€¥Ô ÍР,ÖÂà*Ñ »ÓÂÐÂ@ßÚÂÀ²× åÌ ©Ö Ï€4ÒÂ@ñ× ßÍÂà•ÔÂ@ ÔÂàúØÂ=ÛÂyÑÂÀÄÔ >ÓÂ`ÎÕÂΠóÔÂ@VÜ€«ÓÂU× ÇÑ 2Õ d×€uÜÂà‰ÖÂÀôÌÂÀ#ÚÂÀÄÔÂàBÍ€½ÐÂÀÚÂÀ¦Ù .à RÚÂÞÕÂ@˜Ñ ØÂ Ë ÁÒÂ@t× ‚ÒÂÍÂÀÐÒ€×Â`¶ÙÂ@¶ÌÂ@-ÎÂ[ÖÂÀ²×Â@åÙ€|ÆÂà×É€"ÕÂ`æÑ ëËÂà<ÎÂà}ØÂ€4Ò ÕÙÂÀîÍÂà¡Ò€FÏÂ`WÔÂÀkÎÂ`WÔÂÀÄÔ LÛÂüÐÂ@ÒÂ@'Ï »ÓÂ@°ÍÂ`(ÇÂ`cÒ€ŸÕ íÕÂ`ÎÕÂÀ5×Â…Ï pÕÂ ÛØÂÀkÎÂÀYÑÂ`ŸÈ€øÛÂÞÕÂ`9ÙÂÐÂ`?ØÂ ¸ÉÂ@ÚÆÂ pÕÂ@¼ËÂÀÆÂÀÇÂ`æÑÂàÅÌÂÀÐÒ åÌ€ÕÌ ÚÂ@ÓÂ@ªÎ€:ÑÂ@ëØÂ€ŸÕÂ@’ÒÂРÁÒÂÏÂ@’Ò€ØÂ@'ÏÂÀ_ÐÂÀôÌÂ@÷Ö€±Ò£ÊÂ`LÁ ‚ÒÂàÑÊ€‡ÙÂ[ÖÂàÑÊ€¥Ô€±ÒÂ@]ÆÂ€Ö€™Ö ÎÂ@3ÍÂ@'Ï€"ÕÂÀÈÂà­ÐÂ@ÈÉÂ@†ÔÂÀ²×Â@¶Ì€ÕÌÂÀâÏÂ`!Ý€·ÑÂÀeÏ #ÍÂ@°ÍÂ@zÖÂ@nØÂàƒ×Âà§Ñ ÍÐÂÀ)Ù ^ØÂà¡ÒÂà`ÈÂÀôÌ€WáÂ@»à€ÕÌ ¯ÕÂ@?ËÂЀ:ÑÂ@-ÎÂà×É PÐÂàÓÂ@ÑÂ@Õ 8ÔÂÀGÔÂ@QÈ ÇÑ >ÓÂmÓ &×ÂÀ¸ÖÂ@\Û vÔÂ`æÑÂ@EÊÂ`Í€ÕÌ€XÌÂØÖ€±Ò‹ÎÂà›ÓÂÀSÒÂÀ Ú ÏÂ`æÑÂ`æÑÂÐÂ`ÎÕÂÀÄÔÂà¹ÎÂsÒÂÀ¾ÕÂ@ßÚÂà6Ï  Ñ€RÍ PÐÂÀâÏÂ@!РLÛ€±ÒÂ@bÚÂà¹ÎÂàØÂ=ÛÂàÅÌÂ=ÛÂÀ5×Â@DßÂ@ ÔÂÀôÌ XÙÂØÖÂÀîÍÂàÔ ŽÐÂà$Ò pÕÂCÚ …ÜÂ`?ØÂ€:ÑÂÀÜÂà ÖÂ7ÜÂ@ÓÜÂ`òÏÂ`WÔ€"ÕÂ@ÒÂ`?ØÂ`'Ü€iÞÂ`!ÝÂ`ÔÔ PÐÂÒ×ÂU×ÂsÒÂ`9Ù€ÔáÂ`¼ØÂ@Ó€ØÂ …Ü DÒ€øÛÂàÓ #Í€‡Ù vÔÂ`E×€ØÂ@†Ô€àßÂ`QÕÂàeÜÂ@ÓÜ€×Â ÛØÂ€«Ó RÚÂà¡ÒÂ@€ÕÂÀ¾Õ‹ÎÂU×Â`]Ó ÕÙÂàÕ€™ÖÂ`zãÂÐÂ@t×€ŸÕ PÐÂ@9ÌÂàúØÂºÛÂàÕÂàÓÂ`òÏ€FÏÂà0ÐÂ`cÒÂ`ÎÕÂ̺ÛÂU×Â`ÈÖÂCÚÂ`¶ÙºÛÂ`3Ú sßÂ ÛØÂÀ¾Õ€L΀"ÕÂêÓÂÀÜЀ¥ÔÂ@nØÂàÔÂ@iÄ ÁÒÂäÔÂàôÙÂ`òÏÂà0РpÕ šÎÂà*Ñ€:Ñ ‘Ú DÒÂ@ÕÂÌÂàHÌ 8ÔÂ`ÍÂ8Ç DÒ 4ßÂàÓÂ`¶Ù ÒÂ@oÃÂ@°ÍÂgÔÂàÔÂ`{ΠÄÇ ¬ËÂ…Ï &×ÂÀ¾Õ ¯Õ ÏÚÂà}ØÂ€·ÑÂ@EÊÂÀ²×Â`KÖÂ`iÑ€™ÖÂàËËÂà ÖÂ@’ÒÂ@3Í€.Ó€ÛËÂ`.ÆÂà³ÏÂ`øÎÂ`3Ú€:ÑÂ@3ÍÂ`æÑ‹ÎÂàBÍ íÕÂ`ËÂ@Ò JÑ€™ÖÂÀkÎÂàúØÂ`ÈÖÂÀîÍÂ`{΀(Ô ÓÏÂà6Ï€ÃÏÂÀwÌÂðÒÂàHÌÂàËËÂ`°ÚÂyÑÂ[ÖÂ@ýÕÂ@?ËÂ`É—Ì€iÞÂgÔÂÀÊÓÂgÔ€uÜÂàÕ ˆÑÂàØÂà¿Í !ÃÂàHÌÂàTÊÂÀ ÉÂ@¤Ï GÇÂ@˜ÑÂÌØÂ€FÏ )Ì€ÏÍÂàúØÂ—Ì€ÕÌÂ`Ê£ÊÂ`{ÎÂÀÆÂàHÌÂÀGÔÂà­Ð 5ÊÂsÒ€LΠóÔ ¾ÈÂÎÂ@˜ÑÂ`KÖ€ Ù ¯Õ ÓÏ Ï hÌÂÀôÌÂÀÖÑÂàûÃÂPÀ Ä€ÛËÂÀ¦Ù ŽÐÂ…ÏÂ`ìЩÉÂÇÄ€LÎÂöÑ PÐÂ,ÉÂ`ÍÂÀ¾ÕÂÀÐÒÂ@EÊÂÀ‰É€vÇÂ`cÒÂ@ŒÓ SÅ !ÀdÊÂàûÃÂ@˜ÑÂ@?ËÂ`]Ó ;ÉÂÀ0ÀÉÎÂ@ÓÂÀ•Ç€½ÐÂ@¶Ì \ÎÂ&Ê€LΠРÓÏÂ`KÖÂÀÜРÐÂ`Ë€™ÖÂ`E×Â@ÑÂ@¼ËÂ` ÌÂðÒÂ`WÔÂyÑ€“×Â`uÏÂàBÍ »ÓÂ…ÏÂ@˜Ñ #ÍÂüРˆÑ ýÈÂàTÊÂÐÂ@zֵǠµÔÂà‰Ö€Õ̠ȣÊÂ@KÉ VÏ |Ó ÎÂ`ÚÓ Ë ÙΠÒÂÞÕ ‚ÒÂàZÉ µÔ€@ÐÂ@nØÂÎÂàÅÌ JÑÂàwÙÂ@Õ PР”ÏÂ@QÈÂ@ªÎÂÀ0à»ÓÂà×Â@9Ì Ѐ”ÂÂ@˜ÑÂàËËÂ@žÐÂ>ÆÂ@ªÎ ùÓÂà¡ÒÂàõÄ ÄÇÂ`:Ä ¬ËÂÀ#ÚÂ`]Ó€ŸÕ€ùÆÂ‘Í ©ÖÂ@'ÏÂÀMÓ ÿÒÂ`æÑÂ`oÐÂà6ÏÂÀ ɩɠ5ÊÂ@ªÎÂ…ÏÂaÕ€jÉÂ@¤ÏÂ`àÒÂ@˜ÑÂÀ}ËÂÐÂ`Â×Âà¹ÎÂ@?Ë ëËÂ@QÈÂ@ÕÂ@ëØÂ@-ΑÍÂ@æÄÂÀƒÊÂàéÆÂ ¬ËÂ`ìÐÂ`ÊÂ@ÒÂ@¤ÏÂ`ËÂàBÍ VÏ€·Ñ ÓÏÂ`Í ßÍ &×Â@ÂÊÂ`3ÚÂÀîÍ MÆÂ nË  Í pÕÂàÓÂ@9ÌÂ@9ÌÂ@ÔÇÂöÑ Ï ëËÂÀ_ÐÂ@-΀çÉÂ@ýÕÂ@÷ÖÂÀGԋ΀áÊÂàôÙÂ`É åÌÂà0ЀÿůȠ|Ó€ŸÕ€·ÑÂàÕÂ`æÑ ¦Ì Π)ÌÂ@!ÐÂ@9Ì  Ñ åÌÂ@ÚÆÂ,É ÷É FÜÂÀMÓ AÈ  ÍÂà›ÓÂÀ¦ÙÂ@t×ÂáÂÀÝ ßÍÂàBÍÂÀÚ ÚÂ@ŒÓÂ`E×ÂÏÂ@Ñ ½ÝÂ@Õ ÏÚÂÀSÒ ùÓ ÜÂ`oУÊÂyÑÂ@ýÕÂàÄáÂ@EÊÂmÓÂ`ÔÔ€iÞ€¥ÔÂ`QÕÂàGáÂ@ Ô &×Â`¤ÜÂÀ)ÙÂÀÝÂ@ñ×ÂР¯Õ€ìÝ€oÝÂÀíâÂ+ÞÂ`iÑÂÀGÔÂ@µáÂ@Õ€‡ÙÂÐÂÀMÓ &×Âà³Ï€{ÛÂU× vÔ€‡ÙÂ`òÏÂmÓÂ@ßÚÂà¡ÒÂ`Ë€“×€þÚÂ`¼ØÂÀeÏÂàúØÂ€«ÓÂÀÖÑ ÍЀÏÍÂ@ ÔÂ`3ÚÂÀÐÒ ¦ÌÂкÛÂÀúË ÿÒÂà¡ÒÂÀkÎÂsÒÂÀè΀ÅÂà<ΠJÑÂ@¶ÌÂ ÛØÂ`.ÆÂ èÁÂ@ÑÂ@3ÍÂ>ÆÂ ÇÂ`òÏÂàÕ !ÃÂàÝÈÂÌÂà6Ï ÓÏ bÍ€íÈÂ@ÚÆÂÀwÌÂÀîÍÂàÓ ÁÒÂàHÌÂ@!Ѐ4Ò VÏ€ÿÅ ÿÒ ýÈ YÄÂ`þÍÂ`ÉÂÀƒÊÂ@€ÕÂà­Ð€LÎÂ`@ÃÂË Π\ÎÂ@ Ô‘ÍÂàxÄ€FÏ€LÎÂ,É ŽÐÂÀ•ÇÂ`ÍÂ@ÓÂ`™É €È€^ËÂ@°ÍÂà¹ÎÂ`“ÊÂ@-ΠhÌÂ@3͠πdÊ€½ÐÂàrÅÂ@{ÁÂDÅÂà0ÐÂÀqÍÂ@Ñ€XÌÂ`{ΠÿÒ ‚ÒÂ@WÇ€|ÆÂà×ÉÂ@EÊÂà¡Ò€ÉÎÂÀ ÉÂÀ_РÖÄÂ`oР÷É PÐÂà¹ÎÂàËËÂà*ÑÂÀ5בÍÂÀÊÂÀâÏÂ@ ÔÂ`Â×ÂÀwÌÂ`ŸÈ ËÂ@¶Ì GÇÂàûàÒ€½ÐÂàfÇÂ`øÎ ÁÒ 8ÔÂ@ÒÂ`þÍÂ@˜Ñ€ŽÃ€·ÑÂ`WÔ ÖÄ óÔ ùÓ€ØÂàNËÂ`þÍÂÐÂ@-ÎÂÇÄÂ@EÊ #ÍÂ@žÐÂ@ÑÂ`‡ÌÂ&ÊÂ@nØÂ DÒÂàÔÂ`ŸÈÂ`¥Ç ”ÏÂ@ªÎÂsÒÂà¹ÎÂÀÖÑÂÀkÎÂ`iÑÂ&ÊÂ@ŒÓ #Í€^Ë€.ÓÂÀ_ÐÂÀ}ËÂ`uÏ ”Ï€ÉΠpÕÂÀ_ÐÂà§ÑÂ`KÖ ÄÇÂÀ}Ë bÍÂ@3ÍÂsÒ ±ß Ѐ4ÒÂÀMÓÂà<΀ÏÍ©ÉÂPÀRÍ vÔ ëËÂà³Ï ßÍÂà×ÂÀpâÂà0ÐÂ@bÚÂ`ÔÔÂÀSÒÂËÂ@ÕÂÀkÎÂàwÙÂ`QÕÂ` ÌÂÏ vÔÂgÔÂÀúË€LÎÂ@!ÐÂ@ýÕ€«Ó ²ÊÂyÑÂЯÈÂËÂÍÂÀîÍ )ÌÂàÑÊÂÀÜÐÂyÑ †Ç€ùÆÂàwÙÂÀGÔÂÏÂÀ5×Â@ßÚÂ`“Ê óÔ ÓÏ€dÊÂàéÆÂà›Ó€(Ô€pÈÂÀkÎÂàŠÁ |Ó ÿÒÂà6Ï€±Ò ¯ÕÂàÑÊÂ@†ÔÂ@ÒÂà›ÓÂ@¼Ë JÑÂ`ªÛÂ@PÝÂà¹Î€(Ô  Ñ ÝÂüРÏÂ`ÍÂöÑÂà¹ÎÂ`ÚÓ ŒÆÂÀ5× d׺۠‚ÒÂ`°ÚÂÀAÕ ÏÚ Ù€Ö€ÚÂÀqÍÂàSßÂ@\Û —ÙÂÁÅÂ`°Ú ÁÒÂ@'ÏÂÁÅ GÇ hÌ jÖ ÎÂà›Ó pÕ \ÎÂÀËÂ`ÈÖ 8ÔÂ…ÏÂ@ªÎ óÔ çÖ€Ö ”ÏÂÀ5×ÂàôÙÂ[Ö 8ÔÂ@VÜÂsÒ ÏÚÂàNËÂ`cÒÂ@hÙÂÀÜÂÐÂÀ}Ë ‘Ú€·ÑÂ`ŸÈÂüÐÂ`uÏÂÀÖÑ VÏÂàBÍÂ`æÑ RÚ 8Ô ÉÛÂÀ²×ÂÆÙÂàÔÂÀÄÔÂmÓÂÀ¸ÖÂ@ ÔÂ`ÍÂ`øÎ€ÚÂ@ŒÓÂ[ÖÂ…Ï€½ÐÂ`ÈÖÂ@t× Ú äá®ÝÂ@9ÌÂ`cÒÂ1Ý€·ÑÂà¹ÎÂÀ_Ѐ.ÓÂ@ÈÉÂàTÊÂÀšÛÂà³ÏÂ@ŒÓÂà0Р8Ô nËÂCÚ€þÚÂ@ÓÂÀkÎÂ`oÐÂ@ Ô€«Ó RÚÂ@!Б͠ÁÒÂÀMÓÂàÕ RÚÂ`°ÚÂÀƒÊ€óÇ€ įȠ»ÓÂ@nØÂCÚÂäÔ€ÃÏÂyÑ€¥ÔÂ@†ÔÂ[Ö ËÂ`iÑÂ`cÒ€@ÐÂà§ÑÂÀúË šÎÂàBÍÂÀâÏÂ=ÛÂ@bÚÂà¹ÎÂàÅÌ€^Ë€|ÆÂ jÖÂÀ¬ØÂ@ÔÇÂ8ÇÂIÙÂ`òÏÂÀ5×ÂaÕÂà×Â`òÏ€ÃÏ zÉ ˆÑ ’ÅÂ@'ÏÂÐÂàNË >ÓÂàBÍÂà*Ñ ˆÑ ÜÂÐÂÀwÌ€"ÕÂÀ*Ä \Π\ΠÇÑÂðÒÂÀMÓ _ÃÂàØÂ—ÌÂÀ¾ÕÂ@ñ× íÕ ùÓ€áÊ PРÇÑ žÃÂÍÃÂ@¶Ì€ÎâÂàâÜ€"Õ€vÇ YÄÂÀ$ÅÂ@÷ÖÂØÖÂÀÐÒÂ@ÓÂàËËÂÀúË€:Ñ åÌÂ@3ÍÂ@ÒÂ`øÎÂà ÖÂ`¼ØÂ@zÖ Û µÔÂÀƒÊÂ`ÎÕÂ`3Ú€ŸÕ µÔÂÀwÌ ÙÎÂÀ5×Â@hÙ åÌÂÀÜЀ‡Ù ”ÏÂÀYÑÂ`!ÝÂà×Â`]ÓÂÀîÍ PР/ËÂ@Ñ vÔÂ@ ÔÂ`ìÐÂÀâÏÂØÖÂàÓÂ`ÍÂ`ÚÓÂðÒÂ`æÑ€XÌÂaÕÂ@ëØÂÀè΀×Â@Ó€ÚÂ`àÒ ßÍÂ`ªÛÂ@’Ò€·ÑÂ@ÕÂÌÂàÕÂà ÖÂ`ËÂ@˜ÑÂ`ÍÂ@KÉÂ` Ì€"ÕÂ@EÊ >Ó€ŸÕ€4ÒÂàËË€‡Ù ØÂU×Â@ÈÉ€RÍÂà¿ÍÂ@t×Â`ÍÂ`]Ó  Ñ ùÓ€ÉÎÂÀ¾ÕÂÀÈ €È ÐÂ@À€ÃÏÂ`Â×€.Ó€çÉÂ@÷ÖÂÀÜÐÂÐÂà0ÐÂÀ¾ÕÂÀ_ЀÕÌÂ`cÒÂÀâÏÂ@3ÍÂ`‡ÌÂÀôÌÂ@ÒÂÀƒÊÂ@’ÒÂ`ÔÔÂ`æÑ Ë #Í #ÍÂ`æÑ€4ÒÂ@÷ÖÂ`]Ó ¸ÉÂ@†ÔÂÀôÌ€«Ó µÔ€ŸÕ 2ÕÂà Ö 2ÕÂ@ÓÂÀÖÑ ŒÆÂÀèÎÂÀSÒ€òÜ ÙÂà³ÏÂ@¶ÌÂÀ_ÐÂ@÷Ö€"ÕÂÀMÓÂ@ëØÂàÅÌ€× DÒÂÆÙÂÐÂ`oÐÂ`]Ó€(Ô ÎÂ@QÈÂ`iÑÂ`“Ê€ØÂ ¯ÕÂ`ÚÓ€ÉÎÂÀÊ ΀"ÕÂÀwÌÂÀÈÂÀ¾ÕÂOØÂ ˆÑÂ`øÎ 8ÔÂ@ÈÉÂàHÌÂà³ÏÂ@°ÍÂÀ›ÆÂÀ_РØÂ€@еÇÂ`tä€FÏ€uÜÂ@ªÎ ÕÙÂà³ÏÂÀ¾ÕÂÒ×Âà_ÝÂ@ýÕÂ@ÈÉ€É΀4Ò€oÝÂ`ÚÓÂà§ÑÂaÕÂ@àÅÂà<΀LÎÂ`"ÈÂäÔÂ`WÔÂ`ÎÕÂàÕÂÀSÒÂàÃÂ@žÐÂ@÷Ö€½ÐÂà*ÑÂ`ÈÖÂà­ÐÂà§ÑÂyÑÂäÔÂ`ÎÕÂsÒ ÍÐÂà0ÐÂ@’ÒÂÀeÏÂ`3ÚÂÀÊÓ€uÜ ßÍÂÍÂ@†Ô‹ÎÂÀ”ÜÂà•ÔÂmÓ ÁÒ€4ÒÂyÑÂ`°Ú vÔ©ÉÂ@ÒÂÞÕÂ@Õ ñÊ€@ÐÂ@ÍÝÂ@ÍÝ€ÏÍ ¦Ì d×Â@t×ÂàâÜ €ÈÂÀÐÒÂÀ¦Ù ÕÙÂÀkÎÂÀ²×Â`cÒ ‚ÒÂÀqÍÂ@ ÔÂ@ÙÛÂàîÚ  ÍÂÀÄÔ XÙ—ÌÂ,É ÇÑÂ…Ï€òÜÂà*ÑÂàØÂ@ ÔÂàÕÂêÓÂ@žÐ šÎÂ@ÓÂ@JÞ ‘ÚÂ`KÖ ÁÒÂÎÂOØÂà<ÎÂ@¶Ì€Ú€:ÑÂgÔ€™Ö€øÛÂ`°ÚÂÀjã ÙΠd× yÞ ˆÑÂà›ÓÂÀÜÐÂ@hÙ ÚÂÀÿß ÒÂ@ÂÊÂÀ¦ÙÂÀÝÂÀùàÂÀÊÓÂ@'ÏÂ`3Ú ^ØÂ`ìÐÂ@ýÕ ÙÂ[Ö€@Ѐ‡ÙÂ`täÂàÊà€ ÙÂ@PÝÂà§Ñ€FÏ 8Ô€:ÑÂà§Ñ |Ó€Ö€ØÂ@3Í€4ҋΠá× ¬Ë ŽÐ Ç ùÓÂÀÐÒÂ@ÒÂ`ÚÓÂà¡ÒÂà¹ÎÂÀ Ú óÔ€×Âà§ÑÂÀkÎÂÀÄÔÂ@ªÎÂà³ÏÂàTÊ€±ÒÂ`âÂ@8áÂ[ÖÂêÓÂÀÐÒÂ` Ì  ÍÂ`ÞÂ=ÛÂàkÛ€ÎâÂàYÞÂ@’ÒÂ`E× ^ØÂÀÖÑ€“×Â@˜Ñ LÛ ÈÂ`°ÚÂÀâÏ ”ÏÂà Ö tÊÂ`KÖ hÌ€Ö ÜÂ@ñ×ÂÍÂmÓÂ@Ò ˆÑÂ7ÜÂäÔÂà³ÏÂ@'ÏÂ`Â×ÂÀ²×Â`¤ÜÂà¿ÍÂÍÂ@˜ÑÂðÒÂà_Ý #ÍÂÀSÒÂ@ýÕÂÀËÂÀÖÑ€ŸÕÂÀÈ€ØÂ@?Ë€ÉÎÂ@ÍÝ€(ÔÂ@’Ò€«Ó ÉÛ µÔÂÀGÔÂÏÂ@ÙÛÂaÕÂ@€ÕÂ`™É µÔ Р)ÌÂ@žÐÂOØÂ@hÙÂÀÛÂOØÂàÅÌÂÀqÍÂà ÖÂ`{ÎÂÀè΀±Ò 8ÔÂðÒÂàúØÂ ‚ÒÂäÔ µÔ &×ÂÀGÔÂ@bÚ€ìÝÂÀÜÂ`ìРµÔÂàÕÂaÕÂÀôÌÂ`oÐÂ@Ó LÛÂÀ#ÚÂ`ÚÓ Û ^ØÂÀYÑÂ@ªÎÂÀ”Ü ùÓÂÀƒÊÂà×Â@€ÕÂ@žÐÂ@’ÒÂÀ¾ÕµÇ€ÉÎÂÀYÑÂ`þÍÂàÓÂàÜÝ€ Ù€‡ÙÂ`æÑ€4ÒÂ@-ÎÂ`Â×ÂÀ²×ÂàÅÌ€^Ë ÜÃÂÀ¦Ù‹Î€dÊÂà³ÏÂ@JÞ >ÓÂ`]Ó€@ÐÂ@÷Ö€«ÓÂ`ìР‹Û  Í ¦ÌÂ@ÂÊÂ`Í€ÃÏÂmÓÂ@zÖÂ`?ØÂ΀@РÐÅÂ@9ÌÂ`ÎÕ€ÖÂ`žÝÂ`]ÓÂàeÜ —Ù ŽÐ€"ÕÂ@ÎÈÂ`ìÐÂÀËÂà$ÒÂ@'ÏÂ[Ö PÐÂaÕÂ@¤ÏÂ[Ö ÍЀ× ùÓÂ@¤ÏÂ@ñ×ÂàÄáÂÀAÕ #ÍÂÀÊÓÂÎÂ`°Ú€«Ó‹ÎÂ`WÔÂËÂ`9ÙÂ`ÎÕÂ@ŒÓÂ`E× ÷ÉÂ@ÓÂàƒ×ÂÀÝÂ@ÒÂÀwÌ ˆÑ »ÓÂÀËÂ`ìРPЀÏÍ€{Û LÛÂ`3Ú€FÏÂàËËÂΠ>ÓÂ@nØÂ ”ÏÂPÃÂà³Ï ØÂ€ØÂ€.ÓÂà6ÏÂàÜÝÂ@ÕÂU× #Í )ÌÂÀÖÑ€"ÕÂÀ)Ù óÔÂà§ÑÂÀ¬ØÂ`ËÂÏÂ`uÏÂÀ¬ØÂ £× &×ÂÀ_ÐÂöÑ€±Ò ÙÂÀšÛ «àÂ@ Ô ÍРÏÚÂ@VÜÂà×Âà•ÔÂ@˜Ñ€ØÂÀŽÝÂ`uÏ€FÏ€ÃÏ€.ÓÂÒ×ÂàÅÌ  ыΠFÜÂÀ¸ÖÂ@˜ÑÂ@PÝ Ù 5Ê€FÏ€.ÓÂÏ ©ÖÂÀÚ€(ÔÂà$ÒÂ`âÂà Ö€«Ó€ØÂà×ÂÀâÏ /Ë€ØÂ1Ý ŽÐ€{ÛÂ`oÐÂ@ÓÂ@nØÂüÐÂ`oÐÂ`KÖÂ`iÑÂ`æÑÂÀYÑÂU× ˆÑÂà›ÓÂ@ŒÓ GÇÂ@°Í€FÏ€þÚÂÀ¸ÖÂàHÌ ëËÂÀMÓÂàîÚ >ÓÂÀ ÚÂ@ÇÞÂÀÄÔÂЀoÝÂ@Ó€¥ÔÂ`!ÝÂÀ_РnËÂ`’ß (áÂ`KÖÂ@€ÕÂà ÖÂÀËÂ`žÝÂÀ”Ü :Þ€þÚ€{ÛÂàîÚ ÏÂ`’ß ØÂ€FÏÂÀAÕÂàôÙ€“× ÍРRÚÂàØÂ ‹Û¨ÞÂÀjãÂ1ÝÂÀAÕÂ@PÝÂà}ØÂüÐÂàBÍ ÇÑÂgÔ á×Â@ëØÂàÐ߀ØÂ ÕÙ€LÎÂ@¤ÏÂ@ñ×ÂÀ‚ßÂ@nØÂ@9ÌÂsÒÂaÕ  Í ßÍ šÎÂüРyÞÂ`¶ÙÂàÕÂ`cÒ€™ÖÂÀËÂÀwÌÂà‰ÖÂ@ÕÂÀÐÒ€±Ò€™Ö€ØÂ€óÇÂ`iÑ ŽÐ€½ÐÂ`cÒ€×Âà­ÐÂàeÜÂÀôÌ ÇÑÂ@€ÕÂàÓÂ`àÒÂÀÄÔ ˆÑ tÊÂ@¼Ë VÏÂàÐßÂ`æÑÂÀÄÔ€RÍÂ`ìЀ™Ö€iÞ€™ÖÂà¾Â»ÆÂ`þÍÂàNËÂ@ëØÂÀÝ &×ÂöÑÂà¹Î€XÌ ‚Ò€óÇÂ ÊÆÂÀeÏÂàÕÂ@ Ô€¥ÔÂ@ÎÈ€ìÝÂ`˜Þ hÌÂüÐÂ@¤Ï ÏÚÂÐÂ`æÑÂà0ÐÂ`KÖ JÑ€™Ö€.Ó á×ÂÀYÑÂÀ_ÐÂ ÛØÂ`ÎÕÂ`iÑÂÀYÑ «àÂÀÊÓÂÀÝÂ`¤ÜÂÀqÍÂ`·ÄÂ`4ÅÂà­ÐÂÀèÎÂ`ËÂ@’Ò РVÏ€.ÓÂÀîÍ€4ÒÂ@¤ÏÂgÔÂ`òÏ ¤ÂÂ`QÕÂ`cÒÂÀâÏ€(ÔÂàHÌÂÀAÕ ØÂ`"ÈÂÀâÏÂ@{ÁÂÀ¾ÕÂ`3ÚÂà›ÓÂàÕ€cßÂÀÊ åÌ€ÏÍ€(ÔÂ@†Ô€×€4Ò€ÃÏ€LÎÂÀÜÐÂ@žÐÂÀ/ØÂÀYÑÂà*ÑÂàƒ×  ÍÂ@’Ò åÌÂà•Ô€±ÒÂsÒÂOØÂ€(ÔÂ@àÅÂàHÌÂ@Ñ€LÎÂ`æÑÂ`uÏ >ÓÂ`æÑ öÞÂÀ²×€FÏÂ`æÑÂàƒ× ùÓÂ`þÍÂ@žÐÂ`‡ÌÂ`uÏÂU×Â`]ÓÂàÔ€ÉÎÂ`iÑ€½ÐÂ`ìÐÂ@ Ô€FÏÂ`ìÐÂ`QÕÂPÃÂà¡ÒÂàwÙ€pÈÂàËËÂÀ_ÐÂ@ ÔÂÀ_ÐÂÏÂ@ÚÆÂÀʠˀ4ÒÂÀeÏÂ@'ÏÂ`þÍÂ`LÁ€É΀.Ó—ÌÂ ÊÆÂ ØÂ ýÈÂà<ÎÂÀ$Å  Í ýÈÂ[ÖÂÀ_ÐÂ`E×Â@'ÏÂöÑ€^Ë ÿÒ 5ÊÂà6Ï€.ÓÂ7Ü ¦Ì РÓÏ ÍЀLÎÂ`æÑÂ@°ÍÂ@ëØÂ€ÏÍ€ÛËÂàfÇÂ@ÑÂ`Û¾ÂàNË €ÈÂüЀ±Ò ”ÏÂà6ÏÂÀÜР”ÏÂ`oÐÂ@ Ô ‚Ò€±ÒÂàÓÂÀ_Рǀ‚ÅÂ@¼Ë€4Ò d×ÂyÑ AÈÂÀ}Ë€ÏÍÂà‰ÖÂ@hÙÂ@ªÎ€”ÂÂà`ÈÂ@9ÌÂÀôÌ ŒÆÂ@3ÍÂ`3ÚÂðÒÂà‰Ö€XÌÂ…ÏÂ`Â×Â@ªÎ ùÓ€·Ñ ëËÂ@ÒÂ@'ÏÂ`ŸÈÂà¹ÎÂàfÇÂà*Ñ »ÓÂËÂ@WÇ€ÛËÂÍÂÀMÓ€pÈÂàlÆÂÀ ÉÂàèÛ 8ÔÂ@ÚÆÂà¹ÎÂyÑÂöÑÂ@žÐÂÌ€ŸÕ /ËÂyÑÂà›ÓÂ`WÔ »Ó šÎ PЀ«Ó€4ÒÂÐÂ@WÇÂ`cÒÂ@’ÒÂà0ÐÂ`Ë ÈÂàÅÌÂ@!ÐÂ`‡ÌÂàãÇÂÀqÍÂÀ;Ö€ÿÅÂ…ÏÂ@!ÐÂ`¶Ù€½ÐÂÀeÏÂ`ß ÚÂ@9ÌÂÀ;Ö ÁÒÂÀÐÒÂàHÌ 8ÔÂÀ¾ÕÂ`¶ÙÂ`ÍÂÀèÎÂ`QÕÂà$ÒÂÀGÔ€4ÒÂàqÚ€Ú€ØÂ íÕÂöÑÂ@ëØÂ€"ÕÂ`3Ú€«Ó ÇÑÂ@ŒÓ€™ÖÂÐÂÐÂÀÐÒÂ`-ÛÂ@JÞÂÀ¾ÕÂ@ñ×Â[ÖÂÀÊÓÂ@ÙÛ ¯Õ€·ÑÂ8Ç€^Ë€× ØÂÀqÍ€ØÂà Ö 2Õ€:ÑÂ`“ÊÂÀGÔÂ&ÊÂÀ¬ØÂÀ5×ÂÀÛÂ@ýÕÂ@ëØÂ vÔÂyÑ€×Â`?ØÂ 8Ô€™ÖÂ`cÒÂàÓ€cß DÒÂ`{ÎÂÀ/ØÂ@zÖÂ`3Ú  Ñ åÌÂ@ýÕÂ@t×€ÕÌ &×Â`¤Ü€XÌ€øÛÂ`QÕ á× ÍЀ4ÒÂ@ÎÈ€@ÐÂà³ÏÂàƒ×ÂgÔ ØÂ 2Õ ¯ÕÂ`uÏÂÏÂà¹ÎÂ@!ÐÂ7ÜÂàÔÂmÓÂ@\ÛÂ`ÚÓ /Ë DÒÂ@ÙÛÂà­ÐÂ`-ÛÂ`ÍÂ@ñ×Â@ýÕ nË€LΠjÖÂ@!Ѐ±Ò€4ÒÂ`þÍ ÕÙÂÀGÔÂàÕÂà_Ý ñÊ ŽÐÂÀÝÂâÂØÖÂàÔµÇÂ`™É€4ÒÂÀÖÑÂ`“ÊÂ`ÍÂ@ÙÛ >ÓÂ`ìЯȠÍÐÂ@ ÔÂÌ ñÊÂÀÛÂÀÐÒÂðÒ€«ÓºÛ ùÓÂ`ìЀ×ÂÀeÏ ÏÂàÂ[ÖÂ`‡ÌÂ@KÉ´Ü ùÓÂ@°ÍÂ`ÈÖ ÜÂ@ŒÓÂ@€Õ ÏÚÂ[ÖÂà‰ÖÂà¿ÍÂ…ÏÂÀYÑ íÕÂÀSÒÂ`KÖ Ù ^ØÂ£ÊÂ@JÞ€L΀ÕÌÂÀ¸ÖÂ@€Õ ‚Ò >ÓÂöÑ ØÂÀúËÂ`ÍÂðÒÂÀ¦ÙÂ@ñ×Â@¤Ï€ØÂ 4ßÂÏÂÐÂ@ ÔÂ`QÕÂ`ÚÓÂÀ¦ÙÂÀMӯȠÿÒ óÔÂ@¤Ï ÁÒ 5Ê ØÂ€ØÂ ˆÑÂêÓÂmÓÂà¡ÒÂÀ/ØÂ PЀLÎÂàƒ×ÂÀkΠ ÍÂÀè΀™ÖÂ@©ãÂ`E× ÍЀ¥ÔÂàÕÂÀ5×ÂCÚÂÐÂ`?ØÂÀŽÝÂàHÌÂÀ‰ÉÂ`ËÂ@!ÐÂ`þÍ tÊÂ`ËÂ`æÑÂêÓÂ@VÜ€4ÒÂÀ5×€pÈÂÀ0àpÕ íÕÂÀÖÑÂÀ‰ÉÂàÕ >ÓÂ…ÏÂÀôÌ 8ÔÂ&ÊÂà0Ѐ:ÑÂ@EÊÂÀâÏ šÎÂ@žÐÂ`Ë€·ÑÂ`ªÛÂÀ߀·Ñ€ÖÂ@EÊÂ`{ÎÂ@ªÎ åÌÂ`ÈÖÂ`þÍÂÀGÔÂÀYÑÂsÒ ÁÒ€±Ò µÔÂà6Ï€@Ѐ(Ô jÖ€çÉÂÐÂàÜÝÂÀÐÒÂÌØÂØÖÂàÔ€¥Ô PЀ·Ñ»ÆÂ`¥ÇÂ@]ÆÂ£ÊÂà­Ð€ŸÕ ŒÆÂà‰ÖÂÀ_Р,ÖÂ@!Б̀ÏÍÂÀ ÚÂ@ßÚÂ`Í ßÍÂ@ÕÂ`‡ÌÂàwÙ€½Ð £×€"ÕÂàHÌ ÿÒÂ`Ë ÐÂØÖÂÀ;ÖÂÀAÕÂðÒÂOØÂgÔ JÑ bÍÂÍÂà¹ÎÂ`oЀ¥ÔÂ` ÌÂ`Í nËÂ=Û &× FÜÂàîÚÂÀÜЀ½Ð )ÌÂÀ¾ÕÂà Ö£ÊÂÀËÂU×Âà•Ô€±Ò ÕÙ ÁÒ€:ÑÂ ÛØÂaÕ ÕÙ pÕÂ@€ÕÂàúØÂ`òÏ åÌÂ@JÞÂà­Ð€oÝ ÏÂ`{ÎÂâÂ`†á Ú ÎÂà¡ÒÂ@°Í€¥Ô€FÏÂ`ÈÖ€½ÐÂ`àÒ ëËÂ`ìРDÒÂ@ñ×ÂØÖÂ@¤Ï LÛ —Ù 4ßÂ`E×€ÃÏ€× ðß PÐÂàÕÂÀÄÔÂà›Ó á×Â`ìÐÂà•Ô »ÓÂ@zÖÂÀíâÂÀSÒÂÀ¾ÕÂ@Õ€{Û tÊÂ`E×  ÑÂàèÛÂÌÂ@9ÌÂÀSÒ vÔÂÀÖÑ€«Ó€™ÖÂàÕÂäÔÂ`{ÎÂ΀pÈÂà×ÉÂ[Ö íÕÂ`“Ê :Þ€Îâ€ÔáÂ@ŒÓ šÎÂ`ÔÔÂ@˜Ñ€ŸÕÂ`3Ú 8ÔÂ@Dß jÖÂàqÚÂ`Í ùÓÂÀAÕÂmÓ çÖÂ@ÇÞÂ@zÖ íÕ &×Â@€Õ ÁÒ á× #ÍÂðÒ Ù΀‡ÙÂ@3Í€:ÑÂÀYÑÂÀ‰ÉÂ`ÚÓÂà¹ÎÂÀÊÓÂ`-Û€RÍ JÑ DÒÂÀÄÔ€ÃÏ |ÓÂÀÖÑ yÞ á× ŽÐÂ`{΀½ÐÂ`{ΠÈ †ÇÂà­ÐÂ@zÖÂÀÄÔÂ`uÏÂ[ÖÂÀ/ØÂ`KÖ á×ÂàÔÂ ÛØÂà× ÛÂ`WÔ€LÎÂÀqÍÂ@Õ€:ÑÂÀ_ÐÂà6Ï€½Ð ‚ÒÂ@ßÚÂÀ5×€·Ñ€þÚÂ@˜ÑÂà¹ÎÂ[Ö€:ÑÂ@ÚÆÂØÖ :Þ€ØÂ ËÂ@žÐ ÁÒÂ@ëØÂàÕÂ`«ÆÂ>ÆÂöÑ Ë ÙÎÂÒ×Â`]ÓÂà§ÑÂ`ÚÓÂÀÖÑ ¬ËÂ`øÎÂàYÞ ^ØÂÞÕ€«ÓÂ@žÐ bÍ µÔÂà0ÐÂ`ÎÕ ÄÇ€:ÑÂ`?ØÂÀAÕ ¦ÌÂ`“Ê€±ÒÂÀ¸Ö á×€±ÒÂ@ÔÇÂÀ_ÐÂêÓÂ@QÈÂ@ ÔÂsÒÂàÕÂ`æÑÂ`òÏÂà›ÓÂ`(ÇÂ`¥ÇÂ&ÊÂ`øÎÂÀ;ÖÂÀôÌ ÓÏ \ÎÂ@žÐÂêÓ€pÈ€ØÂà­ÐÂ@ÑÂ`±ÅÂ@˜Ñ åÌ óÔÂà0ЀoÝÂÀpâ‹ÎÂàéÆÂ \ÎÂÀ•Ç€óÇ€çÉ€^Ë ëË nËÂàYÞ ÁÒÂÀeÏÂÀ*ÄÂàHÌÂ@¶Ì‹Î µÔÂÞÕÂà$Ò€ ÙÂÀ_Ѐ¥ÔÂ`Í VÏÂ`oБ̀ÉÎÂ`ÚÓ VÏÂ`E×Â@ëØÂ@ÙÛÂ@ ÔÂ`¤ÜÂyÑ ÙΠ”Ï€½ÐÂ`WÔ ¦ÌÂ[ÖÂà›ÓÂ@ëØÂ ÃÜÂ@†ÔÂàÖÞ€¥ÔÂ`“ÊÂ`ÉÂ@†ÔÂ`QÕÂàƒ×Â`{΀:Ñ ¬Ë )Ì€áÊ zÉÂ`þÍ zɺÛÂ@ªÎÂà›ÓÂÀÊÓÂmÓÂ&ÊÂ@˜ÑÂÀYÑ ¯ÕÂðÒÂÀÚÂ@ ÔÂ@hÙÂ@t×Â`øÎÂà„ÂÂ@¾Â`þÍ€(ÔÂà¡ÒÂ`É€™Ö€ÏÍ ÷ÉÂyÑÂÀMÓ hÌÂà6ÏÂàxÄ  ÍÂà<΀.ÓÂ`þÍÂÀMÓÂ` ÌÂ`™É€ŸÕÂ`ÚÓÂ@?ËÂ@€ÕÂË 2ÕÂÀYÑÂ@€ÕÂÀâÏÂ@cÅÂà×ÉÂàËË \ÎÂÀMÓÂ`]ÓÂ`KÖ¯ÈÂàxÄÂà$ÒÂÀâÏÂ`øÎÂÀÇÂ@ÂÊÂ@zÖÂÀÝÂ`ÚÓ€RÍ€šÁÂ…Ï€ŸÕ DÒÂ@QÈÂÀqÍÂà×ÉÂÞÕÂ@3Í€·ÑÂ`ŸÈÂ`{ÎÂäÔÂ@JÞ€.ÓÂ`“ÊÂ`æÑ ýÈÂÀ}ËÂ@°ÍÂÀÈÂÀqÍÂ@¤ÏÂà$ÒÂÀYÑÂÀ¾ÕÂmÓÂÀ¸Ö ßÍÂÀôÌ€@ÐÂàúØÂ€ØÂÀ;Ö€dÊÂÀ#Ú¯ÈÂàØÂ€LΠ¾ÈÂ@ÑÂ` Ì€¥ÔÂÀÐÒÂà}ØÂ PЀ(ÔÂà*ÑÂàîÚÂÒ×Âà6ÏÂÀÄÔÂ@àÅ ¬ËÂ@ëØÂÀÖÑÂÀwÌÂÀŽÝ€ÛËÂ`Ê€áÊÂЀ‡Ù€×ÂÀ5×ÂÀGÔÂ@¤Ï€ÖÂÀè΀±Ò çÖÂà¡Ò ÓÏÂà×ÂÒ×ÂàôÙ€ØÂ@ñ×ÂgÔÂÀ)ÙÂ`QÕÂ@bÚÂ`uÏ€{Û ùÓÂà*ÑÂÀôÌÂàÔ€.Ó ^ØÂêÓÂ@nØÂà`ÈÂàîÚÂÀÄÔ >ÓÂ`3ÚÂ`oР·Þ ‹Û€ØÂ@t×ÂàwÙÂ@Ò€‚Å ”ÏÂ@\Û pÕ &×ÂÀ/ØÂäÔÂàÅÌ€ÉΠ@Ý 4ßÂ`¼ØÂ@!ÐÂöÑÂÀÊÓ hÌÂÀwÌ€^ËÂàÓÂÀ¸ÖÂÀ²×Â`-ÛÂ@žÐ @Ý€×Â`¤ÜÂàeÜ &×Â@!ÐÂà¡Ò ^ØÂ \ΠbÍÂ`cÒ€FÏÂ@bÚÂÀ Ú ùÓ€]à PÐÂ…Ï ÐÂ`ËÂ@°ÍÂ@÷ÖÂ@ªÎÂÀ¬ØÂ€‡ÙÂà›ÓÂ@Õ€"ÕÂÀ ÚÂêÓÂ@\Û ˆÑ ”ÏÂà*ÑÂàôÙÂàqÚÂ@ÇÞ€·Ñ 2ÕÂ@†Ô ÓÏÂÀeÏÂ1ÝÂÀAÕÂÀSÒÂÀ¸ÖÂà•ÔÂ@ÒÂ`øÎÂ`ÍÂÌØÂ #ÍÂàôÙÂàèÛ 2ÕÂàÕ µÔÂÀeÏÂaÕ ÏÚ ÝÂ@ÙÛÂØÖ€‡ÙÂÀÚ £×€±ÒÂ=Û ÚÂÀ;Ö ØÂ@,ãÂ@ ÔÂàGáÂÀÐÒÂ@nØÂ€.Ó€™ÖÂàÄá€ØÂ@t×ÂgÔ £×€“× 2ÕÂ@ýÕ XÙ€·ÑÂÀ#ÚÂ@nØÂÀâÏ ‹ÛÂÀ¸ÖÂÀùà DÒ  Í€ÚàÂâÂsÒ ½ÝÂ`˜Þ„äÂØÖÂÀ ÞÂÀ^åÂ@ŒÓÂà5äÂàÊàÂ`QÕÂàÕ —Ù ÝÂÏÂÀ²×Â`ÔÔÂ`9ÙÂÀGÔ€ìÝÂ`¶ÙÂÀ”ÜÂðÒ á×ÂàÜÝ 2Õ ÿÒ íÕÂàúØÂ ÏÚÂÀSÒ€ØÂ€ÔáÂÀâÏ€«ÓÂÀ²×Â@ëØÂºÛÂ@ÙÛÂàâÜÂÀšÛ€× ÝÂà¦æÂaÕ€:ÑÂCÚÂ@ÍÝÂOØÂ`9Ù€×Â`þÍÂÀ¾Õ ØÂ FÜÂàšèÂ@ßÚÂÀ¾ÕÂ@†ÔÂ`ªÛ íÕÂ@zÖÂ@†ÔÂ@Á߀øÛ ±ßÂà0ÐÂ`QÕÂà•ÔÂàÜÝ€‡Ù ©ÖÂ`ÈÖ€QâÂ`˜ÞÂ`Â×Â` ÌÂÀMÓ€.Ó ÜÂaÕ &× …ÜÂ@†Ô ¯ÕÂ`ŒàÂÀ߀(Ô€×€±ÒÂÀÚ€]àŠãÂà•Ô íÕ Û 4ßÂ`ý‟Հ9æÂ ÐÂ ÛØÂÀË ©Ö sßÂ@Vܠ倨ÂàÅ̠܀øÛ€™ÖÂÀXæÂàSßÂ@ÙÛÂÀšÛÂ@nØÂ€ØÂÀ5×ÂàÖÞÂà ÖÂ@ýÕÂâÂàÜÝ XÙÂâÂ@t×Âàƒ×Âà•ÔÂ ÛØÂà*ÑÂà ÖÂ`WÔÂ`˜ÞÂ`°ÚÂ@>àÂÀŽÝ€ØÂ`à€¥Ô€4Ò êàÂÀÄÔ ùÓÂà*ÑÂ@ÓÜÂ`ÎÕÂ`ÍÂ@÷Ö€cßÂ`ÎÕ ™ã€uÜÂ`ÔÔÂ@¤ÏÂ`â€{ÛÂ@£äÂ`Œà ”Ï µÔÂà•ÔÂ`ŒàÂÀÜ€‡Ù ÚÂ`â RÚÂ`E×ÂÀ‚߀ ÙÂ@hÙ€(ÔÂ@ßÚÂ@ßÚÂ`ßÂÀˆÞÂ`ªÛÂàÄá ‹ÛÂÀváÂÀ)ÙÂÀçãÂÀ@êÂÀpâ 4ßÂàwÙÂOØÂ ·Þ€KãÂ+ÞÂ`÷ãÂÀÿߊãÂIÙÂ@8áŠãÂ`ýâ€æÞ€ÈãÂäÂ@JÞ€oÝÂÀ¾ÕÂÀÚ€ ÙÂ@£äÂÀáäÂ`zãÂÀíâÂÀ‚ß þç€3çÂ@8áÂàeÜÂ@ÍÝ€cßÂàeÜ€òÜÂ`’ßÂ`ªÛ€ØÂ øè€Úà [ã ìêÂxæÂ`Œà ‘Ú ãÂ@¯âÂÀóáÂ@>à„äÂÒ×ÂàØÂ ØãÂ@2â´ÜÂ@PÝÂ`ëåÂáÂ@nØÂ€ÚÂÀˆÞÂ@nØÂÀ¬ØÂà;ãÂàÖÞÂØÖ€iÞÂ@†ÔÂ`ÈÖÂ@hÙ€× @ÝÂÀ^åÂÀùà€@Р…ÜÂ@€ÕÂÀ¬ØÂ€ÏÍ ÁÒÂàîÚ€]àÂ1Ý€ÚàÂàØÂ`iÑ RÚÂ@\ÛÂàúØÂ€@Ѐ{Û€ØÂ¨Þ óÔ êàÂÀ/ØÂ`Ë ÜÂ ÛØÂ€“×Âà‰ÖÂ@bÚÂÀÝ€ŸÕÂ@>àÂàèÛÂÌØÂ`Â×ÂÀ/ØÂ€uÜÂIÙ &×ÂÀÚÂàÜÝÂ@VÜÂ@žÐ€‡ÙÂÀÖÑÂ@ÒÂaÕ ÏÚ ØÂ€ Ù Û "â |ÓÂÀ ÞÂOØÂÀÛÂðÒÂÀváÂÀóá üÝÂ`¶ÙÂ`€âÂ@ëØÂ UäÂâ€ÛËÂCÚ "â€{ÛÂÀMÓ ΀ÔáÂ@ÓÜÂ`WÔÂÀ¬ØÂÀóáÂÐÂ`Â× ØÂÒ× #Í€þÚ€:ÑÂ=ÛÂ`°ÚÂ ÛØÂ+ÞÂÀÖÑ ©ÖÂûåÂ@£ä £×ÂÆÙ¨ÞÂ@÷ÖÂ@°ÍÂOØÂ€cß ðßÂ@t×Â@’ÒÂ@†Ô€Ö j֮݀±ÒÂ`òϺÛÂÀÜÐÂOØÂ`uÏÂ@ Ô µÔ ä€ÔáÂàÐß ¯ÕÂàÓ€òÜÂ@9ÌÂ`™É [ãÂ@ÇÞ ãÂ[ÖÂÀ¸Ö€"ÕÂÀÜÐÂ`cÒÂ@,ãÂàôÙÂÀGÔÂ`ÔÔÂ@€ÕÂ@ŒÓ ÁÒÂÀ¦ÙÂ=ÛÂà•ÔÂ`Þ Û€oÝ Ï 8ÔÂÀ·ëÂÀÝÂ@˜Ñ€ŸÕÂÀÖÑÂà0ÐÂ`æÑ…ϨÞÂ@åÙÂ@ªÎÂðÒ RÚÂ@'Ï€±ÒÂà$ÒÂ@÷Ö üÝÂØÖÂ@nØÂ€þÚ «àÂÀSÒÂàÓ ÿÒÂÀôÌÂ7Ü ^ØÂ`ªÛÂØÖÂÀGÔ yÞÂÀšÛÂ=Û€FÏÂÀÝ üÝÂ`˜Þ …Ü ÕÙ ÛÂà*ÑÂØÖÂ@ÓÂ@ñ×ÂÀd䀿ÞÂÀÜÐÂ@>àÂ`Çë ±ßÂ`3ÚÂðÒ ÍÐÂ`Þ Ù€Ôá€Úà Ú€·ÑÂ@zÖ€Úà pÕÂÀ;Ö …ÜÂ@'ÏÂÀ/ØÂÐÂÀ5×Â`cÒÂàƒ× pÕÂ@©ãÂ1Ý ¥á ØÂ jÖ ÙÂ@\Û ^ØÂOØÂ`ÎÕÂàeÜ€·Ñ ©ÖÂÀpâÂàÔ ÃÜÂÀÚÂ`KÖÂ`°ÚÂ`QÕÂ`âÂ@2â ÕÙÂàÕÂsÒ PÐÂÒ×€ìÝ€ìÝ RÚÂàÜÝ ·ÞÂÀ;ÖÂ1Ý RÚ ÛÂ`uÏ XÙÂà Ö€¥ÔÂàôÙ€¥Ô€‡Ù ÝÂ@ßÚ‘ÍÂàÕÂÀMÓÂ@t×ÂIÙÂÀSÒÂÀôÌÂ`ÞÂØÖÂàÂàÓ ©ÖÂÀ”Ü€¥ÔÂÀÄÔÂàeÜÂ`Í ,ÖÂ@ÙÛ 2Õ ΀±Ò yÞÂÀ¬ØÂ`?ØÂ Ý€:ÑÂ`ÎÕÂàÂÂ`Í ‹ÛÂÀAÕÂÀÊÓÂÀ#Ú öÞÂ7ÜÂ@ŒÓÂà*ÑÂ`ÚÓ |ÓÂyÑÂÀÊÓ íÕÂgÔÂ`ÈÖÂ@nØÂàÓ ÍÐÂ`cÒÂ`(ÇÂÀ5×ÂÀ Þ€½Ð€ÚÂàÕ ¦Ì á×ÂР/ËÂ`]Ó ÃÜÂ@¤ÏÂÀ¾Õ ¬Ë ˆÑÂ`Â×Â…ÏÂÒ×Â`˜Þ€"Õ€:ÑÂ@ÇÞÂðÒ€XÌÂ@nØÂ jÖÂ@€ÕÂàwÙÂÀ/ØÂ`°ÚÂàÜÝ€ ÙÂÀ}ËÂà­Ð ‚Ò vÔÂ@ªÎÂaÕ çÖÂ`¶ÙÂÀ5×Âà­Ð ‹ÛÂIÙ 2Õ€™Ö ©ÖÂ`¼ØÂÀSÒ  ÑÂÀÖÑÂ@!РvÔÂØÖÂ`æÑÂ`-ÛÂüЀXÌÂ`oÐÂÀGÔÂàÕÂ@ßÚ ØÂ@ ÔÂÌØÂ ·Þ€«ÓÂà Ö€\õÂyÑÂàØÂ@zÖÂÀ ÚÂ`KÖ ÙÂ@nØÂ€à߀]à :Þ ”ÏÂÐÂà¹Î #Í šÎ€ ÙÂà­ÐÂÀè΀:ÑÂüÐÂàÊà€ÖÂ@ëØÂ€3çÂ`Â× ‘ÚÂ`E×Â7ÜÂΠ\ÎÂ@zÖÂüÐÂà$ÒÂ@>àÂ@ýÕ XÙÂ@ÕÂüÐÂàƒ×ÂÀvá ØÂsÒÂà§Ñ .àÂ`¼ØÂà•Ô Ù aâÂ`]Ó ‚ÒÂÀ¸ÖÂÀšÛÂ1Ý€±ÒÂU×ÂÀqÍ »ÓÂ@nØÂ ØÂÀšÛÂàÜÝÂàqÚ çÖÂ@’ÒÂÀšÛÂ+ÞÂ`cÒÂ`-ÛÂ@»àÂ@JÞ ‚ÒÂ`WÔÂà¡Ò€.ÓÂCÚÂàeÜÂCÚ FÜÂÀ¦ÙÂàÜÝÂÀˆÞÂ@ŒÓÂàÕÂ@˜Ñ Ò ÒÂ`?ØÂ çÖ ÓÏ Ú >Ó€{Û ØÂàÓÂ@zÖÂ@ Ô€× üÝÂà¾â€ÃÏÂ@åÙ®ÝÂÀóáÂÀ ÚÂ`9ÙÂÀÐÒÂ@nØÂOØÂÀˆÞ (á RÚ€× &× —ÙÂ ÛØÂ yÞÂàÜÝÂÀ)Ù ÒÂäÔ€FÏ |ÓÂÀÝ LÛÂ`àÒ ØÂ€ŸÕÂà Ö€«ÓÂ@Õ 8ÔÂÀÚÂ@Íݠ܀æÞÂ@PÝ€XÌÂ`¤ÜÂ@ÑÂΠ”Ï€jɺ۠&×Â@ÓÜÂ@†Ô Û€ØÂ`cÒ 2Õ ÁÒÂÒ×€·Ñ PЀ±ÒÂÀ ÚÂ`¤ÜÂ@zÖ JÑÂ@¤ÏÂÀˆÞ ÉÛÂËÂÀAÕ óÔÂàÊà RÚÂ@\ÛÂsÒ€ÛË —ÙÂ`¼ØÂ šÎÂ`.ÆÂ€¥ÔÂ`QÕ ‹Û ØÂ ¯ÕÂà$ÒÂ`’ßÂ+Þ€×Â@ ÔÂàƒ×ÂÀîÍÂ@åÙ ÏÚ€{ÛÂÀˆÞ 2Õ ,Ö€^Ë PÐÂ@ÓÂÀwÌ£ÊÂà•ÔÂ`!ÝÂà ÖÂ`ÈÖ vÔ€vÇÂyÑÂyÑÂ@žÐÂ@ŒÓÂàÕÂ`cÒ¨Þ€¥Ô€øÛ 8ÔÂ@ÍÝ Òä€Ö—ÌÂ@nØÂÌ á×ÂÀßÂ@ÓÂ@DßÂàôÙÂÀ¾ÕÂàÕ€ÃÏÂà¡Ò€ÃÏÂ`ÎÕÂ`¶Ù 8ÔÂ`¶Ù ‚ÒÂ`ÔÔ 8Ô JÑ bÍÂà‰ÖÂ`.ÆÂ@KÉ‹ÎÂ@ÓÜ‹ÎÂà<ÎÂ@Õ€ÚàÂÀ”Ü—ÌÂÀ/ØÂ ÁÒ ëËÂÀ;Ö PÐÂ`æÑÂ@ÑÂàØÂðÒ€ŸÕÂ`ÎÕ€ŸÕÂ@t×Â`’ßÂ ÛØÂyÑÂÀÐÒ€™ÖÂÀƒÊÂ`cÒ€ØÂ`ÔÔ íÕ€@Ѐ¥ÔÂÀGÔÂ@,ãÂÀ}ËÂ@ëØÂàÕ  Í 8ÔÂÒ×€‡ÙÂ`øÎÂÀÄÔÂ@ ÔÂ@’ÒÂ[Ö ØÂ€ØÂÀMÓ€Ú XÙÂ ÛØÂOØÂÏ€ÚÂ`nåÂÆÙÂ=Û ‹ÛÂàÓÂ@nØÂ@ÑÂà¡Ò ÏÂðÒÂ`ìРǠÖÄÂ`ÈÖÂÀ;Ö )ÌÂÀYÑÂ…ÏÂÀ ÚÂá ËÂ@Õ ØÂ€‡ÙÂà¹Î »Ó ½ÝÂàÔÂÀ)ÙÂÀÜ XÙ çÖÂàúØÂà‰Ö ØÂÀÛÂÀ²×Â`òÏÂàËË ÐÂ`oÐÂÀîÍÂ@iÄÂaÕ ÛÂÀMÓÂðÒÂÀÐÒ á×€ëÂÀ¬ØÂ åÌ @Ý pÕ )Ì ¬Ë€×Â`Â×Â@ëØÂ ˆÑ€½ÐÂðÒÂÀ/ØÂ€ØÂÀ¾ÕÂU×€oÝ€cßÂà­Ð€dÊÂÀÜÐÂ`ÍÂ`cÒÂ`ìÐÂàÓ€jÉÂÞÕÂ@VÜÂ`™É »ÓÂ@˜ÑÂÀGÔ /ËÂ`‡ÌÂÀ/ØÂ íÕÂ`ÎÕÂàÓ zÉÂmÓÂÀÄÔ ÇÑÂ@!ÐÂà§Ñ €È \ΠAÈ €ÈÂÀ ÚÂÀîÍÂÒ×€Úà€ÉΠÏÂ`WÔ€ÿÅ€vÇÂÀqÍÂ@ÕÂÀÖÑ€4ÒÂà6Ï‘ÍÂ@ýÕÂ@Ò€:ÑÂà}ØÂ`KÖÂÀîÍ ²ÊÂ`Ë€ŸÕÂ` Ì çÖÂmÓ€ŸÕÂàՠ݀ Ù ©ÖÂ`àÒ€ÕÌÂÀÐÒÂÀ²×ÂàÝÈ ÒÂ`Ë #ÍÂÀeÏÂ@'Ï€ÃÏÂ`àÒ€ŸÕ ÏÚÂàwÙÂ`E×ÂØÖ >Ó ÇÑÂOØÂäÔÂàwÙÂ@ªÎÂÀ¾ÕÂ@ÓÜ ÆÂ[ÖÂÀ;Ö ,ÖÂÀƒÊ çÖÂ@-ÎÂÀšÛÂÀÊÓ LÛÂ@zÖÂÀÊÓÂ`¤ÜÂ`]ÓÂäÔ€XÌÂ@ ÔÂ@ Ô€RÍÂ@'ÏÂ`‡Ì®Ý vÔÂà<΀(Ô€jɩɠhÌÂàNË ÕÙÂÀ¾ÕÂÀÜЀ«Ó€LÎÂ@-Π;ÉÂ`@ÃÂÀÊÓ€×Â`E× ÍÐÂ`cÒÂaÕ ©ÖÂÀ ÚÂàSßÂ@\ÛÂ`'Ü€"Õ€ŸÕÂà¡ÒÂ`QÕÂà¹ÎÂäÔÂU×ÂäÔ ßÍÂ`òÏÂaÕÂÀYÑÂÀ}ËÂÀÜЀÕÌÂ@žÐÂ`Ë€½ÐÂÞÕ€ÏÍÂàHÌ€4ÒÂÀƒÊ ÒÂU×ÂØÖÂΠ‚ÒÂÐÂ@ýÕÂàHÌÂyÑÂäÔ€ØÂàõÄ€áÊÂ@ÑÂ`3ÚÂ`°Ú€LΠëË ÇÑÂCÚÂ1ÝÂÀ¾Õ ÿÒÂðÒ ÙÂ[ÖÂ@Õ£ÊÂÀ³Â 5ÊÂ@€ÕÂ@’ÒÂÀeÏÂäÔÂüЀ«ÓÂgÔÂêÓ  ÑÂà×ÂÐÂ@ ÔÂ@ÙÛÂÀ”ÜÂ@¶Ì ΠDÒÂà<ΠëË ¾ÈÂÀYÑÂ@!ÐÂ@ÈÉÂàÓ€±ÒÂà6ÏÂÀqÍ ØÂ zÉÂ@ Ô€4ÒÂ@ªÎÂÀÄÔÂàTÊ #Í€ŸÕÂ@?Ë€@ÐÂÀâÏÂÀ¸Ö íÕ€4ÒÂÀeÏ€RÍÂ@¼ËÂöÑ€‚ÅÂ`àÒ µÔÂà_Ý 2ÕÂÀ;ÖÂÀ¾Õ €ÈÂ@ÎÈÂÀ/ØÂ@t×€™Ö ¦ÌÂ@zÖÂ` áÂÀSÒ€ÛËÂ@iÄÂ@ÔÇÂ`‡ÌÂÀ¦Ù€:Ñ€ÃÏ ëËÂ@Ò€(ÔÂÀ­Ã ÷É ÎÂà¿ÍÂðÒÂÀAÕÂ@¼Ë µÔÂÀ/ØÂ€áÊÂgÔ  ÑÂàÔÂÐÂüÐÂ ÊÆÂÀÜÐÂÀ/ØÂ@3ÍÂà³Ï ˜ÄÂ@]ÆÂ »ÓÂàÔ ÒÂàfÇ ÒÂ@ìà;ÉÂ`ÚÓÂ@ªÎÂÆÙÂÀ¸ÖÂ`òÏ€·Ñ \ÎÂÏÂ@cÅ ÷ÉÂÀYÑ€ÏÍÂ@†ÔÂÌØÂsÒ šÎ ÏÂ`Â× ÓÏÂÀÈÂÀ_Ѐ±ÒÂÀYÑ€.ÓÂ@žÐÂÀËÂ@WÇÂ8ÇÂÀ}ËÂÀÖÑÂÀ_ÐÂ@€ÕÂ`“Ê€“×€.ÓÂ@žÐÂ`ÎÕ XÙ Ù΀@ÐÂ@¼ËÂËÂ`ÚÓÂÀÖÑÂÀÄÔÂ`uÏ ñÊ ÍЯÈÂàÑÊ ˜ÄÂ@¼ËÂР¬ËÂ`]Ó ¬ËÂ`iÑÂÀÄÔÂ@!Р&×Â@ÂÊÂÆÙ ÍÐÂ`òÏÂ`‡ÌÂ@WÇ€XÌ ÏÂà³ÏÂÀôÌ €ÈÂ@°ÍÂ@ªÎ€4ÒÂüÐÂàîÚ 8Ô€ Ù ùÓÂ`ÔÔÂ`ÎÕÂ`øÎ€ØÂ XÙÂ@3ÍÂ@ÂÊÂà¹ÎÂÀwÌ 4ß 4ß ÛÂÀ;Ö€½ÐÂ`ÚÓÂÀ•ÇÂ@ Ô  ÍÂ@€Õ LÛÂÀ²×Â=ÛÂÀGÔÂOØÂ ëËÂ`KÖ ”ÏÂ@ŒÓÂ@ýÕÂ@hÙÂàúØÂÀšÛÂðÒÂ@†Ô ÎÂ@nØÂ€4Ò€™Ö XÙ nË€±Ò ‚ÒÂÀ#Ú€×€Úà€]àÂÀ²×€æÞ DÒ€òÜÂüÐÂÒ×ÂöÑ€ ÙÂà0ÐÂà$ÒÂà•Ô DÒ óÔÂ@Õ d×ÂàôÙ€{ÛÂ`?ØÂ`KÖÂÀ¾Õ€ÏÍÂ`ÔÔ ½ÝÂðÒ€ÚÂÀß ÕÙÂÐÂöÑÂàîÚÂÀÄÔÂÀ¸ÖÂÀŽÝ ¯Õ —ÙÂ@ñ×ÂÀÜЀ™ÖÂ@!ÐÂР·Þ€ÚÂ…Ï€™ÖÂ+ÞÂÀßÂÀáäÂàÔÂOØÂ@¶ÌÂÀÜÐÂÀÜÐÂàeÜÂÀÚÂàeÜÂà ÖÂÀ)ÙÂÀÄÔÂÀAÕ€½Ð DÒ ÞâÂ`9Ù€øÛÂ@ýÕÂ@,ã€"ÕÂÞÕ€4ÒÂÀ5×€ÉÎÂ`ßÂÀdä€þÚÂIÙ á×ÂÀYÑÂ@VÜÂ@t×ÂàÜÝ€òÜÂ=Û LÛÂ@D߀‡ÙÂ@ÕÂàƒ× ,Ö hÌÂ@žÐÂ@€ÕÂà¡ÒÂàÀÂ`¼ØÂ`3ÚÂaÕ  Í‹Î€þÚÂÀAÕ€Úà€(Ô bÍ ØÂ€XÌÂ`àÒÂ@tרÞÂÀ²×€(ÔÂ@ýÕÂÀAÕÂàÖÞÂ`¤Ü€(ÔÂàØÂ@PÝÂÀˆÞÂÀ5×Â@8á€ÚÂ`KÖ´ÜÂÀÛ€æÞ€ØÂàAâ êàÂ`âÂÀÏçÂ@»àÂØÖÂàÐß ØÂØÖÂ@µáÂàMàÂÀóá ÞâÂ`¶Ù¨ÞÂ`!Ý€iÞÂÀß d×Â`ßÂàÐßÂ`zãÂ@ñ× «àÂ`žÝ ¢ìÂØÖÂàØÂU×€ÔáÂ@ëØÂ`?ØÂ€cߨޠ·Þ ÚÂ1Ý€ÚÂ`àÂàÔÂsÒÂÀáäÂ`!ÝÂÞÕÂ7ÜÂÀÜÂàwÙ ·ÞÂ@…é€c߀ ÙÂ`-Û€"ÕÂ`3ÚÂyÑ€±ÒÂà*ÑÂ ÆæÂ Þâ ÿÒ öÞÂÀ Þ (áÂÒ×Â@ÁßÂÀˆÞÂIÙÂÌØÂÀAÕ RÚÂ%ßÂà}ØÂ@hÙÂ`ÚÓ€9æÂ ÞâÂàîÚÂ@ÓÂ`WÔÂà›Ó€ÂäÂ@—æÂ`'ÜÂ`VéÂ@Dß sßÂ@2âÂIÙÂå ãÂ@ÇÞÂÀ#ڮݠaâÂ7Ü ÃÜ ·ÞÂàMàÂÀÜÂàMà yÞÂ@‹èÂÀ‚ßÂàîÚÂÀ¬ØÂ ÝÂ@zÖÂà ÖÂàÔÂ@PÝÂ@hÙÂ`ÚÓÂ%ßÂàÂ@ åÂÀáä€{ÛÂÀeÏÂÀYÑÂ@nØÂOØÂ€Ö ±ß ±ßÂ@PÝÂ`QÕÂ@ýÕÂØÖÂ`¶ÙÂ`9Ù yÞÂàÜÝ€æÞÂàƒ×ÂàèÛÂ`E× Oå ±ßÂÀßÂ@>à€þÚÂ`°ÚÂ@»àÂ@ÓÜ€]à d×€?å€øÛ ÓÏÂ`ªÛÂÆÙ RÚÂà;ãÂÀÚÂÀ ÚÂ@hÙÂàqÚÂÀšÛÂàeÜÂ@‘çÂàƒ×Âà ÖÂ@JÞÂÀÿßÂ+Þ ðßÂ×ëÂ`’ßÂÀóáÂàÊàÂÀÛÂ@PÝ :Þ çÖ€ ÙÂ`'ÜÂ`ÎÕÂ`'Ü€uÜÂà}ØÂ€òÜÂÀdä @Ý€ÎâÂÀ¬ØÂà}ØÂ€òÜÂ@nØÂ ¯Õ >ӜࠇæÂÀùà€]àÂ`zãÂ@8áÂ`KÖÂ`3Ú€4ÒÂ`†á ™ãÂÀÊÓÂÀ‚ßÂ@ ÔÂàwÙÂ`Ùè OåÂ@êÂ@—æÂ`bç çÂà5äÂÀßÂ`â–á RÚ «à äÂÀíâÂsÒÂ`Þ€iÞÂ@,ãÂÀÝÂÀ¦Ù€øÛÂÀ¬ØÂ€ØÂ€òÜÂ@ÇÞÂä äáÂÀ”ÜÂáÂ@ßÚÂ@»àÂàÖÞ «à€Kã 4ßÂ@ÙÛ€ÂäÂBï UäÂ@2âÂ@ÓÜÂÀvá€Èã€àßÂ6ñÂÀ¦Ù€ªèÂãéÂ@bÚÂà¸ã ·ÞÂIÙ€WáÂ@÷ÖÂ`ÚÓÂÀ/ØÂà}ØÂÀóá XÙÂ@åÂàšèÂ`Vé€Ôá .àÂÀXæÂ`߀¥Ô OåÂ@&äÂ`ßÂ@ÓÜÂ7ÜÂféÂ`'ÜÂÀíâ€WáÂÀLèÂ`ÓéÂ@‹èÂàèÂàÜÝÂàÖÞÂåŠã aâÂá Ü€-èÂ@ëØÂ ÆæÂ`ëåÂ@åÂÀáäÂ@åÂàèÛÂ`ê ºèÂ1Ý€uÜÂ@¯â®ÝÂûå ÛÂ@JÞ€Ôá€ØÂ 2Õ UäÂ@å ‡æÂ@JÞ€oÝ ¥áÂÀßÂÀdä :ÞÂàØÂÀÛ€ÔáÂ`†á€cßÂ`à€¼åÂ@¯âÂáÂàîÚ üÝÂ ÛØÂÀ/ØÂ€EäÂÀ Þ€°çÂÀÕæÂ cìÂ@©ãÂÀšÛÂÀpâ€E䀇ÙÂ`ýâ€àßÂÀRç mà€9æÂ`°Ú¢ßÂÀ.íÂ@Á߀¥ÔÂ`täÂ@ÓÜÂ`’߀Kã mà ç Òä öÞ€ÚàÂ@ÍÝÂZëÂà²ä ÛÂ@PÝÂà5ä çÂ@¯â–á ©ÖÂ@DßÂõæÂ€ÚÂà¸ã äáÂ`tä€'é .à 7éÂÝê€ØÂ —Ù€ÂäÂÀˆÞÂÐÂ+ÞÂ×ë€bôÂ@míÂ@ÍÝÂ`÷ã UäÂÀÃéÂ`†áÂ@ÍÝ üÝÂäÂ@»àÂÀ|à€ªè„ä ºèÂ@©ãÂ`ýâ öÞ Òä IæÂÀÜÂÀóáÂàMà€?åÂ`Íê ±ßÂ`ýâÂÀXæÂ@ÁßÂÀXæÂ`†á€ì ™ãÂ@ÓÜÂàeÜÂ`hæÂà‚ìÂàGá ŸâÂ`÷ã Cç yÞ sßÂàÄáÂà#ç 7é ½ÝÂ@å€uÜÂÀßÂ`¶Ù€Wá€ÂäÂ@,ãÂ@÷ÖÂá€àß yÞÂ@VÜÂÀÿßÂàkÛÂ`zã€Âä vÔ XÙÂÀGÔÂÀ#ÚÂ`÷ã¨Þ ½Ý QïÂ@£äÂ`Œà€×ÂÀ ÚÂàîÚÂ`žÝ€ÎâÂà_Ý äÂ`ßÂ@£äÂ`˜Þ ±ßÂ`ŒàÂÀˆÞ ‹Û€]à .àÂ@ÍÝÂ`žÝÂ`àÂ`!ÝÂÀ¬ØÂàkÛÂà/å€þÚ€òÜÂ`’ßÂÀGÔ ØÂàkÛÂaÕ€iÞ 2ÕÂàÖÞÂ@÷ÖÂÀÏç€ÈãÂÀíâÂàÜÝÂ@ýÕÂÀšÛ ±ßÂ`†áÂÀÝ FÜ€žêÂCÚÂ@˜ÑÂ@ñ× ©Ö€“׮ݠÏÚ€«ÓÂ@bÚÂêÓÂàôÙ€ŸÕÂÀÊÓÂÌØÂ`°Ú€-èÂ`€âÂÀŽÝÂ@nØÂ d×€Kã€þÚÂàØÂ`ÈÖÂäÂ`ÈÖ vÔÂ`ÊÂÆÙÂÀ¬ØÂ@ñלàÂ@ÍÝÂà²äÂÌØÂ ØÂ`Â×Â@t×ÂÀ_ÐÂÀ5×€Ú€Eä ÉÛ þçÂÀÕæÂÀˆÞÂ`E× 8ÔÂÏÂÀGÔÂàeÜÂÀÖÑÂÀ¸ÖÂ`ÚÓ d×Â@ÁßÂàwÙ®ÝÂ@DßÂ@KÉÂÀÄÔÂ`!Ý€Ö ‹Û ^ØÂ äá€'éÂÀÜÂU×€×Â`ßÂ`°ÚÂÀ²×€ÎâÂàâÜÂÀÛ ‡æÂ`!Ý &×Â+ÞÂ`3Ú€cßÂIÙÂ@ŒÓÂ@ÍÝÂÀ¬ØÂÌØÂmÓÂêÓÂ`™É XÙÂ=ÛÂàÔÂÀÊÓ RÚÂà$Ò ùÓÂ@ñ×ÂÀÚÂÀ)Ù ‘ÚÂ@t× ©Ö ‘Ú ˆÑ ÜÂ[ÖÂà× sßÂ`KÖ /Ë€×Â`9ÙÂÆÙÂÀ ÞÂ`WÔÂ@t×€¥ÔÂ`QÕÂ`?ØÂ`ÈÖÂ`E×€ ÙÂà­Ð £×Â@ÇÞ Ò€¥Ô jÖÂ`žÝ€Ö€iÞÂÞÕÂ@µá€cßÂÀ¬ØÂ`ÎÕÂ`WÔÂ@,ãÂÆÙÂÀˆÞÂà‰ÖÂàèÛÂàwÙ€Ú ÙÂmÓÂ`°Ú€ÚÂÀÜ šÎ€(ÔÂÀ¬ØÂ`àÒÂ@nØÂ€þÚÂà}ØÂ@ÑÂ@†ÔÂÀÚÂ+ÞÂ@ÁßÂÀùàÂàôÙ€òÜÂ@ç RÚ€«ÓÂàÕÂðÒÂÀçãÂ`¶Ù€"Õ :Þ ‘Ú ±ßÂ@ßÚ ‹Û€.ÓÂ1Ý´ÜÂÀ|àÂÀjã€cß„ä êà€LÎÂÀ¸Ö ±ß ØÂ`€â jÖÂà}ØÂ@zÖÂ@Ò jÖÂ`žÝ€ØÂÀ¾ÕÂàØÂ êàÂàâÜ ùÓ€ÚÂ`uÏÂÀ¾ÕÂÞÕÂÀˆÞÂà­ÐÂÀ ÞÂàôÙ€ÕÌÂ`WÔ d×Â%ßÂ@»àÂ`-ÛÂ@VÜÂÀ ÞÂ`¶Ù€uÜÂ` áÂà¸ãÂ`¶ÙÂ@PÝÂàeÜœà€±ÒÂ`ÈÖ€]àÂ`-ÛÂ@ å€KãÂàôÙÂÀ²×Â`ýâÂ×ëÂÀ¬ØÂÀŽÝÂ@»àÂÀ5×€LÎÂ@ßÚ üÝÂàSßÂàwÙ óÔ 8ÔÂUרޠŸâ ,ÖÂ`ÔÔÂàÔÂ`àÂÀ5×ÂÀÛå€à߀QâÂ`žÝÂàSßÂ7ÜÂ@ÍÝÂÀÝÂÀ/ØÂÀÐÒÂ`bçÂÀÛÂ`¶ÙÂÀâÏÂ`ìÐÂ`¤ÜÂ`€âÂ@°Í€ØÂ€™Ö€‡ÙÂ`ÈÖ —ÙÂ`æÑ€¥ÔÂàÔÂà;ã Òä€Èã çÖ šÎÂ`]ÓÂ@ ÔÂÀ5×€XÌÂÀ;Ö€àßÂ`Þ :ÞÂ@ŒÓ€™ÖÂàÊàÂà€¥Ô ÝÂà5äÂ1Ý çÖÂà}ØÂ ©Ö€cßÂ`àÒÂÀóáÂ`žÝ€ØÂ >ÓÂÀpâ€iÞ€(ÔÂàÕÂ@ëØÂ@ÁßÂàôÙÂ`Þ ÙÂàeÜÂ@¯âÂÀ|à€æÞÂOØÂÀ Þ€"ÕÂIÙÂàGáÂ7ÜÂ`E×Â`zãÂÀAÕÂ@VÜÂ@bÚÂàÊà 7é€oÝÂÀÛÂ@hÙ ØÂÀôÌÂÀˆÞ ÝÂ`˜ÞÂ@PÝÂà×Â@bÚÂ`?ØÂàƒ×ÂàwÙÂ`â sßÂ`°ÚÂ`ÚÓ Uä ÜÂÆÙÂ@nØÂ€‡ÙÂ`9Ù ØÂÀ‚ßÂ@‘ç ÕÙ öÞ€9æÂ ‘ÚÂ`KÖÂ`’ßÂ@2’ÖÂ@\ÛÂ@©ã ã ÏÚÂ@8áÂàôÙÂ`ÈÖÂ`žÝÂ@ÙÛ çÖÂ`’ßÂ`Â× [ã …ÜÂ@ÙÛÂ`žÝÂ@êÂ@,ãÂàîÚ€9æÂ@÷ÖÂ`täÂàSßÂ@Á߀ÚÂ@PÝÂÀÿß gဇÙÂöÑ LÛ îÂÀßÂ`°ÚÂ`ªÛ€ìÝÂ+ÞÂà ëÂ@\Û ‚Ò€{Û ÃÜ€ÚÂ`-ÛÂ@Ó DÒ |Ó ¯ÕÂÏ —Ù RÚÂàkÛÂÀGÔÂàÓ ^ØÂ ,ÖÂàeÜ€ŸÕ DÒÂ@hÙÂÀÄÔÂÒ×€ÚàÂàôÙÂà;ãÂ`’ßÂ@ëØÂ´ÜºÛ€“×Â`?ØÂÀ¾ÕÂÀ¾Õ€ÚàÂ@t×ÂUרÞÂà5äÂ`-ÛÂ@>àÂ@ÁßÂâÂ@©ã ·ÞÂ`ß ÝÂàSß .àÂ` áÂ ÆæÂ`ýâ€Wá ÝÂà)æÂ@éÂÀßÂàMà ãÂ@>àÂ@&äÂÀÕæÂÀXæÂ€Ôá–á–áÂà)æÂà¾âÂ%ßÂ`åæÂà;ãÂ1Ý ´é ìêÂ`PêÂàÐßÂ`’ßÂ`\èÂrçÂàêÂÀpâÂÀùà ãÂ+ÞÂ`à öޜࠇæÂ sßÂÀíâÂZë ‡æÂ€ØÂä å€ÚàÂ@,ãÂ@8áÂ`nåÂ@…éÂ`°ÚÂ@&äÂrçÂ@míÂ@&äÂÀˆÞÂaÕÂÀ‚ßÂ` áÂ@é€Èã êàÂÀçãÂ`bçÂÀ^åÂÀóá ¨ëÂÀóáÂÒ×Â%߀žê ¥áÂÒ×€3ç ÌåÂÀ5×€ÈãÂÀ߀KãÂ@»à€¼å «àÂ@åÂÀçãÂÀáäÂ@¯âÂÀÃé€ìÝÂxæÂéèÂ@êÂ@µá oêÂÀ‚ßÂ@åŠã WîÂ@ØðÂ ÛØÂ€ÈãÂàê  æÂ`ŒàÂ@è€3çÂ`€âÂÀváÂàMà€ÔáÂ@DßÂ`nå þçŠãÂà;ãÂ`ÙèÂÀ ÞÂ`’ßÂ@æÂ`àÂ`åæÂûåÂéèÂ@æÂÀRçÂ@ÙÛ ÞâÂ`VéÂ@ðì€ÚÂûåÂâÂ@JÞÂàÐßÂËí [ã€Qâ  æÂ àì  æÂÀ½ê äÂÀ ó àìÂ`ŒàÂÀíâ ¥áÂÀíâÂàdñ€WáÂ`täÂà¸ãÂ`ñäÂ~åÂàSßÂÀdäÂà;ãÂ`»í ™ã üÝÂà)æÂ uéÂà‚ìÂ@£äÂÀÃ逰çÂ`¤ÜÂ@8áÂ@¯â ¢ìÂÀ"ïÂ@êÂ@æÂ` òÂàdñÂ`VéÂÀ4ìÂ@æÂ@‹èÂûå gဒìÂf逪èÂ@åÂ`¯ïÂ`nåÂàŽê xóÂäÂÀ(îÂ`ü÷Â`ÙèÂà#çÂ`óÂ`bçÂ`Óé ué cìÂàùíÂ@è€-èÂ`ëå =è¨ÞÂ@&äÂÀæøÂ€Œí€WáÂàÿìÂ`µîÂ@g렇æÂ€Âä íÂÀ(îÂ`ñäÂ`ßçÂâÂ@&äÂàéÂ`zã€Îâ “ä Øã @ÝÂà/å gá€àߢßÂÀÿßÂ@PÝ´ÜÂÀáä€uÜÂÀÛÂ`€âÂ`ªÛ€KãÂà¦æÂ @Ý€Ôá (á ·Þ ÒÂ`ÚÓ´ÜÂ`ëåÂÀùàÂÀ²×ÂØÖÂà•ÔÂ@t×ÂàÜÝ€ØÂÀMÓÂÀGÔ &×ÂÀ5×ÂÀSÒ .àÂ@bÚ€WáÂ@Dß ÃÜÂêÓ 4ßÂ@PÝ s߀àßÂàÄá IæÂ Àç€òÜÂ@>à ØãÂà¸ã€íÂ`8îÂ@PÝÂà/åÂÀçãÂÀLèÂ@míÂà‰ÖÂ@Áß ½ÝÂÀ”ÜÂ@2â€iÞÂ@&äÂlèÂûåÂ`ªÛÂ@ÍÝ€ÎâÂÀˆÞ 8ÔÂ@åÙÂÀAÕ€iÞ€“×Â%߀æÞÂ@Á߀ÚÂÀAÕ @Ý á×€òÜÂ`ÎÕÂ`¶ÙÂ@åÙ€c߀à߀“×Â@ÙÛÂÀpâÂ%ßÂØÖÂ`¤ÜÂ@Õ ¯ÕÂÀ¬ØÂ óÔÂ[ÖÂ@—æÂ+Þ€(ÔÂIÙ æëÂ`Â× íÕ ÒÂÆÙÂÀeÏÂOØÂ„äÂàèÛ ½Ý€ÖÂ`iÑ€øÛÂÀGÔ€.ÓÂ@ñ×®ÝÂ@ÓÜ€àß ¯ÕÂàƒ×Â`QÕ€ Ù ‘ÚÂÌØÂ ÕÙ ©ÖÂ@>àÂ+Þ d×€“×Â`E×Â@ÇÞÂà$ÒÂÀšÛÂÀ¬ØÂ`ßÂ@8á ÃÜÂàôÙÂ ÛØÂ yދΠöÞÂ`ÈÖÂ`oÐÂàÖÞ «àÂ`iÑ€™Ö´ÜÂ@ÍÝÂØÖ vÔ &×€iÞÂÀƒÊÂÏÂà¡Ò ÙÎÂ@ýÕÂÀAÕÂàAâÂ`'ÜÂ`€âÂU×Â@†ÔÂ`˜ÞÂÀ5×Â@Õ€×Â@2âÂ`¶ÙÂÏ óÔÂ`òÏÂàkÛÂ@ßÚÂÆÙÂÀÛÂà‰Ö …ÜÂà‰Ö€4ÒÂ`9ÙÂÀ”ÜÂ`’ßÂ@ëØÂ ùÓ ÙÂ@nØÂÀ#ÚÂU×ÂÀ Þ€¤éÂmÓÂ@'ÏÂ@µáÂÌØÂ XÙÂ`]Ó yÞ LÛ 2Õ äáÂüЀ½Ð ÙÎÂ`E×Â+ÞÂ`Œà ‹Û DÒ€"ÕÂgÔÂ`ÈÖÂ@zÖ á×ÂÀváÂàMàÂ`\è .à µÔ &×Âà$ÒÂ ÛØÂ`°ÚÂ@-΀ØÂ@»à ,Ö &×ÂgԢߠêàÂÀÝÂ`ß ÉÛÂ`E× yÞ€{Û ‘ÚÂ`Â×€QâÂCÚÂÀ5×Â@t×Â%ßÂ+ÞÂÀMÓÂ`ñäÂ@ñ×Â@»à€øÛ€oÝ€ÚÂ7ÜÂàÓ …Ü á×ÂaÕ ÕÙ€×Â@µá€ÈãÂâÂ`ëå ¥á€ìÝ€ÚàÂ`ÔÔÂÀ|à ÚÂà›ÓÂ`'ÜÂ@VÜÂ`?ØÂà×Â7ÜÂà‰Ö€“×Â7ÜÂàôÙÂÀ)Ù ÙÎÂyÑ€òÜ€’ìÂàeÜÂÀ¦Ù€æÞ–á çÖ JÑÂ`¼ØÂ€ÈãÂÀˆÞÂ@ýÕÂ@»àÂàîÚÂÀ ÚÂÀÝÂ@ÓÜÂàØÂ çÖÂàÜÝ LÛ êà ^ØÂ[ÖÂÀˆÞÂÀjãÂàÖÞ€·Ñ€‡Ù€±ÒÂ@ŒÓ Ú ·ÞÂ`!ÝÂáÂàqÚ Ù ˆÑÂ@†ÔÂàÓÂà¹ÎÂ`÷ãÂ`'ÜÂÀڢߠ|Ó€oÝ LÛ€òÜÂ[Ö€æÞ Ü€ØÂ@ÓÜÂàÕÂ@hÙ …ÜÂ`ªÛ‹ÎÂ@PÝÂÀˆÞÂûåÂ@êÂ@2âÂÀ”ÜÂÀ ÞÂÀ¬ØÂÀjãÂ`'ÜÂ@€ÕÂÀ|àÂÀÛå @ÝÂàMàÂ@¼ËÂÀ;ÖÂsÒ€Îâ üÝÂïç€òÜÂ`3ÚÂ`?ØÂIÙÂàôÙÂàƒ× á×€¤é oêÂ@JÞ ·ÞÂ`KÖ€‡ÙÂ@êÂÀÜ ¥á ‡æÂ@2âÂÀ)Ù «à€× ÏÚÂàôÙÂïçÂà}ØÂ`Â×€ÚÂ7Ü PÐÂ`à @Ý ç Ù€ÚàÂÀ”ÜÂ7Ü  æÂ åÂàeÜÂÀ)Ù€RÍÂ+ÞÂ@ÙÛÂàâÜÂàYÞ 7éÂ@8á€æÞÂ@ÓÜÂäÂàîÚÂ@Dß yÞÂàGáÂ`E×ÂaÕÂ@nØÂ€uÜÂ`˜Þ€ÖÂàîÚÂÀÝ€áÊ€íȑ͠íÕÂÞÕÂÀ¦ÙÂöÑÂ`"È ^ØÂ`€â ·ÞÂ`KÖ FÜ >ÓÂàqÚ ^ØÂ ÿÒ€ØÂ7ÜÂ`Ë jÖ€þÚÂÀ#ÚÂ ÛØÂÏÂ`ÔÔ€"ÕÂ`ÈÖ€Ú€™ÖÂ`àÒÂ`†áÂÀçãÂ`9Ù€ØÂOØÂÀ¾Õ€«ÓÂÀÇÂ`òÏ€:ÑÂÀ_ÐÂÀÜÂà¡Ò Π|Ó€«ÓÂüÐÂÍÂ@EÊÂàËËÂ`øÎÂ`]Ó€ÖÂ`Â×Â@÷ÖÂÀk΀ØÂàƒ×Âà¡ÒÂÀ‰ÉÂÀqÍÂà$ÒÂ`Í€@РÓÏÂÀ;Ö sßÂРXÙ ‹ÛÂ`WÔ€™ÖÂêÓÂàâÜ vÔ€{ÛÂ`°ÚÂÀpâÂ@ßÚ ßÍÂIÙÂ`¤Ü€òÜÂ`Pꀙր(Ô ‹Û ¯ÕÂ`-ÛÂêӠ݀‡Ù sßÂ`°Ú jÖÂàHÌ€™ÖÂÀèÎÂ`Â×€ ÙÂÀ)Ù ÉÛÂàôÙ öÞÂmÓÂ`]Ó€ÃÏ ·Þ £×Â`Ë ßÍ íÕ ‘Ú€iÞÂà$ÒÂÀ_ÐÂ@ÑÂà×ÂÀ/ØÂ`ÚÓ ÙÎÂÀ²×€ØÂÀ ÞÂÀ²× 8ÔÂÀÚ ©ÖÂ[Ö µÔ€uÜ€¥Ô ÏÚÂà‰ÖÂ@€ÕÂÀÜÂêÓ ”ÏÂÀèÎÂàÓÂÀ¾Õ—Ì JÑÂÀÚÂÀ¬ØÂ@ ÔÂàÅÌ ØÂ µÔÂ`°Ú€Ö€@Р,ÖÂ@¤Ï€.ӀŀFÏÂ`cÒÂ`Â×  ÑÂ`ÈÖ ¯ÕÂêÓÂÀÄÔ Û€iÞÂ`“ÊÂ@ªÎ ЀFÏÂ@¶Ì€ØÂsÒÂ`WÔÂà1»Â`‡Ì çÖÂ`ÍÂ@'ÏÂÀÊÓÂ`E×Â`ÚÓ |ӣʀRÍÂà$ÒÂÀƒÊÂàÅÌÂàƒ×Â@€Õ pÕ  ÑÂ@¶ÌÂÀkÎÂÆÙÂ%ßÂà³ÏÂà<ÎÂyÑÂ`¶ÙÂêÓÂÀqÍÂÀ}Ë ØÂaÕ #Í€pÈÂ@ñ×ÂÐÂüÐÂ@bÚÂÀÝÂ`ÎÕ£ÊÂà³ÏÂ@ÈÉÂ`òÏÂ@˜ÑÂ`±ÅÂà­Ð€"Õ ‚Ò ¯Õ ‚ÒºÛ @Ý€ÏÍÂÀ)Ù–á€:ÑÂ@žÐÂ`]ÓÂ@'ÏÂgÔÂ@9Ì ,ÖÂà6ÏÂ@˜ÑÂà›Ó ©Ö á×ÂÀÜÂÒ×Â@t×€RÍÂ`°Ú JÑ hÌÂ`ÚÓ€·ÑÂ@Õ€þÚÂ@˜ÑÂöÑ /ËÂÀ‰ÉÂà ÖÂ@KÉ€ÏÍ )ÌÂ@ªÎÂÀGÔÂ`Ë ‹ÛÂ`]ÓÂ`‡ÌÂ`‡ÌÂÀùà€ÖÂÀÜР—ÙÂà­Ð€±ÒÂÀÇ PЀøÛÂêÓÂ@˜Ñ }¾Â@ÈÉÂ@9Ì€"Õ€"Õ—Ì Ò 8Ô tÊÂ@€ÕÂàrÅÂàHÌ ÒÂIÙ ÙÎÂàÝÈ ÎÂР5Ê ùÓÂêÓÂàÔÂÀwÌ ßÍ€RÍ‘ÍÂ`ìÐÂÀúËÂÌ SÅÂàHÌ pÕ€±ÒµÇÂËÂ` ÌÂ@ýÕ ÎÂ@!ÐÂ@ÈÉÂ@Õ€“×ÂÀ ÉÂÀè΀ÃϵÇÂÀÊ€½Ð€× hÌÂ@ ÔÂ@hÙ€4Ò€FÏ ÙÎÂ@ÂÊ jÖ ÙÂÀ}ËÂ`E× ÓÏÂmÓ€«ÓÂ`ŸÈÂà6ÏÂ`oР¦ÌÂ` ÌÂÀÈÂ@zÖ óÔ ùÓÂÀSÒÂÀƒÊÂ`3Ú€ÃÏÂ@¼Ë #ÍÂ`KÖÂ@ÒÂ@¤ÏÂÒ×ÂêÓÂÀ‰ÉÂ`É DÒÂ`Í DÒÂ@!РnËÂ@¤Ï »ÓÂÀâÏÂàeÜÂà¿Í šÎ€¼å€(ÔÂ@ ÔÂOØÂ@Õ ©ÖÂà•Ô€.Ó ÝÂ[ÖÂ@¤ÏÂÀÚÂ`àÒÂ@ÑÂà}ØÂ á×ÂÀÊÓÂÀˆÞ‘Í—ÌÂ@ßÚÂ@zÖÂ@÷ÖÂà³Ï€.ÓÂ@Ó€.Ó‘Í hÌÂIÙ DÒÂÆÙÂà•ÔÂÀÝ€×ÂÀÛÂ@3ÍÂ`Â×Â=ÛÂÀÐÒÂÀ_ÐÂ@÷ÖÂ`¼ØÂ »ÓÂÎÂ`uÏÂ`'Ü ÒÂ` Ì óÔÂÀeÏÂ`þÍ ÝÂàËËÂàÕ …ÜÂ@€ÕÂ@ÕÂÀ)ÙÂ ÛØÂ`KÖÂÀ)ÙÂÀâÏÂàÑÊ€LÎÂÀqÍÂ`Ê€ ÙÂËÂ`øÎ pÕÂÀ/ØÂ`9ÙÂà}ØÂ€RÍÂ`cÒÂäÔ€dÊÂàéÆÂ€ÏÍÂ`þÍÂà`ÈÂÀâÏÂ@ÑÂ`ÔÔ€"Õ ÁÒÂàØÂ PÐÂà0Ѐ±ÒÂà§ÑÂÀSÒÂ@Ó ßÍÂCÚÂà­ÐÂàqÚÂ@zÖ vÔÂ@¼Ë ÍÐÂà0ÐÂà‰ÖÂÀ¾ÕÂÀƒÊ  ÍÂ`ÚÓ ÙÂêÓ ÙÎÂÀ}ËÂ`ËÂÆÙ …Ü )ÌÂÀwÌÂÀkÎÂ@àÅ |ÓÂmÓÂÎÂàBÍÂÀeÏÂÀ_ÐÂà$ÒÂüÐÂ`WÔ€·Ñ ¦Ì€ÕÌ€LΠá×ÂÀ_ÐÂÀôÌÂÀËÂ`?ØÂ`cÒ€ÉΠnËÂ`þÍÂÏ€±ÒÂyÑÂ@?ËÂ`òÏ€ÕÌÂ`ìÐÂ@nØÂ@ýÕÂ`WÔ µÔÂà¹Î ÍÐÂà6ÏÂ`ÍÂ@ëØÂà­ÐÂàÅÌ ÇÑÂÀGÔ€FÏ€"Õ ©ÖÂ`°ÚÂÐÂ@ýÕÂ[ÖÂ@Ó JÑÂÀŽÝÂ`¶ÙÂÒ×ÂäÔ€FÏÂÀÖÑ€™Ö JÑ€vÇÂÀwÌ€«ÓÂ@ÚÆÂÀMÓ nËÂÒ×Â@ñ× ˆÑ€¥Ô€×Â@Ñ Ý PÐÂ@žÐ ŽÐ€"Õ >ÓÂÀ_Ѐ(ÔÂ`ªÛÂÀ‰É»ÆÂ€RÍÂàlÆÂ šÎÂ`]ÓÂ@t×€(Ô ÇÑ£ÊÂ@žÐÂÀÊÓÂ@ÒÂà§Ñ€·Ñ \ΠpÕºÛÂ@ÂÊ‹ÎÂÀGÔ \ΠXÙÂ`òÏ€(Ô Ù΀ÖÂÀ;ÖÂàqÚ€ÕÌÂÀîÍÂ@bÚ ÃÜ€ŸÕ ¬ËÂ@¼ËÂðÒÂàÜÝÂsÒÂ@˜Ñ ÿÒ  Ñ€4ÒÂ`{ΠPÐÂ@Ó ÉÛÂ@QÈ ØÂ€ÃÏ€ØÂyÑÂà›ÓÂÏ \ÎÂÀÚ >Ó ÍЀpÈ€oÝ yÞÂÎÂÀk΀«ÓÂ`¶ÙÂ@nØÂ€¥ÔÂ@žÐÂ`]Ó öÞÂà}ØÂ@ÓÜÂCÚÂ@t× ÕÙ€ÃÏÂ@t×Â@žÐÂ`E×Âà$ÒÂ`“ÊÂàÑÊÂ@-ÎÂ@†ÔÂ`àÒÂÀwÌÂ`QÕÂÀeÏ ©Ö€:Ñ ŽÐÂäÔ \ΩÉÂÀGÔ µÔ RÚÂ`ìЀøÛÂà Ö€“×ÂàÓ€ÏÍÂÀYÑ€«Ó ÍÐÂ@÷ÖÂ@!ÐÂà× …Ü ‚Ò  ÑÂÀÄÔ —ÙÂàÕÂ@ýÕ€òÜÂЀŸÕ ÒÂÀÄÔ ÍÐÂ@¤ÏÂmÓÂöÑÂ`ìÐÂaÕ€ŸÕÂÀSÒÂ@»àÂÀ¾Õ ßÍÂ`QÕÂ@¤ÏÂ`QÕÂaÕÂ@-ΠÇÑ |Ó d×Â@ÒÂàkÛÂÀÛÂÀÜÐÂÀ ÚÂÀ}ËÂ@ýÕÂà¡ÒÂÀqÍÂ@zÖ ¬ËÂ`òÏÂÀÛ óÔÂ@˜ÑÂ`ìÐÂÀÊÓ JÑÂÀ/ØÂ€:ÑÂÐÂà ÖÂàÔºÛ Ý ÿÒÂÀYÑ ;É ÷É \ÎÂà¹Î€KãÂ%ßÂÀîÍÂÇÄÂàTÊÂÀ¡ÅÂmÓÂ@3Í€×Â@žÐÂàTÊÂàÔ€ÃÏÂÀYÑÂà§ÑÂ`ÍÂ`ÊÂ`Â×Â@zÖÂà›ÓÂ@9ÌÂ`ìÐÂ@-΀ØÂ€ÛË šÎÂ@Õ€áÊÂÀÊÓÂÒ×Âà§ÑÂàÝÈ€É΀^ËÂ@°ÍÂ`cңʠLÛÂ@˜Ñ \Π8ÔÂàqÚ€{ÛÂà•ÔÂàÔ Ò ÇÑÂ@ Ô bÍÂ@EÊÂ@÷Ö jÖÂÀôÌÂÀËÂ@€ÕÂ`Í pÕÂ`ÍÂ`uÏÂà<ÎÂ`àÒ Ò€ØÂà<ÎÂЀ(Ô€RÍÂ@ŒÓÂ`æÑÂ`‡ÌÂÐÂ`àÒÂÀîÍÂ@ÈÉ pÕÂ…ÏÂàúØÂ€ŸÕÂàËËÂ@QÈÂöÑÂ`ÔÔÂêÓÂ@ Ô #ÍÂà*ÑÂ`QÕÂÀGÔÂÆÙ€·ÑÂ`uÏÂÀ_ÐÂðÒÂ`™ÉÂ@ÈÉÂyÑ #Í€dÊÂ@†ÔÂÀËÂ`ÉÂgÔÂ`?ØÂ`’߀ÕÌÂ`ËÂgÔÂ`ÈÖ DÒÂÀ›ÆÂÀÄÔÂ@!ÐÂà×Â`ÍÂ@{ÁÂÀeÏÂ@zÖ ;ÉÂà¡ÒÂ`ÚÓÂÀYÑ ÒÂÀÄÔÂ`øÎ \ΠóÔÂÀqÍ€ÏÍÂ@°Í d×€|ÆÂ d×Â`'ÜÂ@’Ò PЗÌÂà›Ó ÙΠíÕ€áÊÂÀÖÑÂ`ÚÓ€Ö€^ËÂ…Ï ÒÂÀ‚ßÂIÙ ØÂÀ;Ö ,Ö ßÍ ÍÐÂÐÂà ÖÂàÅÌÂ@ªÎ€(Ô€ÃÏÂ`.ÆÂ`uÏÂÀ•ÇÂ@'ÏÂ`cÒÂ`QÕÂ`{ΠçÖÂ`cÒ ØÂOØÂÀwÌÂà¹ÎÂÌØÂàîÚÂÀqÍÂà*ÑÂÀYÑÂÀÖÑ üÝÂà$ÒÂÀ_ÐÂàHÌÂÀ5×ÂàNË€½ÐÂÀ É€ÕÌÂ@¶Ì /Ë åÌ vÔÂÀ¾ÕÂ`cÒÂ`QÕÂ@˜Ñ íÕ ˜ÄÂÏÂÀÚÂÀ²×ÂÀÜЯȠíÕÂyÑÂðÒÂÀ¸ÖÂà›ÓÂÀYÑÂ`]ÓÂ@3Í \ÎÂ@!Ѐ4ÒÂÀ5×Â ÛØÂ РÒÂÀ Ú ÎÂÀôÌ 4ßÂðÒÂÁÅ åÌÂÌØÂàwÙ ßÍÂÀ•Ç DÒÂà×ÉÂ`oÐÂà•Ô ”Ï ÎÂ@¤Ï€ØÂ …ÜÂÀSÒÂ…ÏÂ@ Ô jÖ ‚ÒÂà›ÓÂØÖÂ@ÓÂ`ìÐÂÀËÂ@cÅÂ@€Õ€ØÂ  Í  ÍÂ@’ÒÂU×Â@ÓÜ€ØÂÀ¸Ö bÍ &×Â` Ì€LÎÂ@QÈ ¬ËÂ`oР²Ê ÿÒ (áÂà_Ý€‡ÙÂ@ÓÂ`QÕÂÀËÂÀƒÊ JÑÂàúØÂ ”ÏÂ[ÖÂÌØÂ2È ëË€«ÓÂ`]ÓÂ`‡ÌÂàÕÂÐÂÀSÒ ÓÏ€@РÐÂÒ×Â`E× màÂ@ñ×ÂÀÖÑÂ@!ÐÂmÓÂ`oÐÂÀMÓÂ`iÑÂ`iÑÂgÔÂÀúËÂ`{ÎÂ`žÝ€FÏÂÀeÏ€ Ù PЀ«ÓÂà<ÎÂ`iÑ ñÊÂÀèÎÂ@ëØÂ £× |Ó€ÖÂ+ÞÂàØÂ ¸ÉÂ@9ÌÂaÕÂ`€âÂàƒ× ‘ÚÂ@hÙ€«ÓÂÀ/ØÂ Ï nË€ÚÂÀGÔÂ@ëØÂ ùÓ  ÑÂ`ÈÖ ‚ÒÂ`°ÚÂ@€ÕÂÀÄÔ€“×ÂØÖ€øÛ »Ó€ÛËÂ@°ÍÂ@ýÕ ^ØÂÀ/ØÂ@-ÎÂmÓÂ`æÑÂÀÜÐÂ@ÔǵÇÂàÕ´Ü€±ÒÂà¿Í€@ÐÂÀ¦Ù üÝ —ÙÂÀSÒ ßÍÂ@÷ÖÂà¹Î VÏ€(ÔÂ`cÒ€@Рd×Â@÷Ö€jÉÂÀwÌÂ@ŒÓ€Wá€4Ò µÔÂ ÛØÂÀÜ€"ÕÂÀšÛÂ@t×Â@žÐ€Âä £×Âà¡ÒÂ@ÙÛÂ@ÕÂÀeÏÂ@ýÕÂ@zÖÂ`’ßÂÀ¾ÕÂ[Ö ÐÂà¿ÍÂàÕÂ@3Í (áÂàÜÝ ·ÞÂàƒ×Â@ýÕÂ@nØÂàÕÂàSß vÔ€ŸÕ€cßÂ@Ñ€¥ÔÂØÖÂÀ¬ØÂ@bÚ€½ÐÂÀ Ú (á€æÞ 1êÂÀ¾Õ ÉÛÂÀ‚ßÂÀ¸Ö màÂ`{ÎÂÀ²×ÂIÙÂÀÜÂ@zÖÂ`ÞÂÀÜÂØÖ ‘ÚÂ@ÓÜ £×ÂàeÜÂÀ‚ßÂàkÛÂáÂÀ Ú £×Â`ß d×ÂàÓ€Ôá ÓÏÂmÓ€×Â`9ÙÂ@ÇÞ jÖ€øÛ€c߀ڠ£×Â@ŒÓÂáÂ@ÇÞÂ@t× ØÂ@Ñ óÔÂIÙ ‘Ú ¥á ±ß€ìÝÂ@>àÂ@2â€ÚÂà›Ó€ ÙÂÀ#ÚÂàYÞ€QâÂ@÷ÖÂ`æÑÂ@÷ÖÂ`ªÛ ·ÞÂàèÛ »Ó RÚÂàèÛÂ@†Ô€?å ØÂàYÞÂ`?ØÂ màÂ7ÜÂàÔ  Í d×Â`-Û ØÂ äá ðßÂ`-Û€ŸÕÂ@ÇÞÂöÑ ÍÐÂ@ÙÛÂÀÜÂ@©ã ©ÖÂÒ×Â%߀uÜ FÜÂ ÛØÂ+Þ€àßÂÀ5×Â@ÓÜÂ ÛØÂ`€âÂ`3ÚÂàÊàÂxæÂ çÖ€‡Ù 4ßÂ`˜ÞÂÀˆÞÂ@nØÂ`ªÛ€þÚ€ÔáÂ@ßÚÂ@çÂÀÜÂ`E×€ØÂ |ÓÂ`E×Â`9Ù€"Õ€ŸÕ XÙ—ÌÂ@nØÂ ”ÏÂÀGÔÂÀ#Ú€½ÐÂ=Û€4ÒÂÀÛ ÛÂÀRç …ÜÂ`°ÚÂà× ÇÑÂ`3ÚÂÀ5× —ÙÂ`-Û ä€oÝÂ@8áÂ`zãÂ`KÖ (á XÙÂ@JÞ ØÂ ÌåÂ@DßÂ`°ÚÂÀpâÂàîÚÂ`!Ý€¼å  æÂ ±ßÂ@ëØÂ`˜ÞÂ`Íê€òÜ€ ÙÂÀ ÚÂ@,ã gá yÞ€WáÂàÊà  æÂ`E×Â ÛØÂÀpâ€ÚÂÀSÒ€°ç íÕÂ@æÂ`zãÂ`à€ªèÂ@öëÂÀLè [ãÂ@8áÂ+ÞÂà/å äÂ+Þ€¼åÂÀŽÝÂ@€Õ ÁÒÂÀ¾ÕÂ@ÇÞÂÀçãÂàîÚ öÞÂ@…éÂàÐßÂÀÜÂ@zÖÂ`ßÂà‰Ö€“×ÂàËË€þÚÂäÔÂ`ÈÖÂ`ßç€c߀ÎâÂäÔ ÛÂ`E× sßÂàwÙ ½ÝÂOØÂ pÕÂàâÜ€Kã d×Â@ŒÓÂàqÚÂ=Û ÛÂÀLèÂ@bÚÂà0РÇÑ Û óÔÂ`Â×ÂÀŽÝÂ`°ÚÂ`¼ØÂÀMÓÂ`zãÂ@hÙ¨ÞÂ@©ãÂÀšÛÂÀ/ØÂ VÏÂÀ5× FÜÂà Ö€×ÂÀÜ Ú |ÓÂàYÞ LÛÂÀ¾ÕÂÀ|àÂmÓ óÔÂÀ_ÐÂ@÷ÖÂÀ/ØÂ€:ÑÂÀôÌÂ@÷ÖÂàHÌÂ`ªÛÂà¡ÒÂà Ö ÒÂÀÖÑ  ÑÂàGá€(Ô ãÂ[Ö€“×ÂÀÛ€FÏÂÀÝÂÀAÕ€uÜ€ÚÂ+ÞÂ@Ò ÿÒ€× ÝÂÀ¸Ö ©ÖÂàSßÂ@hÙÂàwÙÂ@ýÕ #ÍÂ@ýÕ ØÂ€ÚàÂà ÖÂ`ÔÔ ÎÂ`ÔÔÂ`cÒ PРçÖÂÀ)Ù ØÂ@¤Ï Ù€™ÖÂÀÛÂÀßÂ`Â×Â`zã ^ØÂ RÚÂ@\ÛÂ`°ÚÂÀ;ÖÂ`þÍÂ@-ÎÂ`KÖÂàƒ×ÂÒ× XÙÂ`?ØÂüÐÂ@ýÕÂ@°ÍÂàúØÂ@ŒÓÂ`ÎÕÂðÒÂ`Â×Â7ÜÂ`]Ó€× ‹ÛÂ`9ÙÂÀ#ÚÂÀÛ |ÓÂÆÙÂ@\ÛÂêÓÂÀ)ÙÂØÖÂà6Ï€«Ó€ŸÕÂ@ÕÂà­ÐÂ`ßÂaÕ vÔÂÀYÑ€“×€:ÑÂÀšÛ ÜÂ@VÜ€ ÙÂ`-ÛÂ`†á LÛ‹ÎÂ`oÐÂ`KÖ€™ÖÂÀÛåÂ@ Ô »Ó€‡ÙÂ`WÔÂ@ÑÂÌÂ@nØÂ€ÖÂ@—æÂ ½ÝÂ`æÑÂÀ5×ÂÀÜРÐÅ ΀oÝÂ@zÖ ^ØÂ€«ÓÂ@'ÏÂàÔÂàÕÂ@ýÕÂ`†áÂ`ªÛÂ`KÖÂÀÚÂÀâÏ  Ñ ²ÊÂÀÄÔ @ÝÂ7ÜÂIÙÂ`9Ù€ÚÂ` á ‹ÛÂà çÂ@Pݺ۠¥áÂÀ¦Ù ØÂ€™Ö óÔ »Ó çÖÂâÂÀ|àÂÀ|à @ÝÂCÚÂ@JÞÂmÓÂ`cÒÂ[ÖÂ`WÔ :Þ DÒ€.ÓÂ@†Ô êàÂàÖÞ€ÚàÂàâÜ ØÂ`?ØÂ á×Âà×€ ÙÂÀŽÝÂà²äÂ@>àÂÀ;ÖÂ`ìЀøÛÂÀMÓÂ@Õ€“×€ØÂ ¦ÌÂà‰Ö FÜÂÀ)ÙÂ@†ÔÂ`3Ú€ò܆ـ·ÑÂ@bÚÂ@ßÚÂà­ÐÂà}ØÂ@VÜÂ@åÙÂàôÙÂ ÛØÂàÓÂ@†ÔÂÀÖÑÂ`æÑ çÖÂU× d× LÛ pÕÂ`ÔÔÂgÔÂ`Â×Âà0Ѐ«Ó FÜ€Ú€øÛÂ`]ÓÂ@ßÚ £×€þÚ ‹Û ëË JÑÂÀ¦Ù€·Ñ€"Õ€™ÖÂ`ÎÕ€“×€ìÝ€Eä »Ó  Ñ€‡ÙÂ`˜ÞÂ@ëØÂ€ÉÎÂ@ÒÂ`ÎÕ …Ü€:Ñ€FÏ€.ÓÂ@˜ÑÂÌÂÀ¾ÕÂ`ÍÂà¡ÒÂàÜÝÂ@˜Ñ DÒÂÀâÏ—Ì ¯ÕÂ@÷ÖÂàÕ óÔÂÀË  Í nËÂà×Â@EÊÂ@¶ÌÂêÓÂàÕ€¥ÔÂaÕÂ@ ÔÂÀ²× s߀@ÐÂà*ÑÂ1ÝÂàƒ×Â`uÏ PÐÂà¹Î ‚ÒÂ@\Û€øÛ€dÊÂà`ÈÂ…ÏÂÀîÍÂÀ¾ÕÂ`uÏ€pÈ€vÇÂ@ÚÆÂ íÕ vÔ€ÃÏ€"ÕÂ@°Í€ùÆÂà•ÔÂ`ÎÕÂÀÜÐÂðÒÂ@ÎÈÂ@KÉÂ`ìР&× £× ƒ½Â`þÍÂ@ÒÂÀeÏ€íÈÂ@òÂÂà¹ÎÂ`ÔÔÂàâÜÂ`òÏÂ@!ÐÂêÓ€(Ô€ŸÕ d×ÂÀAÕÂ@ëØÂ  ÑÂÀváÂ@’Ò ùÓÂÀGÔ RÚÂ`àÒ€× jÖÂà›ÓÂ@-ÎÂÀMÓ íÕÂÀÜРÏÂ…ÏÂ`¼ØÂà³ÏÂ@æÄÂ`E×€½Ð óÔ ßÍ ÓÏ€½ÐÂÀ5×ÂðÒ íÕÂÀôÌÂ@˜Ñ€¥Ô ëË€ØÂÌÂÀÆÂU×ÂÀîÍÂÀîÍ JÑÂà<ÎÂ@QÈÂà§ÑÂÀÈÂ@ÈÉÂàÔÂ@ŒÓ€FÏÂ2È€“×Â`ËÂ@bÚ vÔÂ@Ó Ò ÏÚÂÀGÔÂàqÚ ÉÛÂ`QÕ€Ö€øÛ€ÖÂ`ÔÔÂà×Â@ÑÂÀSÒÂ`¶ÙÂÐÂ@÷ÖÂÀ²× hÌ€ØÂ@ÒÂ…ÏÂ` ÌÂsÒ Ú PÐÂàrÅÂ`þÍ‘ÍÂÀ;ÖÂÀ”ÜÂÀwÌ£ÊÂêÓ  ÍÂÀeÏÂüÐÂÀ}ËÂàÅÌ 8Ô ËÂÀƒÊÂ@Õ 8ÔÂ`ªÛÂ`àÇÂ`oÐÂ@øÁ ëËÂ` Ì€ŽÃÂÀÖÑÂÀÊÂÀSÒÂà<ΠjÖ /ËÂ@ ÔÂÀqÍ ÄÂ`oЀ™Ö ÏÂÀ¹ÁÂaÕ€™Ö á×Â`uÏÂÎÂ@nØÂà¹Î ’Å JÑÂ@ÚÆÂ &×Â@ ÔÂäÔÂ`iÑ MÆÂ šÎ€ÛË€íÈÂ@’ÒÂàHÌ tÊ€(Ô€øÛÂà„ÂÂÀâÏÂ@3Í GÇÂà Ö€¥ÔÂÀÄÔÂÀ ÚÂ@Dß —ÙÂÀBÀÂ@'Ï ”Ï »ÓÂà•Ô€ÃÏ ˆÑ€ÕÌÂÀúË€×Â@!РAÈ€XÌÂÀ¬ØÂÀeÏÂÀYÑÂ`KÖÂÀ‰ÉÂÐÂ` ÌÂàïÅÂ`{ÎÂÀËÂàÔÂ`]ÓÂÀâÏÂÞÕÂ`ÍÂ`iÑÂ`ÈÖ ÏÚÂÀYÑ€íÈÂ@ªÎ !À¥Ô£ÊÂÀYÑÂ`{΀4ÒÂ,ÉÂÀôÌÂÀËÂPÃÂ`ËÂCÚ åÌÂ@ Ô ÏÂàHÌ )ÌÂÌØÂ d× #ÍÂàãÇ€^Ë€½ÐÂàÅÌ hÌ€4ÒÂ@-ÎÂÀÖÑÂ@÷ÖÂàTÊÂÀ;Ö€4Ò ÒÂ@Õ ÇÑÂ,ÉÂ`ÔÔÂ@QÈÂÀîÍ€ŽÃ ÁÒÂ@¼ËÂàÓÂà*ÑÂà¹Î ”ÏÂΠÁÒ€RÍ€ÃÂà$ÒÂ`iÑÂàNËÂ`oÐÂà~ÃÂ@¶Ì Ò ýÈÂàHÌ ÿÒ€±ÒÂ`þÍ hÌÂsÒÂÀ²×ÂÎÂ`ÍÂ@¤ÏÂàÑÊÂ@¤Ï ÙÎÂ…Ï åÌ€@ÐÂ@'ÏÂÐÂ`ÍÂ@Õ zÉÂà§ÑÂ`ªÛÂàÕÂÀGÔÂà•Ô »ÓÂ@žÐ ˆÑÂÀÊÓÂÀÖÑÂÀ²×Â@°Í €ÈÂ`É ˆÑÂà0Ѐ^ËÂ`]Ó >Ó€ÃÏ pÕ ÐÂàãÇÂà›Ó 8Ô 8ÔÂÀâÏ€·Ñ€ÖÂÀpâÂÐÂà`ÈÂÀkÎÂ`òÏÂÀwÌÂ@Ò  ÑÂÀÊ€(ÔÂ@˜Ñ ëËÂеÇÂà`ÈÂÀ#Ú ÓÏÂ`™ÉÂà6ÏÂ`]ÓÂ@!ÐÂÀÄÔ€™ÖÂÀ_Ѐ‡Ù ©ÖÂ@ÑÂ`æÑÂ@bÚÂ@ÍÝÂ`oÐÂ@¶ÌÂàËËÂà–¿Â`øÎÂàÔÂÏÂ@Õ |ÓÂöÑÂàïÅÂÀîÍ ¬ËÂ`:ÄÂ`"ÈÂÀ­ÃÂÀ}ËÂÀMÓ ßÍÂÀwÌ JÑÂ`iÑÂÀ¸Ö ²ÊÂ@˜ÑÂ`Â×€pÈÂ,É ØÂà§Ñ \ÎÂÀqÍ€òÜ€«Ó DÒÂ`¶Ù ùÓÂ@†Ô JÑÂ@ÎÈ€4ÒÂ@nØÂöÑÂ@¼Ë‘Í ¯ÕÂàÕÂÀ;ÖÂ@ÒÂêÓÂ[ÖÂÀ;Ö€LΠ|Ó€ŸÕÂÀÈÂ@zÖÂ@KÉÂÀÐÒ ¬Ë vÔÂIÙÂ@8áÂ@9Ì ¾ÈÂ@{Á ÒÂÀÜÐÂ`þÍ £× tÊÂ`ÍÂÀÄÔÂ@÷Ö€·ÑÂàéÆÂÀè΀^ËÂÀeÏÂ`‡Ì vÔ€áÊÂÀ5×ÂÀeÏ †ÇºÛ ÚÂà¹ÎÂ@3Í€.Ó ÇÑÂ@!ЀçÉ AÈ€ÕÌÂà¾ÂÌÂË »ÓÂÀ Ú šÎ Ï tÊÂ`]ÓÂà­ÐÂ`]ÓÂ@9ÌÂà× pÕ©ÉÂ`'ÜÂ@°ÍÂ`“ÊÂ,ÉÂ&Ê Р Í€áÊ€çÉÂà‰ÖÂ`]ÓÂ@KÉ hÌ€ŸÕÂ`ÂשÉÂ@òÂÂ`ÉÂÀ;ÖÂ@VÜ€^Ë€vÇ€^ËÂàûÃÂ`(ÇÂÀ¸ÖÂàTÊ€Ö€ÃÏÂ@ÈÉ ¤ÂÂàrÅÂ`øÎÂ`ÍÂà×ÉÂà¡Ò ÐÂ`"È€RÍÂÀÈ ýÈÂàxÄÂÙÁÂÀèÎÂÀMÓ€·Ñ€^ËÂ`4Å©ÉÂÀqÍ€XÌÂ@˜ÑÂÀeϩɠ‚ÒÂÀ ÚÂàÅÌÂ\Á  Ñ ÓÏÂ`™É€ÉΠÿÒÂà§ÑÂà6ÏÂÀ}Ë ”ÏÂÀƒÊ ÐÅ©ÉÂÀAÕ 8ÔÂà~ÀóÇ—ÌÂà›ÓÂà¿Â,ÉÂ@°ÍÂ`òÏ€™Ö€RÍÂ@˜ÑÂ@°ÍÂ&Ê  Ñ jÖ€4ÒÂÀÊÂ`cÒÂÀÐÒÂ`cÒÂà_ÝÂCÚÂÀ_ÐÂÀÄÔ€‚Å 5ÊÂ@Ó ‚Ò ÓÏÂ`]Ó #Í —Ù—ÌÂ`KÖÂÍÂÍÂà`ÈÂÀÊÂ8ÇÂÀÊÓÂ`àÒ ÚÂÀMÓÂ`{ÎÂÀSÒÂ`Ë AÈ MÆÂ€ÅÂU×Âà$ÒÂÀÄÔÂ@?Ë ©ÖÂ@'ÏÂÀ5×ÂÀ_ÐÂ@ŒÓÂ@ÂÊÂ@¶Ì  ÍÂ`uÏÂàÑÊ€XÌÂ[Ö ŽÐÂàHÌÂàHÌÂ@'Ï€"ÕÂyÑ šÎÂà<ÎÂyÑÂÀúË€·ÑÂðÒÂÀ/ØÂ £×ÂÀŽÝÂàÔÂ@’Ò€ÛËÂ@öëÂ`ÈÖ€ùÆÂ¯ÈÂ@-ÎÂ` Ì€(Ô ëË Ï nË ÙÎÂÀ Ú€(Ô€½Ð \ÎÂ`æÑÂ@ò DÒ åÌ ²ÊÂ@-ÎÂàNËÂ`¼ØÂà ÖÂà¹Î ÓÏÂà¿ÍÂà§ÑÂ`uÏÂU×€ØÂ tÊ€T£Â JÑÂÀ;Ö€ÉΠAÈ€:ÑÂÀ ÚÂà‰ÖÂ ÊÆÂ`KÖÂàØÂ@ Ô€ÕÌÂà*Ñ€@РÁÒÂ`ÍÂ@9Ì ¬ËÂàÓ€ŸÕÂ@˜ÑÂ@EÊÂàHÌÂ@ÑÂàeÜÂ@ÓÂ@ªÎ€pÈÂÀÈ РÓÏÂ@3ÍÂ`Ë€FÏÂ`{ÎÂà¹Î tÊ€^Ë Ù΀|ÆÂà§ÑÂ`˯ÈÂÀÊÂà`ÈÂàÑÊÂ@ÎÈ pÕ #Í |ÓÂÀ•Ç€ÛË ùÓÂÀqÍÂàÕÂÀÐÒÂÀwÌ nË€dÊÂÀÇ /ËÂ` ÌÂ`E× tÊ€“× Ù΀±Ò vÔÂàÅÌÂ@?Ë šÎ šÎ Ï åÌÂÀÈ€«ÓÂ`{ÎÂsÒ |Ó€íÈÂà¿Í ÈÂà¿ÍÂ,ÉÂ`ÉÂÀ_ЀÉ΀ÃÏ ‚ÒÂÀ ÉÂà¿ÍÂÀÈÂàËËÂ`ÍÂËÂ&Ê ;É€çÉÂ`æÑÂ`cÒÂ`ÊÂÀ}Ë )ÌÂÀúËÂÍÂÀ}Ë€ÕÌÂ`àÒÂ@ëØÂ ÁÒÂÀkÎÂ`Ê MÆÂ`cÒÂÀwÌÂàTÊ€RÍÂ@ëØÂ@˜ÑÂÍÂ@EÊÂÀMÓÂ`“Ê ÈÂÀYÑÂ`ìЀÃÏÂÐÂ`™É€ÃÂ`àÒ€XÌÂ@’ÒÂÍ€«ÓÂàƒ× \ÎÂ@ÑÂà ÁÂàxÄÂÀSÒÂ`Ë€iÞÂÀâÏÂ`¥ÇÂ@t× ŽÐ SÅ€ŽÃÂJÄÂ`"ÈÂ`(Ç€ÏÍÂÀMÓ ;ÉÂàZÉÂÀÈÂ@ÎÈ ÏÂà¡Ò€dÊÂËÂêÓ #Í€jÉÂ`cÒÂÌØÂ€LίȠñÊÂàîÚ€×  Ñ ЀÛË nËÂÀqÍÂÀÜÐÂÀ¸Ö Ò nË ”ÏÂàûÀ Ù »Ó€XÌÂüР;É—Ì€:Ñ 5ÊÂ`™ÉÂ@ªÎ€·ÑÂ2È MÆÂ`ÃÂÂÐÂàéÆÂÀGÔÂРˆÑ ú¾Â@’Ò )ÌÂÀ/ØÂ€XÌ ëË ”Ï€pÈÂ@ÈÉÂ@9Ì€LÎÂà¿ÍÂ@˜Ñ ÏÂ` ÌÂ` Ì€4ÒÂðÒ nËÂÀkΠ€È€jÉ †Ç€:ÑÂ@’ÒÂà ÖÂ@àÅÂËÂ@EÊ ËÂÀËÂ8ÇÂÀ‚ßÂÀ‰ÉÂ`‡ÌÂ`ËÂë¾ÂàÃÂ`(Ç žÃ JÑÂ@°ÍÂ`ËÂ`WÔ á×ÂmÓÂàÕÂËÂÀÊÓÂÏÂàNË ¸É€jÉÂ,É€”€ Ù )Ì£ÊÂ@÷ÖÂÀ)ÙÂàÕÂÇÄ€@Р¦Ì vÔÂ@ÂÊ \ÎÂÀqÍÂà§Ñ zÉÂ`þÍÂaÕ€ÛËÂÀÈÂÀ¸ÖÂàÔÂÀqÍÂ&ÊÂËÂ@3ÍÂÀYÑÂ`iÑÂÀGÔÂ`Ë Ò ëËÂÀkÎÂ`¥Ç šÎÂà„ÂÂêÓÂ@-ÎÂàôÙ ¦Ì€4ÒÂ`uÏÂ@žÐ€ÅÂÀYÑ ùÓ )Ì á×Â`{δÜÂÀ¦ÙÂ@ÕÂÀÖÑ€4Ò  Ñ ”ÏÂ`ˠπÏÍ ÖÄÂÀAÕÂÀ/ØÂÀ}ËÂ@QÈ íÕÂà³ÏÂ@’ÒÂÀÐÒÂ`4Å€·ÑÂÍÂ@?Ë ÷ÉÂ@°Í ñÊÂÀÐÒÂ@ýÕÂà}ØÂ ·ÞÂ`cÒ ΀ÃÂ@'ÏÂ@˜Ñ€É΀íÈÂ@¤Ï—Ì€FÏ žÃ tÊÂÀSÒÂà×ÉÂÀ•ÇÂ@{ÁÂÍÂ@EÊÂ`(ÇÂöÑÂÀMÓ¯ÈÂ@Ñ€ŸÕÂ` ÌÂ@žÐ€@ÐÂ@Õ Å ÒÂ@ÒÂà0Ѐ.Ó JÑ€Ú€ØÂ€“×Â`]ÓÂ`9ÙÂ`ÍÂ`ËÂ@ ÔÂ`Â×Âà$ÒÂ@WÇÂgÔÂ@!ÐÂ@ÙÛÂ`òÏÂ@ÓÂà$ÒÂ`ÊÂÀîÍÂÀSÒÂÀÐÒÂàËË ¾È€5½Â@ÔÇÂ@’ÒÂ@€ÕÂÀ5×Â`ÔÔ \΀.Ó pÕ ßÍÂÀËÂàéÆÂ8Ç€FÏÂÀîÍÂ@EÊ€ØÂ ÐÂà•ÔÂ@t×€É΀ÖÂ`þÍÂ@3ÍÂ@ Ô ÁÒÂàYÞ &×Âà›Ó€ŸÕ€ØÂ`‡ÌÂ`QÕÂ@ÈÉ á×€Ö hÌ åÌÂÀAÕ€:Ñ zÉ€ØÂ`cÒ >ÓÂàÅÌÂàÅÌ€;¼Â nËÂ@ªÎÂÀÛÂ`?ØÂ@åÙ ùÓÂ…ÏÂÀkÎÂ@9Ì ÇÑÂà$ÒÂÐÂÀÜÐÂà¹Î RÚ κÛÂ@ÒÂ@zÖ€4ÒÂ`uÏ€™ÖÂ@iÄÂË ÉÛ »Ó á×ÂgÔÂ ÛØÂØÖ€.ÓÂÀ›ÆÂ€XÌÂÍÂ`¶ÙÂÀAÕÂ`ªÛÂyÑ€Ö ‘Ú€@ÐÂ@˜ÑÂ`ìÐÂÀÊÓÂØÖ€4Ò€‡ÙÂà× ©ÖÂàúØÂ`øÎ€™Ö€þÚÂËÂ@†Ô€½ÐÂà•ÔÂà›ÓÂÀMÓÂ@zÖ hÌÂ@ßÚ µÔÂ@ªÎ ;ÉÂÎÂ@æÄ€¥ÔÂ`òÏÂüÐÂ@’Ò€ÏÍ€¥Ô ”ÏÂOØÂ`ÔÔÂ`°Ú ÁÒÂ`ÚÓÂOØÂ`Â× ÐÂÀîÍ€LÎÂàÑÊÂ@žÐ Ù \ÎÂ@˜Ñ  ÑÂÏÂËÂ@†ÔÂ`ÔÔÂ@’ÒÂÀ¾ÕÂÀ¬ØÂ ˜ÄÂ`øÎÂÀÜÐÂ@QÈÂÀÈ€(Ô ”Ï€±Ò ð߀oÝÂ@€ÕÂÀÊÓ VÏÂ`LÁÂ`WÔ€:ÑÂà¹Î JÑ€“×€FÏÂÀ#ÚÂà³ÏÂÀ­Ã ùÓÂÀÖÑÂ`ÍÂÏÂÀÖÑÂÏ  ÑÂ@ÈÉÂà¡ÒÂàÑÊ€(ÔÂ`WÔÂÀÐÒ€ÏÍ€ÃÏ€ŸÕÂ@EÊÂ@-ΠÒÂ@'Ï ¾ÈÂ`ÎÕ #ÍÂàôÙÂÀÆÂ  Ñ ¬Ë€ÛËÂàîÚÂÀÛÂØÖ€áÊÂÀ²×ÂmÓ€.ÓÂ@ìÀÕÌÂ`ìР#ÍÂ`KÖÂ@'ÏÂyÑ 5ÊÂäÔºÛÂ`ÍÂ@˜ÑÂÒ×€ÕÌÂÍÂ…ÏÂÀúË€ÛË PЀ“× d×Â@°Í 8ÔÂÀúËÂÀÖÑÂ@åÙ€ÖÂÀËÂÀwÌÂ@ÓÂ@ªÎ ˆÑÂ@ÈÉ€ÕÌÂ[ÖÂ@ñ×ÂÐÂà×€øÛ ÙΠŒÆÂ€ ÙÂÀYÑ >Ó nËÂ@¤Ï jÖ ÇÑÂà}ØÂ€·ÑÂàÓÂà*ÑÂÀMÓÂIÙÂ@Ó€4Ò ÓÏÂΠhÌÂà›ÓÂ@ªÎÂÀwÌ ¬Ë )ÌÂÀîÍ PÐÂÞÕ íÕ ”ÏÂ@¼ËÂÀ_ÐÂ`{ÎÂàZÉÂÀYÑ€Ö€dÊÂ@-΀·Ñ€½ÐÂÀÖÑÂÀÖÑÂ@¶Ì ÏÂ`cÒ€ÕÌÂÀ_РóÔÂÀÊÓ ÇÂÌ€:Ñ€jÉÂÀSÒÂ,ÉÂ`«ÆÂ@ÓÂÀ;Ö ²ÊÂ`oРÏÚÂ`°ÚÂÀAÕ µÔÂ@VÜ ÜÂà6Ï  Í šÎÂ`ÚÓÂ`òÏÂà›ÓÂ`uÏÂÏ £×€ØÂà³Ï µÔ màÂ`ìÐÂÀ5× 2Õ á×ÂàØÂÀÝÂ@ªÎ—ÌÂ`]Ó ÏÚ d×Â ÛØÂ`QÕÂ@bÚ´ÜÂ`'Ü &×Â@ ÔÂ=Û€QâÂCÚ ,ÖÂÀÜÐÂ`-ÛÂ@ñ×Â`9Ù ëËÂàwÙ Û RÚÂ@ýÕ d×Â@PÝ >Ó€ÛË ÍÐÂ@nØÂÀpâ vÔ 8ÔÂ`KÖ :Þ€.ÓÂàîÚÂ`ÈÖ ŸâÂ@¤ÏÂÞÕÂ@ÁßÂ@ÕÂàÕ €ÈÂà$ÒÂÞÕ€{Û ãÂÀÄÔÂ@!ÐÂ@'Ï AÈÂ8ÇÂÀ;ÖÂ@ŒÓ šÎÂ@9Ì€^ËÂÀ²×€LÎÂà›ÓÂàúØÂ€çÉÂöÑ€ÛËÂ@'ÏÂ ÛØÂÀqÍÂàYÞÂ@!Р ÑÂà¿ÍÂÀGÔÂ@t×Â`]ÓÂ@Õ ØÂ ÝÂ@ŒÓÂÀÄÔÂÀŽÝÂ@PÝ ‹ÛÂ`‡Ì ”ÏÂ@Ó€"ÕÂà¡ÒÂ`?ØÂ€ ÙÂà‰ÖÂ@ÂÊ jÖ ·Þ ÛÂ@°ÍÂ@’Ò ÐÂÀâÏ ‘Ú XÙÂ@zÖÂàNËÂ@ÓÜ€ÚàÂÀÖÑ hÌ »ÓÂÀ;ÖÂàÕÂ`ªÛ€ÔဥԠvÔÂ`°ÚÂgÔ ·ÞÂÀÊÂÀ²×Âà­ÐÂà‰ÖÂ2È€"ÕÂÀ¦ÙÂ`'ÜÂ`ÚÓÂ@t×Â@˜ÑÂ,É€ØÂ@t×Âà‰ÖÂÀ¾ÕÂà*ÑÂ`¼ØÂ`E×€ÃÏÂ@'ÏÂ`cÒ ©Ö ÐÂÀkÎÂÍÂÏ ØÂ@ ÔÂ@bÚÂgÔÂàÖÞÂÀÚ ØÂ ÙÎÂöÑ€óÇ ¯ÕÂÀÖÑ€ÖÂà;ãÂÀ#ÚÂÀîÍÂ`uÏÂÀSÒÂ7ÜÂà¹ÎÂ@9ÌÂÀúËÂÀ§Ä—ÌÂ`ËÂÀ_ÐÂàâÜÂÀ Ú€dÊÂÀÖÑÂ@ŒÓÂ@°Í ÅÂà³ÏÂÀÐÒ µÔ  ÍÂÀÆÂ`cÒÂÀÐÒÂàØÂsÒÂÍÂ\ÁÂàÝÈÂÀ)ÙÂ`ŸÈÂà¿ÍÂà$ÒÂ@ÈÉÂàTÊ€@Р8ÔÂË€oÝ :Þ pÕ ÐÂàÔÂÏ Ò ”ÏÂà¹ÎÂäÔÂgÔ€FÏ ·ÞÂÀË \ÎÂà¡ÒºÛ GÇ€·ÑÂêÓÂOØÂÀ¬ØÂ@¤Ï jÖÂ@'ÏÂðÒ€×€±ÒÂ@žÐ€LÎÂÁÅÂ@ÒÂ@žÐÂÀMÓÂ`KÖÂà›Ó ¯ÕÂà×ÉÂàØÂÏÂ@ÒÂ@°ÍÂÀ}ËÂ`ÚÓÂ2ÈÂàÕÂ`'ÜÂÒ×ÂDÅÂðÒÂ`æÑÂÀËÂàÑÊÂ`cÒ€çÉÂöÑ ùÓÂ`Â×ÂIÙ‹ÎÂ@ªÎÂ@ŒÓÂ…Ï€ÉΠÙÂ@€ÕÂÀ;Ö DÒÂ@¤ÏÂ@nØÂaÕÂ`{ÎÂàÅÌÂ@’ÒÂ@ ÔÂÀYÑ bÍ€ÛËÂÀ›ÆÂyÑÂÀÄÔÂÀwÌ€«Ó åÌÂÀ#Ú ÓÏÂ`ÎÕ€4ÒÂ…ÏÂÀGÔÂà¡ÒÂ@KÉ€XÌÂ`‡ÌÂ@ßÚ &×ÂÀMÓÂsÒÂ`ÔÔÂ@ýÕÂàØÂ ÓÏ Ù΀ÿÅÂÀîÍ ¬Ë ÷É 4ß PРåÌÂ@†Ô LÛ zÉÂà6Ï ‘Ú€uÜÂàÅÌÂÎÂ@åÙÂÀqÍ ”Ï€iÞÂ`-Û€¥ÔÂÀ¬ØÂ€½Ð Ù€ŸÕÂ`Â×ÂðÒ ^ØÂàÓ nËÂÀÊÓÂàÕÂÀAÕÂ@t× ¦ÌÂà¡ÒÂà*ÑÂmÓÂÀ)ÙÂyÑÂàâÜÂÀSÒ€½Ð€«Ó µÔÂ@!ÐÂüÐÂ`ÔÔÂà¹ÎÂ@ßÚÂ@µá ”ÏÂÀ ÉÂÀGÔ€½Ð bÍ _ÃÂÀeÏÂ@ÒÂÀÊÓÂ@9ÌÂ`žÝ »Ó€Ö ±ßÂØÖ ØÂÀ)ÙÂÀ)Ù ˆÑ ÁÒÂÀ²×€WáÂÀ_ÐÂÀ”Ü ÜÂ@>àÂÀƒÊÂ ÊÆÂ µÔ€‡ÙÂ@VÜ€4Ò 8ÔÂÀ”ÜÂÀ¦ÙÂÀîÍ€±ÒÂÀ;Ö ÏÚÂ@!ЀÃÏ |Ó ΀«Ó€“×ÂÀèÎÂà‰ÖÂ`¤Ü€ÚÂà­Ð šÎÂ@zÖ óÔÂäÔ€·ÑÂàÕ€×Â`à‘Í ßÍÂà¡Ò pÕÂàÔÂ@žÐÂàwÙÂ@ ÔÂsÒÂ`ËÂà›Ó ,Ö ÙÂäÔÂ΀.ÓÂ`ËÂ`ìÐÂàÔÂ@ ÔÂÀÜÐÂ`?ØÂ RÚÂàÔ€½Ð ëËÂ@÷ÖÂ`{ÎÂ`KÖÂðÒ ¬ËÂ`ìÐÂ`KÖ€Ú´Ü ÎÂÏÂ`iÑÂàËË ÿÒ @ÝÂ`ÚÓÂ@†ÔÂÌØÂ`øÎ ßÍÂÀGÔÂ@°ÍÂÀSÒ JÑÂ@9ÌÂà³ÏÂ`ìРÿÒÂ@'ÏÂàÕ€áÊÂ@'ÏÂÀÈÂÀ_Р©ÖÂàÓÂêÓÂyÑ€ÚÂ`QÕ á×Âà•Ô 4ßÂ@ÒÂÀk΀jÉ ’ÅÂÏÂ`iÑÂ@QÈÂÀƒÊÂyÑ€½ÐÂ@3Í »ÓÂÀAÕÂÀYÑ€.ÓÂÀÊÓ€ÏÍÂË #Í€:ÑÂ`ÔÔ€ØÂ Ë åÌ bÍÂ`ÔÔÂ`iÑÂÀ5×ÂØÖÂ@9Ì€íÈ ÈÂ`ìРíÕ ¯ÕÂÀeÏÂÀËÂà„ ëËÂyÑ ñÊÂ@!ÐÂÏ zÉÂ`iÑÂ`àÒÂà­Ð #Í€ØÂ@¼Ë€.Ó€ŸÕ tÊ á×Â@Ó€«ÓÂÀYÑ ÙÎÂ`"ÈÂ@nØÂ2ÈÂêÓ ýÈ ÓÏÂ`øÎ€ÖÂÌÂ@ÎÈÂÀwÌÂÀÄÔÂà× ßÍ€ÏÍ€:ÑÂ`ËÂÀƒÊ ÙÎÂÀÈÂÐÂÀôÌ €È #Í åÌÂàNË ýÈ€ÃÏ ”ÏÂÀôÌ ²Ê ÄÇ JÑÂ@€ÕÂ@ÓÂ`"ÈÂÀ‰É€ÏÍ DÒÂà0ЀdÊ ¬ËÂ`Í .àÂ@Á߀(ÔÂàÑÊ ²Ê Ï€±Ò ÐÂÍÂÀÇ ΀·Ñ€:Ñ ùÓÂ`àÇÑÂà‰Ö ßÍÂêÓÂ@ýÕ€½Ð VÏ€‚ůȀ(ÔÂ@’Ò åÌ»ÆÂ€LΠ÷ÉÂ,ÉÂàËË€ÕÌÂ2ÈÂÀôÌÂ@3Í »ÓÂ@ªÎÂ`™É€pȯȠÒÂÀGÔÂüÐÂÀÊÂà¹ÎÂà­Ð  ÑÂ`Ë DÒÂ@ìÀÏÍÂÙÁ ÍР²ÊÂÀwÌ ÎÂàHÌ ßÍÂ`“ÊÂDÅÂÀ§Ä ËÂÀîÍ€^ËÂÀ¡ÅÂðÒÂ`ËÂ…ÏÂà`È€çÉÂÀÈÂ`ŸÈ€½ÐÂÀ¡ÅÂ`"ÈÂ@˜ÑÂ@¼ËÂ@ÎÈÂÀÆÂÀwÌ ËÂ@æÄÂàÕÂ@ÕÂÀÈÂ`“ʑ̀ŽÃÂÀ¹ÁÂÀ¿À€|ÆÂ hÌÂàËË€vÇÂ`½Ã ÜÃÂàlÆÂ€LÎÂ@žÐÂVÂÂÀ¡ÅÂàBÍÂà`È€çÉ #ÍÂ@9ÌÂ@KÉÂÀÈÂë¾Â ýÈ€|ÆÂà¡ÒÂàHÌ \Π†ÇÂ@ÔÇÂh¿Â€pÈ€ÅÂ`@àtÊÂ`"È bÍÂ`(ÇÂ@‡¿Â8ÇÂÀÈ€šÁ /Ë ”ÏÂ\ÁÂPÀ@ÐÂ`·ÄÂ@¶ÌÂÀ$ÅÂ@½Â ¸É€áÊÂà<ÎÂ`{΀:Ñ hÌÂàãÇ€¸¼Â zÉÂÀ$Å€jÉÂÀMÓÂÀúËÂ`@ÃÂ@]ÆÂ 3ÀÂàHÌÂ@QÈÂ`ÉÂÀ³Â€áÊÂÙÁ AÈÂÐÂàÅÌÂ`uÏÂÀ‰É‘Í€ùÆÂ`¥ÇÂÀ6 DÒÂ`Í ñÊÂÏÂ@ÓÂÀƒÊÂàTÊÂ`Õ¿ÂÙÁ€dÊ€LΠ8ÔÂt½Â`þÍÂ@9ÌÂ`{ÎÂÀ ÉÂÀ¡ÅÂà¿Â€óÇ€|ÆÂà6ÏÂ`àÒÂàÃÂàéÆÂ`™É hÌ€@ÐÂ`“Ê€·ÑÂ`ìРAÈ€«ÓÂÀËÂ`þÍÂ`ÚÓ¯ÈÂà<ÎÂ`ÊÂmÓÂ@ÈÉ †ÇÂ@EÊ€·Ñ ÜÃÂ@QÈ /ËÂ8ÇÂÀ§Ä ÇÂÀÊÂàƒ×ÂÀeÏÂ`àÒÂà Á ;ɵÇÂÀ}ËÂ@'ÏÂà­ÐÂÀ5×ÂÀSÒ ^ØÂ`‡Ì€jÉÂ@3ÍÂÀkίÈÂ`øÎÂÀâÏ ýÈÂaÕÂÀâÏÂüР)ÌÂÀkΠÅ GÇÂÀâÏÂÀ_ÐÂ@°ÍÂ`þÍÂÀYÑ€ÛËÂÀqÍ€vÇÂ@'ÏÂ@ Ô€(Ô€çÉ ÷ÉÂ@¼ËÂàÅÌÂ@ÓÂÀ˾Â@KÉÂ`]ÓÂàÅÌ€dÊ nËÂÀËÂ@WÇ ;ÉÂ@ÚÆÂÀ›ÆÂàTÊÂÀîÍ _ÃÂêÓ€ÕÌÂ`ìÐÂ@QÈ JÑ  ÍÂÀ¸ÖÂàÓÂÀwÌÂàÝÈÂÀƒÊÂÀôÌÂaÕ JÑÂÍ€ÏÍÂÀîÍÂà³Ï ÒÂ`àÒ ßÍ€±ÒÂàHÌ‘ÍÂÀîÍ ²ÊÂ`ÔÔÂàBÍÂ˯ȑÍÂ@ªÎÂÀË—ÌÂàlÆÂ JÑÂРÓÏÂ@òÂÂÀúËÂÀeÏÂÀ§Ä€vÇÂ@3ÍÂÀ¿ÀÂàTÊ PÐÂÀÐÒÂ ÊÆÂ ÊÆÂ@¤ÏÂÀƒÊÂÀúË ²Ê ÿÒÂàxÄÂ@KÉÂà$ÒÂ2ÈÂ2ÈÂà×ÉÂ@¼ËÂÀÐÒ ÷ÉÂ@ŒÓ ;ÉÂ@3ÍÂÍÂöÑÂ@9Ì€ÏÍÂà*ÑÂ@9Ì€‚ÅÂyÑ€jÉ ¦ÌÂ`ÚÓ ÁÒÂ@Ó bÍÂà Á zÉ ýÈÂ@oÃÂ`QÕÂÀ;ÖÂ@ÈÉÂ@oÃÂà<ÎÂÀqÍ€vÇ ÇÑ †ÇÂ@øÁÂ`@ÃÂ@òÂÂ@KÉÂàTÊÂ ÊÆÂ Ç #Í€ÅÂàfÇ ô¿Â€ÛËÂ@ÂÊÂà~àtÊ€½ÐÂàûÃÂÀÜÐÂÀôÌÂ`Ê€áÊÂ@iÄÂàÃÂ@ÈÉÂÀúË‘ÍÂ@?ËÂàËËÂöÑ€¥ÔÂÀ¿ÀÂàTÊ »Ó ô¿Â€óÇ eÂÂà„ÂÂÀÇÂ@]ÆÂР¸É€dÊÂÀqÍÂÀYÑ ¦ÌÂ@?Ë ÆÂ`Í Ù΀@Р#Í 'ÂÂ`¥ÇÂàZÉ€dÊÂ`ìЀX̠ǣʗÌÂà6Ï€XÌÂÀ¡ÅÂ`“ÊÂ`ÍÂ`ˆ·Â@æÄ€óÇÂ`4ÅÂÀ0À”£ÊÂJÄÂÀÈÂÀôÌÂyÑÂà~àùÓ€RÍ€ ÀÂ@¼Ë 'ÂÂJÄÂ@ÔÇ zÉÂ8ÇÂÀîÍÂ`4ÅÂàÝÈ #Í GÇÂ`·ÄÂ@cÅÂÀÛÂ@ÂÊÂ@ÈÉÂ`øÎ€pÈÂàHÌÂË€“×Â2È ÏÂ`ÚÓÂ@æÄÂÀèΠPРßÍ ;ÉÂ@-ÎÂàTÊÂÀ›ÆÂ@ÚÆÂ@QÈÂÍÃÂàrÅÂ@¼ËÂ`Í€óÇÂ`uÏ hÌÂ@ÔÇ€íÈ ŽÐ€ùÆÂ©É€ÂÂà×ÉÂàZÉ ÓÏÂÀ§ÄÂ,ÉÂÀèÎÂÀ}ËÂ7ÜÂ`òÏÂÀÈÂz¼Â ÜÃÂ@ÂÊÂ@cÅÂ,ÉÂyÑ ýÈÂ@æÄ ;ÉÂ@KÉ tÊ ëËÂÀƒÊÂÀÆÂàŠÁÂÀ‰ÉÂÀeÏÂàÂÂ@ÔÇÂàlÆÂ@¼ËÂ@cÅÂ`X¿ÂJÄÂ@zÖÂ@D߀ˆÄ ÖÄÂ@9Ì DÒ ÇÑ 5Ê #Í€óÇÂÀ•Ç‹ÎÂ@ÕÂàTÊ ªÁ€dÊ »Ó ýÈÂ@¶ÌÂÏÂ@ÂÊ 3ÀÂÀúË€^ËÂÀôÌ€.ÓÂ` ÌÂà Ö€XÌ ñÊÂÀƒÊ ßÍ ‚ÒÂ@Ò—ÌÂ@ Ô€ÿÅ |ÓÂ@¶Ì ÒÂ@'ÏÂ@3ÍÂÀ É€·Ñ€.ÓÂÀÆÂ`ìÐÂ@ªÎ \ÎÂ`‡ÌÂÀqÍÂ`uÏÂðÒ ÏÂàlÆÂ€óǀŀLÎÂÀÊ€ ÀÂà6ÏÂàÓ ßÍÂÀÜÐÂ@?ËÂàNË€@РbÍÂ@-ÎÂ@ÂÊÂÀÜ€.Ó€Ö€øÛ vÔ FÜÂÀ}ËÂ@ýÕÂÀƒÊÂ@zÖÂÀâÏ VÏÂÀMÓÂêÓ vÔ ÿÒÂ@ªÎÂàwÙÂ@ Ô€¥ÔÂU× Ý ÕÙÂðÒÂÀ¸ÖÂÀÊÓ€ŸÕÂÀâÏÂ@ÈÉÂÏÂ@˜Ñ€dÊ hÌÂ@žÐÂ@?Ë€^ËÂ@¶Ì€‚ÅÂÞÕ ¾È PÐÂÀâÏÂΠÅ€RÍÂàËËÂà•Ô€jÉ—Ì  Ñ 5ÊÂsÒÂàÀÂ@]ÆÂ ÐÂÀ}ËÂÀMÓ€dÊ ÁÒÂÀÊ »ÓÂ`ÍÂà ÖÂ@-ΠåÌ #ÍÂÀèÎÂ`¥Ç€óÇÂÀGÔÂ ÛØÂ@’ÒÂàÑÊÂ`òÏÂÀÇ€ÿÅ #Í—Ì€^ËÂ@¤ÏÂàTÊ©ÉÂ@?ËÂÀÆÂ`ìÐÂ@ÎÈÂ…Ï€áÊÂ@Ó€ØÂ€dÊÂ`™ÉÂ`øÎ€"ÕÂCÚ€.Ó ’Å MÆÂà×ÉÂÍ PÐÂÀÜÐÂ`‡ÌÂ@!ÐÂ@ŒÓ hÌÂ=ÛÂ@ Ô ÿÒÂ@EÊ ¬ËÂà0РVÏÂà³ÏÂ@†Ô ÁÒ€:Ñ€4Ò€½ÐÂà§Ñ€FÏ€½ÐÂÀîÍ€±ÒÂà Ö  ÍÂ@ªÎÂàBÍÂ@9Ì€4ÒÂ`:ÄÂàqÚ ŒÆÂ@ÂÊ ÁÒ vÔÂ@ªÎÂà<ÎÂ@Ñ XÙÂÀÐÒ€«ÓÂÀAÕÂàBÍÂÀ¬ØÂ€Ú pÕ LÛ DÒÂÀƒÊ€±ÒÂÀšÛÂ@!ЀòÜÂ`òÏ€@Ѐ±ÒÂ@Ò 8Ô †Ç 2Õ ñÊÂgÔ óÔÂÀMÓ ÁÒ€dÊÂ`¶Ù jÖÂ[ÖÂÀ¸ÖÂ`{ÎÂ@nØÂ@žÐ YÄ€æÞÂÀÊÓÂ@€ÕÂÀkÎÂÀ/ØÂU×Â@zÖÂà§Ñ ÷É >Ó Ò ¯Õ€·Ñ€cßÂÀÐÒ Р2Õ |ÓÂØÖÂÀAÕ >Ó 2Õ ¥áÂÞÕÂ@ñ×Â@zÖÂðÒÂÀúË€ÏÍÂ@øÁ€"ÕÂàÝÈÂÀ)ÙÂÀ_ÐÂ@KÉÂ@ŒÓÂàÔÂÎÂOØÂ hÌÂà`ÈÂ`òÏ |Ó€.ÓÂà0РÏÚÂIÙÂ`˵ǠMÆÂ€ÏÍ 8ÔÂÒ×Â@ÒÂ@ëØÂaÕÂàwÙ€½ÐÂ@»à >Ó ¯ÕÂ@ýÕ LÛÂÀÊÓ :ޠ݀ÚÂ@!ÐÂ ÛØÂöÑ 8ÔÂ@¶ÌÂ@nØÂ ÏÂ@!Ѐ^ËÂ`"È€|ÆÂ@-ÎÂ`!ÝÂIÙ€LÎÂêÓÂÀúËÂ`QÕÂàHÌ ÚÂà³ÏÂ@°ÍÂÀMÓ íÕ ÿÒÂÐÂàHÌÂ`ìÐÂ@!РÁÒ ±ßÂÀÄÔ‹ÎÂ`]Ó hÌ ‚ÒÂ@!РPÐÂà ÖÂ΀#ÀÂ@ÚÆÂ@†Ô ˆÑ /ËÂÍ ÒÂ@Ñ hÌÂà¿Í µÔ ¬Ë GÇÂ@-΀ÃÏÂ@WÇ íÕ ÷ÉÂ`.ÆÂ`ÉÂ@¼ËÂ`“ÊÂà0Р ÑÂÀúË€ÉÎÂ`iÑÂ@ Ô€Ö€|ÆÂ€óÇÂ@EÊÂ@!ÐÂΠ΀·ÑÂðÒÂà¿ÍÂÀÐÒÂ`æÑÂ@zÖ€^Ë€ÂÂÀËÂ@KÉ€«Ó ËÂàZÉÂÀîÍÂ@9Ì€FÏ 5ÊÂ@†Ô€‡ÙÂ`¼ØÂ`?ØÂ@ՀőÍÂ@ëØÂÀÐÒ  ÑÂ@ ÔÂ@3ÍÂÀÄÔÂ@!РÇÂà§Ñ€±Ò€ÃÏ »ÓÂÐÂüÐÂà›Ó ÷É€"ÕÂÀGÔÂÀ¬ØÂ`3Ú ÎÂÀÐÒ€{ÛÂÀÄÔÂÞÕÂ@ÕÂ ÛØÂ ÁÒ |Ó€uÜ ‹Û ‚ÒÂ@ŒÓ Π#ÍÂ@ýÕÂ`¶Ù XÙÂ@¤ÏÂ@ŒÓÂ`°ÚÂ`]ÓÂ`E×€ÖœàÂ@öë pÕÂ@t×Â`KÖ€ÛËÂàÅÌ€™ÖÂàTÊ Ù :Þ¨ÞÂÀ‚ß |ÓÂ@ÇÞÂÆÙ >ÓÂäÔÂ[Ö€òÜ  ÑÂ@PÝÂ@ýÕ€ÚÂÀÛÂÆÙ ðßÂàúØÂÀ)ÙÂU×Â`ÈÖÂ@÷Ö FÜ€“×Â` áÂ@ åÂÀ¦ÙÂ`ýâÂ`¶ÙÂ@hÙÂ`÷ãÂ`¼ØÂàÓÂ`ÚÓ ÏÚÂÀ#ÚºÛÂ`÷ã´Ü ½ÝÂà/åÂàMà ¥áÂ@£ä ,ÖÂà_Ý ,Ö Ý .àÂÀjã€æÞÂÀvá€×ÂÀçã ÛÂÀÕæÂ%߀ÚÂ@,ãÂ`åæÂ`ýâ€ÔáÂÀXæÂ =èÂ@ÓÜ€òÜ€æÞ–á OåÂ%ß ÙÂ`?ØÂ`!Ý€àß =èÂ ÆæÂ„äÂÀ^åÂà²äÂlè€oÝÂ@VÜ gá öÞ€{Û UäÂà¸ãÂ@>à s߀æÞÂ@£äÂfé ÝÂ`ßç€×ÂÀ”ÜÂ@Õ LÛÂÀdä€Ú £× RÚ ãÂ1Ý êàÂ@ýÕœà "âÂ@ÍÝÂ`ýâÂ@JÞÂÀ;ÖÂ@2âÂ%ßÂÀ¦Ù ‹Û ‹Û ݨÞÂ@ÇÞ ã sßÂ`æÑÂ`zã ¥áÂ@2âÂ`¤ÜÂà$ÒÂ@÷Ö äÂ@Øð€{ÛÂ@VÜÂ@ÍÝ€òÜÂÀÝ€àßÂ`zã :Þ LÛÂ`?ØÂà_Ý€c߀WáÂ@»àÂ`Œà€"ÕÂ`¤ÜÂ@ÙÛÂ`-ÛÂàÄáÂàAâ ÕÙÂ@nØÂ  ÍºÛ€ØÂ óÔÂà0Ѐ ÙÂ%ß ÉÛ€™ÖÂ[ÖÂ`ÉÂÀ²×ÂÀ/ØÂ`žÝ /ËÂÀGÔÂ@VÜÂsÒÂÀGÔ ‘ÚÂ@ÓÂ`?ØÂ€‡ÙÂäÔ€þÚÂÀ”Ü€ìÝÂàôÙ´Ü vÔÂÀ²×ÂàÕÂCÚÂ…Ï€¥Ô ŽÐ ÉÛÂÀ”ÜÂ` Ì€·ÑÂ`˜Þ ‘ÚÂ`ÈÖÂàkÛ —Ù LÛÂÀ¦Ù ÝÂÌØÂÀÜÐÂÆÙÂsÒÂ@ëØÂ öÞÂ`?ØÂ€·Ñ ßÍ€?å ÛÂ@>àºÛ @Ý ÕÙÂÀ¾ÕÂ@ÒÂÀÊÓÂà Ö Ý ,ÖÂ@©ã …ÜÂàôÙ€"ÕÂÀ¾Õ€(Ô ØÂ ‘ÚÂ@ÍÝ [ã Û€4Ò ‚Ò€øÛÂàqÚÂ`E×Âà}ØÂ ØÂCÚÂ@DßÂyÑ vÔÂ`ÈÖÂàÐßÂÀÛ—ÌÂàÔ€×Â@Õ sßÂà•Ô ½Ý€±ÒÂÀwÌÂÀMÓÂ`ÔÔ £×Â`¶ÙÂÀ;ÖÂ`˜ÞÂ@ŒÓÂ…ÏÂgÔÂ`þ͵ǀ¥Ô šÎ€½ÐÂ`ÔÔÂÆÙ 4ß ÍÐÂàÕ £×Â@žÐ€¥ÔÂ@˜Ñ€Ú |Ó JÑÂ`]ÓÂ@ÕÂ`¼ØÂ€“×€“× µÔ (áÂÀˆÞÂ`þÍ‹ÎÂÀˆÞÂàÑÊ ¯Õ€ØÂÀAÕÂ@Õ ÙΠÏ €È ¬Ë ¯Õ€ØÂ ÁÒ XÙÂàwÙÂðÒ€4ÒÂÌØÂÀ_РpÕÂ`ÚÓÂ@!ÐÂÀÊÓ ÝÂÀkÎÂmÓÂà× ØÂsÒÂà}ØÂÀGÔÂ@!РóÔ )ÌÂÀqÍ šÎÂÀAÕ€:Ñ LÛ ·ÞÂ@9Ì RÚ€Ú€{Û€Ú€ÛËÂ`ÍÂàÔÂ@ÓÜÂà`ÈÂÀSÒÂÀ²× Ù΀FÏÂà­ÐÂàqÚÂÒ×ÂU×Â[ÖÂ`{Π‚ÒÂÀeÏÂ@9Ì 8ÔÂÀÚÂÀèÎÂ@’ÒÂà× ùÓÂ@÷ÖÂÀÐÒ á× pÕ ùÓ PРˆÑ vÔÂ`WÔÂÀ Þ üÝÂàÖÞ€"Õ ÝÂâ€ÚÂàÅÌÂöÑÂ`ËÂ@÷ÖÂÆÙÂ@EÊ ÙΠíÕÂÀMÓ ÇÑÂ`9Ù #Í ÙÎÂ`QÕ >Ó ±ß ÏÚÂ@žÐÂÞÕÂ`†á€ÏÍÂ`WÔ  ÍÂ@žÐÂ@>àÂ@PÝÂ@nØÂà¹ÎÂmÓÂ`E×Â@åÙÂ@'ÏÂÀÚÂÀ¾Õ á×Â@ ÔÂ@nØÂ@nØÂà‰ÖÂËÂ7Ü —ÙÂàèÛÂàƒ×ÂàÕÂüÐÂ@\ÛÂÀßÂ`†áÂ`E× ½Ý€òÜ ÜÃà§QÃ0BDÃ&JÃüLÃP?Ã`ç<Ãz8Ã0ã>à$8Àî3Ã@:7ðà4ÃP2àB3Ã`”5Ã0À/ÃP©+Ã`;/Ãà )Ã`S+ÃÀa&ð±'à É'Ã@v-Ã`Ð+Ãp’'ÃÀê$à á#Ç!Ã&à®!à ç"à ç"ÃPÇ&àºÃ@ÃPß"ÃPn Ã0 ÀéÃPýÀrÃêÃ` ÃÐÜÃ0ÇñÃÐ;ðF$ÃÀ‘ÃXÃðÃÉÃÀ—àOÃÀ©ÃRÃ@ÖàÀÃ0µÃsà[ÃPžà ¸ÃÃðÃpòÃðÃÀ8ÃdÃðHÃ`NðšÃðHàgÃð¹Ã2Ã`TÃÀhð/à‘ð¦ÃÐèÃà Ãà'ÃÏà ;À¨Ã@‰Ã0ÍÃp"Ã@ÃŽð;À1à À¨Ã0bÃÀVÃ`õð¾à ÊÃ@6Ã0ð¸ÀIÃP¼ðqðÊà âÃðfÈÃÀëÃ`à> ÃíÃ`Ãг à ô Ã8ÃðZÃÐÃà9ÃÐ* ÃàÂÃvà ô ðY ÃåÃ€Þ ÃÐ$ Ã` à Àà ô Ã` àÍÃð~ à ÃÓ ÃÀ Ã5 Ã`¨à •ÃÀ!Ã\ Ã@éàëÃ@T Ã`7Ã# Ã`=à 0Ã0Qà ­Ãð´Ã@rÃp^ÃàÃP¥ðÀyÃàuÃð1Ã`UþÂÜÃàÃpdÃÐlÃPà ³Ã\ ÃðÃ`Oÿ ÓÃ`Ìÿ€©Ã0ÔÀ£ÃŒÀÃèÃ`OÿÂ@~ÃÜÿ ñàzýÂ@¢ùÂð%ÃMÃ`OÃpÃà½÷Â`gûÂà™ý tþÂÀKýÂ@„þÂ`gûÂà«úÂeà 6Ã0KÃÀÚúÂà þà 6ÀDùÂÐ×À&þÂeÀhóÂpÃ@ŠýÂ@ûà föÂ`‹õ›õ€Áù€DùÂ`…ö Hû 6þÂÀKý°à€üÂSÃÃàLõÂÐràž÷Âà™Ã HûÂ`ÞüÂ`[ýÂqü€Ã@7öÂùÂqü€ÿÂÀiøÂ àýüÂÀ3Ã`[ýÂ`[ýÂ@ÃÀ]úÂà@÷ !÷Â@¢ù ð ýüÂ*ó¹ðÂ`mú€ëòÂàLõÂðÀÃ ×øÂ`yøÂ@üÂ@Cô Èð¡ôÂ`mú 3ô ŠðÂ`äûÂàdñÂÅî !÷Â@aï tþÂ÷ ðÂ@¨øÂ`óÂ@Cô€åó€hóÂ`…ö rôÂ@ÞïÂ`óÂ@ú€\õ –îÂ@®÷Âàçð ðÂ€ÇøÂ`,ð€nòÂ@äîÂÀðÂÀòöÂ€ÇøÂéè€ï `÷Â@gî àìÂ@UñÂÀ(î ñÂ÷ÂõÂ@%ùÂ@ØðÂ@ðìÂà”éÂàŽêÂ`õ øÂ€°çÂà½÷€tñÂàÃö föÂÀñÂ@gî ìê öÞÂNí€÷ð€˜ëÂ`,ð rôÂ@[ðÂÀðÂ`8îÂÀòÂ@êÂ`8î ÔîÂ@[ðÂÀñÂàé ï€KãÂ`,ð ¨ëÂ`÷€ýïÂõÂàpïÂÀô 9óÂàSß éõ xó€VöÂ@aïÂãéÂà4ùÂ@míÂÀô€'é uéÂ`Áì¿ï€åó€zðÂÀô Ý÷Âö ò tÃÀ«íÂ*óÂÀ·ë -õÂ`ÙèÂÀ½êÂ`£ñÂTì ]í¹ð Uä€ÈãÂÀôÂÀ±ìÂàjðÂûå€ì Îï ûòÂÀŸïÂÀ@ê lõ€ îÂÀôÂà½÷Âà½÷Â`ê€ëÂ@Šý ïôÂ`VéÂ@ÒñÂ`8îÂ`…öÂ@ å æë ´éÂ@OòÂàXóÂ`ô °ôÂ@7ö %ìÂàpïÂ@[ð í€ï xó øè„äÂ`JëÂÀþôÂ`÷§óÂ`2ï ñ çÂàùí€÷ð 9ó ãöÂ6ñ „ñÂÀòöÂÀ]ú œíÂà‚ìÂ@ûÂàFöÂàÛò€’ì€æÞÂ@DßÂÀ(î õó€ë ÈðÂÝêÂÀRçÂÅîÂö€ì€,ý€ßô€°ç€iÞ Úí ?òÂÀ±ì ?òÂÀðÂÀáä ´éÂàê ¢ì Wî€ëòÂ`>íÂ@£äÂàˆëÂÀñ åÂ@Þï îÂ ÆæÂàÄá ®êÂNí [ãÂàçðÂà#ç ië oêÂåÂ`zãÂà5ä€'é ië iëÂ`÷ãÂÝê +ëÂàŽêÂ@,ã çÂ`hæÂÀ·ëÂ` ò fö€ÎâÂàóî éõÂÀXæÂàˆëÂ@míÂÀ±ìÂÀÃéÂÀ“ñÂ@[ðÂà¾â€{Û CçÂàdñÂ@©ãÂ@ åÂ`Þ€!êÂÀ{õÂ@gî s߀’ìÂ`†áÂxæÂ€Âä ã ®êÂÀ™ðÂÝê œíÂ`8îÂàÂ@‘ç€ýïÂ`JëÂ@çÂ@aïÂ`†á€òÜ òéÂ`ÁìÂÀLèÂ×ë í€'é­ò +뀀ïÂà|í oê ŸâÂ`åæÂ`ÇëÂÀ@ê åÂÀðÂÀ±ì ™ãÂ`µîÂÀÃé Wî °ôÂÀLèÂ@[ð äÂà”éÂïçÂàAâÂÀþô€ îÂ@éÂ`zã -õÂ@ðìÂ`ÙèÂà¸ãÂà;ãÂ@ÁßÂ×ëÂÀ.íÂ`JëÂ@éÂ`bçÂ`µîÂÅî çÂàSßÂ`Óé {èÂHî€zðÂ`!Ý ½ÝÂ@ å€ë Èð ´éÂ`ÍêÂ@»àÂÀÿßÂ@¯âÂÀøõ ?ò çÂ`Pê òéÂÀjã ÜÂÀ·ë€9æÂ„ä€ëò ¨ëÂ`ßÂ€ÇøÂ€ îÂÀ·ëÂ@yë iëÂ ÆæÂNíÂÀXæÂ ØãÂõæÂ ¢ì ¨ëÂ@êÂÀì÷ í ÎïÂ@ÒñÂàÊàÂ@ðìÂÀÉèÂ@[ðÂ`zãÂÀñ€Âä oêÂ0ò ´éÂféÂÀ.íÂÀ{õ€žê€¶æÂ`Jë€ïÂ`ÍêÂ`>í "âÂ@µáÂ@…éÂàóîÂà#çÂ ÆæÂ×ëÂ@è€Qâ ÌåÂ@ØðÂ@çÂ`,ð ¥áÂ`,ð€ýëÂàwÙºÛÂÀíâ –îÂÀ(îÂàjð ’ùÂ`êÂÀÛåÂàpïÂ@—æÂ`ôÂ@åÂ`hæÂÀdä€ÚàÂÀ(îÂÀLèÂ@s젽ݠUä lõÂÀ·ë ìêÂ@…éÂ`£ñÂÀ·ëÂ~åÂ`ÇëÂÀ“ñ ´é ÝÂ@èÂàÄáÂ@çÂÀXæÂ€¤é `÷€ îÂàóîÂ`ÁìœàÂÀçã€'éÂ`¼ØÂ@ÇÞÂ@êÂ`ÓéÂÑìŠãÂà¬åÂ~åÂÀÉèÂàÐßÂÀdäÂÀ™ð sß ÌåÂ@ÓÜÂàíï€?åÂ@æÂ@‘çÂÀjãÂàdñÂàÛòÂàìÂÀðÂÀÏçÂ`\èÂ1ÝÂ@[ðÂÑì ]íÂÀðœà€-耒ì€ì€EäÂ@êÂ`VéÂ@gîœàÂ`÷ãÂ*ó€'éÂ@©ã€òÜÂàèÂ`&ñ€íÂ`ÓéÂÀ½êÂ`ÁìÂ@éÂàìÂ7Ü€Âä 1ê€ÈãÂàšè IæÂÀ±ìÂÀÉè€QâÂÀ@êÂ`¯ï ?ò ìêÂ@çÂ`nå Òä (áÂ@üêÂ`ßçÂ@倶æÂÀ‚ß "âÂÀdä¿ï øè ™ãÂ`ßçÂ`ßç€ìÂÀLè Wî€zðÂ`åæÂÀùàÂ`©ðÂãéÂBïÂ@öë QïÂ@ÆóÂ@gîÂ@£äÂÝêÂ@sì äÂÀ"ïÂ@©ãÂ`âÂÅîÂ`VéÂûåÂà¦æÂ€ìÂÀdäÂ@sìÂâ ìêÂÀFé  æÂ`ýâÂà²ä¨Þ€ÂäÂàÐßÂà5䀒ìÂ`©ð ºèÂÀ«íÂ@ÁßÂàéÂ@ê ÎïÂà5ä€÷ðÂàÿìÂÀ.íÂ@míÂÀpâÂÀçã Úí ïÂÀ·ë àì ÔëÂÀRçÂ`êÂ`hæÂ`ëåÂÀ½ê «àÂàŽêÂ`ßçÂ@ç åÂÀjã fö€øÛÂÀÛåÂ@ðìÂ×뀘ë€?åÂÀ·ëÂâÂ@sìÂ@2â³ñ€'éÂ@©ãÂà¦æÂ@ å gáÂàçðÂà 뀒ìÂà ë QïÂÀ”Ü€ëÂfé€ëÂ`âÂ`tä€-èÂàíï€tñÂ@êÂ`ÙèÂ`\èÂà|í oê ãÂÀ™ð€’ì ÔîÂ`Í꠺蠢ìÂ@åÂÀFéÂ@¯âÂãéÂ@ê î€]à àìÂàèÂÀÛåÂÀíâÂÀRç€9æÂàjð ð߀ªèÂ`ÇëÂÀŸïÂ`,ð ÞâÂà çÂÀ·ë ç€3ç´Ü ]íÂà¾â :ÞÂ`Vé ®êÂ`nå Ò䀤éÂ`bç  æÂà çÂÀòŠãÂ`âÂ@ç 7éÂÀ|àÂàŽêÂàêÂ`Ùè€ï 1ê€ÂäÂÀçãÂÀóáÂ@©ãÂ`¶ÙÂ`Jë êàÂàçðÂÀXæÂ ™ã ç€× ºè äÂÀ@ê€ÈãÂ@ÆóÂéèÂà ç€zð LÛ ¨ëÂàÜÝÂÀpâÂàMà€-èÂÀáä€3çÂ@8áÂ@t×ÂÀ@êÂ@¯â€?å Þâ á×€ÈãÂõæÂ Âñ€?å WîÂà”éÂÀÉèÂàjðÂÀ.íÂãéÂà)æÂ@ å ‚žÂ¹pÁ€XÌÁë¾Á€2üÁÐÂRÂ|Â@xÂÀ,Â@(€Å%Â@Õ2‹N€S8Âh?€ÿEÂÇDÂOÂÀ0CÂ=[ÂKÂ@ªNÂÀÜP€c_ÂÀÃiÂÀÉhÂ@+x€VvÂÀŽ]Â@&dÂÀ{u€ Â`Ò ÷€ÂyÂÀW{ÂÀqÂ@+x¡t€tqÂàò†ÂÀÈ}ÂÀþtÂ`¨ˆÂ€2|Âq|€©€Â@õƒÂ@BŒÂ@~‚ ˆÂàÚŠÂà‚ Á‰ÂओÂ`1‡Âà‚Â`®‡Â€UŽÂÀ'†Â £ŽÂ€=’Â`Ì‚ÂओÂ@$‘Â@ËŠÂ úŠÂ ³Â|’ ;•€¢–Â@—Â`–‹Â€´“ A”ÂÀ8˜Â€C‘ÂÀ—Â`<šÂ€+•ÂÀÁ– ©ÂÀtŽÂ€™ÂÀÍ”Â`¿™Â€œÂÀs£Âàñ›Âv“ ùŸÂ OœÂàJ¢Â@ô˜Âà€™Âàt›Â`›ŸÂ –¥Â Þ™ÂàÇ¢ÂÀœÂà ˜Â ó ÂÀä¥Â€~œÂàÓ Â` ¢Âà«Â@ô˜ÂÏ™Â@MŸÂ¦Âò¨Â ¥Â (­Â«ŸÂ՘“£Â¢Â€Ý¡Â€œÂÀs£Â 7 ÂàP¡Â€ïžÂ€éŸÂø§Âà—ªÂ@í®Â@)¥ÂÀO©Âà­Â ±«Â@¾¡Â`;¯Â€­ÂW­Â @©Â R¦Â`¬±Âàm±ÂÀO©Â@«Â ½©Â`ܩ ©Â`¡ÂȯÂÀg¥Â€¬Âà—ªÂ€$«Â ›¹ÂÀû¶Â9²Â@ղž¶Âø§ÂÀU¨Â`)²ÂÀ²Â@«¹Â ‡²Â€§ªÂ ì¶Â <´Âà1»ÂK¯Â-´ÂàI·Â€}±Â H²Âà®Â@¸¢Â€‰¯Â ¾ÂàC¸Â i·Â 0¶Â@«Â é¬Â` ³Â@^±ÂÀ²ÂÀ`»ÂÀl¹Â@(ºÂÀ²Â\ÁÂ!¶ÂŒ¹Â@ÀÂÀ ´ÂÀé¹Â  ¼ÂÀT½Â@.¹ÂÀr¸ÂJÄÂ@^±ÂàI·Â`#³Â é¬Â@½¶Âູ€ĺÂ@õ ì¶Â¸Âà1»Â»ÆÂ`M¬Â@æÄ ô¿Â’¸Â`ˆ·Âñ½Â ½ÂÀBÀ€ ÄÂ`óºÂ€ À€ ÄÂàfÇ€5½Â`LÁÂàŠÁ€ַ ì¶Â@"»Â`Û¾Â@ªÎÂßÀ -ÁÂ`í»Â »Âà³Ï ¾È 3À ÄÇ€ ÀÂàO¶Â`X¿Â€ˆÄÂ`տ¤µÂ ì¶ÂÀBÀÂ`X¿Â€|ÆÂÀƒÊÂ@¾ÂÀÇÂ@òÂÂVÂÂ`ÉÁÂ@òÂÂÀѽÂ@þÀÂ@ÚÆÂà×É€ʹÂàÑÊÂàõÄÂÀ}ËÂ`á½Â`¥Ç GÇÂ`ÏÀ€áÊÂ@iÄ Ժ ȼÂàrÅÂÀÈ MÆÂ e€” MÆÂ,ÉÂ`«ÆÂàïÅ îÀÂÍÃÂñ½Â€dÊÂà<ÎÂ@½Â@3Í€ŽÃ€ÏÍÂn¾Â,É GÇ€±Ò â€‚Å€#ÀÂÀ¹ÁÂ@°ÍÂ`‡ÌÂàûàâÂÂ@oÀ¦¿Â€¬¾Â£ÊÂÀ›ÆÂ`ÉÂà Á€šÁ©É ' 5ÊÂöÑÂÁÅ€íÈ ?¾Â ºÂ`¥ÇÂ@oÀÕÌ€ÛËÂÀ¹Á ƒ½Â`“Ê ßÍÂ@ÚÆÂ`^¾Â@cÅÂÀÆÂÀ¿À SÅ MÆÂ ¤ÂÂÀé¹Â@ÈÉÂàœ¾ÂÀ<Á ’Å€ÅÂÁŗ̠Ȁ¦¿Â`FµÇÂ`«ÆÂ` ÌÂà¿Â`ÉÁ£Ê ¬ËÂ`¸Â ŒÆÂ /ËÂ@]ÆÂ`ç¼Â@ªÎ€Å ȼ ÄÇÂà0ÐÂÀ ÉÂJÄ€ŽÃÂÀ ÉÂ@9Ì ÜÃÂn¾ÂàZÉÂ>ÆÂÀ•NjΠ?¾Â`:Ä£ÊÂàÑÊÂ@°ÍÂ2È»ÆÂÀ­ÃÂàÀˆÄ¯È VÏÂÀ›ÆÂÀ}ËÂ`·ÄÂ`ÉÁÂÀúË ýÈÂËÂàÑÊ AÈÂàÀóÇ€ ÄÂË £× ŽÐÂñ½ÂÀ É ñÊ€½Ð ¾È ΀XÌÂ÷¼Â€vÇ ÄÇÂ@òÂÂÀúË€^ËÂöÑÂ`øÎÂÀîÍÂÍÂÓÂÂ`±Å _àÈÂ@EÊÂÀ$ůȠ¾ÈÂ`LÁ tÊ ²Ê ”Ï€ÃÏ€áÊ tÊ GÇÂ@QÈ РhÌÂ`տ¯È !ÃÂà`È€^Ë MÆÂ@oÃÂ@àÅÂ@þÀ ¤ÂÂÀèÎÂà0Р†ÇÂ`{ÎÂÀúËÂ@þÀ MÆÂ 5Ê îÀÂà¹Î ÆÂ€ÕÌ îÀÂ`±ÅÂàBÍÂ@¼ËÂà„ÂÂÙÁÂt½Â€ ÀÂ@øÁ /ËÂ@ò #ÍÂ`.ÆÂÀÈ kÁÂÀîÍÂà<ÎÂ`æÑ€íÈ ¾ÈÂà6Ï ¬ËÂÀ}Ë /ËÂ`ÍÂÁÅÂh¿Âà<ÎÂ@ÚÆÂ@u ªÁ€^ËÂ`·Ä€ŽÃ †Ç ÜÃÂ`cÒ€óÇÂàÝÈ€ÅÂ@æÄ MÆÂÀ˾ÂÀÇÂ@ŒÓÂà–¿ÂàéÆÂ@ÀÂÀ`»Â`4Å£ÊÂ`™ÉÂ@KÉ ÜÀS¸Â€dÊÂ@Eʩɠ!ÃÂ`øÎÂÀwÌ _ÃÂÀBÀ ËÂÀ*ÄÂÓ 2ÕÂ@þÀÂ@ÈÉÂÀqÍ žÃ€#À€ÃÏ€šÁÂàfÇÂ@“½ÂÀ˾Ân¾Â@æÄÂÀ;ÖÂÀîÍÂ`«ÆÂ€ÿÅ€RÍÂ ÊÆÂÀÖÑÂÀ_Ѐ|ÆÂ ÊÆÂ€²½Âà~À¦¿Â |ÓÂÀ_ÐÂ@¤Ï zÉÂ@3Í€jÉÂ`¥ÇÂ@(ºÂ€ÃÂÀGÔÂ`Â×€‚Å€‚ÅÂ`ËÂ>ÆÂ€pÈ ?¾ÂDÅÂÀ¡ÅÂЀ½ÐÂÀ É }¾Â ªÁÂ`·ÄÂ`RÀÂ@cÅÂ@]ÆÂ€¦¿Â,É—ÌÂ@u€‚ÅÂ`LÁ ÐÅ€šÁÂ`·Ä åÌÂÀ<ÁÂÀH¿Â@¼ËµÇÂ@cÅ€óÇÂ`±ÅÂ`ù¹ÂÀ¡ÅÂ@KÉÂ`4ÅÂÍÃÂÀ¬ØÂ ;ɣʠÁÒÂÀSÒ€#À ŒÆÂ@?Ë€íÈÂàfÇÂ@9ÌÂ@ÔÇÂÀË€ÁÂ@?ËÂ@ªÎ ßÍ€Ö µÔ€íÈÂ&Ê€áÊÂàÔÂ@KÉÂÀ6ÂÂàZÉ€ÏÍÂÏÂ,É ëË èÁ€pÈÂÏ€(ÔÂn¾ÂàxÄÂÀËÂ`æÑÂàãÇÂ`Ë ÐÅÂ`¥Ç ;É ’Å 5ÊÂàHÌÂР/ËÂÀeÏÂÀè΀áÊ€^ËÂÌØÂ€ Ä€RÍÂÍÂ`FÂÂ`{ÎÂÀN¾ÂÏÂ&Ê ¾È€çÉ ýÈ ‚Ò šÎ ÇÑ€jÉÂÀ$ŠπÕÌÂÀÆÂ`«ÆÂÆÙÂàÝÈÂ@ìàvÔÂàïÅÂ&ÊÂ@ªÎÂÀeÏ nË©ÉÂ`ŸÈÂÀkΠ)Ì€XÌÂÀËÂà6Ï ¬ËÂ`iÑ€‚ÅÂ`™ÉÂ@'ÏÂ@ ÔÂ`{΋ÎÂ`uÏÂ`Í  ÑÂ`ìÐÂàlÆÂÀqÍ€ØÂ €ÈÂ@¼ËÂ`™É€ØÂËÂàûÃÂ8Ç YÄÂ@3ÍÂÀúË ßÍÂà$Ò /ËÂ`oЀ.ÓÂà³ÏÂ@QÈÂÀ É€Ö ýÈÂÀ•ÇÂ@EÊÂ`ÍÂ`ŸÈÂà¿Í€ùÆÂÀ6ÂÂ` Ì ,ÖÂ@'Ï—ÌÂÀqÍÂ`uÏ€4Ò ;ÉÂàNË ËÂà`È ©Ö ýÈ AÈ 8ÔÂðÒ©ÉÂ@!ÐÂ`æÑÂÀËÂÀ­ÃÂ`“ÊÂÀËÂ`ËÂàHÌÂ@æÄÂ2ÈÂ`ËÂà¡ÒÂ`]Ó€áÊÂÀ³ÂÂ`:Ä ËÂà6ÏÂ`ÊÂÁÅÂ@÷ÖÂ`oÐÂÀúË ÓÏÂ`RÀÂà0ÐÂÀ¿ÀÂàNË )ÌÂÍÂà+¼ÂDÅ €ÈÂ@ÔÇ ÜÃÂ`d½Â@Ñ€vÇ€RÍÂyÑ ÷ÉÂ`Í€ÏÍ€ÛËÂà ÁÂà ÁÂ@¼ËÂ@WÇ eÂÂÀ ÉÂà¡Ò åÌÂJÄ€íÈÂÐÂPÀjÉ tÊÂ,ÉÂÍ /ËÂà­Ð ÷ÉÂ@-΋ÎÂÏ€ÛËÂ@ÂÊÂÇÄ‹ÎÂàZÉÂ@ÎÈ ;É‘ÍÂà³ÏÂà Ö€4Ò XÙÂÀ/ØÂüР Ñ µÔÂðÒÂmÓÂ@¶ÌÂÀîÍÂ@¶Ì ØÂ@'ÏÂà`ÈÂ`]Ó YÄ tÊ€^Ë &×ÂÀÜЀíÈÂ@°Í  Í ½Â@EÊÂ@QÈÂà<ÎÂ@ ÔÂ,É€.ÓÂ@9ÌÂÀËÂ`þÍÂÀË—ÌÂ@KÉ€áʯȠÐÂÀôÌÂ@°ÍÂ`.ÆÂ@?ËÂÀËÂ`Í€çÉ »Â`‡ÌÂ`àÒÂÀ}ËÂ@3Í€áÊÂ`±ÅÂßÀÂ@QÈ€:ÑÂÀƒÊÂÀƒÊ€vÇ Ë /Ë€@ÐÂËÂ@9Ì GÇÂ`{ÎÂn¾Â`òÏÂÀúËÂÀ‰ÉÂÀîÍÂ`¥ÇÂÀè΀½Ð ¬Ë€‚ÅÂ@]ÆÂ nËÂ@ÎÈÂsÒ  ÍÂÁÅÂ@’Ò MÆÂÍÃÂ@ÎÈÂÀË€±ÒÂ@'ÏÂÀ}Ë MÆÂ@?ËÂ` ÌÂàÑÊ ñÊÂÀèÎÂà¿Í ²ÊÂÀè΀:Ñ€.ÓÂ@¼ËÂà¹ÎÂ`ìÐÂ`¶Ù nË ùÓ #ÍÂàBÍÂà0ÐÂmÓ€øÛ ØÂ ÙÂà›ÓÂ@nØÂÀMÓÂ@ßÚ pÕÂ@÷ÖÂ09ÃÀſ ¬Ë€“×ÂÀÊÓÂØÖÂ`òÏÂÀ}Ë 4ßÂÀÝÂ`€â€{Û LÛÂà}ØÂ®Ý€{ÛÂ@ ÔÂ=Û´ÜÂÀšÛÂÀùà ±ßÂ`]ÓÂ`{ÎÂ@åÙÂ`QÕ mà€¼åÂ@ÒÂöÑÂ@ å yÞÂ@åÙÂà×É FÜÂ`†áÂ@…éÂ`âÂÀ²×€"Õ€ŸÕÂÀßÂ@Õ€XÌ€"ÕÂà¸ãÂ@åÙÂà×ÂàÜÝÂÀváÂÒ×ÂàâÜÂá Ü Ë DÒÂÀÚÂ`˜ÞÂ`'Ü®ÝÂàÕÂÀóáÂ`täÂ@ÙÛÂ@ñ×€{ÛÂ`¶ÙÂ@ýÕÂ`Í€ Ù DÒÂ@VÜÂ@ýÕÂà•Ô€(Ô Ú DÒÂ`?ØÂÆÙ€þÚ á× ¯ÕÂÀÄÔ€‡ÙÂÀÚÂÀkÎÂ` á€ÕÌÂ`?ØÂ@ŒÓÂÀŽÝÂ`ŒàÂà§ÑÂÀÊÓÂIÙÂ@ŒÓÂÀYÑ€“× ØãÂ`Œà€¥ÔÂ%ß d×Â1ÝÂ`3ÚÂ%ߢßÂà›ÓÂàôÙ€“×Â`ÎÕ 2ÕÂàèÛÂàÄáÂ`E×Â@ßÚÂäÔ «à€iÞÂÀÐÒ ÕÙ ËÂà0ÐÂÀ¾ÕÂ`]ÓÂ@Õ Ò€ÃÏÂ`ÎÕ ÚÂ@'ÏÂÀËÂàÕÂ@'Ï UäÂ@ñ×Â`iÑ€ØÂ@ŒÓÂ`øÎÂ`°ÚÂÀ É€@РˆÑ &×Â[Ö€‡ÙÂÀ;ÖÂàÔÂ[Ö ÏÚÂ@’Ò RÚÂ@zÖ £×ÂU×Â@åÙ vÔÂàúØÂÀ#ÚÂ@†Ô€jÉ jÖ ýÈÂÏÂÀMÓÂÀ¸Ö ©ÖÂàÅÌÂ`þÍÂ`Ë€ŸÕ ÙÎÂÀ)Ù Ò€“×ÂÀ_ÐÂ`ªÛ´ÜÂà§Ñ€½ÐÂËÂЀ½ÐÂ`àÒÂ`ìÐÂ` Ì çÖ ÙÂÀkÎÂÀMÓÂà ÖÂ`‡ÌÂÀ•Ç€ÃÏ ÇÑÂ@žÐÂsÒ»ÆÂàZÉÂsÒ ;ÉÂÀÜЀRÍÂÀÚÂÀk΀ÏÍ MÆÂ‘ÍÂ ÛØÂà0ÐÂàÓÂ`ÔÔÂÀSÒ€ÃÏÂäÔÂÀYÑÂÀ_ÐÂÀSÒÂ@¶ÌÂ@Õ€¥Ô€ÉÎÂÀSÒ ¬ËÂÀ#Ú Ù΀@ÐÂ`â€áÊÂàÕÂÀèÎÂàƒ×Âà¡Ò †ÇÂ@ÒÂà×ÂÀkÎÂРÒ€½ÐÂ`àÒ€½Ð XÙÂ`ªÛ ‘Ú Ѐ^Ë ;ɑ͠ÚÂ@'Ï †ÇÂàÑÊÂàBÍÂsÒÂ`àÒÂàZÉ ÐÂOØÂÀwÌÂÀôÌÂ`«ÆÂ ùÓÂØÖÂàqÚÂ`WÔÂ`{΀:Ñ€ŸÕÂÀ5×Â@zÖ€dÊ€½Ð ÙΠÓÏÂ@ªÎ Ù΋ΠŽÐ 8Ô ÍÐÂÀAÕÂÀ¬ØÂ /ËÂÀeÏ€ÃÂ`‡ÌÂàúØÂaÕÂ`oÐÂ`øÎÂ`]ÓÂ`]Ó ÙÎÂ`«ÆÂyÑÂàôÙÂ ÛØÂêÓÂ@ÒÂ@Ñ ùÓÂ`Â×ÂêÓÂàØÂ@PÝ åÌÂêÓ ‹ÛÂ`KÖ ^ØÂà•Ô ßÍ µÔÂÀwÌÂÀÖÑÂ`æÑÂÀGÔÂÀîÍÂ@¼Ë€ÿÅÂ`“ÊÂ@-΀·Ñ GÇÂ`¶ÙÂ`¶ÙÂ`æÑÂ@9ÌÂÀ0ÀÛË€.Ó åÌÂà„ÂÂÀÜÐÂ@¶ÌÂ@]ÆÂÀ ÉÂÀôÌÂ@3Í µÔ  ÑÂ`ÔÔÂÀ²×ÂÀË #ÍÂà×Â@’ÒÂ@¤ÏÂÍ€:ÑÂàãÇÂ@ Ô vÔÂÀúË€þÚÂ`ÎÕÂ@åÙ€XÌÂ`òÏÂyÑ ¬Ë€XÌÂ`òÏÂ@ÈÉÂ`ÍÂ@QÈ€±Ò \ÎÂ,É€·Ñ DÒ€ØÂ@ëØÂ JÑÂàÝÈÂ@žÐ€FÏ€FÏÂ@ÑÂ` ÌÂ@WÇ€“×Â@ÚÆÂ`?ØÂ ˆÑÂ@¼Ë ÎÂàÅÌÂêÓÂ`ÎÕ€4ÒÂ`(Ç íÕ€«Ó€×ÂàØÂ ÿÒÂ,ÉÂÀkÎÂàÝÈÂàËËÂÀâÏÂÀwÌÂ@Ñ€ÉÎÂ`‡ÌÂ@àÅÂà0ÐÂ@ßÚ ”Ï 5Ê #ÍÂ@t×ÂgÔÂ` ÌÂ`ìÐÂ`QÕ JÑ pÕÂØÖÂüÐÂ`òÏÂà¹ÎÂ`{Π^ØÂ‘Í ÄÇ ,ÖÂ@?ËÂ@3ÍÂ[ÖÂà›Ó >ÓÂ` Ì ÇÑÂÏÂ`ìЀ½Ð &×Â`?ØÂ`WÔ€‡ÙÂÀîÍÂ@åÙÂÀSÒÂ@ÙÛ ˆÑÂ`°ÚÂ@ëØÂ€™Ö€uÜ€dÊÂ@°ÍÂÀèÎÂÌØÂ@8áÂØÖÂÞÕÂ@zÖÂà*Ñ 8ÔÂ`ìРnË óÔ @ÝÂΠóÔ ÿÒÂ`æÑÂà6Ï€ØÂÀAÕÂ@bÚÂÀ ÞÂÀ;ÖÂàØÂ`WÔÂ@ÕÂÀ¬ØÂ%ß …ÜÂ`'ÜÂ@>àÂ@ÒÂ@÷ÖÂàHÌÂ@ªÎÂÀeÏ ëËÂ`ßÂÀ5×Â@žÐÂ`WÔÂÏÂ@-ÎÂ@ýÕÂÌØÂÀÿßÂÀÛ :Þ XÙÂà0ÐÂÀkÎÂÀ#ÚÂàMà€ÚÂ`-ÛÂà×ÂsÒÂÀ”Ü RÚÂàÔÂÀ¸ÖÂÀkÎÂ`ÎÕ€Ú |ÓÂÀGÔ€KãÂâÂàeÜÂРjÖÂ`àÒ ŽÐ íÕ€×ÂÌØÂ@÷Ö ¯Õ€½ÐÂÀ#ÚÂàGá ¯Õ€«Ó€½ÐÂÀSÒ€ÛËÂ@ÎÈ /Ë >Ó€(Ô€(ÔÂÀ}ËÂ@ëØÂ`¥ÇÂÀ²×Â`ÚÓ€×Â`{Π‚ÒÂ`øÎÂÐÂ`ÎÕÂà×—Ì )ÌÂ@Ñ€c߀½ÐÂ@÷ÖÂÀkÎÂà*ÑÂ`æÑÂÀíâ VÏÂ`ÍÂ`ÍÂàÕ€FÏÂ@†Ô ¯ÕÂà<΀·ÑÂÀ;Ö Ï #ÍÂà³Ï ÒÂ`Í |Ó nË€½ÐÂðÒÂêÓÂàTÊÂÀ_РVÏ ÓÏÂüÐÂÀ/ØÂàØÂ@EÊ DÒÂà¡ÒÂ@>à©ÉÂ@˜Ñ ¯Õ µÔ \Π8ÔÂ`cÒµÇÂà<ÎÂà$ÒÂ`ˋΠvÔÂ@ëØÂ )ÌÂà¿ÍÂ`“Ê £×ÂÐÂU×Â`‡Ì€ÏÍÂ@ŒÓÂÀeÏÂÀÊÓ MÆÂ æëÂà•ÔÂ`ŸÈ€:ÑÂÀ}ËÂ[ÖÂÀ5×Â`þÍ ÷É \ÎÂmÓÂàÓ ÿÒ pÕ€@ÐÂ`WÔ ‚ÒÂà³ÏÂÀ¸Ö ÏÂ`‡ÌÂàwÙÂ΀jÉÂ`.ÆÂàlÆÂ †Ç€‚Å€ÛËÂàãÇ DÒÂÀ›ÆÂÁÅÂÀÈ€ÃÏ€ÉΠ^ØÂ ñÊÂ@'ÏÂ@ªÎÂÀÆÂ€LΠDÒÂà³Ï€¥ÔÂÀAÕÂ@Õ ²Ê #ÍÂÀâÏÂÀôÌ ¬Ë€× )ÌÂàrÅÂ`@ÃÂÀÄÔ€4ÒÂàHÌ ÷ÉÂà›ÓÂÀMÓ€@РGÇÂÀ_ÐÂÀ³Â€pÈÂÀ‰ÉÂà¹ÎÂÌÂ@zÖ€±ÒÂ&Ê DÒÂ`þÍÂ@’ÒÂ`ÚÓÂ@òÂÂàéÆÂ@QÈÂ`ÉÂ`þÍÂàûÃÂàxÄ ÓÏÂmÓ èÁÂ,ÉÂ`æÑ€dÊÂÀÇ€ÏÍ€«Ó šÎÂ@]ÆÂ@ÔÇÂÀ‰ÉÂÀËÂCÚÂÀÖÑÂà¹Î€@ÐÂàïÅ ’Å >ÓÂ@ìàšÎ ”ÏÂmÓ€dÊÂÀkÎÂàBÍÂàÅÌÂ@¶ÌÂ`™ÉÂÀk΀.ÓÂÀÈÂàÝÈ€pÈ€FÏÂàTÊ »ÓÂàÓ£ÊÂ2ÈÂàÑÊ ŽÐ€FÏÂÀ5×€Ö nËÂÍÂäÔÂà6ÏÂ`·ÄÂà ÖÂ`ìÐÂÀ•ÇÂ\ÁÂàÑÊ vÔ€ØÂ@÷ÖÂÌØÂÀkÎÂOØÂÀ/ØÂ@åÙÂ@ÚÆÂ`ÚÓÂ`±Å ”ϵǀÿÅ€"ÕÂ@ÑÂ`QÕ Ù ÇÑÂÀÊÓÂÍÀÚ 5ÊÂà0ÐÂàÓÂ@!ÐÂàTʣʀØÂàwÙÂÀ¾ÕÂà×Â@Ó€¥ÔÂ`oЀvÇ ëËÂ`oÐÂ@ÂÊÂaÕ ÍÐÂÀ_ÐÂà*ÑÂàTÊÂ`Â×Â`uÏÂà¿ÍÂÀè΀“×Â`cÒ ýÈÂΠÍРLÛÂ`?ØÂ` Ì€FÏ€FÏ ¯ÕÂàØÂÀ¾Õ ÃÜ ЀÕÌ ØÂÀÐÒÂ`KÖÂà¹Î€iÞÂsÒÂ@˜ÑÂÒ× vÔ ßÍÂgÔ ¬Ë€ÉÎÂ@¼Ë ÇÑÂÀèÎÂ`{ΠnË£ÊÂ`øÎÂÀAÕÂÀ²×Â@\ÛÂàÅÌÂöÑÂ`ìÐÂÆÙ€±ÒÂ@QÈ hÌÂÍÂ@†Ô€ŸÕÂ`¶Ù€:Ñ ”ÏÂàÕÂàÔÂÀ¸Ö€‡ÙÂÐÂà0ÐÂàÅÌ€dÊ pÕÂÀ²×Â@ ÔÂÀMÓ€½Ð tÊÂ@'ÏÂàîÚ‹ÎÂ@øÁÂ@'ÏÂ@˜ÑÂ`WÔÂ`9ÙÂÀË€™ÖÂmÓÂà×€Ö d×Âà0ЀáÊÂ`cÒ jÖ ˆÑÂ@'ÏÂàÕÂ@QÈÂ@-ÎÂàÝÈ /ËÂÀ/ØÂ€ ÙÂ+ÞÂ`9Ù€þÚ óÔ çÖÂÀ}Ë ‚Ò LÛÂÀóáÂ`ÞÂmÓÂ`¼ØÂ`¶ÙÂÀ ÚÂà¡ÒÂ`'Ü€ìÝ€ÉÎÂ@ñ×ÂÀ)ÙÂÀÐÒÂ@ßÚ çÖ€‡ÙÂÀÊÓÂà­ÐÂ`ÚÓ ÙÂàÓÂàâÜÂÀ¾ÕÂàÜÝ ‚ÒÂÀèÎÂÀ¾ÕÂà$Ò€¶æÂà çÂàèÛÂØÖ ØÂ`¼ØÂ ÕÙÂ@ýÕÂäÂ@bÚÂà‰Ö ·ÞÂÀßÂaÕÂà}ØÂ[ÖÂ@°Í ŽÐÂÞÕÂ`™ÉÂÀkΠ©Ö€@ÐÂàÓÂàéÆÂÀeÏÂ@zÖÂÀ¬ØÂ`ÍÂàÕÂ@ÂÊÂÀYÑÂÀ5×ÂÀSÒ LÛÂÌØÂÀ¾ÕÂÀYÑÂ`˜Þ ‚Ò £×Â@?ËÂÀqÍ óÔÂÀÜÐÂàØÂ d×€.ÓÂ@hÙ€ØÂ=Û ‘ÚÂÀ#ÚÂÀqÍ€«Ó pÕ€ÕÌÂ`QÕÂÀÜЀFÏÂ@°ÍÂÀ Þ€{ÛÂà6Ï ‘Ú€ÉÎÂРíÕÂàÔÂyÑÂÞÕÂ ÛØÂ€4Ò ²ÊÂ@»à€ÚÂ@€ÕÂàúØÂà<ÎÂgÔ RÚ€íÈÂ ÛØÂ ÿÒÂ`ËÂ`]ÓÂÀAÕ РËÂ`cÒ€‡Ù€Ö€ÉÎÂ`cÒÂyÑÂÀk΀ Ù ,ÖÂgÔ€ÛËÂà³ÏÂà¡Ò€ØÂgԋΠÍР^ØÂÀÈÂJÄÂ8ÇÂ@ÓÂàîÚÂàËË žÃ ëËÂÀwÌÂàØÂ£Ê€.ÓÂ@ñ×Â@ ÔÂ`ÚÓÂà³ÏÂ@æÄÂÀGÔÂ`]Ó µÔÂ`ìРóÔÂÀÈÂÀÊÓÂÀ}Ë hÌ€çÉ€à#ÍÂ@˜Ñ ™ã ÁÒ ËÂÀâÏÂ@¤ÏÂØÖ€4ÒÂ@ÁßÂÀ¾Õ ÏÂ`Ê vÔÂ`™ÉµÇÂ`þÍÂ`¤Ü—ÌÂÀ•Ç çÖÂ`“Ê€ÕÌÂÀ¾Õ€çÉÂÀÇÂ@ÔÇÂmÓÂ@ªÎÂÀMÓ >ÓÂÀ_ÐÂ@9ÌÂÀ‰ÉÂ@'ÏÂ`cÒ€ÛËÂ@QÈ  ÑÂ@¶ÌÂÀÆÂ ýÈÂ`.ÆÂ`¥ÇÂÀƒÊÂ`:ÄÂÀèÎÂsÒÂ`àÒ bÍ€(ÔÂyÑ 5ÊÂ@ŒÓÂÀÄÔÂ`KÖÂ`]ÓÂ@KÉÂà¹Î€áÊÂ`òÏÂà›Ó€ØÂ…ÏÂ` ÌÂà6ÏÂà0РóÔÂàÔÂÀAÕ íÕ 2Õ ÏÚÂ`{ÎÂmÓÂÀGÔ pÕ—ÌÂÀÐÒ€@ÐÂ@æÂ€‡ÙÂÆÙÂ@÷ÖÂ@°Í€.ÓÂêÓÂgÔ PР½Ý€.ÓÂÀMÓ€½ÐÂ`Â×Â`“ÊÂ@ ÔÂ`æÑ ßÍÂ@¤ÏÂ`ÍÂÆÙ nËÂ`¶ÙÂÀeÏ €È¢ßÂÀ/ØÂ`cÒ 8Ô FÜÂà‰Ö€¥Ô€ÔáÂÀeÏÂ@JÞ€×€4Ò€Ú€ÉÎÂ@-ÎÂà³ÏÂ@nØÂÀ”ÜÂ`9ÙÂÀ¦ÙÂ@ŒÓ »Ó ^ØÂ€"Õ€ ÙÂÀMÓÂ@PÝÂàÅÌ€þÚÂ`ŒàÂÀÄÔ€:Ñ ¬ËÂ`ÔÔ ØÂ`QÕÂÌØÂÀƒÊÂÀ)Ù ßÍÂÀâÏ€ØÂ€ÉÎÂÀ¾Õ‹ÎÂmÓÂ`ÈÖÂàôÙ€¥ÔÂCÚÂàÕÂÀÊÓÂ`]ÓÂà‰Ö€áÊÂàfÇÂÀÜÐÂ`«ÆÂà§Ñ€ÃÏÂà$Ò 5ÊÂ`oЀÛË ÙΠnËÂÀšÛÂàwÙ 8ÔÂà ÖÂ@ÙÛÂ`ÍÂ@DßÂ@JÞ ŽÐ©É€@ЀŸÕ‘ÍÂU×ÂË †ÇÂ`{΀ùÆÂ ²Ê€ÕÌ€øÛ ÓÏÂ`ËÂöÑÂà§Ñ ˆÑÂ@QÈÂ ÊÆÂ€“×ÂÀ_ÐÂàÅÌÂÞÕÂ@nØÂ€±Ò ÈÂ`þÍ ÏÚÂäÔ€ÃÏ hÌÂÏ€(ÔÂ@’ÒÂ@¼Ë©É‹Î€þÚ Ù΀.ÓÂ`òÏÂ`oÐÂÀÐÒÂà¹Î€ÖÂàØÂ`uÏÂÀÐÒÂ`E×€@ЯȠÈ ëËÂ@˜ÑÂ`cÒÂ@ÁßÂ@-Π>Ó€^Ë ‚ÒÂ@ëØÂ2È |Ó  Ñ ©ÖÂÀ‰ÉÂ@ëØÂàÕÂgÔÂÀSÒÂÀƒÊÂ@°Í ‚ÒÂÏ€ÉΠ”Ï€æÞÂÀÚÂàÓ€:Ñ€^ËÂüЀáÊÂ&ÊÂÀ¸ÖÂÀÚÂÀMÓÂÀAÕÂ@ÓÂàƒ×ÂÀ¾Õ€±Ò€4ÒÂàúØÂ`™É ùÓ ëËÂÀôÌÂà¹ÎÂÀ}ËÂ`ÚÓÂà$ÒÂ@ÒÂà¿ÍÂ`WÔÂ@†ÔÂÀ}Ë ”Ï€·ÑÂÐÂ@Ó óÔ‹ÎÂ`KÖ SÅÂ@9ÌÂ@ÈÉÂ…Ï ˆÑÂÐÂÀÊÓÂ`ÈÖ AÈ»ÆÂ šÎ ²Ê ÖÄ€dÊÂ`cÒÂ2ÈÂÀƒÊ 5Ê ’ÅÂ@ÂÊ€:Ñ€ÛËÂ@ÑÂÀeÏÂÀÇÂ`¥Ç ÍÐÂÇÄÂ`uÏ zÉÂ@3ÍÂ@9Ì€XÌÂmÓ ¾ÈÂ`QÕ AÈÂàÑÊ pÕ©ÉÂ@žÐÂ`"È ¸É ¾È ‚Ò€ÉÎÂÀ}Ë€½ÐÂà$Ò ÄÇÂàÕ ÇÑ€ŸÕÂÀÈÂ>ÆÂÀwÌ€ÃÂ`Ë—Ì ¸ÉÂ`™ÉÂà¹Î€çÉÂDÅÂàÝÈÂ`É€^ËÂ@'ÏÂ`ÎÕ€ÛË \ÎÂÀÖÑÂà$Ò —ÙÂ@ÎÈ VÏ ÙÎÂ`Í pÕÂÀ³Â€FÏ jÖÂöрŠȀÃÏ ÇÑÂ`uÏÂ@9̯ÈÂ`Ë—ÌÂÀÊÂÌÂ@’Ò ßÍÂÀ¦ÙÂ`·Ä€|ÆÂ€ÔáÂÀGÔÂ`iÑÂ`ÚÓÂÀ;Ö ÓÏ d× &×ÂàÅÌ >Ó PÐÂÀSÒÂ@€ÕÂÀ²×ÂØÖÂ`oЀLÎÂ`Ë€óÇÂ`æÑÂ`ÚÓ€ÉÎÂÀÐÒÂÀkÎÂ ÊÆÂöÑÂ@Ó ÓÏÂ`ÚÓ€(ÔÂ…ÏÂ@ŒÓÂ@-ΩɠvÔ XÙÂ`øÎÂ@àÅ |ÓÂÀ*ÄÂ@9ÌÂÌÂ@ÔÇ ²ÊÂ@ÈÉÂàÝÈÂÀ#Ú 2ÕÂ@]ÆÂÐÂÀËÂÀÐÒÂ@’ÒÂÀÊÂÐÂ@?ËÂ`‡Ì€ÖÂÀAÕ DÒ öÞÂÀ/ØÂ ”ÏÂ`:ÄÂ`Ê€½ÐÂÌØÂÀqÍ€¥Ô ”ÏÂà³Ï £×Â@ÑÂÀ¾Õ #ÍÂ`ËÂàxÄÂ@˜ÑÂÀ)ÙÂÀÖÑ SÅ Ç  ÍÂà×ÉÂ@QÈÂ`ÉÂ@3Í ÄÇ€L΀ÕÌ€ÏÍÂ@¼ËÂàõÄÂÀÊÂà¿ÍÂ@ÈÉ PÐÂÀîÍÂ@÷Ö Ï çÖ @ÝÂËÂ`Ë nË ÏÂ@ŒÓÂ`þÍ ÷ÉÂà„ÂÂ`:ÄÂ@!РbÍ€ÛË ÄÇÂàÅÌÂà0Ѐ¥ÔÂÀkÎÂàÝÈÂ` Ì€Ûˀŀ¥ÔÂÍ€·ÑÂÀÇ pÕÂÏÂà§Ñ nËÂàÑÊ ëËÂ`:ÄÂ@?ËÂ@žÐ 8ÔÂÀÜЯȠPÐÂàÕÂ`ËÂ@¶ÌÂ@ÎÈÂ`iÑÂ@˜ÑÂ@Ò ýÈ ^ØÂ[ÖÂ@9Ì 8Ô  ÑÂIÙ€ÕÌÂ`ÉÂ`¥Ç  Í€íÈÂÀk΀LÎÂà×É zÉÂÀqÍÂ`æÑÂÀË€ÿÅÂàZÉÂÀ²×Â@9ÌÂàÅÌÂ@ÑÂ@ÂÊÂ`E× JÑÂ`"È ÿÒÂàÅÌ ˜ÄÂ`“Ê óÔ ÍÐÂ@ÔÇ€ÏÍÂÀ›ÆÂÀ‰É Ѐ½ÐÂ@nØÂÀ¸Ö€4ÒÂ`ËÂà•Ô€4ÒÂà­Ð ÎÂÀGÔÂàÕ ŽÐÂÀwÌÂÀôÌ  ÑÂÀ‰É€RÍÂ`¼ØÂ`ìЗ̠¬Ë ¯ÕÂÀâÏÂàÝÈ 8ÔÂÀÄÔÂàZÉÂÀÐÒÂ\ÁÂÀkÎÂÀôÌ PÐÂ@KÉ ‘ÚÂ`øÎÂÀËÂàxÄÂÌÂ`@àâÂÂÀúË \ΠÓÏ€ÛËÂ@'ÏÂÀeÏ€ìÝÂ@¶ÌÂ`ÉÁ ‚Ò€4Ò€֣ʠÓÏÂ`ÚÓÂà0ЀXÌ€™ÖÂÀGÔ ¸ÉÂ@ªÎÂ`]ÓÂÀ¾ÕÂÀ¸Ö€:Ñ hÌÂÀvá€ÛË ßÍÂ@ÂÊ zÉÂyÑÂà6Ï JÑÂ@'ÏÂÀúË )ÌÂðÒ íÕ ²ÊÂà¹Î‘ÍÂ@’Ò‘ÍÂ`‡ÌÂÍ ÐÂÀ²×Â@nØÂ@t× >ÓÂ@¶ÌÂ`Â×Âà0Р;ÉÂ`ìÐÂ@EÊÂàÔÂà¡Ò€ÕÌ pÕ ØÂ@Ó PÐÂ@3ÍÂЀ·ÑÂÀMÓÂ`WÔÂÀYÑÂ`{ΠÇÑÂ@'Ï€(ÔÂ@ýÕ pÕÂ@Ò €ÈÂà ÖÂÀMÓ´Ü ©ÖÂà‰Ö€@РÐÂÀ)ÙÂÀÊÓÂ7ÜÂ`9Ù ¯ÕÂ@åÙÂ`oÐÂÀSÒÂàîÚÂ@\Û ЀLÎÂÀAÕ€FÏ€ÉÎÂÀ;ÖÂÀÈÂ`cÒ DÒÂ@t×ÂàwÙ€:ÑÂ@-Π8ÔÂ%ß ùÓÂ@ñ×ÂÀÐÒ ŽÐ€ØÂ`°ÚÂ`?ØÂ ÏÚÂ`‡Ì€ØÂU×€æÞÂ`ìÐÂgÔÂÀ5×ÂgÔÂIÙÂ@'Ï üÝÂÀ#Ú ÉÛ€uÜÂ@ÕÂ`Â× äáÂàqÚ€RÍ€]à ÃÜÂ=ÛÂÀíâÂÀ Þ€cß ½ÝÂ`¼ØÂ jÖÂÌØÂÀÐÒÂ@†ÔÂÀGÔÂÀÄÔÂ@ëØÂ 2ÕÂ`ß 4߀™ÖÂÀ)Ù®ÝÂ@EÊÂ@¤Ï XÙ€uÜÂØÖÂ@nØÂ JÑÂ@ÈÉ á×ÂàYÞ€4ÒÂÀ¾ÕÂÀ”ÜÂÀùàÂÀ¸Ö pÕÂÁÅÂà‰Ö vÔ ÓÏÂÀÐÒÂ`cÒÂà›ÓÂ@\ÛÂ`9Ù€ Ù ÒÂÀîÍ ÁÒ€ÚÂà0ÐÂàƒ×Â@€ÕÂÀSÒÂÀÊÓÂ`òÏ€ÃÏ€ØÂ ÛØÂ >ÓÂà³Ï€ØÂ ,ÖÂÀÆÂÀSÒ ÙÂÀ5×ÂÀ¦Ù€±ÒÂ`ÔÔÂ`E×Â`oР¯Õ ÎÂà¡ÒÂ@ÈÉ€pÈÂРùÓ šÎÂ`{Π‘ÚÂÀSÒÂ`E×ÂÌØÂÀîÍÂU×Â@Ó  Ñ ЀæÞÂ@JÞÂàƒ×Â@Ó DÒ ÞâÂÒ×Â=ÛÂ@ÙÛºÛ€.Ó€ØÂ jÖÂà ÖÂU× sß  ÑÂ`øÎÂ@ýÕ ‘ÚÂÀ)Ù áע߀ìÝÂ`-Û ÕÙÂ@ŒÓ 2Õ€ØÂ€¥ÔÂ@ÕÂ`°ÚÂ@>àÂÀGÔÂàkÛÂyÑÂ@!ЀØÂ`iÑÂyÑÂàØÂ€{ÛœàÂ@ÁßÂ ÛØÂ £× ‚ÒÂ`9ÙÂ`ìÐÂ`E× µÔÂ@ ÔÂüÐÂ@ Ô ¦Ì ùÓÂäÔÂЀòÜ çÖÂmÓÂ+Þ€‡ÙÂ[ÖÂ@'ÏÂ@PݨÞÂàÐßÂÀ;ÖÂà‰ÖÂ@\Û RÚÂàqÚÂÀÜÐÂCÚÂ@åÙÂÀšÛ€QâÂÀÚÂÀÐÒÂà›Ó íÕÂ=ÛÂÀeÏÂ@žÐÂ@˜ÑÂÌØÂÀ¸Ö ‹ÛÂÀŽÝ€ Ù€{ÛÂÀ‚ß ßÍÂ`:Ä JÑ¢ßÂ@ëØÂ ,ÖÂ`ÚÓÂÀYÑ 8ÔÂgÔ€ŸÕÂ`WÔ ¯Õ d×Â`òÏ€ŸÕÂÀqÍ€Ú€ ÙÂÀŽÝ€iÞ XÙÂ`KÖÂ`ªÛÂ@'ÏÂ@nØÂÌÂàÕ€ÔáÂCÚÂà}ØÂàâÜ€ ÙÂÀçãÂàYÞ ÁÒÂà›ÓÂà ÖÂ@—æÂ`-Û ˆÑÂ@ÑÂ@!РðßÂ`-Û vÔÂàËËÂ`߀RÍ©ÉÂ@ñ×ÂÀAÕÂ@Ѣ߀]àÂ=ÛÂ@ªÎ á×€ØÂÀ ÞÂàèÛÂÀ)Ù€oÝÂÀ¬ØÂàÔÂÀÚÂÒ×€KãÂ@bÚÂÀŽÝÂàÊà€ØÂ`¶ÙÂàôÙÂ@]ÆÂ`{ÎÂÀ¸ÖÂ+ÞÂ`¥Ç ÚÂÀ|à FÜÂÀ)Ù šÎÂ@åÙÂÀwÌ€ÃÏ RÚÂà•Ô€FÏÂà‰ÖÂÀ²×€FÏÂ`iÑÂà}ØÂÀÛ 8Ô ÓÏÂ`uÏ ØÂ »ÓÂ`Œà€Kã ÞâÂ`9ÙÂÀÜЀ™ÖÂ@¤Ï pÕÂà}ØÂ`°ÚÂ@åÙÂàØÂÐÂÀË€ÚÂàÜÝÂ@ ÔÂàYÞÂ@†ÔÂaÕÂ[ÖÂà×ÂÀ_РšÎÂU× d×Â@zÖÂÀ;ÖÂ@€ÕÂöÑÂÀÖÑÂ`àÒÂØÖÂÀ‚ß šÎÂÀ¬ØÂ@zÖÂàúØÂ@ýÕÂ`ÈÖÂ@ÕÂ@ŒÓÂ1ÝÂOØÂ€çÉÂÀ;ÖÂÀÊÓÂàîÚÂÀSÒÂ`ÎÕ€±ÒÂ`cÒÂ`ÈÖÂ[ÖÂ`'ÜÂΠDÒ€ØÂàúØÂ »ÓÂ@ÙÛ€(Ô€þÚ€(Ô€±ÒÂöÑ€ØÂÀ¬ØÂ@ ÔÂà×ÂÀâÏÂ`WÔÂàwÙ ÛÂ@ñ×Â@žÐÂ[ÖÂ@\Û ÇÑ á×ÂàØÂàƒ×ÂàîÚÂàwÙÂ@-ÎÂÀÚÂà}ØÂ`ÎÕÂÀqÍÂÀâÏÂ@¤ÏÂU×Â@ÍÝ€{Û |Ó€"Õ€iÞ pÕÂÀeÏÂ`]ÓÂ`uÏÂÀ•ÇÂ@ÓÂÐÂxæÂà¹Î Ë PР¤Â ÎÂ@-ÎÂà$ÒÂOØÂsÒÂ`ÍÂÁÅÂ`uÏÂ@ÔÇÂÀÊÓÂ…Ï€:ÑÂÁÅÂÀ5×Âà*Ñ PÐÂ`iÑ€:ÑÂÀ5× MÆÂà¹Î€(Ô \΋ΠˆÑÂÀ;Ö ÇÂ@ÂÊÂà­ÐÂà­ÐÂàHÌ VÏ ‚ÒÂàBÍÂ@¼Ë£Ê€"ÕÂ@’ÒÂàûÃÂ`QÕÂ ÛØÂ€Ö‹ÎÂ`æÑÂ`-ÛÂÀ‰É€ØÂË©ÉÂ`øÎ€ÃÏÂÀk΀±ÒÂÀqÍ€^ËÂ@ÓÂ&Ê  Í€dÊÂÀYÑ 8ÔÂÀ_ÐÂ@3ÍÂÀqÍ€çÉÂàÅÌ»ÆÂ@†ÔÂ`™É ÒÂ@ÁßÂÞÕÂ`E×ÂÐÂàôÙÂÀîÍ€ÛËÂàãÇÂ`þÍÂà$ÒÂà›ÓÂÀÖÑÂaÕ ÇÑÂ`uÏÂ`¼ØÂ ÜàzÉÂ[ÖÂ`Eב͠ Ñ€vÇÂà ÁÂàîÚÂ`E×ÂÀGÔÂÀÐÒ€ŸÕÂ@˜ÑÂ`ÍÂ…Ï€ÁÂà<ÎÂ@Ò PÐÂ@ÂÊ bÍ íÕÂÀÊÓ #Í SÅ€4ÒÂ@˜ÑÂ`¥ÇÂàéÆÂÀkλÆÂ ÓÏ šÎÂ@ÈÉÂàûõÇÂ@9Ì€^Ë€ÏÍÂ`oРÄÇÂàËËÂà6ÏÂ&ÊÂ`‡ÌÂ` Ì ¬Ë£Ê€½Ð |ÓÂ@˜ÑÂÀGÔ£ÊÂ`þÍÂàãÇÂ@àÅÂÀôÌ /ËÂ&ÊÂÀÊÂ`ìÐÂgÔÂÀ›ÆÂ€pÈÂ@ÙÛÂêÓ€^Ë‹ÎÂ,ÉÂà0РbÍÂ`4Å Ò ÐÂà×€dÊÂ@ÈÉÂà6ÏÂàHÌÂ@'ÏÂ`4ÅÂ`¥ÇÂÀ}ËÂ@ŒÓÂ`øÎ /ËÂ ÊÆÂàlÆÂ»ÆÂÀÊÓÂÀúËÂÀ_ЀÿÅÂ@]ÆÂ@Õ€ÛËÂU×€LÎÂÀwÌÂ`øÎ€^Ë ’ÅÂÇÄÂР²ÊÂ` ÌÂÀÖÑ ÁÒ ØÂÍ »ÓÂÀÜÐÂÀÊÓÂ@Ñ€:ÑÂÀ‰É ÄÇÂ`.ÆÂ`æÑ€«Ó GÇÂ` ÌÂ@t×£ÊÂàrÅÂÀâÏ€ˆÄÂà0ÐÂ`Í€jÉÂÀ ÉÂÀAÕÂ`Â×Â@!РPЀÏÍ€þÚ zÉÂÀYÑ ;ÉÂ@!ÐÂÀ;ÖÂÀÈ€íÈÂ`àÒ ¾È—̋΀dÊÂÀ5× zÉÂ@ÈÉÂ@!ÐÂÀ/ØÂÀ¡Å SÅ tÊÂ`æÑ€cßÂÀAÕÂÀÄÔÂ@ÕÂ@'Ï ‚Ò ÐÅÂ`“Ê€.Ó€(ÔÂ`iÑÂIÙÂÀAÕ 2ÕÂ`3Ú ÿÒÂ@hÙÂàÜÝÂÌ 2ÕÂà*ÑÂ,É èÁÂ`uÏ PÐÂsÒÂàãÇ€·ÑÂÀeÏÂà0Ѐ.ÓÂÀ¿À )ÌÂà³ÏÂÀk΀ÖÂ@ýÕÂ@ÚÆÂ€·Ñ ÁÒÂàãÇÂàØÂ Ƞπ«Ó€ÃÏ (áÂàƒ×ÂÀâÏÂà¿Í åÌ 8ÔÂ`ìÐÂÁÅÂàBÍ &×Â`Â×€:ÑÂÀÇÂà‰Ö€uÜÂ`9ÙÂÍ€:Ñ€þÚÂöÑ€4ÒÂàBÍÂàNËÂ`(ÇÂÀ$ÅÂêÓ€ÃÏÂÀ}Ë 2Õ ýÈÂ`Û¾Â`Ë ”Ï€|ÆÂ€@Ѐ@ÐÂÀ#ÚÂÀÈÂàÝÈÂÀÖÑÂÀqÍ SÅÂ@'ÏÂ@ÎÈÂà×ÉÂÍÂÀMÓÂ@!ÐÂÀ}Ë»ÆÂ@ÂÊÂ`ÉÁÂ`‡ÌÂÀËÂ@¶Ì€ŸÕÂÀSÒÂÀ0ÃÂ@-ÎÂÍÀ‡Ù \ÎÂ[Ö ?¾Â¯È ñÊÂàÅÌ zÉÂ`]Ó»ÆÂ`(Ç Å \΋ÎÂ,É€çÉÂà¿Í _àÖÄÂàÑÊ€íÈÂà0ЀÖÂ`iÑÂ`ÚÓ€çÉÂêÓÂ…ÏÂ`·ÄÂ@QÈÂ,É #Í †ÇÂà§Ñ ÄÇÂàØÂ ¾È£ÊÂÀAÕÂÀeÏ€vÇÂJÄÂ`ÉÂDÅ ÇÂÀ›ÆÂ€^ËÂ`oÐÂÎÂàËË #Í€ÕÌÂ@ÒÂÎÂ`øÎ€ÏÍÂà³Ï€.ÓÂÀâÏ»ÆÂ`{ÎÂàÅÌÂ@?Ë ëËÂÀÈ nË ¬ËÂÀôÌÂà6ϯȠëËÂ`QÕ РžÃÂ`ÈÖ VÏÂÀ‰ÉÂ` ÌÂ@iÄÂ`òÏ ŽÐ †ÇÂÀÅ¿ÂàéÆÂàNËÂ`X¿ÂàxÄÂÀÈÂàôÙÂÀkΠˆÑÂ@?Ë ÇÂàõÄ€XÌÂ@QÈ€ ÄÂÀÊ ”Ï qÀ©É£ÊÂ`ÊÂà6Ï ΀íÈÂ@ìÃÂV€áʯȠåÌ ýÈÂàNË€^ËÂ`ÏÀÂ@WÇÂ@¼Ë€FÏ ¶¿Â ÐÅÂÀ›ÆÂÀ_ÐÂÀÈÂàrÅÂäÔ ÐÂàÝÈÂ`ÉÂ>ÆÂ åÌÂÀôÌÂÀGÔ ÁÒÂ@ÈÉÂ2ÈÂ`«ÆÂ PРíÕ ,Ö ^ØÂ€”€vÇ hÌÂ@ÔÇÂ`Ê ëËÂ=Û€ÉÎÂ`uÏ€ÿÅ ùÓ bÍÂ`øÎ ¦Ì€jÉ€áÊÂ@ÑÂ`“Ê‹ÎÂ`òÏÂÀÖÑÂÀôÌÂÀÆÂàBÍÂyÑÂÏ€XÌÂÀË nËÂÍÂ`±ÅÂà„ÂÂ@ò€^ËÂÎÂ@KÉÂÀkΠóÔ€@ÐÂ`™ÉÂà¡ÒÂ@3ÍÂ,ÉÂ`þÍÂ@ò€dÊÂà$ÒÂÀ•Ç ¦Ì ”ÏÂà6ÏÂ`ÚÓ€@ÐÂ`øÎÂ`“ÊÂà¡ÒÂÀ_ÐÂ`àÒ SÅ€ÃÂ@-ÎÂà‰ÖÂÌÂ@cÅ ˆÑ€Ö€ÃÂ`ÊÂ`:Ä€jÉ ÙÂ`«ÆÂ@EÊÂ@ªÎÂàxÄÂ`4ÅÂ`ÊÂÀeÏÂÀËÂ8ÇÂ@°Í ÐÅ hÌÂ`™É PÐÂÀƒÊÂàHÌÂ`ìÐÂà¹Î ÒÂ@!ÐÂà•ÔÂ`WÔ zÉ åÌÂÇÄÂ@ŒÓÂ@'ÏÂàÓÂ@ìÀjÉ‘ÍÂÀYÑÂmÓ€XÌ€ÏÍ _ÃÂ@àÅÂ@]ÆÂÀYÑ PЀŸÕ€4Ò ÄÇÂàãÇÂÀqÍ€ÕÌ€vÇÂ` Ì Å ÓÏÂàÅÌÂ`ÚÓÂàlÆÂ€‚ÅÂÀ›ÆÂ€LΣʣÊÂÀÖÑ ©ÖÂöÑ€«Ó hÌÂàxÄÂàÝÈ ²ÊÂ`ËÂÀ‰É ñÊ ¬Ë ¸ÉÂà6Ï€4Ò ÅÂÀÜРÇÑÂ@¼ËÂØÖÂ@-ÎÂÀÈ 5Ê ÄÇÂ@åÙÂà<ÎÂ`ËÂ@9ÌÂ`{ÎÂ` ÌÂmÓÂÍÂÀÊ€½ÐÂËÂ`iÑ ;ÉÂÐÂsÒ€jÉÂÀ}Ë ‚Ò †ÇÂÏÂÀâÏ€(ÔÂ@€ÕÂÀ_ÐÂ`™É€óÇ€XÌÂÀèÎÂÀwÌ€^ËÂ&ÊÂ`“ÊÂàéÆÂÀË nË ¦Ì€.Ó€ÉÎÂË€±Ò ØÂ ÁÒ€çÉÂ@ÔÇÂ@°Í ØÂ@ÈÉ€çÉÂ`ìÐÂÀ}Ë€íÈÂ`@ÃÂ@ÀÂ`Ë€ŸÕÂ`ÚÓÂ@3Í€RÍ ¦ÌÂÀÈ ÿÒÂ`æÑ ;ÉÂmÓÂöÑ ÓÏÂ`ÎÕ ËÂ@¶ÌÂÀMÓ 2Õ  Ñ DÒ€ÕÌÂÀÖыΠ²ÊÂÀâÏÂΠÏ€XÌÂÀÖÑÂ@˜ÑÂÀ$ÅÂ@cÅ ÈÂà‰ÖÂÀ5×ÂÀ‰É ÇÂmÓ ˆÑÂÀwÌ€ÃÏÂàéÆÂÀ²×ÂàËË€FÏÂà¿ÍÂ@t× >ӀŠ÷É€@ÐÂà×€dÊÂ`uÏÂÀÖÑÂàËËÂ`ÉÂÏ€ÉÎÂÀË ŒÆÂ`(Ç _ÃÂ@3Í€vÇ hÌÂ`¥ÇÂÀ¸ÖÂÀÚÂ@ÒÂ@†ÔÂÀkεÇÂ@“½Â`¥Ç€·ÑÂÎÂ@QÈ zÉÂ@KÉÂ@àÅ ùÓÂà¾Â@ÀÂà­Ð€ÿÅÂÀqÍÂ@°ÍÂÀ6€ÏÍ PÐÂ@ÂÊÂÀúËÂà<ÎÂ…ÏÂë¾Â ÁÒÂà¹Î€™ÖÂÀôÌÂ@oÃÂÀwÌÂ@‡¿ÂàZÉÂ@?ËÂÀÇÂÀ¡ÅÂÀúË€çÉÂ`Ê€|ÆÂ`‡Ì€ÃÂ@ìÃÂÇÄÂÀqÍ ‚Ò ”Ï ¤Â€ùÆÂ ñÊ€dÊÂÀH¿Â zÉÂÀÊ€ÃÂTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°w (TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHEAPX ¨datadescription8  @œhq·—NM€SNODX X¨(dt ?@4 4ÿxunitsyunitsÿÿÿÿÿÿÿÿhy (·—NM (CLASSTABLE (VERSION3.0 8TITLEDescription of sec2 0 FIELD_0_NAMEdt 0 FIELD_1_NAMExunits 0 FIELD_2_NAMEyunitsàŠÁÂ@À€XÌÂÀËÂ@¥ºÂµÇ€çÉÂ`™ÉÂ`RÀ ¸É‘ÍÂÀôÌ _àîÀÂà¡ÒÂà³Ï MÆÂ`òÏÂÀƒÊ ßÍÂ`"ÈÂ`4ÅÂ`½ÃÂ`4ÅÂ@ÂÊ€ùÆÂ÷¼Â@þÀÂÇÄÂ,ÉÂÀ¹Á ªÁ€ŽÃÂðÒ€pÈ Üà‚ÒÂÀËÂ@ÎÈÂ@ ¿Â€ ÀÂÀ0ÃÂà èÁÂ`ÊÂ`òÏÂ`àÒÂ@WÇ ÇÂñ½ÂßÀÂàéÆÂ@ÚÆÂ` Ì€ÂÂÀôÌ€íÈÂÀƒÊ !ÃÂÀeÏÂ@WÇ ÆÂ`^¾Â»ÆÂÀÊ€à÷ÉÂ@3Í †ÇÂ@··ÂÀN¾ÂàfÇÂ`{Π¸É ÆÂÀ$ÅÂ@!Р€ÈÂDÅÂàÀ€ÂÂ`F ²ÊÂ`d½Â /ËÂÀ$ÅÂÀÆÂyÑ GÇÂÙÁÂ`ìÐÂ ÊÆÂà$Ò 5ÊÂÀkÎÂàÀ 3ÀÂ`øÎÂ`ͯÈÂ`^¾Â€XÌÂ`ÉÁÂÀ‰ÉÂ@òÂÂÀÈÂ@˜Ñ€·ÑÂÀ¡ÅÂàûÃÂ`LÁÂ`“Ê€pÈÂàrÅÂ,ÉÂ@ÎÈ»ÆÂ`«ÆÂ€ÏÍÂ@{ÁÂ`«ÆÂ _ÃÂ`·ÄÂÀÈÂàfÇÂ@ ¿Â@þÀÂÀ¹ÁÂ`"ÈÂVÂÂ@ÔÇ ¶¿ÂÎÂ`ÈÖÂ`‡ÌÂ@¼Â ºÂ,ÉÂ`ÉÂàÑÊÂðÒ ¦Ì îÀÂÀƒÊÂÀ}ËÂà­Ð >Ó èÁÂ@KÉ ¤ÂÂà¾Â`á½Â ÏÂ@ÂÊ€RÍÂÀôÌ ’ÅÂÀ}Ë ú¾ÂÀÜÐÂÀ›ÆÂÌÂà¿Í€@ÐÂ@9ÌÂÀkÎÂ@¾ÂJÄÂ`™ÉÂ` Ì nË€ÛËÂÐÂ`½ÃÂ`Ë ÆÂ tÊÂ@EÊÂ@EÊÂ@ÎÈ€pÈÂà³ÏÂàTÊÂ@¼ËÂÀÜÐÂÀSÒÂÀÖÑ€ ÄÂÀYÑ»ÆÂ` ÌÂÀÈÂàËËÂ@9Ì Ù È ”ÏÂ@?Ë #ÍÂÀÐÒÂ@’ÒÂà<ÎÂà ÁÂ`á½Â€(ÔÂÏÂ@ÈÉÂ`"È ˜ÄÂ@EÊ ¸É€‚ÅÂ`]Ó >Ó€.ÓÂ@¼ËÂ@žÐÂ@ÀÂÀGÔÂ@¼ËÂàwÙ åÌ€çÉÂ@ÙÛ :ÞÂ`þÍÂ`‡Ì >ÓÂÀƒÊ hÌÂ`"È bÍÂ`Ë ÏÂàwÙ€«ÓÂ`"È€ÕÌ€{ÛÂàïÅÂÀkÎÂ@¶ÌÂ@QÈÂsÒÂÀ}Ë 8ÔÂÀŽÝÂÀîÍÂÀ˾¯ÈÂà•ÔÂ`‡Ì€LÎÂà³Ï ùÓÂ@°ÍÂà§ÑÂÀÄÔ 8Ô óÔÂ&Ê€ÉÎÂÌÂÀ}Ë åÌÂ`ÎÕ ÿÒÂÀ5×€ÚÂgԠǵÇÂÀîÍÂCÚ  Í—Ì ˆÑÂmÓÂàÃÂÇÄÂ@€ÕÂÐÂÀGÔÂ@åÙÂÀeÏ»ÆÂ`ʩɠ÷ÉÂ@?ËÂ`þÍÂà_ÝÂ@ÕÂ@’Ò zÉÂ ÊÆÂà}ØÂÐÂ`QÕ ÙÂà6ÏÂ@ÎÈ ÁÒ€@ÐÂÀYÑÂ@t×Â`ÚÓÂ@Ó€:Ñ€XÌ€RÍÂäÔÂÀqÍÂÀ É€@ÐÂà$ÒÂ`þÍÂÀ_ЀùÆÂÏÂ…Ï €ÈÂ@-ΠÒ óÔ ÇÑ åÌÂ@3ÍÂ@Ó ÷ÉÂ@3ÍÂÀÐÒÂ@iÄÂ` ÌÂÀ0ÃÂÀwÌÂàHÌÂÀúËÂàBÍ €È€¥ÔÂ@ªÎÂÀ ÉÂà`ÈÂ@EÊ ÍÐÂÍÂ`‡ÌÂ…ÏÂ@-ΠnË€½ÐÂ`½ÃÂ`ÍÂÀîÍ€|ÆÂ zÉÂÀÈ—Ì ’Å DÒ VÏÂ@!РÒÂàËË€ˆÄÂ@øÁµÇÂÀeÏÂÀwÌ åÌÂ`¥Ç kÁ èÁÂ@]ÆÂàrÅ€ÃÂ@ÚÆÂàÅÌ€dÊ ²ÊÂ@3Í ÐÅÂà›ÓÂÀÊÂÌÂàÀ ÈÂ` Ì€ÿÅ€^Ë ÅÂ@žÐ /Ë  Ñ€ÅÂÓÂÂÀúË jÖÂà³ÏÂ@øÁÂàËËÂ@¤Ï -ÁÂÍ ¯ÕÂà„ÂÂà¹Î šÎ€íÈÂàÝÈ PРQ»Â€:Ñ ¬ËÂÀîÍÂ@žÐÂ@¤ÏÂ`É€áÊÂ@ÈÉÂ@WÇ 2ÕÂ`ÉÂ8ÇÂ@™¼Â,É Ç ËÂÀ¿ÀÂàNËÂÀ5×Â@!ÐÂÍÂ`‡Ì €È hÌ šÎ€íÈÂÀwÌÂ`"ÈÂ@9ÌÂ=ÛÂ@EÊÂÌ ²ÊÂmÓÂÀÝ»Âå¿Â`KÖÂàHÌÂà„ÂÂàŠÁ€ ÄÂ@àÅÂÎÂ`ËÂÀwÌÂ`RÀÂÁÅ€@ÐÂàrÅÂ@EÊÂ@ÂÊÂüÐÂàNËÂ`"È€ÃÂ`ç¼Â ÖÄÂàZÉ ¾ÈÂÀYÑ ÄÇÂÀÇ€.ÓÂ@¼ËÂ`(ÇÂÀËÂà<ÎÂ@EÊÂ@¶ÌÂ@QÈ»ÆÂ€‚Å€áÊ ©Ö MÆÂ€“×€óÇÂ`cÒ€‚ÅÂÀ6ÂÂ`.ÆÂ`.ÆÂ`:Ä€ÏÍÂàÂÂàHÌÂ`ÊÂÀÅ¿ÂÀkÎÂÀÇÂ`Ë Ë ÒÂÀeÏÂ…Ï ÐÅ YÄÂÀqÍÂÀYÑÂ@ÎÈ€çÉÂàxÄÂÀÆÂ€ÕÌÂ`.ÆÂå¿Â`LÁÂÀÊÂ@øÁ€ùÆÂàÝÈÂÀÈ€²½Â`‡Ì PÐÂÀÈÂ`ŸÈ ¸ÉÂàãÇÂÇÄ€çÉÂÀ$Å€ Ä€óÇ ˆÑ tÊÂÀ•ÇÂÍÃÂÀ˾ÂmÓ nË€RÍÂÀ­ÃÂêÓ Ï MÆÂ€šÁÂÀË€^ËÂ&Ê È ¯ÕÂÀËÂ@æÄÂ@ÚÆÂÍàMÆÂÍÃÂÀ•ÇÂ@àÅÂÌÂÀ§Ä€çÉÂÀèÎÂÀqÍ ÍÐÂüÐÂ2ÈÂ ÊÆÂ ÖÄ ÍР’ÅÂÀ²×Â`·ÄÂ`·ÄÂàÓÂ ÊÆÂ ŽÐÂ`ìÐÂÀâÏ ˜ÄÂ`.ÆÂàÃÂ@EÊÂ`Í ÍЀÃÏ ßÍÂÀ$ÅÂ@oÃÂà`ÈÂ@ÂÊÂàrÅÂ`øÎ /ËÂ`ÊÂ@àŵǠ'ÂÂ@øÁÂ`X¿Â`Í ¸ÉÂàïÅ€pÈÂàlÆÂ€ùÆÂ@-ÎÂ@\Û 2Õ zÉÂ@oàSÅÂ\Á /ËÂ`@ÃÂÀkΠPÐÂ@?Ë ¾ÈÂÀÐÒÂÀkÎÂ@QÈÂ@QÈÂàHÌ€@Ѐ:Ñ ¸ÉÂ@ÎÈ tʯÈÂ`Û¾Â&Ê ÇÂÀË ¬ËÂ`:ÄÂ`iÑ‘ÍÂеÇÂ>ÆÂÀeÏÂ@òÂÂ@ÚÆÂÀ ÉÂÀÈÂÎÂÀ•Ç SÅÂÀ$ÅÂÀÇÂàfÇÂ ÊÆÂÀîÍ bÍÂ@ÎÈÂà¾Â`òÏÂÀqÍ ÆÂ MÆÂÀ*Ä€íÈÂàÑÊÂÀ³ÂÂ`Ë hÌÂ`á½Â€jÉÂ`òÏÂËÂ@QÈÂ@àÅ hÌÂàZÉÂÀ ÉÂ@ÈÉÂ`ÊÂàTÊÂÀúËÂ`ÔÔÂ@uÂÂ@KÉÂ@°ÍÂàTÊ ÇÑÂ`Í£ÊÂ@9Ì PРSÅ€”ÂÂ@'Ï ÄÇÂÀѽÂÀƒÊÂÌÂ@˜Ñ€@ÐÂ`«ÆÂ`(ÇÂ@ªÎ â€GºÂ@ŒÓ MÆÂÀ*ÄÂ`uÏÂ@9ÌÂàÂÂ`·ÄµÇÂ`ËÂ@]ÆÂÇÄÂÍ ΀ÏÍÂ@WÇ€@ÐÂ@]ÆÂ€ À 3ÀÂàãÇÂ@iÄ ÏÂ@ìànË GÇ ”Ï€ÕÌÂ@?Ë žÃÂ@ÈÉÂÌÂ` ÌÂ`]Ó€áÊÂ@ŒÓÂÀÊÂЀL΀|ÆÂ€RÍÂ`cÒ€pÈÂÀ¹ÁÂàÅÌ #ÍÂà–¿Â`ÉÁÂ`Í€ÉÎÂ@ýÕÂàfÇÂÀqÍÂÀúËÂ`ÍÂ@ªÎ ;ÉÂ@ÚÆÂàZÉ ÷ÉÂPÃÂàéÆÂàÅÌÂ@ìÃÂ@3Í€jÉÂ@WÇ ªÁ ýÈ ÐÅÂÀeÏÂàZÉÂ@-ΠÙΠVÏÂà$ҋ΀áÊ ˜ÄÂÀËÂÀ É€XÌÂàÝÈÂÀ ÉÂÀ¡ÅÂÀk΀±Ò zÉÂ@QÈÂÀwÌÂÀ­ÃÂÀ­ÃÂPÃÂ`¥Ç€™ÖÂÇÄÂàlÆÂÀ›ÆÂ@9ÌÂÀ}Ë€ÕÌÂÀ­Ã ÁÒÂ,É YÄÂ@KÉÂ`ŸÈÂÀ•ÇÂÀ­ÃÂ`޶Â@EÊÂàÂÂ@ÎÈÂàfÇ€ÁÂ`"ÈÂàZÉÂ@øÁÂ@ ¿ÂÀwÌ íÕÂ`™ÉÂËÂ@ÎÈ€^Ë ÆÂ SÅ ¾È‘Í ýÈÂ`™É åÌÂÀ_ÐÂà`ȯÈÂ`™É ;ÉÂ`í»Âà kÁ€vÇÂ`“Ê qÀÂ@KÉ GÇ€ÏÍÂà¹ÎÂ@EÊÂ@t× hÌ—ÌÂ`Õ¿Â ÊÆÂ qÀ ¸ÉÂJÄÂ@àÅ íÕÂ`ÍÂÀ<ÁÂàûÃÂ`^¾ÂàrÅÂgÔÂÀ}Ë ÄÂàlÆÂ@uÂÂ@æÄÂÍÂ`«ÆÂ †ÇÂ@{Á¯ÈÂà<ΠýÈÂÀƒÊÂmÓÂÌÂ`:Ä ô¿Â@]ÆÂÀ;֠ĀÃÂ&ÊÂÀÊÂÀ§Ä ²ÊÂÀÜÐÂ`ìЀáÊÂ`.ÆÂ@¶Ì€ÛËÂÀSÒ YÄÂ`ÀùÆÂàxÄÂËÂÀ¹ÁÂÙÁÂ`RÀ€^ËÂÀâÏ ²ÊÂÀeÏÂàHÌÂ`4ÅÂÀ_РhÌÂÇÄÂÀÇÂàÅÌ •ºÂ VÏÂàÅÌÂÀ­ÃÂ`ÉÂÀÐÒ€:ÑÂ@¶Ì€ŽÃÂ@?ËÂàTÊÂ`'ÜÂ`iÑ ËÂ@àÅ€@Р\΀ÃÏÂ@ÂÊÂÏ ‚ÒÂ`{ÎÂØÖ ÄÇÂÀwÌÂyÑÂÀôÌÂÀ}ËÂsÒÂ`æÑ #Í€«ÓÂ@žÐ€áÊÂ@°Í Ù žÃÂ@¤Ï VÏ #ÍÂØÖÂ`Â×ÂÀGÔÂà­Ð€ÉΠíÕ üÝÂ`ÔÔ ëË ½ÝÂ`E×Â`ÎÕÂ`ÍÂ@¶ÌÂÀ#ÚÂ`øÎÂÌØÂ€þÚÂ@'Ï€½Ð€øÛ€Ú€þÚÂêÓÂgÔÂ`¼ØÂàÔ JÑÂÀ#ÚÂyÑ 8ÔÂà$ÒŠãÂ@ÙÛ ÁÒÂÀ)Ù 2Õ :ÞÂÀÚ ÇÑÂÀ5× ݢߠ‹ÛÂ@ñ×Â@ÕÂ@t×Â@÷ÖÂÆÙÂ`¼ØÂÀAÕÂ@PÝÂ@ßÚÂ@ßÚÂ@÷ÖÂ@\ÛÂ@JÞÂÀŽÝ®ÝÂÀ¸ÖÂ@bÚÂ7Ü ÕÙ€ÈãÂ`ÎÕÂÀ²×Â@DßÂ`¤ÜÂàÂ`ÎÕÂ@ñ× £×ÂÀGÔ€oÝ„äÂÀváÂàšè ÝÂàîÚÂà_ÝÂ@bÚÂàÊàÂ@&ä .àÂÀùàÂ[ÖÂÀGÔÂâÂ`˜ÞÂ@»àÂ`ÞÂàwÙÂÀ;ÖÂÌØÂ@€ÕÂ@8áÂà)æÂàwÙÂ`tä€ÚÂÀùàÂ`à &× OåÂÀdä¢ßÂà²äÂÀ#ÚÂ@ÁßÂà”é ÏÚÂ`€âÂ7Ü€oÝÂ`Œà ûò ÒäÂàˆë®ÝÂàâÜ Àç …ÜÂà¦æÂ€!ê  æÂ´ÜÂ@¯â ÀçÂxæÂ  æÂà²äÂ0ò çÂ`nåÂïçÂ~åÂ`bç€Kã ué€ìÂÀÛÂrç€9æÂÀò Þ․éÂ@öëÂà ë .à€ÓöÂ`—óÂ`©ðÂÀLèÂ`hæÂËíÂ@míÂÀòÂ@êÂ÷‰øÂ@¢ù€JøÂ@Ìò Ý÷€¯üÂà™ý€£þ €ü `÷ÂÀ9À£À&þÂ`[ý€ÃàþÂàÿÂ`ÆÃð+ÃÀ3ÃÀÔûÂ@üÂÖÃ0EÃÜÃàÃGÃÐHÀð ÃP™à÷àÙà ›Ãпðà\ÃP ÃÀ¤ÃÀªþÃ5 ÃPàJÃëÃð~ Ãð7àhÃÙ Ãà] Ã@Ñ Ã€Þ Ã°_ Ãp½ ÃpjÃ@ûì ÃYÃpçÃÐfÃ0°ÃPø àÙÃàiÃàΠàVÃ0°ÃÜÃ@< ÀÈ ÔÃPu Ã`œ Ãà» Ãà] ðôÃàÔ Ãà¼Àä ãÃÀ Ãÿ Ãà?à ÖÀ[ à ÊÃÀtÃÐÀºà© à ÃàÔ Ã@Ãp(ÃÇ Ãà°ÃÐîÃÀý Ãóà ÖÀÆà ÜÃPÚÃð¹ÃÀÇÃ@­Ã@Ã0\à…Ã@}ÃçÃ`ïÃ@úÃÃp‡ÃP¶Ã0bÃÐqËðšÃàtÃð¡Ã`0Ã0»Ã@qÃüÃÉàÒÃ`¿ðÀÃвÃð Ã`­ÃàbðˆÃPŒÃPb"à ÃðÃàtà=ÀïÃÀÃ@ÐÓÃÀ»ÀlÃàÙÃaÃàhÃÀ Àã ÀlÃàtÃðÃØÃ"ðvà p!Ã@Ä ÃÀ—Ã`­ÃÃÀö"Ã`!à ùÃàëÃ@ÊÃàÇ"Ã0 Ãðô!Ã@¾!ÃÀ‹Ãø#ÀÝ!Ãðô!Ã@Ä Ã°½%ÃPtÀõà1!Ãp€*Ã`$ÃPh!ÃÀ['Ã@kà á#ÃÀs#Ù"Ã( Ãp9!à+"ÀN$à Û$ÃàV ÃàÓ ÃàÙÃpÂà á#Ãp-#ð@%à®!Ã@Ä Ãp¼ Ã0%ðL#Ã°Û Ã`!Ã{#Ã@Ä Ã0%Ãà©'Ã0£ÀÑ#ÃÀê$Ãðe$Ã0#ð^ ðjÃÀs#à d#Ã` "Ãp? à v Ã(Ã$ß!Ãp? ÃQ*Ã`î&Ã0…$Ãp†)à F(ð4'Ã0%Ã{#Ã1%à Û$ÃðG)Ã0ê(ÃpŒ(Ã1%Ãà©'Ã`Ö*Ãpý*àï+à +ÃK+ÃðG)à L'ÃE,Ã@”(Ã@(Ã`Ð+Ã~-Ãà&(à–%ÃðS'Ãà¯&Ã0ê(ÃÀÒ(ÃÐ|(ÀB&Ãp†)à ±+Ã`è'Ãp )ðþ/Ã`ô%à 4+Ã`Ä-ÃÐ^-ÃÎ.Ãà)Ã@j/Ãpn-ð,Ö)à L'Ãp*Ã@‚+à ±+ð±'Ãà,'ð“,Ã0m(À­)Ä,Ã@š'ð+Ão)Ü(Ãp )Ã@(Ã](Ãp!%ÃÀê$Ã@ &Ãp’'ÃpŒ(Ã],à d#ð·&à Ã(Ãà¯&ÃPJ&ô$à d#ÃÈ+ÃÎ*ÃÀê$Ã`‰"Ã`w%ÃÀÀ+Ãp’'À`!Ãp’'ð±'ÃðY&ðÉ#ÃðÐ'Ã`î&à)Ã`e(ÃP8)ð.(ð^ Ã%'à~)ÃÐù(Ã@(ÃQ*Ã@/$à @)Ãà8%à¨"ÃðÖ&À§*Ã](Ã&î%à L'ô$Ã`}$Ã0‘"ð±'à&Ã@#&î%ðÉ#Ãàµ%à á#à$Ãp'$ÃÀ… ÀB&Ãc'ÃÀ ð½%ÃÀÒ(Ãò$ÃPV$Ã`#Ãà¯&Ã@#&Ã`‰"ÀË$ÃPb"ÃÐ$Ã`$Ã1%Ã"Ãà8%ð()è&Ã¥ ÃÀy"Ãà>$ÃÐ%Ã`k'Ã@(à+"Ç%Ã¥Ã@MÃC"Ã0%ÀÅ%Ã$ÃPÓ$Ã(Ã`$ÃØÃ0$ÃP÷à !ÀïÃp-#ÃÀö"Ãðè#Ã0‘"ÃpÎÃpÂÃ`ú$Ã0%à p!ÃUÃ0µÀlÃ`­ðˆÃ0£ðóÃ`§ÀýÃà1!à |ÃÀÇ!ÃÀ£à=ÃÃ"ÃàbÃ`!Ãàßà´ ÃÀ—Ãðà  àCð^ ÃPŒÃÞÃ`BÃ`BàUÃÀ£Ãð­Ã`<ÃÐîÃ`0Ã@ÜÃ^àsÃ`*Ã@Ä Ã`Bàêà ¾à GÃ@Ã@à 5Ãà ;Ã@ƒÃP¤Àà ÊÃ0Íà à[Ãpð Ã0hÀÃLÃ@¡ð/Ã@qÃàžÃà-ïÃÀÓà ²àÀÃ`ÝÃÀÓÃpøàêÃ0VàðÃ@ÃpÃÀVÀ®Ã`ÑÃà˜Ã@ƒà Ã@ƒÃð6Ã0ßÃXÃ`rà SÃÛð/Ã0ÃÀ\ð5ÃàzÃP°à à‹ÃPQÃ@§ð¸Ãvàüà SÀCÃ|ÃðÝÑÃÀÙÃPWà ÊÃP¼Ú ÃÃ0ßÃ@­à£ÀUÃà!à 5Ã`ãÈÀ´ÀUð²Ã@•Ãdà eÃ@¿ Ã@*à MÃpŸÃ@*ÃàªÃÀ ÀUà Ãðû Ãà9Ã`„ð¬ÃðNÃ`rÃpà Mà£ÃÀÓÃà¤ÃðTÃdÃðfÃð`Ãðï Ã`éÃà3Ã`õð)ÃÀñà ô à© Ãà3ÃP]à Yðe ÂðMðîðРÃ`à, à ÐÀIÀa ÃÀñà ÃðãÃ€Þ Ã°S à ÃÀ Ã€Þ Ã Ã0’ à&Ã8ÃÀ àÁ à8 Ã0†Àê à ô à Ãð ÃÀ† à» ÃÇ ÃðéÃ@T Ãðx ÃP Ãг Ô Ã àÇÃ`Ã5àÃ|ÃP à w Ãp.ÀÒàÇÃ>à> àÇÃ@T Ã`~Ã0ñÃ>à ÃÀžÃðõ Ã`ãÃ`~Ãp.Ã` à à w ÃpÏÃàoàÓÃ@< Ã@Ë Ãà{Ãp: ÃðœÃpF à ÃÀ à •Àð Ã0' ÃðœÃÄÃ0EàÓÃ0¶ð}ÃÀ¶ÃýÀöððôÃÄÃSÃÀ?ÃðºÃ@xÃßÃÐTÃð¢ÃÜðÃàK ÃàÃMÃ_À‹ÃÀ3à 6ÃtðÃ0ÂÃðÀÃ@xÃ@rÃ÷ÃpçÃÐÅÃ0QÃÀÃPì ÃP“Ã0àÃðºÃ0ÈàåÃ0¶ÀÃ0]Ã@~Ãð7ÀöÃpjÃ`IÃÀ¤Ãð1Ãàà ¹Ã nÃ@ü€…ðîàÙøÃ@xÃàà ³Ãàÿ ÷ýÂðÃpdÃàÃ_à ­àÁ Ã`ÆÃ@Ãà{ÃâÃÀ?ÃÐTÃeÃÐéÃÐïÃ`ÀÃ@ûÿÂYÃÐÝÃÀÂðƒÃÀªÃbÃ0¼Ã0ÂÃký NúÂ€ÇøÂ nànÃ@œú€,Ã0QÃÀKýÂÀ¶à ­Ã0Eà à êàÂúú€à˜øÂàpïÂÀòöÂÀ3ÃP(àýüÂ`ÌÃ@ÿÂâþ€ÉøÂðCÆÃpÛÃSÃ0WÃÀ¼ÿÂpíÃ`ÀÃ@~ÿ€ÿÂ`IÃ`UÃÀþôÂ@=õ€£þÂSà Ý÷ÂSÃ}ú föÂP4çó Bü €üÂ÷ HûÂP.à <ý tà€üÂÀàùÂ`sùÂ@„Ã@ûÿ 'öÂ`ØÃ zÃà™ýÂeÀJøÂ@üÂàÃöÂ`Þü ¹Ã ýüÂÃ`ÌÿÂà^òÂ@ Ãôû Åû€>úÂ@%ùÂÀ¼ÿÂ`äû€»úÂÀòöÂ@ÆóÂà·øÂ ïÂàFöÂ`Ç뀆îÂ÷Â@œúÂ@¨øÂ`‘ôÂÀ]ú€ÓöÂ@´öÂ`‘ô ûò !÷€hóÂÀþôÂÀì÷ÂàêÂÀo÷Â@öë€tñ ûò€ÓöÂàjð Tù lõ 'öÂÀþô³ñÂ@[ð€bôÂà|í€íÂÀòöÂ`äûÂÀ‡óÂ@–û Ý÷ „ñÂ`>í ´éÂ@—æÂ@êíÂ`\耩ýÂ`µîÂrç§óÂàLõ oêÂà²äÂÀLèÂÀ:렖ëÂÀ@ê 1ê ïÂ`‹õ ué€Áù€ßô€åó€-è€ÔáÂâÂ@ðì ò ž÷ÂÝêÂàÛò€åó€9æÂ@êíÂõ€Áù€nòÂ`,ðÂ`ÙèÂ` ò€£þÂà|íÂ@[ðÂ`µî€hóÂÀÏçÂ`—ó€˜ëÂ@mí ÈðÂ@äîÂà:øÂàáñÂÀ(êÂÅîÂÀ™ðÂ@sìÂàŽê€-èÂ6ñ Èð€ßôÂÀWûÂÀŸïÂxæÂ çÂNíÂàŽê€Œí›õÂÅîÂ@Òñ ZøÂ`Çë 7éÂåÂéè€ï ŠðÂ@éÂÀQüÂÀ“ñ€°çÂàdñÂàþÂàÏôÂ`äûÂÀcùÂÀôÂàÛò KðÂàùí øÂÀàùÂ`‘ôÂÀò€,ýÂàFö ÔîÂàè oêÂËí cìÂàŽê€žêÂÀ óÂ@OòÂàý ûò æëÂ@Øð øèÂÀøõ€ññÂàùí rôÂ`8îÂ$ôÂ@sìÂÑìÂ@ê –îÂ`ÓéÂàùíÂÀ¥îÂÀ½êÂ@aïÂÀðÂÀuöÂàjð€’ì€Óö æëÂàáñÂÀ{õ€’ìÂ*óÂÀñÂàáñÂÀ½êÂ6ñÂÀ óÂà#ç cìÂ@sìÂÀ™ðÂ`aüÂ`‘ôÂ`£ñÂà·øÂÀôÂ6ñÂÀÛå ÚíÂõ€†îÂ@Uñ€JøÂ@úÂ`©ðÂlèÂ@äîÂÀ:ëÂ@ÌòÂ6ñ€àß –î àì ~ò -õÂÀ(îÂHî ï Kð íÂ@ûÂ`ÇëÂÝêÂàšè øè œíÂÀ«í 7é€ëò NúÂãéÂÀòÂÀÉ而íÂàè ìêÂ@ú ÔîÂ`\èÂöÂ@Øð çÂfé ìêÂ×ëÂàvîÂà¬åÂ`PêÂà|í ¨ëÂ@äîÂ@êÂ@…é í ZøÂ€Í÷ŠãÂõ î§óÂ`êÂÑìÂfé ÔîÂàê€ î +ëÂàùí€ññ€ïÂ@Æó€zðÂ`>íÂ`ê€-èÂTì ïÂÀÕæÂàÊà þçÂBï CçÂ`Ç뀞êÂ$ô ïôÂ@yë cì ï íÂà;ã ûòÂÀøõ€¤éŠãÂHîÂà|íÂ@ÆóÂÀ¥îÂà/åÂÀ{õÂõÂàpïÂÀÃéÂâ þçÂ`PêÂà”éÂ@åÂ@UñÂ*óÂ@gî +ë Cç ç›õÂÀò  æÂ@Oò€ÂäÂ@ê !÷Â@mí =è œíÂ`âÂ@sìÂ@gî òÂà@÷€ïÂõæÂàùíÂà|íÂÀ½ê€'é ñÂÝêÂ@ðìÂ@…é 1ꀶæÂà ç ïÂÀ‚ßÂà5äÂrç€?åÂZëÂËíÂ@Þï ië çÂàGáÂÀÿßÂ`,ðÂàáñÂÀíâÂ`ß瀰çÂ`åæÂ`\è€9æÂ€ë ¢ìÂ`’ßÂ@üê€ìÂà‚ìÂÀáä äÂ`÷ã U䀼å€ÎâÂàìÂ@äîÂ@aïÂÀÃéÂ@‘ç ¥á€9æÂ€EäÂNíÂÀFéÂNíÂ`ªÛÂ`>íÂNíÂÀjãÂàÊàÂ ÆæÂ@ åÂà_ÝÂÀÛåÂÀpâÂ`€âÂÀÿß “äÂÀÕæÂÀáä€?å€ìÝÂ@2â øè «àÂÀdä êàÂ`»íÂ@£äÂ@‹èÂÀÏç ºè€?åÂ@»àÂà¸ã {èÂÝê€\õÂ`ö€ŒíÂ@Áß 2Õ®ÝÂ%ßÂ@ åÂ`ŒàÂÀpâÂûåÂ`VéÂà;ã RÚ FÜÂ@JÞÂàíïÂ@öëÂÀŽÝ åÂ`€âÂ@åÂàÛò–áÂå IæÂ á×ÂÀ”ÜÂÀùàÂ@åÂ@ÞïÂ@öë€?å ¥áÂÀðÂÀ4ìÂÀd䀼åÂàèÂà)æÂ€uÜ øè€QâÂàGáÂ@,ãÂàšèÂäÂ+ÞÂà¸ãÂâÂ@å å„ä —ÙÂ`zãÂÀváÂ`]ÓÂ@8áÂ`\èÂ`hæÂ@—æÂ€ÈãÂà/å ØÂÀpâÂ@çÂ`ñäÂÀLèÂàkÛ€3çÂÀçãÂà”éÂ@PÝ€øÛÂ@µáÂÀšÛÂ=Û gá€Ôá ¥áÂ@&ä ðßÂà¦æÂ`ßÂ` áÂ@,ã€ÂäÂàšè ãÂ`à€ØÂ`’߀{Û ãÂ`hæÂ öÞ€¼åÂÌØÂ`¤ÜÂ@2âœà ÀçÂÀçãÂÀÚÂà5äÂ`ªÛÂÀßÂ+Þ ÃÜ ØãÂÀÝÂ@åÙÂ`3ÚÂÀpâ …ÜÂ1Ý ·ÞÂÀß ÌåÂ`zã :Þ gáÂàØÂ€]àÂ`täÂàÂ@ñ×Â7ÜÂÀÏçÂÀšÛÂ@Á߀àßÂ`†áÂÀ.í +ëÂ`êÂ0ò .àÂ`Œà ãÂ`'ÜÂàÐß ÝÂÀŽÝ€QâÂ`zãÂ`¤ÜÂ@ÍÝ ÉÛÂ@ÇÞÂ@JÞ ùÓ …ÜÂà¸ã :Þ€þÚ€¼åÂ@&äÂ@\ÛÂÀ)Ù .àÂÀÛå Úí€ÂäÂlèÂÀˆÞÂ@2âÂàÖÞ Ÿâ þçÂÀíâ «à ÀçÂ@bÚ„äÂ@èÂÀˆÞÂ`ŒàÂàYÞÂ`âÂÀùà “ä ¥áÂ@…é ™ã€9æÂáÂ@»àÂ`ŒàÂÀÿßÂ`?ØÂàÄáÂ`¶ÙÂà_Ý€-èÂÑìÂ@,ãÂàÕÂU×ÂÀÊÓ 4ßÂÀ(îÂ`€âÂ%ßÂÀvá Øã Oå€EäÂ`?ØÂÀ^åÂ@†ÔÂ`¼ØÂ «à .à ÜÂÀ|àÂâÂ@ßÚÂÀ:ëÂ@ÁßÂ`ŒàÂ@£ä ã CçÂàpïÂTìÂÀÛåÂàŽêÂÀáäÂÀŽÝÂÀÝÂà#çÂ@öëÂÀ|àÂÀßÂ` á yÞ€ë IæÂ äá Òä€QâÂåÂàMàÂÀ"ï€ÔáÂÀjãÂÀ^åÂÀáä€ÂäÂ@çÂàpïÂÀÕæÂ ÆæÂœà øèÂ`ëåÂå òé€{ÛÂ@¯âÂ@äîÂÀÕæÂÀÏçÂ`zãÂà}ØÂ ãÂ@ÌòÂà;ã øèÂxæÂ€KãÂ@ÁßÂàÖÞÂåÂ@çÂ@©ãÂ@çÂlèÂà#ç€ýï aâÂ7Ü€uÜÂÀ”Ü€æÞÂà;ãÂ`¯ï€Ôá =èºÛ 4ß Úí ·ÞÂÀváÂé耞êÂHîÂàšè sßÂÀpâ€EäÂ`ýâ€iÞÂ@ê€?åÂ@2â çÂà)æÂ€?å gáÂÀßÂ`PêÂ@…éÂÀ(îÂ@—æÂ@,ã Þâ @ÝÂûå„ä ¥áÂ`†áÂ%ß ™ãÂ@µáÂÀñÂ@DßÂ@öë aâÂàAâÂàéÂàÜÝÂ@2âÂ`êÂ@æÂÀ#Ú ¥áÂà¬åÂâ "âÂ@ÙÛÂ@ç gáÂ@ÍÝÂ@åÙ  æÂ@aï  æÂ€ÚÂ@©ã ÝÂ@,ãÂxæÂ äá€KãÂà#ç€]àÂ@>à€æÞœà€?åÂàSßÂ@DßÂ@µáÂàÐß äáÂ@\ÛÂ@\Û Oå ®êŠãÂÀçãÂÀùàÂÀŽÝ€?å€àßÂ@ÕÂàóîÂ@£äÂâÂ@ÙÛÂU× åÌ€"ÕÂ`ªÛÂÀ”Ü çÂ@ßÚÂãé àì %ì€ØÂ ÏÚ ÝÂàGáÂÀóá d×ÂàéÂ@ åÂÀ¦ÙÂ@hÙÂà×ÂÀßÂÀßÂ`ÞÂ`ŒàÂ`-Û€øÛ€×Â@»àÂ=ÛÂàAâ äÂàÜÝ€c߀oÝÂà‰ÖÂ`9Ù€æÞ Ìå ãÂ@ßÚÂÀ#Ú sß ÞâÂ@JÞÂCÚ ‘ÚÂàúØÂûåÂ`ßÂÀ‚ßÂ@©ãÂÀšÛÂ@ÍÝÂõæÂ¨ÞÂ@ åÂ@&äÂàS߀ÂäÂ@ñ× gá€ÂäÂïçÂ`¤ÜÂ`-ÛÂÀXæÂ€±Ò yÞ€ÚÂÀ Ú Ѐ:ÑÂ@>à€]à ÏڀΖ׀ØÂ@t× ½ÝÂ@bÚ —Ù€ØÂÀ¸ÖÂÀAÕÂÀ¦ÙÂÀÜ 2ÕÂ@ëØÂ¨ÞÂ@ÁßÂ@˜ÑÂÀ;ÖÂ+Þ ÃÜÂ%ßÂ@ñ×€Úà .àÂÀšÛ ‚ÒÂ`àÂ@ßÚ »Ó Р^ØÂ óÔÂ@’ÒÂ`E×ÂÀ|à öÞÂÀ5×Âà•Ô šÎÂÀ É >ÓÂà*ÑÂ@ÓÂ+ÞÂàÐßÂ`cÒ vÔÂ`9Ù€ìÝÂ`3Ú &× µÔÂ@ëØÂ@ÕÂ@VÜÂ`ñäÂCÚÂ@åÙÂ@hÙ á× …ÜÂ`¶ÙÂ`iÑÂà¾âÂÀ5×€ìÝÂÀšÛÂàÕ ±ß >ÓÂ@’Ò |Ó€{Û ØÂ`¤ÜÂ@2âÂ`Pê€ÚÂàYÞÂÀ²×Â…Ï€@ÐÂÀ5×ÂÀSÒÂÀÊÓ «à€WáÂàîÚÂ@DßÂÀùà XÙÂ`-ÛÂmÓÂ`]Ó€ÚàÂàÊà€iÞºÛÂ@€Õ€ÚÂ` áÂ@JÞÂ@ßÚ€°ç FÜÂ`ÚÓÂ`]Ó ½Ý çÖÂ@ÙÛ€× RÚÂ@ÇÞÂÀk΀WáÂàèÛÂ@Ó€ØÂ ‚Ò ©Ö DÒÂ`3ÚÂ`ªÛ ÕÙ€·ÑÂÀîÍÂ@ ÔÂÌØÂ@ÑÂU×€× ðßÂà ÖÂ@ÓÜÂU×Âà›ÓÂЀøÛ€þÚÂÀè΀±ÒÂ=ÛÂ[Ö ą̊ÞÂÀ5× äÂ@ßÚ ÙΠÏÂ@’Ò ÙÂÀ;ÖÂêÓÂ`9ÙÂàÓÂàÖÞ€{ÛÂ ÛØÂ`Â× ^ØÂOØÂÀ”Ü ¦ÌÂÀqÍ ¬Ë€×Â`àÂ`˜ÞÂ@ñ×ÂÀ¬ØÂ@ÓÜÂaÕÂÀ$ÅÂÀÿ߀{ÛÂÀ¾ÕÂàwÙÂÀ߀4ÒÂÀ)ÙÂÀÄÔÂ@ÓÜ€þÚÂà×Â`’ßÂOØÂà0ÐÂÀ ÚÂà¹ÎÂ@¶ÌÂ@’ÒÂ`iÑ ÕÙÂ@PÝ€oÝÂ@ÍÝ€{ÛÂÀ5×Âà¹Î€ÚÂ`¶ÙÂÀÐÒÂ@˜ÑÂ@3Í ÃÜÂ@Õ µÔ pÕÂ`WÔÂ`uÏÂäÔÂÌØÂ@åÙÂÀˆÞÂ`QÕÂÀ¾Õ€^Ë€“× ÁÒÂà_Ý XÙÂÀ¬ØÂäÔ€þÚÂ@PÝ jÖÂà›Ó€ØÂ ÏÚ ØÂ µÔÂ@Ñ€:ÑÂà ÖÂàÔÂà×Âàƒ× ™ãÂÀóá€æÞ ‘ÚÂ@ÓÜÂà0ÐÂ@˜Ñ€4ÒÂ`oÐÂ@÷ÖÂ`WÔ ØÂ`¤Ü ‚Ò ŒÆÂà‰Ö ™ãÂ`ß ‹ÛÂ`9ÙÂàqÚÂIÙ ÞâÂ`cÒÂà¡ÒÂ`¶ÙÂ`æÑ ÏÂ`ìÐÂÀ Ú äáÂàqÚÂU× sßÂ@zÖÂàØÂ7ÜÂ@\Û ÙÂÀîÍÂ`QÕÂÀŽÝ (á€EäÂÀ;ÖÂ@»à€QâÂÀÉè€uÜÂàúØÂÀÏçÂ`8îÂ@çÂàMà uéÂà/åÂà‚ìÂ@ÀôÂ@ÞïÂÀÏçÂ`ýâÂ`Çë äáÂïçÂ ÆæÂ€’ìÂÀ.íÂ@£ä€!ê€-èÂ䀪èÂ@gî ‡æÂ@µáÂ@»àÂ~åÂàMà€ÔáÂÀ4ìÂÀj〞ê åÂ`€â Cç …ÜÂÀçãÂÀ¦Ù€ÖÂ`â iëÂÀ4ì€àßÂàÖÞÂ@êÂ@öëÂÀpâÂÀÛåÂ`Ùè .à (áÂ%ßÂàÐ߀{ÛÂéè øèÂÀdäÂ ÆæÂ@ å€]à€òÜ€ÚàÂxæÂ`êÂÀÿßÂÀ¦ÙÂ@ÁßÂ ÆæÂàêÂ@,ãÂÀ#Ú€™ÖÂàÜÝ€iÞÂ@\ÛÂ`tä€WáÂà¬åÂÀçãÂ@8áÂ@bÚÂ`3ÚÂà)æÂxæÂ@JÞÂ`ªÛÂ@µá £×€¤é€«ÓÂOØÂ` á€ÚÂÀÛåÂà)æÂ@zÖ äá€Èã ½ÝÂ@PÝÂ%ßÂÀRçÂÀÄԢ߀KãÂÀÛ ÉÛÂÀ¦ÙÂ`ëå€à߀{ÛÂàÜÝÂ@8áÂâÂÀ½ê€iÞÂà¡ÒÂ ÛØÂÀ‚ßÂàîÚÂ`!ÝÂÀ”ÜÂ`°Ú€c߀ÚàÂÆÙÂ+Þ€þÚÂ`ýâ ¥áÂàeÜÂ@ÍÝ "âÂ`žÝÂ`ÔÔÂÀ¬ØÂÀšÛ ÉÛÂ@ÇÞÂ@JÞÂ@&äÂÀ5×€4ÒÂÌØÂ`ÚÓÂÀšÛ ÏÚ€iÞ€òÜ »Ó JÑÂsÒÂ`™ÉÂàÓÂÀeÏ LÛ —ÙÂ`ÈÖÂ%ßÂÀGÔÂÀMÓÂ`àÒÂ`Â×ÂÀ”ÜÂà6ÏÂyÑ ^ØÂÀ²× ½ÝÂà Ö £×Â@’Ò€oÝÂ`àÒÂàÕÂOØÂàÕÂ`æÑÂ@˜ÑÂ@åÙÂàèÛ »Ó 8Ô jÖÂÀ;ÖÂ@†Ô DÒ ‘Ú ˆÑÂÀ5×Â`€âÂ`E×ÂÀ)ÙÂ@8áÂ`˜ÞÂÀ#Ú€ÖÂ@žÐ€4ÒÂ@VÜÂmÓÂaÕÂsÒ ÛÂà<΀^Ë >ÓÂ`ÎÕÂÒ× @ÝÂCÚÂÀèÎÂmÓÂà§Ñ ÜÂÀGÔ ÇÑÂÀÄÔ JÑÂàÅÌÂÀ²× vÔÂ`QÕ ÛÂÀMÓÂ`‡ÌÂ@!РÏ€ÚÂà§ÑÂØÖÂ@t׺ÛÂÀwÌÂЀL΀×»ÆÂÌÂ`Â×€þÚÂ`ÍÂÌÂ@zÖÂ7ÜÂàÜÝÂÀèÎÂÀ_ÐÂÒ×Â@Ò€{Û ¦ÌÂà­ÐÂÒ×Â@Ò JÑÂ@ëØÂ ÏÂàeÜÂÀ¾ÕÂà$ÒÂ`?ØÂ >ÓÂ`àÒ ÁÒ šÎ€4Ò ÝÂ`'ÜÂÀ5× ˆÑ ÕÙÂ`Œà ÒÂ`ÊÂÀôÌ€LΠ>Ó ÁÒÂÀ_ÐÂÀ_ÐÂà‰ÖÂÀÄÔÂÀSÒÂ`iÑ€ØÂ`òÏÂà×Â`°ÚÂ@€Õ€^ËÂà³ÏÂIÙÂ`ÞÂàwÙÂ@¤Ï€“×Âà§ÑÂ@hÙÂÀ•Ç ”ÏÂ@¤Ï .àÂÀ)ÙÂÐÂàÜÝÂÀjãÂ@ýÕÂ@˜ÑÂ@ýÕ ¦ÌÂ@'ÏÂÀèÎÂ@ßÚ€òÜÂà× á×€ØÂ@ÙÛÂÀAÕÂ`ÎÕÂÀ‚ßÂ@¤ÏÂÀ_Р5ÊÂÀYÑ ÕÙÂÀ;Ö #ÍÂ`þÍÂÀÐÒÂà×ÂÀ)Ù ‘Ú  ÑÂà­ÐÂ`]ÓÂ`Â× ÎÂ`ÔÔÂàÓÂU×Â@ýÕÂÀ)ÙÂÀGÔÂ@ñ×Â`Â× ÏÚÂ`àÂ@†ÔÂ7ÜÂ`’ßÂ@˜ÑÂàËË€uÜÂ`°ÚÂàƒ×‘ÍÂ@Ò &×ÂàúØÂ€uÜÂ`òÏÂàúØÂüÐÂ`߀þÚÂyÑÂIÙÂ`]ÓÂ@ÙÛÂ`žÝÂ@ëØÂà<ÎÂ`9ÙÂàÓÂÀèÎÂÀeÏ€(ÔÂ@bÚ íÕ ½ÝÂà  ÑÂàÓÂ`E×Âà0Ѐ]à ,ÖÂ@ŒÓÂÀ ÞÂÀÜ vÔÂ@ªÎÂÀôÌÂU×ÂРšÎ€áÊ ÒÂ…ÏÂàúØÂ€(Ô€ÖÂ`QÕÂàZÉ€íÈÂÐÂ`oР‹ÛÂ`Þ ÓÏÂÀAÕÂêÓ 〷ÑÂ`ìÐÂà6ÏÂÌØÂ ,Ö vÔ€Ú šÎÂàwÙÂ@ÈÉÂà*ÑÂ`°ÚÂà¡ÒÂ@\Û &× ÉÛÂÀ¸Ö€×Â+ÞÂ@hÙ€dÊÂÀƒÊ >Ó€ØÂ@†ÔÂ@!ÐÂ@†Ô‹ÎÂ+ÞÂÀYÑÂ@zÖ€×ÂàeÜÂÀÐÒÂà³Ï JÑ€×Â ÛØÂ@JÞ€ ÙÂ`bçÂàèÛ ÜÂà Ö€‡Ù€.Ó€þÚÂOØÂÀYÑ ©ÖÂÞÕ sßÂÀdä€ÖÂÀÐÒ€þÚÂaÕ ‹ÛÂÀMÓÂ`9Ù ØÂêÓÂ@ÑÂ[ÖÂ@¤ÏÂà›ÓÂ@ÙÛÂà³Ï ÍÐÂüÐÂ@ŒÓÂÀÊÓÂÀîÍÂÀ²×Â`KÖÂÀÚ€ØÂ@Ò XÙ€ŸÕÂàúØÂÀ²×ÂÀ§Ä ¸ÉÂà0ÐÂ@÷ÖÂ`iÑ £×Â΀Ö á×ÂàNËÂ@ÒÂ`†áÂÀAÕÂ`iÑ #ÍÂ`.ÆÂ@]ÆÂÀîÍÂà‰Ö vÔÂ@!РVÏ …ÜÂ@'ÏÂ[Ö ØÂ€.Ó PÐÂà6ÏÂ`àÒÂà0ÐÂÀ5×Â@ÙÛÂÀ ÚÂà_ÝÂÌØÂ`ªÛÂÀŽÝ ÙÂà›ÓÂ`æÑÂÀSÒÂ`ÍÂ`WÔÂ@žÐÂÀGÔÂà`È ùÓÂ`æÑ &×€‡Ù AÈÂÀÚ€«ÓÂÀÐÒ \ÎÂ…ÏÂ`øÎ€4ÒÂÀ²×ÂÐÂ@\ÛÂ@\Û ÁÒÂ@¤Ï ”ÏÂÀYÑÂ`Í€ÉÎÂà0ÐÂ@åÙÂ`E×Â@'ÏÂ@†ÔÂ`cÒÂ`ÈÖÂ@QÈÂ@øÁ ‘ÚÂ@!Р2ÕÂ@ªÎÂ`‡ÌÂàÕÂÀîÍ‹ÎÂÀMÓ zÉÂ`cÒ »Ó LÛÂàAâÂÀôÌÂ@˜ÑÂ`ÔÔÂöÑÂÀ}ËÂØÖÂРpÕÂÀ5×Â@ýÕ »ÓÂÀÖÑÂ@˜ÑÂÀôÌ  ÑÂ`:ÄÂ`¼ØÂ@ÓÜ jÖÂàØÂàÅÌ€:Ñ üÝÂÀ_ÐÂ`ÀFÏ á× ‘ÚÂ`ÍÂ`uÏÂàúØÂ€¥Ô á×Âà0ÐÂ`Í€·ÑÂÀ¦Ù AÈÂ@bÚ€ØÂ LÛ ÐÂà6ÏÂà6Ï€ÏÍÂ@hÙ |ÓÂ`ÎÕ€{ÛÂà‰Ö€ÃÏÂ@ ÔÂ`3ÚÂ`øÎÂ@ÚÆÂJÄÂ@¼ËÂÌØÂ`cÒÂÀ¸ÖÂà§ÑÂÀeÏÂ@ÙÛÂÀ5× ¯Õ€±ÒÂ@˜Ñ€(Ô óÔÂР|ÓÂ@zÖ€ØÂ …Ü DÒÂÀ‰ÉÂà­ÐÂÀîÍÂ@3ÍÂÀGÔ VÏÂÀ}ËÂÀAÕÂÀeÏÂà6ÏÂà¿Í ÒÂ@ÕÂ@åÙ€"ÕÂ`iÑÂÀ¬ØÂ`àÂá &׋ÎÂÀ/ØÂà¡ÒÂà‰ÖÂÀËÂ@ÈÉÂÀqÍ€@РnË 2ÕÂ@ÚÆÂ`WÔÂöÑÂaÕ ŽÐÂ`F ÓÏÂ`òÏÂ@Ò 2ÕÂÀGÔ€·ÑÂ@ÕÂ@ÂÊ ÎÂ`ÚÓ€«ÓÂ`ÉÂ`E× hÌÂÀ)Ù€×ÂÀÜРVÏÂ@€Õ€ØÂ@÷ÖÂ`àÒÂ@JÞÂöÑÂâ öÞÂ`¥ÇÂ@t×ÂÀ²×Âà§ÑÂÞÕÂÌØÂØÖÂà*Ñ€áÊÂ`E×ÂáÂÀYÑ€íÈÂ@ÕÂ`¶ÙÂaÕÂÎÂ@]ÆÂ` ÌÂ`˜Þ VÏÂ@ÈÉÂ ÊÆÂ@˜ÑÂà Ö …ÜÂ`ªÛÂðÒÂÀŽÝ ØÂ€ØÂ`ËÂ`°ÚÂ`cÒÂ`Ë ”ÏÂäÔ ©Ö ÚÂ`ÔÔÂàØÂ€ØÂ íÕµÇÂ[Ö€ÅÂüРd×ÂÀ¾ÕÂOØÂàÕ€™Ö€øÛ óÔ ÙÂ@bÚµÇÂÀYÑÂCÚ ,Ö€ØÂ€@ÐÂÀ¸ÖÂ`QÕ \΀ùÆÂÀôÌÂ`¼ØÂ`KÖÂà›ÓÂÞÕ€×Â@€ÕÂ@t×Â`Â×€½Ð´Ü ±ß€iÞÂaÕÂ`¼ØÂ 8Ô LÛÂÀ Þ€×Â`€âÂ=ÛÂÀ;ÖÂ…Ï zÉ€@ÐÂÀ)Ù€ŸÕÂ`uÏ »Ó ßÍ ¬Ë€L΀pÈÂÁÅ £×ÂàØÂ€.ÓÂ@9Ì »ÓÂà¡Ò€ÚÂ`ÍÂÀÜРŽÐÂà‰ÖÂ`ÎÕÂÀAÕ ˆÑ vÔÂ@˜Ñ µÔ VÏÂ@-ÎÂ@!ÐÂ@ÈÉ €È /Ë€¥ÔÂÍ€™Ö óÔ ^ØÂÀÚÂÀ5×Â@bÚÂ@åÙÂÞÕÂà0ÐÂ`æÑÂ`øÎ ¯ÕÂÐÂà<ÎÂ`â€ÚÂàúØÂ@¶Ì µÔ€‡ÙÂU×ÂsÒÂÀ/ØÂ`cÒÂ@ßÚÂyÑÂÀÐÒ màÂ@ŒÓÂà­Ð ÇÑÂÀÄÔÂÀYÑÂmÓ ßÍÂäÔÂÀAÕ ŽÐ ¯ÕÂÀ ÚÂ`'ÜÂ@\ÛÂyÑÂsÒ€FÏÂàHÌ /ËÂÀAÕÂàqÚ Ù€·Ñ ¯ÕÂ@ÕÂ@ÂÊ€.Ó€òÜÂ`ÚÓÂIÙÂà›ÓÂ`òÏ pÕÂàÕ ¯ÕÂà•ÔÂ`WÔÂÀÐÒ |ÓÂ`ÚÓÂÒ×Â@ÒÂ@˜ÑÂ@ÁßÂmÓ 2Õ ÕÙÂ`ÚÓ€ÃÏ ÙÂ@†Ô ãÂ`ÈÖ€™ÖÂ1ÝÂ`uÏÂ@ýÕÂÀYÑÂÀ‰ÉÂÌÂÌØÂÀSÒÂÀSÒÂ@ÓÂ@!ÐÂ@hÙÂÀ¦Ù íÕÂà}ØÂÀÚÂ@°ÍÂà¡ÒÂàÝÈ€ØÂÀÊÓÂ@zÖ €È ÕÙÂÀeÏÂ@åÙÂ=ÛÂÀGÔÂ`òÏÂà*ÑÂà¹Î©É ÙÎÂàƒ×€ ÙÂyÑÂU×  Ñ á× ˆÑ 4ßÂ`E× ÄÂàÓ ÇÑÂsÒ VÏÂaÕÂyÑ€FÏÂÀÖÑ  Í PР¯ÕÂ&ÊÂ@ÈÉ ŽÐÂÀ¬ØÂ@ñ×Âà_ÝÂ@VÜ ùÓ çÖÂà‰Ö ‘ÚÂ@¤ÏÂà¡ÒÂà§ÑÂàwÙÂmÓÂÐÂÀîÍ€±Ò€pÈ ”ÏÂ&ÊÂ@°ÍÂà}ØÂ ØÂ€(ÔÂà ÖÂðÒÂ`E× óԋ΀"ÕÂÀAÕ—Ì ЀRÍÂÀèÎÂàÑÊ |ÓÂà•ÔÂäÔÂà6ÏÂÀÄÔÂàãÇÂ`Â×ÂU× \ÎÂÀ)ÙÂ`3ÚÂÀ‚ßÂ`]ÓÂ`àÒ  ÑÂÀÊÓ€½ÐÂ`ÔÔÂ@ÕÂðÒ µÔÂÒ× 8Ô€É΀«Ó ÓÏÂ@EÊÂ`iÑ _À@Рd×Â@ëØÂ[ÖÂÀîÍÂ`QÕÂÀèÎÂÀ/ØÂ Ù€™Ö »ÓÂ`-ÛÂÀÖÑÂðÒÂ@åÙÂÀeÏÂàÕÂ@'ÏÂ`KÖÂ`iÑÂ@÷ÖÂÀ¬ØÂ@ýÕÂ`oÐÂ`ÎÕ€4ÒÂ`ÎÕ ;ÉÂàâÜÂsÒÂÌÂ`uÏÂ ÛØÂ`WÔÂ`uÏÂ@˜Ñ€ÖÂÀMÓ d×€ÚÂðÒ —Ù£ÊÂ`ŸÈ »Ó ÇÑÂÀAÕÂà­Ð ©ÖÂ@†ÔÂ`ÈÖ ËÂ@nØÂàîÚ€‡ÙÂ`3ÚÂÀÄÔ€¥Ô€ìÝÂ`ÎÕÂÀÜР/ËÂÀôÌÂ=Û€.ÓÂ@†ÔÂ1ÝÂÀRç€L΀áÊÂöÑÂÀ É ÛÂàÓÂàÓÂÀÈÂ@-ÎÂàãÇÂ@ÕÂÀAÕÂà›ÓÂÐÂ[ÖÂ`oÐÂÒ×ÂÀÇÂ`{Π@ÝÂÀÈÂÀÊÓÂà‰ÖÂÀâÏÂgÔÂàúØÂðÒÂà§Ñ .àÂmÓÂ`æÑÂÀYÑ ÐÂà›Ó |ÓÂ`iÑÂÐÂ`ÚÓÂàkÛÂàZÉ€pÈ )ÌÂ`cÒ íÕ€ÖÂÀˆÞ ^ØÂ`oÐÂ@’ÒÂ`(ÇÂÀYÑ íÕÂÀYÑ ¾ÈÂÀîÍÂ@ªÎÂ@'ÏÂÀôÌ€@ÐÂ@'ÏÂàÕÂÞÕÂà0РÒÂ`E× ÏÚ€áÊ >ÓÂ@Ñ Ý —ÙÂÀ;ÖÂ@†ÔÂàÔ DÒÂU×Â@¼Ë ÃÜÂàZÉ 2ÕÂ`WÔÂÎÂ@åÙÂ@!Р^ØÂÀGÔ ÿÒÂÀ¾ÕÂ`uÏÂ@åÙÂà§ÑÂÀÐÒÂ@!ÐÂÀôÌÂ@€Õ »ÓÂ`ÉÂÍ PÐÂÀ#ÚÂ`òÏÂà}ØÂàlÆÂàÕÂmÓÂIÙÂ@\Û  ÑÂ`ìÐÂyÑÂ@¼ËÂ@ŒÓ ÉÛ¯ÈÂ@ÕÂÀÄÔÂ@žÐ >Ó ÙÎÂà›ÓÂ=Û DÒ€ ÙÂàÕÂ@-Π Ñ€·ÑÂ2ÈÂà­Ð vÔÂàãÇÂ`ÊÂÀeÏ á×ÂÀ_ÐÂàÝÈÂ`™É ùÓÂà›Ó€«Ó ÐÂ`WÔÂ`{ÎÂØÖ çÖÂ@ªÎÂÀqÍ€ÃÏ€ØÂÀÜÐÂÀwÌ€ÏÍÂÀYÑ‹ÎÂ[Ö JÑÂ@Ó€(ÔÂ`KÖ€ØÂ ßÍÂ`Â×€·Ñ ÙÂ@Õ )ÌÂÀÐÒ€ÏÍÂàNË vÔ€ÉÎÂ@¶ÌÂ@t×Â@ëØÂ@˜Ñ ¾ÈÂÀ/ØÂ`oЗÌÂÀGÔÂ`øÎÂÀ¾Õ€ØÂ@žÐ€±ÒÂmÓ JÑÂ`ÈÖÂÀ¸ÖÂ`¶ÙÂàBÍÂyÑÂÀôÌ€½Ð€É΀:ÑÂØÖÂàÓÂà×Âà›ÓÂÆÙÂà$ÒÂ@zÖÂÀ)Ù ‹ÛÂÀôÌÂ`cÒÂ`WÔ€ÉÎÂÀƒÊÂÀAÕÂÐÂÀ Þ ëËÂ`òÏ€ŸÕÂÆÙ ßÍÂ@ÂÊ€¥ÔÂàwÙÂ`(ÇÂ@ýÕÂ@EÊÂ`QÕÂÀ¸ÖÂàƒ×ÂËÂ`"ÈÂ@ÂÊ hÌ€× ÎÂÀ¾Õ ÖÄ€áÊÂÀîÍ šÎÂ`ÍÂ@3Í /ËÂÎÂ`KÖ JÑ ÁÒ€¥ÔÂ`ìÐÂà×ÂÀ)Ù€:ÑÂ@?ËÂ@QÈÂ@Õ VÏÂ@€ÕÂÀYÑÂ`QÕÂÀAÕÂ>ÆÂà­ÐÂ…Ï—Ì |Ó€ÃÏ  ÑÂ@†Ô ΀RÍÂÀwÌ€ÛËÂäÔ jÖ ÁÒÂ`àÒ DÒÂ`ìÐÂÀAÕÂàÕÂ ÛØÂà¡ÒÂ@'ÏÂ@!Ѐ™Ö ùÓ Ï VÏÂöÑ€×Â@ñ×Â`ÍÂà¹Î hÌ ¯Õ€‡ÙÂà§ÑÂ@°ÍÂ,É€(ÔÂÀÛÂ@\Û ØÂ FÜ £×Â@zÖ€:ÑÂÀÐÒ€ŸÕÂäÔ€×Â@ÙÛÂ`ÈÖÂÀAÕÂÀèÎÂ@¤ÏÂÆÙ &×€™ÖÂÀÖÑ DÒÂ@?ËÂà Ö€uÜÂ@!ÐÂÀóáÂ@€Õ€±Ò€·Ñ MÆÂà ÖÂØÖ ©ÖÂ@Ñ€þÚ 8ÔÂ`àÒÂ@?ËÂË ½ÝÂ`3ÚÂÀSÒÂ ÛØÂ ùÓ ÇÑÂàqÚÂ@ÕÂÀÜРµÔÂ`WÔ £×ÂäÔÂ@°ÍÂ@3Í€ÉÎÂà­ÐÂÀèΠÁÒÂ`oРÙ΀FÏÂà}ØÂ ÝÂ@˜ÑÂàfÇ€dÊ ÈÂ`Â×€"ÕÂaÕÂ`'ÜÂsÒÂ`ÔÔÂ@nØÂ`°Ú€“×€ØÂ@zÖÂÀ#Ú€.ÓÂ@-ΠØÂ@¤ÏÂ`cÒÂÀÚÂà×Âà ÖÂ`WÔ€ ÙÂ@ŒÓÂ@Ó á×€ÚÂàËËÂ`]Ó &× JÑÂ`žÝ‹Î€ ÙÂ`øÎ€"ÕÂ@÷ÖÂ`?ØÂ@nØÂ ÐÂÀ)Ù€ ÙÂ`WÔºÛÂ@åÙÂÀqÍÂÀÛÂ@Ñ »ÓÂyÑÂ@ŒÓ ©ÖÂ@÷Ö€{ÛÂàÂÀ¸Ö ÓÏ ØÂàwÙÂÀAÕÂ@ÑÂàeÜÂÀÿß Ý ÏÚÂ`-ÛÂ`9ÙÂàÜÝÂ`¼ØÂ |Ó€“×ÂgÔÂêÓ yÞÂ`ÚÓÂÌØÂ ØÂ€‡ÙÂ@ÇÞÂÀÿ߀™Ö d× ÇÑÂ@†ÔÂÀ¸ÖÂ@˜ÑÂsÒ óÔÂàèÛÂ@žÐ€™Ö¨Þ€{ÛÂöÑÂÀÝÂöÑÂà*ÑÂà0ÐÂÌØÂ@'ÏÂà}ØÂÀùàÂÀšÛÂyÑÂÀŽÝ€:Ñ ÉÛ ÚÂ`à ØÂ€@ÐÂ`¼ØÂ`KÖ€±Ò ÕÙÂ@¯âÂà_ÝÂÀ¬ØÂ€Ö€«ÓÂ@t×ÂàÐ߀ ÙÂ=Û ÉÛÂÆÙÂÀYÑ jÖ JÑÂ`ŒàÂÀ ÞÂàÕ€øÛ€oÝ€·ÑÂ@ßÚ€Ö êà LÛ ^ØÂ7ÜÂ@'ÏÂ@Ò€ìÝ´Ü vÔ‘ÍÂ@†Ô€{ÛÂ@JÞÂ@žÐÂ@Ò 8ÔºÛÂ@÷ÖÂà³ÏÂà•ÔÂà*Ñ€“×Â@2âÂ@hÙÂäÔÂ@VÜÂmÓÂÀ¸ÖÂÀÜ #Í ¥áÂ@>àÂ@>à€É΀«Ó€"ÕÂ@ßÚ Ò ÐÂÀÚÂÀÛÂ@t× ÐÂÀ²×€¥Ô PРÚÂ`ÈÖÂà¡ÒÂIÙÂÀÝÂÀ#ÚÂäÂ ÛØÂà§ÑÂÀâÏ nËÂäÔÂ`þÍÂÌÂÀÊÂ=ÛÂ[Ö óÔÂ…ÏÂàÕÂ@¶ÌÂ@ÑÂ`ßÂà‰ÖÂÀÐÒÂÀÄÔÂÀ;ÖÂÀ¬ØÂ ¯ÕÂäÔÂ`ªÛÂÀˆÞÂ ÛØÂà_Ý ÕÙÂ`¼ØÂ «àÂ`Œà "â ´éÂ`žÝÂàèÛ màÂáÂ@8á mà ã€"Õ d× ‹Û€uÜ€øÛ .àÂÀÿß ÉÛ FÜ FÜ êàÂÀÕæÂ Oå€iÞÂÀváÂàÂ`ÈÖ ‘ÚÂàÕ–áÂÀùà çÂ`ÞÂ@üê¢ßÂÀváÂ`÷ã ãÂÀ|à€òÜÂõæÂ ã ã€KãÂ`9Ù XÙ 4ß Ôî Òä màÂÀÏçÂ`‘ôƒùÂ`êÂÀÉèÂ`÷ãÂ@¯âÂà)æÂ`ŒàÂÒ×Â~å oê êàÂ`àÂÀdäÂ@>àÂÀ@ê€\õÂÀdä€ÔáÂÀóáÂà5ä€ÂäÂ`Pê CçÂÀvá€cßÂ`8îÂàÄá U䀞êÂ` áÂ`hæÂ  æÂËíÂÀLèÂ@&äÂ`ßç ÒäÂ`ÙèÂàì çÂ`tä å€3çÂ@æÂâÂ@JÞÂ@8áÂà çÂÀ¥îÂÀ4ì æë„äÂÀÿßÂàMà€Èã .à€WáÂ@£äÂ`à ÀçÂ`ÓéÂÀßÂ`’ߠïÂ`\èÂÀ4ìÂ@ÀôÂ`óÂ@ÞïÂ@ 値éÂàÜÝÂ`Þ€3çÂÀ ÞÂ`ªÛÂ`ëåÂ`hæÂ d×Âà;ã€Eä€oÝÂÀ ÚÂà²äÂÀ4ìÂ`ÁìÂÀò€ÂäÂàGá 7é Èð€’쀘ëÂ`bçÂ`täÂ+ÞÂ`nåÂáÂÀôÂ×ëÂÆÙÂÀáäœàÂ@…é Ü€KãÂÀíâÂ@—æÂâÂ`ñä ±ßÂÀÏç yÞÂà‰Ö€uÜÂ`Ùè€hóÂÀ(î "â¢ßÂ@èÂÀ:ëÂ`âÂ@8áÂÀ)ÙÂ`¤ÜÂà5äÂàéÂ@©ãÂ`ýâÂ`åæÂ  æÂ€¼åÂÀßÂÀóáÂÀÚÂ@ÙÛÂà¾â€ìÝ€ÚÂÀç〰çÂõæÂ êà€Kã€íÂõæÂ@DßÂà#瀤éÂ`Œà€òÜÂà#ç ÌåÂ ÆæÂÀÕæÂ sßÂÀíâÂà}ØÂ@ÙÛÂà_Ý ìêÂàèÛ …ÜÂÀóáÂ@ñ×Â`žÝ€cßÂ@©ã màÂrç gá€Qâ çÂ`Áì ã€Âä ]íÂ`PêÂà¦æÂ`ÞÂ`ýâÂ`åæÂä åÂÀŽÝ =è gáÂõæÂ€Qâ äá KðÂÀ“ñÂ`ëå€!êÂàwÙ å .àÂÀFé êà êà€ÚàÂ`ÁìÂ@åÂ`ñä äáÂÀÏç€!ꀶæÂàvî ìê «à€×€ÈãÂ@éÂ`åæÂà5äÂ`†áÂÌØÂàeÜÂàÄáÂ~åÂêÓ OåÂÀÃéÂ`nåÂ`täÂûå ŸâÂ`ªÛÂ@ëØÂ ÉÛ ÉÛ IæÂ =è€Ôá´Ü€?åÂ`!ÝÂÀÛÂ ÛØÂxæÂ@£äÂÀ Ú ÕÙÂËíÂ@ å ·Þ€ªèÂÀíâ ã ÃÜ [ãÂ`Vé€æÞ€þÚ€ÚÂàwÙÂÀXæÂ`ëå Ìå ÒäÂ@8áÂ@ßÚÂ`WÔÂ@2â€þÚÂØÖ FÜ øèÂà¬åÂ`-Û€æÞÂàÐßÂ@\ÛÂàâÜÂ@çÂ@ëØÂàYÞÂàÓÂ@£äÂÀ^å ðÂ`ëåÂ` ဤéÂ`>í “äÂ`Â×Â`-ÛÂàYÞÂÀíâ€ìÝÂ`ŒàÂ`'ÜÂàMàÂåÂ@©ã€Âäœà€Âä´ÜÂà ÖÂÀùàÂ`Dì =èÂmÓÂ@ëØÂàÂ@¯âÂÀÛÂâ¨Þ€˜ëÂÀšÛÂ`€âÂ`hæÂ€ÂäÂ@€ÕÂÀÄÔ€]à RÚ µÔ€(Ô ÞâÂÀùà€òÜ åÌÂÀÐÒÂà²ä–áÂ@è Ý «à€òÜ ùÓÂmÓ€ÚÂÀÜ [ãÂàeÜÂà/åÂ` áÂä 4ß êàÂÀ#Ú€±Ò€oÝÂ@µá ,Ö€Qâ€þÚÂÀÝ ÚÂàÂÀ Ú¨Þ "‼堣׀ØÂ @ÝÂàeÜÂ@ÍÝ–áÂ`-Û¢ßÂ@ŒÓÂIÙÂ@ëØÂ@!РRÚ ,ÖÂ`ýâÂ`ŒàÂÀùà€(Ô —ÙÂ@2â€ìÝ Ý ÜÂà …Ü€“×Â[ÖÂ@ßÚÂOØÂ ¥áÂà_Ý€ ÙÂ`ýâÂ`žÝ€"Õ pÕÂ`KÖ —ÙÂ@€Õ€cßÂ`€âÂ`ŒàÂ@ÙÛ XÙ äáÂCÚ€ìÝ [ãÂÀ)Ù ùÓÂàîÚ ØÂ€Ôá üÝÂÍ ˆÑ€iÞ LÛÂàîÚÂÀ_РöÞ FÜ ˆÑÂÀ Ú€ÚÂ@2â€]àÂïçÂ@2âÂà×€¥Ô€ÛË€™ÖÂ`!ÝÂ=ÛÂÀÿß Øã ÃÜÂÀpâÂ@ßÚÂÀÚÂ@bÚ€oÝ öÞÂ[Ö µÔÂ@ÁßÂ`]Ó 2ÕÂà}ØÂ &×Â@÷Ö jÖÂ`iÑÂÀ¸ÖÂÀÚÂàÖÞÂ`àÂÀÜÂ`ÞÂàÖÞ ÒäÂÀÝ ‚Ò ðß çÂÀRçÂ@æÂÀóáÂyÑÂÀˆÞÂà•Ô€±ÒÂÀMÓ á×€ÚÂÀ¦Ù€(ÔÂàAâÂà_ÝÂIÙ :ÞÂÀ4ì ÏÚÂ`¤Ü gáÂ@ñ×€]àÂÀ#Ú ¥á —ÙÂá ºèÂàâÜÂ@\ÛÂàÂ@©ã RÚÂ`tä ™ã íÂ+ÞÂ` áÂÀ ÚÂÀÛÂà/åÂ@2 ٠4ßÂ@ å ®êÂ@ÁßÂ@2â ±ßÂ@ÙÛÂàÜÝÂãéÂ@2âÂ@ÇÞÂ@µá–á€cßÂ@yë€ÔáÂàÖÞ€ŸÕÂ%ßÂà#çÂ@çÂ@ åÂàGáÂÀ ÚÂ`zãÂà_ÝÂ`9ÙÂà¦æÂà/åÂà¾âÂ`ÍêÂà5äÂå ºè–áÂIÙÂ@£äÂ@ åÂÀˆÞÂ`ñä ØãÂ`ëå øèÂ~å ‘ÚÂ`VéÂà;ãÂ@üêÂ~å€?å€ î „ñ oê çÂàpï ÀçÂà ëÂà‰ÖÂÀ^åÂ@…é¨ÞÂ` áÂ`hæÂ`Vé€?åÂÀFéÂÀáä€òÜ ué {èÂäÂ@èÂ@éÂà|í€ë€KãÂàì€Ôá ®êÂà¦æÂ ÞâÂ@»àÂ@©ãÂ`DìÂàS߀àßÂà¾âÂÀ^åÂà²ä€3çÂ`z〤é ã .à ®êÂ`PêÂ@ßÚÂÀÝÂÀYÑÂÀ5׊ã Ìå€Wá€iÞÂÀvá€(Ô ä Uä aâÂà”éÂ~åÂ@‹èÂãé€÷ðÂ@‹è€'éÂà¾â màÂÀ Ú€cß ºèÂ`âÂ@JÞÂà¸ãÂ`ßÂ`-Û çÂåÂéèÂ`VéÂ`DìÂ@ðì€uÜÂ`'Ü€ì€ÎâÂ`hæÂ`ŒàÂäÂ@æÂ Ú€àßÂ`’ßÂ`bçÂÀòÂ`ßçÂ@ýÕÂ`àÂÀíâ®ÝÂàGáÂ@Ió€ý堥ဘ련렮êÂ`¤Ü ÞâÂÀçã€uÜ aâÂÀíâÂ`†áÂ~åÂ`÷ãÂ`ÓéÂ`Â×ÂÀŽÝ€cßÂà¾âÂ`†áÂàSßÂÀ ÞÂÀšÛÂàMàÂ@¯â€¼åÂ`àÂ@VÜÂ@ñ×Â@ÓÜÂ@æÂ`†á„ä WîÂÀXæÂ ºè ½ÝÂÀ¸ÖÂyÑÂ`ÞÂ`PêÂ@>àÂ`nåÂàèÂ`åæÂ`ÙèÂ@,〘ëÂÀ"ïÂÀóáÂ@µáÂ@µá [ãÂàêÂàˆëÂàMàÂ@&äÂ`àÂ`†áÂ@ßÚ„äÂÀváÂÀ²×ÂÀXæÂÀíâÂ@VÜÂ`-ÛÂÀÉè Oå  æÂÀß´ÜÂ`âÂÀ”ÜÂÀÏç–áÂ ÛØÂàÄá€ÔáÂÀÛ üÝÂ@bÚ€uÜ€°çÂàèÛÂ`žÝÂOØÂ€ØÂ®ÝÂåÂàîÚÂ`3Ú ä€ÔáÂà¾â€Eä€]à¨ÞÂ@2âÂ`ªÛÂÀíâÂÀíâÂàYÞÂ@¯â€iÞÂàèÛÂ=ÛÂ`žÝœàÂÀùà OåÂÀXæÂ` áÂÀÛ€oÝÂÀÃé ÏÚÂ`†á€ÔáÂÀÿ߮ݠØÂÀ”ÜÂàÜÝÂàîÚÂ@ÇÞÂ`àÂàâÜÂÀèΠã´Ü„äÂ`à ÉÛÂ@>à CçÂ`žÝÂ@D߀ÈãÂ`˜Þ ÉÛ€ØÂ@Áß «àÂ[Ö .àÂàšèÂÀçãÂ`ýâ äá€ØÂÀÝÂÀŽÝÂàqÚÂàîÚÂÀpâÂàeÜÂ ٠gáÂ@ÓÜÂÀóá€æÞÂâÂöÑ ãÂØÖÂÀ Ú ±ßÂÀ‚ßÂàMàÂéèÂ`’ß åÂÀÃé Ù …Ü äá êà€9æÂ sßÂÀ#ÚÂ@ÍÝÂ@ÇÞ€(Ô XÙ màÂ@ÓÜÂåÂà€øÛ ´é màÂ`!ÝÂ@\ÛÂàèÛÂÀÿßÂàÓÂ@8áÂ@‘çÂ`€âÂ`Â×ÂàîÚÂà;ã´ÜÂà¦æÂ êà€¼åÂ`täÂÀÉèºÛÂ×ëÂÀjã =è€ÂäÂàÊà€]àÂ@£äÂà¦æÂ`Óé aâÂ@ðìÂ@åÂàèÂàì àì§ó€ëÂ@Oò€’ìÂ`Óé€-èÂÀÿß òÂËí ]íÂàšè€zðÂ`óÂ`ò äá€3ç ìêÂõÂàéÂ@öëÂÀ@ê€ññÂNíÂ`ÁìÂàRô {èÂ@[ðÂ`,ð€ îÂ@öëÂÀæøÂ ªõÂÀÚúÂ`>íÂ$ôÂÀ4ìÂ@Ió€bôÂàêÂÀ™ðÂ@®÷§óÂ@œú 'öÂöÂàÿìÂ`÷Â`‘ôÂ`Uþ EñÂà4ùÂÀÈý „ñÂ@œú€Óö ýüÂ`—ó€ÓöÂ@¢ù Ôî °ôÂ@Æó€nòÂ@Àô€ŒíÂÀ óÂ@ü Ñù €üÂàùíÂà(ûÂÀ™ðÂ`÷ÂŒÃÀÔûÂ`…öÂàÛòÂà·øÂà:øÂ€ëò€ýïÂ@ºõ ÈðÂ@ÀôÂàÛòÂÀo÷ÂàÕó€,ÃÀiøÂà|íÂ`¯ï ËúÂ` ò àì Eñ ñÂùÂúÂðÀà?òÂ`[à fö °ôÂMÃÐrÃ`ü÷ ãöÂÀàùÂP4Ã@üÂÀKýÂ@üÂÀ?ÿ€ßôÂ@–û°ÃÃ@~Ã`Ìÿ€JøÂ@ à˜øÂ@þÂà“Ã@ÌòÂà™ÃÐãÃàÕö€&Ã@„þÂ`—ó€&À\õÂÀiøÂà(û ¨ëÂàdñÂ`êú€ ÿ°$ð›ÀµûÂ`Þü 9óÂ`êúÂÀ>úÂ0]ÀÓö€tñÂ@®÷ÂÀiøÂ`yøÂà«ú 3ôÂ6ñÂ@ ÃàLõÂÀÔûÂpÃÀ?ÿÂ`>í Œú€ßô€ÁùÂ`äû Eñ€\õ rôÂ`ÞüÂÀKýÂ@%ùÂÀøõÂ`÷ xóÂ`÷ 3ô ¶óÂ@úÂÀæøÂÀøõÂÀÚúÂ@ÒñÂ@=õ€bô 3ôÂ`…ö€Óö€Óö éõÂàÉõÂ`‘ôÂà±ùÂàjð€£þÂ@UñÂkýÂÀÃéÂ@êíÂàFö ué õó€hóÂ÷Â@IóÂ`,ð ¤öÂ`£ñ ~òÂàìÂ€ÇøÂ ñÂ@ºõ€ññÂ@‘ç€ýïÂ÷€ýïÂà‚ì %ìÂÀàùÂ`,ð€†îÂ0ò€€ïÂ@ÀôÂ`÷Â`€âÂÀÉèÂ`‘ô€åó Eñ rô ñÂ`â³ñ øÂÀÈýÂàÕóÂ`µîÂàóîÂàèÂ`VéÂàšèÂ@ðì ªõ¡ôÂÀ"ïÂàìÂ`PêÂàdñÂ@gîÂ÷ ÔîÂ@Uñ ]퀌íÂ@OòÂ@ å€nòÂàvî Úí ïôÂÀWûÂÀ ó œí ÌåÂàšèÂ`ê +ë –î ®ê ï€†î Ôî€-èÂ`ëåÂÀRçÂ@…é cìÂàšè€!êÂÀpâ ç ÝÂ@êíÂàì ºè€'éÂÀ±ìÂÀ4ìÂ@—æÂ`Áì ÚíÂféÂ`hæÂ òéÂÀñ ~ò ~ò€ î ¢ìÂà¦æÂ€Ôá gá =è ç€Qâ€ï ÚíÂÀ½ê€¼åÂ@VÜ õó€ëò€÷ðÂ@JÞÂäÂ@åÂ`DìÂéèÂÀÿßÂõæÂ@öë ´éÂ@nØÂ uéÂ@öëÂ@2âÂ@üêÂ@&äÂ1ÝÂàšèÂÀ½êÂ`ÙèÂÑì€iÞ€’ìÂÀÃéÂ}úÂ@ê¨ÞÂÀXæÂ £×ÂÀpâ gáÂàÄá€KãÂ@\ÛÂ`’ßÂ@£äÂ@—æÂ¢ßÂ@míÂÀFéÂàÿìÂÀ”ÜÂà¸ã€-耰çÂÀçã€EäÂÀóáÂ@—æÂ` á 4߀ÂäÂÀ^åÂÀdä æëÂ@»àÂံæÂ ‹Û ãÂ`ÙèÂ@\ÛÂà¦æÂ`âÂ@VÜÂ`‘ôÂlèÂÀ@êÂàâÜ ±ßÂà/åÂ@êÂ@2â€Èã€Èã ìê€ìÂÀ@ê€?åÂ~åÂ@ÇÞ yÞÂÀpâÂ`zãÂ`ÙèÂàˆëÂÀRçÂ@êÂ`ýâ oêÂ`†áÂâÂ@&äÂ` á€Qâ€9æÂ€-èºÛ Òä &×Â@¯âÂÀÕæÂÀçãÂ`ªÛÂÀRçÂá€EäÂ`ýâÂ@>àÂ@ÇÞÂàúØÂÀFéÂÀùà€ï îÂÀLèÂà ç€°çÂ@2âÂÀpâÂÀÕæÂÀšÛ€žê %ìÂ@å€]àÂàÊàÂÀÉèÂÀ4ìÂ`ŒàÂá„äÂ@ å “äÂ@>àÂ`€â€3ç€ìÝÂ+ÞÂ`Œà êàÂà¦æÂ màÂÀŸï þçÂÀçãÂ[ÖÂ`-ÛÂàôÙÂà_Ý 㠅ܨÞÂÀ:ë€KãÂ`KÖ ™ãÂà/å —ÙÂÀóá ìêÂ@2â€ÈãÂ@©ãÂ@Á߀¼åÂà)æÂ@åÂÀß 4ßÂ%ß ·Þ ]íÂÀpâÂ@>à€Q ï€cßÂ@»àÂ`ŒàÂ`J뀘ë {èÂà5äÂàùí ã þç ~ò ðÂ×ë€Úà€Úà àìÂà¬å€'递ìÂà‚ì .àÂâÂà ØãÂ`êÂ@èÂrçÂàšèÂõæÂ%ßÂÀ™ð å Ìå òÂÀá䀰çÂ×ëÂHîÂÀðÂ@êÂ`ÙèÂ`hæÂàÄá å Àç€ýïÂàˆë€ëÂ`ßç äÂ@—æÂàA․éÂ`nåÂÀÉèÂ@üêÂ`VéÂ@yëÂ`ñäœà ÕÙÂ@çÂ`ò ûò€ÔဤéÂÀÕæÂ`ëåÂàé ]íÂéè„äÂ`hæÂ Oå oêÂÀ¥îÂàAâÂÀRçÂ`ê Cç Þ‪èÂàùí xóÂ@ꀒìÂÀ^åÂàGá LÛÂÀ‚ßÂåÂ@åÂà¸ãÂ@míÂÀíâ åÂãé ÒäÂ`ÍêÂ`†áÂàdñÂ`»í ´é€iÞÂ@>àÂfé .àÂá —ÙÂ`žÝ .àÂ`êÂ`8îÂ6ñ€zðÂ@è {èÂà)æÂ@¯âÂÀáäÂ@\Û€QâÂà “äÂ=Û “äÂàùíÂxæÂ ÒäÂàâÜÂÀjãÂà²äÂàèÂ`êÂ`2ïÂà¾âÂàîÚÂÀóáÂÀÏçÂÀ#ÚÂ@>àÂ`ýâÂ`°ÚÂàƒ×Â@,㠽ݠÜÂàØÂ Oå€WáÂxæÂ€ÚàÂ`3ÚÂ`¶Ù RÚÂàÜÝÂàSßÂÀ4ì€WáÂ`!ÝÂäÂà;ã€þÚÂ@ÁßÂ`Pê þçÂõæÂÀ¬ØÂ`WÔ€¼åÂ@,ãÂ`’ßÂ`nåÂ@ åÂU×ÂÀXæÂ`¶ÙÂ`!ÝÂà;ãÂÀpâÂà5ä€9æÂÀ^å€ÚàÂÀFé€uÜ RÚ€òÜ€¶æÂÀù࠱ߠÛ ØãÂàÊàÂäÂ@2â sß øèÂ@,ã€KãÂÒ×ÂÀíâÂà•ÔÂ`òÏÂà¾âÂâÂÀ«íÂ`°ÚÂÀÿß åÂà_ÝÂÀ¸ÖÂ`à®ÝÂàqÚ 1êÂ`€âÂ`ëåÂÀíâÂ@»àÂ@†ÔÂÀçã s߀]àÂàwÙ sßÂàSßÂÀÝÂÀÜÂ@&ä ÝÂàèÛÂÀ¬ØÂ@‘çÂÀ:ëÂÀÝÂ ÛØÂÀ)ÙÂÀóá€iÞÂ1ÝÂÀóáÂ~åÂ@>àÂ`à ãÂÀíâÂ@»àÂÀYÑ á×ÂáÂÀŽÝ€iÞÂOØÂÐÂà‰Ö ÜÂ@ÒÂàYÞÂ+Þ€Îâ „ñÂÀèÎÂ`?ØÂ€þÚÂ@ åÂÀ/ØÂ@ÇÞÂÀíâ ·Þ€Ú &×Â@PÝÂÀ|à öÞÂ`¼ØÂ€æÞÂ@¯â€þÚÂ@Áß ´é ØÂ€iÞ aâÂÀ^åÂÀ|àÂá„äÂÀjãÂ`àÂàeÜ–á ÉÛÂ@£äÂàêÂ`†áÂ@>à 4ßÂ@&ä "â€ØÂÀ^åÂ=ÛÂ` áÂ@ÁßÂàôÙÂÀšÛÂIÙ€¼åÂ%ßÂÀóá¢ß€ÚàÂÀŽÝÂ`ÈÖÂ`PêÂ@»à  æÂÀÛå µÔÂüÐÂ7ÜÂ@ëØÂàGáÂ@µáÂÀ”ÜÂÀ·ë€cßÂ`nåÂ@©ãÂ@hÙ ‹ÛÂÀvá FÜÂ@åÙÂà_Ý€uÜÂà_ÝÂ@VÜ [ãÂ`µîÂà¬å€cßÂ@ÙÛ¨ÞÂÀ¾ÕÂ@JÞÂrçÂàèÛÂ@ßÚ Ý «àÂÀ Ú ÌåÂ`Â×ÂàSß cìÂ`bçÂ@¯â€Wá€WáÂ@VÜÂ`-ÛÂàYÞÂà¬åÂàÐßÂàMàÂÀváÂàÄáÂ`\èÂ`Œà sß +ëÂ`zã€ëÂ+Þ€EäÂ@Áß ÏÚÂ`!ÝÂ@[ð {è€ÎâÂ@bÚÂÀváÂ7Ü …Ü€]àÂ`à üÝÂÀ¸ÖÂÀÚ´ÜÂ`-ÛÂÀÜ€oÝ€-èÂàÄáÂ`åæÂàîÚ äá€3çÂCÚÂ7Ü€3çÂàGáÂ`àÂÀÏçÂ`tä ï æë€˜ëÂ@VÜÂ@åÙ„ä€cßÂ@bÚÂà×€"ÕÂ`ÞÂØÖ Ý @ÝÂÀ|àÂàÊà ãÂàkÛÂ@¯â€‡Ù€æÞÂ@‘砱ߊ㠷ހWáÂÀóáÂ`täÂ`ß砽ݠFÜ pÕÂÀÜ€cßÂ`zãÂä ‘ÚÂ@ßÚÂàÐß ‹Û€oÝ€c߀àßÂàÖÞ “äÂÀLèÂ`ÓéÂÀ½êÂ@D߀(Ô @ÝÂà/åÂ`¶Ù€˜ëÂ`†á ‡æÂ …ÜÂ`E× öÞ ðßÂ`’ßÂäÔ ØÂÀ^å 4ßÂ@ÇÞ ðßÂ`’ß ØÂ ãÂ`3Ú ÚÂrçÂ`\è€ÈãÂ`˜Þ€“×Âà¾âÂàÊàÂ@ÇÞ ÛÂà”é€ÚàÂá iëÂàÕÂ+ÞÂ@8áÂàÖÞ yÞÂ`¼ØÂ µÔ€Qâ€æÞÂ@Áß®ÝÂÀváÂÀÉè «àÂ`˜ÞÂ@æÂCÚÂ@VÜÂ@÷ÖÂÀŽÝÂ@2âÂ`-ÛÂàÄáÂ@bÚÂàØÂà­ÐÂÀèÎÂ`E×Â@JÞÂ`’ßÂ`Â× ÛÂ@÷ÖÂàqÚ ðßÂÀÛÂàÊàÂ@nØÂêÓÂÀ)Ù “äÂ@çÂ`ëåÂ@°ÍÂ=ÛÂÀ¦ÙÂàYÞÂâÂÀ5×Â`ÔÔÂ@,ãÂÀ Ú€"Õ üÝÂÀÚÂ@µáÂ`ÞÂ+ÞÂà_Ý€{ÛÂ`ÚÓÂà‰Ö€ØÂ µÔ€.ÓÂsÒÂàôÙÂà•ÔÂà*ÑÂ@bÚÂÀ²× 2ÕÂ@ëØÂ £× Ù€"Õ€æÞ€±Ò bÍÂ%ß Ú€ÖÂàØÂ€cß ðß´ÜÂ`žÝ€àß ‚Ò çÖ€ØÂ@åÂÀdä —ÙÂ`ÔÔÂ`ßÂÀß ÉÛÂ@ëØÂà­ÐÂ@PÝÂ`°Ú€oÝÂàÜÝÂ@»àÂàGá  ÑÂàwÙÂÀÚ€ØÂ€ Ù€"ÕÂÀ Ú€æÞÂ+Þ ÍРÍÐÂ`øÎ€øÛ gá :Þ€æÞÂ ÆæÂ€ØÂðÒ  ÍÂÀSÒÂàÕÂàâÜ€XÌÂÀ¦ÙÂ+Þ :ÞÂàÕ £× ÝÂ@ñ×ÂÀvá€{ÛÂäÔ€uÜ ØÂ`˜ÞÂà›ÓÂÀâÏ ÌåÂ@»àÂÀ¬ØÂ`?ØÂ`iÑÂ`E×Â…Ï ÏÚÂ@¯âÂ@ßÚÂ@†Ô€ìÝ XÙ ‚ÒÂ`ÚÓ DÒÂ@åÙÂ`¶ÙÂÀváÂ`¼ØÂ€øÛ &×Â`ÔÔÂ`¤ÜÂ+Þ ãÂ@ýÕÂ`Ùè LÛ ùÓ —ÙÂáÂ`ÚÓÂaÕ€‡Ù€Qâ€ÚÂ ÛØÂ´ÜÂÀŽÝÂàúØÂÀ)Ù ‘Ú @Ý VÏÂÀÄÔÂÀˆÞÂÀ/ØÂÀÚÂàÜÝ€]à gá€oÝÂ@†ÔÂ@ßÚÂäÔÂÀÐÒ€XÌÂ@ÓÜ ™ãÂàúØÂ@t×ÂØÖ€“×Â@žÐÂ@€Õ ÉÛ ÉÛÂ@\ÛÂ@ñ×Âà$ÒÂÒ×€“×€"Õ€(Ô µÔÂ@ÓÜ µÔÂ`¶Ù  ÑÂ@nØÂà$ÒÂ[Ö &×ÂàîÚ€ìÝÂàËËÂ`æÑÂ@nØÂÀ¦Ù®Ý€øÛ ;ÉÂ`oÐÂÀ Ú ¯Õ€ØÂ@ñ×Â=Û€× ÛÂàHÌÂ`cÒÂ@ÓÜÂÀùà —Ù »ÓÂÀáäÂàMàœàÂ@†Ô —ÙÂaÕÂ`WÔ ÜÂÀ)ÙÂàAâ —ÙÂ@nØÂ á×ÂàYÞÂà_ÝÂ`E×Âà§ÑÂ`ªÛ ÚÂÀ Ú ^ØÂ —ÙÂ@ßÚ€‡Ù€øÛÂ@’ÒÂÀ¬ØÂ€¥ÔÂ@åÙÂ`žÝ€QâÂ@>àÂ@ ÔÂ`ëå€ÚàÂ%ßÂÀ²×Â@ÓÂÀ¸ÖÂàeÜÂàeÜÂÀ¬ØÂ€{Û —ÙÂ@ëØÂ`-Û€FÏÂàÕÂ`9Ù¢ßÂðÒ€¥Ô€ØÂ Ú€‡ÙÂ~åÂÀ;Ö XÙÂàYÞ :ÞÂ`cÒÂÀÛåÂ@&äÂ`9ÙÂ+ÞÂ`ÓéÂ`?ØÂàwÙÂ`°Ú yÞ ^ØÂ=ÛÂÀÝÂÀÛÂ`'ÜÂ ÛØÂ óÔ Ý öÞ &×ÂU×ÂÀeÏÂ@ÕÂÀ#Ú€Úà€ÚÂÒ×Â`ÔÔÂÀ)Ù ØãÂÀÜ &×Â`Â×€ØÂàÕÂ`QÕÂÀ/ØÂ ‘Ú´ÜÂ`¼ØÂ üÝÂ`zãÂ@PÝÂàÜÝÂÀMÓÂ`Þ€Úà ±ßÂ`’ß vÔºÛÂÀSÒÂÀÄÔÂà5ä  æÂ@ñ×ÂÀŽÝ€oÝ 2Õ´ÜŠãÂ@ßÚÂ@ßÚ€òÜÂ@ëØÂ€ØÂ`E×€‡Ù bÍÂ` ÌÂàqÚÂêÓÂÀßÂ@ÍÝÂaÕœà€æÞÂ1ÝÂÀÄÔÂàèÛÂ@8ဟÕÂðÒ ÏÂàÕ ã ØãÂ@¯âÂU×Â@€ÕÂÀ#Ú€.Ó FÜÂOØÂÀ Ú€Ö ÿÒ€"ÕÂÌØÂ ·ÞÂOØÂÀ5×Â@t×Â`É íÕÂ@\ÛÂ`¶ÙÂ1ÝÂÀ¸ÖÂ`KÖÂÆÙÂÀ›ÆÂÀÊÂCÚ€¥Ô€QâÂÒ×Â`òÏÂÀ¸Ö á×ÂÀÊÓ [ãÂÀRçÂ`¼ØÂàÓÂàîÚÂà‰ÖÂ`ÔÔÂ@€ÕÂÀÄÔ ¯ÕÂàÓÂàqÚÂðÒ ßÍÂ@ñ×Â@]ÆÂ |Ó @ÝÂÒ× ùÓ á×Â` áÂ@°Í€×ÂÀ)ÙÂÀ‚ßÂÒ×Â@†ÔÂ@ Ô ¯ÕºÛ€øÛÂÀ¸ÖÂ@ñ×ÂàôÙ ÝÂÞÕÂà×Â@€Õ gá€ÏÍÂÀeÏÂÀÄÔÂ`-Û SÅÂÀ²×Â@Ñ 2Õ€oÝÂ@ýÕ€™ÖÂ@'ÏÂÀúË ùÓ µÔÂ@VÜÂÀßÂà¡ÒÂà‰ÖÂ`WÔÂÏÂ@ Ô XÙ€™ÖÂÀeÏÂ@ßÚ€±ÒÂ`¶ÙÂ@>àÂÀ/ØÂÀÊÓÂ@¤ÏÂ@Áß ÏÂ@zÖ€Ú ,Ö JÑ€ÛËÂ@£äÂ@ Ô€dÊÂà§ÑÂ@ÔÇÂàÕÂ@ ÔÂÐÂà­ÐÂÀ”ÜÂàwÙÂ@¤ÏÂàÑÊÂÀÜÐÂ`-ÛÂ@†Ô ÍÐÂà¿ÍÂ@ åÂÀ¸Ö &×Â`-Û sßÂÀSÒ€·Ñ µÔÂÀ_ÐÂ@Õ ÒÂ@†ÔÂÀÛ 5Ê d×€«Ó ùÓÂ`ÔÔ€ÕÌÂà•ÔÂ@ÈÉÂÌØÂ@ýÕÂÆÙÂÀÊÓÂ`¶ÙÂÀváÂOØÂ€¥Ô #ÍÂ`¼ØÂà}ØÂ`˜ÞÂgÔÂÀYÑÂ`¼ØÂ`ÈÖ ÛÂà­Ð ¬Ë ½Ý ©ÖÂ@ÕÂà§ÑÂÀÊÓÂ`KÖÂyÑ´ÜÂàYÞÂ…ÏÂU×Â`!ÝÂàqÚÂ`E×Â@°ÍÂ@&äÂ@t×€‡Ù€øÛÂ`-ÛÂàÕÂ`E×ÂàYÞÂÀÜ ÜÂàwÙ ^ØÂ`ªÛÂàÕÂà}ØÂÇÄÂ@€ÕÂâÂüÐÂmÓÂgÔ ¯ÕÂÀ¦ÙÂâ ÉÛ ÿÒ Ü aâÂyÑÂàÔÂ`KÖÂ+ÞÂ`ªÛÂ=ÛÂ`àÒÂ`˜Þ€.ÓÂà×Â`˜Þ€×ÂÀ#ÚÂÀÜ€·ÑÂà*ÑÂ`oÐÂ`æÑ ˆÑ€ÚºÛ€“׺ۀàßÂ@€ÕÂ@ÕÂ`àÒÂàwÙÂàúØÂ@ÓÜ´ÜÂÀ‰ÉÂâÂaÕ ÕÙÂà¬å ÕÙ€LÎÂ`täÂ`ßÂ@©ã LÛÂÀáäÂ`à XÙÂ@©ãÂàeÜÂàÄá ܨÞÂ@µá€ØÂàèÛÂ@€ÕÂ@8áÂà²äÂ`†áÂ@»à sß gá€ÎâÂ`zã IæÂÀÛåÂxæÂ :ÞÂ@ÍÝÂÀ”ÜÂ1ÝÂÀdäÂ@Áß ¥áÂàRôÂàjðÂ`ªÛ€÷ð„äÂCÚÂÀÕæÂ`˜Þ øè ÜÂÀváÂàŽêÂ`ŒàÂÀŽÝ màÂ@êÂ`’ß´ÜÂàGáÂ`åæÂ€ÂäÂ`Œà öÞÂ@>àÂ%ß ÛÂ@JÞ€QâÂ`-Û …ÜÂlè€KãÂâÂÀ«íÂ@ ÔÂ%߀]àÂØÖÂ@ÓÜÂ`ýâÂÀváÂà çÂ`¤ÜÂÀ@êÂ`’ßÂ`€âÂ`\èÂ@hÙÂà€QâÂ`hæÂÀˆÞÂ`°Ú aâ yÞ€ìÝÂ`ßÂ`3Ú ÜÂ@»àÂÀÚÂ@>àÂ@ÁßÂ`¶ÙÂÀ¦Ù®ÝÂ`’ßÂ%ß Ü [ãÂà¸ã€°ç Û€oÝÂÀjãÂà¬åÂà¬åÂ@PÝ LÛÂ@t×Âà²ä€æÞ 4ßÂÀÉèÂÀváÂ`˜ÞÂ@ÇÞÂàÂ@êíÂ@©ãÂ@>à€iÞÂ`’ßÂàÖÞÂ`ýâÂ`?ØÂ@åÙœàÂÀ/ØÂ€3ç€cߖ᠙〶æÂàSß ÜÂ@2â (áÂÀ/ØÂ Ý€ ÙÂÆÙ€9æÂ€°çÂ[ÖºÛÂ@÷Ö  Ñ :Þ Ÿâ€ÚàÂà ç ÃÜ€Qâ ¯Õ ‘Ú gáÂ`zãÂ@t×Âlè€Ö ½ÝÂlèÂ`€â ºè€uÜ€ÎâÂ@hÙÂ`˜ÞÂ`JëÂ1ÝÂàÂûåÂ`nå€oÝÂ@êÂÀóဠـ{ÛÂ@æÂ üÝ ÝÂ@>àÂÀÛå ië€QâÂ@Áß öÞÂà_Ý€iÞÂÀYÑÂ@æÂÀ߀Kã åÂÀ½êÂÀáäÂ`‘ëÂ`z〠îÂà‚ìÂ`Ùè IæÂ IæÂ@ê ãÂ`\èÂ@äî +ëÂÀ(îÂ@ÒñÂ`\è +ëÂ`˜Þ Ü€òÜÂ`ëå  æÂÀÛåÂ`êÂ`¤ÜÂàGá€ØÂ@ÍÝ äáÂÀpâÂ`àÂÀ”ÜÂà¾â€ÎâÂÀŽÝÂ@>à RÚÂÀÿ߮ݠåÂÀ/ØÂàÜÝÂà¾âÂÀÚ LÛÂäÂÀAÕ€iÞÂÀÿ߀iÞ€ìÝÂ@ÇÞÂÀˆÞ á× sßÂÀŽÝ ½Ý IæÂ@,ãÂ@DßÂ@VÜÂÀ|àÂÀ ÚÂÀ^åÂÀÝ€ìÝÂ`'ÜÂ@PÝÂàSßÂ`-ÛÂ7ÜÂ@¤Ï ÕÙ Øã€ìÝÂ@»àÂÀÜÂÀÝ ãÂÀÚ€Ú ^ØÂ@ßÚ XÙÂÆÙÂ`ßÂÀíâ€ØÂ äáÂÀ|àÂ`E×Â@ÍÝÂðÒ LÛ êàÂ@»àÂ@\Û FÜ€ØÂyÑ€!ê€9æÂ`-Û ÁÒÂÀ¦ÙÂ`-ÛÂÀ/ØÂ`ªÛ Û€{ÛÂ@PÝ Ù —ÙÂà_Ý€øÛÂ@Áß ©Ö€øÛÂÀÊÓÂ@Áß 2Õ ¯ÕÂàkÛ ÕÙÂ`-ÛÂÀYÑÂÀóá€×Â@÷ÖÂÀÊÓÂU× &×Â`‡ÌÂ@'Ï PÐÂàÖÞÂ@åÙÂÀeÏ€uÜÂ@ÓÜÂsÒ€·ÑÂÀYÑ€™ÖÂÀeÏÂ@ÕÂÀÊÂàèÛÂaÕÂ@žÐ íÕÂ`ÔÔ LÛ€ÚÂ`àÂ`¼ØÂ@nØÂ€ìÝ€‡ÙÂ@-ΠLÛ€æÞÂÀváÂØÖ jÖÂàkÛ XÙÂüЀ‡Ù L۠܀iÞÂ`àÒ€.Ó€Ú öÞÂ`žÝ€ØÂ€×Â7ÜÂà#ç "âÂ@†Ô€øÛÂ@nØÂ€cßÂ@ÙÛÂ`QÕ íÕ€(ÔœàÂ`ªÛ€‡Ù€uÜÂÀÿßÂ`KÖÂÀMÓ 2ÕÂ@ªÎÂÀSÒ aâÂ@¯âÂÀçãŠãÂàÿìÂà²äÂÀÛå .à€iÞÂËíÂrçÂ`ªÛÂûåÂÀ^åÂ@yë€WáÂÀùàÂà²ä ´éÂ`â ðß ®ê àìÂ@8áÂ@—æÂ@¯âÂ`†á  æÂàÐߢßÂ`QÕÂÀˆÞ€æÞ ™ãÂ@µáÂâÂ@JÞ€]àÂÌØÂÀ”ÜÂ`€âÂÀLè ç màœàÂÀpâÂ`¤ÜÂ`†áÂ@&äÂ`bçÂféÂTì {èÂ@—æÂ€cߺÛÂ@ÓÜÂÀFéœàÂ`àÂ@ýÕ ØãÂà¾âÂ@ åÂÀÕæÂ ·ÞÂ@£ä€øÛÂÀváÂÀÏç oê IæÂ öÞÂ@VÜ€cß ½ÝÂ@ŒÓÂàâÜ€]àÂÀpâ ÛÂ@Ñ´ÜÂÀÛ êàÂ`ªÛ RÚÂ`ñäÂÀÃé Uä€cßÂÀÝÂàÅÌÂ@ŒÓÂàÕÂ`E×Â`'Ü ^ØÂ¢ßÂ@9ÌÂ@÷Ö€EäÂÀ²×Â@ñ×Â@nØÂàÕÂ`Œà€þÚÂÀÖÑÂ`E×Â@Dß ØÂÀ¬ØÂCÚ€¥ÔÂàBÍÂàqÚÂàƒ× ÛÂCÚ ÿÒ€uÜÂCÚÂ`’ß öÞÂ`¶ÙÂ[ÖÂäÔÂ`{ÎÂâÂØÖÂÀ;ÖÂ`ÔÔÂ`?ØÂ€«Ó€ØÂ (áÂ1Ý ©Ö ÏÚÂÀGÔÂà•ÔÂà}ØÂðÒ ÉÛ PЀ±ÒÂ`æÑÂàkÛ€¥ÔÂ@ÎÈ€×Â[Ö PРÁÒÂàØÂ@t×€«Ó ÕÙ jÖ £×€ŸÕÂàÓÂÀ É ¯ÕÂgÔÂ@Ó üÝ Ò íÕÂ@ÒÂàØÂà§Ñ€ ÙÂ@ÇÞÂÀ”Ü ÙÎÂ@˜ÑÂàÕÂ@ªÎÂäÔ€ŸÕÂØÖÂÀeÏ XÙ @ÝÂÆÙÂà­Ð ÚÂÀè΀ÏÍ \ÎÂ`òÏÂ`cÒÂaÕÂ@ Ô €È RÚ ÚÂà›ÓÂË€(ÔÂ@ÕÂÀeÏÂÏ —ÙÂà¿ÍÂ@÷ÖÂÀSÒ€ÏÍÂÀ_ÐÂÀYÑÂ`‡ÌÂêÓÂ@˜Ñ óÔÂà ÖÂ@ÈÉÂ@]ÆÂàxÄÂà¹ÎÂ`{ΠÛÂ@˜ÑÂÀSÒÂÀMÓ ÈÂ@’Ò :ÞÂ[Ö #ÍÂàÅÌÂ`™ÉÂÀÊ Ò Ï ÕÙÂÍ ùÓÂ@oÃÂ`ËÂ@ ÔÂÌØÂ |ÓÂ`cÒÂà§ÑÂÀËÂàTÊÂàØÂÀÚ |Ó hÌ »ÓÂÀ¸Ö€ØÂ€(ÔÂà Ö€LÎÂ`iÑÂÞÕÂàÕÂ`ìРvÔ€×Âà›ÓÂàƒ× DÒ‹ÎÂ@†Ô £×Â`?ØÂ 8ÔÂ@°ÍÂ`cÒÂàÐß ÁÒ \ÎÂ@ŒÓ ,Ö€iÞ vÔÂ@PÝ€@ÐÂà6Ï€RÍÂ`3ÚÂÀkÎÂàBÍÂsÒ )Ì€:Ñ€FÏÂ`cÒ Π8Ô€:Ñ€ÉΠ²Ê€½Ð jÖÂ`9ÙÂ`9Ù€ Ù ÚÂ@¶ÌÂðÒ 2ÕÂÀôÌÂ`E×€:ÑÂÀ5×ÂmÓ AÈÂÀ}Ë bÍÂÀ;Ö ÇÑÂ`ÎÕ€ ÙÂÀ)ÙÂà›Ó€RÍ€çÉÂyÑÂàËËÂàÓÂÀ‚ßÂ`cÒ \ÎÂÀGÔ€:Ñ€ÉÎÂ&ÊÂà¿ÍÂÀGÔ )ÌÂÀ_РÏÂÀMÓ šÎÂË€FÏ€"ÕÂà×ÂÀMÓ€ÉÎÂ@VÜÂ`þÍÂÀÐÒÂ`þÍÂ`¤ÜÂ@ëØÂ€×Â`cÒÂÀôÌÂ@t×ÂÀ›ÆÂ€4ÒÂà0ÐÂà}ØÂ`òÏÂaÕ€ÏÍÂÀ_ÐÂÆÙ€]àÂàfÇÂà¿ÍÂÀÖÑÂÀAÕÂäÔÂà‰ÖÂ`KÖÂ@’ÒÂ`¶Ù€KãÂ@t×ÂÏÂ@\ÛÂ`¶ÙÂÀ¾Õ £×Â@ÓÂà0ÐÂäÔ ÏÂà›Ó 8ÔÂ@?ËÂU×ÂäÔÂOØÂ@ Ô€ ÙÂ`WÔ |ÓÂ`]ÓÂÀkÎÂ…ÏÂàôÙÂàMà€cß ¯Õ ùÓÂÀ¸ÖÂ@ßÚÂ ÛØÂÀ#ÚÂ@åÙÂÀËÂ`oÐÂ[Ö  ÑÂÀqÍÂ@ªÎÂêÓÂ@zÖ &× …Ü ÚÂàƒ×ÂàwÙ€WáÂ`ÔÔÂÀ/ØÂÀeÏ šÎÂàÕÂàÕÂ`Â× Ú´Ü &×Âà)æÂðÒÂ@!ЀçÉ€ˆÄ€pÈÂ`cÒ #Í nËÂÀË€ØÂ ¯ÕÂà¹Î€ØÂàúØÂ ÉÛÂ`ÚÓ€@ÐÂà›ÓÂ@'ÏÂÀÐÒÂ`]ÓÂüР|ÓÂÀ;ÖÂàèÛ€ØÂ PÐÂÀMÓÂÀGÔÂ`oÐÂU×€"ÕÂà<ÎÂ`]ÓÂüÐÂ`KÖ€þÚÂÀ”ÜÂÎÂ`uÏ ÎÂsÒÂÀ¬ØÂ ¯Õ ˆÑ  Ñ ùÓ€±ÒÂ@9ÌÂàËËÂàÕÂ`Ë >ÓÂ@\ÛÂÀMÓÂ@’ÒÂÀèÎÂà‰Ö šÎÂà•ÔÂ`9ÙÂà›ÓÂ`ÈÖ óÔÂà}ØÂ 8Ô ÷ÉÂ`WÔÂàƒ×ÂÀ¬ØÂ`cÒÂ@ªÎÂàØÂÀ;ÖÂ@€Õ€ÃÏÂÀôÌÂêÓÂÍ ùÓ€‡Ù€ŸÕÂyÑ a‥ÔÂ@’ÒÂÀƒÊ µÔÂà$Ò ^ØÂ`¼ØÂàwÙÂ`ìРˆÑºÛÂ`{ÎÂà0РÁÒ ÓÏ vÔÂ@¤ÏÂ@bÚÂ`ÈÖ€ŸÕÂ@ŒÓÂ@ÑÂÀSÒÂ@QÈÂÀ¸ÖÂÀ#Ú ÁÒ XÙ ÎÂ`ÚÓ 8Ô µÔ FÜÂ@ªÎÂ@3ÍÂÀúËÂàHÌ€“×€ØÂ`3Ú ÏÚÂ7ÜÂ@ªÎÂ@ҋΠ‚Ò€ØÂ@-ÎÂ@t× íÕ DÒ  ÍÂ@ÓÂÞÕÂÀÐÒ JÑÂàÔÂ@†Ô€:ÑÂàƒ×ÂÀYÑÂÀ5×ÂÀ)ÙÂ`øÎÂÀÖÑÂ@ÓÂ`ìР¦ÌÂ`cÒÂÐÂ@°Í€(ÔÂ`3ÚÂÀÛÂàèÛ »Ó€XÌÂ[ÖÂÀYÑ DÒÂ`âÂ@¤ÏÂ@nØÂÀ_РñÊÂ`iÑÂ@ßÚÂmÓÂ@EÊÂ@’Ò€(Ô ÏÂ@’ÒÂ@ Ô -Á ÐÂÀˆÞÂ@€ÕÂàÔÂ@€Õ ÎÂÀeÏÂÀMÓ ˆÑ ˆÑÂàÅÌÂ@ÑÂà­ÐÂÀÐÒÂ`]Ó #ÍÂÀeÏÂ@ ÔÂÀ¾Õ€RÍÂ…ÏÂ@ªÎÂÀMÓÂgÔ AÈ ;É€·ÑÂËÂ@'ÏÂêÓ€áÊÂÀÚÂà‰ÖÂ`¥ÇÂÓ óÔÂ`¶ÙÂÀ¾ÕÂÎÂÀÈ ÇÑ DÒÂüЀ±Ò€ˆÄÂÐÂà<ÎÂÀÄÔÂ`E×Â@ÈÉÂ`"ÈÂ`¥ÇÂ@ÒÂ@ŒÓÂ` ÌÂ@žÐÂ`ÎÕÂàÓÂ`uÏÂ@ÒÂÀ|àÂ`òÏÂà0ÐÂÀÜРµÔ€ÏÍÂàÅÌÂsÒÂ`òÏ€ÖÂà$ÒÂÎÂaÕÂ@EÊÂOØÂüÐÂÀqÍ ßÍÂ`«ÆÂà6ÏÂÀkÎÂÀYÑ DÒÂàúØÂ åÌ ÏÂàÂàúØÂàHÌ€ÛËÂ@’ÒÂ`™É ÇÑ€Ö XÙÂÀMÓ  ÍÂà<ΠDÒ€ØÂ@ñ×ÂÀÜÐÂ`ËÂ@÷ÖÂ@˜Ñ »ÓÂÀ²×Â@ŒÓÂ@ªÎ ùÓ€½Ð çÖÂ@ÒÂ`™ÉÂÀYÑ€íÈÂÀYÑÂ`oРëËÂ`Ë ÚºÛ ÍР¦ÌÂäÔÂ@?ËÂ`ÚÓ jÖÂ@†Ô 8ÔÂÀÄÔ€@ÐÂàÔÂ@˜Ñ ¦ÌÂÀ}ËÂ@¼ËÂàeÜ€ØÂ ¯ÕÂÀGÔÂðÒÂÀ¾Õ€.ÓÂ`E×ÂÒ×ÂΠ©ÖÂ@ Ô RÚÂ@ÕÂà*ÑÂ@bÚÂà­ÐÂ@†ÔÂà×ÂØÖ€Ú€½ÐÂgÔ€XÌÂsÒ íÕÂà•ÔÂÀeÏ€"ÕÂÀ)ÙÂÀGÔ Ü´ÜÂà³ÏÂ[ÖÂ@ýÕ 5ÊÂU×€íÈÂ@ Ô€(Ô >ÓÂÀ¬ØÂàqÚÂÀÛÂ@÷ÖÂ@ÓÜÂ`uÏ€ÃÏ€iÞ ÝÂà›ÓÂêÓ 8ÔÂðÒ GÇÂ`òÏ€× FÜÂ…ÏÂàTÊÂ@ÑÂÀ_ÐÂÀ;Ö nË bÍ vÔ€ÖÂÀ²×Â`‡ÌÂàNËÂ@t×Âà¡ÒÂÀ}ËÂà Ö€×Âà6ÏÂ@!ЀùÆÂ`“ʯÈÂàÔ &×€FÏ »ÓÂÀùà bÍÂЀ¥ÔÂÏ ‚ÒÂ@†Ô sßÂaÕÂ@÷ÖÂàÕÂ`E×Â`¼ØÂ€:ё̀·Ñ »ÓÂÀôÌ VÏÂ`˜ÞÂÀGÔÂ`ìЀXÌ€ Ù ‹ÛÂàfÇ ¯ÕÂ`ìÐÂ@€ÕÂ@€Õ€Ú€‡Ù ‚Ò€ÉÎÂà$ÒÂðÒ ^ØÂ@€ÕÂ`9Ù \ÎÂÀ­ÃÂÀYÑÂàBÍÂÀÄÔ ÁÒÂÀ²× ÓÏ DÒ€ ÙÂ ÛØÂ VÏÂ@˜ÑÂÀ¾Õ ÿÒ ÐÂÞÕÂ`ÊÂ@KÉÂà×ÂÀYÑ ‚Ò ÓÏ jÖÂÆÙ ¬ËÂÀ_ÐÂ`æÑÂà•Ô ØÂ ÐÂ`™ÉÂÀkÎÂÀ¾ÕÂ`ÔÔÂ@DßÂêÓ »Ó bÍ€·ÑÂ@’Ò€ìÝÂ@hÙ ˆÑÂ@÷ÖÂ@nØÂ€ÉÎÂÀ|àÂÀ|àÂ`˜ÞÂ@t×ÂU×ÂÀ ÚÂ@†ÔÂÀAÕÂðÒÂ`'Ü€ØÂà•ÔÂÀGÔÂÀÛ€ØÂ ©ÖÂàÔÂÀSÒÂÀÜ ¥á bÍÂÀ)Ù€ØÂ ÕÙÂ`†áÂàMàÂsÒÂà×€ÃÏÂ`3Ú ÕÙÂÀÛ Ü äá 8ÔÂöÑ jÖÂ@t×ÂêÓÂÀÐÒÂ`øÎ Û´ÜÂ`ÈÖÂmÓÂàÕÂ@©ãÂàâÜÂ`ÞÂÀ¸ÖÂÎÂ`¼ØÂêÓÂmÓÂÀwÌ€ØÂ`?ØÂà¡Ò€·Ñ€Ú€™Ö ÕÙÂÀSÒÂ@ëØÂÀ/ØÂ@PÝÂ`Â×Âà¹Î 2Õ€^ËÂÀâÏ ÇÑÂà¹ÎÂ@åÙ  ÑÂêÓÂ`°ÚÂÀÛ€4Ò€ŸÕ DÒÂÆÙÂ@åÙÂÀAÕ€ÉÎÂ@'ÏÂ@ŒÓÂsÒ »Ó ^ØÂ ØÂ \ÎÂà×Â@nØÂ‹ÎÂyÑ€ ÙÂàBÍÂà}ØÂüРhÌ€óÇÂÀ²×Â@ëØÂ€4Ò€ØÂ€:Ñ€ÕÌÂÀwÌ VÏ Ò 8Ô€øÛÂ`3ÚÂ`3ÚÂÀîÍÂ`'ÜÂIÙÂ`E×Â`ÊÂ`òÏ€(ÔÂgÔÂÀGÔ€·Ñ€Ú€ ÙÂ@VÜ€ÖÂgÔ  ÑÂ@VÜÂ`?ØÂà¡ÒÂÀ)Ù€4Ò á× ëËÂ`¶Ù DÒÂÀÖÑÂÌØÂ€FÏÂ`ÔÔÂàÕ 8Ô pÕ€RÍ ^ØÂ€ØÂ`‡Ì JÑ ·ÞÂàâÜÂ`òÏÂ&ÊÂà³ÏÂÀÐÒ &×Â`æÑ ‚ÒÂ`E×Â`QÕÂ`Í ëËÂ@ýÕ ßÍÂ`]ÓÂ`ÎÕÂ`WÔÂÞÕÂêÓ€àßÂ@!ÐÂà§ÑÂàÔ€±Ò ÐÂ@t×Â`ÔÔÂ@ÑÂ@ñ×Â@zÖ€™ÖÂÞÕ ÏÚ€RÍÂ@PÝÂÀ|àÂà_ÝÂIÙ€ØÂàSßÂàôÙÂ`æÑÂ@ÕÂ`9Ù ‘ÚÂÀ_РóÔÂÀ}ËÂàâÜ ÍÐÂ`cÒÂàÕÂÀGÔ€.ÓÂ`WÔ€òÜ óÔÂ@ŒÓÂ@hÙ€ŸÕÂ`ªÛÂ@!ÐÂ`oРšÎÂà ÖÂ@bÚ 8ÔÂ@¤Ï 5ÊÂà ÖÂà›Ó ÎÂ`3Ú€.ÓÂà­Ð ùÓÂÀè΀Ú 2ÕÂÌØÂÀÚ ùÓ ÍÐÂ`?ØÂ€ŸÕ ÓÏÂ`˜ÞÂ@Ñ bÍ >ÓÂ`WÔÂÀîÍÂà0ÐÂÏÂÀ¾ÕÂ@¶Ì€±ÒÂàèÛÂ@ ÔÂ@˜Ñ ÕÙÂ@ŒÓÂà0ЯȠXÙÂàèÛ ©Ö ÝÂ`Í ÁÒ€LÎÂÐÂàÑÊ‘ÍÂà ÖÂ@ÓÜ€FÏÂ@ÓÜ çÖ á×Â` áÂ`°Ú€þÚ€XÌÂà§Ñ ½ÝÂÀ Ú€"ÕÂÀYÑÂÀ¦ÙÂ@¶ÌÂà³ÏÂ`QÕÂ`-Û ½ÝÂ`˜ÞÂÀîÍ€™ÖºÛ€ Ù€‡Ù íÕ ØÂ€ÚÂÀÝÂ`KÖÂÀÛ€iÞÂàê¢ßÂÀÄÔÂ`ªÛÂÀÛÂÀçãŠãÂ@å ÚÂÀÛÂ`àÂ~åÂàîÚ€«ÓÂsÒ€óÇ DÒÂyÑÂÆÙ DÒÂ`Ë€ÉÎÂ`žÝÂ@÷ÖÂ`]Ó ‹ÛÂà¡ÒÂ`]ÓÂÀSÒÂ@åÙÂÀdä ‚ÒÂ ÛØÂ`ÔÔÂÀÖÑ ÓÏÂÀÊÓÂ@¼Ë >ÓÂ7ÜÂIÙÂà Ö ÐÂ`¤Ü ˆÑÂÀ¬ØÂ€Ú€¥ÔÂ@ñ×Â@¶ÌÂàôÙÂâ sß JÑ€@ÐÂÀÜРùÓÂ`9Ù€:ÑÂ@¤Ï ÁÒÂ@žÐÂ@!ÐÂ@€ÕÂ`'ÜÂ@ýÕÂ@!ÐÂ`9ÙÂÀ¸ÖÂ`°Ú màÂÀÖÑ€@Р¦ÌÂaÕÂ@ŒÓÂ` ÌÂ@€ÕÂÀ¸ÖÂÀ¦Ù€òÜ "â VÏ çÖÂÀÊ jÖ ÎÂÀšÛ€‡ÙÂÀ ÚÂà$ÒÂ@ÓÜ€‡ÙÂÀúË ÿÒ€ÚÂÀÚÂà¿ÍœàÂ@nØÂ`E×Â@\ÛÂÀpâÂOØÂà_ÝÂ@ÇÞ FÜÂÀ_дÜÂIÙ d×Â@€ÕÂ`¤ÜÂà_ÝÂ`bçÂ`DìÂÀßÂ`ÔÔ ÃÜÂà§Ñ ‹Û€ ÙÂ@Á߀{Û åŠãÂÀ¦ÙÂ`àÒ€ŸÕÂàƒ×Âà¸ã€ÚÂ@ñ×Â@ÙÛ öÞ€øÛÂ@ÓÜÂ@ßÚÂ@žÐÂÀÝÂÀ ÞÂ`ÚÓÂÀÛ‹ÎÂ@&ä€ÎâÂàMà–á€c߀ÚÂäÂÀóá "âÂàÕÂÌØÂ ±ßÂÀšÛ "âÂ`¤ÜÂàÜÝ Û€]àÂ@ÇÞÂ`¤ÜÂàÄáÂûåÂ@hÙÂ@ÁßÂ@VܨÞÂà5äÂÀ¸Ö á×ÂÀAÕ ÃÜ€ªèÂÀùàÂÀ¦ÙÂÀ¦ÙÂ@ÓÜÂ`!ÝÂ`¤Ü ÏÚÂàÜÝ üÝ€¤éÂïçÂ@\ÛÂ`€â€ÚàÂõæÂ`žÝÂÀÝÂÀ ÚÂÀ)Ù ØÂ êà€àß Àç¨ÞÂ@ÍÝ€þÚÂ`÷ã UäÂ`ñäÂ@»àÂÀˆÞ€òÜ ,Ö ÝÂ`E×ÂàšèÂàÄáÂ`’ßÂÀÜÂ=ÛÂà¾â Ý€ØÂàSß®ÝÂà}ØÂ€Îâ€×Â@DßÂ%ßÂ`nåÂÀXæÂ€˜ë€ÎâÂ@µáÂûåÂÀSÒ Àç 4ßÂ%ßÂ`ßÂà²ä LÛÂ@é CçÂÀŽÝÂ`ýâÂÀ|à RÚ ä  æÂ@ å IæÂ ¥áÂ`VéÂåÂféÂÀ:ë¢ßÂäÂàAâÂ`'ÜÂ`€â€iÞ€]à€žêÂÀÛåÂÀˆÞÂà¸ã€ÚÂ`°Ú¨ÞÂ`!Ý ÀçÂâ€ÔáÂÀŽÝ »ÓÂ`†áÂàƒ×Â`WÔÂ@yëÂÀ:ëÂÀ#Ú€ÚÂ@VÜ @Ý ÁÒ€¥Ô€æÞ LÛ …ÜÂ@Á߀þÚÂàèÛÂ@ýÕ€ÚÂÀÄÔÂà_ÝÂàÔÂ@bÚ 4ßÂ`{ÎÂàØÂ€iÞÂ%ßÂÀçã¢ßÂÀMÓ .à€9æÂ€ìÝÂ`žÝ ^ØÂ@ßÚ ÜÂÀŽÝÂ`â€WáÂÀ/ØÂàôÙ RÚ€Èã ØÂ€Âä OåÂàÄáÂ`'ÜÂÀÝ ÿÒÂ@»à ãÂà ç àìÂ@ÍÝÂ@ÍÝ |ÓÂ@ÓÜÂÀ²× åÂÀŽÝÂ@ÙÛÂÀóá ØÂ £× ÕÙ€“×ÂàAâ€þÚÂà}ØÂàSßÂÀùàÂ` áÂ@»àÂâ  æÂ@¯â€ÈãÂrçÂCÚÂ@ÇÞ yÞÂÀ Ú€ÈãÂ`žÝÂÀváÂ`€âÂÀ‚߀×ÂÆÙÂ@»àÂàMà Ìå ¢ì =èÂàÄá€ØÂÀÝÂÀXæÂà)æÂÀváÂ`zãÂàSßÂ@8áÂà¾âÂÀváÂ`-ÛÂ@ÍÝÂ@hÙÂ+ÞÂ`¼ØÂõæÂ@>àÂ@¯â€æÞÂ`täÂàúØÂÀ”ÜÂ`ýâÂâ {èÂ@PÝ IæÂõæÂÀdäÂàSßÂÀÉèÂ`tä Ÿâ yÞÂ@>àÂàSßÂ`Ùè ¥áÂÀ”ÜÂÀÝÂ+ÞÂÀ5×Â@&äÂâÂ@>àÂ@JÞ ØÂ`bç ºèÂà€{ÛÂHîÂà/åÂðÒºÛ mà Ý £×Â@©ã @ÝÂàAâÂ@DßÂÀùàÂÀ Þ€Úà€'é =è vÔ ÒäÂ`ßç œíÂà;ã éõÂlèÂ` áÂ@!ÐÂ+ÞÂ@JÞ ÃÜÂÀ‚߀Ôá mà 4ßÂ@ åÂàSßÂ`VéÂ@ÁßÂ`àÂÀváÂà¾âÂàÊàÂ@\ÛÂlè IæÂ Ü üÝÂ`’ßÂ~åÂ@êÂ`!ÝÂ@µá "âÂàÐ߀˜ëÂ+ÞÂà#ç–á …ÜÂ@©ã€øÛÂ`˜Þ€™ÖÂÀ^倸ÛÂ` áÂÀpâÂÀRç®Ý :ÞÂÀÝ ãÂÀóáÂIÙÂ` áÂ`?ØÂ ±ß åÂäÂàÕÂÀÚ vÔ Ÿâ d×€‡ÙÂà‰Ö€ìÝÂ@ÇÞ Òä Ü äáÂà/åÂ`KÖÂ`ÈÖ€ØÂà_ÝÂÀMÓ íÕÂà}ØÂmÓÂ@PÝ€ØÂ`ߺÛÂ`ŒàÂÀSÒÂ=ÛÂ`ŒàÂxæÂ FÜ ·ÞÂÒ×€ÖÂÀáä "âÂ`ßÂ@ÙÛ ØÂ€þÚ ÏÚ màÂ`÷ã .àÂ`ßÂ@JÞÂCÚÂàÖÞ Ý ÇÑÂÀ/ØÂœàÂ`9Ù€òÜÂà_ÝÂ` áÂ@¯âÂ`'Ü 4ßÂÀ¬ØÂ¨ÞÂÀóáÂàGá sß Òä 4ß äá ãÂ@,ãÂà‰Ö€"ÕÂàkÛÂ@ëØÂ€ØÂ ±ßÂ@>àÂà²äÂÀ¬ØÂIÙÂàwÙ ØÂ ‹Û &×Â`]ÓÂ@PÝ€Úà´ÜÂÀŽÝÂÀóáÂ@2âÂ`-ÛÂ`˜Þ LÛ ÜÂ@ýÕÂÀùàÂÀ²×Â1ÝÂ`3ÚÂÀ‚ß ÛÂà¾â aâ Ìå XÙÂÀßÂàAâÂÀ¾ÕÂàS߀‡ÙÂ@ßÚ &× yÞÂ`!Ý ©ÖÂàÖÞÂ@>àÂÀ5×ÂÀYÑÂ@ýÕÂàÊàÂüÐÂÀÚ€Wá€Kã …ÜÂCÚÂàMàÂ`žÝÂà#çÂ`ßÂ@\Û€"ÕÂ@Á߀àß ÒÂ`ìÐÂrçÂ`߀uÜÂÆÙÂ@ŒÓÂà$ÒÂ@˜Ñ á×Â@ëØÂ€uÜÂÀ¾ÕÂU×Â@Á߀þÚÂ@÷Ö€4ÒÂРJÑ€¥Ô€(Ô€FÏÂ@ÓÜÂÀ ÚÂÀ¸ÖÂ`]Ó Ý ùÓÂàÕ |ÓÂ`oÐÂÀƒÊ€iÞÂÀ/ØÂ@÷ÖÂàqÚ€Ö€Ö€(ÔÂüÐÂ`?ØÂ€QâÂàÕ DÒ€Ú€(ÔÂ@t×ÂÀ¸ÖÂ`ªÛ —ÙÂ@’ÒÂØÖÂ`QÕ ØÂàúØÂ`E×Â@°ÍÂ`žÝÂÀ)Ù &×Â@ÙÛ€(ÔÂÀ¦ÙÂÀÊÓÂ@ŒÓÂ`'Ü Ü —ÙÂ`’ßÂÀ#Ú …ÜÂ@zÖÂ@ÕÂà­Ð á×ÂàîÚ RÚÂà Ö ^ØÂ@‹èÂàÊàÂ@åÙÂàÊàÂ@»àÂà¸ãÂ`ÞÂÀÛ á×ÂmÓÂ`ÔÔÂ@ÒÂÀGÔ€uÜ€òÜÂà¡ÒÂàwÙÂ@D߀QâÂU×Â ÛØÂ LÛÂÀ5×ÂàÖÞÂàôÙ€uÜÂ`¤ÜÂàÕÂà¸ãÂ`Vé€{ÛÂ`ÞÂaÕÂÀ#ÚÂÀ‚ßÂÀšÛ —Ù€±ÒÂà•ÔÂÀŽÝ€òÜÂÀÜÐÂ`ÎÕÂÀ¸ÖÂÒ×ÂÀ ÚÂÀÕæÂ öÞÂ`KÖÂ`ÎÕÂ@8áÂàÊà mà 4ßÂ@hÙÂüÐÂ@µáÂxæÂÀÛ€WáÂàÜÝ€ÏÍœàÂ`ŒàÂàîÚ€ØÂÀkΠ‚ÒÂÀÝÂÀóá Ü 5ÊÂÀ¬ØÂ@ÙÛÂÀíâ UäºÛÂ@¤ÏÂU×ÂàêÂÀ|àÂõæÂÀÿßÂà­Ð XÙÂ`oР@Ý€ ÙÂ`cÒÂ@åÙÂÀŽÝ ÒäÂ`WÔÂàwÙÂÀšÛÂOØÂ@ 借ÕÂÀÜÂU×Âà0ÐÂ`ÈÖÂ`Þ´Ü DÒ «àÂàúØÂOØÂÀ#Ú ÒÂ`KÖ€ØÂ`ÚÓ jÖÂà}ØÂà*ÑÂØÖ€Wá RÚÂ`?ØÂàÕ€ŸÕÂ@!РÍÐÂàâÜ€cßÂàkÛ ÞâÂÆÙ€{Û€Ú€Ö ÁÒÂ@ÓÂ`'Ü€ÚÂÀÜÐÂÀÚÂÀ¦Ù€™ÖÂ`WÔÂIÙ gá RÚÂ@VÜ€ÚÂ@>à€Ú ÛÂËÂðÒÂÌØÂ`iÑÂÒ× 2ÕÂ@ëØÂ€“×Â`æÑ€™Ö ØÂ€:ÑÂÀ}Ë ÿÒÂàÓÂ@bÚ€òܮ݀øÛÂÀ¸ÖÂÀYÑÂ`°ÚÂ@»àÂ@ÇÞÂàAâ ÉÛ€‡Ù ,Ö€àßÂ ÛØÂ€WáÂâÂ[ÖÂ@VÜÂàGáÂÀÿ߀™ÖÂÀdäÂà³Ï´Ü ±ß–áÂ`ÈÖ öÞÂÀŽÝÂà5äÂ%ßÂ`Â× ‘ÚÂÀ²×Â`]Ó€‡ÙÂà¡ÒÂàwÙÂÀGÔ ÉÛ FÜÂàËË XÙ€ØÂ`æÑÂ@ÁßÂà›Ó ÕÙÂÀAÕ \ÎÂ`òÏÂ@ýÕÂÀLèÂ@µá “ä€uÜ ÛÂIÙ€àßÂàTÊ ^ØÂ`¶ÙÂ@ÇÞÂàôÙ ÃÜÂ@¯âÂOØÂ XÙ€™Ö€FÏÂÀ¾Õ€½Ð XÙÂ`iÑÂU×Â@ëØÂàeÜ€æÞ ˆÑ€ ÙÂ`WÔÂ@ŒÓÂÀ;Ö€4Ò€"Õ€‡Ù aâÂÀ¦Ù Û ÐÂ`žÝÂÀ5×ÂÀAÕÂàqÚÂÍ€{Û ^ØÂà‰ÖÂ@’ÒÂ`ËÂÀóá ½ÝÂÀÝ \Π#ÍÂàÄáÂ@†ÔÂ@Ò ÍР&×€׺ÛÂ`3ÚÂ@t× —Ù€ Ù ÛÂ@!ÐÂÀkÎÂàÕÂÀ¦Ù€Ö JÑÂÀ¬ØÂà¡ÒÂ…Ï£ÊÂÀúË d×ÂÀAÕÂ@ñ×ÂàúØÂ@ÕÂ@ÓÜÂ`QÕ PРñÊ :Þ€¥ÔÂ@†ÔÂ…ÏÂÀ)Ù ,Ö€4ÒÂà¿ÍÂ@˜Ñ FÜÂÀSÒ€™ÖÂ[ÖÂ`ÔÔÂgÔÂ`ÔÔ€iÞÂÀÊÓÂ@-ÎÂ@Ó€‡Ù€“×ÂÀÄÔÂà•Ô šÎ‘ÍÂ`°Ú DÒ ÿÒ€™ÖÂ@VÜÂmÓ ÐÂ`oЀØÂ@zÖ ÙΠ|ÓÂÀôÌÂÌÂ`Œà XÙÂ`9ÙÂ@t×ÂÀwÌÂ@€Õ€™Ö ÉÛ€RÍÂ`øÎÂÀÐÒÂàÔÂ`ÚÓÂ`øÎ ÉÛÂÀ Þ ÍРÒÂÀÊ€4ÒÂ@‘çÂüРóÔÂ`uÏ€ÏÍ Ѐ“×ÂÀÜРÁÒÂÀŽÝÂÀeÏÂ`oР£×Â@-ÎÂàÅÌ JÑÂaÕ€·ÑÂyÑÂ,ÉÂ`{΀«ÓÂ@KɩɠÇÑÂ@nØÂ \ÎÂ@ñ× ŽÐ ØÂ€(Ô€ØÂÀÚÂÀ”ÜÂ@IóÂÀ‚߀¥ÔÂ`iÑ€ØÂ€±ÒÂCÚÂÀ¾ÕÂ@÷ÖÂÀ5×€oÝ€±ÒÂÀ‰ÉÂyÑÂU×€:Ñ€L΀ÕÌÂ`°Ú€ŸÕÂà•Ô ŽÐ ˆÑÂ@KÉÂÀ}Ë &× vÔÂ@¼ËÂÀÊÓ€ÚÂ@žÐ šÎÂÀqÍÂ`uÏÂ@'Ï ÓÏ€oÝÂàÅÌÂ`E×ÂØÖÂ@\ÛÂ`¶Ù€øÛÂÀâÏÂ`WÔÂ@nØÂÀ¦ÙÂÀkÎÂÀÊÓÂÀÛÂ`øÎ€ÕÌÂà¡Ò ùÓ óÔÂ@'Ï‘ÍÂU×ÂÀ¦ÙÂ@Õ€øÛ óÔÂ`°ÚÂÀúËÂàÀ DÒ ØÂà›ÓÂ`!Ý XÙ€×ÂÀ¸ÖÂ@ÇÞÂ@ÕÂ@¤Ï ¯ÕÂÀ;ÖÂ@bÚÂ@ŒÓÂÀÜÐÂaÕÂ@ŒÓÂÀ¬ØÂ€4Ò ÙÎÂÀ;Ö ÒÂÀÚÂ@ÁßÂ@zÖ€ ÙÂ@žÐÂ@ýÕ £×€FÏ€"ÕÂÀÚÂ@åÙ€{ÛÂ@åÙÂüÐÂàwÙÂ@t×ÂÀÝÂàBÍÂà¡ÒÂÀGÔÂ@žÐ´Ü€RÍ ¬Ë€ ÙÂ@’ÒÂ`oР¦Ì óÔ€™ÖÂà§Ñ®Ý Ѐ4ÒÂ@žÐ€×Â@bÚ€ØÂ€¥Ô€@ÐÂ`àÒÂ@\ÛÂIÙÂ@,ãÂ%ß &×€òÜÂÀùà Ï ¯ÕÂêÓ jÖ€@ÐÂÀ)ÙÂàÕÂ ÛØÂ@’ÒÂÀYÑÂàÕ ·ÞÂ@hÙÂÀÊÓÂ`ÚÓÂàBÍÂ`ÈÖ€øÛÂÀ¾ÕÂÀ;֋΀4ÒÂà¡Ò€·Ñ€«Ó |Ó€“× ÝÂ@†ÔÂ@zÖÂ@ñ×ÂÀ/ØÂÀ¾ÕÂ`ßÂà€:ÑÂà*ÑÂÀGÔ äÂ`iÑÂÀÐҠˀ@Р‘ÚÂÀSÒÂÀ5× Ò ^ØÂ@ýÕ€4ÒÂàÓ€½Ð ½ÝÂÀLèÂûåÂÀÜÂàèÛ hÌÂÀ}ËÂ@ÈÉÂ` Ì &×ÂÀ²× µÔÂÀSÒÂ`¤ÜÂà Ö€iÞÂÀ¦ÙÂàÔÂÀÛÂgÔÂ@ÑÂàHÌÂÀÊÓÂàqÚÂ@Ó ¯Õ ÍкۀàßÂà§ÑÂà0Р£×Â@ñ×€«ÓÂàSßÂÀMÓÂàúØÂäÂyÑÂàeÜ€™ÖÂ7ÜÂРýȩɠyÞÂ@zÖ á×Â@ÕÂÀ_ÐÂ`Ë ÏÚÂÀôÌÂ@KÉ ËÂ`ÍÂ@ Ô óÔÂ`æÑÂ`KÖÂ@¤Ï ÏÚÂÀ;Ö€|ÆÂ`ÍÂàqÚ€±ÒÂàÔ €ÈÂ@ýÕÂ@ÕÂ@!Ѐ"ÕÂ@nØÂÀßÂ`àÒÂÌØÂ`¶Ù€ÏÍ ØÂ pÕÂsÒ ÇÑÂÀ;Ö€™ÖÂÀeÏÂàúØÂàÕÂ[Ö€½ÐÂ`E×€@ÐÂêÓ pÕÂ`æÑÂ`žÝ  ÍÂàÔ ØÂ`Â× £×ÂÀÚ ÙÎÂ@ÔÇÂØÖ€ÖÂ@nØÂ@ÓÂ`ÍÂÀÐÒ€oÝ ÁÒ PÐÂ`øÎÂ`øÎÂÀAÕÂ`ÔÔÂàÅÌÂàBÍ€ØÂ©ÉÂà0ЀLÎÂ@¤ÏÂ`QÕÂÒ× PÐÂ`¤Ü …ÜÂÀÐÒ Ù ‹ÛÂ@t×ÂgÔ »ÓÂà§ÑÂàúØÂ`æÑÂ@ŒÓÂ@’ÒÂ[Ö€½ÐÂyÑÂÀ;Ö€¥ÔÂ@÷Ö€{ÛÂà×ÂàTÊ |ÓÂÀ|àÂ@ÈÉÂ@’ÒÂöÑ  ÍÂ@¼Ë AÈÂàTÊÂàÅÌ ÕÙ ÉÛ ÎÂ@’Ò ‚Ò ÍÐÂà³ÏÂàÑÊ ùÓ ßÍÂöÑ /ËÂà³Ï€”ÂÂàBÍ€(ÔÂÐÂÀôÌ€pÈ \ÎÂ@'ÏÂàÕ€áÊ€ÿÅ ÷ÉÂ@åÙÂàÑÊ tÊÂàBÍÂ`4ÅÂ`™É jÖ€ŸÕÂ@!ÐÂ`þÍ€ØÂàúØÂ`Í€Ö ¦Ì€ØÂ ²Ê€:ÑÂÀšÛ —Ù LÛÂàîÚÂ@ŒÓÂ@Ñ—Ì pÕ nËÂ`{Π2ÕÂàBÍÂ`òÏÂà6ÏÂÀ_ÐÂà³Ï€FÏÂ2ÈÂsÒ€"Õ€ØÂ`QÕÂ@ÂÊ »ÓÂ@ßÚ ÓÏÂÀèÎÂ=ÛÂâÂmÓÂà×ÉÂÀŽÝ ”Ï€‡ÙÂà`È€±ÒÂ@ŒÓ ‹ÛÂÀ Ú ØÂÀ ÚÂÀkÎÂ`(Ç >ÓÂà Ö ±ß€‡Ù€LÎÂÀÜÐÂ@’ÒÂÀSÒ€@Р>ÓÂ@ÈÉ DÒ ØÂÀÜР)Ì£ÊÂàÕ€.Ó bÍ€4Ò /ËÂà­ÐÂ@ÈÉ€çÉÂyÑÂCÚ íÕ 8ÔÂ>ÆÂ ÁÒ€ÏÍÂàÔÂ@ÎÈÂÐÂàƒ×Â@ ÔÂàÕ 8ÔÂàÔÂ@ÓÂ[ÖÂ@-Π&×Â@ ÔÂ`ÚÓÂ`ËÂÀ¾ÕÂÀ}ËÂ@ ÔÂ@žÐÂêÓÂà×ÉÂ1ÝÂà×ÂÌØÂ—ÌÂ`!ÝÂÀÄÔ ÐÂ@ÚÆÂ@-ÎÂ`!ÝÂ@ýÕÂ`øÎÂà<ÎÂÀÄÔÂ@÷ÖÂàéÂ@ÒÂ@ŒÓÂ@nØÂDÅÂÀÜÐÂ`cÒÂàqÚ€ Ù )ÌÂ@ ÔÂ+ÞÂ@ÑÂ@WÇ JÑ jÖÂÀeÏÂÀÊÓ ¦ÌÂà•Ô ”Ï ÏÂ@žÐÂ@t×ÂØÖ€¼åÂÀÄÔ€FÏÂ`¶Ù ÉÛ€ØÂ ÁÒ€™Ö ÓÏÂÀÊÓÂyÑ€øÛÂÀÚÂà¹ÎÂÀ²× ,Ö ÍР>Ó ˆÑÂÀqÍÂaÕÂà¡Ò £×Â`{ÎÂÀâÏÂIÙÂ`'ÜÂ`Â×Âá€×Â`?ØÂÀ¸ÖÂ@÷ÖÂàÄáÂ`ÔÔºÛÂÐÂà•Ô ÙÂÀ/ØÂ@ÕÂ@nØÂ@÷ÖÂ`žÝÂÀÜЀØÂàÖÞÂàÓÂà¹ÎÂÀ‚ßÂ`ÎÕÂ[Ö ÏÂàèÛÂÌØÂ€Ö ÙÂÀ‰É€½ÐÂ@÷ÖÂÀAÕ Ù á×Â@VÜ >ÓÂÀGÔÂ`þÍÂ`ÞÂÀ¾ÕÂàHÌ ¦Ì ¦ÌÂ`E×ÂÀóá Ú 8Ô ØÂ ØÂÀâÏ€.ÓÂ@ÒÂÀ²× d×ÂÀMÓÂ@åÙÂsÒ JÑÂOØÂ`‡ÌÂà×€çÉÂÀMÓ &×Â`¼ØÂ Π Ñ€:Ñ ^ØÂÀ}Ë€ÕÌÂËÂÀƒÊÂÀÐÒÂäÔ LÛÂÀqÍÂaÕÂöÑÂ`àÂÀqÍÂÏ€«ÓÂaÕÂà¡ÒÂ`9ÙÂà× nËÂà*Ñ åÌÂ[ÖÂÀ#ÚÂ`{ÎÂà6ÏÂ`iÑ€FÏ JÑÂ`(ÇÂ@˜ÑÂ`òÏ JÑÂ`þÍ pÕ€× á×€ØÂÀMÓÂ`òÏÂÎÂ@ßÚ ÝÂÀMÓ |ÓÂaÕÂÀ;ÖÂ@JÞÂà*Ñ€.ÓÂÀ ÞÂÏÂàÑÊÂ@nØÂÀôÌ »ÓºÛ PЋÎÂmÓÂàúØÂ€"ÕÂÀÜÐÂ@JÞÂ@°ÍÂ`{ΠÜ€4Ò€±ÒÂäÔ ñÊÂàHÌÂ@ÑÂ`{ÎÂØÖÂüÐÂÀ#ÚÂ`cÒÂ`ªÛ€ŸÕ ÕÙÂ`ÈÖÂ`Ê€(ÔÂ`cÒ DÒÂäÔ RÚ ¯ÕÂÀšÛ 2Õ ÇÑÂÀÚÂÀ‚ß ÝÂá µÔÂÀÖÑÂaÕÂàÕÂ@ÇÞ€ÕÌ€ÛË DÒ ÎÂÀ”Ü XÙ€@ЀFÏÂ@¶ÌÂÀ‰É pÕ€ÛË ÁÒ ÕÙ–áÂÀeÏÂà6ÏÂ@ªÎÂÀ;Ö€·ÑÂäÔ ¾ÈÂ`ÍÂ`WÔÂà¡ÒÂàÔÂ@bÚÂÒ×Â@hÙÂüÐÂÀâÏÂà$Ò »Ó »Ó Ý€™ÖÂÀÖÑÂ@ýÕ ÕÙÂ`ÔÔÂÀqÍÂ`àÒÂÀÐÒ ‘ÚÂÀÝÂà_ÝÂÀŽÝÂÀ;Ö€×ÂÀÊÓ ^ØÂÀwÌÂ`¥ÇÂmÓ …Ü —Ù€"ÕÂÀ#ÚÂ@JÞÂ@ñ× d×ÂÀ¾ÕÂ@8áÂÀ¦Ù€{ÛÂàîÚÂÀYÑ vÔÂàôÙ mà€ÖÂ@˜ÑÂÀ_ÐÂ@Dߑ͠ÝÂ`'ÜÂÀŽÝÂmÓ Ü sß (áÂ`Â×ÂàôÙ€æÞ å ÍÐÂà¦æÂÀváÂà›ÓÂsÒ ½ÝÂ@2â RÚÂ`åæÂÌØÂ@2â€cßÂÆÙ öÞÂ`÷ãÂ+ÞÂÀšÛ€WáÂà¾â€Úà€iÞ %ìÂ@\ÛÂàMà ØãÂlèÂÀ‚ßÂïçÂà ç òé KðÂàÖÞÂ`hæÂ`ýâÂÀóáÂà¦æÂ@JÞÂ~å€?åÂ@‘ç€zð ‡æÂàèÛ …Ü œí Øã€Âä„äÂ`ÓéÂÀ4ìÂ@öëÂà|íÂàAâÂ@…éÂÑìÂà5äÂ`8î [ãÂà çÂ~åÂÀvá çÂ@£äÂ@»à ãÂâ€àßÂ`bçŠã€¶æÂ`Vé€Kã 7éÂ@æÂ`ßç ÞâÂÀùà ™ãÂ`â cìÂÀ«íÂ`nåÂÀ(߀†î€ëòÂÀ4쀆î %ìÂÀøõ€hó °ô¿ï  æÂ –îÂà·øÂËí àìÂÀ"ï ûòÂ`õÂÀ¥î€ÓöÂÀŸï€ëÂ`÷€žêÂ}ú€°ç ¨ë iëÂàXó `÷ cìÂàˆëÂÀo÷ÂÀþô 7éÂàé ž÷Â@[ð éõÂÀ@êÂ`&ñ œíÂÀòÂ`äûÂ@ê ÎïÂ@‘çÂ`bç ¶óÂÀì÷Â@—æÂ€ëòÂ`>íÂå íÂÅïÂ`÷Â@UñÂõÂ`êú °ôÂ@œúÂ`múÂ@ØðÂ ÆæÂàóîÂÀô KðÂ`©ð EñÂÀÏç Kð¹ð Šð 3ôÂÀ“ñÂ×ë€?åÂÀ½ê€íÂàóî ªõÂ`õÂ0ò€€ïÂÀôÂ`êÂÀÃé Šð ué ªõ€'é€ïÂ`,ð€EäÂ`ôÂZëÂ`©ðÂàÃöÂÀ“ñ ò€ï ðÂàÿìÂ@[ðÂ@IóÂàùíÂ@—æÂ@7öÂ@ÀôÂù€hóÂÀ½êÂàpïÂ`âÂ~åÂ`\èÂà#çÂÀ“ñ „ñ€hóÂ@ûÂ`¯ï€ÙõÂ`ëå€Kã€3瀆îÂÀ·ëÂ@OòÂÑì€ î€˜ëÂÀ^åÂÀ“ñÂàÃöÂ`,ðÂ`‘ôÂ@üêÂ@Uñ³ñ ³þÂ@êí€3çÂà”逼åÂ@yëÂÀðÂ`‹õÂÀFéÂàèÂ`&ñ çÂ`2ïÂÀ4ì øèÂ`‘ôÂÀòÂÅîÂà”é åÂÀ(îÂxæÂ@,ãÂ`âÂàˆë€¼åÂ@£äÂ@è€Âä¨ÞÂ`Pê€WáÂõæÂ ´éÂ`©ðÂÀ^åÂÀÏç ŸâÂÀjãÂàâÜÂÀRçÂà¦æÂ€ÎâÂà¾âÂ`€âÂ`Œà ´éÂ`ëåÂà”éÂÀRçÂ@ðìÂà ç€WáÂ`ßÂ`>íÂ`PêÂ`bçÂ`¼ØÂ`täÂÀ¥î ™ãÂOØÂÀpâ€-è oê€!êÂ@VÜÂÀFé å çÂàÊà öÞ ÒäÂ@ÓÜ€Èã´ÜÂäÔ ÃÜ€9æÂ Àç€ìÝÂ@&äÂÀ@ê€Âä€òÜ «àÂà¬åÂàÜÝÂà/å€Qâ üÝÂ`žÝÂ@öë®ÝÂ ÆæÂ oê 4ßÂ@µáÂ`€âÂÀjãÂàS߀æÞÂ@ÇÞ í CçÂ@êí òéÂ`†á€× êàÂ@>àÂáÂÀùà€!êÂ@ñ× ÌåÂ`µî Kð Òä€WြåÂàAâÂ`€â ÉÛÂ@†Ô€í ‡æÂ@êÂ`ñäÂ`’ßÂ@öëÂ@ßÚÂÀpâ ¥áÂ` áÂÀáä€Úà€æÞÂ@åÂÀÉè ìê {èÂ@>à€ÚàÂÀÿ߀WáÂà*ÑÂÀFéÂàúØÂ µÔ€{ÛÂ`žÝÂ@åÂàƒ×Âà$ÒÂÀ߀Kã …ÜÂ@‘ç å oêÂÀÝÂ`Ùè€ìÝ€Wá (áÂáÂ@£ä€WáÂ`žÝÂÀ¬ØÂÀRç üÝÂ@8á Ÿâ ‡æÂ`žÝ 4ß vÔÂ@bÚ FÜÂ@Áß ¥áÂ`ÚÓÂ@D߀]àÂà¸ã êà ‹Û€{ÛÂ`QÕÂ@ýÕÂÀ ÞÂàSßÂÀ|à åÂ ÆæÂ=ÛÂ@\ÛÂÀÿßÂàÕÂ@¯â€Îâ ÉÛ êà€]àÂÀÚÂàYÞÂàÜÝÂ@€Õ€{ÛÂ`]Ó …ÜÂàGáÂÀ Þ mà |ÓÂà}ØÂ êàÂ@ÍÝÂ`-ÛÂ=Û ½ÝÂàÐß Cç åÂ`,ðÂ+Þ êàÂ ÆæÂ@¤ÏÂ`3ÚœàÂÀÏçÂàSßÂÀÏç å aâ€ÚÂ@…éÂ@‹èÂâ€Îâ€ÚàÂ@‘çÂ`ÓéÂ`˜ÞÂäÂ ÆæÂ (áÂ@åÂÀÿß á×Â@åÂÀ±ìÂÀ^åÂÀ ÚÂ+Þ ™ãÂ`ŒàÂà¸ãÂ@ åÂ`€âÂà/å |Ó ¥áÂàèÂàÓ ÝÂ@ åÂ@\Û ÐÂ@nØÂ€]àÂÀváÂÀÿßÂ@ñ×Â@ÍÝ€žêÂâÂàÐßÂ`hæÂ@PݮݠLÛÂàèÂ@µáÂà¸ãÂ@ýÕœàÂÀíâ€ÔáÂÀŽÝÂÀYÑÂ`°Ú .àÂgÔÂÀváÂàYÞ pÕ–áÂÀ|àÂ`ÞÂÀÚÂàa³ÂÀjãÂà çÂ=Û XÙÂàÖÞÂàâÜÂ@ßÚÂ`’ßÂà³ÏÂØÖ€{Û€‡ÙÂà;ãÂ`˜Þ€Ú DÒ ÏÚÂ@!ÐÂÀ¾ÕÂÀ)ÙÂÀÐÒÂ`zãÂÀèÎÂ`à [ãÂ@>àÂØÖ ÚÂ@t×Â`ÔÔÂå€(ÔÂ`ñäÂ@D߀Îâ  æÂ ÕÙÂOØÂ ÛØÂðÒÂCÚÂÀÐÒÂ@ñ×Â@hÙÂà*Ѡ܀]àÂ@>àÂàÖÞ FÜÂ`Ùè€Eä çÖÂ`Â×Â`9Ù ‘ÚÂà$ÒÂÀâÏÂÀ¾Õ JÑÂà•Ô€½ÐÂà›ÓÂàYÞÂ@ñ×ÂÀÝ€Úà€ØÂ`ÍÂ`æÑ€.ÓÂàSßÂ`nåÂà*Ñ€oÝ ‹ÛÂàÄáÂ`-ÛÂÀ;ÖÂ@ýÕÂ@hÙÂÀÄÔÂ`iÑ d×Â@t× 2ÕÂàƒ×Â@†Ô ÉÛ (áÂàÐßÂ=Û ØÂ@¶ÌÂ`ñäÂ@Á߀òÜÂà_ÝÂ`QÕÂgÔ€øÛÂ`3ÚÂà}ØÂÀ¸Ö ÕÙ€ŸÕÂÀóáÂÞÕÂ@†ÔÂ@€ÕÂ`æÑÂØÖ |ÓÂÀŽÝ FÜÂÀMÓÂÀ#Ú ÝÂáÂ@ ÔÂÀGÔÂÀGÔÂOØÂ`Þ€Ú€øÛÂ@nØÂÀAÕÂà¬åÂÀSÒ RÚ´ÜÂ`¶ÙÂ`KÖÂ@zÖ VÏÂ`“Ê FÜ€æÞ VÏÂÀÄÔÂ`-Û€(ÔÂ@-΀ùÆÂ çÖÂ`ÚÓÂà§ÑÂ[ÖÂ`àÒÂÀÝÂ@ÍÝÂIÙ€ìÝ€·Ñ€:Ñ€ÚÂÀ)ÙÂ@ÒÂÀÊÓÂ@>àÂ`†áÂà­ÐÂÀ ÞÂ`˜Þ‹Î€ ÙÂgÔÂàâÜÂ[Ö€(ÔÂÀAÕÂÀ;ÖÂÀ‚ß üÝÂàGáÂ@ýÕ€×ÂüÐÂ@ ÔÂüÐÂàÐßÂ…ÏÂàƒ×ÂöÑÂ@åÙ d×ÂðÒÂÀ¦ÙÂÀ ÞÂ@nØÂ ²ÊÂ@ŒÓÂ`ÔÔÂÀÖÑ ÕÙ‘Í ØÂÌØÂ€:ÑÂ`cÒÂ`QÕÂàÄáÂ`žÝÂÀÐÒÂ`Â×ÂÀ Þ ¯ÕÂ@’Ò íÕ€{ÛÂ@žÐÂÀ/ØÂ >ÓÂ`€âÂÀÊÓ ÐÂ@ýÕ ‚ÒÂÀˆÞÂà•ÔÂ@ ÔÂ`æÑÂÐÂ@'ÏÂ@°Í€·Ñ€QâÂà›ÓÂU×Â ÛØÂ >Ó€™ÖÂ@ÇÞÂàØÂÀwÌÂàeÜ d× 4߀Úà 4ß yÞÂ@VÜ >Ó ·Þ ·Þ ÉÛÂ@ÍÝÂàSß ”ÏÂ`'ÜÂà‚ìÂÀ”Ü€‡ÙÂà}ØÂ`°ÚÂ@PÝÂ@\Û€ÈãÂÀÚÂ@©ãÂ@JÞÂ@’ÒÂ`æÑ€Ö€uÜÂ`E×ÂÀ²×ÂÀpâÂ@¯âÂ@ÇÞÂâÂà¸ã€ÂäÂêÓÂ7ÜÂÀ¬ØÂàwÙÂ@ßÚÂà5äÂàS߀]àÂàšèÂÀ‚ßÂ@’Ò ±ßÂà¸ãÂÀ‚߀QâÂ=ÛÂå cìÂ`êÂ`hæÂÌØÂ1Ý ÒäÂ@æÂÀMÓÂÀ|àÂ ÛØÂ€ØÂàœàÂÀ¦ÙÂ`¤ÜÂ`’ßÂ`ßç€Qâ OåÂ`˜ÞÂàYÞÂ@©ãÂ`âÂÀˆÞÂàâÜÂÀ¬ØÂ´Ü ÛÂ@ÙÛ &×€.ÓÂ@Dß ´éÂ`ßçÂ`ßÂ`ªÛÂàGá€cßÂÀÜÂÌØÂ€c߀‡Ù€¼åÂà²ä mà :ÞÂà}ØÂ€æÞÂÀ|àÂà²ä gáÂÀ”ÜÂà)æÂàìÂlè Ý€]àÂ`ŒàÂ`bçÂ@VÜ€"ÕÂ@¯âÂÀ5× 4ß aâÂ@—æÂ@2âÂÀÿߨÞÂ`€âÂ`ýâÂàúØÂ€'é Šð€{Û ½ÝÂÀjãÂàÊàÂ`÷ãÂ@\ÛÂÀíâÂ`Jë ÙÂIÙ€ªè€ÚàÂ@hÙ¢ßÂ@2â€ìÝ ¥á€Èã …Ü Uä€Îâ uéÂàÂ`˜ÞÂÀLèÂ`ñä ºèÂàÊàÂàeÜ mà "âÂÀ)Ù CçÂÑìÂ`€âÂ@8á mà€EäÂ`êÂ`¤Ü€ÂäÂÀ:ëÂ`ëåÂ`’ßÂ`zãÂ@ÁßÂà5äÂÝêÂà)æÂ IæÂàé çÂà ë mà€-è€ÈãÂ@ÇÞÂÀÜÂ`ýâÂÀ«íÂÀ”ÜÂ7ÜÂÀçã€3çÂ%ßÂÀ|à®ÝÂxæÂ@µáÂ`µî LÛÂ`-ÛÂ`ßœàÂ`Þ„äÂ`VéÂ`¤ÜÂxæÂâÂà€9æÂáÂ`Þ ué ÕÙÂNí€uÜ€"Õ  æÂ`3ÚÂOØÂàSßÂ@t×ÂÀ ÚÂÀ ÚÂ`Œà ÃÜ (á RÚÂ@µá€?å øèÂ@DßÂCÚ€™Ö®Ý ð߀¶æÂ¨ÞÂà;ãÂÀÃéÂÌØÂ€:Ñ€ØÂÀÉè üÝÂÀ5ׄäÂàÄáÂ`°ÚºÛÂàÖÞ êà€ Ù >ÓÂàôÙÂû堺蠟âÂ`Â×€ÚÂÀÿß óÔÂ`˜ÞÂ@yëÂ`3Ú ‘ÚÂ@ÁßÂàS߀iÞ ½ÝÂlèÂà_ÝÂÀùàÂ@ å äáÂ@£ä øèÂÀíâ çÂ`Áì®ÝÂ@&ä ÝÂ@æÂ@å€]àÂ@2â ÉÛ ]íÂÀß …ÜÂ@nØÂ ÃÜÂÀLè€WáÂ@míÂàÐßÂ`â sßÂxæÂÀpâÂàwÙÂ`'ÜÂà;ãÂ`Œà ½ÝÂÀ±ìÂ`bçÂ`ßç–áÂÀíâ ÒäÂ@—æÂáÂàGáÂ`3Ú yÞÂÀdäÂàîÚ„äÂÀjãÂ@êÂ`ÍêÂà¦æÂ%ß ìêÂ`Œà O值å€cßÂ@—æÂ€æÞÂ@Dß .àÂÌØÂ€ÔáÂ@JÞ ™ãÂ`ªÛÂÀ)Ù€¶æÂ` áÂÀpâ€ìÝÂCÚÂÀùà ÕÙÂÀ)ÙÂOØÂÀ;Ö€uÜÂÀjãÂlè€øÛ "â 4ßÂá ÛÂCÚ ðßÂÀjã :Þ€àßÂ@8áÂÀ¦Ù íÕ ÿÒÂÀ ÞÂÀá䀸ÛÂÀ)Ù¨ÞÂ@—æÂ màÂÀjã ‹ÛÂàqÚÂ@t×Â@JÞÂ` áÂ@\Û ŸâÂàôÙ€Wá¢ß€'éÂÀFéÂ`{ΠçÖ jÖÂàâÜÂ`'ÜÂ[Ö äÂNí a„êÂÀ^å€àßÂûåÂàèÂ`åæÂ@—æÂ€QâÂÀ½êÂ@êíÂï瀒ìÂàóî€Ô᠖ê ué€Èã CçÂàìÂÀŸïÂ@+øÂ€÷ðÂ@ØðÂ`‘ôÂ@®÷Â`©ðÂà|íÂ@Àô Úí€hóÂà|íÂNíÂ@Àô€!ê Ôî ¨ëÂàvîÂà ç€†îÂ@míÂ@Uñ€ îÂö ]íÂ`hæÂàRôÂà|íÂà ë ŠðÂÀ ó QïÂÀLè IæÂ€°çÂ@CôÂ`©ðÂ@üêÂÀLè ië ?ò Èð€ŒíÂÀ(îÂàùí€nòÂàdñÂNíÂrçÂàˆëÂ`zã 9óÂÀ ó€!êÂféÂ`ÓéÂà‚ìÂàè ´éÂ`åæÂ@©ãÂà¸ã€¼åÂ ÆæÂ Šð ŠðÂ@èÂ`PêÂ`‘ôÂ`Dì òÂÀŸïÂà@÷Âù€'é€í€ï€÷ðÂÀ±ì %ìÂ@‘çÂÀÃé€'éÂâ­òÂ`ü÷ ÔîÂ`ëåÂÀ.íÂNí¿ïÂHîÂà5ä rôÂ`bç øèÂÀòÂ`ýâ òé êàÂà¬å ãÂTì ìêÂà¦æÂ@sì åÂÀô –î ™ã uéÂ@µáÂNíÂCÚÂ@êÂàóîÂ@êÂÀóáÂÀFéÂàìÂÀ"ïÂàÂ~åÂÀdäÂàìÂûåÂ@öëÂÀ.íÂ@‹è “ä€ îÂÀÕæÂà)æÂÀÛåÂ`©ðÂä uéÂÀ±ì€ îÂÀo÷€zðÂÀ·ë€ë€3çÂàè ØãÂ@ØðÂÀÏ瀒ìÂàÊà 1êÂ@êíÂÀðÂà)æÂ€!ê ?òÂ`täÂÀ.íÂÀ½ê ã€ì éõÂ`JëÂN퀀ïÂ0ò ‡æÂ`Áì ué€?å ?òÂàóîÂûåÂ@è ç€9æÂ@yëÂàóîÂÀáä Ìå ÙÂ@æÂ uéÂàáñ­òÂàùíÂÀ(îÂ`JëÂàÄáÂÀùàÂ@ÍÝÂ@,ã€'逌íÂ ÆæÂÀøõ ìê 7éÂ<ð€\õ€í åÂàÐ߀øÛ€ŒíÂà”éÂBï øèÂÀ.íÂ@üêÂ`zã€'éÂ@ê IæÂÀjãÂà ëÂ@VÜÂà¬åÂ@µáÂ@©ãÂÀÕæÂ@>àÂ@êÂ@ åÂûåÂÀ|à (ံæÂ@‹èÂàÿìÂ`ŒàÂ@êÂ`ëå ìꀒìÂ@JÞ ™ãÂ@ñ×Â@¯â€ÚàÂÀFéÂ`ëåÂÀíâÂ@8áÂ`9Ù€zð IæÂ%ßÂÀLèÂ@å åÂÀçã€Kã yÞÂÀˆÞÂáÂá êàÂàSßÂ`zã ÛÂÌØÂ€?åÂ`tä€9æÂ`nå ÉÛ yÞ€]àÂ@ßÚÂÀ|à€iÞ€ïÂÀjãÂ@ÇÞÂÀÉèÂ@8á .àÂ@JÞ ÀçÂ@8á ÃÜÂ`°ÚÂÀ#ÚÂïçÂ@µáÂ+ÞÂ`-Û [ãÂ`˜ÞÂàeÜÂ@åÂàkÛ€iÞÂ@ÇÞÂÀóá€iÞ yÞÂà Ö ÝÂÀÿßÂ`zãÂä LÛÂÀܢߠÉÛ€‡ÙÂ`÷ãÂ`€âÂàìÂ@ê€]à€3çÂÀ‚ß Òä¨Þ "âÂ@êÂå ã ãÂÀñÂïçÂ@Dߊã¢ß  æÂÀpâÂ`ÓéÂÐÂ1ÝÂ`†áÂ@æÂ ÜÂ`¶Ù€ØÂà•ÔÂÀ)ÙÂÀÝÂ@åÙÂÀáäÂÀÝ Uä ^ØÂ@t× (á UäÂÀváÂÌØÂ`Œà d×Â`°ÚÂàîÚÂàØÂ üÝÂ`€âÂàâÜÂ`ß þç€øÛÂÀáäÂàè–áÂÀùà€ÎâÂ`ªÛÂÀáäÂàqÚÂà¸ãÂàÊàÂàâÜÂ`ß„äÂÀÃéÂ`ßÂ@\Û€Ú ÙÂ`bç "âÂÀFé gáÂéèÂÀ#Ú IæÂ LÛÂÀÛåÂàꀼåÂ`µî yÞÂÀçã€WáÂàîÚÂÀÃéÂ@‘çÂ@—æÂ`'Ü€WáÂ×ëÂ@bÚÂÀ²×Â@ê ™ãÂ`,ð€3çÂ@öëÂà¦æÂÀÛåÂ@ÞïÂà”é³ñÂ`»íÂàìÂ`åæÂ %ìÂà¬åÂ@,ã Cç ™ã uéÂàSßÂÀ(î äÂà‚ìÂà蠱߀Úà€ÔáÂàÕ€{ÛÂ`ñä öÞ ŸâÂ@‘ç€iÞÂ` áÂàkÛ€QâÂ@ñ× ÕÙ€×´ÜÂÀÿßÂÀGÔ …Ü ‹ÛÂàèÛÂ@ëØÂ Ü€KãÂ`¼ØÂ@ÓÂ`?ØÂ€æÞ€Ö€Wá IæÂ ØãÂ@\ÛÂÀÐÒÂ@\ÛÂØÖÂÀ5× ¥á€iÞ€iÞÂ`†á€øÛÂÀFéÂ`iÑÂ`QÕÂÀ^åÂIÙÂÀ¾ÕÂÀÊÓ€ÚÂà¸ãÂ`àÂ`žÝÂ@VÜ€'éÂmÓÂÆÙÂà²ä Oå Ù á×Âà¾â€Èã gáÂaÕ€× gáÂ@sì äá ÏÚ OåÂ`åæÂ gáÂ@ ÔÂÀ¦ÙÂàÊàÂà¾âÂ@£ä€ÚàÂ`E×€QâÂÀÄÔÂ@ÇÞÂà#çÂà¬åÂ`zãÂ`3Ú€×Â@åÂ@2â ݺۀ{Û€oÝÂ@JÞÂÀdä "â .àÂ`KÖÂ+ÞÂ`†áÂ@ñ×Â@&äÂÝêÂÀ‚߀?åÂà­ÐÂ`â€oÝÂÀˆÞ ÀçÂ`Dì€9æÂ@ÙÛ€øÛ€ŸÕ üÝ€9æÂ@æÂ ÌåÂÀpâ€Âä„ä ãÂ`€âÂàƒ×Âà5äÂû倨Â7ÜÂ`ÔÔÂ`žÝ€iÞÂ`¶Ù (á€"ÕÂÀÛ íÕ€øÛÂ`¤ÜÂÀ¾ÕÂÀ”ÜÂÀ¬ØÂ@ëØÂ`KÖÂÒ×ÂÀ”ÜÂâ€ØÂaÕÂÀÛ óÔÂÀAÕÂàÄá€]àÂ`]ÓÂÀˆÞÂ@\Û ÃÜÂà­Ð€øÛÂÀÝÂàqÚÂU× ÃÜ .àÂÀ¦Ù —ÙÂ@8áºÛÂ`°Ú ·ÞÂàwÙ€WáÂÀ ÚÂÀçãÂâÂ=ÛÂÀ¸Ö ‹ÛÂ`]ÓÂ`žÝ€þÚ€oÝÂàÔ á×Â`9ÙÂÀÜÂ@nØÂ`žÝÂÀÖÑ »Ó€{Û .à IæÂÀ”Ü€·ÑÂÀ5׺۠ùÓÂCÚÂ[Ö€(ÔÂ1Ý ùÓÂ`ÎÕÂ`žÝÂ@PÝÂsÒ ÚÂ`oРÿÒ XÙÂÀÜÂ@ÓÂ@¯â€íÈ€FÏ DÒ ¯ÕÂÀ¬ØÂ )Ì€.Ó€(Ô åÌÂÀSÒ —Ù ñÊÂ@ Ô€™ÖÂ@\ÛÂ`-ÛÂ@hÙÂ@ÕÂÀÐÒÂà³Ï »ÓÂÀ²×Â`{ÎÂ@3Í€‡ÙÂ@JÞÂà$Ò jÖ€ÚÂmÓ€ØÂ`uÏ€ Ù€™ÖÂ`ÚÓÂ@ÇÞ€:ÑÂà•Ô‘ÍÂ`ÚÓÂ@°ÍÂ`oÐÂ`Â×Âà*Ñ —ÙÂàúØÂÀÊÓ ‚ÒÂàNË FÜÂÀYÑÂ@¤Ï bÍ€ØÂaÕÂÀ¬ØÂ€“× |ÓÂ>ÆÂÀÖÑÂ@8áÂ@ýÕ€4Ò †Ç€uÜ µÔÂÀ¾ÕÂàîÚÂ=ÛÂÀˆÞÂCÚÂ@ÒÂ@€ÕÂIÙÂ`ªÛ€4Ò šÎÂÀšÛÂ`QÕÂ=Û VÏÂÀÄÔÂÀ;Ö€ØÂ@!ÐÂ@'ÏÂáÂÀÝ ҋΠÙΠã€.ÓÂ`ìÐÂÀÈÂà¹ÎÂÀAÕÂÀèÎÂ@ÂÊÂÐÂàÔÂ@ÓÂÀÄÔ á×Â@t×€øÛÂà¿ÍÂÆÙ µÔÂÀÜ€XÌ hÌ€±ÒÂÀ5×ÂÀGÔÂ@Ñ üÝÂ@nØÂ@ÓÜÂàÕÂ`àÒÂà0Р½ÝÂ@ÑÂÀMÓ çÖÂ`ªÛÂ[ÖÂàÕ ÏÚÂ@ŒÓ€(ÔÂàNË€ÖÂ@ßÚÂÐÂ`þÍÂ@÷ÖÂ@'Ï ˜Ä ÁÒÂ@˜Ñ ,ÖÂÀSÒµÇÂ`ÔÔÂ@Ó€ÃÏ …Ü€“× ÇÑ ØÂ@ªÎ€(Ô µÔÂàÓÂÀÝÂ`ÚÓÂ`ìÐÂÀ ÞÂ`ÚÓÂÀÖÑ€iÞ ‹ÛÂà6ÏÂà­ÐÂÀÐÒÂsÒÂÐÂaÕÂÀMÓÂà³Ï€4Ò€çÉÂaÕÂIÙÂ`þÍ€@Р2Õ |ÓÂà§ÑÂ`WÔÂÀ_ÐÂÎÂÀÿßÂà§ÑÂ@EÊ d×Âà‰ÖÂàÔÂ`ìРPÐÂàwÙÂ`¤ÜÂàâÜ ÍЀ«ÓÂÀ¾ÕÂà¦æÂÀGÔÂàkÛ€½Ð £×Â@ÙÛ€(ÔÂàÔÂà›ÓÂ@˜ÑÂ`QÕÂÀ²×ÂÆÙ ÏÚ€ØÂ€{ÛÂàúØÂâÂ@ëØÂáÂÀkÎÂ@ÙÛÂÀeÏÂ`cÒºÛÂ@2âÂàqÚ€"ÕÂ`¤Ü ©Ö€±Ò vÔ ·Þ &×Â`¤Ü€(Ô »ÓÂ7Ü´Ü€þÚÂàôÙÂ%ßÂÀYÑÂàúØÂ DÒÂÀÛÂàYÞ€ÚàÂ`ªÛÂ@3ÍÂ@ ÔÂÀ#ÚÂ@÷ÖÂ@ëØÂ  Ñ PЀ·ÑÂÀqÍ RÚ ÇÑÂðÒ ÇÂÀÄÔ€(ÔÂÀÈÂ@hÙÂ@˜ÑÂ`ÎÕ€"Õ ßÍÂ@÷ÖÂÇÄ‘ÍÂ@ÂÊÂ@ŒÓ€uÜÂàÔÂ`ÔÔ ¾È ÇÑ€FÏ ÓÏÂaÕÂàÅÌ€ÕÌÂÀËÂðÒÂÀ”ÜÂ`cÒÂIÙÂ[Ö ‚Ò€ØÂ€±Ò€þÚ€øÛ ÞâÂáÂ@t×ÂÀ#ÚÂmÓ üÝÂäÔÂüÐÂàÕ íÕÂ@ñ×€ÃÏ€“×Â`¶Ù —ÙÂ`ªÛ |ÓÂ`WÔÂ=Û€ÖÂàÅÌ€·Ñ LÛÂ`9Ù ÉÛ óÔÂÀ/ØÂ ˆÑ©ÉÂà Ö¨Þ FÜÂ@t×€@ÐÂ@’ÒÂЀ.ÓÂ`ÚÓÂÀ¬ØÂÀ5×Â@˜ÑÂàúØÂ ÜÂÀÚÂ`°Ú ÕÙ€:ÑÂÀ#ÚÂÀÄÔÂ@€ÕÂ@'Ï ÒÂ@ŒÓ€Úà ÉÛ€·ÑÂ@’Ò€iÞÂ@Ó®ÝÂàúØÂ€½Ð RÚÂÀYÑÂ`ÎÕÂ@!РÁÒÂ`¶Ù ÉÛÂ@VÜ íÕÂà}ØÂ DÒÂà ÖÂà¹ÎÂ@nØÂ@°ÍÂ@¼Ë ÎÂÀ5×Â@÷ÖÂàÖÞÂ`?ØÂàwÙÂ7ÜÂ`iÑ êà ØÂ ÁÒÂ@˜ÑÂÀ#ÚÂ@EÊÂÀ)ÙÂ`KÖÂ@t×Â@ÓÂÀMÓÂàwÙÂOØÂ=Û€FÏÂà•ÔÂ@Õ óÔÂ@bÚ ©ÖÂ`QÕÂgÔÂ`Â×ÂÀ|à´ÜÂàÜÝ ØÂ`!ÝÂ`¼ØÂ ØÂ@ýÕÂÀîÍÂàÕÂàÜÝ ÛÂàúØÂà¿Í ÝÂÀÜЀ×€«ÓÂ@bÚ€Wá ÒÂÒ×€òÜÂ`ÔÔ 4ßÂÀ¬ØÂ LÛÂ`cÒÂ@bÚ LÛÂà‰ÖÂÀ¾ÕÂàâÜÂÀóáÂIÙÂÀ¬ØÂ`ìÐÂàÓÂ@ñ×ÂÆÙ ÉÛ :Þ @ÝÂÀAÕ ÉÛÂ@t×ÂàqÚ 2Õ ‹Û€"ÕÂ@÷ÖÂàèÛÂêÓ ÚÂÀ²×ÂÀGÔÂÀ;Ö êàÂÀ)ÙÂÀ#Ú ÉÛÂ`Â×Â@ýÕÂ`øÎ »ÓÂlèÂ@VÜÂ@ÍÝ  Ñ€àß ™ãÂ@ŒÓ€Ú€cß XÙ‘ÍÂÀwÌÂÀ¦ÙÂ@’ÒÂàÔ€±Ò‹Î 8ÔÂ@t×Â`™É€ØÂ@˜ÑÂ`9ÙÂàÔÂ`iÑ ùÓ€FÏ ÝÂ@-ÎÂà ÖÂ@†ÔÂÀváÂÀ/ØÂ LÛÂÒ×Â@ÒÂÀAÕ€(Ô AÈÂ@3ÍÂ@ÕÂÞÕÂÀÊÓ€ìÝÂ`'Ü ÷ÉÂIÙÂ…ÏÂ`!Ý ÁÒ€áÊÂ@bÚÂ@hÙ ©ÖÂ`ËÂÀâÏ ‹Û´ÜÂ`cÒÂ@!РDÒÂ`ýâ á×ÂÀváÂ`iÑÂà}ØÂ€(Ô 2ÕÂ`-ÛÂàƒ×Â`¼ØÂ[ÖÂàîÚ¨Þ„äÂà‰ÖÂOØÂàÕÂ@ëØÂàSßÂàÔÂ`¤Ü êàÂ`êÂàÕ  ÑÂÒ×€‡ÙÂ`˜ÞÂ@JÞ (áÂ@ÇÞÂ`uÏÂ`ÈÖ€ÕÌÂ@hÙÂàÕÂàØÂ@ýÕÂÀpâÂ+ÞÂ%ßÂàâÜ ùÓÂyÑ€ŸÕÂgÔÂÒ×ÂÀ¸ÖÂÀSÒ ÏÚÂ@’ÒÂ@†ÔÂ@ëØÂ`˜ÞÂ@÷Ö€uÜÂ ÛØÂ 5Ê€oÝÂÀ5×ÂàqÚ€@ÐÂàÖÞÂÞÕ ÜÂàÔ€XÌÂà­ÐÂ@ÙÛ€æÞ ÚÂ`˜ÞÂÀ Þ ÁÒÂà}ØÂ vÔÂàôÙ íÕÂÀjãÂÀÊÓ€uÜ ØÂàÕÂaÕÂ@nØÂ ™ã€·Ñ \ΠÙÂ`òÏÂ@nØÂàèÛ íÕ jÖÂÀ¬ØÂàØÂ@nØÂ ‹Û PÐÂ@ñ×Â`3ÚÂàÔÂÀÊÓÂØÖÂ@ÍÝÂÌØÂ`WÔÂÀ¬ØÂ "â ·Þ€ÚÂ`ÈÖ€Ú —ÙÂà$Ò ÍЀ:ÑÂÆÙ€“×ÂÀ ÞÂ@VÜÂ[ÖÂÀ5× pÕ€uÜÂà¡ÒÂÀkÎÂÀ_Ѐ«ÓÂOØÂ yÞÂâ ·Þ Ý \Π&× @ÝÂà¦æÂà ÖÂ` Ì ·Þ á×€(Ô ùÓ 2Õ 8Ô ßÍ ‹ÛºÛ ÕÙ€þÚÂà¡ÒÂÀGÔ—ÌÂ@ýÕÂ@£äÂàÕÂgÔÂÀÛ€½ÐÂ@’Ò€±ÒÂ@ñ×ÂöÑÂÆÙÂÀ¾ÕÂàèÛ ØÂ`¼ØÂàqÚÂmÓÂÀÜРÛ€Ú £× JÑÂ`¶Ù ‹ÛÂ@ÕÂÀ)ÙÂ`hæÂ ÛÂ`{ΠpÕ´Ü çÖÂ…ÏÂ`QÕÂ`3Ú€4ÒÂ@µáÂàîÚÂà¹ÎÂà¡ÒÂàèÛ ÒÂ`Â×ÂÀÛ ÃÜ€™ÖÂÀßÂIÙ ÜÂàÔÂ@åÙÂ@†ÔÂsÒÂ@hÙÂÀúËÂàBÍÂ`E×ÂÀ¦ÙÂàúØÂyÑÂ@hÙ€“×Â&Ê 8Ô —ÙÂÀGÔÂÀˆÞÂ@t×ÂÀÖÑ 2ÕÂÀƒÊÂüРjÖÂIÙÂ…ÏÂà§ÑÂÀÜÂÀÄÔ€ŸÕÂÀAÕ £× #ÍÂ@†ÔÂ`cÒÂyÑ€þÚ€ŸÕ ØÂ ©ÖÂ@PÝ »ÓÂ`Ë ÁÒ pÕÂ@ÁßÂà0ÐÂÀGÔÂ@-Π‹ÛÂÌØÂ >ÓÂÞÕÂ`oÐÂàÕÂÀGÔÂà­ÐÂ@\ÛÂà­ÐÂ`QÕÂaÕ€æÞÂàËËÂ`WÔ çÂÀÝ ^ØÂàúØÂµÇÂ@’ÒÂÀÝÂÀ¬ØÂÀÝ´ÜÂ@JÞÂÀÊÓ Ïڠ܀{ÛÂ@’ÒÂmÓÂ%ßÂÌØÂ@ýÕÂàeÜ€.ÓÂàØÂ€.Ó ‹ÛÂ`ªÛ ^ØÂ@ñ×€ŸÕÂ`-ÛÂ`9ÙÂ`-ÛÂà0ÐÂ`¶ÙÂà<΀þÚÂ@åÙ ¯ÕÂàYÞÂ@8áÂ@€ÕÂ@€ÕÂ@ßÚ€“×ÂàÖÞ ÝÂ@VÜ€‡ÙÂÀAÕ€«ÓÂ@'ÏÂà§ÑÂÀÊÓ€4ÒÂ@°ÍÂ@ýÕ ØÂÒ×ÂÀGÔÂ%ßÂ@zÖÂÀÛÂ`?ØÂÀ/ØÂ€KãÂ1ÝÂàÂÎÂ`Â×€™Ö€ÉΠÓÏÂ@'ÏÂmÓ /Ë )ÌÂÀSÒÂàÔÂÀ¸ÖÂà}ØÂ Ü ÕÙÂà§Ñ€×ÂàwÙÂ`'ÜÂ ÛØÂ —Ù€Ú ßÍÂ@ßÚ åÂ@ÑÂ`QÕ€“×ÂÀÊÓÂàÕÂÀ¬ØÂ€FÏÂaÕ€.ÓÂ@ÔÇÂà6ÏÂàÕÂÀ¸ÖÂÀ¾ÕÂyÑÂà0ÐÂÀ¦ÙÂ`3ÚÂ`-ÛÂ@ýÕÂ…Ï€“× ,ÖÂ@-Π\ΠmàÂÀ ÚÂ`WÔÂ`àÒÂOØÂЀL΀¥Ô€LÎÂ@9ÌÂU×Â=Û€™Ö 2Õ —ÙÂÀYÑÂ`Â× màÂÀAÕÂ`¶Ù´ÜÂÆÙÂ>ÆÂ ÿÒÂ`¤ÜÂàÕÂ@'ÏÂgÔÂ`žÝ€oÝ RÚ íÕÂ@†ÔÂ`?ØÂ`Â×Â`ëå …Ü ÖÄ  Í jÖÂ@»àÂÀ¾ÕÂàÕÂ`ÈÖÂÀ”ÜÂÀ;ÖÂ[ÖÂàwÙ€Úà 4ßÂ`°ÚÂ@2â€þÚ ¯ÕÂ@t×Â`†áÂàúØÂ[ÖÂÌÂà‰Ö€øÛÂ7Ü€ÏÍÂÀAÕÂ`cÒÂ`žÝ »Ó´ÜÂ@ÇÞ€þÚÂ`-ÛÂU×ÂÀÚ óÔÂÀAÕÂ@Ó€ØÂ`ªÛÂ`˜Þ€:ÑÂÀèÎÂà ÖÂ`Â×ÂàÜÝÂ@nØÂ@˜Ñ€½Ð€ÚÂ@ëØÂ ÝÂ`˜Þ€"ÕÂÀ¦ÙÂà›ÓÂÀ”Ü ÓÏÂ`QÕÂ`ÔÔ€ ÙÂ`QÕÂÏÂà›ÓÂ@÷ÖÂà}ØÂ "âÂÀ ÚÂ@nØÂÀŽÝÂÀ)ÙÂÀAÕ€™ÖÂ@ÕÂ@\ÛÂ@ÓÜÂêÓÂ`cÒÂ`ªÛ ÜÂÀÛ ˆÑÂà ÖÂà­ÐÂ@åÙ ‹ÛÂ`°ÚÂ`ÈÖ€ÏÍÂ@EÊ€ÉÎÂàZÉÂÀeÏÂöÑÂÍ€:ÑÂ`]Ó€½ÐÂ`¶ÙÂgÔ€.ÓÂ@¤Ï ˆÑ ÚÂ@žÐ á×Â1ÝÂ@ªÎ€"ÕÂ@9ÌÂ`ÈÖ ®êÂ1Ý€™Ö€:ÑÂÀîÍÂ`ÚÓ€·ÑÂ@ÒÂÀ ÚÂ@ÙÛ Ë ÏÂàeÜÂÀ5×ÂÀ5× ùÓ µÔÂ=ÛÂÀ/ØÂ ‘ÚÂàÔÂ@€ÕÂÀ/ØÂ`æÑÂÀ;ÖÂàSßÂ`ªÛÂ`Œà ŽÐÂ@\Û€þÚ€EäÂÀ Þ  Ñ€™Ö€™ÖÂàqÚ VÏ€™ÖÂ`]ÓÂàÔ pÕÂàÓÂÀÜ€ Ù€øÛÂÀ¬ØÂ ^ØÂ ÒäÂÀßÂ@ÒÂ`Ë€ÖÂÀÚÂàâÜ …ÜÂ@ê€òÜÂ@\ÛÂ@ÈÉÂ@ ÔÂ@ýÕ ßÍÂÀ;Ö ¯Õ€¥ÔÂ`¤Ü€:ÑÂ`ÔÔÂàâÜÂÀqÍ ÒÂÀ|àÂáÂÀŽÝÂ`E×€ŸÕ ²Ê ÙÂà×Â@Ó€:ÑÂà‰ÖÂÀ Ú€þÚ ØÂ@&ä íÕÂ`°Ú ÉÛÂ`uÏÂ`ÔÔÂ`þÍÂ`“ÊÂàqÚÂÀ¸Ö ÏÂ@9ÌÂ@ªÎÂ`E× ÉÛÂà¹ÎÂàïÅ Р¯Õ ^ØÂ€@ÐÂÀ²×ÂÏ ÍЀÏÍÂÀwÌ óÔÂÀ;ÖÂðÒÂÀ¸ÖÂ@!ÐÂÀ5×ÂgÔÂà§ÑÂÀ ÉÂ`QÕ ±ßÂ@Ò€4Ò€ØÂÀ¾ÕÂÀ¾ÕÂà¹ÎÂ`¤ÜÂ@ßÚÂ@\ÛÂÞÕ ùÓ ”ÏÂ`æÑÂ`QÕÂgÔ€·Ñ ÿÒÂU×ÂÀAÕ ^ØÂ`cÒÂàÕÂÀè΀ùÆÂÏÂÎÂ`WÔÂÀÐÒ hÌÂ@’Ò ÄÇ óÔÂ@ñ×ÂàúØÂ€ÕÌÂ@Ó€±ÒÂ@¤Ï µÔÂàNË  ÑÂà*Ñ OåÂ`Â×€ŸÕÂ@Õ€"Õ€¥ÔÂÐÂ@ÎȠπÛË 2ÕÂ`ÎÕ€¥Ô ßÍÂ`oÐÂà•ÔÂ@zÖÂ`KÖÂÀ‰É \ÎÂêÓ ÎÂÀ²×ÂÀwÌÂ`]Ó šÎÂ`òÏÂÀîÍÂÒ× ŽÐ GÇÂàTÊÂ@ÈÉ ¦Ì Ò ,ÖÂ[Ö‹ÎÂ@ÂÊ íÕÂÌØÂàÐß ßÍ€4ÒÂ`WÔÂà0ÐÂ@ŒÓ >Ó pÕ€ÉÎÂÀÚÂ@3Í ŽÐÂàÑÊ€dÊÂÀk΀ÛËÂÀYÑÂmÓÂÀwÌÂ`¼ØÂ |ÓÂ`KÖÂÀ²×Â` ÌÂ` Ì 'ÂÂ`iÑÂÀÜЀ«ÓÂ`àÒÂàãÇÂ@€ÕÂ@ÑÂ`QÕÂÀAÕÂàéÆÂÐÂàÝÈÂÀîÍÂÀ}ËÂ`’߀ØÂà ÖÂ`iÑÂ@÷ÖÂäÔÂsÒÂ`.ÆÂ‘ÍÂ`ÉÂà$Ò ¦ÌÂÀ‚ßÂ`ß µÔÂÀÊÓÂ@žÐ€¥ÔÂà}ØÂ ¯Õ€·Ñ€‡Ù &×€ØÂàTÊÂ@-ÎÂöÑÂCÚ #ÍÂÀk΀½ÐÂ`]Ó€·ÑÂÀSÒÂ`àÒ ßÍÂ`{Πd×Â` Ì€"ÕºÛ åÌÂ@ªÎ ¦Ì ·ÞÂÏÂ`òÏÂ@ÑÂÀAÕ–áÂÀMÓÂ@žÐÂ`{ÎÂàHÌ >Ó ¯ÕÂ`Â×Â@EÊÂ`ÍÂÀúËÂÀSÒ ^ØÂ€ØÂ1Ý ÙΠÙÎÂÀÜРXÙ )Ì ÙÎÂÀÐÒÂ@PÝÂ@?ËÂ@bÚÂÀAÕÂÀ;Ö d×ÂÀÐÒÂ@ªÎÂêÓ ЀXÌÂ@ÙÛ€.ÓÂàÜÝ ¬ËÂÀƒÊÂÀ/ØÂ ©ÖÂà•Ô€-èÂ@\ÛÂÌÂ@'ÏÂà}ØÂ íÕ ¾ÈÂ@EÊÂ`ÈÖÂ@t×ÂàÔ€(ÔÂØÖÂÌØÂ`9ÙÂ`ÚÓ€¥Ô€4ÒÂ…ÏÂ@nØÂ`òÏÂ@ÙÛÂ@\ÛÂà ÖÂ`uÏÂ@÷ÖÂ@'ÏÂàØÂ`ŒàÂ,ÉÂ`™ÉÂÀ¸Ö€(ÔÂ`]Ó€×ÂÀôÌ ¸ÉÂÀšÛ óÔ PÐÂàôÙÂà×Â@t×Âà­Ð ˆÑ´ÜÂ1ÝÂÀYÑÂ`ŸÈ ¸ÉÂà×ÉÂ@t×Â@hÙÂàØÂ€ÕÌÂsÒÂ`uÏÂÀË ËÂÌÂÀÖÑÂÀ ÚÂàeÜ€ŸÕ jÖ ÜÂ@Ó çÖÂàÕÂÀ;ÖÂ@DßÂyÑ€þÚÂ@VÜÂÀ¦Ù´ÜÂØÖÂÀ¸Ö @Ý€™ÖÂyÑÂ1ÝÂ`ÎÕ &×ÂàôÙÂõæÂà;ãÂ@DßÂàwÙÂÀAÕÂöÑÂà`È€ìÝ vÔ Ù€˜ëÂ@ÍÝ çÖÂ`E×ÂÀ)ÙÂ`cÒÂ@ÑÂÀ)ÙÂ`{ÎÂà­ÐÂ`àÂ`ÚÓ€òÜ€"Õ€.ÓÂàúØÂÀÕæÂ–áÂ@VÜ Ú€FÏ ÍÐÂ`¼ØÂ‹ÎÂ@ÒÂU×Â1Ý 2ÕÂ@JÞÂ`‡ÌÂU×ÂÀÛåÂà‰Ö€(ÔÂ@ÍÝ€ÚÂ@åÙÂÀ¬ØÂ€™ÖÂ`E×ÂÀ‚ß´Ü€ÎâÂ@€Õ çÖ ÏÚÂÀSÒ ΠØÂà³ÏÂÀ)ÙÂÀÐÒÂ`¶ÙœàÂ@ÇÞÂ@DßÂàHÌÂ@nØÂ@>à€øÛÂÀ ÚÂàÊà &× pÕÂà6Ï€“×Â@'ÏÂ`Â×Â@\ÛÂ@ÑÂ`¶ÙÂöÑ 2ÕÂaÕÂÀGÔÂ`æÑ öÞ üÝ íÕÂÀ)ÙÂÀAÕ nËÂ`þÍÂÌØÂÀÝÂ`WÔ€:ё̀½Ð ØÂ ÉÛÂ@VÜÂ@˜ÑÂàÊà€‡ÙÂÀÊÓÂÀ/ØÂ ‹ÛÂÀ Þ€æÞÂÌÂgÔ ,ÖÂ@8áÂà×ÂÀÜ ¦Ì€XÌÂÀAÕÂ`ÎÕÂÀÊÓÂäÔÂÀÜЀþÚÂàkÛ  ÑÂÞÕÂmÓ€“×Â`-ÛÂ+ÞÂÀ Þ ÀçÂàáñÂ`PêÂ`…öÂ`\èÂ`†áÂ@ å `÷ ®êÂ`»í °ôÂÀ™ð HûÂÀEþ­òÂ` òÂ`Uþ Ôî€JøÂÀEþÂîüÂÀì÷ÂÐÑàüÂ`öøÂ Tù í -õÂîü zà <ÃÀÎüÂÀ¼à 6À©Ãà¥ûÂÀKýÂîüÂð=ÃàÃà·øÂôûÂýÀßô ž÷ÂàFö €üÂ@àzðÃÀWûÂà“àhÃ`Øý€,ý°$Ãð´Ã`[Ã`Uþ øÂ`ÒÃà‡ð¡Ã)Ã0Âà 0ÿÂ÷ÃPŸÃýÀnò€8ûÂð´Ã`äûÂÀKÃPà <Ã@úÂÃ_ÿ€P÷€¯üÂ`ØÃ°àtÃGÃÀÈÃPÃàÃù°›Ã`ÌÃ0ÈÃàÿÂ`äûÂàÕó ³þ 0ÿ¸àúÂ`Uþ †ûÂð+ð›ÃP±Ã`ØÃ€©ýÂGÃèàhÃÀæøÂà:øÂÀKÀ©Ã@~ÿÂ@œúÂ`÷Â@–ûÂúÂ`ðùÂ0Úàž÷Â0cÃð7Ãù HûÂ@ûÃÐïÃeÃký€&þÂ`êú -õÂÀEþ ýüÂàÃ}úÂ}ú€©ýÂÀŸïÂîü›õÂ_Ã`OÿÂSÃð7ÃÀQüÂ@ûÿÂÀEþÂ@´öÂàÏôÂ`Òþ 6à Hû zýÂ0]Ã@úÂð=ÃÀcù ­ÿÂ`aü úÂ`ØýÂ@üÂðºÃÜÃ@ ÃÀÔû ãö°$À¯üÂ@~ÃÐÝà ¹Ã`ÆÃ@ŠÃ`UþÂP¥à ­ÃeþÂÜÿÂÀ?Ã@ûÿÂ0cà ¿üÂÀÔû tþÂ@ŠÃÐ`Ã@éÃ@1÷Â`ÞüÂ0?À&þ 6þ›õÂúú ZøÂõÂ`ö ¿üÂ@ÃÀì÷ÂÀÈýÂ`UþÂ@ ýÂpçÃÐZÀ&Ã@„þ ÅûÂÀKýÂÀKýÂ`UþÂp‚ÃÀÈÃ}úÂ@œúÂ`IÆÃ}ú €üÂ@ŠýÂkýÂ@ü€µûÂ@¢ù Nú ùÂÀòÂ`öøÂ ÷ýÂÀÔû ­ÿÂ`[à ­ÿÂ@¢ùÂ`yøÂ úÂÀEÃMÃÀEþÂúÂÀKÀP÷Â`òƒùÂà¥ûÂ0ÔÃ@ÆóÂ@=õÂ*óÂ`÷€åóÂÀo÷ÂÀÈý€£þ ¹ÃàÏô ÑùÂ`÷ÂÀþôÂâþ HûÂ@%ù ËúÂ@sìÂ`,ðÂÀ™ð Îï ãöÂ@Cô ³þÂÀô€,ý ˜øÂ`êúÂÀ¥îÂ`‘ôÂ@úÂÀì÷€åóÂà4ùÂ@´öÂÀKýÂ<ðÂ@¨øÂàXó 3ôÂÀÈý€8ûÂÀiøÂ€Í÷›õ€¯üÂ`‹õ ŒúÂÀo÷ ŠðÂ`Øý€»úÂ@Cô€hóÂÀÈý Îï øÂà“þÂàjð€ï àì øÂ€P÷Â`ö€zðÂ6ñÂ*óÂ@Uñ€÷ðÂ`òÂàpï€P÷Â@…éÂ`\èÂ`>íÂÀŸïÂÀÉè€ê cìÂ`€âÂàíïÂÀo÷ Èð€’ìÂlè ¼ò€÷ðÂàóî Qï€nòÂÅîÂùÂÀ:뀆îÂ`ò 3ôÂTì æë 7éÂà ëÂÝêÂ`Jë éõÂà ç .àÂà‚ìÂ@&äÂàÉõ¿ïÂ`Jë cìÂxæÂàíïÂ6ñÂ6ñ 7éÂ@êÂ`2ïÂËíÂ`Jë Ôî þçÂõæÂ “ä€hó –î –îÂ`êÂ`óÂÀ@êÂà¦æÂ`µî ðÂ@Ìò¹ðÂÀ4ìÂ`»í€zð 'ö€žê€åóÂ<ðÂ@£äÂéè€íÂÀjãÂ`JëÂ`2ïÂàXóÂàê 7éÂ<ðÂ`—ó€!ê ïôÂÀiøÂà@÷Â`ö ¨ëÂàÐßÂãéÂ@»à€tñÂà:øÂ ´é ¨ëÂÑì ìê 1êÂ`Vé àì 7éÂàùíÂàóî föÂ@äî ué Ôî ÔîÂÀ Þ€ÎâÂ`2ï TùÂà|íÂËíÂ*óÂÀðÂ`ÍêÂ@£äÂÑì ÎïÂéèÂ`©ðÂ`Vé àì EñÂ`ÙèÂÀÃéÂ`‘ôÂ@ÞïÂÀuö€¤é æë æëÂàÃö ï€퀞êÂÀñÂà ç³ñÂTìÂÀíâ %ìÂ@‘ç€JøÂÀ:ëÂàšèÂ@sìÂÀçã 1êÂâÂ倘ëÂ@ê•öÂ@éÂÀ^å Uä€Ôá ä ìêÂ@Øð Àç íÂÀdä€Wá ªõ OåÂàÿìÂ`Vé aâ€!êÂ`Vé€-èÂÀ™ð€žê ð åÂÀÛåÂ`ñäÂ@ðìÂ`2ïÂ@ÇÞÂr瀌íÂà ë {èÂ@ 倰çÂ@èÂြåÂÀdäÂ@ê¡ô€Âä Þâ yÞÂÀÜÂ`\èÂ@…éÂàšèÂ`¯ïÂÀ4ì€!ê€ïÂà)æÂŠã€?åÂ@—æÂ€\õÂ`ÙèÂ`ýâÂàÐ߀ëò åÂfé ÞâÂÀÏçÂÀÛåÂÀ^åÂ`Á쀘ëÂÀ(îÂàeÜÂÀÃéÂ@é ã äá 4ß„ä QïÂ`Jë ÎïÂ@å à쀞êÂàóîÂÀLè€Kã "âÂfé :ÞÂÀdäÂÀ“ñ i뀶æÂ`bçÂàGáÂÀ½êÂ<ðÂàGáÂà ëÂÀáäÂÀùàÂÀ½ê€Èã {èÂ@èÂ`ÇëÂ@ê€9æÂ€¤éÂÀjãÂ@…éÂà/åÂZëÂâŠã€¶æÂ@üêÂ@¯â€æÞÂ`PêÂ`†á¢ß å çÂ@êí öÞ äáÂÀÉè %ì å  æÂ %ì ç Cç IæÂ œíÂà)æÂ@åÂ@µáÂ<ð€9æÂ`ÞÂ`bçÂ`Pê äáÂÀ(îÂ ÆæÂ`JëÂ`ßç IæÂÝêÂ@êÂ`åæÂ`Áì "âÂ`ýâÂàéÂ@sìÂÀò›õÂàê îÂÀóáÂàšèÂÀLè¢ß€÷ðÂféÂ`»í€˜ëÂàꀼåÂ`ê Wî uéÂ`hæÂ@æÂ`ýâÂàùí€àßÂ@ëØÂ@¯âÂÀdäÂ@ðìÂ@gîÂ@ÁßÂÀRçÂ@ê€ì€ï ÌåÂ`>í€oÝÂàSß  æÂ@&äÂåÂà çÂÀ:ë cìÂàkÛ€ÈãÂ`ÓéÂà‚ì€ îÂâÂ@ÁßÂÀXæÂéèÂ@æÂ@èÂÀÏçÂ`ëå€ëÂ`€âÂ`ê ÚíÂ@ç {è ®ê Ìå€à߀ÎâÂ`»í€]àÂ`†áÂäÂ`ÓéÂ@é€ îÂàˆë¿ï 1êÂÀóáÂ`óÂ@©ãÂÀ@êÂ@êíÂ×ëÂ@8á€9æÂ {è Øã 1êÂà|íÂ@êíÂ`täÂÀjãÂâÂàùí ÈðÂÝê€3çÂ@PÝ€9æÂÀ|à «àÂÀ±ì ØãŠã [ãÂà¦æÂà¦æÂ€!êÂ@¯â oê ÌåÂ~åÂ ÆæÂÀÛåÂ@sì€9æÂ ÆæÂBߠìêÂàˆë€ë î€òÜ ºèÂàÊàÂ@ÙÛÂ` áÂ@µáÂÀ@ê ã€Qâ ±ßÂ@—æÂàAâÂâ€ìÝÂ`žÝÂ@å€-èÂÀÕæÂÀíâÂ@ÓÜ®ÝÂ`ÓéÂIÙÂàŽêÂà¾âÂ@—æÂ å€hóÂ@ÇÞ êà IæÂ`WÔÂ@åÙ¢ßÂ`ñä€Kã€Ôá€EäÂàÐßÂàÊà€-èÂàèÛ€Kã ŠðÂ`€âÂ`ŒàÂ1Ý€ îÂÀÜÂÀ|àÂà›ÓÂ`àÂÀRç @ÝÂ@t× @ÝÂÀ ÚÂÀ ÚÂÀÐÒÂ`àÂ`hæÂ`zãÂOØÂ€‡ÙÂ`’߀ØÂà}ØÂ Û€Ú€Wá€3çÂ`¼ØÂœàÂ@…éÂàôÙÂ@¯âÂà¸ãÂ[Ö yÞÂ7Ü€Wá ¥á¨ÞÂÀÛÂÀÛåÂ@ëØÂU× 8ÔÂÀ‚ßÂ@Ó€Ú gáÂÒ×ÂgÔ µÔÂà$ÒÂ@’Ò®ÝÂ@bÚ RÚÂàYÞÂÀ)ÙÂàeÜÂà_ÝÂ`òÏÂàîÚÂàeÜ ‘Ú€ìÝÂÀŽÝÂ`ÞÂ`WÔ€ ÙÂÀ_РÃÜÂ@‹èÂ@ÇÞÂÀùàÂ@ýÕÂ@ÙÛÂÀ¬ØÂÀ)ÙÂàôÙÂà_ÝÂ`â &×€× oêÂÀ¾Õ —ÙÂ`ÈÖ€¶æÂàS߀‡ÙÂIÙÂàšèÂéèÂ`¤ÜÂàqÚÂ`Â×Âà¬å XÙ€ØÂ XÙ 2Õ€oÝÂÀváÂ@'ÏÂÀ ÞÂIÙ ^ØÂ RÚÂâÂà Ö 4ßÂ=ÛÂ@nØÂÀÚÂÀÝÂ@ëØÂ@€ÕÂ@Dß pÕÂàÜÝÂàâÜÂ@2âÂäÂÀ5× ÉÛ´ÜÂà;ãÂ@>àÂ`WÔ äÂ@ÇÞ öÞÂàôÙÂ@bÚ µÔ 8ÔÂÀ ÞÂ@8áÂ@ÁßÂÀpâ€@ÐÂà×ÂÀÛ ÃÜÂÀÛÂ@t×Â`¼ØÂ ‹ÛÂÒ×€ÃÏ µÔ öÞÂüÐÂ@ßÚÂàÐß ØÂÀ5×Â@ÓÂ1ÝÂÀváÂÀ¦ÙÂÀÊÓÂàîÚÂàîÚÂðÒ´ÜÂ@Ó ^ØÂ ØãÂ@ëØÂ€iÞÂÀˆÞÂOØÂà$Ò hÌÂÀAÕÂ@ñ×Â@÷Ö€¥ÔÂÀ5×Â`]ÓÂgÔ ¥á vÔÂÌØÂ màÂÀGÔ€«ÓÂàÕÂ@ëØÂÀÚÂ@t×ÂaÕÂIÙ ÕÙÂ@åÙÂ@»à FÜÂà_ÝÂ@‘çÂ@ÕÂ`ìÐÂ+ÞÂ@t×Â@žÐ€·ÑÂàîÚ ÃÜÂ@bÚÂÌØÂ@ÇÞÂ`ªÛÂÀÊÓÂÀ)ÙÂ`æÑÂÀâÏ ÏÚÂÀßÂÀŽÝÂÀ5×Â@†Ô€?åÂàÊàÂ`ÙèÂàSßÂàeÜÂ`E×Â@Õ—ÌÂ%ßÂ@VÜÂÀ)ÙÂà¸ãÂ@ÙÛÂ@ÍÝÂ@ÍÝÂà Ö€Ú ÞâÂàS߀ìÝÂ@÷ÖÂà}ØÂÀXæÂ gá s߀KãÂàeÜÂÀ Þ€øÛÂ@£äÂàƒ×ÂÀeÏÂÀSÒÂàîÚ€òÜÂàÕÂ@€Õ RÚÂ`ßç ðßÂÀ^åÂàØÂÀÛÂ`¼ØÂÀAÕÂ@2âÂlèÂÀ”Ü sßÂà¸ã€Kã «à «à ÞâÂ@‘çÂÀváÂÀÐÒÂ ÆæÂ`-Û =èÂBïÂÀ^åÂÀßÂ@Áß ±ßÂ`Þ —ÙÂÀ|àÂ`ÚÓÂÀÝÂàšèÂÀdä„äÂ@2âÂ`ßÂàÜÝÂÀÝÂ`tä€KãÂ`\èÂàôÙ mà€Ö€ìÝÂà#çÂ`÷ãÂõæÂ ã¨ÞÂ~åÂ@Dß òéÂà_Ý çÂ`âÂÀjã äáÂàÜÝ€Ôá€KãÂ`ñäÂ`ÍêÂ@é UäÂ@¯â åÂÀÃéÂÀÝÂÀÕæÂ çÂÝêÂ@ÇÞÂÞÕÂàqÚÂàSß ‘ÚÂ7ÜÂà#ç åÂÀÛÂÀSÒÂ@¤Ï ÕÙÂ@bÚÂàeÜÂÀ)ÙÂ ÆæÂàYÞÂàGáÂïçÂÀ‚ßÂ`ßÂ`KÖÂ`KÖÂ@ÁßÂ`ŒàÂ`ªÛÂ@ÇÞÂÀÛ Uä„äÂàMàÂ`PêÂà ëÂÀpâÂCÚÂàGáÂ`˜ÞÂàÊà€‡Ù üÝÂ`÷〞ê @Ý€ØÂÀùàÂ@æÂ€ØÂ@ÓÜÂÀ”ÜÂaÕÂ`ªÛÂàâÜ€Ú€ØÂàƒ× aâ€ÎâÂàYÞÂ`ìРRÚ€øÛÂÀß ^ØÂ 4ßÂà)æÂ ã€9æÂ mà &× ÉÛ€Âäœà ©ÖÂà¡ÒÂР&×€òÜÂÀÝÂ=Û XÙÂ@åÙ€«ÓÂÀ²× ÜÂ`ÎÕ vÔÂ`ÚÓ ÏÚÂà¹Î€.ÓÂÀMÓÂà}ØÂàÕÂ@t×ÂàôÙÂ@hÙÂÀÐÒÂÀ#ÚÂäÔÂàØÂÀ|àÂÀóáÂà×ÂàSßÂlèÂ+ÞÂà Ö€·Ñ jÖ€±ÒÂÒ×Â`òÏ ÙÂ@©ãÂà§ÑÂàèÛ —Ù ãÂ@£äÂ@åÙÂ@ÙÛ ½Ý :Þ€òÜÂÀ”ÜÂ`3ÚÂIÙÂ`’ßÂàÖÞÂ`3ÚÂÀÄÔ ÁÒ .à ^ØÂ`ŒàÂàÐßÂ@bÚÂ%ß ÏÚÂ`ŒàÂàÜÝÂ@bÚÂÀ|à€øÛ sß pÕÂ@VÜÂ ÆæÂ äÂà¡ÒÂ`9ÙœàÂÀ Þ€ÚÂàGáÂÀvá ØãÂ`ªÛÂ@¯â :Þ€Ú€½ÐÂ@VÜÂÀ ÚÂÀAÕÂà0ÐÂÀÿßÂ@PÝÂàÊà Ÿâ mà€àß µÔÂ@>àÂÀ;ÖÂ1ÝÂÀ)Ù€±Ò ØÂ íÕÂ@÷ÖÂÀ Þ ÝÂûåÂ`VéÂ@åÙ ÝÂÀŽÝ jÖÂà›ÓÂàƒ×ÂÀ¦ÙÂÀîÍÂÀ/ØÂÀ/ØÂ€×ÂÌØÂ€«ÓÂàÕ€9æÂ@Dß µÔ Ú yÞÂ@ÁßÂÀÛ€™ÖÂÀAÕ€“×ÂÀˆÞÂ`?ØÂ —ÙÂÀRçÂàeÜÂàÖÞ ‘ÚÂÀ;ÖÂ@µá€ Ù Uä 4ß ^ØÂ Ý íÕÂà<΀ìÝ sß ¥áÂà¡ÒÂ@÷ÖÂåÂ@†Ô ”Ï \ÎÂÀ²×€ÚÂ@ÇÞ «àÂÀßÂÀ”ÜÂ`!Ý ‚ÒÂ`WÔ FÜÂsÒ€WáÂ@ÓÜ€ØÂ€ Ù€Ú€ìÝÂ@ÍÝ êà®ÝÂàSßÂ@åÙÂà§ÑÂ@ýÕÂ`¤ÜÂ`iÑÂÀ‚߀ÖÂ@zÖÂÀÜÐÂ@bÚ€ìÝ êà ,ÖÂäÔ ¯ÕÂÀÚ PР—Ù€ìÝ€àßÂOØÂà_ÝÂ@»à d×Âà Ö€·ÑÂà_ÝÂÀ Ú @ÝÂàúØÂ ‘Ú yÞ€(ÔÂà óÔÂàÂÀóá êà ©Ö äÂ1Ý “ä€ÚÂÀ5×Â`¼ØÂ ÙÂ@hÙÂàôÙÂà›Ó€Ö€àßÂÀÛ€Ú¨Þ íÕÂÀÄÔÂà_ÝÂ@'Ï yÞÂ@ÁßÂàƒ×Â`ŒàÂÀç〽ÐÂ`ÞÂ@†Ô sß RÚ ÌåÂÐÂ@ëØÂ€‡ÙÂ`ªÛ€™ÖÂØÖÂàSß 2ÕÂ@bÚÂ`à ã öÞÂ@8á LÛ ÚÂ`3ÚÂ`žÝ ©ÖÂ@zÖÂ`]ÓÂ`¼ØÂ€ØÂÏÂÀ#Ú ^ØÂ@ ÔÂ`žÝ PÐÂ`žÝÂàôÙ d× JÑÂ@°ÍÂðÒÂàúØÂ`!ÝÂ+Þ€þÚ€‡Ù ¥áÂÀ”ÜÂ`àÒÂ@åÙÂ@ ÔÂðÒ€^Ë ‚ÒÂ@ÓÜÂà‰Ö (áÂ@÷ÖÂà$Ò€ÚÂ`QÕ êàÂ@ëØÂ ÜÂ@†ÔÂÀAÕÂ@\ÛÂÀ#ÚÂ`QÕÂ`9Ù€LΠÛÂÀ)Ù€LÎÂàÓ —ÙÂgÔÂ`þÍ µÔ nËÂÀYÑ€ÖÂ`àÒ /ËÂ@3ÍÂàúØÂØÖÂ`ÈÖÂРÃÜÂðÒÂàÕÂ`¼ØÂ€@ÐÂ@ÍÝ µÔÂ`‡Ì€ÛËÂ@ªÎÂ@Ò çÖ pÕÂ@ÑÂà§ÑÂ[Ö€uÜ ½ÝÂêÓÂ`™É€4Ò€“×Â@t×ÂΠvÔÂ@ëØÂ PРPÐÂ@ÓÂ@÷ÖÂàwÙÂÀÐÒÂ@ªÎÂÀÊÓÂ@VÜÂyÑÂ`QÕÂ`WÔÂàôÙ€^Ë 5ÊÂÀGÔ€4Ò€‡ÙÂ@ÓÂ`Çë€]àÂÀ‚ß jÖÂà<Π ÑÂÀ¸Ö LÛÂU×€^Ë€ÃÏÂ`]ÓÂÌØÂÀSÒÂÆÙ ¯ÕÂOØÂ€òÜÂÀ”ÜÂ=ÛÂå Ü€RÍÂÀGÔ Àç …Ü ‘ÚÂ%ßÂ`†á —ÙÂ@÷ÖÂÀ¬ØÂ ·ÞÂÀÄÔÂ`°ÚÂ@ëØÂ ã‹ÎÂ@t× LÛ å€]à µÔÂÀˆÞÂÀÿßÂ`÷ãÂà/åÂËíÂÀ Þ LÛ ÃÜÂ`µîÂ`÷ã€cßÂ@,ãÂÀjã€Âä IæÂ (áºÛ åÂ@êíÂ@8áÂÀXæÂ çÂ@£ä gáÂÀRç€ëÂ@aïÂà)æÂ åÂÀçã€-èÂ`àÂÀ^åÂïçÂ@ åÂ@ åÂ@2âÂ`åæÂàôÙ å€?åÂÀÕæÂàꀰçÂ`ÍêÂàÄáÂáÂÀÉè€c߀à߀uÜ «àÂÀÛåÂ`täÂ@JÞÂÀLèÂ@£äÂÀçã€ÚàÂÀçãÂ@8á (á sß äáÂà)æÂ€˜ë :Þ IæÂàóîÂ`Jë€9æÂÀ^å þçÂ`\耀ïÂÑìÂ@çÂÀ·ë€tñ€WáÂ@êÂ`»í€\õ ÚíÂ@‹èÂ`bçÂÀÕæÂàáñÂ`VéÂàjðÂÀXæÂÀò€Îâ€?å€ îÂ`\èÂ@æÂÀ ÞŠãÂÀFé ï€¶æÂ„äÂ@µáÂ@yëÂ@æÂ@8á ¨ë€3çÂÀíâ¢ßÂ@çÂà”éÂ@©ã ‡æÂ ÀçÂrç ÃÜ 1êÂ@ åÂàšè .àÂà¾â ç€KãÂÀ½êÂà#çÂ@ꀰçÂÀFéÂÀÛå çÂ`ëåÂ@ÍÝÂ`VéÂà²ä€{Û€æÞ ´éœà ™ãÂ@,ãÂà)æÂ@£äÂÀváÂàGáÂà ç ðßÂ@DßÂNí€oÝÂ`êÂ@è ðßÂ`ñäœàÂ×ëÂÀ@êÂ`hæÂ€9æÂ@Dß ã màÂàGá oê Þâ ÒäÂ@©ã€]à 4ß +ëÂÀ ÞÂ@&äÂ@æÂ@JÞÂ`DìÂà5äÂrçÂäÂ`\èÂ`µî€-è€-è  æÂ@êíÂ`žÝ ÚíÂ@ÞïÂ`†á á×Âà5äÂå„äÂàÄá ä€쀪èÂ@ÍÝ äÂÀ"ï€bôÂ`!Ý ¥á ÀçÂ`ëåÂÀíâ RÚ€c߀ìÝ øèÂ`ßçÂ`ëåÂÀçãÂféÂàÄáÂ`'ÜÂÀ^åÂ@ÇÞ ™ãÂà¾â€ÂäÂÀXæÂÀÃéÂ`òÂ`nåÂ@©ãÂÀáäÂàÜÝÂ@t×ÂÀ”ÜœàÂ7ÜÂÀˆÞ oêÂ`âÂÀÿßÂÀdä ¥áÂÀdä ðßÂÀdäÂ`°ÚÂÀáä ÏÚ :ÞÂà#çÂ@ßÚ “äÂÀ ÚÂÀpâÂ`hæÂ yÞÂ`\è å Øã€°ç€òÜ ÏÚÂ@è äá aâ ™ã€Î†ـ“× sßÂàˆë Uä€Âä öÞ¨Þ œí Û€ØÂ ØãÂÀXæÂ„ä€òÜÂ%ßÂ@öëÂ@2â„ä€3çÂÀÉè€àßÂõæÂ`ñäÂÀùàÂÀçãÂ@8á ÉÛ ÝŠãÂ×ë€æÞÂÀjãÂÀjãÂÀváÂàÊàÂà¬åÂ@£äÂlè€òÜÂ`ÁìÂÀváÂ@»à€Îâ€ÔáÂ×ë ±ßÂÀ5× ºèÂ@ëØÂrçÂàê UäÂ`zãÂ+Þ€È〇ÙÂOØÂÀ¸ÖÂà;ãÂ@…éÂZëÂ@\ÛÂ`°ÚÂâÂ@hÙ€ ÙÂÀÿ߀Úà–áÂ`]ÓÂ`žÝÂÀLè€æÞÂ@êÂàGá gáÂ`¤Ü€cß ŸâÂâÂÀÛå êàÂ`>í€'é€ÚàÂÀÉèÂ@£äÂà)æÂàeÜÂÀŽÝÂÀjãÂ@ÍÝÂÀˆÞ .àÂ@©ãÂÀŽÝÂ@2â€?åÂÀváÂ@©ãÂ@2âÂàÄáÂÀ‚ß ÛÂ@£ä {è öÞ ‡æÂïçÂÀ½êÂ@PÝÂÀÛå þç¨Þ ÜÂà而íÂÀjã€ìÝ€ìÝÂâ åÂ@JÞÂ`åæÂ@ðìÂÀ)Ù€iÞÂÀ ÞÂ`ÔÔ FÜÂ@£äÂäÂÀpâ ½ÝÂ+ÞÂà²äÂ@>àÂ@åÂÀLè„ä þçÂÀßÂàÜÝ€ÚàÂÀÉèÂà¸ãÂrçÂàMà  æÂ@ê€!êÂÀÝÂÀ½ê€!êÂ`zãÂ`ŒàÂÀñÂÀÃéÂ[ÖÂÀÜ€í [ãÂÀ ÞÂ`'ÜÂ@êÂà)æÂà¬å€Qâ€ÚÂà_ÝÂ`?ØÂÀ ÚÂ ÆæÂ —ÙÂàAâÂ@ ÔÂ@êÂ`¶Ù€øÛÂÀˆÞÂ`¼ØÂ€‡ÙÂ@»àÂÀváÂ`àÂ@ŒÓÂ@åÙ€Ú åÂ@ýÕ XÙÂÏÂÀÕæÂàYÞœàÂ`täÂ@DßÂÀváÂ`ñä ÉÛ 4ßÂ@©ã€òÜÂÀ‚ß ·Þ ®êÂ`êÂ`täÂÀpâÂâÂ`nåÂ`†áÂ`ÚÓÂ@ÇÞÂàùíÂ`‘ôÂÀÈ€Âä€3ç®Ý ÃÜ ˆÑ€.Ó ÉÛÂàSß gáÂÀ4ì øèÂ@>à€žê€™Ö ÕÙÂ`ýâÂÀjãÂÀ±ìÂâ þçÂàYÞ€uÜÂ`zã äÂ@Áß RÚ€Wá ð߀EäÂ@»àÂ`WÔÂÌØÂÀáä€ÖÂÀ‚ßœàÂ@bÚÂ@ÇÞÂ@€ÕÂ@ å Ìå “ä äÂ@ê åÂ@gîÂÀjã ÜÂÀjã öÞ “ä màÂÀÏçÂå Oå ÛÂ+Þ OåÂàƒ× £×Â@ å€Âä 7éÂÀáäÂ`’ßÂàâÜÂÀ/ØÂ`ŒàÂ`-Û IæÂ [ã ºèÂÀóá gáÂàÐ߀Qâ€EäÂ`°Ú Ý Òä®ÝÂ`3ÚÂàYÞ RÚÂ`ñäÂÀ¦ÙÂ@\ÛÂàwÙÂmÓÂ`ŒàÂ@…é ,ÖÂàØÂ@ëØÂ ¯ÕÂ[Ö ±ß «àÂ@©ãÂ@ÍÝ€ìÝ€òÜÂ`¤Ü ±ß RÚÂà5äÂÀ|à€ ÙÂÀÚ 砙㠵Ԡ.àÂ`bçÂàSßÂ@VÜÂ@PÝ aâ ÚÂ`ªÛÂ`'ÜÂ`ßÂÀ_РçÖÂàSß Ÿâ màÂàîÚ jÖÂà¸ãŠã ÁÒÂÀ/ØÂÀáäÂÀÜÂ@bÚ Ú ßÍ yÞ …Ü€ î€ØÂÀdäÂÀÜÂ@ŒÓ€Ú Ù ^ØÂ`žÝÂ@€ÕÂ@D߀øÛÂÀÛ IæÂºÛÂÀjãÂÀ¾ÕÂ@t× åÂÀpâÂ`Þ€iÞÂà/å€ìÝÂÀ”ÜÂ`ªÛÂÀÊÓÂÀÕæÂ@©ãÂ@DßÂ` á€æÞÂÀ¬ØÂ@‘çÂ@æÂÀÚÂàúØÂà5äÂÀ ÞœàÂà§Ñ yÞÂ1ÝÂàÜÝÂä jÖ€WáÂÀ‚ßÂàâÜÂ@VÜÂ@ßÚÂ`ÞÂ`Â×ÂÀ#ÚÂ@zÖÂÀ|àÂ@ßÚ @ÝÂàMà ©Ö€Ú€ìÝ ^ØÂÀÛÂ`¤ÜÂÀ)ÙÂàeÜÂÀÚ sß @Ý gá ^ØÂ@nØÂ ØÂàÖÞ ÝÂà;ãÂÀÿßÂÀÜÂЀ±Ò Þâ .à€Wá ÃÜÂ`QÕ´Ü€(ÔÂÀ Ú€×Â@&äÂÀßÂà5äÂàéÂÀáäÂrçÂ@ñ×ÂÀÖÑÂ@!ÐÂà›ÓÂ@ýÕÂ`ýâÂ@¯âÂà×Â@÷ÖÂ`¤Ü€.ÓÂÀ¬ØÂ€¥ÔÂ`9Ù€XÌÂ`Ë€"ÕÂÀÖÑÂ@¶ÌÂU×€WáÂgÔ Ú€ØÂ@ýÕÂ`QÕ £×Â@hÙ …Ü€æÞÂU× [ã€ÉÎÂ`÷ã€oÝ màÂÀÚÂ@ÒÂØÖ ±ß ÝÂ`?ØÂ@†ÔÂÀ ÚÂÀÈÂ@nØÂ`KÖÂÀ¾Õ ÓÏÂgÔÂ`cÒ 2Õ çÖ€{ÛÂöÑ ÃÜ ÏÚÂðÒÂÀAÕ Ù —Ù€@ÐÂ`?ØÂ ÙÂØÖÂ8Ç€pÈ |ÓÂÀÖÑÂ@ŒÓÂ…Ï màÂ@ßÚ  ÑÂà$ÒÂ@ÓÂà•ÔÂÀ#Ú ÕÙÂ@¤ÏÂàÕ 2Õ€òÜÂ`9ÙÂ` ÌÂ@žÐ LÛÂÀ¸Ö Û€ÖÂÀË £×Â@Õ ÙÂ@ñ×€«ÓÂ@zÖ€‡ÙÂÀwÌ‹ÎÂ`ÚÓ€ÿÅÂà}ØÂ`"ÈÂaÕÂ@åÙÂà§Ñ µÔ \΢ߠÉÛ€FÏÂÀSÒÂ@÷ÖÂ@PÝÂàqÚÂÀYÑÂ`°ÚÂà ÖÂ`WÔ ÙÂ@ÓÜÂÀ/ØÂ`]Ó jÖÂIÙ€{ÛÂà­ÐÂÀâÏÂÀ¾Õ )Ì ùÓÂÀSÒÂ@ Ô ^ØÂ`E×ÂÀŽÝ ÙÎÂ`{ΠÜÂ`?ØÂ€½Ð€±ÒÂÀèΠˆÑ€ÚÂàØÂ óÔÂÀSҺۢߠ ÍÂÀ¾ÕÂ@åÙ ‘ÚÂ@VÜ´ÜÂÆÙ€(Ô XÙÂ`žÝ´Ü ñÊÂÀeÏ ÈÂ@bÚ€LΠ‚ÒÂØÖÂÏÂà6Ï ÐÂà}ØÂ€RÍÂà³Ï€Ö€RÍ ,ÖÂÀqÍ yÞÂÀ¦Ù€Ú€"ÕÂ`øÎ ÇÑÂ@ëØÂ@ëØÂ€ÚÂ[ÖÂàSß RÚÂÀ¸Ö >Ó d×€¥ÔÂà›Ó£Ê ,ÖÂ`QÕÂ`cÒÂmÓÂÌØÂàèÛÂÀ¦Ù 5Ê ¯Õ€òÜ RÚ€ØÂ` ÌÂà`ÈÂU×ÂÀÜÂ=ÛÂÀ|àÂ@»à¢ßÂÀ5×ÂsÒÂàÂ+ÞÂà<Π|Ó€"Õ®ÝÂ@nØÂ LÛÂ`žÝÂ@\Û 4ßÂ`¤Ü€4ÒÂ@PÝ€Úà€ÚÂÀYÑÂàèÛÂ@ýÕÂ`˜ÞÂ`ÎÕÂà×ÂÀMÓÂàôÙ€±Ò üÝÂà²ä€ØÂàØÂÀÄÔÂÀÛÂÀqÍ ÉÛ jÖ µÔ ‹ÛÂÀGÔÂ`KÖÂÒ×Â` ÌÂ`KÖÂ`9ÙÂ@\ÛÂÀˆÞ€× 4ßÂaÕÂgÔÂÀ²×Â@JÞ–á jÖ€.ÓÂ@€ÕŠãÂà)æÂà­Ð€ÚÂ`9ÙÂàÕÂÀ)ÙÂ@êÂ@ÍÝ€ÖÂ@ÍÝ jÖ LÛ€uÜÂ@ÍÝÂÀßÂà‰ÖÂ@ÇÞÂ@VÜÂÀ²×ÂÀ¾ÕÂ+ÞÂ@-ÎÂ`WÔ ÏÚ d×ÂÀ¸ÖÂÀšÛÂàØÂÀÛÂä “äÂÀÜ€¤é d×Âàƒ×Â`!Ý VÏ€:ÑÂàeÜ€ÚÂÀÜÂàkÛÂ`'Ü ùÓÂ`˜ÞÂ@,ãÂàôÙ ã€ÚàÂàéÂ@ñ× 4ß„äÂÀXæÂ@PÝ€ÚÂ@&äÂ`âÂ`¶ÙÂ@ßÚÂ@Dß FÜÂÀAÕÂÀŽÝÂ@ÍÝÂ`3ÚÂ`‶æÂ€ÚàÂàwÙ´ÜÂüÐÂ`’߀iÞÂ@ÓÜ Þâ ØÂ`-ÛÂ`ëåÂ`>íÂ%߀àßÂ`Œà€Eä€ÔáÂ`'Ü€àßÂxæÂ€“×€ÚàÂ@ßÚ [ãÂ@çÂ@JÞÂÀóá€ÚàÂ`¤ÜÂ@å Ý ãÂáÂäºÛÂàôÙÂÀ#ÚÂ`Þ€-è pÕ€.ÓÂÀ Ú€"Õ€.Ó 2ÕÂ@\ÛÂàwÙ «àÂaÕÂ`àÂêÓÂÀ)ÙÂ`ÞÂ%ßÂàÕÂ@†Ô á× ØÂ€ÔáÂâ ÒäÂ`°ÚÂ`?ØÂ`nåÂïç sß Ý ÜÂ7Ü ÒäÂ@ å€?å üÝÂàØÂÀíâÂ`¶ÙÂ@ÍÝÂÀùàÂ`ÚÓ Ù€ÎâÂÀjã aâ £×€Eä€iÞÂ@>àÂ@\ÛÂ@ëØÂ`ß màÂ@>àÂ`3Ú (áÂ@ÍÝÂ@D߀uÜÂàwÙ :ÞÂ@>àÂÀMÓ¢ßÂÀŽÝÂÀšÛÂ`’ßÂ@ßÚÂ` á (áÂ@&ä yÞ ‹ÛÂÆÙ®ÝÂà$Ò 4ßÂ ÛØÂ .à [ãÂÀóáÂrçÂ[Ö€Ú jÖ€ÉÎÂà*ÑÂ`Â×´ÜÂ`ÈÖÂÀŽÝ ‹Û ðßÂU× Û ÝÂà_ÝÂÀ¾ÕÂOØÂ`3Ú–á óÔ Û ÚÂ`'ÜÂmÓ€ŸÕÂ[ÖÂ`ÞÂ@»àÂÀÄÔ ÁÒ ÿÒÂàƒ× ÕÙÂ@!РyÞÂÀváÂ`¤ÜÂ`cÒ óÔÂ`¶ÙÂ`˜ÞÂ`]ÓÂÞÕ ‚ÒÂÀ;ÖÂ`WÔ€ØÂ ÕÙÂÀÝ |Ó µÔ ¯Õ€òÜÂ@ÑÂàÕ ØÂÀFéÂÀÐÒ€XÌ Ú€™Ö üÝ »ÓÂ@9ÌÂàÜÝ d×ÂÀdä 8ÔÂyÑÂaÕÂ`-ÛÂÀ²×Â@†ÔºÛ ØÂðÒÂ`àÒ jÖ€ÚÂ@nØÂÀ5× ÕÙ ·ÞÂ ÛØÂàÜÝ ÉÛÂÀ ÚÂÀdä ŽÐÂÀGÔÂà›ÓÂàwÙ ÕÙ€ÏÍÂ`àÒ€4ÒÂgÔÂ@€Õ £×ÂàÖÞÂ@÷ÖÂÀÐÒºÛ µÔÂàAâÂ@ÍÝÂà/åÂ`â vÔÂÀ¦Ù ‘ÚÂà}ØÂàîÚ JÑÂ@¤Ï€«ÓÂàØÂ@÷ÖÂ`’ß ØÂàÕ …Ü —ÙÂ`ÞÂÀAÕ ,Ö ÚÂ`’ßÂÀßÂ`WÔÂÀß üÝÂàúØÂØÖÂÀ¦Ù (á€"ÕÂÀ”ÜÂ`>íÂ`-Û @Ý–áÂU×€ÚÂÀ¦Ù€ÚÂ`àÂ@>àÂ@ÙÛÂ@ÙÛÂ@µáÂ@VÜÂ` áÂ@ñ×Â@»àÂÀçãÂàÄá êàÂ`˜Þ€?åÂà|í RÚÂ`žÝ€]àÂ@ÇÞ FÜ ŸâÂ%ß êà€KãÂÀ|à€àßÂàùíÂ`hæÂ¨ÞÂàé€]àÂ@VÜÂÀóá CçÂÀdä pÕ€iÞÂàÊà€ÔáÂ@>àÂ@éÂàôÙÂÀùà€Kã öÞ€WáÂà¾â å´ÜÂÀˆÞ€øÛÂ@&ä€KãÂTìÂ`â 4ßÂ` á 1êÂà¸ãÂ`êÂÀ½êÂàšèÂ@yë ÉÛÂïçÂrçÂà;ãÂÀÛ€æÞÂ`ÇëÂÀšÛÂ`E×Â@æÂå äáÂ@ åÂ1ÝÂàÂ@ÙÛÂ7ÜÂU×ÂàÊàÂ+ÞÂ@PÝ€òÜÂÀváÂ@¯âÂ`hæÂ@»à€WáÂ@>à ç–á€?å “äÂ`8î€zðÂ`ßçÂâ€cßÂ`bç€?å¨ÞÂ@&ä€KãÂ@µá ÝÂ`hæÂ@‘çÂ@,ãÂãéÂÀíâÂâÂ`\è êàÂÀváÂ@£ä ÃÜÂàŽê 7éÂÀô «àÂÀóáÂ`÷ã³ñÂ@,ã á×Ârç IæÂ@ðìÂféÂ`êÂÀßÂ`Þ€àßÂ`Œà ãÂàê .àÂ@è ºè 7é ìê€ìÝ€oÝÂ7Ü ‹Û Òä€Eä€ÚàÂ+ÞÂ@æÂ ÝÂ`9Ù€WáÂ@µá s߀ØÂ CçÂ@2â sßÂ@DßÂÀ Ú “ä "⠱߀ÚàÂàÖÞÂàêÂäÂ@¯â êà OåÂ`Â× ½Ý Û çÂâÂÀˆÞÂà²äÂÀÿßÂ`’ßÂ`-Û [ã ä᠙〪è {è ºè€?åÂÀ ÞÂÀçãÂ`†á JÑÂÀMÓÂÀjã€Wဒì€iÞ€×ÂàÜÝÂÀÏçÂ@bÚ µÔÂ@ßÚÂ@>àÂCÚÂ@ å€ìÝÂaÕÂà¦æÂ1Ý äá FÜÂ`˜Þ€àßÂ@ÓÜ jÖÂ%ßÂ@ÁßÂÒלàÂ`-ÛÂÀŽÝÂ@¯âÂ`¶Ù JÑÂàÄဓ×ÂÀ¾Õœà€žêÂÀpâÂ@êÂÀ^å yÞ …Ü Ú @ÝÂ@VÜ€òÜÂ`?ØÂ7ÜÂmÓ äáÂÀ ÞÂ`ÁìÂ`žÝÂâ€E䀿ÞÂ@DßÂ=ÛÂÀpâÂÀdäÂ@ÓÜÂÀùàÂ@ëØÂ@êÂÀÉèÂ@µáÂ`ñäÂÀdä ðÂ`˜ÞÂÀ/ØÂÌØÂ {èÂà)æÂ :Þ CçÂ@2â€ÚàÂ`hæÂ€oÝÂ@¯âÂÀŽÝ öÞÂÀóáÂ`àÂ@ÓÜÂÀ‚ßÂ`ÎÕ€ ÙÂÀváÂÀ ÚÂ`'Ü þçÂÀ(î€àßÂ@&äÂ@€ÕÂïçÂ`ýâÂ@£äÂõæÂ@DßÂÀ|àÂ`€âÂ@&äÂ+ÞŠãÂ` áÂxæÂ ué€3ç @ÝÂàÓ ÏÚ€ë OåÂ@,ãÂ`bç øèÂ`bçÂàƒ×Âlè ÝÂrçÂà¾â€ØÂ Uä–áÂÀdäÂàŽêÂàdñÂ`hæÂ ‘Ú€WáÂ`àÂÀ Þ€uÜ äáÂÀíâ å UäÂ@»à€ìÝÂàSßÂÀˆÞÂ`˜ÞÂ@»à  æÂ€iÞ ‹ÛÂÀÕæÂ€c߀Îâ ðßÂÀjã ué ÌåÂ`ñäÂàÖޠ݀ÚÂàóîÂ@æÂ@åÂ`˜Þ “äÂÀ ÞÂõæÂ€Wá ÚÂÀÜ Ú X٠݀렇æÂ@æÂ`nåÂÀ:ëÂ@ßÚÂ@y뀶æÂ@êÂàGáÂ@»à (áÂÀíâÂÀ‚ßÂáÂäÂ@ðìÂÀLè aâÂ@êÂ@æÂÀáä UäÂáÂÀÛå ØãÂàÜÝ .à ÙÂ@aïÂ@‹è€æÞÂàÜÝÂÀß aâ„äÂàYÞÂ@Áß Ý ã Òä äáÂØÖ IæÂ€WáÂ@…é€-è ™ã€'é gáÂÀjã "âÂ@ñ׿ïÂ@êÂ@‘ç 7éÂà ë€QâÂ`ÍêÂ@—æÂ ðßÂÀ²×€3çÂà‚ìÂ`êÂTì€æÞ€¤éÂåÂ`ÙèÂ@åÂÑìÂéèÂ`nåÂ@æÂ CçÂÀùàÂ`÷ã€c߀!êÂ@VÜÂÀ|àÂ@êÂÀçã€]àÂÀáäÂ`†áÂ`àÂÀpâÂ@å Ôî =èÂ`täÂÀRçÂ`†áÂÀ‚߀°çÂTìÂ<ðÂ~å ÝÂÀáäÂÀ"ïÂ`Áì€tñ CçÂà²äÂxæÂ`÷ {è å ç äáÂÀÏç ºèÂ@yë€Œí ±ßÂà ç€Eä€!ê åÂ~åÂÀŽÝ s߀¶æÂÀLèÂàdñ OåÂà²äÂàÄá üÝÂ@‹èÂËíÂÀ|à–áÂ@©ã ãÂ~å ã äáÂõæÂ`€â òéÂfé þç€!êÂàšèÂäÂâÂÀÉèÂàÄáÂ`߀ìÝÂÀÕæÂïçÂÀð ÔîÂûåÂà”é  æÂ`†á [ãÂÀóáÂÀRçÂàŽêÂÀóáÂ@¯âœàÂxæÂ@yëÂ@êÂ@sì ™ãÂ@æÂ@PÝÂ`,ðÂTì "âÂ`!ÝÂàÄáÂä øèÂà)æÂÀ¥îÂàÊàÂ@míÂà;ãÂÀÏçÂ`VéÂÀXæÂà¸ã mà€Œí ™ãÂ@êÂ@éÂáÂ%ßÂ`Óé ÏÚ {èÂ`Vé€3çÂ`ê aâ€ÚÂ@‹èÂ@&䀿ÞÂ~åÂÀXæÂZë¢ß %ìÂ`Ùè =è€iÞÂ`ªÛ€°çÂ@ÙÛÂ`˜Þ€·Ñ íÕ ØÂ€]à [ãÂÀßÂ@ÍÝÂÀ"ïÂÀLèÂÀÝ€Ú çÖ€æÞÂÀ‚ß ië ¢ìÂàôÙÂ@ÓÜÂÀÛåÂ`VéÂ@£äÂÀ¦ÙÂÀ/ØÂÀóáÂà¾âÂ@êÂ@ÇÞÂàŽêÂà ëÂ@ÁßÂÀ|àÂÀÿ߀oÝ sß –î ‹Û >ÓÂ`†á FÜÂÀ;ÖÂà‚ì 7éÂÀ‚ß ÀçÂ@8áÂ1ÝÂ@ýÕ ÞâÂ`¤Ü —Ù ã€iÞÂ@PÝÂÀ¦ÙÂÀùà åÂ@JÞÂ@hÙ …Ü€?å€]àÂÀšÛÂ ÆæÂ@µáÂÀváÂÀóáÂ@D߀ ÙÂÀßÂ`åæÂ€òÜÂ`ßÂÀóá€cßÂIÙÂà ÖÂ@—æÂà¸ãÂàèÂà¾âÂÀóáÂ`Þ :ÞÂàèÛ ÚÂÀjã LÛ yÞÂÀŽÝ FÜÂ@éÂ`Â×ÂàÕ€Ôá€]àÂ`PêÂàšèÂ=ÛÂäÂ`\èÂàèÛÂ`ß “äÂàGá€Eä üÝÂ`ñä ÃÜ @ÝÂ`ßç ½ÝÂà¦æÂàîÚÂ`âÂÀÛÂÀÝÂ@‘ç {è ÝÂ`ŒàÂà;ãÂ@,ã ¥á màÂsÒÂÀGÔÂÀ)Ù ÃÜÂÀÚ yÞÂ`žÝ [ãÂ`˜ÞÂàHÌÂ`°ÚÂ@ëØÂ`cÒÂOØÂÀYÑÂaÕ ØÂ`?ØÂà‰ÖÂ`–׀ڀ"Õ€ÚàÂàYÞÂÒ×´ÜÂ@nØÂ@JÞÂ ÛØÂ ŽÐÂ@ÓÜÂÀˆÞ 8ÔÂÀRçÂÀÿßÂà¬åÂÀ”Ü ÃÜÂ@ßÚÂÀˆÞ€Ú€uÜ€øÛ ©Ö 2Õ >Ó€øÛÂ@hÙÂ`!ÝÂ`æÑÂ@-Π·ÞÂ@hÙÂ`ß Ù€QâÂÀ¾ÕÂÀóဥÔÂàeÜ€Ö ØÂàÔ Ý öÞÂ`ÞÂ`'Ü ,ÖÂ@Ò gáÂ`žÝÂ@ÍÝÂ@ÁßÂÀ Ú ÇÑ üÝÂàÖÞÂâ ØÂÆÙÂÐÂÀ²×ÂÀ Þ ØÂ jÖÂ`ßÂCÚ ùÓÂ%ßÂàƒ×Âà<ÎÂà§ÑÂÞÕÂÒ× ØãÂàkÛÂà ÖÂ@ÍÝÂ@,ãÂà}ØÂÀGÔÂà6ÏÂ@ñ× êàÂ`¼ØÂ`˜ÞÂ=Û çÖ€™ÖÂ@¯â äáÂÀÛÂà$Ò€‡Ù€:ÑÂà¡ÒÂ`˜Þ äáÂàØÂ¨ÞÂ`-ÛÂ~åÂ@»à€ØÂ€™ÖÂ@2â êàÂ`'ÜÂÀÚÂ`¼ØÂà}ØÂàƒ×ÂÀ;ÖÂàÖÞÂÒ× [ã êà FÜ€WáÂà‰ÖÂàúØÂ RÚÂ`’ß êàÂÀ:ëÂ`'Ü€Îâ€ÈãÂ@µáÂ@hÙÂÀÛÂàYÞ öÞ ÝÂ`’ßÂÀjã ã ™ã ÏÚÂ@bÚ ±ß äáÂà‰ÖÂÀ²×Â@JÞ€žêÂ`ªÛ 4ßÂ@PÝÂ`?ØÂàèÛÂÏÂ@êÂ`DìÂà)æÂÀ”Ü FÜÂ@&äÂÀ#ÚÂÀ‚ß ‚ÒÂ@\Û€Qâ üÝÂU×Â`žÝÂ@Áß ãÂÀÚÂ`{ÎÂ@8áÂ@ëØÂ+Þ Øã XÙÂäÔ µÔ ÏÚÂØÖÂÐÂÀ‚ß ÒäÂÀšÛ ãÂÀÜ UäÂ1ÝÂÀ”ÜÂÀ¬ØÂà²ä€oÝÂàMà øèÂà/åÂÀçãÂÀçã€WáÂ@åÙÂÀ/ØÂÀ¬ØÂ@2âÂ`tä äá€ÔáÂÀ^åÂ@&ä€ìÝÂ`ñäÂ`†áÂ@µáÂÀóáÂ%ß —ÙÂÀÉèÂ`˜Þ€¶æÂ@»àÂÀÝ€ÚÂÀÜЀ Ù Ìå 7éÂ@æÂ´ÜÂÀváÂÀŽÝ€ ÙÂÀÿ߀ìÝÂ`’ßÂ`ìÐÂ`ñäÂ@êÂàeÜ€øÛÂàØÂ1ÝÂ`à€{Û€“×Â@ßÚÂ@ÙÛ ½ÝÂÀ¬ØÂàÊàÂáÂÀpâÂ`Œà þçÂàÊà ÏÚÂ`°ÚÂÀóá  æÂ@nØÂÀ/ØÂºÛÂ@£äÂ@2â &× ØÂ@é ‹ÛÂâ …ÜÂÀ‚ßÂà —ÙÂÆÙ ÏÚÂà¾âÂà¦æÂ ð߀ŸÕÂ`âÂ`?ØÂ å€iޢߠ.àÂ`ªÛÂ+Þ€]àÂ`ŒàÂàâÜ€™Ö ‘Ú .àÂÀ¾ÕÂàSßÂÀpâÂ`¶ÙÂÀò —ÙÂÆÙÂàèÛ€"Õ€ ÙÂà­Ð Û ‹Û€]à yÞÂà‰ÖÂ`'Ü€àßÂÀXæÂà5äÂ@t× @ÝÂà$ÒÂöÑÂÀYÑÂÀ¸Ö€þÚÂ`9Ù€øÛ€?åÂöÑÂ`ìÐÂÀŽÝ€ Ù óÔÂOØÂ@¯âÂà*ÑÂàÓÂIÙÂ`WÔ ÕÙÂÀ¾ÕÂÀßÂÀ;ÖÂàkÛÂÀÊÓÂ@,ãÂ`iÑÂ@ Ô®ÝÂ@ÓÜÂàeÜÂ@\Û öÞÂ@PÝÂ@€ÕÂà*ÑÂ`òÏÂÀ¦ÙÂàÔÂ`ßÂåÂ@Õ€“× tÊÂ`ÚÓ ùÓ RÚ DÒÂà$ÒÂÀÐÒÂ`ÎÕÂÀšÛÂÀeÏÂU×€þÚÂÀ5×ÂÀ”Ü ½ÝÂ@÷ÖÂÀšÛ€{Û …ÜÂ@ÇÞ€“×ÂCÚ ÜÂÀ¦ÙÂÀ#Ú ÏÚ ÝÂ@’Ò …ÜÂ@ÓÂà×Âà‰Ö¨Þ€Qâ€oÝ LÛÂ@ëØÂ ‚ÒÂàGá€òÜ€™ÖÂIÙÂàâÜ ©ÖÂÀÛ ÝÂIÙÂ@çÂÀß JÑÂ`QÕ€ØÂà›ÓÂÀÚ ÉÛÂ`€âÂ@PÝÂ`ßÂ@¶ÌÂIÙ á× ±ßÂ ÛØÂàØÂ€“×€ÚàÂgÔÂ+ÞÂ`'ÜÂ@\ÛÂÀÖÑÂÀÜÐÂØÖÂàGáÂ@åÙÂ@Ó màÂ`8îÂÀˆÞÂ[ÖÂàâÜÂ@ëØÂ@ßÚ 8ÔÂà_ÝÂ@ñ×ÂÀ/ØÂà§Ñ€“×€æÞ ÕÙ€uÜÂÀŽÝ€Ú Ý :Þ€LÎÂàÔÂ@÷֮ݠ¥á€òÜÂà*ÑÂà¸ãÂ@ÍÝÂ=ÛÂ+ÞÂÀdäÂ`E×Â1ÝÂà_Ý £×Â`KÖÂàAâ RÚÂÀŽÝÂÀ|àÂ@ÁßÂÀ”ÜÂ@†Ô€Ö€× [ãÂ`âÂ`ªÛÂöÑÂ@ÒÂÀÏç€Îâ çÖ€æÞÂ@\Û€iÞÂ@ªÎ€uÜÂ`¤Ü µÔ ØÂØÖ sßÂ@nØÂ+ÞÂ@÷Ö€{Û ÜÂÞÕÂÀß (áÂ7Üœà FÜÂCÚ ‹ÛÂ`oРyÞÂ@ßÚÂû堥ᠩ֠‘ÚÂâ ‘ÚÂ`E× jÖÂU×Â@µá ä€KãÂ@»àÂxæÂ` áœà pÕÂÀ#Ú .àÂ@ÁßÂ`ÞÂàkÛÂÀáä€uÜÂÀÜÂ@JÞÂ`'ÜÂÀYÑÂàYÞÂ`9ÙÂ`ýâ &×Â@»àÂ`‹õ êàÂ`÷ãÂ`àÂà”éÂàîÚÂàÊàÂ@8á åÂ`ÞÂxæÂ@‘ç ç€ÈãÂ@ÓÜ …ÜÂËíÂ@PÝÂ7ÜÂ~åÂàƒ×Â@Áß £×ÂÀvá€?åÂ@‹èÂ1Ý€ÚÂ`ßÂ7ÜÂà#çÂ`E×ÂÀ”Ü€àß´ÜÂÀóáÂÀ Ú€ìÝ´Ü€× ‘ÚÂÀ5×Âà#ç üÝ Òä "â äá€'éÂÀpâÂrçÂÀ‚ßÂÞÕÂ`ýâ êàÂ@»à ÙÂ`uÏ€oÝÂ`cÒÂ1Ý óÔ„äÂàÐ߀þÚÂàèÂÀùà ãÂ`ÔÔÂàeÜ ÏÚ XÙÂ@µá´ÜÂ@>àÂ@ÍÝÂ`Œà€נˀÚàÂ`’ßÂÀšÛÂ`'ÜÂ1ÝÂ`ŒàÂ%ßÂÀ‚ßÂ%ßÂ@ÙÛ€ØÂ /Ë "âÂàwÙÂàSßÂ`-ÛÂÀ)ÙÂàÜÝÂ@DßÂ@ýÕÂ`ÈÖÂ`?ØÂ …ÜÂÀ|à £× ÕÙÂ@ÍÝ mà PÐÂÀÜÂ@ÇÞ€Ú€KãÂ`¶Ù€"ÕÂ@-΢ߠ[ã€QâÂàâÜ€ÚÂÀ¦Ù …Ü€ÚàÂ`?ØÂà§ÑÂÀÜÂÀ²×ÂÀâÏÂ@÷ÖÂà•Ô€æÞÂ@ÓÜÂ@>àÂÀ|àÂ`{ÎÂÀÝÂÀÝÂ`nåÂ`?ØÂ ØÂ çÖÂÀ Ú ÙÂ@åÙÂàâܢ߀×ÂOØÂ`zã€ìÝ€þÚÂà­Ð XÙ £× »Ó€KãÂ`˜Þ ÉÛÂ` á€ÎâÂÀ#Ú hÌ€uÜ íÕÂÀYÑÂÒ×Â7Ü€{ÛÂOØÂÀ¸ÖÂÀçãÂ@¯âÂêÓÂàØÂ€oÝ @ÝÂ`Â×Â`oÐÂ@!ÐÂ@ŒÓÂ@ÕÂàèÛÂgÔÂ+Þ ÝÂ`¶ÙÂ ÛØÂ ‚ÒÂ@ßÚÂ@ ÔÂ`¶ÙÂ`¶ÙÂÀ#ÚÂàƒ×ÂàÔÂ`3Ú€oÝ€þÚÂ`WÔÂà•ÔÂCÚÂ@ñ×ÂCÚÂ`-ÛÂ@°Í d× ÜÂà¡ÒÂ@žÐÂàØÂÀ¬ØÂÀ²× jÖ€×Â7Ü€×ÂÀ/ØÂ@bÚÂ`ÍÂ`¼ØÂ`-ÛÂÀ¾ÕÂàÔÂ`ÔÔ€ØÂ@ ÔÂ@zÖ€±ÒÂÀÚ€iÞÂ@ÙÛ VÏÂ@€ÕÂ`ìÐÂà Ö ^ØÂ@ÇÞÂ`?ØÂ |ÓÂà×Â@t×€ìÝ ÇÑÂÀáäÂàØÂ@9ÌÂ`WÔ ÒÂgÔÂà§ÑÂ`¼ØÂ  æÂ€æÞ ùÓÂØÖ€ìÝÂàèÛÂ@ÈÉÂ@÷ÖÂ` áÂÀ‚߀FÏ€ÚÂÀÛÂ`Â×€þÚ åÌ #Í Ò¨Þ óÔ #ÍÂà›Ó€«ÓÂÀôÌ ¯ÕÂà‰Ö€ØÂ€«Ó€:Ñ€½ÐÂ`øÎ€ØÂà0РãÂáÂgÔÂÆÙÂÀeÏ LÛ öÞ @ÝÂmÓÂ@€ÕÂ@’ÒÂ…Ï€.ÓÂÒ× ¯Õ d×´Ü ÃÜ€“×ÂOØÂU×Â@Õ ©ÖÂÀ¬ØÂ`?ØÂ ÝÂ@ÇÞ gá ÝÂ`€â  æÂ€™ÖÂÀvá ™ãÂ`˜ÞŠãÂÀÚ ,ÖÂ`Â×Â`ÞÂ`â :Þ ãÂ`ŒàÂ`ŒàÂ@ýÕÂ@zÖÂÀ#ÚÂ`¤Ü€Ôá´Ü€ÚàÂ`-ÛÂàÜÝ ðßÂà²ä€Ôá ¯ÕÂ@hÙÂ@'ÏÂ`ÞÂÀÛåÂàúØÂ ã ÞâÂàÐß ÛÂ`ŒàÂÀXæÂÀj〪èÂà¾â ™ãÂ`ýâ ÝÂ`ߊãÂ@8áÂàƒ×€«ÓÂ@ÙÛÂ@PÝÂ`nåÂÀÿß ¥á ^ØÂ …Ü€¶æÂ€oÝÂ@PÝÂ` á ÃÜÂõæÂTìÂ@>à yÞ ÝÂ` áÂà×ÂàYÞÂ@,ã€ªè€æÞ€{ÛÂàkÛ€·ÑÂ`nå€ìÝÂäÂà ç ´éÂà‰Ö ‹ÛÂ@÷ÖÂ`ÎÕ .àÂàÊà€iÞÂàèÂ@»à€cßÂÀRçÂäÂ`åæÂÀßÂ@ÙÛÂàÖÞÂ`ªÛÂàÿìÂÀ^åÂàSßÂ7Ü ÞâÂ`&ñ ìêÂ@©ãÂÀdäÂ@ÓÜÂÀ/ØÂ çÖ€ÚÂ`˜ÞÂÀÕæÂ  æÂ€QâÂàÄáÂ`ßÂâÂàÐß®ÝÂ`¤ÜÂ7Ü€ÚÂÀLèÂÀÜÂÀíâÂÀÄÔÂÀ^å äÂ@ÍÝÂÀXæÂÀÛ倶æÂ çÂà)æÂ aâÂÀíâÂàeÜÂ`VéÂà)æÂ`߀3çÂÀÏçÂ@åÂÀ^åÂ`ßÂ`ÞÂCÚ´ÜÂàâÜ ÃÜÂ@ÇÞÂÀ‚ßÂ`bçÂÀˆÞÂ@µáÂlè€ÔáÂÀ^åÂ1Ý 4ßÂ@JÞÂ@&äÂ@,ãÂÀváÂà¦æÂ@üêÂà)æÂ øèÂÀùà€cß 4ßÂ@ê ÂñÂà5äÂ`WÔ àì„äÂÀÝ Û –î€]àÂ@ÍÝ XÙÂ`¶Ù€uÜÂ` áÂ`€âÂÀçã ÝÂ`¶ÙÂ`†áÂ@êÂà¾âÂÀ ÚÂ@åÙ {è€]àÂ@ÁߨÞÂà*Ñ  æÂ`߀ ÙÂåÂ@—æÂ çÂÀíâÂÀÛ öÞÂ`àÒÂ`ªÛÂÀ¸ÖÂ`ÔÔÂÀ‚ßÂ`âÂÀpâ ð߀“× þçÂà)æÂÀ)ÙÂ`QÕÂ`’ß @ÝÂ` á =èÂÀjãÂIÙÂ@ÍÝ ±ßÂÒ×Â=ÛÂÀFéÂ%ßÂàYÞÂÀ«í€ÂäÂ@PÝ€‡ÙÂÀ5× UäÂÀíâÂ@µáÂ%ßÂ@€ÕºÛÂ@>àÂà¸ãÂ@2⠱ߠ‹ÛÂØÖÂxæÂ@Áß ¯Õ 1êÂÀÝÂ@ åÂÀùàÂ`3Ú€Âä 1êÂ`÷ãÂ`ëåÂ@µá …ÜÂ@VܨÞÂÀ5× vÔÂ@&äœàÂ@ÓÜÂ%ßÂ`’ßÂÀˆÞ µÔÂàÕÂ@JÞ &×€™ÖÂàÐߨޠÝÂà;ãÂ+ÞÂ`ñäÂ@ÓܺۀÎâÂ@‹è ç€oÝÂÀ ÚÂ`¼ØÂ€þÚÂ@åÙÂ`ÍÂ`cÒÂ`ÚÓÂ`!Ý Ý®ÝÂ`âÂ@ëØÂ€™Ö óÔÂ`oÐÂIÙ€ÚÂ`3ÚÂ`Â×ÂàeÜÂÀÜÂÀeÏ gá€ØÂ yÞ VÏÂ@ñ×€ØÂ€ØÂÀùàÂÀ/ØÂ Ù€òÜÂ`ªÛ ‘ÚÂàâÜ 4ßÂàAâÂ`ÈÖÂ`ÚÓÂÆÙÂÀÜÐÂ@˜Ñ¨ÞÂÀ¸ÖÂÀ¬ØÂ@ñ×Â@ñ× ‘ÚÂàqÚÂ%ß ‘Ú€ŸÕ ½ÝÂ@hÙ d×€ÎâÂÀ;ÖÂ@JÞÂÀšÛ ¯ÕÂàAâÂ`E×ÂÀ²× ÁÒ ©ÖÂàƒ×Â@ÇÞÂ`àÂà×€ÚÂ` áÂà¿Í€Ö‹ÎÂàÓÂsÒÂ`ß ÝÂР‘ÚÂüÐÂÀ;Ö€Ú åÂà×ÂØÖÂ`¼ØÂ ÿÒÂÀÜÐÂÌØÂÀqÍÂ@€ÕÂ`9ÙÂ@ßÚÂ@ÍÝÂàÕ€Ú€.ÓÂ%ßÂIÙÂàYÞÂ@ßÚÂâÂÀ)ÙÂyÑÂöÑÂ`þÍ€™ÖÂðÒ Û ÝÂÀSÒÂ`±Å€ØÂ€“× á×ÂgÔÂ@ÈÉ ˆÑÂà¹Î PÐÂà*ÑÂIÙÂàwÙ€(ÔÂ@t× ÙÎÂÀ5×€ÃÏ€½ÐÂ`3ÚÂ`ÔÔÂà­ÐÂU×ÂÀúËÂ@9ÌÂÀYÑÂ@ŒÓ‘Í ©Ö ÉÛÂ`¤ÜÂ7ÜÂ`9Ù 8ÔÂØÖ ÕÙÂÀ;ÖÂ@\ÛÂ@JÞÂà•Ô vÔÂÀ¦ÙÂÀ²×Â@€Õ ÃÜÂÐÂÀ¾ÕÂÀeÏÂ@ÓÜÂIÙ ÛÂ`àÂ@åÙÂÀŽÝÂàèÂ@2â€Ôá ‘ÚÂ`?ØÂ€.ÓÂU×ÂÀ/ØÂ@Ò á×¢ßÂ`÷ãÂ@ýÕÂ`°Ú€þÚÂàâÜ Ú RÚÂ@ßÚÂ`¼ØÂ€øÛÂ@VÜ jÖ 2Õ€Ú ØÂ ãÂØÖÂ@VÜ åÂÀÄÔÂ@ÓÜÂ@ÇÞÂ@nØÂ JÑÂ@2â€òÜ Ú ÁÒ€ÎâÂ`9Ù€'éÂÀÿßÂ@yëÂ@nØÂ@ýÕÂ@ßÚ ØÂ`Â×ÂOØÂàwÙÂ@ñ×Â`òÏÂàËËÂà‰ÖÂäÔÂàYÞÂàSß pÕÂÀ¸ÖÂ`òÏÂ@ÒÂ[ÖÂ@ñ×Â`˜ÞÂ ÛØÂà*ÑÂyÑÂÀYÑÂU×Â@žÐÂ`ÎÕÂÀMÓÂà¡Òœà€ÚàÂ`9ÙÂ@ÓÜÂÒ×ÂàwÙ çÖÂàâÜÂà6ÏÂ`E×Âà•ÔÂÀÄÔÂ`ÎÕ ܨޠÝÂ`žÝÂàîÚÂ`ßÂÀ²× &×ÂàâÜÂÀ‚ß ´é ±ßÂÀ#ÚÂàÐß ÏÚÂIÙÂ@ÙÛÂ`\è€þÚÂàwÙÂ@åÂÀváÂà_ÝÂÀ¸ÖÂà<ÎÂàÐ߀æÞÂà¬åÂ@ê ½ÝÂÀšÛÂ@VÜÂ@ÁßÂ%ßÂ@bÚÂCÚ€oÝÂÀ Þ ÝÂ%߀à߀Kã€ØÂáÂØÖ Û€ØÂ€àßÂ`ßÂ`nåÂÀçã€uÜ€ÔáÂ`-ÛÂÀßÂ`˜ÞÂÀ ÚÂ@ÙÛÂÀçãÂ1ÝÂaÕ ÚÂÀ ÚÂ@VÜÂ@µá ,ÖÂ@˜Ñ€Èã ®ê€oÝ€øÛÂàqÚ€ìÝÂCÚÂ@ñ× ÀçÂà¬åÂ@ÕÂgÔÂÀpâÂÀ/ØÂ ðß´Üœà :ÞÂÀ_ЀoÝ ÚÂ@’Òœà¨ÞÂÀ¦Ù «àÂÀ^å @Ý€Qâ çÖÂ@8áÂ@8á ‘Ú€òÜ ÚÂ`¼ØÂ Ý ¯Õ ±ß —ÙÂÌØÂÀáäÂà²ä .à€4Ò€¥Ô ãÂàÜÝÂÀ½êÂ`¶ÙÂ@DßÂ` á€ìÝ >ÓÂ`¼ØÂºÛÂ`¶Ù ÌåÂàÐß åÂ1Ý€Ôá ãÂ@ÙÛÂàMàÂ`°ÚÂ@£ä€×ÂmÓÂàâÜÂ@ÓÜÂ@ÓÜÂ`€â 4ßÂ`à€ØÂ ‘ÚÂà¾â XÙÂaÕÂàØÂ1ÝÂÀùà 4ß "âÂÀ²×ÂÀ²×€‡Ù Ý€×€ØÂÀ5×Âà Ö€òÜ€oÝÂ@t× ùÓÂàôÙ€(Ô€]àÂàºÛ aâ€!êÂ@†ÔÂ@ßÚ ™ãÂ`ìÐÂØÖ€cßÂ`åæÂ@µáÂ`\èÂ@PÝ ^ØÂ€"ÕÂÀ²×€iÞÂ`3ÚÂÀ”Ü€{Û€“× ÕÙÂàMà€ÚàÂÀšÛ ^ØÂ€øÛÂ`WÔÂàèÛ VÏ ØÂ`!Ý d×ÂàÕÂÌØÂ`ÈÖÂÀÛÂ@åÙÂ@VÜÂ`âÂ+ÞÂ`Â×ÂÀ/ØÂ@ÁßÂØÖ ÐÂÒ×Â`ÈÖ ØÂ d×Â+ÞÂàôÙÂà ÖÂ@åÙÂàGáÂÀ;ÖÂÀâÏ  ÑÂ` ÌÂÀÖÑÂÀ#ڮ݀Ö€½ÐÂmÓ ÃÜÂàèÛÂàÐßÂÀkÎÂ`ÎÕÂà× ÙÂÀ)ÙÂ@ÁßÂÀGÔÂà²äÂ`÷ãÂÀˆÞ ÏÚÂÀÛ€“×ÂÀ#ÚÂÀÛÂÀ߀±ÒÂÒ×ÂÀAÕÂàØÂ áע߀¥ÔÂàèÛºÛ á×Â@ÓÜÂ@ýÕÂrç üÝ€.ÓÂàƒ× ^ØÂ`KÖÂÀâÏ ‹ÛÂàèÛÂ@ÇÞ ä„ä´ÜÂàAâ ÜÂ`9Ù€þÚ LÛÂ`]ÓÂÀ ÚÂÀÿßÂ@ÇÞÂ@…éÂàÂÀíâ =è®ÝÂÀŽÝ€ÖÂ7ÜÂà0ÐÂÀ‚߀ØÂ ‘ÚÂ@VÜ DÒÂ`?ØÂÀ#Ú€(ÔÂÀ¦ÙÂÀÛºÛÂ`¼ØÂ@˜Ñ ØÂàØÂ@ÙÛÂÌØÂ >Ó€ÚàÂ@PÝÂ`bçÂà¬å¨ÞÂà;ãÂàAâÂ@ÇÞ 2ÕÂØÖÂàâÜÂà ÖÂ+ÞÂÀÊÓÂ`÷ãÂàôÙÂÀšÛÂàƒ×ÂØÖÂàØÂàkÛÂà}ØÂà*ÑÂàîÚÂàôÙÂÀ¦ÙÂÀ;Ö€iÞÂÀ/ØÂàØÂÀ‚ßÂà¸ã€¥ÔÂ`à ÝÂà­ÐÂàkÛ ÏÚÂàMà ÏÚ ÕÙÂà_ÝÂ@PÝÂàÊà€·ÑÂÀ#Ú LÛ gဠÙÂ`Â×Â`’ß pÕÂÀ¦ÙÂ`ÈÖÂ@åÙ€]àÂàâÜÂ@DßÂà}ØÂ@ßÚÂ+ÞÂÀ”ÜÂàÓÂ7ÜÂ ÛØÂ€¥ÔÂ@ Ô ùÓÂÀÚÂÀˆÞ >Ó Ù màÂaÕÂ`WÔ¨ÞÂÀîÍ ðßÂàkÛÂ@ëØÂÀ)ÙÂ@Õ€ŸÕÂ`3Ú€™Ö€ ÙÂÀíâÂ@t×Â`E×ÂàÕÂÀSÒÂÀÜÂÀMÓÂ`Â×Â[ÖÂÀeÏ€±ÒÂ`ÈÖºÛ ÿÒÂ@t×Â`!Ý ÿÒÂ@ÓÜÂÀ Ú€òÜ &×€þÚ ÚÂ` á ØÂ`iÑ—ÌÂÀ¬ØÂ@ŒÓÂà*Ñ€òÜÂ`ÚÓÂÀÈÂöÑÂÀŽÝ ðßÂà Ö€Wá ñÊÂ`˜Þ€ÉÎÂ`¶ÙÂ`3Ú ‹Û ÙÎÂ@ÇÞÂàôÙÂÀ5×Â`oÐÂ@ëØÂ€æÞÂàYÞÂ@ŒÓ ΠÇÑÂàqÚ DÒÂ`ÔÔ DÒÂà•Ô€“× ÍÐÂ`oР Ñ á× @Ý  ÑÂÀÜÐÂÀÝÂÀÿßÂ@ÙÛÂ@DßÂà×€uÜÂ`uÏÂÀ_ЀØÂ ±ß :ÞÂ`KÖÂàèÛÂ`-Û ÛÂàSßÂÀáä :ÞÂ`WÔÂ@ßÚÂ@÷ÖÂÀÄÔÂà”éÂÀ|àÂ@zÖÂ`KÖ€™ÖÂÀÚÂ@˜ÑÂ@DßÂÀ/ØÂ 4ßÂÀLèÂ`WÔ ÏÚ€ÔáÂ`Þ äá€Èã€uÜÂÀ)ÙÂ7ÜÂ`ŒàÂÀdäÂ~åÂ`Íê aâ 2Õ€{ÛÂ`ªÛÂàeÜÂ`ŒàÂ@»àÂ×ëÂÀ4ìÂ@>àÂ@>àÂ@ñלà€× —Ù 4ßÂàYÞ ·ÞÂIÙÂÀ(îÂåÂ@æÂŠãÂÀjãÂàÜÝÂ`’߀òÜÂàMàÂÞÕÂ`’ß ÏÚ ‡æÂ IæÂÀRçÂ@è€'éÂ`åæÂŠãÂÀ ÚÂ×ë sß .àÂÀ¬ØÂÀ½ê ¥áÂ`hæÂ ½ÝÂÀ5× òéÂéè ãÂÀÜ€ìÝ ÌåÂà/åÂàqÚ ä øè€9æÂÀÉèÂà5ä€3çÂ@&ä oêÂà#çÂ`bç OåÂäÂ@»àÂÀ Þ öÞÂ`ýâ ïÂ`ñä "â =èÂÀò ìê ïÂàŽê œíÂÀ^å§ó çÂxæÂ`bçÂ@æÂ cìÂÀÉèÂàóî€ýï€퀆îÂ`JëÂ`Dì Ý …Ü€‡Ù  æÂé耆î WîÂ@ÇÞ òé¿ïÂ`bçÂ`\èÂ`ÇëÂÀo÷„ä =èÂËí ië ºèÂÀÏçÂÀLèÂ@üê€QâÂÀ.íÂàšèÂÀÝ Cç mà oêÂ@D߀øÛ€÷ðÂ@蠙〞êÂÀjã °ôÂÀÛå 퀤éÂ@öë CçÂà;ãÂÀcùÂ`yøÂ€zðÂZëÂ@‘ç€ÎâÂ`nå ì꠽݀Kã oê€\õ IæÂlè€ìÂÀ{õ€÷ðÂÀ"ïÂTìÂàÏôÂ@—æÂ ´éÂàšèÂàAâÂà¦æÂ Ìå€9æÂ Kð€Èã Þâ ÀçÂ@‹èÂÀFé {èÂÀ:ëÂà¾âÂÀ·ëÂ`PêÂ`ÓéÂ1Ý€Ôá€÷ð WîÂ@êíÂà ëÂ`Jë€ßôÂ×ëÂ`2ï ù€ïÂ@ê ðÂ`ßçÂ@£äÂ@gî ïÂ@Þï òÂ`bçÂ`yøÂ`&ñ€˜ë 7é­ò€ï ðÂàì !÷€zðÂàÉõÂ@1÷ °ôÂ@sìÂÀÉè ð õóÂàFöÂ@aïÂàáñÂàXóÂZëÂ÷Â`ÇëÂ`µîÂ6ñÂÀŸï +ëÂÀ½êÂ`hæÂÑìÂËí ÂñÂ0òÂ`¯ïÂÃ<ðÂËíÂÀòöÂ`ü÷ øèÂàÃö à쀒ìÂ`äûÂ@ÞïÂ@sìÂÀ“ñÂÀ“ñÂàóîÂÀ@ê òé ‡æÂ BüÂ`µîÂ×ëÂ6ñÂéè 7éÂÀ"ïÂHîÂ@ðìÂ@Þï€hó ïÂÀæøÂ@–ûÂ<ð ðÂ@Oò °ôÂÀôÂ`8îÂÀWû Qï€bô ªõÂ`òÂ@å ÔîÂÀo÷Â`,ð àìÂ@èÂÀ.퀘ëÂ`PêÂàìÂ`8îÂ@1÷ àìÂËíÂ`öøÂ KðÂ`2ïÂ@ÞïÂàáñ€9æÂÀÏç€÷ðÂÀòÂÀ:ëÂxæÂàÿìÂ$ôÂ@Øð€†î ð¡ôÂ@êÂÀÏç þç ®êÂà#çÂÀ.퀌íÂ@1÷Âà¥ûÂÀ“ñ ~òÂàŽêÂ`ëåÂàˆëÂà çÂ`¯ï ië ñÂàóîÂ@UñÂ@£äÂïçÂ@çÂÀ.íÂ`VéÂ`Ç뀀îÂïçÂ@êÂ@‹è äÂïçÂÀ‚ß üÝÂ@åÂ0òÂàÊà€Eä€ÈãÂåÂàˆëÂÀRç oêÂ@£ä€9æÂ`ñäÂÀjãÂÝê ìêÂÀçãÂ`VéÂ@&ä OåÂÀÜÂ`˜Þ€?å oêÂÀ^åÂÀ™ð „ñ ¢ì UäÂÀváÂ@èÂÀdä UäÂ@m퀶æÂ€Èã ãÂ@»àÂ`»íÂÀ(îÂ@èÂ@£ä ÀçÂ`D쀶æÂà#çÂ@ÙÛÂÀ:ë çÂÀ^åÂà€3ç …ÜÂá¨ÞÂÀRç äáÂ@ðìÂ@å aâ ºè¢ßÂ@¯â€9æÂféÂlè "â OåÂ@Dß VÏÂ`Œà (áÂà;ãÂfé ØãÂ@‘çÂÀdä€WáÂ@ÇÞÂ@8á€ëÂHî ¥áÂ~å Cç€òÜ ðß ØãÂ`VéÂ`VéÂ@ÇÞ€Kã ´éÂ`ôÂ@ÒñÂ@öëÂ@2â€ÂäÂTìÂ@éÂ@¯â iëÂÀ/ØÂrç ä€ÔáÂÀ±ì aâÂûå ‘ÚÂ@bÚ€ÚÂ@µá OåÂ`à Ìå ºèÂ`ýâÂïç€ îÂ@ 倨Â@bÚÂ`zã yÞ ãÂÀdäÂ@2âÂÝê€iÞ€Úà "âÂàô٠٢ßÂ@ðì€þÚ åÂ@&ä ç€]àÂÀÿß ·ÞÂà/åÂÀÜÂ@\ÛÂÀ|àÂ`\è Ý øèÂ`ýâÂ+ÞÂàÄáÂ`€â€°çÂ`åæÂ@…é ®êÂàÂÀùà &×ÂÀÉèÂàkÛÂéè€-èÂà çÂ`\è ‡æÂ`,ð€ìÝÂÀ5× öÞÂÀÜÂÀ^åÂ@PÝ ¥áÂÀùà€ìÝÂ`!ÝÂ`3ÚÂ@瀼åÂ`¼ØÂ oêÂ@8á€Wဪè "â ™ãÂ@ßÚÂ@Áß Û Øã ™ãÂ@£äÂÀùàÂÀçãÂÀÜ€ÚàÂ`\èºÛÂÀjãÂÀ|àÂàGáÂâ ½ÝÂàúØÂ@>àÂ`tä >ÓÂ`ÞÂ`PêÂØÖ ÕÙ ©Ö µÔÂ%߀“×€øÛÂ@2âÂ`ýâŠã —Ù€ÎâÂ@2â jÖÂ`°Ú ¥á€‡Ù ‘Ú€oÝÂ@yë€øÛÂàÄá€]àÂÞÕ ¥á ®êÂÀ½êÂÀ ÞÂ@ñ× «àÂÀ‚ßÂàÄá 4ßÂ@£äÂÀ^åÂ ÛØÂU×ÂÀpâÂàYÞÂéèÂ@…逼åºÛ oêÂ@µáÂàÖÞÂ@ÍÝÂ@>à€WáÂÀß ã ië€ÔáÂàÊàÂ` áœà Òä .àÂ@ÍÝÂâÂà²äœàÂÀ²×ÂÀáäÂÀçã ãÂ=ÛÂÀŽÝÂ`ýâ ÜÂ@…éÂ@8á sßÂÀßÂïçÂ ÛØÂà#ç ië€àßÂ@¯â òéÂrçÂrçÂÀ.íÂÀŽÝÂ`Pê€-èÂÀŽÝÂ@ÞïÂàAâÂ@»àÂÀŽÝ ç ÞâÂÀXæÂ`ÙèÂÀ^åÂ`täÂà)æÂ€ÈãÂ@êí [ãÂàšèÂ`zã€3ç Øã€È〤éÂ`¼ØÂ oêŠã :Þ€?åÂÀçã€ìÂÀváÂ@8á ‹ÛÂÀÿ߀žê ìê€Èã %ìÂàéÂÀRç€EäÂ@8á€Ú€òÜ [ã€Îâ Oå å QïÂÀ^åÂÀˆÞ IæÂ «àÂà¬åÂ`à  æÂ€ØÂ@sìÂ ÆæÂÒ× ÌåÂ@&äÂ@©ã (áÂ@æÂ~åÂÀRç œíÂ`tä ØãÂÀ|àÂ@DßÂàáñ Ÿâ ÜÂÀ¦ÙÂ@ÙÛÂÀÕæÂ@’ÒÂ@ÓÜ ÒäÂ`ýâ€iÞ€†îÂàÊàÂÀáäÂ@2âÂÀÏçÂ`tä OåÂÀçãÂÀ/ØÂÀóáÂ`DìÂ@‘ç UäÂÀ·ëÂ@VÜÂ%ß êàÂà¡Ò 4ßÂ`?ØÂ`bç äáÂ`žÝÂÀ ÚÂlèÂ`žÝÂà çÂàYÞ Uä€oÝ€oÝÂ@\Û «àÂáÂ@ÓÜÂ@bÚ ðßÂïçÂ`ŒàÂÀ#Ú á× ÉÛÂÀŽÝ «àÂÀáäÂàÖÞ Øã :ÞÂäºÛ€ÚÂàÕÂ@˜ÑÂgÔÂàAâ [ãºÛÂ`°ÚÂ`!ÝÂ`3ÚÂÀ;ÖÂà‰Ö€WáÂ~åÂ`zã ‘ÚÂ`ÞÂ`€â aâÂ`ñä®ÝÂà#ç„ä ‘Ú€"Õ ÜÂ`ßÂ`ýâÂáÂÀdä jÖÂ`ñä€þÚ€WáœàÂà‰ÖÂ@å€9æÂ` áÂÀ ÞÂ@ßÚÂ`3ÚÂ`ÞÂÀóá yÞÂäÂõæÂÀšÛÂ@bÚ€QâÂÀâÏÂÀ)ÙÂÒ×€Wá€Ö ÏÚÂÀÚ€òÜ ØÂ`žÝ @Ý ·ÞÂ`WÔ€øÛ ÛÂ`9ÙÂ`QÕ ·ÞÂ`?ØÂ€{ÛÂgÔÂÀÜ …Ü JÑÂ`?ØÂ`¤Ü mà ÉÛÂ@nØÂCÚÂ=Û ÙÂÀÝ ðß ÛÂà¡Ò ðßÂà_Ý€ìÝ d× ¯ÕÂà× jÖ ØÂ@&äÂ`ñäÂ`zã€ÚÂàÕÂ@»àÂ`ÎÕÂ`Þ€òÜÂà‰Ö ÉÛÂ@ëØÂ á×Âà­ÐÂâÂOØÂà)æÂ@åÙÂ`oÐÂ@nØÂ`QÕ çÖÂ@DßÂÀŽÝÂÆÙÂ`]ÓÂà}ØÂ LÛÂÀßÂÀdäÂðÒÂÀSÒ á×Âà/åÂÀÿßÂÀ;ÖÂ%ßÂ`?ØÂÀ‚߀Wá€øÛÂÀíâ€Ú€ØÂ€ÚàÂÀ/ØÂ¨ÞÂÀÚ€oÝÂ@ÍÝÂU×ÂU×ÂÀ Ú€:ÑÂ@ÓÜÂàYÞ€°çÂ`3Ú ÿÒÂ`-Û ÏÚÂ`ÈÖÂÀšÛ …ÜÂ`æÑ¢ß Ù€ÚÂ`àÒÂ@÷Ö€òÜÂÀˆÞÂàÓ [ã üÝ ØãÂ@zÖÂIÙÂ`ÎÕÂ…ÏÂ@ñ×Â@-ÎÂ`]Ó€™Ö XÙÂÀ/ØÂ7Ü ãÂÀá䀪èÂàîÚÂ@ýÕÂÀGÔÂ@VÜ®ÝÂ`'Ü ð߀E䀟ՠ½Ý€ÉΠØÂ jÖ Ü ½Ý üÝÂ@‘çÂ@JÞÂ@bÚÂ@ÍÝÂàÄáÂÀ|àÂ`ÔÔ€™ÖÂ@8á Ú€ Ù€iÞ ¯Õ —ÙÂà¸ãÂ`3ÚÂ%ß gáÂ@©ã€Ú€]à ‘Ú ^ØÂ@ßÚ€òܺ۠ÝÂ@€ÕºÛÂ`†á€-èÂàƒ×€Âä–á øèÂ`9ÙÂ=Û€æÞÂ`ÈÖ€ÔáÂ`Jë CçÂàè øèÂàÊàÂ@,ãÂà”éÂàSßÂ@ýÕÂ@nØÂ`!Ý :ÞÂ`ÔÔÂÀÿßÂ@€ÕÂ`täÂ`žÝÂàMàÂ@ÁßÂ@\Û Þâ :Þ ·ÞÂ`ÞÂOØÂ@bÚ sßÂÀ‚ßÂà;ã€í ¥áÂÀÃé …Ü aâ´ÜÂàÕ€çÉÂà_Ý µÔÂàƒ× 4ßÂÀ¬ØÂ€òÜÂÀ|àÂàÊàÂÀ²×ÂÀÐÒÂäÔÂ@2âÂ`¼ØÂâÂà}ØÂ€'éÂà çÂ@åÂàØÂ€Ú RÚ JÑÂ@\ÛÂÀ‚ßœàÂ`ŒàÂ`hæÂÀRç ÃÜÂÀ ÚÂÀÛÂ`¶Ù —Ù ÏÚ ‚ÒÂ ÛØÂÀÜÂ@£ä€c߀“×Â@ÓÂÀˆÞ öޮݠÞâÂÞÕÂÀ‚ß :ÞÂ`Ùè ØÂ ¥áÂà Ö€{ÛÂÀšÛÂ@ÁßÂÀÜ ÍÐÂÀ¬ØÂ@&ä êàÂÀÜ ÝÂ@VÜÂ`âÂ`àÂU×Â@ÓÜÂ`ªÛÂàGá aâÂ`ýâÂ@PÝÂ@ëØÂ`-ÛÂÀÿßÂÀ¦Ù€“× @ÝÂÀŽÝÂÀRçÂàâÜÂàeÜÂà_ÝÂ@,ãÂàYޜ࠽ÝÂÀÛåÂ`€â öÞÂÀ¬ØÂ ‡æÂ@ÍÝ€c߀ØÂàAâÂàâÜÂàâÜÂàqÚÂÀ¬ØÂÀ²×ÂÀwÌ ‹Û …ÜÂàkÛÂàúØÂ`’ßÂ1ÝÂ@ÓÜÂÀŽÝÂ@VÜÂ`˜ÞÂà ÖÂmÓ€oÝ ˆÑÂ`ÈÖÂÀŽÝ @ÝÂà‰Ö ¯ÕÂÀ5×ÂðÒÂ`¼ØÂ`€â á× "â€Ú .àÂ`ªÛÂ`¼ØÂ £× @ÝÂÀ”ÜÂ`E×Â@,ã€LΠRÚ :ÞÂÀóáÂ`'Ü ÕÙÂU×€ØÂÀóáÂàqÚÂ`ßç d× Û ÎÂ@ßÚÂ@…éÂ@\ÛÂÀGÔ jÖÂCÚÂ`ªÛÂàØÂ@€Õ€QâÂàÐßÂØÖ€ÉÎÂ`ÚÓÂàôÙÂ@PÝÂ ÆæÂ`-ÛÂ`àÒ ÜÂà‰ÖÂàîÚÂÀ#ÚÂàÕ @Ý€ÚÂÀAÕÂÀ¾Õ óÔÂ@ñ×ÂÀ¾ÕÂÒ×Â@ýÕ€cßÂ@VÜÂÒ×ÂÀ/ØÂ DÒÂIÙ€(Ô µÔÂÀÿß gáÂ`˜Þ€"ÕÂ@t× —ÙÂ@ŒÓÂ@÷ÖÂà›ÓÂ`ªÛÂ`žÝÂÀÜРRÚÂ1ÝÂÀLè å¢ßÂ ÛØÂÀ/ØÂ LÛ€òÜÂ@JÞÂÀßÂ@åÙÂÀ5×Â`°ÚÂ@ÁßÂ`’ßÂÀ ÚÂ`QÕÂÀ_ÐÂ@ÇÞÂ@ÓÜÂÀ²×ÂÀ5×Â`æÑ á×Â`¶Ù pÕÂ`cÒÂ@\ÛÂ@8áÂ`KÖÂ@\ÛÂ@ÓÜ ÏÚ€æÞ ¸ÉÂ@ÑÂà×Â`¼ØÂ &×ÂüÐÂ`¶Ù ÕÙÂÀÄÔÂ`ÎÕÂà#çÂÀ‚ß »Ó€^ËÂ ÛØÂÀíâ &× ”ÏÂ`9ÙÂ@£äÂ`¶Ù€ÃÏÂà‰ÖÂàâÜÂà•ÔÂÀ²×ÂÀÛ šÎÂà0ÐÂÀ)Ù ùÓ€™ÖÂÀÜÂ@ëØÂ€{ÛÂÀ”ÜÂ@µá íÕÂ@nØÂ ÕÙÂàMàÂà›Ó€KãºÛ ÿÒÂ@’ÒÂàôÙÂàØÂ ÚÂÀ Ú€"ÕÂ[Ö 8ÔÂàAâ´ÜÂÀ)ÙÂàkÛÂÆÙÂ@ÙÛÂÀ²×€Ú€ÚÂ`°ÚÂ`þÍ€cßÂàîÚÂàÕ€iÞÂàeÜ >ÓÂÀ_ÐÂÀÚÂàîÚÂà<ÎÂÀÜÂ@nØÂ çÖ d×ÂàôÙÂ`Â×Â1Ý öÞÂyÑ jÖÂÀ)Ù€×€¼åÂàSßÂÀÝÂÀ¦ÙÂàSßÂÀßÂ`'ÜÂ`E×€¥Ô LÛ€{Û€æÞÂ@—æÂ€Wá€oÝ yÞ€“×Â@©ãÂàôÙÂ@8áÂ@—æÂOØÂ`3Ú (áÂ@æÂàÐßÂ`ªÛÂàâÜÂ@ÍÝÂÀÝÂ`ýâÂÀíâ þç€æÞÂ@æÂ@ å ÒäÂÀváÂ@ßÚÂ`¼ØÂ FÜ [〰ç€ÚÂ@zÖÂÀÛÂà‚ìÂ@Dß FÜÂ@¯â€3ç  æÂÀÜÂÀÛåÂàâÜÂÀ/ØÂ€ØÂàqÚ€æÞÂàé ·Þ ºèÂ@DßÂ`’߀Úà¨ÞÂÀßÂÀÛ ðß öÞ ðßÂà²äÂ`ŒàÂÀXæÂ öÞÂ@JÞ ÝÂàÊà€uÜ %ìÂ`Â× "âÂÀ.íÂà¾âÂàÐßÂ`'ÜÂêÓÂõæÂ`-ÛÂ@ÁßÂ@£äÂà#çÂÀÕæÂ`†áÂ@ÍÝÂà_Ý€?倇ÙÂÀóáÂ×ë ðÂÀFéÂÀváÂ`¶ÙÂ`3Ú CçÂâ ðßÂÀ²× ÝÂàkÛ ç d×ÂÀpâÂ ÆæÂ å CçÂÀváÂ` áÂ@æÂ ÏÚÂà²äÂ`-ÛÂÀ¥îÂ`DìÂ`ÓéÂ@FµÂÀÛå€?åÂ`¶ÙÂÀ‚ß åÂÀùàÂ@—æÂ ŸâÂ`\èÂàóîÂ@ åÂ@JÞÂàÄáÂ@ å€uÜÂ`÷〞êÂÀÚÂ@¯âÂ`JëÂ@ê OåÂÒ×€9æÂÀßÂá LÛÂ@£äÂ@¯âÂ`†áÂàÂÀŽÝÂàGáÂ@ å€9æÂ`zãÂäÂÀdäÂ`ëå€þÚ ØÂ`!Ý€Kã€.ÓÂàYÞÂàìÂ`!ÝÂ@¯â í ðÂ`ÁìÂ`hæÂ¢ßÂÀ|à€øÛ äáÂûåÂ@—æÂà)æÂ€ îÂ%ß ä UäÂÀð€WáÂûåÂË퀒젽ÝÂÀÏç öÞ–áÂOØÂrçÂ`Jë ®êÂù ðßÂ`hæÂõæÂàúØÂ`†áÂÀùà màÂ`ÍêÂ`£ñÂàÖÞ äáÂàˆëÂ`»íÂ@ÇÞÂ@´ö€3çÂéèÂÀXæÂ`ŒàÂ@»à cì ïÂãéÂâÂ@åÂ@£äœàÂà;ãÂfé€òÜÂfé íÂûåÂ`»í ðß gá ÝÂ` áÂÀ:ëÂ@ÇÞ–á ^ØÂà5ä–áÂIÙ IæÂU× 〇ÙÂ@ßÚÂ@sì€ØÂàYÞÂ` á .àÂ`täÂ`nå U䀿ÞÂàØÂ ‚Ò ÝÂàâÜÂ`ñä ÜÂ`bçÂ@åÂ@bÚÂÌØÂ=Û OåÂÀáäÂ@©ã ç®Ý äÂàÂCÚÂÀçã çÂ`†áÂÀ Þ€(ÔÂâ màÂÀ|àÂ@8áÂà_Ý gáÂàèÂÀÜÂ`bçÂàôÙÂlèÂàMàÂÀjãÂ`hæÂ@µáÂ@yë ¥áÂ@µá€-è€]àÂ` áÂÀXæÂ€-èÂ`nåÂà_ÝÂàìÂà”逌íÂàÂàéÂàâÜÂ`åæÂ (áÂ@JÞÂ@,ãÂ`ýâÂ`ÙèÂ`˜Þ–áÂxæÂ@€ÕÂ@bÚÂàÖÞ€€ïÂÀÉèÂ`ß Ü &×Â`ÈÖÂàØÂ–á€Ôá ðßÂÀ·ë .àÂàÐßÂ`!ÝÂÀ‚ßÂÀáäÂÀAÕ ÛÂ`’ßÂàMàÂ`âÂàYÞÂ`ŒàÂ@åÂÀjãÂ@÷Ö€€ï ä€ÂäÂà)æÂÀ/ØÂàÄူçÂà²ä =èÂÀpâÂâ€!ê Uä yÞÂIÙ 9óÂ@‹èÂ`-ÛÂÀ#ÚÂ`€âÂ@åÂàeÜ ·Þ€¶æÂâÂ@üê øèÂûåÂÀ½êÂ`hæÂ@ñ×–áÂ ÆæÂ`åæÂ äáÂ`åæÂÀÛ ‹ÛÂà ™ãÂÀ¥î UäÂ`¤Ü [ãÂÀRç ØÂ@ÇÞÂàšèÂûåÂÀÏçÂÀ½ê ÎçÂâÂàÐ߀ë€Wá ŸâÂàˆëÂÀ:ëÂ@ÌòÂ` òÂ@Á߀Eä òÂÀ¥îÂ~åÂ@ å ÔîÂÀ(î ïŠãÂËí€ýï Ñù€€ïÂ@ØðÂàvî€Vö€©ý€nò „ñÂ÷ TùÂÐÃ@ïÃÀ‡ó€2ü ñÂ`múÂèýÂ@+øÂ@Cô ué€ýïÂ`ÌÿÂÀøõ§óÂö lõ€ÓöÂðCÃ`÷€8ûÂ`ÞüÂàÃù€ÁùÂ@Oò rô øÂ`ðù€DùÂàÿÂ@üÂ@OòÂ`µî ZøÂ oê³ñÂÀñ ´éÂ}úÂõ ù€JøÂ`&ñÂSÃÀøõ ˜øÂÀòö§ó€Dù€ìÂ€ÇøÂ€ÇøÂàXóÂÀòö€ î nÿÂ`÷ ¶óÂà"üÂàLõ ù€2ü€Áù€÷ð€ññÂàÃöÂàáñÂà|íÂÀ@êÂÀÈýÂ@7öÂ@Øð ¼òÂà@÷ ZøÂÀòÂ@=õÂà«úÂ`ÓéÂ@+øÂ rôÂàÏô NúÂ@„þÂ`gûÂÀ¼ÿÂ@+øÂ Nú ’ù ŒúÂöÂõæÂ ÂñÂ@´öÂÀo÷Â`2ï€ÓöÂ@ÀôÂà4ùÂÀQüÂÀ]úÂ@ðìÂÑìÂ`ü÷Âàÿ -õÂÀñÂ÷€ÁùÂà"ü€åóÂ`ØýÂ`öøÂÀ4ì€DùÂÀôÂ`óÂ@ê øÂ€Vö¡ôÂ@gî EñÂ@üêÂÀòÂ`Pê Þâ Úí `÷ œíÂàXóÂ`÷ÂÀòÂÝêÂÀ"ïÂ`»í€9æÂéèÂ`ÇëÂÀ^åÂÀ”ÜÂ`ê ï€ï€ì rô iëÂ@öëÂàêÂ@yëÂà)æÂ€¶æÂ Qï€ëÂàìÂÀ™ðÂ`PêÂ@µá–á òÂlèÂà|íÂ`µîÂ@êÂNí ïÂÀ:ëÂà)æÂ@ÆóÂ`2ïÂàˆë€žêÂ@géÂà|í +ëÂ@êíÂÀ(î çÂ€ÇøÂàvîÂBïÂ`ÍêÂàçðÂTì ~òÂàÛòÂ@‹èÂàpï ™ã 7éÂ@8áÂÀŸï ™ãÂ~å ïÂ`PêÂÀ:ëÂ%ß äáÂNíÂÀjãÂãéÂ`bçÂ@Cô€!ê€àßÂÀ½êÂàvîÂféÂÀôÂ=Û oêÂÀàù ¤ö ŠðÂÀ"ïÂNíÂ`>íÂ÷¿ïÂàMàÂÝêÂÀŸïÂÀLè ªõÂ`&ñ oêÂàvî€ìÂÀÉèÂÀòÂ`ëåÂ`ßÂÀŸï EñÂâ %ìÂ@çÂ`DìÂ`PêÂ`Ùè€-è¨Þ ¥áÂ@çÂ@gîÂ@2âÂ@…éÂà)æÂà/åÂ`hæÂ CçÂà|íÂà#çÂ@èÂ`8îÂéèÂÀjã€9æÂ@ÓÜ€ÎâÂàÊàÂ@ðì þçÂàˆëÂféÂ@míÂïç€-è ñÂàêÂ@…éÂ@»à€ÎâÂÀÿßÂ`ô ŠðÂ@êÂÑ쀤éÂ@è Nú€åó ®ê€ìÂ@sì¿ï oêÂÀÉèÂ`Çë iëÂ`÷Âà²ä ÔîÂ`õ Eñ %ìÂåÂ`ßç€Úà ºè€cßÂ@ åÂÀ@êÂ`µîÂà‚ìÂÀjã òéÂ@yëÂûå Òä àìÂTì (á ãÂ`bç +ëÂÀíâÂ` áÂàdñÂÀ«íÂàvîÂàÿìÂàÄáÂrç þçÂÀ|àÂàŽêÂxæÂ€°ç€-èÂÀ^å ]íÂ@Uñ€9æÂà çÂÀçã a„ê oê .à çÂÀXæÂ×ëÂ@üêÂà/åÂ`ýâ€øÛÂ`ñäÂàéÂûåÂ`€âÂ@ÍÝ€WáÂ@ê ãÂ`Óé êàÂà²ä íÂ@¯âÂÀ:ëÂ`†áÂ@,ãÂõæÂ@©ã€æÞÂ`âÂ`zãÂÀváÂÀÛÂ~å Ìå ìêÂ@üêÂÀ½ê iëÂàóîÂÀíâÂ ÆæÂà¾â€9æÂÀÏçÂ@&äÂÀÏçÂÀáäÂ@ åÂûåÂ@—æÂ ç ñÂ@Dß îÂ`>íÂ`âÂÀ@êÂÀ|àÂ@ åÂÒ× 7éÂàèÂÀ4ì ç€ªè€KãÂ+ÞÂãéÂ@yëÂÀíâ :ÞÂàìÂà”éÂ`2ïÂÀjãÂ`Óé ãÂ` áÂÀvá´ÜÂBï æëÂ`zã ‡æÂHîÂ@©ãÂ`VéÂ`êÂ`tä€-èÂ@£äÂ`»í OåÂÀíâ€Èã ´éÂ`’ß (áÂ@©ã€KãÂ`bçÂ`zãÂÀ^å LÛÂrç€òÜ –î À瀤éÂéèÂà çÂÀçãÂ`Vé üÝÂ`ñäÂ@èÂ@ðì ÕÙ  æÂâÂ@DßÂà)æÂÀdä ØãÂBïÂféÂ~åÂÀ|à€Âä€QâÂÀáäœàÂÀjãÂáÂrç gံæÂ@&äÂÀ@ê ™ã iëÂà¬å ÚÂõæÂ€Wá€9æÂàˆë “äÂ`ÓéÂÀpâÂåÂ`ßÂÀXæÂ`bçÂ+ÞÂ`ßÂ@è "â {èÂ@è þçÂÀvá ðß sßÂàÊà ÏÂÀjãÂ@‘çÂàYÞ€'é uéÂÀ^åÂ`Vé Oå =è æë€ªèÂà ç –î€!ê€Îâ “äÂ@&äÂÀRçÂ@»àÂ@»àÂ`täÂ@>àÂ`täÂÀóá Þâ€þÚ ·ÞÂ`ëå “äÂà¾â ãÂÀRçÂàGáÂÀ¦ÙÂâ€]àÂ@JÞÂ`ªÛ aâÂàMàÂ`žÝÂàkÛ€ Ù€‡Ù€àßÂ`Œà :ÞÂ`ßÂ@ÍÝÂ`åæÂ„ä ãÂÀóáÂÀóá ¥áÂ@ÙÛÂ@£äÂ@ç ðßÂ@æÂ@å (áÂ@Dß ŽÐÂàÊàÂ`†á aâÂ`¤Ü ØÂ` áÂ=ÛÂÀáäÂÆÙ€ÚàÂÀÕæÂ ‡æÂàØÂàèÛÂâ€ÂäÂà_ÝÂàeÜÂØÖÂÀÛÂåÂ`ß ÝÂ`?ØÂ`ÔÔ¨ÞÂ@hÙÂ=ÛÂÀ/ØÂâÂ1Ý ìêÂ`3ÚÂ@ŒÓ üÝ XÙÂÀÝ€Wá =èÂ`»í ÕÙ å ¯ÕÂà/候ÖÂ`òÏ ,ÖÂûå ÃÜÂêÓÂ[ÖÂ`¤Ü€(Ô üÝÂÒ× ÛÂàúØÂ@€ÕÂöÑÂ@-΀‡Ù¢ßÂ@PÝÂ`ÔÔ€æÞÂ`Œà ßÍ ÏÚÂÀAÕ€Ôá LÛÂÞÕÂCÚÂàÓ >ÓÂ@€ÕÂà¿ÍÂÀá䀷ÑÂÀˆÞÂà$ÒÂ`žÝÂ=ÛÂ`9ÙÂ`žÝÂ@zÖÂ`ÔÔ &×ÂÀÛÂCÚÂIÙÂ@3ÍÂ`àÒÂ@Õ ^ØÂ ,ÖÂIÙÂ`ÎÕÂàGáÂ@ÇÞÂ@ßÚÂ`E×Âà¾â¨ÞÂ@ÙÛÂ`¶Ù€(Ô µÔ€ ÙÂOØÂ@ÙÛ öÞÂà$Ò yÞÂ`€âÂCÚÂ@¯âÂÀ)ÙÂ`ŒàÂ`¼ØÂ€iÞ (á 8Ô sßÂ@t×ÂàÄá d×ÂàØÂ ÚÂÀpâÂ`ÞÂÀšÛ Ý®ÝÂ`ÔÔÂ@ Ô€àßÂÀ”ÜÂ@bÚÂÀšÛÂÀMÓ€øÛÂÀçãÂ`žÝÂ@åÙ€ ÙÂÀ^åÂ@DßÂÀ;ÖÂÀ5×Â@»à vÔ€× …ÜÂ ÛØÂ@ëØÂ€àß .à€æÞÂÀÄÔÂÀùàÂà}ØÂ[ÖÂ`3ÚÂÀ¦Ù€È〼åÂ`ÞÂàØÂÆÙÂ@ÍÝÂ`-Û FÜÂàwÙÂ`ÎÕ€EäÂàvîÂ`à XÙ€°çÂ`ßÂÀjãÂÀ#Ú€Ú ÏÚÂÀjãÂ`KÖ OåÂ@ßÚÂ`åæÂ “äÂ@è€Ôá ÀçÂ`'ÜœàÂïç ÛÂïç FÜÂÀùàÂ7Ü€{ÛÂ@ëØÂ üÝ€Eä€×€WáÂàéÂàMàÂ`ýâ€þÚÂ`9Ù€ÚàÂ@8á ÜÂàƒ×€Èã …ÜÂ@hÙ ‹Û ÏÚ€iÞ€ÚÂ`÷ãÂÀÛÂ@åÙ€ØÂ€Eä öÞ êàÂàîÚ FÜÂ`âÂÀjãÂÀ²×€ÔáÂ`†á€uÜÂêÓ ±ßÂ@»à jÖ€uÜÂÀ;ÖÂ@åÙ LÛÂÆÙ€]àÂ`ñä IæÂØÖÂÀ ÚÂÀ²×€Ö ðßÂ@ÇÞ€¥ÔÂ@zÖÂÀÕæÂ ã€æÞÂ`iÑÂàôÙÂ@’ÒÂÀÝ ÃÜ€æÞ ÃÜ€"Õ ¥áÂ@µáÂ`°ÚÂÆÙÂ@åÙ RÚ€òÜÂà¾âÂêÓÂ`QÕÂÀ‚ßÂ@»àÂ@8ဇÙÂÀ¾ÕÂ@ÇÞ çÖÂà×ÂÀÿßÂ@ÓÜÂ7ÜÂà”éÂT쀇ÙÂ@èÂàSßÂÀ|à ½ÝÂ`-Û€øÛ¢ßÂ`9Ù 7éÂ`'ÜÂÀˆÞÂ@©ãÂÀ”ÜÂÀÚ´ÜÂâÂ`ÚÓÂ`?ØÂ€ ÙÂ`?ØÂ€˜ë @Ý XÙÂà5äÂàÊà Ü€Qâ 4ßÂCÚÂ`!ÝÂ`žÝ€uÜ ÏÚ€øÛ IæÂ+ÞÂ@ëØÂ ØÂÀ¬ØÂ màÂ@÷ÖÂ`à çÂ`°Ú ·Þ LÛÂÀˆÞÂÌØÂ ä€ØÂ FÜÂ@€Õ ½Ý ÕÙÂà×ÂÀ ÚÂÆÙ ÏÚºÛ Ù öÞ »ÓÂ`ŸÈÂËÂ`àÒÂàÕÂ`QÕÂU×Â`¼ØÂâÂOØÂCÚÂ@hÙ ØÂ ¯Õ XÙÂà•Ô ˆÑÂÀ/ØÂ`?ØÂÀ^åÂ`'Ü€Ú€ÚÂ`àÒÂsÒÂ@ÒÂÀSÒÂàÐß —ÙÂ@hÙ 8Ô ÛÂà*Ñ çÖÂ`QÕ íÕÂÀšÛÂÀˆÞ ÚÂÀ‚߀"ÕÂ@nØÂ XÙ€FÏÂ@hÙÂ@t×ÂÀ)ÙÂÀÝÂ[ÖÂÀ¦ÙÂ@ÓÜ ,ÖÂ@ŒÓ€iÞÂ`?ØÂ‘ÍÂà0ÐÂÀÛ€“×Âà­Ð€uÜ »ÓÂ@ÙÛÂÀAÕÂ@Ò  Í d×€½ÐÂ`¼ØÂ ùÓ€{Û íÕ ‚ÒºÛÂ`ìРJÑ 8Ô€±Ò ÚÂÒ×ÂÒ×Âà0ÐÂsÒÂ@åÙÂ`¤ÜÂ@Ó€‡ÙÂ[ÖÂàØÂÀîÍ€(Ô ‹ÛÂ`{ΠüÝÂ`]Ó€ŸÕ >ÓÂIÙÂÀ‚߀òÜ€ØÂ`]ÓÂÀÐÒÂÀ”ÜÂ@ýÕÂ`àÒÂ@€ÕÂÀóáÂ`Œà ‘ÚÂ7ÜÂÀ Þ |ÓÂàkÛÂÀ#Ú ÝÂ`âÂàlÆÂ`3Ú ЀÖ€× >ÓÂÀ²×Â@÷ÖÂ`cÒÂÀÐÒÂ@€Õ´ÜÂ ÛØÂ@ëØÂÀAÕÂ[Ö€(Ô GÇÂ`àÒ šÎÂà¿ÍÂÀSÒ€ìÝ ðßÂàÜÝÂÀÊÓÂÏ 8Ô€uÜÂà×Â`¤ÜÂÀÝÂ@ÇÞÂÀùàÂ`-ÛÂ@ ÔÂÀÊÓÂÒ×ÂÀGÔÂÀ_ÐÂ`¼ØÂ`3Ú€ØÂ@!ÐÂIÙÂàØÂ Û çÖ€½ÐÂ`!Ý€ØÂ€«ÓÂ`E×ÂÀ‚ßÂ@éÂÐÂ@\ÛÂà³ÏÂ`Ë ùÓÂðÒÂ`-Û ßÍÂÀ²× ÇÑÂÀÝÂÀÐÒ€4ÒÂ`æÑÂ`¼ØÂ7ÜÂ@ëØÂÀkÎÂÀ ÞÂ`ÚÓÂ@¼ËÂà¹ÎÂÀ/ØÂ`æÑÂ@!ÐÂÀÆÂ RÚ á×Â`ªÛÂÀáä &×€oÝÂ@ÕÂ`]ÓÂÀ¦ÙÂ@ªÎ€iÞ hÌÂaÕÂ&ÊÂà‰ÖÂ`¤ÜÂÀ;ÖÂgÔÂàYÞ ðßÂà;ã€{Û€Ö€ÖÂÀ#ÚÂà}ØÂ€Ú ùÓ XÙ “ä ‘ÚÂÀùà€FÏÂÀ‚ßÂâÂà5äÂÀÜ ÁÒÂ`ËÂÀÖÑ ݨޠaâÂÀ”ÜÂà€‡ÙÂ@PÝÂà )Ì€WáÂ@2â Cç yÞ —Ù óÔÂàôÙÂ`nåÂ@nØÂ`!ÝÂÀYÑ€4Ò íÕÂ@JÞÂ`°ÚÂÀ)Ù€ØÂ LÛÂÀÃéÂrçÂÀˆÞÂÀ4ìŠãÂÀ¦Ù ´éÂÑìÂ@ÇÞÂ`’ßÂÀLèÂáÂà× åÂ`ëåÂ×ë mà€æÞÂàâÜÂõæÂÀÛÂÞÕ€òÜÂ@yëÂ@VÜÂ`Vé "â€Ôá€ìÝ ·Þ´Ü€øÛ ÌåÂàÐßÂ@bÚ ðßÂÀçãÂ`täÂà€“×ÂÀ Ú´Ü€™ÖÂÀ ÚÂ`iÑÂ@åÙ ½ÝÂ@\ÛÂ@ÁßÂàÂàôÙ ãÂ@&äÂÀ^å @Ý ÕÙÂ@8áÂ@nØÂ`ÞÂÀvá yÞ€]à€àßÂ`ýâÂ@¯âÂÀáäÂ`ëåÂàÂ@VÜ màÂ`Þ€]àÂ`zãÂ@2â ÛÂ@÷Ö @ÝÂàGá Ìå ®êÂÀçãÂÀ¦ÙÂÀ/ØÂÀÛÂ`€â åÂØÖ€Qâ @Ý ÉÛÂà_ÝÂàèÛ€ÚÂ@˜ÑŠãÂ`ýâÂÌØÂ .à€Ú çÖ€™Öœà ãÂ@€ÕÂõæÂÀùàÂ@µá :ÞÂyÑÂ+Þ ¯ÕÂà¸ã€ÈãÂ`nåÂÀˆÞÂÀùàÂ`-ÛÂûå€æÞ vÔÂ@˜ÑÂàÊà€{Û …ÜÂàqÚÂ`’ß ‘Ú öÞÂ`žÝ ãÂàÊàÂÀ¾Õ€“×ÂIÙÂ1ÝÂÀ¦Ù€oÝ ˆÑÂÀ ÚÂåÂàÓÂ`€â ·ÞÂÀ;Ö Øã "âÂ`ýâ€ØÂÀváÂÀ}ËÂÀ¾ÕÂÀ Þ ÉÛÂ@ÓÜÂ@ÙÛÂ+ÞÂàkÛ€ÛË€uÜÂaÕ€ÃÏ äÂÀÐÒ€oÝ ÐÂ`Þ yÞ ØÂ€ÔáÂ` áÂCÚ &×ÂÀÃéÂÀˆÞÂ@t× ,Ö Û .àÂàSß ™ãÂ@ å€9æÂ€‡ÙÂàÜÝÂàƒ×®ÝÂÀ²×ÂàwÙ ‡æÂàeÜÂÀÛÂÀÛ€.ÓÂÀjãÂÀ”Ü á× Òä€þÚÂ`KÖÂÌØÂàeÜÂÌØÂ óÔÂÀ¦ÙÂ@ëØÂ@ýÕÂ`oÐÂÀ5×Â@—æÂà³Ï LÛÂÀ ÚÂàÖÞ€KãÂmÓÂ`˜ÞÂà€{Û màÂ@Õ€Îâ öÞœàÂÀ Þ€]àÂ`?ØÂà‰ÖÂ`3ÚÂ@ÙۮݠÇÑ Ú jÖÂ[ÖÂà_ÝÂCÚÂ`˜ÞÂ@†ÔÂ@žÐ @ÝÂ`3ÚÂÀèÎÂà¡ÒÂÀGÔÂÀkÎÂà*ÑÂ`“ÊÂÀ Ú€ÃÏ€ØÂ—Ì ÒÂÀ/ØÂ@¤Ï ‘Ú ÏÚÂàúØÂ€™Ö ,ÖÂ@bÚÂ`’ßÂÆÙÂ`ÔÔ FÜÂ`cÒÂ`?ØÂàÓ —ÙºÛÂ@ÕÂàkÛÂÀ#ÚÂÀkÎÂàÕÂ@ýÕÂÀpâÂä ÙÂÒ×€ÔáÂ`uÏ ÏÂÀ²×€]àÂ@Õ JÑ€oÝ€ØÂ ,Ö€:ÑÂCÚÂà$Ò ©Ö ÇÑ >Ó€]àÂà²ä DÒÂÀ ÚÂÀ5×Â@ßÚÂ`'Ü @ÝÂ@ÇÞÂÀRçÂàéÂ@ëØÂ ÛØÂºÛ |ÓÂÀ¾ÕÂÀ²×ÂCÚ€@ÐÂ@D߀FÏÂ@°Í FÜ 2ÕÂÀ_ÐÂ@ ÔÂÀ5×Â`˜Þ ‘ÚÂsÒÂ`uÏÂ`ÔÔÂË ÍР»ÓÂÀ5×Â@t×ÂÞÕ ¯Õ€4Ò€4ÒºÛ€ÖÂàèÛÂðÒÂ`Â×Â@ýÕÂÀÝÂðÒ 2ÕÂ`WÔ®ÝÂ`°ÚÂàØÂ ‘ÚÂàèÛÂÀÛÂsÒÂ@Õ ÓÏ ‚Ò€àß ÇÑ ŽÐÂ@ßÚ€×Â`9ÙÂ@ ÔÂàØÂÐÂÀ5×€¥ÔÂÀ²× RÚ ˆÑ€™ÖÂÀèΠ…ÜÂÀ¦ÙÂ`Â×Â@zÖÂ`cÒ€oÝ€ÎâÂ`¤ÜÂ`ŒàÂÆÙÂ`'Ü€™ÖÂ`Ê ©Ö µÔÂÀšÛÂ@ŒÓ€æÞ ÚÂ`àÒÂ`¶Ù &× |Ó ¬ËÂÀÛÂá @ÝÂÀjã ÇÑÂ`ªÛ vÔ ÕÙÂ@ Ô€ÏÍ £×€Ú€ÚÂ`?ØÂàèÛ ‘ÚÂÀÛÂÀÜÐÂ`ÎÕ ÝÂàÖÞ ÛÂÀ¾ÕÂ`cÒÂÀ_ÐÂÀÊÓÂÐÂ@zÖÂ`ªÛÂÀ¸Ö€{ÛÂÀ5לàºÛÂàÔ€¥Ô€×€ÚÂÀß ØÂàBÍÂ@bڠ݀EäÂÒ×Â`'ÜÂÀÝÂ@Dß ,ÖÂà}ØÂÀ¾ÕÂà¡ÒÂ`¼ØÂÀ/ØÂàƒ× ÒÂÀßÂàHÌ LÛÂà$Ò  ÍÂ`ÍÂà³ÏÂàÕÂ`-Û ëËÂ`WÔÂ@VÜÂÀ¦ÙÂ…Ï FÜÂÀúË \ÎÂàkÛ ØÂ ÕÙÂà€^Ë ÿÒ‘ÍÂ`˜Þ€‡ÙÂyÑÂÀGÔ€iÞ€{Û ÇÑÂÀÚ€±Ò—Ì &×€ÃÏ€LÎÂ`(ÇÂÀƒÊÂ`ÊÂÀÖÑ ‹ÛÂàÓÂ@Ò £×Â`ÚÓÂÒ× bÍÂ`cÒÂ`]Ó€Ú VÏÂ`oЀøÛÂÀ²×Âà•ÔÂ@°ÍÂ[Ö äá ÙÂ@'ÏÂÀÖÑÂ`QÕ€.ÓÂÀ)Ù LÛ ÇÑÂ@’Ò ÙÂàƒ×Â=ÛÂ@ñ× 2Õ vÔ€òÜÂ`°Ú öÞ€àß @Ý ÁÒÂ@†ÔÂÀ5× µÔÂÀ/ØÂÀYÑÂÀ²×€‡ÙÂà¡ÒÂ…Ï Ò  ÍÂ`ìР&׋ÎÂ`žÝÂ`¼ØÂ bÍÂ@-Π¯ÕÂà}ØÂ€ÏÍÂÀ ÚÂ…ÏÂ`ÎÕÂ`æÑÂ@åÙ XÙÂ`¼ØÂàÔÂ@†ÔÂ@ëØÂÀ¸ÖÂ@ÙÛÂ`uÏ þçÂÀ|àÂÀ ÞÂàÐßÂÀ²×ÂÀ|àÂàúØÂ …Ü ÓÏÂàîÚÂaÕ ØÂ@nØÂ€@ЀRÍÂðÒ€Ö€òÜÂÀGÔ€×Â@ßÚÂ`!ÝÂ@'Ï ñÊ‘ÍÂ`¶ÙÂ`ÎÕ ½ÝÂÀîÍ 2Õ ÛÂ`ßÂà_ÝÂOØÂ çÖÂüР‘ÚÂÀ²× tÊÂàÄáÂ@µáÂÀ²×€(Ô  Ñ€^ËÂ`ÞÂ` áÂÀÜÐÂÀ;ÖÂ@€ÕÂÞÕÂðÒ üÝ £×€æÞÂà_Ý 2ÕÂÀÜЀòÜÂ@ÒÂÍÂÀMÓÂÀjãÂ@ÁßÂà•ÔÂàÅÌ€ Ù d× ¯ÕÂ`QÕ€ Ù ÐÂ@€Õ jÖÂ`KÖ yÞ ÃÜÂÏÂÀÚÂ ÛØÂ€øÛÂàTÊÂÀèÎÂ@åÙÂÀRç€× d×Â@zÖÂ@Õ VÏÂÀÝÂÀÿß ‹ÛÂàSß OåÂÀ/ØÂIÙ ^ØÂ€ÉÎÂ@ýÕ€ØÂ€ØÂÀSÒÂ`iÑÂ@¶Ì ùÓÂà<ÎÂÀÐÒ€iÞÂÀÐÒÂ`3ÚÂÀÜРßÍÂÀ”Ü vÔÂCÚ ‘Ú |ÓÂàeÜ á×ÂÀÜ ©Ö©ÉÂÀÈ ÐÂ@!ÐÂÀ_РåÌ€.ÓÂyÑ´ÜÂ`¼ØÂÀÄÔ€(Ô€:Ñ Ë šÎÂÞÕ 2ÕÂÀ|à€ÎâÂÀƒÊÂ=ÛÂÀ_Ѐ:Ñ€·ÑÂ@ëØÂ®Ý RÚÂàÅÌÂÌÂà­ÐÂØÖ€±ÒÂÀ/ØÂ@t×ÂmÓÂÀÊÓÂÀèÎÂàHÌ€«Ó€òÜ€‡Ù pÕÂ`]Ó€øÛÂ`KÖÂ@ýÕÂ`]ÓÂ1Ý€×Â@€Õ ØÂÀ/ØÂÀˆÞÂàkÛ #Í µÔÂàâÜÂÀÛåÂÀ”ÜÂÞÕ vÔ ÝÂ`ýâ /Ë€.ÓÂÀ_ÐÂ@\ÛÂ`ªÛ ùÓ @Ý RÚ íÕÂÀÖÑÂ@PÝÂCÚÂà§Ñ€™ÖÂÆÙÂ@hÙ Ý Û pÕÂÀšÛ &× ÝÂ@žÐÂ@ Ô óÔÂÀ/ØÂ`ÍÂÀMÓÂÀYÑÂyÑÂÀßÂØÖ€Qâ€ØÂÀÜÂàSß ‹Û LÛÂàTÊÂêÓÂCÚ óÔÂ@hÙÂ@ ÔÂ@ýÕ —ÙÂêÓ 4ßÂ@ŒÓÂàÖÞÂà*Ñ ÚÂÀ”ÜÂyÑ€"Õ ÁÒÂ`iÑ á× jÖ RÚ )ÌÂ`ÍÂ@’ÒÂ`E×ÂU× »Ó VÏÂÀMÓÂÀ#ÚÂ+Þ yÞ€.ÓÂà§Ñ€ ÙÂÀ¬ØÂÀ/ØÂà‰ÖÂ`°ÚÂ+Þ »ÓÂ@Ñ ÚÂ`!Ý€ÉΠýÈ µÔÂ`òÏÂÏÂ@åÙÂàBÍ€(ÔÂàÔÂ@÷Ö€·ÑÂà ÖÂàqÚÂàïÅ ÛÂ@VÜ€ØÂ zÉ 5Ê€ìÝ€·ÑÂmÓ€ÉÎÂ@-΀ØÂÍÂàÔÂðÒÂ`!ÝÂ@ŒÓÂà³ÏÂÀ5×Â@-ÎÂÀúËÂàÕÂÀ5×ÂàwÙ jÖ d× ßÍ žÃ ¸É ˜ÄÂ@ÓÂ`{΀^ËÂüРDÒ€× JÑÂÀúËÂà$ÒÂ΀«ÓÂÀSÒ ùÓÂ`¼ØÂà$Ò€LÎÂüРXÙÂàÅÌÂ@?ËÂ@ÈÉÂ@¼ËÂÀè΀ÉÎÂ ÛØÂÀ)ÙÂà<ÎÂÀ_Рá× &× šÎÂÀèÎÂÀ¸ÖÂ@ÒÂàÔÂàZÉÂÀqÍ XÙ jÖ€× \ÎÂÀ}Ë€pÈÂÀÊÓÂsÒÂDÅÂ@ÕÂ@÷Ö €È€^Ë ØÂ@!ÐÂ`:Ä ”Ï ÷É ¬ËÂ`ìЀvÇ ½€pÈÂ@æÄÂà•Ô€ÏÍ )Ì ¯ÕÂàBÍÂ`ìÐÂÀAÕÂÀÊÓÂ@˜ÑÂ@bÚÂ ÛØÂ@ÂÊÂ@˜ÑÂà*Ñ ˆÑ zÉÂ@¯â êà£ÊÂ`WÔÂ`ÍÂ@’ÒÂÀÐÒÂ@ŒÓ€FÏÂ>ÆÂÀÊÓ ÷É€^ËÂ`òÏ€çÉÂÁÅÂÀeÏÂà6ÏÂà²ä€dÊ ΀ùÆÂ`ŸÈÂ@9ÌÂ@žÐÂÒ×Â@QÈÂà*ÑÂàTÊÂÀ_ÐÂ`oÐÂà§ÑÂ`æÑÂÏÂàÕ 8Ô€uÜ€@ÐÂ@ÑÂ@†ÔÂ`iÑ 5Ê ;É bÍÂIÙÂÐÂà§ÑÂà§ÑÂöÑÂÀkΠ Ñ ØÂ ˆÑ JÑ åÌ XÙÂ@’ÒÂàÅÌÂ@VÜ :Þ‹ÎÂ`oРPР‚Ò ØÂ`æÑÂÀYÑÂÀÈ€·Ñ |ÓÂ`“ÊÂ`ËÂ@EÊ bÍ€XÌ ÁÒÂ`ÎÕÂÀ¦Ù€FÏÂà6ÏÂ`ÍÂÏ€ Ù #Í VÏ jÖÂ@†Ô £×Â@ÔÇ tÊÂРŒÆÂà¿ÍÂàËË€ Ù ÄÇ€pÈÂà<΀ÃÏÂöÑÂ`{ÎÂÀwÌ ŽÐÂ`Ê 8Ô ÓÏ ßÍÂ`iÑ—ÌÂàÓ ñÊÂÀ‰É VÏÂÀúË ÁÒ ÇÑ ÁÒ€çÉÂ@àÅÂÀËÂ@KÉ —Ù  Ñ ÎÂgÔ VÏÂ@†Ô ÓÏÂ`{΀×  Í€:ѵÇÂ` ÌÂ@ÕÂà×€“×Â`KÖÂà‰Ö€ìÝÂà<ÎÂÀúË zÉÂÀ¦ÙÂÀ_ÐÂ@ÇÞÂàwÙ µÔ€½Ð  Ñ ÿÒ £×Âà§ÑÂ@-΀]à€ÚÂà•Ô Ù΀ÃÏÂÀ¬ØÂ`ÈÖÂÀ}ËÂà­Ð yÞ€ÛËÂ@˜ÑÂ@KÉ VÏ bÍÂÀÊÓÂ@ëØÂ€ Ù íÕÂ@ÕÂÀqÍ€RÍÂà­ÐÂÀ)Ù íÕÂ…Ï€pÈ€XÌ€ÉΠØÂ ÍРçÖÂà¿Í€"ÕÂÀGÔÂÏÂà§ÑÂ@ýÕÂ`ÎÕ€ŸÕÂ`E×ÂÀèÎÂöÑ€¥ÔÂàÖÞ ‚ÒÂ@KÉÂÀÐÒ VÏ ÓÏÂ`ÍÂàlÆÂ@WÇÂÎÂ1ÝÂÀeÏ€¬¾Â€±Ò ëËÂgÔ GÇÂ`ÊÂ`þÍÂàÅÌÂmÓ FÜÂÒ×ÂÀeÏ€‚ÅÂÀwÌÂ@zÖÂ@KÉÂà§Ñ AÈ€·ÑÂ@t× ùÓÂ`.ÆÂà¿ÍÂ@€ÕÂ`E×ÂÀ#Ú€“×€ÚÂÀÛÂÀeÏÂàÕÂ@°ÍÂ@ÕÂ`9Ù€×ÂÀ;ÖÂàúØÂ`à jÖÂ`Œà ÇÑ zÉÂ@†ÔÂ@ÕÂ@ªÎÂ@-ÎÂàÓ€Ú€ÛËÂÀ}Ë€RÍÂüÐÂÀÿßÂgÔ €È€¥ÔÂàéÆÂ@-ÎÂÀkÎÂ`QÕ€ÉΠØÂÀ¸ÖÂÞÕÂ@ ÔÂ`QÕ ÙÎÂüЀ·Ñ |ÓÂà¿ÍÂà¡ÒÂà6Ï ÿÒÂÀ ÚÂðÒ€:ÑÂà$ÒÂà§ÑÂ@ÔÇÂÀ5×€4ÒÂÐÂ1ÝÂ@!Р8Ô€«Ó jÖÂ`¤Ü€oÝÂ@ÂÊÂà­Ð€XÌ€þÚÂ`ÔÔ @ÝÂ@?ËÂÀÄÔÂà›ÓÂ`cÒÂOØÂ ;ÉÂà×ÂÀMÓ€@ÐÂ@€ÕÂÐÂ@JÞÂÀ•Ç >Ó€øÛ hÌÂ@ýÕÂ@ÓÂ@hÙÂÀÐÒ zÉ )ÌÂ@ªÎ€pÈ 2ÕÂ@£ä —ÙÂà*Ñ ”ÏÂà0ÐÂ@žÐ ÓÏÂ@Ò€¥ÔÂàúØÂ`žÝ€«ÓÂÀ/ØÂ@!ÐÂ`àÒ 2ÕÂ`Í€ÏÍÂà6Ï ÐÂ`KÖÂöÑ ÛÂ`àÒÂ`˜ÞÂÀqÍ€dÊ ¦Ì ùÓÂÀß ±ßÂÀèΗÌÂ@-ΠßÍ Ï ÁÒ€{ÛÂ[ÖÂÀ)Ù®ÝÂ@KÉÂà$Ò ÍРµÔÂÀ¦ÙÂÌØÂ@?ËÂÀôÌ€.ÓÂ@ýÕ ÁÒÂÀÈÂ@ÒÂ`3Ú€{ÛÂ@ªÎÂ@ ÔÂ@ÙÛÂ`ÎÕÂ@-΀øÛÂÀ;ÖÂà¿ÍÂØÖÂÀ_ÐÂÀ²×Â`ÔÔ JÑ€@Р\Π»ÓÂàâÜ€@ЀçÉ€ÏÍÂÁÅ€ÛËÂ`É ÇÑÂ@nØÂà<ÎÂ`ÊÂ@'ÏÂ`ÚÓÂÎÂàlÆÂ€ÛË ©Ö óÔÂЀ«ÓÂsÒÂà$ÒÂ@?Ë  ÑÂsÒÂ@!Ѐ“×Â@nØÂ€:Ñ ËÂà›Ó ¦ÌÂ@¤ÏÂà›ÓÂÀîÍ ùÓÂàÀ /Ë )ÌÂàHÌ 8Ô€‡ÙÂ`ìР”ÏÂÀîÍÂ`"È ýÈÂà<ÎÂ`æÑÂÀ;ÖÂ`"ÈÂÎÂ`cÒÂÀfºÂ`uÏÂüРÓÏÂ@ñ×ÂÀÊ /ËÂ@ÒÂÀMÓÂ`oÐÂÀ¸ÖÂ@ñ×ÂËÂÀ¡ÅÂ`øÎ ÇÑ ñÊ !ÃÂ`iÑÂà­Ð€:ÑÂ@’ÒÂ`uÏ ¦Ì€ÛËÂ8ÇÂ`Í »ÓÂ+ÞÂöÑÂÀÄÔ€(ÔÂ@KÉ ÄÇÂ`±ÅÂ@]ÆÂÀîÍÂ@ŒÓÂ`æÑÂà× ÍÐÂ`±Å ÅÂ@ÈÉ€XÌÂ`.ÆÂàHÌÂ@ÂÊ bÍÂÀAÕ€pÈÂÀ³ÂÂÀ¸Ö ÄÇÂà§ÑÂ`ÉÂ`ËÂ`iÑÂ@¤Ï ÇÑ †Ç bÍ !ÀÿÅÂ@¼ËÂ`uÏÂÀ¾ÕÂ`ìÐÂà§ÑÂmÓÂÀƒÊ šÎ€dÊÂÍÃÂ`ÍÂàÔ—ÌÂàËËÂÍ€pÈÂ@¤Ï€±Ò tÊ€4ÒÂà¹ÎÂ@¤Ï nË£ÊÂÀôÌÂöÑ ‘ÚÂÀ›ÆÂ`ËÂmÓÂPÀÖÂà„ÂÂÀ‰ÉÂ@ÓÂàÃÂ@¼ËÂ@ÂÊÂà¡ÒÂÀYÑ ÎÂ`ÉÁ€@Ѐ·ÑÂàNË€íÈÂ@ÒÂ`“ÊÂ@ÔÇÂÀ}ËÂàËË #Í€ÃÏÂ@ÑÂÀôÌ âÂÂ`É JÑ€ØÂ`ìРßÍÂ`þÍ€“×€”ÂÂÀôÌ PÐÂÀÖÑÂà*Ñ åÌÂÀ6€çÉÂ@òÂÂ`òÏÂÀôÌÂàÝÈÂ`ÎÕÂ@ñ× AÈÂ`±Å©ÉÂÀ*ÄÂ@]ÆÂ@t×€"ÕÂ`cÒÂÀ/ØÂ€^Ë tÊÂ`:ÄÂ@KÉ èÁ GÇÂà¿ÍÂÀ§ÄÂà~ÃÂ`‡Ì©É ŽÐÂ΀½ÐÂÀÈÂ`Í »ÓÂ`:ÄÂ`(ÇÂ`:Ä€vÇÂDÅ€ÛË€ÛËÂ&Ê€LÎÂàfÇÂ`{΀ÏÍÂÀ0à‚ÒÂ@'Ï ÓÏ PÐÂðÒÂà×ÂÀúËÂ@žÐÂ@?ËÂÀÊÂ@ßÚ ùÓ /ËÂ@]ÆÂ YÄ ËÂÀ ÉÂ@?ËÂàTÊ£ÊÂ`™É ÙΠÿÒ íÕÂàÅÌÂ`uÏÂ@ÂÊ€øÛÂ`“ÊÂ@3ÍÂÀ›ÆÂ@WÇ€ÕÌÂ@ÒÂ`ÍÂ@'ÏÂÀeÏÂ@˜ÑÂÀ5×Â`ÈÖÂÀkΠJÑÂ@ÈÉÂÀôÌÂ`ÎÕ€ŸÕÂ`ÎÕ 2ÕÂÐÂ@-ÎÂ`Ë µÔÂÀùàÂ@ÕÂÀ›ÆÂ€L΀ÕÌ |Ó—ÌÂ@ÕÂ@3ͯÈÂ`òÏÂ`“Ê€^ËÂÀèΠ;ÉÂÀÜÐÂ`?ØÂ ÕÙÂà`ÈÂà}ØÂ@3ÍÂ@’ÒÂΠ¬Ë ßÍ€FÏÂÀ5×Â`ìÐÂàúØÂ LÛÂÀ¾ÕÂ`E×  Í€4Ò ÇÑÂ@!Р»ÓÂ`âÂà× ”ÏÂ`ËÂ@øÁÂ`oÐÂÌÂ@’Ò—Ì µÔÂÀÖÑ€pÈ åÌÂÀÈ vÔ€ÛËÂÀúËÂ@’Ò ëËÂÏ€RÍ ²ÊÂ`iÑ€XÌ #ÍÂ`WÔÂ@÷Ö 8ÔÂ`½Ã€áÊÂ`“Ê ²ÊÂ`’ßÂ̯ÈÂàÓÂÀkÎÂà§Ñ ŒÆÂ åÌÂà0Ѐ^Ë )Ì€ÖÂàqÚÂÀúËÂ@’Ò€FÏ ¸ÉÂ@'ÏÂüÐÂ`þÍ vÔÂ@3Í€@Ѐĺ ;ÉÂàÔÂà‰Ö ÙÎÂ@ÚÆÂÀ‰É ÁÒ bÍÂÀÐÒÂ`ÔÔÂ@¶ÌÂ&ÊÂ@KÉÂ@ÈÉÂÀSÒ vÔÂ`ÊÂ`É€íÈÂÀÛ€(Ô»ÆÂ ÍÐÂ`uÏ€Õ̵ǀíÈÂ@9Ì ¦ÌÂ`“ÊÂ`ËÂ`Í MÆÂ@!ÐÂàâÜÂÀÇÂà ÖÂËÂÀÆÂ@zÖ tÊÂàãÇ€ÛË€@ÐÂ@-ÎÂ@¤ÏÂ@ªÎÂ@ÕÂ@¶ÌÂà•ÔÂÀGÔÂ`cÒÂ`æÑÂ΀RÍÂ@ Ô€áÊÂÓ ÇÑ€áÊ ÓÏÂÀ¸Ö€{Û ÓÏÂÀËÂàÝÈÂ…ÏÂ@ò ‚Ò€É΀jÉ ¬Ë ÄÇÂIÙ€^ËÂ@ìÃÂ@ÈÉ»ÆÂ€‚ÅÂà§Ñ Ù΀@ÐÂÀÄÔÂ@?ËÂ`¶Ù€ÉÎÂÀ§Ä ¾ÈÂà<΀XÌ€@Ѐ@ÐÂà§Ñ€‚Å  ÑÂàÓ ËÂÀeÏÂÀkΠ)Ì DÒÂ@?ËÂ`‡ÌÂ`ŸÈ ÁÒÂ`{ΠÈ€ŽÃ€@ÐÂ8ÇÂ`þÍÂÀ•ÇÂÀ­Ã ;ÉÂ`«ÆÂ`‡ÌÂ@ªÎÂ`iÑÂ@!ЀdÊ GÇÂ@ÕÂà$Ò ØÂ€ÕÌÂ@?Ë€4Ò VÏÂà›ÓÂÀÈ€óÇ€áÊ€ÿÅÂ`òÏÂÇÄ€íÈ ô¿Â`X¿Â@u ëËÂ@Õ ;É€"Õ€±ÒÂ ÛØÂ@ÈÉ ¾ÈÂ@¤Ï€dÊ jÖÂ@ÎÈÂà}ØÂΠ†ÇÂ`{΀ØÂ€(ÔÂ@¤Ï ’Å€ÃÏÂ@ÈÉÂàèÛÂU× ÿÒÂ@Ñ >ÓÂ`uÏÂà¿ÍÂà0РßÍÂÀSÒÂ@ Ô€ÏÍÂ@ìÀXÌÂ@ÈÉ€ŽÃÂ8Ç >Ó 5Ê©ÉÂà•ÔÂ`“Ê‘ÍÂ@!ÐÂ`"ÈÂ`oÐÂ`ÍÂÀ5×ÂàHÌ È—Ì‹ÎÂÀÐÒ€ÉΠßÍÂà× jÖÂ@iÄ€½Ð pÕÂ@ÙÛ óÔ yÞ 5ÊÂàØÂàÕÂðÒ 2ÕÂà6ÏÂÀ#Ú RÚ JÑ€ÚÂ`Â×Â`ÚÓÂà§ÑÂ…ÏÂCÚ€oÝÂÀ¬ØÂ`uÏÂ@\ÛÂ`3ÚÂÀGÔÂ@ñ×Â@9ÌÂ`‡Ì€™ÖÂ`Í ¯ÕÂêÓ 8ÔÂÀÐÒ ÇÑ  ÑÂäÔÂÏ€(ÔÂÀ²×ÂÀ#ÚÂ@ÍÝÂmÓÂà¿ÍÂ@’ÒÂ@zÖÂÀÈÂ`uÏ ÆÂ@ÑÂÀ_Ѐ™ÖÂÀSÒÂ@†ÔÂÀÖÑÂ`žÝÂ`Ë€óÇÂ…Ï PР©ÖÂ`“ÊÂyÑ 2Õ€RÍÂàÜÝÂ@!ÐÂ`òÏÂ`Í  ÍÂÀšÛÂ@ñ×Â`]Ó ØÂ€ÕÌ€ÛËÂÀË€½ÐÂÀ É ßÍÂÀÐÒÂmÓ€½ÐÂsÒ€XÌÂÀÄÔ €È€«Ó |Ó MÆÂüРVÏÂ`ìÐÂÀÜÐÂÀMÓÂà¿Í€XÌÂÀÛÂ@3ÍÂà¹ÎÂàãÇÂÀYÑ ;É€(ÔÂÀ¾ÕÂ`òÏ€ØÂÀYÑÂàéÆÂ`(Ç€ÛË vÔÂ`{΀ØÂÀâÏÂÀkÎÂ`ªÛ DÒÂ@ŒÓÂÀwÌÂ@ÕÂÀ¾ÕÂ`QÕÂ`àÒÂÌÂ@bÚÂ@åÙÂ`cÒÂ@bÚ íÕÂÀ#ÚÂàúØÂgÔÂÀÛÂÀGÔ€רޠ…ÜÂ@zÖÂ@†ÔÂ`iÑ .àÂÀ5×€ŸÕÂÀwÌ€±ÒÂ`WÔ ©Ö ÏÚ ¯Õ€"ÕÂÒ×ÂàÊàÂ@!ÐÂàԣʠÉÛÂÀšÛÂàãÇ€(ÔÂ@ñ× &×€ÉΠVÏ [ã pÕÂàÂ@£äÂ@ÒÂ` áÂà¹Î ÿÒÂ@°ÍÂÀÐÒÂ@\ÛÂ`æÑÂ@ßÚÂ@Ó ˆÑ ØÂÌØÂ PÐÂ`ÎÕÂÀ²×ÂaÕÂ@¼ËÂ@?ËÂ@ÂÊ |Ó€.Ó€·ÑÂÏÂüÐÂà¡ÒÂàwÙÂ+ÞÂÀ¸ÖÂÒ׋ÎÂÀ}ËÂ`Ë ÷ÉÂÀÖÑÂ@VÜÂ`9ÙÂOØÂ@'ÏÂ[ÖÂ@ÒÂ`uÏÂ`iÑÂ@!ÐÂ@-ᾺçÉ nËÂ`òÏÂà$Ò€"ÕÂàkÛÂ@ÍÝÂU× &× óÔÂàÅÌÂ,ÉÂöÑÂ@æÄÂàwÙ #ÍœàÂðÒÂÀÜÐÂÀâÏ€RÍ ÄÇ »ÓÂ@hÙ ÁÒÂÀMÓ€"ÕÂÀYÑÂÀúËÂÀMÓÂà<ÎÂà6ÏÂà¿ÍÂ`™ÉÂÀZ¼Â`ËÂÀAÕÂ`¼ØÂ€ùÆÂ€ùÆÂ AÈ€RÍÂ@ÈÉ ÐÅÂ`ÊÂ`!ÝÂ@9Ì ÍРùÓ )Ì€^ËÂ@æÄÂà¹Î ÙΠ²ÊÂÀÄÔÂ`{΀^ËÂà<Π†ÇÂ@'ÏÂÀ‰ÉÂ`¥ÇÂàÝÈÂ`ÉÂ,ÉÂ@'Ï ÖÄÂÀ$Å€«ÓÂ@€Õ€ÏÍ ùÓ—ÌÂà¿ÍÂ@˜Ñ—Ì€ÕÌÂÀ$ÅÂ@°Í€áÊÂyÑ ÍРµÔÂÀÈÂ`æÑÂÀÈ vÔ‹ÎÂ`(ǠĀÛË GÇÂ@QÈÂ`ŸÈÂÀwÌ€XÌ€FÏÂ@9ÌÂ`“ÊÂ@˜Ñ ЀÕÌÂÀÊÂÀƒÊ Ï ÙΠˆÑ ŒÆÂРnËÂVÂÂÀÈÂ`iÑÂà­ÐÂüРλÂ@¼Ë ÎÂÀ•ÇÂ` Ì ÖÄ ²ÊÂà×ÉÂà ÖÂ@ªÎÂÀËÂÌØÂÀ)ÙÂàÝÈÂ`ìÐÂÀ;ÖÂ`ÎÕÂ@˜ÑÂ@žÐ€X̯ÈÂ@’Ò ¬ËÂmÓ PЀ^ËÂÀYÑÂà­ÐÂàÅÌ ëËÂ>ÆÂ@ÀÂ`àÒÂ@?ËÂ`àÒ >ÓÂà¹ÎÂàHÌÂ…Ï jÖ ÙÂÀÇÂêÓÂÀ*ÄÂ@øÁ€jÉ€ DÒ€ŸÕ»ÆÂÀôÌ \΀:Ñ ßÍÂà¿ÍÂàÔÂÀAÕÂ`¥ÇÂ@žÐÂà³Ï€ÉÎÂ@KÉÂ@9ÌÂ@t× »ÓÂ@ò€vÇÂàBÍÂ@ŒÓ ”ÏÂÀôÌ€áÊÂÀîÍ ÇÑ‹ÎÂà<ÎÂàãÇ‘ÍÂà§ÑÂÀâÏÂöÑ |ÓÂÀèÎÂà›Ó€jÉÂàTÊ ùÓÂàãÇÂ`{Π”ÏÂ`?ØÂ ÈÂ@’Ò åÌÂ@†Ô ΀LΠ;ÉÂ`½ÃÂÀ6ÂÂÀkÎÂÍÂÐÂÀ/ØÂgÔ€ÕÌÂÀGÔÂÀÜÐÂЀÏÍÂà¹ÎÂÀâÏ…ϩɀvÇÂÀ‰ÉÂ,ÉÂÀqÍ ÍÐÂ`uÏÂ`"ÈÂàfÇ»ÆÂ \ÎÂÀkÎÂÞÕÂ@¼ËÂà0ÐÂÀqÍ ËÂà<ÎÂàÅ̵Ǡ”ÏÂÀ ÉÂ@ÔǠȀ4ÒÂ`ìÐÂ`™É€ÏÍÂÒ×€ Ä bÍ )ÌÂOØÂ€·Ñ€pÈ ýÈÂ`uÏ vÔ€ÉÎÂ&ÊÂÀ}ËÂ@¤ÏÂÀ}ËÂ`“ÊÂ…Ï€{ÛÂàÅÌÂÀîÍ ¯Õ PÐÂÀeÏÂ&Ê€çÉ óÔ€vÇÂ@ÂÊÂ@9Ì åÌ DÒÂà6ÏÂÀ)ÙÂaÕ´Ü 3À€.ÓÂüЀÉΠÇÑÂà0РÁÒÂÀ§ÄÂàlÆÂÀwÌÂÀâÏÂÀSÒÂà¹ÎÂÀƒÊÂà¹ÎÂ`ËÂ@’Ò ²Ê ŽÐÂ`?ØÂàfÇÂ`ŸÈÂÀÆÂ DÒÂ@¶Ì MÆÂà×ÉÂ@KÉÂ@ŒÓÂà‰Ö€¥ÔÂàÅÌ ÍÐÂ`oЀLÎÂ@ÓÂÀ ÉÂàÔ JÑ \΀ÛË ÷ÉÂ@ÕÂàHÌÂ@˜ÑÂ`]ÓÂàqÚÂ@ýÕÂ`½Ã£ÊÂüÐÂ@3ÍÂÀ¸ÖÂÀ²×Â@zÖÂ`‡ÌÂà6Ï çÖÂ@ÂÊÂ`.ÆÂà6ÏÂÀÜР¸É€@ÐÂ`QÕÂÀ É >ÓÂÞÕÂàNËÂ@’ÒÂà`ÈÂ`æÑÂ@Ó ÚÂ@°ÍÂ`cÒÂÐÂà<ÎÂ`{ÎÂàËË LÛÂ@Ñ  Ñ—Ì‹ÎÂÀÈ€.ÓÂ`ªÛ >Ó Ò µÔÂ`]ÓÂà0ÐÂ`˜ÞÂàÓÂ ÛØÂ€Ö€ØÂà¾âÂ@ÓÂ`òÏÂ`iÑ FÜÂ@†ÔÂÀÄÔÂ@ÍÝÂ@ýՠ݀‡ÙÂ`ÞÂ`âÂ`žÝºÛÂ ÛØÂ ÍÐÂyÑÂÍÂÀYÑÂ`¼ØÂ`3ÚÂÀ”ÜÂà$ÒÂOØÂ`KÖÂÏ ÐÂÀAÕ pÕ€{Û öÞÂÀ|àÂ`nå @ÝÂÀeÏÂ@ÕÂ@ßÚÂU×Â`3ÚÂÀçã äá FÜÂ[Ö Ú€WáÂÀ Þ VÏ ‹Û€cßÂÀ;Ö€4ÒÂ`¼ØÂ PЀ×Â@bÚ .àÂ@ Ô (á ÝÂà¡Ò€ìÝ 2ÕÂ`¤Ü ‚Ò€ ÙÂ@>à —ÙÂ`’ßÂ`oÐÂÀjã =è VÏÂäÔÂàîÚÂÀAÕÂ1ÝÂ@ýÕÂ@ÍÝ Û êà€.Ó€(Ô€ÏÍ &×ÂmÓÂà}ØÂ€ØÂ€™Ö —ÙÂ`¤Ü ÝÂ`!Ý€×€]à´ÜÂÀGÔÂ@>à á× gá€R͋Π¯ÕÂàÕÂ`˜Þ€™ÖÂàÊàÂ[ÖÂÀÜÂ`9ÙÂà•ÔÂIÙÂ`ÎÕÂ1ÝÂ`ÈÖÂ@'ÏÂàâÜÂ@÷ÖÂ`ªÛÂ`߀·Ñ íÕÂÀ;ÖÂ@>àÂ@˜ÑÂ`-ÛÂ@˜ÑÂ7ÜÂÀÄÔ€±ÒÂ`°Ú ðß  ÍÂÀ¸ÖÂÀ¸ÖÂàÜÝÂàèÛ «à€ ÙÂ@˜Ñ pÕ€·ÑÂàwÙÂà•ÔÂà­ÐÂ`™É RÚÂÀ Ú »ÓÂàMà pÕÂÀ¦ÙÂÀSÒ‹ÎÂ`ŒàÂÆÙÂyÑ€¥ÔÂÀÄÔ vÔ€.ÓÂ`‡ÌÂà›Ó€½ÐÂÀ¾ÕÂÀ‚ßÂÀŽÝÂIÙÂ@9ÌÂàSß £×€LÎÂ`oР8ÔÂ@Ò Ù΀ÚÂ`ÈÖ &×€"Õ€4ÒÂ@ÑÂÀeÏÂÀâÏÂ@ŒÓ RÚÂÞÕÂÀ²× £×Âà0РèÁ >ÓÂ`ÞÂÀÚ vÔÂà•ÔÂ`KÖ€@ÐÂ`oÐÂÌÂ@?Ë ÈÂ@¶ÌÂÀ²×€×Â`žÝÂàÕ åÌ íÕÂ@ÕÂ`iÑÂ@°ÍÂÀSÒÂ`†áÂà*ÑÂàôÙ€ Ù çÖÂ`°ÚÂ@’ÒÂ@ ÔÂ@ýÕÂ`!ÝÂàwÙÂÀÚÂà$ÒÂÀÜÂ`ÎÕÂ@iÄÂÀGÔÂÀváÂ`-Û ·ÞÂàôÙÂÀùàÂ`ÎÕ ÁÒÂà Ö £×ÂØÖÂàîÚ ØÂÀùàÂ@nØÂÀÜÂàYÞ€iÞÂàMà€LÎÂ…ÏÂ@Õ€oÝ ,ÖÂ`·Ä€uÜÂà_Ý ãÂàÕ »Ó ÉÛ€uÜÂCÚÂÀ/ØÂ`žÝ€{Û€±ÒÂàîÚÂàqÚ ‚ÒÂàwÙÂàÊàÂ`’߀×ÂmÓÂ@-ÎÂ`Œà€ìÝÂÀÊÓÂU×Â`ìÐÂÀÝÂàØÂà<ÎÂà³Ï £×ÂÀ¸ÖÂàYÞ sßÂ@ßÚ ÓÏ öÞ ÕÙÂà×€™Ö€“×Â@hÙÂ`’߀™Ö yÞÂà/åÂ@DßÂ@ÁßÂ@˜Ñ ÈÂà§Ñ€±Ò FÜ ÉÛÂà­ÐÂàƒ× íÕ ^ØÂØÖ€@РXÙÂàkÛ Þâ ÏÚÂ@ÑÂÀË ^ØÂ RÚÂ@ßÚÂ`cÒÂ`ß :ÞÂàÕ€ØÂaÕ ˆÑ d×–á çÂ@ÙÛÂÀèÎÂÀMÓÂ@’ÒÂ`Ë€oÝÂ@Õ £× DÒÂàYÞÂ`ŒàÂ`QÕÂ@ÒÂ`QÕ€"ÕÂ@€ÕÂ`oÐÂ@DßÂÀßÂ,ÉÂÌØÂ`iÑÂà0ÐÂ`“ÊÂ`¼ØÂ d×ÂaÕ€øÛÂÀ²×ÂÒ× êà€ØÂ@€Õ€ŸÕÂàqÚ íÕÂ@€Õ ‹Û nËÂ@’ÒÂ=ÛÂ@Ò€áÊ€‡Ù üÝ JÑÂ@Õ bÍ 2ÕÂ`9Ù ½ÝÂà×Â[ÖÂ@ñ×Â@ÓÜÂ`òÏ ÃÜÂ@nØÂ ”ÏÂà›ÓÂÀeÏÂÀóáÂÀqÍÂàHÌÂàúØÂ@ßÚÂàeÜÂ@ÕÂàÜÝ€‡Ù€™ÖÂÀMÓÂ`¶ÙÂ@˜ÑÂÌØÂ`¶ÙÂ`-Û ÏÂÀ¬ØÂÀ¦ÙÂIÙ ÛÂÞÕ šÎ  Í ùÓÂ`àÒ€.ÓÂà<ÎÂÀÖÑÂÀ¸ÖÂÀÕæÂ`]Ó ;É ÓÏÂà³ÏÂ@'ÏÂÀÛ€uÜÂàÓ€oÝÂ@nØÂà0ЀØÂ@t×ÂÀÛÂÀÚÂ@ýÕÂ@bÚÂ@\ÛÂ@˜Ñ ßÍÂà€™Ö 8Ô ÁÒÂ@ñ× pÕÂàeÜ —ÙÂaÕÂ@\ÛÂÀ;ÖÂÐÂ@ÓÜ€±ÒÂ@˜ÑÂ@ëØÂ`iÑÂ@ñ×Â@ëØÂÀ²× ÏÚ  Ñ€ÛËÂÀ¬ØÂÀYÑÂ@Ñ€ŸÕÂ@DßÂ@¶Ì€Ö ÏÚÂ@’Ò ÙΠhÌ µÔ üÝ çÖÂüÐÂÀÖÑ á×€íÈÂÀ/ØÂ€±Ò€:Ñ€ŸÕ Ü íÕÂ@€ÕÂàÕÂäÂ+ÞÂ@ëØÂ€ŸÕ bÍ€"ՋΠ8Ô´Ü ØÂ€KãÂ`àÒ 8ÔÂ ÛØÂ€þÚÂÀ5×Âà§ÑÂ@ ÔÂ`àÂCÚÂ@\Û€øÛ€ØÂ`bç€þÚÂÀíâ€oÝÂà¹ÎÂÀ#ÚÂÀ5×ÂsÒÂ`?ØÂyÑÂ@°ÍÂÀ¸ÖÂaÕÂ`ÚÓ ‹ÛÂ`ªÛÂÀ}Ë€ÖÂÀ¦Ù€òÜÂmÓÂ`E×Â@ëØÂ`ÔÔÂàØÂÀšÛÂ@nØÂ€‡Ù€{Û :Þ äáÂ@ÙÛ .àÂIÙÂÀ/ØÂà‰ÖÂ`ÞÂàôÙÂ@t×ÂÀ#Ú€ÔáÂäÔÂ`QÕ€ØÂÀ‚ß ÉÛÂ`E×ÂÀ¸ÖÂÀXæÂ LÛ ±ßÂOØÂ`iÑ ÐÂ&ÊÂÀÛÂ@zÖÂÀAÕÂ@zÖÂâÂÀ/ØÂÀÜÂÆÙ ÌåÂ`ªÛÂ`¼ØÂÀ¦Ù ëËÂ@ñ×ÂÀÊÓÂà}ØÂ7ÜÂÀÄÔÂIÙ€¥Ô çÖÂ@nØÂ€ÖÂaÕÂÌØÂ€ØÂ`oÐÂ`ìР>Ó ^ØÂ ‚Ò »Ó 2ÕÂ`òÏÂÀAÕÂ`ªÛ ¯Õ nËÂ`‡ÌÂ@ ÔÂàØÂ€4Ò€òÜ€þÚÂàÊà€(ÔÂÌØÂ@°ÍÂ=Û ÜÂÀ_ÐÂêÓÂ`Â× ¬ËÂ`3ÚÂàÕ RÚ€“×ÂÀkÎÂ@!ÐÂ@ëØÂÀÿßÂ`¤ÜÂ;×ÌÂàÕÂ@ñ×ÂÀÖÑÂ@ÓÂàeÜÂÀ)ÙÂàkÛÂ@÷ÖÂ`'ÜÂРÒ€(ÔÂ`“Ê …ÜÂàÅÌÂØÖ€.Ó üÝÂà¹ÎÂà`È  ÑÂàƒ×€ìÝÂ`†áÂ`ÎÕÂ@!ÐÂ`3Ú Ë /ËÂ@ÑÂ@ÍÝ á×€ÖÂ@\Û LÛ ½Ý ÒÂÀ/ØÂ ÜÂà_݊〇ـ(ÔÂàwÙÂ@†ÔÂàÔÂ@»à€Úà€ÖÂ`ªÛÂÀâÏ¢ßÂÀÿß´ÜÂ`!Ý ËÂÀ;ÖÂ`àÂ`'Ü€ÚàÂ@bÚÂà›Ó ÝÂà ÖÂÀ;ÖÂÀÖÑÂÀAÕÂà­ÐÂ@nØÂ ‘ÚÂÆÙ ¯ÕÂ@ÕÂõæÂ@ëØÂyѠˀŸÕ ÁÒ€(ÔÂ@PÝ ÚÂÀÜР"â€ìÝ€ÔáÂ` áÂ@ßÚÂà¸ãÂ` ÌÂÀÜ€àßÂÌØÂ —ÙÂ@£äÂà/å€Ú ‘Ú ÝÂÀ¸ÖºÛÂàôÙÂ@ÓÜÂ`’߀ÂäÂÆÙ d×€QâÂÀßÂÀ/ØÂ@ÓÜ —Ù &×Â`¶ÙÂÞÕ á×Â@ÇÞÂ@VÜ ÏÚÂÀß ÞâÂ@‹èÂàÜÝÂÀÚÂ`à€×ÂÀváÂàkÛÂ@ýÕÂ@ŒÓÂàGá€cßÂà5ä öÞÂ@µá€“×Âà5ä€ÚàÂ`ŒàÂÀAÕÂà Ö DÒÂ@VÜ ‹ÛÂ@£äÂTìÂ`ýâÂ`žÝÂ@Ó ½ÝÂ@nØÂ màÂ@»àÂêÓÂàØÂ 2ÕÂ@çÂàÔÂ@8áÂÀ Þ LÛÂ@÷ÖÂÀ;ÖÂ+ÞÂÀ¦ÙÂIÙ€øÛÂ`?ØÂ€Úà€iÞÂ`¶ÙÂ@bÚÂÌØÂ`täÂàîÚÂ@ßÚÂàÜÝÂ@µáÂà çÂ@t×ÂÀ‚ßÂ`’ßÂàAâÂ@bÚÂ@˜ÑÂ@ÇÞ µÔÂ@PÝÂ@VÜÂ@µá€«Ó ÉÛ€ŸÕÂà×Â@¯âÂá ÎÂàâÜ ØÂ ‚Ò€½Ð XÙ€àßÂ`?ØÂà‰ÖÂàÖÞ ÝÂ@÷Ö XÙÂÀÊÓ ØÂ LÛ [ãÂÀ Ú ¯ÕÂ`!Ý (áÂÀíâÂÀÛÂ[Ö€ Ù–á¨ÞÂÀÿß ÐÂàâÜ 8ÔÂOØÂàÊà «àÂÀwÌÂ`™ÉÂIÙ ÉÛ Ú®ÝÂà*Ñ êàÂà ,ÖÂàÕ yÞÂ@žÐ jÖ d×Â@bÚÂ@ñ×€4ÒÂ`WÔÂ@bÚÂÀ”Ü Ù€ØÂ`QÕÂàîÚ€ŸÕÂ[Ö€òÜÂ@ÕÂÀšÛÂàÕ€ÖÂÀÖÑ FÜÂ`WÔ ÐÂ`oÐÂÀÜÐÂÀÝ ÏÚ óÔÂàîÚÂÀîÍÂ`òÏ ÁÒÂàYÞ€ÎâÂ`¼ØÂ ÁÒ ÉÛÂ,É RÚÂ@ýÕÂÀ¸Ö€¥ÔÂ`QÕ€uÜÂàÕ £× ÝÂÀ)ÙÂ`ÈÖ _ÃÂ`3ÚÂÀ#ÚÂÀôÌ€ÖÂ@˜ÑÂ@åÙÂ@ñ× XÙ€RÍÂÀÈÂ`Þ ÙÂØÖÂÀeÏÂ@€Õ JÑ ¦ÌÂÀ¾Õ€‡Ù jÖ€¥ÔÂÀ¾ÕºÛÂ…Ï ùÓ€RÍ€«ÓÂ`tä ¯Õ ŽÐ çÖÂäÔ ÓÏÂÀpâÂ@ñ× hÌ€.Ó ñÊÂ`øÎ€@ÐÂ`àÒ PРÎÂÀ_РsßÂà›ÓÂ@°ÍÂ`â —Ù ÝÂàÔ 8ÔÂ@9ÌÂ`ÔÔÂ@†Ô pÕ /Ë€þÚÂÀšÛÂÀ/ØÂàôÙ DÒ pÕ€ìÝ vÔ vÔ |ÓÂüÐÂàÕ€:ÑÂ@\ÛÂÀÊÓÂ@’ÒÂ@ýÕÂ`QÕÂ@¯âÂ@bÚÂ@ÓÂÀwÌÂäÔÂÀYÑ€ØÂË ØÂ@DßÂà*ÑÂÀôÌ€ÃÏÂàÔÂ`QÕÂ,ÉÂ@9Ì ùÓÂ`ÚÓÂ`ÈÖ JÑ€±Ò óÔÂÀYÑÂà*Ñ€|ÆÂ€XÌ€±Ò Þâ 2Õ FÜ ,Ö€“× &×Â`]Ó ˆÑ ‘ÚÂà*Ñ€^ËÂ@’ÒÂ@t×Â`QÕÂàâÜÂ`3ÚÂÀâÏÂöÑÂ`â pÕÂ`¼ØÂÀÄÔÂ`‡ÌÂ`E×€Ö Ü ÃÜÂ@ÍÝÂ7ÜÂ@ÙÛÂ@åÙÂsÒÂ`iÑÂ@ ÔÂ`9ÙÂÀÖÑ€ÏÍÂðÒ çÖ çÖºÛ‘ÍÂöÑÂÀ)ÙÂ@]ÆÂ d×Âà0Р,ÖÂÀÝÂ`òϣʠˆÑÂ@ÙÛÂ[ÖÂ`ìР#ÍÂàƒ× ÿÒÂàîÚÂÒ×Âà³Ï —Ù ‚ÒÂà¡ÒÂàwÙÂÀj〟ՠ|ÓÂ@†ÔÂ@zÖÂ`ÍÂàwÙÂ@nØÂ€FÏÂ`uÏÂ@ÑÂàîÚÂ`þÍ€ÚàÂà•ÔÂà›Ó€×ÂÀÄÔ ‚ÒÂÀqÍÂ`KÖÂÀeÏ £×Â`]Ó€.ÓÂ`-Û Ù &× ‘ÚÂ@žÐÂà³Ï d×ÂÀAÕÂÀ¸Ö ÛÂ@¯âÂÀˆÞÂ@µáÂÀ|àÂ@†ÔÂÀÐÒ ¯ÕÂ`°ÚÂgÔ ‚Ò XÙÂ=ÛÂ`¼ØÂ€òÜÂÀAÕ 2Õ 2ÕÂà¹Î ¯ÕÂ%ßÂÀ;ÖÂ`ßÂ`3ÚÂÀÜÂ@8á PÐÂ`ÞÂÀ¾Õ€cßÂàÐ߀ÚÂ`ÈÖ ‚ÒÂà§ÑÂÐÂ@ŒÓ€ÉÎÂ`ÈÖ &×Âà$Ò ÒÂà6ÏÂÀ}ËÂà*ÑÂÀßÂ@’ÒÂà ÖÂ@ÓÂàèÛÂÀ5× ¬Ë ^ØÂ€½Ð€.ÓÂsÒÂ@zÖ€(Ô ØãÂÀùàÂ@ÇÞÂ…Ï€æÞÂ`¶Ù€ÕÌÂÀÐÒÂ`àÒÂ`¶ÙÂ@’ÒÂ@ÎÈÂà•Ô ‹Û FÜ 2Õ ÇÑÂ`zãºÛ€¥ÔÂ`àÒÂÀÜÂÀÜРÉÛÂÀâÏÂàËË€ÕÌ€.ÓÂÀîÍ bÍÂ@åÙÂÀÛ€òÜÂÀAÕÂ`ÍÂ`ªÛ óÔ€þÚ€"ÕÂàúØÂ`ßÂ@t×Âà›Ó VÏÂÀÊÓ€ŸÕÂÀâÏÂ`?ØÂàËËÂÒ×ÂÆÙ€"ÕÂÀŽÝÂ`KÖÂU×ÂU×Â@\ÛÂØÖÂ`ÎÕÂ@9ÌÂ`þÍÂäÔÂà0ÐÂxæÂ 4ßÂ`òÏÂ`ªÛÂ`˜ÞÂ@Ó€«ÓÂ@ŒÓ ¦Ì€™Ö€pÈÂàkÛÂIÙÂà¹Î ÙÂà¡Ò ¯Õ ˆÑ jÖ d×ÂàkÛ€RÍÂà Ö€ÛË€"ÕÂÀŽÝÂÀÐÒ€4Ò Û ŽÐÂ`‡ÌÂ`ìÐÂÀ²×Â@!РµÔÂ`ÔÔÂ`{ÎÂàÕ ±ß€ÉÎÂ`cÒÂ`Í ^ØÂ€@РØÂ 8Ô€c߀™Ö ,ÖÂ@JÞ JÑ 2Õ€çÉÂgÔÂàeÜÂÀSÒÂmÓÂàÔ€øÛÂÆÙ£ÊÂ`Â× ÎÂÀ_ÐÂàƒ×ÂÀúËÂyÑÂ`ÍÂ@Ó ÉÛÂÀ‰É ¸É >ÓÂ@ëØÂÀ|àÂÀ¦Ù |ÓÂ@hÙ€|ÆÂ@žÐÂà×Â@ÍÝ ”Ï ÇÑÂ@ýÕ jÖÂmÓÂàÅÌÂÀÝÂ@ŒÓÂÀkÎÂ`WÔÂÀâÏ ÍÐÂàHÌÂàHÌÂ`ÞÂ@VÜ ÇÑÂ@'ÏÂ`"ÈÂêÓ€øÛÂ`‡ÌÂ@9Ì€±ÒÂà ÖÂaÕ ßÍÂ@t× JÑÂÀAÕºÛÂ@Ò íÕ ëËÂà¿Í ÉÛÂÀwÌÂàØÂ€ØÂmÓÂ`“ÊÂÀMÓÂ`ÎÕ€oÝÂ`ËÂOØÂ@ÓÜÂ`‡Ì íÕÂ`¶ÙÂ`°Ú £×Â`ÔÔ€¥ÔÂêÓÂÀ¸Ö ˆÑÂÀÚÂàúØÂØÖÂ@÷ÖÂ@åÂÀË óÔÂÀ‚ß çÖÂÀ¦ÙÂ`ÈÖÂêÓÂ`ÈÖÂàôÙÂ`âÂâÂÀÝ óÔ &× ©ÖÂyÑÂàÔ ÇÑÂ@3ÍÂgÔÂÒ×Â@ëØÂ@ýÕÂ`Œà ðßÂÀÄÔ€¥Ô€ÕÌ€¥ÔÂ@÷ÖÂ@ýÕ€™ÖÂ@ŒÓ€4Ò ”ÏÂ=Û @ÝÂÀ|à€ÛË ÝÂ@VÜÂÀ Þ‘ÍÂ@¯â £×€±ÒÂ`ìЀ“×ÂÀ5×Â`E× ŽÐ ‚ÒÂà§Ñ€{ÛÂ@EÊ ÁÒÂ@t×Â@ÇÞÂ@ßÚÂ`3ÚÂà§ÑÂ@nØÂ ÿÒ€.Ó ¦ÌÂ`QÕ–áÂ`ÎÕÂ[Ö€þÚÂðÒÂ`Â×ÂàNË  ÑÂà*Ñ ¯Õ€ÚÂIÙÂ@ýÕÂaծ݀FÏ DÒÂ`oÐÂÀ¾Õ nË ΀íÈ€íÈ€áÊ€@ÐÂ@÷Ö€@ЋÎÂà}ØÂ€ŸÕÂ`9Ù ÒÂÀkÎÂÏ ÁÒ 8Ô€ØÂ€½ÐÂà<ÎÂ@KÉ hÌ€çÉÂà0ЀvÇÂÀÐÒ Ù ÁÒÂCÚÂ@÷Ö  Í Ë€XÌ€Ú€ÚÂ@!ÐÂÀ ÉÂÀ_ÐÂÀkÎÂÀ¦ÙÂ@¶Ì€@ÐÂêÓÂàrÅÂ`"ÈÂ`ìÐÂàËËÂÀ‰É€4Ò ÇÑÂÏ€ÛË‘ÍÂÀeÏÂ`òÏÂ@QÈÂÍ ‚ÒÂÀ)Ù sßÂU×—ÌÂU×ÂÀ¸ÖÂ@bÚÂ@˜ÑÂ`ÏÀ€óÇÂ@ÒÂÀ/ØÂ€ÛË€½ÐÂ@ÒÂüРšÎ ØÂ@ÁßÂÀkÎÂ,ÉÂ@˜ÑÂ@°Í€vÇÂÀèÎÂ@!ÐÂ`É ÙÎÂ`]ÓÂ@ýÕÂOØÂ@ÑÂ`òÏÂ`æÑÂ`ËÂ@°ÍÂ@\ÛÂ`ÔÔÂà}ØÂ€:ÑÂ`WÔÂU×ÂÀ¾Õ€ÛË‹ÎÂÀîÍÂàÓÂà ÖÂàqÚÂàÕ íÕÂà$Ò ÇÑÂÀwÌÂÐÂÀƒÊÂ@¼ËÂÀ5× >ÓÂàTÊ ÷É ùÓÂÀÿßÂ@-ΠóÔ 5ÊÂÀË€L΀ Ä tÊ Å ÓÏÂU×Â@ÓÂÀËÂ>ÆÂ@'ÏÂÀôÌÂ@Ò€@ÐÂ`±Å 5ÊÂ@ÈÉ ñÊ åÌÂÀ•ÇÂ@3ÍÂaÕÂ`oР#Í 8Ô üÝÂ@ÒÂ`òÏÂÀÆÂÁÅÂ`¥ÇÂmÓÂ…Ï |ÓÂÀwÌ ÙÎÂàÕ |ÓÂ@'ÏÂ@ŒÓ ‘Ú€ÃÏ ”Ï€ùÆÂ ‚ÒÂàfÇ©ÉÂÀÜÂÀGÔÂ`Í ŒÆÂ`{ÎÂ`¼ØÂà¡ÒÂ@˜ÑÂaÕÂ`ÚÓÂÀîÍÂ@-ÎÂÀ É€íÈÂà³ÏÂÀîÍÂ@-΀óÇÂ`¤ÜÂ@ Ô  ÍÂ`þÍ >ÓÂÀâÏÂÀÖÑÂ@÷Ö vÔÂ…Ï€ÃÏ€(Ô€RÍÂ@’Ò )Ì ’ÅÂÀÈ ŒÆÂÀÈÂ`¥ÇÂ@?ËÂàÕ€‡Ù µÔÂ`àÒ€ÕÌÂàÓ ÝÂÀ;Ö vÔ€ÖÂÀèÎÂÀ¸Ö Ù΋ÎÂ`æÑ ÍÐÂ@ªÎÂÀƒÊ€dÊ€ÃÏÂ`Â×ÂàÕ ÏÚÂÀ²× PÐÂÀkÎÂ`‡ÌÂ`cÒ ©ÖÂàËËÂ`ìÐÂ`™É )ÌÂÀèΠ‚Ò€íÈÂ@Ջ΀ÖÂàïÅÂ`æÑÂÀÖÑÂðÒÂ`øÎ€FÏÂU×Â@ÒÂÀƒÊÂ`æÑ€RÍ€"Õ ËÂà ÖÂà`È »ÓÂàBÍÂà•ÔÂ`cÒÂ`WÔÂ@ÕÂ@¤Ï ÎÂÀÊÂ`æÑÂ`Þ€ØÂ@QÈ £× »ÓÂ@ÚÆÂ€ŽÃÂ@ÂÊÂêÓ ;É€™Ö |Ó€ÏÍÂ`Í |Ó ßÍÂ&Ê  Ñ AÈ ˜Ä€·Ñ MÆÂ »ÓÂà‰ÖÂ@nØÂ >Ó£ÊÂà–¿Â£Ê JÑÂ@°ÍÂ@æÄ PР#ÍÂêÓÂyÑ ÍÐÂIÙÂ@t× (á åÌ Ò€"ÕÂgÔ )Ì ÇÑÂËÂÀ‰É€Å Ò €È ùÓÂ@3ÍÂÀÜÐÂÀeÏÂ`ŸÈÂà­ÐÂà<ΠÿÒ€ØÂà•Ô€@Р‘ÚÂà¿Í ŒÆÂÀÛÂÀAÕÂàÝÈÂÀ¦ÙÂà¿Í ÏÚ€LΠ”ÏÂ@åÙÂ`iÑÂ@÷Ö nË—ÌÂ@9Ì€áÊÂ@Ò€ÖÂÀË »ÓÂ@EÊÂÀSÒ€“×Â`?ØÂàÅÌÂÀâÏÂàkÛÂÀÊÓÂàÔ€ØÂ zÉ åÌÂà0ÐÂ`žÝÂ`oРÿÒÂàƒ× ”ÏÂàwÙÂÞÕÂ ÊÆÂ€çÉÂ@-ÎÂÀ”Ü  Í€@ÐÂ`æÑÂsÒÂ`ÎÕÂ@ÈÉ ^ØÂ@˜ÑÂÀYÑÂ`þÍÂöÑÂÀè΀ÃÏÂàeÜÂÀÐÒ /ËÂ@÷ÖÂÀ ÚÂÀqÍÂ@ÓÂ`ËÂäÔÂÀÜЀ«Ó ’ÅÂ`ÉÂ@ìÀÿÅÂðÒÂàïÅÂ@'ÏÂ`]ÓÂ`uÏÂÀMÓÂ@ÓÜÂ2È DÒÂÞÕÂ`d½Â /ËÂ`ÍÂ@ÒÂÀ)ÙÂà§ÑÂöÑÂà§Ñ >Ó ùÓÂÀSÒ ŽÐÂÐÂ`ÎÕÂÀ¾ÕÂ&ÊÂyÑ  ÍÂ@÷ÖÂ`]Ó€ÛËÂÀÄÔÂÀ¾ÕÂàÕÂ`ÍÂà³ÏÂàîÚ ²Ê ¬Ë€ÚÂ@žÐ€XÌ ˆÑ h̋΀ÛËÂÀÐÒÂÀúË€dÊ ¬Ë‘Í ;É€^Ë€×€dÊÂ@ŒÓÂ,ÉÂà6ÏÂÀ#ÚÂà ÖÂ@ªÎ ñÊÂÞÕÂÀ¦ÙÂU×€.ÓÂÀ•ÇÂà ÁÂ`oРÍÐÂ@¼Ë 8Ô ©Ö»ÆÂ ¬ËÂ`þÍ ßÍ€LÎÂÀâÏ€‡ÙÂ`{ΠkÁ€ùÆÂ`oÐÂà³ÏÂÀ¡Å€·ÑÂÒ×ÂÀÈ€±Ò Ù΀ÕÌÂÏÂ@'ÏÂ`·Ä€ùÆÂ íÕ nË á×Â@‡¿ÂàÅÌ‘ÍÂyÑ ’Å ²ÊÂ`ËÂÀ É ÐÅ Ë ¸ÉÂU×Â@9ÌÂÀ¹ÁÂ`Â×ÂÀYÑ ©ÖÂËÂ@EÊÂ@!ÐÂà›Ó tÊÂÀîÍ hÌ€ÏÍÂÀwÌ DÒÂà¹Î ÇÑ€ÛË ñÊÂ@ŒÓÂ`æÑ€LΠÅÂ`«ÆÂ€ÃÏÂÀGÔ€áÊÂ@WÇÂ@°ÍÂÀwÌ€áÊÂà$Ò€dÊ€±ÒÂ`KÖÂàZÉÂÐÂÀGÔÂÀ}ËÂÀqÍ hÌ  ÑÂÀk΀·ÑÂ@˜ÑÂ&ÊÂÐÂàÅÌÂÞÕÂmÓÂ@9Ì€pÈÂÀ É€ÛË AÈÂ`iÑÂ`¥Ç tÊÂ ÊÆÂ€pÈÂàãÇÂÀ/ØÂ d×ÂÀ•ÇÂ,ÉÂ…ÏÂàfÇÂ`™É€ÏÍ€”—ÌÂà§ÑÂà¿Í€ÛËÂ`]ÓÂàÕÂ`“Ê bÍÂgÔÂ@åÙ †Ç ÎÂ`™É Ë€"Õ€ØÂ€vÇ qÀÂöÑÂöÑ€çÉÂÀîÍ€ÕÌÂ@'ÏÂ`ÍÂ`.ÆÂ ÓÏ€«Ó PÐÂàËËÂÀË€Ö€XÌÂÞÕ hÌÂÀÊÂÀèΠÒÂ`‡ÌÂà*ÑÂyÑÂ`iÑÂ@Ñ AÈÂÍÂÀÜÂ@3Í Ï ÄÇ€LÎÂ@ªÎÂ`oР_ÃÂ`ÚÓÂÀôÌ€RÍ ýÈ€FÏÂ@EÊÂ`ÉÁÂ@’Ò€XÌÂ@žÐÂ`4ÅÂËÂ@\ÛÂ`òÏÂÀeÏ€çÉÂË€íÈ€XÌ€XÌÂ@ÚÆÂ@˜ÑÂÀÐÒÂöÑÂU×Â`™ÉÂÎÂàZÉ»ÆÂ ËÂ@ªÎ€@ÐÂ`Ê JÑ ˆÑÂDÅÂÀȠˀ¥ÔÂˠˀÅÂ@þÀ ÜÃÂ@9ÌÂ`½ÃÂ@Õ ÏÂ@ÎÈÂÀË hÌ ßÍÂÀ}ËÂà§ÑÂJÄÂÀËÂ@'Ï #ÍÂ@÷Ö AÈÂ…ÏÂàHÌÂÀÈÂÀ¡Å ;É ÉÛ ÿÒ€RÍÂà³ÏÂ2ÈÂ`ÊÂÀqÍÂ`ÊÂ`þÍÂ`àÒÂÀeÏÂJÄ íÕ€ˆÄÂàHÌÂÀâÏ€vÇ €ÈÂ@9Ì€çɑ͠hÌÂ@åÙÂ@ÚÆÂ@æÄÂÀ0ÃÂ>ÆÂàÅÌÂàãÇÂàéÆÂÀk΀^ËÂ`ìÐÂÀ³Â Ù΀RÍÂÍÂ@àÅ€dÊÂ`ÊÂ@KÉ pÕÂ`?ØÂ`ËÂàÔ /ËÂ`¥Ç»ÆÂÀeÏÂàTÊÂ@¤ÏÂ@ªÎÂ`¥Ç€íÈÂÀ‰ÉÂÀ0à Í€LΠ²ÊÂ`“ÊÂÀGÔÂ`æÑÂà¹ÎÂÓÂÂ@ìÃÂ@†ÔÂà›ÓÂàïÅ vÔ ëË DÒÂà×ÉÂ@ÔÇÂ`ÊÂà×Â`àÒÂàúØÂ€ŸÕÂÀ;ÖÂmÓÂàËËÂÀèÎÂ`]ÓÂ`ÉÂüÐÂ`ËÂàéÆÂà‰ÖÂ`þÍ Ë á×€4ÒÂÀGÔ zÉÂ@˜ÑÂà<ÎÂÀÊÓÂ`iÑÂ@’Ò€FÏÂÀ‰ÉÂÞÕÂ`ËÂ@Ò€ÚÂàwÙÂàÕ€"Õ vÔÂöÑ )ÌÂà0ÐÂ`ÍÂ@ŒÓÂ@ŒÓ ”Ï…ϵÇÂÀÄÔÂÀeÏ€RÍÂ`±Å€×ÂàÕÂà¹ÎÂ@ÑÂàTÊÂÀSÒÂ`9ÙÂà×ÂÀ;ÖÂàÕÂÀ ÉÂ`ÈÖ çÖÂ`‡ÌÂ`òÏ ²ÊÂ`ÎÕ€(ÔÂÀóáÂÀèÎÂàÀÂ`cÒÂÀÊ€jÉ £×ÂàÓ€(Ô >ÓÂ`QÕ€½Ð öÞÂ@žÐ DÒ JÑ ;ÉÂ`E×Â@WÇÂÀkÎÂ@Ò ØÂ@3Í€ÏÍÂ`uÏÂ`oÐÂà³Ï€XÌ ñÊÂàÅÌÂ@ªÎÂÀGÔÂ@WÇÂ@ÓÂyÑ€pÈ ÐÂ`oÐÂ`“ÊÂ`(Ç €È  ÑÂ`Ê€pÈÂÀîÍ€ÕÌÂyÑÂ@nØÂàŠÁ åÌ€ŸÕÂà­ÐÂÀ¦ÙÂÀÈÂüÐÂ`¥ÇÂà•ÔÂsÒÂ`]ÓÂÀîÍ óÔÂ`iÑÂÀ›ÆÂÀ;Ö¯ÈÂU×Â@ÒÂ@Ó ;É€ÛËÂà„ÂÂà¹ÎÂÀè΀ÕÌ ÿÒ€dÊÂà~ÃÂÀËÂ@’Ò ÁÒ©É€LÎÂàãÇ ÇÑÂà¿ÍÂÀ*Ä žÃ€FÏÂÀ¡Å ýÈÂØÖÂРJÑ ;ÉÂÀGÔ€ÛËÂ`·Ä žÃ£ÊÂ@žÐ á×Â`‡ÌÂ`·ÄÂ`ŸÈ e åÌ PÐÂÀSÒÂ`ç¼Â@?ËÂ@QÈ€ÉÎÂàBÍÂ@ªÎÂà$ÒÂ@EÊÂ@ªÎ 5Ê»ÆÂ`oР‚ÒÂ@ÚÆÂÀÐÒÂÀâÏÂ`ìÐÂDÅ€çÉÂÍÂ@åÙÂàËËÂ@¼ËÂÀ§Ä ÖÄÂÀÜÐÂàrÅ 'ÂÂ@{Á€ÛË€dÊÂ`4ÅÂ`E× nËÂÀèΠÄÂÁÅÂÀ•ÇÂàBÍÂ`ÍÂöÑ€çɵǀÅÂ…ÏÂÀ0àÆÂ ¦ÌÂ@¶ÌÂÀÇÂ@ªÎÂ`ÍÂÀÄÔÂÞÕÂ`æÑ nË ÇÑ ÆÂ€¬¾Â&Ê  ÍÂàãÇÂÀ¹Á ƒ½Â °ÀÂ@WÇ€FÏÂÀÈ hÌÂÀ0ÃÂ`àÒ€áÊ€íÈÂàÕ©ÉÂ`™ÉÂ@uÂÂÀ*ÄÂÀMÓÂPÃÂà¡ÒÂ`þÍÂ`¥ÇÂà­ÐÂ`¥Ç È ÍÐÂ`òÏ  Ñ ÓÏÂyÑ€‚Å Ç µÔ»ÆÂ@¤ÏÂ@9Ì€FÏÂà`ÈÂ@ÎÈ€‚Å€ÛË€FÏÂ@ÔÇÂ@WÇÂ,ÉÂ`"È€ַÂ@øÁ€ÚÂÀGÔ YÄ ÖÄ ÄÇ åÌ ÇÑÂÀ0ÃÂ2ÈÂÀÈÂ`ÍÂ ÊÆÂ ÙÎÂàNËÂ@ò  Í€ÅÂÀÈÂàÑÊÂÀÆÂÏÂJÄ hÌ ¸É€^ËÂ@àÅÂÏÂ`æÑÂàZÉ ÜÀÛË‘ÍÂ@EÊ ?¾Â ô¿Â€/¾ÂÀ§Ä ¸ÉÂÌÂàZÉÂ@þÀÂ8Ç #ÍÂ`òÏÂàÝÈÂ`oÐÂ`4Å bÍÂÀqÍÂ`˵ÇÂÀÊÂ`]ÓÂ`iÑÂàÅÌ MÆÂÀ­ÃÂÀÊÓÂ@9Ì€XÌÂ@ÎÈ bÍÂàNËÂ`"ÈÂ@ÈÉÂÀÐÒÂ@ÎÈÂ`F€ÃÏÂÀ¡ÅÂÎÂ`™ÉÂ`ÎÕÂ…ÏÂÀYÑÂ@ÈÉ€dÊÂÀâÏÂÀ ÉÂÀeÏÂàÕÂàxÄ ÷ÉÂà¿Í€¥ÔÂà6Ï 3À€ÅÂ@¼Ë ¬ËÂÀ*ÄÂÀ§ÄµÇÂaÕ ;ÉÂ,ÉÂ`{Π8ÔÂÀ¸Ö€pÈÂ@3Í ÍÐÂÀÊÓÂ@àÅ€ùÆÂà*ÑÂÀ#ÚÂÀGÔÂ` ÌÂgÔÂ@ÎÈÂÀÆÂ@ÎÈÂ`ÚÓ »Ó€#ÀÂ@{Á ¸É ΀ÏÍ žÃ ÐÂ@WÇÂà„ÂÂ`Ë€ˆÄ ÜÃÂ`.ÆÂ@ÎÈÂàTÊÂà­Ð vÔ VÏÂ@˜ÑÂ@ Ô pÕ šÎÂÀ}Ë  ÑÂÀƒÊÂ`uÏÂ@ÈÉÂ@3ÍÂ@ÑÂ,É 8ÔÂÀMÓÂ@QÈÂà~ÃÂÀ²×ÂàÕÂ@ÔÇ ^ØÂ@KÉ qÀÂ`òÏÂ@9ÌÂ@'ÏÂ2È€ÉÎÂ@ñ×Â@3ÍÂ`æÑ ÙÂ`æÑÂêÓÂ@uÂÂàïÅÂ@‡¿Â  Í ,Ö »Ó 5ÊÂ@iÄ ÆÂ VÏÂàÅÌÂmÓÂà ÖÂà*ÑÂÀÄÔÂÀ}ËÂaÕÂ@†Ô€¥ÔÂÓÂÂàZÉ )Ì ÷ÉÂ`"È ½ÂàõÄÂÇÄ ¬ËÂ`“Ê ÿÒÂ@ÑÂÀGÔ /ËÂ@¤ÏÂàËË ëËÂࢽÂà<ΠßÍÂ@?Ë€É΀ÛË ÕÙ€ÉÎÂ` ÌÂ`ÍÂà<ÎÂÀÐÒÂÀ_Р²ÊÂà§ÑÂ\ÁÂ`“Ê JÑ  ÑÂÀ§ÄÂÙÁ ˜ÄµÇÂ@WÇÂÀ¡ÅÂ@ÔÇÂ@]ÆÂ€ŽÃÂ`™ÉÂ`±ÅÂüÐÂÀ$Å ßÍÂÀ6ÂÂ@ ÔÂ`™ÉÂÐÂ@?ËÂÀÖÑÂÍ ”ÏÂÀÊ ¾È ÇÂ`±Å€ÿÅÂà„ÂÂÓ ýÈ VÏÂà›Ó ëËÂ`4ÅÂ@ÔÇ€ÅÂbÀ Ò€(Ô£ÊÂÙÁ€ÉΠ©ÖÂ`ìÐÂ`ŸÈÂ`í»Â@øÁÂÀúËÂà Á©É hÌÂ`æÑÂÀîÍÂàûÃÂ@¶ÌÂ@°ÍÂ`"È ýÈ ÅÂÀ•Ǒ̠͗ Ñ ùÓÂàÅÌÂ`ÚÓÂ`oÐÂЀáÊÂ@¼Ë ÜÃÂàHÌÂ`øÎ€|ÆÂÀ‰ÉÂÀâÏÂ&Ê tÊÂÀBÀÂ`ŸÈÂ@øÁ žÃ  Í 5Ê‘ÍÂsÒ /ËÂÀîÍ ¦ÌÂ@ÂÊ€‚ÅÂÀîÍÂàTÊ€RÍÂ@Ò€RÍÂà¡Ò ˜Ä DÒ€@Ѐ‚ÅÂÀ‰ÉÂ@ŒÓÂÀeÏ€ÿÅÂà*ÑÂ@¶ÌÂ`þÍ ÎÂÀâÏÂ@ªÎ \ÎÂÀ_РÇÑÂå¿Â€dÊÂÀîÍÂ@°ÍÂ@ÂÊÂ@WÇÂ@’ÒÂ`øÎÂà ÖÂ@¼Ë tÊ hÌ 3ÀÂÀeϵÇÂÀÄÔÂ`ÎÕ ÈÂ@KÉÂ@KÉÂ@†Ô€çÉÂÀúËÂ@†Ô ÒÂ`ªÛ©É ŒÆÂ 5Ê ¾È€jÉ ÐÅ€ÕÌÂàNË€^ËÂ@KÉÂà ÖÂ`¥Ç‹ÎÂ`ÍÂ`òÏ ;ÉÂÐÂ@Ó ÁÒÂ`‡Ì‘ÍÂ`"È ½ÂàNË zÉÂ@!РPЀ4ÒÂ`cÒÂÀƒÊ ©ÖÂ@!ÐÂ`oÐÂÀ$Å ýÈ 8Ô tÊÂ`iÑÂ@åÙÂ@ñ×Â`uÏ ýÈÂ@EÊ€òÜ ÙΠXÙ ÈÂàÝÈ€vÇÂ@†Ô ÍÐÂ@!ÐÂà¿ÍÂ`òÏ€™ÖÂÀùàÂÀÖÑ AÈÂ`uÏ ¦ÌÂà¿ÍÂ@EÊ hÌÂÀ/ØÂÐÂ@€ÕÂàÅÌÂ@oÃÂÀÊÓ€±Ò ŽÐÂ@3Í ßÍÂЀÉ΀RÍÂ@ÎÈ€.ÓÂ`á½Â ²ÊÂ`cÒ€@ÐÂ@†ÔÂêÓÂ@ÒÂà`ÈÂÐÂàÕÂàxÄÂ` Ì |Ó 8Ô VÏÂ2ÈÂÀ³ÂÂÀÊÂ`QÕÂ@ÓÂyÑÂÀÈÂÀÐÒ nË ÐÂÀÈ AÈ €ÈÂÀ²× Ѐ^Ë VÏ€±Ò€«ÓÂà*Ñ€ÃÏÂà<ÎÂà­Ð ¸ÉÂÀîÍÂÀôÌÂà¹Î ÙÎÂàÅÌÂ`ÍÂàÅÌÂU×ÂÀeϩɠˆÑ ÁÒÂ@žÐ ëËÂà‰Ö åÌÂÍÂà0ÐÂ`“ÊÂÀÈ€RÍ€±Ò€.Ó€(ÔÂ@Õ ЀçÉÂÀYÑÂàÅÌÂÀÊÓ€þÚÂ@’ÒÂÀîÍ óÔ JÑ ÚÂ@ßÚÂ`òÏÂ`{΀«ÓÂ`Í€áÊÂà³Ï pÕÂ`ÊÂà•Ô ˆÑÂ@÷ÖÂ`uÏ ÍÐÂ@ÁßÂ@ÒÂàHÌÂÏ pÕ€™ÖÂU×€ÏÍÂÀwÌÂ@Õ @Ý ð߀@РbÍÂ[ÖÂyÑ‘ÍÂà¡ÒÂàÔÂ`{΀‡Ù€‡Ù€áÊ ÝÂØÖÂØÖ€FÏ YÄÂ@ÑÂ`æÑÂ@’ÒÂÀk΀½Ð tÊÂüÐÂ`øÎ€L΀ÕÌÂ`ËÂ`@ÃÂ`¥ÇÂàHÌÂäÔÂ@ÓÂà Ö šÎÂàTÊÂÀeÏÂ8ÇÂ`!Ý—ÌÂÎÂÀYÑÂ@Ó€ŸÕÂ@\Û€4Ò RÚÂà*ÑÂ`ŸÈÂà6ÏÂ@9ÌÂÀwÌÂ`ÍÂÀqÍÂgÔÂ@\Û 5ÊÂ`WÔÂàôÙ Ï ÁÒÂ`ÈÖ€‡Ù€Ö tÊÂÀ_РÏÂ`cÒ ¬Ë ²ÊÂ`!ÝÂ@ ÔÂÀâÏ€½Ð ˆÑÂ@'Ï€(Ô >ÓÂ`WÔÂÐÂÀMÓÂÀ)ÙÂ`Â×Â@nØÂ  ÍÂÀÜÐÂà ÖÂ@ÎÈÂ`uÏÂ=ÛÂ@˜Ñ zÉÂgÔÂÞÕ€:ÑÂ@ŒÓÂ`ËÂÀ)ÙÂà­ÐÂ@KÉÂàNË€LÎÂàÅÌÂ@˜Ñ ÈÂ@-ÎÂêÓÂàNË ßÍÂ@ÂÊ€4Ò€pÈÂÀGÔ ÙΠJÑÂÀÈ  ÑÂ`{΀|ÆÂ€:Ñ )ÌÂ&ÊÂ@˜ÑÂ>ÆÂÀkÎÂ@†ÔÂ@Õ€½ÐÂÞÕÂ@ÓÂÀwÌÂ`QÕ jÖÂ`ÈÖ #Í  ÍÂ@'ÏÂ`oÐÂ@t×Â@ÂÊÂÀÄÔÂàúØÂ ßÍ€ìÝ€ØÂ@àÅ 5ÊÂÀ$ÅÂÀeÏÂ@’ÒÂàfÇÂà0ÐÂà¹ÎÂmÓ€RÍÂ@EÊÂ`ŸÈ ùÓÂ`9ÙÂÀYÑ »Ó )ÌÂÀeÏ DÒ€vÇ ÁÒÂ@˜ÑÂJÄÂ@'ÏÂ`Ë€@ÐÂöÑÂ@ÎÈ JÑÂÞÕÂà³ÏÂ@˜ÑÂàwÙ€ÕÌ ¦ÌÂÀâÏÂ[ÖÂàHÌÂ@Ò MÆÂ€ÁÂ@¼ËÂÀ}ËÂÀîÍÂàÑÊ #ÍÂàZÉ Ç tÊÂäÔ Å ßÍÂà$ÒÂÀeÏÂÀ›ÆÂ€™ÖÂÀúË »ÓÂ@3Í ÅÂ`‡ÌÂ`ÈÖÂ`ÍÂàHÌÂÀƒÊ µÔ€jÉÂà¡Ò íÕ€ÖÂ`ÚÓÂÇÄÂÀîÍ€ ÄÂ`QÕÂ`cÒ šÎÂ`æÑÂ@ŒÓÂÀ/ØÂ ŽÐÂ`Í íÕ hÌÂ@Õ ¬Ë  ÍÂÌ ÇÑ€áÊÂà¹ÎÂ2ÈÂ@ýÕÂ@cÅ€ ÙÂà6Ï ŽÐÂ@oÀÿÅÂ2ÈÂÀÈ ÏÂ@æÄ |ÓÂÀGÔ€ÃÏ€½ÐÂÀÈÂ@ÚÆÂàûÃÂ`Ê€«ÓÂÀËÂà×ÉÂ@?ËÂ@ÒÂ@!ÐÂ`òÏÂ@¶Ì€¥ÔÂÀÜÐÂ@žÐ #ÍÂ@ñ× Ò€vÇÂ@¶Ì€«ÓÂÀwÌÂ@À ”ÏÂÀGÔ€™Ö )Ì tÊ€ÚÂ`àÂÀúË€FÏ€dÊÂ`æÑ ÄÇ ¸ÉÂ@WÇÂU×ÂÀqÍÂ@žÐÂ@žÐÂ@-ÎÂΠ‚Ò€ ÙÂÀâÏÂà}ØÂÀ_ÐÂÀÐÒÂ@òÂÂàNËÂàÂÂÀúË€:ѯȠá×€ÏÍÂ`˜Þ‹ÎÂРtÊÂêÓÂ@žÐ /Ë€·Ñ ˆÑÂÀÛÂà§ÑÂÀÊÓ šÎÂÀAÕÂà$Ò ‚ÒÂ@bÚÂ`òÏ€ ÄÂ@˜ÑÂà×€Ö —ÙÂ@˜ÑÂ`ìРùÓ vÔ JÑÂ@¶ÌÂÀËÂ`Â× DÒ hÌÂàÔÂÀÜЀFÏÂ@ÂÊÂêÓÂ@†ÔÂ`iÑÂà*ÑÂ`ìРíÕ€FÏÂmÓ€×ÂÀƒÊÂsÒ ˆÑÂÀeÏ€LΠÿÒÂÀÊÓ€¥ÔÂàÔ€dÊ VÏÂÀ›ÆÂÀeÏÂÀ É ùÓÂ`Â×ÂðÒÂaÕÂà×ÂÀÖÑÂ@ÒÂà³ÏÂÀ¹Á  ÍÂà}ØÂÆÙÂàƒ×€RÍÂðÒÂà<ÎÂÞÕÂàÓ€ÃÏÂ@’Ò€±ÒÂË ”ÏÂÀ•ÇÂ`þÍ |ÓÂÀôÌÂ>ÆÂ`uÏÂàBÍÂÀúËÂ@iÄ€ŸÕÂ@ÑÂ@'Ï DÒÂ@nØÂàÕÂÀÖÑÂ` Ì ‘Ú€]à€ÃÏÂàËË ŽÐ€ùÆÂÀ¬ØÂ ÆÂ 5ÊÂ`øÎÂ`‡Ì DÒÂ@¶ÌÂÞÕÂÀ¾Õ 5Ê ÓÏÂÀÇÂ`ËÂ@¤ÏÂà­ÐÂÀÄÔÂ@ÚÆÂ@]ÆÂÏÂ@ÓÜÂsÒÂ`]ÓÂ@nØÂ€ŸÕ |Ó µÔ »Ó€ØÂ€ÉÎÂÍÂÀƒÊÂ`E×ÂàÕ \ÎÂ@ýÕ šÎ YÄÂ@ ÔÂyÑ€·ÑÂàÝÈ ÐÂÀôÌÂ@ëØÂ >Ó€XÌÂà0РAÈÂÀqÍ çÖÂ`KÖÂÀSÒ€ÏÍ ÷É€RÍÂ` ÌÂÀAÕ€ÃÏÂ`ìЀ±ÒÂ ÊÆÂ`{ÎÂÀ}ËÂ@¤ÏÂ`æÑÂ`iÑÂ@9Ì ÇÑ€«ÓÂà×É DÒÂÀ•ÇÂ@ ÔÂ@ÑÂ&Ê ÄÇ€ÃÏ  Ñ ¤ÂÂ@Ñ ßÍ€.ÓÂà6Ï€.Ó ÿÒÂðÒÂà­Ð PÐÂÁÅÂ@ÔÇÂÀMӵǑ̀ÉΠåÌ VÏÂ@ÑÂ` ÌÂàÔÂ@!ÐÂà*ÑÂÌÂ@’ÒÂ@ŒÓ †Ç nËÂêÓ€™Ö ÐÅ€RÍ åÌ€«Ó SÅÂÍÃÂà<΀^ËÂàÑÊ DÒÂÀËÂ`øÎ©ÉÂàƒ× ”Ï€FÏÂÐÂ@!РÁÒÂà§ÑÂ…Ï GÇÂ`“Ê ‘Ú€XÌÂÀMÓÂ`ÍÂÀ‰ÉÂÀ¾Õ£Ê€/¾ÂöÑÂ@!ÐÂÀ;Ö åÌÂà0ÐÂmÓ XÙ XÙ€vÇÂ@˜Ñ  Í ñÊÂ`ìÐÂ`“ÊÂÀË€.ÓÂàÑÊÂüЀ× åÌ ýÈ MÆÂ 8Ô 8ÔÂÀGÔÂÌ€4Ò nË€ØÂà¹Î ÇÑ€ÚÂà¡Ò )ÌÂ…ÏÂgÔ åÌÂÌ€RÍ ÐÂÀ‰É \ÎÂ`ÊÂ`ËÂðÒ ØÂ`cÒÂ@°ÍÂsÒÂüÐÂ@!ÐÂ@?ËÂàõÄÂàBÍ€¥ÔÂ@9Ì€jÉÂsÒÂ ÊÆÂ`ÚÓÂ@!Р)Ì |ÓÂ@'ÏÂ`¶ÙÂ…ÏÂà›ÓÂêÓ »ÓÂàÔÂêÓÂöÑÂ@’ÒÂ@¤Ï PÐÂàÅÌÂöÑ€“×ÂgÔÂà*Ñ€:ÑÂÀeÏÂÀYѵÇÂÀ‰ÉÂÀâÏÂÀ¸ÖÂàÓ€ÏÍÂÀ;ÖÂ`{΀ÎâÂà$Ò /ËÂ@ýÕÂ…Ï€.ÓÂà¿ÍÂ`E× åÌÂ@KÉÂ@-ÎÂÐÂ@’ÒÂà¿ÍÂÀ²×ÂÀwÌ€ Ä VÏ€ÃÏ€çÉ ”ÏÂ`ìЀ½ÐÂÀƒÊ€ŸÕ€"ÕÂÀÊÓ ²ÊÂà`ÈÂ@ ÔÂÀSÒ€.Ó óÔ€íÈ€FÏ PÐÂ@¼ËÂ@¤Ï—Ì íÕ 5Ê óÔÂ@¤ÏÂàÔÂ`E×ÂüÐÂ@ýÕ d×ÂàèÛ íÕÂà}ØÂ`oРØÂà­ÐÂàÔÂ`Ê£ÊÂ`E×€ÏÍÂ@Õ€·Ñ &× µÔÂÀÈ µÔ€™ÖÂ@†Ô 2Õ ÛÂÀ¬ØÂ`¼ØÂ@÷Ö á× 8ÔÂàÅÌ€¥ÔÂà ÖÂgÔÂÀ Ú ˆÑÂ`]ÓÂà<΀ ÙÂ@DßÂÀ¬ØÂà<ÎÂÀÜЀ·Ñ ëË pÕÂ@2âÂ`-ÛÂ@3Í€@ÐÂ@¤ÏÂåÂà•ÔÂ@ÑÂà§ÑÂ`]ÓÂ@Ñ £×Â`Â×€ØÂ .à€XÌÂà­ÐÂÀÜЀXÌÂCÚÂ@°ÍÂÀAÕ ¯ÕÂ`3ÚÂÀYÑÂà­ÐÂÌØÂ€:ÑÂöÑ€@ЀÏÍ äá€ØÂ‹ÎÂØÖÂ`ÈÖ€þÚ´ÜÂ1ÝÂ`3ÚÂàâÜ ÝÂ`cÒŠã€(ÔÂàâÜÂ`QÕÂÀ)ÙÂàôÙÂ%ß LÛ ^ØÂ€‡ÙÂ`ÞÂ`QÕÂIÙÂ`?ØÂ€Ú s߀½ÐÂÀ#ÚÂÆÙ€ØÂ€ŸÕÂ`ÔÔ ©ÖÂÀ_ÐÂ`ÎÕÂêÓ JÑÂà§ÑÂ%߀ ÙÂ@ÓÂ@€ÕÂà§ÑÂÆÙÂà³Ï &×ÂÀÐÒÂ@€ÕÂ`ÈÖ ˆÑÂ`-ÛÂàÕ #Í€½Ð€.ÓÂU× ©ÖÂØÖÂÞÕÂêÓÂ@ÒÂ@'Ï íÕÂ@ÓÂ`¼ØÂ@ÓÂÀeÏÂ@t×Âàƒ×ÂÀËÂ`iÑ SÅÂU×ÂÀ#Ú€FÏ€{Û€4ÒÂ`ÔÔÂÀSÒÂÀeÏÂsÒÂ`QÕÂ@ŒÓ€±ÒÂÀ¦ÙÂÀ/ØÂ hÌÂàHÌÂ[Ö ÝÂ+ÞÂÀÖÑÂÀ5×Â`ÎÕ ¯ÕÂàÔÂ`oÐÂàÊàÂ@ÓÂ@ÇÞ€ŸÕÂaÕÂÀ‰É€ùÆÂÀMÓÂÎÂ`]ÓÂÀÐÒÂ`ÍÂ@3Í€¥ÔÂÐÂà*ÑÂà¹ÎÂ`(ÇÂÀËÂðÒÂmÓÂ@ÒÂCÚ hÌÂÀ¸ÖÂaÕÂÀeÏÂ@ÓÂaÕÂÀ ÉÂ@9ÌÂàÕÂ@÷ÖÂ@'ÏÂ@¶ÌÂ@ªÎ ùÓ VÏÂÒ×ÂÀSÒ ñÊÂÀAÕÂÀYÑÂ@°ÍÂà¹Î ùÓÂÀšÛ 8Ô€LΠßÍÂÀkÎÂ@ÍÝ€¥Ô ÍРˆÑ€ùÆÂÀÜÐÂÀ²×Â@Ò JÑ ŽÐ ñÊÂà$Ò VÏ PЀÛËÂ@ÚÆÂÀ¾Õ ßÍ ;É ÇÂ@ÒÂÀ¬ØÂ@÷ÖÂàéÆÂ`Â×ÂàÕÂà¡ÒÂà×Â=Û ßÍÂ`{ÎÂàÅÌÂüРóÔ 5Ê hÌÂà ÖÂ@¼Ë >Ó µÔÂ@ÈÉÂÀkΠvÔ ÈÂ@¶ÌÂà0Ѐ.ÓÂà•ÔÂOØÂ £× 2ÕÂ@°Í€"ÕÂ@¤Ï SÅÂ@ýÕÂÀYÑ €È ÒÂ@3ÍÂyÑÂsÒÂ8ÇÂÀwÌÂÀGÔÂ`oÐÂ@ÈÉÂöÑÂ@'ÏÂÀ•Ç VÏÂà*ÑÂÀ²× ^ØÂ µÔ€¥ÔÂ@°Í pÕÂ`ÍÂ@QÈ hÌ€4Ò ¦ÌÂà*ÑÂ@zÖ —ÙÂÀîÍÂàÕ JÑÂÀMÓÂ`QÕ€ØÂà0РóÔ jÖÂà*ÑÂ`“ÊÂÏ€ÏÍÂaÕ vÔÂà­Ð‹Î€ÃÏÂ`uÏ 8ÔÂÀâÏÂÀèÎÂ@ñ× ,֋ΠóÔÂ@¶ÌÂÀÚÂàHÌÂà*Ñ©ÉÂàÕ ÓÏÂÀÐÒÂÀâÏÂà6ÏÂ`àÒÂ@Õ ˆÑÂ@-Π¯ÕÂ`4ÅÂÌÂàBÍ€ÃÏ ÓÏ 2ÕÂÀ¸ÖÂ`ŸÈÂ@\ÛÂ`QÕ€:Ñ µÔÂÀ‰É€.ÓÂà­ÐÂà$ÒÂÌÂàÕ€±Ò ÏÂêÓ ßÍÂÀÜЀÉΠ‚ÒÂyÑ€LΠJÑÂ@€Õ ØÂàBÍÂÀYÑÂ@Ñ—ÌÂ`oÐÂ@žÐÂà•Ô ‹ÛÂ@ÕÂ@'Ï vÔÂ`]ÓÂ`{ÎÂÀÖÑ ˆÑ ŽÐÂРJÑÂ@ÎÈÂ@ÎÈÂàÝÈÂ@ÑÂsÒÂ@ÒÂ`WÔÂÀÊÓÂ@€ÕÂ`oЀçÉ óÔÂà€çÉÂÀÖÑ jÖ :Þ€ÛËÂCÚÂÀ}Ë óÔÂaÕ ßÍ >ÓÂ@žÐÂüÐÂ`ÉÂ@÷ÖÂà•ÔÂРµÔÂàHÌ—Ì JÑÂÀôÌÂà¿Í JÑ€™ÖÂ@ÑÂÀ5×ÂÀMÓÂ@¤Ï ÐÂ`“ÊÂà‰ÖÂ`øÎ€¥Ô€ÛËÂë¾Â@ýÕÂÀ;ÖºÛÂäÔ€ÏÍÂÀÊÓ€½ÐÂ@ÈÉÂCÚÂ@t×Â`KÖÂ@?Ë ÁÒ€(ÔÂàTÊ ,ÖÂ@¼Ë #Í µÔ ¸ÉÂ@!ÐÂsÒ€ÃÏÂ@9ÌÂàéÆÂ óÔÂ@˜Ñ€"Õ )Ì ”Ï ØÂ`àÂyÑÂn¾ÂàØÂ@VÜÂ`cÒÂ@žÐÂmÓÂÌØÂ`‡ÌÂ`àÒÂàÓÂ@\ÛÂ`ÈÖÂàÕ ÓÏÂàÑÊ 8ÔÂÀ²× µÔÂ@žÐÂÐÂ@ÕÂàwÙÂ`ËÂ@'Ï Π&×Â@9ÌÂ@ýÕÂ[ÖÂàÕÂÀ5×ÂÀeÏÂ@nØÂ@ßÚÂ@Ò ÙÂ@?ËÂÀÿßÂà*ÑÂ`ÚÓÂ@QÈÂ@QÈ€oÝÂÀMÓÂ[ÖÂ@zÖÂà³ÏÂÀ#ÚÂÀ/ØÂÀYÑ  ÑÂ`.ÆÂaÕ ¬Ë ¬Ë€ ÀÂ@PÝ€“×Â@åÙ€ŸÕÂÀ¾Õ€(ÔÂ`iÑÂРÛ€ÃÏÂgÔÂ@bÚ ,Ö RÚÂÀ¬ØÂà§Ñ€4ÒÂ@ÓÂaÕ ÇÑ€ÚÂÀËÂà}ØÂ ÙΠ>ÓÂ@ÑÂ`ìÐÂ@ŒÓ ˆÑ ‘Ú ÉÛÂàÔÂÀ/ØÂÀ ÉÂàïÅ ÁÒÂà6Ï pÕ  ÑÂ@€Õ—Ì ÇÑ€.Ó 8Ô€íÈ ’ÅÂÀúËÂà¡ÒÂ`àÒÂ`øÎÂ@ÒÂÀ}Ë ¬ËÂ@˜Ñ ØÂ )ÌÂРýÈ€vÇÂ`Í VÏÂ` ÌÂÀZ¼Â`ËÂ…Ï ‚Ò€ÏÍÂ@°Í  ÑÂ@ªÎ šÎÂ2ÈÂ`É #ÍÂ@!ÐÂà‰Ö€ÉÎÂ`¥ÇÂ@'Ï€^ËÂ@¼Ë çÖÂЀLÎÂà}ØÂÀYÑÂ`WÔ GÇ€ÿÅÂ`WÔ ÉÛÂÀ ÚÂ`þÍ >ÓÂ`?ØÂ€oÝÂØÖÂàƒ×ÂsÒÂà§ÑÂ@ÒÂÀúËÂ`KÖÂ`ªÛ ÐÂØÖÂÀúËÂ`ÔÔ pÕÂÀÊÓÂ`ÂׯÈÂàƒ×ÂàÓÂâ ÿÒÂÀkÎÂРzÉÂ@¤ÏÂÀwÌ ùÓ 2ÕÂ@ªÎ‘Í šÎÂ@?ËÂaÕ ŽÐ ¶¿Â¯ÈÂ`iÑ€ÃÏ€LÎÂ`þÍÂàrÅÂÀ*ÄÂàNËÂ`ÍÂ ÊÆÂ Π¶¿Â€çÉ ÄÇÂР\ÎÂàrÅÂÀÜРíÕÂ`ÍÂÀMÓ€óÇÂà›ÓÂ`ìÐÂ`¶Ù ÁÒÂ&Ê †ÇÂÀîÍ åÌÂÀ_Ѐ|ÆÂ åÌ 8ÔÂ@VÜÂ`Ê >ÓÂ`cÒ€.Ó—Ì âÂÂ`«ÆÂÀ}Ë€ùÆÂ ÁÒÂ@QÈÂ` ÌÂ@'Ï ¦ÌÂ@Ó Å °À€×Â@¤ÏÂCڠˀ:Ñ‹ÎÂ@ÑÂÀ¾Õ ;É óÔÂ@°Í ©ÖÂ`oÐÂ`"ÈÂ`òÏÂ`"È VÏ€×ÂÐÂ@9ÌÂàZÉÂ`‡Ì ŽÐÂ`ÔÔ€ÚÂ`¥Ç †Ç€.Ó€×€±Ò€çÉ€FÏÂÀÊ ŒÆÂà$Ò£ÊÂ@ñ×Â@ªÎ ˆÑÂ@˜ÑÂ`"ÈÂÐÂÀúËÂà*ÑÂÀAÕÂ@Ó€FÏÂ@žÐ €ÈÂÁÅ€FÏ€½ÐÂ`ìР”Ï€áÊÂàHÌ€óÇÂ`"ÈÂðÒÂ`“Ê jÖÂÀËÂ`cÒ Ï ßÍÂ`˜Þ€óÇ€#ÀÂ@ÎÈÂÀ‰ÉÂÌÂ@ªÎ ŽÐÂ`ÍÂ`uÏ ÍÐÂ&Ê JÑÂÀkÎÂà0Ѐ¥ÔÂ`ÊÂ`3Ú€çÉ ÈÂà¡ÒÂÀ›ÆÂ€^Ë€½ÐÂüРGÇÂÀÜРvÔ 2ÕÂ@ªÎÂÀ Ú 2ÕÂmÓ ÍР&×ÂàÃÂÀ/ØÂÀYÑÂäÔ ÙÎÂ@'ÏÂ8Ç »Ó€@Ѐ^ËÂÏÂàÅÌ€½Ð 8Ô \ÎÂà­ÐÂÀÊÓ€ÃÏ€RÍÂàMàÂ@†ÔÂsÒÂ`iÑ µÔÂàÔ€Ö šÎ ÇÑ Ü ÉÛ  Í€"ÕÂyÑÂ`QÕÂÀôÌÂÏ ÓÏ ßÍÂÀAÕ ÷ÉÂ@ Ô€ÃÏÂàÓÂÌÂmÓÂ@hÙÂà•Ô ùÓÂРÍÐÂÀYÑ nË€“×Â7ÜÂàúØÂ+Þ€¥ÔÂà§Ñ  ÑÂmÓÂÀ¦ÙÂ`ÈÖ€±ÒÂ@ªÎÂ`ÎÕÂ@-ΠÇÑ VÏ ÁÒ€“×ÂàeÜÂÀÜÐÂÀSÒÂ@D߀ØÂàÓÂ`ÚÓ AÈÂ@t×ÂàØÂ ”ÏÂÀeÏÂà­Ð ÿÒÂà›ÓÂ@t×ÂÐÂÀGÔÂ`]ÓÂàÕ µÔÂ@˜Ñ€{ÛÂàwÙ€"ÕÂàÓ‘ÍÂàèÛ å ¦ÌÂ@ ÔÂÐÂà}ØÂ@hÙÂ@Õ †ÇÂ@žÐÂ`ÎÕÂ@ñ×ÂÀMÓ …ÜÂÀ ÚÂ`ªÛ€¥Ô JÑÂ`Þ 2ÕÂ@nØÂ@žÐÂ`ìР©ÖÂ@ ÔÂÀíâÂ@ŒÓÂ`àÒ€ØÂ`‡ÌÂ@ÓÜÂ@!ÐÂàèÛÂ`ÔÔÂàwÙÂÀpâ jÖ @Ý ÒÂüÐÂ@zÖ€çÉÂ`¤ÜÂà}ØÂ`æÑÂ`WÔÂÀÜÐÂÀGÔÂ@÷ÖÂ@÷ÖÂÀeÏÂ@zÖ—ÌÂÀ²×ÂÀÐÒÂ`{ÎÂÀÝ Û€4Ò€LÎÂàúØÂ XÙ€4ÒÂàwÙÂ+Þ Ù 2Õ óÔ »ÓÂ@hÙÂ@åÙÂÀèÎÂà­ÐÂàÓ€.ÓÂ`àÒÂ@EÊÂÀ‰ÉÂ@ÇÞÂÀ/ØÂ@’ÒÂÀÛÂÀ²× 5Ê€4Ò êàÂàBÍ  ÑÂÀÿßÂmÓ ŽÐÂà6ÏÂÀYÑÂ@ŒÓ ØÂ@°ÍÂ@¤Ï ©ÖÂÀYÑ€{ÛÂ@ŒÓÂ`þÍÂàÕÂUנπ™ÖÂ@ÒÂàMàÂÀšÛÂ`ÈÖ€·Ñ ÐÂÀMÓÂ`KÖÂàÅÌ ΠžÃ ÏÚ ”Ï 2ÕÂ@Ñ JÑ ”ÏÂ`Ë ÏÂöÑÂÀ_РÏ€^ËÂ8ÇÂà`ÈÂ@9ÌÂ`ÍÂ`{ÎÂÀÜЀ¼åÂêÓÂ`iÑÂ`{ÎÂÀÇÂà•ÔÂ@ëØÂ`™ÉÂàÑÊ€RÍ GÇÂ` ÌÂðÒÂ@’ÒÂÀwÌÂ@ÔÇ€«Ó ÇÑÂ…Ï bÍÂÇÄÂ@ŒÓÂ`uÏÂ@KÉ€XÌ‘ÍÂöÑÂ@?ËÂ`øÎ€áÊÂ@÷Ö€:Ñ Р‘ÚÂ`WÔÂ@¤ÏÂ`uÏ ÁÒÂÀ ÚÂÀ”ÜÂËÂ@-Π¾È ŽÐÂ`:Ä€FÏÂ`¼ØÂÀÛÂÌØÂÀ ÉÂ…ÏÂ`þÍ —ÙÂàZÉ vÔÂmÓÂàÕÂüÐÂ@Ñ€óÇÂàÓÂ`ÚÓÂà0ÐÂ@ßÚ óÔ ÆÂРùÓ ΠèÁ€áÊÂ`9Ù ˆÑÂêÓÂ`ŸÈÂà³Ï á×Â@ÂÊ ^ØÂ€‚ÅÂÍÂÀAÕ #ÍÂÀÄÔÂ@¼Ë bÍÂ@3Í€^Ë€4Ò |Ó £×Â`ÚÓÂÀÊÓÂÀ5×Â@¼ËÂ@åÙÂÀeÏ€¥Ô GÇÂêÓ€ˆÄÂΠÒÂöÑÂ` ÌÂà¹ÎÂ`QÕÂ`?ØÂ@?Ë€«ÓÂ@žÐÂ`cÒ ÐÂà¹ÎÂÀèΠ€È 5ÊÂöÑ€:ÑÂØÖ ,ÖÂ@!РÇÑÂ`cÒÂÀYÑÂ@ŒÓÂÀ}ËÂÀîÍÂ`ÎÕÂàËËÂàfÇ€ ÙÂÀ6 ÇÑÂÀúËÂÀÈÂ@Ò \ÎÂÀSÒ ^ØÂ ÈÂöÑÂÀè΀FÏÂêÓ€ÉÎÂÒ×Â`ìÐÂ@nØÂàîÚÂ@ÈÉ DÒ€çÉ€)¿ÂРÒÂÆÙ©ÉÂ`“ÊÂ@ªÎÂ`àÒÂ`ìРÄ€¥Ô€ÃÏÂÀAÕÂ`æÑÂÀ/ØÂà§Ñ€óÇ ÍЀÃÏÂÀÿ߀™Ö ßÍÂà*Ñ d× á× 2ÕÂ`ÈÖÂà§Ñ Ý€(ÔÂ@zÖ€½ÐÂ@ªÎÂà6ÏÂ@h٠٠^ØÂ€@Р|ÓÂÀÜЀLÎÂ`]ÓÂÀ;ÖÂ@-ÎÂ`ÎÕÂ`þÍÂÀîÍÂ@EÊÂÞÕ sßÂРØÂÀÜ€KãÂ`KÖÂÀúËÂ@EÊÂà‰Ö ÐÂÌ  Í 2ÕÂ`øÎ 8Ô 8Ô€4ÒÂüРhÌÂ@3ÍÂ@ìïÈÂüÐÂàËËÂà­Ð ‘ÚÂà¡ÒÂà›Ó Ò€ØÂ nË€½Ð ¯ÕÂÀ#ÚÂ@ëØÂ@ÎÈÂ@¼Ë€±ÒÂ`E×ÂÀqÍÂàTÊ ÈÂÞÕ hÌ©ÉÂà6ÏÂÀÊÓ€çÉ€áÊ tÊÂ@ªÎ )ÌÂÌÂÀË jÖ ÍÐÂËÂ@°Í ÷ÉÂ@žÐ Ò€(ÔÂ`]ÓÂàËËÂåÂ`ßÂ2È ÐÂà6Ï ¤Â PЀ«Ó  ÑÂÀîÍÂà­ÐÂÀwÌÂàÅÌÂIÙ bÍÂ@ÂÊ£ÊÂÀúË€@Р ÍÂ@ÕÂyÑÂàfÇ hÌ€"ÕÂ@?ËÂ`¥Ç 8Ô ÙÎÂyÑ ÷ÉÂ@WÇ Ò çÖÂÌØÂ`KÖÂðÒ€LÎÂÀ}Ë€(Ô€ÕÌ€4ÒÂ@ÓÂ@ÂÊÂ@]ÆÂ GÇ 2ÕÂÀÇÂ`‡Ì >ÓÂÀÇ€¥ÔÂ`þÍÂÀwÌ€ìÝ€½Ð€ÏÍÂ`þÍÂà­Ð ëË€@ÐÂË nËÂÀSÒÂϵÇÂÏÂÀÜРÙ΀4Ò ²ÊÂÀwÌÂ&Ê  ÑÂà6Ï ÙΠJÑ€ùÆÂÀ ÉÂÀ²×Â`ÚÓÂÀÜРÁÒÂ@Õ vÔ€Fϯȋ΀ŸÕ€Ö íÕÂÀîÍ ‚Ò ÐÂ@ÒÂ@€ÕÂà›ÓÂÀSÒÂ@ŒÓÂÏÂàËË€4ÒÂ…ÏÂ`QÕ íÕÂÀ)ÙÂÀ ÚÂOØÂ@uÂÂÀkΠÍÐÂ@Ò VÏ€RÍÂ@nØÂà‰ÖÂ@Ñ >Ó€"ÕÂ@-ÎÂà•ÔÂà`È€pÈÂàNËÂ@PÝÂ`Â×Â`ŒàÂÀqÍÂ@3ÍÂ@ ÔÂ@'Ï€áÊÂ`Í »ÓÂ`‡ÌÂ@-ΠÝ€ØÂÀÛÂà ÖÂÆÙÂ`WÔÂÀ_ÐÂ`þÍ XÙÂ`QÕÂ@ñ×Â`‡Ì Ï VÏÂË FÜÂ`oЀFÏ€LÎÂ@ÈÉÂ@nØÂ ëËÂ`øÎ €ÈÂmÓ€RÍ€ÃÏÂ@ÚÆÂ`±ÅÂà„ÂÂÀ•Ç åÌ ÈÂËÂÀ‰É ÁÒÂà Ö åÌÂàSß d× ²ÊÂ@ Ô |ÓÂ@Ò€ŸÕÂÀÜ€½ÐÂà ÖÂ`þÍ DÒÂ@ÒÂÏÂyÑÂ@ªÎÂÀâÏÂÀ§Ä ŽÐÂÀkÎÂ@-ΠÇÑ FÜ bÍÂsÒÂ@hÙ ÏÂ`øÎ‘ÍÂÀ_РDÒ VÏÂР÷ÉÂ@åÙÂÍ€íÈÂ`E×ÂÀÊÓ d×ÂÀ‰ÉÂÏ JÑÂ`Ë 8ÔÂ@nØÂ`ÚÓÂ@-Π>ÓÂÀeÏÂ@ÓÂ,É hÌ ñÊ ùÓ Р^ØÂ…Ï€½Ð ÖÄ )ÌÂàÔ ,ÖÂ`ÚÓ ÇÑ€þÚ€áÊÂ@Ó€|ÆÂ íÕ€½Ð€Å€ÛËÂÀÊÂ`ÍÂ`{ÎÂà$Ò zɨÞÂÀÊÓ ëË JѠȀ½ÐÂaÕ >ÓÂà¹Î /ËÂÀSÒÂà×ÂÀ_Р¸ÉÂ@ŒÓ ÏÚ tÊÂ`Ë ÍР¯Õ ÅÂ@¤ÏÂàfǀŠÆÂ€ÖÂ@¼ËÂà×É  Í åÌÂ@¶ÌÂ@9Ì ÁÒÂ@ÎÈ€ÛË MÆÂ AÈ€ÃÏ ÇÂÀâÏ©ÉÂ`ìÐÂ@æÄÂàãÇ€ÉÎÂÀË ÈÂäÔ ÎÂ2ÈÂ`Ë Ý ÇÑ€áÊ€çÉ€ ÙÂÀÐÒ ©Ö©ÉÂà*Ñ ÛÂ`uÏÂ`.ÆÂ ÖÄ€íÈ€½ÐÂàÓºÛÂöÑÂ`“Ê vÔ 8Ô ^ØÂÞÕ€ÿÅÂÀeÏÂàÑÊÂÀ#Ú ëË€LΠÒ bÍÂÀ;Ö€dÊÂ`Ë‘ÍÂàNË€ùÆÂ€ÕÌÂyÑÂ…Ï ÖÄÂÀYÑ hÌÂÀÜÐÂ@3ÍÂÐÂàÕÂ@ßÚÂ@’ÒÂ@3ÍÂÀ¡Å€áÊÂ@3Í VÏÂÀT½ÂêÓÂà×ÉÂ`E×Âà ÁÒ ^ØÂ€·Ñ€«ÓÂÀ¬ØÂàŠÁÂ` ÌÂà³Ï€™ÖÂ@ýÕÂà`ÈÂ@ÒÂÀqÍÂ`ÈÖÂÆÙ€ÉÎÂ@¤Ï€dÊÂÀ²×ÂäÔÂÀeÏÂgÔ ÛÂäÔÂÏ€4Ò šÎÂêÓ€±Ò ½ÝÂüÐÂàÑÊÂ@'ÏÂÀúË ¦ÌÂ@ÂÊÂ@ÒÂU×ÂÀƒÊ€ÉÎÂ`uÏ‘ÍÂüР#ÍÂàîÚ ;É ÷ÉÂ`Í bÍÂÀSÒÂà¡Ò€@ÐÂÀ¾Õ€çÉ€Ú vÔÂ`ÔÔ€çÉÂ`(ÇÂÀâÏÂ@žÐ ùÓÂmÓ ¸É€ØÂÀÖÑ ÙΠ€È€óÇÂàƒ×ÂÀúË ^ØÂ@†Ô€“×ÂÀ߀ùÆÂ Ï åÌÂ`ÍÂà­ÐÂyÑÂaÕÂÀ ÉÂÀ&›Â`E× šÎÂÀ_ÐÂà×É ¦Ì >ÓÂàHÌ€ÛË€jÉ€ÛË PРpÕ bÍÂàÝÈ€ÏÍ€pÈ ˆÑÂàÕ Ò€áÊ ùÓÂÌÂà¡ÒÂà­ÐÂ`òÏÂÀwÌÂüРhÌÂÀîÍÂðÒ ùÓÂ@ÂÊÂÀÈÂ@ÒÂÀ‰ÉÂ@9Ì d×ÂÀÜÐÂ`ÚÓÂ@°Í 2ÕÂÀÖÑÂÀÜÐÂÀeÏÂ`ÍÂÀYÑ€ÉΠÿÒ ëËÂ`™ÉÂÀ‰ÉÂ@ÈÉÂ`.ÆÂ€ÅÂ@QÈ ÈÂÀèÎÂ`Í€½Ð JÑ ùÓÂ@žÐ ˆÑÂΠñʩɀÁÂÀqÍÂà<ΠÍЀLΠâÂÂ@]ÆÂ` ÌÂÌÂàÅÌÂÀ›ÆÂÀÆÂ Å€ÏÍÂ@3Í íÕ  ÍÂàÑÊÂ`¥Ç ˜Ä©ÉÂ[ÖÂÀÄÔ ÐÂ@°ÍÂ`·ÄÂ@¶ÌÂ@?ËÂÀÈÂ@ Ô€ Ù€ÉÎÂ@WÇÂÀÐÒÂ@ÂÊÂÀYÑ€XÌÂÀîÍÂ@ÒÂà`ÈÂ`“ÊÂ`“Ê€L΀ÉΠ5ÊÂ`àÒÂ@ªÎ€4Ò€íÈ€çÉÂÀÈ€íÈ€ÛËÂÀ‰É€(ÔÂÀÈÂàC¸Â ’Å ¾È ?¾Â@ÔÇ ˜Ä hÌÂÀwÌÂÁÅ€ÃÂÀ}Ë‹ÎÂ@ ÔÂ ÛØÂ@]ÆÂÀîÍ AÈ #Í€‚ÅÂ@?ËÂ`ŸÈ€Å ÓÏÂÀSÒ ”ÏÂ@†Ô€ÕÌÂàÃÂ@'ÏÂ@ÚÆÂà„ €ÈÂР!à¸ÉÂ2ȣʑÍÂÀúËÂÀqÍÂ@¼Â`ÊÂà¹Î šÎ |ÓÂàfÇÂÀ­ÃÂDÅÂ@ªÎ‘Í€áÊÂàÄá tÊ šÎÂàÝÈ—ÌÂà–¿Â MÆÂÀâÏÂÀÈ ÈÂÀ<ÁÂ`.ÆÂà³ÏÂ@ìÃÂàïÅ ;É €È zÉ îÀÂ`ËÂ@¶ÌÂà}ØÂ JÑ nË €ÈÂ@QÈÂ@±¸Â@WÇ ÜÃÂàÀ Π’ÅÂ`ÉÁÂ`@ÃÂàNËÂà¹Î€pÈÂ@ÈÉÂÀÊÂ@ìÀšÁ€FÏ ;ɣʀ|ÆÂÀË€øÛ€|ÆÂ€«ÓÂ@¥ºÂ@æÄÂàHÌ /˵Ǡ©ÖÂ@QÈÂÀ$ÅÂñ½Â,É _ÃÂàZÉÂàûÃÂÀÅ¿ÂÀƒÊÂÀ}ËÂ`ÉÂ2ÈÂ@¼Ë€ÛËÂàÀ©ÉÂÀ ÉÂàÝÈÂÀîÍ€dÊÂ`™ÉÂ@!ÐÂ`(ÇÂ`™ÉÂÀÇ€çÉÂÀÐÒÂ`KÖÂÀ³Â€jÉÂàTÊ€šÁÂÀôÌÂ@àÅ PÐÂ@ÒÂ`KÖÂ@!ÐÂÀ6 ëËÂÀË€4Ò hÌÂΠ/ËÂà¹ÎÂÀÜÐÂÀGÔÂÀËÂ`Í€ À  ÍÂÀÊÓÂ2ÈÂÀè΀#À€ˆÄ€«ÓÂÀšÛ »ÓÂà¡ÒÂ`™É )ÌÂ@øÁÂàÕ—Ì b͵ÇÂÀƒÊÂà§ÑÂÀÆÂ 5ÊÂ@¶ÌÂ@ÈÉ nËÂ@!ÐÂgÔÂÐÂËÂ`FÂÂmÓ ËÂ@’Ò VÏ ñÊÂ@'ÏÂÀ§Ä€FÏÂà0ÐÂ`¥Ç€ÏÍÂàÑÊ ÈÂ`oРóÔÂ`ìЀ(Ô€Õ̠π”ÂÂÀËÂäÔÂ@!Р/Ë ²ÊÂàÔÂÀ$Å ñÊÂ`ÚÓÂ`F€ÃÂ`±Å ÇÂ`ìРÇÑÂÀÊÂÀ­ÃÂ@!ÐÂÇÄÂ`¶Â@žÐÂ[Ö€:ÑÂÇÄ åÌÂ@¼ËÂ@€ÕÂ`ÍÂÀÇÂ`"ÈÂà%½Â£ÊÂàlÆÂàZÉÂ@¼Ë€4Ò ŽÐÂÀ‰ÉÂÍÂ`«ÆÂ`{ÎÂàlÆÂ`«ÆÂ€àhÌ€dÊ óÔÂ&Ê€LÎÂÀeÏ jÖ ©ÖÂ@ÂÊÂ@ŒÓ€½ÐÂàúØÂ tÊÂà×ÉÂ`ÚÓ óÔÂ`‡ÌÂ`ÊÂà<΀vÇÂ`oÐÂÌÂ`‡ÌÂ`oРá× _ÃÂà¹ÎÂÀkÎÂ`Â×Â@9Ì€RÍÂÀwÌ ÆÂÀ¡Å ÏÂ`ËÂÀkΠ”ÏÂÀÜÐÂà³Ï PÐÂðÒÂÐÂ@ÙÛÂàrÅÂüÐÂêÓ€iÞÂÀ5×ÂàÑÊÂ`Â×ÂÎÂàÔ Û ËÂ`“ÊÂàZÉÂÀÇÂ@’Ò çÖÂØÖÂ`É€:ÑÂ`uÏÂöÑÂà¿Í€@ÐÂ@ÎÈ€RÍÂàÝÈÂàúØÂÀîÍ€ŸÕÂÀÈ bÍÂ@ŒÓ ½ÝÂàÕÂËÂÀèÎÂÀÈ€RÍÂàÕÂÀƒÊ ȼ bÍÂË šÎ€vÇÂà6ÏÂÀqÍÂÀ•Ç \ÎÂÀËÂÀÈÂàlÆÂ—ÌÂIÙ PÐÂ`æÑ€RÍÂà­ÐÂ÷¼Â€ÛËÂÀ¸ÖÂÀ‰É€“×Â@˜Ñ bÍ€ÏÍ )Ì £×Â`ÚÓÂ@oÃÂ@3ÍÂ`þÍÂ`Í 'ÂÂÀ}Ë ÿÒ  ÑÂ`4ÅÂ`]Ó ‚Ò€ÿÅ \ÎÂ@°ÍÂÀîÍÂÀÜÐÂàéÆÂÀÆÂÀwÌÂ@˜Ñ€XÌÂàûÃÂÀ É€ÉÎÂÀYÑÂ@’ÒÂ@QÈÂÌ &×€RÍÂ`.ÆÂà¿Í hÌ zÉÂÀBÀÂ@KÉ ÙΠVÏ€#À #ÍÂà<Π¬ËÂÐÂ`ÍÂ`oÐÂ@¶Ì bÍÂ` ÌÂaÕ´ÜÂ@ÙÛ _ÃÂÀ²×ÂÀâÏ—ÌÂàËËÂ@ÂÊ ÐÂ@ÚÆÂ€@ЀáÊÂmÓÂ`cÒ—ÌÂàBÍÂ@°Í )Ì€vÇ ¬Ë€4ÒÂ`WÔÂ`¼ØÂ ÁÒÂ`FÂÂ`‡ÌÂ`™ÉÂàúØÂ@ÓÂÀ×¼Â>ÆÂàŠÁ€FÏ 5ÊÂàTÊÂàNË nËÂà`ÈÂ@˜Ñ¯ÈÂà­ÐÂÀ²×ÂÀ_ÐÂ`àÒÂ@!ÐÂàTÊÂÀeÏ ;ÉÂ`ŸÈÂ@¶ÌÂOØÂ@ŒÓÂÀÆÂàTÊÂ`Í JÑÂ`ÔÔÂ`òÏÂ@?ËÂ@ªÎ /Ë ÏÂ`Í€‚ÅÂÀ5×Â@KÉ€ùÆÂ ÄÇ ¾ÈÂ`ÃÂÂàBÍÂ@EÊÂ@3Í ЋÎÂ`ÔÔÂ`·Ä€‚ÅÂ`.ÆÂ`:Ä€ÂÂ@°ÍÂà`ÈÂ`É PÐÂàNËÂà6ÏÂÎÂà Ö ÍЀFÏ èÁ€ÃÂ@ ÔÂ`™ÉÂÀÊ€íÈÂà¿ÍÂÀ¿ÀÂàlÆÂàBÍÂüÐÂΠßÍÂÀ_ЀRÍ PÐÂà¿Í€RÍ »ÓÂÀwÌ ¤ÂÂ`ÉÂ@ÓÂÀèΠ”ÏÂ@†ÔÂ8ÇÂ@9Ì€jÉÂàéÆÂ 8ÔÂ`ªÛÂ`ÔÔ ªÁÂ΀vÇ )ÌÂÀ‰ÉÂàNËÂ@°ÍÂà›ÓÂÀeÏÂÀ}ËÂÀ‰ÉÂ`iÑ ‚ÒÂgÔÂÀ;Ö d×Â`Ê€^ËÂà§ÑÂÀÊÓÂÀ ÉÂ@ÚÆÂÀBÀÂàÝÈ ÏÚ ‘ÚÂÇĀŠhÌÂmÓÂËÂÀqÍÂÀ²× ÈÂÀîÍ ŽÐÂÆÙÂàeÜÂ`ÚÓÂÀ/ØÂ€FÏÂÎÂÀîÍ ¾È€çÉÂÐÂÀMÓÂÀÇÂÏ åÌ ÙΠ_ÃÂàÓ hÌÂ ÊÆÂ ¦Ì€«Ó  ÑÂÀÊÓ–áÂÀkÎÂ`ÎÕ€|ÆÂà*ѯÈÂ@ñ×ÂàÕ DÒÂà0ÐÂ`¶Ù ”ÏÂ@°Í ÏÂ`oÐÂÏÂ`]Ó€×Â`‡ÌÂ@9ÌÂmÓÂà­Ð€jÉ JÑ 4ßÂ@ŒÓ íÕ \ÎÂÀ_РµÔÂÀ}ËÂ`ÊÂ@¶ÌÂ`·ÄÂ`æÑÂ@ÈÉ VÏÂ@3Í€¥ÔÂà0ÐÂ`{ÎÂÀôÌÂÀeÏ€4Ò ýÈÂ@ÎÈ€"Õ |ÓÂÍÂ,É ‚ÒÂÀ6ÂÂà0РÍÐÂ@¼Â` Ì PÐÂБÍÂ` Ì åÌÂ@4¸Â€4ÒÂ@'ÏÂ@ÒÂ@Ó DÒÂ@žÐ€FÏ ñÊÂ@€Õ ÷É šÎÂÀwÌ€4ÒÂÀËÂÏ bÍ ȼÂ@9ÌÂ`ËÂÀÐÒÂÀôÌÂàfÇÂ`ÚÓÂ@KÉ€(ÔÂÀÈ€FÏÂ`ÊÂà¿ÂÀÊ €ÈÂà<΀òÜ€ÃÏ€pÈ€‚Å vÔÂÀYÑÂÀ•ÇÂ@ýÕÂ@EÊÂà$ÒÂà*ÑÂËÂÀîÍÂÌÂàÔ£ÊÂÀ›ÆÂ€ÏÍÂ`uÏ€:Ñ ЀÂÂ`ÎՀеÔÂ`àÒ ÁÒÂ`Í€LÎÂÏÂÀ#ÚÂ@Ñ€þÚ ¦Ì ÇÑÂà$ÒÂà§Ñ€ÉÎÂ`ÉÁÂÀÊӠˀÕ̯ȠÐÂ@ÕÂÀ‰ÉÂÀ_ЗÌÂ@nØÂ—ÌÂÀYÑ Р ÑÂàlÆÂàTÊ  Í ¦Ì ŽÐÂà¹Î€ÏÍÂÀ}ËÂÀ¡Å ÄÇ }¾Â AÈ€FÏ n˵ÇÂà`ÈÂÀ6ÂÂ@¤ÏÂ`uÏ€·ÑÂ`“ÊÂ`4ÅÂ@¶ÌÂ@€Õ€ÃÏÂÍ×̠¾ÈÂ ÊÆÂÀSÒ µÔ bÍÂ`øÎÂ`ŸÈÂ`WÔÂ2ÈÂàBÍ AÈ€šÁÂàÝÈÂÀÖÑÂÀ<Á¯ÈÂ`"ÈÂÀÇÂ@ÎÈÂ` ÌÂàBÍÂÀèΑ͠¬ËÂ`™ÉÂàBÍ )ÌÂÀYÑÂÀ6ÂÂ@-ÎÂÀË VÏÂÀÈÂ@QÈ ÇÂÍà÷É€«Ó€óÇÂÀqÍÂ`“ÊÂà•ÔÂà$Ò€ùÆÂÀúË€ùÆÂ€(Ô \ÎÂ@iÄÂÀÈÂÀÈÂOØÂ€çÉÂÀwÌ ¶¿Â@¶ÌÂÀôÌÂ@‡¿Â _ËΠ—ÙÂà×É‘ÍÂ` Ì ”ÏÂ`"ÈÂ@WÇ ¦Ì ²ÊÂà•Ô ¸É zÉ pÕÂÀ_Ѐ@Р/ËÂÀƒÊ PР¬ËÂaÕÂÀÊÓ€ŸÕÂ@9ÌÂàÑÊÂà×ÉÂàxÄ ñÊÂ@Õ ÄÇ »ÓÂË zÉÂüÐÂÀÜÐÂIÙ€«ÓÂàÂÂ@¼ËºÛÂÀÿß ’ÅÂàËËÂà¹Î ùÓÂ`QÕ nËÂ@¼ËÂÀÖÑÂ`ìÐÂ`FÂÂϋ΀‚Å |ÓÂËÂàHÌÂ@¶ÌÂà×Âà¿ÍÂÀMÓÂ@KÉÂ@ÎÈÂÐÂyÑÂ@ªÎÂ`ìÐÂ`òÏÂà*Ñ åÌÂàÑÊÂ@!ÐÂDÅÂ`QÕ€dÊÂ`ÉÂÀôÌ ÐÅÂ@’ÒÂÀ‰É #ÍÂ`“ÊÂÀîÍÂΠ/Ë€áÊ€óÇÂÀwÌ 2ÕÂÌÂ`4ÅÂ`QÕÂ`ËÂÀkÎÂÍÂ`þÍÂàrÅÂÀeÏÂÀ¸ÖÂ`Ë€½ÐÂ@’ÒÂàBÍ€@ÐÂ@€ÕÂÌÂà×ÂàØÂ ÎÂàÓÂÀèεÇÂ`æÑ‘ÍÂ@KÉÂà¡ÒÂÀ¸Ö€·ÑÂÌ€ÏÍ‹ÎÂà¿ÍÂ`¼ØÂÀÈ ¬ËÂÀ}Ë ÄÂ@-ÎÂÀ­ÃÂà³Ï ‚ÒÂË ÓÏ ÇÑÂ`uÏÂ@QÈÂÙÁÂ@EÊÂ`ÉÂ@ÕÂ@ŒÓÂØÖÂ@ŒÓÂÐÂ[Ö nË€ÉΠzÉÂ@’ÒÂÀÜÐÂmÓÂ`ÈÖÂmÓÂ@ÚÆÂgÔÂàNËÂÀÜÂ@òÂÂÓ zÉÂ@EÊÂOØÂàƒ×ÂÀ/ØÂ€:Ñ€íÈÂ@ÎÈÂà¡ÒÂÀÖÑ€@ÐÂ`Í >Ó Ò »ÓÂ`ŸÈ ÐÂ@ Ô€.Ó€þÚ åÌÂÐÂ@ÑÂà*Ñ ØÂ ¬Ë€áÊ DÒÂáÂÀ;ÖÂÍÂ`oÐÂàÕ€XÌÂà•ÔÂà•ÔÂ@Ñ ÐÅÂàHÌÂ@žÐ€ÃÏ £×€™ÖÂÀ/ØÂ ™ãÂOØÂ@¤ÏÂÀkÎÂÀk΀:Ñ ÜÃÂ@WÇÂU×€FÏ hÌÂÀ¾ÕÂ@zÖÂÀ¸Ö »Ó ØÂàfÇÂ`3Ú íÕ ‚Ò€ŸÕ |ÓÂà Ö€ÉÎÂÀôÌÂàÔ€ÉÎÂÀSÒÂ@¤Ï >Ó ,Ö€iÞÂ`K֢ߠ|ÓÂÀ/ØÂÀâÏÂ`cÒÂêÓÂàãÇ >ÓÂ@åÙÂÀ_ÐÂÀ¦ÙÂàîÚ çÖÂà ÖÂ@÷Ö€‡ÙÂÀAÕ †Ç€þÚºÛÂÀÖÑÂ@9ÌÂàØÂ`!ÝÂ`iÑÂà‰Ö bÍÂ2ÈÂ`QÕÂmÓÂ`9ÙÂÀ ÞÂ@KÉ µÔ€ŸÕÂ`™É ΀{Û ‚Ò€.Ó "âÂàÓ€“× >Ó ¯ÕÂà<΀RÍÂàÕÂÀGÔ€·ÑÂ@ ÔÂÀâÏ á× šÎ ØÂÀšÛ€vǠ܀LÎÂ@'ÏÂ`ÚÓÂ`3ÚÂØÖÂ7Ü ÓÏÂ@ÓÜ ÙÎÂÌÂ`{ÎÂàØÂ€çɋ΀4ÒÂÀÐÒÂÀwÌÂ`þÍ ¯Õ€±ÒÂIÙ€Ú —Ù ã µÔÂà‰ÖÂÀÄÔ€øÛ ^ØÂ >ÓÂàHÌÂÀÛÂöÑÂÏ€¥Ô€áÊ íÕ ßÍ€"ÕÂüРßÍÂ@ ÔÂ@'Ï á×ÂÀ•ÇÂ`cÒÂ`QÕ€“×ÂàBÍÂ`¼ØÂ`°ÚÂÀ5×ÂР/Ë€^ËÂ@VÜÂÌ€(Ô€{Û bÍ ÏÂÀÐÒÂàîÚ ÖÄÂÀ_Ѐ·Ñ€½Ð€òÜ ÎÂ@cÅ€vÇ€ÿÅÂÀÄÔÂÏ€:ÑÂÀÇÂ@ÕÂ`?ØÂ@žÐÂÀâÏ ÁÒÂ@ªÎÂ`ËÂà¡Ò :ÞÂ`]ÓÂöÑ †ÇÂÐÂ`øÎÂ@’ÒÂ@\Û€ÚÂ@9Ì€áÊÂÀSÒ¨ÞÂÀ5×ÂÀYÑÂ@ªÎ µÔÂË€ÃÏÂ`™É ÈÂ…ÏÂ@!РÁÒÂ`oР Í€:ÑÂàãÇ ÙΠ,Ö€.ÓÂÐÂ@žÐÂà§ÑÂÀkÎÂ`àÒÂ` ÌÂÀ}ËÂàZÉÂÌÂ`ÍÂ@ªÎÂàÑÊÂ@\Û€·ÑÂÀÜÐÂ@KÉÂÀSÒÂ@ßÚÂà0ÐÂ`QÕÂ` Ì ”Ï YÄÂ@žÐÂ`¤ÜÂ@ÕÂ`KÖ )ÌÂàfÇÂ@'ÏÂ`QÕ á× \ΠÁÒÂÀ;ÖÂÌØÂ d×€ØÂ`KÖÂàÕ nËÂàeÜÂ`øÎÂÀËÂ@JÞ€"ÕÂ@9Ì åÌÂsÒÂàNË ŽÐÂäÔÂ`cÒ #ÍÂ`þÍ€ØÂ€ÃÏÂà›Ó€"Õ€íÈÂ`æÑÂàAâÂàØÂ@ÒÂ`:ÄÂ`:ÄÂÀÈÂäÔ€LÎÂ` Ì€¥Ô á×Â@˜Ñ€ÉÎÂàõÄÂ@¤Ï  Í šÎÂà6ÏÂÀîÍ ÕÙÂà*Ñ ŒÆÂ vÔ tÊ ÷É€ÕÌÂ`ªÛÂ`þÍÂsÒÂÀ)Ù ùÓ€XÌÂàÅÌÂ@¶Ì ÅÂà$ÒÂ[ÖÂ@ÕÂöÑÂ`‡ÌÂ@zÖ€ÃÏÂ@'ÏÂ`iÑ á× íÕÂÀSÒÂÀ}ËÂÀGÔ VÏ hÌÂàBÍÂ@žÐ d×Âà}ØÂ€ŸÕ ÒÂà<ÎÂ@t×Â@°ÍÂà¿Í©ÉÂà›ÓÂàTÊÂà‰Ö ÓÏ ,ÖÂCÚ ùÓ ÐÅ  ÍÂ@÷ÖÂÀÖÑÂ ÊÆÂ`{ΑÍÂÐÂÀ0ÃÂ`™ÉÂà¹Î  ÑÂ@†ÔÂÀÖÑÂàÕÂ@€Õ d×ÂÐÂ,É  ÍÂàÔÂ`™ÉÂà*Ñ ÙÎÂ@¼ËÂðÒÂ@˜ÑÂ@ýÕ  Ñ€ÃÏ€ÕÌÂÀkÎÂÀYÑÂ@˜ÑÂ@÷ÖÂà§ÑÂ@ӵǠ)ÌÂ`ÔÔÂÀúË tÊ€FÏ ÙÎÂ`™ÉÂ ÊÆÂà×ÉÂÐÂ`·ÄÂ`ËÂ`ŸÈ hÌ ¾È pÕÂàYÞÂ@¼ËÂöÑÂà6Ï åÌÂàHÌÂ@¶Ì€RÍÂ[ÖÂ`ÎÕÂ@ÍÝÂðÒ )ÌÂÀ¡Å ŽÐÂÀSÒÂàÅÌ jÖ »ÓÂÀGÔÂà­ÐÂüÐÂ`ÔÔÂ`oÐÂÀšÛÂàÅÌÂÀqÍ€Ö€LÎÂÀYÑÂ`àÒÂ1ÝÂ@†Ô µÔ Ü€íÈÂÆÙ »ÓÂ@hÙ€½ÐÂà¿ÍÂÀÈÂà›Ó€™ÖÂà×Â@?ËÂ`ìÐÂ@?Ë€±ÒÂà¿ÍÂÀÆÂÀ}Ë #ÍÂ2ÈÂ@ Ô çÖÂ@’ÒÂÀ¦ÙÂ@°ÍÂ`uÏÂÀúËÂ@¼ËÂ…Ï  ÍÂÐÂ@-ÎÂ@ÎÈ€·Ñ šÎ ¯ÕÂÀÊÓÂ@Ó€@ÐÂà¹ÎÂÀwÌÂà¿ÍÂ`“Ê —ÙÂÀâÏ ÇÑ ñÊÂ@¶ÌÂà6ÏÂàfÇÂ@Ò€«Ó Ò çÖ ÏÂ`™ÉÂÀâÏÂ@¤ÏÂ`æÑ zÉ 2ÕÂ`“ÊÂÀÊÓ ”Ï©ÉÂöÑÂÏÂ@ëØÂ€RÍ ÈÂ`oÐÂêÓ ÆÂ@EÊ bÍ ”ÏÂàÑÊÂ@¶ÌÂ`QÕÂÀwÌÂ@-ÎÂÀúËÂà0ÐÂà<΀pÈ  ÑÂÀGÔ ¦Ì ßÍÂà×É ÓÏÂ@!ÐÂÀSÒ€“×€ÏÍÂÀÇ ñÊ PЯÈÂ` ÌÂ`Ë€vÇÂ@\ÛÂÀÐÒÂËÂÀƒÊÂà`ÈÂ@oàÎÂàÔÂàôÙÂàéÆÂ€ÃÂ@ÚÆÂ`·ÄÂÌ ÄÇ€ÕÌÂ` ÌÂà×ÉÂàÕÂ`ËÂ@!ÐÂVÂÂ`“ʑ͠5ÊÂÀqÍÂ`ÍÂÓÂÂ`±Å ñÊÂöÑÂ`øÎÂ`"ÈÂÀ¾Õ€XÌÂ`Ê 5Ê 9¿ÂÀâÏÂ@]ÆÂ ’ÅÂäÔÂ@’ÒÂ@þÀ€L΀çÉ ¦ÌÂÀÐÒ€LÎÂÏ ÙÎÂ=ÛÂ@€ÕÂÀÖÑÂh¿Â`Í ;ÉÂ`øÎÂ`ÚÓÂ@æÄÂàéÆÂ€vÇ€ÂÂ@¶Ì€çÉÂР8ÔÂ@PÝ ÇÑÂÀGÔÂÀâÏ ùÓÂàÝÈ )Ì€RÍÂ@ ÔÂà›Ó ”ÏÂà³ÏÂÀ_ÐÂ@ÂÊÂÐÂ@ÚÆÂÀÜР_ÃÂÇÄ /ËÂà•Ô JÑÂàÝÈ AÈÂÀƒÊÂ`:ÄÂ` Ì íÕÂ`ËÂ`òÏÂ`ËÂ[ÖÂ`ìÐÂ&ÊÂ`Û¾ÂÀ›ÆÂ€^Ë ýÈÂЗÌÂ@9Ì‹ÎÂ@žÐÂ`Ê Ä©ÉÂ`øÎ ÍРÏÚÂêÓÂ`þÍÂࢽÂ@EÊÂ…ÏÂßÀÂàéÆÂ`iÑÂÀ‰ÉÂDÅÂÀÜЀ^ËÂÀ É šÎ ÈÂ`øÎ ¦ÌÂàõÄÂüÐÂà*Ñ€@Р5Ê ;ÉÂà§ÑÂ@àÅÂ`ËÂ`QÕÂ`òÏÂàHÌ£ÊÂÀ ÉÂÍÂ`Ê ØÂÀ_ÐÂ@3ÍÂ`àÒ»ÆÂ ‚ÒÂ@ªÎÂà$Ò nËÂ`{Π”ÏÂ`WÔ€ŽÃ ËÂgÔ åÌÂÀÇ—ÌÂ@¼Ë€LΠVÏ ˆÑÂÀÜРÙ΀ÉΠÇÂÀâÏÂ@ªÎÂ@'ÏÂ@'ÏÂ…ÏÂРAÈÂ`“ÊÂ`uÏ ÿÒÂÀÜÐÂ`ËÂ@°Í 2ÕÂà¿ÍÂÀËÂ@3Í€:Ñ—Ì JÑ pÕ bÍÂà­ÐÂDÅÂ`ÚÓÂàãÇ zÉ vÔ )ÌÂ`æÑ€^ËÂÀ•ÇÂà›ÓÂ@WÇÂ`þÍÂà¿ÍÂ`™É ÁÒÂÀîÍÂàÑÊ VÏÂ`Í ëË †ÇÂ`ŸÈ ÙÎÂ@ÈÉÂ`Ë€·ÑÂÀ}ËÂØÖ #Í ¶¿Â€ÃÂ`"ÈÂÓÂÂ@QÈ  ÍÂyÑÂ@ªÎ€ÕÌ 2ÕÂ@ÕÂ@ÂÊÂà¹ÎÂ@ÈÉÂÁÅÂ…ÏÂ@žÐÂ@ÓÂ@°Í 2ÕÂà›ÓÂÀƒÊÂÍÂ@°Í€ÛËÂàÓÂ`Ê ¸É hÌÂ`¶Ù JÑ€|ÆÂ`(Ç ÁÒ€^ËÂyÑÂ`±ÅÂÀÜÐÂ@øÁÂËÂÀîÍÂ@!Ѐ.Ó ŽÐÂÀÜÐÂ`òÏ pÕ¨ÞÂ`ÊÂ`:ÄÂàNËÂÀôÌÂÍÀ‚ÅÂ@¼ËÂ`ÊÂÀ<ÁÂà ÖÂÀ ÉÂÀîÍÂÆÙ 8ÔÂ@'Ï€jÉ È ØÂ` ÌÂ`øÎÂ@ýÕÂà$ÒÂ@!ЀÛË ˜ÄÂ@EÊÂ`ËÂà ÖÂÀîÍ€‚Å #ÍÂ`9ÙÂÀÐÒÂÀ5× ÇÑÂà§ÑÂÀú˵ǠÐÂ`æÑ€ØÂÐÂЀXÌÂ@ÓÂÀôÌ šÎÂ@÷ÖÂÀúË \ÎÂÀ_ÐÂ ÊÆÂàBÍÂà³ÏÂà›ÓÂÞÕÂÀÊÓÂ ÊÆÂêÓÂÀîÍÂ`WÔ€RÍÂÏÂÀÈÂàfÇÂ@†ÔÂËÂà‰Ö šÎÂÍ VÏÂðÒ bÍ€áÊÂÀÜÐÂ`"ÈÂ`oÐÂÀÖÑÂà$Ò XÙÂ`«ÆÂ@ÈÉ ÍÐÂ`þÍÂÀ¬ØÂ@'ÏÂaÕÂ…ÏÂÀÄÔ€þÚÂÒ×ÂÀSÒ ÜÃÂ`]ÓÂá |ÓÂÀÇÂÐÂ@ªÎÂÀúËÂàËËÂ@åÙ PБ̀™ÖÂ`]ÓÂ`ìÐÂÀ}Ë zÉ€pÈ MÆÂÎÂà•ÔÂà¡ÒÂÀƒÊÂÍ »Ó ÐÂàÅÌ VÏ ÏÂ@ÂÊÂ`uϩɠ;ÉÂÀÜÐÂÀ ÚÂà›Ó©ÉÂÀîÍ€4ÒÂ`“Ê hÌÂÍàǀÉΠ|ÓÂÐÂ`ÎÕ€FÏÂàÑÊÂäÔÂOØÂsÒÂ…Ï€ ÙÂ`¶Ù óÔÂÀ$ÅÂàBÍÂ`Â×Â`cÒÂ@!ÐÂà<ÎÂgÔ á× £×Â@KÉ ¬ËÂÀSÒÂmÓ ;ÉÂÀÜÐÂ@!Р¾ÈÂÀ<ÁÂàÜÝÂ@ªÎ€·Ñ€íÈ€ÏÍ ØÂà§Ñ€‡ÙÂsÒÂ@’ÒÂ`¤ÜÂ`{ÎÂgÔ€‡ÙÂ`æÑ€Ö RÚÂÀ5×ÂàÖÞÂÀ#ÚÂàÓ€¥ÔÂ`þÍ€vÇÂà$Ò /Ë  ÑÂ`øÎ £× »ÓÂàÓ ÁÒ vÔ€:Ñ€ÃÏ jÖ€.ÓÂ`™É íÕÂÀqÍÂà§Ñ ÇÂ@Õ€QâÂ@ ÔÂÀ”ÜÂ`E×€XÌ€:ÑÂÀÜР»Ó€KãÂ@Ò \ΠçÖÂ…ÏÂà*Ñ€ÕÌÂ@!ÐÂàÝÈÂÀGÔÂ@ÈÉ‘ÍÂÀ/ØÂ€ÕÌÂ`iÑÂ`Í ¹ÂàfÇ—Ì ©ÖÂà6ÏÂàÅÌÂ@ ÔÂ`ÈÖÂÀMÓÂÀÐÒÂ@VÜ€íÈ šÎÂ@÷ÖÂ`“ÊÂ`ÔÔÂÀ‰É ©ÖÂ`ÊÂ@KÉ íÕÂÀȣʠˆÑ |ÓÂ`ÍÂ@ÂÊÂàBÍ šÎÂ`òÏÂ@\ÛÂàƒ×ÂÀAÕÂàØÂÀYÑÂ`«ÆÂ ÁÒ€‚Å€íÈÂ@àÅÂÀeÏÂ@t× åÌ ÅÂÀ¡ÅÂØÖÂ@ÑÂÀ;ÖÂ@ÂÊÂ@žÐ€(ÔÂgÔ  ÑÂ ÊÆÂ`oЀíÈÂ@Ó€ÃÏÂ@†Ô ˆÑ LÛ ßÍÂÀ¬ØÂ@¤ÏÂ@ÒÂ`Ê ßÍÂàHÌÂàÕÂÀGÔ Ù΀RÍ bÍÂ`ÊÂ`æÑ€pÈ á×ÂÒ×€«Ó ñÊÂà›Ó€½ÐÂà³ÏÂ@ ÔÂÀèÎÂà ÖÂ@ ÔÂ@t×Âà•ÔÂ`ÎÕÂ`øÎ€XÌÂàBÍ€ÃÏ€™ÖÂOØÂ[ÖÂ@ÒÂÎÂ@'ÏÂüРtÊ êàÂÀ¾ÕÂ`ÚÓÂ`ÉÂÀ/ØÂàÐßÂ@zÖ ‚ÒÂ@°ÍÂàqÚÂ@ýÕÂàØÂ€þÚÂà$ÒÂà¿Í€]àÂÀ¬ØÂ€þÚÂêÓ€ÕÌ®ÝÂOØÂ€ Ù ,ÖÂÀYÑÂ`uÏÂàÕÂ@2âÂàîÚ€"Õ©É PР©ÖÂ`KÖ€ÉÎÂÀGÔÂ`ËÂ`{ÎÂ`æÑ€Ú€ØÂà¡Ò ÏÚÂàØÂÏ€“×ÂÀ)Ù€½Ð /Ë ‚ÒÂ@àÅ PÐÂà Ö óÔÂàÜÝÂÀYÑÂàÓÂÀ5×Â@†ÔÂàÅÌÂà‰Ö Ò ßÍÂÀ¬ØÂ DÒÂ7ÜÂË çÖÂ`uÏÂ@Õ€ÃÏ 5ÊÂ8Ç ÏÂIÙÂÀ#Ú »ÓÂ@ÕÂÀkÎÂÀß pÕ¯ÈÂ@ýÕÂ@¶ÌÂÒ× gáÂ`{ÎÂ`âÂ`¤Ü ÓÏÂà›Ó€ŸÕÂà}ØÂ ÝÂ`-ÛÂà³ÏÂÀËÂàMàÂÀšÛÂ@ÓÂ`þÍÂ`ìР£×ÂÀwÌÂÀâÏÂ@ªÎÂ@!ÐÂöÑÂ@Ñ íÕ 2Õ |ÓÂÀ¾Õ€¥Ô ßÍÂ`ÔÔ€:Ñ€LΠXÙÂ@÷ÖÂ@hÙ€FÏÂà¡ÒÂà ÖÂÀúË€ÕÌÂ@ÒÂU×ÂÀGÔ€^ËÂ`¼ØÂ€Ö >Ó€{Û‹ÎÂ`ìЀ"Õ€‡Ù€ÛËÂÀîÍÂ`ËÂ`¶Ù€½Ð jÖ ÙÎÂ@\Û |Ó AÈÂРÒÂ@'ÏÂ`uÏÂ+Þ€òÜÂ`¼ØÂ µÔÂ`àÒÂÀ5× ÄÇÂÀúËÂ@¤Ï€íÈÂ@ÂÊÂÀ_ÐÂ@øÁ £× £× ЀjÉÂ`KÖÂ[Ö ŽÐ ÿÒÂà ÖÂsÒ€×ÂÀGÔÂ`Ë ˜ÄÂ@t×Â@€Õ ÒÂ`þÍÂÀÊÓÂÀ¬ØÂà0ЀÖÂ`Í ÁÒÂà×ÂÀ#ÚÂ@žÐÂàBÍÂÀÊÓÂà¡ÒÂÀ¸ÖÂ`ÍÂ@nØÂàãÇÂ`‡ÌÂÞÕÂÀÇ€XÌÂà ÖÂà×É šÎÂ=ÛÂ`æÑ ÿÒÂ`ŸÈ jÖÂàƒ×ÂÀúË€:ÑÂÀÐÒÂàÕ€ÏÍ€çÉÂ`ÔÔÂ@€ÕÂ+Þ€ØÂ£ÊÂÀ*ÄÂà›ÓÂ`iÑ DÒÂ`±ÅÂ@-ΠßÍÂ@zÖÂà6ÏÂÀÝÂÀ¸ÖÂàNËÂÒ×ÂÀGÔ FÜÂ`{Π»Ó€±ÒÂ,ÉÂÀeÏÂÀeÏ |ÓÂ@cÅÂ@ÈÉ€.ÓÂÀYÑ‘ÍÂ,ÉÂ@-΀"ÕÂ`iÑÂüÐÂÀ;Ö€«ÓÂ@ýÕ€½ÐÂàÑÊ€RÍ€×ÂüР ÑÂ@Ñ€ÖÂàôÙ á× ÏÂÀMÓÂà›Ó€þÚÂU×€çÉÂÀGÔ ÍРbÍÂ@Ñ€ÚàÂ`cÒÂ[ÖÂРÍРÏÂÀ¾ÕÂÞÕÂ@ÑÂ@åÙÂU× 2ÕÂ@€ÕÂ`E×Â@žÐÂà¹ÎÂ` ÌÂàÕ #ÍÂ@QÈ€±ÒÂà³Ï€RÍÂà§Ñ µÔ ¬Ë€WဥÔÂ…ÏÂ`ÚÓÂ@˜Ñ€:ÑÂ@ŒÓ€ØÂÀÜÂ ÛØÂ`ÉÂà<΀«ÓÂÀkΠ»Ó ÏÚ€·Ñ XÙÂ@°ÍÂ@9ÌÂ@9ÌÂöÑÂ@!Р»Ó ‘ÚÂ@bÚ€FÏÂ@žÐÂ@-ÎÂÀÜÂ@÷ÖÂÀ¡ÅÂàÓÂà*ÑÂ@-ÎÂÀÜÂgÔÂÀÖÑÂ`E×Â ÛØÂ Ï Ѐ±ÒÂ`ÊÂ`øÎ€ÛËÂÀSÒÂ@†ÔÂ`uÏÂ`{ÎÂÍÂÀYÑÂÀÄÔ »ÓÂ`þÍÂsÒÂ`ÔÔ€þÚ vÔ ØÂ@ŒÓÂêÓÂyÑÂU×ÂCÚ€.ÓÂ@zÖ€ÚÂ`?ØÂÀ¾Õ Ý UäÂ@zÖ ŽÐÂ@ªÎÂÒ×€‡ÙÂ`ÞÂà‰ÖÂ@hÙÂCÚ ÙÎÂ`KÖÂÀ¸ÖÂ@DßÂÀóáÂ@»à ‘ÚÂÀßÂ@ÕÂ@zÖ RÚÂÀ¾ÕÂmÓÂÀÄÔ äÂ=ÛÂ@\ÛÂ@ÓÂ@!Р©Ö óÔ Ü |Ó bÍ LÛÂ@Õ ½ÝÂÀÊÂÀËÂàÓ …ÜÂàÐßÂÀ5×Â`ÚÓÂÀ¬ØÂ€‡Ù µÔÂà¿Í ÿÒÂà§Ñ€.ÓÂðÒ çÖ€]à€uÜ ÏÚ óÔÂÀYÑÂÀ¬ØÂÀÖÑ PÐÂ`ÚÓ€(ÔÂàqÚÂ@†ÔÂàÔÂÎÂ@t×ÂÀGÔÂÀ5× &× ßÍÂàÓÂà$ÒÂ@ßÚÂ`oÐÂ@!ÐÂÀÄÔ€ØÂ€ÃÏÂ@ÓÜ€ØÂ@zÖÂÀeÏÂ`žÝÂàkÛÂÀÜÂÀâÏÂ@bÚÂ@,〓׀òÜÂàNËÂÀƒÊÂàôÙ Π ÍÂàËËÂÀÜÂàèÛÂÀŽÝ€«ÓÂ`iÑÂà•ÔÂÏÂmÓÂÀ߀ÕÌ sß ÁÒ—ÌÂÀšÛÂ@ÓÂÀ^åÂ`°Ú ÇÑÂ`ÈÖÂÀ_Ѐ(ÔÂ`!ÝÂ@†ÔÂ@Õ ÏÚÂàYÞÂ@ÕÂà ÖÂà³ÏÂÀƒÊÂ`?ØÂ vÔÂ`ªÛÂ@ÕÂ`QÕ »ÓÂaÕÂÀ¸ÖÂ`Â× ‚Ò€½ÐÂÀÛÂÒ×ÂÎÂ@VÜ€dÊÂÀMÓÂÀ§Ä bÍÂ`øÎÂ@'Ï d×ÂÏ —Ù€"ÕÂàkÛÂÀ_ÐÂ`ÔÔÂàÔ€«ÓµÇÂÀîÍÂàèÛÂ+Þ€×ÂäÔ€øÛÂÀúˮݠÿÒÂ`ÈÖ ÓÏÂÀ Ú >Ó RÚ€ÚÂ@'ÏÂ`æÑÂÌØÂ€àß ,ÖÂ`3ÚÂÀâÏÂ@ªÎ ßÍÂ`WÔÂ`ìЀ«ÓÂà*Ñ€LΠ²ÊÂüРŽÐÂà›Ó€{ÛÂ`ìÐÂ@ÑÂÀÐÒ€ÕÌ 8ÔÂ@žÐÂ@?ËÂ`WÔ 2ÕÂà*ÑÂ7Ü€±ÒÂ@µá @ÝÂ@’ÒÂ`øÎ |Ó >ÓÂÀÄÔ€ÚÂ@3ÍÂ@!ÐÂ`Ë ¾ÈÂÀYÑÂ@PÝÂ`QÕ ÍУʠtÊÂ@¶Ì ýÈÂ@ÍÝ ”ÏÂ`™ÉÂÀ¡ÅÂà•Ô £×ÂsÒ ÎÂ`ËÂÀ¾ÕÂÍÂ&ÊÂà³ÏÂ@ÚÆÂ@¼Ë€dÊÂÀeÏ nË zÉÂOØÂ`ÔÔ ØÂÀ ÚÂ@˜ÑÂÀkÎÂÀÈ€±Ò Ï€«Ó •ºÂÀ`»Â€pÈ€^Ë€:ÑÂäÔ íÕÂäÔ ¾È€ÉÎÂ`FÂÂ,ÉÂà6Ï ÈÂ`¶ÙÂàÓ€½ÐÂà$Ò ÛÂà*Ñ >ÓÂöÑÂÀÜРÇÑÂ`É nË ' |ӵǀFÏÂ@ýÕÂàBÍÂ`‡ÌÂÀYÑÂÀÖÑÂÏÂ@ýÕÂ`?ØÂà$ÒÂ`9Ù íÕÂÏÂÀk΀pÈ  ÑÂÀ Ú ëËÂàTÊÂ@-ÎÂ@!ÐÂà$ÒÂà0РDÒÂ@Õ€ØÂ Ò€@Р^ØÂ@Ó ‚Ò ¬ËÂÀÜÐÂ@ßÚ vÔ ©ÖÂ`æÑÂÀ_Р ÍÂ@-ÎÂÀúËÂ`ÚÓÂÀ¦Ù £×Âà¹ÎÂ@ßÚÂ`òÏÂ@žÐ ’Å€@ÐÂà›ÓÂà_Ý j֠πŸÕ ÝÂÀâÏ ÐÂà0ÐÂÀÇ ÙÎÂà}ØÂØÖÂ`"È€«ÓÂ`æÑÂÀwÌÂÀ”Ü hÌÂ`ìЀ:ÑÂà•Ô íÂCÚ€4ÒÂ@Ò ¯ÕÂ@3Í¢ßÂ@˜ÑÂÀË Ò ÏÚÂ@ŒÓÂ[ÖÂ@ÒÂ@Ñ€Ö€^Ë€dÊ‹ÎÂ`E×ÂÀèÎÂ@ÓÂÀ;ÖÂ`ÍÂyÑ ËÂÀ0ÃÂ`KÖÂmÓ ŽÐÂà¹ÎÂ`uÏÂ`ÔÔÂàúØÂ Ý ÎÂ` ÌÂàeÜÂüÐÂàrÅ £×ÂaÕÂàâÜ á×Â`òÏ ÒÂÀÆÂ@t×Â`ÔÔ 2ÕÂÀèΠpÕÂgÔ€·ÑÂÀGÔÂÀpâ ÝÂÀèÎÂ`òÏ€«Ó †ÇÂÒ×Â`¤Ü€¼å ”Ï ÕÙ ¯ÕÂà6Ï ØÂÐÂÀ)ÙÂÀ ÚÂà›Ó  ÑÂÐÂ@ Ô GÇÂ`iÑÂ@-ÎÂÀMÓ€“×ÂÀîÍÂêÓÂÀAÕ ßÍÂà6ÏÂ`QÕ íÕÂ@ Ô µÔ€(ÔÂÀ0ÃÂÀÇÂà›ÓÂ`E×ÂOØÂ@ëØÂ RÚÂ`òÏÂ`ÎÕ€.ÓÂ` ÌÂ@€ÕÂÀßÂÎÂ`]Ó £× µÔÂOØÂÀÖÑÂÀSÒÂ`ÍÂüРLÛÂ`WÔÂàâÜ XÙ 2ÕÂР>ÓÂ`°Ú šÎÂ@ ÔÂ@÷ÖÂ` áÂ@nØÂ@€Õ€¥Ô ÎÂ@’ÒÂÌÂàÓÂÀÐÒ óÔ åÌ€½Ð€½ÐÂÀMÓÂ@’ÒÂÞÕ »ÓÂ`ÎÕ XÙ€RÍ€{ÛÂ`ÎÕÂàîÚ€ÚÂÀ#Ú µÔ€uÜÂÐÂ@zÖ LÛÂàâÜ ;ÉÂ`ÈÖ )ÌÂÒ×€Ú€@ÐÂàúØÂ ÿÒÂà§ÑÂ@’Ò ^ØÂ€oÝÂ`žÝÂ`Þ ÇÑÂ`WÔ€cßÂà6Ï€{Û Ú ÁÒÂà}ØÂ µÔ óÔÂfé sßÂ`uÏÂ@µáÂÀ#ÚÂ`ÈÖ JÑÂ`òÏ€ØÂ ÕÙÂ`¶Ù £×€@ÐÂ`3ÚÂ`€âÂsÒ€¥Ô€¥ÔÂÀŽÝÂà§Ñ ÕÙÂÀÜ€"ÕÂ`ßÂÏÂà*ÑÂaÕÂÀŽÝÂ=ÛÂ@ÕÂàØÂ€™Ö€ØÂ@nØÂ@ÇÞ /ËÂàÕÂÀâÏÂ`ß ÍÐÂÀ ÚÂ@ÒÂÀÐÒÂ%ßÂ`¶ÙÂÀGÔÂÀ¸Ö€ØÂ`E× ÙÂ`!Ý |Ó 5ʀŠÿÒÂ`3Ú aâÂ`¶Ù FÜÂ`9Ù€"Õ ØÂ@åÙÂ`ÎÕÂÀqÍÂÀÛÂà¹ÎÂ@ëØÂ@t×ÂmÓ€Ú íÕÂà<ÎÂÀYÑ >ÓÂ`¶Ù€.Ó óÔÂàÓÂÀAÕÂÞÕ€½ÐÂ@VÜÂOØÂ@ÂÊÂ`iÑÂÀÊÓÂ`÷〪èÂ@nØÂ`iÑÂ@ÈÉÂ@t×ÂÀAÕÂüЀØÂÀSÒÂ@˜Ñ jÖÂ`ÎÕÂà¡Ò ÝÂàÜÝÂÀ#Ú€@Р’ÅÂ`uÏÂ@ÎÈ pÕÂ`ÎÕÂàÖÞÂÀ¦Ù€"ÕÂ@’ÒÂÀYÑ ØÂà¹ÎÂU×Â`cÒÂÀ É È :Þ Ù€áÊ€±Ò ”ÏÂ`ÍÂ@nØÂ`Â×Â`òÏ |ÓÂà¡ÒÂàÖÞÂ`ÚÓÂÀÖÑ ÛÂsÒÂ@3Í€·ÑÂyÑÂà*ÑÂà¹ÎÂ`øÎÂÀÄÔÂ`ÎÕÂÀ¸ÖÂÀÐÒÂÀeÏÂà¿Í€4ÒÂ` ÌÂÀâÏ pÕÂЀ"ÕÂ@ÂÊÂ7ÜÂà`ÈÂà­ÐÂ`QÕ€“×ÂàÝÈ Ѐ“×Âà<ÎÂ…Ï€ØÂ PРÁÒÂ`¼ØÂàÔÂ ÛØÂ[ÖÂà0РVÏÂ`3ÚÂ`9Ù€@Р€È€±Ò ©ÖÂ@’Ò PР2ÕÂ@žÐÂ@’Ò ˆÑ—Ì #ÍÂÀ‰É ÏÂÀšÛ íÕÂ@hÙ€@РÍÐÂÀ/ØÂ€½ÐÂyÑÂðÒÂÀAÕ€ÉΠ”ÏÂÀdä ÍÐÂàÅÌ &×Â[Ö ÙΠØÂüÐÂàÕÂàãÇÂ@Ñ óÔÂ@¤ÏÂàHÌ ‹ÛÂIÙ DÒÂÀkÎÂöÑÂ@’ÒÂ@ÙÛ LÛ€XÌ€·Ñ ‘ÚÂà›ÓÂÀˆÞÂàÕÂmÓÂðÒÂ`’߀×Â`ÎÕ ÍÐÂ@ýÕÂ`“ÊÂ@t×Âà‰Ö€½ÐÂ@'Ï 5Ê ØÂ@Ñ åÌÂ@ßÚ )ÌÂ7ÜÂà<΀·ÑÂ@Ó —ÙÂÀ;Ö pÕÂà0Р»Ó #ÍÂà³Ï ^ØÂ`¤Ü jÖÂ@\ÛÂ`¤ÜÂ@ýÕ€ÖÂ`Â×€(ÔÂ`àÒÂ`Œà€4ÒÂà`È€oÝÂÀ¾ÕÂÀ‚ß óÔ Ÿâ€¥ÔÂÀGÔ ÏÚ€{ÛÂ`ÔÔ  Í¨Þ€“×Âà$Ò ùÓÂ@ñ×Â`˜ÞÂà Ö äáÂàôÙÂêÓ ÜÂà§ÑÂgÔÂ`æÑ çÖÂÀˆÞÂà¡Ò€uÜÂ`QÕÂ@¤ÏÂà¡ÒÂIÙÂàÕÂà­Ð 2ÕÂàwÙÂ`°Ú€LÎÂÒ×Â@\ÛÂ`QÕÂ`þÍ ,Ö ßÍÂà*ÑÂ`ÚÓÂàƒ×Âà­ÐÂÀÖÑÂÀ¦ÙÂÀ¾Õ€òÜÂàwÙÂà‰ÖÂ@ñ×Â@°ÍÂ`ÔÔÂà•ÔÂ@hÙ€.Ó ðßÂ+ÞÂ@&äÂ@Õ vÔÂ`÷ãÂàSßÂà Ö ÃÜÂÀ²× d×ÂmÓ íÕÂ@ëØÂà}ØÂ€ØÂ€øÛÂ`¶ÙÂÀ Ú vÔ æë€‡Ù ÕÙÂàÕÂ@¤ÏÂÏ íÕÂOØÂgÔ€ØÂà_ÝÂàâÜ ©ÖÂà²äÂ@ÕÂ@†ÔÂ@ýÕÂà³Ï€½ÐÂØÖÂà_ÝÂÀ”ÜÂOØÂ€·ÑÂà¿Í 8ÔÂ`]ÓÂÀ#ÚÂ@’Ò ,ÖÂÀÈÂ@’ÒÂÀAÕ gáÂáÂ@ÙÛ€ ÙÂØÖ€øÛ€ìÝÂÀÛ :ÞÂaÕ ÛÂ@bÚ JÑ€"Õ :ÞÂÀváÂ@hÙÂ=ÛÂ`˜Þ€òÜÂ`°ÚÂ`Â׺ÛÂ`˜ÞÂà¹Î ÜÂÀ/ØÂ€Ú "âÂ@€ÕÂ`¤ÜÂÀÝÂà×ÂOØÂà¿ÍÂÀ5×Â`ëå 4ßÂ@ñ×Â`'ÜÂÀÜÂðÒ màÂIÙÂÀ¬ØÂ@†Ô :ÞÂÀ¾ÕÂÀÖÑÂ@PÝ€àßÂØÖÂ`3ÚÂÀ²×€¥ÔÂÀ¸ÖÂCÚÂ`àÂÀSÒÂðÒÂÀèÎÂàÓÂ`¤Ü€·ÑÂÀAÕ ÇÑÂàÕÂàôÙ RÚ Ï #ÍÂÀSÒÂ`(ÇÂ`Â×ÂàôÙÂÀGÔ LÛÂ`E×Â@\ÛÂ`ìÐÂÀÐÒ…ϋ΀ŸÕÂ@µáÂðÒ ØÂ@Ó ÇÑÂà¿Í RÚ€ ÙÂ`Â×Â`QÕ€òÜ ÁÒ màÂÀÜÐÂ@ªÎÂêÓÂà§Ñ ùÓ€™ÖÂ@°ÍÂ`ÎÕÂyÑ »Ó (á ÍÐÂàÕÂàôÙÂ`?ØÂ`?ØÂ@nØÂÀ5×Â`Ë€(Ô€.ÓÂ`9ÙÂÀ/ØÂ@ÙÛÂ@ÑÂàSßÂÀÝÂ[Ö ¦ÌÂ`¼ØÂ ÓÏ€·ÑÂÏÂÌÂ@¼Ë /ËÂÐÂÍ€×Â@€Õ )ÌÂÀ¸Ö 2ÕÂà×É€ÉÎÂmÓ ¯ÕÂÀ¬ØÂ ÍР Ñ ”ÏÂàTÊÂ@zÖÂàîÚÂÀÜÂÀ#ÚÂ`Â×Â7Ü šÎ€þÚÂ`ÚÓÂ@!ÐÂÀeÏ 8Ô€ŸÕÂU× ØÂ ŽÐÂ@3ÍÂ@-Π,ÖÂ…Ï€·ÑÂ@†Ô€ØÂ`]ÓÂ@åÙÂ`‡Ì &×Â`WÔÂ@hÙÂ@¼ËÂêÓ®ÝÂöÑÂ`ÈÖÂ@Ó€«ÓÂÀSÒ DÒÂ@ÒÂà6ÏÂàÕÂÀÜÂ@nØÂ@>à d×Âà ÖÂàÕÂ`þÍ€·ÑÂÀôÌÂàúØÂIÙ€FÏÂêÓ tÊÂ@’Ò€.Ó€ìÝÂ`9Ù  Í ÏÚ zÉ€@ÐÂÀeÏ |ÓÂ@Ò Ü íÕÂ`KÖÂÒ× FÜÂà_ÝÂàÓ€dÊÂÀMÓÂÀè΀FÏ ©ÖÂà§Ñ€@ÐÂà$Ò€FÏÂÀ¦Ù€ÃÏ€Ö åÂOØÂ`]Ó óÔÂ`òÏÂÀGÔÂà}ØÂ@ŒÓÂ@ýÕÂàØÂÀ_ÐÂàÕ€.Ó ØÂàúØÂà ÖÂ`-Û€iÞÂ@hÙÂЀ«ÓÂ@ñ×Âà³ÏÂà×Â@\Û€™ÖÂ`â ¯ÕÂ`oÐÂàÑÊ€(Ԡܠ݀à߀iÞÂàÕ€oÝÂ@ŒÓÂsÒÂÞÕ óÔ ÏÂ`™ÉÂà_Ý€ªè Ú Ü &×Â`!ÝÂà`È ,Ö 8ÔÂIÙÂ[ÖÂ@JÞÂÀ)ÙÂCÚÂàSßÂ`'Ü‹ÎÂÀƒÊ vÔÂà*Ñ€.Ó RÚÂØÖÂÀ¸ÖÂêÓÂ@ÕÂ`†á çÖ ©ÖÂ`¤ÜÂà_Ý€ÈãÂ@hÙÂIÙÂ@JÞÂàSß çÂ`!Ý ™ãÂà¸ãÂÀíâÂÀšÛÂ`à€Ú :ÞÂ`täÂÀ²×Â`3ÚÂàØÂà}ØÂ`žÝ «àÂàØÂÀ#Ú ±ßÂ ÆæÂ`t䀨ÂÀ”ÜÂÀßÂ@8á FܨހòÜÂ`QÕ d×ÂàÊà ºèÂ`ªÛÂÀ^åÂ`ÞÂà°Ã[RÃ@'Oà ÓOÃp=JÃ0¹EÃpgCÃ@{AÃÀÑ=Ãà@Ã`í;Ãp¯7Ãðj8à$8ê0Ã012À0Ã@d0Ã0Æ.Ãð/-à¿3Ãð²,ÃÔ-à Ÿ.Ãpz+Ãà-ÃÀö"ÃPÁ'Ãðè#Ãà&(ÃpŒ(Ã`}$ÃÐ$ÀÑ#Ã0‘"à%Ã0£ÃÀO)Ã`ô%Ã7$à à7 ÀN$àOà v ÀÝ!ÃÀä%Ãà©'Ã0…$ÃðÃ@ÐÃ0"Ã@A!ëÃp? ÀðùÃÀÀ„ÃÀ‹ÃLÀïÃ0Pà /ÃðÃ4Ã`§ÃpòÃÀ>Ã``à 5Ãà9Ã@¡ÃÏÃ@Ãð³ð”ÃÀµà àäÃà¤ÃÐwÃÀhÃ0åÃpìÃÐkÃpÃùãÃÐð ÃðÅÃðãÃ0€ÃPÔàöàÃp“ÃíÃ>Ã\ ÃàÔ Ã`éÂà è ÃPi Ã0Ã0†Ã`„à© Ã ðÄà Ã@¹ ðGÃ°Ü Ãp@ Ãvà> ÃÀ÷ Ã) Ã@Ë ÃP]ÃP{ Ã0’ ÃùÃÐ$ ÃÀý Ã°Ö Ã`% ÃÀ˜Ã` ÃPø ÃPŸÃ0’ ÃhÃà{ÃPu ÃPŸð ÀyàåÃGÃàðqÃ@éàåÃP¥à  Ãг ÀþàJÃÐÃð%Ã`[ÃpvÃÀ-ÃPÃPÀÃà‡ÃeþÂèÃàþÃpóÃPÃpF ÃAÃÀEÃ0àÃ`ÆÃ0]Ã`[ÃtÃ@éÃpçàhÃÀÂÃð1ÃP"ÃÀ¼Ã`Ià ËúÂ@~ÿÂ@À ÿÂ@rÃ`UþÂqüÂp^Ã@~Ã}ú€Áù€©ýÂ@xÃÀKÃÀ?þÃ@ Ã@–ûÂð¨Ãà™Ã bàëà÷Ã`÷ÂðºÃ@~ÿ ùÂ`ðùÂÀôÂÀôÂÐÀDùÂtà!÷°›Ã@~ÃpÿÀÓöÂÀÈàù ñÂàÿÂÀòö€&þ€ëòÂ÷ÂÀo÷€hó ñÃ@ŠýÂÃp|À,ýÂ`gû€ ÿÂ_ÿÂ’ÃÀÚúÂ`…öÂ`…ö hÃÀiøÂàÃö lõÂ`äûÂpóàñÃ÷Â`ðù€†î€ßô tÃÀiøÂèà rô Ý÷Âpÿà Nú°$ÃÀiøÂ`ðùÂÀ]úÂ@ûÂ`ô xóÂÀòÂÀòöÂÀàùÂ`—óÂÀòÂÀ]úÂ@¨øÂÀàù €ü€8ûÂ6ñÂÀðÂÀuö î õó ñÂ@‹èÂÀ™ðÂÀþô ªõÂ@%ù€åó€†îÂÀòÂ@üÂ@%ùÂ@Þï xóÂÜÿÂÀŸï –îÂ`Çë ¶óÂ`£ñ ªõÂkÀÍ÷ÂÀ]úÂ`÷Â0àà-õ –îÂ`£ñÂ`µîÂàjð !÷€VöÂÀòÂ@ê퀀ïÂ6ñ€¯üÂ@êíÂNíÂkýÂà±ùÂÀcùÂà|í€ññÂ`÷Â`…öÂðÀÀªèÂà‚ì Èð ¶óÂwûÂÀKÃ`Þü€Í÷€Dù xó ž÷€¯ü Œú€ë 1êÂBïÂ@äî€ßôÂ}úÂÀ óÂà«úÂ`ò€÷ð -õ ¤öÂÅî òÂ@Þï iëÂ`JëÂ`êúÂàˆë€¤éÂ@ºõÂ`ÁìÂÀ ó –îÂ`¯ïÂ}ú€¤éÂ@sìÂ@yë Cç ¢ìÂÀ^åÂ`µîÂ`ó€÷ð€bô€hóÂ÷ÂÀuöÂ`gû€÷ðÂÀ“ñ 1ꀒì !÷Â@OòÂ@7ö rôÂÀ@êÂBï€hóÂà:øÂlèÂ@¢ùÂÀ«íÂÀíâÂ`÷ã –î€åóÂÀ óÂ`2ï€P÷Âà:øÂ€hóÂ`¯ï€nòÂàRôÂ@äîÂàRôÂ@®÷ –îÂ`Íê¿ïÂà^ò !÷ÂÀKý¿ïÂ@êíÂ@ê [ãÂÀáäÂàùíÂÀò€¶æÂàÕóÂ`ó ZøÂ`8îÂ@ÀôÂ@+øÂ*óÂ@Øð ŒúÂÀàù€,ýÂÀ(îÂ@sìÂ@´ö 3ôÂ`¯ïÂ ÆæÂ@ê NúÂÀàùÂÀ{õÂÀ:ëÂÅîÂà(ûÂ@ÌòÂP.ÃàÏô rô€ëòÂÀÔûÂ@Oò³ñÂ@7öÂ`£ñÂ`¯ï ï€Í÷¡ôÂà¥ûÂÀ"ï QïÂèýÂÀEþÂôûÂ`öøÂÀôÂ@¨øÂ÷Âà«úÂà™ýÂÀuöÂ@aïÂàáñÂà¥ûÂ@ûÂàÛò ZøÂÀþô€nòÂ`>íÂ`ó€ëÂ@£äÂ@ÌòÂ@ŠýÂàÕó ÎïÂ`8îÂ@úÂàXóÂà‚ìÂôûÂ@sì ïô€ßô TùÂ`Uà-õ€ÿÂà½÷ÂàìÂÀuöÂÀñÂ@ÌòÂàpïÂ@%ùÂ` ò€¼å€\õ€†î€EäÂ` Ì ¿üÂÀñ§óÂ`DìÂ@+øÂà|í€÷ðÂÀLè€ý䀶æÂ ž÷ÂHîÂ@ú Øã cìÂå€ îÂÀ¥îÂ@é ºèÂÀÛåÂ@—æÂ@çÂ`¯ï€ìÂÀ.í ïÂÀ½ê€Ôá€9æÂ`tä ûòÂàÿìÂ@—æÂ€ýïÂ@äê äÂ@‘ç Òä iëÂ`nåÂà#çÂ@ðìÂÀ”Ü ŸâÂàÛòÂ@…é ?òÂ`ß瀆îÂ`ÁìÂrçŠã :Þ ãÂàèÂàêÂÀ«í å„äÂ@êíÂÀ‚ß³ñÂ@PÝ øèÂ`Þ üÝ€ÎâÂàMà äÂÀFéÂ`ýâ þçÂ`ÙèÂ`åæÂ´ÜÂ`ÞÂ@ê퀤é 4ß åÂféÂÀpâ òéÂ@£äÂàkÛ ¢ìÂ`àÂÀjãÂáÂ@üêÂ`€âÂàùíÂàšè =è  æÂ€?åÂ@êíÂÀvá (áÂ@PÝÂÀÝÂ@Øð sß ÌåÂÀjãÂàôÙ (á [ã€ì çÂ@ÍÝÂ@ÒñÂàAâÂ ÆæÂ IæÂ€!êÂTìÂ`Óé :Þ FÜÂàkÛ iëÂ`ëå®ÝÂÀß ØãÂ@…éÂÀ|àÂ`ÓéÂÀ/ØÂ€c߀oÝ Wî€'éÂ@©ãÂÀ|à ºè IæÂ øèÂ`ÇëÂ`Óé @ÝÂ`žÝÂàÊà€ëÂåÂ`VéÂ`’ßœà€KãÂàÊàÂ@èÂÀFéÂ@ ÔÂ@>àÂÀ@êÂ@ åÂ`hæÂ7Ü 7éÂ@8á à쀀ïÂ`Pê “ä OåÂ`täÂCÚ€KãÂÀ ÞÂà¸ãÂÀXæÂ@ÇÞÂÀ4ì€tñÂ@ÇÞÂ`÷ãÂ@yëÂ@…éÂÀ{õÂÀÃ逰çÂ@‹èÂÀÉè€ÈãÂÀ‚ßÂ@êÂà¸ãÂà#ç€-èÂûåÂ@çÂÀçãÂÀ”Ü ÒäÂ@,ãÂÀXæÂ€¤é Úí åÂ@öëÂàÿì€Ôá WîÂ`Íê€ýïÂÀpâ ™ãÂÀ«íÂÀóáÂÀjã€íÂ@JÞ £×Â@£äÂ`Dì ìêÂ`bçÂà¸ãÂ`ýâÂ`nåÂ`’ßÂàÂ@£ä€ªèÂÀFéÂ@µá üÝÂ@PÝ€?å ]í€Eä ÌåÂÀùà :ÞÂàAâ êàÂ@PÝÂ`!Ý€òÜÂ@ å€KãÂ`bç€iÞÂãé€Eä @ÝÂ`ëåÂä„ä ½ÝÂÀçãÂ@ åÂàkÛÂàAâ a․éÂàAâ€ïÂÀÚÂàÖÞ€Îâ®ÝÂáÂÀ‚ߊ〰ç íÕÂ@ åÂxæÂõæÂ@å Ÿâ ™ã€]àÂà;ãÂ@ëØÂ`˜ÞÂ`VéÂÀ Þ sßÂ@\ÛÂàeÜÂ1ÝÂ@£äÂ`ýâÂàÖÞÂ`ÇëÂàúØÂÀpâÂ@8áÂàYÞÂ@ÇÞÂàêÂÀ5×ÂCÚ€?å ÀçÂà¸ã€iÞÂ@PÝ 7é @ÝÂÀ/ØÂ€9æÂ ŸâÂ`nåÂ@t×€uÜÂ`¤Ü ÉÛ IæÂ@>àÂÀóá Àç Øã€æÞÂU×ÂÀváÂ`WÔÂÀŽÝÂÀùàÂÀÿ߀9æÂ€Eä€þÚ “äÂ`!ÝÂ%ßÂÀŽÝÂÀ½ê„ä ·Þ (áÂÀ|à FÜ€ Ù yÞÂáÂÀFéÂ@>àÂ@ßÚ jÖ üÝ€ÔáÂàÄáÂÀšÛÂÀ5×Â`àÂÀšÛÂ`¤ÜÂ`æÑÂ`à êà€-èÂ`˜ÞÂ=ÛÂ`ÞÂÀùà ØÂà•ÔÂ`ªÛÂ=ÛÂàÕ Ú€3çÂ@JÞÂÀ‚ßÂÀRçÂÀšÛ€ØÂ1ÝÂ@zÖÂÀ;Ö sßÂÀÊÓÂà­ÐÂ`!ÝÂ@ÓÂâÂ%ßÂâÂàÖÞ "âÂ`3Ú 7é uéÂÀpâ 4ß üÝÂÀ Ú …Ü ÏÚÂÀváÂ@VÜÂ`-ÛÂ`ÞÂ@æÂ —ٖᠱߠ7é€{Û uéÂ%߀ØÂ`¶ÙÂ7Ü óÔÂà›Ó€@ЀÚÂ`¤ÜÂâ€Èã€ÚàÂÀpâ€?å (á sßÂÀÜÂ@DßÂÀ‚ßÂàâÜÂ`žÝ€oÝ ØÂ màÂ`àÂÀ¥îÂ@©ãÂ`ýâÂ`°Ú ÉÛÂ@2â "â¨Þ€QâÂÀÝÂ@VÜÂáÂÞÕÂ`3ÚÂ@Áß  æÂà¦æÂà‚ì€iÞÂðÒÂà/å€WáÂÀŽÝÂ@&äÂÀvá åÂâÂÞÕÂ@VÜ€(ÔÂ@\ÛÂÀÿß d× OåÂÅîÂ@,ãÂàèÛÂà}ØÂ`€â€Îâ ´é yÞÂ`täÂ`iÑÂÌØÂàS߀QâÂ@2âÂÀD–Â÷À€œ—Á€®Á€A»Á€q³ÁûåÁÀEÂBïÁ€ÂâÂ@ÖÂ@ &€Ë$€¿&Â@š'€ã  :ÂÀê$Â@ &Â@øAÂ@™<Âå?€šAÂ@";ÂN€™VÂ2HÂ8GÂ@V\„dÂ@SÂ6qÂ@…i€Ôa€÷pÂÀdd€æ^ÂÀ±lÂ@jÂÀpÂ@—fÂè€Â€Îb‰xÂÀ‡s€lÂ@û‚ <€Â@{ÂÀÚz€VvÂãi€ÔaÂÀ°„Â@щÂ@û V†Â•v ­‚€>zÂà„ âŽÂÀýŒÂÀz€ñq€‘„ w‹Â²‰ÂàÚŠÂàÈÂ@NŠÂ@•“Âà˜•Â@–€I€C‘ ©ÂÀzÂ_‚ÂÀß‘Â^—Â@NŠÂ ŒÂÀhÂÕ˜Â:Â@›’Â`r‘ÂàŒ—ÂÀ&›Â`³›Â`é’ m— ޙÂàŒ—Â@ƒ– ēÂà˜•ÂÀb‘Âà—  ›ÂàßžÂ`~Â@w˜Â€™Â U›Âàñ›Â€™Â Â@Ö [šÂ€¨•Â`Ü©ÂÀU¨Â¥ ÂX˜ÂÀ Âà÷šÂ`¡žÂ@5£Â`¡žÂ v ÂÀ—ÂÀ¡Â`YªÂÀU¨Â€`¡Â@;¢Â™¢Â@ÊŸÂÀü¡Â j¢Â@”¨Â.ŸÂàÍ¡Â@¸¢Â`֪ եÂ`Ü©ÂÀg¥ÂÀ¨¯Â ½©Âà8¥ÂÀa¦ÂÀ… Â ¥Â@Ž©Â œ¤ÂÀº¬Âà©§Â@ó­Âì©ÂÀ‹ŸÂ€×¢Â-´Â@‚«ÂÀº¬Â€§ªÂÀ¨¯ÂÚ¬Â@p®Â@«ÂÀO©ÂÀ[§ÂÀ³Âà­Âà«Â@v­Â 4«Â@^±ÂÀ²Â@p®Â€±Â N±ÂÀÌ©Âþ¦Âà©Â€®Â $¸Â „¨Â þ³Âູ€è´Â€Ð¸Â û©Â€î³ÂÀZ¼Â¶²Â ~©Â 6µÂÇÄÂÀ¶Â@ɴ ú¾Âູ€è´Â†ºÂày¯Â@ɴ N±Â†ºÂ@v­Â 0¶ÂÀé¹Â F¨ÂÀ³Â@FµÂ`^¾Â H²Â@í®Â@··ÂÀÝ»Âà̶ xªÂ€S¸Â@.¹Â€ÄºÂ 3ÀÂ`RÀÂÀ~¶Â  ¼ÂàØ´Â€H¥ÂÀ1®Â`”µÂÀx·ÂÀ¶ÂÀ¨¯Â ýÈÂÀ1®ÂÀ„µÂÀãºÂ ¿³Â@(ºÂ }¾Â Ú¹Âñ½Â@™¼Â@ÎÈ€M¹Â ˜ÄÂ@“½ÂÀr¸ÂÀT½Â -ÁÂ@þÀÂ@(ºÂ€”€ ÀÂà%½Â€|ÆÂ`@ÃÂàrÅ ˜ÄÂàûà¶¿Â-´Âà7ºÂ`X¿Â ]¹Â@¼ÂàÀÂÀ`»Â€#ÀÂà¿Â ¾Â`«ÆÂ@iÄÂÀ6ÂÂPàeÂÂÀT½ÂÏ ¼¾Â ßÍÂÀƒÊ€ùÆÂ@ªÎÂÀN¾ÂÀËÂJÄ ÐÂÀ˾Â@øÁÂ@ìÃÂÀBÀÂ`4ÅÂ@ÎÈÂüÐÂêÓÂÀ§Ä E½Â‹Î€ÂÂÀ›ÆÂ Ë MÆÂ€²½Â€ŽÃÂ@ÎÈ€ˆÄÂÀÝ»Â`ÉÁ ¬ËÂ@þÀ w¿Â K¼Â@ÀÂà6ÏÂ@iÄÂÀ¹ÁÂÀ¹ÁÂÀ­Ã â ÄÂV bÍ€vÇ ¾È -ÁÂ@¼Â`uÏÂ2ÈÂJÄ †Ç tÊ ÇÂðÒÂt½Â@½Â ˜ÄÂ`Û¾Â@þÀ Ä€”ÂÂÀÇ žÃÂ`X¿Â€¬¾Â`óºÂ ÅÂÀ­ÃÂ@oàèÁÂÀ›ÆÂ€jÉ ›¹Â਼Â@àÅ€ÉÎÂÀ¡ÅÂàÀ žÃ©É #ÍÂ`iÑÂ`½ÃÂÀ0ÃÂ`X¿Â@™¼Â ”ÏÂ`þÍÂÀÊÂÀH¿Â@-ÎÂÀîÍ šÎ kÁ ¼¾ÂÀ›ÆÂ@¼ËÂÀ$Å /Ë ²ÊÂ`·ÄÂ@æÄ GÇ •ºÂ  ¼Â`“ʠĀRÍÂÀÆÂ YÄ€ À£ÊÂÀqÍ€XÌ tÊ€vÇ hÌ ÐÅ ]¹Â !ÃÂÀw̵ÇÂÀ ÉÂà6Ï€ùÆÂ@-ÎÂ`ÍÂÀÆÂ€ÂÂàÀ€»ÆÂ ¤Â€”€FÏÂÀkÎÂbÀÂà~ÃÂ`æÑ ŒÆÂ âÂÂ`ÃÂÂàŠÁÂ`(ÇÂbÀÂ@iÄÂ` ÌÂ,ÉÂ@EÊ AÈÂÀ•ÇÂ`¥ÇÂÁÅÂ@iÄÂÀ*ÄÂÀ•ÇÂ`Û¾ÂÀÆÂ€áÊÂ`"ÈÂDÅÂ8ÇÂ@-ÎÂ@ªÎ ñÊ ÅÂÀݻ \ÎÂ@æÄ€íÈÂÙÁÂ`"ÈÂÀ¡ÅÂ` ÌÂ@WÇÂ`¥ÇÂÀBÀ ¤ÂÂÀ¡ÅÂ`ìРÇÂ@ÈÉÂÀËÂà­ÐÂÐÂÀÜÐÂ@ÀÂÀYѩɠ)ÌÂÀÇÂÀqÍ ¦ÌÂ@t×Â`±ÅÂÀ$ÅÂ@ªÎ€;¼Â _ÃÂàõÄÂ@ìÃÂÌÂ@]ÆÂ ÇÑÂ@¼Ë€çÉÂ@æÄÂ@ÈÉÂÀ}ËÂ`iÑÂ@°ÍÂ@¼Ë ªÁ€” ȼÂàTÊ ýÈÂàÝÈÂ@°ÍÂ@QÈÂÀSÒÂÀÇÂà„ d×Â`Í€íÈ bÍ nËÂ`ËÂà¹Î vÔ€FÏÂ`¥Ç !ÃÂàxÄÂÀƒÊÂÀƒÊ ¦Ì °ÀÂ`oРÒ€4ÒÂ`þÍÂ@9Ì žÃ€áÊÂ`ÍÂà¹ÎÂ@ÚÆÂÀÈÂà×ÉÂàÀLÎÂà`ÈÂÀ0À|ÆÂ€±ÒÂÇÄ ˜Ä ýÈÂ`ËÂÀËÂàHÌ©ÉÂ@¼Ë ²ÊÂöÑ  ÑÂDÅÂ\ÁÂ@cÅÂ`QÕ€”ÂÂÀ}ËÂöÑ ÜÃÂàTÊ ¸É€ÛË hÌ РßÍ ‚Ò #ÍÂÀÖÑÂÀÈ ’ÅÂ@Õ€«ÓÂÀËÂ`(ÇÂ@¤ÏÂ`ìÐÂ@Ñ hÌÂÀwÌ€óÇÂ`™É€LÎÂ@ÔÇ ÐÂ`Â×ÂmÓÂ`ÍÂ`WÔÂ@°Í£Ê ÆÂ >ÓÂ@WÇÂÀ‰ÉÂ`ËÂÀ}Ë€|ÆÂ€ÛËÂà¡Ò zÉÂ@€ÕÂ@{ÁÂ`uÏ ¬ËÂÀ}ËÂ`Í€|ÆÂ šÎÂÀ$ÅÂàTÊÂ@ÈÉ †ÇÂà§Ñ GÇÂ@ÚÆÂ kÁÂ@ò ΀pÈÂÀÈÂ@ÚÆÂ`oÐÂÀ²×Â&ÊÂÀqÍ ¯ÕÂ`WÔÂàÑÊÂàÑÊ DÒÂàãÇ€LÎÂàHÌ ¾ÈÂÀ}ËÂ`"È€(ÔÂ@Õ ϵǠýÈÂ`{ÎÂà‰Ö—Ì€ÕÌÂà¡Ò €ÈÂ`4ÅÂÀeÏ ßÍÂ@ŒÓÂ@’Ò ÎÂ@°Í€«Ó JÑÂà¿ÍÂàãÇÂ@PÝ€ÖÂIÙÂ`“Ê€ÕÌ€‡ÙÂà ÖÂÀwÌÂ`?ØÂ 2ÕÂaÕ€^Ë»ÆÂ PÐÂà­Ð€RÍÂà‰Ö ÕÙÂÀÚÂ@Õ€·Ñ šÎÂ@3ÍÂàéÆÂàƒ× #ÍÂ@†ÔÂàZÉÂ`þÍÂàÅÌÂt½Â GÇÂÀÈÂÍÃÂÀâÏÂÀGÔÂ`øÎÂàûÃÂàNËÂÀ‰É AÈÂ@EÊÂ`.ÆÂ@ÎÈÂJÄ ¦ÌÂ@-ÎÂ@’Ò bÍÂ@3Í€vÇÂ@EÊ ÙÎÂÀ}Ë€·ÑÂà³ÏÂ@?Ë€RÍ€4ÒÂÀ¡ÅÂ@€ÕÂ@÷ÖÂÐÂÙÁÂ@àÅÂà`ÈÂÁÅÂÍÃÂÀÊ€½ÐÂüР Í ÐÂ`Í ÷É€5½Â ÊÆÂ \΀|ÆÂ`™É€Å \ÎÂàÓÂ@ÂÊÂÀ}Ë Π)ÌÂÀÈÂÀSÒ»ÆÂ ÄÇÂ@iÄÂà­Ð ¬Ë€¥Ô€RÍ€ØÂ >Ó€pÈÂ@°Í€¥ÔÂ`àÒÂ@°ÍÂàTÊÂÀGÔÂ`cÒÂ` ÌÂàTÊ /ËÂÀƒÊÂ=ÛÂðÒÂ@¶ÌÂ`±Å€ÛË€ÏÍÂ`ÊÂÀ É hÌÂàûÃÂà6Ï 5Ê€«ÓÂÀè΀A»ÂÀqÍÂ`Ë nËÂà¿Í ùÓ ÏÂ@EÊÂ`4ÅÂÀ˾ ÁÒ ²Ê ÎÂ`QÕ—Ì€·ÑÂ`WÔÂyÑ VÏ PÐÂÀšÛÂÀ¡Å»ÆÂà¿Í ßÍ Ï Ë #ÍÂ@3ÍÂÀ_РÙÎÂÀ$ŵǠ”Ï eÂÂÀ­ÃÂÀ_ÐÂ`-ÛÂ`àÒ€vÇÂàZÉÂÀ›ÆÂ ¸ÉÂ,ÉÂÀÜÐÂ`cÒÂàZÉÂ`ÍÂ@ÈÉÂ`ŸÈÂÀ_ÐÂ@]ÆÂ‹ÎÂРzÉ JѠȀ4ÒÂ`ÍÂàƒ× MÆÂ@3Í >ÓÂÀÐÒÂ`ÊÂ`oÐÂ@àÅ €ÈÂàBÍÂà*ÑÂË 5Ê€XÌÂ@ÓÂ`ŸÈÂàÂÂàÓÂÀ¡Å âÂÂÀ²×€:Ñ ÜàýÈ SÅÂà³Ï 5ÊÂ@¼Ë È ÜÃÂàËËÂ@ªÎÂ`:ÄÂà`ÈÂ`þÍ—Ì ñÊÂ@iÄÂ@À ËÂà§ÑÂÀ§Ä Ä  Í ÁÒ€²½Â tÊ ’ÅÂÌÂ@þÀ€óÇÂ`½ÃÂ@ ¿Â€ÏÍ€·Ñ /Ë€|ÆÂ€LÎÂà³ÏÂn¾Â`‡ÌÂà¿ÍÂ`þÍ€ÂÂ@QÈÂ@QÈÂ…ÏÂ`F zÉÂàÝÈÂÀÊ ¦ÌÂàËË AÈÂ2È»ÆÂ \΀çÉÂÌÂ@æÄÂàÅÌ€íÈÂ`àÒÂÀÐÒ ¬Ë VÏÂàËË€íȯÈÂ@EÊÂÇÄÂ2ÈÂ=Û hÌ€^ËÂÀúËÂ`{ÎÂ@WÇ€FÏÂsÒÂ`ÚÓ îÀ ô¿Â`ËÂsÒÂ`Ê€çÉ€çÉÂmÓÂàxÄ€ŽÃÂ@ÓÂà*Ñ€LÎÂÀ}ËÂ`ªÛÂà0ÐÂÁÅÂÀÐÒÂÀ6€ÿÅ€RÍ€:Ñ ÙΠ¦ÌÂ@¼Ë  ÑÂÀ_РÙÎÂÍÂàNË€«ÓÂ`.ÆÂÀ$ÅÂàïÅ€¥ÔÂ@¼Ë hÌÂÀAÕÂÀSҀŀFÏÂØÖÂ`¼ØÂÏÂÀôÌÂ`"ÈÂ`KÖÂ@¶ÌÂÀèÎÂà}ØÂ@VÜ€ˆÄÂà³Ï‘ÍÂ@¤Ï Ѐ× |Ó€FÏÂ`àÒÂöÑ€ÏÍÂðÒÂðÒÂêÓÂ@iÄÂ@ñ× ØÂàØÂ ÏÂÀÐÒÂÀ”Ü |ÓÂ`]ÓÂÀAÕÂ`Ë€4ÒÂ@¶Ì€‡Ù d× á×Â`uÏ ©ÖÂ@8áÂÀÄÔ ‚Ò€(ÔÂà¡Ò ΠÿÒ€±ÒÂ`àÒÂmÓÂ`iÑÂ`Ê Ò£ÊÂÀÛ€:ÑÂ`E×€øÛÂ…ÏÂàÜÝ€.ÓÂ`Â× Ò nË íÕÂÀÜÐÂ@ÈÉÂÀGÔ ”ÏÂ`KÖÂÀÜЀ{ÛÂ`WÔÂ`9Ù€ÃÏ€(ÔÂÀ/ØÂsÒÂ`€â€WáÂäÔÂ@EÊÂ>ÆÂ@zÖÂÀ²× ÍРÁÒ‹ÎÂ`¼ØÂ@÷Ö &×Â,É€.ÓÂgÔÂàËËÂà³ÏÂ@ÑÂ`ìÐÂ@ñ×ÂÀèÎÂ@Õ ßÍÂ`{ÎÂÏ ŒÆÂ ¦Ì ßÍ ÐÂÀÜÐÂÀ•ÇÂÀÖÑÂ`Ë íÕÂäÔ€dÊÂÀÖÑÂÀ#ÚÂàÊàÂà*ÑÂ`æÑ VÏ bÍ GÇÂà<ΠÎÂ`iÑ‹ÎÂÀâÏ€ÃÏÂÀ§ÄÂ`ìР©Ö ÇÑÂ@æÄÂ`oÐÂ`iÑÂ`ìÐÂ@˜ÑÂ@°Í ŽÐÂ`4ÅÂà­ÐÂüР>ÓÂ`òÏ€vÇÂ`ÍÂPàAȵǠŽÐÂ`Â×Â`™É zÉ€¥ÔÂà¿ÍÂàÅÌÂÀ;ÖÂ@¼ËÂà$ÒÂ&Ê 2ÕÂ@°ÍÂ` ÌÂÀúËÂDÅ ÖÄÂ`"ÈÂ`ÍÂ`ÎÕÂÀîÍÂà­ÐÂÏÂ@3Í nË€¥Ô€@ÐÂ@ ÔÂ`“Ê ÍЀ:ÑÂΠ5ÊÂ@ÂÊ€dÊÂà0ÐÂà~à\ÎÂà6Ï ÙÎÂ@bÚÂ@žÐÂàZÉ€LΠ€ÈÂ@ÑÂ΀.Ó 8Ô /ËÂ@àÅÂ`Ë )ÌÂ` ÌÂðÒÂÀk΀íÈ€ŸÕ  ÑÂÀwÌÂðÒ€×Â`3ÚÂËÂöÑÂàNËÂÀ*ÄÂÏÂàËË SÅÂbÀÂÀúËÂ@¤ÏÂ…ÏÂàÝÈÂ@àÅÂ`ìÐÂà›ÓÂ…Ï€ÕÌ€vÇ ¦Ì ¬ËÂà0ÐÂà¿ÍÂà›Ó »ÓÂ`F€·Ñ€½Ð€óÇ ØÂ@æÄÂ`æÑÂà³ÏÂ`ËÂ`ÍÂ`™É Р²ÊÂ@-΀ÛËÂ@ò †Ç€·Ñ ¦ÌÂÀYÑÂ`òÏÂà¿ÍÂ@¶Ì€RÍ€ÃÂÀúËÂÐÂ`ÉÂ`{Π€ÈÂà×É€ÂÂ@€ÕÂ`ÎÕÂÀYÑÂ ÊÆÂ€:Ñ ÆÂ`4Å ÏÂ@cÅÂËÂüÐÂÀâÏÂà<΀ÃÏ )Ì€.Ó€4ÒÂ@EÊ !ÃÂÀÇÂà¡ÒÂРЀìÝ šÎ£Ê hÌÂ@'Ï ˆÑÂÀeÏ !ÃÂ`ìР2Õ ‚Ò bÍÂÀ‰ÉÂÀôÌÂÐÂ`Â×ÂàŠÁÂPÀ^ËÂPÃÂVÂÂ@ÈÉÂ8ÇÂ@ŒÓÂ`ÍÂ@9ÌÂÀ‰ÉÂ@cÅÂÀèΠšÎ eÂÂÀÐÒÂ@øÁ ¸É vÔÂÐÂ`àÒÂ@-ÎÂ@-λÆÂà¡ÒÂà$ÒÂ@!РAÈÂÀ ÉÂÙÁÂÇÄÂ`øÎ€ÏÍÂàÂÂ@ÎÈ ˆÑÂÀkÎÂ@ÔÇÂ@-ÎÂyÑÂ@oõÇÂ@!ÐÂÀSÒÂ`uÏÂàZÉÂàHÌ ÙÎÂ`oÐÂ`æÑÂ@¶Ì€Å bÍ hÌÂà×É VÏÂ@!РùÓÂ,É ¬ËÂÀË€½ÐÂÀYÑ 5ÊÂ@'ÏÂ@-ÎÂÍÃÂ,É  ÑÂàlÆÂ€™Ö hÌÂÇÄÂÀ É€ùÆÂ€^Ë€ÃÏÂ`Ê ŒÆÂ VÏÂ@-ΠpÕ€XÌÂÀâÏÂ@¾ÂÀË€jÉ ”Ï€pÈÂ@ìÃÂ@Ñ€.ÓÂ@°Í€dÊ€@Р‚ÒÂsÒÂ@°Í šÎÂà­ÐÂà³ÏÂÀqÍ ;É ÐÅÂ@?ËÂ@]ÆÂ€4Ò ¦ÌÂ@]ÆÂ&ÊÂ`ÍÂ@u ˆÑÂsҠπ‚ÅÂàõÄ çÖ€ÉÎÂ`ÚÓ ÍÐÂàÅÌÂà¡Ò ÎÂ`uÏÂ`ÊÂÀ$ÅÂ@Ñ ÇÑ€óÇÂÀ ÉÂËÂ@9ÌÂÞÕÂ`àÒ€ÕÌÂ`oÐÂÀkΠ€ÈÂÀ*ÄÂ\Á zÉ€jÉÂ@žÐÂÀ‰É€(Ô \Π”Ï 5Ê ÎÂØÖÂ`FÂÂÀ_Р”Ï µÔÂÀÊ 5ÊÂ`àÒÂàõÄÂÀÊ ñÊ DÒÂÀîÍÂ`ÍÂ@bÚÂà‰ÖÂ`ªÛ 5ÊÂ2ÈÂ`ÎÕÂÀ}Ë€ÃÏÂÀÊÂ@ÂÊÂÀ‰ÉÂÀwÌÂäÔÂà*ÑÂ`æÑ€FÏ #ÍÂ@3ÍÂàËË ©ÖÂÀÜÐÂ@€ÕÂ@ÂÊ d× çÖ  Í »ÓÂÀMÓ€dÊÂ`ÔÔ—ÌÂ@¶ÌÂ@!ÐÂ@¶ÌÂà‰ÖÂà`È€{ÛÂ`ÍÂ@°Í€çÉÂàÝÈ€Ö \ΠhÌÂà6ÏÂÒ×Â`oÐÂÀÆÂà`È€FÏÂÀƒÊ€áÊÂà<ΠjÖ åÌÂ@žÐÂ8Ç€ÃÏÂÀâÏÂÀeÏ tÊÂ@ÂÊ 'ÂÂ&ÊÂ@¤ÏÂÀ ÉÂ@’ÒÂ`øÎÂ@-ÎÂÀÊ ”ÏÂ`oÐÂÀSÒÂ`ËÂ`cÒÂРÈÂ`{ÎÂ@ìÃÂ`ìЀ:ÑÂà$ÒÂ@ÈÉÂà`È ßÍ€“×ÂÀâÏÂàBÍÂÇÄÂ`þÍ€pÈ€“×Â@ÚÆÂ@9Ì åÌÂ`iÑÂ@¶Ì€LÎÂ@°Í åÌ ÄÇÂ@>à€(ÔÂ@QÈ åÌ €ÈÂ@Ó€íÈÂÀYÑÂÀ¸Ö 8ÔÂÀ›ÆÂ ÙΠÍÐÂ@àÅÂà³ÏÂà¡Ò€áÊ Ë )ÌÂàÔÂÀÜÐÂÀSÒ‹ÎÂà­ÐÂOØÂ žÃÂ@]ÆÂ@ªÎ€XÌ °À€dÊÂ`¥Ç ÓÏÂ`“Ê  ÍÂÀÜЀáÊÂ`Â× LÛÂÀ)ÙÂ@KÉÂàËËÂ`“ÊÂÀÈ #ÍÂ`Ë !ÃÂ@KÉÂÀAÕ£ÊÂà×É ҋ΀ùÆÂ€^ËÂàÕ tÊÂ@!ЀÉΠ’ÅÂÀ•ÇÂÀwÌ€4Ò‘ÍÂÀ›ÆÂàHÌÂÀ›ÆÂ ªÁ 5ÊÂÀȩɠGÇÂ@3ÍÂà­Ð¯ÈÂ@þÀÂ`"È ËÂàÝÈ€^ËÂ@ÎÈÂÀ‰É¯ÈÂà„ÂÂà0Р»Ó »Âà*ÑÂ@KÉ €È€ÉΠ!ÃÂ@KɵÇÂ` ÌÂÀ³ÂÂàœ¾Â ËÂÀèÎÂÀ‰ÉÂ@?Ë 9¿Â âÂÂ`oÐÂàœ¾ÂÀ³ÂÂÀ0àVÏ€XÌÂ`Ê ÷ÉÂ`:ÄÂÍàE½Â`Í€LΠñÊÂ@hÙÂ@KÉÂÀYÑÂÀ ÉÂ`]ÓÂÀúËÂ@°ÍÂÀ×¼Â`Û¾ÂàNË€ÅÂ@ÎÈÂ`FÂÂàûà|Ó€ÕÌÂöÑ ÙÎÂàûÃÂ`‡ÌÂ`ËÂ`(ÇÂ,ÉÂà³ÏÂàxÄÂ`Ë ÙÎÂà Á ýÈÂ@ÈÉÂÀkÎÂÀkÎÂÀwÌ€áÊÂ`±ÅÂ,ÉÂ@ÒÂ2ÈÂVÂÂÀMÓÂÀÆÂ`½ÃÂÀkÎÂ`Â× ÏÂ`¼ØÂÀÖÑ€«ÓÂüЀ¥ÔÂ`oÐÂ@¤Ï€çÉÂ`WÔ ÇÑÂ@ÑÂ@'ÏÂà›ÓÂÀÊÓÂÀMÓÂà$ÒÂðÒÂ@-΀·Ñ€"Õ‹ÎÂ`Í ùÓÂà³ÏÂà¹ÎÂÀ‰É µÔÂ@PÝÂ`æÑÂ@ÚÆÂ \ÎÂ@'ÏÂÀÜР÷É ‚Ò‹ÎÂÀîÍÂàÔ ¾È—Ì AÈÂà× ÓÏÂ2ÈÂÀèΠ¯Õ ˆÑÂ`ÍÂàHÌÂÀSÒÂà}ØÂ 2Õ ÉÛÂÀYÑÂà¡ÒÂà­Ð 8ÔÂÀ¦ÙÂÀÄÔÂàÕ åÌÂ…ÏÂà Ö‹ÎÂàÕ€çÉÂyÑ€ìÝÂ@÷ÖÂÀ¸ÖÂÀAÕÂÀ#Ú€½Ð€Ö€Ú€Ú€“×Â`¼ØÂ £× PÐÂäÔÂÀóáÂÌØÂ€ŸÕÂàkÛÂ@PÝ€{ÛÂ,ÉÂ@÷ÖÂÀÐÒÂà Ö ÇÑÂ`ìЀ™ÖÂ@\ÛÂÌ£ÊÂ@÷ÖÂ`¤ÜÂÀAÕÂ`3Ú ÇÑŠãÂàØÂ€“× @ÝÂ`Â× á×ÂÀÇ |Ó ØÂ€FÏ€4ÒÂÀâÏ€±ÒÂÀwÌÂÀ;Ö ßÍÂ@]ÆÂ ØÂà¡ÒÂà€ÕÌ€çÉÂà‰ÖÂ@žÐ€øÛÂ ÛØÂ 2Õ€ØÂ€uܨޠóÔÂÀAÕ ‚ÒÂ@t×€ŸÕÂ`KÖ€ØÂ€«ÓÂÀ)ÙÂà ÖÂOØÂ€KãÂ@ëØÂ€«Ó‘ÍÂÀ¸ÖÂ`!Ý RÚÂÀGÔ¢ßÂU×Â@t×Â@\ÛÂ+ÞÂ ÛØÂ ÿÒÂ@˜Ñ€òÜ€×ÂÀ²×Â`?ØÂ€ÚÂ@DßÂ`ÈÖ /Ë€±ÒÂ@ÇÞÂU× ©Ö€ÉÎÂÀ¦ÙÂ@žÐ RÚ &× ßÍÂà}ØÂ óÔÂäÔÂ`ÎÕÂ`cÒÂà}ØÂ@JÞÂÀôÌÂ@ëØÂà_ÝÂÀ¾ÕÂ@ÒÂÀÄÔ€:Ñ€4Ò—ÌÂ` Ì nË€@ÐÂàúØÂÀMÓÂ@°ÍÂ@ÑÂÐÂ@Ó tÊÂ@’ÒÂÌÂÀÖÑ€óÇÂ`É nË€ÏÍÂàfÇ 8Ô€ØÂÀÜÂêÓ€«ÓÂ@ÎÈ€™ÖÂÀ¸ÖÂ ÊÆÂàZÉÂÀGÔÂÀ¬ØÂ€(Ô€™Ö€·ÑÂyÑ€·ÑÂ`"ÈÂ@EÊÂ@WÇÂ`ŸÈ€4ÒÂ@ŒÓÂöÑ 8Ô—ÌÂ`"È€Ú ˆÑÂ`™É €ÈÂ@Ò ñÊÂÀwÌ RÚ ÐÂ@žÐ ΑÍÂ`àÒ bÍÂyÑ ÍÐÂ` ÌÂ`E×€(ÔÂà6ÏÂ`]ÓÂ@¤ÏÂØÖ€«Ó€±ÒÂ@÷ÖÂÀîÍÂ@¼Ë ¤Â‹ÎÂ`‡ÌÂyÑÂ`±ÅÂ`ÊÂÀkΠ;ÉÂ`àÒ ÏÂР¾ÈÂyÑÂðÒÂ@Õ åÌ ¶¿Â@iÄ€vÇÂ@¶ÌÂ@¶ÌÂÀ_РÐÂ@'ÏÂ@WÇ€óÇÂàÝÈ ÷ÉÂÀôÌ€¦¿ÂΠÇÂ@˜ÑÂ@3Í tÊ‘ÍÂ8Ç !àkÁ †Ç /ËÂàrÅ£ÊÂ@ÓÂ`4Å ”Ï€:Ñ€vÇÂà¡Ò DÒÂ`"È€½Ð tÊÂå¿Â€¦¿ÂàxÄ‹ÎÂ`ìÐÂ`?ØÂ@ÔÇÂ@¼ËÂàúØÂ€{ۯȠ Í hÌÂà6Ï€šÁ ÁÒÂàõÄÂPÃÂ` ÌÂ@¼ËÂ@ªÎ€RÍÂ@ÕÂ@QÈÂmÓ tʀŀ¥ÔÂJÄ µÔ ¬ËÂÁÅ AÈÂàNË€ÃÏÂ`ÎÕ€ÕÌÂ`ËÂ@¶ÌÂ`oÐÂà0РDÒ ùÓÂaÕÂ@3͋΀^Ë /Ë È #ÍÂàBÍ€@ÐÂ7ÜÂ@Ñ ÖÄÂàHÌ µÔÂàZÉÂ`ËÂÇÄ  ÍÂ@ÚÆÂÀ ÉÂ@ÈÉ ßÍÂ@ªÎÂðÒ€LÎÂÀâÏ ÎÂ@°ÍÂà×É >ÓÂÀ_Р‚ÒÂ`øÎ #Í€.Ó€ŸÕ ÏÂ`òÏÂÀ_ÐÂ@-΀jÉÂ` ÌÂ@ÇÞ€@ЀFÏ€.Ó çÖÂ@ëØÂà}ØÂ€¥ÔÂ@°ÍÂÀâÏÂÀÄÔÂ@!ÐÂàØÂ`ÉÂÀwÌÂÀÖÑÂyÑÂà¡ÒÂÀîÍÂÀGÔÂà³ÏÂàSß LÛÂ@žÐÂ`oÐÂÀ•Ç çÖ ”ÏÂ@˜Ñ€@ÐÂ@’Ò XÙÂÀšÛÂàkÛÂ@ÒÂÀ¸ÖÂ@ñ× bÍÂÀâÏÂÀ;ÖÂ@!РDÒÂ`3ÚÂ@ñ×ÂàwÙ ΀vÇ€iÞÂOØÂOØÂ`þÍ€½Ð ÛÂ@ÑÂ@-ÎÂ`KÖÂyÑÂ@ÈÉ ¯Õ€ˆÄ íÕÂ@ ÔÂ@'Ï€ÚÂÀ_РÃÜÂ`?ØÂÀîÍ€RÍÂ`ìÐÂ@nØÂÀîÍÂàÅÌ€(ÔÂÀÐÒÂ`WÔ JÑÂÎÂ`"È ÆÂgÔÂàÔ ÁÒÂ@ñ× ”Ï ¬Ë ŒÆÂ  ÍÂ`Â× —ÙÂ`øÎÂàéÆÂà•ÔÂàîÚ vÔÂà›Ó yÞ :Þ µÔÂ`àÒÂ`ÎÕÂ`†á ÇÑ PÐÂ`-Û€ ÙÂ@ŒÓÂêÓÂÀíâ ÙÂÀeÏÂà ÖÂàËËÂ`Â×€«ÓÂ@ßÚ å€(ÔÂÀÄÔ€¥ÔÂÀ”Ü Þâ€:ÑÂgÔÂÀ¾ÕÂàÔ»ÆÂÀ›ÆÂ@€Õ€“× ‚Ò€±ÒÂÀMÓ Û ÜÂ@ëØÂ ÐÂ@ëØÂ€(Ô µÔÂÀpâÂÀÊÂÀŽÝÂ@µáÂÞÕ€@ÐÂ`ÞÂ ÛØÂàwÙÂ@÷ÖÂðÒÂ@!ÐÂ@hÙÂà0ÐÂÞÕ€“×Âà›ÓÂà ÖÂàÔ€:ÑÂàîÚÂ`]Ó d×ÂsÒÂ`WÔ jÖÂÀÄÔÂ ÛØÂ`ìÐÂà›ÓÂ@bÚ€¥Ô€øÛ 2Õ€¥Ô€ÏÍÂ`WÔÂÀ¸ÖÂ`ÎÕÂÀYÑÂà}ØÂaÕÂ`¼ØÂÀAÕÂÌÂÐÂ@-ÎÂà*ÑÂÀ}Ë íÕÂðÒÂàÐßÂ`-ÛÂÀ/ØÂ ùÓ íÕ åÌÂ@÷Ö ¸ÉÂ`KÖÂÀâÏÂ@nØÂ€ÚÂ@˜Ñ ÒÂÀâÏ€{ÛÂöÑÂêÓ€XÌÂÀÐÒ€uÜÂ@žÐÂà•Ô #ÍÂäÔ€þÚÂ@zÖÂÀ¸ÖÂÀqÍÂà¿Í€(ÔÂÀ;ÖÂ@÷ÖÂ@!ÐÂàwÙÂaÕÂà6ÏÂ@÷Ö íÕÂ@ÕÂÀMÓÂÀYÑÂ@ÕÂ`!ÝÂ@ªÎÂ@’Ò€ÏÍÂÀZ¼Â ÈÂÀßÂ@ÍÝÂ@2âÂ`Â×Â@¼Ë 5Ê @Ý´ÜÂà¡ÒÂÀ¾Õ 8Ô |Ó€ØÂ€àßÂÀGÔÂ@¼ËÂà§Ñ€ØÂàqÚÂàôÙÂÌØÂ@nØÂ ½Ý€ÚÂÀ¬ØÂ &×  ÑÂàHÌ á×ÂÐÂà§ÑÂÒ×Âà×Â`˜ÞÂÀšÛ€cß màÂ`ñä ‚ÒÂ@ÁßÂüÐÂ`uÏÂ`ÔÔÂÀÝÂÞÕ JÑ Ú€"ÕÂΠ|ÓÂÀ¸ÖÂÀYÑ€@ÐÂ@˜ÑÂÀÐÒÂÀ;ÖÂ`Â×Â@ÕÂÀÊÂà$ÒÂCÚÂ`øÎ RÚÂ`æÑŠãÂ`ìÐÂ@nØÂÀAÕÂ@žÐÂà­ÐÂ`9ÙÂ`¶ÙÂ@ýÕÂÀYѠ݀"ÕÂrçÂàúØÂÀšÛÂàÊà ‹Û€4ÒÂ1ÝÂ@ÙÛÂÀ¸ÖÂ@3ÍÂÀùà€‡Ù€iÞ UäÂäÔÂCÚ VÏÂÀŽÝÂÀÚÂÀâÏÂÌØÂÀóáÂÀ|à€þڢ߀‡Ù ÉÛ  Í Ò€ìÝÂ`à ÉÛÂÀÝÂ@ýÕÂÞÕÂêÓÂÀÝÂ@»à€ Ù€ÚàÂàAâÂ@’Ò 8Ô€·Ñ ã Ý ^ØÂ€½ÐÂÀíâÂÆÙ DÒÂ`KÖÂ`™ÉÂÀ•ÇÂ`“ÊÂÀ_ÐÂ@˜ÑÂ`ËÂ`Â×Â@÷Ö ŽÐÂà­ÐÂ@\Û€±Ò€±Ò ÁÒ zÉ ÙÎÂ@zÖÂ@'ÏÂ…Ï JÑÂ`Â× "â  ÍÂ@þÀÂ@†Ô vÔÂ`Â×Â=Û–áÂ`ÈÖÂà‰ÖÂÀ Ú€‡ÙÂOØÂ€½ÐÂ@÷ÖÂðÒ >ÓÂ@µá ÙÂÀSÒÂàNË ^ØÂ€ÚÂÀ¬ØÂÐÂ΀ØÂÀ¦Ù ^ØÂ`KÖÂÀ ÞÂ@—æÂ`KÖÂÀ߀3çÂÀíâÂàÔœàÂ~åÂOØÂ`¼ØÂ …Ü€Ú ÕÙ äá€ØÂà 4ßÂà ÚÂÀˆÞÂàeÜÂ`'ÜÂ`¤Ü ½Ý ^ØÂ ŽÐ íÕÂÀ)ÙÂ` áÂÀdä uéÂàSßÂà¸ãÂàÊàÂÀܺۀڀ‡ÙÂàúØÂºÛ€æÞÂàôÙÂÀRçÂàÐßÂËíÂ`?ØÂ`ßÂ%߀ÚÂàAâÂÌØÂ ÝÂàÖÞ€àßÂàƒ×Â=ÛÂ@÷Ö µÔ ØÂ€ÖÂ1ÝÂàƒ×Â`ÎÕÂà}ØÂ ‹ÛÂØÖ ãÂÀóá€øÛ´Ü pÕÂ@\ÛÂàÕÂàeÜÂÞÕÂ@DßÂ`E×€¼å ,Ö¨Þ¿ïÂ`€â€Ôá€oÝÂÀkÎÂ ÛØÂ ØÂ ½ÝÂ@ÓÜÂÀ”ÜÂ@ëØÂ€òÜÂàúØÂ`Â× ÿÒ ÝÂÀ”ÜÂ@&äœà ÃÜÂ`ßÂ`Â× Ü LÛÂlèÂ@PÝÂàÊà Òä®ÝÂÀ”Ü £×ÂàÖÞ êàÂ@©ã€Âä ÃÜ öÞÂÀÐÒ ½ÝÂà‰ÖÂÀÛÂ`cÒ äáÂ`bçÂÀRçÂ@‘ç€ÈãÂ`÷ã Øã€9æÂ%ßÂ`åæÂàôÙœàÂÒ×Âà¸ãÂ`€â ]í€-èÂ@©ãÂÀÕæÂ`täÂ@»à ÝÂÀ‚ß ÃÜ "âÂÝêÂ@JÞÂ@»à€ªè aâÂ`ßç€(ÔÂ`3ÚÂÀáäÂÀdä€WáÂÞÕÂÀ#ÚÂàèÛÂ@ÙÛÂ@žÐÂ@ýÕ Ü ™ã ¯ÕÂÀÝÂàGá êàÂàÔ sß–á ãÂ@ÍÝÂÀ#ÚÂÀ¬ØÂ@nØÂ`ÚÓÂ`?ØÂ µÔÂà× ÏÚ ”Ï çÖÂ@\ÛÂÀÛÂàÜÝ 8Ô€ÃÏÂÀSÒ ,ÖÂ@3ÍÂ`ÈÖÂÀváÂ@ÍÝÂ+Þ …ÜÂ`ýâÂàšèÂàØÂÀÊÓÂ`øÎ ÜÂ`žÝÂ@bÚ RÚÂÀ¾Õ µÔ pÕ€‡ÙÂ`ÞÂÀ‚ßÂ`ÔÔÂÀÐÒ€™ÖÂÀ;ÖÂ@÷ÖÂàqÚÂÀ¾Õ ½Ý ÕÙÂ…ÏÂà¹ÎÂàôÙÂÀGÔÂ`9ÙÂàÔ€×Â@ÒÂaÕÂ@ÍÝ sßÂàÕÂÆÙÂ@ëØÂOØÂ@‹è çÖÂÀ¸ÖÂÀîÍÂCÚÂ`E×€‡ÙÂgÔÂÀÖÑÂ`QÕÂxæÂ Oå ÕÙÂ@!ÐÂàkÛÂà­Ð ,ÖÂ`QÕÂ@Áß óÔ ÇÑ pÕÂ@JÞ€ÚÂ@ëØÂ`QÕ€ÚÂ`ýâÂÀ#Ú€]à @ÝÂà¡ÒÂ@˜ÑÂ@ñ×ÂgÔÂàÕ€uÜ Àç–á äá (á @Ý FÜÂà¬åÂàeÜÂà­Ð yÞÂ`à —ÙÂCÚ€‡ÙÂ@åÙÂ@ñ×ÂOØÂ€4ÒÂU×€þÚÂ@!ÐÂàÊàÂÀAÕ  ÑÂà¹ÎÂ@ýÕ (á Ú€àß pÕÂÀ)Ù´ÜÂ@Ó yÞÂ` Ì pÕ £×Â@t×Â@'ÏÂ@ÓÂ@ŒÓÂ`·Ä ÍЖáÂ`øÎ )Ì ÿÒ€{Û€ ÙÂaÕÂ`þÍ ØÂ ÛÂaÕÂÀîÍÂà¡ÒÂ`uÏ á×—ÌÂà}ØÂ€ìÝÂà ÖÂ@]ÆÂ€ŸÕÂÀ)Ù ÁÒ ½ÝÂ@åÙ ¬ËÂÒ×Â@ßÚÂ`ÚÓÂ+Þ ‘ÚÂU×Âà<΀·Ñ ¬ËÂ@ÑÂCÚÂÀ/ØÂÀÜÂÀSÒÂ@!РPÐÂà ÖÂÀÊ ÕÙÂà¿Í€4Ò µÔÂ@ªÎÂ@zÖ 8ÔÂÀ¬ØÂ ŽÐ€Ú ÚÂ`ÔÔÂ`?ØÂ@EÊÂ`QÕÂaÕ ¸ÉÂÏÂÀÊÓ ,Ö€«ÓÂÞÕÂÀ}ËÂÀ²× ÐÂÞÕÂÀÊÓÂmÓ ùÓÂ`ÔÔ çÖÂ`ÚÓ |ÓÂ`ÎÕÂÀÖÑ ÙÎÂàÔÂÌÂ`ËÂÌØÂ`9Ù‹ÎÂ@ýÕÂ@ýÕ >Ó€ØÂÀÈ€ŸÕ ÐÂêÓÂàÓ€RÍÂ`9Ù Ï DÒÂÀÊÓÂ@¼ËÂÀíâÂ@-΀Ö ÙΠvÔ€½Ð  ÑÂÀGÔ «à‘ÍÂêÓ€(ÔÂCÚÂäÔÂàÐßÂÀÚÂ@ÓÜÂàƒ×ÂàôÙÂ@˜ÑÂÀwÌ XÙ€×€ØÂ@ÓÂà•ÔÂàÕ€"ÕÂàîÚÂ`“ÊÂ@nØÂOØÂ€ò܋΀@Ѐ·Ñ€"ÕÂ@ÓÜ€oÝ€iÞ RÚÂÀÐÒÂ@Ñ 8ÔÂÀAÕ (áÂØÖÂÀÊÓ šÎ çÖÂÀ Ú€{Û ^ØÂ çÖÂÀMÓ€×Âà•ÔÂ`iÑ DÒ ^ØÂà•Ô€"ÕÂà¹Î€4ÒÂÀSÒÂ`KÖÂ`WÔÂ ÛØÂüÐÂÀMÓÂ@÷ÖÂàrÅ 5ÊÂ`WÔÂÀGÔÂ@€Õ€dÊ€ ÙÂÀYÑÂÀ;ÖÂÀ”ÜÂ`¶ÙÂÀ;ÖÂà¡Ò€.ÓÂ…Ï ŽÐÂ@ñ×€:ÑÂ`KÖÂ@ÓÜÂ`Â× óÔÂ`ÎÕ€àßÂ`Ë€‡ÙÂ@bÚÂÀkÎÂÞÕÂU×Â@ ÔÂÀ ÞÂà_ÝÂ@ÍÝÂ`QÕÂÀÄÔÂ@Õ´Ü ©ÖÂÀ#ÚÂ1ÝÂÌØÂ ÜÂOØÂ@hÙÂà*ÑÂ@Ó 8ÔÂ,É€ ÙÂ`?ØÂ@t×€@РùÓ óÔÂ@ÒÂ@˜ÑÂà*ÑÂÀúËÂêÓÂ@nØÂ@?Ë  Ñ d×  ÍÂàèÛ€“× ÙÎÂ`Í £×Â@ÁßÂàâÜÂ`ÎÕ€‡ÙÂyÑÂ@ÕÂ@°Í ÉÛÂØÖ€«ÓÂÀSÒÂàBÍÂÀùàÂÀ)ÙÂ@˜Ñ ùÓÂÀÜÐÂÀˆÞÂ@Ò€4Ò ²Ê 2ÕÂà× vÔÂ`™ÉÂ@9ÌÂàÕ PÐÂ@ÑÂU× ^ØÂ`E×Âà›ÓÂÀYÑ€RÍÂÀeÏÂ`ìР/Ë€™Ö€4ÒÂÀYÑ€uÜÂÀ;ÖÂ@¤ÏÂäÔ€ØÂ`WÔÂsÒÂà‰Ö€ ÙÂ@¤ÏÂÀÖÑ bÍÂäÔ€"Õ€‡ÙÂðÒÂ`¼ØÂÀôÌÂDÅ€“×ÂÀYÑÂà¹ÎÂà6Ï ÙÎÂÀ#ÚÂ`-ÛÂÌÂÀÜР!ÃÂ`òÏÂ`KÖÂà¡ÒÂÀÜРAÈÂ`æÑÂà¹Î€:Ñ šÎÂU×€^ËÂàãÇ ¯ÕÂÀùà á× \ÎÂ@¼ËÂ@zÖÂÌÂOØÂà¿ÍÂ@-ÎÂ@Ó€«ÓÂàÅÌ€ÚÂà× ”ÏÂÀîÍÂ`QÕ‘Í€¥ÔÂÀ¸ÖÂÀÜÐÂCÚ ØÂ€(Ô ÈÂÀGÔÂÀYÑÂà­ÐÂÐÂà§Ñ tÊÂ`]ÓÂà¿ÍÂàúØÂ )Ì Ë ÓÏ @ÝÂ`Í VÏ€@ÐÂ`ìЀÕÌ 5ÊÂà§ÑÂà¡ÒÂaÕ á×ÂàØÂ pÕÂà¿Í€FÏÂ@˜ÑÂ`ÊÂÀÜÐÂÀ§Ä€ØÂàNË€ ÙÂà¹Î—Ì€"ÕÂ@ÚÆÂ€4ÒÂÀÊÓÂàrÅ€«Ó ¬ËÂ@Õ€@ÐÂÀqÍÂÀâÏÂÀ¡ÅÂÀÈ€^Ë€¥Ô€4ÒÂàÅÌ óÔÂà³Ï žÃ€ÃÏÂðÒÂ@?Ë‘ÍÂ@?Ë€ÕÌÂàTÊÂÀÄÔ pÕ ÏÚÂ`ÚÓ ¦ÌÂ@VÜÂà ÖÂ`̀ŠçÖÂÀôÌ ÓÏÂ@'ÏÂÀGÔ©ÉÂÀîÍ MÆÂÀSÒÂÀSÒÂ@˜ÑÂÀqÍÂ@÷Ö /ËÂà<ÎÂÀ_ÐÂüРbÍ€FÏÂ@VÜ€@ÐÂÀ;ÖÂ@¶ÌÂüР¦ÌÂà›Ó óÔ€«ÓÂ@Ò€4ÒÂ@t×Â@WÇÂÁÅÂ@ÂÊÂ&Ê hÌÂ@ÑÂàÕÂÀúËÂà¿ÍÂ` ̣ʠöÞÂ`cÒ Πå̯ȀŸÕ€½Ð pÕÂà¹Î PÐÂàÝÈ |ÓÂÀ›ÆÂ€±Ò ÕÙÂÀúËÂyÑ 2ÕÂà0ÐÂÀMÓ ØÂyÑ Å bÍ ŽÐÂà<΀ÃÏ€ŸÕÂà ÖÂ@ýÕ€FÏÂÀSÒ 8ÔÂ@'ÏÂ@-΀vÇ åÌÂàNË ùÓ hÌÂ`]ÓÂàîÚÂà›Ó€RÍÂÀ)ÙÂÍ€×ÂgÔ µÔ€ ÙÂà›Ó ¯ÕÂÀƒÊ ÙÎÂ`ÎÕÂ`KÖÂ`æÑÂÀË µÔ zÉ ^ØÂ jÖÂàÅÌ ÐÂÀ/ØÂ óÔÂÀYÑ—ÌÂÀšÛÂÀÄÔ íÕ ÿÒÂ[Ö bÍÂàÑÊ )ÌÂ@¤ÏÂäÔÂ`{ÎÂ…ÏÂ@ÕÂÀá䀱ÒÂ@KÉÂà Ö |ÓÂ@˜ÑÂÀÖÑ ‘ÚÂ@hÙ µÔÂ@ªÎÂà0Р‚Ò Ù΀"ÕÂ@Ò #Í€øÛ —Ù ÿÒÂÀÖÑ ŽÐÂ`þÍ€ PÐÂ`ìÐÂOØÂ@ ÔÂ@ÎÈÂ`òÏÂ`þÍ ßÍ 8ÔÂ@ÎÈÂ@ÓÜÂgÔ€áÊÂàZÉÂÀËÂÀ5× ÜÂmÓ —Ù \ÎÂ@'ÏÂ@ªÎ çÖÂ@’Ò )ÌÂà×Â@t×Â@bÚÂÀ²×€‡ÙÂ7Ü ÃÜ …Ü€.ÓÂ`ÞÂÀ¸ÖÂà*ÑÂ`ÚÓÂ`3ÚÂÀÄÔÂàúØÂØÖÂ@’Ò ©ÖÂIÙ ÏÂöÑÂàwÙ€«Ó€ØÂЀØÂ`ËÂÀ‰É€iÞÂÀkΠÙ€.ÓÂ@÷ÖÂàwÙÂàeÜÂÀ#ÚÂÀ;ÖÂ`3ÚÂàâÜÂöÑÂ`Ê vÔÂ+ÞÂIÙÂàØÂàÕÂ@,ãÂàôÙÂ`ÔÔÂ`òÏÂÀjãÂÀÚÂ`uÏ€óÇ jÖ :Þ íÕÂ@nØÂ@ÓÜÂ`ªÛ¢ßÂ@ßÚÂÀ#Ú |ÓÂaÕ vÔÂ@ÒÂOØÂ=ÛÂàBÍÂÀAÕÂ@ñ×Â`3Ú¨Þ ðßÂÒ×Âà­ÐÂ`ìÐÂ@ñ×€ÏÍ )ÌÂàÔÂàÕ »ÓÂà_Ý ˆÑÂ@'Ï€LÎÂ`iÑ VÏ ¯Õ€(ÔÂ&Ê€½ÐÂÀ¾Õ JÑ€iÞÂ`9Ù ÚÂ`Ë ëË RÚ€ØÂ`ÞÂmÓÂ`?ØÂÁÅÂ`‡ÌÂà•ÔÂÀqÍÂ`òÏÂ@t× çÖ€.Ó€.Ó Û ¬Ë ÍРtÊÂÀ_Ѐ½ÐÂàÅÌÂ`oÐÂÀÜР^ØÂ á×ÂÀeÏÂÀwÌÂ@ÂÊ çÖÂ@?Ë€dÊÂ`øÎÂ`oЀ^ËÂÀèΠFÜ ‚Ò€ØÂÀ ÚÂ`°ÚÂ@EÊÂ@!Р¯ÕÂË€ÚÂ=Û :ÞÂ`ÚÓÂÀkÎÂ[ÖÂ+ÞÂ@€Õ óÔÂà6ÏÂÀMÓÂÀeÏ ¦Ì€FÏ€×Â`Ê ÇÑÂ@3ÍÂÀH¿Â`ŸÈÂU×€.Ó€ÉÎÂÀôÌÂ`ÍÂ`òÏ€½ÐÂgÔÂäÔ  Í £×Â@ñ×ÂàqÚÂÀ¾Õ 8ÔÂÀŽÝÂCÚÂ`]ÓÂ@'ÏÂsÒÂ@åÙ ÇÑÂ`E×€ÛËÂ@ªÎÂ`±ÅÂÀ¹ÁÂ`QÕÂ`æÑÂ@3ÍÂ ÊÆÂ€‚ÅÂÀÐÒÂ`cÒ Ò ßÍ 8Ô€:ÑÂÍ ;É€ÏÍÂÀÐÒÂØÖÂ`Ë€@РÎÂÀGÔ€(Ô \ÎÂ@?ËÂ`òÏÂÀ}ËÂ@¶ÌÂ`ÎÕÂ`ÞÂÀ¦ÙÂ@zÖÂÀ_РÇÑ ÓÏ€ÏÍÂÏÂàïÅÂà¿Í hÌÂ@žÐÂà§Ñ€ŸÕ‘ÍÂÀÛÂÀ)ÙÂ`øÎÂÀkÎÂ@ÎÈÂ@ÀÂà ÖÂ`ÃÂÂ`ËÂ`ÍÂ@¤Ï &×Â`òÏÂ`ÔÔÂÀÈ€½Ð€íÈÂ`Ê ‘Ú ”Ï \ΠØÂÀMÓÂ`ÍÂ`ËÂÀwÌ šÎ€¥ÔÂÀ/ØÂ ÿÒ€«ÓÂ…Ï JÑÂ`ÈÖÂ@Ñ€‚ÅÂ@¼Ë€øÛ€XÌÂ`ËÂJįȠ\ÎÂ@-ÎÂÀÄÔ  ÑÂ@†ÔÂ@åÙÂà}ØÂ@°ÍÂà<Π€ÈÂÀîÍÂÀÊÓÂ@!Р\ÎÂàúØÂ /ËÂ@bÚÂàÔÂ@?Ë  ÑÂsÒÂ@PÝÂ@†ÔÂà¹ÎÂ`Â×ÂÀÜЀXÌ€ÕÌ \ÎÂÀÜÐÂ@PÝ€Ú€iÞÂ@?Ë€±Ò€"ÕÂ`«ÆÂ ÁÒÂ`þÍÂÀ¦ÙÂÀÜÂÀÄÔ ¯ÕÂ@-ÎÂ`cÒ ÓÏ )Ì íÕÂ@žÐÂ@?Ë ØÂ@hÙÂà§ÑÂÀè΀“×ÂØÖÂàÑÊ€LÎÂà›ÓÂ`ÍÂÀqÍÂÐÂ@÷ÖÂÀÊÂÀÐÒÂà$ÒÂà³Ï ©ÖÂ΀±ÒÂÀMÓ€«ÓÂ`òÏ ‚Ò çÖ€4ÒÂÀ;ÖÂ=ÛÂ@ÂÊÂmÓ ÇÑÂ@nØÂ@ëØÂ`E× »Ó šÎ€‡ÙÂà¡Ò€^ËÂ@t×ÂÀ5× £×Âà5äÂ`¼ØÂÀšÛÂyÑÂ`É€LÎÂà_ÝÂ@÷ÖÂàîÚÂÀGÔÂ`KÖÂÀ²×Â`Â× &× Ü «àÂÀ¸ÖÂ`?ØÂaÕ 〷Ѡ8ÔÂÆÙÂ`KÖ€"ÕÂ@Ó íÕœàÂà*ÑÂ@€Õ 8ÔÂ`ìÐÂ@ÒÂ@ªÎ RÚ€4ÒÂ@?ËÂ@†ÔÂÀËÂ@Ò ‹ÛÂàSß yÞ Ú ”Ï vÔ ©Ö ÏÚ€ÖÂàËË€¥ÔÂàÕ "âÂ`WÔÂàYÞÂÀMÓÂ`{΀LΠ@ÝÂ`{κÛÂ`]ÓÂ`ÍÂÀ¦Ù 8Ô £×Â@ÓÂ`Â×´Ü #Í ØÂ@¼ËÂÀÊÓ &×Â@¤ÏÂ`ªÛ€ÃÏÂ`ÈÖÂ`ÔÔÂà6ÏÂΠ”Ï DÒÂà‰Ö bÍÂ@ßÚÂÀAÕ€áÊ ÐÂ`ÈÖÂ@ÕÂÀÄÔ€™ÖÂÌØÂÀ²×Â@žÐÂ`uÏÂyÑ‘ÍÂàÝÈÂÀ/ØÂà‰ÖÂ@PÝÂðÒÂ@÷Ö€LÎÂÀÜЀ™ÖÂÀYÑ 2Õ¯ÈÂU×Â@†Ô d×—ÌÂÀwÌÂ`Í€oÝÂÀÐÒÂ@?ËÂÀqÍ€ùÆÂ€íÈÂàÑÊÂ2ÈÂÀúËÂ@˜ÑÂÀÊÓ€™ÖÂÀSÒÂ…Ï ÁÒ ¦ÌÂ@ŒÓÂàÑÊÂ`oÐÂ@ŒÓ tÊ€±ÒÂÀ¾ÕÂ[Ö€4Ò ‚Ò d×Âà•ÔÂÀ²×Â@ÕÂ@ Ô€çÉÂà¿ÍÂU×ÂЀ±ÒÂà*ÑÂ`3Ú€L΀ÏÍÂÀkÎÂ`]ÓÂÏ€"Õ ‘ÚÂ@!ÐÂÞÕÂ`oÐÂ@€Õ #ÍÂ`¼ØÂ ‘ÚÂÌÂÀYÑÂ`Â× ÐÂà0ÐÂËÂÀSÒÂÀ}ËÂ@˜ÑÂ`3ÚÂ`KÖÂàØÂTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@y (stimfit-0.15.8/src/pystfio/pystfio.i0000664000175000017500000003656513315356003014360 00000000000000%define DOCSTRING "The stfio module provides functions to read/write data from/to common electrophysiology file formats" %enddef %module(docstring=DOCSTRING) stfio %{ #define SWIG_FILE_WITH_INIT #include #include #include #include #include #include #include "./../libstfio/stfio.h" #include "./../libstfio/recording.h" #include "./../libstfio/channel.h" #include "./../libstfio/section.h" #include "pystfio.h" static int myErr = 0; // flag to save error state %} %include "../stimfit/py/numpy.i" %include "std_string.i" %include "exception.i" %init %{ import_array(); PyDateTime_IMPORT; %} %define %apply_numpy_typemaps(TYPE) %apply (TYPE* IN_ARRAY1, int DIM1) {(TYPE* invec, int size)}; %apply (TYPE* IN_ARRAY1, int DIM1) {(TYPE* data, int size_data)}; %apply (TYPE* IN_ARRAY1, int DIM1) {(TYPE* templ, int size_templ)}; %enddef /* %apply_numpy_typemaps() macro */ %apply_numpy_typemaps(double) class Recording { public: Recording(); /* %feature("autodoc", "The sampling interval") dt; double dt; %feature("autodoc", "File description") file_description; %feature("autodoc", "The time of recording") time; %feature("autodoc", "The date of recording") date; %feature("autodoc", "Comment on the recording") comment; %feature("autodoc", "x unit string") xunits; %feature("autodoc", "The date and time of recording") datetime; std::string file_description, time, date, comment, xunits; PyObject* datetime; */ }; class Channel { public: /* %feature("autodoc", "Channel name") name; %feature("autodoc", "y unit string") yunits; std::string name, yunits;*/ }; class Section { }; %exception Recording::__getitem__ { assert(!myErr); $action if (myErr) { myErr = 0; SWIG_exception(SWIG_IndexError, "Index out of bounds"); } } %exception Channel::__getitem__ { assert(!myErr); $action if (myErr) { myErr = 0; SWIG_exception(SWIG_IndexError, "Index out of bounds"); } } %exception Section::__getitem__ { assert(!myErr); $action if (myErr) { myErr = 0; SWIG_exception(SWIG_IndexError, "Index out of bounds"); } } %extend Recording { Recording(PyObject* ChannelList) : dt(1.0), file_description(""), time(""), date(""), comment(""), xunits("") { if (!PyList_Check(ChannelList)) { std::cerr << "Argument is not a list\n"; return NULL; } Py_ssize_t listsize = PyList_Size(ChannelList); std::deque ChannelCpp(listsize); for (Py_ssize_t i=0; i(argp1); ChannelCpp[i] = *arg1; } // Note that array size is fixed by this allocation: Recording* rec = new Recording(ChannelCpp); return rec; } ~Recording() {delete $self;} double dt; std::string file_description; std::string time; std::string date; std::string comment; std::string xunits; PyObject* datetime; Channel* __getitem__(int at) { if (at >= 0 && at < (int)$self->size()) { return &(*($self))[at]; } else { myErr = 1; return NULL; } } int __len__() { return $self->size(); } %feature("autodoc", "Writes a Recording to a file. Arguments: fname -- file name #ifndef TEST_MINIMAL ftype -- file type (string). At present, only \"hdf5\" is supported. #else ftype -- file type (string). At present, \"hdf5\", \"gdf\", \"cfs\" and \"ibw\" are supported. #endif // TEST_MINIMAL verbose-- Show info while writing Returns: True upon successful completion.") write; bool write(const std::string& fname, const std::string& ftype="hdf5", bool verbose=false) { stfio::filetype stftype = gettype(ftype); stfio::StdoutProgressInfo progDlg("File export", "Writing file", 100, verbose); try { return stfio::exportFile(fname, stftype, *($self), progDlg); } catch (const std::exception& e) { std::cerr << "Couldn't write to file:\n" << e.what() << std::endl; return false; } } %pythoncode { def aspandas(self): import sys import numpy as np has_pandas = True try: import pandas as pd except ImportError: has_pandas = False if has_pandas: chnames = [ch.name for ch in self] channels = np.array([np.concatenate([sec for sec in ch]) for ch in self]) date_range = pd.date_range(start=self.datetime, periods=channels.shape[1], freq='%dU' % np.round(self.dt*1e3)) return pd.DataFrame(channels.transpose(), index=date_range, columns=chnames) else: sys.stderr.write("Pandas is not available on this system\n") return None } } %{ double Recording_dt_get(Recording *r) { return r->GetXScale(); } void Recording_dt_set(Recording *r, double val) { r->SetXScale(val); } const std::string& Recording_file_description_get(Recording *r) { return r->GetFileDescription(); } void Recording_file_description_set(Recording *r, const std::string& val) { r->SetFileDescription(val); } const std::string& Recording_time_get(Recording *r) { return r->GetTime(); } void Recording_time_set(Recording *r, const std::string& val) { r->SetTime(val); } const std::string& Recording_date_get(Recording *r) { return r->GetDate(); } void Recording_date_set(Recording *r, const std::string& val) { r->SetDate(val); } const std::string& Recording_xunits_get(Recording *r) { return r->GetXUnits(); } void Recording_xunits_set(Recording *r, const std::string& val) { r->SetXUnits(val); } const std::string& Recording_comment_get(Recording *r) { return r->GetComment(); } void Recording_comment_set(Recording *r, const std::string& val) { r->SetComment(val); } PyObject* Recording_datetime_get(Recording *r) { struct tm rec_tm = r->GetDateTime(); if (rec_tm.tm_hour < 0 || rec_tm.tm_hour >= 24) { std::cerr << "Date out of range: hour is " << rec_tm.tm_hour << std::endl; } return PyDateTime_FromDateAndTime(rec_tm.tm_year+1900, rec_tm.tm_mon+1, rec_tm.tm_mday, rec_tm.tm_hour, rec_tm.tm_min, rec_tm.tm_sec, 0); } void Recording_datetime_set(Recording *r, const PyObject* val) { if (val != NULL && PyDate_Check(val)) { int year = PyDateTime_GET_YEAR(val); int month = PyDateTime_GET_MONTH(val); int day = PyDateTime_GET_DAY(val); int hour = PyDateTime_DATE_GET_HOUR(val); int minute = PyDateTime_DATE_GET_MINUTE(val); int second = PyDateTime_DATE_GET_SECOND(val); r->SetDateTime(year, month, day, hour, minute, second); } } %} %extend Channel { Channel(PyObject* SectionList, const std::string& yunits_="") : name(""), yunits(yunits_) { if (!PyList_Check(SectionList)) { std::cerr << "Argument is not a list\n"; return NULL; } Py_ssize_t listsize = PyList_Size(SectionList); std::deque
SectionCpp(listsize); for (Py_ssize_t i=0; i(argp1); SectionCpp[i] = *arg1; } // Note that array size is fixed by this allocation: Channel *ch = new Channel(SectionCpp); ch->SetYUnits(yunits_); return ch; } ~Channel() {delete $self;} std::string name; std::string yunits; Section* __getitem__(int at) { if (at >= 0 && at < (int)$self->size()) { return &(*($self))[at]; } else { myErr = 1; return NULL; } } int __len__() { return $self->size(); } } %{ const std::string& Channel_name_get(Channel *c) { return c->GetChannelName(); } void Channel_name_set(Channel *c, const std::string& val) { c->SetChannelName(val); } const std::string& Channel_yunits_get(Channel *c) { return c->GetYUnits(); } void Channel_yunits_set(Channel *c, const std::string& val) { c->SetYUnits(val); } %} %extend Section { Section(PyObject* nparray) { wrap_array(); npy_intp nplen = PyArray_DIM(nparray, 0); // Note that array size is fixed by this allocation: Section *sec = new Section(nplen, ""); double* npptr = (double*)PyArray_DATA(nparray); std::copy(&npptr[0], &npptr[nplen], &(sec->get_w()[0])); return sec; } ~Section() { delete($self); } double __getitem__(int at) { if (at >= 0 && at < (int)$self->size()) { return (*($self))[at]; } else { myErr = 1; return 0; } } int __len__() { return $self->size(); } %feature("autodoc", "Returns the section as a numpy array.") asarray; PyObject* asarray() { npy_intp dims[1] = {$self->size()}; PyObject* np_array = PyArray_SimpleNew(1, dims, NPY_DOUBLE); double* gDataP = (double*)array_data(np_array); std::copy( $self->get().begin(), $self->get().end(), gDataP); return np_array; }; } //-------------------------------------------------------------------- %feature("autodoc", 0) _read; %feature("docstring", "Reads a file and returns a recording object. Arguments: filename -- file name #ifndef TEST_MINIMAL ftype -- File type #else ftype -- File type (obsolete) #endif // TEST_MINIMAL verbose -- Show info while reading Returns: A recording object.") _read; bool _read(const std::string& filename, const std::string& ftype, bool verbose, Recording& Data); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) detect_events; %feature("kwargs") detect_events; %feature("docstring", " Arguments: ") detect_events; PyObject* detect_events(double* data, int size_data, double* templ, int size_templ, double dt, const std::string& mode="criterion", bool norm=true, double lowpass=0.5, double highpass=0.0001); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) peak_detection; %feature("kwargs") peak_detection; %feature("docstring", " Arguments: ") peak_detection; PyObject* peak_detection(double* invec, int size, double threshold, int min_distance); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %feature("autodoc", 0) risetime; %feature("kwargs") risetime; %feature("docstring", " Arguments: ") risetime; double risetime(double* invec, int size, double base, double amp, double frac=0.2); //-------------------------------------------------------------------- //-------------------------------------------------------------------- %pythoncode { import os class StfIOException(Exception): """ raises Exceptions for the Stfio module """ def __init__(self, error_msg): self.msg = error_msg def __str__(self): return repr(self.msg) filetype = { '.dat':'cfs', '.h5':'hdf5', '.abf':'abf', '.atf':'atf', '.axgd':'axg', '.axgx':'axg'} def read(fname, ftype=None, verbose=False): """Reads a file and returns a Recording object. Arguments: fname -- file name #ifndef TEST_MINIMAL ftype -- file type (string); can be one of: "cfs" - CED filing system "hdf5" - HDF5 "abf" - Axon binary file "atf" - Axon text file "axg" - Axograph X binary file "heka" - HEKA binary file if ftype is None (default), it will be guessed from the extension. #else ftype -- file type (string) is obsolete. in the past it has been used to determine the file type. Now an automated file type identification is used, and this parameter become obsolete; eventually it will be removed. #endif // TEST_MINIMAL verbose-- Show info while reading file Returns: A Recording object. """ if not os.path.exists(fname): raise StfIOException('File %s does not exist' % fname) #ifndef TEST_MINIMAL if ftype is None: ext = os.path.splitext(fname)[1] try: ftype = filetype[ext] except KeyError: raise StfIOException('Couldn\'t guess file type from extension (%s)' % ext) #endif // TEST_MINIMAL rec = Recording() if not _read(fname, ftype, verbose, rec): raise StfIOException('Error reading file') if verbose: print("") return rec def read_tdms(fn): import numpy as np import sys try: from nptdms import TdmsFile except ImportError: sys.stderr.write("nptdms module unavailable") return None tdms_file = TdmsFile(fn) try: times = np.array( [[channel.data for channel in tdms_file.group_channels(group) if channel.data is not None] for group in tdms_file.groups() if group.lower() == "time"][0][0]) dt = np.mean(np.diff(times)) except IndexError: if not "Sampling Rate" in tdms_file.object().properties.keys(): if not "Sampling Rate(AI)" in tdms_file.object().properties.keys(): dt = 1.0 else: sr = float(tdms_file.object().properties['Sampling Rate(AI)']) if sr > 0: dt = 1e3/sr else: dt = 1.0/25.0 else: sr = float(tdms_file.object().properties['Sampling Rate']) if sr > 0: dt = 1e3/sr else: dt = 1.0/25.0 return_dict = { "data": [ [channel.data.astype(np.float64) for channel in tdms_file.group_channels(group) if channel.data is not None] for group in tdms_file.groups() if group.lower()[:2] == "ai" or group.lower()[:2] == "ao"], "dt": dt, } return return_dict } //-------------------------------------------------------------------- stimfit-0.15.8/src/pystfio/stfio_neo.py0000664000175000017500000000305113062445067015040 00000000000000""" Adapter to represent stfio recordings as neo objects Based on exampleio.py and axonio.py from neo.io 08 Feb 2014, C. Schmidt-Hieber, University College London """ # needed for python 3 compatibility from __future__ import absolute_import import sys import numpy as np import stfio def neo2stfio(neo_obj): """Convert neo object to stfio recording. Restrictions: * Only converts the first block * Assumes that the sampling rate is constant throughout segments * Assumes that we have the same number of channels throughout segments * Assumes that the channel units do not change Usage: >>> import neo >>> neo_obj = neo.io.AxonIO("filename.abf") >>> import stfio >>> stfio_obj = stfio.neo.neo2stfio(neo_obj) >>> assert(stfio_obj[0][0][0] == neo_obj.read()[0].segments[0].analogsignals[0][0]) """ blocks = neo_obj.read() if len(blocks) > 1: sys.stderr.write("Warning: Only the first block" + "of this neo object will be converted\n") reference_signal = blocks[0].segments[0].analogsignals nchannels = len(reference_signal) rec = stfio.Recording([ stfio.Channel([ stfio.Section(np.array(seg.analogsignals[nc], dtype=np.float64)) for seg in blocks[0].segments ], reference_signal[nc].units.dimensionality.string) for nc in range(nchannels) ]) rec.dt = float(reference_signal[0].sampling_period.rescale('ms')) rec.xunits = "ms" return rec stimfit-0.15.8/src/pystfio/Makefile.in0000664000175000017500000011604113315356052014546 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @WITH_BIOSIGLITE_TRUE@am__append_1 = ./../libbiosiglite/libbiosiglite.la subdir = src/pystfio ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acsite.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/stfconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) am__DEPENDENCIES_1 = libpystfio_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ ./../libstfio/libstfio.la ./../libstfnum/libstfnum.la \ $(am__append_1) am_libpystfio_la_OBJECTS = libpystfio_la-pystfio.lo nodist_libpystfio_la_OBJECTS = libpystfio_la-pystfio_wrap.lo libpystfio_la_OBJECTS = $(am_libpystfio_la_OBJECTS) \ $(nodist_libpystfio_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libpystfio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(libpystfio_la_CXXFLAGS) $(CXXFLAGS) $(libpystfio_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libpystfio_la_SOURCES) $(nodist_libpystfio_la_SOURCES) DIST_SOURCES = $(libpystfio_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = ${PYTHON_TARGET_DIR}/stfio ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GT_CPPFLAGS = @GT_CPPFLAGS@ GT_CXXFLAGS = @GT_CXXFLAGS@ GT_LDFLAGS = @GT_LDFLAGS@ GT_LIBS = @GT_LIBS@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_LIBS = @HDF5_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBBIOSIG_LDFLAGS = @LIBBIOSIG_LDFLAGS@ LIBHDF5_LDFLAGS = @LIBHDF5_LDFLAGS@ LIBLAPACK_LDFLAGS = @LIBLAPACK_LDFLAGS@ LIBNUMPY_INCLUDES = @LIBNUMPY_INCLUDES@ LIBOBJS = @LIBOBJS@ LIBPYTHON_INCLUDES = @LIBPYTHON_INCLUDES@ LIBPYTHON_LDFLAGS = @LIBPYTHON_LDFLAGS@ LIBS = @LIBS@ LIBSTF_LDFLAGS = @LIBSTF_LDFLAGS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MACSETFILE = @MACSETFILE@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSTLINK_COMMAND = @POSTLINK_COMMAND@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_DIST_PKG = @PYTHON_DIST_PKG@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_NUMPY_INCLUDE = @PYTHON_NUMPY_INCLUDE@ PYTHON_PRE_DIST_PKG = @PYTHON_PRE_DIST_PKG@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ PY_AC_VERSION = @PY_AC_VERSION@ RANLIB = @RANLIB@ REZ = @REZ@ SED = @SED@ SETFILE = @SETFILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFIO_PYTHON_LIBNAME = @STFIO_PYTHON_LIBNAME@ STF_PYTHON_LIBNAME = @STF_PYTHON_LIBNAME@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ SWIG_PYTHON_CPPFLAGS = @SWIG_PYTHON_CPPFLAGS@ SWIG_PYTHON_OPT = @SWIG_PYTHON_OPT@ VERSION = @VERSION@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @ISDARWIN_FALSE@PYTHON_TARGET_DIR = ${PYTHON_PRE_DIST_PKG} @ISDARWIN_TRUE@PYTHON_TARGET_DIR = ${PYTHON_DIST_PKG} # PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} PYTHON_DEST_DIR = ${DESTDIR}${PYTHON_TARGET_DIR} pkglib_LTLIBRARIES = libpystfio.la TESTS_ENVIRONMENT = cp ./test.h5 ./ && \ cp .libs/libpystfio.so ./_stfio.so && \ $(PYTHON) TESTS = ./unittest_stfio.py PYTHON_ADDINCLUDES = $(LIBPYTHON_INCLUDES) PYTHON_ADDLDFLAGS = $(LIBPYTHON_LDFLAGS) PYTHON_ADDLIBS = nodist_libpystfio_la_SOURCES = $(top_srcdir)/src/pystfio/pystfio_wrap.cxx libpystfio_la_SOURCES = $(top_srcdir)/src/pystfio/pystfio.cxx noinst_HEADERS = $(top_srcdir)/src/pystfio/pystfio.h INCLUDES = $(LIBNUMPY_INCLUDES) $(PYTHON_ADDINCLUDES) EXTRA_DIST = ./pystfio.i ./unittest_stfio.py ./test.h5 libpystfio_la_CPPFLAGS = $(SWIG_PYTHON_CPPFLAGS) -I$(top_srcdir)/src libpystfio_la_CXXFLAGS = $(OPT_CXXFLAGS) libpystfio_la_LDFLAGS = $(PYTHON_ADDLDFLAGS) $(LIBSTF_LDFLAGS) libpystfio_la_LIBADD = $(PYTHON_ADDLIBS) ./../libstfio/libstfio.la \ ./../libstfnum/libstfnum.la $(am__append_1) # LTTARGET=${PYTHON_DIST_PKG}/stfio LTTARGET = ${PYTHON_DEST_DIR}/stfio all: all-am .SUFFIXES: .SUFFIXES: .cxx .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pystfio/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/pystfio/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libpystfio.la: $(libpystfio_la_OBJECTS) $(libpystfio_la_DEPENDENCIES) $(EXTRA_libpystfio_la_DEPENDENCIES) $(AM_V_CXXLD)$(libpystfio_la_LINK) -rpath $(pkglibdir) $(libpystfio_la_OBJECTS) $(libpystfio_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpystfio_la-pystfio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpystfio_la-pystfio_wrap.Plo@am__quote@ .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< libpystfio_la-pystfio.lo: $(top_srcdir)/src/pystfio/pystfio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpystfio_la_CPPFLAGS) $(CPPFLAGS) $(libpystfio_la_CXXFLAGS) $(CXXFLAGS) -MT libpystfio_la-pystfio.lo -MD -MP -MF $(DEPDIR)/libpystfio_la-pystfio.Tpo -c -o libpystfio_la-pystfio.lo `test -f '$(top_srcdir)/src/pystfio/pystfio.cxx' || echo '$(srcdir)/'`$(top_srcdir)/src/pystfio/pystfio.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpystfio_la-pystfio.Tpo $(DEPDIR)/libpystfio_la-pystfio.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/src/pystfio/pystfio.cxx' object='libpystfio_la-pystfio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpystfio_la_CPPFLAGS) $(CPPFLAGS) $(libpystfio_la_CXXFLAGS) $(CXXFLAGS) -c -o libpystfio_la-pystfio.lo `test -f '$(top_srcdir)/src/pystfio/pystfio.cxx' || echo '$(srcdir)/'`$(top_srcdir)/src/pystfio/pystfio.cxx libpystfio_la-pystfio_wrap.lo: $(top_srcdir)/src/pystfio/pystfio_wrap.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpystfio_la_CPPFLAGS) $(CPPFLAGS) $(libpystfio_la_CXXFLAGS) $(CXXFLAGS) -MT libpystfio_la-pystfio_wrap.lo -MD -MP -MF $(DEPDIR)/libpystfio_la-pystfio_wrap.Tpo -c -o libpystfio_la-pystfio_wrap.lo `test -f '$(top_srcdir)/src/pystfio/pystfio_wrap.cxx' || echo '$(srcdir)/'`$(top_srcdir)/src/pystfio/pystfio_wrap.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpystfio_la-pystfio_wrap.Tpo $(DEPDIR)/libpystfio_la-pystfio_wrap.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/src/pystfio/pystfio_wrap.cxx' object='libpystfio_la-pystfio_wrap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpystfio_la_CPPFLAGS) $(CPPFLAGS) $(libpystfio_la_CXXFLAGS) $(CXXFLAGS) -c -o libpystfio_la-pystfio_wrap.lo `test -f '$(top_srcdir)/src/pystfio/pystfio_wrap.cxx' || echo '$(srcdir)/'`$(top_srcdir)/src/pystfio/pystfio_wrap.cxx mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? ./unittest_stfio.py.log: ./unittest_stfio.py @p='./unittest_stfio.py'; \ b='./unittest_stfio.py'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local \ clean-pkglibLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: check-am install-am install-exec-am install-strip uninstall-am .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-local \ clean-pkglibLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-hook \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am \ install-pkglibLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am uninstall-hook uninstall-pkglibLTLIBRARIES .PRECIOUS: Makefile $(top_srcdir)/src/pystfio/pystfio_wrap.cxx $(top_srcdir)/src/pystfio/stfio.py: $(top_srcdir)/src/pystfio/pystfio.i $(SWIG) $(SWIG_PYTHON_OPT) -o $@ $< cat $(top_srcdir)/src/stimfit/py/gccwarn $(top_srcdir)/src/pystfio/pystfio_wrap.cxx > $(top_srcdir)/src/pystfio/pystfio_wrap_tmp.cxx mv $(top_srcdir)/src/pystfio/pystfio_wrap_tmp.cxx $(top_srcdir)/src/pystfio/pystfio_wrap.cxx install-exec-hook: mv ${PYTHON_DEST_DIR}/stfio/${STFIO_PYTHON_LIBNAME} ${PYTHON_DEST_DIR}/stfio/_stfio.so @BUILD_DEBIAN_TRUE@ chrpath -r ${PYTHON_DIST_PKG}/stfio ${PYTHON_DEST_DIR}/stfio/_stfio.so rm -f ${PYTHON_DEST_DIR}/stfio/*.la rm -f ${PYTHON_DEST_DIR}/stfio/*.a cp -p $(top_srcdir)/src/pystfio/__init__.py ${PYTHON_DEST_DIR}/stfio cp -p $(top_srcdir)/src/pystfio/stfio_plot.py ${PYTHON_DEST_DIR}/stfio cp -p $(top_srcdir)/src/pystfio/stfio_neo.py ${PYTHON_DEST_DIR}/stfio cp -p $(top_srcdir)/src/pystfio/stfio.py ${PYTHON_DEST_DIR}/stfio ${PYTHON} -m compileall -l ${PYTHON_DEST_DIR}/stfio chmod -x ${PYTHON_DEST_DIR}/stfio/* uninstall-hook: rm -f ${PYTHON_DEST_DIR}/stfio/*.so rm -f ${PYTHON_DEST_DIR}/stfio.pth rm -r ${PYTHON_DEST_DIR}/stfio clean-local: rm -f $(top_srcdir)/src/pystfio/pystfio_wrap.cxx $(top_srcdir)/src/pystfio/stfio.py rm -f test.h5 rm -f _stfio.so # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stimfit-0.15.8/src/Makefile.in0000664000175000017500000004732613315356052013062 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # The order is important here because libstimfit.la will be used by stfswig. @BUILD_MODULE_TRUE@am__append_1 = libstfio libstfnum pystfio @BUILD_MODULE_FALSE@am__append_2 = libstfio libstfnum stimfit stimfit/py subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acsite.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/stfconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = libstfio libstfnum pystfio stimfit stimfit/py \ libbiosiglite am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GT_CPPFLAGS = @GT_CPPFLAGS@ GT_CXXFLAGS = @GT_CXXFLAGS@ GT_LDFLAGS = @GT_LDFLAGS@ GT_LIBS = @GT_LIBS@ HDF5_CFLAGS = @HDF5_CFLAGS@ HDF5_LIBS = @HDF5_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBBIOSIG_LDFLAGS = @LIBBIOSIG_LDFLAGS@ LIBHDF5_LDFLAGS = @LIBHDF5_LDFLAGS@ LIBLAPACK_LDFLAGS = @LIBLAPACK_LDFLAGS@ LIBNUMPY_INCLUDES = @LIBNUMPY_INCLUDES@ LIBOBJS = @LIBOBJS@ LIBPYTHON_INCLUDES = @LIBPYTHON_INCLUDES@ LIBPYTHON_LDFLAGS = @LIBPYTHON_LDFLAGS@ LIBS = @LIBS@ LIBSTF_LDFLAGS = @LIBSTF_LDFLAGS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MACSETFILE = @MACSETFILE@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPT_CXXFLAGS = @OPT_CXXFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSTLINK_COMMAND = @POSTLINK_COMMAND@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_DIST_PKG = @PYTHON_DIST_PKG@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_NUMPY_INCLUDE = @PYTHON_NUMPY_INCLUDE@ PYTHON_PRE_DIST_PKG = @PYTHON_PRE_DIST_PKG@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ PY_AC_VERSION = @PY_AC_VERSION@ RANLIB = @RANLIB@ REZ = @REZ@ SED = @SED@ SETFILE = @SETFILE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFIO_PYTHON_LIBNAME = @STFIO_PYTHON_LIBNAME@ STF_PYTHON_LIBNAME = @STF_PYTHON_LIBNAME@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_LIB = @SWIG_LIB@ SWIG_PYTHON_CPPFLAGS = @SWIG_PYTHON_CPPFLAGS@ SWIG_PYTHON_OPT = @SWIG_PYTHON_OPT@ VERSION = @VERSION@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_LIBS = @WX_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @WITH_BIOSIGLITE_FALSE@SUBDIRS = $(am__append_1) $(am__append_2) @WITH_BIOSIGLITE_TRUE@SUBDIRS = libbiosiglite $(am__append_1) \ @WITH_BIOSIGLITE_TRUE@ $(am__append_2) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: stimfit-0.15.8/src/libstfio/0000775000175000017500000000000013315356572012703 500000000000000stimfit-0.15.8/src/libstfio/hdf5/0000775000175000017500000000000013315356572013531 500000000000000stimfit-0.15.8/src/libstfio/hdf5/hdf5lib.h0000775000175000017500000000312313062445067015136 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file hdf5lib.h * \author Christoph Schmidt-Hieber * \date 2008-10-03 * \brief Import from and export to hdf5. */ #ifndef _HDF5LIB_H #define _HDF5LIB_H #include "../stfio.h" class Recording; namespace stfio { //! Open a HDF5 file and store its contents to a Recording object. /*! \param fName Full path to the file to be read. * \param ReturnData On entry, an empty Recording object. On exit, * the data stored in \e fName. * \param progress True if the progress dialog should be updated. */ void importHDF5File(const std::string& fName, Recording& ReturnData, ProgressInfo& progDlg); //! Export a Recording to a HDF5 file. /*! \param fName Full path to the file to be written. * \param WData The data to be exported. * \return The HDF5 file handle. */ StfioDll bool exportHDF5File(const std::string& fName, const Recording& WData, ProgressInfo& progDlg); } #endif stimfit-0.15.8/src/libstfio/hdf5/hdf5lib.cpp0000775000175000017500000005230513062445067015477 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "hdf5.h" #if H5_VERS_MINOR > 6 #include "hdf5_hl.h" #else #include "H5TA.h" #endif #include #include #include #include "./hdf5lib.h" #include "../recording.h" const static unsigned int DATELEN = 128; const static unsigned int TIMELEN = 128; const static unsigned int UNITLEN = 16; typedef struct rt { int channels; char date[DATELEN]; char time[TIMELEN]; } rt; typedef struct ct { int n_sections; } ct; typedef struct st { double dt; char xunits[UNITLEN]; char yunits[UNITLEN]; } st; bool stfio::exportHDF5File(const std::string& fName, const Recording& WData, ProgressInfo& progDlg) { hid_t file_id = H5Fcreate(fName.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); const int NRECORDS = 1; const int NFIELDS = 3; /* Calculate the size and the offsets of our struct members in memory */ size_t rt_offset[NFIELDS] = { HOFFSET( rt, channels ), HOFFSET( rt, date ), HOFFSET( rt, time )}; /* Define an array of root tables */ rt p_data; p_data.channels = WData.size(); struct tm t = WData.GetDateTime(); std::size_t date_length = snprintf(p_data.date, DATELEN, "%04i-%02i-%02i", t.tm_year+1900, t.tm_mon+1, t.tm_mday); std::size_t time_length = snprintf(p_data.time, TIMELEN, "%02i:%02i:%02i", t.tm_hour, t.tm_min, t.tm_sec); // ensure that an undefine string is set to "\0", and that the terminating \0 is counted in string length p_data.date[date_length++] = 0; p_data.time[time_length++] = 0; /* Define field information */ const char *field_names[NFIELDS] = { "channels", "date", "time" }; hid_t field_type[NFIELDS]; /* Initialize the field field_type */ hid_t string_type1 = H5Tcopy( H5T_C_S1 ); hid_t string_type2 = H5Tcopy( H5T_C_S1 ); H5Tset_size( string_type1, date_length); H5Tset_size( string_type2, time_length); field_type[0] = H5T_NATIVE_INT; field_type[1] = string_type1; field_type[2] = string_type2; std::ostringstream desc; desc << "Description of " << fName; herr_t status = H5TBmake_table( desc.str().c_str(), file_id, "description", (hsize_t)NFIELDS, (hsize_t)NRECORDS, sizeof(rt), field_names, rt_offset, field_type, 10, NULL, 0, &p_data ); if (status < 0) { std::string errorMsg("Exception while writing description in stfio::exportHDF5File"); H5Fclose(file_id); H5close(); throw std::runtime_error(errorMsg); } hid_t comment_group = H5Gcreate2( file_id,"/comment", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* File comment. */ std::string description(WData.GetFileDescription()); if (description.length() <= 0) { description = "No description"; } status = H5LTmake_dataset_string(file_id, "/comment/description", description.c_str()); if (status < 0) { std::string errorMsg("Exception while writing description in stfio::exportHDF5File"); H5Fclose(file_id); H5close(); throw std::runtime_error(errorMsg); } std::string comment(WData.GetComment()); if (comment.length() <= 0) { comment = "No comment"; } status = H5LTmake_dataset_string(file_id, "/comment/comment", comment.c_str()); if (status < 0) { std::string errorMsg("Exception while writing comment in stfio::exportHDF5File"); H5Fclose(file_id); H5close(); throw std::runtime_error(errorMsg); } H5Gclose(comment_group); std::vector channel_name(WData.size()); hid_t channels_group = H5Gcreate2( file_id,"/channels", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); for ( std::size_t n_c=0; n_c < WData.size(); ++n_c) { /* Channel descriptions. */ std::ostringstream ossname; ossname << WData[n_c].GetChannelName(); if ( ossname.str() == "" ) { ossname << "ch" << (n_c); } channel_name[n_c] = ossname.str(); hsize_t dimsc[1] = { 1 }; hid_t string_typec = H5Tcopy( H5T_C_S1 ); std::size_t cn_length = channel_name[n_c].length(); if (cn_length <= 0) cn_length = 1; H5Tset_size( string_typec, cn_length ); std::vector datac(channel_name[n_c].length()); std::copy(channel_name[n_c].begin(),channel_name[n_c].end(), datac.begin()); std::ostringstream desc_path; desc_path << "/channels/ch" << (n_c); status = H5LTmake_dataset(file_id, desc_path.str().c_str(), 1, dimsc, string_typec, &datac[0]); if (status < 0) { std::string errorMsg("Exception while writing channel name in stfio::exportHDF5File"); H5Fclose(file_id); H5close(); throw std::runtime_error(errorMsg); } std::ostringstream channel_path; channel_path << "/" << channel_name[n_c]; hid_t channel_group = H5Gcreate2( file_id, channel_path.str().c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (channel_group < 0) { std::ostringstream errorMsg; errorMsg << "Exception while creating channel group for " << channel_path.str().c_str(); H5Fclose(file_id); H5close(); throw std::runtime_error(errorMsg.str()); } /* Calculate the size and the offsets of our struct members in memory */ size_t ct_size = sizeof( ct ); size_t ct_offset[1] = { HOFFSET( rt, channels ) }; /* Define an array of channel tables */ ct c_data = { (int)WData[n_c].size() }; /* Define field information */ const char *cfield_names[1] = { "n_sections" }; hid_t cfield_type[1] = {H5T_NATIVE_INT}; std::ostringstream c_desc; c_desc << "Description of channel " << n_c; status = H5TBmake_table( c_desc.str().c_str(), channel_group, "description", (hsize_t)1, (hsize_t)1, ct_size, cfield_names, ct_offset, cfield_type, 10, NULL, 0, &c_data ); if (status < 0) { std::string errorMsg("Exception while writing channel description in stfio::exportHDF5File"); H5Fclose(file_id); H5close(); throw std::runtime_error(errorMsg); } int max_log10 = 0; if (WData[n_c].size() > 1) { max_log10 = int(log10((double)WData[n_c].size()-1.0)); } for (std::size_t n_s=0; n_s < WData[n_c].size(); ++n_s) { int progbar = // Channel contribution: (int)(((double)n_c/(double)WData.size())*100.0+ // Section contribution: (double)(n_s)/(double)WData[n_c].size()*(100.0/WData.size())); std::ostringstream progStr; progStr << "Writing channel #" << n_c + 1 << " of " << WData.size() << ", Section #" << n_s << " of " << WData[n_c].size(); progDlg.Update(progbar, progStr.str()); // construct a number with leading zeros: int n10 = 0; if (n_s > 0) { n10 = int(log10((double)n_s)); } std::ostringstream strZero; strZero << ""; for (int n_z=n10; n_z < max_log10; ++n_z) { strZero << "0"; } // construct a section name: std::ostringstream section_name; section_name << WData[n_c][n_s].GetSectionDescription(); if ( section_name.str() == "" ) { section_name << "sec" << n_s; } // create a child group in the channel: std::ostringstream section_path; section_path << channel_path.str() << "/" << "section_" << strZero.str() << n_s; hid_t section_group = H5Gcreate2( file_id, section_path.str().c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); // add data and description, store as 32 bit little endian independent of machine: hsize_t dims[1] = { WData[n_c][n_s].size() }; std::ostringstream data_path; data_path << section_path.str() << "/data"; Vector_float data_cp(WData[n_c][n_s].get().size()); /* 32 bit */ for (std::size_t n_cp = 0; n_cp < WData[n_c][n_s].get().size(); ++n_cp) { data_cp[n_cp] = float(WData[n_c][n_s][n_cp]); } status = H5LTmake_dataset(file_id, data_path.str().c_str(), 1, dims, H5T_IEEE_F32LE, &data_cp[0]); if (status < 0) { std::string errorMsg("Exception while writing data in stfio::exportHDF5File"); H5Fclose(file_id); H5close(); throw std::runtime_error(errorMsg); } const int NSRECORDS = 1; const int NSFIELDS = 3; /* Calculate the size and the offsets of our struct members in memory */ size_t st_size = sizeof( st ); size_t st_offset[NSFIELDS] = { HOFFSET( st, dt ), HOFFSET( st, xunits ), HOFFSET( st, yunits )}; /* Define an array of root tables */ st s_data; s_data.dt = WData.GetXScale(); if (WData.GetXUnits().length() < UNITLEN) strcpy( s_data.xunits, WData.GetXUnits().c_str() ); if (WData[n_c].GetYUnits().length() < UNITLEN) strcpy( s_data.yunits, WData[n_c].GetYUnits().c_str() ); /* Define field information */ const char *sfield_names[NSFIELDS] = { "dt", "xunits", "yunits" }; hid_t sfield_type[NSFIELDS]; /* Initialize the field field_type */ hid_t string_type4 = H5Tcopy( H5T_C_S1 ); hid_t string_type5 = H5Tcopy( H5T_C_S1 ); H5Tset_size( string_type4, 2); std::size_t yu_length = WData[n_c].GetYUnits().length(); if (yu_length <= 0) yu_length = 1; H5Tset_size( string_type5, yu_length ); sfield_type[0] = H5T_NATIVE_DOUBLE; sfield_type[1] = string_type4; sfield_type[2] = string_type5; std::ostringstream sdesc; sdesc << "Description of " << section_name.str(); status = H5TBmake_table( sdesc.str().c_str(), section_group, "description", (hsize_t)NSFIELDS, (hsize_t)NSRECORDS, st_size, sfield_names, st_offset, sfield_type, 10, NULL, 0, &s_data ); if (status < 0) { std::string errorMsg("Exception while writing section description in stfio::exportHDF5File"); H5Fclose(file_id); H5close(); throw std::runtime_error(errorMsg); } H5Gclose(section_group); } H5Gclose(channel_group); } H5Gclose(channels_group); /* Terminate access to the file. */ status = H5Fclose(file_id); if (status < 0) { std::string errorMsg("Exception while closing file in stfio::exportHDF5File"); throw std::runtime_error(errorMsg); } /* Release all hdf5 resources */ status = H5close(); if (status < 0) { std::string errorMsg("Exception while closing file in stfio::exportHDF5File"); throw std::runtime_error(errorMsg); } return (status >= 0); } void stfio::importHDF5File(const std::string& fName, Recording& ReturnData, ProgressInfo& progDlg) { /* Create a new file using default properties. */ hid_t file_id = H5Fopen(fName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); /* H5TBread_table const int NRECORDS = 1;*/ const int NFIELDS = 3; /* Calculate the size and the offsets of our struct members in memory */ size_t rt_offset[NFIELDS] = { HOFFSET( rt, channels ), HOFFSET( rt, date ), HOFFSET( rt, time )}; rt rt_buf[1]; size_t rt_sizes[NFIELDS] = { sizeof( rt_buf[0].channels), sizeof( rt_buf[0].date), sizeof( rt_buf[0].time)}; herr_t status=H5TBread_table( file_id, "description", sizeof(rt), rt_offset, rt_sizes, rt_buf ); if (status < 0) { std::string errorMsg("Exception while reading description in stfio::importHDF5File"); throw std::runtime_error(errorMsg); } int numberChannels =rt_buf[0].channels; if ( ReturnData.SetDate(rt_buf[0].date) || ReturnData.SetTime(rt_buf[0].time) ) { std::cout << "Warning HDF5: could not decode date/time " << rt_buf[0].date << " " << rt_buf[0].time << std::endl; } /* Create the data space for the dataset. */ hsize_t dims; H5T_class_t class_id; size_t type_size; std::string description, comment; hid_t group_id = H5Gopen2(file_id, "/comment", H5P_DEFAULT); status = H5Lexists(group_id, "/comment/description", 0); if (status==1) { status = H5LTget_dataset_info( file_id, "/comment/description", &dims, &class_id, &type_size ); if (status >= 0) { description.resize( type_size ); status = H5LTread_dataset_string (file_id, "/comment/description", &description[0]); if (status < 0) { std::string errorMsg("Exception while reading description in stfio::importHDF5File"); throw std::runtime_error(errorMsg); } } } ReturnData.SetFileDescription(description); status = H5Lexists(group_id, "/comment/comment", 0); if (status==1) { status = H5LTget_dataset_info( file_id, "/comment/comment", &dims, &class_id, &type_size ); if (status >= 0) { comment.resize( type_size ); status = H5LTread_dataset_string (file_id, "/comment/comment", &comment[0]); if (status < 0) { std::string errorMsg("Exception while reading comment in stfio::importHDF5File"); throw std::runtime_error(errorMsg); } } } ReturnData.SetComment(comment); double dt = 1.0; std::string yunits = ""; for (int n_c=0;n_c szchannel_name(ctype_size); // szchannel_name.reset( new char[ctype_size] ); status = H5LTread_dataset(file_id, desc_path.str().c_str(), string_typec, &szchannel_name[0] ); if (status < 0) { std::string errorMsg("Exception while reading channel name in stfio::importHDF5File"); throw std::runtime_error(errorMsg); } std::ostringstream channel_name; for (std::size_t c=0; c 1) { max_log10 = int(log10((double)ct_buf[0].n_sections-1.0)); } for (int n_s=0; n_s < ct_buf[0].n_sections; ++n_s) { int progbar = // Channel contribution: (int)(((double)n_c/(double)numberChannels)*100.0+ // Section contribution: (double)(n_s)/(double)ct_buf[0].n_sections*(100.0/numberChannels)); std::ostringstream progStr; progStr << "Reading channel #" << n_c + 1 << " of " << numberChannels << ", Section #" << n_s+1 << " of " << ct_buf[0].n_sections; progDlg.Update(progbar, progStr.str()); // construct a number with leading zeros: int n10 = 0; if (n_s > 0) { n10 = int(log10((double)n_s)); } std::ostringstream strZero; strZero << ""; for (int n_z=n10; n_z < max_log10; ++n_z) { strZero << "0"; } // construct a section name: std::ostringstream section_name; section_name << "sec" << n_s; // create a child group in the channel: std::ostringstream section_path; section_path << channel_path.str() << "/" << "section_" << strZero.str() << n_s; hid_t section_group = H5Gopen2(file_id, section_path.str().c_str(), H5P_DEFAULT ); std::ostringstream data_path; data_path << section_path.str() << "/data"; hsize_t sdims; H5T_class_t sclass_id; size_t stype_size; status = H5LTget_dataset_info( file_id, data_path.str().c_str(), &sdims, &sclass_id, &stype_size ); if (status < 0) { std::string errorMsg("Exception while reading data information in stfio::importHDF5File"); throw std::runtime_error(errorMsg); } Vector_float TempSection(sdims); status = H5LTread_dataset(file_id, data_path.str().c_str(), H5T_IEEE_F32LE, &TempSection[0]); if (status < 0) { std::string errorMsg("Exception while reading data in stfio::importHDF5File"); throw std::runtime_error(errorMsg); } Section TempSectionT(TempSection.size(), section_name.str()); for (std::size_t cp = 0; cp < TempSectionT.size(); ++cp) { TempSectionT[cp] = double(TempSection[cp]); } // std::copy(TempSection.begin(),TempSection.end(),&TempSectionT[0]); try { TempChannel.InsertSection(TempSectionT,n_s); } catch (...) { throw; } /* H5TBread_table const int NSRECORDS = 1; */ const int NSFIELDS = 3; /* Calculate the size and the offsets of our struct members in memory */ size_t st_offset[NSFIELDS] = { HOFFSET( st, dt ), HOFFSET( st, xunits ), HOFFSET( st, yunits )}; st st_buf[1]; size_t st_sizes[NSFIELDS] = { sizeof( st_buf[0].dt), sizeof( st_buf[0].xunits), sizeof( st_buf[0].yunits)}; status=H5TBread_table( section_group, "description", sizeof(st), st_offset, st_sizes, st_buf ); if (status < 0) { std::string errorMsg("Exception while reading data description in stfio::importHDF5File"); throw std::runtime_error(errorMsg); } dt = st_buf[0].dt; yunits = st_buf[0].yunits; H5Gclose( section_group ); } try { if ((int)ReturnData.size() #if ( __WORDSIZE == 64 ) || defined (__APPLE__) #define CFSLONG int #else #define CFSLONG long #endif #include /* Needed for various types */ #include /* ditto */ #include /* for LDBL_DIG */ #if defined(WIN32) || defined (_MSC_VER) /* if its windows define our windows symbol */ #define _IS_WINDOWS_ /* WIN32 is defined for 32-bit at moment */ #undef _IS_MSDOS_ /* and we arent doing msdos after all */ #endif #ifdef _INC_WINDOWS /* the alternative windows symbolic defn */ #ifndef _IS_WINDOWS_ /* as above but _INC_WINDOWS is for 16 bit */ #define _IS_WINDOWS_ #endif #undef _IS_MSDOS_ /* and we arent doing msdos after all */ #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) /* Now set up for windows use */ #include #define F_memcpy memcpy /* Define model-independent routines */ #define F_memmove memmove #define F_strlen strlen #define F_strcat strcat #define F_strcpy strcpy #define F_strcmp strcmp #define F_strncat strncat #define F_strncpy strncpy #define F_strncmp strncmp #define F_strchr strchr #define _fstrrchr strrchr #define _near /* stop compiler errors for 32 bit compile*/ #define DllExport __declspec(dllexport) #define DllImport __declspec(dllimport) typedef CFSLONG Coord; /* this is LONG in the MacApp definitions */ typedef double fdouble; #define FDBL_DIG DBL_DIG #define FDBL_MAX DBL_MAX typedef HGLOBAL THandle; #define F_malloc malloc #define F_free free #define M_AllocMem(x) GlobalAlloc(GMEM_MOVEABLE,x) #define M_AllocClear(x) GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,x) #define M_FreeMem(x) GlobalFree(x) #define M_LockMem(x) GlobalLock(x) #define M_MoveLockMem(x) GlobalLock(x) #define M_UnlockMem(x) (GlobalUnlock(x)==0) #define M_NewMemSize(x,y) (x = GlobalReAlloc(x,y,GMEM_MOVEABLE)) #define M_GetMemSize(x) GlobalSize(x) #else #define F_memcpy memcpy #define F_memmove memmove #define F_strlen strlen #define F_strcat strcat #define F_strcpy strcpy #define F_strcmp strcmp #define F_strncat strncat #define F_strncpy strncpy #define F_strncmp strncmp #define F_strchr strchr #define FAR #define PASCAL #define _far #define _near #define DllExport #define DllImport #define FDBL_DIG LDBL_DIG #define FDBL_MAX LDBL_MAX typedef char * LPSTR; typedef const char * LPCSTR; typedef unsigned short WORD; // typedef unsigned CFSLONG DWORD; typedef unsigned char BYTE; typedef long double fdouble; typedef CFSLONG Coord; /* Borrowed from MacApp */ typedef WORD THandle; #define F_malloc malloc #define F_free free #define M_AllocMem(x) NewHandle(x) #define M_AllocClear(x) NewHandleClear(x) #define M_FreeMem(x) DisposHandle(x) #define M_LockMem(x) (HLock(x),*x) #define M_MoveLockMem(x) (HLockHi(x),*x) #define M_UnlockMem(x) (HUnlock(x),TRUE) #define M_NewMemSize(x,y) (SetHandleSize(x,y),MemError() == 0) #define M_GetMemSize(x) GetHandleSize(x) #endif /*UNIX*/ #endif /* not defined __MACHINE__ */ stimfit-0.15.8/src/libstfio/cfs/cfs.h0000775000175000017500000002400113062445067014317 00000000000000/***************************************************************************** ** ** cfs.h ** 78 cols --->* ** Header file for MSC version of CFS functions. ** Definitions of the structures and routines for the CFS filing * ** system. This is the include file for standard use, all access * ** is by means of functions - no access to the internal CFS data. The file * ** machine.h provides some common definitions across separate platforms, * ** note that the MS variants are designed to accomodate medium model - far * ** pointers are explicitly used where necessary. ** ** CFSAPI Don't declare this to give a pascal type on the Mac, there is a MPW ** compiler bug that corrupts floats passed to pascal functions!!!!!! ** */ #ifndef __CFS__ #define __CFS__ #include "machine.h" #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) #include #define qDebug 0 /* only used to debug Mac stuff */ #define CFSAPI(type) type WINAPI #undef LLIO #undef USEHANDLES #ifdef _MSC_VER #pragma warning( disable : 4251 ) // Disable warning messages #pragma warning( disable : 4996 ) // Disable warning messages #endif #else #define qDebug 0 /* only used to debug Mac stuff */ #if !defined(__APPLE__) && !defined(__MINGW32) #include #endif #include /* MSC I/O function definitions */ #include #include #define CFSAPI(type) type #endif #define FILEVAR 0 /* Constants to indicate whether variable is */ #define DSVAR 1 /* file or data section variable. */ #define INT1 0 /* DATA VARIABLE STORAGE TYPES */ #define WRD1 1 #define INT2 2 #define WRD2 3 #define INT4 4 #define RL4 5 #define RL8 6 #define LSTR 7 #define SUBSIDIARY 2 /* Chan Data Storage types */ #define MATRIX 1 #define EQUALSPACED 0 /* Chan Data Storage types */ #define noFlags 0 /* Declare a default flag */ /* Definitions of bits for DS flags */ #define FLAG7 1 #define FLAG6 2 #define FLAG5 4 #define FLAG4 8 #define FLAG3 16 #define FLAG2 32 #define FLAG1 64 #define FLAG0 128 #define FLAG15 256 #define FLAG14 512 #define FLAG13 1024 #define FLAG12 2048 #define FLAG11 4096 #define FLAG10 8192 #define FLAG9 16384 #define FLAG8 32768 /* define numbers of characters in various string types */ #define DESCCHARS 20 #define FNAMECHARS 12 #define COMMENTCHARS 72 #define UNITCHARS 8 /*character arrays used in data structure */ typedef char TDataType; typedef char TCFSKind; typedef char TDesc[DESCCHARS+2]; /* Names in descriptions, 20 chars */ typedef char TFileName[FNAMECHARS+2]; /* File names, 12 chars */ typedef char TComment[COMMENTCHARS+2]; /* Comment, 72 chars max */ typedef char TUnits[UNITCHARS+2]; /* For units, 8 chars */ /* other types for users benefit */ typedef WORD TSFlags; /* for data and data section variables */ typedef struct { TDesc varDesc; /* users description of variable */ TDataType vType; /* one of 8 types allowed */ char zeroByte; /* for MS Pascal compatibility */ TUnits varUnits; /* users name for units */ short vSize; /* for type lstr gives no. of chars +1 for length byte */ } TVarDesc; #if !defined(_IS_WINDOWS_) || defined(__MINGW32__) typedef char * TpStr; typedef const char * TpCStr; typedef short * TpShort; typedef float * TpFloat; typedef CFSLONG * TpLong; typedef void * TpVoid; typedef TSFlags * TpFlags; typedef TDataType * TpDType; typedef TCFSKind * TpDKind; typedef TVarDesc * TpVDesc; typedef const TVarDesc * TpCVDesc; typedef THandle * TpHandle; typedef signed char * TpSStr; typedef WORD * TpUShort; #else typedef char FAR * TpStr; typedef const char FAR * TpCStr; typedef short FAR * TpShort; typedef float FAR * TpFloat; typedef CFSLONG FAR * TpLong; typedef void FAR * TpVoid; typedef TSFlags FAR * TpFlags; typedef TDataType FAR * TpDType; typedef TCFSKind FAR * TpDKind; typedef TVarDesc FAR * TpVDesc; typedef const TVarDesc FAR * TpCVDesc; typedef THandle FAR * TpHandle; typedef signed char FAR * TpSStr; typedef WORD FAR * TpUShort; #endif #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) typedef HANDLE fDef; /* WIN32 file handle */ #else #ifdef LLIO typedef short fDef; /* file handle */ #else typedef FILE* fDef; /* stream identifier */ #endif #endif #ifdef __cplusplus extern "C" { #endif /* ** Now definitions of the functions defined in the code */ CFSAPI(short) CreateCFSFile(TpCStr fname, TpCStr comment, WORD blocksize, short channels, TpCVDesc fileArray, TpCVDesc DSArray, short fileVars, short DSVars); CFSAPI(void) SetFileChan(short handle, short channel, TpCStr channelName, TpCStr yUnits, TpCStr xUnits, TDataType dataType, TCFSKind dataKind, short spacing, short other); CFSAPI(void) SetDSChan(short handle, short channel, WORD dataSection, CFSLONG startOffset, CFSLONG points, float yScale, float yOffset, float xScale, float xOffset); CFSAPI(short) WriteData(short handle, WORD dataSection, CFSLONG startOffset, WORD bytes, TpVoid dataADS); CFSAPI(short) ClearDS(short handle); CFSAPI(void) SetWriteData(short handle, CFSLONG startOffset, CFSLONG bytes); CFSAPI(CFSLONG) CFSFileSize(short handle); CFSAPI(short) InsertDS(short handle, WORD dataSection, TSFlags flagSet); CFSAPI(short) AppendDS(short handle, CFSLONG lSize, TSFlags flagSet); CFSAPI(void) RemoveDS(short handle, WORD dataSection); CFSAPI(void) SetComment(short handle, TpCStr comment); CFSAPI(void) SetVarVal(short handle, short varNo, short varKind, WORD dataSection, TpVoid varADS); CFSAPI(short) CloseCFSFile(short handle); CFSAPI(short) OpenCFSFile(TpCStr fname, short enableWrite, short memoryTable); CFSAPI(void) GetGenInfo(short handle, TpStr time, TpStr date, TpStr comment); CFSAPI(void) GetFileInfo(short handle, TpShort channels, TpShort fileVars, TpShort DSVars, TpUShort dataSections); CFSAPI(void) GetVarDesc(short handle, short varNo, short varKind, TpShort varSize, TpDType varType, TpStr units, TpStr description); CFSAPI(void) GetVarVal(short handle, short varNo, short varKind, WORD dataSection, TpVoid varADS); CFSAPI(void) GetFileChan(short handle, short channel, TpStr channelName, TpStr yUnits, TpStr xUnits, TpDType dataType, TpDKind dataKind, TpShort spacing, TpShort other); CFSAPI(void) GetDSChan(short handle, short channel, WORD dataSection, TpLong startOffset, TpLong points, TpFloat yScale, TpFloat yOffset, TpFloat xScale, TpFloat xOffset); CFSAPI(WORD) GetChanData(short handle, short channel, WORD dataSection, CFSLONG firstElement, WORD numberElements, TpVoid dataADS, CFSLONG areaSize); CFSAPI(CFSLONG) GetDSSize(short handle, WORD dataSection); CFSAPI(short) ReadData(short handle, WORD dataSection, CFSLONG startOffest, WORD bytes, TpVoid dataADS); CFSAPI(WORD) DSFlagValue(int nflag); CFSAPI(void) DSFlags(short handle, WORD dataSection, short setIt, TpFlags pflagSet); CFSAPI(short) FileError(TpShort handleNo, TpShort procNo, TpShort errNo); CFSAPI(short) CommitCFSFile(short handle); #ifdef __cplusplus } #endif #endif /* __CFS__ */ stimfit-0.15.8/src/libstfio/cfs/cfslib.cpp0000775000175000017500000005675313062445067015364 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include "./cfslib.h" #include "./cfs.h" #include "../recording.h" namespace stfio { int CFSError(std::string& errorMsg); std::string CFSReadVar(short fHandle,short varNo,short varKind); // Resource management of CFS files // Management of read-only files: class CFS_IFile { public: explicit CFS_IFile(const std::string& filename); ~CFS_IFile(); short myHandle; }; // Management of write-only files: class CFS_OFile { public: explicit CFS_OFile( const std::string& filename, const std::string& comment, std::size_t nChannels=1 ); ~CFS_OFile(); short myHandle; }; const int CFSMAXBYTES=64000; // adopted from FPCfs.ips by U Froebe } stfio::CFS_IFile::CFS_IFile(const std::string& filename) { myHandle = OpenCFSFile(filename.c_str(),0,1); } stfio::CFS_IFile::~CFS_IFile() { if (myHandle>0) { CloseCFSFile(myHandle); } } // Management of write-only files: stfio::CFS_OFile::CFS_OFile(const std::string& filename,const std::string& comment,std::size_t nChannels) { TVarDesc *c_DSArray, *c_fileArray; c_DSArray=NULL; c_fileArray=NULL; myHandle=CreateCFSFile(filename.c_str(), comment.c_str(), 512, (short)nChannels, c_fileArray, c_DSArray, 0/*number of file vars*/, 0/*number of section vars*/); } stfio::CFS_OFile::~CFS_OFile() { CloseCFSFile(myHandle); } int stfio::CFSError(std::string& errorMsg) { short pHandle; short pFunc; short pErr; if (!FileError(&pHandle,&pFunc,&pErr)) return 0; errorMsg = "Error in stfio::"; switch (pFunc) { case (1): errorMsg += "SetFileChan()"; break; case (2): errorMsg += "SetDSChan()"; break; case (3): errorMsg += "SetWriteData()"; break; case (4): errorMsg += "RemoveDS()"; break; case (5): errorMsg += "SetVarVal()"; break; case (6): errorMsg += "GetGenInfo()"; break; case (7): errorMsg += "GetFileInfo()"; break; case (8): errorMsg += "GetVarDesc()"; break; case (9): errorMsg += "GetVarVal()"; break; case (10): errorMsg += "GetFileChan()"; break; case (11): errorMsg += "GetDSChan()"; break; case (12): errorMsg += "DSFlags()"; break; case (13): errorMsg += "OpenCFSFile()"; break; case (14): errorMsg += "GetChanData()"; break; case (15): errorMsg += "SetComment()"; break; case (16): errorMsg += "CommitCFSFile()"; break; case (17): errorMsg += "InsertDS()"; break; case (18): errorMsg += "CreateCFSFile()"; break; case (19): errorMsg += "WriteData()"; break; case (20): errorMsg += "ClearDS()"; break; case (21): errorMsg += "CloseCFSFile()"; break; case (22): errorMsg += "GetDSSize()"; break; case (23): errorMsg += "ReadData()"; break; case (24): errorMsg += "CFSFileSize()"; break; case (25): errorMsg += "AppendDS()"; break; default : errorMsg += ", unknown function"; break; } errorMsg += ":\n"; switch (pErr) { case (-1): errorMsg += "No spare file handles."; break; case (-2): errorMsg += "File handle out of range 0-2."; break; case (-3): errorMsg += " File not open for writing."; break; case (-4): errorMsg += "File not open for editing/writing."; break; case (-5): errorMsg += "File not open for editing/reading."; break; case (-6): errorMsg += "File not open."; break; case (-7): errorMsg += "The specified file is not a CFS file."; break; case (-8): errorMsg += "Unable to allocate the memory needed for the filing system data."; break; case (-11): errorMsg += "Creation of file on disk failed (writing only)."; break; case (-12): errorMsg += "Opening of file on disk failed (reading only)."; break; case (-13): errorMsg += "Error reading from data file."; break; case (-14): errorMsg += "Error writing to data file."; break; case (-15): errorMsg += "Error reading from data section pointer file."; break; case (-16): errorMsg += "Error writing to data section pointer file."; break; case (-17): errorMsg += "Error seeking disk position."; break; case (-18): errorMsg += "Error inserting final data section of the file."; break; case (-19): errorMsg += "Error setting the file length."; break; case (-20): errorMsg += "Invalid variable description."; break; case (-21): errorMsg += "Parameter out of range 0-99."; break; case (-22): errorMsg += "Channel number out of range"; break; case (-24): errorMsg += "Invalid data section number (not in the range 1 to total number of sections)."; break; case (-25): errorMsg += "Invalid variable kind (not 0 for file variable or 1 for DS variable)."; break; case (-26): errorMsg += "Invalid variable number."; break; case (-27): errorMsg += "Data size specified is out of the correct range."; break; case (-30): case (-31): case (-32): case (-33): case (-34): case (-35): case (-36): case (-37): case (-38): case (-39): errorMsg += "Wrong CFS version number in file"; break; default : errorMsg += "An unknown error occurred"; break; } return pErr; } std::string stfio::CFSReadVar(short fHandle,short varNo,short varKind) { std::string errorMsg; std::ostringstream outputstream; TUnits units; std::vector description(DESCCHARS); short varSize=0; TDataType varType; //Get description of a particular file variable //- see manual of CFS file system GetVarDesc(fHandle,varNo,varKind,&varSize,&varType,units,&description[0]); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); //I haven't found a way to directly pass a std::string to GetVarDesc; //passing &s_description[0] won't work correctly. // Added 11/27/06, CSH: Should be possible with vector std::string s_description(description.begin(), description.end()); if (s_description.substr(0,5) != "Spare") { switch (varType) { //Begin switch 'varType' case INT1: case INT2: case INT4: { short shortBuffer=0; //Read the value of the file variable //- see manual of CFS file system GetVarVal(fHandle,varNo,varKind, 1,&shortBuffer); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); outputstream << s_description << " " << shortBuffer << " " << units; break; } case WRD1: case WRD2: { unsigned short ushortBuffer=0; GetVarVal(fHandle,varNo,varKind, 1,&ushortBuffer); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); outputstream << s_description << " " << ushortBuffer << " " << units; break; } case RL4: case RL8: { float floatBuffer=0; GetVarVal(fHandle,varNo,varKind, 1,&floatBuffer); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); outputstream << s_description << " " << floatBuffer << " " << units; break; } case LSTR: { std::vector vc(varSize+2); GetVarVal(fHandle,varNo,varKind, 1, &vc[0]); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); std::string s; s.resize(vc.size()); int ns = 0; for (std::vector::iterator it=vc.begin(); it != vc.end(); ++it) { if ((int)*it == 13) s[ns] = '\n'; else if ((int)*it < 0) s[ns] = '?'; else s[ns] = *it; ns++; } if (s_description.substr(0,11) == "ScriptBlock") { outputstream << s; } else { outputstream << s_description << " " << s; } break; } default: break; } //End switch 'varType' if (s_description.substr(0,11) != "ScriptBlock" ) { outputstream << "\n"; } } return outputstream.str(); } bool stfio::exportCFSFile(const std::string& fName, const Recording& WData, stfio::ProgressInfo& progDlg) { std::string errorMsg; if (fName.length()>1024) { throw std::runtime_error( "Sorry for the inconvenience, but the CFS\n" "library is a bit picky with filenames.\n" "Please restrict yourself to less than\n" "1024 characters.\n" ); } CFS_OFile CFSFile(fName, WData.GetComment(), WData.size()); if (CFSFile.myHandle<0) { std::string errorMsg; CFSError(errorMsg); throw std::runtime_error(errorMsg); } for (std::size_t n_c=0;n_c points(dataSections); TDataType dataType; TCFSKind dataKind; short spacing, other; float xScale=1.0; std::size_t empty_channels=0; for (short n_channel=0; n_channel < channelsAvail; ++n_channel) { //Get constant information for a particular data channel - //see manual of CFS file system. std::vector vchannel_name(22),vyUnits(10),vxUnits(10); CFSLONG startOffset; GetFileChan(CFSFile.myHandle, n_channel, &vchannel_name[0], &vyUnits[0], &vxUnits[0], &dataType, &dataKind, &spacing, &other); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); std::string channel_name(&vchannel_name[0]), xUnits(&vxUnits[0]), yUnits(&vyUnits[0]); //Memory allocation for the current channel float yScale, yOffset, xOffset; //Begin loop: read scaling and offsets //Write the formatted string from 'n_channel' and 'channel_name' to 'buffer' std::ostringstream outputstream; outputstream << "Channel " << n_channel << " (" << channel_name.c_str() << ")\n"; scaling += outputstream.str(); //Get the channel information for a data section or a file //- see manual of CFS file system GetDSChan(CFSFile.myHandle, n_channel /*first channel*/, 1 /*first section*/, &startOffset, &points[0], &yScale, &yOffset,&xScale,&xOffset); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); //Write the formatted string from 'yScale' to 'buffer' outputstream.clear(); outputstream << "Yscale=" << yScale << "\n"; scaling += outputstream.str(); //Write the formatted string from 'xScale' to 'buffer' outputstream.clear(); outputstream << "Xscale=" << xScale << "\n"; scaling += outputstream.str(); //Write the formatted string from 'yOffset' to 'buffer' outputstream.clear(); outputstream << "YOffset=" << yOffset << "\n"; scaling += outputstream.str(); //Write the formatted string from 'xOffset' to 'buffer' outputstream.clear(); outputstream << "XOffset=" << xOffset << "\n"; scaling += outputstream.str(); Channel TempChannel(dataSections); TempChannel.SetChannelName(channel_name); TempChannel.SetYUnits(yUnits); std::size_t empty_sections=0; for (int n_section=0; n_section < dataSections; ++n_section) { int progbar = // Channel contribution: (int)(((double)n_channel/(double)channelsAvail)*100.0+ // Section contribution: (double)n_section/(double)dataSections*(100.0/channelsAvail)); std::ostringstream progStr; progStr << "Reading channel #" << n_channel + 1 << " of " << channelsAvail << ", Section #" << n_section+1 << " of " << dataSections; progDlg.Update(progbar, progStr.str()); //Begin loop: n_sections //Get the channel information for a data section or a file //- see manual of CFS file system CFSLONG startOffset; float yScale, yOffset, xOffset; GetDSChan(CFSFile.myHandle,(short)n_channel,(WORD)n_section+1,&startOffset, &points[n_section],&yScale,&yOffset,&xScale,&xOffset); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); std::ostringstream label; label << fName << ", Section # " << n_section+1; Section TempSection( (int)(points[n_section]), label.str() ); //----------------------------------------------------- //The following part was modified to read data sections //larger than 64 KB as e.g. produced by Igor. //Adopted from FPCfs.ipf by U Froebe //Sections with a size larger than 64 KB have been made //possible by dividing CFS-sections into 'blocks' //----------------------------------------------------- int nBlocks, //number of blocks nBlockBytes; //number of bytes per block //Calculation of the number of blocks depending on the data format: //RL4 - 4 byte floating point numbers (2 byte int numbers otherwise) if (dataType == RL4) nBlocks=(int)(((points[n_section]*4-1)/CFSMAXBYTES) + 1); else nBlocks=(int)(((points[n_section]*2-1)/CFSMAXBYTES) + 1); for (int b=0; b < nBlocks; ++b) { //Begin loop: storage of blocks if (dataType == RL4) { //4 byte data //Read data of the current channel and data section //- see manual of CFS file system //Temporary arrays to store blocks: if (b == nBlocks - 1) nBlockBytes=points[n_section]*4 - b*CFSMAXBYTES; else nBlockBytes=CFSMAXBYTES; Vector_float fTempSection_small(nBlockBytes); GetChanData(CFSFile.myHandle, (short)n_channel, (WORD)n_section+1, b*CFSMAXBYTES/4, (WORD)nBlockBytes/4, &fTempSection_small[0], 4*(points[n_section]+1)); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); for (int n=0; n TempSection_small(nBlockBytes); GetChanData(CFSFile.myHandle, (short)n_channel, (WORD)n_section+1, b*CFSMAXBYTES/2, (WORD)nBlockBytes/2, &TempSection_small[0], 2*(points[n_section]+1)); if (CFSError(errorMsg)) throw std::runtime_error(errorMsg); for (int n=0; n= 64k now work without crashing or inefficency in ** the 32 bit build. ** ** v 2.65 SMP 16/Aug/00 ** AppendDS no longer looses changes to the previously appended DS ** In particular the scaling factors are maintained. ** ** v 2.66 SMP 13/Mar/01 ** ASSERT definition changed to use _DEBUG and not DEBUG ** Meaningless ASSERT removed from AppendDS ** ** v 2.67 SMP 27/Feb/02 ** CreateCFSFile was trying to flag errors by setting a handle to ** -1. This wouldn't work under Windows so errors went unreported. ** ** v 2.68 SMP 17/Jan/03 ** Added SUBSIDIARY channel kind *****************************************************************************/ #include /* C library I/O functions */ #include /* C library type checking functions */ #include /* C library data conversion + misc functions */ #include /* C library time and date functions */ #include /* C library string function definitions */ /************************************************************************* ** ** These are the machine specific definitions and includes. Some of them ** are not really machine specific, but I've put them here anyway. first ** of all are the system defines, next machine global, finally specific ** ** Remove the NDEBUG definition to cause the asserts to be used ** The LLIO (low level i/o) should be undefined to use streams library and ** defined for low level. This is to make it a bit easier to implement the ** code on different machines which may not have the low level stuff. ** LLIO is defined in cfs.h and used in cfs.h and here ** ** ** macintosh and MSC are set by the compiler, and define machine type ** _IS_MSDOS_ set in machine.h for an msdos native mode build ** _IS_WINDOWS_ set in machine.h for windows 16 or 32 bit mode ** qDebug (mac)set by MPW to enable debug fprintf ** ** NDEBUG gets rid of the asserts. ** USEHANDLES To use memory handles in place of pointers. This form is ** supported by code generated for the Mac and Windows forms. ** Actually, it is ignored. ** ** LLIO (dos) if defined, low level I/O is used, otherwise streams. ** CFSCONVERT (mac) define if we should convert format (little-big endian) ** [convert (mac) specifies direction of conversion - for CfsConvert] ** ** #undef NDEBUG No asserts if this is defined ** */ #if defined(qDebug) || defined(_STFDEBUG) #undef NDEBUG #include #define ASSERT(x) assert(x) #else #define NDEBUG 1 #define ASSERT(x) #endif #include "cfs.h" /* Exported type, constant and function definitions */ #ifdef CFSCONVERT #include "CfsConv.h" #endif /* define some constants needed in the program */ #define INITCEDFILES 16 /* Initial file array length */ #define MAXCEDFILES 2048 /* Max no. files for WINDOWS */ #define NDATATYPE 8 /* number of data types defined in CFS */ #define NDATAKIND 3 /* number of data kinds defined in CFS */ #define MAXCHANS 100 /* max number of channels of data in CFS file */ #define MAXFILVARS 100 /* max File varaibles in CFS file */ #define MAXDSVARS 100 /* max data Sections in CFS file */ #define MAXSTR 256 /* max CFS string length including NULL */ #define CEDMARKER "CEDFILE\"" /* Version 1 marker */ #define PARTMARK "CEDFILE" /* Marker for testing old files */ #define MAXLSEEK 2000000000 /* Roughly 2 GByte, the maximum file size */ #define MAXFORWRD 65535 /* maximum value for unsigned short */ #define MAXNODS 64000 /* alloc restrictions are looser for WIN32 */ #define MAXMEMALLOC 65519 /* get problems if try to allocate more */ #define WHOLEFILECHARS 1024/* to hold whole of temp file name including path */ #define MARKERCHARS 8 /* characters in file marker */ #define PARTMARKCHARS 7 /* characters to test for old version file */ #define MAXFNCHARS 1024 /* characters to test for file name */ /* define error codes */ #define NOHANDLE -1 #define BADHANDLE -2 #define NOTWRIT -3 #define NOTWORE -4 #define NOTWORR -5 #define NOTOPEN -6 #define BADVER -7 #define NOMEMR -8 #define BADCREAT -11 #define BADOPEN -12 #define READERR -13 #define WRITERR -14 #define RDDS -15 #define WRDS -16 #define DISKPOS -17 #define BADINS -18 #define BADFL -19 #define BADDESC -20 #define BADPAR -21 #define BADCHAN -22 #define XSDS -23 #define BADDS -24 #define BADKIND -25 #define BADVARN -26 /* to convert marker char to old version number */ #define BADDSZ -27 #define BADOLDVER -39 /* define file access mode */ #define rMode 0 /* READ only */ #define wMode 2 /* WRITE only */ #define rwMode 0 /* READ|WRITE used to open new file */ /* define types which give data structure of CFS file */ typedef char TBigName[WHOLEFILECHARS+2]; /* for temp file name */ typedef char TMarker[MARKERCHARS]; /* for CED file marker */ #pragma pack(1) /* 1. for file header (fixed) channel information */ typedef struct { TDesc chanName; /* users name for channel, 20 chars */ TUnits unitsY; /* name of Yunits 8 chars */ TUnits unitsX; /* name of xunits 8 chars */ TDataType dType; /* storage type 1 of 8 allowed */ TCFSKind dKind; /* equalspaced, matrix or subsidiary */ short dSpacing; /* bytes between elements */ short otherChan; /* used for matrix data */ } TFilChInfo; typedef TFilChInfo TFilChArr[MAXCHANS]; /* 2. for data section (may vary with DS) channel information */ typedef struct { CFSLONG dataOffset; CFSLONG dataPoints; float scaleY; float offsetY; float scaleX; float offsetX; } TDSChInfo; typedef TDSChInfo TDSChArr[MAXCHANS]; /* 3. for data section headers */ typedef struct { CFSLONG lastDS; /* offset in file of header of previous DS */ CFSLONG dataSt; /* data start position */ CFSLONG dataSz; /* data size in bytes */ TSFlags flags; /* flags for this section */ short dSpace[8]; /* spare space */ TDSChArr DSChArr; /* array of DS channel info */ } TDataHead; /* 4. for the file header */ typedef struct { TMarker marker; TFileName name; CFSLONG fileSz; char timeStr[8]; char dateStr[8]; short dataChans; /* number of channels of data */ short filVars; /* number of file variables */ short datVars; /* number of data section variables */ short fileHeadSz; short dataHeadSz; CFSLONG endPnt; /* offset in file of header of last DS */ WORD dataSecs; /* number of data sections */ WORD diskBlkSize; /* usually 1 or 512 */ TComment commentStr; CFSLONG tablePos; /* offset in file for start of table of DS header offsets */ short fSpace[20]; /* spare */ TFilChArr FilChArr; /* array of fixed channel info */ } TFileHead; #pragma pack() #if !defined(_IS_WINDOWS_) || defined(__MINGW32__) typedef TFileHead * TpFHead; /* pointer to start of file header */ typedef TDataHead * TpDHead; /* pointer to start of data header */ typedef TDSChInfo * TpDsInfo; typedef TFilChInfo * TpChInfo; #else typedef TFileHead FAR * TpFHead; /* pointer to start of file header */ typedef TDataHead FAR * TpDHead; /* pointer to start of data header */ typedef TDSChInfo FAR * TpDsInfo; typedef TFilChInfo FAR * TpChInfo; #endif typedef enum /* define types to describe file in program */ { reading, writing, editing, nothing } TAllowed; typedef struct { fDef p ; /* file handle */ fDef d ; /* file handle */ } TDOSHdl; typedef struct { TpVDesc nameP; /* pointers to start of variable descriptions */ TpSStr dataP; /* pointers to corresponding data storage */ } TPointers; typedef struct /* for storing and sending back current error information */ { short eFound; short eHandleNo; short eProcNo; short eErrNo; } TError; typedef struct /* For program to keep track of storage locations */ { TAllowed allowed; /* current state of this set of TFileInfo */ // THandle fHeadH; /* handle to area for file head */ // THandle dHeadH; /* handle to area for data section */ // THandle eHeadH; /* handle to area for insert data section */ // THandle tableH; /* handle to area for offsets of ds headers */ TpFHead fileHeadP; /* to storage allocated for general header */ TpDHead dataHeadP; /* to storage allocated for data section header */ TpDHead extHeadP; /* to storage allocated for Insert data section */ TPointers FVPoint; /* to descriptions and values of file variables */ TPointers DSPoint; /* to descrip and values of data section variables */ TpLong tableP; /* array of offsets in the file of the DS headers */ TDOSHdl DOSHdl; TBigName tempFName; WORD thisSection; short DSAltered; } TFileInfo; /*********************** CFS FILE STRUCTURE ***************************** ** ** The file header consist of a struct of type TFileHead less the final ** array which is replaced by fixed info array for each channel + file and ** DS vraiable descriptions + byte array containing values of the file data ** variables. ** The file also contains the channel data and the data sections. How these ** are arranged in the file is not defined. Each data section (DS) consists ** of a struct of type TDataHead less the final array which is replaced by ** DS info array for each cahnnel + byte array containing values of the DS ** data variables for that DS. ** The position and size of the actual channel data is in the DS header. ** At the end of the file is a table of pointers to the start of each DS. ** *****************************************************************************/ /**************************************************************************** ** ** Global Variables Declaration and Initialisation ** NB declare near so they go in the default data segment. ** ** 1. Declare pointer to FileInfo and initialise to null, set global ** array length info to zero. ** *****************************************************************************/ int g_maxCfsFiles = 0; /* The length of the array of file info */ TFileInfo* g_fileInfo = NULL; /**************************************************************************** ** ** 2. Declare an error structure and initialise all fields to zero. ** *****************************************************************************/ #if !defined(_IS_WINDOWS_) || defined(__MINGW32__) TError errorInfo = {0,0,0,0}; #else TError _near errorInfo = {0,0,0,0}; #endif char gWorkStr[MAXFNCHARS]; /* Global var on DS to avoid DLL SS != DS problems */ /* Local function definitions */ static void CleanUpCfs(void); static short FindUnusedHandle(void); static short SetSizes(TpCVDesc theArray,TpShort offsetArray,short numVars); static void TransferIn(TpCStr olds,TpStr pNew,BYTE max); static void TransferOut(TpCStr olds,TpStr pNew,BYTE max); static void SetVarDescs(short numOfVars,TPointers varPoint, TpCVDesc useArray,TpShort Offsets,short vSpace); static CFSLONG BlockRound(short handle,CFSLONG raw); static void InternalError(short handle,short proc,short err); static short GetHeader(short handle,WORD getSection); static short FileData(short handle, TpVoid startP, CFSLONG st, CFSLONG sz); static short LoadData(short handle, TpVoid startP, CFSLONG st, CFSLONG sz); static CFSLONG GetTable(short handle, WORD position); static void StoreTable(short handle,WORD position,CFSLONG DSPointer); static short RecoverTable(short handle,TpLong relSize,TpLong tPos, TpUShort dSecs,TpLong fSize); static short TransferTable(WORD sects, fDef rdHdl, fDef wrHdl); static short GetMemTable(short handle); static TpStr AllocateSpace(TpUShort sizeP, WORD steps); static void ExtractBytes(TpStr destP,WORD dataOffset, TpStr srcP,WORD points,WORD spacing,WORD ptSz); static short FileUpdate(short handle,TpFHead fileHP); /* Function definitions for IO functions . */ static short TempName(short handle,TpCStr name,TpStr str2, unsigned str2len); static short CCreat(TpCStr name, short mode, fDef* pFile); static short CUnlink(TpCStr path); static short COpen(TpCStr name, short mode, fDef* pFile); static short CCloseAndUnlink(fDef handle, TpCStr path); static CFSLONG CGetFileLen(fDef handle); static short CClose(fDef handle); static CFSLONG CLSeek(fDef handle, CFSLONG offset, short mode); static WORD CReadHandle(fDef handle,TpStr buffer, WORD bytes); static WORD CWriteHandle(fDef handle,TpStr buffer, WORD bytes); static void CMovel(TpVoid dest,const TpVoid src, int count); static short CSetFileLen(fDef handle, CFSLONG size); static TpVoid CMemAllcn(int size); static void CFreeAllcn(TpVoid p); static void CStrTime(char *timeStr); static void CStrDate(char *dateStr); /************************************************************************** ** ** Function definitions for IO functions . ** Set of C functions which call the MS ones in io.h ** THESE FUNCTIONS ARE FOR BINARY FILES. ** Changes made and memory allocation functions added to force FAR pointers ** ***************************************************************************/ /************************* CCreat ******************************** ** ** CCreat. This is very like the Pascal equiv in MSDOSLIB CREAT but only ** modes allowed are 0 Read/Write, 1 Read only ** ** Either creates a new file or opens and truncates an existing one. ** The mode is applied to newly opened files only. It sets the allowed ** file access after the file has been closed. ** ** On the Mac we have to explicitly create a new file before opening it ** If the file exists, we must truncate it. Then set the file type and ** creator. ** ** Return is handle value or -ve error code. ** ***************************************************************************/ short CCreat(TpCStr name, short mode, fDef* pFile) { short sErr = 0; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) DWORD dwMode; #else short pmode; char fname[MAXFNCHARS]; /* To get near variable holding string */ #endif fDef file; /* The various types of file handle */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) if (mode) /* Sort out the file access value */ dwMode = GENERIC_READ; else dwMode = GENERIC_READ | GENERIC_WRITE; file = CreateFileA(name, dwMode, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file == INVALID_HANDLE_VALUE) sErr = BADCREAT; #else if (mode) pmode = S_IREAD; else pmode = S_IREAD|S_IWRITE; char* omode; if (mode) /* Sort out the file access value */ omode = "r"; else omode = "w+"; if (strlen(name) < MAXFNCHARS) F_strcpy(fname, name); /* Get filename in near var */ file = fopen(fname,omode); if (file == 0) sErr = -1; #endif if (sErr == 0) *pFile = file; return sErr; } /* end of CCreat */ /******************* 2. CUnlink for deleteing files. *********************** ** ** Delete file specified by path. Return 0 if ok, -ve error code ** ****************************************************************************/ short CUnlink(TpCStr path) { #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) int a; a = _unlink(path); /* C function in io.h */ if (a < 0) return (short)(0 - _doserrno); else return 0; #else return remove(path); /* C function in io.h */ #endif } /************* 3. CClose for closing files given DOS handle **************** ** ** Close the file associated with handle. ** Return 0 if ok or -ve error code. ** ****************************************************************************/ short CClose(fDef handle) { int res = 0; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) if (!CloseHandle(handle)) res = BADHANDLE; #else res = fclose(handle); #endif return (short)res; } /* end of CClose */ /************* CCloseAndUnlink closes then deletes the file **************** ** ** Closes the file associated with handle, and then deletes it ** Return 0 if ok or -ve error code. ** ****************************************************************************/ short CCloseAndUnlink(fDef handle, TpCStr path) { short err = 0; err = CClose(handle); #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) err = CUnlink(path); #else err += CUnlink(path); #endif return err; } /************* 4. CLSeek for moving file pointer *************************** ** ** Move the file pointer (ie. next position for read/write) by offset bytes ** in file with DOShandle handle from a start position depending on mode. ** Returns new file position or -ve error code ** *****************************************************************************/ CFSLONG CLSeek(fDef handle, /* DOS handle of file */ CFSLONG offset, /* amount to move in bytes */ short mode) /* 0 Move from file start 1 Move from current file position 2 Move from file end */ { #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) /* Windows seek */ CFSLONG res = 0; DWORD dwMode; switch (mode) { case 0 : dwMode = FILE_BEGIN; /* start of file */ break; case 1 : dwMode = FILE_CURRENT; /* current posn of file pointer */ break; case 2 : dwMode = FILE_END; /* end of file */ break; } res = SetFilePointer(handle, offset, NULL, dwMode); if (res == 0xFFFFFFFF) return DISKPOS; else return res; #else CFSLONG res; short origin = 0; switch (mode) { case 0 : origin = SEEK_SET; /* start of file */ break; case 1 : origin = SEEK_CUR; /* current position of file pointer */ break; case 2 : origin = SEEK_END; /* end of file */ break; } res = fseek (handle, offset, origin); /* stdio read */ if (res==0) { return ftell(handle); } else { return -1; } #endif } /* end of CLSeek */ /******************** 5. Transfer from file to buffer ********************** ** ** Transfer from current file position of file, specified by its DOS file ** handle, to the buffer the specified number of bytes.(counted from file) ** Return the number of bytes transferred to the buffer or zero if error. ** NB C Function _dos_read can have been successful and NOT give numread=bytes ** It can have read numread bytes then found EOF or the file can be text ** in which case CRLF is counted as 2 bytes in the file but only ** 1 byte (LF) in numread. ** *****************************************************************************/ WORD CReadHandle(fDef handle, TpStr buffer, WORD bytes) { #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) DWORD dwRead; if (ReadFile(handle, buffer, bytes, &dwRead, NULL)) return bytes; else return 0; #else if (fread(buffer,1,bytes,handle) != bytes) return 0; else return bytes; #endif }; /******************** 6. Transfer from buffer to file ********************** ** ** Transfer to current file position of file, specified by its DOS file ** handle, from the buffer the specified number of bytes. ** Return the number of bytes transferred from the buffer or zero if error. ** NB C Function _dos_write can have been successful and NOT give numwrt=bytes ** It can have written numwrt bytes then run out of disk space. ** If the file is of type text LF in the buffer is replaced by 2 bytes ** CRLF but numwrt is unchanged since it refers to the buffer bytes. ** *****************************************************************************/ WORD CWriteHandle(fDef handle, TpStr buffer, WORD bytes) { #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) DWORD dwWrit; if (WriteFile(handle, buffer, bytes, &dwWrit, NULL)) return bytes; else return 0; #else if (fwrite(buffer, 1, bytes, handle) != bytes) return 0; else return bytes; #endif } /* end of CWriteHandle */ /******************** 7. Memory transfer *********************************** ** ** Transfer count bytes from src to dest addresses. ** memcpy is used so any overlap of regions is not checked. ** *****************************************************************************/ void CMovel(TpVoid dest, const TpVoid src, int count) { TpVoid ret; /* for return pointer of memcpy */ ret = F_memcpy(dest,src,(size_t)count); /* C function from string.h */ return; }; /* end of CMovel */ /****** 8. Change file size. NB operates on file handle NOT file name *****/ short CSetFileLen(fDef handle, CFSLONG size) /* ** For a file specified by its DOS handle, extend or truncate file to length, ** in bytes, specified by size. File must be open for writing. ** Return 0 if successful, -DOS error code if not. */ { #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) if (SetFilePointer(handle, size, NULL, FILE_BEGIN) != 0xFFFFFFFF) if (SetEndOfFile(handle)) return 0; else return BADHANDLE; else return DISKPOS; #else return -1; #endif } /* end of CSetFileLen */ /****** 8a. Retrieve file size. NB operates on file handle NOT file name *****/ CFSLONG CGetFileLen(fDef pFile) /* ** For a file specified by its DOS handle, find the file size in bytes. ** Returns file size if successful, -DOS error code if not. */ { CFSLONG lSize; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) lSize = GetFileSize(pFile, NULL); if (lSize != -1) return lSize; else return BADHANDLE; #else fpos_t cur; if (fgetpos(pFile,&cur)!=0) return -1; if (fseek (pFile, 0, SEEK_END)!=0) return -1; lSize=ftell (pFile); if (fsetpos(pFile,&cur)!=0) return -1; return lSize; #endif } /* end of CGetFileLen */ /************** 9.Open an exisiting file of specified name ***************** ** ** Open file specified by its path. ** For mode = 0 Read only (default) ** = 1 Write only ** = 2 Read/Write. ** Return DOS file handle if ok DOS error code (-ve) if not. ** ** for the mac, we need vRefNum, which we hope to get from stdFile SFGetFile ** also we want to make sure we have a pascal string ** *****************************************************************************/ short COpen(TpCStr name, short mode, fDef* pFile) { short sRes = 0; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) fDef file; DWORD dwMode; switch (mode) /* use C library constants to set mode */ { case 1 : dwMode = GENERIC_WRITE; break; case 2 : dwMode = GENERIC_READ | GENERIC_WRITE; break; default: dwMode = GENERIC_READ; break; } file = CreateFileA(name, dwMode, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (file == INVALID_HANDLE_VALUE) sRes = BADOPEN; if (sRes == 0) *pFile = file; #else char fname[MAXFNCHARS]; /* To get near variable holding string */ char* omode; switch (mode) /* use C library constants to set mode */ { case 1 : omode = "w"; break; case 2 : omode = "r+"; break; default: omode = "r"; break; } if (strlen(name) < MAXFNCHARS) F_strcpy(fname, name); /* Get filename in near var */ *pFile = fopen(fname,omode); if (*pFile == 0) sRes = -1; #endif return sRes; } /************** 10. Allocate memory on the far heap ************************ ** ** Allocate size bytes of memory outside the default data segment and ** return a far pointer to it. ** *****************************************************************************/ TpVoid CMemAllcn(int size) { TpVoid p; p = F_malloc(size); /* Use a simple, non-handle based, allocation */ // if ((*dummy = (THandle) M_AllocMem(size)) != NULL) // p = M_MoveLockMem(*dummy); // else // p = NULL; return p; } /*************** 11.Free memory allocated by above function **************** ** ** Free memory allocated on far heap by _fmalloc. ** No return. ** *****************************************************************************/ void CFreeAllcn(TpVoid p) { F_free(p); /* Simple memory free mechanism */ // if (M_UnlockMem(*dummy)) // M_FreeMem(*dummy); } /*************** 12. Get the time as string in required format ************* ** ** Gets time formatted as hh:mm:ss. ** timeStr must be at least 9 bytes ** *****************************************************************************/ void CStrTime(char *timeStr) { #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) _strtime(timeStr); /* timsStr must be at least 9 bytes */ #else time_t now; struct tm *today; now = time(NULL); today = localtime(&now); strftime(timeStr, 9, "%H:%M:%S", today); #endif } /* end of CStrTime */ /************ 13. Get the date as string in the required format *********** ** ** gets the date formatted as dd/mm/yy. ** dateStr must be at least 9 bytes ** *****************************************************************************/ void CStrDate(char *dateStr) { #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) char sdata[9]; _strdate(dateStr); /* dateStr must be at least 9 bytes */ F_strncpy(sdata,dateStr,8); /* store time without NULL */ sdata[0] = dateStr[3]; sdata[1] = dateStr[4]; sdata[3] = dateStr[0]; sdata[4] = dateStr[1]; F_strncpy(dateStr,sdata,8); /* store time without NULL */ #else time_t now; struct tm *today; now = time(NULL); today = localtime(&now); strftime(dateStr, 9, "%d/%m/%y", today); #endif } /* end of CStrDate */ /*********************** CreateCFSFile ******************************** ** ** Function to create CFS file open it for writing and allocate storage ** space for header and data section structures ready to fill and write to ** the file when ready. ** ** On the Mac we have to explicitly create a new file before opening it ** If the file exists, we must truncate it. Then set the file type and ** creator. ** Returns file handle or -ve error code. ** *****************************************************************************/ CFSAPI(short) CreateCFSFile(TpCStr fname, /* name of file */ TpCStr comment, /* general comment */ WORD blockSize, /* 1 or 512 */ short channels, /* number of data channels */ TpCVDesc fileArray,/* file variable descriptions */ TpCVDesc DSArray, /* DS variable descriptions */ short fileVars, /* no. of file varables */ short DSVars) /* no. of DS variables */ { short proc = 18; /* function number for error record */ short retval; /* return value */ short sErr; /* for checking return codes */ short handle; /* CFS file handle */ WORD bytSz; /* used to calcualte space needed when allocating */ short search; /* loop varable */ short pathend = 0; /* end of path part of fname */ short filVarSpace; /* space needed for file and DS variable data */ short DSVarSpace; TpShort filOffsets; /* temp store offsets */ TpShort DSOffsets; /* temp store offsets */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif /* pointer for current files info in global array */ TpFHead pFileH; /* used to shorten pointers */ TpDHead pDataH; TpChInfo pFilChInfo; TpDsInfo pDSChInfo; /* 1. Get program file handle */ handle = FindUnusedHandle(); /* 0,1,2 or error */ if (handle < 0) { retval = NOHANDLE; /* error code for no spare handles */ InternalError(handle,proc,retval); return retval; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* 2. Open file for writing */ sErr = CCreat(fname, rwMode, &pfileInfo->DOSHdl.d);/* Open data file */ if (sErr != 0) { pfileInfo->DOSHdl.d = (fDef)-1; retval = sErr; /* error code for unopenable file */ InternalError(handle,proc,retval); return retval; } TempName(handle, fname, pfileInfo->tempFName, WHOLEFILECHARS+2); /* get temp file name */ sErr = CCreat(pfileInfo->tempFName, rwMode, &pfileInfo->DOSHdl.p); if (sErr != 0) { pfileInfo->DOSHdl.p = (fDef)-1; retval = sErr; goto Close_1; /* close CFS file before return */ } /* open temp file */ /* 3. Get space for file,DS and spare headers */ /* ** error code for problem with file or Ds variable sizing. ** allocate some space for the offset arrays used by SetSizes, there is ** allways 2 bytes of space allocated to avoid problem when either of ** these two equals 0 */ DSOffsets = (TpShort)CMemAllcn((2*DSVars+2)); filOffsets = (TpShort)CMemAllcn((2*fileVars+2)); if ((DSOffsets == NULL) || (filOffsets == NULL)) { retval = NOMEMR; goto Close0; } /* ** setsizes computes the total space needed to store the variables described ** and sets up an offset array which says whereabouts each variables would ** start if you stored all the variables in a byte list */ DSVarSpace = SetSizes(DSArray, DSOffsets, DSVars); filVarSpace = SetSizes(fileArray, filOffsets, fileVars); if ((filVarSpace < 0) || (DSVarSpace < 0)) { retval = BADDESC; goto Close0; } /* File header size consists of */ bytSz = (WORD)(sizeof(TFileHead) - sizeof(TFilChArr) + /* File header without array */ channels*sizeof(TFilChInfo) + /* Info for each channel */ ((fileVars+DSVars+2) * sizeof(TVarDesc)) + /* desc for each var */ filVarSpace); /* space computed for actual file variables */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) if (bytSz > (WORD)MAXMEMALLOC) { retval = NOMEMR; /* error code for not enough space */ goto Close0; /* dont attempt to allocate over max */ } #endif pfileInfo->fileHeadP = (TpFHead)CMemAllcn(bytSz); /* allocate space for file header */ pFileH = pfileInfo->fileHeadP; if (pFileH == NULL) { retval = NOMEMR; /* error code for not enough space */ goto Close0; /* clear up files before return */ } pFileH->fileHeadSz = (short)bytSz;/* save space in bytes for file head */ pFileH->diskBlkSize = blockSize; /* store blocksize specified */ /* ** Now do the Data Section header size */ bytSz = (WORD)(sizeof(TDataHead) - sizeof(TDSChArr) + /* Data header without array */ (channels * sizeof(TDSChInfo))+ /* Info for each channel */ DSVarSpace); /* DS varable data space */ /* round to nearest block */ bytSz = (WORD)(((bytSz+(WORD)(blockSize-1)) / blockSize)*blockSize); #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) if (bytSz>(WORD)MAXMEMALLOC) { retval = NOMEMR; goto Close1; } #endif pfileInfo->dataHeadP= (TpDHead)CMemAllcn(bytSz); /* allocate space for DS header */ pDataH = pfileInfo->dataHeadP; if (pDataH == NULL) { retval = NOMEMR; goto Close1; /* release file and allocated file header */ } pFileH->dataHeadSz = (short)bytSz; /* store DS header size in bytes */ pfileInfo->extHeadP = (TpDHead)CMemAllcn(bytSz); /* space for insert block (another DS header) */ if (pfileInfo->extHeadP == NULL) { retval = NOMEMR; goto Close2; /* release file,fileheader,data header */ } /* 4. Store variables in header checking range */ retval = BADPAR; /* error code for out of range */ if ( (channels < 0) || (fileVars < 0) || (DSVars < 0) || (channels >= MAXCHANS) || (fileVars >= MAXFILVARS) || (DSVars >= MAXDSVARS) ) { retval = NOMEMR; goto Close3; /* Release file file header data header insert block */ } pFileH->filVars = fileVars; /* store specified number of file vars */ pFileH->datVars = DSVars; /* store number of data section vars */ pFileH->dataChans= channels; /* store specified number of data channels */ /* 5. Set pointers to within spaces allocated to start of various items */ /* The fixed channel information following the general occupies fileChArr[channels] and the space straight after this is for the descrition of the file variables. */ pfileInfo->FVPoint.nameP = (TpVDesc)(pFileH->FilChArr+channels); /* The fixed file variable descriptions occupy nameP[filvars+1] and the data section variables start after them. */ pfileInfo->DSPoint.nameP = pfileInfo->FVPoint.nameP+fileVars+1; /* The data section variable descriptions occupy nameP[DSVars+1] then come the actual file variables */ pfileInfo->FVPoint.dataP = (TpSStr)(pfileInfo->DSPoint.nameP + DSVars+1); /* The actual data section variables are part of the data header (not fileheader) and come straight after the data section channel info */ pfileInfo->DSPoint.dataP = (TpSStr)(pDataH->DSChArr + channels); /* 6. Store default values in data structure structs */ /* Fixed channel information in File Header */ for (search = 0;search < channels;search++) { pFilChInfo = pFileH->FilChArr+search; /* pointer to relevant chan info */ /* Put null strings in Chan name and units */ TransferIn("", pFilChInfo->chanName, 0); TransferIn("", pFilChInfo->unitsY, 0); TransferIn("", pFilChInfo->unitsX, 0); pFilChInfo->dType = INT2; /* default type is integer */ pFilChInfo->dKind = EQUALSPACED; pFilChInfo->dSpacing = 2; /* integers stored in sequence */ pFilChInfo->otherChan= 0; } /*************************************************************************** ** Fixed file variables in the File header ** Copy the variable descriptions to the space allocated (which is in the ** form of variable description structs) storing the offsets in the data ** array for each variable value in the vsize field ****************************************************************************/ SetVarDescs(fileVars,pfileInfo->FVPoint,fileArray,filOffsets,filVarSpace); /* Data section variables descriptions */ SetVarDescs(DSVars,pfileInfo->DSPoint,DSArray,DSOffsets,DSVarSpace); /* Now fill in as much as poss of header block */ pDataH->lastDS = 0; /* no data section there yet */ /* lastDS of zero means the fileheader is the 'previous' DS */ pDataH->dataSt = BlockRound(handle,(CFSLONG)pFileH->fileHeadSz);/*round up */ pFileH->fileSz = pDataH->dataSt; /* reset so they are consistent */ pDataH->dataSz = 0; /* fill in later */ pDataH->flags = noFlags; /* start with no flags */ for (search = 0;search < 8;search++) pDataH->dSpace[search] = 0; /* zero spare space */ /* Initialise channel information */ for (search = 0; search < channels; search++) { pDSChInfo = pDataH->DSChArr + search; pDSChInfo->dataOffset = 0; /* no data there yet */ pDSChInfo->dataPoints = 0; pDSChInfo->scaleY = (float)1.0; pDSChInfo->offsetY = (float)0.0; pDSChInfo->scaleX = (float)1.0; pDSChInfo->offsetX = (float)0.0; } TransferIn(comment,pFileH->commentStr,COMMENTCHARS); /* users comment in LSTRING form */ F_strncpy(pFileH->marker,CEDMARKER,MARKERCHARS); /* marker with no NULL */ CStrTime(gWorkStr); /* time + NULL */ F_strncpy(pFileH->timeStr,gWorkStr,8); /* store time without NULL */ CStrDate(gWorkStr); /* date + NULL */ F_strncpy(pFileH->dateStr,gWorkStr,8); /* store date without NULL */ pFileH->dataSecs = 0; /* No DS yet */ pfileInfo->tableP = NULL; /* table giving file offsets for each DS header is not in memory */ pFileH->tablePos= 0; /* position in file where DS offsets table starts */ pFileH->endPnt = 0;/* this will hold the offset of the final DS header */ pfileInfo->allowed = writing; /* file now opened */ pfileInfo->thisSection= 0xFFFF; /* not used in writing mode */ for (search = 0;search < 20; search++) pFileH->fSpace[search] = 0; /* zero spare space */ pfileInfo->DSAltered = 0; /* initialise to 0 so that GetHeader does not write the DS header to file.(InsertDS is only valid way to do this for a new file. */ errorInfo.eFound = 0; /* no filing errors yet */ #if defined(_IS_MSDOS_) || defined(_IS_WINDOWS_) /* In file header store the file name without a path or leading spaces in LSTRING format */ search = 0; /* find 1st non space TpStr */ while (isspace(fname[search])) search++; pathend = (short)(search-1); /* If there is no path in fname it ends before the start */ /* look for last occurrence of '\\' or ':' */ while (search<(short)F_strlen(fname)) { if ((fname[search] == '\\') || (fname[search] == ':')) pathend = search; search = (short)(search + 1); } TransferIn(&fname[pathend+1],pFileH->name,FNAMECHARS); #endif /* return space allocated for temp arrays of affsets */ CFreeAllcn(filOffsets); CFreeAllcn(DSOffsets); return handle; /* all ok so return the file handle */ /* ** Here for the general error handling. Tidy up and return error code, ** also calling Internal Error so that any errors are remembered. */ Close3: CFreeAllcn(pfileInfo->extHeadP); /* free mem for data insert */ pfileInfo->extHeadP = NULL; Close2: CFreeAllcn(pfileInfo->dataHeadP); /* and for data header */ Close1: CFreeAllcn(pfileInfo->fileHeadP); /* and for file header */ Close0: CCloseAndUnlink(pfileInfo->DOSHdl.p, pfileInfo->tempFName); /* delete temp file */ CFreeAllcn(filOffsets); /* release space for offset arrays */ CFreeAllcn(DSOffsets); Close_1: if (strlen(fname) < MAXFNCHARS) F_strcpy(gWorkStr,fname); /* Get file name into global var */ CCloseAndUnlink(pfileInfo->DOSHdl.d, gWorkStr); /* delete empty CFS file */ InternalError(handle,proc,retval); return retval; /* retval is error code */ } /* end of CreatCFSFile */ /************************ SetFileChan ******************************** ** ** Set the channel information that stays same throughout file and goes ** in the file header. ** *****************************************************************************/ CFSAPI(void) SetFileChan(short handle, /* program file handle */ short channel, /* channel numb in CFS storage */ TpCStr channelName, /* users identifier for channel */ TpCStr yUnits, /* users name for units */ TpCStr xUnits,/* only for equal spaces often s */ TDataType dataType, /* one of 8 types */ TCFSKind dataKind, /* one of 2 kinds */ short spacing, /* bytes between equal spaced elements */ short other) /* next channel for matrix data */ { short proc = 1; /* function number for error record */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif /* to point to set of file info with given handle */ TpChInfo pFilChInfo; /* to point to this channels info structure */ short ecode; /* for return of FileUpdate */ ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(channel >= 0); ASSERT(channel < g_fileInfo[handle].fileHeadP->dataChans); ASSERT(dataType >= 0); ASSERT(dataType < NDATATYPE); ASSERT(dataKind >= 0); ASSERT(spacing >= 0); ASSERT((g_fileInfo[handle].allowed == writing) || (g_fileInfo[handle].allowed == editing)); /* 1. Check valid handle given and that its file is open for write/edit */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if ((pfileInfo->allowed == writing) || (pfileInfo->allowed == editing)) { /* 2. Check channel number in range */ if ((channel < 0) || (channel >= pfileInfo->fileHeadP->dataChans)) { InternalError(handle,proc,BADCHAN); return; } /* Additional checks on parameters dataType and dataKind */ if ((dataType < 0) || (dataType >= NDATATYPE)) { InternalError(handle,proc,BADPAR); return; } if ((dataKind < 0) || (dataKind >= NDATAKIND)) { InternalError(handle,proc,BADKIND); return; } if ((spacing < 0) || ((dataKind == MATRIX) && (other < 0))) { InternalError(handle,proc,BADPAR); return; } /* If this is the first edit made to a file get it ready for the change */ if ((pfileInfo->allowed == editing) && (pfileInfo->fileHeadP->tablePos != 0)) { ecode = FileUpdate(handle,pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle,proc,ecode); return; } } /* channels info parameters look reasonable so fill them in */ pFilChInfo = pfileInfo->fileHeadP->FilChArr + channel; /* pick out chan */ TransferIn(channelName,pFilChInfo->chanName,DESCCHARS); TransferIn(yUnits,pFilChInfo->unitsY,UNITCHARS); TransferIn(xUnits,pFilChInfo->unitsX,UNITCHARS); pFilChInfo->dType = dataType; pFilChInfo->dKind = dataKind; pFilChInfo->dSpacing = spacing; pFilChInfo->otherChan = other; } else InternalError(handle,proc,NOTWORE); /* failed allowed test */ return; } /* end of SetFileChan */ /************************** SetDSChan ******************************** ** ** Sort out the data section channel info ie the bit that can change ** with data section. ** *****************************************************************************/ CFSAPI(void) SetDSChan(short handle, /* program file handle */ short channel, /* CFS channel number */ WORD dataSection, /* reference when editing */ CFSLONG startOffset, /* byte offset to 1st element */ CFSLONG points, /* number of channel elements */ float yScale, /* data scale */ float yOffset, float xScale, float xOffset) { short proc = 2; /* number for this function */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpDsInfo pDSChInfo; short ecode; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT((g_fileInfo[handle].allowed == writing) || (g_fileInfo[handle].allowed == editing)); ASSERT(channel >= 0); ASSERT(channel < g_fileInfo[handle].fileHeadP->dataChans); /* 1. Is Handle ok */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return; } /* 1a. Is file open for writing/editing */ pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if ((pfileInfo->allowed == writing) || (pfileInfo->allowed == editing)) { /* 2. Check channel number */ if ((channel < 0) || (channel >= pfileInfo->fileHeadP->dataChans)) { InternalError(handle,proc,BADCHAN); return; } /* 3. Check data section number if editing and read in its header from the CFS file */ if (pfileInfo->allowed == editing) { if ((dataSection<1)||(dataSection>pfileInfo->fileHeadP->dataSecs)) { InternalError(handle,proc,BADDS); return; } ecode = GetHeader(handle,dataSection); if (ecode != 0) { InternalError(handle,proc,ecode); return; } } else { if (/*(dataSection<0)||*/(dataSection>pfileInfo->fileHeadP->dataSecs)) { InternalError(handle,proc,BADDS); return; } if (dataSection > 0) { CMovel(pfileInfo->extHeadP, pfileInfo->dataHeadP, /* Save current DS header */ pfileInfo->fileHeadP->dataHeadSz); ecode = GetHeader(handle, dataSection); /* Read in wanted */ if (ecode != 0) { InternalError(handle,proc,ecode); goto Restore; } } } /* If this is the first edit made to a file get it ready for the change */ if ((pfileInfo->allowed == editing) && (pfileInfo->fileHeadP->tablePos != 0)) { ecode = FileUpdate(handle,pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle,proc,ecode); return; } } /* Store information from function parameters in program */ pDSChInfo = pfileInfo->dataHeadP->DSChArr + channel; pDSChInfo->dataOffset = startOffset; pDSChInfo->dataPoints = points; pDSChInfo->scaleY = yScale; pDSChInfo->offsetY = yOffset; pDSChInfo->scaleX = xScale; pDSChInfo->offsetX = xOffset; if (pfileInfo->allowed == editing) pfileInfo->DSAltered = 1; /* (TRUE) */ else { if (dataSection > 0) /* If we are at previous data section */ { CFSLONG tableValue; /* Write the data back to disk */ tableValue = GetTable(handle, dataSection); if (FileData(handle, pfileInfo->dataHeadP, tableValue, (WORD)pfileInfo->fileHeadP->dataHeadSz) == 0) { InternalError(handle, proc, WRITERR); goto Restore; } } } Restore: if ((pfileInfo->allowed == writing) && (dataSection > 0)) { /* Then copy the old data back into position */ CMovel(pfileInfo->dataHeadP,pfileInfo->extHeadP, pfileInfo->fileHeadP->dataHeadSz); } } else InternalError(handle,proc,NOTWORE); /* failed writing/editing */ return; } /* end of setDSChans */ /************************** Write Data ******************************** ** ** Write actual data into current data block. ** *****************************************************************************/ CFSAPI(short) WriteData(short handle, /* program file handle */ WORD dataSection, /* data section for data */ CFSLONG startOffset, /* offset in DS for write */ WORD bytes, /* number of bytes to write */ TpVoid dataADS) /* ptr to start of data to write */ { short proc = 19; /* number for this function */ short ecode = 0; CFSLONG endOffset; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpDHead dataHP; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); ASSERT(g_fileInfo[handle].allowed != reading); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return BADHANDLE; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* action depends on whether file was opened by CREAT (writing) or OPEN (editing) */ if ((pfileInfo->allowed == writing) && (dataSection == 0)) { /* adjust pointers for data size */ dataHP = pfileInfo->dataHeadP; endOffset = dataHP->dataSt + startOffset + bytes; if (pfileInfo->fileHeadP->fileSz < endOffset) { pfileInfo->fileHeadP->fileSz = endOffset; dataHP->dataSz = endOffset - dataHP->dataSt; } ecode = FileData(handle,dataADS,dataHP->dataSt + startOffset,bytes); if (ecode == 0) { InternalError(handle,proc,WRITERR); ecode = WRITERR; } else ecode = 0; /* Set to no error result otherwise */ } else { if ((pfileInfo->allowed != editing) && /* must be OK to write */ (pfileInfo->allowed != writing)) { InternalError(handle, proc, NOTWORE); return NOTWORE; } if ((dataSection < 1) || (dataSection > pfileInfo->fileHeadP->dataSecs)) { InternalError(handle,proc,BADDS); /* check data section number */ return BADDS; } /* If writing, preserve the current data section header */ if (pfileInfo->allowed == writing) { CMovel(pfileInfo->extHeadP, pfileInfo->dataHeadP, pfileInfo->fileHeadP->dataHeadSz); } ecode = GetHeader(handle, dataSection); if (ecode != 0) /* can be READERR or WRITERR */ { InternalError(handle,proc,ecode); /* check data section number */ goto Restore; } if ((startOffset + bytes) > pfileInfo->dataHeadP->dataSz) { InternalError(handle,proc,BADDSZ); /* check data section number */ ecode = BADDSZ; goto Restore; } /* If this is the first edit made to a file get it ready for the change */ if ((pfileInfo->fileHeadP->tablePos != 0) && (pfileInfo->allowed == editing)) { ecode = FileUpdate(handle, pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle,proc,ecode); goto Restore; } } ecode = FileData(handle, dataADS, pfileInfo->dataHeadP->dataSt + startOffset,bytes); if (ecode == 0) { InternalError(handle,proc,WRITERR); ecode = WRITERR; goto Restore; } else ecode = 0; /* No errors, so clear function return */ Restore: /* Copy the old data back into position if required */ if (pfileInfo->allowed == writing) { CMovel(pfileInfo->dataHeadP, pfileInfo->extHeadP, pfileInfo->fileHeadP->dataHeadSz); } } return ecode; } /* end of WriteData */ /************************** Set Write Data ****************************** ** ** For file opened with CREAT only. Set it up ready for fast sequential write. ** Attempt to by pass piecewise disk allocation and speed up write to disc. ** NB BUFFERS = prameter in CONFIG.SYS needs to be at least 20. ** Any error is put into global error struct. ** *****************************************************************************/ CFSAPI(void) SetWriteData(short handle, /* program file handle */ CFSLONG startOffset, /* byte offset within DS for writing */ CFSLONG bytes) /* number of bytes to write */ { short proc = 3; /* function number */ char oneByte; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpDHead dataHP; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed == writing); /* 1. Check handle */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed != writing) /* check created file */ { InternalError(handle,proc,NOTWRIT); return; } dataHP = pfileInfo->dataHeadP; if ((bytes >= 0) && (startOffset >= 0)) /* If parameters are ok */ /* 2. move to end of data and write 1 byte to allocate file space */ { if (FileData(handle,dataHP,dataHP->dataSt+startOffset + bytes,1) == 0) { /* attempt write to wouldbe end of file */ InternalError(handle,proc,WRITERR); return; } } else { /* either bytes or startOffset duff */ InternalError(handle,proc,BADPAR); return; } /* 3. move to start of data area and read 1 byte to position of head */ if (LoadData(handle, &oneByte, dataHP->dataSt+startOffset-1, 1) == 0) { InternalError(handle,proc,READERR); return; } return; } /* end of SetWritedata */ /**************************** CFSFileSize ********************************* ** ** Return the file size, in bytes. The name is to avoid C library clashes. ** *****************************************************************************/ CFSAPI(CFSLONG) CFSFileSize(short handle) { short proc = 24; /* function number */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle, proc, BADHANDLE); /* check handle */ return BADHANDLE; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed == nothing) /* and also check for file not open */ { InternalError(handle, proc, NOTOPEN); return NOTOPEN; } fileHP = pfileInfo->fileHeadP; /* Get pointer to file header */ return fileHP->fileSz; /* return the file size from the header */ } /**************************** Insert DS ****************************** ** ** Close the current data block and insert it at datasection th data ** block in the file. For dataSection 0 put it at the end. ** Return zero or error code. ** *****************************************************************************/ CFSAPI(short) InsertDS(short handle, /* program file handle */ WORD dataSection, /* section number */ TSFlags flagSet) /* flags for this DS */ { short proc = 17; /* function number */ WORD index,relevantSize; CFSLONG gtPlace,gtPlace1; CFSLONG tableValue; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; TpDHead dataHP; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed == writing); ASSERT(dataSection < MAXNODS); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); /* check handle */ return BADHANDLE; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* 1. check file open for writing and dataSection valid */ if (pfileInfo->allowed != writing) { InternalError(handle,proc,NOTWRIT); return NOTWRIT; } fileHP = pfileInfo->fileHeadP; if (fileHP->dataSecs >= MAXNODS) { InternalError(handle,proc,XSDS); return XSDS; } if (dataSection == 0) dataSection = (WORD)(fileHP->dataSecs + 1); if ((dataSection < 1) || (dataSection > (fileHP->dataSecs + 1))) { InternalError(handle,proc,BADDS); return BADDS; } /* 2. change the pointer table to accommodate new data section */ for (index = fileHP->dataSecs;index >= dataSection;index--) { /* move entries past current DS up one */ tableValue = GetTable(handle,index); StoreTable(handle,(WORD)(index+1),tableValue); } dataHP = pfileInfo->dataHeadP; /* 3. change pointers for current section */ /* for first DS lastDS=0 ie previous thing is the header */ if (dataSection == 1) dataHP->lastDS = 0; else dataHP->lastDS = GetTable(handle,(WORD)(dataSection-1)); /* previous section */ dataHP->dataSz = fileHP->fileSz - dataHP->dataSt; /* set size of data which should be on end of file */ gtPlace = dataHP->dataSt + BlockRound(handle, dataHP->dataSz); /* offset corresponding to this DS */ StoreTable(handle, dataSection, gtPlace); /* store offset for this DS header */ /* 4. write the data header to the file */ dataHP->flags = flagSet; /* set flags for this DS */ if (FileData(handle,dataHP,gtPlace,(WORD)fileHP->dataHeadSz) == 0) { InternalError(handle,proc,WRITERR); return WRITERR; } /* 5. alter lastDS pointer in subsequent header */ relevantSize = sizeof(TDataHead) - sizeof(TDSChArr); if (dataSection < (fileHP->dataSecs + 1)) { /* not the last one */ gtPlace1 = GetTable(handle,(WORD)(dataSection + 1)); /* offset for next DS */ if (LoadData(handle,pfileInfo->extHeadP,gtPlace1,relevantSize) == 0) { InternalError(handle,proc,READERR); return READERR; /* read header to change */ } pfileInfo->extHeadP->lastDS = gtPlace; /* make the change */ if (FileData(handle,pfileInfo->extHeadP,gtPlace1,relevantSize) == 0) { InternalError(handle,proc,WRITERR); return WRITERR; } } else fileHP->endPnt = gtPlace; /* action for end DS */ /* 6. update fileHeader and dataheader variable */ fileHP->dataSecs = (WORD)(fileHP->dataSecs + 1); fileHP->fileSz = gtPlace + fileHP->dataHeadSz; dataHP->dataSt = fileHP->fileSz; dataHP->dataSz = 0; return 0; /* all ok */ } /* end of InsertDS */ /**************************** AppendDS ****************************** ** ** Add an empty data section onto the end of the file, so that we can ** write to it. Intended for use with offline files. ** ** Return zero or error code. ** *****************************************************************************/ CFSAPI(short) AppendDS(short handle, /* program file handle */ CFSLONG lSize, /* size of the new section */ TSFlags flagSet) /* flags for this DS */ { short proc = 25; /* function number */ WORD headSize, thisDS; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; TpDHead dataHP; CFSLONG lPrev, lThis; CFSLONG tableValue; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT((g_fileInfo[handle].allowed == editing) || (g_fileInfo[handle].allowed == writing)); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); /* check handle */ return BADHANDLE; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed == writing) /* If writing just use InsertDS */ return InsertDS(handle, 0, flagSet); /* as this does it */ /* 1. check file open for writing and work out this DS number */ if (pfileInfo->allowed != editing) { InternalError(handle, proc, NOTWORE); return NOTWORE; } if (pfileInfo->DSAltered == 1) /* do we need to write this DS out first? */ { tableValue = GetTable(handle,pfileInfo->thisSection); pfileInfo->DSAltered = 0; if (FileData(handle,pfileInfo->dataHeadP,tableValue,(WORD) pfileInfo->fileHeadP->dataHeadSz) == 0) { InternalError(handle,proc,WRITERR); return WRITERR; } } pfileInfo->thisSection = 0xFFFF; /* If this is the first edit made to a file get it ready for the change */ /* This code strips the lookup table from the file size, which will help out! */ if (pfileInfo->fileHeadP->tablePos != 0) { short ecode; ecode = FileUpdate(handle, pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle, proc, ecode); return ecode; } } fileHP = pfileInfo->fileHeadP; /* Pointer to the file info */ dataHP = pfileInfo->dataHeadP; /* and the data header buffer */ if (fileHP->dataSecs >= MAXNODS) { InternalError(handle,proc,XSDS); return XSDS; } headSize = fileHP->dataHeadSz; /* Size of DS header in total */ thisDS = fileHP->dataSecs + 1; /* The number for the new data section */ lThis = fileHP->fileSz + BlockRound(handle, lSize); /* New DS head pos */ /* 2. Read in the previous DS header so we can meddle */ lPrev = GetTable(handle, (WORD)(thisDS - 1));/* offset for prev DS */ if (LoadData(handle, dataHP, lPrev, headSize) == 0) { InternalError(handle,proc,READERR); return READERR; /* read header to change */ } /* 3. Start creating the new data section. The new section goes at the end */ dataHP->dataSt = lPrev + headSize; /* Start posn for the data */ dataHP->dataSz = lSize; /* Size of the data */ dataHP->lastDS = lPrev; dataHP->flags = flagSet; /* set flags for this DS */ pfileInfo->thisSection = thisDS; /* now talking about a different DS */ StoreTable(handle, thisDS, lThis); /* Get the DS start into table */ /* 4. write the data header to the file */ if (FileData(handle, dataHP, lThis, headSize) == 0) { InternalError(handle,proc,WRITERR); return WRITERR; } /* 5. update fileHeader and dataheader variable */ fileHP->dataSecs = thisDS; fileHP->endPnt = lThis; /* pointer to the last DS header */ fileHP->fileSz = lThis + headSize; /* Updated file size */ return 0; /* all ok */ } /* end of AppendDS */ /**************************** Get DS Size ******************************** ** ** Returns size (in bytes) of specified data section for old file or current ** data section for new file. (file specified by its program file handle ). ** The size returned is the disk space for the channel data and doesn't ** include the DS header. ** Return is the size or -ve error code. ** *****************************************************************************/ CFSAPI(CFSLONG) GetDSSize(short handle, /* program file handle */ WORD dataSection) { short proc = 22; short ecode; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif /* check handle */ ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return BADHANDLE; } /* check file status */ pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed != nothing) { /* get header if old file */ if (pfileInfo->allowed != writing) { if ((dataSection < 1) || (dataSection > pfileInfo->fileHeadP->dataSecs)) { InternalError(handle,proc,BADDS); return BADDS; } ecode = GetHeader(handle,dataSection); if (ecode < 0) { InternalError(handle,proc,ecode); return ecode; } } return pfileInfo->dataHeadP->dataSz; /* return stored size */ } else { InternalError(handle,proc, NOTWORR); return NOTWORR; } } /* end of GetDSSize */ /************************** Clear DS ******************************** ** ** Clear out data already written in current DS. See WriteData. ** *****************************************************************************/ CFSAPI(short) ClearDS(short handle) { short proc = 20; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpDHead dataHP = NULL; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed == writing); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return BADHANDLE; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* action depends on if file was opened by CREAT(writing) or OPEN (editing) */ if (pfileInfo->allowed == writing) /* adjust pointers for data size 0 */ { pfileInfo->fileHeadP->fileSz = dataHP->dataSt; pfileInfo->dataHeadP->dataSz = 0; } else { InternalError(handle,proc,NOTWRIT); return NOTWRIT; /* cannot do it unless CREAT (writing) */ } return 0; } /***************************** Remove DS ********************************* ** ** Remove a data section from the CFS file. Doesn't actually shorten the ** file but rearranges pointers so blocks dont appear any more. ** *****************************************************************************/ CFSAPI(void) RemoveDS(short handle, /* program file handle */ WORD dataSection) /* DS to remove */ { short proc = 4; /* number for this function */ CFSLONG storeLastDS; WORD relSize,index,ecode; CFSLONG tableValue; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(dataSection > 0); ASSERT(dataSection <= g_fileInfo[handle].fileHeadP->dataSecs); ASSERT((g_fileInfo[handle].allowed == writing) || (g_fileInfo[handle].allowed == editing)); /* 1. Check handle and data section parameters are valid */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ relSize = sizeof(TDataHead) - sizeof(TDSChArr); /* size of data header without channel infoe array */ if ((pfileInfo->allowed != writing) && (pfileInfo->allowed != editing)) { InternalError(handle,proc,NOTWORE); return; } if ((dataSection < 1) || (dataSection > pfileInfo->fileHeadP->dataSecs)) { InternalError(handle,proc,BADDS); return; } /* If this is the first edit made to a file get it ready for the change */ if ((pfileInfo->allowed == editing) && (pfileInfo->fileHeadP->tablePos != 0)) { ecode = FileUpdate(handle,pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle,proc,ecode); return; } } tableValue = GetTable(handle,dataSection); if (LoadData(handle,pfileInfo->extHeadP,tableValue,relSize) == 0) { InternalError(handle,proc,READERR); return; } storeLastDS = pfileInfo->extHeadP->lastDS; /* save the pointer to previous DS */ /* 3. If current DS needs Filing do so */ if (pfileInfo->DSAltered == 1) { tableValue = GetTable(handle,pfileInfo->thisSection); pfileInfo->DSAltered = 0; if (FileData(handle,pfileInfo->dataHeadP,tableValue,(WORD) pfileInfo->fileHeadP->dataHeadSz) == 0) { InternalError(handle,proc,WRITERR); return; } } pfileInfo->thisSection = 0xFFFF; /* 4. Remove section from pointer table */ for (index = dataSection;index < pfileInfo->fileHeadP->dataSecs;index++) { tableValue = GetTable(handle,(WORD)(index + 1)); /* shift all offsets one place */ StoreTable(handle,index,tableValue); /* back in array */ } /* 5. set lastDS for DS which now has removed ones index (or endPnt) if last */ if (dataSection < pfileInfo->fileHeadP->dataSecs) /* DS is not last one */ { tableValue = GetTable(handle,dataSection); /* offset for new DS with this number */ if (LoadData(handle,pfileInfo->extHeadP,tableValue,relSize) == 0) { InternalError(handle,proc,READERR); return; } pfileInfo->extHeadP->lastDS = storeLastDS; /* set new previous section */ if (FileData(handle,pfileInfo->extHeadP,tableValue,relSize) == 0) { InternalError(handle,proc,WRITERR); return; } /* write it back to file again */ } else pfileInfo->fileHeadP->endPnt = storeLastDS; /* if DS is last one */ /* 6. There is now 1 DS less in file */ pfileInfo->fileHeadP->dataSecs--; return; } /* end of Remove DS */ /***************************** Set Comment ******************************* ** ** Can use this function if file opened with CreateCFSFile or OpenCFSFile in ** edit mode. Overwrite the comment stored in the file header. ** *****************************************************************************/ CFSAPI(void) SetComment(short handle, /* program file handle */ TpCStr comment) /* comment to store */ { short proc = 15; /* function number */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; short ecode; /* for return from FileUpdate */ ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT((g_fileInfo[handle].allowed == writing) || (g_fileInfo[handle].allowed == editing)); /* check handle and file status */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ fileHP = pfileInfo->fileHeadP; if ((pfileInfo->allowed != writing) && (pfileInfo->allowed != editing)) { InternalError(handle,proc,NOTWRIT); return; } /* If this is the first edit made to a file get it ready for the change */ if ((pfileInfo->allowed == editing) && (pfileInfo->fileHeadP->tablePos != 0)) { ecode = FileUpdate(handle,pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle,proc,ecode); return; } } /* if all ok transfer comment to its place in the file header */ TransferIn(comment,fileHP->commentStr,COMMENTCHARS); } /* end of setComment */ /*************************** Set Var Val ******************************* ** ** Transfer the variable value to the byte list ready for transfer to file. ** ** If file opened by CreateCFSFile (allowed=writing) and the DS variable ** value applies to the current data section it will keep the value set ** for subsequent data sections unless changed. ** ** File opened by OpenCFSFile (allowed=editing) the new DS variable value ** applies to the data section specified only. ** *****************************************************************************/ CFSAPI(void) SetVarVal(short handle, /* program file handle */ short varNo, /* variable number (file or DS) */ short varKind, /* FILEVAR or DSVAR */ WORD dataSection, /* 0 or DS number */ TpVoid varADS) /* location of data to write to file */ { short proc = 5; /* function number */ short maxVarNo, ecode; int size = 0; int varOff; int stType; /* 1 for string transfers 0 for others */ TpSStr dest = NULL; BYTE maxLen = 0; BYTE charCount; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif CFSLONG* pLong = (CFSLONG*)varADS; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); ASSERT(g_fileInfo[handle].allowed != reading); /* NB ALL variable descriptions should be entered before the FIRST value is transferred */ /* Check handle parameter */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* Check file status */ if ((pfileInfo->allowed != writing) && (pfileInfo->allowed != editing)) { InternalError(handle, proc, NOTWORE); return; } stType = 0; /* Assume not a string */ /* Check variable kind and number */ switch (varKind) { case FILEVAR: { maxVarNo = pfileInfo->fileHeadP->filVars; if ((varNo >= 0) && (varNo < maxVarNo)) { /* retrieve place at which to store variable */ varOff = pfileInfo->FVPoint.nameP[varNo].vSize; dest = pfileInfo->FVPoint.dataP + varOff; /* get variable size from its offset and the next one */ size = (short)(pfileInfo->FVPoint. nameP[varNo+1].vSize-varOff); /* watch out for lstr type */ if (pfileInfo->FVPoint.nameP[varNo].vType == LSTR) { /* size allocated is for max number of chars + 2bytes */ maxLen = (BYTE)(size-2); /* maximum characters in transfer */ stType = 1; /* flag string transfer */ } else maxLen = 255; } break; } case DSVAR: { maxVarNo = pfileInfo->fileHeadP->datVars; /* same comments as above */ if ((varNo >= 0) && (varNo < maxVarNo)) { varOff = pfileInfo->DSPoint.nameP[varNo].vSize; dest = pfileInfo->DSPoint.dataP + varOff; size = (short)(pfileInfo->DSPoint.nameP[varNo+1]. vSize-varOff); if (pfileInfo->DSPoint.nameP[varNo].vType == LSTR) { maxLen = (BYTE)(size - 2); stType = 1; } else maxLen = 255; } break; } default: { InternalError(handle,proc,BADKIND); return; } } if ((varNo < 0) || (varNo >= maxVarNo)) { /* can now check variable number is in range */ InternalError(handle,proc,BADVARN); return; } /* Now split depending upon the variable type */ if (varKind == FILEVAR) { /* If this is the first edit made to a file get it ready for the change */ if ((pfileInfo->allowed == editing) && (pfileInfo->fileHeadP->tablePos != 0)) { ecode = FileUpdate(handle,pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle,proc,ecode); return; } } if (stType == 0) /* not a string to transfer */ CMovel(dest, varADS, (short)size); else { /* varADS is address of C string to transfer dest is address of LSTRING for storage */ charCount = (BYTE)F_strlen((TpStr)varADS); /* how many cahracters in string */ if (charCount > maxLen) charCount = maxLen; TransferIn((TpStr)varADS,(TpStr)dest,charCount); } } else { /* check datasection is in files range */ if ((pfileInfo->allowed == writing) && (dataSection == 0)) dataSection = (WORD)(pfileInfo->fileHeadP->dataSecs + 1); if ((dataSection < 1) || /* Now check for a legal DS */ ((dataSection > pfileInfo->fileHeadP->dataSecs) && (pfileInfo->allowed != writing)) || ((dataSection > pfileInfo->fileHeadP->dataSecs + 1) && (pfileInfo->allowed == writing))) { InternalError(handle,proc,BADDS); return; } /* If writing and looking back in file, preserve the data header */ if ((pfileInfo->allowed == writing) && (dataSection <= pfileInfo->fileHeadP->dataSecs)) { CMovel(pfileInfo->extHeadP, pfileInfo->dataHeadP, pfileInfo->fileHeadP->dataHeadSz); } /* If editing or reading need to load data header of DS specified */ if (dataSection <= pfileInfo->fileHeadP->dataSecs) { ecode = GetHeader(handle,dataSection); /* load data header */ if (ecode < 0) /* error code can be read/write error */ { InternalError(handle,proc,ecode); goto Restore; } } /* If this is the first edit made to a file get it ready for the change */ if ((pfileInfo->allowed == editing) && (pfileInfo->fileHeadP->tablePos != 0)) { ecode = FileUpdate(handle, pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle,proc,ecode); goto Restore; } } if (stType == 0) /* not a string to transfer */ CMovel(dest, varADS, (short)size); else { /* varADS is address of C string to transfer dest is address of LSTRING for storage */ charCount = (BYTE)F_strlen((TpStr)varADS); /* how many cahracters in string */ if (charCount > maxLen) charCount = maxLen; TransferIn((TpStr)varADS,(TpStr)dest,charCount); } /* If editing update DS header flag so it gets written to file later */ if (pfileInfo->allowed == editing) pfileInfo->DSAltered = 1; Restore: /* Restore header for DS being written if required */ if ((pfileInfo->allowed == writing) && (dataSection <= pfileInfo->fileHeadP->dataSecs)) { CFSLONG tableValue; // First write the data back to disk tableValue = GetTable(handle, dataSection); if (FileData(handle, pfileInfo->dataHeadP, tableValue, (WORD)pfileInfo->fileHeadP->dataHeadSz) == 0) InternalError(handle, proc, WRITERR); /* Then copy the old data back into position */ CMovel(pfileInfo->dataHeadP,pfileInfo->extHeadP, pfileInfo->fileHeadP->dataHeadSz); } } return; } /* end of SetVarVal */ /************************** Close CFS File ******************************* ** ** Close the CFS file specified by its program handle. ** It can have been opened by CreateCFSFile or OpenCFSFile. ** Return 0 if ok or error code if not. ** *****************************************************************************/ CFSAPI(short) CloseCFSFile(short handle) { short proc = 21; short flag = 0, exchange = 0, retval = 0; CFSLONG tabSize, tableValue; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; TpDHead dataHP; int index; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); /* 1. Check handle */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return BADHANDLE; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed == nothing) { InternalError(handle,proc,BADHANDLE); return BADHANDLE; } fileHP = pfileInfo->fileHeadP; dataHP = pfileInfo->dataHeadP; retval = 0; /* return value for ok. Will overwrite if error */ /* 2. File the last DS if necessary */ if ((pfileInfo->allowed == writing) && (fileHP->fileSz > dataHP->dataSt)) { if (InsertDS(handle,(WORD)(fileHP->dataSecs+1),dataHP->flags) != 0) retval = BADINS; } if (pfileInfo->allowed != reading) { /* 3. Transfer the pointer table first make sure that any altered DS header is filed. */ /* Check that the file actually needs updating */ if ((pfileInfo->allowed == editing) && (fileHP->tablePos != 0)) { /* no change has been made. DO NOT write to file. Tidy up. */ CFreeAllcn(pfileInfo->extHeadP); /* if file opened for table pointers close and delete it */ if (pfileInfo->tableP == NULL) { /* delete CFS file */ retval = CCloseAndUnlink(pfileInfo->DOSHdl.p, pfileInfo->tempFName); if (retval < 0) retval = WRDS; } } else { if (pfileInfo->DSAltered == 1) { tableValue = GetTable(handle,pfileInfo->thisSection); if (FileData(handle,dataHP,tableValue,fileHP->dataHeadSz) == 0) retval = WRITERR; } /* it is to go on end of CFS file */ if (CLSeek(pfileInfo->DOSHdl.d, fileHP->fileSz, 0) < 0) retval = DISKPOS; tabSize = fileHP->dataSecs * 4; /* size of table */ if (pfileInfo->tableP == NULL) /* table not in memory */ { /* copy from start of temp file */ if (CLSeek(pfileInfo->DOSHdl.p,(CFSLONG)0,0) < 0) retval = DISKPOS; exchange = TransferTable(fileHP->dataSecs, pfileInfo->DOSHdl.p, pfileInfo->DOSHdl.d); if (exchange < 0) retval = exchange; /* want to return error if not ok */ flag = CCloseAndUnlink(pfileInfo->DOSHdl.p, pfileInfo->tempFName);/* delete pointer file */ if ((flag < 0) && (exchange >= 0)) retval = WRDS; /* delete pointer table file */ } else /* table is in memory so write it to file */ if (CWriteHandle(pfileInfo->DOSHdl.d,(TpStr)pfileInfo->tableP, (WORD)tabSize) < (WORD)tabSize) retval = WRDS; /* 4. Store file header */ if (exchange < 0) fileHP->tablePos = 0; /* if transfer failed, enabling to rebuild table on the next run */ else fileHP->tablePos = fileHP->fileSz; /* table position at end of rest of file */ fileHP->fileSz = fileHP->fileSz + tabSize; /* add table to file size */ if (FileData(handle, fileHP, (CFSLONG)0, fileHP->fileHeadSz) == 0) retval = WRITERR; CFreeAllcn(pfileInfo->extHeadP); /* release space for insert header applies to writing and editing files */ /* set the file length */ if (CSetFileLen(pfileInfo->DOSHdl.d, pfileInfo->fileHeadP->fileSz) != 0) retval = BADFL; } } CClose(pfileInfo->DOSHdl.d); /* Close the CFS file */ CFreeAllcn(pfileInfo->fileHeadP); /* free space allocated for header */ CFreeAllcn(pfileInfo->dataHeadP); /* free space allocated for data */ /* flag handle as not used */ pfileInfo->allowed = nothing; /* no need to initialise other file prams */ /* as they will be initialised on opening/creating next CFS file */ /* if the table is in memory free its allocated space */ if (pfileInfo->tableP != NULL) CFreeAllcn(pfileInfo->tableP); for (index = 0; index < g_maxCfsFiles; index++) /* Finally, check tables */ if (g_fileInfo[index].allowed != nothing) /* Any files still open? */ break; /* If so, we exit the loop early */ if (index >= g_maxCfsFiles) /* If no files open, will clean up memory */ CleanUpCfs(); return retval; /* return 0 or errorcode */ } /* end of CloseCFSFile */ /************************** Open CFS File ******************************* ** ** Open en exisiting CFS file for reading or editing. ** Return the program handle if ok (even if cant fulfil table in memory ** request) or -ve error code. ** If only problem is inability to allocate memory for the table, this error ** is returned via the error record and things are set to proceed with the ** table on disc. ** *****************************************************************************/ CFSAPI(short) OpenCFSFile(TpCStr fname, /* C string containing file name */ short enableWrite, /* 1 for editing 0 for readonly */ short memoryTable) /* 1 for table in memory 0 for on disk */ { short proc; /* function number */ short loop,retval; WORD relevantSize; CFSLONG tblSz; short exchange, handle; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; TpDHead dataHP,extHP; proc = 13; /* initialise here to get rid of compiler warning */ extHP = NULL; /* do with goto */ /* 1. get a program file handle */ handle = FindUnusedHandle(); if (handle < 0) { InternalError(handle,proc,NOHANDLE); return NOHANDLE; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* 2. open the file with required status */ /* use loop as temp variable */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) loop = 0; if (COpen(fname,(short)((enableWrite == 0) ? rMode : wMode), &pfileInfo->DOSHdl.d) != 0) loop = -1; #else loop = 0; if (COpen(fname,(short)((enableWrite == 0) ? 0 : 2), &pfileInfo->DOSHdl.d) != 0) loop = -1; #endif if (loop < 0) { InternalError(handle,proc,BADOPEN); return BADOPEN; } /* file is now open and DOS handle stored */ /* 2a. Check the file size against minimum */ /* Calculate space needed for minimal file file header */ relevantSize = sizeof(TFileHead) - sizeof(TFilChArr); if (CGetFileLen(pfileInfo->DOSHdl.d) < (CFSLONG)relevantSize) { retval = BADVER; goto Close0; /* need to close file before exit */ } /* file is now open and DOS handle stored */ /* 3. get memory needed initially for file header and data header */ /* Calculate space needed for just a minimalist file header */ relevantSize = sizeof(TFileHead) - sizeof(TFilChArr); pfileInfo->fileHeadP = (TpFHead)CMemAllcn(relevantSize); fileHP = pfileInfo->fileHeadP; if (fileHP == NULL) /* allocation failed */ { retval = NOMEMR; goto Close0; /* need to close file before exit */ } /* read the file header into the space allocated */ if (LoadData(handle,fileHP,(CFSLONG)0,relevantSize) == 0) { retval = READERR; /* load failed */ goto Close1; /* free space allated and close file */ } /* check the file marker . first whole of current version marker .*/ if (F_strncmp(fileHP->marker,CEDMARKER,MARKERCHARS) != 0) { retval = BADVER; /* now 2nd check to sort out old version file from foreigner */ if (F_strncmp(fileHP->marker,PARTMARK,PARTMARKCHARS) == 0) { /* fish out which old version from ASCII of last TpStr */ retval = fileHP->marker[PARTMARKCHARS]; retval = (short)(-(retval+BADOLDVER)); /* convert to error code .Yuck! */ } goto Close1; /* tidy up and return error code */ } relevantSize = fileHP->fileHeadSz; /* size of full header including chan stuff */ CFreeAllcn(pfileInfo->fileHeadP); /* release smaller space */ fileHP = (TpFHead)CMemAllcn(relevantSize); /* get enough for all */ if (fileHP == NULL) { retval = NOMEMR; goto Close0; /* close file only before exit */ } pfileInfo->fileHeadP = fileHP; /* store pointer to space allocated */ /* 4. read whole of file header including fixed channel info */ if (LoadData(handle,fileHP,(CFSLONG)0,relevantSize) == 0) { retval = READERR; goto Close1; } /* allocate space for data header */ pfileInfo->dataHeadP = (TpDHead)CMemAllcn(fileHP->dataHeadSz); dataHP = pfileInfo->dataHeadP; if (dataHP == NULL) { retval = NOMEMR; /* failure at DS header allocation */ goto Close1; } if (enableWrite != 0) { /* if user wants to edit file get extra DS header for insert */ pfileInfo->extHeadP = (TpDHead)CMemAllcn(fileHP->dataHeadSz); extHP = pfileInfo->extHeadP; if (extHP == NULL) { retval = NOMEMR; goto Close2; /* free DS header, file header and close file */ } } else pfileInfo->extHeadP = NULL; /* set explicitly to NULL if not allocated */ /* 5. set pointers within allocated space */ /* file variable descriptions come after fixed channel data */ pfileInfo->FVPoint.nameP = (TpVDesc)(fileHP->FilChArr+fileHP->dataChans); /* DS variable descriptions come after the file variables */ pfileInfo->DSPoint.nameP = pfileInfo->FVPoint.nameP + fileHP->filVars + 1; /* file variable values follow the DS variable descriptions */ pfileInfo->FVPoint.dataP = (TpSStr)(pfileInfo->DSPoint.nameP + fileHP->datVars + 1); /* DS variable values follow the DS channel information */ pfileInfo->DSPoint.dataP = (TpSStr)(dataHP->DSChArr+fileHP->dataChans); /* 6. get pointer table in memory or in separate file */ tblSz = 4 * fileHP->dataSecs; /* first locate table in CFS file */ if (fileHP->tablePos == 0) /* is pointer table lost */ { if (enableWrite == 0) { /* need to change file access to read/write */ if (CClose(pfileInfo->DOSHdl.d) != 0) { retval = WRITERR; /* nearset error poss. */ goto Close2; } #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) loop = 0; if (COpen(fname, wMode, &pfileInfo->DOSHdl.d) != 0) loop = -1; #else loop = 0; if (COpen(fname, 2, &pfileInfo->DOSHdl.d) != 0) loop = -1; #endif if (loop < 0) { retval = BADOPEN; goto Close2; } } loop = RecoverTable(handle,&tblSz,&fileHP->tablePos,&fileHP->dataSecs, &fileHP->fileSz); /* if loop is zero the table will be recovered ie.added to the CFS file and the file header variable updated */ if (loop < 0) { retval = loop; /* return error code of recovertable */ goto Close2; /* deallocate file and DS header(s) and close file */ } else /* success in recovering table. write updated header to file */ { if (FileData(handle,fileHP,(CFSLONG)0,fileHP->fileHeadSz) == 0) { retval = WRITERR; goto Close2; } } if (enableWrite == 0) /* need to change file access back to read */ { if (CClose(pfileInfo->DOSHdl.d) != 0) { retval = WRITERR; /* nearset error poss. */ goto Close2; } #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) loop = 0; if (COpen(fname, rMode, &pfileInfo->DOSHdl.d) != 0) loop = -1; #else loop = 0; if (COpen(fname, 0, &pfileInfo->DOSHdl.d) != 0) loop = -1; #endif if (loop < 0) { retval = BADOPEN; goto Close2; } } } /* position CFS file pointer at start of table */ if (CLSeek(pfileInfo->DOSHdl.d,fileHP->tablePos,0) < 0) { retval = DISKPOS; /* couldnt find table data */ goto Close2; } /* if requested and if possible get pointer table in memory */ if (memoryTable != 0) /* request for table to be in memory */ memoryTable = GetMemTable(handle); /* try to get space */ if (memoryTable != 0) /* space in memory allcated for table */ { if (!LoadData(handle, pfileInfo->tableP, fileHP->tablePos, tblSz)) { retval = READERR; /* couldnt read table */ goto Close2; } } else /* table to be accessed from file */ { pfileInfo->tableP = NULL; /* flag pointer table not in memory */ if (enableWrite != 0) { /* editing required so make temp file for table */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) /* make and save name for temp file */ TempName(handle,fname,pfileInfo->tempFName, WHOLEFILECHARS+2); if (CCreat(pfileInfo->tempFName, rwMode, &pfileInfo->DOSHdl.p) != 0) pfileInfo->DOSHdl.p = (fDef)-1; #endif if (&(pfileInfo->DOSHdl.p) < 0) /* create failed */ { retval = BADCREAT; goto Close2; } if (CLSeek(pfileInfo->DOSHdl.p,(CFSLONG)0,0) != 0) { retval = BADCREAT; goto Close3; /* add close and delete of temp file to tiy up */ } exchange = TransferTable(fileHP->dataSecs,pfileInfo->DOSHdl.d, pfileInfo->DOSHdl.p); /* transfer table from CFS to temp file */ if (exchange < 0) { retval = exchange; /* retrun error code of TransferTable */ goto Close3; } } else pfileInfo->DOSHdl.p = pfileInfo->DOSHdl.d; /* for reading only access the table from the CFS file itself */ } /* all is well now set files status */ if (enableWrite != 0) pfileInfo->allowed = editing; else pfileInfo->allowed = reading; pfileInfo->thisSection = 0xFFFF; pfileInfo->DSAltered = 0; return handle; /* return the program file handle */ /* 7. Tidy up in case of failure */ Close3:if (pfileInfo->tableP == NULL) /* is there likely to be a temp table file */ { if (&(pfileInfo->DOSHdl.p) != &(pfileInfo->DOSHdl.d)) /* make sure it isnt the CFS file */ { loop = CCloseAndUnlink(pfileInfo->DOSHdl.p, pfileInfo->tempFName); /* delete file */ } } Close2:if (pfileInfo->tableP != NULL) { CFreeAllcn(pfileInfo->tableP); pfileInfo->tableP = NULL; } if (pfileInfo->extHeadP != NULL) { CFreeAllcn(pfileInfo->extHeadP); pfileInfo->extHeadP = NULL; } CFreeAllcn(pfileInfo->dataHeadP); Close1:CFreeAllcn(pfileInfo->fileHeadP); Close0:loop = CClose(pfileInfo->DOSHdl.d); InternalError(handle,proc,retval); /* InternalError gets the details */ return retval; /* return error code */ } /* end of OpenCFSFile */ /************************** Get Gen Info ******************************* ** ** For CFS file specified by it program file handle, return in the time,date ** and comment arrays the time and date of creation of the CFS file and ** its general comment. ** time and date should point to C strings at least 8 chars long. (This will ** give time/date chars with no NULL.) ** comment should point to a C string at least COMMENTCHARS+1 (73) chars long. ** Error return is via error reord. ** *****************************************************************************/ CFSAPI(void) GetGenInfo(short handle, /* progran file handle */ TpStr time, /* to read back time */ TpStr date, /* to read back date */ TpStr comment) /* to read back general comment */ { short Proc = 6; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) /* function number */ TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); /* check handle specified */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,Proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed == nothing) InternalError(handle,Proc,NOTOPEN); else { fileHP = pfileInfo->fileHeadP; /* for the time and date copy the 8 chars only no NULL */ F_strncpy(time,fileHP->timeStr,8); time[8] = '\0'; F_strncpy(date,fileHP->dateStr,8); date[8] = '\0'; TransferOut(fileHP->commentStr,comment,COMMENTCHARS); } return; } /* end of GetGenInfo */ /*************************** Get File Info ******************************* ** ** For user to get some values from the file header of the file specified ** by its program file handle. ** The values are returned via pointers which on entry should point to ** variables of the correct type. ** Error return is via error record. ** *****************************************************************************/ CFSAPI(void) GetFileInfo(short handle, /* program file handle */ TpShort channels, /* to return number of channels */ TpShort fileVars, /* to return number of file variables */ TpShort DSVars, /* to return number of DS variables */ TpUShort dataSections) /* to retrun no. of DS's */ { short Proc = 7; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) /* function number */ TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,Proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; if (pfileInfo->allowed != nothing) /* if file is open */ { fileHP = pfileInfo->fileHeadP; /* set the thing that each parameter points to to the value in the file */ *channels = fileHP->dataChans; *fileVars = fileHP->filVars; *DSVars = fileHP->datVars; *dataSections= fileHP->dataSecs; } else InternalError(handle,Proc,NOTOPEN); /* file flagged as not open */ return; } /* end of GeTFileInfo */ /************************** Get Var Desc ******************************* ** ** To get from the file, specified by its program handle, information about ** a particular variable description, specified by its varKind (FILEVAR or ** DSVAR) and its number (alloted when first stored ). ** The size and type are returned by variable pointers. ** The units and description are returned by string pointers. ** The pointer for units should point to a string of at least UNITCHARS+1 (9) ** chars and that for the description to a string of at least DESCCHARS+1 (21) ** chars. ** Any error is returned via the error record. ** *****************************************************************************/ CFSAPI(void) GetVarDesc(short handle, /* program file handle */ short varNo, /* file or DS variable number */ short varKind, /* FILEVAR or DSVAR */ TpShort varSize,/* to return variable size in bytes */ TpDType varType, /* to return variable type */ TpStr units, /* to return units as C string */ TpStr description) /* to return variable description as C string */ { short Proc = 8; /* function number */ short size; short maxVarNo; short nextOffset; TVarDesc interDesc; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; /* check program handle */ ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,Proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed != nothing) { fileHP = pfileInfo->fileHeadP; switch (varKind) { case FILEVAR:maxVarNo = (short)(fileHP->filVars-1); break; case DSVAR :maxVarNo = (short)(fileHP->datVars-1); break; default :InternalError(handle,Proc,BADKIND); return; } if ((varNo < 0) || (varNo > maxVarNo)) { InternalError(handle,Proc,BADVARN); return; } if (varKind == FILEVAR) { interDesc = pfileInfo->FVPoint.nameP[varNo]; /* inside program vsize filed stores variable offset in byte list (not the size) */ nextOffset = pfileInfo->FVPoint.nameP[varNo+1].vSize; } else { interDesc = pfileInfo->DSPoint.nameP[varNo]; nextOffset = pfileInfo->DSPoint.nameP[varNo+1].vSize; } *varType = interDesc.vType; /* to return variable type */ /* now sort out the size from the stored offsets */ size = (short)(nextOffset - interDesc.vSize); /* if the variable is an lstring deduct 1 so that what is returned is the length of the C string needed to store it, ie. number of characters + 1 for the NULL */ if (interDesc.vType == LSTR) size = (short)(size-1); *varSize = size; /* return size in bytes */ /* Transfer the units and description from their stored LSTRING format to the C string provided */ TransferOut(interDesc.varUnits,units,UNITCHARS); TransferOut(interDesc.varDesc,description,DESCCHARS); } else InternalError(handle,Proc,NOTOPEN); return; } /* end of GetVarDesc */ /*************************** Get Var Val ******************************** ** ** To get from the file, specified by its program file handle, the actual ** value of a variable specified by its varKind (FILEVAR or DSVAR) and ** number (allocated when stored). ** For DSVAR in the case of files opened by CreatsCFSFile the value for the ** current DS is returned regardless of the parameter dataSection, ** in the case of files opened by OpenCFSFile the value for the ** dataSection specified is returned. ** The value is returned by copying it to the address, varADS, provided. ** The user must ensure that varADS is pointing to a large enough piece ** of free memory to which to copy the variable. ** String variables are returned as NULL terminated C strings (although stored as LSTRING). ** Any error is returned via the error record. ** *****************************************************************************/ CFSAPI(void) GetVarVal(short handle, /* program file handle */ short varNo, /* number of variable required */ short varKind, /* FILEVAR orDSVAR */ WORD dataSection, /* may need to specify DS */ TpVoid varADS) /* for return of variable */ { short Proc = 9; /* function number */ short maxVarNo,size,ecode; TpStr sourceP; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpVDesc pInterDesc,pnext; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); if ((handle < 0) || (handle >= g_maxCfsFiles)) /* check handle */ { InternalError(handle,Proc,BADHANDLE); return; } if ((varKind != FILEVAR) && (varKind != DSVAR)) /* check kind too */ { InternalError(handle,Proc,BADKIND); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* 1. Check file is open */ if (pfileInfo->allowed != nothing) { // // We split into file/DS sections here as the DS var code is getting a bit // complex if (varKind == FILEVAR) { maxVarNo = (short)(pfileInfo->fileHeadP->filVars-1); if ((varNo < 0) || (varNo > maxVarNo)) { InternalError(handle,Proc,BADVARN); return; } pInterDesc = pfileInfo->FVPoint.nameP + varNo;/* vars descript */ size = pInterDesc->vSize; /* actually OFFSET for now */ /* set pointer to next var description */ pnext = pfileInfo->FVPoint.nameP + varNo + 1; /* point to variable in its data (char) array, using its offset, size */ sourceP = (TpStr)pfileInfo->FVPoint.dataP + size; size = (short)(pnext->vSize - size); /* set size from offsets */ /* 4. move the variable to the location specified */ if (pInterDesc->vType == LSTR) { size = (short)(size-2); TransferOut(sourceP,(TpStr)varADS,(BYTE)size); } else CMovel(varADS,sourceP,size); } else // Here we do mostly the same for DS vars. Sorry for the { // duplication of code, but it keeps things much easier to do. maxVarNo = (short)(pfileInfo->fileHeadP->datVars-1); if ((varNo < 0) || (varNo > maxVarNo)) { InternalError(handle,Proc,BADVARN); return; } // If DS 0 on a new file, set to be next DS. if ((pfileInfo->allowed == writing) && (dataSection == 0)) dataSection = (WORD)(pfileInfo->fileHeadP->dataSecs + 1); // Now to check the data section number if ((dataSection < 1) || ((dataSection > pfileInfo->fileHeadP->dataSecs) && (pfileInfo->allowed != writing)) || ((dataSection > pfileInfo->fileHeadP->dataSecs + 1) && (pfileInfo->allowed == writing))) { InternalError(handle, Proc, BADDS); return; } /* 2. Look to see if a different data header is needed. If it is and we are */ /* writing, we will need to save the current header. */ if (dataSection <= pfileInfo->fileHeadP->dataSecs) { if (pfileInfo->allowed == writing) // Save the current header ? CMovel(pfileInfo->extHeadP, pfileInfo->dataHeadP, pfileInfo->fileHeadP->dataHeadSz); ecode = GetHeader(handle, dataSection); /* read new header */ if (ecode != 0) /* could have failed on read or write */ { InternalError(handle,Proc,ecode); goto Restore; } } /* now sort out where the variable is in its array and how many bytes */ pInterDesc = pfileInfo->DSPoint.nameP + varNo; size = pInterDesc->vSize; /* This is offset for now */ pnext = pfileInfo->DSPoint.nameP + varNo + 1; sourceP = (TpStr)pfileInfo->DSPoint.dataP + size; size = (short)(pnext->vSize - size); /* set size from offsets */ /* if variable is lstr things are different */ if (pInterDesc->vType == LSTR) { size = (short)(size-2); TransferOut(sourceP,(TpStr)varADS,(BYTE)size); } else CMovel(varADS,sourceP,size); Restore: /* Restore header for DS being written if required */ if ((pfileInfo->allowed == writing) && (dataSection <= pfileInfo->fileHeadP->dataSecs)) { CMovel(pfileInfo->dataHeadP,pfileInfo->extHeadP, pfileInfo->fileHeadP->dataHeadSz); } } } else InternalError(handle,Proc,NOTOPEN); return; } /* end of GetVarVal */ /************************** Get File Chan ******************************* ** ** To get from file, specified by its program file handle, the fixed ** information on a channel, specified by its number. (ie the order in which ** it appears in the CFS file.) ** The character arrays channelName,yUnits and xUnits must be of sufficient ** size, (DESCCHARS+1 (21), and UNITCHARS+1 (9) characters), for the return ** of the C string. ** The other information is returned via pointers which should on entry ** point to variables of the correct type. ** Any error is returned via the error record. ** *****************************************************************************/ CFSAPI(void) GetFileChan(short handle, /* program file handle */ short channel,/* chan for which info is required */ TpStr channelName, /* to return channel name */ TpStr yUnits, /* to return channel y units */ TpStr xUnits, /* EqualSpaced ot subsidiary to return x units */ TpDType dataTypeP, /* to return 1 of 8 types for channel */ TpDKind dataKindP,/* return equalspaced, matrix or subsidiary */ TpShort spacing, /* to return bytes between successive values for channel */ TpShort other) /* for matrix data rets next chan */ { short Proc = 10; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) /* function number */ TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpChInfo pChInfo; /* check handle */ ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); ASSERT(channel >= 0); ASSERT(channel < g_fileInfo[handle].fileHeadP->dataChans); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,Proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed != nothing) { /* check channel parameter */ if ((channel < 0) || (channel >= pfileInfo->fileHeadP->dataChans)) { InternalError(handle,Proc,BADCHAN); return; } pChInfo = pfileInfo->fileHeadP->FilChArr + channel; /* transfer character arrays for return */ TransferOut(pChInfo->chanName,channelName,DESCCHARS); TransferOut(pChInfo->unitsY,yUnits,UNITCHARS); TransferOut(pChInfo->unitsX,xUnits,UNITCHARS); /* set values to which return pointers point to values from file */ *dataTypeP = pChInfo->dType; *dataKindP = pChInfo->dKind; *spacing = pChInfo->dSpacing; *other = pChInfo->otherChan; } else InternalError(handle,Proc,NOTOPEN); return; } /* end of GetFileChan */ /**************************** Get DS Chan ******************************** ** ** To get from file, specified by its program file handle, the values of the ** data section channel information. User specifies which channel. Data ** section can include the one being written if file opened with ** CreateCFSFile. The values are returned via pointers. ** Any error is returned via the error record. ** *****************************************************************************/ CFSAPI(void) GetDSChan(short handle, /* program file handle */ short channel, /* channel for which info required */ WORD dataSection, /* dataSection required */ TpLong startOffset, /* to return channel start */ TpLong points, /* to return data points for channel */ TpFloat yScale, /* to return yscale for channel */ TpFloat yOffset, /* to return y offset for channel */ TpFloat xScale, /* to return x scale for channel */ TpFloat xOffset) /* to return x offset for channel */ { short Proc = 11; /* function number */ short ecode; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpDsInfo pChInfo; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); ASSERT(channel >= 0); ASSERT(channel < g_fileInfo[handle].fileHeadP->dataChans); /* 1. Check handle */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,Proc,BADHANDLE); return; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* check file status */ if (pfileInfo->allowed != nothing) { /* 2. Check channel specified against range in file */ if ((channel < 0) || (channel >= pfileInfo->fileHeadP->dataChans)) { InternalError(handle,Proc,BADCHAN); return; } /* 3. Check the data section number. We can access the current section if writing */ if ((pfileInfo->allowed == writing) && (dataSection == 0)) dataSection = (WORD)(pfileInfo->fileHeadP->dataSecs + 1); if ((dataSection < 1) || ((dataSection > pfileInfo->fileHeadP->dataSecs) && (pfileInfo->allowed != writing)) || ((dataSection > pfileInfo->fileHeadP->dataSecs + 1) && (pfileInfo->allowed == writing))) { InternalError(handle,Proc,BADDS); return; } /* 4. If writing and looking back in file, preserve the data header */ if ((pfileInfo->allowed == writing) && (dataSection <= pfileInfo->fileHeadP->dataSecs)) { CMovel(pfileInfo->extHeadP,pfileInfo->dataHeadP, pfileInfo->fileHeadP->dataHeadSz); } /* 5. If editing or reading need to load data header of DS specified */ if (dataSection <= pfileInfo->fileHeadP->dataSecs) { ecode = GetHeader(handle,dataSection); /* load data header */ if (ecode < 0) /* error code can be read/write error */ { InternalError(handle,Proc,ecode); goto Restore; } } /* extract information required from DS header */ pChInfo = pfileInfo->dataHeadP->DSChArr + channel; *startOffset = pChInfo->dataOffset; *points = pChInfo->dataPoints; *yScale = pChInfo->scaleY; *yOffset = pChInfo->offsetY; *xScale = pChInfo->scaleX; *xOffset = pChInfo->offsetX; Restore: /* Restore header for DS being written if required */ if ((pfileInfo->allowed == writing) && (dataSection <= pfileInfo->fileHeadP->dataSecs)) { CMovel(pfileInfo->dataHeadP,pfileInfo->extHeadP, pfileInfo->fileHeadP->dataHeadSz); } } else InternalError(handle,Proc,NOTOPEN); return; } /* end of GetDSChan */ /************************** Get Chan Data ******************************* ** ** Return data for a single channel from the CFS file. ** ** User specifies file by its program file handle, ** channel for which data required, ** dataSection for which data required, ** data point in the DS and channel from which to start ** transfer. (first point is 0) ** number of data points to transfer. 0 means transfer from ** point specified to end of DS, (or end of buffer). ** ** The data are returned by transfer to a buffer starting at dataADS. This ** should point to an area large enough for the transfer. ** areaSize should be set to the size of this destination buffer (in bytes). ** The transfer will not exceed this area even if the points requested would ** take it beyond it. ** Return is 0 if parameters passed specify 0 points or if there is any error, ** (this may have occurred part way through transferring). ** If the whole operation was successful return is the number of data points ** actually transferred, (this may not be the number requested in numPoints). ** Any error is returned via the error record. ** *****************************************************************************/ CFSAPI(WORD) GetChanData(short handle, /* program file handle */ short channel, /* channel required */ WORD dataSection, /* DS required */ CFSLONG firstElement, /* data point in channel at which to start */ WORD numberElements, /* points wanted */ TpVoid dataADS, /* address to transfer to */ CFSLONG areaSize) /* bytes allocated for transfer */ { short SizeOfData[NDATATYPE]; /* sizes in bytes of data types */ short ecode; short Proc = 14; /* function number */ WORD elementSize,dataOffset,numSecs; WORD retval; WORD bufferSize,spacing,pointsPerBuffer,buffersNeeded, bufferLoop,residueElements; CFSLONG filePos,totalPoints,numElements,longSpace; TpStr dBufferP; // THandle dummy; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); ASSERT(channel >= 0); ASSERT(channel < g_fileInfo[handle].fileHeadP->dataChans); SizeOfData[INT1] = 1; /* set sizes in bytes of each data type */ SizeOfData[WRD1] = 1; SizeOfData[INT2] = 2; SizeOfData[WRD2] = 2; SizeOfData[INT4] = 4; SizeOfData[RL4] = 4; SizeOfData[RL8] = 8; SizeOfData[LSTR] = 1; retval = 0; /* initialise return value. no points transferred */ dBufferP = NULL; /* ** 1. Check file handle and status */ if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,Proc,BADHANDLE); return retval; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed != nothing) /* Are we allowed to do this ? */ { /* ** 2. check channel number */ if ((channel < 0) || (channel >= pfileInfo->fileHeadP->dataChans)) { InternalError(handle,Proc,BADCHAN); return retval; } /* ** 3. for file just created copy the header for current section to spare place */ if ((pfileInfo->allowed == writing) && (dataSection<=pfileInfo->fileHeadP->dataSecs)) { CMovel(pfileInfo->extHeadP, pfileInfo->dataHeadP, pfileInfo->fileHeadP->dataHeadSz); } /* ** 4. check data section and read in its header */ numSecs = pfileInfo->fileHeadP->dataSecs; /* shorthand for number of DS */ if ((pfileInfo->allowed == writing) && (dataSection == 0)) dataSection = (WORD)(numSecs+1); /* Convert 0 to currently writing */ if ((dataSection < 1) || ((pfileInfo->allowed != writing) && (dataSection>numSecs)) || ((pfileInfo->allowed == writing) && (dataSection>(numSecs+1)))) { InternalError(handle,Proc,BADDS); return retval; } if (dataSection <= numSecs) /* if not the current DS */ { ecode = GetHeader(handle,dataSection); /* get right DS */ if (ecode < 0) /* header not read */ { InternalError(handle,Proc,ecode); return retval; } } /* ** 5. Check space and number of points */ elementSize = SizeOfData[(int)pfileInfo->fileHeadP->FilChArr[channel].dType]; totalPoints = pfileInfo->dataHeadP->DSChArr[channel].dataPoints; if (numberElements == 0) numElements = totalPoints; else numElements = numberElements; /* ** check there are enough points in data section to satisfy request */ if ((numElements + firstElement) >totalPoints) numElements = totalPoints - firstElement; /* check that request does not exceed buffer */ if ((numElements * elementSize) > areaSize) numElements = areaSize/elementSize; /* limit to unsigned short range */ if (numElements > MAXFORWRD) numElements = MAXFORWRD; /* ** 6. extract channels */ if (numElements == 0) goto Restore; spacing = pfileInfo->fileHeadP->FilChArr[channel].dSpacing; /* get as much as poss */ if ((numElements*spacing) > MAXMEMALLOC) bufferSize = (WORD)(MAXMEMALLOC - (MAXMEMALLOC % spacing)); else bufferSize = (WORD)numElements * spacing; /* allocated space must have integral set of channels */ dBufferP = AllocateSpace(&bufferSize, spacing); if (bufferSize == 0) { InternalError(handle,Proc,NOMEMR); goto Restore; } pointsPerBuffer = (WORD)(bufferSize/spacing); buffersNeeded = (WORD)(((numElements-1)/pointsPerBuffer)+1); /* includes last part buffer */ longSpace = spacing; /* keep it like the Pascal version */ filePos = pfileInfo->dataHeadP->dataSt + pfileInfo->dataHeadP->DSChArr[channel]. dataOffset + (longSpace*firstElement); dataOffset = 0; /* deal with complete buffers other than the last one */ if (buffersNeeded > 1) { for (bufferLoop = 0;bufferLoop <= (buffersNeeded-2);bufferLoop++) { if (LoadData(handle,dBufferP,filePos,bufferSize) == 0) { InternalError(handle,Proc,READERR); goto Restore; /* tidy up before exit */ } ExtractBytes((TpStr)dataADS,dataOffset, dBufferP, pointsPerBuffer,spacing,elementSize); dataOffset = (WORD)(dataOffset + pointsPerBuffer*elementSize); filePos = filePos + bufferSize; } } /* ** now whole buffers are done deal with remainder (last Buffer ) */ residueElements = (WORD)(((numElements - 1) % pointsPerBuffer) +1); if (LoadData(handle,dBufferP,filePos,(WORD)((( residueElements-1)*spacing)+elementSize)) == 0) { InternalError(handle,Proc,READERR); goto Restore; } ExtractBytes((TpStr)dataADS,dataOffset, dBufferP, residueElements,spacing,elementSize); retval = (WORD)numElements; /* to return number of points successfully transferred */ /* ** 7. tidy up. if writing copy header back */ Restore: if ((pfileInfo->allowed == writing) && (dataSection <= numSecs)) { CMovel(pfileInfo->dataHeadP, pfileInfo->extHeadP, pfileInfo->fileHeadP->dataHeadSz); } if (dBufferP != NULL) /* free memory allocated for transfer */ CFreeAllcn(dBufferP); } else InternalError(handle,Proc,NOTOPEN); return retval; } /* end of GetChanData */ /***************************** Read Data ********************************* ** ** To read data from a data section. ** CFS File is specified by its program file handle. ** DS is specified by its number. (even if opened by CreateCFSFile). 1 is ** first DS. ** startOffset is byte offset within the DS at which to start. ** bytes specifies how much to read. (error if this is off end of DS ) ** dataADS points to the start of the region into which to read the data. ** The user must allocate at least bytes bytes for this. ** Return is 0 if ok -ve error code if not. ** *****************************************************************************/ CFSAPI(short) ReadData(short handle, /* program file handle */ WORD dataSection, /* data section required */ CFSLONG startOffset, /* offset into DS from which to start reading */ WORD bytes, /* number of bytes to read */ TpVoid dataADS) /* start address to which to read */ { short proc = 23; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpDHead phead; WORD numSecs; short ecode,retval; /* check handle */ ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return BADHANDLE; } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed == nothing) /* check status */ { InternalError(handle,proc,NOTOPEN); return NOTOPEN; } /* 1. for file opened by CreateCFSFile copy current DS header to spare */ numSecs = pfileInfo->fileHeadP->dataSecs; if ((pfileInfo->allowed == writing) && (dataSection <= numSecs)) { CMovel((TpVoid)pfileInfo->extHeadP, (TpVoid)pfileInfo->dataHeadP,pfileInfo->fileHeadP->dataHeadSz); } /* 2. read in header of required DS */ if ((dataSection < 1) || ((pfileInfo->allowed != writing) && (dataSection > numSecs)) || ((pfileInfo->allowed == writing) && (dataSection > (numSecs + 1)))) { InternalError(handle,proc,BADDS); return BADDS; } if (dataSection <= numSecs) /* read in if not current header */ { ecode = GetHeader(handle,dataSection); if (ecode < 0) { InternalError(handle,proc,ecode); return ecode; } } /* right header is now there */ phead = pfileInfo->dataHeadP; /* shorten its pointer */ /* check the read spec against what is in the DS */ retval = BADDSZ; /* in case check fails */ if ((startOffset < 0) || ((startOffset + bytes) > phead->dataSz)) goto Restore; /* clear up before exit */ /* 3. extract data */ retval = READERR; /* in case it fails */ if (LoadData(handle,dataADS,phead->dataSt+startOffset,bytes) == 0) goto Restore; retval = 0; /* transfer requested successfully completed */ /* 4. if CreateCFSFile used make sure current DS header back in place */ Restore: if ((pfileInfo->allowed == writing) && (dataSection <= numSecs)) CMovel((TpVoid)pfileInfo->dataHeadP, (TpVoid)pfileInfo->extHeadP,pfileInfo->fileHeadP->dataHeadSz); return retval; /* 0 or error code */ } /* end of ReadData */ /************************** DS Flag Value ******************************* ** ** Returns initial value of a DS flag, for index supplied from 1 to 16. ** *****************************************************************************/ CFSAPI(WORD) DSFlagValue(int nflag) { const WORD flagVal[16] = {FLAG0,FLAG1,FLAG2,FLAG3,FLAG4,FLAG5,FLAG6, FLAG7,FLAG8,FLAG9,FLAG10,FLAG11,FLAG12, FLAG13,FLAG14,FLAG15}; /* holds DS flags intial values */ if ((nflag <= 15) && (nflag >=0)) return flagVal[nflag]; else return (WORD) 0; } /**************************** DS Flags *********************************** ** ** Either gets or sets (specified by setIt) the flags for a specified data ** section within a CFS file, specified by its program file handle, which ** has been opened with OpenCFSFile. ** ** The flags may only be set if writing was enabled when the file was opened. ** On entry pflagSet should point to a variable in the users program of the ** type TSFlags. If the flags are being set this varaible should have the ** required settingd. ** ** Any error is returned via the error record. ** *****************************************************************************/ CFSAPI(void) DSFlags(short handle, /* program file handle */ WORD dataSection, /* DS for which flags set/get */ short setIt, /* 1 means set 0 means get flags */ TpFlags pflagSet) /* pointer to users flagset variable */ { short proc = 12; /* function number */ short ecode; TFileInfo *pfileInfo; ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed != nothing); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return; } /* Check file status. ie OpenCFSFile used */ pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed != nothing) { /* if setting check status is OK */ if ((setIt == 1) && (pfileInfo->allowed == reading)) { InternalError(handle,proc,NOTWORE); return; } /* check datasection is in files range */ if ((pfileInfo->allowed == writing) && (dataSection == 0)) dataSection = (WORD)(pfileInfo->fileHeadP->dataSecs + 1); if ((dataSection < 1) || /* Now check for a legal DS */ ((dataSection > pfileInfo->fileHeadP->dataSecs) && (pfileInfo->allowed != writing)) || ((dataSection > pfileInfo->fileHeadP->dataSecs + 1) && (pfileInfo->allowed == writing))) { InternalError(handle,proc,BADDS); return; } /* If writing and looking back in file, preserve the data header */ if ((pfileInfo->allowed == writing) && (dataSection <= pfileInfo->fileHeadP->dataSecs)) { CMovel(pfileInfo->extHeadP, pfileInfo->dataHeadP, pfileInfo->fileHeadP->dataHeadSz); } /* If editing or reading need to load data header of DS specified */ if (dataSection <= pfileInfo->fileHeadP->dataSecs) { ecode = GetHeader(handle,dataSection); /* load data header */ if (ecode < 0) /* error code can be read/write error */ { InternalError(handle,proc,ecode); goto Restore; } } /* Get or set flags for data section */ if (setIt == 1) { /* If this is the first edit made to a file get it ready for the change */ if ((pfileInfo->allowed == editing) && (pfileInfo->fileHeadP->tablePos != 0)) { ecode = FileUpdate(handle, pfileInfo->fileHeadP); if (ecode != 0) { InternalError(handle, proc, ecode); goto Restore; } } pfileInfo->dataHeadP->flags = *pflagSet; if (pfileInfo->allowed == editing) /* What to do now ? */ pfileInfo->DSAltered = 1; /* flag header has been altered */ } else *pflagSet = pfileInfo->dataHeadP->flags;/* return value in file */ Restore: /* Restore header for DS being written if required */ if ((pfileInfo->allowed == writing) && (dataSection <= pfileInfo->fileHeadP->dataSecs)) { if (setIt == 1) // Did we modify the data ? { // If so, we need to write it back CFSLONG tableValue; tableValue = GetTable(handle, dataSection); if (FileData(handle, pfileInfo->dataHeadP, tableValue, (WORD)pfileInfo->fileHeadP->dataHeadSz) == 0) InternalError(handle, proc, WRITERR); } /* Then copy the old data back into position */ CMovel(pfileInfo->dataHeadP,pfileInfo->extHeadP, pfileInfo->fileHeadP->dataHeadSz); } } else InternalError(handle,proc,NOTWORR); return; } /* end of DSFlags */ /***************************** File Error ******************************* ** ** Error function to collect information on error which is not instantly ** fatal. ** Return of error details is via pointers which on entry should point to ** variables of the right type. ** The values returned via these pointers refer to the first error encountered ** since the function was last called. (If no error was encountered since ** the last time the function was callled the values returned to will refer ** to the previous error ). ** Return value is 1 if an error was encountered since the last time the ** function was called, 0 if not. ** Side effect. ** eFound field of global errorInfo is reinitialised to 0. ** *****************************************************************************/ CFSAPI(short) FileError(TpShort handleNo, /* to return handle number */ TpShort procNo, /* to return procedure number */ TpShort errNo) /* to return error code */ { short retval; /* return current state of error found flag */ retval = errorInfo.eFound; *handleNo = errorInfo.eHandleNo; *procNo = errorInfo.eProcNo; *errNo = errorInfo.eErrNo; errorInfo.eFound = 0; /* reset for next error */ return retval; } /* end of FileError */ /************************** CommitCFSFile ********************************* ** ** CommitCFSFile:- Commits a file to disk, ie ensures that file secure ** on disk. The precise actions will vary with the OS, needless to say, ** but the DOS mechanism is to update the file header on disk, followed ** by duplicating the file handle and closing it, which updates the ** directory information. ** ** fh The handle for the file ** ** returns zero or -ve error code ** *****************************************************************************/ CFSAPI(short) CommitCFSFile(short handle) { short proc = 16; /* function number */ short err = 0; short retCode = 0; short restore = 0; int hand = 0; CFSLONG gtPlace = 0; CFSLONG endPtr = 0; CFSLONG oldDataSz = 0; CFSLONG oldFileSz = 0; CFSLONG oldLastDS = 0; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif ASSERT(handle >= 0); ASSERT(handle < g_maxCfsFiles); ASSERT(g_fileInfo[handle].allowed == writing); if ((handle < 0) || (handle >= g_maxCfsFiles)) { InternalError(handle,proc,BADHANDLE); return BADHANDLE; /* handle out of range */ } pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->allowed != writing) { InternalError(handle,proc,NOTWRIT); return NOTWRIT; /* not for writing */ } if (pfileInfo->fileHeadP->fileSz > pfileInfo->dataHeadP->dataSt) { /* Is there a growing DS ? */ oldDataSz = pfileInfo->dataHeadP->dataSz; oldLastDS = pfileInfo->dataHeadP->lastDS; /* points to header */ oldFileSz = pfileInfo->fileHeadP->fileSz; endPtr = pfileInfo->fileHeadP->endPnt; if (pfileInfo->fileHeadP->dataSecs == 0) pfileInfo->dataHeadP->lastDS = 0; else { pfileInfo->dataHeadP->lastDS = GetTable(handle, pfileInfo->fileHeadP->dataSecs); pfileInfo->dataHeadP->dataSz = pfileInfo->fileHeadP->fileSz - pfileInfo->dataHeadP->dataSt; gtPlace = pfileInfo->dataHeadP->dataSt + BlockRound(handle, pfileInfo->dataHeadP->dataSz); /* pointer to this DS */ if (!FileData(handle,pfileInfo->dataHeadP,gtPlace, (WORD)pfileInfo->fileHeadP->dataHeadSz)) retCode = WRDS; /* error writing DS header */ pfileInfo->fileHeadP->endPnt = gtPlace; pfileInfo->fileHeadP->fileSz = gtPlace + pfileInfo->fileHeadP->dataHeadSz; pfileInfo->fileHeadP->dataSecs++; /* inc data sections */ restore = 1; } } pfileInfo->fileHeadP->tablePos = 0; /* flag no table on disk... */ if (!FileData(handle,pfileInfo->fileHeadP,(CFSLONG)0, (WORD)pfileInfo->fileHeadP->fileHeadSz)) if (retCode == 0) retCode = WRITERR; /* error writing file header */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) /* shut the file for Windows */ if (!FlushFileBuffers(pfileInfo->DOSHdl.d)) retCode = BADHANDLE; #endif if (restore) { pfileInfo->fileHeadP->endPnt = endPtr; pfileInfo->fileHeadP->fileSz = oldFileSz; pfileInfo->dataHeadP->dataSz = oldDataSz; /* size of data */ pfileInfo->dataHeadP->lastDS = oldLastDS; pfileInfo->fileHeadP->dataSecs--; /* dec data sections */ } if (retCode != 0) InternalError(handle,proc,retCode); return retCode; } /****************************************************************************/ /***************** *************************/ /***************** Local function definitions *************************/ /***************** *************************/ /****************************************************************************/ /************************** Find Unused Handle ***************************** ** ** Looks through global array of file information to find first member ** which is not in use. Its index is the local file handle. -1 means none ** available. ** *****************************************************************************/ short FindUnusedHandle(void) { short search; if (g_maxCfsFiles <= 0) /* Do the initial allocation? */ { ASSERT(g_fileInfo == NULL); g_fileInfo = (TFileInfo*)CMemAllcn(INITCEDFILES * sizeof(TFileInfo)); if (g_fileInfo == NULL) return NOMEMR; /* Memory allocation error */ g_maxCfsFiles = INITCEDFILES; /* Number of files we have space for */ for (search = 0; search < g_maxCfsFiles; search++) g_fileInfo[search].allowed = nothing; /* Initialise file info */ } search = g_maxCfsFiles - 1; /* Start index for the search */ while ((search >= 0) && (g_fileInfo[search].allowed != nothing)) search--; if ((search < 0) && (g_maxCfsFiles < MAXCEDFILES)) /* If table is full */ { /* but could be enlarged */ TFileInfo* pNew; int num; num = g_maxCfsFiles * 2; /* Normally, just double the size */ if (num > MAXCEDFILES) num = MAXCEDFILES; /* but limit at the limit */ pNew = (TFileInfo*)CMemAllcn(num * sizeof(TFileInfo));/* Get memory */ if (pNew != NULL) /* and if it suceeded */ { for (search = 0; search < num; search++) /* Initialise memory */ pNew[search].allowed = nothing; /* and copy the data */ memcpy(pNew, g_fileInfo, sizeof(TFileInfo) * g_maxCfsFiles); CFreeAllcn(g_fileInfo); /* Discard old memory area */ g_fileInfo = pNew; /* and save new pointer and count */ g_maxCfsFiles = num; search = num - 1; /* and finally, return the last index */ } } return search; } /* end of FindUnusedHandle */ /***************************** Clean Up Cfs ***************************** ** ** Tries to clean up the CFS library memory prior to the library exiting ** from memory or shutting down. Called as part of Windows DLL cleanup. ** *****************************************************************************/ void CleanUpCfs(void) { int i; for (i = 0; i < g_maxCfsFiles; i++) if (g_fileInfo[i].allowed != nothing)/* Attempt a reliable clean up */ CloseCFSFile((short)i); if (g_fileInfo != NULL) CFreeAllcn(g_fileInfo); /* and final memory release and tidy up */ g_fileInfo = NULL; g_maxCfsFiles = 0; } /************************** Temp Name ************************************* ** ** Make a temporary file name encoding the file handle ** ****************************************************************************/ short TempName(short handle, TpCStr name, TpStr str2, unsigned str2len) { #if defined(_IS_WINDOWS_) short pathstart; short pathend = 0; short search = 0; char fname[WHOLEFILECHARS]; /* To get near variable holding string */ if (strlen(name) < WHOLEFILECHARS) F_strcpy(fname, name); /* Get filename in near var */ pathstart = 0; while (isspace(fname[pathstart])) pathstart++; /* first proper TpStr */ pathend = (short)(pathstart - 1); search = pathstart; /* start at proper start of file name */ while (search <= (short)F_strlen(fname)) { /* scan fname for end of path */ if ((fname[search] == '\\') || (fname[search] == ':')) pathend = search; search++; } /* use path if any to start temporary file name */ if (pathend >= pathstart) { F_strncpy(str2,fname+pathstart,pathend+1-pathstart); /* copy path */ str2[pathend+1-pathstart] = '\0'; /* add null */ } else { if (str2len > 0) F_strcpy(str2,""); /* or initialise to null string */ } F_strcat(str2,"CFS(TMP)."); /* ad standard part of temp file name */ _itoa(handle,gWorkStr,10); /* encode handle into string */ F_strcat(str2,gWorkStr); /* add handle to make complete name */ return 0; #else if (str2len > 12) F_strcpy(str2,"CFSTMPXXXXXX"); return (short)mkstemp(str2); #endif } /************************** Set Sizes ************************************* ** ** Look at array of variable descriptions and using the types add up how ** much space will be needed for all the actual variables in the array ** Return computed space (bytes) or -1 for error. ** *****************************************************************************/ short SetSizes(TpCVDesc theArray, TpShort offsetArray, short numVars) { short SizeOfData[NDATATYPE]; short search,size,runningTotal,errFlag; TpShort pOffsets; TpVDesc pVarDesc; /* set sizes for data types */ SizeOfData[INT1] = 1; SizeOfData[WRD1] = 1; SizeOfData[INT2] = 2; SizeOfData[WRD2] = 2; SizeOfData[INT4] = 4; SizeOfData[RL4] = 4; SizeOfData[RL8] = 8; SizeOfData[LSTR] = 0; errFlag = 0; /* No error */ runningTotal = 0; /* initialise */ for (search = 0;search < numVars;search++) { pOffsets = offsetArray + search; pVarDesc = (TpVDesc)theArray + search; /* Ok to remove const here */ /* check type is in range */ if ((pVarDesc->vType < 0) || (pVarDesc->vType >= NDATATYPE)) return -1; size = SizeOfData[(int)pVarDesc->vType]; if (pVarDesc->vType == LSTR) size = (short)(pVarDesc->vSize + 1); /* allow for NULL */ if ((size < 0) || (size >= MAXSTR)) errFlag = 1; *pOffsets = runningTotal; /* save start offset for each variable */ runningTotal = (short)(runningTotal+size); } if (errFlag) return -1; else return runningTotal; } /* end of setSizes */ /******************** Character handling functions ************************ ** ** TransferIn takes C string format (users storage) ** transfers to CFS storage format (program storage far heap) ** TransferOUT takes CFS storage format (program storage far heap) ** transfers to C string format (users storage). ** NB The length parameter is VITAL for checking strings do not overflow ** their char arrays. ** In both cases the length refers to the number of characters transferred ** neither the length byte nor the NULL are counted in this. ** ****************************************************************************/ /************************** Transfer In *********************************** ** ** Transfer as much as possible, but not more than max characters, of the ** NULL terminated C string old, to the character array new which imitates ** an LSTRING (NULL terminated) ** NB Since the allocated length of new cannot be checked the function relies ** on the parameter max to prevent overflow of new which should be ** declared as char[2+max]. ** new should finish up with new[0] containing the chracter count (0 to 255) ** then new[1] to new[new[0]] containig the characters and new[new[0]+1] ** containing the NULL ** *****************************************************************************/ void TransferIn(TpCStr olds, TpStr pNew, BYTE max) { BYTE lengths; short loop; lengths = (BYTE)F_strlen(olds); /* how many characters to transfer */ if (lengths > max) lengths = max; /* check against specified max */ pNew[0] = lengths; /* assigning an unsigned char to char preserves bit pattern */ /* now copy characters on at a time */ for (loop = 0;loop < (short)lengths;loop++) pNew[loop+1] = olds[loop]; pNew[lengths+1] = '\0'; /* put NULL on end */ } /* end of TransferIn */ /************************* Transfer Out *********************************** ** ** Transfer as much as possible but not more than max characters of the ** Pascal like LSTRING + NULL to an ordinary NULL terminated C string. ** NB new must have been declared at least char[max+1]. ** *****************************************************************************/ void TransferOut(TpCStr olds, TpStr pNew, BYTE max) { BYTE lengths; short loop; lengths = olds[0];/* get the number of chars in the Pascal type LSTRING */ if (lengths > max) lengths = max; /* dont transfer more than max chars */ for (loop = 0;loop < (short)lengths;loop++) pNew[loop] = olds[loop+1]; /* transfer 1 char at a time */ pNew[lengths] = '\0'; /* terminate with NULL */ } /* end of transferOut */ /************************* Set Var Descs ********************************** ** ** NB the useArray will contain its string data as C strings. When strings ** get put into the data structure array in this function they are ** converted to the LSTRING+NULL format required. ** This function sets the data structure variable descriptions and the ** pointers to the corresponding allocated storage positions. ** *****************************************************************************/ void SetVarDescs(short numOfVars, /* number of variable descriptions */ TPointers varPoint, /* pointers to starts of descriptions to be done and data storage places */ TpCVDesc useArray, /* array of values to go in */ TpShort offsets, /* array of computed (setSizes) offsets for data storage */ short vSpace) /* size of data variable area */ { short setloop; TpVDesc p; /* for storage in program use varaible description structs */ for (setloop = 0;setloop < numOfVars;setloop++) { p = varPoint.nameP + setloop; /* point to variable description to set */ p->vSize = offsets[setloop]; /* vsize to hold offset in data array for variable */ p->vType = useArray[setloop].vType; /* copy type from description provided */ p->zeroByte = 0; /* zero extra byte added for MS Pascal compatibility */ TransferIn(useArray[setloop].varUnits,p->varUnits,UNITCHARS); /* units string */ TransferIn(useArray[setloop].varDesc,p->varDesc,DESCCHARS); /* name string */ } /* after the ordinary variable descriptions comes the system one which stores the size of the data space neede for all the variables */ varPoint.nameP[numOfVars].vSize = vSpace; /* now initialise all the variable space to zero */ for (setloop = 0;setloop < vSpace;setloop++) varPoint.dataP[setloop] = 0; } /* end of SetVarDescs */ /************************* Block Round ********************************** ** ** Round up raw (which represents a storage space) to a whole number of blocks ** The block size is to be found in the file info for the program file handle ** specified and is usually 1 or 512. ** *****************************************************************************/ CFSLONG BlockRound(short handle,CFSLONG raw) { CFSLONG retval; short dbs; dbs = g_fileInfo[handle].fileHeadP->diskBlkSize; /* fish out the block size */ if (dbs == 1) retval = raw; else retval = ((raw + dbs - 1) / dbs) * dbs; return retval; } /* end of BlockRound */ /************************* Internal Error ********************************* ** ** Set the global errorInfo values for user to look at, UNLESS it has already ** been used. ** *****************************************************************************/ void InternalError(short handle,short proc,short err) { if (errorInfo.eFound == 0) /* no previous error */ { errorInfo.eFound = 1; errorInfo.eHandleNo = handle; errorInfo.eProcNo = proc; errorInfo.eErrNo = err; } } /* end of Internalerror */ /**************************** File Data *********************************** ** ** Write data to the CFS file corresponding to the program handle. ** Return 1 if ok 0 if not. ** *****************************************************************************/ short FileData(short handle, /* file handle */ TpVoid startP, /* start address from which to transfer */ CFSLONG st, /* file position to which to start writing */ CFSLONG sz) /* number of bytes to transfer */ { WORD res; TpStr pDat = (TpStr)startP; if ((st < 0) || (st >= MAXLSEEK)) return 0; if (CLSeek(g_fileInfo[handle].DOSHdl.d, st, 0) < 0) /* set file pointer */ return 0; if (sz == 0) /* dont try to write 0 bytes it will truncate file */ return 1; while (sz > 0) /* Loop to read the data */ { WORD wr; if (sz > 64000) /* How much to read this time round */ wr = 64000; else wr = (WORD)sz; res = CWriteHandle(g_fileInfo[handle].DOSHdl.d, pDat, wr); /* do write */ if (res == wr) /* keep going if all OK */ { sz -= wr; /* bytes left to do */ pDat += wr; /* pointer to write data */ } else return 0; /* Return failed if not written OK */ } return 1; } /* end of FileData */ /**************************** Load Data *********************************** ** ** Read data from the CFS file corresponding to the program handle. ** Return 1 if ok 0 if not. ** *****************************************************************************/ short LoadData(short handle, /* file handle */ TpVoid startP, /* address in memory to transfer to */ CFSLONG st, /* file position from which to start reading */ CFSLONG sz) /* number of bytes to transfer */ { WORD res; TpStr pDat = (TpStr)startP; if ((st < 0) || (st >= MAXLSEEK)) return 0; if (CLSeek(g_fileInfo[handle].DOSHdl.d,st,0) < 0 ) /* set file pointer */ return 0; while (sz > 0) /* Loop to read the data */ { WORD wr; if (sz > 64000) /* How much to read this time round */ wr = 64000; else wr = (WORD)sz; res = CReadHandle(g_fileInfo[handle].DOSHdl.d, pDat, wr);/* do read */ if (res == wr) /* keep going if all OK */ { sz -= wr; /* bytes left to do */ pDat += wr; /* pointer to read data */ } else return 0; /* Return failed if not read OK */ } return 1; } /* end of LoadData */ /*************************** Get Table *********************************** ** ** Return offset in CFS file for the section,position . ** if the table has been read in then the pointer tableP in g_fileInfo will ** point to it and the entry at (position-1) will correspond to ** the offset for the data section,postiton. ** If the table is not there the offset needs to be read from the ** temporary file. ** *****************************************************************************/ CFSLONG GetTable(short handle, WORD position) { CFSLONG DSPointer; /* return for offset value */ CFSLONG filePosn; /* position in temporary file for offset value */ #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* if table has been read in retrieve offset from it */ if (pfileInfo->tableP != NULL) DSPointer = pfileInfo->tableP[position-1]; else { /* get it from the temporary file */ filePosn = (position-1)*4; /* offset for each DS is CFSLONG ie 4 bytes */ if (pfileInfo->allowed == reading) filePosn=filePosn + pfileInfo->fileHeadP->fileSz - 4*pfileInfo->fileHeadP->dataSecs; CLSeek(pfileInfo->DOSHdl.p, filePosn, 0); /* move to place for read */ CReadHandle(pfileInfo->DOSHdl.p, (TpStr)&DSPointer, 4); /* 4 bytes */ } return DSPointer; } /* end of GetTable */ /*************************** Get Header *********************************** ** ** Reads header of DS requested from CFS file. If current header ** has been altered it is written to the CFS file before being replaced ** by the new one. ** Return value is 0 if all ok and errorcode READERR if failed on reading ** new section or WRITERR if failed when writing current header ** *****************************************************************************/ short GetHeader(short handle, WORD getSection) { CFSLONG tableValue; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif pfileInfo = &g_fileInfo[handle]; /* point to this files information */ if (pfileInfo->thisSection != getSection) /* only get it if different */ { if ((pfileInfo->DSAltered != 0) && /* write changed header to file */ (pfileInfo->allowed != writing)) /* But not if writing */ /* ** can only have DSAltered=1 if GetHeader has already been called and set ** thisSection */ { tableValue = GetTable(handle, pfileInfo->thisSection); if (FileData(handle, pfileInfo->dataHeadP, tableValue, (WORD)pfileInfo->fileHeadP->dataHeadSz) != 0) pfileInfo->DSAltered = 0;/* If saved can clear altered flag */ else return WRITERR; /* error if couldnt save current header */ } tableValue = GetTable(handle, getSection); if (LoadData(handle,pfileInfo->dataHeadP, tableValue, (WORD)pfileInfo->fileHeadP->dataHeadSz) == 0) return READERR; if (pfileInfo->allowed != writing) /* Keep track of actions */ pfileInfo->thisSection = getSection; else pfileInfo->thisSection = 0xFFFF; } return 0; } /* end of getHeader */ /*************************** Store Table *********************************** ** ** Put a CFSLONG offset value into the pointer table or file correspopnding to ** the entry for data section position. ** *****************************************************************************/ void StoreTable(short handle, WORD position, CFSLONG DSPointer) { CFSLONG filePosn; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif pfileInfo = &g_fileInfo[handle]; /* point to this files information */ /* ** look to see if pointer table has been read into memory */ if (pfileInfo->tableP != NULL) { if (position > pfileInfo->fileHeadP->dataSecs) { TpLong pNew; TpVoid pOld = pfileInfo->tableP; /* Previous data pointer */ pNew = (TpLong)CMemAllcn(position*4); if (pNew != NULL) { CMovel(pNew, pfileInfo->tableP, position*4); pfileInfo->tableP = pNew; CFreeAllcn(pOld); } else { /* if (pfileInfo->tableP == NULL) return NOMEMR; BUGBUG what the hell do I do here */ } } pfileInfo->tableP[position-1] = DSPointer; } else { /* table is in temporary file */ filePosn = (CFSLONG)(position-1)*4; /* each entry occupies 4 bytes */ CLSeek(pfileInfo->DOSHdl.p,filePosn,0); CWriteHandle(pfileInfo->DOSHdl.p,(TpStr)&DSPointer,4); } } /* end of storeTable */ /*************************** Recover Table ******************************** ** ** Re-build table holding file offsets of data section headers in the event ** of table size and number of data sections not tallying. ** Uses the information in the file header and individual data section ** headers. ** *****************************************************************************/ short RecoverTable(short handle, /* program file handle */ TpLong relSize, /* location of table size variable */ TpLong tPos, /* location of table position variable this is for return only */ TpUShort dSecs, /* location of number of DS's variable */ TpLong fSize) /* location of file size variable */ { WORD foundSecs,expSecs; CFSLONG secPos,tablePos,maxSecPos,fileSz,tableSz,maxSecs; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif TpFHead fileHP; short retval; THandle pHandle = 0; pfileInfo = &g_fileInfo[handle]; /* point to this files information */ fileHP = pfileInfo->fileHeadP; /* extract values from function parameter pointers */ tableSz = *relSize; /* expected size of table */ fileSz = *fSize; /* expected file size */ expSecs = *dSecs; /* expected number of data sections */ secPos = fileHP->endPnt; /* start place of highest numbered DS */ foundSecs = 0; /* initialise */ maxSecPos = secPos; /* initialise for finding last section in file */ #if 0 if (tableSz > MAXMEMALLOC) return NOMEMR; /* largest memory allocation */ #endif pfileInfo->tableP = (TpLong)CMemAllcn(tableSz); /* allocate space for table */ if (pfileInfo->tableP == NULL) return NOMEMR; maxSecs = tableSz/4; /* memory has been allocated for this number of longs */ if (maxSecs > MAXNODS) maxSecs = MAXNODS; /* dont exceed max */ retval = READERR; while (secPos > 0) /* work back through the data sections */ { foundSecs = (WORD)(foundSecs + 1); /* count how many sections found */ if (foundSecs > (WORD)maxSecs) /* fail if too many */ { retval = XSDS; goto Restore; } pfileInfo->tableP[expSecs-foundSecs] = secPos; /* store the one found starting at end of table */ /* read the DS header into the file info */ if (LoadData(handle,pfileInfo->dataHeadP,secPos, (WORD)fileHP->dataHeadSz) == 0) goto Restore; secPos = pfileInfo->dataHeadP->lastDS; /* extract from header just read in the file position of the previous data section */ if (secPos > maxSecPos) maxSecPos = secPos; /* keep a trace of largest offset found. */ } /* secPos = 0 means that 'previous DS' is in fact the fileheader */ tableSz = 4*foundSecs; /* new value for table size */ tablePos = maxSecPos + fileHP->dataHeadSz; /* end of data header area */ fileSz = tablePos + tableSz; /* new file size */ /* move file pointer to table start position */ if (CLSeek(pfileInfo->DOSHdl.d,tablePos,0) < 0) goto Restore; retval = WRITERR; /* write table to file */ if (CWriteHandle(pfileInfo->DOSHdl.d,(TpStr)&pfileInfo->tableP[expSecs- foundSecs],(WORD)tableSz)< (WORD)tableSz) goto Restore; expSecs = foundSecs; retval = 0; /* all ok */ /* prepare for new value returns via pointer function arguments */ *relSize = tableSz; *tPos = tablePos; *dSecs = expSecs; *fSize = fileSz; Restore:CFreeAllcn(pfileInfo->tableP); pfileInfo->tableP = NULL; return retval; /* error code or 0 */ } /* end of recovertable */ /*************************** Transfer Table ******************************** ** ** Transfer table from current position of file rdHdl to current position ** of file wrHdl in 512 (or 4) byte blocks. ** Return zero or error code ** *****************************************************************************/ short TransferTable(WORD sects, fDef rdHdl, fDef wrHdl) { short retval; TpShort transArr; /* array 512 bytes long */ WORD index,ntran,transSize, lastSize; // THandle pHandle = NULL; CFSLONG lTranBuf; /* last ditch transfer buffer */ retval = 0; /* return value if all ok */ if (sects == 0) return retval; /* Cover our backs */ transSize = 512; /* what we want to transfer */ transArr = (TpShort)CMemAllcn(transSize); if (transArr == NULL) /* have another go with little 4 byte blocks */ { transSize = 4; transArr = (TpShort)&lTranBuf; /* Pointer to stack variable */ } ntran = (WORD)(sects/(transSize/4)); /* number of whole blocks to transfer */ for (index = 1; index <= ntran; index++) { if (CReadHandle(rdHdl,(TpStr)transArr,transSize) < transSize) { retval = READERR; /* retrun error code */ goto Close1; } if (CWriteHandle(wrHdl,(TpStr)transArr,transSize) < transSize) { retval = WRITERR; goto Close1; } } if (ntran * (transSize/4) < sects) /* part of block still to transfer */ { lastSize = (WORD)((sects * 4) - (ntran * transSize)); if (CReadHandle(rdHdl,(TpStr)transArr, lastSize) < lastSize) { retval = READERR; goto Close1; } if (CWriteHandle(wrHdl,(TpStr)transArr, lastSize) < lastSize) retval = WRITERR; } Close1:if (transSize > 4) /* Don't free if using local variable */ CFreeAllcn(transArr); return retval; } /* end of TransferTable */ /*************************** GetMem Table ********************************* ** ** Try to alloacte space for pointer table. ** handle is program file handle, proc is function number from which called. ** Return 1 if alloaction ok 0 if not. ** *****************************************************************************/ short GetMemTable(short handle) { CFSLONG tableSz; #if defined(_IS_WINDOWS_) && !defined(__MINGW32__) TFileInfo _near *pfileInfo; #else TFileInfo *pfileInfo; #endif pfileInfo = &g_fileInfo[handle]; /* point to this files information */ tableSz = 4*(CFSLONG)pfileInfo->fileHeadP->dataSecs; /* 4 bytes per data section */ #if 0 if (tableSz > MAXMEMALLOC) return 0; /* failed */ #endif pfileInfo->tableP = (TpLong)CMemAllcn(tableSz); if (pfileInfo->tableP == NULL) return 0; /* failed */ return 1; /* success */ } /* end of GetMemTable */ /*************************** Allocate Space ******************************** ** ** Function for alloacting space which must be an integral number of steps. ** On entry sizeP points to the variable holding the size of the space ** (in bytes) requested. ** steps is the size in bytes of which the allocated space must be ** an integral multiple. ** On exit the variable pointed to by sizeP is the size of the space ** actually allocated. ** The return value is a pointer to the allocated space, NULL if allocation ** failed. ** *****************************************************************************/ TpStr AllocateSpace(TpUShort sizeP, WORD steps) { WORD buffSize; TpStr buffP; buffSize = *sizeP; /* required buffer size */ buffP = NULL; buffSize = (WORD)((buffSize/steps)*steps); /* truncate to integral number of steps */ while ((buffP == NULL) && (buffSize > 0)) { buffP = (TpStr)CMemAllcn(buffSize); /* do allocation */ if (buffP == NULL) /* want to have another go if failed */ { /* ** try half the size or if this isnt integral number of steps subtract steps */ if (((buffSize/2) % steps) == 0) buffSize = (WORD)(buffSize/2); else buffSize = (WORD)(buffSize - steps); } } /* prepare to return the final size allocated */ *sizeP = buffSize; return buffP; } /* end of AllocateSpace */ /*************************** Extract Bytes ******************************** ** ** Function to extract single channel array from array of interleaved data. ** On entry destP points to the start of array to which to write the ** single channel data. ** dataOffset is the offset in that array at which to start writing. ** srcP points to the start of the interleaved data. ** points is the number of data points to transfer. ** spacing is the number of bytes between data points of ** the channel required in the source array. ** ptSz is the number of bytes per point. ** *****************************************************************************/ void ExtractBytes(TpStr destP,WORD dataOffset,TpStr srcP, WORD points,WORD spacing,WORD ptSz) { WORD index; destP = destP + dataOffset; for (index = 0;index < points;index++) { CMovel(destP,srcP,ptSz); /* Transfer 1 point */ srcP = srcP + spacing; /* move to next point in source */ destP = destP + ptSz; /* move to place for next point */ } } /* end of ExtractBytes */ /*************************** File Update ******************************** ** ** Called when access to file is editing, the file has not yet been changed ** (tablePos != 0) but a real change is about to be made. ** It effectively removes the pointer table from the file and updates the ** file header accordingly. Returns 0 or error code. ** *****************************************************************************/ short FileUpdate(short handle, /* program file handle */ TpFHead fileHP) /* address in memory of file header */ { /* ** 1. Flag that table pointers removed from file */ fileHP->tablePos = 0; /* ** 2. Effect removal of memory table by not including it in file length */ fileHP->fileSz = fileHP->fileSz - 4 * fileHP->dataSecs; /* 4 bytes per DS */ /* ** 3. Write this information to the file as new file header. */ if (FileData(handle, fileHP, 0L, fileHP->fileHeadSz) == 0) return WRITERR; else return 0; } /* end of FileUpdate */ /******************************** E N D **********************************/ stimfit-0.15.8/src/libstfio/cfs/cfslib.h0000775000175000017500000000331613062445067015014 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file cfslib.h * \author Christoph Schmidt-Hieber * \date 2008-01-23 * \brief Import from and export to the CED filing system. */ #ifndef _CFSLIB_H #define _CFSLIB_H #include "../stfio.h" class Recording; namespace stfio { //! Open a CFS file and store its contents to a Recording object. /*! \param fName Full path to the file to be read. * \param ReturnData On entry, an empty Recording object. On exit, * the data stored in \e fName. * \param progress Set to true if a progress dialog should be updated. * \return 0 upon success, a negative error code upon failure. */ int importCFSFile(const std::string& fName, Recording& ReturnData, ProgressInfo& progDlg); //! Export a Recording to a CFS file. /*! \param fName Full path to the file to be written. * \param WData The data to be exported. * \return The CFS file handle. */ StfioDll bool exportCFSFile(const std::string& fName, const Recording& WData, ProgressInfo& progDlg); } #endif stimfit-0.15.8/src/libstfio/channel.cpp0000775000175000017500000000420713062445067014742 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "./stfio.h" #include "./channel.h" Channel::Channel(void) : name("\0"), yunits( "\0" ), SectionArray(0) {} Channel::Channel(const Section& c_Section) : name("\0"), yunits( "\0" ), SectionArray(1, c_Section) {} Channel::Channel(const std::deque
& SectionList) : name("\0"), yunits( "\0" ), SectionArray(SectionList) {} Channel::Channel(std::size_t c_n_sections, std::size_t section_size) : name("\0"), yunits( "\0" ), SectionArray(c_n_sections, Section(section_size)) {} Channel::~Channel(void) {} void Channel::InsertSection(const Section& c_Section, std::size_t pos) { try { if (SectionArray.at(pos).size() != c_Section.size()) { SectionArray.at(pos).resize(c_Section.size()); } SectionArray.at(pos) = c_Section; } catch (...) { throw; } } const Section& Channel::at(std::size_t at_) const { try { return SectionArray.at(at_); } catch (...) { // Forward all exceptions, can't deal with them here: throw; } } Section& Channel::at(std::size_t at_) { try { return SectionArray.at(at_); } catch (...) { // Forward all exceptions, can't deal with them here: throw; } } void Channel::resize(std::size_t newSize) { SectionArray.resize(newSize); } void Channel::reserve(std::size_t resSize) { /* SectionArray.reserve(resSize); */ } stimfit-0.15.8/src/libstfio/stfio.cpp0000664000175000017500000003447513062445067014465 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file stfio.cpp * \author Christoph Schmidt-Hieber * \date 2011-09-25 * \brief General functions for libstfio * * * Implements some general functions for libstfio */ // Copyright 2012 Alois Schloegl, IST Austria #include #include "stfio.h" // TODO #include "./ascii/asciilib.h" #include "./hdf5/hdf5lib.h" #include "./abf/abflib.h" #include "./atf/atflib.h" #include "./axg/axglib.h" #include "./igor/igorlib.h" #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) #include "./biosig/biosiglib.h" #endif #include "./cfs/cfslib.h" #include "./intan/intanlib.h" #ifndef TEST_MINIMAL #include "./heka/hekalib.h" #else #if (!defined(WITH_BIOSIG) && !defined(WITH_BIOSIG2)) #error -DTEST_MINIMAL requires -DWITH_BIOSIG or -DWITH_BIOSIG2 #endif #endif #if 0 #include "./son/sonlib.h" #endif #ifdef _MSC_VER StfioDll long int lround(double x) { int i = (long int) x; if (x >= 0.0) { return ((x-i) >= 0.5) ? (i + 1) : (i); } else { return (-x+i >= 0.5) ? (i - 1) : (i); } } #endif stfio::StdoutProgressInfo::StdoutProgressInfo(const std::string& title, const std::string& message, int maximum, bool verbose) : ProgressInfo(title, message, maximum, verbose), verbosity(verbose) { if (verbosity) { std::cout << title << std::endl; std::cout << message << std::endl; } } bool stfio::StdoutProgressInfo::Update(int value, const std::string& newmsg, bool* skip) { if (verbosity) { std::cout << "\r"; std::cout.width(3); std::cout << value << "% " << newmsg << std::flush; } return true; } #ifndef TEST_MINIMAL stfio::filetype stfio::findType(const std::string& ext) { if (ext=="*.dat;*.cfs") return stfio::cfs; else if (ext=="*.cfs") return stfio::cfs; else if (ext=="*.abf") return stfio::abf; else if (ext=="*.axgd") return stfio::axg; else if (ext=="*.axgx") return stfio::axg; else if (ext=="*.axgd;*.axgx") return stfio::axg; else if (ext=="*.h5") return stfio::hdf5; else if (ext=="*.atf") return stfio::atf; else if (ext=="*.dat") return stfio::heka; else if (ext=="*.smr") return stfio::son; else if (ext=="*.tdms") return stfio::tdms; else if (ext=="*.clp") return stfio::intan; #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) # if (BIOSIG_VERSION < 10800) else if (ext=="*.dat;*.cfs;*.gdf;*.ibw") return stfio::biosig; # else else if (ext=="*.dat;*.cfs;*.gdf;*.ibw;*.wcp") return stfio::biosig; # endif else if (ext=="*.*") return stfio::biosig; #endif else return stfio::none; } #endif // TEST_MINIMAL std::string stfio::findExtension(stfio::filetype ftype) { switch (ftype) { case stfio::cfs: return ".dat"; case stfio::abf: return ".abf"; case stfio::axg: return ".axg*"; case stfio::igor: return ".ibw"; case stfio::hdf5: return ".h5"; case stfio::atf: return ".atf"; case stfio::heka: return ".dat"; case stfio::son: return ".smr"; case stfio::tdms: return ".tdms"; case stfio::intan: return ".clp"; #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) case stfio::biosig: return ".gdf"; #endif default: return ".*"; } } bool stfio::importFile( const std::string& fName, stfio::filetype type, Recording& ReturnData, const stfio::txtImportSettings& txtImport, ProgressInfo& progDlg ) { try { #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) // make use of automated file type identification #ifndef WITHOUT_ABF if (!check_biosig_version(1,6,3)) { try { // workaround for older versions of libbiosig stfio::importABFFile(fName, ReturnData, progDlg); return true; } catch (...) { #ifndef NDEBUG fprintf(stdout,"%s (line %i): importABF attempted\n",__FILE__,__LINE__); #endif }; } #endif // WITHOUT_ABF // if this point is reached, import ABF was not applied or not successful try { stfio::filetype type1 = stfio::importBiosigFile(fName, ReturnData, progDlg); switch (type1) { case stfio::biosig: return true; // succeeded case stfio::none: break; // do nothing, use input argument for deciding on type default: type = type1; // filetype is recognized and should be used below } } catch (...) { // this should never occur, importBiosigFile should always return without exception std::cout << "importBiosigFile failed with an exception - this is a bug"; } #endif switch (type) { case stfio::hdf5: { stfio::importHDF5File(fName, ReturnData, progDlg); break; } #ifndef WITHOUT_ABF case stfio::abf: { stfio::importABFFile(fName, ReturnData, progDlg); break; } case stfio::atf: { stfio::importATFFile(fName, ReturnData, progDlg); break; } #endif #ifndef WITHOUT_AXG case stfio::axg: { stfio::importAXGFile(fName, ReturnData, progDlg); break; } #endif case stfio::intan: { stfio::importIntanFile(fName, ReturnData, progDlg); break; } #ifndef TEST_MINIMAL case stfio::cfs: { { int res = stfio::importCFSFile(fName, ReturnData, progDlg); /* // disable old Heka import - its broken and will not be fixed, use biosig instead if (res==-7) { stfio::importHEKAFile(fName, ReturnData, progDlg); } */ break; } } /* // disable old Heka import - its broken and will not be fixed, use biosig instead case stfio::heka: { { try { stfio::importHEKAFile(fName, ReturnData, progDlg); } catch (const std::runtime_error& e) { stfio::importCFSFile(fName, ReturnData, progDlg); } break; } } */ #endif // TEST_MINIMAL default: throw std::runtime_error("Unknown or unsupported file type"); } #if 0 case stfio::son: { stfio::SON::importSONFile(fName,ReturnData); break; } case stfio::ascii: { stfio::importASCIIFile( fName, txtImport.hLines, txtImport.ncolumns, txtImport.firstIsTime, txtImport.toSection, ReturnData ); if (!txtImport.firstIsTime) { ReturnData.SetXScale(1.0/txtImport.sr); } if (ReturnData.size()>0) ReturnData[0].SetYUnits(txtImport.yUnits); if (ReturnData.size()>1) ReturnData[1].SetYUnits(txtImport.yUnitsCh2); ReturnData.SetXUnits(txtImport.xUnits); break; } #endif } catch (...) { throw; } return true; } bool stfio::exportFile(const std::string& fName, stfio::filetype type, const Recording& Data, ProgressInfo& progDlg) { try { switch (type) { #ifndef WITHOUT_ABF case stfio::atf: { stfio::exportATFFile(fName, Data); break; } #endif #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) case stfio::biosig: { stfio::exportBiosigFile(fName, Data, progDlg); break; } #endif case stfio::cfs: { stfio::exportCFSFile(fName, Data, progDlg); break; } case stfio::hdf5: { stfio::exportHDF5File(fName, Data, progDlg); break; } case stfio::igor: { stfio::exportIGORFile(fName, Data, progDlg); break; } default: throw std::runtime_error("Trying to write an unsupported dataformat."); } } catch (...) { throw; } return true; } Vector_double stfio::vec_scal_plus(const Vector_double& vec, double scalar) { Vector_double ret_vec(vec.size(), scalar); std::transform(vec.begin(), vec.end(), ret_vec.begin(), ret_vec.begin(), std::plus()); return ret_vec; } Vector_double stfio::vec_scal_minus(const Vector_double& vec, double scalar) { Vector_double ret_vec(vec.size(), scalar); std::transform(vec.begin(), vec.end(), ret_vec.begin(), ret_vec.begin(), std::minus()); return ret_vec; } Vector_double stfio::vec_scal_mul(const Vector_double& vec, double scalar) { Vector_double ret_vec(vec.size(), scalar); std::transform(vec.begin(), vec.end(), ret_vec.begin(), ret_vec.begin(), std::multiplies()); return ret_vec; } Vector_double stfio::vec_scal_div(const Vector_double& vec, double scalar) { Vector_double ret_vec(vec.size(), scalar); std::transform(vec.begin(), vec.end(), ret_vec.begin(), ret_vec.begin(), std::divides()); return ret_vec; } Vector_double stfio::vec_vec_plus(const Vector_double& vec1, const Vector_double& vec2) { Vector_double ret_vec(vec1.size()); std::transform(vec1.begin(), vec1.end(), vec2.begin(), ret_vec.begin(), std::plus()); return ret_vec; } Vector_double stfio::vec_vec_minus(const Vector_double& vec1, const Vector_double& vec2) { Vector_double ret_vec(vec1.size()); std::transform(vec1.begin(), vec1.end(), vec2.begin(), ret_vec.begin(), std::minus()); return ret_vec; } Vector_double stfio::vec_vec_mul(const Vector_double& vec1, const Vector_double& vec2) { Vector_double ret_vec(vec1.size()); std::transform(vec1.begin(), vec1.end(), vec2.begin(), ret_vec.begin(), std::multiplies()); return ret_vec; } Vector_double stfio::vec_vec_div(const Vector_double& vec1, const Vector_double& vec2) { Vector_double ret_vec(vec1.size()); std::transform(vec1.begin(), vec1.end(), vec2.begin(), ret_vec.begin(), std::divides()); return ret_vec; } Recording stfio::concatenate(const Recording& src, const std::vector& sections, ProgressInfo& progDlg) { size_t nc, NC = src.size(); Recording Concatenated(NC, 1); for (nc = 0; nc < NC; nc++) { int new_size=0; for (c_st_it cit = sections.begin(); cit != sections.end(); cit++) { new_size += (int)src[nc][*cit].size(); } Section TempSection(new_size); std::size_t n_new=0; std::size_t n_s=0; for (c_st_it cit = sections.begin(); cit != sections.end(); cit++) { std::ostringstream progStr; progStr << "Adding section #" << (int)n_s+1 << " of " << (int)sections.size(); progDlg.Update( (int)((double)n_s/(double)sections.size()*100.0), progStr.str() ); if (cit == sections.begin()) { TempSection.SetXScale(src[nc][*cit].GetXScale()); } else if (TempSection.GetXScale() != src[nc][*cit].GetXScale()) { Concatenated.resize(0); throw std::runtime_error("can not concatanate because sampling frequency differs"); } std::size_t secSize=src[nc][*cit].size(); if (n_new+secSize>TempSection.size()) { Concatenated.resize(0); throw std::runtime_error("memory allocation error"); } std::copy(src[nc][*cit].get().begin(), src[nc][*cit].get().end(), &TempSection[n_new]); n_new += secSize; n_s++; } TempSection.SetSectionDescription(src[nc][0].GetSectionDescription() + ", concatenated"); Channel TempChannel(TempSection); TempChannel.SetChannelName(src[nc].GetChannelName()); TempChannel.SetYUnits(src[nc].GetYUnits()); Concatenated.InsertChannel(TempChannel, nc); } // Recording Concatenated(TempChannel); Concatenated.CopyAttributes(src); return Concatenated; } Recording stfio::multiply(const Recording& src, const std::vector& sections, std::size_t channel, double factor) { Channel TempChannel(sections.size(), src[channel][sections[0]].size()); std::size_t n = 0; for (c_st_it cit = sections.begin(); cit != sections.end(); cit++) { // Multiply the valarray in Data: Section TempSection(stfio::vec_scal_mul(src[channel][*cit].get(),factor)); TempSection.SetXScale(src[channel][*cit].GetXScale()); TempSection.SetSectionDescription( src[channel][*cit].GetSectionDescription()+ ", multiplied" ); try { TempChannel.InsertSection(TempSection, n); } catch (const std::out_of_range e) { throw e; } n++; } if (TempChannel.size()>0) { Recording Multiplied(TempChannel); Multiplied.CopyAttributes(src); Multiplied[0].SetYUnits( src.at( channel ).GetYUnits() ); return Multiplied; } else { throw std::runtime_error("Channel empty in stfio::multiply"); } } stimfit-0.15.8/src/libstfio/biosig/0000775000175000017500000000000013315356572014157 500000000000000stimfit-0.15.8/src/libstfio/biosig/biosiglib.h0000664000175000017500000000536513062445067016221 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file biosiglib.h * \author Christoph Schmidt-Hieber * \date 2011-02-18 * \brief Use biosig to read files */ #ifndef _BIOSIGLIB_H #define _BIOSIGLIB_H #include "../stfio.h" namespace stfio { #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) //! return version of libbiosig e.g. 10403 correspond to version 1.4.3 StfioDll bool check_biosig_version(int a, int b, int c); #endif //! Open an BIOSIG file and store its contents to a Recording object. /*! \param fName The full path to the file to be opened. * \param ReturnData On entry, an empty Recording object. On exit, * the data stored in \e fName. * \param progress True if the progress dialog should be updated. * * Return value: in case of success stfio::biosig is returned, * if the file format is recognized, the corresponding filetype is returned, * if the filetype is not recognized or not supported. stfio::none is returned. */ stfio::filetype importBiosigFile(const std::string& fName, Recording& ReturnData, ProgressInfo& progDlg); //! Export a Recording to a GDF file using biosig. /*! \param fName Full path to the file to be written. * \param WData The data to be exported. */ StfioDll bool exportBiosigFile(const std::string& fName, const Recording& WData, ProgressInfo& progDlg); } #endif stimfit-0.15.8/src/libstfio/biosig/biosiglib.cpp0000664000175000017500000010520113240263033016527 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Copyright 2012,2013,2017 Alois Schloegl, IST Austria #include #include "../stfio.h" #if defined(WITH_BIOSIG2) #if defined(WITH_BIOSIGLITE) #include "../../libbiosiglite/biosig4c++/biosig2.h" #else #include #endif #if (BIOSIG_VERSION < 10506) #error libbiosig2 v1.5.6 or later is required #endif #if (BIOSIG_VERSION > 10506) #define DONOTUSE_DYNAMIC_ALLOCATION_FOR_CHANSPR #endif #else #include #if defined(_MSC_VER) //#if (BIOSIG_VERSION < 10507) #error libbiosig is not ABI compatible //#endif #endif #error Loading SectionDescription from Biosig Event Table not yet supported when compiling WITH_BIOSIG, use WITH_BIOSIG2 instead. #endif /* these are internal biosig functions, defined in biosig-dev.h which is not always available */ extern "C" size_t ifwrite(void* buf, size_t size, size_t nmemb, HDRTYPE* hdr); extern "C" uint32_t lcm(uint32_t A, uint32_t B); #if !defined(__MINGW32__) && !defined(_MSC_VER) #if defined (__APPLE__) #include #else #include #endif #endif #include "./biosiglib.h" /* Redefine BIOSIG_VERSION for versions < 1 */ #if (BIOSIG_VERSION_MAJOR < 1) #undef BIOSIG_VERSION #ifndef BIOSIG_PATCHLEVEL #define BIOSIG_PATCHLEVEL BIOSIG_VERSION_STEPPING #endif #define BIOSIG_VERSION (BIOSIG_VERSION_MAJOR * 10000 + BIOSIG_VERSION_MINOR * 100 + BIOSIG_PATCHLEVEL) #endif stfio::filetype stfio_file_type(HDRTYPE* hdr) { #ifdef __LIBBIOSIG2_H__ switch (biosig_get_filetype(hdr)) { #else switch (hdr->TYPE) { #endif #if (BIOSIG_VERSION > 10500) case ABF2: return stfio::abf; #endif case ABF: return stfio::abf; case ATF: return stfio::atf; case CFS: return stfio::cfs; case HEKA: return stfio::heka; case HDF: return stfio::hdf5; #if (BIOSIG_VERSION > 10403) case AXG: return stfio::axg; case IBW: return stfio::igor; case SMR: return stfio::son; #endif default: return stfio::none; } } #if (defined(WITH_BIOSIG) || defined(WITH_BIOSIG2)) bool stfio::check_biosig_version(int a, int b, int c) { return (BIOSIG_VERSION >= 10000*a + 100*b + c); } #endif stfio::filetype stfio::importBiosigFile(const std::string &fName, Recording &ReturnData, ProgressInfo& progDlg) { std::string errorMsg("Exception while calling std::importBSFile():\n"); std::string yunits; stfio::filetype type; // ===================================================================================================================== // // importBiosig opens file with libbiosig // - performs an automated identification of the file format // - and decides whether the data is imported through importBiosig (currently CFS, HEKA, ABF1, GDF, and others) // - or handed back to other import*File functions (currently ABF2, AXG, HDF5) // // There are two implementations, level-1 and level-2 interface of libbiosig. // level 1 is used when -DWITH_BIOSIG, -lbiosig // level 2 is used when -DWITH_BIOSIG2, -lbiosig2 // // level 1 is better tested, but it does not provide ABI compatibility between MinGW and VisualStudio // level 2 interface has been developed to provide ABI compatibility, but it is less tested // and the API might still undergo major changes. // ===================================================================================================================== #ifdef __LIBBIOSIG2_H__ HDRTYPE* hdr = sopen( fName.c_str(), "r", NULL ); if (hdr==NULL) { ReturnData.resize(0); return stfio::none; } type = stfio_file_type(hdr); if (biosig_check_error(hdr)) { ReturnData.resize(0); destructHDR(hdr); return type; } enum FileFormat biosig_filetype=biosig_get_filetype(hdr); if (biosig_filetype==ATF || biosig_filetype==ABF2 || biosig_filetype==HDF ) { // ATF, ABF2 and HDF5 support should be handled by importATF, and importABF, and importHDF5 not importBiosig ReturnData.resize(0); destructHDR(hdr); return type; } // earlier versions of biosig support only the file type identification, but did not properly read the files if ( (BIOSIG_VERSION < 10603) && (biosig_filetype==AXG) ) { ReturnData.resize(0); destructHDR(hdr); return type; } // ensure the event table is in chronological order sort_eventtable(hdr); // allocate local memory for intermediate results; const int strSize=100; char str[strSize]; /* count sections and generate list of indices indicating start and end of sweeps */ int numberOfChannels = biosig_get_number_of_channels(hdr); double fs = biosig_get_eventtable_samplerate(hdr); size_t numberOfEvents = biosig_get_number_of_events(hdr); size_t nsections = biosig_get_number_of_segments(hdr); ReturnData.InitSectionMarkerList(nsections); std::vector SegIndexList(nsections+1); SegIndexList[0] = 0; SegIndexList[nsections] = biosig_get_number_of_samples(hdr); std::string annotationTableDesc = std::string(); for (size_t k=0, n=0; k < numberOfEvents; k++) { uint32_t pos; uint16_t typ; uint32_t dur; uint16_t chn; #if BIOSIG_VERSION < 10605 char *desc; #else const char *desc; #endif /* gdftype timestamp; */ biosig_get_nth_event(hdr, k, &typ, &pos, &chn, &dur, NULL, &desc); if (typ == 0x7ffe) { SegIndexList[++n] = pos; } else if (typ < 256) { sprintf(str,"%f s:\t%s\n", pos/fs, desc); annotationTableDesc += std::string( str ); size_t currentSectionNumber = (pos < SegIndexList[n]) ? n : (n+1); ReturnData.SetSectionType(currentSectionNumber-1, typ); // TODO: Description of EvenTypes // ReturnData.SetEventDescription( currentSectionNumber-1, desc); } } /************************************************************************* rescale data to mV and pA *************************************************************************/ for (int ch=0; ch < numberOfChannels; ++ch) { CHANNEL_TYPE *hc = biosig_get_channel(hdr, ch); switch (biosig_channel_get_physdimcode(hc) & 0xffe0) { case 4256: // Volt //biosig_channel_scale_to_unit(hc, "mV"); biosig_channel_change_scale_to_physdimcode(hc, 4274); break; case 4160: // Ampere //biosig_channel_scale_to_unit(hc, "pA"); biosig_channel_change_scale_to_physdimcode(hc, 4181); break; } } /************************************************************************* read bulk data *************************************************************************/ biosig_data_type *data = biosig_get_data(hdr, 0); size_t SPR = biosig_get_number_of_samples(hdr); #ifdef _STFDEBUG std::cout << "Number of events: " << numberOfEvents << std::endl; /*int res = */ hdr2ascii(hdr, stdout, 4); #endif for (int NS=0; NS < numberOfChannels; ) { CHANNEL_TYPE *hc = biosig_get_channel(hdr, NS); Channel TempChannel(nsections); TempChannel.SetChannelName(biosig_channel_get_label(hc)); TempChannel.SetYUnits(biosig_channel_get_physdim(hc)); for (size_t ns=1; ns<=nsections; ns++) { if (SegIndexList[ns]-SegIndexList[ns-1] < 0) { ReturnData.resize(0); destructHDR(hdr); return type; } size_t SPS = SegIndexList[ns]-SegIndexList[ns-1]; // length of segment, samples per segment int progbar = int(100.0 * (1.0 * ns / nsections + NS) / numberOfChannels); std::ostringstream progStr; progStr << "Reading channel #" << NS + 1 << " of " << numberOfChannels << ", Section #" << ns << " of " << nsections; progDlg.Update(progbar, progStr.str()); Section TempSection(SPS, ""); std::copy(&(data[NS*SPR + SegIndexList[ns-1]]), &(data[NS*SPR + SegIndexList[ns]]), TempSection.get_w().begin() ); try { TempChannel.InsertSection(TempSection, ns-1); } catch (...) { ReturnData.resize(0); destructHDR(hdr); return type; } } // end for sections try { if ((int)ReturnData.size() < numberOfChannels) ReturnData.resize(numberOfChannels); ReturnData.InsertChannel(TempChannel, NS++); } catch (...) { ReturnData.resize(0); destructHDR(hdr); return type; } } // end for channels ReturnData.SetComment ( biosig_get_recording_id(hdr) ); sprintf(str,"v%i.%i.%i (compiled on %s %s)",BIOSIG_VERSION_MAJOR,BIOSIG_VERSION_MINOR,BIOSIG_PATCHLEVEL,__DATE__,__TIME__); std::string Desc = std::string("importBiosig with libbiosig ")+std::string(str) + " "; const char* tmpstr; if ((tmpstr=biosig_get_technician(hdr))) Desc += std::string ("\nTechnician:\t") + std::string (tmpstr) + " "; Desc += std::string( "\nCreated with: "); if ((tmpstr=biosig_get_manufacturer_name(hdr))) Desc += std::string( tmpstr ) + " "; if ((tmpstr=biosig_get_manufacturer_model(hdr))) Desc += std::string( tmpstr ) + " "; if ((tmpstr=biosig_get_manufacturer_version(hdr))) Desc += std::string( tmpstr ) + " "; if ((tmpstr=biosig_get_manufacturer_serial_number(hdr))) Desc += std::string( tmpstr ) + " "; Desc += std::string ("\nUser specified Annotations:\n")+annotationTableDesc; ReturnData.SetFileDescription(Desc); #if (BIOSIG_VERSION > 10509) tmpstr = biosig_get_application_specific_information(hdr); if (tmpstr != NULL) /* MSVC2008 can not properly handle std::string( (char*)NULL ) */ ReturnData.SetGlobalSectionDescription(tmpstr); #endif ReturnData.SetXScale(1000.0/biosig_get_samplerate(hdr)); ReturnData.SetXUnits("ms"); ReturnData.SetScaling("biosig scaling factor"); /************************************************************************* Date and time conversion *************************************************************************/ struct tm T; biosig_get_startdatetime(hdr, &T); ReturnData.SetDateTime(T); destructHDR(hdr); #else // #ifndef __LIBBIOSIG2_H__ HDRTYPE* hdr = sopen( fName.c_str(), "r", NULL ); if (hdr==NULL) { ReturnData.resize(0); return stfio::none; } type = stfio_file_type(hdr); #if !defined(BIOSIG_VERSION) || (BIOSIG_VERSION < 10501) if (hdr->TYPE==ABF) { /* biosig v1.5.0 and earlier does not always return with a proper error message for ABF files. This causes problems with the ABF fallback mechanism */ #else if ( hdr->TYPE==ABF2 ) { // ABF2 support should be handled by importABF not importBiosig ReturnData.resize(0); destructHDR(hdr); return type; } if (hdr->TYPE==ABF && hdr->AS.B4C_ERRNUM) { /* this triggers the fall back mechanims w/o reporting an error message */ #endif ReturnData.resize(0); destructHDR(hdr); // free allocated memory return type; } #if defined(BIOSIG_VERSION) && (BIOSIG_VERSION > 10400) if (hdr->AS.B4C_ERRNUM) { #else if (B4C_ERRNUM) { #endif ReturnData.resize(0); destructHDR(hdr); // free allocated memory return type; } if ( hdr->TYPE==ATF || hdr->TYPE==HDF) { // ATF, HDF5 support should be handled by importATF and importHDF5 not importBiosig ReturnData.resize(0); destructHDR(hdr); return type; } // earlier versions of biosig support only the file type identification, but did not read AXG files #if defined(BIOSIG_VERSION) && (BIOSIG_VERSION > 10403) if ( (BIOSIG_VERSION < 10600) && (hdr->TYPE==AXG) ) { // biosig's AXG import crashes on Windows at this time ReturnData.resize(0); destructHDR(hdr); return type; } #endif // ensure the event table is in chronological order sort_eventtable(hdr); // allocate local memory for intermediate results; const int strSize=100; char str[strSize]; /* count sections and generate list of indices indicating start and end of sweeps */ size_t numberOfEvents = hdr->EVENT.N; size_t LenIndexList = 256; if (LenIndexList > numberOfEvents) LenIndexList = numberOfEvents + 2; size_t *SegIndexList = (size_t*)malloc(LenIndexList*sizeof(size_t)); uint32_t nsections = 0; SegIndexList[nsections] = 0; size_t MaxSectionLength = 0; for (size_t k=0; k <= numberOfEvents; k++) { if (LenIndexList <= nsections+2) { // allocate more memory as needed LenIndexList *=2; SegIndexList = (size_t*)realloc(SegIndexList, LenIndexList*sizeof(size_t)); } /* count number of sections and stores it in nsections; EVENT.TYP==0x7ffe indicate number of breaks between sweeps SegIndexList includes index to first sample and index to last sample, thus, the effective length of SegIndexList is the number of 0x7ffe plus two. */ if (0) ; else if (k >= hdr->EVENT.N) SegIndexList[++nsections] = hdr->NRec*hdr->SPR; else if (hdr->EVENT.TYP[k]==0x7ffe) SegIndexList[++nsections] = hdr->EVENT.POS[k]; else continue; size_t SPS = SegIndexList[nsections]-SegIndexList[nsections-1]; // length of segment, samples per segment if (MaxSectionLength < SPS) MaxSectionLength = SPS; } int numberOfChannels = 0; for (int k=0; k < hdr->NS; k++) if (hdr->CHANNEL[k].OnOff==1) numberOfChannels++; /************************************************************************* rescale data to mV and pA *************************************************************************/ for (int ch=0; ch < hdr->NS; ++ch) { CHANNEL_TYPE *hc = hdr->CHANNEL+ch; if (hc->OnOff != 1) continue; double scale = PhysDimScale(hc->PhysDimCode); switch (hc->PhysDimCode & 0xffe0) { case 4256: // Volt hc->PhysDimCode = 4274; // = PhysDimCode("mV"); scale *=1e3; // V->mV hc->PhysMax *= scale; hc->PhysMin *= scale; hc->Cal *= scale; hc->Off *= scale; break; case 4160: // Ampere hc->PhysDimCode = 4181; // = PhysDimCode("pA"); scale *=1e12; // A->pA hc->PhysMax *= scale; hc->PhysMin *= scale; hc->Cal *= scale; hc->Off *= scale; break; } } /************************************************************************* read bulk data *************************************************************************/ hdr->FLAG.ROW_BASED_CHANNELS = 0; /* size_t blks = */ sread(NULL, 0, hdr->NRec, hdr); biosig_data_type *data = hdr->data.block; size_t SPR = hdr->NRec*hdr->SPR; #ifdef _STFDEBUG std::cout << "Number of events: " << numberOfEvents << std::endl; /*int res = */ hdr2ascii(hdr, stdout, 4); #endif int NS = 0; // number of non-empty channels for (size_t nc=0; nc < hdr->NS; ++nc) { if (hdr->CHANNEL[nc].OnOff == 0) continue; Channel TempChannel(nsections); TempChannel.SetChannelName(hdr->CHANNEL[nc].Label); #if defined(BIOSIG_VERSION) && (BIOSIG_VERSION > 10301) TempChannel.SetYUnits(PhysDim3(hdr->CHANNEL[nc].PhysDimCode)); #else PhysDim(hdr->CHANNEL[nc].PhysDimCode,str); TempChannel.SetYUnits(str); #endif for (size_t ns=1; ns<=nsections; ns++) { size_t SPS = SegIndexList[ns]-SegIndexList[ns-1]; // length of segment, samples per segment int progbar = 100.0*(1.0*ns/nsections + NS)/numberOfChannels; std::ostringstream progStr; progStr << "Reading channel #" << NS + 1 << " of " << numberOfChannels << ", Section #" << ns << " of " << nsections; progDlg.Update(progbar, progStr.str()); /* unused // char sweepname[20]; sprintf(sweepname,"sweep %i",(int)ns); */ Section TempSection( SPS, // TODO: hdr->nsamplingpoints[nc][ns] "" // TODO: hdr->sectionname[nc][ns] ); std::copy(&(data[NS*SPR + SegIndexList[ns-1]]), &(data[NS*SPR + SegIndexList[ns]]), TempSection.get_w().begin() ); try { TempChannel.InsertSection(TempSection, ns-1); } catch (...) { ReturnData.resize(0); destructHDR(hdr); return type; } } try { if ((int)ReturnData.size() < numberOfChannels) { ReturnData.resize(numberOfChannels); } ReturnData.InsertChannel(TempChannel, NS++); } catch (...) { ReturnData.resize(0); destructHDR(hdr); return type; } } free(SegIndexList); ReturnData.SetComment ( hdr->ID.Recording ); sprintf(str,"v%i.%i.%i (compiled on %s %s)",BIOSIG_VERSION_MAJOR,BIOSIG_VERSION_MINOR,BIOSIG_PATCHLEVEL,__DATE__,__TIME__); std::string Desc = std::string("importBiosig with libbiosig ")+std::string(str); if (hdr->ID.Technician) Desc += std::string ("\nTechnician:\t") + std::string (hdr->ID.Technician); Desc += std::string( "\nCreated with: "); if (hdr->ID.Manufacturer.Name) Desc += std::string( hdr->ID.Manufacturer.Name ); if (hdr->ID.Manufacturer.Model) Desc += std::string( hdr->ID.Manufacturer.Model ); if (hdr->ID.Manufacturer.Version) Desc += std::string( hdr->ID.Manufacturer.Version ); if (hdr->ID.Manufacturer.SerialNumber) Desc += std::string( hdr->ID.Manufacturer.SerialNumber ); Desc += std::string ("\nUser specified Annotations:\n"); for (size_t k=0; k < numberOfEvents; k++) { if (hdr->EVENT.TYP[k] < 256) { sprintf(str,"%f s\t",hdr->EVENT.POS[k]/hdr->EVENT.SampleRate); Desc += std::string( str ); if (hdr->EVENT.CodeDesc != NULL) Desc += std::string( hdr->EVENT.CodeDesc[hdr->EVENT.TYP[k]] ); Desc += "\n"; } } ReturnData.SetFileDescription(Desc); // hdr->AS.bci2000 is an alias to hdr->AS.fpulse, which available only in libbiosig v1.6.0 or later if (hdr->AS.bci2000) ReturnData.SetGlobalSectionDescription(std::string(hdr->AS.bci2000)); ReturnData.SetXScale(1000.0/hdr->SampleRate); ReturnData.SetXUnits("ms"); ReturnData.SetScaling("biosig scaling factor"); /************************************************************************* Date and time conversion *************************************************************************/ struct tm T; #if (BIOSIG_VERSION_MAJOR > 0) gdf_time2tm_time_r(hdr->T0, &T); #else struct tm* Tp; Tp = gdf_time2tm_time(hdr->T0); T = *Tp; #endif ReturnData.SetDateTime(T); destructHDR(hdr); #endif return stfio::biosig; } // ===================================================================================================================== // // Save file with libbiosig into GDF format // // There basically two implementations, one with libbiosig before v1.6.0 and // and one for libbiosig v1.6.0 and later // // ===================================================================================================================== bool stfio::exportBiosigFile(const std::string& fName, const Recording& Data, stfio::ProgressInfo& progDlg) { /* converts the internal data structure to libbiosig's internal structure and saves the file as gdf file. The data in converted into the raw data format, and not into the common data matrix. */ #ifdef __LIBBIOSIG2_H__ size_t numberOfChannels = Data.size(); HDRTYPE* hdr = constructHDR(numberOfChannels, 0); /* Initialize all header parameters */ biosig_set_filetype(hdr, GDF); biosig_set_startdatetime(hdr, Data.GetDateTime()); const char *xunits = Data.GetXUnits().c_str(); uint16_t pdc = PhysDimCode(xunits); if ((pdc & 0xffe0) != PhysDimCode("s")) { fprintf(stderr,"Stimfit exportBiosigFile: xunits [%s] has not proper units, assume [ms]\n",Data.GetXUnits().c_str()); pdc = PhysDimCode("ms"); } double fs = 1.0/(PhysDimScale(pdc) * Data.GetXScale()); biosig_set_samplerate(hdr, fs); #if (BIOSIG_VERSION < 10700) biosig_set_flags(hdr, 0, 0, 0); #else biosig_reset_flag(hdr, BIOSIG_FLAG_COMPRESSION | BIOSIG_FLAG_UCAL | BIOSIG_FLAG_OVERFLOWDETECTION | BIOSIG_FLAG_ROW_BASED_CHANNELS ); #endif size_t k, m, numberOfEvents=0; size_t NRec=0; // corresponds to hdr->NRec size_t SPR=1; // corresponds to hdr->SPR size_t chSPR=0; // corresponds to hc->SPR /* Initialize all channel parameters */ #ifndef DONOTUSE_DYNAMIC_ALLOCATION_FOR_CHANSPR size_t *chanSPR = (size_t*)malloc(numberOfChannels*sizeof(size_t)); #endif for (k = 0; k < numberOfChannels; ++k) { CHANNEL_TYPE *hc = biosig_get_channel(hdr, k); biosig_channel_set_datatype_to_double(hc); biosig_channel_set_scaling(hc, 1e9, -1e9, 1e9, -1e9); biosig_channel_set_label(hc, Data[k].GetChannelName().c_str()); biosig_channel_set_physdim(hc, Data[k].GetYUnits().c_str()); biosig_channel_set_filter(hc, NAN, NAN, NAN); biosig_channel_set_timing_offset(hc, 0.0); biosig_channel_set_impedance(hc, NAN); chSPR = SPR; // each segment gets one marker, roughly numberOfEvents += Data[k].size(); size_t m,len = 0; for (len=0, m = 0; m < Data[k].size(); ++m) { unsigned div = lround(Data[k][m].GetXScale()/Data.GetXScale()); chSPR = lcm(chSPR,div); // sampling interval of m-th segment in k-th channel len += div*Data[k][m].size(); } SPR = lcm(SPR, chSPR); /* hc->SPR (i.e. chSPR) is 'abused' to store final hdr->SPR/hc->SPR, this is corrected in the loop below its a hack to avoid the need for another malloc(). */ #ifdef DONOTUSE_DYNAMIC_ALLOCATION_FOR_CHANSPR biosig_channel_set_samples_per_record(hc, chSPR); #else chanSPR[k]=chSPR; #endif if (k==0) { NRec = len; } else if ((size_t)NRec != len) { destructHDR(hdr); throw std::runtime_error("File can't be exported:\n" "No data or traces have different sizes" ); return false; } } biosig_set_number_of_samples(hdr, NRec, SPR); size_t bpb = 0; for (k = 0; k < numberOfChannels; ++k) { CHANNEL_TYPE *hc = biosig_get_channel(hdr, k); // the 'abuse' of hc->SPR described above is corrected #ifdef DONOTUSE_DYNAMIC_ALLOCATION_FOR_CHANSPR size_t spr = biosig_channel_get_samples_per_record(hc); spr = SPR / spr; biosig_channel_set_samples_per_record(hc, spr); #else size_t spr = SPR/chanSPR[k]; chanSPR[k] = spr; #endif bpb += spr * 8; /* its always double */ } /*** build Event table for storing segment information pre-allocate memory for even table ***/ numberOfEvents *= 2; // about two events per segment biosig_set_number_of_events(hdr, numberOfEvents); /* check whether all segments have same size */ { char flag = (numberOfChannels > 0); size_t m, POS, pos; for (k=0; k < numberOfChannels; ++k) { pos = Data[k].size(); if (k==0) POS = pos; else flag &= (POS == pos); } for (m=0; flag && (m < Data[(size_t)0].size()); ++m) { for (k=0; k < biosig_get_number_of_channels(hdr); ++k) { pos = Data[k][m].size() * lround(Data[k][m].GetXScale()/Data.GetXScale()); if (k==0) POS = pos; else flag &= (POS == pos); } } if (!flag) { destructHDR(hdr); throw std::runtime_error( "File can't be exported:\n" "Traces have different sizes or no channels found" ); return false; } } size_t N=0; k=0; size_t pos = 0; for (m=0; m < (Data[k].size()); ++m) { if (pos > 0) { uint16_t typ=0x7ffe; uint32_t pos32=pos; uint16_t chn=0; uint32_t dur=0; // set break marker biosig_set_nth_event(hdr, N++, &typ, &pos32, &chn, &dur, NULL, NULL); /* // set annotation const char *Desc = Data[k][m].GetSectionDescription().c_str(); if (Desc != NULL && strlen(Desc)>0) biosig_set_nth_event(hdr, N++, NULL, &pos32, &chn, &dur, NULL, Desc); // TODO */ } pos += Data[k][m].size() * lround(Data[k][m].GetXScale()/Data.GetXScale()); } biosig_set_number_of_events(hdr, N); biosig_set_eventtable_samplerate(hdr, fs); sort_eventtable(hdr); /* convert data into GDF rawdata from */ uint8_t *rawdata = (uint8_t*)malloc(bpb * NRec); size_t bi=0; for (k=0; k < numberOfChannels; ++k) { CHANNEL_TYPE *hc = biosig_get_channel(hdr, k); #ifdef DONOTUSE_DYNAMIC_ALLOCATION_FOR_CHANSPR size_t chSPR = biosig_channel_get_samples_per_record(hc); #else size_t chSPR = chanSPR[k]; #endif size_t m,n,len=0; for (m=0; m < Data[k].size(); ++m) { size_t div = lround(Data[k][m].GetXScale()/Data.GetXScale()); size_t div2 = SPR/div; // TODO: avoid using hdr->SPR // fprintf(stdout,"k,m,div,div2: %i,%i,%i,%i\n",(int)k,(int)m,(int)div,(int)div2); // for (n=0; n < Data[k][m].size(); ++n) { uint64_t val; double d = Data[k][m][n]; #if !defined(__MINGW32__) && !defined(_MSC_VER) && !defined(__APPLE__) val = htole64(*(uint64_t*)&d); #else val = *(uint64_t*)&d; #endif size_t p, spr = (len + n*div) / SPR; for (p=0; p < div2; p++) *(uint64_t*)(rawdata + bi + bpb * spr + p*8) = val; } len += div*Data[k][m].size(); } bi += chSPR*8; } #ifndef DONOTUSE_DYNAMIC_ALLOCATION_FOR_CHANSPR if (chanSPR) free(chanSPR); #endif /****************************** write to file *******************************/ std::string errorMsg("Exception while calling std::exportBiosigFile():\n"); hdr = sopen( fName.c_str(), "w", hdr ); if (serror2(hdr)) { errorMsg += biosig_get_errormsg(hdr); destructHDR(hdr); throw std::runtime_error(errorMsg.c_str()); return false; } ifwrite(rawdata, bpb, NRec, hdr); sclose(hdr); destructHDR(hdr); free(rawdata); #else // #ifndef __LIBBIOSIG2_H__ HDRTYPE* hdr = constructHDR(Data.size(), 0); assert(hdr->NS == Data.size()); /* Initialize all header parameters */ hdr->TYPE = GDF; #if (BIOSIG_VERSION >= 10508) /* transition in biosig to rename HDR->VERSION to HDR->Version to avoid name space conflict with macro VERSION */ hdr->Version = 3.0; // select latest supported version of GDF format #else hdr->VERSION = 3.0; // select latest supported version of GDF format #endif struct tm t = Data.GetDateTime(); hdr->T0 = tm_time2gdf_time(&t); const char *xunits = Data.GetXUnits().c_str(); #if (BIOSIG_VERSION_MAJOR > 0) uint16_t pdc = PhysDimCode(xunits); #else uint16_t pdc = PhysDimCode((char*)xunits); #endif if ((pdc & 0xffe0) == PhysDimCode("s")) { fprintf(stderr,"Stimfit exportBiosigFile: xunits [%s] has not proper units, assume [ms]\n",Data.GetXUnits().c_str()); pdc = PhysDimCode("ms"); } hdr->SampleRate = 1.0/(PhysDimScale(pdc) * Data.GetXScale()); hdr->SPR = 1; hdr->FLAG.UCAL = 0; hdr->FLAG.OVERFLOWDETECTION = 0; hdr->FILE.COMPRESSION = 0; /* Initialize all channel parameters */ size_t k, m; for (k = 0; k < hdr->NS; ++k) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->PhysMin = -1e9; hc->PhysMax = 1e9; hc->DigMin = -1e9; hc->DigMax = 1e9; hc->Cal = 1.0; hc->Off = 0.0; /* Channel descriptions. */ strncpy(hc->Label, Data[k].GetChannelName().c_str(), MAX_LENGTH_LABEL); #if (BIOSIG_VERSION_MAJOR > 0) hc->PhysDimCode = PhysDimCode(Data[k].GetYUnits().c_str()); #else hc->PhysDimCode = PhysDimCode((char*)Data[k].GetYUnits().c_str()); #endif hc->OnOff = 1; hc->LeadIdCode = 0; hc->TOffset = 0.0; hc->Notch = NAN; hc->LowPass = NAN; hc->HighPass = NAN; hc->Impedance= NAN; hc->SPR = hdr->SPR; hc->GDFTYP = 17; // double // each segment gets one marker, roughly hdr->EVENT.N += Data[k].size(); size_t m,len = 0; for (len=0, m = 0; m < Data[k].size(); ++m) { unsigned div = lround(Data[k][m].GetXScale()/Data.GetXScale()); hc->SPR = lcm(hc->SPR,div); // sampling interval of m-th segment in k-th channel len += div*Data[k][m].size(); } hdr->SPR = lcm(hdr->SPR, hc->SPR); if (k==0) { hdr->NRec = len; } else if ((size_t)hdr->NRec != len) { destructHDR(hdr); throw std::runtime_error("File can't be exported:\n" "No data or traces have different sizes" ); return false; } } hdr->AS.bpb = 0; for (k = 0; k < hdr->NS; ++k) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; hc->SPR = hdr->SPR / hc->SPR; hc->bi = hdr->AS.bpb; hdr->AS.bpb += hc->SPR * 8; /* its always double */ } /*** build Event table for storing segment information ***/ size_t N = hdr->EVENT.N * 2; // about two events per segment hdr->EVENT.POS = (uint32_t*)realloc(hdr->EVENT.POS, N * sizeof(*hdr->EVENT.POS)); hdr->EVENT.DUR = (uint32_t*)realloc(hdr->EVENT.DUR, N * sizeof(*hdr->EVENT.DUR)); hdr->EVENT.TYP = (uint16_t*)realloc(hdr->EVENT.TYP, N * sizeof(*hdr->EVENT.TYP)); hdr->EVENT.CHN = (uint16_t*)realloc(hdr->EVENT.CHN, N * sizeof(*hdr->EVENT.CHN)); #if (BIOSIG_VERSION >= 10500) hdr->EVENT.TimeStamp = (gdf_time*)realloc(hdr->EVENT.TimeStamp, N * sizeof(gdf_time)); #endif /* check whether all segments have same size */ { char flag = (hdr->NS>0); size_t m, POS, pos; for (k=0; k < hdr->NS; ++k) { pos = Data[k].size(); if (k==0) POS = pos; else flag &= (POS == pos); } for (m=0; flag && (m < Data[(size_t)0].size()); ++m) { for (k=0; k < hdr->NS; ++k) { pos = Data[k][m].size() * lround(Data[k][m].GetXScale()/Data.GetXScale()); if (k==0) POS = pos; else flag &= (POS == pos); } } if (!flag) { destructHDR(hdr); throw std::runtime_error( "File can't be exported:\n" "Traces have different sizes or no channels found" ); return false; } } N=0; k=0; size_t pos = 0; for (m=0; m < (Data[k].size()); ++m) { if (pos > 0) { // start of new segment after break hdr->EVENT.POS[N] = pos; hdr->EVENT.TYP[N] = 0x7ffe; hdr->EVENT.CHN[N] = 0; hdr->EVENT.DUR[N] = 0; N++; } #if 0 // event description hdr->EVENT.POS[N] = pos; FreeTextEvent(hdr, N, "myevent"); //FreeTextEvent(hdr, N, Data[k][m].GetSectionDescription().c_str()); // TODO hdr->EVENT.CHN[N] = k; hdr->EVENT.DUR[N] = 0; N++; #endif pos += Data[k][m].size() * lround(Data[k][m].GetXScale()/Data.GetXScale()); } hdr->EVENT.N = N; hdr->EVENT.SampleRate = hdr->SampleRate; sort_eventtable(hdr); /* convert data into GDF rawdata from */ hdr->AS.rawdata = (uint8_t*)realloc(hdr->AS.rawdata, hdr->AS.bpb*hdr->NRec); for (k=0; k < hdr->NS; ++k) { CHANNEL_TYPE *hc = hdr->CHANNEL+k; size_t m,n,len=0; for (m=0; m < Data[k].size(); ++m) { size_t div = lround(Data[k][m].GetXScale()/Data.GetXScale()); size_t div2 = hdr->SPR/div; // fprintf(stdout,"k,m,div,div2: %i,%i,%i,%i\n",(int)k,(int)m,(int)div,(int)div2); // for (n=0; n < Data[k][m].size(); ++n) { uint64_t val; double d = Data[k][m][n]; #if !defined(__MINGW32__) && !defined(_MSC_VER) && !defined(__APPLE__) val = htole64(*(uint64_t*)&d); #else val = *(uint64_t*)&d; #endif size_t p, spr = (len + n*div) / hdr->SPR; for (p=0; p < div2; p++) *(uint64_t*)(hdr->AS.rawdata + hc->bi + hdr->AS.bpb * spr + p*8) = val; } len += div*Data[k][m].size(); } } /****************************** write to file *******************************/ std::string errorMsg("Exception while calling std::exportBiosigFile():\n"); hdr = sopen( fName.c_str(), "w", hdr ); #if (BIOSIG_VERSION > 10400) if (serror2(hdr)) { errorMsg += hdr->AS.B4C_ERRMSG; #else if (serror()) { errorMsg += B4C_ERRMSG; #endif destructHDR(hdr); throw std::runtime_error(errorMsg.c_str()); return false; } ifwrite(hdr->AS.rawdata, hdr->AS.bpb, hdr->NRec, hdr); sclose(hdr); destructHDR(hdr); #endif return true; } stimfit-0.15.8/src/libstfio/igor/0000775000175000017500000000000013315356572013643 500000000000000stimfit-0.15.8/src/libstfio/igor/CrossPlatformFileIO.h0000775000175000017500000000222013062445067017556 00000000000000#define CP_FILE_OPEN_ERROR 10000 #define CP_FILE_CLOSE_ERROR 10001 #define CP_FILE_EOF_ERROR 10002 #define CP_FILE_READ_ERROR 10003 #define CP_FILE_WRITE_ERROR 10004 #define CP_FILE_POS_ERROR 10005 #define CP_FILE_REF FILE* #if ( __WORDSIZE == 64 ) || defined (__APPLE__) #define IGORLONG int #else #define IGORLONG long #endif int CPCreateFile(const char* fullFilePath, int overwrite); int CPDeleteFile(const char* fullFilePath); int CPOpenFile(const char* fullFilePath, int readOrWrite, CP_FILE_REF* fileRefPtr); int CPCloseFile(CP_FILE_REF fileRef); int CPReadFile(CP_FILE_REF fileRef, unsigned long count, void* buffer, unsigned long* numBytesReadPtr); int CPReadFile2(CP_FILE_REF fileRef, unsigned long count, void* buffer, unsigned long* numBytesReadPtr); int CPWriteFile(CP_FILE_REF fileRef, unsigned long count, const void* buffer, unsigned long* numBytesWrittenPtr); int CPGetFilePosition(CP_FILE_REF fileRef, unsigned long* filePosPtr); int CPSetFilePosition(CP_FILE_REF fileRef, long filePos, int mode); int CPAtEndOfFile(CP_FILE_REF fileRef); int CPNumberOfBytesInFile(CP_FILE_REF fileRef, unsigned long* numBytesPtr); stimfit-0.15.8/src/libstfio/igor/igorlib.cpp0000775000175000017500000001570013062445067015721 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Export Igor binary waves from stimfit // last revision: 2007-05-07 // CSH, University of Freiburg // Most of this was shamelessly copied from Wavemetrics' sample code. // Blame them for bugs. /* The code in this file writes a sample Igor Pro packed experiment file. See Igor Pro Tech Note PTN#003 for details. */ #include #include #include #include // For offsetof macro. #include #if !defined(_WINDOWS) || defined(__MINGW32__) #include "../abf/axon/Common/unix.h" #endif #include "./igorlib.h" #include "../recording.h" // Headers taken from Wavemetrics' demo files: #ifdef __cplusplus extern "C" { #endif #include "../igor/IgorBin.h" #include "../igor/CrossPlatformFileIO.h" int WriteVersion5NumericWave(CP_FILE_REF fr, WaveHeader5* whp, const void* data, const char* waveNote, long noteSize); #ifdef __cplusplus } #endif namespace stfio { std::string IGORError(const std::string& msg, int nError); // Check compatibility before exporting: bool CheckComp(const Recording& ReturnData); } std::string stfio::IGORError(const std::string& msg, int error) { std::ostringstream ret; ret << "Error # " << error << " while writing Igor packed experiment:\n" << msg; return ret.str(); } bool stfio::CheckComp(const Recording& Data) { std::size_t oldSize=0; if (!Data.get().empty() && !Data[0].get().empty()) { oldSize=Data[0][0].size(); } else { return false; } for (std::size_t n_c=0;n_c channel_name(Data.size()); bool ident=false; for (std::size_t n_c=0;n_c) Channel TempChannel(Data[n_c]); for (std::size_t n_s=0;n_s cpData.size() || Data[n_c][n_s].size() > TempChannel[n_s].size()) { throw std::out_of_range("Out of range exception in WriteVersion5NumericWave"); } std::copy( TempChannel[n_s].get_w().begin(), TempChannel[n_s].get_w().begin()+Data[n_c][n_s].size(), &cpData[n_s*wh.nDim[0]] ); } err=WriteVersion5NumericWave( fr, &wh, &cpData[0], waveNote.c_str(), (long)waveNote.length() ); if (err) { throw std::runtime_error( std::string(IGORError("Error in WriteVersion5NumericWave()\n", err).c_str()) ); } CPCloseFile(fr); } return true; } stimfit-0.15.8/src/libstfio/igor/IgorBin.h0000775000175000017500000002220713062445067015270 00000000000000// IgorBin.h -- structures and #defines for dealing with Igor binary data. #ifdef __cplusplus extern "C" { #endif // All structures written to disk are 2-byte-aligned. #if GENERATINGPOWERPC #pragma options align=mac68k #endif #define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1]) #if 1 // def WIN32 #pragma pack(2) #endif #if ( __WORDSIZE == 64 ) || defined (__APPLE__) #define IGORLONG int #else #define IGORLONG long #endif typedef void** Handle; // From IgorMath.h #define NT_CMPLX 1 // Complex numbers. #define NT_FP32 2 // 32 bit fp numbers. #define NT_FP64 4 // 64 bit fp numbers. #define NT_I8 8 // 8 bit signed integer. Requires Igor Pro 2.0 or later. #define NT_I16 0x10 // 16 bit integer numbers. Requires Igor Pro 2.0 or later. #define NT_I32 0x20 // 32 bit integer numbers. Requires Igor Pro 2.0 or later. #define NT_UNSIGNED 0x40 // Makes above signed integers unsigned. Requires Igor Pro 3.0 or later. // From wave.h #define MAXDIMS 4 // From binary.h typedef struct BinHeader1 { short version; // Version number for backwards compatibility. IGORLONG wfmSize; // The size of the WaveHeader2 data structure plus the wave data plus 16 bytes of padding. short checksum; // Checksum over this header and the wave header. } BinHeader1; typedef struct BinHeader2 { short version; // Version number for backwards compatibility. IGORLONG wfmSize; // The size of the WaveHeader2 data structure plus the wave data plus 16 bytes of padding. IGORLONG noteSize; // The size of the note text. IGORLONG pictSize; // Reserved. Write zero. Ignore on read. short checksum; // Checksum over this header and the wave header. } BinHeader2; typedef struct BinHeader3 { short version; // Version number for backwards compatibility. IGORLONG wfmSize; // The size of the WaveHeader2 data structure plus the wave data plus 16 bytes of padding. IGORLONG noteSize; // The size of the note text. IGORLONG formulaSize; // The size of the dependency formula, if any. IGORLONG pictSize; // Reserved. Write zero. Ignore on read. short checksum; // Checksum over this header and the wave header. } BinHeader3; typedef struct BinHeader5 { short version; // Version number for backwards compatibility. short checksum; // Checksum over this header and the wave header. IGORLONG wfmSize; // The size of the WaveHeader5 data structure plus the wave data. IGORLONG formulaSize; // The size of the dependency formula, if any. IGORLONG noteSize; // The size of the note text. IGORLONG dataEUnitsSize; // The size of optional extended data units. IGORLONG dimEUnitsSize[MAXDIMS]; // The size of optional extended dimension units. IGORLONG dimLabelsSize[MAXDIMS]; // The size of optional dimension labels. IGORLONG sIndicesSize; // The size of string indicies if this is a text wave. IGORLONG optionsSize1; // Reserved. Write zero. Ignore on read. IGORLONG optionsSize2; // Reserved. Write zero. Ignore on read. } BinHeader5; // From wave.h #define MAX_WAVE_NAME2 18 // Maximum length of wave name in version 1 and 2 files. Does not include the trailing null. #define MAX_WAVE_NAME5 31 // Maximum length of wave name in version 5 files. Does not include the trailing null. #define MAX_UNIT_CHARS 3 // Header to an array of waveform data. struct WaveHeader2 { short type; // See types (e.g. NT_FP64) above. Zero for text waves. struct WaveHeader2 **next; // Used in memory only. Write zero. Ignore on read. char bname[MAX_WAVE_NAME2+2]; // Name of wave plus trailing null. short whVersion; // Write 0. Ignore on read. short srcFldr; // Used in memory only. Write zero. Ignore on read. Handle fileName; // Used in memory only. Write zero. Ignore on read. char dataUnits[MAX_UNIT_CHARS+1]; // Natural data units go here - null if none. char xUnits[MAX_UNIT_CHARS+1]; // Natural x-axis units go here - null if none. IGORLONG npnts; // Number of data points in wave. short aModified; // Used in memory only. Write zero. Ignore on read. double hsA,hsB; // X value for point p = hsA*p + hsB short wModified; // Used in memory only. Write zero. Ignore on read. short swModified; // Used in memory only. Write zero. Ignore on read. short fsValid; // True if full scale values have meaning. double topFullScale,botFullScale; // The min full scale value for wave. char useBits; // Used in memory only. Write zero. Ignore on read. char kindBits; // Reserved. Write zero. Ignore on read. void **formula; // Used in memory only. Write zero. Ignore on read. IGORLONG depID; // Used in memory only. Write zero. Ignore on read. unsigned IGORLONG creationDate; // DateTime of creation. Not used in version 1 files. char wUnused[2]; // Reserved. Write zero. Ignore on read. unsigned IGORLONG modDate; // DateTime of last modification. Handle waveNoteH; // Used in memory only. Write zero. Ignore on read. float wData[4]; // The start of the array of waveform data. }; typedef struct WaveHeader2 WaveHeader2; typedef WaveHeader2 *WavePtr2; typedef WavePtr2 *waveHandle2; struct WaveHeader5 { #if defined(_WINDOWS) && !defined(__MINGW32__) struct WaveHeader5 **next; // link to next wave in linked list. #else int next; #endif unsigned IGORLONG creationDate; // DateTime of creation. unsigned IGORLONG modDate; // DateTime of last modification. IGORLONG npnts; // Total number of points (multiply dimensions up to first zero). short type; // See types (e.g. NT_FP64) above. Zero for text waves. short dLock; // Reserved. Write zero. Ignore on read. char whpad1[6]; // Reserved. Write zero. Ignore on read. short whVersion; // Write 1. Ignore on read. char bname[MAX_WAVE_NAME5+1]; // Name of wave plus trailing null. IGORLONG whpad2; // Reserved. Write zero. Ignore on read. #if defined(_WINDOWS) && !defined(__MINGW32__) struct DataFolder **dFolder; // Used in memory only. Write zero. Ignore on read. #else int dFolder; // Used in memory only. Write zero. Ignore on read. #endif // Dimensioning info. [0] == rows, [1] == cols etc IGORLONG nDim[MAXDIMS]; // Number of of items in a dimension -- 0 means no data. double sfA[MAXDIMS]; // Index value for element e of dimension d = sfA[d]*e + sfB[d]. double sfB[MAXDIMS]; // SI units char dataUnits[MAX_UNIT_CHARS+1]; // Natural data units go here - null if none. char dimUnits[MAXDIMS][MAX_UNIT_CHARS+1]; // Natural dimension units go here - null if none. short fsValid; // TRUE if full scale values have meaning. short whpad3; // Reserved. Write zero. Ignore on read. double topFullScale,botFullScale; // The max and max full scale value for wave. #if defined(_WINDOWS) && !defined(__MINGW32__) Handle dataEUnits; // Used in memory only. Write zero. Ignore on read. Handle dimEUnits[MAXDIMS]; // Used in memory only. Write zero. Ignore on read. Handle dimLabels[MAXDIMS]; // Used in memory only. Write zero. Ignore on read. Handle waveNoteH; // Used in memory only. Write zero. Ignore on read. #else int dataEUnits; // Used in memory only. Write zero. Ignore on read. int dimEUnits[MAXDIMS]; // Used in memory only. Write zero. Ignore on read. int dimLabels[MAXDIMS]; // Used in memory only. Write zero. Ignore on read. int waveNoteH; // Used in memory only. Write zero. Ignore on read. #endif IGORLONG whUnused[16]; // Reserved. Write zero. Ignore on read. // The following stuff is considered private to Igor. short aModified; // Used in memory only. Write zero. Ignore on read. short wModified; // Used in memory only. Write zero. Ignore on read. short swModified; // Used in memory only. Write zero. Ignore on read. char useBits; // Used in memory only. Write zero. Ignore on read. char kindBits; // Reserved. Write zero. Ignore on read. #if defined(_WINDOWS) && !defined(__MINGW32__) void **formula; // Used in memory only. Write zero. Ignore on read. #else int formula; #endif IGORLONG depID; // Used in memory only. Write zero. Ignore on read. short whpad4; // Reserved. Write zero. Ignore on read. short srcFldr; // Used in memory only. Write zero. Ignore on read. #if defined(_WINDOWS) && !defined(__MINGW32__) Handle fileName; // Used in memory only. Write zero. Ignore on read. IGORLONG **sIndices; // Used in memory only. Write zero. Ignore on read. #else int fileName; // Used in memory only. Write zero. Ignore on read. int sIndices; // Used in memory only. Write zero. Ignore on read. #endif float wData[1]; // The start of the array of data. Must be 64 bit aligned. }; typedef struct WaveHeader5 WaveHeader5; typedef WaveHeader5 *WavePtr5; typedef WavePtr5 *WaveHandle5; #if GENERATINGPOWERPC #pragma options align=reset #endif #if 1 //def WIN32 #pragma pack() #endif // All structures written to disk are 2-byte-aligned. #ifdef __cplusplus } #endif stimfit-0.15.8/src/libstfio/igor/CrossPlatformFileIO.c0000775000175000017500000002605613062445067017566 00000000000000// This file contains utilities for cross-platform file I/O. #include #include #include #include #include #if defined(WIN32) && !defined(__MINGW32__) #include #else #include "../abf/axon/Common/unix.h" #endif // The Windows headers create the WIN32 symbol if we are compiling for Windows. // Here, we create an analogous MACINTOSH symbol if we are compiling for Macintosh. #if (defined(GENERATINGPOWERPC) || defined(GENERATING68K)) #define MACINTOSH 1 #endif #include "CrossPlatformFileIO.h" /* CPCreateFile(fullFilePath, overwrite, macCreator, macFileType) Creates a file with the location and name specified by fullFilePath. fullFilePath must be a native path. If overwrite is true and a file by that name already exists, it first deletes the conflicting file. If overwrite is false and a file by that name exists, it returns an error. macFileType is ignored on Windows. On Macintosh, it is used to set the new file's type. For example, use 'TEXT' for a text file. macCreator is ignored on Windows. On Macintosh, it is used to set the new file's creator code. For example, use 'IGR0' (last character is zero) for an file. Returns 0 if OK or an error code. */ int CPCreateFile(const char* fullFilePath, int overwrite) { int err; err = 0; #if defined(_WINDOWS) && !defined(__MINGW32__) if (overwrite) // Delete file if it exists and if overwrite is specified. CPDeleteFile(fullFilePath); // Ignore error. #endif #ifdef MACINTOSH if (err = create(fullFilePath, 0, macCreator, macFileType)) return err; return 0; #endif { HANDLE fileH; long accessMode, shareMode; #if defined(_WINDOWS) && !defined(__MINGW32__) accessMode = GENERIC_READ | GENERIC_WRITE; shareMode = 0; fileH = CreateFileA(fullFilePath, accessMode, shareMode, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); #else fileH = fopen(fullFilePath, "w+b"); #endif if (fileH == INVALID_HANDLE_VALUE) #if defined(_WINDOWS) && !defined(__MINGW32__) err = GetLastError(); #else err = 1; #endif else #if defined(_WINDOWS) && !defined(__MINGW32__) CloseHandle(fileH); #else fclose(fileH); #endif return err; } } /* CPDeleteFile(fullFilePath) Deletes the file specified by fullFilePath. fullFilePath must be a native path. Returns 0 if OK or an error code. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ #if defined(_WINDOWS) && !defined(__MINGW32__) int CPDeleteFile(const char* fullFilePath) { #ifdef MACINTOSH int err; if (err = fsdelete(fullFilePath, 0)) return err; return 0; #endif { int err; err = 0; if (DeleteFileA(fullFilePath) == 0) err = GetLastError(); return err; } } #endif /* CPOpenFile(fullFilePath, readOrWrite, fileRefPtr) If readOrWrite is zero, opens an existing file for reading and returns a file reference via fileRefPtr. If readOrWrite is non-zero, opens an existing file for writing or creates a new file if none exists and returns a file reference via fileRefPtr. fullFilePath must be a native path. Returns 0 if OK or an error code. */ int CPOpenFile(const char* fullFilePath, int readOrWrite, CP_FILE_REF* fileRefPtr) { *fileRefPtr = fopen(fullFilePath, readOrWrite ? "wb" : "rb"); if (*fileRefPtr == NULL) return CP_FILE_OPEN_ERROR; return 0; } /* CPCloseFile(fileRef) Closes the referenced file. Returns 0 if OK or an error code. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ int CPCloseFile(CP_FILE_REF fileRef) { if (fclose(fileRef)) return CP_FILE_CLOSE_ERROR; return 0; } /* CPReadFile(fileRef, count, buffer, numBytesReadPtr) Reads count bytes from the referenced file into the buffer. If numBytesReadPtr is not NULL, stores the number of bytes read in *numBytesReadPtr. Returns 0 if OK or an error code. If bytes remain to be read in the file and you ask to read more bytes than remain, the remaining bytes are returned and the function result is zero. If no bytes remain to be read in the file and you ask to read bytes, no bytes are returned and the function result is CP_FILE_EOF_ERROR. CPReadFile is appropriate when you are reading data of variable size, in which case you do not want to consider it an error if the end of file is reached before reading all of the bytes that you requested. If you are reading a record of fixed size, use use CPReadFile2 instead of CPReadFile. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ int CPReadFile(CP_FILE_REF fileRef, unsigned long count, void* buffer, unsigned long* numBytesReadPtr) { unsigned long numBytesRead; if (count == 0) { if (numBytesReadPtr != NULL) *numBytesReadPtr = 0; return 0; } clearerr(fileRef); numBytesRead = (DWORD)fread(buffer, 1, count, fileRef); if (numBytesReadPtr != NULL) *numBytesReadPtr = numBytesRead; if (ferror(fileRef)) return CP_FILE_READ_ERROR; if (numBytesRead==0 && CPAtEndOfFile(fileRef)) return CP_FILE_EOF_ERROR; // We were at the end of file when asked to read some bytes. return 0; } /* CPReadFile2(fileRef, count, buffer, numBytesReadPtr) Reads count bytes from the referenced file into the buffer. If numBytesReadPtr is not NULL, stores the number of bytes read in *numBytesReadPtr. Returns 0 if OK or an error code. If bytes remain to be read in the file and you ask to read more bytes than remain, the remaining bytes are returned and the function result is CP_FILE_EOF_ERROR. CPReadFile2 is appropriate when you are reading a record of fixed size, in which case you want to consider it an error if the end of file is reached before reading all of the bytes in the record. If you are reading a record of variable size then you should use CPReadFile instead of CPReadFile2. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ int CPReadFile2(CP_FILE_REF fileRef, unsigned long count, void* buffer, unsigned long* numBytesReadPtr) { unsigned long numBytesRead; if (count == 0) { if (numBytesReadPtr != NULL) *numBytesReadPtr = 0; return 0; } clearerr(fileRef); numBytesRead = (DWORD)fread(buffer, 1, count, fileRef); if (numBytesReadPtr != NULL) *numBytesReadPtr = numBytesRead; if (ferror(fileRef)) return CP_FILE_READ_ERROR; if (numBytesRead < count) { // We did not read all of the bytes requested. if (CPAtEndOfFile(fileRef)) return CP_FILE_EOF_ERROR; // We hit the end of file. return CP_FILE_READ_ERROR; // Some other occurred but ferror did not reflect it. } return 0; } /* CPWriteFile(fileRef, count, buffer, numBytesWrittenPtr) Writes count bytes from the buffer to the referenced file. If numBytesWrittenPtr is not NULL, stores the number of bytes written in *numBytesWrittenPtr. Returns 0 if OK or an error code. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ int CPWriteFile(CP_FILE_REF fileRef, unsigned long count, const void* buffer, unsigned long* numBytesWrittenPtr) { unsigned long numBytesWritten; if (count == 0) { if (numBytesWrittenPtr != NULL) *numBytesWrittenPtr = 0; return 0; } numBytesWritten = (DWORD)fwrite(buffer, 1, count, fileRef); if (numBytesWrittenPtr != NULL) *numBytesWrittenPtr = numBytesWritten; if (numBytesWritten != count) return CP_FILE_WRITE_ERROR; return 0; } /* CPGetFilePosition(fileRef, filePosPtr) Returns via filePosPtr the current file position of the referenced file. Returns 0 if OK or an error code. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ int CPGetFilePosition(CP_FILE_REF fileRef, unsigned long* filePosPtr) { long pos; pos = ftell(fileRef); if (pos == -1L) return CP_FILE_POS_ERROR; *filePosPtr = pos; return 0; } /* CPSetFilePosition(fileRef, filePos, mode) Sets the current file position in the referenced file. If mode is -1, then filePos is relative to the start of the file. If mode is 0, then filePos is relative to the current file position. If mode is 1, then filePos is relative to the end of the file. Returns 0 if OK or an error code. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ int CPSetFilePosition(CP_FILE_REF fileRef, long filePos, int mode) { int seekMode; switch(mode) { case -1: seekMode = SEEK_SET; break; case 0: seekMode = SEEK_CUR; break; case 1: seekMode = SEEK_END; break; default: return CP_FILE_POS_ERROR; } if (fseek(fileRef, filePos, seekMode) != 0) return CP_FILE_POS_ERROR; return 0; } /* CPAtEndOfFile(fileRef) Returns 1 if the current file position is at the end of file, 0 if not. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ int CPAtEndOfFile(CP_FILE_REF fileRef) { if (feof(fileRef)) // Hit end of file? return 1; return 0; } /* CPNumberOfBytesInFile(fileRef, numBytesPtr) Returns via numBytesPtr the total number of bytes in the referenced file. Returns 0 if OK or an error code. Added for Igor Pro 3.13 but works with any version. However, some error codes returned require Igor Pro 3.13 or later, so you will get bogus error messages if you return these error codes to earlier versions of Igor. */ int CPNumberOfBytesInFile(CP_FILE_REF fileRef, unsigned long* numBytesPtr) { long originalPos; originalPos = ftell(fileRef); if (fseek(fileRef, 0, SEEK_END) != 0) return CP_FILE_POS_ERROR; *numBytesPtr = ftell(fileRef); if (*numBytesPtr == -1L) return CP_FILE_POS_ERROR; if (fseek(fileRef, originalPos, SEEK_SET) != 0) return CP_FILE_POS_ERROR; return 0; } stimfit-0.15.8/src/libstfio/igor/WriteWave.c0000775000175000017500000001552313062445067015652 00000000000000// This file contains an example of writing a wave file. #include #include #include #include #include #include "IgorBin.h" #include "CrossPlatformFileIO.h" /* Checksum(data,oldcksum,numbytes) Returns shortwise simpleminded checksum over the data. ASSUMES data starts on an even boundary. */ static int Checksum(short *data, int oldcksum, int numbytes) { numbytes >>= 1; // 2 bytes to a short -- ignore trailing odd byte. while(numbytes-- > 0) oldcksum += *data++; return oldcksum&0xffff; } /* NumBytesPerPoint(int type) Given a numeric wave type, returns the number of data bytes per point. */ static int NumBytesPerPoint(int type) { int numBytesPerPoint; // Consider the number type, not including the complex bit or the unsigned bit. switch(type & ~(NT_CMPLX | NT_UNSIGNED)) { case NT_I8: numBytesPerPoint = 1; // char break; case NT_I16: numBytesPerPoint = 2; // short break; case NT_I32: numBytesPerPoint = 4; // IGORLONG break; case NT_FP32: numBytesPerPoint = 4; // float break; case NT_FP64: numBytesPerPoint = 8; // double break; default: return 0; break; } if (type & NT_CMPLX) numBytesPerPoint *= 2; // Complex wave - twice as many points. return numBytesPerPoint; } /* WriteVersion2NumericWave(fr, whp, data, waveNote, noteSize) Writes an Igor version 2 binary wave with the properties specified in whp, the data specified by data, and the wave note specified by waveNote and noteSize. Returns 0 or an error code. */ static int WriteVersion2NumericWave(CP_FILE_REF fr, WaveHeader2* whp, const void* data, const char* waveNote, long noteSize) { unsigned long numBytesToWrite; unsigned long numBytesWritten; unsigned long waveDataSize; int numBytesPerPoint; short cksum; BinHeader2 bh; char padding[16]; int err; numBytesPerPoint = NumBytesPerPoint(whp->type); if (numBytesPerPoint <= 0) { printf("Invalid wave type (0x%x).\n", whp->type); return -1; } waveDataSize = whp->npnts * numBytesPerPoint; // Prepare the BinHeader structure. memset(&bh,0,sizeof(struct BinHeader2)); bh.version = 2; bh.wfmSize = offsetof(WaveHeader2, wData) + waveDataSize + 16; // Includes 16 bytes padding. bh.noteSize = noteSize; /* The checksum is over the BinHeader2 structure and the WaveHeader2 structure. The wData field of the WaveHeader2 structure is assumed to contain the same data as the first 16 bytes of the actual wave data. This is necessary to get the correct checksum. */ cksum = Checksum((short *)&bh, 0, sizeof(struct BinHeader2)); cksum = Checksum((short *)whp, cksum, sizeof(struct WaveHeader2)); bh.checksum = -cksum; do { // Write the BinHeader. numBytesToWrite = sizeof(struct BinHeader2); err = CPWriteFile(fr, numBytesToWrite, &bh, &numBytesWritten); if (err) break; // Write the WaveHeader, up to but not including the wData field. numBytesToWrite = offsetof(WaveHeader2, wData); err = CPWriteFile(fr, numBytesToWrite, whp, &numBytesWritten); if (err) break; // Write the wave data. numBytesToWrite = waveDataSize; err = CPWriteFile(fr, numBytesToWrite, data, &numBytesWritten); if (err) break; // Write the 16 byte padding. memset(padding, 0, 16); // Write padding at the end of the wave data. numBytesToWrite = 16; err = CPWriteFile(fr, numBytesToWrite, padding, &numBytesWritten); if (err) break; // Now write optional data, in the correct order. // Write the wave note. numBytesToWrite = noteSize; if (numBytesToWrite > 0) { err = CPWriteFile(fr, numBytesToWrite, waveNote, &numBytesWritten); if (err) break; } } while(0); return err; } /* WriteVersion5NumericWave(fr, whp, data, waveNote, noteSize) Writes an Igor version 5 binary wave with the properties specified in whp, the data specified by data, and the wave note specified by waveNote and noteSize. Returns 0 or an error code. */ int WriteVersion5NumericWave(CP_FILE_REF fr, WaveHeader5* whp, const void* data, const char* waveNote, long noteSize) { unsigned long numBytesToWrite; unsigned long numBytesWritten; unsigned IGORLONG waveDataSize; int numBytesPerPoint; short cksum; BinHeader5 bh; int err; #ifdef _STFDEBUG printf("sizeof(short): %lu\n", sizeof(short)); printf("sizeof(int): %lu\n", sizeof(int)); printf("sizeof(long): %lu\n", sizeof(long)); printf("sizeof(IGORLONG): %lu\n", sizeof(IGORLONG)); printf("sizeof(unsigned long): %lu\n", sizeof(unsigned long)); printf("sizeof(unsigned IGORLONG): %lu\n", sizeof(unsigned IGORLONG)); printf("sizeof(float): %lu\n", sizeof(float)); printf("sizeof(double): %lu\n", sizeof(double)); printf("sizeof(void): %lu\n", sizeof(void)); printf("sizeof(void*): %lu\n", sizeof(void*)); printf("sizeof(void**): %lu\n", sizeof(void**)); #endif numBytesPerPoint = NumBytesPerPoint(whp->type); if (numBytesPerPoint <= 0) { printf("Invalid wave type (0x%x).\n", whp->type); return -1; } waveDataSize = whp->npnts * numBytesPerPoint; // Prepare the BinHeader structure. memset(&bh,0,sizeof(struct BinHeader5)); bh.version = 5; bh.wfmSize = offsetof(WaveHeader5, wData) + waveDataSize; bh.noteSize = noteSize; #ifdef _STFDEBUG printf("waveDataSize: %d\n", waveDataSize); printf("wfmSize: %d\n", bh.wfmSize); printf("noteSize: %d\n", bh.noteSize); #endif /* The checksum is over the BinHeader5 structure and the WaveHeader5 structure, excluding the wData field. */ cksum = Checksum((short *)&bh, 0, sizeof(BinHeader5)); #ifdef _STFDEBUG printf("%d\n", cksum); #endif cksum = Checksum((short *)whp, cksum, offsetof(WaveHeader5, wData)); bh.checksum = -cksum; #ifdef _STFDEBUG printf("%d\n", cksum); printf("%d\n", bh.checksum); #endif do { // Write the BinHeader. numBytesToWrite = sizeof(struct BinHeader5); err = CPWriteFile(fr, numBytesToWrite, &bh, &numBytesWritten); if (err) break; // Write the WaveHeader, up to but not including the wData field. numBytesToWrite = offsetof(WaveHeader5, wData); err = CPWriteFile(fr, numBytesToWrite, whp, &numBytesWritten); if (err) break; // Write the wave data. numBytesToWrite = waveDataSize; err = CPWriteFile(fr, numBytesToWrite, data, &numBytesWritten); if (err) break; // Now write optional data, in the correct order. // Write the wave note. numBytesToWrite = noteSize; if (numBytesToWrite > 0) { err = CPWriteFile(fr, numBytesToWrite, waveNote, &numBytesWritten); if (err) break; } } while(0); return err; } stimfit-0.15.8/src/libstfio/igor/igorlib.h0000775000175000017500000000240613062445067015365 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file igorlib.h * \author Christoph Schmidt-Hieber * \date 2008-01-23 * \brief Export Igor binary waves. */ #ifndef _IGORLIB_H #define _IGORLIB_H #include "./../stfio.h" class Recording; namespace stfio { //! Export a Recording to an Igor binary wave. /*! \param fName Full path to the file to be written. * \param WData The data to be exported. * \return At present, always returns 0. */ StfioDll bool exportIGORFile(const std::string& fName, const Recording& WData, ProgressInfo& progDlg); } #endif stimfit-0.15.8/src/libstfio/recording.cpp0000775000175000017500000003030113152223421015264 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "./stfio.h" #include "./recording.h" #include #include #include Recording::Recording(void) : ChannelArray(0) { init(); } Recording::Recording(const Channel& c_Channel) : ChannelArray(1,c_Channel) { init(); } Recording::Recording(const std::deque& ChannelList) : ChannelArray(ChannelList) { init(); } Recording::Recording(std::size_t c_n_channels, std::size_t c_n_sections, std::size_t c_n_points) : ChannelArray(c_n_channels, Channel(c_n_sections, c_n_points)) { init(); } void Recording::init() { file_description = "\0"; global_section_description = "\0"; scaling = "\0"; comment = "\0"; xunits = "ms" ; dt = 1.0; // get current time time_t timer; timer = time(0); memcpy(&datetime, localtime(&timer), sizeof(datetime)); cc = 0; sc = 1; cs = 0; selectedSections = std::vector(0); selectBase = Vector_double(0); sectionMarker = std::vector(0); } Recording::~Recording() { } const Channel& Recording::at(std::size_t n_c) const { try { return ChannelArray.at(n_c); } catch (...) { throw; } } Channel& Recording::at(std::size_t n_c) { try { return ChannelArray.at(n_c); } catch (...) { throw; } } const std::string& Recording::GetDate() { // TODO: there should be a more elegant way than using variable 'date' date.resize(128); struct tm t = GetDateTime(); snprintf((char*)date.c_str(), 128, "%04i-%02i-%02i", t.tm_year+1900, t.tm_mon+1, t.tm_mday); return date; }; const std::string& Recording::GetTime() { // TODO: there should be a more elegant way than using variable 'time0' time0.resize(128); struct tm t = GetDateTime(); snprintf((char*)time0.c_str(), 128, "%02i:%02i:%02i", t.tm_hour,t.tm_min,t.tm_sec); return time0; }; int Recording::SetDate(const std::string& value) { struct tm t = GetDateTime(); #if HAVE_STRPTIME_H strptime(value.c_str(), "%F", &t); #else if ( sscanf(value.c_str(),"%i-%i-%i", &t.tm_year, &t.tm_mon, &t.tm_mday) || sscanf(value.c_str(),"%i.%i.%i", &t.tm_mday, &t.tm_mon, &t.tm_year) || sscanf(value.c_str(),"%i/%i/%i", &t.tm_mon, &t.tm_mday, &t.tm_year) ) { t.tm_mon--; if (t.tm_year < 50) t.tm_year += 100; else if (t.tm_year < 139); else if (t.tm_year > 1900) t.tm_year -= 1900; } else { // TODO: error handling fprintf(stderr,"SetDate(%s) failed\n",value.c_str()); return(-1); } #endif SetDateTime(t); return(0); } int Recording::SetTime(const std::string& value) { struct tm t = GetDateTime(); #if HAVE_STRPTIME_H strptime(value.c_str(), "%T", &t); #else if ( sscanf(value.c_str(),"%i-%i-%i", &t.tm_hour, &t.tm_min, &t.tm_sec) || sscanf(value.c_str(),"%i.%i.%i", &t.tm_hour, &t.tm_min, &t.tm_sec) || sscanf(value.c_str(),"%i:%i:%i", &t.tm_hour, &t.tm_min, &t.tm_sec) ) { ; // everthing is fine } else { // TODO: error handling fprintf(stderr,"SetTime(%s) failed\n",value.c_str()); return(-1); } #endif SetDateTime(t); return(0); } int Recording::SetTime(int hour, int minute, int sec) { datetime.tm_hour=hour; datetime.tm_min=minute; datetime.tm_sec=sec; return(0); } int Recording::SetDate(int year, int month, int mday) { datetime.tm_year=year; datetime.tm_mon=month; datetime.tm_mday=mday; return(0); } void Recording::SetDateTime(int year, int month, int mday,int hour, int minute, int sec) { datetime.tm_year=year; datetime.tm_mon=month; datetime.tm_mday=mday; datetime.tm_hour=hour; datetime.tm_min=minute; datetime.tm_sec=sec; } void Recording::InsertChannel(Channel& c_Channel, std::size_t pos) { try { if ( ChannelArray.at(pos).size() <= c_Channel.size() ) { ChannelArray.at(pos).resize( c_Channel.size() ); } // Resize sections if necessary: std::size_t n_sec = 0; for ( sec_it sit = c_Channel.get().begin(); sit != c_Channel.get().end(); ++sit ) { if ( ChannelArray.at(pos).at(n_sec).size() <= sit->size() ) { ChannelArray.at(pos).at(n_sec).get_w().resize( sit->size() ); } n_sec++; } } catch (...) { throw; } ChannelArray.at(pos) = c_Channel; } void Recording::CopyAttributes(const Recording& c_Recording) { file_description=c_Recording.file_description; global_section_description=c_Recording.global_section_description; scaling=c_Recording.scaling; datetime=c_Recording.datetime; comment=c_Recording.comment; for ( std::size_t n_ch = 0; n_ch < c_Recording.size(); ++n_ch ) { if ( size() > n_ch ) { ChannelArray[n_ch].SetYUnits( c_Recording[n_ch].GetYUnits() ); } } dt=c_Recording.dt; } void Recording::resize(std::size_t c_n_channels) { ChannelArray.resize(c_n_channels); } size_t Recording::GetChannelSize(std::size_t n_channel) const { try { return ChannelArray.at(n_channel).size(); } catch (...) { throw; } } void Recording::SetCurChIndex(size_t value) { if (value>=get().size()) { throw std::out_of_range("channel out of range in Recording::SetCurChIndex()"); } cc=value; } void Recording::SetSecChIndex(size_t value) { if (value>=get().size() || value==cc) { throw std::out_of_range("channel out of range in Recording::SetSecChIndex()"); } sc=value; } void Recording::SetCurSecIndex( size_t value ) { if (value >= get()[cc].size()) { throw std::out_of_range("channel out of range in Recording::SetCurSecIndex()"); } cs=value; } void Recording::SelectTrace(std::size_t sectionToSelect, std::size_t base_start, std::size_t base_end) { // Check range so that sectionToSelect can be used // without checking again: if (sectionToSelect>=curch().size()) { std::out_of_range e("subscript out of range in Recording::SelectTrace\n"); throw e; } selectedSections.push_back(sectionToSelect); double sumY=0; if (curch()[sectionToSelect].size()==0) { selectBase.push_back(0); } else { int start = base_start; int end = base_end; if (start > (int)curch()[sectionToSelect].size()-1) start = curch()[sectionToSelect].size()-1; if (start < 0) start = 0; if (end > (int)curch()[sectionToSelect].size()-1) end = curch()[sectionToSelect].size()-1; if (end < 0) end = 0; #ifdef _OPENMP #pragma omp parallel for reduction(+:sumY) #endif for (int i=start; i<=end; i++) { sumY += curch()[sectionToSelect][i]; } int n=(int)(end-start+1); selectBase.push_back(sumY/n); } } bool Recording::UnselectTrace(std::size_t sectionToUnselect) { //verify whether the trace has really been selected and find the //number of the trace within the selectedTraces array: bool traceSelected=false; std::size_t traceToRemove=0; for (std::size_t n=0; n < selectedSections.size() && !traceSelected; ++n) { if (selectedSections[n] == sectionToUnselect) traceSelected=true; if (traceSelected) traceToRemove=n; } //Shift the selectedTraces array by one position, beginning //with the trace to remove: if (traceSelected) { //shift traces by one position: for (std::size_t k=traceToRemove; k < GetSelectedSections().size()-1; ++k) { selectedSections[k]=selectedSections[k+1]; selectBase[k]=selectBase[k+1]; } // resize vectors: selectedSections.resize(selectedSections.size()-1); selectBase.resize(selectBase.size()-1); return true; } else { //msgbox return false; } } void Recording::SetXScale(double value) { dt=value; for (ch_it it1 = ChannelArray.begin(); it1 != ChannelArray.end(); it1++) { for (sec_it it2 = it1->get().begin(); it2 != it1->get().end(); it2++) { it2->SetXScale(value); } } } void Recording::MakeAverage(Section& AverageReturn, Section& SigReturn, std::size_t channel, const std::vector& section_index, bool isSig, const std::vector& shift) const { if (channel >= ChannelArray.size()) { throw std::out_of_range("Channel number out of range in Recording::MakeAverage"); } unsigned int n_sections = section_index.size(); if (shift.size() != n_sections) { throw std::out_of_range("Shift out of range in Recording::MakeAverage"); } for (unsigned int l = 0; l < n_sections; ++l) { if (section_index[l] >= ChannelArray[channel].size()) { throw std::out_of_range("Section number out of range in Recording::MakeAverage"); } if (AverageReturn.size() + shift[l] > ChannelArray[channel][section_index[l]].size()) { throw std::out_of_range("Sampling point out of range in Recording::MakeAverage"); } } for (unsigned int k=0; k < AverageReturn.size(); ++k) { AverageReturn[k]=0.0; //Calculate average for (unsigned int l = 0; l < n_sections; ++l) { AverageReturn[k] += ChannelArray[channel][section_index[l]][k+shift[l]]; } AverageReturn[k] /= n_sections; // set sample interval of averaged traces AverageReturn.SetXScale(ChannelArray[channel][section_index[0]].GetXScale()); if (isSig) { SigReturn[k]=0.0; //Calculate variance for (unsigned int l=0; l < n_sections; ++l) { SigReturn[k] += pow(ChannelArray[channel][section_index[l]][k+shift[l]] - AverageReturn[k], 2); } SigReturn[k] /= (n_sections - 1); SigReturn[k]=sqrt(SigReturn[k]); } } } void Recording::AddRec(const Recording &toAdd) { // check number of channels: if (toAdd.size()!=size()) { throw std::runtime_error("Number of channels doesn't match"); } // check dt: if (toAdd.GetXScale()!=dt) { throw std::runtime_error("Sampling interval doesn't match"); } // add sections: std::deque< Channel >::iterator it; std::size_t n_c = 0; for (it = ChannelArray.begin();it != ChannelArray.end(); it++) { std::size_t old_size = it->size(); it->resize(toAdd[n_c].size()+old_size); for (std::size_t n_s=old_size;n_sInsertSection(toAdd[n_c].at(n_s-old_size),n_s); } catch (...) { throw; } } n_c++; } } std::string Recording::GetEventDescription(int type) { return listOfMarkers[type]; } void Recording::SetEventDescription(int type, const char* Description) { listOfMarkers[type] = Description; } void Recording::InitSectionMarkerList(size_t n) { sectionMarker.resize(n); return; } int Recording::GetSectionType(size_t section_number) { return sectionMarker[section_number]; } void Recording::SetSectionType(size_t section_number, int type) { sectionMarker[section_number]=type; return; } stimfit-0.15.8/src/libstfio/Makefile.am0000664000175000017500000000350413062445067014656 00000000000000if BUILD_MODULE if ISDARWIN PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} else PYTHON_TARGET_DIR=${PYTHON_PRE_DIST_PKG} # PYTHON_TARGET_DIR=${PYTHON_DIST_PKG} endif PYTHON_DEST_DIR=${DESTDIR}${PYTHON_TARGET_DIR} pkglibdir = ${PYTHON_TARGET_DIR}/stfio endif pkglib_LTLIBRARIES = libstfio.la libstfio_la_SOURCES = ./channel.cpp ./section.cpp ./recording.cpp ./stfio.cpp \ ./cfs/cfslib.cpp ./cfs/cfs.c \ ./hdf5/hdf5lib.cpp \ ./abf/abflib.cpp \ ./abf/axon/AxAbfFio32/abffiles.cpp \ ./abf/axon/AxAbfFio32/csynch.cpp \ ./abf/axon/AxAbfFio32/filedesc.cpp \ ./abf/axon/Common/FileReadCache.cpp \ ./abf/axon/Common/FileIO.cpp \ ./abf/axon/AxAbfFio32/abfheadr.cpp \ ./abf/axon/AxAbfFio32/abfhwave.cpp \ ./abf/axon/AxAbfFio32/Oldheadr.cpp \ ./abf/axon/AxAbfFio32/abfutil.cpp \ ./abf/axon/AxAbfFio32/msbincvt.cpp \ ./abf/axon/Common/unix.cpp \ ./abf/axon/AxAbfFio32/abferror.cpp \ ./abf/axon/AxAtfFio32/axatffio32.cpp \ ./abf/axon/AxAtfFio32/fileio2.cpp \ ./abf/axon2/ProtocolReaderABF2.cpp \ ./abf/axon2/SimpleStringCache.cpp \ ./abf/axon2/abf2headr.cpp \ ./atf/atflib.cpp \ ./axg/axglib.cpp \ ./axg/AxoGraph_ReadWrite.cpp \ ./axg/fileUtils.cpp \ ./axg/stringUtils.cpp \ ./axg/byteswap.cpp \ ./heka/hekalib.cpp \ ./igor/igorlib.cpp \ ./igor/CrossPlatformFileIO.c \ ./igor/WriteWave.c \ ./intan/common.cpp \ ./intan/intanlib.cpp \ ./intan/streams.cpp if WITH_BIOSIG2 libstfio_la_SOURCES += ./biosig/biosiglib.cpp else if WITH_BIOSIG libstfio_la_SOURCES += ./biosig/biosiglib.cpp else if WITH_BIOSIGLITE libstfio_la_SOURCES += ./biosig/biosiglib.cpp endif endif endif libstfio_la_LDFLAGS = libstfio_la_LIBADD = $(LIBSTF_LDFLAGS) $(LIBHDF5_LDFLAGS) $(LIBBIOSIG_LDFLAGS) if ISDARWIN # don't install anything because it has to go into the app bundle if !BUILD_MODULE install: endif endif #. /ascii/asciilib.cpp stimfit-0.15.8/src/libstfio/intan/0000775000175000017500000000000013315356572014014 500000000000000stimfit-0.15.8/src/libstfio/intan/common.cpp0000664000175000017500000000445513062462144015730 00000000000000//---------------------------------------------------------------------------------- // common.h // Downloaded from http://www.intantech.com/files/CLAMP_source_code_v1_0.zip // as of 2017-03-13 // // Original comment and license information for the header file common.h: // Intan Technologies // Common Source File // Version 2.0 (25 August 2015) // // Provides common functionality for RHD and CLAMP source code. // // Copyright (c) 2014-2015 Intan Technologies LLC // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the // use of this software. // // Permission is granted to anyone to use this software for any applications that // use Intan Technologies integrated circuits, and to alter it and redistribute it // freely. // // See http://www.intantech.com for documentation and product information. //---------------------------------------------------------------------------------- #include "common.h" #include using std::ostream; using std::string; using std::wstring; #if __cplusplus <= 199711L #define nullptr NULL #endif class nullbuf : public std::streambuf { protected: virtual int overflow(int c) { return c; } }; class nullstream : public std::ostream { nullbuf _streambuf; public: nullstream() : std::ostream(&_streambuf) { clear(); } }; // A stream that ouputs nowhere nullstream dev_null; ostream* logger = &dev_null; ostream* nulllogger = &dev_null; ostream* SetLogger(std::ostream* logger_) { ostream* prev = logger; if (logger_ == nullptr) { logger = &dev_null; } else { logger = logger_; } return prev; } wstring toWString(const string& s) { wstring ws; ws.insert(ws.begin(), s.begin(), s.end()); return ws; } string toString(const wstring& ws) { string s; s.insert(s.begin(), ws.begin(), ws.end()); return s; } #if defined WIN32 && defined _DEBUG bool _trace(TCHAR *format, ...) { TCHAR buffer[1000]; va_list argptr; va_start(argptr, format); vswprintf_s(buffer, sizeof(buffer)/sizeof(buffer[0]), format, argptr); va_end(argptr); OutputDebugString(buffer); return true; } #endif stimfit-0.15.8/src/libstfio/intan/common.h0000664000175000017500000000530313062445067015373 00000000000000//---------------------------------------------------------------------------------- // common.h // Downloaded from http://www.intantech.com/files/CLAMP_source_code_v1_0.zip // as of 2017-03-13 // // Original comment and license information: // Intan Technologies // Common Header File // Version 2.0 (25 August 2015) // // Provides common functionality for RHD and CLAMP source code. // // Copyright (c) 2014-2015 Intan Technologies LLC // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the // use of this software. // // Permission is granted to anyone to use this software for any applications that // use Intan Technologies integrated circuits, and to alter it and redistribute it // freely. // // See http://www.intantech.com for documentation and product information. //---------------------------------------------------------------------------------- #pragma once #include #include #include #include using std::endl; // Debug output window printing macro #define DEBUGOUT( s ) \ { \ std::ostringstream os_; \ os_ << " DEBUG: " << s; \ OutputDebugStringA( os_.str().c_str() ); \ } // Logging ----------------------------------------------------------------- // Logging goes to this, which may point to dev_null extern std::ostream* logger; extern std::ostream* nulllogger; // Always points to dev_null // To #define LOG(x) ((x) ? (*logger) : (*nulllogger)) // Use SetLogger(&std::cerr), for example, or SetLogger(nullptr). std::ostream* SetLogger(std::ostream* logger_); // _T macro for unicode support --------------------------------------------- #ifndef _T #if defined(_WIN32) && defined(_UNICODE) #define _T(x) L ##x #else #define _T(x) x #endif #endif std::wstring toWString(const std::string& s); std::string toString(const std::wstring& ws); // Throws an exception if value has more than numBits set. For example, if you're trying to put something into 3 bits, and you specify 15. template T CheckBits(T value, unsigned int numBits) { T mask = (-1 << numBits); if ((value & mask) != 0) { throw std::invalid_argument("Invalid value with too many bits set."); } return value; } #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) #if defined WIN32 #define NOMINMAX #include bool _trace(TCHAR *format, ...); #ifdef _DEBUG #define TRACE _trace #else #define TRACE false && _trace #endif #endif stimfit-0.15.8/src/libstfio/intan/streams.h0000664000175000017500000000727213152223421015554 00000000000000//---------------------------------------------------------------------------------- // streams.h // Downloaded from http://www.intantech.com/files/CLAMP_source_code_v1_0.zip // as of 2017-03-13 // // Copyright information added according to license directory in the original // source code package: // // Intan Technologies // // Copyright (c) 2016 Intan Technologies LLC // // This is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This file is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this file. If not, see . //---------------------------------------------------------------------------------- #ifndef STREAMS_H #define STREAMS_H #include #include #if __cplusplus > 199711L #include using std::unique_ptr; using std::move; #else #include #include using boost::movelib::unique_ptr; using boost::move; #define nullptr NULL #endif #include #include #include "./intanlib.h" #if defined(_WIN32) && defined(_UNICODE) typedef std::wstring FILENAME; #else typedef std::string FILENAME; #endif // ------------------------------------------------------------------------ class InStream { public: virtual ~InStream() {} virtual int read(char* data, int len) = 0; virtual uint64_t bytesRemaining() = 0; virtual std::istream::pos_type currentPos() = 0; }; // ------------------------------------------------------------------------ class FileInStream : public InStream { public: FileInStream(); ~FileInStream(); virtual bool open(const FILENAME& filename); // Opens with new name virtual int read(char* data, int len) override; uint64_t bytesRemaining() override; std::istream::pos_type currentPos() override; private: unique_ptr filestream; std::istream::pos_type filesize; virtual void close(); }; // ------------------------------------------------------------------------ class BinaryReader { public: #if __cplusplus > 199711L BinaryReader(unique_ptr&& other_); #else BinaryReader(BOOST_RV_REF(unique_ptr) other_); #endif virtual ~BinaryReader(); uint64_t bytesRemaining() { return other->bytesRemaining(); } std::istream::pos_type currentPos() { return other->currentPos(); } protected: friend BinaryReader& operator>>(BinaryReader& istream, int32_t& value); friend BinaryReader& operator>>(BinaryReader& istream, uint32_t& value); friend BinaryReader& operator>>(BinaryReader& istream, int16_t& value); friend BinaryReader& operator>>(BinaryReader& istream, uint16_t& value); friend BinaryReader& operator>>(BinaryReader& istream, int8_t& value); friend BinaryReader& operator>>(BinaryReader& istream, uint8_t& value); friend BinaryReader& operator>>(BinaryReader& istream, float& value); friend BinaryReader& operator>>(BinaryReader& istream, double& value); friend BinaryReader& operator>>(BinaryReader& istream, std::wstring& value); private: unique_ptr other; }; FILENAME toFileName(const std::string& s); FILENAME toFileName(const std::wstring& ws); #endif // STREAMS_H stimfit-0.15.8/src/libstfio/intan/intanlib.h0000664000175000017500000000735213152223421015675 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file intanlib.h * \author Christoph Schmidt-Hieber * \date 2017-03-11 * \brief Reads Intan Technologies CLAMP data file generated by controller GUI. */ /* Mostly a Python version of read_Intan_CLP_file.m from http://www.intantech.com/files/Intan_CLAMP_software_compiled_v1_0.zip as of 2016-11-05 Example: >>> import matplotlib.pyplot as plt >>> import intan >>> intan_file = intan.IntanFile('myexperiment_A_160916_142731.clp') >>> plt.plot(intan_file.data["Time"], intan_file.data["Measured"]) >>> intan_file = intan.IntanFile('myexperiment_AUX_160916_142731.clp') >>> plt.plot(intan_file.data["Time"], intan_file.data["ADC"][1]) */ #ifndef INTANLIB_H #define INTANLIB_H #if __cplusplus > 199711L #include #else #include #endif #include "./../stfio.h" #ifdef _MSC_VER typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #endif class Recording; static const int MAX_REGISTERS = 14; static const uint32_t MAGIC_NUMBER = 0xf3b1a481; struct Segment { uint8_t waveformNumber; uint32_t tOffset; uint32_t startIndex; uint32_t endIndex; float appliedValue; }; struct VoltageClampSettings { float holdingVoltage; float nominalResistance; float resistance; float desiredBandwidth; float actualBandwidth; }; struct CurrentClampSettings { float holdingCurrent; float currentStepSize; }; struct HeaderSettings { uint8_t enableCapacitiveCompensation; float capCompensationMagnitude; float filterCutoff; float pipetteOffset; float samplingRate; float cellRs; float cellRm; float cellCm; uint8_t isVoltageClamp; uint8_t vClampX2Mode; VoltageClampSettings vcSettings; CurrentClampSettings ccSettings; std::vector waveform; }; struct Calibration { uint8_t coarse; uint8_t fine; }; struct ChannelHeader { uint16_t registers[MAX_REGISTERS]; uint32_t differenceAmpResidual; uint32_t voltageAmpResidual; Calibration bestCalibration[2][4]; float rFeedback[5]; float desiredBandwidth; }; struct ChipHeader { std::vector channels; uint16_t chipRegisters[4]; }; struct IntanHeader { int16_t version_major; int16_t version_minor; int16_t datatype; int16_t date_Year; int16_t date_Month; int16_t date_Day; int16_t date_Hour; int16_t date_Minute; int16_t date_Second; std::vector Chips; HeaderSettings Settings; uint16_t numADCs; }; namespace stfio { //! Open an Intan file and store its contents to a Recording object. /*! \param fName The full path to the file to be opened. * \param ReturnData On entry, an empty Recording object. On exit, * the data stored in \e fName. * \param progress True if the progress dialog should be updated. */ void importIntanFile(const std::string &fName, Recording &ReturnData, ProgressInfo& progDlg); } #endifstimfit-0.15.8/src/libstfio/intan/streams.cpp0000664000175000017500000001406113152223421016101 00000000000000//---------------------------------------------------------------------------------- // streams.cpp // Downloaded from http://www.intantech.com/files/CLAMP_source_code_v1_0.zip // as of 2017-03-13 // // Copyright information added according to license directory in the original // source code package: // // Intan Technologies // // Copyright (c) 2016 Intan Technologies LLC // // This is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This file is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this file. If not, see . //---------------------------------------------------------------------------------- #include "streams.h" #include #include #include #include #include "common.h" #include using std::cerr; using std::endl; using std::ofstream; using std::ifstream; using std::ios; using std::wstring; using std::vector; using std::exception; using std::runtime_error; #define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100) // ------------------------------------------------------------------------ FileInStream::FileInStream() : filestream(nullptr) { } FileInStream::~FileInStream() { close(); } bool FileInStream::open(const FILENAME& filename) { unique_ptr tmp(new ifstream(filename.c_str(), ios::binary | ios::in)); if (tmp->is_open()) { filestream.reset(tmp.release()); filestream->seekg(0, filestream->end); filesize = filestream->tellg(); filestream->seekg(0, filestream->beg); return true; } else { char buffer[100]; #ifdef _WIN32 if (strerror_s(buffer, sizeof(buffer), errno) == 0) { #else if (strerror_r(errno, buffer, sizeof(buffer)) == 0) { #endif cerr << "Cannot open file for reading: " << buffer << endl; } else { cerr << "Cannot open file for reading: reason unknown" << endl; } return false; } } uint64_t FileInStream::bytesRemaining() { std::istream::pos_type pos = filestream->tellg(); return filesize - pos; } std::istream::pos_type FileInStream::currentPos() { return filestream->tellg(); } void FileInStream::close() { filestream.reset(); } int FileInStream::read(char* data, int len) { filestream->read(data, len); if (filestream->fail()) { throw runtime_error("No more data"); } return static_cast(filestream->gcount()); } // ------------------------------------------------------------------------ #if __cplusplus > 199711L BinaryReader::BinaryReader(unique_ptr&& other_) : #else BinaryReader::BinaryReader(BOOST_RV_REF(unique_ptr) other_) : #endif other(move(other_)) { } BinaryReader::~BinaryReader() { } BinaryReader& operator>>(BinaryReader& istream, int32_t& value) { unsigned char data[4]; istream.other->read(reinterpret_cast(data), 4); value = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); return istream; } BinaryReader& operator>>(BinaryReader& istream, uint32_t& value) { unsigned char data[4]; istream.other->read(reinterpret_cast(data), 4); value = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); return istream; } BinaryReader& operator>>(BinaryReader& istream, uint16_t& value) { unsigned char data[2]; istream.other->read(reinterpret_cast(data), 2); value = data[0] | (data[1] << 8); return istream; } BinaryReader& operator>>(BinaryReader& istream, int16_t& value) { unsigned char data[2]; istream.other->read(reinterpret_cast(data), 2); value = data[0] | (data[1] << 8); return istream; } BinaryReader& operator>>(BinaryReader& istream, uint8_t& value) { unsigned char data[1]; istream.other->read(reinterpret_cast(data), 1); value = data[0]; return istream; } BinaryReader& operator>>(BinaryReader& istream, int8_t& value) { unsigned char data[1]; istream.other->read(reinterpret_cast(data), 1); value = data[0]; return istream; } BinaryReader& operator>>(BinaryReader& istream, float& value) { char* tmp = reinterpret_cast(&value); if (IS_BIG_ENDIAN) { char data[4]; istream.other->read(data, sizeof(value)); tmp[0] = data[3]; tmp[1] = data[2]; tmp[2] = data[1]; tmp[3] = data[0]; } else { istream.other->read(tmp, sizeof(value)); } return istream; } BinaryReader& operator>>(BinaryReader& istream, double& value) { float f; istream >> f; value = f; return istream; } BinaryReader& operator>>(BinaryReader& istream, wstring& value) { uint32_t size; istream >> size; value.clear(); if (size > 0) { vector tmp(size + 2); #ifndef _WINDOWS istream.other->read(tmp.data(), size); tmp[size] = 0; tmp[size + 1] = 0; value = reinterpret_cast(tmp.data()); #else istream.other->read(&tmp[0], size); tmp[size] = 0; tmp[size + 1] = 0; value = reinterpret_cast(&tmp[0]); #endif } return istream; } // ------------------------------------------------------------------------ FILENAME toFileName(const std::string& s) { #if defined(_WIN32) && defined(_UNICODE) return toWString(s); #else return s; #endif } FILENAME toFileName(const std::wstring& ws) { #if defined(_WIN32) && defined(_UNICODE) return ws; #else return toString(ws); #endif } stimfit-0.15.8/src/libstfio/intan/intanlib.cpp0000664000175000017500000002470413152223421016230 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file hekalib.cpp * \author Christoph Schmidt-Hieber * \date 2017-03-11 * \brief Reads Intan Technologies CLAMP data file generated by controller GUI. */ /* Mostly a C++ version of read_Intan_CLP_file.m from http://www.intantech.com/files/Intan_CLAMP_software_compiled_v1_0.zip as of 2016-11-05 */ #include #include "intanlib.h" #include "streams.h" #include "../recording.h" Segment read_segment(BinaryReader& binreader) { Segment segment; binreader >> segment.waveformNumber; binreader >> segment.tOffset; binreader >> segment.startIndex; binreader >> segment.endIndex; binreader >> segment.appliedValue; return segment; } std::vector read_waveform(BinaryReader& binreader) { float interval; binreader >> interval; uint16_t numSegments; binreader >> numSegments; std::vector waveform(numSegments); for (std::vector::size_type nseg=0; nseg < waveform.size(); ++nseg) { waveform[nseg] = read_segment(binreader); } return waveform; } VoltageClampSettings read_header_voltage_clamp_settings(BinaryReader& binreader) { VoltageClampSettings vcSettings; binreader >> vcSettings.holdingVoltage; binreader >> vcSettings.nominalResistance; binreader >> vcSettings.resistance; binreader >> vcSettings.desiredBandwidth; binreader >> vcSettings.actualBandwidth; return vcSettings; } CurrentClampSettings read_header_current_clamp_settings(BinaryReader& binreader) { CurrentClampSettings ccSettings; binreader >> ccSettings.holdingCurrent; binreader >> ccSettings.currentStepSize; return ccSettings; } HeaderSettings read_header_settings(BinaryReader& binreader) { HeaderSettings hSettings; binreader >> hSettings.enableCapacitiveCompensation; binreader >> hSettings.capCompensationMagnitude; binreader >> hSettings.filterCutoff; binreader >> hSettings.pipetteOffset; binreader >> hSettings.samplingRate; binreader >> hSettings.cellRs; binreader >> hSettings.cellRm; binreader >> hSettings.cellCm; binreader >> hSettings.isVoltageClamp; binreader >> hSettings.vClampX2Mode; if (hSettings.isVoltageClamp > 0) { hSettings.vcSettings = read_header_voltage_clamp_settings(binreader); } else { hSettings.ccSettings = read_header_current_clamp_settings(binreader); } hSettings.waveform = read_waveform(binreader); return hSettings; } ChannelHeader read_one_header_channel(BinaryReader& binreader) { ChannelHeader hChannel; for (unsigned int registerIndex = 0; registerIndex < MAX_REGISTERS; ++registerIndex) { binreader >> hChannel.registers[registerIndex]; } binreader >> hChannel.differenceAmpResidual; binreader >> hChannel.voltageAmpResidual; for (unsigned int a = 0; a < 2; a++) { for (unsigned int b = 0; b < 4; b++) { binreader >> hChannel.bestCalibration[a][b].coarse; binreader >> hChannel.bestCalibration[a][b].fine; } } for (unsigned int rIndex = 0; rIndex < 5; ++rIndex) { binreader >> hChannel.rFeedback[rIndex]; } binreader >> hChannel.desiredBandwidth; return hChannel; } ChipHeader read_one_header_chip(BinaryReader& binreader, unsigned int numChannels) { ChipHeader hChip; hChip.channels.resize(numChannels); for (unsigned int nchan = 0; nchan < numChannels; ++nchan) { hChip.channels[nchan] = read_one_header_channel(binreader); } for (unsigned int nreg = 0; nreg < 4; ++nreg) { binreader >> hChip.chipRegisters[nreg]; } return hChip; } std::vector read_header_chips(BinaryReader& binreader) { uint16_t numChips, numChannels; binreader >> numChips; binreader >> numChannels; std::vector hChips(numChips); for (unsigned int nchip = 0; nchip < hChips.size(); ++nchip) { hChips[nchip] = read_one_header_chip(binreader, numChannels); } return hChips; } IntanHeader read_header(BinaryReader& binreader) { uint32_t magic_number; binreader >> magic_number; if (magic_number != MAGIC_NUMBER) { throw std::runtime_error("Unrecognized file type"); } IntanHeader hIntan; binreader >> hIntan.version_major; binreader >> hIntan.version_minor; binreader >> hIntan.datatype; uint16_t numBytes = 0; switch (hIntan.datatype) { case 0: binreader >> numBytes; binreader >> hIntan.date_Year; binreader >> hIntan.date_Month; binreader >> hIntan.date_Day; binreader >> hIntan.date_Hour; binreader >> hIntan.date_Minute; binreader >> hIntan.date_Second; hIntan.Chips = read_header_chips(binreader); hIntan.Settings = read_header_settings(binreader); break; case 1: binreader >> hIntan.numADCs; binreader >> numBytes; binreader >> hIntan.date_Year; binreader >> hIntan.date_Month; binreader >> hIntan.date_Day; binreader >> hIntan.date_Hour; binreader >> hIntan.date_Minute; binreader >> hIntan.date_Second; binreader >> hIntan.Settings.samplingRate; break; default: throw std::runtime_error("Unrecognized data type"); } uint64_t pos = binreader.currentPos(); if (pos != numBytes) { throw std::runtime_error("Header NumBytes doesn't match number of bytes"); } return hIntan; } std::vector > read_data(BinaryReader& binreader, const IntanHeader& hIntan) { uint64_t bytes_remaining = binreader.bytesRemaining(); uint64_t length = bytes_remaining / (4+4+4+4); std::vector timestamps(length); std::vector applied(length); std::vector totalClamp(length); std::vector > channels(2); channels[0].resize(length); channels[1].resize(length); for (unsigned int idata = 0; idata < length; ++idata) { binreader >> timestamps[idata]; binreader >> applied[idata]; binreader >> channels[1][idata]; binreader >> channels[0][idata]; float vfactor = 1e3; // V -> mV float ifactor = 1e12; // A -> pA if (hIntan.Settings.isVoltageClamp) { channels[0][idata] *= ifactor; channels[1][idata] *= vfactor; } else { channels[1][idata] *= ifactor; channels[0][idata] *= vfactor; } } return channels; } std::vector > read_aux_data(BinaryReader& binreader, uint16_t numADCs) { uint64_t bytes_remaining = binreader.bytesRemaining(); uint64_t length = bytes_remaining / (4+2+2+2*numADCs); std::vector timestamps(length); std::vector digitalIn(length); std::vector digitalOut(length); std::vector > adc(numADCs); for (unsigned int iadc = 0; iadc < numADCs; ++iadc) { adc[iadc].resize(length); } for (unsigned int idata = 0; idata < length; ++idata) { binreader >> timestamps[idata]; binreader >> digitalIn[idata]; binreader >> digitalOut[idata]; for (unsigned int iadc = 0; iadc < numADCs; ++iadc) { uint16_t tmpui; binreader >> tmpui; adc[iadc][idata] = tmpui*0.0003125 - (1<<15); } } return adc; } void stfio::importIntanFile(const std::string &fName, Recording &ReturnData, ProgressInfo& progDlg) { unique_ptr fs(new FileInStream()); #ifdef _WINDOWS std::wstring wfName(fName.begin(), fName.end()); #else std::string wfName(fName); #endif fs->open(wfName); unique_ptr binreader(new BinaryReader(move(fs))); IntanHeader hIntan = read_header(*binreader); if (hIntan.datatype == 0) { std::vector > channels = read_data(*binreader, hIntan); ReturnData.resize(channels.size()); ReturnData.SetXScale(1e3/hIntan.Settings.samplingRate); ReturnData.SetXUnits("ms"); int mon = hIntan.date_Month-1; int year = hIntan.date_Year - 1900; ReturnData.SetDateTime(year, mon, hIntan.date_Day, hIntan.date_Hour, hIntan.date_Minute, hIntan.date_Second); for (unsigned int nchan = 0; nchan < channels.size(); ++nchan) { // ReturnData[nchan].resize(hIntan.Settings.waveform.size()); ReturnData[nchan].resize(1); } if (hIntan.Settings.isVoltageClamp) { ReturnData[0].SetYUnits("pA"); ReturnData[1].SetYUnits("mV"); } else { ReturnData[1].SetYUnits("pA"); ReturnData[0].SetYUnits("mV"); } unsigned int nsec = 0; for (unsigned int nchan = 0; nchan < channels.size(); ++nchan) { ReturnData[nchan][nsec].resize(channels[nchan].size()); std::copy(channels[nchan].begin(), channels[nchan].end(), ReturnData[nchan][nsec].get_w().begin()); } // for (std::vector::const_iterator it = hIntan.Settings.waveform.begin(); // it != hIntan.Settings.waveform.end(); // ++it) // { // for (unsigned int nchan = 0; nchan < channels.size(); ++nchan) { // ReturnData[nchan][nsec].resize(it->endIndex - it->startIndex); // std::copy(&(channels[nchan][it->startIndex]), &(channels[nchan][it->endIndex]), // ReturnData[nchan][nsec].get_w().begin()); // } // nsec++; // } } else { std::vector > aux_data = read_aux_data(*binreader, hIntan.numADCs); ReturnData.resize(1); ReturnData[0].resize(1); ReturnData[0][0].resize(aux_data[0].size()); std::copy(aux_data[0].begin(), aux_data[0].end(), ReturnData[0][0].get_w().begin()); } } stimfit-0.15.8/src/libstfio/atf/0000775000175000017500000000000013315356572013455 500000000000000stimfit-0.15.8/src/libstfio/atf/atflib.cpp0000775000175000017500000002160013062445067015341 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include #include "./atflib.h" #include "../recording.h" namespace stfio { std::string ATFError(const std::string& fName, int nError); } std::string stfio::ATFError(const std::string& fName, int nError) { int nMaxLen=320; std::vector errorMsg(nMaxLen); ATF_BuildErrorText(nError, fName.c_str(),&errorMsg[0], nMaxLen ); return std::string( &errorMsg[0] ); } bool stfio::exportATFFile(const std::string& fName, const Recording& WData) { int nColumns=1+(int)WData[0].size() /*time + number of sections*/, nFileNum; int nError; if (!ATF_OpenFile(fName.c_str(),ATF_WRITEONLY,&nColumns,&nFileNum,&nError)) { std::string errorMsg("Exception while calling ATF_OpenFile():\n"); errorMsg += ATFError(fName,nError); throw std::runtime_error(errorMsg); } // Write sections to columns: // First column is time: for (int n_c=0;n_c max_size) { max_size=WData[0][n_s].size(); } } for (int n_l=0;n_l < (int)max_size; ++n_l) { for (int n_c=0;n_c titleVec(nMaxText); if (!ATF_GetColumnTitle(nFileNum,0,&titleVec[0],nMaxText,&nError)) { std::string errorMsg("Exception while calling ATF_GetColumnTitle():\n"); errorMsg+=ATFError(fName,nError); throw std::runtime_error(errorMsg); } std::string titleString(titleVec.begin(),titleVec.end()); int timeInFirstColumn=0; if (titleString.find("time")!=std::string::npos || titleString.find("Time")!=std::string::npos || titleString.find("TIME")!=std::string::npos) { // Read sampling information from first two time values: double time[2]; for (int n_l=0;n_l<2;++n_l) { if (!ATF_ReadDataColumn(nFileNum,0,&time[n_l],&nError)) { std::string errorMsg("Exception while calling ATF_ReadDataColumn():\n"); errorMsg+=ATFError(fName,nError); throw std::runtime_error(errorMsg); } } if (!ATF_RewindFile(nFileNum,&nError)) { std::string errorMsg("Exception while calling ATF_RewindFile():\n"); errorMsg+=ATFError(fName,nError); throw std::runtime_error(errorMsg); } ReturnData.SetXScale(time[1]-time[0]); timeInFirstColumn=1; } ReturnData.resize(1); Channel TempChannel(nColumns-timeInFirstColumn); for (int n_c=timeInFirstColumn;n_c unitsVec(nMaxText); if (!ATF_GetColumnUnits(nFileNum,n_c,&unitsVec[0],nMaxText,&nError)) { std::string errorMsg("Exception while calling ATF_GetColumnUnits():\n"); errorMsg+=ATFError(fName,nError); ReturnData.resize(0); throw std::runtime_error(errorMsg); } ReturnData[0].SetYUnits(std::string(&unitsVec[0])); } try { TempChannel.InsertSection(TempSection,n_c-timeInFirstColumn); } catch (...) { throw; } // Rewind file before reading next column: if (!ATF_RewindFile(nFileNum,&nError)) { std::string errorMsg("Exception while calling ATF_RewindFile():\n"); errorMsg+=ATFError(fName,nError); ReturnData.resize(0); throw std::runtime_error(errorMsg); } } try { ReturnData.InsertChannel(TempChannel,0); } catch (...) { ReturnData.resize(0); throw; } if (!ATF_CloseFile(nFileNum)) { std::string errorMsg("Exception while calling ATF_CloseFile():\n"); errorMsg += "Error while closing ATF file"; throw std::runtime_error(errorMsg); } } stimfit-0.15.8/src/libstfio/atf/atflib.h0000775000175000017500000000317213062445067015012 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file atflib.h * \author Christoph Schmidt-Hieber * \date 2008-01-23 * \brief Import and export Axon text files. */ #ifndef _ATFLIB_H #define _ATFLIB_H #include "./../stfio.h" #include "./../abf/axon/AxAtfFio32/axatffio32.h" class Recording; namespace stfio { //! Open an ATF file and store its contents to a Recording object. /*! \param fName Full path to the file to be read. * \param ReturnData On entry, an empty Recording object. On exit, * the data stored in \e fName. * \param progress True if the progress dialog should be updated. */ void importATFFile(const std::string& fName, Recording& ReturnData, ProgressInfo& progDlg); //! Export a Recording to an ATF file. /*! \param fName Full path to the file to be written. * \param WData The data to be exported. */ StfioDll bool exportATFFile(const std::string& fName, const Recording& WData); } #endif stimfit-0.15.8/src/libstfio/stfio.h0000664000175000017500000002110313062445067014112 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /*! \file stfio.h * \author Christoph Schmidt-Hieber * \date 2011-09-25 * \brief header file for libstfio * * * Header file for libstfio */ #ifndef _STFIO_H_ #define _STFIO_H_ #include #include #include #include #include #include #include #ifdef _MSC_VER #pragma warning( disable : 4251 ) // Disable warning messages #pragma warning( disable : 4996 ) // Disable warning messages #endif //! Defines dll export or import functions for Windows #if defined(_WINDOWS) && !defined(__MINGW32__) #ifdef STFIODLL #define StfioDll __declspec( dllexport ) #else #define StfioDll __declspec( dllimport ) #endif #else #define StfioDll #endif typedef std::vector Vector_double; typedef std::vector Vector_float; #ifdef _MSC_VER #ifndef NAN static const unsigned long __nan[2] = {0xffffffff, 0x7fffffff}; #define NAN (*(const float *) __nan) #endif #ifndef INFINITY #define INFINITY (DBL_MAX+DBL_MAX) #endif StfioDll long int lround(double x); #define snprintf _snprintf #endif #include "./recording.h" #include "./channel.h" #include "./section.h" /* class Recording; */ /* class Channel; */ /* class Section; */ //! The stfio namespace. /*! All essential core functions and classes are in this namespace. * Its purpose is to reduce name mangling problems. */ namespace stfio { /*! \addtogroup stfio * @{ */ StfioDll Vector_double vec_scal_plus(const Vector_double& vec, double scalar); StfioDll Vector_double vec_scal_minus(const Vector_double& vec, double scalar); StfioDll Vector_double vec_scal_mul(const Vector_double& vec, double scalar); StfioDll Vector_double vec_scal_div(const Vector_double& vec, double scalar); StfioDll Vector_double vec_vec_plus(const Vector_double& vec1, const Vector_double& vec2); StfioDll Vector_double vec_vec_minus(const Vector_double& vec1, const Vector_double& vec2); StfioDll Vector_double vec_vec_mul(const Vector_double& vec1, const Vector_double& vec2); StfioDll Vector_double vec_vec_div(const Vector_double& vec1, const Vector_double& vec2); //! ProgressInfo class /*! Abstract class to be used as an interface for the file io read/write functions * Can be a GUI Dialog or stdout messages */ class StfioDll ProgressInfo { public: //! Constructor /*! \param title Dialog title * \param message Message displayed * \param maximum Maximum value for the progress meter * \param verbose Whether or not to emit a lot of noise */ ProgressInfo(const std::string& title, const std::string& message, int maximum, bool verbose) {}; //! Updates the progress info /*! \param value New value of the progress meter * \param newmsg New message for the info text * \param skip This is set to true if the user has chosen to skip the operation * \return True unless the operation was cancelled. */ virtual bool Update(int value, const std::string& newmsg="", bool* skip=NULL) = 0; }; //! StdoutProgressInfo class /*! Example of a ProgressInfo that prints to stdout */ class StfioDll StdoutProgressInfo : public stfio::ProgressInfo { public: StdoutProgressInfo(const std::string& title, const std::string& message, int maximum, bool verbose); bool Update(int value, const std::string& newmsg="", bool* skip=NULL); private: bool verbosity; }; //! Text file import filter settings struct txtImportSettings { txtImportSettings() : hLines(1),toSection(true),firstIsTime(true),ncolumns(2), sr(20),yUnits("mV"),yUnitsCh2("pA"),xUnits("ms") {} int hLines; /*!< Number of header lines. */ bool toSection; /*!< Import columns into separate sections rather than separate channels. */ bool firstIsTime; /*!< First column contains time. */ int ncolumns; /*!< Number of columns. */ double sr; /*!< Sampling rate. */ std::string yUnits; /*!< y units string. */ std::string yUnitsCh2; /*!< y units string of second channel. */ std::string xUnits; /*!< x units string. */ }; //! File types enum filetype { atf, /*!< Axon text file. */ abf, /*!< Axon binary file. */ axg, /*!< Axograph binary file. */ ascii, /*!< Generic text file. */ cfs, /*!< CED filing system. */ igor, /*!< Igor binary wave. */ son, /*!< CED Son files. */ hdf5, /*!< hdf5 files. */ heka, /*!< heka files. */ biosig, /*!< biosig files. */ tdms, /*!< TDMS files. */ intan, /*!< Intan CLAMP files. */ none /*!< Undefined file type. */ }; #ifndef TEST_MINIMAL //! Attempts to determine the filetype from the filter extension. /*! \param ext The filter extension to be tested (in the form wxT("*.ext")). * \return The corresponding file type. */ StfioDll stfio::filetype findType(const std::string& ext); #endif // TEST_MINIMAL //! Returns file extension for a file type /*! \param ftype File type * \return File extension for given file type (in the form ".ext") */ StfioDll std::string findExtension(stfio::filetype ftype); //! Generic file import. /*! \param fName The full path name of the file. * \param type The file type. * \param ReturnData Will contain the file data on return. * \param txtImport The text import filter settings. * \param ProgressInfo Progress indicator * \return true if the file has successfully been read, false otherwise. */ StfioDll bool importFile( const std::string& fName, stfio::filetype type, Recording& ReturnData, const stfio::txtImportSettings& txtImport, stfio::ProgressInfo& progDlg ); //! Generic file export. /*! \param fName The full path name of the file. * \param type The file type. * \param Data Data to be written * \param ProgressInfo Progress indicator * \return true if the file has successfully been written, false otherwise. */ StfioDll bool exportFile(const std::string& fName, stfio::filetype type, const Recording& Data, ProgressInfo& progDlg); //! Produce new recording with concatenated sections /*! \param src Source recording * \param sections Indices of selected sections * \param ProgressInfo Progress indicator * \return New recording with concatenated selected sections */ StfioDll Recording concatenate(const Recording& src, const std::vector& sections, ProgressInfo& progDlg); //! Produce new recording with multiplied sections /*! \param src Source recording * \param sections Indices of selected sections * \param channel Channel index * \param factor Multiplication factor * \return New recording with multiplied selected sections */ StfioDll Recording multiply(const Recording& src, const std::vector& sections, std::size_t channel, double factor); /*@}*/ } // end of namespace typedef std::vector< std::string >::iterator sst_it; /*!< std::string iterator */ typedef std::vector< std::string >::const_iterator c_sst_it; /*!< constant std::string iterator */ typedef std::vector< std::size_t >::const_iterator c_st_it; /*!< constant size_t iterator */ typedef std::vector< int >::iterator int_it; /*!< int iterator */ typedef std::vector< int >::const_iterator c_int_it; /*!< constant int iterator */ typedef std::deque< Channel >::iterator ch_it; /*!< Channel iterator */ typedef std::deque< Channel >::const_iterator c_ch_it; /*!< constant Channel iterator */ typedef std::deque< Section >::iterator sec_it; /*!< Section iterator */ typedef std::deque< Section >::const_iterator c_sec_it; /*!< constant Section iterator */ #endif stimfit-0.15.8/src/libstfio/section.cpp0000775000175000017500000000366213062445067015002 00000000000000// This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "./stfio.h" #include "./section.h" // Definitions------------------------------------------------------------ // Default constructor definition // For reasons why to use member initializer lists instead of assignments // within the constructor, see [1]248 and [2]28 Section::Section(void) : section_description(), x_scale(1.0), data(0) {} Section::Section( const Vector_double& valA, const std::string& label ) : section_description(label), x_scale(1.0), data(valA) {} Section::Section(std::size_t size, const std::string& label) : section_description(label), x_scale(1.0), data(size) {} Section::~Section(void) { } double Section::at(std::size_t at_) const { if (at_>=data.size()) { std::out_of_range e("subscript out of range in class Section"); throw (e); } return data[at_]; } double& Section::at(std::size_t at_) { if (at_>=data.size()) { std::out_of_range e("subscript out of range in class Section"); throw (e); } return data[at_]; } void Section::SetXScale( double value ) { if ( x_scale >= 0 ) x_scale=value; else throw std::runtime_error( "Attempt to set x-scale <= 0" ); } stimfit-0.15.8/src/libstfio/abf/0000775000175000017500000000000013315356572013433 500000000000000stimfit-0.15.8/src/libstfio/abf/axon/0000775000175000017500000000000013315356571014377 500000000000000stimfit-0.15.8/src/libstfio/abf/axon/Common/0000775000175000017500000000000013315356572015630 500000000000000stimfit-0.15.8/src/libstfio/abf/axon/Common/resource.h0000775000175000017500000000145113062445067017551 00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by axabffio32.rc // #define IDS_EPITAGHEADINGS 1 #define IDS_CONTTAGHEADINGS 2 #define IDS_NONE 3 #define IDS_ENOMESSAGESTR 4 #define IDS_MATHCHANNEL 5 #define IDS_CANNOTLOAD 6 #define IDD_VOICETAGCLEANUP 119 #define IDC_PROGRESS 1001 #define IDC_TAGNUMBER 2053 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 105 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1002 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif stimfit-0.15.8/src/libstfio/abf/axon/Common/wincpp.hpp0000775000175000017500000000130613062445067017561 00000000000000//********************************************************************************************** // // Copyright (c) 1993 Axon Instruments. // All rights reserved. // //********************************************************************************************** // HEADER: WINCPP.HPP // PURPOSE: Contains common includes. Used for generation of precompiled headers. // AUTHOR: BHI Nov 1993 // #include "../Common/axodefn.h" #include "../Common/axodebug.h" /* #include "../Common/colors.h" */ #include "../Common/adcdac.h" #include #include #include #include #include /* #include */ #include stimfit-0.15.8/src/libstfio/abf/axon/Common/unix.cpp0000775000175000017500000001673213062445067017250 00000000000000#include "../Common/axodefn.h" #include #include int WINAPI AXODBG_printf( char *lpsz, ... ) { printf("%s", lpsz); return 0; } /********************************************************************* * CloseW32Handle (KERNEL.474) * CloseHandle (KERNEL32.@) * * Closes a handle. * * PARAMS * handle [I] Handle to close. * * RETURNS * Success: TRUE. * Failure: FALSE, check GetLastError(). */ BOOL WINAPI c_CloseHandle( FILEHANDLE handle ) { // returns the opposite of the Windows-function #if !defined(_MSC_VER) return (!fclose(handle)); #else return CloseHandle( handle ); #endif } /*********************************************************************** * GetFileSize (KERNEL32.@) * * Retrieve the size of a file. * * PARAMS * hFile [I] File to retrieve size of. * filesizehigh [O] On return, the high bits of the file size. * * RETURNS * Success: The low bits of the file size. * Failure: INVALID_FILE_SIZE. As this is could also be a success value, * check GetLastError() for values other than ERROR_SUCCESS. */ DWORD WINAPI c_GetFileSize( FILEHANDLE hFile, LPDWORD filesizehigh ) { #if !defined(_MSC_VER) long lSize; fpos_t cur; if (fgetpos(hFile,&cur)!=0) return -1; if (fseek (hFile, 0, SEEK_END)!=0) return -1; lSize=ftell (hFile); if (fsetpos(hFile,&cur)!=0) return -1; return lSize; #else return GetFileSize( hFile, filesizehigh ); #endif } /*********************************************************************** * ReadFile (KERNEL32.@) */ BOOL WINAPI c_ReadFile( FILEHANDLE hFile, LPVOID buffer, DWORD bytesToRead, LPDWORD bytesRead, LPOVERLAPPED overlapped ) { #if !defined(_MSC_VER) *bytesRead=(DWORD)fread(buffer,1,bytesToRead,hFile); if ( *bytesRead != bytesToRead) return FALSE; else return TRUE; #else return ReadFile( hFile, buffer, bytesToRead, bytesRead, overlapped ); #endif } /*********************************************************************** * SetFilePointer (KERNEL32.@) */ DWORD WINAPI c_SetFilePointer( FILEHANDLE hFile, LONG distance, LONG *highword, DWORD method ) { #if !defined(_MSC_VER) /*long res;*/ short origin = 0; switch (method) { case FILE_BEGIN : origin = SEEK_SET; /* start of file */ break; case FILE_CURRENT : origin = SEEK_CUR; /* current position of file pointer */ break; case FILE_END : origin = SEEK_END; /* end of file */ break; } /* res = */ fseek (hFile, distance, origin); /* stdio read */ return (DWORD) ftell(hFile); #else return SetFilePointer( hFile, distance, highword, method ); #endif } #if !defined(_WINDOWS) /********************************************************************* * _splitpath (NTDLL.@) * * Split a path into its component pieces. * * PARAMS * inpath [I] Path to split * drv [O] Destination for drive component (e.g. "A:"). Must be at least 3 characters. * dir [O] Destination for directory component. Should be at least MAX_PATH characters. * fname [O] Destination for File name component. Should be at least MAX_PATH characters. * ext [O] Destination for file extension component. Should be at least MAX_PATH characters. * * RETURNS * Nothing. */ void /*CSH __cdecl */ _splitpath(const char* inpath, char * drv, char * dir, char* fname, char * ext ) { const char *p, *end; if (inpath[0] && inpath[1] == ':') { if (drv) { drv[0] = inpath[0]; drv[1] = inpath[1]; drv[2] = 0; } inpath += 2; } else if (drv) drv[0] = 0; /* look for end of directory part */ end = NULL; for (p = inpath; *p; p++) if (*p == '/' || *p == '\\') end = p + 1; if (end) /* got a directory */ { if (dir) { memcpy( dir, inpath, end - inpath ); dir[end - inpath] = 0; } inpath = end; } else if (dir) dir[0] = 0; /* look for extension: what's after the last dot */ end = NULL; for (p = inpath; *p; p++) if (*p == '.') end = p; if (!end) end = p; /* there's no extension */ if (fname) { memcpy( fname, inpath, end - inpath ); fname[end - inpath] = 0; } if (ext) strcpy( ext, end ); } /********************************************************************* * _strnicmp (NTDLL.@) */ int /*CSH __cdecl*/ _strnicmp( LPCSTR str1, LPCSTR str2, size_t n ) { return strncasecmp( str1, str2, n ); } /********************************************************************* * _makepath (MSVCRT.@) * * Create a pathname. * * PARAMS * path [O] Destination for created pathname * drive [I] Drive letter (e.g. "A:") * directory [I] Directory * filename [I] Name of the file, excluding extension * extension [I] File extension (e.g. ".TXT") * * RETURNS * Nothing. If path is not large enough to hold the resulting pathname, * random process memory will be overwritten. */ void cdecl _makepath(char * path, const char * drive, const char *directory, const char * filename, const char * extension) { char ch; // TRACE("(%s %s %s %s)\n", debugstr_a(drive), debugstr_a(directory), // debugstr_a(filename), debugstr_a(extension) ); if ( !path ) return; path[0] = '\0'; if (drive && drive[0]) { path[0] = drive[0]; path[1] = ':'; path[2] = 0; } if (directory && directory[0]) { strcat(path, directory); ch = path[strlen(path)-1]; if (ch != '/' && ch != '\\') strcat(path,"\\"); } if (filename && filename[0]) { strcat(path, filename); if (extension && extension[0]) { if ( extension[0] != '.' ) strcat(path,"."); strcat(path,extension); } } // TRACE("returning %s\n",path); } #endif /*********************************************************************** * WriteFile (KERNEL32.@) */ BOOL WINAPI c_WriteFile( FILEHANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, LPDWORD bytesWritten, LPOVERLAPPED overlapped ) { #if !defined(_MSC_VER) *bytesWritten=(DWORD)fwrite(buffer, 1, bytesToWrite, hFile); return (*bytesWritten==bytesToWrite); #else return WriteFile( hFile, buffer, bytesToWrite, bytesWritten, overlapped ); #endif } /************************************************************************* * CreateFileA (KERNEL32.@) * * See CreateFileW. */ #if !defined(_MSC_VER) FILEHANDLE WINAPI c_CreateFile( LPCSTR filename, DWORD access, DWORD sharing, LPSECURITY_ATTRIBUTES sa, DWORD creation, DWORD attributes, HANDLE templ) { char fname[1024]; /* To get near variable holding string */ char* omode; switch (access) /* use C library constants to set mode */ { case GENERIC_WRITE: omode = (char*)"w"; break; case GENERIC_READ | GENERIC_WRITE: omode = (char*)"w+"; break; default: omode = (char*)"r"; break; } strncpy(fname, filename, 1024); /* Get filename in near var */ return fopen(fname,omode); } #endif stimfit-0.15.8/src/libstfio/abf/axon/Common/FileReadCache.cpp0000775000175000017500000001145313062445067020657 00000000000000//*********************************************************************************************** // // Copyright (c) 1996-1997 Axon Instruments. // All rights reserved. // //*********************************************************************************************** // MODULE: FileReadCache.cpp // PURPOSE: Contains class implementation for CFileReadCache. // AUTHOR: BHI Apr 1998 // #include "wincpp.hpp" #include "FileReadCache.hpp" #if !defined(_WINDOWS) || defined(__MINGW32__) || defined(__STF__) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif //=============================================================================================== // PROCEDURE: CFileReadCache // PURPOSE: Constructor. // CFileReadCache::CFileReadCache() { //MEMBERASSERT(); // Initialize the internal variables. m_uItemSize = 0; // Size of all data items (structures) m_uItemCount = 0; // Number of items available m_llFileOffset = 0; // Start offset in the file. m_uCacheSize = 0; m_uCacheStart = 0; m_uCacheCount = 0; m_pItemCache.reset((BYTE*)0); } //=============================================================================================== // PROCEDURE: ~CFileReadCache // PURPOSE: Destructor. Closes the temporary file and deletes it. // CFileReadCache::~CFileReadCache() { //MEMBERASSERT(); m_File.Release(); // delete[] m_pItemCache; // m_pItemCache = NULL; } //=============================================================================================== // PROCEDURE: Initialize // PURPOSE: Gets a unique filename and opens it as a temporary file. // BOOL CFileReadCache::Initialize(UINT uItemSize, UINT uCacheSize, FILEHANDLE hFile, LONGLONG llOffset, UINT uItems ) { //MEMBERASSERT(); //ASSERT(uItems > 0); m_uItemSize = uItemSize; m_uCacheSize = min(uCacheSize, uItems); m_uItemCount = uItems; m_llFileOffset = llOffset; m_File.SetFileHandle(hFile); m_uCacheSize = uCacheSize; m_uCacheStart = 0; m_uCacheCount = 0; m_pItemCache.reset(new BYTE[uItemSize * uCacheSize]); return (m_pItemCache.get() != NULL); } //=============================================================================================== // PROCEDURE: Get // PURPOSE: Retrieves one or more ITEMs from the virtualized array. // BOOL CFileReadCache::Get( UINT uFirstEntry, void *pvItems, UINT uEntries ) { //MEMBERASSERT(); //ASSERT(m_File.IsOpen()); //ASSERT(uFirstEntry+uEntries <= GetCount()); //ASSERT(uEntries > 0); BYTE *pItems = (BYTE *)pvItems; //ARRAYASSERT(pItems, uEntries * m_uItemSize); while (uEntries) { // Make sure that the first item is in the cache. if (!LoadCache(uFirstEntry)) return FALSE; // Calculate which portion of the cache we want. UINT uStart = uFirstEntry - m_uCacheStart; UINT uCopy = m_uCacheStart + m_uCacheCount - uFirstEntry; if (uCopy > uEntries) uCopy = uEntries; // Copy the data out. UINT uBytes = uCopy * m_uItemSize; memcpy(pItems, m_pItemCache.get() + uStart * m_uItemSize, uBytes); // Update the pointers. pItems += uBytes; uEntries -= uCopy; uFirstEntry += uCopy; } return TRUE; } //=============================================================================================== // PROCEDURE: Get // PURPOSE: Get a pointer to one entry in the cache. // void *CFileReadCache::Get( UINT uEntry ) { //MEMBERASSERT(); //ASSERT(m_File.IsOpen()); //ASSERT(uEntry < GetCount()); // Make sure that the item is in the cache. if (!LoadCache(uEntry)) return NULL; // return a pointer to the item. return m_pItemCache.get() + (uEntry - m_uCacheStart) * m_uItemSize; } //=============================================================================================== // PROCEDURE: LoadCache // PURPOSE: If an entry is not in the cache, the cache is reloaded from disk. // BOOL CFileReadCache::LoadCache(UINT uEntry) { //MEMBERASSERT(); //ASSERT(m_File.IsOpen()); if ((uEntry >= m_uCacheStart) && (uEntry < m_uCacheStart+m_uCacheCount)) return TRUE; // Set the cache at the start of the cache size block that includes the requested item m_uCacheStart = uEntry - (uEntry % m_uCacheSize); m_uCacheCount = min(m_uItemCount-m_uCacheStart, m_uCacheSize); // seek to the start point. if (!m_File.Seek(m_uCacheStart * m_uItemSize + m_llFileOffset, FILE_BEGIN)) return FALSE; // Read the items from the file. return m_File.Read(m_pItemCache.get(), m_uCacheCount * m_uItemSize); } stimfit-0.15.8/src/libstfio/abf/axon/Common/FileIO.cpp0000775000175000017500000004310013062445067017361 00000000000000//*********************************************************************************************** // // Copyright (c) 1993-1997 Axon Instruments. // All rights reserved. // Permission is granted to freely to use, modify and copy the code in this file. // //*********************************************************************************************** // // MODULE: FileIO.CPP // PURPOSE: Contains the member functions for the CFileIO class. // NOTES: // // Overlapped file I/O is not available in WIN95 -- PSS ID Number: Q125717 // Windows 95 does not support overlapped operations on files, disk, pipes, or // mail slots, but does support overlapped operations on serial and parallel // communication ports. Non-overlapped file write operations are similar to // overlapped file writes, because Windows 95 uses a lazy-write disk cache. // Overlapped I/O can be implemented in a Win32-based application by creating // multiple threads to handle I/O. // // Asynchronous I/O on files, disk, pipes and mail slots is not implemented in // Windows 95. If a Win32-based application running on Windows 95 attempts to // perform asynchronous file I/O (such as ReadFile() with any value other than // NULL in the lpOverlapped field) on any of these objects, the ReadFile() or // WriteFile fails and GetLastError() returns ERROR_INVALID_PARAMETER (87). // #include "wincpp.hpp" #include "FileIO.hpp" //=============================================================================================== // FUNCTION: Constructor // PURPOSE: Initialize the object // CFileIO::CFileIO() { //MEMBERASSERT(); m_hFileHandle = NULL; m_szFileName[0] = '\0'; m_dwLastError = 0; } //=============================================================================================== // FUNCTION: Copy Constructor // PURPOSE: Creates a CFileIO object from a Win32 HANDLE. // CFileIO::CFileIO(FILEHANDLE hFile) { //MEMBERASSERT(); m_hFileHandle = hFile; m_szFileName[0] = '\0'; m_dwLastError = 0; } #if !defined(_MSC_VER) CFileIO::CFileIO(HANDLE hFile) { //MEMBERASSERT(); m_hFileHandle = (FILEHANDLE)hFile; m_szFileName[0] = '\0'; m_dwLastError = 0; } #endif //=============================================================================================== // FUNCTION: Destructor // PURPOSE: Cleanup the object when it is deleted. // CFileIO::~CFileIO() { //MEMBERASSERT(); Close(); } //=============================================================================================== // FUNCTION: Create // PURPOSE: Opens a file and stores the filename if successful. // BOOL CFileIO::Create(LPCTSTR szFileName, BOOL bReadOnly, DWORD dwAttributes) { //MEMBERASSERT(); //LPSZASSERT(szFileName); ASSERT(m_hFileHandle == FILE_NULL); DWORD dwFlags = GENERIC_READ; DWORD dwCreation = OPEN_EXISTING; if (!bReadOnly) { dwFlags |= GENERIC_WRITE; dwCreation = CREATE_ALWAYS; } return CreateEx(szFileName, dwFlags, FILE_SHARE_READ, dwCreation, dwAttributes); } //=============================================================================================== // FUNCTION: CreateEx // PURPOSE: Opens a file and stores the filename if successful. // BOOL CFileIO::CreateEx(LPCTSTR szFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes) { //MEMBERASSERT(); //LPSZASSERT(szFileName); ASSERT(m_hFileHandle == FILE_NULL); #if defined(_MSC_VER) m_hFileHandle = ::CreateFile(szFileName, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); #else int fnsize = 0; std::string fName; while (szFileName[fnsize++] != '\0') { fName += char(szFileName[fnsize-1]); } fName += '\0'; m_hFileHandle = ::c_CreateFile(fName.c_str(), dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); #endif if (m_hFileHandle == FILE_NULL) return SetLastError(); #if defined(_MSC_VER) // TRACE1("Create(%s)\n", szFileName); wcsncpy(m_szFileName, szFileName, _MAX_PATH-1); m_szFileName[_MAX_PATH-1] = '\0'; #endif return TRUE; } //=============================================================================================== // FUNCTION: SetFileHandle // PURPOSE: Initializes the object from a Win32 HANDLE. // void CFileIO::SetFileHandle(FILEHANDLE hFile) { //MEMBERASSERT(); ASSERT(m_hFileHandle == FILE_NULL); m_hFileHandle = hFile; m_szFileName[0] = '\0'; m_dwLastError = 0; } /* //=============================================================================================== // FUNCTION: Write // PURPOSE: Write a buffer of data to the file. // BOOL CFileIO::Write(const void *pvBuffer, DWORD dwSizeInBytes, DWORD *pdwBytesWritten) { //MEMBERASSERT(); // ASSERT(m_hFileHandle != INVALID_HANDLE_VALUE); DWORD dwBytesWritten = 0; BOOL bRval = ::WriteFile(m_hFileHandle, pvBuffer, dwSizeInBytes, &dwBytesWritten, NULL); if (pdwBytesWritten) *pdwBytesWritten = dwBytesWritten; if (!bRval) SetLastError(); return bRval; } //=============================================================================================== // FUNCTION: Flush // PURPOSE: Flush the current file to disk. // BOOL CFileIO::Flush() { //MEMBERASSERT(); // ASSERT(m_hFileHandle != INVALID_HANDLE_VALUE); return ::FlushFileBuffers(m_hFileHandle) ? TRUE : SetLastError(); } */ //=============================================================================================== // PROCEDURE: Read // PURPOSE: Reads a block and returnd FALSE on ERROR. // BOOL CFileIO::Read(LPVOID lpBuf, DWORD dwBytesToRead, DWORD *pdwBytesRead) { //MEMBERASSERT(); ASSERT(m_hFileHandle != FILE_NULL); DWORD dwBytesRead = 0; #if defined(_MSC_VER) BOOL bRval = ::ReadFile(m_hFileHandle, lpBuf, dwBytesToRead, &dwBytesRead, NULL); #else BOOL bRval = ::c_ReadFile(m_hFileHandle, lpBuf, dwBytesToRead, &dwBytesRead, NULL); #endif if (pdwBytesRead) *pdwBytesRead = dwBytesRead; if (!bRval) return SetLastError(); if (dwBytesRead!=dwBytesToRead) return SetLastError(ERROR_HANDLE_EOF); return TRUE; } //=============================================================================================== // FUNCTION: Close // PURPOSE: Closes a previously opened file. // BOOL CFileIO::Close() { //MEMBERASSERT(); if (m_hFileHandle != NULL) { #if defined(_MSC_VER) if (!::CloseHandle(m_hFileHandle)) #else if (!c_CloseHandle(m_hFileHandle)) #endif return SetLastError(); // TRACE1("Close(%s)\n", m_szFileName); m_hFileHandle = NULL; } m_szFileName[0] = '\0'; return TRUE; } //=============================================================================================== // FUNCTION: Release // PURPOSE: Releases the file handle held in the object. // FILEHANDLE CFileIO::Release() { //MEMBERASSERT(); FILEHANDLE hRval = m_hFileHandle; m_hFileHandle = NULL; m_szFileName[0] = '\0'; return hRval; } //=============================================================================================== // FUNCTION: SeekFailure // PURPOSE: Returns TRUE if an open file handle is held. // BOOL CFileIO::SeekFailure(DWORD dwOffset) { //MEMBERASSERT(); if (dwOffset == 0xFFFFFFFF) { DWORD dwError = GetLastError(); if (dwError != NO_ERROR ) { SetLastError(dwError); return TRUE; } } return FALSE; } //=============================================================================================== // FUNCTION: Seek // PURPOSE: Change the current position of the file pointer. // NOTES: Valid flags are FILE_CURRENT, FILE_BEGIN, & FILE_END. // BOOL CFileIO::Seek(LONGLONG lOffset, UINT uFlag, LONGLONG *plNewOffset) { #if !defined(_MSC_VER) /*MEMBERASSERT();*/ short origin = 0; switch (uFlag) { case FILE_BEGIN : origin = SEEK_SET; /* start of file */ break; case FILE_CURRENT : origin = SEEK_CUR; /* current position of file pointer */ break; case FILE_END : origin = SEEK_END; /* end of file */ break; } return (!fseek (m_hFileHandle, (long)lOffset, origin)); /* stdio read */ #else MEMBERASSERT(); LARGE_INTEGER Offset; Offset.QuadPart = lOffset; Offset.LowPart = ::SetFilePointer(m_hFileHandle, Offset.LowPart, &Offset.HighPart, uFlag); if (SeekFailure(Offset.LowPart)) return FALSE; if (plNewOffset) *plNewOffset = Offset.QuadPart; return TRUE; #endif } /* //=============================================================================================== // FUNCTION: GetCurrentPosition // PURPOSE: Get the current position of the file pointer. // BOOL CFileIO::GetCurrentPosition(LONGLONG *plCurrentPosition) { //MEMBERASSERT(); return Seek(0, FILE_CURRENT, plCurrentPosition); } */ //=============================================================================================== // FUNCTION: GetFileSize // PURPOSE: Returns the size of a file in bytes. // LONGLONG CFileIO::GetFileSize() { /*MEMBERASSERT();*/ ASSERT(m_hFileHandle != FILE_NULL); #if !defined(_MSC_VER) return c_GetFileSize(m_hFileHandle,NULL); #else return ::GetFileSize(m_hFileHandle,NULL); #endif } /* //=============================================================================================== // FUNCTION: GetFileTime // PURPOSE: Gets time values for the file. // BOOL CFileIO::GetFileTime( LPFILETIME pCreationTime, LPFILETIME pLastAccessTime, LPFILETIME pLastWriteTime) { //MEMBERASSERT(); //ASSERT(m_hFileHandle != INVALID_HANDLE_VALUE); return ::GetFileTime(m_hFileHandle, pCreationTime, pLastAccessTime, pLastWriteTime); } //=============================================================================================== // FUNCTION: SetFileTime // PURPOSE: Sets time values for the file. // BOOL CFileIO::SetFileTime( LPFILETIME pCreationTime, LPFILETIME pLastAccessTime, LPFILETIME pLastWriteTime) { //MEMBERASSERT(); //ASSERT(m_hFileHandle != INVALID_HANDLE_VALUE); return ::SetFileTime(m_hFileHandle, pCreationTime, pLastAccessTime, pLastWriteTime); } //=============================================================================================== // FUNCTION: GetFileInformation // PURPOSE: . // BOOL CFileIO::GetFileInformation(LPBY_HANDLE_FILE_INFORMATION pFileInformation) { //MEMBERASSERT(); return ::GetFileInformationByHandle(m_hFileHandle, pFileInformation) ? TRUE : SetLastError(); } //=============================================================================================== // FUNCTION: Duplicate // PURPOSE: Makes a copy of the handle into another CFileIO object. // BOOL CFileIO::Duplicate(CFileIO *pNewFile, BOOL bInheritable) { //MEMBERASSERT(); HANDLE hNewHandle = NULL; HANDLE *pNewHandle = NULL; if (pNewFile) { // WPTRASSERT(pNewFile); pNewHandle = &hNewHandle; } if (!DuplicateHandle(GetCurrentProcess(), // source process m_hFileHandle, // handle to duplicate GetCurrentProcess(), // destination process pNewHandle, // new handle 0, // new access flags - ignored since DUPLICATE_SAME_ACCESS bInheritable, // it's inheritable DUPLICATE_SAME_ACCESS)) return SetLastError(); if (pNewFile) pNewFile->SetFileHandle(hNewHandle); return TRUE; } //=============================================================================================== // FUNCTION: SetInheritable // PURPOSE: Sets the "inheritability" of the file handle. // BOOL CFileIO::SetInheritable(BOOL bInheritable) { //MEMBERASSERT(); return Duplicate(NULL, bInheritable); } */ //=============================================================================================== // FUNCTION: SetLastError // PURPOSE: Sets the last error value and always returns FALSE for convenience. // BOOL CFileIO::SetLastError() { /*MEMBERASSERT();*/ return SetLastError(GetLastError()); } //=============================================================================================== // FUNCTION: SetLastError // PURPOSE: Sets the last error value and always returns FALSE for convenience. // BOOL CFileIO::SetLastError(DWORD dwError) { /*MEMBERASSERT();*/ m_dwLastError = dwError; // TRACE1("CFileIO::SetLastError(%u)\n", dwError); // SHOW_SYSTEM_ERROR(dwError); return FALSE; // convenience. } //=============================================================================================== // FUNCTION: GetLastError // PURPOSE: Gets the last error condition provoked by this object. // DWORD CFileIO::GetLastError() const { /*MEMBERASSERT();*/ return m_dwLastError; } //############################################################################################### //############################################################################################### //### //### CFileIO_NoClose is a non-polymorphic derivation of CFileIO that does not close the //### file on destruction. Typically used with the copy constructor to wrap a HANDLE. //### //############################################################################################### //############################################################################################### //=============================================================================================== // FUNCTION: Constructor // PURPOSE: Object initialization. // CFileIO_NoClose::CFileIO_NoClose(HANDLE hFile) : CFileIO(hFile) { } //=============================================================================================== // FUNCTION: Destructor // PURPOSE: Object cleanup. // CFileIO_NoClose::~CFileIO_NoClose() { Release(); } #if 0 //############################################################################################### //############################################################################################### //### //### CFileIO_Pipe is a thin wrapper around a Win32 pipe. //### //############################################################################################### //############################################################################################### CFileIO_Pipe::CFileIO_Pipe() { } CFileIO_Pipe::~CFileIO_Pipe() { } BOOL CFileIO_Pipe::Create(BOOL bInheritable) { // set up the security attributes for the anonymous pipe SECURITY_ATTRIBUTES saPipe = { 0 }; saPipe.nLength = sizeof(SECURITY_ATTRIBUTES); saPipe.lpSecurityDescriptor = NULL; saPipe.bInheritHandle = bInheritable; // handles to the anonymous pipe HANDLE hReadPipe=NULL, hWritePipe=NULL; // create the anonymous pipe if (!CreatePipe(&hReadPipe, &hWritePipe, &saPipe, 0)) { SHOW_SYSTEM_ERROR(0); return FALSE; } m_ReadPipe.SetFileHandle(hReadPipe); m_WritePipe.SetFileHandle(hWritePipe); return TRUE; } CFileIO *CFileIO_Pipe::GetReadPipe() { //MEMBERASSERT(); return &m_ReadPipe; } CFileIO *CFileIO_Pipe::GetWritePipe() { //MEMBERASSERT(); return &m_WritePipe; } #ifdef TESTBED #define WRITETEST 1 #define READTEST 1 int main(int argc, char **argv) { const char szFilename[] = "D:\\Bigfile.tmp"; const LONGLONG llFileLen = LONGLONG(1024 * 1024 * 1024) * 3; const char szWriteText[] = "Bruce's big file writing test."; const int nTextLen = strlen(szWriteText); #if WRITETEST { CFileIO File; //VERIFY(File.Create(szFilename, FALSE)); LONGLONG llOffset = 0; // VERIFY(File.Seek(llFileLen, FILE_BEGIN, &llOffset)); // ASSERT(llOffset == llFileLen); printf("llOffset = %d MB\n", int(llOffset / (1024 * 1024))); //VERIFY(File.Write(szWriteText, nTextLen)); LONGLONG llFileSize = File.GetFileSize(); // ASSERT(llFileSize > 0); // ASSERT(llFileSize == llFileLen + nTextLen); printf("llFileSize = %d MB\n", int(llFileSize / (1024 * 1024))); // VERIFY(File.Seek(-nTextLen, FILE_CURRENT, &llOffset)); char szReadText[128] = ""; // VERIFY(File.Read(szReadText, nTextLen)); szReadText[nTextLen] = '\0'; // ASSERT(strcmp(szWriteText, szReadText)==0); printf("szReadText = %s\n", szReadText); // VERIFY(File.Close()); } #endif #if READTEST { CFileIO File; //VERIFY(File.Create(szFilename, TRUE)); LONGLONG llOffset = 0; //VERIFY(File.Seek(llFileLen, FILE_BEGIN, &llOffset)); printf("llOffset = %d MB\n", int(llOffset / (1024 * 1024))); LONGLONG llFileSize = File.GetFileSize(); ASSERT(llFileSize > 0); ASSERT(llFileSize == llFileLen + nTextLen); printf("llFileSize = %d MB\n", int(llFileSize / (1024 * 1024))); char szReadText[128] = ""; //VERIFY(File.Read(szReadText, nTextLen)); szReadText[nTextLen] = '\0'; ASSERT(strcmp(szWriteText, szReadText)==0); printf("szReadText = %s\n", szReadText); //VERIFY(File.Close()); } #endif return 0; } #endif // TESTBED #endif stimfit-0.15.8/src/libstfio/abf/axon/Common/ArrayPtr.hpp0000775000175000017500000004144313062445067020033 00000000000000//*********************************************************************************************** // // Copyright (c) 1996-1997 Axon Instruments. // All rights reserved. // //*********************************************************************************************** // HEADER: ARRAYPTR.HPP // PURPOSE: Define the template class CArrayPtr // AUTHOR: BHI Sep 1996 // // #ifndef INC_ARRAYPTR_HPP #define INC_ARRAYPTR_HPP #pragma once #include #include #if defined(__UNIX__) || defined(__STF__) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif //*********************************************************************************************** // CLASS: CArrayPtr // PURPOSE: A smart pointer class for arrays of objects or primitive ITEMs. // template class CArrayPtr { private: // Private data. boost::shared_array m_pArray; private: // Prevent copy constructors and operator=(). CArrayPtr(const CArrayPtr &); const CArrayPtr &operator=(const CArrayPtr &); public: // Public member functions. // Constructors & destructor. See notes below. CArrayPtr(ITEM *pItem = NULL); CArrayPtr(UINT uCount); ~CArrayPtr(); // Allocation and destruction of memory pointed to by this object. BOOL Alloc(UINT uCount); /* BOOL Realloc(UINT uOldCount, UINT uNewCount, BOOL bZero=FALSE); BOOL Clone(const ITEM *pItem, UINT uCount); */ void Free(); // Accessor functions to get at the wrapped array. operator ITEM *() const; ITEM *Get() const; /* // Destroys the held array and replaces it with another. void Set(ITEM *); // Non-destructive release of the held pointer. ITEM *Release(); // Zero the held array from 0 for uCount items. void Zero(UINT uCount); // Sorts the data held in the pointer according to a user-supplied callback. void Sort(UINT uCount, int (__cdecl *FnCompare )(const void *elem1, const void *elem2 )); */ }; //================================================================================================ // FUNCTION: Constructor // PURPOSE: Create a new object that wraps a passed pointer. // NOTES: If the passed pointer is non-NULL, it *MUST* have been created on the // heap using the array allocater new[]. // Unfortunately there is no reliable way to ASSERT this. // // The definition of this constructor contains a default parameter of NULL // so that CArrayPtr objects can be created that do not hold anything. // template inline CArrayPtr::CArrayPtr/*CSH*/(ITEM *pItem) { // MEMBERASSERT(); ASSERT_NOTONSTACK(pItem); m_pArray = pItem; } //================================================================================================ // FUNCTION: Constructor // PURPOSE: Create a new object and allocate a buffer of the passed size. // template inline CArrayPtr::CArrayPtr/*CSH*/(UINT uCount) { // MEMBERASSERT(); m_pArray.reset((ITEM*)0); Alloc(uCount); } //================================================================================================ // FUNCTION: Destructor // PURPOSE: Frees a held pointer if non-NULL. // template inline CArrayPtr::~CArrayPtr/*CSH*/() { // MEMBERASSERT(); // delete[] m_pArray; // m_pArray = NULL; } //================================================================================================ // FUNCTION: Alloc // PURPOSE: Frees any held pointer and allocates a new array of the wrapped ITEM. // template inline BOOL CArrayPtr::Alloc(UINT uCount) { // MEMBERASSERT(); // Free any existing array. Free(); // Return now if nothing is to be allocated. if (uCount == 0) return TRUE; // Allocate the new array. m_pArray.reset(new ITEM[uCount]); return (m_pArray!=NULL); } /* //================================================================================================ // FUNCTION: Realloc // PURPOSE: Reallocates the held pointer keeping the held data. // template inline BOOL CArrayPtr::Realloc(UINT uOldCount, UINT uNewCount, BOOL bZero) { MEMBERASSERT(); ARRAYASSERT(m_pArray, uOldCount); CArrayPtr pNewArray; if (uNewCount && !pNewArray.Alloc(uNewCount)) return FALSE; for (UINT i=0; i inline BOOL CArrayPtr::Clone(const ITEM *pItem, UINT uCount) { MEMBERASSERT(); // Reallocate the held pointer. if (!Alloc(uCount)) return FALSE; // Check that we have valid parameters. ARRAYASSERT(pItem, uCount); // If this object was only for wrapping primitive types, a memcpy call // would be most efficient for cloning, but this is inappropriate for // arrays of objects. // memcpy(m_pArray, pItem, uCount*sizeof(ITEM)); // Use a for loop to copy the array into the new buffer. for (UINT i=0; i inline void CArrayPtr::Free() { // MEMBERASSERT(); m_pArray.reset((ITEM*)0); } //================================================================================================ // FUNCTION: Get // PURPOSE: Returns the held pointer without giving up ownership of it. // template inline ITEM *CArrayPtr::Get() const { // MEMBERASSERT(); return m_pArray.get(); } /* //================================================================================================ // FUNCTION: Set // PURPOSE: Destroys the held array and replaces it with another. // template inline void CArrayPtr::Set(ITEM *pItem) { ASSERT_NOTONSTACK(pItem); Free(); m_pArray = pItem; } */ //================================================================================================ // FUNCTION: Overloaded cast operator // PURPOSE: Returns the held pointer without giving up ownership of it. // template inline CArrayPtr::operator ITEM *() const { // MEMBERASSERT(); return Get(); } /* //================================================================================================ // FUNCTION: Release // PURPOSE: Returns the held pointer, giving up ownership of it. // template inline ITEM *CArrayPtr::Release() { MEMBERASSERT(); ITEM *rval = m_pArray; m_pArray = NULL; return rval; } //================================================================================================ // FUNCTION: Zero // PURPOSE: Zero's out the held pointer from item 0 for uCount items. // template inline void CArrayPtr::Zero(UINT uCount) { MEMBERASSERT(); ARRAYASSERT(m_pArray, uCount); memset(m_pArray, 0, uCount*sizeof(ITEM)); } //================================================================================================ // FUNCTION: Sort // PURPOSE: Sorts the data held in the pointer according to a user-supplied callback. // template inline void CArrayPtr::Sort(UINT uCount, int (__cdecl *FnCompare )(const void *elem1, const void *elem2 )) { MEMBERASSERT(); ARRAYASSERT(m_pArray, uCount); qsort(m_pArray, uCount, sizeof(ITEM), FnCompare); } */ /* //################################################################################################ //################################################################################################ //### //### CLASS: CArrayPtrEx //### PURPOSE: Extended smart pointer that also holds the count of objects held. //### //################################################################################################ //################################################################################################ // *********************************************************************************************** // CLASS: CArrayPtrEx // PURPOSE: A vector class for arrays of objects or primitive ITEMs. // template class CArrayPtrEx { private: // Private data. ITEM *m_pArray; UINT m_uCount; private: // Prevent copy constructors and operator=(). CArrayPtrEx(const CArrayPtrEx &); const CArrayPtrEx &operator=(const CArrayPtrEx &); public: // Public member functions. // Constructors & destructor. See notes below. CArrayPtrEx(); CArrayPtrEx(UINT uCount); ~CArrayPtrEx(); // Allocation and destruction of memory pointed to by this object. BOOL Alloc(UINT uCount); BOOL Realloc(UINT uNewCount, BOOL bZero=FALSE); BOOL Clone(const ITEM *pItem, UINT uCount); void Free(); // Accessor functions to get at the wrapped array. operator ITEM *() const; ITEM *Get() const; // Destroys the held array and replaces it with another. void Set(ITEM *, UINT uCount); // Non-destructive release of the held pointer. ITEM *Release(); // Returns number of items held. UINT GetCount() const; // Zero the held array. void Zero(); // Sorts the data held in the pointer according to a user-supplied callback. void Sort(int (__cdecl *FnCompare )(const void *elem1, const void *elem2 )); }; //================================================================================================ // FUNCTION: Constructor // PURPOSE: Create a new object that wraps a passed pointer. // NOTES: If the passed pointer is non-NULL, it *MUST* have been created on the // heap using the array allocater new[]. // Unfortunately there is no reliable way to ASSERT this. // // The definition of this constructor contains a default parameter of NULL // so that CArrayPtrEx objects can be created that do not hold anything. // template inline CArrayPtrEx::CArrayPtrEx() { MEMBERASSERT(); m_pArray = NULL; m_uCount = 0; } //================================================================================================ // FUNCTION: Constructor // PURPOSE: Create a new object and allocate a buffer of the passed size. // template inline CArrayPtrEx::CArrayPtrEx(UINT uCount) { MEMBERASSERT(); m_pArray = NULL; m_uCount = 0; Alloc(uCount); } //================================================================================================ // FUNCTION: Destructor // PURPOSE: Frees a held pointer if non-NULL. // template inline CArrayPtrEx::~CArrayPtrEx() { MEMBERASSERT(); Free(); } //================================================================================================ // FUNCTION: Alloc // PURPOSE: Frees any held pointer and allocates a new array of the wrapped ITEM. // template inline BOOL CArrayPtrEx::Alloc(UINT uCount) { MEMBERASSERT(); // Check if we already have the right size. if (m_uCount == uCount) return TRUE; // Free any existing array. Free(); // Return now if nothing is to be allocated. if (uCount == 0) return TRUE; // Allocate the new array. m_pArray = new ITEM[uCount]; if (m_pArray) m_uCount = uCount; return (m_pArray!=NULL); } //================================================================================================ // FUNCTION: Realloc // PURPOSE: Reallocates the held pointer keeping the held data. // template inline BOOL CArrayPtrEx::Realloc(UINT uNewCount, BOOL bZero) { MEMBERASSERT(); ARRAYASSERT(m_pArray, m_uCount); if (m_uCount == uNewCount) return TRUE; UINT uOldCount = m_uCount; CArrayPtrEx pNewArray; if (uNewCount && !pNewArray.Alloc(uNewCount)) return FALSE; for (UINT i=0; i inline BOOL CArrayPtrEx::Clone(const ITEM *pItem, UINT uCount) { MEMBERASSERT(); // Reallocate the held pointer. if (!Alloc(uCount)) return FALSE; // Check that we have valid parameters. ARRAYASSERT(pItem, uCount); // If this object was only for wrapping primitive types, a memcpy call // would be most efficient for cloning, but this is inappropriate for // arrays of objects. // memcpy(m_pArray, pItem, uCount*sizeof(ITEM)); // Use a for loop to copy the array into the new buffer. for (UINT i=0; i inline void CArrayPtrEx::Free() { MEMBERASSERT(); delete[] m_pArray; m_pArray = NULL; m_uCount = 0; } //================================================================================================ // FUNCTION: Get // PURPOSE: Returns the held pointer without giving up ownership of it. // template inline ITEM *CArrayPtrEx::Get() const { MEMBERASSERT(); return m_pArray; } //================================================================================================ // FUNCTION: GetCount // PURPOSE: Returns the count of items held. // template inline UINT CArrayPtrEx::GetCount() const { MEMBERASSERT(); return m_uCount; } //================================================================================================ // FUNCTION: Set // PURPOSE: Destroys the held array and replaces it with another. // template inline void CArrayPtrEx::Set(ITEM *pItem, UINT uCount) { ASSERT_NOTONSTACK(pItem); Free(); m_pArray = pItem; m_uCount = uCount; } //================================================================================================ // FUNCTION: Overloaded cast operator // PURPOSE: Returns the held pointer without giving up ownership of it. // template inline CArrayPtrEx::operator ITEM *() const { MEMBERASSERT(); return Get(); } //================================================================================================ // FUNCTION: Release // PURPOSE: Returns the held pointer, giving up ownership of it. // template inline ITEM *CArrayPtrEx::Release() { MEMBERASSERT(); ITEM *rval = m_pArray; m_pArray = NULL; m_uCount = 0; return rval; } //================================================================================================ // FUNCTION: Zero // PURPOSE: Zero's out the held pointer from item 0 for uCount items. // template inline void CArrayPtrEx::Zero() { MEMBERASSERT(); ARRAYASSERT(m_pArray, m_uCount); memset(m_pArray, 0, m_uCount*sizeof(ITEM)); } //================================================================================================ // FUNCTION: Sort // PURPOSE: Sorts the data held in the pointer according to a user-supplied callback. // template inline void CArrayPtrEx::Sort(int (__cdecl *FnCompare )(const void *elem1, const void *elem2 )) { MEMBERASSERT(); ARRAYASSERT(m_pArray, m_uCount); qsort(m_pArray, m_uCount, sizeof(ITEM), FnCompare); } */ #endif // INC_ARRAYPTR_HPP stimfit-0.15.8/src/libstfio/abf/axon/Common/FileIO.hpp0000775000175000017500000001261113062445067017371 00000000000000//*********************************************************************************************** // // Copyright (c) 1993-1997 Axon Instruments. // All rights reserved. // Permission is granted to freely to use, modify and copy the code in this file. // //*********************************************************************************************** // // MODULE: FileIO.HPP // PURPOSE: Contains the class definition for the CFileIO class, a simple wrapper // around the WIN32 file I/O API. // #ifndef INC_FileIO_HPP #define INC_FileIO_HPP #include "axodefn.h" #include "./../Common/wincpp.hpp" #include "./../AxAbfFio32/abffiles.h" // ABF file I/O API and error codes. #include "./../AxAbfFio32/csynch.hpp" // Virtual synch array object class CFileIO { private: // Member variables and constants. TCHAR m_szFileName[_MAX_PATH]; // The complete filename of the file FILEHANDLE m_hFileHandle; // The DOS file handle for data file DWORD m_dwLastError; // Error number for last error. private: // Prevent default copy constructor and operator=() CFileIO(const CFileIO &FI); const CFileIO &operator=(const CFileIO &FI); private: // Internal functions. BOOL SeekFailure(DWORD dwOffset); public: CFileIO(); CFileIO(FILEHANDLE hFile); #if !defined(_MSC_VER) CFileIO(HANDLE hFile); #endif ~CFileIO(); BOOL Create(LPCTSTR szFileName, BOOL bReadOnly, DWORD dwAttributes=FILE_ATTRIBUTE_NORMAL); BOOL CreateEx(LPCTSTR szFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes); BOOL Close(); /* BOOL IsOpen() const; BOOL Write(const void *pvBuffer, DWORD dwSizeInBytes, DWORD *pdwBytesWritten=NULL); */ BOOL Read(void *pvBuffer, DWORD dwSizeInBytes, DWORD *pdwBytesRead=NULL); BOOL Seek(LONGLONG lOffset, UINT uFlag=FILE_BEGIN, LONGLONG *plNewOffset=NULL); /* BOOL GetCurrentPosition(LONGLONG *plCurrentPosition); BOOL Flush(); BOOL SetEndOfFile(); */ LONGLONG GetFileSize(); /* BOOL GetFileTime( LPFILETIME pCreationTime, LPFILETIME pLastAccessTime=NULL, LPFILETIME pLastWriteTime=NULL); BOOL SetFileTime( LPFILETIME pCreationTime, LPFILETIME pLastAccessTime=NULL, LPFILETIME pLastWriteTime=NULL); BOOL GetFileInformation(LPBY_HANDLE_FILE_INFORMATION lpFileInformation); */ void SetFileHandle(FILEHANDLE hFile); FILEHANDLE GetFileHandle() const; LPCTSTR GetFileName() const; FILEHANDLE Release(); /* BOOL Duplicate(CFileIO *pNewFile, BOOL bInheritable=TRUE); BOOL SetInheritable(BOOL bInheritable=TRUE); */ BOOL SetLastError(); BOOL SetLastError(DWORD nError); DWORD GetLastError() const; }; //=============================================================================================== // FUNCTION: GetFileName // PURPOSE: Get the name of the file. // inline LPCTSTR CFileIO::GetFileName() const { // MEMBERASSERT(); return m_szFileName; } //=============================================================================================== // FUNCTION: GetFileHandle // PURPOSE: Returns the file handle opened in the object. // inline FILEHANDLE CFileIO::GetFileHandle() const { // MEMBERASSERT(); return m_hFileHandle; } #if 0 //=============================================================================================== // FUNCTION: IsOpen // PURPOSE: Returns TRUE if an open file handle is held. // inline BOOL CFileIO::IsOpen() const { MEMBERASSERT(); return (m_hFileHandle != INVALID_HANDLE_VALUE); } //=============================================================================================== // FUNCTION: SetEndOfFile // PURPOSE: Truncates the file to the current position. // inline BOOL CFileIO::SetEndOfFile() { MEMBERASSERT(); return ::SetEndOfFile(m_hFileHandle) ? TRUE : SetLastError(); } #endif //=============================================================================================== // CLASS: CFileIO_NoClose // PURPOSE: Derivation of CFileIO that does not close the file when destroyed. // NOTES: N.B. Not polymorphic -- do NOT use through base class pointer. // class CFileIO_NoClose : public CFileIO { private: // Prevent default copy constructor and operator=() CFileIO_NoClose(const CFileIO_NoClose &FI); const CFileIO_NoClose &operator=(const CFileIO_NoClose &FI); public: CFileIO_NoClose(HANDLE hFile); ~CFileIO_NoClose(); }; #if 0 //=============================================================================================== // CLASS: CFileIO_Pipe // PURPOSE: Class wrapper around a Win32 pipe. // NOTES: Poor encapsulation as internal CFileIO objects are returned. // class CFileIO_Pipe { private: CFileIO m_ReadPipe; CFileIO m_WritePipe; private: // Prevent default copy constructor and operator=() CFileIO_Pipe(const CFileIO_Pipe &); const CFileIO_Pipe &operator=(const CFileIO_Pipe &); public: CFileIO_Pipe(); ~CFileIO_Pipe(); BOOL Create(BOOL bInheritable); CFileIO *GetReadPipe(); CFileIO *GetWritePipe(); }; #endif #endif // INC_FileIO_HPP stimfit-0.15.8/src/libstfio/abf/axon/Common/colors.h0000775000175000017500000000354713062445067017233 00000000000000//**************************************************************************************** // // Copyright (c) 1993-1997 Axon Instruments. // All rights reserved. // //**************************************************************************************** // HEADER: COLORS.H // PURPOSE: Contains RGB definitions for VGA solid colors. #ifndef __COLORS_H__ #define __COLORS_H__ #ifndef RGB #define RGB(r,g,b) ((DWORD)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16))) #endif // // MS name #ifndef RGB_BLACK #define RGB_WHITE RGB(255,255,255) // White #define RGB_VLTGRAY RGB(224,224,224) #define RGB_LTGRAY RGB(192,192,192) // Silver #define RGB_DKGRAY RGB(128,128,128) // Gray #define RGB_VDKGRAY RGB(96,96,96) #define RGB_BLACK RGB(0,0,0) // Black #define RGB_VLTYELLOW RGB(255,255,192) // #define RGB_LTYELLOW RGB(255,255,128) // #define RGB_YELLOW RGB(255,255,0) // Yellow #define RGB_ORANGE RGB(255,128,0) // ???? #define RGB_DKYELLOW RGB(128,128,0) // Olive? #define RGB_BLUE RGB(0,0,255) // Blue #define RGB_LTBLUE RGB(0,255,255) // Cyan #define RGB_DKBLUE RGB(0,0,128) // Navy #define RGB_BLUEGRAY RGB(0,128,128) // Teal #define RGB_AQUAMARINE RGB(64,128,128) // #define RGB_PURPLE RGB(64,0,128) // #define RGB_DKRED RGB(128,0,0) // Maroon #define RGB_MAUVE RGB(128,0,128) // Purple #define RGB_RED RGB(255,0,0) // Red #define RGB_PINK RGB(255,0,128) // ???? #define RGB_LTPINK RGB(255,0,255) // Magenta or Fuschia #define RGB_GREEN RGB(0,255,0) // Lime #define RGB_DKGREEN RGB(0,128,0) // MS-Green #endif // RGB_BLACK #endif /* __COLORS_H__ */ stimfit-0.15.8/src/libstfio/abf/axon/Common/adcdac.h0000775000175000017500000000345513062445067017127 00000000000000/************************************************************************************************ ** ** Copyright (c) 1994-1997 Axon Instruments. ** All rights reserved. ** ************************************************************************************************* ** HEADER: ADCDAC.H ** PURPOSE: Contains #defines for working with ADC and DAC values. ** AUTHOR: BHI Jul 1994 */ #ifndef INC_ADCDAC_H #define INC_ADCDAC_H // // ADC values are 16 bit integers collected from Analog-to-Digital converters // #define ADC_MAX 32767 #define ADC_MIN -32768 typedef short ADC_VALUE; // // DAC values are 16 bit integers for output by Digital-to-Analog converters // #define DAC_MAX 32767 #define DAC_MIN -32768 typedef short DAC_VALUE; // // Define a linked list structure for holding acquisition buffers. // struct DATABUFFER { UINT uNumSamples; // Number of samples in this buffer. UINT uFlags; // Flags discribing the data buffer. ADC_VALUE *pnData; // The buffer containing the data. BYTE *psDataFlags; // Flags split out from the data buffer. DATABUFFER *pNextBuffer; // Next buffer in the list. DATABUFFER *pPrevBuffer; // Previous buffer in the list. }; typedef DATABUFFER *PDATABUFFER; // // Define a linked list structure for holding floating point acquisition buffers. // struct FLOATBUFFER { UINT uNumSamples; // Number of samples in this buffer. UINT uFlags; // Flags discribing the data buffer. float *pfData; // The buffer containing the data. FLOATBUFFER *pNextBuffer; // Next buffer in the list. FLOATBUFFER *pPrevBuffer; // Previous buffer in the list. }; typedef FLOATBUFFER *PFLOATBUFFER; #endif // INC_ADCDAC_H stimfit-0.15.8/src/libstfio/abf/axon/Common/axodebug.h0000775000175000017500000003230113062445067017516 00000000000000//****************************************************************************** // // Copyright (c) 1993-1997 Axon Instruments. // All rights reserved. // //****************************************************************************** // HEADER: AXODEBUG.H // PURPOSE: Contains utility macros and defines for Axon development debugging. // AUTHOR: BHI Oct 1993 // // Debugging functions in WINDOWS.H // BOLL WINAPI IsWindow(HWND hWnd); // BOOL WINAPI IsGDIObject(HGDIOBJ hobj); // BOOL WINAPI IsBadReadPtr(const void *lp, UINT cb); // BOOL WINAPI IsBadWritePtr(void *lp, UINT cb); // BOOL WINAPI IsBadHugeReadPtr(const void _huge* lp, DWORD cb); // BOOL WINAPI IsBadHugeWritePtr(void _huge* lp, DWORD cb); // BOOL WINAPI IsBadCodePtr(FARPROC lpfn); // BOOL WINAPI IsBadStringPtr(const void *lpsz, UINT cchMax); // void WINAPI FatalExit(int nCode); // (nCode = -1 -> stack overflow) // void WINAPI FatalAppExit(UINT, LPCSTR); // void WINAPI DebugBreak(void); // void WINAPI OutputDebugString(LPCSTR); #ifndef __AXODEBUG_H__ #define __AXODEBUG_H__ #include #if defined(__WIN32__) && !defined(__MINGW32__) #include #endif #ifdef __cplusplus extern "C" { #endif // Setup the debug reporting callback. void AXODBG_Initialize(void); // Protected call to DebugBreak() that only breaks if a debugger is running. BOOL AXODBG_DebugBreak(void); // Prints a printf formatted string to the debug context. #ifdef __MINGW32__ int AXODBG_printf(char *lpsz, ... ); #else int cdecl AXODBG_printf(char *lpsz, ... ); #endif // Set a prefix string used for all subsequent calls to AXODBG_printf() void AXODBG_SetTracePrefix(char const * szNewTracePrefix); // You can set the prefix to anything, but usually you will want to set it to include the EXE and/or DLL name. // This function sets the prefix to "{App=foo} {Mod=bar} " // Call this function once from within your DllMain(), WinMain() or CWinApp::InitInstance() void AXODBG_SetTracePrefixFromModuleHandle(HMODULE mod_handle); // Prints a textual description of a WIN32 system error to the debug context. int AXODBG_ShowSystemError(DWORD dwSystemError); UINT AXODBG_GetSystemErrorText(DWORD dwSystemError, LPSTR pszBuf, UINT uMaxLen); // Returns TRUE if the given pointer is aligned on a multiple of the passed data size. BOOL AXODBG_IsAligned( void *pv, UINT uDataSize ); // Returns TRUE if the given pointer is not on the stack (rough check). // Typically this function should be used in the constructor of large objects to check // that they are not being allocated on the stack. // e.g. // CSomeObject::CSomeObject() // { // MEMBERASSERT(); // ASSERT_NOTONSTACK(this); // } BOOL AXODBG_NotOnStack( void *pv ); // Assertion processing. void AXODBG_assert(LPCSTR psExp, LPCSTR psFile, int nLine); void AXODBG_ErrorMsg(LPCSTR psFile, int nLine, LPCSTR pszFormat, ...); void AXODBG_SystemErrorMsg(DWORD dwSystemError, LPCSTR psFile, int nLine); // Define our own ASSERT macro that is only compiled into a _DEBUG build. // This gives us more control over where the error output gets displayed // than the default runtime version. #if !defined(ASSERT) #ifdef _STFDEBUG /* #define ASSERT(exp) (void)( (exp) || (AXODBG_assert(#exp, __FILE__, __LINE__), 0) )*/ #define ASSERT(exp) assert(exp) #else // #define ASSERT(exp) ((void)0) #define ASSERT(exp) assert(exp) #endif #endif // ASSERT // // The ERRORMSG macros are like a combination of an ASSERT and a TRACE macro. // They are typically useful for marking a code path that should never get executed // (e.g. default clause of switch statement) with a debug time message and the // option to break to the debugger. // #if !defined(ERRORMSG) #ifdef _STFDEBUG #define ERRORMSG(msg) AXODBG_ErrorMsg(__FILE__, __LINE__, msg) #define ERRORMSG1(msg,a) AXODBG_ErrorMsg(__FILE__, __LINE__, msg, a) #define ERRORMSG2(msg,a,b) AXODBG_ErrorMsg(__FILE__, __LINE__, msg, a, b) #define ERRORMSG3(msg,a,b,c) AXODBG_ErrorMsg(__FILE__, __LINE__, msg, a, b, c) #define ERRORMSG4(msg,a,b,c,d) AXODBG_ErrorMsg(__FILE__, __LINE__, msg, a, b, c, d) #define ERRORMSG5(msg,a,b,c,d,e) AXODBG_ErrorMsg(__FILE__, __LINE__, msg, a, b, c, d, e) #else #define ERRORMSG(msg) ((void)0) #define ERRORMSG1(msg,a) ((void)0) #define ERRORMSG2(msg,a,b) ((void)0) #define ERRORMSG3(msg,a,b,c) ((void)0) #define ERRORMSG4(msg,a,b,c,d) ((void)0) #define ERRORMSG5(msg,a,b,c,d,e) ((void)0) #endif #endif // ASSERT #if defined(_WINDOWS) && !defined(__MINGW32__) #define HWNDASSERT(hWnd) ASSERT(IsWindow(hWnd)) #define IsBadPtr(p) IsBadWritePtr((void *)(p), sizeof(*(p))) #define IsBadArray(p,n) IsBadWritePtr((void *)(p), sizeof(*(p))*(n)) #define RPTRASSERT(p) ASSERT(!IsBadReadPtr((const void *)(p), sizeof(*(p)))) #define FNPTRASSERT(p) ASSERT(!IsBadCodePtr((FARPROC)(p))) #define LPSZASSERT(p) ASSERT(!IsBadStringPtr(p, (UINT)(-1))) #else #define IsBadPtr(p) (p==NULL) #define IsBadArray(p,n) IsBadPtr(p) #define RPTRASSERT(p) ASSERT(!IsBadPtr(p)) #define FNPTRASSERT(p) ASSERT(!IsBadPtr(p)) #define LPSZASSERT(p) ASSERT(!IsBadPtr(p)) #endif #define WPTRASSERT(p) ASSERT(!IsBadPtr(p)) #define MEMBERASSERT() WPTRASSERT(this) #define ARRAYASSERT(p,n) ASSERT(!IsBadArray(p, n)) //================================================================================================================== // MACRO: // RARRAYASSERT(p,n) // WARRAYASSERT(p,n) // PURPOSE: // Validate an array by checking the caller has read access to the array. // PARAMETERS: // p The array // n The number of elements in the array (NOT the size in bytes) // USAGE: // int array[10]; // RARRAYASSERT(array, 10); #if defined(_WINDOWS) && !defined(__MINGW32__) #define RARRAYASSERT(p,n) ASSERT( ((p) != NULL) && !IsBadReadPtr( (const void *)(p), sizeof(*(p))*(n) ) ) #define WARRAYASSERT(p,n) ASSERT( ((p) != NULL) && !IsBadWritePtr( (void *)(p), sizeof(*(p))*(n) ) ) #else #define RARRAYASSERT(p,n) ASSERT(!IsBadPtr(p)) #define WARRAYASSERT(p,n) ASSERT(!IsBadPtr(p)) #endif //================================================================================================================== // VERIFY is an ASSERT macro that always evaluates the given expression, but // only actually ASSERT's in a DEBUG build. #if !defined(VERIFY) #ifdef _STFDEBUG #define VERIFY(exp) ASSERT(exp) #else #define VERIFY(exp) (exp) #endif #endif //================================================================================================================== // The DEBUG_ONLY macro only expands out the expression in a DEBUG build. #if !defined(DEBUG_ONLY) #ifdef _STFDEBUG #define DEBUG_ONLY(exp) (exp) #else #define DEBUG_ONLY(exp) ((void)0) #endif #endif //================================================================================================================== // Trace functions that are only expanded for debug builds and when the AXODBG_TRACE flag is set. #if !defined(TRACE) #if (defined(_STFDEBUG) || defined(AXODBG_TRACE)) #define TRACE(s) AXODBG_printf(s) #define DLLTRACE(s) AXODBG_printf(s) #define TRACE1(s, a) AXODBG_printf(s, a) #define TRACE2(s, a, b) AXODBG_printf(s, a, b) #define TRACE3(s, a, b, c) AXODBG_printf(s, a, b, c) #define TRACE4(s, a, b, c, d) AXODBG_printf(s, a, b, c, d) #define TRACE5(s, a, b, c, d, e) AXODBG_printf(s, a, b, c, d, e) #else #define TRACE(s) ((void)0) #define DLLTRACE(s) ((void)0) #define TRACE1(s, a) ((void)0) #define TRACE2(s, a, b) ((void)0) #define TRACE3(s, a, b, c) ((void)0) #define TRACE4(s, a, b, c, d) ((void)0) #define TRACE5(s, a, b, c, d, e) ((void)0) #endif #endif #define TRACE_INT(e) TRACE1(#e "=%d\n", e) #define TRACE_FLOAT(e) TRACE1(#e "=%g\n", e) #define TRACE_STRING(e) TRACE1(#e "=%s\n", e) //================================================================================================================== // SHOW_SYSTEM_ERROR will only dump a text description of a system error in a DEBUG build. // #ifdef _STFDEBUG #define SHOW_SYSTEM_ERROR(dwError) AXODBG_ShowSystemError(dwError) #else #define SHOW_SYSTEM_ERROR(dwError) ((void)0) #endif //================================================================================================================== // VERIFY_SYSTEM_CALL will only dump a text description of a system error in a DEBUG build. // #ifdef _STFDEBUG #define VERIFY_SYSTEM_CALL(exp) (exp || (AXODBG_SystemErrorMsg(0, __FILE__, __LINE__), 0)) #else #define VERIFY_SYSTEM_CALL(exp) (exp) #endif //================================================================================================================== // ASSERT_ISALIGNED will throw an assertion error if the pointer is not aligned on a boundary of its data type. // #ifdef _STFDEBUG #define ASSERT_ISALIGNED(p) ASSERT(AXODBG_IsAligned(p, sizeof(*p))) #define ASSERT_NOTONSTACK(p) ASSERT(AXODBG_NotOnStack(p)) #else #define ASSERT_ISALIGNED(p) ((void)0) #define ASSERT_NOTONSTACK(p) ((void)0) #endif //================================================================================================================== // The following macros set and clear, respectively, given bits // of the C runtime library debug flag, as specified by a bitmask. // // Valid flags include: (default value) // _CRTDBG_ALLOC_MEM_DF (on) // ON: Enable debug heap allocations and use of memory block type identifiers, such as _CLIENT_BLOCK. // OFF: Add new allocations to heap's linked list, but set block type to _IGNORE_BLOCK. // _CRTDBG_CHECK_ALWAYS_DF (off) // ON: Call _CrtCheckMemory at every allocation and deallocation request. // OFF: _CrtCheckMemory must be called explicitly. // _CRTDBG_CHECK_CRT_DF (off) // ON: Include _CRT_BLOCK types in leak detection and memory state difference operations. // OFF: Memory used internally by the run-time library is ignored by these operations. // _CRTDBG_DELAY_FREE_MEM_DF (off) // ON: Keep freed memory blocks in the heap's linked list, assign them the _FREE_BLOCK type, and fill them with the byte value 0xDD. // OFF: Do not keep freed blocks in the heap's linked list. // _CRTDBG_LEAK_CHECK_DF (off) // ON: Perform automatic leak checking at program exit via a call to _CrtDumpMemoryLeaks and generate an error report if the application failed to free all the memory it allocated. // OFF: Do not automatically perform leak checking at program exit. // #ifdef _STFDEBUG #define SET_CRT_DEBUG_FIELD(a) \ _CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) #define CLEAR_CRT_DEBUG_FIELD(a) \ _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) #else #define SET_CRT_DEBUG_FIELD(a) ((void)0) #define CLEAR_CRT_DEBUG_FIELD(a) ((void)0) #endif //================================================================================================================== // HEAPASSERT checks the integrity of the heap managed by the run-time library. // #ifdef _STFDEBUG #define HEAPASSERT() ASSERT(_CrtCheckMemory()) #else #define HEAPASSERT() ((void)0) #endif //================================================================================================================== // Flags supported by AXODBG_SetDebugFlag. #define AXODBG_REPORT_FLAG 0x80000000 // If this flag is set the current flags are returned. #define AXODBG_BREAK_ON_ASSERT 0x00000001 // If set, assertion failures will immediately break to the debugger. // Function to set/get debugging flags modeled after _CrtSetDbgFlag(). DWORD AXODBG_SetDebugFlag(DWORD dwFlags); #ifdef _STFDEBUG #define AXODBG_SET_DEBUG_FIELD(a) \ AXODBG_SetDebugFlag((a) | AXODBG_SetDebugFlag(AXODBG_REPORT_FLAG)) #define AXODBG_CLEAR_DEBUG_FIELD(a) \ AXODBG_SetDebugFlag(~(a) & AXODBG_SetDebugFlag(AXODBG_REPORT_FLAG)) #else #define AXODBG_SET_DEBUG_FIELD(a) ((void)0) #define AXODBG_CLEAR_DEBUG_FIELD(a) ((void)0) #endif //================================================================================================================== // Debug time only call to AXODBG_DebugBreak() #ifdef _STFDEBUG #define AXODBG_DEBUGBREAK() AXODBG_DebugBreak() #else #define AXODBG_DEBUGBREAK() ((BOOL)FALSE) #endif #ifdef __cplusplus } #endif #ifdef __cplusplus //================================================================================================================== // Compile time assert for static expressions // (e.g. STATIC_ASSERT(sizeof(MyStruct)==256); ) // #define STATIC_ASSERT(expr) C_ASSERT(expr) #endif #endif /* __AXODEBUG_H__ */ stimfit-0.15.8/src/libstfio/abf/axon/Common/axodefn.h0000775000175000017500000001443013062445067017347 00000000000000/************************************************************************************************ ** ** Copyright (c) 1993-1997 Axon Instruments. ** All rights reserved. ** ************************************************************************************************* ** HEADER: AXODEFN.H ** PURPOSE: Contains standard Axon definitions and prototypes. ** AUTHOR: BHI Oct 1993 ** NOTES: * The following compilers are supported: ** - Microsoft C/C++ (COMPILER = "Mircosoft") ** - Borland C/C++ (COMPILER = "Borland") ** * The following platforms are supported: ** - MSDOS (if _DOS #defined) ** - WIN32 (if _WIN32 #defined) */ #ifndef INC_AXODEFN_H #define INC_AXODEFN_H #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #undef COMPILER /*============================================================================================== ** Microsoft C compiler */ #ifdef _MSC_VER #ifndef __STF__ #define COMPILER "Microsoft" /* Pragmas to cutdown on MSVC warnings. */ #pragma warning(disable:4001) // warning C4001: nonstandard extension 'single line comment' was used #pragma warning(disable:4100) // warning C4100: 'lParam' : unreferenced formal parameter #pragma warning(disable:4206) // warning C4206: nonstandard extension used : translation unit is empty #pragma warning(disable:4505) // warning C4505: 'GetFont' : unreferenced local function has been removed #pragma warning(disable:4704) // warning C4704: 'AXODBG_WriteProtectSelector' : in-line assembler precludes global optimizations #pragma warning(disable:4705) // warning C4705: statement has no effect #pragma warning(disable:4710) // warning C4710: function 'FunctionName(void)' not expanded #if !defined(_M_IX86) && defined(_M_I86) #define _M_IX86 _M_I86 // Define the MSVC2x _M_IX86 symbol. #endif #if !defined(_M_I86) && defined(_M_IX86) #define _M_I86 _M_IX86 // Define the MSVC1x _M_I86 symbol. #endif #if !defined(_M_I86LM) && !defined(_WIN32) #error "ERROR: Large memory model must be used for 16 bit compiles." #endif #endif #endif /* _MSC_VER */ /*=============================================================================================== ** Borland C/C++ compiler. */ #ifdef __BORLANDC__ #define COMPILER "Borland" // Compatibility #defines for Borland C/C++ to behave like MSVC. #define _M_I86 // Assume that Borland ONLY targets 80X86 processors. #define _M_IX86 300 // Assume that Borland ONLY targets 80X86 processors. #ifdef _Windows #define _WINDOWS #endif #ifdef __WIN32__ #define _WIN32 #elif !defined(__LARGE__) #error "ERROR: Large memory model must be used for 16 bit compiles." #endif #ifdef __DLL__ #ifdef _WINDOWS #define _WINDLL #else #define _DLL #endif #endif #endif /* __BORLANDC__ */ /*=============================================================================================== ** Microsoft Resource Compiler */ #ifdef RC_INVOKED #define COMPILER "Resource Compiler" #define _WINDOWS #endif /* RC_INVOKED */ /*=============================================================================================== ** Add other compiler dependant code HERE! ** Treat everything else as gcc */ #ifndef COMPILER #define COMPILER "gcc" #include "unix.h" #endif //=============================================================================================== // // If compiler is unknown, abort with an error. // #ifndef COMPILER #error "Compiler not recognised... check AXODEFN.H" #endif //=============================================================================================== // AXOAPI should be used in the declaration of all cross platform API functions. // e.g. void AXOAPI ABF_Initialize(void); #ifdef _WINDOWS #define AXOAPI WINAPI #else #define AXOAPI PASCAL #endif //=============================================================================================== // MACRO: ELEMENTS_IN // PURPOSE: Returns the count of the elements in an array. // NOTES: *only* use this on an array. // Do not use this on a pointer or it will not return the correct value. // #ifndef ELEMENTS_IN #define ELEMENTS_IN(p) (sizeof(p)/sizeof((p)[0])) #endif //=============================================================================================== // // 16/32 bit compatibility #defines // #if defined(_WIN32) #ifndef __STF__ #define PLATFORM "Win32" #ifndef _WINDOWS #define _WINDOWS #endif #ifndef __MINGW32__ #include "..\common\win32.h" #endif #endif #elif defined(_DOS) #define PLATFORM "DOS" #include "..\common\msdos.h" #elif defined(_WINDOWS) #error "ERROR: WIN16 is not supported any more." #elif defined(__linux__) #define PLATFORM "Unix" #elif defined(__APPLE__) #define PLATFORM "Mac" #else // Treat everything else as Unix #define PLATFORM "Unix" #endif //======================================================================================= // Macros used to stringize an argument. // // Helper macro for the stringize macro. // Sometimes a nested call is necessary to get correct expansion by the preprocessor. #ifndef AX_STRINGIZE_HELPER #define AX_STRINGIZE_HELPER(a) #a #endif #ifndef AX_STRINGIZE #define AX_STRINGIZE(a) AX_STRINGIZE_HELPER(a) #endif // This macro formats the module and line number to prefix the message in the way that // MSVC likes so that you can simply double click on the line to go to the location. #ifndef AX_FILELINEMSG #define AX_FILELINEMSG(msg) __FILE__ "(" AX_STRINGIZE(__LINE__) ") : " msg #endif // Usage: // #pragma message( __FILE__ "(" AX_STRINGIZE(__LINE__) ") : warning - MFC version change.") // or // #pragma message( AX_FILELINEMSG("warning - MFC version change.") ) // //======================================================================================= // Macros to declare and use string constants based on a symbol. #if !defined(DECLARE_STR) && !defined(USE_STR) #define DECLARE_STR(Name) static const char s__sz##Name[] = #Name #define USE_STR(Name) s__sz##Name #endif #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __AXODEFN_H__ */ stimfit-0.15.8/src/libstfio/abf/axon/Common/FileReadCache.hpp0000775000175000017500000000444413062445067020666 00000000000000//*********************************************************************************************** // // Copyright (c) 1996-1997 Axon Instruments. // All rights reserved. // //*********************************************************************************************** // HEADER: FileReadCache.HPP // PURPOSE: Contains class definition for CFileReadCache for creating and maintaining a BufferedArray array. // AUTHOR: BHI Dec 1996 // #ifndef INC_FILEREADCACHE_HPP #define INC_FILEREADCACHE_HPP #include "./../Common/FileIO.hpp" #include //----------------------------------------------------------------------------------------------- // CFileReadCache class definition class CFileReadCache { private: UINT m_uItemSize; // Size of all data items (structures) CFileIO m_File; // DOS file handle to the read-only data. UINT m_uItemCount; // Number of items available in the file LONGLONG m_llFileOffset; // Start offset in the file. UINT m_uCacheSize; UINT m_uCacheStart; UINT m_uCacheCount; boost::shared_array m_pItemCache; private: // Unimplemented default member functions. // Declare but don't define copy constructors to prevent use of defaults. CFileReadCache(const CFileReadCache &CS); const CFileReadCache &operator=(const CFileReadCache &CS); private: BOOL LoadCache(UINT uEntry); public: // Public member functions CFileReadCache(); ~CFileReadCache(); // Call this function to initialize the DTB and the temp file. BOOL Initialize(UINT uItemSize, UINT uCacheSize, FILEHANDLE hFile, LONGLONG llOffset, UINT uItems ); // Get one or more items from the array. BOOL Get( UINT uFirstEntry, void *pItem, UINT uEntries ); // Get a pointer to one entry in the cache. void *Get( UINT uEntry ); // Get the count of items in the file. UINT GetCount() const; }; //=============================================================================================== // PROCEDURE: GetCount // PURPOSE: Returns the current count of ITEMs, both cached and written to file. // inline UINT CFileReadCache::GetCount() const { // MEMBERASSERT(); return m_uItemCount; } #endif // INC_FILEREADCACHE_HPP stimfit-0.15.8/src/libstfio/abf/axon/Common/unix.h0000775000175000017500000001553213062445067016712 00000000000000// Windows macros to compile on Unix machines. // Taken from MSDOS.H and from various wine headers. // Only the absolute minimum has been integrated. // 2007, CSH, University of Freiburg // Error return from SetFilePointer() #ifndef INVALID_SEEK_VALUE #define INVALID_SEEK_VALUE (0xFFFFFFFF) #endif #define FILE_NULL NULL #define IDS_ENOMESSAGESTR 4 #ifdef __cplusplus extern "C" { #endif #if defined(_MSC_VER) #include #include typedef HANDLE FILEHANDLE; #include "resource.h" #define __LITTLE_ENDIAN__ #else #ifdef __APPLE__ #include #elif defined(__MINGW32__) #define __LITTLE_ENDIAN__ #else #include #endif #ifndef INVALID_HANDLE_VALUE #define INVALID_HANDLE_VALUE ((HANDLE)0xFFFFFFFF) #endif #include "../AxAbfFio32/AxAbffio32.h" #include typedef FILE* FILEHANDLE; // // Commonly used typedefs & constants from windows.h. // typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned ABFLONG DWORD; typedef unsigned ABFLONG *LPDWORD; typedef unsigned int UINT; typedef int INT; typedef int BOOL; typedef long *PLONG; typedef unsigned char *LPBYTE; typedef void *LPVOID; typedef const void *LPCVOID; // // Basics // #ifndef VOID #define VOID void typedef char CHAR; typedef short SHORT; typedef long LONG; #endif // // UNICODE (Wide Character) types // #ifndef _MAC typedef wchar_t WCHAR; // wc, 16-bit UNICODE character #else // some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char typedef unsigned short WCHAR; // wc, 16-bit UNICODE character #endif typedef WCHAR *PWCHAR; typedef WCHAR *LPWCH, *PWCH; typedef const WCHAR *LPCWCH, *PCWCH; typedef WCHAR *NWPSTR; typedef WCHAR *LPWSTR, *PWSTR; typedef const WCHAR *LPCWSTR, *PCWSTR; // // ANSI (Multi-byte Character) types // typedef CHAR *PCHAR; typedef CHAR *LPCH, *PCH; typedef const CHAR *LPCCH, *PCCH; typedef CHAR *NPSTR; typedef CHAR *LPSTR, *PSTR; typedef const CHAR *LPCSTR, *PCSTR; // // Neutral ANSI/UNICODE types and macros // #if defined(__MINGW32__) #include #include #include #else #if defined(UNICODE) // r_winnt #ifndef _TCHAR_DEFINED typedef WCHAR TCHAR, *PTCHAR; typedef WCHAR TBYTE , *PTBYTE ; #define _TCHAR_DEFINED #endif /* !_TCHAR_DEFINED */ typedef LPWSTR LPTCH, PTCH; typedef LPWSTR PTSTR, LPTSTR; typedef LPCWSTR LPCTSTR; typedef LPWSTR LP; #define __TEXT(quote) L##quote // r_winnt #else /* UNICODE */ // r_winnt #ifndef _TCHAR_DEFINED typedef char TCHAR, *PTCHAR; typedef unsigned char TBYTE , *PTBYTE ; #define _TCHAR_DEFINED #endif /* !_TCHAR_DEFINED */ typedef LPSTR LPTCH, PTCH; typedef LPSTR PTSTR, LPTSTR; typedef LPCSTR LPCTSTR; #define __TEXT(quote) quote // r_winnt #endif /* UNICODE */ // r_winnt // Handle declarations. typedef void *HANDLE; typedef HANDLE HINSTANCE; typedef HINSTANCE HMODULE; typedef void *LPOVERLAPPED; typedef void *LPSECURITY_ATTRIBUTES; typedef long long LONGLONG; #if defined(_WIN64) typedef unsigned __int64 UINT_PTR; #else typedef unsigned int UINT_PTR; #endif #endif // #define DWORD_PTR UINT_PTR #define FILE_BEGIN 0 #define FILE_CURRENT 1 #define FILE_END 2 #define FILE_ATTRIBUTE_NORMAL 0x00000080 #define GENERIC_READ 0x80000000 #define GENERIC_WRITE 0x40000000 #define CREATE_NEW 1 #define CREATE_ALWAYS 2 #define OPEN_EXISTING 3 #define FILE_SHARE_READ 0x00000001L #define NO_ERROR 0 #define ERROR_HANDLE_EOF 38 #define TRUE 1 #define FALSE 0 #define LOBYTE(w) ((BYTE)((DWORD_PTR)(w) & 0xFF)) #define HIBYTE(w) ((BYTE)((DWORD_PTR)(w) >> 8)) #define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xFFFF)) #define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16)) #ifndef _MAX_PATH #define _MAX_DRIVE 3 #define _MAX_FNAME 256 #define _MAX_DIR _MAX_FNAME #define _MAX_EXT _MAX_FNAME #define _MAX_PATH 260 #endif #define ERROR_TOO_MANY_OPEN_FILES 4 // #define __stdcall __attribute__((__stdcall__)) #if !defined(__MINGW32__) #define __stdcall #endif // gcc uses cdecl as a standard: #define cdecl #define WINAPI __stdcall #ifndef GUID_DEFINED typedef struct _GUID { // TODO: for WIN64 this need to be redefined unsigned int Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[ 8 ]; } GUID; #define GUID_DEFINED #endif void _splitpath(const char* inpath, char * drv, char * dir, char* fname, char * ext ); int _strnicmp( LPCSTR str1, LPCSTR str2, size_t n ); void _makepath( char * path, const char * drive, const char *directory, const char * filename, const char * extension ); #if !defined(__MINGW32__) /* 64 bit number of 100 nanoseconds intervals since January 1, 1601 */ typedef struct _FILETIME { #ifdef __BIG_ENDIAN__ DWORD dwHighDateTime; DWORD dwLowDateTime; #else DWORD dwLowDateTime; DWORD dwHighDateTime; #endif } FILETIME, *PFILETIME, *LPFILETIME; typedef struct _SYSTEMTIME{ WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME; #endif // __MINGW32__ #endif // _MSC_VER extern HINSTANCE g_hInstance; // // Function wrappers // int WINAPI AXODBG_printf(char *lpsz, ... ); BOOL WINAPI c_WriteFile( FILEHANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, LPDWORD bytesWritten, LPOVERLAPPED overlapped ); FILEHANDLE WINAPI c_CreateFile( LPCSTR filename, DWORD access, DWORD sharing, LPSECURITY_ATTRIBUTES sa, DWORD creation, DWORD attributes_, HANDLE templ); DWORD WINAPI c_SetFilePointer( FILEHANDLE hFile, LONG distance, LONG *highword, DWORD method ); BOOL WINAPI c_ReadFile( FILEHANDLE hFile, LPVOID buffer, DWORD bytesToRead, LPDWORD bytesRead, LPOVERLAPPED overlapped ); DWORD WINAPI c_GetFileSize( FILEHANDLE hFile, LPDWORD filesizehigh ); BOOL WINAPI c_CloseHandle( FILEHANDLE handle ); INT WINAPI c_LoadString( HINSTANCE instance, UINT resource_id, LPSTR buffer, INT buflen ); #ifdef __cplusplus } #endif stimfit-0.15.8/src/libstfio/abf/axon/AxAtfFio32/0000775000175000017500000000000013315356572016206 500000000000000stimfit-0.15.8/src/libstfio/abf/axon/AxAtfFio32/axatffio32.h0000775000175000017500000001122113062445067020242 00000000000000/****************************************************************************\ * * * Written 1990 - 1996 by AXON Instruments Inc. * * * * This file is not protected by copyright. You are free to use, modify * * and copy the code in this file. * * * \****************************************************************************/ #ifndef INC_AXATFFIO32_H #define INC_AXATFFIO32_H #include "../Common/wincpp.hpp" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define VAL_EXTERNBUFSIZE 31 /* anybody calling methods using conversion */ // This is AXATFFIO32.H; a companion file to AXATFFIO32.CPP #define ATF_CURRENTVERSION 1.0 // Length required for I/O buffers #define ATF_MAXCOLUMNS 8000 // maximum size of read & write buffers (each can be this size) #define ATF_MAX_BUFFER_SIZE 65536 // Flags that may be combined and passed in the wFlags to ATF_OpenFile call #define ATF_WRITEONLY 0 #define ATF_READONLY 1 #define ATF_OVERWRTIFEXIST 2 #define ATF_APPENDIFEXIST 4 #define ATF_DONTWRITEHEADER 8 // Value returned as the file handle if the file could not be opened. #define ATF_INVALID_HANDLE -1 // Definitions for error results returned by AXATFFIO32 module #define ATF_SUCCESS 0 #define ATF_ERROR_NOFILE 1001 #define ATF_ERROR_TOOMANYFILES 1002 #define ATF_ERROR_FILEEXISTS 1003 #define ATF_ERROR_BADVERSION 1004 #define ATF_ERROR_BADFILENUM 1005 #define ATF_ERROR_BADSTATE 1006 #define ATF_ERROR_IOERROR 1007 #define ATF_ERROR_NOMORE 1008 #define ATF_ERROR_BADHEADER 1009 #define ATF_ERROR_NOMEMORY 1012 #define ATF_ERROR_TOOMANYCOLS 1013 #define ATF_ERROR_INVALIDFILE 1014 #define ATF_ERROR_BADCOLNUM 1015 #define ATF_ERROR_LINETOOLONG 1016 #define ATF_ERROR_BADFLTCNV 1017 #define ATF_ERROR_NOMESSAGESTR 2000 // These functions are not exported from the DLL version as they are called implicitly on load/unload. BOOL WINAPI ATF_Initialize(HINSTANCE hDLL); void WINAPI ATF_Cleanup(void); //---------------------- Exported Function Definitions ------------------------- BOOL WINAPI ATF_OpenFile(LPCSTR szFileName, UINT uFlags, int *pnColumns, int *pnFile, int *pnError); BOOL WINAPI ATF_CloseFile(int nFile); BOOL WINAPI ATF_SetSeperator(int nFile, BOOL bUseCommas, int *pnError); BOOL WINAPI ATF_IsAppending(int nFile); BOOL WINAPI ATF_RewindFile(int nFile, int *pnError); BOOL WINAPI ATF_CountDataLines(int nFile, long *plNumLines, int *pnError); BOOL WINAPI ATF_GetNumHeaders(int nFile, int *pnHeaders, int *pnError); BOOL WINAPI ATF_WriteHeaderRecord(int nFile, LPCSTR pszText, int *pnError); BOOL WINAPI ATF_SetColumnTitle(int nFile, LPCSTR pszText, int *pnError); BOOL WINAPI ATF_SetColumnUnits(int nFile, LPCSTR pszText, int *pnError); BOOL WINAPI ATF_WriteEndOfLine(int nFile, int *pnError); BOOL WINAPI ATF_WriteDataRecord(int nFile, LPCSTR pszText, int *pnError); BOOL WINAPI ATF_WriteDataComment(int nFile, LPCSTR pszText, int *pnError); BOOL WINAPI ATF_WriteDataRecordArray(int nFile, int nCount, double *pdVals, int *pnError); BOOL WINAPI ATF_WriteDataRecordArrayFloat(int nFile, int nCount, float *pfVals, int *pnError); BOOL WINAPI ATF_WriteDataRecord1(int nFile, double dNum1, int *pnError); BOOL WINAPI ATF_WriteDataRecord1Float(int nFile, float fNum1, int *pnError); BOOL WINAPI ATF_ReadHeaderLine(int nFile, char *psBuf, int nMaxLen, int *pnError); BOOL WINAPI ATF_ReadHeaderNoQuotes(int nFile, char *psBuf, int nMaxLen, int *pnError); BOOL WINAPI ATF_GetColumnTitle(int nFile, int nColumn, char *pszText, int nMaxTxt, int *pnError); BOOL WINAPI ATF_GetColumnUnits(int nFile, int nColumn, char *pszText, int nMaxTxt, int *pnError); BOOL WINAPI ATF_ReadDataRecord(int nFile, char *pszText, int nMaxLen, int *pnError); BOOL WINAPI ATF_ReadDataRecordArray(int nFile, int nCount, double *pdVals, char *pszComment, int nMaxLen, int *pnError); BOOL WINAPI ATF_ReadDataColumn(int nFile, int nColumn, double *pdVal, int *pnError); int WINAPI ATF_BuildErrorText(int nErrorNum, LPCSTR szFileName, char *sTxtBuf, int nMaxLen); BOOL WINAPI ATF_GetFileDateTime(int nFile, long *plDate, long *plTime, int *pnError); #ifdef __cplusplus } #endif #endif /* INC_AXATFFIO32_H */ stimfit-0.15.8/src/libstfio/abf/axon/AxAtfFio32/atfutil.h0000775000175000017500000000204613062445067017751 00000000000000/****************************************************************************\ * * * Written 1990 - 1995 by AXON Instruments Inc. * * * * This file is not protected by copyright. You are free to use, modify * * and copy the code in this file. * * * \****************************************************************************/ // // HEADER: ATFUTIL.H Prototypes for functions in ATFUTIL.CPP // AUTHOR: BHI Feb 1995 #ifndef __ATFUTIL_H__ #define __ATFUTIL_H__ #if !defined(_WINDOWS) || defined(__MINGW32__) int LoadString( HINSTANCE hInstance, int nErrorNum, char *sTxtBuf, UINT uMaxLen); #endif extern HINSTANCE g_hInstance; #if defined(_WINDOWS) && !defined(__MINGW32__) #include "./../Common/resource.h" #endif #endif stimfit-0.15.8/src/libstfio/abf/axon/AxAtfFio32/fileio2.cpp0000775000175000017500000006163613062445067020177 00000000000000//*********************************************************************************************** // // Written 1990 - 1996 by AXON Instruments Inc. // // This file is not protected by copyright. You are free to use, modify // and copy the code in this file. // //*********************************************************************************************** // // MODULE: FILEIO.CPP // PURPOSE: Low level routines for buffered file I/O. // // An ANSI C compiler should be used for compilation. // (e.g. CL -c AXATFFIO32.CPP) // #include "../Common/wincpp.hpp" #include "atfintl.h" #include "axatffio32.h" #include #if !defined(_WINDOWS) || defined(__MINGW32__) || defined(__STF__) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif #if defined(_MSC_VER) //=============================================================================================== // FUNCTION: _GetRootDir // PURPOSE: Extracts the root directory of a full or partial path. // FIXFIX: Fix this to cope with UNC names when GetDiskFreeSpace does. // static BOOL _GetRootDir(LPCSTR pszFileName, LPSTR pszRoot, UINT uRootLen) { // Build the path to the drive's root directory. char szRootDir[_MAX_DRIVE+2]; char szFullPath[_MAX_PATH], *pszTitle; GetFullPathNameA(pszFileName, sizeof(szFullPath), szFullPath, &pszTitle); if (!isalpha(szFullPath[0])) return FALSE; sprintf(szRootDir, "%c:\\", szFullPath[0]); strncpy(pszRoot, szRootDir, uRootLen-1); pszRoot[uRootLen-1] = '\0'; return TRUE; } #endif //=============================================================================================== // FUNCTION: _AllocReadWriteBuffer // PURPOSE: Allocate read/write buffers for this file // static BOOL AllocReadWriteBuffer(ATF_FILEINFO *pATF, DWORD dwDesiredAccess) { WPTRASSERT(pATF); // init all settings: pATF->lBufSize = 0L; pATF->lPos = 0L; pATF->lBufReadLimit = 0L; pATF->pszBuf = NULL; pATF->bRead = TRUE; // if querying only: if (dwDesiredAccess == 0) return TRUE; #if defined(_MSC_VER) char szRootDir[_MAX_DRIVE+2]; if (_GetRootDir(pATF->pszFileName, szRootDir, sizeof(szRootDir))) { DWORD dwSectorsPerCluster = 0; DWORD dwBytesPerSector = 0; DWORD dwNumberOfFreeClusters = 0; DWORD dwTotalNumberOfClusters = 0; GetDiskFreeSpaceA(szRootDir, &dwSectorsPerCluster, &dwBytesPerSector, &dwNumberOfFreeClusters, &dwTotalNumberOfClusters); pATF->lBufSize = min((dwSectorsPerCluster * dwBytesPerSector), (long)ATF_MAX_BUFFER_SIZE); ASSERT(pATF->lBufSize > 0); } else pATF->lBufSize = ATF_MAX_BUFFER_SIZE; #else pATF->lBufSize = ATF_MAX_BUFFER_SIZE; #endif // Allocate one more than the size for zero termination. pATF->pszBuf = (char *)calloc(pATF->lBufSize+1, sizeof(char)); if (pATF->pszBuf == NULL) { pATF->lBufSize = 0L; return FALSE; } pATF->lPos = pATF->lBufSize; // empty read buffer pATF->lBufReadLimit = pATF->lBufSize; return TRUE; } //=============================================================================================== // FUNCTION: _FreeReadWriteBuffer // PURPOSE: Free the read/write buffers used by this file; flushes write buffer to disk if necessary // static BOOL FreeReadWriteBuffer(ATF_FILEINFO *pATF) { WPTRASSERT(pATF); DWORD dwBytesWritten = 0; if (!pATF->bRead && pATF->lPos != 0L) #if defined(_MSC_VER) WriteFile(pATF->hFile, pATF->pszBuf, pATF->lPos, &dwBytesWritten, NULL); #else c_WriteFile((FILE*)pATF->hFile, pATF->pszBuf, pATF->lPos, &dwBytesWritten, NULL); #endif if (pATF->pszBuf) free(pATF->pszBuf); pATF->pszBuf = NULL; pATF->lBufSize = 0L; pATF->lPos = 0L; pATF->lBufReadLimit = 0L; pATF->bRead = TRUE; return TRUE; } //=============================================================================================== // FUNCTION: _CreateFileBuf // PURPOSE: Buffered version of CreateFile - creates appropriate buffers // PARAMETERS: // pATF Pointer to ATF_FILEINFO structure containing ATF state information (just filename at this point!) // ... CreateFile parms which we ignore (missing lpFileName - derived from pATF), except // for dwDesiredAccess. If GENERIC_READ or GENERIC_WRITE, we allocate a buffer // RETURNS: Handle of file; INVALID_HANDLE_VALUE if failure; HANDLE CreateFileBuf(ATF_FILEINFO *pATF, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { #if defined(_MSC_VER) pATF->hFile = CreateFileA(pATF->pszFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); #else pATF->hFile = c_CreateFile(pATF->pszFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); #endif if (pATF->hFile != INVALID_HANDLE_VALUE) { // allocate buffer, initialize flags: if (!AllocReadWriteBuffer(pATF, dwDesiredAccess)) { #if defined(_MSC_VER) CloseHandle(pATF->hFile); #else c_CloseHandle((FILE*)pATF->hFile); #endif pATF->hFile = INVALID_HANDLE_VALUE; } } return pATF->hFile; } //=============================================================================================== // FUNCTION: _CloseHandleBuf // PURPOSE: Buffered version of CloseHandle - flushes and cleans up buffers // PARAMETERS: // pATF Pointer to ATF_FILEINFO structure containing ATF state information (just filename at this point!) // RETURNS: TRUE on success; FALSE on failure BOOL CloseHandleBuf(ATF_FILEINFO *pATF) { BOOL bReturn = FreeReadWriteBuffer(pATF); #if defined(_MSC_VER) return CloseHandle(pATF->hFile) && bReturn; #else return c_CloseHandle((FILE*)pATF->hFile) && bReturn; #endif } //=============================================================================================== // FUNCTION: WriteFileBuf // PURPOSE: Buffered version of WriteFile // PARAMETERS: // pATF Pointer to ATF_FILEINFO structure containing ATF state information // pvBuffer Buffer containing data to be written // dwBytes Number of bytes to write // pdwWritten Pointer to DWORD used to catch the number of bytes written to the file // lpOverlapped Pointer to overlapped structure used to communicate requests of overlapped i/o (may be NULL) // RETURNS: // TRUE on success // FALSE on failure BOOL WriteFileBuf(ATF_FILEINFO *pATF, LPCVOID pvBuffer, DWORD dwBytes, DWORD *pdwWritten, LPOVERLAPPED lpOverlapped) { WPTRASSERT(pATF); long lBufSize = pATF->lBufSize; char *pszWriteBuf = pATF->pszBuf; // perform write if buffer size is 0: if (lBufSize == 0L) #if defined(_MSC_VER) return WriteFile(pATF->hFile, pvBuffer, dwBytes, pdwWritten, lpOverlapped); #else return c_WriteFile((FILE*)pATF->hFile, pvBuffer, dwBytes, pdwWritten, lpOverlapped); #endif // switch to write mode: if (pATF->bRead) { pATF->bRead = FALSE; pATF->lPos = 0; } // determine free size left in buffer: long lFreeSize = lBufSize - pATF->lPos; ASSERT(lFreeSize > 0L); // move up to a single buffer long lMoveSize = min((DWORD)lFreeSize, dwBytes); memcpy(pszWriteBuf + pATF->lPos, pvBuffer, lMoveSize); pATF->lPos += lMoveSize; // case 1: doesn't fill buffer if (pATF->lPos < lBufSize) { if (pdwWritten) *pdwWritten = dwBytes; return TRUE; } // write initial buffer - results handled in case 2 and 3: DWORD dwBytesWritten = 0; #if defined(_MSC_VER) BOOL bReturn = WriteFile(pATF->hFile, pszWriteBuf, lBufSize, &dwBytesWritten, lpOverlapped); #else BOOL bReturn = c_WriteFile((FILE*)pATF->hFile, pszWriteBuf, lBufSize, &dwBytesWritten, lpOverlapped); #endif // case 2: fills buffer, less than one buffer overflow (write one, move the rest) if (dwBytes - (DWORD)lMoveSize < (DWORD)lBufSize) { if (dwBytes - lMoveSize > 0L) memcpy(pszWriteBuf, ((BYTE *)pvBuffer + lMoveSize), dwBytes-lMoveSize); pATF->lPos = dwBytes - lMoveSize; if (pdwWritten) *pdwWritten = dwBytes; return bReturn; } // case 3: multiple buffer's worth (write mem buffer, write the remainder, reset internals) if (bReturn) { #if defined(_MSC_VER) bReturn = WriteFile(pATF->hFile, ((BYTE *)pvBuffer + lMoveSize), dwBytes - lMoveSize, &dwBytesWritten, lpOverlapped); #else bReturn = c_WriteFile((FILE*)pATF->hFile, ((BYTE *)pvBuffer + lMoveSize), dwBytes - lMoveSize, &dwBytesWritten, lpOverlapped); #endif if (pdwWritten) *pdwWritten = dwBytes; } else if (pdwWritten) *pdwWritten = dwBytesWritten; pATF->lPos = 0L; return bReturn; } //=============================================================================================== // FUNCTION: ReadFileBuf // PURPOSE: Buffered version of ReadFile // PARAMETERS: // pATF Pointer to ATF_FILEINFO structure containing ATF state information // pvBuffer Buffer to contain dwBytes read from file // dwBytes Number of bytes to read // pdwRead Pointer to DWORD used to catch the number of bytes written to the file // lpOverlapped Pointer to overlapped structure used to communicate requests of overlapped i/o (may be NULL) // RETURNS: // TRUE on success (*pdwRead == 0 -> EOF) // FALSE on failure (error condition) BOOL ReadFileBuf(ATF_FILEINFO *pATF, LPVOID pvBuffer, DWORD dwBytes, DWORD *pdwRead, LPOVERLAPPED lpOverlapped) { WPTRASSERT(pATF); // perform read if buffer size is 0: if (pATF->lBufSize == 0L) #if defined(_MSC_VER) return ReadFile(pATF->hFile, pvBuffer, dwBytes, pdwRead, lpOverlapped); #else return c_ReadFile((FILE*)pATF->hFile, pvBuffer, dwBytes, pdwRead, lpOverlapped); #endif // switch to read mode: if (!pATF->bRead) { DWORD dwBytesWritten; // commit current cache: if (pATF->lPos > 0L) #if defined(_MSC_VER) if (!WriteFile(pATF->hFile, pATF->pszBuf, pATF->lPos, &dwBytesWritten, NULL)) #else if (!c_WriteFile((FILE*)pATF->hFile, pATF->pszBuf, pATF->lPos, &dwBytesWritten, NULL)) #endif return FALSE; pATF->bRead = TRUE; pATF->lPos = pATF->lBufSize; pATF->lBufReadLimit = pATF->lBufSize; } DWORD dwBytesRead; BOOL bReturn; long lBufSize = pATF->lBufSize; char *pszReadBuf = pATF->pszBuf; // determine amount left in buffer: long lBytesInBuf = pATF->lBufReadLimit - pATF->lPos; ASSERT(lBytesInBuf >= 0L); // move up to a single buffer long lMoveSize = min((DWORD)lBytesInBuf, dwBytes); if (lMoveSize > 0L) { memcpy(pvBuffer, pszReadBuf + pATF->lPos, lMoveSize); pATF->lPos += lMoveSize; } // case 1: request doesn't run past the end of the buffer if (pATF->lPos < pATF->lBufReadLimit) { if (pdwRead) *pdwRead = dwBytes; return TRUE; } // case 2: request runs past end of buffer, and wants more than (or =) another buffer's worth: // (perform a full read; leaves buffer empty) if (dwBytes - (DWORD)lMoveSize >= (DWORD)pATF->lBufReadLimit) { #if defined(_MSC_VER) bReturn = ReadFile(pATF->hFile, ((BYTE *)pvBuffer + lMoveSize), dwBytes - lMoveSize, &dwBytesRead, lpOverlapped); #else bReturn = c_ReadFile((FILE*)pATF->hFile, ((BYTE *)pvBuffer + lMoveSize), dwBytes - lMoveSize, &dwBytesRead, lpOverlapped); #endif if (pdwRead) *pdwRead = lMoveSize + dwBytesRead; pATF->lPos = lBufSize; pATF->lBufReadLimit = lBufSize; return bReturn; } // case 3: request runs past end of buffer, and wants less than another buffer's worth: // (read in another buffer, copy wanted portion, advance lPos) #if defined(_MSC_VER) bReturn = ReadFile(pATF->hFile, pszReadBuf, lBufSize, &dwBytesRead, lpOverlapped); #else bReturn = c_ReadFile((FILE*)pATF->hFile, pszReadBuf, lBufSize, &dwBytesRead, lpOverlapped); #endif if (bReturn) { pATF->lBufReadLimit = dwBytesRead; int nMoveAmount = min((int)(dwBytes - lMoveSize), pATF->lBufReadLimit); memcpy((BYTE *)pvBuffer + lMoveSize, pszReadBuf, nMoveAmount); if (pdwRead) *pdwRead = lMoveSize + nMoveAmount; pATF->lPos = nMoveAmount; } else { if (pdwRead) *pdwRead = lMoveSize; pATF->lPos = lBufSize; } return bReturn; } //=============================================================================================== // FUNCTION: _SetFilePointerBuf // PURPOSE: Buffered version of SetFilePointer // PARAMETERS: // pATF Pointer to ATF_FILEINFO structure containing ATF state information // lToMove Amount to move from position specified in dwMoveMethod; negative means move backwards // plDistHigh High order word of 64-bit distance to move. Should be NULL // dwMoveMethod Method to move: FILE_BEGIN - move lToMove bytes from beginning of file // FILE_CURRENT - move lToMove bytes from current position // FILE_END - move lToMove bytes from end of file // RETURNS: Offset of new position from beginning of file (0xFFFFFFFF if failure) DWORD SetFilePointerBuf(ATF_FILEINFO *pATF, long lToMove, PLONG plDistHigh, DWORD dwMoveMethod) { WPTRASSERT(pATF); DWORD dwBytesWritten; // move real file position to lPos: if (pATF->bRead) { #if defined(_MSC_VER) if (SetFilePointer(pATF->hFile, pATF->lPos - pATF->lBufReadLimit, NULL, FILE_CURRENT) == 0xFFFFFFFF) #else if (c_SetFilePointer((FILE*)pATF->hFile, pATF->lPos - pATF->lBufReadLimit, NULL, FILE_CURRENT) == 0xFFFFFFFF) #endif return 0xFFFFFFFF; } // flush write buffer if non-empty - this positions the file pointer appropriately. else { if (pATF->lPos != 0L) { #if defined(_MSC_VER) if (!WriteFile(pATF->hFile, pATF->pszBuf, pATF->lPos, &dwBytesWritten, NULL)) #else if (!c_WriteFile((FILE*)pATF->hFile, pATF->pszBuf, pATF->lPos, &dwBytesWritten, NULL)) #endif return 0xFFFFFFFF; } } pATF->bRead = TRUE; pATF->lPos = pATF->lBufSize; pATF->lBufReadLimit = pATF->lBufSize; #if defined(_MSC_VER) return SetFilePointer(pATF->hFile, lToMove, plDistHigh, dwMoveMethod); #else return c_SetFilePointer((FILE*)pATF->hFile, lToMove, plDistHigh, dwMoveMethod); #endif } //=============================================================================================== // FUNCTION: SetLineTerminator // PURPOSE: Sets the line terminator to use on this file. // NOTES: This call assumes that if the file only contains \r characters as // line terminators, that there will be at least one '\r' in the first read of the file. // This should be reasonably safe as the first line of an ATF file should be "ATF\t1.0 \r". // inline char GetLineTerminator(LPSTR psz) { return strchr(psz, '\n') ? '\n' : '\r'; } //=============================================================================================== // FUNCTION: getsUnBuf // PURPOSE: Unbuffered version of gets // RETURNS: ZERO on success // GETS_EOF on EOF // GETS_ERROR on error // static int getsUnBuf(ATF_FILEINFO *pATF, LPSTR pszString, DWORD dwBufSize) { WPTRASSERT(pATF); ASSERT(dwBufSize > 1L); // Must be at least one character and a '\0'; DWORD dwToRead = dwBufSize; // Zero terminate the buffer at the last element and reduce the length count // to be sure that we are returning a zero term8inated string. dwToRead--; pszString[dwToRead] = '\0'; LPSTR pszThisRead = pszString; while (dwToRead > 0L) { // Do the read. DWORD dwBytesToRead = min(MAX_READ_SIZE, dwToRead); DWORD dwBytesRead = 0L; if (!ReadFileBuf(pATF, pszThisRead, dwBytesToRead, &dwBytesRead, NULL)) return GETS_ERROR; if (dwBytesRead == 0L) return GETS_EOF; // Zero terminate the read block after the last byte read. // No bounds problem because we predecremented the string size // up front to allow for a trailing '\0'. pszThisRead[dwBytesRead] = '\0'; // If the line terminator has not been set, set it now. if (pATF->cLineTerm == '\0') pATF->cLineTerm = GetLineTerminator(pszString); // look for a line terminator. LPSTR pszTerm = strchr(pszThisRead, pATF->cLineTerm); if (pszTerm) { // Zero out the terminator and step on past it. *pszTerm++ = '\0'; // Set the count of bytes to back up in the file. int nCount = (pszThisRead + dwBytesRead) - pszTerm; // adjust file position if we find a line terminator before the end of the buffer we have just read; if (nCount < 0) SetFilePointerBuf(pATF, nCount, NULL, FILE_CURRENT); break; } dwToRead -= dwBytesRead; pszThisRead += dwBytesRead; } // Take out the last character if it is '\r'. // (present if \r\n pairs terminate lines) int l = strlen(pszThisRead); if (l && (pszThisRead[l-1]=='\r')) { --l; pszThisRead[l] = '\0'; } return (DWORD(l) < dwBufSize-1) ? 0 : GETS_NOEOL; } //=============================================================================================== // FUNCTION: getsBuf // PURPOSE: Buffered version of gets -- line terminated are removed from the returned string. // RETURNS: ZERO on success // GETS_EOF on EOF // GETS_ERROR on error int getsBuf(ATF_FILEINFO *pATF, LPSTR pszString, DWORD dwBufSize) { WPTRASSERT(pATF); // ******************************************************************************* // check for unbuffered status: if (pATF->lBufSize == 0) return getsUnBuf(pATF, pszString, dwBufSize); DWORD dwToRead = dwBufSize; // ******************************************************************************* // switch to read mode, if necessary: if (!pATF->bRead) { DWORD dwBytesWritten; // commit current cache: if (pATF->lPos > 0) #if defined(_MSC_VER) if (!WriteFile(pATF->hFile, pATF->pszBuf, pATF->lPos, &dwBytesWritten, NULL)) #else if (!c_WriteFile((FILE*)pATF->hFile, pATF->pszBuf, pATF->lPos, &dwBytesWritten, NULL)) #endif return GETS_ERROR; pATF->bRead = TRUE; pATF->lPos = pATF->lBufSize; pATF->lBufReadLimit = pATF->lBufSize; } // ******************************************************************************* // process: dwToRead--; // for terminating 0 pszString[dwToRead] = '\0'; LPSTR pszReturnBuf = pszString; LPSTR pszReadBuf = pATF->pszBuf; while (dwToRead > 0L) { // determine amount left in buffer: long lBytesInBuf = pATF->lBufReadLimit - pATF->lPos; ASSERT(lBytesInBuf >= 0L); // move up to a single buffer long lMoveSize = min(lBytesInBuf, (long)dwToRead); if (lMoveSize > 0) { // look for a line terminator LPSTR pszStart = pszReadBuf + pATF->lPos; LPSTR pszTerm = strchr(pszStart, pATF->cLineTerm); // If found and inside the read range terminate the string and the read. if (pszTerm && (pszTerm < pszStart+lMoveSize)) { *pszTerm = '\0'; lMoveSize = pszTerm - pszStart + 1; // When the counter gets decremented below, the loop will terminate. dwToRead = lMoveSize; } // Copy the data into the return buffer. strncpy(pszReturnBuf, pszStart, lMoveSize); pszReturnBuf[lMoveSize] = '\0'; // Advance the buffer position pATF->lPos += lMoveSize; dwToRead -= lMoveSize; pszReturnBuf += lMoveSize; } else { // read another buffer if done with the current one: if (dwToRead > 0) // ie - we arrived here because lBytesInBuf == 0 { DWORD dwBytesRead; #if defined(_MSC_VER) if (!ReadFile(pATF->hFile, pszReadBuf, pATF->lBufSize, &dwBytesRead, NULL)) #else if (!c_ReadFile((FILE*)pATF->hFile, pszReadBuf, pATF->lBufSize, &dwBytesRead, NULL)) #endif return GETS_ERROR; if (dwBytesRead == 0) return GETS_EOF; if (dwBytesRead != (DWORD)pATF->lBufSize) pATF->lBufReadLimit = dwBytesRead; else pATF->lBufReadLimit = pATF->lBufSize; pATF->lPos = 0; // Zero terminate the read block after the last byte read. // No bounds problem because we allocated the I/O buffer to be one byte // more than pATF->lBufSize. pszReadBuf[dwBytesRead] = '\0'; // If the line terminator has not been set, set it now. if (pATF->cLineTerm == '\0') pATF->cLineTerm = GetLineTerminator(pszReadBuf); } } } // Take out the last character if it is '\r'. // (present if \r\n pairs terminate lines) int l = strlen(pszString); if (l && (pszString[l-1]=='\r')) { l--; pszString[l] = '\0'; } return (DWORD(l) < dwBufSize-1) ? 0 : GETS_NOEOL; } //=============================================================================================== // FUNCTION: putsBuf // PURPOSE: Buffered version of puts. // RETURNS: ZERO on success // GETS_EOF on EOF // GETS_ERROR on error int putsBuf(ATF_FILEINFO *pATF, LPCSTR pszString) { WPTRASSERT(pATF); DWORD dwBytes = strlen(pszString); DWORD dwBytesWritten; // perform write if buffer size is 0: if (pATF->lBufSize == 0L) #if defined(_MSC_VER) return WriteFile(pATF->hFile, pszString, dwBytes, &dwBytesWritten, NULL); #else return c_WriteFile((FILE*)pATF->hFile, pszString, dwBytes, &dwBytesWritten, NULL); #endif // switch to write mode: if (pATF->bRead) { pATF->bRead = FALSE; pATF->lPos = 0; } long lBufSize = pATF->lBufSize; char *pszWriteBuf = pATF->pszBuf; // determine free size left in buffer: long lFreeSize = lBufSize - pATF->lPos; ASSERT(lFreeSize > 0L); // move up to a single buffer long lMoveSize = min((DWORD)lFreeSize, dwBytes); memcpy(pszWriteBuf + pATF->lPos, pszString, lMoveSize); pATF->lPos += lMoveSize; // case 1: doesn't fill buffer if (pATF->lPos < lBufSize) return TRUE; // write initial buffer - results handled in case 2 and 3: #if defined(_MSC_VER) BOOL bReturn = WriteFile(pATF->hFile, pszWriteBuf, lBufSize, &dwBytesWritten, NULL); #else BOOL bReturn = c_WriteFile((FILE*)pATF->hFile, pszWriteBuf, lBufSize, &dwBytesWritten, NULL); #endif // case 2: fills buffer, less than one buffer overflow (write one, move the rest) if (dwBytes - (DWORD)lMoveSize < (DWORD)lBufSize) { pATF->lPos = dwBytes - lMoveSize; if (pATF->lPos > 0L) memcpy(pszWriteBuf, pszString + lMoveSize, pATF->lPos); return bReturn; } // case 3: multiple buffer's worth (write mem buffer, write the remainder, reset internals) if (bReturn) #if defined(_MSC_VER) bReturn = WriteFile(pATF->hFile, pszString + lMoveSize, dwBytes - lMoveSize, &dwBytesWritten, NULL); #else bReturn = c_WriteFile((FILE*)pATF->hFile, pszString + lMoveSize, dwBytes - lMoveSize, &dwBytesWritten, NULL); #endif pATF->lPos = 0L; return bReturn; } stimfit-0.15.8/src/libstfio/abf/axon/AxAtfFio32/axatffio32.cpp0000775000175000017500000015332013062445067020604 00000000000000//*********************************************************************************************** // // Written 1990 - 1997 by AXON Instruments Inc. // // This file is not protected by copyright. You are free to use, modify // and copy the code in this file. // //*********************************************************************************************** // // MODULE: AXATFFIO32.CPP // PURPOSE: Contains routines for reading and writing text files in the ATF format. // // An ANSI C compiler should be used for compilation. // Compile with the large memory model option. // (e.g. CL -c -AL AXATFFIO32.CPP) // // NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE // For consistency and code reuse, the DLL version of this module uses // AxonValidation.lib to perform float/double formatting. // NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE=NOTE #include "axatffio32.h" #include "atfutil.h" #include "atfintl.h" #include "../Common/axodebug.h" #define ATF_FILE_ID "ATF" #define PAF_FILE_ID "PAF" #define FILE_ID_LEN 3 #define PREVIOUS_PAF_VERSION 5.0F #define ATF_AVCOLUMNSIZE 50 // average number of chars per column #define ATF_MINBUFSIZE 1024 // minimum size for the pszIOBuffer #define ATF_DBL_SIG_DIGITS 12 #define ATF_FLT_SIG_DIGITS 6 // #define ATF_DBL_STR_LEN ATF_DBL_SIG_DIGITS + 7 // 1 for sign, 1 for decimal, // #define ATF_FLT_STR_LEN ATF_FLT_SIG_DIGITS + 7 // 2 for '+E' of exponential notation, 3 for exponent #define ATF_DBL_STR_LEN VAL_EXTERNBUFSIZE // for use with axovdate #define ATF_FLT_STR_LEN VAL_EXTERNBUFSIZE // // Set the maximum number of files that can be open simultaneously. // This can be overridden from the compiler command line. // #define ATF_MAXFILES 64 static PATF_FILEINFO g_FileDescriptor[ATF_MAXFILES]; // // If the file is opened in BINARY mode, CR/LF pairs are NOT translated to LFs // on reading, and LFs are NOT translated to CR/LF on writing. // static const char s_szEndOfLine[] = "\r\n"; static const char s_szWhitespace[] = "\t\r\n ,"; static const char s_szWhiteNoSpace[] = "\t\r\n,"; static const char s_szDelimiter[] = "\t,"; static const char s_szLineTerm[] = "\r\n"; // HINSTANCE g_hInstance = NULL; #define ENDOFFILE 0x1A // End-of-file character static BOOL ReadDataRecord(ATF_FILEINFO *pATF, int *pnError); //=============================================================================================== // FUNCTION: ATF_Initialize() // PARAMETERS: // hInstance - Instance handle from which resources will be taken. // RETURNS: // BOOL - TRUE = Initialization was successful. // // PURPOSE: This function should be called before any of the other API functions. // NOTES: This function is not exported as it is called from the DLL startup code. If the // API is bound into an executable rather than a DLL it will need to be called // explicitly. // BOOL WINAPI ATF_Initialize(HINSTANCE hDLL) { // Protect against multiple calls. if (g_hInstance != NULL) return TRUE; // Save the DLL instance handle. g_hInstance = hDLL; for (int i=0; iszSeparator[0] = s_szDelimiter[0]; *ppATF = g_FileDescriptor[nFile] = pATF; *pnFile = nFile; return TRUE; } //----------------------------------------------------------------------------------------------- // FUNCTION: GetFileDescriptor // PURPOSE: Retreive an existing file descriptor. // static BOOL GetFileDescriptor(ATF_FILEINFO **ppATF, int nFile, int *pnError) { WPTRASSERT(ppATF); // Check that index is within range. if ((nFile < 0) || (nFile >= ATF_MAXFILES)) ERRORRETURN(pnError, ATF_ERROR_BADFILENUM); // Get a pointer to the descriptor. ATF_FILEINFO *pATF = g_FileDescriptor[nFile]; if (pATF == NULL) ERRORRETURN(pnError, ATF_ERROR_BADSTATE); // Return the descriptor. *ppATF = pATF; return TRUE; } //=============================================================================================== // FUNCTION: AllocIOBuffer // PURPOSE: Allocate an IOBuffer for this file. // static BOOL AllocIOBuffer(ATF_FILEINFO *pATF) { WPTRASSERT(pATF); pATF->nIOBufferSize = pATF->nColumns * ATF_AVCOLUMNSIZE; if (pATF->nIOBufferSize < ATF_MINBUFSIZE) pATF->nIOBufferSize = ATF_MINBUFSIZE; pATF->pszIOBuffer = (char *)calloc(pATF->nIOBufferSize, sizeof(char)); if (pATF->pszIOBuffer == NULL) { pATF->nIOBufferSize = 0; return FALSE; } return TRUE; } //=============================================================================================== // FUNCTION: FreeIOBuffer // PURPOSE: Free the IO buffer used by this file. // static void FreeIOBuffer(ATF_FILEINFO *pATF) { WPTRASSERT(pATF); if (pATF->pszIOBuffer != NULL) free(pATF->pszIOBuffer); pATF->pszIOBuffer = NULL; pATF->nIOBufferSize = 0; } //============================================================================================== // FUNCTION: strncpyz // PURPOSE: Does a strncpy but guarantees that a terminating zero is placed on the // destination string. // RETURNS: The destination buffer. // static LPSTR strncpyz(LPSTR pszDest, LPCSTR pszSrce, UINT uBufSize) { ARRAYASSERT(pszDest, uBufSize); #if 0 LPSZASSERT(pszSrce); #endif strncpy(pszDest, pszSrce, uBufSize-1); pszDest[uBufSize-1] = '\0'; return pszDest; } //=============================================================================================== // FUNCTION: GetNumber // PURPOSE: Parse the next double out of the buffer, skipping delimeters etc. // static char *GetNumber(char *psBuf, double *pdNum) { #if 0 LPSZASSERT(psBuf); #endif // Skip space characters to get the start of the number char *ps = psBuf; while (*ps==' ') ++ps; // Save a pointer to the start of the number. char *psStart = ps; // search for the end of this token while (*ps && !strchr(s_szWhitespace, *ps)) ++ps; // skip trailing spaces. while (*ps==' ') ++ps; // Null terminate the string (knocking out the next delimiter) and step past the null if not end of line. if (*ps && !strchr(s_szLineTerm, *ps)) *ps++ = '\0'; else *ps = '\0'; if (pdNum) { WPTRASSERT(pdNum); *pdNum = atof(psStart); } return ps; } //=============================================================================================== // FUNCTION: GetVersion // PURPOSE: Parse the version number out of the data stream and check it against acceptable // values. // static BOOL GetVersion(char *psBuf, double *pdATFVersion, int *pnError) { #if 0 LPSZASSERT(psBuf); #endif WPTRASSERT(pdATFVersion); double dNum = 0; if (strlen(psBuf) < 5) ERRORRETURN(pnError, ATF_ERROR_INVALIDFILE); // Skip leading whitespace. char *psz = psBuf+FILE_ID_LEN; while (*psz && strchr(s_szWhitespace, *psz)) psz++; GetNumber(psz, &dNum); if (strncmp(psBuf, ATF_FILE_ID, FILE_ID_LEN) == 0) { if ((dNum > ATF_CURRENTVERSION) || (dNum==0.0)) ERRORRETURN(pnError, ATF_ERROR_BADVERSION); // File is an ATF file *pdATFVersion = dNum; } else if (strncmp(psBuf, PAF_FILE_ID, FILE_ID_LEN) == 0) { if (dNum != PREVIOUS_PAF_VERSION) ERRORRETURN(pnError, ATF_ERROR_BADVERSION); // Previous PAF V5.0 files are supported as ATF V0.0 *pdATFVersion = 0.0; } else ERRORRETURN(pnError, ATF_ERROR_INVALIDFILE); return TRUE; } //=============================================================================================== // FUNCTION: CleanupMem // PURPOSE: Frees strings that have been strdup'ed into the array. // static void CleanupMem(char **ppsz, int nItems) { if (!ppsz) return; while (nItems--) { if (*ppsz) free(*ppsz); ppsz++; } } //============================================================================================== // FUNCTION: StripSpaces // PURPOSE: Strips space characters out of the start and end of the passed string. // NOTES: This routine is DESTRUCTIVE in that it replaces any trailing spaces with '\0's. // It contains its own static definition of whitespace, not that it does not // include ','. // RETURNS: Pointer to the first non-white-space character. // static LPSTR StripSpaces(LPSTR pszSource) { // Garbage in == garbage out. if (!pszSource) return pszSource; // Characters that are regarded as white space. static const char szWhiteSpace[] = " \t\r\n"; #if 0 LPSZASSERT(pszSource); #endif // Strip leading white space. char *pszFirstChar = pszSource + strspn(pszSource, szWhiteSpace); // If nothing left, return. if (*pszFirstChar=='\0') { pszSource[0] = '\0'; return pszSource; } // Strip trailing white space. char *pszLastChar = pszFirstChar + strlen(pszFirstChar) - 1; while (pszLastChar > pszFirstChar) { if (strchr(szWhiteSpace, *pszLastChar) == NULL) break; *pszLastChar-- = '\0'; } // Move the sub-string to the start of the source string. if (pszFirstChar > pszSource) memmove(pszSource, pszFirstChar, strlen(pszFirstChar)+1); return pszSource; } //=============================================================================================== // FUNCTION: FixColumnTitles // PURPOSE: This function reads PAF V5.0 (ATF 0.0) headings. // static BOOL FixColumnTitles(int nColumns, ATF_FILEINFO *pATF) { WPTRASSERT(pATF); char *ps = pATF->pszIOBuffer; char *psEnd = pATF->pszIOBuffer + pATF->nIOBufferSize; for (int i=0; i= psEnd) // return an error if past end of buffer. return FALSE; } // Save the start of the title. char *psStart = ps; // Search for the end of the title. while ((*ps!='"') && (*ps!='\t')) { ++ps; if (ps >= psEnd) // return an error if past end of buffer. return FALSE; } *ps++ = '\0'; #if !defined(_WINDOWS) || defined(__MINGW32__) pATF->apszFileColTitles[i] = strdup(StripSpaces(psStart)); #else pATF->apszFileColTitles[i] = _strdup(StripSpaces(psStart)); #endif if (pATF->apszFileColTitles[i] == NULL) return FALSE; } return TRUE; } //=============================================================================================== // FUNCTION: FixColumnUnits // PURPOSE: This function reads PAF V5.0 (ATF 0.0) headings. // static BOOL FixColumnUnits(int nColumns, ATF_FILEINFO *pATF) { WPTRASSERT(pATF); char *ps = pATF->pszIOBuffer; char *psEnd = pATF->pszIOBuffer + pATF->nIOBufferSize; for (int i=0; i= psEnd) // return an error if past end of buffer. return FALSE; } // Save the start of the units char *psStart = ps; // Search for the end of the units. while ((*ps!='"') && (*ps!='\t')) { ++ps; if (ps >= psEnd) // return an error if past end of buffer. return FALSE; } *ps++ = '\0'; #if !defined(_WINDOWS) || defined(__MINGW32__) pATF->apszFileColUnits[i] = strdup(StripSpaces(psStart)); #else pATF->apszFileColUnits[i] = _strdup(StripSpaces(psStart)); #endif if (pATF->apszFileColUnits[i] == NULL) return FALSE; } return TRUE; } //=============================================================================================== // FUNCTION: FixColumnHeadings // PURPOSE: Store away the column headings and the column units strings for ATF files. // static BOOL FixColumnHeadings(int nColumns, ATF_FILEINFO *pATF) { WPTRASSERT(pATF); char *ps = pATF->pszIOBuffer; char *psEnd = pATF->pszIOBuffer + pATF->nIOBufferSize; for (int i=0; i= psEnd) // return an error if past end of buffer. return FALSE; } if (*ps=='"') { bDoubleQuote = TRUE; ++ps; } // Save the start of the title char *psStart = ps; for (; *ps && !strchr(s_szWhiteNoSpace, *ps); ++ps) { if (ps >= psEnd) // return an error if past end of buffer. return FALSE; if (bDoubleQuote && (*ps=='"')) break; if (*ps == '(') { if (*(ps-1) == ' ') *(ps-1) = '\0'; bUnits = TRUE; break; } } *ps++ = '\0'; #if !defined(_WINDOWS) || defined(__MINGW32__) pATF->apszFileColTitles[i] = strdup(StripSpaces(psStart)); #else pATF->apszFileColTitles[i] = _strdup(StripSpaces(psStart)); #endif if (pATF->apszFileColTitles[i] == NULL) return FALSE; if (bUnits) { psStart = ps; while (!strchr(s_szDelimiter, *ps) && (*ps!=')')) { if (bDoubleQuote && (*ps=='"')) { bDoubleQuote = FALSE; break; } ++ps; if (ps >= psEnd) // return an error if past end of buffer. return FALSE; } *ps++ = '\0'; #if !defined(_WINDOWS) || defined(__MINGW32__) pATF->apszFileColUnits[i] = strdup(StripSpaces(psStart)); #else pATF->apszFileColUnits[i] = _strdup(StripSpaces(psStart)); #endif if (pATF->apszFileColUnits[i] == NULL) return FALSE; if (bDoubleQuote) { while (*ps && (*ps!='"')) ps++; *ps++ = '\0'; } } } return TRUE; } //=============================================================================================== // FUNCTION: ReadLine // PURPOSE: This function masks gets and processes error conditions // static BOOL ReadLine(ATF_FILEINFO *pATF, int nEOFError, int *pnError) { WPTRASSERT(pATF); char *pszIOBuffer = pATF->pszIOBuffer; int nReturn = getsBuf(pATF, pszIOBuffer, pATF->nIOBufferSize); if (nReturn == GETS_EOF) ERRORRETURN(pnError, nEOFError); if (nReturn == GETS_ERROR) ERRORRETURN(pnError, ATF_ERROR_IOERROR); if (nReturn == GETS_NOEOL) ERRORRETURN(pnError, ATF_ERROR_LINETOOLONG); if (pszIOBuffer[0] == ENDOFFILE) pszIOBuffer[0] = '\0'; return TRUE; } //=============================================================================================== // FUNCTION: ReadHeaderInfo // PURPOSE: Reads the header information out of the file and stores it away in the file // descriptor. // static BOOL ReadHeaderInfo(ATF_FILEINFO *pATF, int *pnColumns, int *pnError) { WPTRASSERT(pnColumns); char szReadBuf[128]; double dATFVersion, dNum; int nHeaders, nColumns, i; long lCurrentPos; // Check if the version number is suported if (getsBuf(pATF, szReadBuf, sizeof(szReadBuf))) ERRORRETURN(pnError, ATF_ERROR_INVALIDFILE); if (!GetVersion(szReadBuf, &dATFVersion, pnError)) return FALSE; // Read in the number of header records and the number of columns of data // in the file if (getsBuf(pATF, szReadBuf, sizeof(szReadBuf))) ERRORRETURN(pnError, ATF_ERROR_BADHEADER); if (dATFVersion == 0.0) { // Read number of headers and columns as in previous (PAF 5.0) version GetNumber(szReadBuf, &dNum); nHeaders = (int)dNum; if (getsBuf(pATF, szReadBuf, sizeof(szReadBuf))) ERRORRETURN(pnError, ATF_ERROR_BADHEADER); GetNumber(szReadBuf, &dNum); nColumns = (int)dNum; } else { // Parse out first number (Headers) char *ps = GetNumber(szReadBuf, &dNum); nHeaders = (int)dNum; // Parse out second number (Columns) GetNumber(ps, &dNum); nColumns = (int)dNum; } if (nHeaders < 0) nHeaders = 0; if (nColumns < 0) nColumns = 0; // Return the number of columns to the user if a pointer was passed in if (pnColumns) *pnColumns = nColumns; if (nColumns > ATF_MAXCOLUMNS) ERRORRETURN(pnError, ATF_ERROR_TOOMANYCOLS); // Save the various pieces of information about this file // pATF->hFile = hFile; // now set in _CreateFileBuf pATF->nHeaders = nHeaders; pATF->nColumns = nColumns; pATF->eState = eOPENED; pATF->bWriting = FALSE; pATF->dFileVersion = dATFVersion; if (!AllocIOBuffer(pATF)) ERRORRETURN(pnError, ATF_ERROR_NOMEMORY); // Now save the current position and skip the header records and get the // column title and unit strings lCurrentPos = SetFilePointerBuf(pATF, 0, NULL, FILE_CURRENT); for (i=0; iapszFileColTitles = (char **)calloc(nColumns, sizeof(char *)); if (pATF->apszFileColTitles == NULL) ERRORRETURN(pnError, ATF_ERROR_NOMEMORY); pATF->apszFileColUnits = (char **)calloc(nColumns, sizeof(char *)); if (pATF->apszFileColUnits == NULL) { free(pATF->apszFileColTitles); pATF->apszFileColTitles = NULL; ERRORRETURN(pnError, ATF_ERROR_NOMEMORY); } if (!ReadLine(pATF, ATF_ERROR_BADHEADER, pnError)) return FALSE; if (dATFVersion == 0.0) { if (!FixColumnTitles(nColumns, pATF)) { CleanupMem(pATF->apszFileColTitles, nColumns); ERRORRETURN(pnError, ATF_ERROR_BADHEADER); } if (!ReadLine(pATF, ATF_ERROR_BADHEADER, pnError)) { CleanupMem(pATF->apszFileColTitles, nColumns); return FALSE; } if (!FixColumnUnits(nColumns, pATF)) { CleanupMem(pATF->apszFileColTitles, nColumns); CleanupMem(pATF->apszFileColUnits, nColumns); ERRORRETURN(pnError, ATF_ERROR_BADHEADER); } } else if (!FixColumnHeadings(nColumns, pATF)) { CleanupMem(pATF->apszFileColTitles, nColumns); CleanupMem(pATF->apszFileColUnits, nColumns); ERRORRETURN(pnError, ATF_ERROR_BADHEADER); } // Return to the saved position SetFilePointerBuf(pATF, lCurrentPos, NULL, FILE_BEGIN); return TRUE; } //=============================================================================================== // FUNCTION: WriteHeaderInfo // PURPOSE: Write the first compulsory header lines out to the file. // static BOOL WriteHeaderInfo(ATF_FILEINFO *pATF, int nColumns, int *pnError) { // Writing a new file; Setup any necessary info pATF->dFileVersion = ATF_CURRENTVERSION; pATF->eState = eOPENED; pATF->bWriting = TRUE; pATF->bDataOnLine = FALSE; pATF->nHeaders = 0; pATF->nColumns = nColumns; // Allocate / re-allocate the IOBuffer. if (!AllocIOBuffer(pATF)) ERRORRETURN(pnError, ATF_ERROR_NOMEMORY); // Allocate space to hold column titles and units. pATF->apszFileColTitles = (char **)calloc(nColumns, sizeof(char *)); if (pATF->apszFileColTitles == NULL) ERRORRETURN(pnError, ATF_ERROR_NOMEMORY); pATF->apszFileColUnits = (char **)calloc(nColumns, sizeof(char *)); if (pATF->apszFileColUnits == NULL) { free(pATF->apszFileColTitles); pATF->apszFileColTitles = NULL; ERRORRETURN(pnError, ATF_ERROR_NOMEMORY); } if (pATF->uFlags & ATF_DONTWRITEHEADER) { pATF->lFilePos = 0; return TRUE; } // Write the special marker string and the file version number char *pszIOBuffer = pATF->pszIOBuffer; sprintf(pszIOBuffer, "%s%s%.1f%s", ATF_FILE_ID, pATF->szSeparator, ATF_CURRENTVERSION, s_szEndOfLine); if (!putsBuf(pATF, pszIOBuffer)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); // Save the current position so that we may update the number of header records pATF->lFilePos = SetFilePointerBuf(pATF, 0, NULL, FILE_CURRENT); // Write the number of headers and columns that will be written, leaving // enough trailing spaces for 4 digits of headers (more than enough) sprintf(pszIOBuffer, "0%s%d %s", pATF->szSeparator, nColumns, s_szEndOfLine); if (!putsBuf(pATF, pszIOBuffer)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); return TRUE; } //=============================================================================================== // FUNCTION: _FormatNumber // PURPOSE: Formats the digits of dNum into pszString, suppressing trailing zeros. // In the event that "0." is produced as output from gcvt, truncate to "0" // // RETURNS: TRUE if success; FALSE if failure // #ifdef _WINDOWS // #include "..\AxonValidation\AxonValidation.h" // for VAL_* functions (standard Axon float/double->string formatting) #endif static BOOL _FormatNumber(double dNum, int nDigits, char *pszString, UINT uSize) { ARRAYASSERT(pszString, uSize); #if !defined(_WINDOWS) || defined(__MINGW32__) sprintf(pszString, "%.*g", nDigits, dNum); // char* res = gcvt(dNum, nDigits, pszString); #else _gcvt(dNum, nDigits, pszString); #endif int l = (int)strlen(pszString); if ((l > 0) && (pszString[l-1]=='.')) pszString[l-1] = '\0'; return TRUE; /* #else return VAL_ConvertDblToStr(dNum, pszString, uSize, VAL_FMT_SIG_DIGITS, 0, nDigits, NULL); #endif */ } //=============================================================================================== // FUNCTION: ATF_OpenFile // PURPOSE: Opens an ATF file for either reading or writing. // BOOL WINAPI ATF_OpenFile(LPCSTR szFileName, UINT uFlags, int *pnColumns, int *pnFile, int *pnError) { #if 0 LPSZASSERT(szFileName); #endif WPTRASSERT(pnColumns); WPTRASSERT(pnFile); // keep state of DONTWRITEHEADER flag BOOL bDontWriteHeader = uFlags & ATF_DONTWRITEHEADER; int nColumns, nFile; HANDLE hFile = INVALID_HANDLE_VALUE; ATF_FILEINFO *pATF = NULL; if (!GetNewFileDescriptor(&pATF, &nFile, pnError)) return FALSE; // copy name: #if !defined(_WINDOWS) || defined(__MINGW32__) pATF->pszFileName = strdup(szFileName); #else pATF->pszFileName = _strdup(szFileName); #endif if (pATF->pszFileName == NULL) goto OpenError; if (uFlags & ATF_READONLY) { hFile = CreateFileBuf(pATF, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { if (pnError) *pnError = ATF_ERROR_NOFILE; goto OpenError; } pATF->uFlags = uFlags; // Read the header information into the global variables if (!ReadHeaderInfo(pATF, pnColumns, pnError)) goto OpenError; } else { nColumns = *pnColumns; if (nColumns > ATF_MAXCOLUMNS) { if (pnError) *pnError = ATF_ERROR_TOOMANYCOLS; goto OpenError; } // Try to open any existing file with same name #if defined(_WINDOWS) && !defined(__MINGW32__) hFile = CreateFileBuf(pATF, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { if ((uFlags & ATF_OVERWRTIFEXIST)==0) { if (pnError) *pnError = ATF_ERROR_FILEEXISTS; goto OpenError; } if ((uFlags & ATF_APPENDIFEXIST)!=0) { // If we are appending to the file, read the header // to confirm that it is a valid ATF file that we are // appending to. if (!ReadHeaderInfo(pATF, NULL, pnError)) goto OpenError; } CloseHandleBuf(pATF); } else #endif uFlags = ATF_WRITEONLY; pATF->uFlags = uFlags; // Now, open the file for output hFile = CreateFileBuf(pATF, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, uFlags & ATF_APPENDIFEXIST ? OPEN_EXISTING : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { if (pnError) *pnError = ATF_ERROR_NOFILE; goto OpenError; } if ((uFlags & ATF_APPENDIFEXIST)!=0) { // pATF->hFile = hFile; pATF->bDataOnLine = FALSE; pATF->eState = eDATAAPPENDED; pATF->bWriting = TRUE; } else { // Set the DONTWRITEHEADER flag if needed pATF->uFlags |= bDontWriteHeader; // Write the header information and set up global variables if (!WriteHeaderInfo(pATF, nColumns, pnError)) { CloseHandleBuf(pATF); goto OpenError; } } } *pnFile = nFile; return TRUE; OpenError: if (hFile != INVALID_HANDLE_VALUE) CloseHandleBuf(pATF); if (pATF->pszFileName != NULL) free(pATF->pszFileName); free(pATF); g_FileDescriptor[nFile] = NULL; return FALSE; } //=============================================================================================== // FUNCTION: HasUnits // PURPOSE: Checks for the presence of a units string. // static BOOL HasUnits(LPCSTR pszUnits) { return (pszUnits && (pszUnits[0]!=0)); } //=============================================================================================== // FUNCTION: UpdateHeaders // PURPOSE: Update the headers in the ATF file. // static BOOL UpdateHeaders(ATF_FILEINFO *pATF, int *pnError) { WPTRASSERT(pATF); if (pATF->uFlags & ATF_DONTWRITEHEADER) return TRUE; char *pszIOBuffer = pATF->pszIOBuffer; // if there are unterminated header lines then terminate the last one if (pATF->bDataOnLine) { if (!putsBuf(pATF, s_szEndOfLine)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); pATF->nHeaders++; pATF->bDataOnLine = FALSE; } // Save the current position of the file long lCurrentPos = SetFilePointerBuf(pATF, 0, NULL, FILE_CURRENT); // Move to the location of the record containing the number of header records SetFilePointerBuf(pATF, pATF->lFilePos, NULL, FILE_BEGIN); // Create the string for the number of header records { sprintf(pszIOBuffer, "%d%s%d", pATF->nHeaders, pATF->szSeparator, pATF->nColumns); if (!putsBuf(pATF, pszIOBuffer)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); } // Restore the position of the file SetFilePointerBuf(pATF, lCurrentPos, NULL, FILE_BEGIN); // Output the column titles and units record for (int i=0; inColumns; i++) { // Start with separator if not the first column if (i > 0) strcpy(pszIOBuffer, pATF->szSeparator); else pszIOBuffer[0] = '\0'; // Add next title string strcat(pszIOBuffer, "\""); if (pATF->apszFileColTitles[i] != NULL) { strcat(pszIOBuffer, pATF->apszFileColTitles[i]); if (HasUnits(pATF->apszFileColUnits[i])) strcat(pszIOBuffer, " "); } if (HasUnits(pATF->apszFileColUnits[i])) { strcat(pszIOBuffer, "("); strcat(pszIOBuffer, pATF->apszFileColUnits[i]); strcat(pszIOBuffer, ")"); } strcat(pszIOBuffer, "\""); if (!putsBuf(pATF, pszIOBuffer)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); } if (!putsBuf(pATF, s_szEndOfLine)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); pATF->bDataOnLine = FALSE; pszIOBuffer[0] = '\0'; return TRUE; } //=============================================================================================== // FUNCTION: ATF_CloseFile // PURPOSE: Close an ATF file that was opened with ATF_OpenFile. // BOOL WINAPI ATF_CloseFile(int nFile) { ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, NULL)) return FALSE; // Check that we have written out the headers at least. if ((pATF->eState < eDATAWRITTEN) && pATF->bWriting) UpdateHeaders(pATF, NULL); // Close the file and update the state variable CloseHandleBuf(pATF); CleanupMem(pATF->apszFileColTitles, pATF->nColumns); free(pATF->apszFileColTitles); CleanupMem(pATF->apszFileColUnits, pATF->nColumns); free(pATF->apszFileColUnits); FreeIOBuffer(pATF); if (pATF->pszFileName != NULL) free(pATF->pszFileName); free(pATF); g_FileDescriptor[nFile] = NULL; return TRUE; } //=============================================================================================== // FUNCTION: ATF_SetSeperator // PURPOSE: Sets the data item separator to be used when writing out an ATF file. // BOOL WINAPI ATF_SetSeperator(int nFile, BOOL bUseCommas, int *pnError) { ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; pATF->szSeparator[0] = s_szDelimiter[bUseCommas ? 1 : 0]; return TRUE; } //=============================================================================================== // FUNCTION: ATF_IsAppending // PURPOSE: Returns TRUE if the file has been opened for appending. // BOOL WINAPI ATF_IsAppending(int nFile) { ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, NULL)) return FALSE; return (pATF->eState == eDATAAPPENDED); } //=============================================================================================== // FUNCTION: ATF_RewindFile // PURPOSE: Rewind the data section of the ATF file back to the beginning. // BOOL WINAPI ATF_RewindFile(int nFile, int *pnError) { ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; if (pATF->bWriting) ERRORRETURN(pnError, ATF_ERROR_BADSTATE); if (pATF->eState != eDATAREAD) ERRORRETURN(pnError, ATF_ERROR_BADSTATE); SetFilePointerBuf(pATF, pATF->lDataPtr, NULL, FILE_BEGIN); return TRUE; } //=============================================================================================== // FUNCTION: ATF_CountDataLines // PURPOSE: Counts lines of data in an ATF file, stopping at the first empty line, or EOF. // BOOL WINAPI ATF_CountDataLines(int nFile, long *plNumLines, int *pnError) { WPTRASSERT(plNumLines); long lDataLines = 0L; ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; while (ReadDataRecord(pATF, pnError)) { if (strchr(s_szLineTerm, pATF->pszIOBuffer[0])) break; ++lDataLines; } ATF_RewindFile(nFile, NULL); *plNumLines = lDataLines; return TRUE; } //=============================================================================================== // FUNCTION: ATF_GetNumHeaders // PURPOSE: Gets the number of optional data records in the ATF file. // BOOL WINAPI ATF_GetNumHeaders(int nFile, int *pnHeaders, int *pnError) { WPTRASSERT(pnHeaders); ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; *pnHeaders = pATF->nHeaders; return TRUE; } //=============================================================================================== // FUNCTION: ATF_WriteHeaderRecord // PURPOSE: Writes an optional header r3cord to the ATF file. // BOOL WINAPI ATF_WriteHeaderRecord(int nFile, LPCSTR pszText, int *pnError) { #if 0 LPSZASSERT(pszText); #endif ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; if (pATF->uFlags & ATF_DONTWRITEHEADER) return TRUE; char *pszIOBuffer = pATF->pszIOBuffer; // Check that we are in the correct state for this file if (pATF->eState > eHEADERED) ERRORRETURN(pnError, ATF_ERROR_BADSTATE); // Update the state if necessary pATF->eState = eHEADERED; // Write out the header record if (pATF->bDataOnLine) strcpy(pszIOBuffer, pATF->szSeparator); else pszIOBuffer[0] = '\0'; strcat(pszIOBuffer, "\""); strcat(pszIOBuffer, pszText); strcat(pszIOBuffer, "\""); if (!putsBuf(pATF, pszIOBuffer)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); pATF->bDataOnLine = TRUE; return TRUE; } //=============================================================================================== // FUNCTION: ATF_SetColumnTitle // PURPOSE: Sets the next column title. Columns are labeled sequentially. // BOOL WINAPI ATF_SetColumnTitle(int nFile, LPCSTR pszText, int *pnError) { #if 0 LPSZASSERT(pszText); #endif int i; ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Check that we are in the correct state for this file if (pATF->eState > eHEADERED) ERRORRETURN(pnError, ATF_ERROR_BADSTATE); for (i=0; inColumns; i++) if (pATF->apszFileColTitles[i] == NULL) break; if (i==pATF->nColumns) ERRORRETURN(pnError, ATF_ERROR_TOOMANYCOLS); // Copy the new column title into the string buffer and save a pointer to it. #if !defined(_WINDOWS) || defined(__MINGW32__) LPSTR psz = strdup(pszText); #else LPSTR psz = _strdup(pszText); #endif if (psz == NULL) ERRORRETURN(pnError, ATF_ERROR_NOMEMORY); pATF->apszFileColTitles[i] = psz; return TRUE; } //=============================================================================================== // FUNCTION: ATF_SetColumnUnits // PURPOSE: Sets the next column units label. Columns are labeled sequentially. // BOOL WINAPI ATF_SetColumnUnits(int nFile, LPCSTR pszText, int *pnError) { #if 0 LPSZASSERT(pszText); #endif int i; ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Check that we are in the correct state for this file if (pATF->eState > eHEADERED) ERRORRETURN(pnError, ATF_ERROR_BADSTATE); for (i=0; inColumns; i++) if (pATF->apszFileColUnits[i] == NULL) break; if (i==pATF->nColumns) ERRORRETURN(pnError, ATF_ERROR_TOOMANYCOLS); // Copy the new column Unit into the string buffer and save a pointer to it. #if !defined(_WINDOWS) || defined(__MINGW32__) LPSTR psz = strdup(pszText); #else LPSTR psz = _strdup(pszText); #endif if (psz == NULL) ERRORRETURN(pnError, ATF_ERROR_NOMEMORY); pATF->apszFileColUnits[i] = psz; return TRUE; } //=============================================================================================== // FUNCTION: ATF_WriteEndOfLine // PURPOSE: Terminates the current data line when writing to an ATF file. // BOOL WINAPI ATF_WriteEndOfLine(int nFile, int *pnError) { ATF_FILEINFO * pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Write out the EndOfLine character to the file if (!putsBuf(pATF, s_szEndOfLine)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); // Reset data-on-line flag pATF->bDataOnLine = FALSE; // If a header is being written, increment the count of header records if (pATF->eState == eHEADERED) pATF->nHeaders++; return TRUE; } //=============================================================================================== // FUNCTION: ATF_WriteDataRecord // PURPOSE: Writes a data record out to the ATF file. // BOOL WINAPI ATF_WriteDataRecord(int nFile, LPCSTR pszText, int *pnError) { #if 0 LPSZASSERT(pszText); #endif ATF_FILEINFO * pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Check that we are in the correct state for this file if (pATF->eState < eDATAWRITTEN) { if (!UpdateHeaders(pATF, pnError)) return FALSE; pATF->eState = eDATAWRITTEN; } else if (pATF->bDataOnLine) if (!putsBuf(pATF, pATF->szSeparator)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); // Write out the text string to the file if (!putsBuf(pATF, pszText)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); // Set data-on-line flag pATF->bDataOnLine = TRUE; return TRUE; } //=============================================================================================== // FUNCTION: ATF_WriteDataComment // PURPOSE: Writes a comment record out to the ATF file. // BOOL WINAPI ATF_WriteDataComment(int nFile, LPCSTR pszText, int *pnError) { #if 0 LPSZASSERT(pszText); #endif char buf[128]; #if defined(_WINDOWS) && !defined(__MINGW32__) _snprintf(buf, sizeof(buf), "\"%s\"", pszText); #else snprintf(buf, sizeof(buf), "\"%s\"", pszText); #endif return ATF_WriteDataRecord(nFile, buf, pnError); } //=============================================================================================== // FUNCTION: ATF_WriteDataRecordArray // PURPOSE: Writes an array of data values out to a line of the ATF file. // BOOL WINAPI ATF_WriteDataRecordArray(int nFile, int nCount, double *pdVals, int *pnError) { ARRAYASSERT(pdVals, nCount); char psTemp[ATF_DBL_STR_LEN]; ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; if (nCount > pATF->nColumns) ERRORRETURN(pnError, ATF_ERROR_TOOMANYCOLS); char *pszIOBuffer = pATF->pszIOBuffer; // Check that we are in the correct state for this file if (pATF->eState < eDATAWRITTEN) { if (!UpdateHeaders(pATF, pnError)) return FALSE; pATF->eState = eDATAWRITTEN; } // Create the output string for this record char *ps = pszIOBuffer; *ps = '\0'; if (nCount > 0) { if (pATF->bDataOnLine) strcpy(ps++, pATF->szSeparator); if (!_FormatNumber(*pdVals++, ATF_DBL_SIG_DIGITS, psTemp, ATF_DBL_STR_LEN)) ERRORRETURN(pnError, ATF_ERROR_BADFLTCNV); strcpy(ps, psTemp); ps += strlen(psTemp); } for (int i=1; iszSeparator); ps += strlen(pATF->szSeparator); if (!_FormatNumber(*pdVals++, ATF_DBL_SIG_DIGITS, psTemp, ATF_DBL_STR_LEN)) ERRORRETURN(pnError, ATF_ERROR_BADFLTCNV); strcpy(ps, psTemp); ps += strlen(psTemp); } // Write out the text string to the file if (!putsBuf(pATF, pszIOBuffer)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); // Set data-on-line flag pATF->bDataOnLine = TRUE; return TRUE; } //=============================================================================================== // FUNCTION: ATF_WriteDataRecordArrayFloat // PURPOSE: Writes an array of float data values out to a line of the ATF file. // BOOL WINAPI ATF_WriteDataRecordArrayFloat(int nFile, int nCount, float *pfVals, int *pnError) { ARRAYASSERT(pfVals, nCount); char psTemp[ATF_FLT_STR_LEN]; ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; if (nCount > pATF->nColumns) ERRORRETURN(pnError, ATF_ERROR_TOOMANYCOLS); char *pszIOBuffer = pATF->pszIOBuffer; // Check that we are in the correct state for this file if (pATF->eState < eDATAWRITTEN) { if (!UpdateHeaders(pATF, pnError)) return FALSE; pATF->eState = eDATAWRITTEN; } // Create the output string for this record char *ps = pszIOBuffer; *ps = '\0'; if (nCount > 0) { if (pATF->bDataOnLine) strcpy(ps++, pATF->szSeparator); if (!_FormatNumber((double)*pfVals++, ATF_FLT_SIG_DIGITS, psTemp, ATF_FLT_STR_LEN)) ERRORRETURN(pnError, ATF_ERROR_BADFLTCNV); strcpy(ps, psTemp); ps += strlen(psTemp); } for (int i=1; iszSeparator); ps += strlen(pATF->szSeparator); if (!_FormatNumber((double)*pfVals++, ATF_FLT_SIG_DIGITS, psTemp, ATF_FLT_STR_LEN)) ERRORRETURN(pnError, ATF_ERROR_BADFLTCNV); strcpy(ps, psTemp); ps += strlen(psTemp); } // Write out the text string to the file if (!putsBuf(pATF, pszIOBuffer)) ERRORRETURN(pnError, ATF_ERROR_IOERROR); // Set data-on-line flag pATF->bDataOnLine = TRUE; return TRUE; } //=============================================================================================== // FUNCTION: ATF_WriteDataRecord1 // PURPOSE: Writes a single double data item out to the ATF file. // BOOL WINAPI ATF_WriteDataRecord1(int nFile, double dNum1, int *pnError) { char psTemp[ATF_DBL_STR_LEN]; if (!_FormatNumber(dNum1, ATF_DBL_SIG_DIGITS, psTemp, ATF_DBL_STR_LEN)) ERRORRETURN(pnError, ATF_ERROR_BADFLTCNV); return ATF_WriteDataRecord(nFile, psTemp, pnError); } //=============================================================================================== // FUNCTION: ATF_WriteDataRecord1Float // PURPOSE: Writes a single float data item out to the ATF file. // BOOL WINAPI ATF_WriteDataRecord1Float(int nFile, float fNum1, int *pnError) { char psTemp[ATF_FLT_STR_LEN]; if (!_FormatNumber((double)fNum1, ATF_FLT_SIG_DIGITS, psTemp, ATF_FLT_STR_LEN)) ERRORRETURN(pnError, ATF_ERROR_BADFLTCNV); return ATF_WriteDataRecord(nFile, psTemp, pnError); } //=============================================================================================== // FUNCTION: GetComment // PURPOSE: Strips a comment string out of the data stream, removing separators and // double quotes. // static char *GetComment(char *pszStr) { // Strip off any leading or trailing space characters pszStr = StripSpaces(pszStr); // If nothing left, return. if (*pszStr=='\0') return pszStr; // Strip leading and trailing quotes from the string if (*pszStr == '"') { pszStr++; char *ps = pszStr; while (*ps && (*ps!='"')) ps++; if (*ps != '\0') *ps = '\0'; } return pszStr; } //=============================================================================================== // FUNCTION: ReadHeaderLine // PURPOSE: Reads an optional header line from the file. // static BOOL ReadHeaderLine(ATF_FILEINFO *pATF, int *pnError) { WPTRASSERT(pATF); // Check that we are in the correct state for this file if (pATF->eState > eHEADERED) ERRORRETURN(pnError, ATF_ERROR_BADSTATE); pATF->eState = eHEADERED; // Check if there are any more header records left to be read if (pATF->nHeaders < 1) ERRORRETURN(pnError, ATF_ERROR_NOMORE); // Read a header record and copy it into the return buffer if (!ReadLine(pATF, ATF_ERROR_BADHEADER, pnError)) return FALSE; // remove any trailing white space at the end of the line. StripSpaces(pATF->pszIOBuffer); pATF->nHeaders--; return TRUE; } //=============================================================================================== // FUNCTION: ATF_ReadHeaderLine // PURPOSE: Exported version of ReadHeaderLine. // BOOL WINAPI ATF_ReadHeaderLine(int nFile, char *psBuf, int nMaxLen, int *pnError) { ARRAYASSERT(psBuf, nMaxLen); ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Load the next line, checking state etc if (!ReadHeaderLine(pATF, pnError)) return FALSE; strncpyz(psBuf, pATF->pszIOBuffer, nMaxLen); return TRUE; } //=============================================================================================== // FUNCTION: ATF_ReadHeaderNoQuotes // PURPOSE: Reads a header record, stripping of any double quotes if present. // BOOL WINAPI ATF_ReadHeaderNoQuotes(int nFile, char *psBuf, int nMaxLen, int *pnError) { ARRAYASSERT(psBuf, nMaxLen); ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Load the next line, checking state etc if (!ReadHeaderLine(pATF, pnError)) return FALSE; // Strip off any leading and trailing quotes from the string char *psComment = GetComment(pATF->pszIOBuffer); strncpyz(psBuf, psComment, nMaxLen); return TRUE; } //=============================================================================================== // FUNCTION: ATF_GetColumnTitle // PURPOSE: Returns the title of a particular column in the ATF file. // BOOL WINAPI ATF_GetColumnTitle(int nFile, int nColumn, char *pszText, int nMaxTxt, int *pnError) { ARRAYASSERT(pszText, nMaxTxt); ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Check that the column number is within range. if ((nColumn < 0) || (nColumn >= pATF->nColumns)) ERRORRETURN(pnError, ATF_ERROR_BADCOLNUM); if (pATF->apszFileColTitles[nColumn] != NULL) strncpyz(pszText, pATF->apszFileColTitles[nColumn], nMaxTxt); else pszText[0] = '\0'; return TRUE; } //=============================================================================================== // FUNCTION: ATF_GetColumnUnits // PURPOSE: Returns the units of a particular column in the ATF file. // BOOL WINAPI ATF_GetColumnUnits(int nFile, int nColumn, char *pszText, int nMaxTxt, int *pnError) { ARRAYASSERT(pszText, nMaxTxt); ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Check that the column number is within range. if ((nColumn < 0) || (nColumn >= pATF->nColumns)) ERRORRETURN(pnError, ATF_ERROR_BADCOLNUM); if (pATF->apszFileColUnits[nColumn] != NULL) strncpyz(pszText, pATF->apszFileColUnits[nColumn], nMaxTxt); else pszText[0] = '\0'; return TRUE; } //=============================================================================================== // FUNCTION: ReadDataRecord // PURPOSE: Internal workhorse function for parsing lines out of the data stream. // static BOOL ReadDataRecord(ATF_FILEINFO *pATF, int *pnError) { WPTRASSERT(pATF); // Check that we are in the correct state for this file if (pATF->eState < eDATAREAD) { // Read any header records that were not processed while (pATF->nHeaders-- > 0) if (!ReadLine(pATF, ATF_ERROR_BADHEADER, pnError)) return FALSE; // Skip the column titles and units if (!ReadLine(pATF, ATF_ERROR_BADHEADER, pnError)) return FALSE; if (pATF->dFileVersion == 0.0) if (!ReadLine(pATF, ATF_ERROR_BADHEADER, pnError)) return FALSE; pATF->lDataPtr = SetFilePointerBuf(pATF, 0, NULL, FILE_CURRENT); pATF->eState = eDATAREAD; } // Update the file state and check for end-of-file // JT - we may need this: // if (feof(pATF->hFile)) // ERRORRETURN(pnError, ATF_ERROR_NOMORE); // Read the next record from the data file and return it // JT - we may need to reconsider what error we use here: // return ReadLine(pATF, ATF_ERROR_IOERROR, pnError); return ReadLine(pATF, ATF_ERROR_NOMORE, pnError); } //=============================================================================================== // FUNCTION: ATF_ReadDataRecord // PURPOSE: Returns the next complete line from the ATF file. // BOOL WINAPI ATF_ReadDataRecord(int nFile, char *pszText, int nMaxLen, int *pnError) { ARRAYASSERT(pszText, nMaxLen); ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; if (!ReadDataRecord(pATF, pnError)) return FALSE; strncpyz(pszText, pATF->pszIOBuffer, nMaxLen); return TRUE; } //=============================================================================================== // FUNCTION: ATF_ReadDataRecordArray // PURPOSE: Reads an array of data values from the ATF file. // BOOL WINAPI ATF_ReadDataRecordArray(int nFile, int nCount, double *pdVals, char *pszComment, int nMaxLen, int *pnError) { ARRAYASSERT(pdVals, nCount); ARRAYASSERT(pszComment, nMaxLen); ATF_FILEINFO *pATF = NULL; if (!GetFileDescriptor(&pATF, nFile, pnError)) return FALSE; // Perform the necessary checks and read the data record if (!ReadDataRecord(pATF, pnError)) return FALSE; // Read out the requested numbers char *ps = pATF->pszIOBuffer; for (int i=0; ipszIOBuffer; for (int i=0; ihFile, &CreationTime, NULL, NULL)) { FILETIME LocalTime = { 0 }; VERIFY(FileTimeToLocalFileTime(&CreationTime, &LocalTime)); VERIFY(FileTimeToSystemTime(&LocalTime, &Time)); } int nYear = int(Time.wYear); if (plDate) *plDate = long(nYear*10000 + Time.wMonth*100 + Time.wDay); if (plTime) *plTime = long(((Time.wHour*60) + Time.wMinute)*60 + Time.wSecond); #endif return TRUE; } stimfit-0.15.8/src/libstfio/abf/axon/AxAtfFio32/atfintl.h0000775000175000017500000000667513062445067017756 00000000000000//*********************************************************************************************** // // Written 1990 - 1996 by AXON Instruments Inc. // // This file is not protected by copyright. You are free to use, modify // and copy the code in this file. // //*********************************************************************************************** // // HEADER: ATFINTL.H // PURPOSE: Internal header file for the ATF file I/O routines. // enum eFILE_STATE { eCLOSED, eOPENED, eHEADERED, eDATAREAD, eDATAWRITTEN, eDATAAPPENDED, }; struct ATF_FILEINFO { HANDLE hFile; eFILE_STATE eState; BOOL bWriting; UINT uFlags; int nHeaders; long lFilePos; int nColumns; double dFileVersion; long lTitlesPtr; long lDataPtr; BOOL bDataOnLine; char szSeparator[2]; char ** apszFileColTitles; char ** apszFileColUnits; char * pszIOBuffer; char * pszFileName; int nIOBufferSize; // buffering: long lBufSize; char * pszBuf; // = lBufSize means no info is buffered long lPos; // current position in buffer - 0 means no info is buffered BOOL bRead; // TRUE = reading; FALSE = writing long lBufReadLimit; // actual amount read in when a full buffer is not available char cLineTerm; // The character that will terminate each line. }; typedef ATF_FILEINFO *PATF_FILEINFO; //----------------------------------------------------------------------------------------------- // Macros and functions to deal with returning error return codes through a pointer if given. #define ERRORRETURN(p, e) return ErrorReturn(p, e); inline BOOL ErrorReturn(int *pnError, int nErrorNum) { if (pnError) *pnError = nErrorNum; return FALSE; } //----------------------------------------------------------------------------------------------- #define MAX_READ_SIZE 512 #define GETS_OK 0 // Success! #define GETS_EOF 1 // End of file reached. #define GETS_ERROR 2 // I/O error #define GETS_NOEOL 3 // No end of line found. //----------------------------------------------------------------------------------------------- // declaration of low-level file I/O functions. HANDLE CreateFileBuf(ATF_FILEINFO *pATF, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); BOOL CloseHandleBuf(ATF_FILEINFO *pATF); BOOL WriteFileBuf(ATF_FILEINFO *pATF, LPCVOID pvBuffer, DWORD dwBytes, DWORD *pdwWritten, LPOVERLAPPED lpOverlapped); BOOL ReadFileBuf(ATF_FILEINFO *pATF, LPVOID pvBuffer, DWORD dwBytes, DWORD *pdwRead, LPOVERLAPPED lpOverlapped); DWORD SetFilePointerBuf(ATF_FILEINFO *pATF, long lToMove, PLONG plDistHigh, DWORD dwMoveMethod); int getsBuf(ATF_FILEINFO *pATF, LPSTR pszString, DWORD dwToRead); int putsBuf(ATF_FILEINFO *pATF, LPCSTR pszString); stimfit-0.15.8/src/libstfio/abf/axon/AxAbfFio32/0000775000175000017500000000000013315356572016164 500000000000000stimfit-0.15.8/src/libstfio/abf/axon/AxAbfFio32/csynch.hpp0000775000175000017500000001303613062445067020107 00000000000000//*********************************************************************************************** // // Copyright (c) 1993-1997 Axon Instruments. // All rights reserved. // //*********************************************************************************************** // HEADER: CSYNCH.HPP // PURPOSE: Contains cclass definition for CSynch for creating and maintaining a Synch array. // AUTHOR: BHI May 1994 // #ifndef INC_CSYNCH_HPP #define INC_CSYNCH_HPP #include "../Common/axodefn.h" #include "../Common/axodebug.h" //----------------------------------------------------------------------------------------------- // Local constants: #define SYNCH_BUFFER_SIZE 100 // buffer 100 synch entries at a time. // Synch structure definition. struct Synch { DWORD dwStart; DWORD dwLength; DWORD dwFileOffset; }; //----------------------------------------------------------------------------------------------- // CSynch class definition class CSynch { public: enum eMODE { eWRITEMODE, eREADMODE }; private: // Member variables. #if defined(_WINDOWS) && !defined(__MINGW32__) char m_szFileName[_MAX_PATH]; // Filename for array virtualization #endif FILEHANDLE m_hfSynchFile; // Handle to temporary file. eMODE m_eMode; // Mode flag for buffering algorithm. UINT m_uSynchCount; // Total count of entries in the synch array UINT m_uCacheCount; // Count of entries in the cache UINT m_uCacheStart; // Number of first entry in the cache. Synch m_SynchBuffer[SYNCH_BUFFER_SIZE]; // Buffer for caching synch entries. Synch m_LastEntry; // Last entry written (write only). private: // Declare but don't define copy constructor to prevent use of default CSynch(const CSynch &CS); const CSynch &operator=(const CSynch &CS); private: // Private member functions. void _Initialize(); BOOL _Flush(); /* BOOL _PackBuffer(UINT uAcquiredSamples, UINT &uEntries, UINT uSampleSize); // BOOL _Read(LPVOID lpBuf, DWORD dwBytesToRead); */ BOOL Read(LPVOID lpBuf, DWORD dwFilePos, DWORD dwEntriesToRead); BOOL _GetReadMode( UINT uFirstEntry, Synch *pSynch, UINT uEntries ); BOOL _GetWriteMode( UINT uFirstEntry, Synch *pSynch, UINT uEntries ); BOOL _IsFileOpen(); public: // Public member functions CSynch(); ~CSynch(); void Clone(CSynch *pCS); BOOL OpenFile(); void CloseFile(); void SetMode(eMODE eMode); BOOL Put( UINT uStart, UINT uLength, UINT uOffset=0 ); /* void UpdateLength( DWORD dwLength ); void IncreaseLastLength( DWORD dwIncrease ); BOOL GetLastEntry(Synch *pSynch); */ BOOL Get( UINT uFirstEntry, Synch *pSynch, UINT uEntries ); /* BOOL Update( UINT uEntry, const Synch *pSynch ); */ UINT GetCount() const; /* BOOL Write( HANDLE hDataFile, UINT uAcquiredSamples, UINT *puSynchCount, UINT uSampleSize ); */ }; //=============================================================================================== // PROCEDURE: GetCount // PURPOSE: Returns the current count of synch elements. // inline UINT CSynch::GetCount() const { // MEMBERASSERT(); return m_uSynchCount; } //=============================================================================================== // PROCEDURE: Read // PURPOSE: Reads a block and returns FALSE on ERROR. // inline BOOL CSynch::Read(LPVOID lpBuf, DWORD dwFirstEntry, DWORD dwEntriesToRead) { // MEMBERASSERT(); DWORD dwBytesToRead= dwEntriesToRead * sizeof(Synch); // ARRAYASSERT(LPSTR(lpBuf), dwBytesToRead); // Save the current file position and seek to the desired position. DWORD dwCurrentPos = c_SetFilePointer( m_hfSynchFile, 0, NULL, FILE_CURRENT ); if (dwCurrentPos == INVALID_SEEK_VALUE) return FALSE; c_SetFilePointer( m_hfSynchFile, dwFirstEntry * sizeof(Synch), NULL, FILE_BEGIN ); DWORD dwBytesRead = 0; BOOL bOK = c_ReadFile(m_hfSynchFile, lpBuf, dwBytesToRead, &dwBytesRead, NULL); // Restore the original file. c_SetFilePointer( m_hfSynchFile, dwCurrentPos, NULL, FILE_BEGIN ); // Debug error messages. if( !bOK ) { TRACE( (char*)"CSynch::Read - ReadFile failed");// with the following error:\n" ); // SHOW_SYSTEM_ERROR( GetLastError() ); } if( dwBytesRead != dwBytesToRead ) { // TRACE2( "CSynch::Read - error reading from file: dwBytesToRead %d, dwBytesRead %d.\n", // dwBytesToRead, dwBytesRead ); } return (bOK && (dwBytesRead==dwBytesToRead)); } //=============================================================================================== // PROCEDURE: Get // PURPOSE: Retrieves synch entries from the virtualized array. // inline BOOL CSynch::Get( UINT uFirstEntry, Synch *pSynch, UINT uEntries ) { // MEMBERASSERT(); // ASSERT(uEntries > 0); // ARRAYASSERT(pSynch, uEntries); // ASSERT(uFirstEntry+uEntries <= m_uSynchCount); if (m_eMode == eREADMODE) return _GetReadMode( uFirstEntry, pSynch, uEntries ); else return _GetWriteMode( uFirstEntry, pSynch, uEntries ); } //=============================================================================================== // PROCEDURE: _IsFileOpen // PURPOSE: Returns TRUE if the temp file was opened ok. // inline BOOL CSynch::_IsFileOpen() { return (m_hfSynchFile != FILE_NULL); } #endif // INC_CSYNCH_HPP stimfit-0.15.8/src/libstfio/abf/axon/AxAbfFio32/csynch.cpp0000775000175000017500000004671113062445067020110 00000000000000//*********************************************************************************************** // // Copyright (c) 1993-2002 Axon Instruments, Inc. // All rights reserved. // Permission is granted to freely to use, modify and copy the code in this file. // //*********************************************************************************************** // MODULE: CSYNCH.CPP // PURPOSE: Contains member function code for the CSynch class. // AUTHOR: BHI May 1994 // NOTES: // #include "../Common/wincpp.hpp" #include "./csynch.hpp" #include "../Common/FileIO.hpp" #include "./abfutil.h" #if !defined(_WINDOWS) || defined(__MINGW32__) || defined(__STF__) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif //=============================================================================================== // PROCEDURE: _Initialize // PURPOSE: Internal initialization routine. // void CSynch::_Initialize() { #if defined(_WINDOWS) && !defined(__MINGW32__) m_szFileName[0] = '\0'; // Filename for array virtualization #endif m_hfSynchFile = NULL; // Handle to temporary file. m_eMode = eWRITEMODE; // Mode flag for buffering algorithm. m_uSynchCount = 0; // Total count of entries in the synch array m_uCacheCount = 0; // Count of entries in the cache m_uCacheStart = 0; // Number of first entry in the cache. memset(m_SynchBuffer, 0, sizeof(m_SynchBuffer)); // Buffer for caching synch entries. memset(&m_LastEntry, 0, sizeof(m_LastEntry)); // Last entry written (write only). } //=============================================================================================== // PROCEDURE: CSynch // PURPOSE: Constructor. // CSynch::CSynch() { /*MEMBERASSERT();*/ _Initialize(); } //=============================================================================================== // PROCEDURE: ~CSynch // PURPOSE: Destructor. Closes the temporary file and deletes it. // CSynch::~CSynch() { /*MEMBERASSERT();*/ CloseFile(); } //=============================================================================================== // PROCEDURE: Clone // PURPOSE: Clone a passed CSynch array. Ownership is transfered of the temp file etc. // void CSynch::Clone(CSynch *pCS) { /*MEMBERASSERT();*/ CloseFile(); // Clone the settings. // strcpy(m_szFileName, pCS->m_szFileName); m_hfSynchFile = pCS->m_hfSynchFile; m_eMode = pCS->m_eMode; m_uSynchCount = pCS->m_uSynchCount; m_uCacheCount = pCS->m_uCacheCount; m_uCacheStart = pCS->m_uCacheStart; m_LastEntry = pCS->m_LastEntry; // Clone the data. memcpy(m_SynchBuffer, pCS->m_SynchBuffer, sizeof(m_SynchBuffer)); // Initialize the source CSynch object so that it doesn't delete the backing file. pCS->_Initialize(); } //=============================================================================================== // PROCEDURE: CreateFile // PURPOSE: Gets a unique filename and opens it as a temporary file. // BOOL CSynch::OpenFile() { /*MEMBERASSERT();*/ _Initialize(); #if !defined(_WINDOWS) || defined(__MINGW32__) // Create the temporary file. m_hfSynchFile = tmpfile(); ASSERT(m_hfSynchFile != FILE_NULL); return (m_hfSynchFile != NULL); #else // Get a unique temporary file name. // AXU_GetTempFileName("synch", 0, m_szFileName); ABFU_GetTempFileName("synch", 0, m_szFileName); // Create the temporary file. m_hfSynchFile = CreateFileA(m_szFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL); ASSERT(m_hfSynchFile != INVALID_HANDLE_VALUE); return (m_hfSynchFile != INVALID_HANDLE_VALUE); #endif } //=============================================================================================== // PROCEDURE: CloseFile // PURPOSE: Closes the file if it was opened previously. // void CSynch::CloseFile() { /*MEMBERASSERT();*/ if (m_hfSynchFile != NULL) { #if !defined(_MSC_VER) c_CloseHandle(m_hfSynchFile); #else CloseHandle(m_hfSynchFile); #endif m_hfSynchFile = NULL; } _Initialize(); } //=============================================================================================== // PROCEDURE: SetMode // PURPOSE: Sets the buffering mode of the CSynch object. // void CSynch::SetMode(eMODE eMode) { /*MEMBERASSERT();*/ if ((m_eMode==eMode) || !_IsFileOpen()) return; // If the old mode was for writing, flush the cache to disk. if (m_eMode==eWRITEMODE) _Flush(); // Set the new mode. m_eMode = eMode; m_uCacheStart = m_uSynchCount; // If the new mode is for writing, preload the cache with the last n entries. if (m_eMode==eWRITEMODE) { UINT uCount = SYNCH_BUFFER_SIZE; if (m_uSynchCount < SYNCH_BUFFER_SIZE) { m_uCacheStart = 0; uCount = m_uSynchCount; } else m_uCacheStart = m_uSynchCount - SYNCH_BUFFER_SIZE; // Read the data out of the file. Read( m_SynchBuffer, m_uCacheStart, uCount ); // Set the current position to the start of the bit we last read, and truncate the file here. #if defined(_MSC_VER) SetFilePointer(m_hfSynchFile, m_uCacheStart * sizeof(Synch), NULL, FILE_BEGIN); #else c_SetFilePointer(m_hfSynchFile, m_uCacheStart * sizeof(Synch), NULL, FILE_BEGIN); #endif //TRACE1( "CSynch::SetMode file position is %d.\n", // SetFilePointer(m_hfSynchFile, 0, NULL, FILE_CURRENT) ); // VERIFY(SetEndOfFile(m_hfSynchFile)); m_uCacheCount = uCount; m_LastEntry = m_SynchBuffer[uCount-1]; } else { // Set the start index of the cache to the count of items in the file to // cause the cache to be invalid and filled on the next get. m_uCacheStart = m_uSynchCount; } } //=============================================================================================== // PROCEDURE: _GetWriteMode // PURPOSE: Retrieves synch entries from the virtualized array. // BOOL CSynch::_GetWriteMode( UINT uFirstEntry, Synch *pSynch, UINT uEntries ) { /*MEMBERASSERT();*/ ASSERT(uFirstEntry+uEntries <= m_uSynchCount); ASSERT(uEntries > 0); /*ARRAYASSERT(pSynch, uEntries);*/ ASSERT(m_eMode == eWRITEMODE); // If just the last entry is required, return it and get out. if (uFirstEntry == m_uSynchCount-1) { *pSynch = m_LastEntry; return TRUE; } // If the block requested is not contained completely in the cache, // read the file for it, reading straight into the passed buffer. if (m_uSynchCount - uFirstEntry > SYNCH_BUFFER_SIZE) { // Rather than checking whether the file has been opened in this case // we will just assert that this is so here. This means that it is the // responsibility of the caller to ensure that synch entries are not // requested outside the synch buffer if the cache is not backed by a file. ASSERT(m_hfSynchFile != FILE_NULL); // Calculate how many entries there are from the requested first entry until // we hit the ones currently in the cache. UINT uCount = m_uSynchCount - uFirstEntry - SYNCH_BUFFER_SIZE; // Limit the count to no greater than the requested amount. if (uCount > uEntries) uCount = uEntries; // Read the data out of the file. if( !Read( pSynch, uFirstEntry, uCount) ) return FALSE; // Update pointers and counters. pSynch += uCount; uFirstEntry += uCount; uEntries -= uCount; if (uEntries == 0) return TRUE; } // Transfer the part of the buffer that is "invalidated", i.e. about to be overwritten. if (uFirstEntry < m_uCacheStart) { UINT uCount = m_uCacheStart - uFirstEntry; ASSERT(uCount <= SYNCH_BUFFER_SIZE - m_uCacheCount); Synch *pS = m_SynchBuffer + SYNCH_BUFFER_SIZE - uCount; if (uCount > uEntries) uCount = uEntries; memcpy(pSynch, pS, uCount*sizeof(Synch)); pSynch += uCount; uFirstEntry += uCount; uEntries -= uCount; if (uEntries == 0) return TRUE; } // Transfer the more recently written part of the cache. ASSERT(uFirstEntry >= m_uCacheStart); ASSERT(uFirstEntry - m_uCacheStart + uEntries <= m_uCacheCount); memcpy(pSynch, m_SynchBuffer + uFirstEntry - m_uCacheStart, uEntries*sizeof(Synch)); return TRUE; } //=============================================================================================== // PROCEDURE: _GetReadMode // PURPOSE: Retrieves synch entries from the virtualized array. // BOOL CSynch::_GetReadMode( UINT uFirstEntry, Synch *pSynch, UINT uEntries ) { /*MEMBERASSERT();*/ ASSERT(m_hfSynchFile != FILE_NULL); ASSERT(uEntries > 0); /*ARRAYASSERT(pSynch, uEntries);*/ ASSERT(uFirstEntry+uEntries <= m_uSynchCount); ASSERT(m_eMode == eREADMODE); // Loop until the get() has been satisfied. while (uEntries) { // If the first entry is not in the cache, reload the cache. if ((uFirstEntry < m_uCacheStart) || (uFirstEntry >= m_uCacheStart + m_uCacheCount)) { m_uCacheStart = uFirstEntry - (uFirstEntry % SYNCH_BUFFER_SIZE); m_uCacheCount = m_uSynchCount - m_uCacheStart; if (m_uCacheCount > SYNCH_BUFFER_SIZE) m_uCacheCount = SYNCH_BUFFER_SIZE; Read( m_SynchBuffer, m_uCacheStart, m_uCacheCount ); } // Calculate how many entries intersect the cache. UINT uCount = min(uEntries, m_uCacheCount); // Copy the entries out of the cache. memcpy(pSynch, m_SynchBuffer+uFirstEntry-m_uCacheStart, uCount*sizeof(Synch)); uFirstEntry += uCount; pSynch += uCount; uEntries -= uCount; } return TRUE; } //=============================================================================================== // PROCEDURE: _Flush // PURPOSE: Flushes the Synch cache to disk. // BOOL CSynch::_Flush() { /*MEMBERASSERT();*/ ASSERT(m_eMode==eWRITEMODE); if (m_uCacheCount == 0) return TRUE; BOOL bRval = TRUE; DWORD dwBytesWritten = 0; if (_IsFileOpen()) { //TRACE1( "CSynch::_Flush current file pointer is %d on entry.\n", // SetFilePointer(m_hfSynchFile, 0, NULL, FILE_CURRENT) ); // Write out the current contents of the cache. UINT uBytesToWrite = m_uCacheCount * sizeof(Synch); #if defined(_MSC_VER) bRval = WriteFile(m_hfSynchFile, m_SynchBuffer, uBytesToWrite, &dwBytesWritten, NULL); #else bRval = c_WriteFile(m_hfSynchFile, m_SynchBuffer, uBytesToWrite, &dwBytesWritten, NULL); #endif //TRACE1( "CSynch::_Flush current file pointer is %d after WriteFile.\n", // SetFilePointer(m_hfSynchFile, 0, NULL, FILE_CURRENT) ); } // If a disk full error occurs, save what was actually written and rotate the buffer // ready for the next attempt(?). if (!bRval) { UINT uEntriesWritten = dwBytesWritten/sizeof(Synch); UINT uEntriesUnwritten = m_uCacheCount - uEntriesWritten; Synch *pTemp = new Synch[uEntriesWritten]; if (pTemp) memcpy(pTemp, m_SynchBuffer, uEntriesWritten*sizeof(Synch)); for (UINT i=0; idwFileOffset/uSampleSize + pS->dwLength > uAcquiredSamples) { uEntries = i; return FALSE; } *pdwDest++ = pS->dwStart; *pdwDest++ = pS->dwLength; pS++; } return TRUE; } //=============================================================================================== // PROCEDURE: Write // PURPOSE: Copies the complete synch array to another file, packing out the file-offset entry. // BOOL CSynch::Write( HANDLE hDataFile, UINT uAcquiredSamples, UINT *puSynchCount, UINT uSampleSize ) { MEMBERASSERT(); ASSERT( hDataFile != INVALID_HANDLE_VALUE ); WPTRASSERT(puSynchCount); // Flush any cached Synch entries to the temp file. This should not fail as the reserve file // will have been released just prior to calling this function. If it does fail, we will // still be able to work with the Synch entries that were saved ok. if (m_uCacheCount) _Flush(); // Set the return value for the number of synch entries. If none exist, return. *puSynchCount = 0; if (m_uSynchCount == 0) return TRUE; // Seek to the end of the passed file. This will only fail for invalid file handles. CFileIO_NoClose OutFile(hDataFile); LONGLONG llCurrentPos = 0; if (!OutFile.Seek(0, FILE_END, &llCurrentPos)) return FALSE; // Seek to the start of the temporary file. SetFilePointer(m_hfSynchFile, 0L, NULL, FILE_BEGIN); // Read the Synch data in a buffer at a time and write it out to the passed file. UINT uEntries = m_uSynchCount; UINT uWritten = 0; UINT uCount = 0; while ( uEntries > 0 ) { uCount = min(uEntries, SYNCH_BUFFER_SIZE); // Read in a buffer from the temp file. VERIFY(Read( m_SynchBuffer, uWritten, uCount)); // Pack the buffer, removing the dwFileOffset members and checking for invalid synch entries. // If an invalid entry is found, the count is truncated at the last valid entry. if (!_PackBuffer(uAcquiredSamples, uCount, uSampleSize)) uEntries = uCount; // Write the packed buffer out to the temp file. if ( !OutFile.Write( m_SynchBuffer, uCount * 2 * sizeof(DWORD) )) { // If an error occurs, go back to the start of the block and truncate the file // ready for the next attempt after the user has freed up some disk space. VERIFY(OutFile.Seek(llCurrentPos, FILE_BEGIN)); VERIFY(OutFile.SetEndOfFile()); return FALSE; } uEntries -= uCount; uWritten += uCount; } // Seek back to end of the temporary file. SetFilePointer(m_hfSynchFile, 0L, NULL, FILE_END); //TRACE1( "CSynch::Write current file pointer is %d after seek to end.\n", // SetFilePointer(m_hfSynchFile, 0, NULL, FILE_CURRENT) ); *puSynchCount = uWritten; return TRUE; } */ //=============================================================================================== // PROCEDURE: Put // PURPOSE: Puts a new Synch entry into the synch array, flushing to disk if full. // BOOL CSynch::Put( UINT uStart, UINT uLength, UINT uOffset ) { /*MEMBERASSERT();*/ ASSERT(m_eMode==eWRITEMODE); ASSERT((m_uSynchCount == 0) || (m_LastEntry.dwStart <= uStart)); // Flush the cache if it is full. if ((m_uCacheCount >= SYNCH_BUFFER_SIZE) && (!_Flush())) return FALSE; // If a value of zero is passed as the file offset, the file offset for this // entry is derived from the previous one. if (uOffset == 0) m_LastEntry.dwFileOffset += m_LastEntry.dwLength * 2; else m_LastEntry.dwFileOffset = uOffset; m_LastEntry.dwStart = uStart; m_LastEntry.dwLength = uLength; m_SynchBuffer[m_uCacheCount++] = m_LastEntry; m_uSynchCount++; return TRUE; } /* //=============================================================================================== // PROCEDURE: Update // PURPOSE: Updates an entry in the SynchArray. // BOOL CSynch::Update( UINT uEntry, const Synch *pSynch ) { ASSERT(uEntry < m_uSynchCount); ASSERT(m_eMode!=eREADMODE); ASSERT(m_hfSynchFile != INVALID_HANDLE_VALUE); // Save current file position. ABFLONG lCurrentPos = SetFilePointer(m_hfSynchFile, 0, NULL, FILE_CURRENT); //TRACE1( "CSynch::Update current file pointer is %d on entry.\n", // SetFilePointer(m_hfSynchFile, 0, NULL, FILE_CURRENT) ); if (lCurrentPos == INVALID_SEEK_VALUE) return FALSE; // Seek to the entry. SetFilePointer(m_hfSynchFile, uEntry * sizeof(Synch), NULL, FILE_BEGIN); //TRACE1( "CSynch::Update current file pointer is %d after seek to current entry.\n", // SetFilePointer(m_hfSynchFile, 0, NULL, FILE_CURRENT) ); // Write the data out of the file. DWORD dwBytesWritten = 0; BOOL bOK = WriteFile(m_hfSynchFile, pSynch, sizeof(pSynch), &dwBytesWritten, NULL); // Reset the pointer to the original position. SetFilePointer(m_hfSynchFile, lCurrentPos, NULL, FILE_BEGIN); //TRACE1( "CSynch::Update current file pointer is %d after seek to original position.\n", // SetFilePointer(m_hfSynchFile, 0, NULL, FILE_CURRENT) ); if (!bOK) return FALSE; // If the entry requested is contained in the cache, update the cache. if (m_uSynchCount - uEntry <= SYNCH_BUFFER_SIZE) { int nIndex = int(uEntry - m_uCacheStart); if (nIndex < 0) nIndex += SYNCH_BUFFER_SIZE; ASSERT(nIndex >= 0); ASSERT(nIndex < SYNCH_BUFFER_SIZE); m_SynchBuffer[nIndex] = *pSynch; if (uEntry==m_uSynchCount-1) m_LastEntry = *pSynch; } return TRUE; } //=============================================================================================== // PROCEDURE: UpdateLength // PURPOSE: Updates the length of the last entry put in the SynchArray. // void CSynch::UpdateLength(DWORD dwLength) { MEMBERASSERT(); ASSERT(m_eMode==eWRITEMODE); ASSERT(m_uCacheCount > 0); m_LastEntry.dwLength = dwLength; m_SynchBuffer[m_uCacheCount-1] = m_LastEntry; } //=============================================================================================== // PROCEDURE: IncreaseLastLength // PURPOSE: Increases the length of the last entry put in the SynchArray. // void CSynch::IncreaseLastLength( DWORD dwIncrease ) { MEMBERASSERT(); ASSERT(m_eMode==eWRITEMODE); ASSERT(m_uCacheCount > 0); m_LastEntry.dwLength += dwIncrease; m_SynchBuffer[m_uCacheCount-1] = m_LastEntry; } //=============================================================================================== // PROCEDURE: GetLastEntry // PURPOSE: Returns the last Synch structure added to the synch array. // BOOL CSynch::GetLastEntry(Synch *pSynch) { MEMBERASSERT(); WPTRASSERT(pSynch); if (!m_uSynchCount) return FALSE; *pSynch = m_LastEntry; return TRUE; } */ stimfit-0.15.8/src/libstfio/abf/axon/AxAbfFio32/abfheadr.cpp0000775000175000017500000016373413062445067020362 00000000000000//*********************************************************************************************** // // Copyright (c) 1993-2000 Axon Instruments. // All rights reserved. // Permission is granted to freely to use, modify and copy the code in this file. // //*********************************************************************************************** // This is ABFHEADR.CPP; the routines that cope with reading the data file // parameters block for all AXON pCLAMP binary file formats. // // An ANSI C compiler should be used for compilation. // Compile with the large memory model option. // (e.g. CL -c -AL ABFHEADR.C) #include "../Common/wincpp.hpp" #include "abfheadr.h" // header definition & constants #include "oldheadr.h" // old header conversion prototypes #include "abfutil.h" // Large memory allocation/free /* #include "StringResource.h" // Access to string resources. */ #define A_VERY_SMALL_NUMBER 1E-10 #define DEFAULT_LEVEL_HYSTERESIS 64 // Two LSBits of level hysteresis. #define DEFAULT_TIME_HYSTERESIS 1 // Two sequences of time hysteresis. #if !defined(_WINDOWS) || defined(__MINGW32__) || defined(__STF__) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif const char c_szValidOperators[] = "+-*/"; const ABFLONG c_lMaxShort = 30000; //----------------------------------------------------------------------------------------------- // Uncomment the following line to display interface structure sizes. //#define SHOW_STRUCT_SIZES 1 //----------------------------------------------------------------------------------------------- // Macros and functions to deal with returning error return codes through a pointer if given. #define ERRORRETURN(p, e) return ErrorReturn(p, e); static BOOL ErrorReturn(int *pnError, int nErrorNum) { if (pnError) *pnError = nErrorNum; return FALSE; } //=============================================================================================== // FUNCTION: ABFH_Initialize // PURPOSE: Initialize an ABFFileHeader structure to a consistent set of parameters // void WINAPI ABFH_Initialize( ABFFileHeader *pFH ) { // ABFH_WASSERT(pFH); int i; ABFFileHeader NewFH; ABFH_PromoteHeader( &NewFH, pFH ); // Zero fill all to start with. memset(&NewFH, '\0', sizeof(NewFH)); // Blank fill all strings. ABF_BLANK_FILL(NewFH._sParamValueList); ABF_BLANK_FILL(NewFH.sADCChannelName); ABF_BLANK_FILL(NewFH.sADCUnits); ABF_BLANK_FILL(NewFH.sDACChannelName); ABF_BLANK_FILL(NewFH.sDACChannelUnits); ABF_BLANK_FILL(NewFH.sDACFilePath[0]); ABF_BLANK_FILL(NewFH.sDACFilePath[1]); ABF_SET_STRING(NewFH.sArithmeticOperator, "+"); ABF_BLANK_FILL(NewFH.sArithmeticUnits); NewFH.lFileSignature = ABF_NATIVESIGNATURE; NewFH.fFileVersionNumber = ABF_CURRENTVERSION; NewFH.fHeaderVersionNumber = ABF_CURRENTVERSION; NewFH.nOperationMode = ABF_GAPFREEFILE; NewFH.nADCNumChannels = 1; NewFH.fADCSampleInterval = 100.0F; NewFH.lNumSamplesPerEpisode = 512; NewFH.lEpisodesPerRun = 1; NewFH.lDataSectionPtr = sizeof(ABFFileHeader) / ABF_BLOCKSIZE; NewFH.nDrawingStrategy = ABF_DRAW_REALTIME; NewFH.nTiledDisplay = ABF_DISPLAY_TILED; NewFH.nEraseStrategy = 1; NewFH.nDataDisplayMode = ABF_DRAW_LINES; NewFH.nMultiColor = TRUE; NewFH.nFileType = ABF_ABFFILE; NewFH.nAutoTriggerStrategy = 1; // Allow auto triggering. NewFH.nChannelStatsStrategy = 0; // Don't calculate channel statistics. NewFH.fStatisticsPeriod = 1.0F; NewFH.lCalculationPeriod = ABFLONG(NewFH.fStatisticsPeriod / NewFH.fADCSampleInterval * 1E3F); NewFH.lStatisticsMeasurements = ABF_STATISTICS_ABOVETHRESHOLD | ABF_STATISTICS_MEANOPENTIME; NewFH.lSamplesPerTrace = 16384; NewFH.lPreTriggerSamples = 16; // default to 16 NewFH.fADCRange = 10.24F; NewFH.fDACRange = 10.24F; NewFH.lADCResolution = 32768L; NewFH.lDACResolution = 32768L; NewFH.nExperimentType = ABF_SIMPLEACQUISITION; ABF_BLANK_FILL(NewFH.sCreatorInfo); ABF_BLANK_FILL(NewFH.sModifierInfo); ABF_BLANK_FILL(NewFH.sFileComment); // ADC channel data for (i=0; inOperationMode) { case ABF_FIXLENEVENTS: case ABF_VARLENEVENTS: case ABF_GAPFREEFILE: return ABF_CONTINUOUSMODE; case ABF_HIGHSPEEDOSC: case ABF_WAVEFORMFILE: return ABF_EPISODICMODE; default: ERRORMSG1("Unexpected operation mode '%d'.", pFH->nOperationMode); return ABF_EPISODICMODE; } } //=============================================================================================== // FUNCTION: SetupSignal // PURPOSE: Sets up a signal descriptor from display parameters in an old ABF header. // static void _SetupSignal(const ABFFileHeader *pFH, ABFSignal *pS, UINT uMxOffset, UINT uTraces) { memset(pS, 0, sizeof(ABFSignal)); int nChannel = pFH->nADCSamplingSeq[uMxOffset]; ABFU_GetABFString(pS->szName, ABF_ADCNAMELEN+1, pFH->sADCChannelName[nChannel], ABF_ADCNAMELEN); pS->nMxOffset = short(uMxOffset); pS->rgbColor = RGB_BLUE; pS->nPenWidth = 1; pS->bDrawPoints = char(!pFH->nDataDisplayMode); pS->bHidden = FALSE; pS->bFloatData = FALSE; pS->fVertProportion = 1.0F / float(uTraces); pS->fDisplayGain = pFH->fADCDisplayAmplification[nChannel]; pS->fDisplayOffset = pFH->fADCDisplayOffset[nChannel]; } //=============================================================================================== // FUNCTION: SetupMathSignal // PURPOSE: Sets up a signal descriptor for a math channel from parameters in an ABF header. // static void _SetupMathSignal(const ABFFileHeader *pFH, ABFSignal *pS, UINT uTraces) { memset(pS, 0, sizeof(ABFSignal)); LoadString(g_hInstance, IDS_MATHCHANNEL, pS->szName, sizeof(pS->szName)); pS->nMxOffset = 0; pS->rgbColor = RGB_BLUE; pS->nPenWidth = 1; pS->bDrawPoints = char(!pFH->nDataDisplayMode); pS->bHidden = FALSE; pS->bFloatData = TRUE; pS->fVertProportion = 1.0F / float(uTraces); pS->fDisplayGain = 1.0F; pS->fDisplayOffset = 0.0F; } //=============================================================================================== // FUNCTION: MathChannelEnabled // PURPOSE: Returns TRUE if the math channel is enabled. // static BOOL MathChannelEnabled(const ABFFileHeader *pFH) { return (pFH->nArithmeticEnable && (pFH->nADCNumChannels < ABF_ADCCOUNT)); } //=============================================================================================== // FUNCTION: _GetTraceCount // PURPOSE: Gets the number of traces that should be displayed for this acquisition. // static UINT _GetTraceCount(const ABFFileHeader *pFH, BOOL *pbMathChannel=NULL) { UINT uTraces = UINT(pFH->nADCNumChannels); BOOL bMathChannel = MathChannelEnabled(pFH); if (bMathChannel) uTraces++; if (pbMathChannel) *pbMathChannel = bMathChannel; return uTraces; } //=============================================================================================== // FUNCTION: ABFH_InitializeScopeConfig // PURPOSE: Sets up a scope configuration structure from the old header locations for display // parameters. // void WINAPI ABFH_InitializeScopeConfig(const ABFFileHeader *pFH, ABFScopeConfig *pCfg) { // Zapp everything! memset(pCfg, 0, sizeof(*pCfg)); // Enable SC_CLIPPING pCfg->dwFlags = 0x00000008; // Set the scope mode. pCfg->wScopeMode = _GetDefaultScopeMode(pFH); // Set up the first ScopeConfig structure. pCfg->rgbColor[ABF_BACKGROUNDCOLOR] = RGB_WHITE; pCfg->rgbColor[ABF_GRIDCOLOR] = RGB_LTGRAY; pCfg->rgbColor[ABF_THRESHOLDCOLOR] = RGB_DKRED; pCfg->rgbColor[ABF_EVENTMARKERCOLOR]= RGB_RED; pCfg->rgbColor[ABF_SEPARATORCOLOR] = RGB_BLACK; pCfg->rgbColor[ABF_AVERAGECOLOR] = RGB_RED; pCfg->rgbColor[ABF_OLDDATACOLOR] = RGB_LTGRAY; pCfg->rgbColor[ABF_TEXTCOLOR] = RGB_BLACK; pCfg->rgbColor[ABF_AXISCOLOR] = GetSysColor(COLOR_3DFACE); pCfg->rgbColor[ABF_ACTIVEAXISCOLOR] = GetSysColor(COLOR_3DSHADOW); pCfg->fDisplayStart = 0.0F; // If fDisplayStart==fDisplayEnd a default pCfg->fDisplayEnd = 0.0F; // display scaling will be used. pCfg->nYAxisWidth = -1; pCfg->nEraseStrategy = ABF_ERASE_EACHRUN; // Set the Signals in the first scope configuration to match the // old entries in the header. BOOL bMathChannel = FALSE; UINT uTraces = _GetTraceCount(pFH, &bMathChannel); UINT uNormalTraces = uTraces; if (bMathChannel) uNormalTraces--; UINT i; for (i=0; iTraceList+i, i, uTraces); if (bMathChannel) _SetupMathSignal(pFH, pCfg->TraceList+i, uTraces); pCfg->nTraceCount = short(uTraces); // Initialize the extended ABFScopeConfig fields for ABF file version 1.68. pCfg->nAutoZeroState = 0; pCfg->nSizeofOldStructure = pCfg->nSizeofOldStructure; pCfg->rgbColorEx[ ABF_STATISTICS_REGION0 ] = RGB_BLACK; pCfg->rgbColorEx[ ABF_STATISTICS_REGION1 ] = RGB_DKRED; pCfg->rgbColorEx[ ABF_STATISTICS_REGION2 ] = RGB_DKGREEN; pCfg->rgbColorEx[ ABF_STATISTICS_REGION3 ] = RGB_DKYELLOW; pCfg->rgbColorEx[ ABF_STATISTICS_REGION4 ] = RGB_DKBLUE; pCfg->rgbColorEx[ ABF_STATISTICS_REGION5 ] = RGB_MAUVE; pCfg->rgbColorEx[ ABF_STATISTICS_REGION6 ] = RGB_BLUEGRAY; pCfg->rgbColorEx[ ABF_STATISTICS_REGION7 ] = RGB_DKGRAY; pCfg->rgbColorEx[ ABF_BASELINE_REGION ] = RGB_RED; pCfg->rgbColorEx[ ABF_STOREDSWEEPCOLOR ] = RGB_BLUEGRAY; } //=============================================================================================== // FUNCTION: SetMxOffset // PURPOSE: Returns TRUE if the passed signal is still in the sampling sequence. // static BOOL SetMxOffset(const ABFFileHeader *pFH, ABFSignal *pS) { // Initialize to failure case. pS->nMxOffset = -1; if (!pS->bFloatData) { char szName[ABF_ADCNAMELEN+1]; for (int i=0; inADCNumChannels); i++) { int nChannel = pFH->nADCSamplingSeq[i]; ABFU_GetABFString(szName, sizeof(szName), pFH->sADCChannelName[nChannel], ABF_ADCNAMELEN); if (strcmp(pS->szName, szName)==0) { pS->nMxOffset = short(i); break; } } } else if (MathChannelEnabled(pFH)) pS->nMxOffset = 0; return (pS->nMxOffset != -1); } //=============================================================================================== // FUNCTION: ABFH_CheckScopeConfig // PURPOSE: Checks a scope configuration structure against an ABFFileHeader structure, making // sure that both reference the same signals, in the same multiplex sequence. // RETURNS: FALSE if the configuration structure specified an innappropriate Scope mode. // BOOL WINAPI ABFH_CheckScopeConfig(ABFFileHeader *pFH, ABFScopeConfig *pCfg) { ASSERT(pFH->nADCNumChannels > 0); // Search through the ABFScopeConfig trace list to see if all signals are // included in the sampling list. BOOL bMathChannel = FALSE; UINT uNewTraceCount = _GetTraceCount(pFH, &bMathChannel); UINT uOldTraceCount = UINT(pCfg->nTraceCount); UINT uOldVisibleTraceCount = uOldTraceCount; UINT uGaps = 0; ABFSignal *pS = pCfg->TraceList; for (UINT i=0; i